{"version":3,"sources":["jsdelivr-header.js","/npm/monaco-editor@0.55.1/esm/vs/nls.messages.js","/npm/monaco-editor@0.55.1/esm/vs/nls.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/window.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/browser.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/errors.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/assert.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/types.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/platform.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/canIUse.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/keyCodes.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/keybindings.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/keyboardEvent.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/iframe.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/mouseEvent.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/functional.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/iterator.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/lifecycle.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/linkedList.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/stopwatch.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/event.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/cancellation.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/symbols.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/async.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/cache.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/lazy.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/strings.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/process.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/path.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/uri.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/network.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/buffer.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/hash.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/arrays.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/logging/logging.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/debugLocation.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/equals.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/debugName.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/observables/baseObservable.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/observables/derivedImpl.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/observables/derived.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/reactions/autorunImpl.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/reactions/autorun.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/base.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/transaction.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/observables/observableFromEvent.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/utils/utils.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/logging/consoleObservableLogger.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/logging/debugger/rpc.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/logging/debugger/debuggerRpc.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/logging/debugger/utils.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/observables/observableValue.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/logging/debugger/devToolsLogger.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/index.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/dom.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/aria/aria.js","/npm/monaco-editor@0.55.1/esm/vs/platform/instantiation/common/instantiation.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/services/codeEditorService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/position.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/model.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/resolverService.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/actions.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/codiconsUtil.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/codiconsLibrary.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/codicons.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/themables.js","/npm/monaco-editor@0.55.1/esm/vs/platform/commands/common/commands.js","/npm/monaco-editor@0.55.1/esm/vs/platform/contextkey/common/scanner.js","/npm/monaco-editor@0.55.1/esm/vs/platform/contextkey/common/contextkey.js","/npm/monaco-editor@0.55.1/esm/vs/platform/registry/common/platform.js","/npm/monaco-editor@0.55.1/esm/vs/platform/keybinding/common/keybindingsRegistry.js","/npm/monaco-editor@0.55.1/esm/vs/platform/actions/common/actions.js","/npm/monaco-editor@0.55.1/esm/vs/platform/telemetry/common/telemetry.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/map.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/extpath.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/resources.js","/npm/monaco-editor@0.55.1/esm/vs/platform/log/common/log.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/triggerInlineEditCommandsRegistry.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/editorExtensions.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/range.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/selection.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/supports.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/cursorColumns.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/misc/indentation.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/inputMode.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/cursorCommon.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/cursor/cursorColumnSelection.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/commands/replaceCommand.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/cursor/cursorAtomicMoveOperations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/cursor/cursorMoveOperations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/cursor/cursorDeleteOperations.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/date.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/uint.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/characterClassifier.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/wordCharacterClassifier.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/cursor/cursorWordOperations.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/objects.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/cursor/cursorMoveCommands.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/languageConfiguration.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/wordHelper.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/supports/characterPair.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/stringBuilder.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/supports/richEditBrackets.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/supports/electricCharacter.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/supports/indentRules.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/supports/onEnter.js","/npm/monaco-editor@0.55.1/esm/vs/platform/configuration/common/configuration.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/language.js","/npm/monaco-editor@0.55.1/esm/vs/platform/instantiation/common/descriptors.js","/npm/monaco-editor@0.55.1/esm/vs/platform/instantiation/common/extensions.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/mime.js","/npm/monaco-editor@0.55.1/esm/vs/platform/jsonschemas/common/jsonContributionRegistry.js","/npm/monaco-editor@0.55.1/esm/vs/platform/product/common/product.js","/npm/monaco-editor@0.55.1/esm/vs/platform/configuration/common/configurationRegistry.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/modesRegistry.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/supports/languageBracketsConfiguration.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/languageConfigurationRegistry.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/encodedTokenAttributes.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/ranges/offsetRange.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/tokens/lineTokens.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/supports/indentationLineProcessor.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/enterAction.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/commands/shiftCommand.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/commands/surroundSelectionCommand.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/autoIndent.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/cursor/cursorTypeEditOperations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/cursor/cursorTypeOperations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/editorContextKeys.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/coreCommands.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/markerDecorations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/services/markerDecorations.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/fastDomNode.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/config/domFontInfo.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/config/elementSizeObserver.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/pixelRatio.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/config/charWidthReader.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/config/editorZoom.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/config/fontInfo.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/misc/textModelDefaults.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/config/editorOptions.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/config/fontMeasurements.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/config/migrateOptions.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/config/tabFocus.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/config/fontInfoFromSettings.js","/npm/monaco-editor@0.55.1/esm/vs/platform/accessibility/common/accessibility.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/config/editorConfiguration.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/performance.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/domStylesheets.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/globalPointerMoveMonitor.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/color.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/common/colorUtils.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/common/colors/baseColors.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/common/colors/miscColors.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/common/colors/editorColors.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/common/colors/minimapColors.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/common/colors/chartsColors.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/common/colors/inputColors.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/common/colors/listColors.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/common/colors/menuColors.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/common/colors/quickpickColors.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/common/colors/searchColors.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/editorDom.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewEventHandler.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/view/viewPart.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/view/renderingContext.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/viewLines/rangeUtil.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewLayout/lineDecorations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewLayout/linePart.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewLayout/viewLineRenderer.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/common/theme.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/viewLines/viewLine.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/mouseTarget.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/decorators.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/touch.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/widget.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/scrollbar/scrollbarArrow.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/scrollbar/abstractScrollbar.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/scrollbar/scrollbarState.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/scrollbar/horizontalScrollbar.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/scrollbar/verticalScrollbar.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/scrollable.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/scrollbar/scrollableElement.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/dragScrolling.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/mouseHandler.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/event.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/editContext/clipboardUtils.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextState.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/uuid.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextInput.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/pointerHandler.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/view/viewController.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/trustedTypes.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/view/viewLayer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/view/viewOverlays.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/view/viewUserInputEvents.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/blockDecorations/blockDecorations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/contentWidgets/contentWidgets.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/view/dynamicViewOverlay.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/common/themeService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/editorColorRegistry.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/decorations/decorations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/glyphMargin/glyphMargin.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/arraysFind.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/textModelPart.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/utils.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/textModelGuides.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/guidesTextModelPart.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/indentGuides/indentGuides.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/lineNumbers/lineNumbers.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/mouseCursor/mouseCursor.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/viewLines/domReadingContext.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/viewLines/viewLineOptions.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/viewLines/viewLines.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/linesDecorations/linesDecorations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/margin/margin.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/marginDecorations/marginDecorations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/misc/rgba.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/tokenizationRegistry.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewModel/minimapTokensColorTracker.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/minimap/minimapCharSheet.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/minimap/minimapCharRenderer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/minimap/minimapPreBaked.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/minimap/minimapCharRendererFactory.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/fonts.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewModel/viewModelDecoration.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/minimap/minimap.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewModel/overviewZoneManager.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/overviewRuler/overviewRuler.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/rulers/rulers.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/selections/selections.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/viewCursors/viewCursor.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/viewCursors/viewCursors.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/viewZones/viewZones.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/whitespace/whitespace.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewLayout/viewLinesViewportData.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/editorTheme.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewModel/viewContext.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/gpuUtils.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/raster/glyphRasterizer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/taskQueue.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/atlas/textureAtlasShelfAllocator.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/atlas/textureAtlasSlabAllocator.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/atlas/textureAtlasPage.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/atlas/textureAtlas.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/severity.js","/npm/monaco-editor@0.55.1/esm/vs/platform/notification/common/notification.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/gpuDisposable.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/bufferDirtyTracker.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/objectCollectionBuffer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/rectangleRenderer.wgsl.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/rectangleRenderer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/css/decorationCssRuleExtractor.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/css/decorationStyleCache.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/utils/runOnChange.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/viewGpuContext.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/contentSegmenter.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/renderStrategy/baseRenderStrategy.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/renderStrategy/fullFileRenderStrategy.wgsl.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/renderStrategy/viewportRenderStrategy.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/gpu/renderStrategy/fullFileRenderStrategy.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/viewLinesGpu/viewLinesGpu.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/ime.js","/npm/monaco-editor@0.55.1/esm/vs/platform/keybinding/common/keybinding.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/editContext/editContext.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/editContext/screenReaderUtils.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContext.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/editContext/native/nativeEditContextUtils.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/editContext/native/screenReaderContentRich.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/edits/edit.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/edits/stringEdit.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/ranges/lineRange.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/text/textLength.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/text/positionToOffsetImpl.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/text/abstractText.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/edits/textEdit.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/text/positionToOffset.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/editContext/native/screenReaderContentSimple.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/editContext/native/screenReaderSupport.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/editContext/native/editContextFactory.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/editContext/native/nativeEditContextRegistry.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/controller/editContext/native/nativeEditContext.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/rulersGpu/rulersGpu.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/viewParts/gpuMark/gpuMark.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/view.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/modelLineProjectionData.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/textModelEvents.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/view/domLineBreaksComputer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/codeEditor/codeEditorContributions.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/editorAction.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/editorCommon.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/misc/eolCounter.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/textModelBracketPairs.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/length.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/beforeEditPositionMapper.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/smallImmutableSet.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/ast.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/tokenizer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/brackets.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/concat23Trees.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/nodeReader.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/parser.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/combineTextEditInfos.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/bracketPairsTree.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/bracketPairsTextModelPart/colorizedBracketPairsDecorationProvider.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/textChange.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/textModelEditSource.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/editStack.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/indentationGuesser.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/intervalTree.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/textModelSearch.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/observables/observableSignal.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/observables/lazyObservableValue.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/observables/observableValueOpts.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/tokens/abstractSyntaxTokenBackend.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/tokens/treeSitter/cursorUtils.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/tokens/treeSitter/treeSitterTree.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/nullTokenize.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/fixedArray.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/tokens/contiguousMultilineTokens.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/tokens/contiguousMultilineTokensBuilder.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/textModelTokens.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/tokens/treeSitter/tokenStore.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/treeSitter/treeSitterThemeService.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/changeTracker.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/tokens/treeSitter/treeSitterTokenizationImpl.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/treeSitter/treeSitterLibraryService.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/utils/promise.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/tokens/treeSitter/treeSitterSyntaxTokenBackend.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/tokens/sparseTokensStore.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/tokens/contiguousTokensEditing.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/tokens/contiguousTokensStore.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/tokens/tokenizerSyntaxTokenBackend.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/tokens/tokenizationTextModelPart.js","/npm/monaco-editor@0.55.1/esm/vs/platform/undoRedo/common/undoRedo.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/collections.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/textModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/languageFeatures.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewModel/monospaceLineBreaksComputer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/cursor/oneCursor.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/cursor/cursorCollection.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/cursor/cursorContext.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewEvents.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewModelEventDispatcher.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/cursor/cursor.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/textToHtmlTokenizer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewLayout/lineHeights.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewLayout/linesLayout.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewLayout/viewLayout.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewModel/inlineDecorations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewModel/viewModelDecorations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewModel/modelLineProjection.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/prefixSumComputer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/coordinatesConverter.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewModel/viewModelLines.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewModel/glyphLanesModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/viewModel/viewModelImpl.js","/npm/monaco-editor@0.55.1/esm/vs/platform/instantiation/common/serviceCollection.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/codeEditor/codeEditorWidget.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/observables/constObservable.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/hotReloadHelpers.js","/npm/monaco-editor@0.55.1/esm/vs/platform/accessibilitySignal/browser/accessibilitySignalService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/observable/common/platformObservableUtils.js","/npm/monaco-editor@0.55.1/esm/vs/platform/progress/common/progress.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/stableEditorScroll.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/dnd.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/hover/hoverDelegateFactory.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/cssValue.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/naturalLanguage/korean.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/filters.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/iconLabels.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/htmlContent.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/idGenerator.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/marked/marked.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/marshalling.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/dompurify/dompurify.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/domSanitize.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/iconLabel/iconLabels.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/markdownRenderer.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/hover/hoverDelegate2.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/list/splice.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/numbers.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/list/list.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/range.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/list/rangeMap.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/list/rowCache.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/dnd/dnd.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/list/listView.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/list/listWidget.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/selectBox/selectBoxCustom.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/selectBox/selectBoxNative.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/selectBox/selectBox.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/actionbar/actionViewItems.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/actionbar/actionbar.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/utils.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/diff/rangeMapping.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/common/iconRegistry.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/registrations.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/editorWorker.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/diffProviderFactoryService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/diff/defaultLinesDiffComputer/algorithms/diffAlgorithm.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/diff/defaultLinesDiffComputer/utils.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/utils/utilsCancellation.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/observables/observableSignalFromEvent.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/diffEditorViewModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/copySelection.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/renderLines.js","/npm/monaco-editor@0.55.1/esm/vs/platform/clipboard/common/clipboardService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/contextview/browser/contextView.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/components/diffEditorDecorations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/2d/point.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/observableCodeEditor.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/features/overviewRulerFeature.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/sash/sash.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/components/diffEditorSash.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/delegatingEditorImpl.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/config/diffEditor.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/experimental/utils.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/diffEditorOptions.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/dropdown/dropdown.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/dropdown/dropdownActionViewItem.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/toolbar/toolbar.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/keybindingLabels.js","/npm/monaco-editor@0.55.1/esm/vs/platform/action/common/action.js","/npm/monaco-editor@0.55.1/esm/vs/base/parts/storage/common/storage.js","/npm/monaco-editor@0.55.1/esm/vs/platform/storage/common/storage.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/browser/defaultStyles.js","/npm/monaco-editor@0.55.1/esm/vs/platform/window/common/window.js","/npm/monaco-editor@0.55.1/esm/vs/platform/actions/browser/menuEntryActionViewItem.js","/npm/monaco-editor@0.55.1/esm/vs/platform/actions/common/menuService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/actions/browser/actionViewItemService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/actions/browser/toolbar.js","/npm/monaco-editor@0.55.1/esm/vs/platform/hover/browser/hover.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/textModelText.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/multiDiffEditor/utils.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/utils/editorGutter.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/features/gutterFeature.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/features/revertButtonsFeature.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/diffEditorWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/commands.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/diffEditor/diffEditor.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/anchorSelect/browser/anchorSelect.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/bracketMatching/browser/bracketMatching.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/caretOperations/browser/moveCaretCommand.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/caretOperations/browser/caretOperations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/caretOperations/browser/transpose.js","/npm/monaco-editor@0.55.1/esm/vs/platform/product/common/productService.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/dataTransfer.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/hierarchicalKind.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/common/quickInput.js","/npm/monaco-editor@0.55.1/esm/vs/platform/dnd/browser/dnd.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/dataTransfer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/services/bulkEditService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/editorState/browser/keybindingCancellation.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/editorState/browser/editorState.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineProgress/browser/inlineProgress.js","/npm/monaco-editor@0.55.1/esm/vs/platform/opener/common/opener.js","/npm/monaco-editor@0.55.1/esm/vs/platform/markdown/browser/markdownRenderer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/message/browser/messageController.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/ternarySearchTree.js","/npm/monaco-editor@0.55.1/esm/vs/platform/workspace/common/workspace.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/dropOrPasteInto/browser/defaultProviders.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/snippet/browser/snippetParser.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/dropOrPasteInto/browser/edit.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/button/button.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/errorMessage.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/keybindingLabel/keybindingLabel.js","/npm/monaco-editor@0.55.1/esm/vs/platform/layout/browser/layoutService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/actionWidget/browser/actionList.js","/npm/monaco-editor@0.55.1/esm/vs/platform/actionWidget/browser/actionWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/dropOrPasteInto/browser/postEditWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/clipboard/browser/clipboard.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/config/editorConfigurationSchema.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/codeAction/common/types.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/codeAction/browser/codeAction.js","/npm/monaco-editor@0.55.1/esm/vs/platform/markers/common/markers.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/codeAction/browser/codeActionKeybindingResolver.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/symbolIcons/browser/symbolIcons.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/codeAction/browser/codeActionMenu.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/codeAction/browser/codeActionModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/codeAction/browser/lightBulbWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/codeAction/browser/codeActionController.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/codeAction/browser/codeActionCommands.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/codeAction/browser/codeActionContributions.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/codelens/browser/codelens.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/codelens/browser/codeLensCache.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/codelens/browser/codelensWidget.js","/npm/monaco-editor@0.55.1/esm/vs/platform/environment/common/environment.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/languageFeatureDebounce.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/codelens/browser/codelensController.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/editorFeatures.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/hoverTypes.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/defaultDocumentColorProvider.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/color.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/colorDetector.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/hoverActionIds.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/controller/commandIds.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/inlineCompletionsHintsWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/hoverUtils.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/hoverOperation.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/resizable/resizable.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/resizableContentWidget.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/hover/hoverWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/contentHoverWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/contentHoverComputer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/contentHoverTypes.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/contentHoverStatusBar.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/toggle/toggle.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/find/browser/findDecorations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/find/browser/replaceAllCommand.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/search.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/find/browser/replacePattern.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/find/browser/findModel.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/findinput/findInputToggles.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/formattedTextRenderer.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/navigator.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/history.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/inputbox/inputBox.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/findinput/findInput.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/findinput/replaceInput.js","/npm/monaco-editor@0.55.1/esm/vs/platform/history/browser/contextScopedHistoryWidget.js","/npm/monaco-editor@0.55.1/esm/vs/platform/history/browser/historyWidgetKeybindingHint.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/find/browser/findWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/hoverCopyButton.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/getHover.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerSaturationBox.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerInsertButton.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerStrip.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerBody.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerCloseButton.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerHeader.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/colorPickerWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/colorPickerModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/colorPickerParticipantUtils.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/hoverColorPicker/hoverColorPickerParticipant.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/editOperation.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/gotoSymbol/browser/link/clickLinkGesture.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlayHints/browser/inlayHints.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/editorBrowser.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/codeEditor/embeddedCodeEditorWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/zoneWidget/browser/zoneWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/peekView/browser/peekView.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/list/listPaging.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/splitview/splitview.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/table/tableWidget.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/tree/tree.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/diff/diffChange.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/diff/diff.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/tree/indexTreeModel.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/tree/abstractTree.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/tree/objectTreeModel.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/tree/compressedObjectTreeModel.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/tree/objectTree.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/tree/asyncDataTree.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/tree/dataTree.js","/npm/monaco-editor@0.55.1/esm/vs/platform/contextkey/common/contextkeys.js","/npm/monaco-editor@0.55.1/esm/vs/platform/list/browser/listService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/gotoSymbol/browser/referencesModel.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/countBadge/countBadge.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/highlightedlabel/highlightedLabel.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/iconLabel/iconLabel.js","/npm/monaco-editor@0.55.1/esm/vs/platform/label/common/label.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesTree.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesController.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/gotoSymbol/browser/symbolNavigation.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/gotoSymbol/browser/goToSymbol.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/gotoSymbol/browser/goToCommands.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlayHints/browser/inlayHintsLocations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlayHints/browser/inlayHintsController.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlayHints/browser/inlayHintsHover.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/gotoError/browser/markerNavigationService.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/severityIcon/severityIcon.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/gotoError/browser/gotoErrorWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/gotoError/browser/gotoError.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/markerHoverParticipant.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/contentHoverRendered.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/contentHoverWidgetWrapper.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/hoverColorPicker/hoverColorPicker.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/contentHoverController.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/hoverColorPicker/hoverColorPickerContribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/standaloneColorPicker/standaloneColorPickerParticipant.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/standaloneColorPicker/standaloneColorPickerWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/standaloneColorPicker/standaloneColorPickerController.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/standaloneColorPicker/standaloneColorPickerActions.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/colorPicker/browser/colorPickerContribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/comment/browser/blockCommentCommand.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/comment/browser/lineCommentCommand.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/comment/browser/comment.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/contextmenu/browser/contextmenu.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/cursorUndo/browser/cursorUndo.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/dnd/browser/dragAndDropCommand.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/dnd/browser/dnd.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/treeViewsDnd.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/treeViewsDndService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/find/browser/findOptionsWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/find/browser/findState.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/find/browser/findWidgetSearchHistory.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/find/browser/replaceWidgetHistory.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/find/browser/findController.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/folding/browser/foldingRanges.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/folding/browser/foldingModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/folding/browser/hiddenRangeModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/folding/browser/indentRangeProvider.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/folding/browser/foldingDecorations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/folding/browser/syntaxRangeProvider.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/folding/browser/folding.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/fontZoom/browser/fontZoom.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/format/browser/formattingEdit.js","/npm/monaco-editor@0.55.1/esm/vs/platform/extensions/common/extensions.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/format/browser/format.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/format/browser/formatActions.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/documentSymbols/browser/outlineModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/documentSymbols/browser/documentSymbols.js","/npm/monaco-editor@0.55.1/esm/vs/platform/accessibility/browser/accessibleViewRegistry.js","/npm/monaco-editor@0.55.1/esm/vs/platform/observable/common/wrapInHotClass.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/validation.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/suggest.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionContextKeys.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/commands/trimTrailingWhitespaceCommand.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/linesOperations/browser/copyLinesCommand.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/indentation/common/indentUtils.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/linesOperations/browser/moveLinesCommand.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/linesOperations/browser/sortLinesCommand.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js","/npm/monaco-editor@0.55.1/esm/vs/platform/dataChannel/common/dataChannel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/structuredLogger.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/model/changeRecorder.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/labels.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/snippet/browser/snippetVariables.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/snippet/browser/snippetSession.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/snippet/browser/snippetController2.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/text/getPositionOffsetTransformerFromTextModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/utils.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/model/animation.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/model/ghostText.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/model/singleTextEditHelpers.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/model/computeGhostText.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/observableInternal/experimental/reducer.js","/npm/monaco-editor@0.55.1/esm/vs/platform/dataChannel/browser/forwardingTelemetryService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/textModelStringEdit.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/telemetry.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/diff/linesDiffComputer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/diff/legacyLinesDiffComputer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/diff/defaultLinesDiffComputer/algorithms/dynamicProgrammingDiffing.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/diff/defaultLinesDiffComputer/algorithms/myersDiffAlgorithm.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/diff/defaultLinesDiffComputer/computeMovedLines.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/diff/defaultLinesDiffComputer/heuristicSequenceOptimizations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/diff/defaultLinesDiffComputer/lineSequence.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/diff/linesDiffComputers.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineSuggestionItem.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/bracketPairsTextModelPart/fixBrackets.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/model/graph.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewInterface.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/model/provideInlineCompletions.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineEdit.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/services/inlineCompletionsService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/model/typingSpeed.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/suggestMemory.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/wordContextKey.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/suggestAlternatives.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/suggestCommitCharacters.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/smartSelect/browser/bracketSelections.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/wordDistance.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/completionModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/suggestModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/suggestOvertypingCapturer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/suggestWidgetStatus.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js","/npm/monaco-editor@0.55.1/esm/vs/platform/files/common/files.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/getIconClasses.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/suggestWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/suggestController.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/model/suggestWidgetAdapter.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/ranges/rangeSingleLine.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/ranges/columnRange.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/tokens/tokenWithTextArray.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/ghostText/ghostTextView.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/edits/lineEdit.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/core/2d/rect.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollElement.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollModelProvider.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollProvider.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollController.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/utils/utils.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsNewUsers.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCollapsedView.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCustomView.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsDeletionView.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsInsertionView.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsLineReplacementView.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsSideBySideView.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsWordReplacementView.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/originalEditorInlineDiffView.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineCompletionsView.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/hoverParticipant.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsAccessibleView.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/gpu/browser/gpuActions.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/hoverActions.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/glyphHoverComputer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/glyphHoverWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/glyphHoverController.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/hoverAccessibleViews.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/hover/browser/hoverContribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/indentation/common/indentation.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/indentation/browser/indentation.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inlayHints/browser/inlayHintsContribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplaceCommand.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/insertFinalNewLine/browser/insertFinalNewLineCommand.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/lineSelection/browser/lineSelection.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/linkedEditing/browser/linkedEditing.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/links/browser/getLinks.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/links/browser/links.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/longLinesHelper/browser/longLinesHelper.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/middleScroll/browser/middleScrollController.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/middleScroll/browser/middleScroll.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/wordHighlighter/browser/highlightDecorations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/multicursor/browser/multicursor.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/parameterHints/browser/provideSignatureHelp.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/parameterHints/browser/parameterHintsModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/parameterHints/browser/parameterHints.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.js","/npm/monaco-editor@0.55.1/esm/vs/platform/observable/common/wrapInReloadableClass.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/textResourceConfiguration.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/rename/browser/renameWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/rename/browser/rename.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/sectionHeaders/browser/sectionHeaders.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/tokens/common.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/tokens/sparseMultilineTokens.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/semanticTokensProviderStyling.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/semanticTokensStyling.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/semanticTokensDto.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/semanticTokens/common/getSemanticTokens.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/semanticTokens/common/semanticTokensConfig.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/semanticTokens/browser/documentSemanticTokens.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/semanticTokens/browser/viewportSemanticTokens.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/smartSelect/browser/wordSelections.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/smartSelect/browser/smartSelect.js","/npm/monaco-editor@0.55.1/esm/vs/platform/action/common/actionCommonCategories.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollActions.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollContribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/suggest/browser/suggestInlineCompletions.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/tokenization/browser/tokenization.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/unicodeTextModelHighlighter.js","/npm/monaco-editor@0.55.1/esm/vs/platform/opener/browser/link.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js","/npm/monaco-editor@0.55.1/esm/vs/platform/workspace/common/workspaceTrust.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js","/npm/monaco-editor@0.55.1/esm/vs/platform/dialogs/common/dialogs.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/glob.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languageSelector.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/wordHighlighter/browser/textualHighlightProvider.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/wordHighlighter/browser/wordHighlighter.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/wordOperations/browser/wordOperations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/wordPartOperations/browser/wordPartOperations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/readOnlyMessage/browser/contribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/diffEditorBreadcrumbs/browser/contribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/floatingMenu/browser/floatingMenu.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/floatingMenu/browser/floatingMenu.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/standaloneStrings.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/common/standaloneTheme.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/inspectTokens/inspectTokens.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/common/quickAccess.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/helpQuickAccess.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/quickAccess/browser/editorNavigationQuickAccess.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/fuzzyScorer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/tfIdf.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/pickerQuickAccess.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/normalization.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/commandsQuickAccess.js","/npm/monaco-editor@0.55.1/esm/vs/editor/contrib/quickAccess/browser/commandsQuickAccess.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/supports/tokenization.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/common/themes.js","/npm/monaco-editor@0.55.1/esm/vs/platform/theme/browser/iconsStyleSheet.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/standaloneThemeService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/toggleHighContrast/toggleHighContrast.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/standalone/standaloneEnums.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/editorBaseApi.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/worker/webWorker.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/webWorkerFactory.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/linkComputer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/supports/inplaceReplaceSupport.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languages/defaultDocumentColorsComputer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/findSectionHeaders.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/model/mirrorTextModel.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/textModelSync/textModelSync.impl.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/editorWebWorker.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/editorWorkerHost.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/services/editorWorkerService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/standaloneWebWorker.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/common/monarch/monarchCommon.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/common/monarch/monarchLexer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/colorizer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/services/abstractCodeEditorService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/standaloneCodeEditorService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/standaloneLayoutService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/undoRedo/common/undoRedoService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/semanticTokensStylingService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/languageFeatureRegistry.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/languageFeaturesService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/hover/browser/hoverWidget.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/contextview/contextview.js","/npm/monaco-editor@0.55.1/esm/vs/platform/contextview/browser/contextViewService.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/hover/hover.js","/npm/monaco-editor@0.55.1/esm/vs/platform/hover/browser/updatableHoverWidget.js","/npm/monaco-editor@0.55.1/esm/vs/platform/hover/browser/hoverService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/configuration/common/configurationModels.js","/npm/monaco-editor@0.55.1/esm/vs/platform/keybinding/common/keybindingResolver.js","/npm/monaco-editor@0.55.1/esm/vs/platform/keybinding/common/abstractKeybindingService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/keybinding/common/resolvedKeybindingItem.js","/npm/monaco-editor@0.55.1/esm/vs/platform/keybinding/common/baseResolvedKeybinding.js","/npm/monaco-editor@0.55.1/esm/vs/platform/keybinding/common/usLayoutResolvedKeybinding.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/languagesAssociations.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/languagesRegistry.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/languageService.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/menu/menu.js","/npm/monaco-editor@0.55.1/esm/vs/platform/contextview/browser/contextMenuHandler.js","/npm/monaco-editor@0.55.1/esm/vs/platform/contextview/browser/contextMenuService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/editor/common/editor.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/services/openerService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/markerDecorationsService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/common/services/modelService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/quickAccess.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/linkedText.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/quickInputUtils.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/quickInput.js","/npm/monaco-editor@0.55.1/esm/vs/base/browser/ui/progressbar/progressbar.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/quickInputBox.js","/npm/monaco-editor@0.55.1/esm/vs/base/common/comparers.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/quickInputList.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/quickInputActions.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/tree/quickInputTreeRenderer.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/tree/quickInputDelegate.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/tree/quickInputTree.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/tree/quickInputTreeFilter.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/tree/quickInputTreeSorter.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/tree/quickInputTreeController.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/quickInputController.js","/npm/monaco-editor@0.55.1/esm/vs/platform/quickinput/browser/quickInputService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/quickInput/standaloneQuickInputService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/accessibility/browser/accessibilityService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/clipboard/browser/clipboardService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/contextkey/browser/contextKeyService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/instantiation/common/graph.js","/npm/monaco-editor@0.55.1/esm/vs/platform/instantiation/common/instantiationService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/markers/common/markerService.js","/npm/monaco-editor@0.55.1/esm/vs/platform/configuration/common/configurations.js","/npm/monaco-editor@0.55.1/esm/vs/platform/log/common/logService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/standaloneTreeSitterLibraryService.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/standaloneServices.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/markdownRenderer/browser/editorMarkdownCodeBlockRenderer.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/standaloneCodeEditor.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/multiDiffEditor/colors.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/multiDiffEditor/diffEditorItemTemplate.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/multiDiffEditor/objectPool.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.js","/npm/monaco-editor@0.55.1/esm/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidget.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/standaloneEditor.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/common/monarch/monarchCompile.js","/npm/monaco-editor@0.55.1/esm/vs/editor/standalone/browser/standaloneLanguages.js","/npm/monaco-editor@0.55.1/esm/vs/editor/editor.api2.js","/npm/monaco-editor@0.55.1/esm/vs/language/css/monaco.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/language/html/monaco.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/language/json/monaco.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/language/typescript/lib/typescriptServicesMetadata.js","/npm/monaco-editor@0.55.1/esm/vs/language/typescript/monaco.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/_.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/abap/abap.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/apex/apex.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/azcli/azcli.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/bat/bat.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/bicep/bicep.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/cameligo/cameligo.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/clojure/clojure.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/coffee/coffee.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/cpp/cpp.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/csharp/csharp.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/csp/csp.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/css/css.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/cypher/cypher.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/dart/dart.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/dockerfile/dockerfile.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/ecl/ecl.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/elixir/elixir.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/flow9/flow9.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/fsharp/fsharp.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/freemarker2/freemarker2.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/go/go.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/graphql/graphql.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/handlebars/handlebars.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/hcl/hcl.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/html/html.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/ini/ini.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/java/java.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/javascript/javascript.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/julia/julia.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/kotlin/kotlin.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/less/less.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/lexon/lexon.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/lua/lua.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/liquid/liquid.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/m3/m3.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/markdown/markdown.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/mdx/mdx.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/mips/mips.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/msdax/msdax.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/mysql/mysql.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/objective-c/objective-c.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/pascal/pascal.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/pascaligo/pascaligo.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/perl/perl.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/pgsql/pgsql.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/php/php.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/pla/pla.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/postiats/postiats.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/powerquery/powerquery.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/powershell/powershell.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/protobuf/protobuf.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/pug/pug.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/python/python.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/qsharp/qsharp.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/r/r.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/razor/razor.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/redis/redis.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/redshift/redshift.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/restructuredtext/restructuredtext.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/ruby/ruby.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/rust/rust.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/sb/sb.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/scala/scala.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/scheme/scheme.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/scss/scss.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/shell/shell.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/solidity/solidity.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/sophia/sophia.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/sparql/sparql.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/sql/sql.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/st/st.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/swift/swift.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/systemverilog/systemverilog.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/tcl/tcl.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/twig/twig.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/typescript/typescript.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/typespec/typespec.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/vb/vb.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/wgsl/wgsl.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/xml/xml.contribution.js","/npm/monaco-editor@0.55.1/esm/vs/basic-languages/yaml/yaml.contribution.js","/npm/monaco-editor@0.55.1/esm/external/monaco-lsp-client/out/index.js","/npm/monaco-editor@0.55.1/esm/vs/common/workers.js","/npm/monaco-editor@0.55.1/esm/vs/editor/internal/initialize.js","/npm/monaco-editor@0.55.1/esm/vs/editor/editor.main.js"],"names":[],"mappings":"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AuB,CACjC,MACR,CAEI,WAAW,oBAAsB,MAAQ,IACzC,GAAI,OAAS,EAAG,CACZ,WAAW,oBAAuB,OAAS,EAAK,GACxD,CACI,GAAI,OAAS,GAAI,CACb,WAAW,oBAAuB,OAAS,GAAM,GACzD,CACA,CAWA,MAAM,iBAAmB,IAAI,WAAW,CACpC,IACA,GACA,IACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,IACA,GACA,GACA,IACA,IACA,IACA,MAYJ,MAAM,aAAe,IAAI,YAAY,CACjC,IACA,IACA,IACA,GACA,IACA,IACA,IACA,GACA,IACA,MACA,MACA,MACA,IACA,IACA,MACA,MACA,MACA,GACA,IACA,MACA,MAaJ,MAAM,sBAAwB,IAAI,YAAY,CAC1C,IACA,GACA,MACA,IACA,MACA,MACA,IACA,IACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,GACA,IACA,MACA,IACA,GACA,IACA,IACA,GACA,IACA,IACA,IACA,MAmBJ,MAAM,kBAAoB,IAAI,YAAY,CACtC,IACA,GACA,MACA,IACA,MACA,MACA,IACA,GACA,IACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,GACA,IACA,GACA,MACA,IACA,GACA,IACA,IACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,GACA,IACA,MACA,MACA,MACA,IACA,IACA,MACA,MACA,MACA,GACA,IACA,MACA,MCpQJ,SAAS,MAAM,QACX,OAAO,SAAU,KAAM,oBACnB,IAAK,IAAI,EAAI,EAAG,IAAM,OAAO,OAAQ,EAAI,IAAK,IAAK,CAC/C,MAAM,MAAQ,OAAO,GAAG,KAAM,oBAC9B,GAAI,MAAO,CACP,OAAO,KACvB,CACA,CACQ,OAAO,IACf,CACA,CAEA,eAAe,KAAK,UAAW,OAC/B,MAAM,cAAgB,eAAe,KAAK,UAAW,MACrD,SAAS,eAAe,WAAY,KAAM,oBACtC,IAAK,oBAAsB,mBAAmB,OAAS,KAAK,OAAQ,CAChE,OAAO,IACf,CACI,IAAI,QACJ,GAAI,WAAY,CACZ,QAA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UAAU,YAAc,WACtB,OAAS,KACT,WAAa,KACjB,EACE,UAAU,iBAAmB,SAAU,IAAK,KAAM,OAEhD,IAAK,OAAQ,CACX,aAAa,GACnB,CACI,MAAM,MAAQ,kBAAkB,KAChC,MAAM,OAAS,kBAAkB,MACjC,OAAO,kBAAkB,MAAO,OAAQ,MAC5C,EACE,UAAU,QAAU,SAAU,WAAY,cACxC,UAAW,eAAiB,WAAY,CACtC,MACN,CACI,UAAU,MAAM,YAAa,aACjC,EACE,UAAU,WAAa,SAAU,WAAY,cAC3C,GAAI,eAAiB,UAAW,CAC9B,MAAM,MAAQ,iBAAiB,MAAM,YAAa,cAClD,OAAO,SAAW,EAAI,UAAY,YAAY,MAAM,YAAa,MAAO,GAAG,EACjF,CACI,OAAO,SAAS,MAAM,YAC1B,EACE,UAAU,YAAc,SAAU,YAChC,MAAM,YAAc,EACxB,EACE,UAAU,eAAiB,WACzB,MAAQ,iBACZ,EACE,OAAO,SACT,CACA,IAAI,OAAS,kBCrzCb,MAAM,oBAAsB,OAAO,OAAO,CACtC,IACA,OACA,IACA,MACA,aACA,KACA,UACA,OACA,OACA,MACA,WACA,KACA,MACA,UACA,MACA,MACA,KACA,KACA,KACA,aACA,SACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,MACA,MACA,MACA,QACA,KACA,OACA,KACA,IACA,MACA,IACA,KACA,KACA,OACA,IACA,OACA,QACA,QACA,SACA,OACA,SACA,SACA,MACA,UACA,MACA,QACA,QACA,KACA,QACA,KACA,QACA,OACA,KACA,KACA,IACA,KACA,MACA,QACA,QAEJ,MAAM,oBAAsB,OAAO,OAAO,CACtC,OACA,SACA,MACA,MACA,QACA,MACA,OACA,OACA,WACA,aACA,WACA,UACA,cACA,OACA,QACA,QACA,SACA,UAEJ,MAAM,wBAA0B,uBAChC,SAAS,aAAa,MAAO,kBACzB,GAAI,iBAAiB,WAAa,IAAK,CACnC,OAAO,IACf,CACI,IACI,MAAM,IAAM,IAAI,IAAI,MAAO,wBAA0B,OACrD,GAAI,iBAAiB,SAAS,SAAS,IAAI,SAAS,QAAQ,KAAM,KAAM,CACpE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","file":"/npm/monaco-editor@0.55.1/esm/vs/editor/editor.main.js/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/monaco-editor@0.55.1/esm/vs/editor/editor.main.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\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/*\n * This module exists so that the AMD build of the monaco editor can replace this with an async loader plugin.\n * If you add new functions to this module make sure that they are also provided in the AMD build of the monaco editor.\n *\n * TODO@esm remove me once we no longer ship an AMD build.\n */\nfunction getNLSMessages() {\n    return globalThis._VSCODE_NLS_MESSAGES;\n}\nfunction getNLSLanguage() {\n    return globalThis._VSCODE_NLS_LANGUAGE;\n}\n\nexport { getNLSLanguage, getNLSMessages };\n","import { getNLSLanguage, getNLSMessages } from './nls.messages.js';\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// eslint-disable-next-line local/code-import-patterns\nconst isPseudo = getNLSLanguage() === 'pseudo' || (typeof document !== 'undefined' && document.location && typeof document.location.hash === 'string' && document.location.hash.indexOf('pseudo=true') >= 0);\nfunction _format(message, args) {\n    let result;\n    if (args.length === 0) {\n        result = message;\n    }\n    else {\n        result = message.replace(/\\{(\\d+)\\}/g, (match, rest) => {\n            const index = rest[0];\n            const arg = args[index];\n            let result = match;\n            if (typeof arg === 'string') {\n                result = arg;\n            }\n            else if (typeof arg === 'number' || typeof arg === 'boolean' || arg === void 0 || arg === null) {\n                result = String(arg);\n            }\n            return result;\n        });\n    }\n    if (isPseudo) {\n        // FF3B and FF3D is the Unicode zenkaku representation for [ and ]\n        result = '\\uFF3B' + result.replace(/[aouei]/g, '$&$&') + '\\uFF3D';\n    }\n    return result;\n}\n/**\n * @skipMangle\n */\nfunction localize(data /* | number when built */, message /* | null when built */, ...args) {\n    if (typeof data === 'number') {\n        return _format(lookupMessage(data, message), args);\n    }\n    return _format(message, args);\n}\n/**\n * Only used when built: Looks up the message in the global NLS table.\n * This table is being made available as a global through bootstrapping\n * depending on the target context.\n */\nfunction lookupMessage(index, fallback) {\n    const message = getNLSMessages()?.[index];\n    if (typeof message !== 'string') {\n        if (typeof fallback === 'string') {\n            return fallback;\n        }\n        throw new Error(`!!! NLS MISSING: ${index} !!!`);\n    }\n    return message;\n}\n/**\n * @skipMangle\n */\nfunction localize2(data /* | number when built */, originalMessage, ...args) {\n    let message;\n    if (typeof data === 'number') {\n        message = lookupMessage(data, originalMessage);\n    }\n    else {\n        message = originalMessage;\n    }\n    const value = _format(message, args);\n    return {\n        value,\n        original: originalMessage === message ? value : _format(originalMessage, args)\n    };\n}\n\nexport { getNLSLanguage, getNLSMessages, localize, localize2 };\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 *--------------------------------------------------------------------------------------------*/\nfunction ensureCodeWindow(targetWindow, fallbackWindowId) {\n    const codeWindow = targetWindow;\n    if (typeof codeWindow.vscodeWindowId !== 'number') {\n        Object.defineProperty(codeWindow, 'vscodeWindowId', {\n            get: () => fallbackWindowId\n        });\n    }\n}\n// eslint-disable-next-line no-restricted-globals\nconst mainWindow = window;\n\nexport { ensureCodeWindow, mainWindow };\n","import { mainWindow } from './window.js';\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 *--------------------------------------------------------------------------------------------*/\nclass WindowManager {\n    constructor() {\n        // --- Zoom Factor\n        this.mapWindowIdToZoomFactor = new Map();\n    }\n    static { this.INSTANCE = new WindowManager(); }\n    getZoomFactor(targetWindow) {\n        return this.mapWindowIdToZoomFactor.get(this.getWindowId(targetWindow)) ?? 1;\n    }\n    getWindowId(targetWindow) {\n        return targetWindow.vscodeWindowId;\n    }\n}\nfunction addMatchMediaChangeListener(targetWindow, query, callback) {\n    if (typeof query === 'string') {\n        query = targetWindow.matchMedia(query);\n    }\n    query.addEventListener('change', callback);\n}\n/** The zoom scale for an index, e.g. 1, 1.2, 1.4 */\nfunction getZoomFactor(targetWindow) {\n    return WindowManager.INSTANCE.getZoomFactor(targetWindow);\n}\nconst userAgent = navigator.userAgent;\nconst isFirefox = (userAgent.indexOf('Firefox') >= 0);\nconst isWebKit = (userAgent.indexOf('AppleWebKit') >= 0);\nconst isChrome = (userAgent.indexOf('Chrome') >= 0);\nconst isSafari = (!isChrome && (userAgent.indexOf('Safari') >= 0));\nconst isWebkitWebView = (!isChrome && !isSafari && isWebKit);\n(userAgent.indexOf('Electron/') >= 0);\nconst isAndroid = (userAgent.indexOf('Android') >= 0);\nlet standalone = false;\nif (typeof mainWindow.matchMedia === 'function') {\n    const standaloneMatchMedia = mainWindow.matchMedia('(display-mode: standalone) or (display-mode: window-controls-overlay)');\n    const fullScreenMatchMedia = mainWindow.matchMedia('(display-mode: fullscreen)');\n    standalone = standaloneMatchMedia.matches;\n    addMatchMediaChangeListener(mainWindow, standaloneMatchMedia, ({ matches }) => {\n        // entering fullscreen would change standaloneMatchMedia.matches to false\n        // if standalone is true (running as PWA) and entering fullscreen, skip this change\n        if (standalone && fullScreenMatchMedia.matches) {\n            return;\n        }\n        // otherwise update standalone (browser to PWA or PWA to browser)\n        standalone = matches;\n    });\n}\nfunction getMonacoEnvironment() {\n    return globalThis.MonacoEnvironment;\n}\n\nexport { addMatchMediaChangeListener, getMonacoEnvironment, getZoomFactor, isAndroid, isChrome, isFirefox, isSafari, isWebKit, isWebkitWebView };\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// Avoid circular dependency on EventEmitter by implementing a subset of the interface.\nclass ErrorHandler {\n    constructor() {\n        this.listeners = [];\n        this.unexpectedErrorHandler = function (e) {\n            setTimeout(() => {\n                if (e.stack) {\n                    if (ErrorNoTelemetry.isErrorNoTelemetry(e)) {\n                        throw new ErrorNoTelemetry(e.message + '\\n\\n' + e.stack);\n                    }\n                    throw new Error(e.message + '\\n\\n' + e.stack);\n                }\n                throw e;\n            }, 0);\n        };\n    }\n    emit(e) {\n        this.listeners.forEach((listener) => {\n            listener(e);\n        });\n    }\n    onUnexpectedError(e) {\n        this.unexpectedErrorHandler(e);\n        this.emit(e);\n    }\n    // For external errors, we don't want the listeners to be called\n    onUnexpectedExternalError(e) {\n        this.unexpectedErrorHandler(e);\n    }\n}\nconst errorHandler = new ErrorHandler();\n/**\n * This function should only be called with errors that indicate a bug in the product.\n * E.g. buggy extensions/invalid user-input/network issues should not be able to trigger this code path.\n * If they are, this indicates there is also a bug in the product.\n*/\nfunction onBugIndicatingError(e) {\n    errorHandler.onUnexpectedError(e);\n    return undefined;\n}\nfunction onUnexpectedError(e) {\n    // ignore errors from cancelled promises\n    if (!isCancellationError(e)) {\n        errorHandler.onUnexpectedError(e);\n    }\n    return undefined;\n}\nfunction onUnexpectedExternalError(e) {\n    // ignore errors from cancelled promises\n    if (!isCancellationError(e)) {\n        errorHandler.onUnexpectedExternalError(e);\n    }\n    return undefined;\n}\nfunction transformErrorForSerialization(error) {\n    if (error instanceof Error) {\n        const { name, message, cause } = error;\n        // eslint-disable-next-line local/code-no-any-casts\n        const stack = error.stacktrace || error.stack;\n        return {\n            $isError: true,\n            name,\n            message,\n            stack,\n            noTelemetry: ErrorNoTelemetry.isErrorNoTelemetry(error),\n            cause: cause ? transformErrorForSerialization(cause) : undefined,\n            code: error.code\n        };\n    }\n    // return as is\n    return error;\n}\nconst canceledName = 'Canceled';\n/**\n * Checks if the given error is a promise in canceled state\n */\nfunction isCancellationError(error) {\n    if (error instanceof CancellationError) {\n        return true;\n    }\n    return error instanceof Error && error.name === canceledName && error.message === canceledName;\n}\n// !!!IMPORTANT!!!\n// Do NOT change this class because it is also used as an API-type.\nclass CancellationError extends Error {\n    constructor() {\n        super(canceledName);\n        this.name = this.message;\n    }\n}\n/**\n * @deprecated use {@link CancellationError `new CancellationError()`} instead\n */\nfunction canceled() {\n    const error = new Error(canceledName);\n    error.name = error.message;\n    return error;\n}\nfunction illegalArgument(name) {\n    if (name) {\n        return new Error(`Illegal argument: ${name}`);\n    }\n    else {\n        return new Error('Illegal argument');\n    }\n}\nfunction illegalState(name) {\n    if (name) {\n        return new Error(`Illegal state: ${name}`);\n    }\n    else {\n        return new Error('Illegal state');\n    }\n}\nclass NotSupportedError extends Error {\n    constructor(message) {\n        super('NotSupported');\n        if (message) {\n            this.message = message;\n        }\n    }\n}\n/**\n * Error that when thrown won't be logged in telemetry as an unhandled error.\n */\nclass ErrorNoTelemetry extends Error {\n    constructor(msg) {\n        super(msg);\n        this.name = 'CodeExpectedError';\n    }\n    static fromError(err) {\n        if (err instanceof ErrorNoTelemetry) {\n            return err;\n        }\n        const result = new ErrorNoTelemetry();\n        result.message = err.message;\n        result.stack = err.stack;\n        return result;\n    }\n    static isErrorNoTelemetry(err) {\n        return err.name === 'CodeExpectedError';\n    }\n}\n/**\n * This error indicates a bug.\n * Do not throw this for invalid user input.\n * Only catch this error to recover gracefully from bugs.\n */\nclass BugIndicatingError extends Error {\n    constructor(message) {\n        super(message || 'An unexpected bug occurred.');\n        Object.setPrototypeOf(this, BugIndicatingError.prototype);\n        // Because we know for sure only buggy code throws this,\n        // we definitely want to break here and fix the bug.\n        // debugger;\n    }\n}\n\nexport { BugIndicatingError, CancellationError, ErrorHandler, ErrorNoTelemetry, NotSupportedError, canceled, canceledName, errorHandler, illegalArgument, illegalState, isCancellationError, onBugIndicatingError, onUnexpectedError, onUnexpectedExternalError, transformErrorForSerialization };\n","import { onUnexpectedError, BugIndicatingError } from './errors.js';\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/**\n * Throws an error with the provided message if the provided value does not evaluate to a true Javascript value.\n *\n * @deprecated Use `assert(...)` instead.\n * This method is usually used like this:\n * ```ts\n * import * as assert from 'vs/base/common/assert';\n * assert.ok(...);\n * ```\n *\n * However, `assert` in that example is a user chosen name.\n * There is no tooling for generating such an import statement.\n * Thus, the `assert(...)` function should be used instead.\n */\nfunction ok(value, message) {\n    if (!value) {\n        throw new Error(message ? `Assertion failed (${message})` : 'Assertion Failed');\n    }\n}\nfunction assertNever(value, message = 'Unreachable') {\n    throw new Error(message);\n}\n/**\n * Asserts that a condition is `truthy`.\n *\n * @throws provided {@linkcode messageOrError} if the {@linkcode condition} is `falsy`.\n *\n * @param condition The condition to assert.\n * @param messageOrError An error message or error object to throw if condition is `falsy`.\n */\nfunction assert(condition, messageOrError = 'unexpected state') {\n    if (!condition) {\n        // if error instance is provided, use it, otherwise create a new one\n        const errorToThrow = typeof messageOrError === 'string'\n            ? new BugIndicatingError(`Assertion Failed: ${messageOrError}`)\n            : messageOrError;\n        throw errorToThrow;\n    }\n}\n/**\n * Like assert, but doesn't throw.\n */\nfunction softAssert(condition, message = 'Soft Assertion Failed') {\n    if (!condition) {\n        onUnexpectedError(new BugIndicatingError(message));\n    }\n}\n/**\n * condition must be side-effect free!\n */\nfunction assertFn(condition) {\n    if (!condition()) {\n        // eslint-disable-next-line no-debugger\n        debugger;\n        // Reevaluate `condition` again to make debugging easier\n        condition();\n        onUnexpectedError(new BugIndicatingError('Assertion Failed'));\n    }\n}\nfunction checkAdjacentItems(items, predicate) {\n    let i = 0;\n    while (i < items.length - 1) {\n        const a = items[i];\n        const b = items[i + 1];\n        if (!predicate(a, b)) {\n            return false;\n        }\n        i++;\n    }\n    return true;\n}\n\nexport { assert, assertFn, assertNever, checkAdjacentItems, ok, softAssert };\n","import { assert } from './assert.js';\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/**\n * @returns whether the provided parameter is a JavaScript String or not.\n */\nfunction isString(str) {\n    return (typeof str === 'string');\n}\n/**\n * @returns whether the provided parameter is a JavaScript Array and each element in the array satisfies the provided type guard.\n */\nfunction isArrayOf(value, check) {\n    return Array.isArray(value) && value.every(check);\n}\n/**\n * @returns whether the provided parameter is of type `object` but **not**\n *\t`null`, an `array`, a `regexp`, nor a `date`.\n */\nfunction isObject(obj) {\n    // The method can't do a type cast since there are type (like strings) which\n    // are subclasses of any put not positvely matched by the function. Hence type\n    // narrowing results in wrong results.\n    return typeof obj === 'object'\n        && obj !== null\n        && !Array.isArray(obj)\n        && !(obj instanceof RegExp)\n        && !(obj instanceof Date);\n}\n/**\n * @returns whether the provided parameter is of type `Buffer` or Uint8Array dervived type\n */\nfunction isTypedArray(obj) {\n    const TypedArray = Object.getPrototypeOf(Uint8Array);\n    return typeof obj === 'object'\n        && obj instanceof TypedArray;\n}\n/**\n * In **contrast** to just checking `typeof` this will return `false` for `NaN`.\n * @returns whether the provided parameter is a JavaScript Number or not.\n */\nfunction isNumber(obj) {\n    return (typeof obj === 'number' && !isNaN(obj));\n}\n/**\n * @returns whether the provided parameter is an Iterable, casting to the given generic\n */\nfunction isIterable(obj) {\n    // eslint-disable-next-line local/code-no-any-casts\n    return !!obj && typeof obj[Symbol.iterator] === 'function';\n}\n/**\n * @returns whether the provided parameter is a JavaScript Boolean or not.\n */\nfunction isBoolean(obj) {\n    return (obj === true || obj === false);\n}\n/**\n * @returns whether the provided parameter is undefined.\n */\nfunction isUndefined(obj) {\n    return (typeof obj === 'undefined');\n}\n/**\n * @returns whether the provided parameter is defined.\n */\nfunction isDefined(arg) {\n    return !isUndefinedOrNull(arg);\n}\n/**\n * @returns whether the provided parameter is undefined or null.\n */\nfunction isUndefinedOrNull(obj) {\n    return (isUndefined(obj) || obj === null);\n}\nfunction assertType(condition, type) {\n    if (!condition) {\n        throw new Error(type ? `Unexpected type, expected '${type}'` : 'Unexpected type');\n    }\n}\n/**\n * Asserts that the argument passed in is neither undefined nor null.\n *\n * @see {@link assertDefined} for a similar utility that leverages TS assertion functions to narrow down the type of `arg` to be non-nullable.\n */\nfunction assertReturnsDefined(arg) {\n    assert(arg !== null && arg !== undefined, 'Argument is `undefined` or `null`.');\n    return arg;\n}\n/**\n * @returns whether the provided parameter is a JavaScript Function or not.\n */\nfunction isFunction(obj) {\n    return (typeof obj === 'function');\n}\nfunction validateConstraints(args, constraints) {\n    const len = Math.min(args.length, constraints.length);\n    for (let i = 0; i < len; i++) {\n        validateConstraint(args[i], constraints[i]);\n    }\n}\nfunction validateConstraint(arg, constraint) {\n    if (isString(constraint)) {\n        if (typeof arg !== constraint) {\n            throw new Error(`argument does not match constraint: typeof ${constraint}`);\n        }\n    }\n    else if (isFunction(constraint)) {\n        try {\n            if (arg instanceof constraint) {\n                return;\n            }\n        }\n        catch {\n            // ignore\n        }\n        // eslint-disable-next-line local/code-no-any-casts\n        if (!isUndefinedOrNull(arg) && arg.constructor === constraint) {\n            return;\n        }\n        if (constraint.length === 1 && constraint.call(undefined, arg) === true) {\n            return;\n        }\n        throw new Error(`argument does not match one of these constraints: arg instanceof constraint, arg.constructor === constraint, nor constraint(arg) === true`);\n    }\n}\n/**\n * Helper type assertion that safely upcasts a type to a supertype.\n *\n * This can be used to make sure the argument correctly conforms to the subtype while still being able to pass it\n * to contexts that expects the supertype.\n */\nfunction upcast(x) {\n    return x;\n}\n\nexport { assertReturnsDefined, assertType, isArrayOf, isBoolean, isDefined, isFunction, isIterable, isNumber, isObject, isString, isTypedArray, isUndefined, isUndefinedOrNull, upcast, validateConstraint, validateConstraints };\n","import '../../nls.js';\nimport { getNLSLanguage } from '../../nls.messages.js';\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 *--------------------------------------------------------------------------------------------*/\nconst LANGUAGE_DEFAULT = 'en';\nlet _isWindows = false;\nlet _isMacintosh = false;\nlet _isLinux = false;\nlet _isNative = false;\nlet _isWeb = false;\nlet _isIOS = false;\nlet _isMobile = false;\nlet _locale = undefined;\nlet _language = LANGUAGE_DEFAULT;\nlet _platformLocale = LANGUAGE_DEFAULT;\nlet _translationsConfigFile = undefined;\nlet _userAgent = undefined;\nconst $globalThis = globalThis;\nlet nodeProcess = undefined;\nif (typeof $globalThis.vscode !== 'undefined' && typeof $globalThis.vscode.process !== 'undefined') {\n    // Native environment (sandboxed)\n    nodeProcess = $globalThis.vscode.process;\n}\nelse if (typeof process !== 'undefined' && typeof process?.versions?.node === 'string') {\n    // Native environment (non-sandboxed)\n    nodeProcess = process;\n}\nconst isElectronProcess = typeof nodeProcess?.versions?.electron === 'string';\nconst isElectronRenderer = isElectronProcess && nodeProcess?.type === 'renderer';\n// Native environment\nif (typeof nodeProcess === 'object') {\n    _isWindows = (nodeProcess.platform === 'win32');\n    _isMacintosh = (nodeProcess.platform === 'darwin');\n    _isLinux = (nodeProcess.platform === 'linux');\n    _isLinux && !!nodeProcess.env['SNAP'] && !!nodeProcess.env['SNAP_REVISION'];\n    !!nodeProcess.env['CI'] || !!nodeProcess.env['BUILD_ARTIFACTSTAGINGDIRECTORY'] || !!nodeProcess.env['GITHUB_WORKSPACE'];\n    _locale = LANGUAGE_DEFAULT;\n    _language = LANGUAGE_DEFAULT;\n    const rawNlsConfig = nodeProcess.env['VSCODE_NLS_CONFIG'];\n    if (rawNlsConfig) {\n        try {\n            const nlsConfig = JSON.parse(rawNlsConfig);\n            _locale = nlsConfig.userLocale;\n            _platformLocale = nlsConfig.osLocale;\n            _language = nlsConfig.resolvedLanguage || LANGUAGE_DEFAULT;\n            _translationsConfigFile = nlsConfig.languagePack?.translationsConfigFile;\n        }\n        catch (e) {\n        }\n    }\n    _isNative = true;\n}\n// Web environment\nelse if (typeof navigator === 'object' && !isElectronRenderer) {\n    _userAgent = navigator.userAgent;\n    _isWindows = _userAgent.indexOf('Windows') >= 0;\n    _isMacintosh = _userAgent.indexOf('Macintosh') >= 0;\n    _isIOS = (_userAgent.indexOf('Macintosh') >= 0 || _userAgent.indexOf('iPad') >= 0 || _userAgent.indexOf('iPhone') >= 0) && !!navigator.maxTouchPoints && navigator.maxTouchPoints > 0;\n    _isLinux = _userAgent.indexOf('Linux') >= 0;\n    _isMobile = _userAgent?.indexOf('Mobi') >= 0;\n    _isWeb = true;\n    _language = getNLSLanguage() || LANGUAGE_DEFAULT;\n    _locale = navigator.language.toLowerCase();\n    _platformLocale = _locale;\n}\n// Unknown environment\nelse {\n    console.error('Unable to resolve platform.');\n}\nlet _platform = 0 /* Platform.Web */;\nif (_isMacintosh) {\n    _platform = 1 /* Platform.Mac */;\n}\nelse if (_isWindows) {\n    _platform = 3 /* Platform.Windows */;\n}\nelse if (_isLinux) {\n    _platform = 2 /* Platform.Linux */;\n}\nconst isWindows = _isWindows;\nconst isMacintosh = _isMacintosh;\nconst isLinux = _isLinux;\nconst isNative = _isNative;\nconst isWeb = _isWeb;\nconst isWebWorker = (_isWeb && typeof $globalThis.importScripts === 'function');\nconst webWorkerOrigin = isWebWorker ? $globalThis.origin : undefined;\nconst isIOS = _isIOS;\nconst isMobile = _isMobile;\nconst platform = _platform;\nconst userAgent = _userAgent;\n/**\n * The language used for the user interface. The format of\n * the string is all lower case (e.g. zh-tw for Traditional\n * Chinese or de for German)\n */\nconst language = _language;\nconst setTimeout0IsFaster = (typeof $globalThis.postMessage === 'function' && !$globalThis.importScripts);\n/**\n * See https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#:~:text=than%204%2C%20then-,set%20timeout%20to%204,-.\n *\n * Works similarly to `setTimeout(0)` but doesn't suffer from the 4ms artificial delay\n * that browsers set when the nesting level is > 5.\n */\nconst setTimeout0 = (() => {\n    if (setTimeout0IsFaster) {\n        const pending = [];\n        $globalThis.addEventListener('message', (e) => {\n            if (e.data && e.data.vscodeScheduleAsyncWork) {\n                for (let i = 0, len = pending.length; i < len; i++) {\n                    const candidate = pending[i];\n                    if (candidate.id === e.data.vscodeScheduleAsyncWork) {\n                        pending.splice(i, 1);\n                        candidate.callback();\n                        return;\n                    }\n                }\n            }\n        });\n        let lastId = 0;\n        return (callback) => {\n            const myId = ++lastId;\n            pending.push({\n                id: myId,\n                callback: callback\n            });\n            $globalThis.postMessage({ vscodeScheduleAsyncWork: myId }, '*');\n        };\n    }\n    return (callback) => setTimeout(callback);\n})();\nconst OS = (_isMacintosh || _isIOS ? 2 /* OperatingSystem.Macintosh */ : (_isWindows ? 1 /* OperatingSystem.Windows */ : 3 /* OperatingSystem.Linux */));\nlet _isLittleEndian = true;\nlet _isLittleEndianComputed = false;\nfunction isLittleEndian() {\n    if (!_isLittleEndianComputed) {\n        _isLittleEndianComputed = true;\n        const test = new Uint8Array(2);\n        test[0] = 1;\n        test[1] = 2;\n        const view = new Uint16Array(test.buffer);\n        _isLittleEndian = (view[0] === (2 << 8) + 1);\n    }\n    return _isLittleEndian;\n}\nconst isChrome = !!(userAgent && userAgent.indexOf('Chrome') >= 0);\nconst isFirefox = !!(userAgent && userAgent.indexOf('Firefox') >= 0);\nconst isSafari = !!(!isChrome && (userAgent && userAgent.indexOf('Safari') >= 0));\nconst isEdge = !!(userAgent && userAgent.indexOf('Edg/') >= 0);\nconst isAndroid = !!(userAgent && userAgent.indexOf('Android') >= 0);\n\nexport { LANGUAGE_DEFAULT, OS, isAndroid, isChrome, isEdge, isFirefox, isIOS, isLinux, isLittleEndian, isMacintosh, isMobile, isNative, isSafari, isWeb, isWebWorker, isWindows, language, platform, setTimeout0, setTimeout0IsFaster, userAgent, webWorkerOrigin };\n","import './browser.js';\nimport { mainWindow } from './window.js';\nimport { isNative } from '../common/platform.js';\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/**\n * Browser feature we can support in current platform, browser and environment.\n */\nconst BrowserFeatures = {\n    clipboard: {\n        writeText: (isNative\n            || (document.queryCommandSupported && document.queryCommandSupported('copy'))\n            || !!(navigator && navigator.clipboard && navigator.clipboard.writeText)),\n        readText: (isNative\n            || !!(navigator && navigator.clipboard && navigator.clipboard.readText))\n    },\n    pointerEvents: mainWindow.PointerEvent && ('ontouchstart' in mainWindow || navigator.maxTouchPoints > 0)\n};\n\nexport { BrowserFeatures };\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 *--------------------------------------------------------------------------------------------*/\nclass KeyCodeStrMap {\n    constructor() {\n        this._keyCodeToStr = [];\n        this._strToKeyCode = Object.create(null);\n    }\n    define(keyCode, str) {\n        this._keyCodeToStr[keyCode] = str;\n        this._strToKeyCode[str.toLowerCase()] = keyCode;\n    }\n    keyCodeToStr(keyCode) {\n        return this._keyCodeToStr[keyCode];\n    }\n    strToKeyCode(str) {\n        return this._strToKeyCode[str.toLowerCase()] || 0 /* KeyCode.Unknown */;\n    }\n}\nconst uiMap = new KeyCodeStrMap();\nconst userSettingsUSMap = new KeyCodeStrMap();\nconst userSettingsGeneralMap = new KeyCodeStrMap();\nconst EVENT_KEY_CODE_MAP = new Array(230);\nconst scanCodeStrToInt = Object.create(null);\nconst scanCodeLowerCaseStrToInt = Object.create(null);\n/**\n * -1 if a ScanCode => KeyCode mapping depends on kb layout.\n */\nconst IMMUTABLE_CODE_TO_KEY_CODE = [];\nfor (let i = 0; i <= 193 /* ScanCode.MAX_VALUE */; i++) {\n    IMMUTABLE_CODE_TO_KEY_CODE[i] = -1 /* KeyCode.DependsOnKbLayout */;\n}\n(function () {\n    // See https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx\n    // See https://github.com/microsoft/node-native-keymap/blob/88c0b0e5/deps/chromium/keyboard_codes_win.h\n    const empty = '';\n    const mappings = [\n        // immutable, scanCode, scanCodeStr, keyCode, keyCodeStr, eventKeyCode, vkey, usUserSettingsLabel, generalUserSettingsLabel\n        [1, 0 /* ScanCode.None */, 'None', 0 /* KeyCode.Unknown */, 'unknown', 0, 'VK_UNKNOWN', empty, empty],\n        [1, 1 /* ScanCode.Hyper */, 'Hyper', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 2 /* ScanCode.Super */, 'Super', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 3 /* ScanCode.Fn */, 'Fn', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 4 /* ScanCode.FnLock */, 'FnLock', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 5 /* ScanCode.Suspend */, 'Suspend', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 6 /* ScanCode.Resume */, 'Resume', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 7 /* ScanCode.Turbo */, 'Turbo', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 8 /* ScanCode.Sleep */, 'Sleep', 0 /* KeyCode.Unknown */, empty, 0, 'VK_SLEEP', empty, empty],\n        [1, 9 /* ScanCode.WakeUp */, 'WakeUp', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [0, 10 /* ScanCode.KeyA */, 'KeyA', 31 /* KeyCode.KeyA */, 'A', 65, 'VK_A', empty, empty],\n        [0, 11 /* ScanCode.KeyB */, 'KeyB', 32 /* KeyCode.KeyB */, 'B', 66, 'VK_B', empty, empty],\n        [0, 12 /* ScanCode.KeyC */, 'KeyC', 33 /* KeyCode.KeyC */, 'C', 67, 'VK_C', empty, empty],\n        [0, 13 /* ScanCode.KeyD */, 'KeyD', 34 /* KeyCode.KeyD */, 'D', 68, 'VK_D', empty, empty],\n        [0, 14 /* ScanCode.KeyE */, 'KeyE', 35 /* KeyCode.KeyE */, 'E', 69, 'VK_E', empty, empty],\n        [0, 15 /* ScanCode.KeyF */, 'KeyF', 36 /* KeyCode.KeyF */, 'F', 70, 'VK_F', empty, empty],\n        [0, 16 /* ScanCode.KeyG */, 'KeyG', 37 /* KeyCode.KeyG */, 'G', 71, 'VK_G', empty, empty],\n        [0, 17 /* ScanCode.KeyH */, 'KeyH', 38 /* KeyCode.KeyH */, 'H', 72, 'VK_H', empty, empty],\n        [0, 18 /* ScanCode.KeyI */, 'KeyI', 39 /* KeyCode.KeyI */, 'I', 73, 'VK_I', empty, empty],\n        [0, 19 /* ScanCode.KeyJ */, 'KeyJ', 40 /* KeyCode.KeyJ */, 'J', 74, 'VK_J', empty, empty],\n        [0, 20 /* ScanCode.KeyK */, 'KeyK', 41 /* KeyCode.KeyK */, 'K', 75, 'VK_K', empty, empty],\n        [0, 21 /* ScanCode.KeyL */, 'KeyL', 42 /* KeyCode.KeyL */, 'L', 76, 'VK_L', empty, empty],\n        [0, 22 /* ScanCode.KeyM */, 'KeyM', 43 /* KeyCode.KeyM */, 'M', 77, 'VK_M', empty, empty],\n        [0, 23 /* ScanCode.KeyN */, 'KeyN', 44 /* KeyCode.KeyN */, 'N', 78, 'VK_N', empty, empty],\n        [0, 24 /* ScanCode.KeyO */, 'KeyO', 45 /* KeyCode.KeyO */, 'O', 79, 'VK_O', empty, empty],\n        [0, 25 /* ScanCode.KeyP */, 'KeyP', 46 /* KeyCode.KeyP */, 'P', 80, 'VK_P', empty, empty],\n        [0, 26 /* ScanCode.KeyQ */, 'KeyQ', 47 /* KeyCode.KeyQ */, 'Q', 81, 'VK_Q', empty, empty],\n        [0, 27 /* ScanCode.KeyR */, 'KeyR', 48 /* KeyCode.KeyR */, 'R', 82, 'VK_R', empty, empty],\n        [0, 28 /* ScanCode.KeyS */, 'KeyS', 49 /* KeyCode.KeyS */, 'S', 83, 'VK_S', empty, empty],\n        [0, 29 /* ScanCode.KeyT */, 'KeyT', 50 /* KeyCode.KeyT */, 'T', 84, 'VK_T', empty, empty],\n        [0, 30 /* ScanCode.KeyU */, 'KeyU', 51 /* KeyCode.KeyU */, 'U', 85, 'VK_U', empty, empty],\n        [0, 31 /* ScanCode.KeyV */, 'KeyV', 52 /* KeyCode.KeyV */, 'V', 86, 'VK_V', empty, empty],\n        [0, 32 /* ScanCode.KeyW */, 'KeyW', 53 /* KeyCode.KeyW */, 'W', 87, 'VK_W', empty, empty],\n        [0, 33 /* ScanCode.KeyX */, 'KeyX', 54 /* KeyCode.KeyX */, 'X', 88, 'VK_X', empty, empty],\n        [0, 34 /* ScanCode.KeyY */, 'KeyY', 55 /* KeyCode.KeyY */, 'Y', 89, 'VK_Y', empty, empty],\n        [0, 35 /* ScanCode.KeyZ */, 'KeyZ', 56 /* KeyCode.KeyZ */, 'Z', 90, 'VK_Z', empty, empty],\n        [0, 36 /* ScanCode.Digit1 */, 'Digit1', 22 /* KeyCode.Digit1 */, '1', 49, 'VK_1', empty, empty],\n        [0, 37 /* ScanCode.Digit2 */, 'Digit2', 23 /* KeyCode.Digit2 */, '2', 50, 'VK_2', empty, empty],\n        [0, 38 /* ScanCode.Digit3 */, 'Digit3', 24 /* KeyCode.Digit3 */, '3', 51, 'VK_3', empty, empty],\n        [0, 39 /* ScanCode.Digit4 */, 'Digit4', 25 /* KeyCode.Digit4 */, '4', 52, 'VK_4', empty, empty],\n        [0, 40 /* ScanCode.Digit5 */, 'Digit5', 26 /* KeyCode.Digit5 */, '5', 53, 'VK_5', empty, empty],\n        [0, 41 /* ScanCode.Digit6 */, 'Digit6', 27 /* KeyCode.Digit6 */, '6', 54, 'VK_6', empty, empty],\n        [0, 42 /* ScanCode.Digit7 */, 'Digit7', 28 /* KeyCode.Digit7 */, '7', 55, 'VK_7', empty, empty],\n        [0, 43 /* ScanCode.Digit8 */, 'Digit8', 29 /* KeyCode.Digit8 */, '8', 56, 'VK_8', empty, empty],\n        [0, 44 /* ScanCode.Digit9 */, 'Digit9', 30 /* KeyCode.Digit9 */, '9', 57, 'VK_9', empty, empty],\n        [0, 45 /* ScanCode.Digit0 */, 'Digit0', 21 /* KeyCode.Digit0 */, '0', 48, 'VK_0', empty, empty],\n        [1, 46 /* ScanCode.Enter */, 'Enter', 3 /* KeyCode.Enter */, 'Enter', 13, 'VK_RETURN', empty, empty],\n        [1, 47 /* ScanCode.Escape */, 'Escape', 9 /* KeyCode.Escape */, 'Escape', 27, 'VK_ESCAPE', empty, empty],\n        [1, 48 /* ScanCode.Backspace */, 'Backspace', 1 /* KeyCode.Backspace */, 'Backspace', 8, 'VK_BACK', empty, empty],\n        [1, 49 /* ScanCode.Tab */, 'Tab', 2 /* KeyCode.Tab */, 'Tab', 9, 'VK_TAB', empty, empty],\n        [1, 50 /* ScanCode.Space */, 'Space', 10 /* KeyCode.Space */, 'Space', 32, 'VK_SPACE', empty, empty],\n        [0, 51 /* ScanCode.Minus */, 'Minus', 88 /* KeyCode.Minus */, '-', 189, 'VK_OEM_MINUS', '-', 'OEM_MINUS'],\n        [0, 52 /* ScanCode.Equal */, 'Equal', 86 /* KeyCode.Equal */, '=', 187, 'VK_OEM_PLUS', '=', 'OEM_PLUS'],\n        [0, 53 /* ScanCode.BracketLeft */, 'BracketLeft', 92 /* KeyCode.BracketLeft */, '[', 219, 'VK_OEM_4', '[', 'OEM_4'],\n        [0, 54 /* ScanCode.BracketRight */, 'BracketRight', 94 /* KeyCode.BracketRight */, ']', 221, 'VK_OEM_6', ']', 'OEM_6'],\n        [0, 55 /* ScanCode.Backslash */, 'Backslash', 93 /* KeyCode.Backslash */, '\\\\', 220, 'VK_OEM_5', '\\\\', 'OEM_5'],\n        [0, 56 /* ScanCode.IntlHash */, 'IntlHash', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty], // has been dropped from the w3c spec\n        [0, 57 /* ScanCode.Semicolon */, 'Semicolon', 85 /* KeyCode.Semicolon */, ';', 186, 'VK_OEM_1', ';', 'OEM_1'],\n        [0, 58 /* ScanCode.Quote */, 'Quote', 95 /* KeyCode.Quote */, '\\'', 222, 'VK_OEM_7', '\\'', 'OEM_7'],\n        [0, 59 /* ScanCode.Backquote */, 'Backquote', 91 /* KeyCode.Backquote */, '`', 192, 'VK_OEM_3', '`', 'OEM_3'],\n        [0, 60 /* ScanCode.Comma */, 'Comma', 87 /* KeyCode.Comma */, ',', 188, 'VK_OEM_COMMA', ',', 'OEM_COMMA'],\n        [0, 61 /* ScanCode.Period */, 'Period', 89 /* KeyCode.Period */, '.', 190, 'VK_OEM_PERIOD', '.', 'OEM_PERIOD'],\n        [0, 62 /* ScanCode.Slash */, 'Slash', 90 /* KeyCode.Slash */, '/', 191, 'VK_OEM_2', '/', 'OEM_2'],\n        [1, 63 /* ScanCode.CapsLock */, 'CapsLock', 8 /* KeyCode.CapsLock */, 'CapsLock', 20, 'VK_CAPITAL', empty, empty],\n        [1, 64 /* ScanCode.F1 */, 'F1', 59 /* KeyCode.F1 */, 'F1', 112, 'VK_F1', empty, empty],\n        [1, 65 /* ScanCode.F2 */, 'F2', 60 /* KeyCode.F2 */, 'F2', 113, 'VK_F2', empty, empty],\n        [1, 66 /* ScanCode.F3 */, 'F3', 61 /* KeyCode.F3 */, 'F3', 114, 'VK_F3', empty, empty],\n        [1, 67 /* ScanCode.F4 */, 'F4', 62 /* KeyCode.F4 */, 'F4', 115, 'VK_F4', empty, empty],\n        [1, 68 /* ScanCode.F5 */, 'F5', 63 /* KeyCode.F5 */, 'F5', 116, 'VK_F5', empty, empty],\n        [1, 69 /* ScanCode.F6 */, 'F6', 64 /* KeyCode.F6 */, 'F6', 117, 'VK_F6', empty, empty],\n        [1, 70 /* ScanCode.F7 */, 'F7', 65 /* KeyCode.F7 */, 'F7', 118, 'VK_F7', empty, empty],\n        [1, 71 /* ScanCode.F8 */, 'F8', 66 /* KeyCode.F8 */, 'F8', 119, 'VK_F8', empty, empty],\n        [1, 72 /* ScanCode.F9 */, 'F9', 67 /* KeyCode.F9 */, 'F9', 120, 'VK_F9', empty, empty],\n        [1, 73 /* ScanCode.F10 */, 'F10', 68 /* KeyCode.F10 */, 'F10', 121, 'VK_F10', empty, empty],\n        [1, 74 /* ScanCode.F11 */, 'F11', 69 /* KeyCode.F11 */, 'F11', 122, 'VK_F11', empty, empty],\n        [1, 75 /* ScanCode.F12 */, 'F12', 70 /* KeyCode.F12 */, 'F12', 123, 'VK_F12', empty, empty],\n        [1, 76 /* ScanCode.PrintScreen */, 'PrintScreen', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 77 /* ScanCode.ScrollLock */, 'ScrollLock', 84 /* KeyCode.ScrollLock */, 'ScrollLock', 145, 'VK_SCROLL', empty, empty],\n        [1, 78 /* ScanCode.Pause */, 'Pause', 7 /* KeyCode.PauseBreak */, 'PauseBreak', 19, 'VK_PAUSE', empty, empty],\n        [1, 79 /* ScanCode.Insert */, 'Insert', 19 /* KeyCode.Insert */, 'Insert', 45, 'VK_INSERT', empty, empty],\n        [1, 80 /* ScanCode.Home */, 'Home', 14 /* KeyCode.Home */, 'Home', 36, 'VK_HOME', empty, empty],\n        [1, 81 /* ScanCode.PageUp */, 'PageUp', 11 /* KeyCode.PageUp */, 'PageUp', 33, 'VK_PRIOR', empty, empty],\n        [1, 82 /* ScanCode.Delete */, 'Delete', 20 /* KeyCode.Delete */, 'Delete', 46, 'VK_DELETE', empty, empty],\n        [1, 83 /* ScanCode.End */, 'End', 13 /* KeyCode.End */, 'End', 35, 'VK_END', empty, empty],\n        [1, 84 /* ScanCode.PageDown */, 'PageDown', 12 /* KeyCode.PageDown */, 'PageDown', 34, 'VK_NEXT', empty, empty],\n        [1, 85 /* ScanCode.ArrowRight */, 'ArrowRight', 17 /* KeyCode.RightArrow */, 'RightArrow', 39, 'VK_RIGHT', 'Right', empty],\n        [1, 86 /* ScanCode.ArrowLeft */, 'ArrowLeft', 15 /* KeyCode.LeftArrow */, 'LeftArrow', 37, 'VK_LEFT', 'Left', empty],\n        [1, 87 /* ScanCode.ArrowDown */, 'ArrowDown', 18 /* KeyCode.DownArrow */, 'DownArrow', 40, 'VK_DOWN', 'Down', empty],\n        [1, 88 /* ScanCode.ArrowUp */, 'ArrowUp', 16 /* KeyCode.UpArrow */, 'UpArrow', 38, 'VK_UP', 'Up', empty],\n        [1, 89 /* ScanCode.NumLock */, 'NumLock', 83 /* KeyCode.NumLock */, 'NumLock', 144, 'VK_NUMLOCK', empty, empty],\n        [1, 90 /* ScanCode.NumpadDivide */, 'NumpadDivide', 113 /* KeyCode.NumpadDivide */, 'NumPad_Divide', 111, 'VK_DIVIDE', empty, empty],\n        [1, 91 /* ScanCode.NumpadMultiply */, 'NumpadMultiply', 108 /* KeyCode.NumpadMultiply */, 'NumPad_Multiply', 106, 'VK_MULTIPLY', empty, empty],\n        [1, 92 /* ScanCode.NumpadSubtract */, 'NumpadSubtract', 111 /* KeyCode.NumpadSubtract */, 'NumPad_Subtract', 109, 'VK_SUBTRACT', empty, empty],\n        [1, 93 /* ScanCode.NumpadAdd */, 'NumpadAdd', 109 /* KeyCode.NumpadAdd */, 'NumPad_Add', 107, 'VK_ADD', empty, empty],\n        [1, 94 /* ScanCode.NumpadEnter */, 'NumpadEnter', 3 /* KeyCode.Enter */, empty, 0, empty, empty, empty],\n        [1, 95 /* ScanCode.Numpad1 */, 'Numpad1', 99 /* KeyCode.Numpad1 */, 'NumPad1', 97, 'VK_NUMPAD1', empty, empty],\n        [1, 96 /* ScanCode.Numpad2 */, 'Numpad2', 100 /* KeyCode.Numpad2 */, 'NumPad2', 98, 'VK_NUMPAD2', empty, empty],\n        [1, 97 /* ScanCode.Numpad3 */, 'Numpad3', 101 /* KeyCode.Numpad3 */, 'NumPad3', 99, 'VK_NUMPAD3', empty, empty],\n        [1, 98 /* ScanCode.Numpad4 */, 'Numpad4', 102 /* KeyCode.Numpad4 */, 'NumPad4', 100, 'VK_NUMPAD4', empty, empty],\n        [1, 99 /* ScanCode.Numpad5 */, 'Numpad5', 103 /* KeyCode.Numpad5 */, 'NumPad5', 101, 'VK_NUMPAD5', empty, empty],\n        [1, 100 /* ScanCode.Numpad6 */, 'Numpad6', 104 /* KeyCode.Numpad6 */, 'NumPad6', 102, 'VK_NUMPAD6', empty, empty],\n        [1, 101 /* ScanCode.Numpad7 */, 'Numpad7', 105 /* KeyCode.Numpad7 */, 'NumPad7', 103, 'VK_NUMPAD7', empty, empty],\n        [1, 102 /* ScanCode.Numpad8 */, 'Numpad8', 106 /* KeyCode.Numpad8 */, 'NumPad8', 104, 'VK_NUMPAD8', empty, empty],\n        [1, 103 /* ScanCode.Numpad9 */, 'Numpad9', 107 /* KeyCode.Numpad9 */, 'NumPad9', 105, 'VK_NUMPAD9', empty, empty],\n        [1, 104 /* ScanCode.Numpad0 */, 'Numpad0', 98 /* KeyCode.Numpad0 */, 'NumPad0', 96, 'VK_NUMPAD0', empty, empty],\n        [1, 105 /* ScanCode.NumpadDecimal */, 'NumpadDecimal', 112 /* KeyCode.NumpadDecimal */, 'NumPad_Decimal', 110, 'VK_DECIMAL', empty, empty],\n        [0, 106 /* ScanCode.IntlBackslash */, 'IntlBackslash', 97 /* KeyCode.IntlBackslash */, 'OEM_102', 226, 'VK_OEM_102', empty, empty],\n        [1, 107 /* ScanCode.ContextMenu */, 'ContextMenu', 58 /* KeyCode.ContextMenu */, 'ContextMenu', 93, empty, empty, empty],\n        [1, 108 /* ScanCode.Power */, 'Power', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 109 /* ScanCode.NumpadEqual */, 'NumpadEqual', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 110 /* ScanCode.F13 */, 'F13', 71 /* KeyCode.F13 */, 'F13', 124, 'VK_F13', empty, empty],\n        [1, 111 /* ScanCode.F14 */, 'F14', 72 /* KeyCode.F14 */, 'F14', 125, 'VK_F14', empty, empty],\n        [1, 112 /* ScanCode.F15 */, 'F15', 73 /* KeyCode.F15 */, 'F15', 126, 'VK_F15', empty, empty],\n        [1, 113 /* ScanCode.F16 */, 'F16', 74 /* KeyCode.F16 */, 'F16', 127, 'VK_F16', empty, empty],\n        [1, 114 /* ScanCode.F17 */, 'F17', 75 /* KeyCode.F17 */, 'F17', 128, 'VK_F17', empty, empty],\n        [1, 115 /* ScanCode.F18 */, 'F18', 76 /* KeyCode.F18 */, 'F18', 129, 'VK_F18', empty, empty],\n        [1, 116 /* ScanCode.F19 */, 'F19', 77 /* KeyCode.F19 */, 'F19', 130, 'VK_F19', empty, empty],\n        [1, 117 /* ScanCode.F20 */, 'F20', 78 /* KeyCode.F20 */, 'F20', 131, 'VK_F20', empty, empty],\n        [1, 118 /* ScanCode.F21 */, 'F21', 79 /* KeyCode.F21 */, 'F21', 132, 'VK_F21', empty, empty],\n        [1, 119 /* ScanCode.F22 */, 'F22', 80 /* KeyCode.F22 */, 'F22', 133, 'VK_F22', empty, empty],\n        [1, 120 /* ScanCode.F23 */, 'F23', 81 /* KeyCode.F23 */, 'F23', 134, 'VK_F23', empty, empty],\n        [1, 121 /* ScanCode.F24 */, 'F24', 82 /* KeyCode.F24 */, 'F24', 135, 'VK_F24', empty, empty],\n        [1, 122 /* ScanCode.Open */, 'Open', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 123 /* ScanCode.Help */, 'Help', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 124 /* ScanCode.Select */, 'Select', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 125 /* ScanCode.Again */, 'Again', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 126 /* ScanCode.Undo */, 'Undo', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 127 /* ScanCode.Cut */, 'Cut', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 128 /* ScanCode.Copy */, 'Copy', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 129 /* ScanCode.Paste */, 'Paste', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 130 /* ScanCode.Find */, 'Find', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 131 /* ScanCode.AudioVolumeMute */, 'AudioVolumeMute', 117 /* KeyCode.AudioVolumeMute */, 'AudioVolumeMute', 173, 'VK_VOLUME_MUTE', empty, empty],\n        [1, 132 /* ScanCode.AudioVolumeUp */, 'AudioVolumeUp', 118 /* KeyCode.AudioVolumeUp */, 'AudioVolumeUp', 175, 'VK_VOLUME_UP', empty, empty],\n        [1, 133 /* ScanCode.AudioVolumeDown */, 'AudioVolumeDown', 119 /* KeyCode.AudioVolumeDown */, 'AudioVolumeDown', 174, 'VK_VOLUME_DOWN', empty, empty],\n        [1, 134 /* ScanCode.NumpadComma */, 'NumpadComma', 110 /* KeyCode.NUMPAD_SEPARATOR */, 'NumPad_Separator', 108, 'VK_SEPARATOR', empty, empty],\n        [0, 135 /* ScanCode.IntlRo */, 'IntlRo', 115 /* KeyCode.ABNT_C1 */, 'ABNT_C1', 193, 'VK_ABNT_C1', empty, empty],\n        [1, 136 /* ScanCode.KanaMode */, 'KanaMode', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [0, 137 /* ScanCode.IntlYen */, 'IntlYen', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 138 /* ScanCode.Convert */, 'Convert', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 139 /* ScanCode.NonConvert */, 'NonConvert', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 140 /* ScanCode.Lang1 */, 'Lang1', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 141 /* ScanCode.Lang2 */, 'Lang2', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 142 /* ScanCode.Lang3 */, 'Lang3', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 143 /* ScanCode.Lang4 */, 'Lang4', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 144 /* ScanCode.Lang5 */, 'Lang5', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 145 /* ScanCode.Abort */, 'Abort', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 146 /* ScanCode.Props */, 'Props', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 147 /* ScanCode.NumpadParenLeft */, 'NumpadParenLeft', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 148 /* ScanCode.NumpadParenRight */, 'NumpadParenRight', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 149 /* ScanCode.NumpadBackspace */, 'NumpadBackspace', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 150 /* ScanCode.NumpadMemoryStore */, 'NumpadMemoryStore', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 151 /* ScanCode.NumpadMemoryRecall */, 'NumpadMemoryRecall', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 152 /* ScanCode.NumpadMemoryClear */, 'NumpadMemoryClear', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 153 /* ScanCode.NumpadMemoryAdd */, 'NumpadMemoryAdd', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 154 /* ScanCode.NumpadMemorySubtract */, 'NumpadMemorySubtract', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 155 /* ScanCode.NumpadClear */, 'NumpadClear', 131 /* KeyCode.Clear */, 'Clear', 12, 'VK_CLEAR', empty, empty],\n        [1, 156 /* ScanCode.NumpadClearEntry */, 'NumpadClearEntry', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 5 /* KeyCode.Ctrl */, 'Ctrl', 17, 'VK_CONTROL', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 4 /* KeyCode.Shift */, 'Shift', 16, 'VK_SHIFT', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 6 /* KeyCode.Alt */, 'Alt', 18, 'VK_MENU', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 57 /* KeyCode.Meta */, 'Meta', 91, 'VK_COMMAND', empty, empty],\n        [1, 157 /* ScanCode.ControlLeft */, 'ControlLeft', 5 /* KeyCode.Ctrl */, empty, 0, 'VK_LCONTROL', empty, empty],\n        [1, 158 /* ScanCode.ShiftLeft */, 'ShiftLeft', 4 /* KeyCode.Shift */, empty, 0, 'VK_LSHIFT', empty, empty],\n        [1, 159 /* ScanCode.AltLeft */, 'AltLeft', 6 /* KeyCode.Alt */, empty, 0, 'VK_LMENU', empty, empty],\n        [1, 160 /* ScanCode.MetaLeft */, 'MetaLeft', 57 /* KeyCode.Meta */, empty, 0, 'VK_LWIN', empty, empty],\n        [1, 161 /* ScanCode.ControlRight */, 'ControlRight', 5 /* KeyCode.Ctrl */, empty, 0, 'VK_RCONTROL', empty, empty],\n        [1, 162 /* ScanCode.ShiftRight */, 'ShiftRight', 4 /* KeyCode.Shift */, empty, 0, 'VK_RSHIFT', empty, empty],\n        [1, 163 /* ScanCode.AltRight */, 'AltRight', 6 /* KeyCode.Alt */, empty, 0, 'VK_RMENU', empty, empty],\n        [1, 164 /* ScanCode.MetaRight */, 'MetaRight', 57 /* KeyCode.Meta */, empty, 0, 'VK_RWIN', empty, empty],\n        [1, 165 /* ScanCode.BrightnessUp */, 'BrightnessUp', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 166 /* ScanCode.BrightnessDown */, 'BrightnessDown', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 167 /* ScanCode.MediaPlay */, 'MediaPlay', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 168 /* ScanCode.MediaRecord */, 'MediaRecord', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 169 /* ScanCode.MediaFastForward */, 'MediaFastForward', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 170 /* ScanCode.MediaRewind */, 'MediaRewind', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 171 /* ScanCode.MediaTrackNext */, 'MediaTrackNext', 124 /* KeyCode.MediaTrackNext */, 'MediaTrackNext', 176, 'VK_MEDIA_NEXT_TRACK', empty, empty],\n        [1, 172 /* ScanCode.MediaTrackPrevious */, 'MediaTrackPrevious', 125 /* KeyCode.MediaTrackPrevious */, 'MediaTrackPrevious', 177, 'VK_MEDIA_PREV_TRACK', empty, empty],\n        [1, 173 /* ScanCode.MediaStop */, 'MediaStop', 126 /* KeyCode.MediaStop */, 'MediaStop', 178, 'VK_MEDIA_STOP', empty, empty],\n        [1, 174 /* ScanCode.Eject */, 'Eject', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 175 /* ScanCode.MediaPlayPause */, 'MediaPlayPause', 127 /* KeyCode.MediaPlayPause */, 'MediaPlayPause', 179, 'VK_MEDIA_PLAY_PAUSE', empty, empty],\n        [1, 176 /* ScanCode.MediaSelect */, 'MediaSelect', 128 /* KeyCode.LaunchMediaPlayer */, 'LaunchMediaPlayer', 181, 'VK_MEDIA_LAUNCH_MEDIA_SELECT', empty, empty],\n        [1, 177 /* ScanCode.LaunchMail */, 'LaunchMail', 129 /* KeyCode.LaunchMail */, 'LaunchMail', 180, 'VK_MEDIA_LAUNCH_MAIL', empty, empty],\n        [1, 178 /* ScanCode.LaunchApp2 */, 'LaunchApp2', 130 /* KeyCode.LaunchApp2 */, 'LaunchApp2', 183, 'VK_MEDIA_LAUNCH_APP2', empty, empty],\n        [1, 179 /* ScanCode.LaunchApp1 */, 'LaunchApp1', 0 /* KeyCode.Unknown */, empty, 0, 'VK_MEDIA_LAUNCH_APP1', empty, empty],\n        [1, 180 /* ScanCode.SelectTask */, 'SelectTask', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 181 /* ScanCode.LaunchScreenSaver */, 'LaunchScreenSaver', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 182 /* ScanCode.BrowserSearch */, 'BrowserSearch', 120 /* KeyCode.BrowserSearch */, 'BrowserSearch', 170, 'VK_BROWSER_SEARCH', empty, empty],\n        [1, 183 /* ScanCode.BrowserHome */, 'BrowserHome', 121 /* KeyCode.BrowserHome */, 'BrowserHome', 172, 'VK_BROWSER_HOME', empty, empty],\n        [1, 184 /* ScanCode.BrowserBack */, 'BrowserBack', 122 /* KeyCode.BrowserBack */, 'BrowserBack', 166, 'VK_BROWSER_BACK', empty, empty],\n        [1, 185 /* ScanCode.BrowserForward */, 'BrowserForward', 123 /* KeyCode.BrowserForward */, 'BrowserForward', 167, 'VK_BROWSER_FORWARD', empty, empty],\n        [1, 186 /* ScanCode.BrowserStop */, 'BrowserStop', 0 /* KeyCode.Unknown */, empty, 0, 'VK_BROWSER_STOP', empty, empty],\n        [1, 187 /* ScanCode.BrowserRefresh */, 'BrowserRefresh', 0 /* KeyCode.Unknown */, empty, 0, 'VK_BROWSER_REFRESH', empty, empty],\n        [1, 188 /* ScanCode.BrowserFavorites */, 'BrowserFavorites', 0 /* KeyCode.Unknown */, empty, 0, 'VK_BROWSER_FAVORITES', empty, empty],\n        [1, 189 /* ScanCode.ZoomToggle */, 'ZoomToggle', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 190 /* ScanCode.MailReply */, 'MailReply', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 191 /* ScanCode.MailForward */, 'MailForward', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        [1, 192 /* ScanCode.MailSend */, 'MailSend', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n        // See https://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html\n        // If an Input Method Editor is processing key input and the event is keydown, return 229.\n        [1, 0 /* ScanCode.None */, empty, 114 /* KeyCode.KEY_IN_COMPOSITION */, 'KeyInComposition', 229, empty, empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 116 /* KeyCode.ABNT_C2 */, 'ABNT_C2', 194, 'VK_ABNT_C2', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 96 /* KeyCode.OEM_8 */, 'OEM_8', 223, 'VK_OEM_8', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_KANA', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_HANGUL', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_JUNJA', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_FINAL', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_HANJA', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_KANJI', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_CONVERT', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_NONCONVERT', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_ACCEPT', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_MODECHANGE', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_SELECT', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PRINT', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_EXECUTE', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_SNAPSHOT', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_HELP', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_APPS', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PROCESSKEY', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PACKET', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_DBE_SBCSCHAR', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_DBE_DBCSCHAR', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_ATTN', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_CRSEL', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_EXSEL', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_EREOF', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PLAY', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_ZOOM', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_NONAME', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PA1', empty, empty],\n        [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_OEM_CLEAR', empty, empty],\n    ];\n    const seenKeyCode = [];\n    const seenScanCode = [];\n    for (const mapping of mappings) {\n        const [immutable, scanCode, scanCodeStr, keyCode, keyCodeStr, eventKeyCode, vkey, usUserSettingsLabel, generalUserSettingsLabel] = mapping;\n        if (!seenScanCode[scanCode]) {\n            seenScanCode[scanCode] = true;\n            scanCodeStrToInt[scanCodeStr] = scanCode;\n            scanCodeLowerCaseStrToInt[scanCodeStr.toLowerCase()] = scanCode;\n            if (immutable) {\n                IMMUTABLE_CODE_TO_KEY_CODE[scanCode] = keyCode;\n            }\n        }\n        if (!seenKeyCode[keyCode]) {\n            seenKeyCode[keyCode] = true;\n            if (!keyCodeStr) {\n                throw new Error(`String representation missing for key code ${keyCode} around scan code ${scanCodeStr}`);\n            }\n            uiMap.define(keyCode, keyCodeStr);\n            userSettingsUSMap.define(keyCode, usUserSettingsLabel || keyCodeStr);\n            userSettingsGeneralMap.define(keyCode, generalUserSettingsLabel || usUserSettingsLabel || keyCodeStr);\n        }\n        if (eventKeyCode) {\n            EVENT_KEY_CODE_MAP[eventKeyCode] = keyCode;\n        }\n    }\n})();\nvar KeyCodeUtils;\n(function (KeyCodeUtils) {\n    function toString(keyCode) {\n        return uiMap.keyCodeToStr(keyCode);\n    }\n    KeyCodeUtils.toString = toString;\n    function fromString(key) {\n        return uiMap.strToKeyCode(key);\n    }\n    KeyCodeUtils.fromString = fromString;\n    function toUserSettingsUS(keyCode) {\n        return userSettingsUSMap.keyCodeToStr(keyCode);\n    }\n    KeyCodeUtils.toUserSettingsUS = toUserSettingsUS;\n    function toUserSettingsGeneral(keyCode) {\n        return userSettingsGeneralMap.keyCodeToStr(keyCode);\n    }\n    KeyCodeUtils.toUserSettingsGeneral = toUserSettingsGeneral;\n    function fromUserSettings(key) {\n        return userSettingsUSMap.strToKeyCode(key) || userSettingsGeneralMap.strToKeyCode(key);\n    }\n    KeyCodeUtils.fromUserSettings = fromUserSettings;\n    function toElectronAccelerator(keyCode) {\n        if (keyCode >= 98 /* KeyCode.Numpad0 */ && keyCode <= 113 /* KeyCode.NumpadDivide */) {\n            // [Electron Accelerators] Electron is able to parse numpad keys, but unfortunately it\n            // renders them just as regular keys in menus. For example, num0 is rendered as \"0\",\n            // numdiv is rendered as \"/\", numsub is rendered as \"-\".\n            //\n            // This can lead to incredible confusion, as it makes numpad based keybindings indistinguishable\n            // from keybindings based on regular keys.\n            //\n            // We therefore need to fall back to custom rendering for numpad keys.\n            return null;\n        }\n        switch (keyCode) {\n            case 16 /* KeyCode.UpArrow */:\n                return 'Up';\n            case 18 /* KeyCode.DownArrow */:\n                return 'Down';\n            case 15 /* KeyCode.LeftArrow */:\n                return 'Left';\n            case 17 /* KeyCode.RightArrow */:\n                return 'Right';\n        }\n        return uiMap.keyCodeToStr(keyCode);\n    }\n    KeyCodeUtils.toElectronAccelerator = toElectronAccelerator;\n})(KeyCodeUtils || (KeyCodeUtils = {}));\nfunction KeyChord(firstPart, secondPart) {\n    const chordPart = ((secondPart & 0x0000FFFF) << 16) >>> 0;\n    return (firstPart | chordPart) >>> 0;\n}\n\nexport { EVENT_KEY_CODE_MAP, IMMUTABLE_CODE_TO_KEY_CODE, KeyChord, KeyCodeUtils };\n","import { illegalArgument } from './errors.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction decodeKeybinding(keybinding, OS) {\n    if (typeof keybinding === 'number') {\n        if (keybinding === 0) {\n            return null;\n        }\n        const firstChord = (keybinding & 0x0000FFFF) >>> 0;\n        const secondChord = (keybinding & 0xFFFF0000) >>> 16;\n        if (secondChord !== 0) {\n            return new Keybinding([\n                createSimpleKeybinding(firstChord, OS),\n                createSimpleKeybinding(secondChord, OS)\n            ]);\n        }\n        return new Keybinding([createSimpleKeybinding(firstChord, OS)]);\n    }\n    else {\n        const chords = [];\n        for (let i = 0; i < keybinding.length; i++) {\n            chords.push(createSimpleKeybinding(keybinding[i], OS));\n        }\n        return new Keybinding(chords);\n    }\n}\nfunction createSimpleKeybinding(keybinding, OS) {\n    const ctrlCmd = (keybinding & 2048 /* BinaryKeybindingsMask.CtrlCmd */ ? true : false);\n    const winCtrl = (keybinding & 256 /* BinaryKeybindingsMask.WinCtrl */ ? true : false);\n    const ctrlKey = (OS === 2 /* OperatingSystem.Macintosh */ ? winCtrl : ctrlCmd);\n    const shiftKey = (keybinding & 1024 /* BinaryKeybindingsMask.Shift */ ? true : false);\n    const altKey = (keybinding & 512 /* BinaryKeybindingsMask.Alt */ ? true : false);\n    const metaKey = (OS === 2 /* OperatingSystem.Macintosh */ ? ctrlCmd : winCtrl);\n    const keyCode = (keybinding & 255 /* BinaryKeybindingsMask.KeyCode */);\n    return new KeyCodeChord(ctrlKey, shiftKey, altKey, metaKey, keyCode);\n}\n/**\n * Represents a chord which uses the `keyCode` field of keyboard events.\n * A chord is a combination of keys pressed simultaneously.\n */\nclass KeyCodeChord {\n    constructor(ctrlKey, shiftKey, altKey, metaKey, keyCode) {\n        this.ctrlKey = ctrlKey;\n        this.shiftKey = shiftKey;\n        this.altKey = altKey;\n        this.metaKey = metaKey;\n        this.keyCode = keyCode;\n    }\n    equals(other) {\n        return (other instanceof KeyCodeChord\n            && this.ctrlKey === other.ctrlKey\n            && this.shiftKey === other.shiftKey\n            && this.altKey === other.altKey\n            && this.metaKey === other.metaKey\n            && this.keyCode === other.keyCode);\n    }\n    isModifierKey() {\n        return (this.keyCode === 0 /* KeyCode.Unknown */\n            || this.keyCode === 5 /* KeyCode.Ctrl */\n            || this.keyCode === 57 /* KeyCode.Meta */\n            || this.keyCode === 6 /* KeyCode.Alt */\n            || this.keyCode === 4 /* KeyCode.Shift */);\n    }\n    /**\n     * Does this keybinding refer to the key code of a modifier and it also has the modifier flag?\n     */\n    isDuplicateModifierCase() {\n        return ((this.ctrlKey && this.keyCode === 5 /* KeyCode.Ctrl */)\n            || (this.shiftKey && this.keyCode === 4 /* KeyCode.Shift */)\n            || (this.altKey && this.keyCode === 6 /* KeyCode.Alt */)\n            || (this.metaKey && this.keyCode === 57 /* KeyCode.Meta */));\n    }\n}\n/**\n * A keybinding is a sequence of chords.\n */\nclass Keybinding {\n    constructor(chords) {\n        if (chords.length === 0) {\n            throw illegalArgument(`chords`);\n        }\n        this.chords = chords;\n    }\n}\nclass ResolvedChord {\n    constructor(ctrlKey, shiftKey, altKey, metaKey, keyLabel, keyAriaLabel) {\n        this.ctrlKey = ctrlKey;\n        this.shiftKey = shiftKey;\n        this.altKey = altKey;\n        this.metaKey = metaKey;\n        this.keyLabel = keyLabel;\n        this.keyAriaLabel = keyAriaLabel;\n    }\n}\n/**\n * A resolved keybinding. Consists of one or multiple chords.\n */\nclass ResolvedKeybinding {\n}\n\nexport { KeyCodeChord, Keybinding, ResolvedChord, ResolvedKeybinding, createSimpleKeybinding, decodeKeybinding };\n","import { isFirefox, isWebKit } from './browser.js';\nimport { KeyCodeUtils, EVENT_KEY_CODE_MAP } from '../common/keyCodes.js';\nimport { KeyCodeChord } from '../common/keybindings.js';\nimport { isMacintosh, isLinux } from '../common/platform.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction extractKeyCode(e) {\n    if (e.charCode) {\n        // \"keypress\" events mostly\n        const char = String.fromCharCode(e.charCode).toUpperCase();\n        return KeyCodeUtils.fromString(char);\n    }\n    const keyCode = e.keyCode;\n    // browser quirks\n    if (keyCode === 3) {\n        return 7 /* KeyCode.PauseBreak */;\n    }\n    else if (isFirefox) {\n        switch (keyCode) {\n            case 59: return 85 /* KeyCode.Semicolon */;\n            case 60:\n                if (isLinux) {\n                    return 97 /* KeyCode.IntlBackslash */;\n                }\n                break;\n            case 61: return 86 /* KeyCode.Equal */;\n            // based on: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#numpad_keys\n            case 107: return 109 /* KeyCode.NumpadAdd */;\n            case 109: return 111 /* KeyCode.NumpadSubtract */;\n            case 173: return 88 /* KeyCode.Minus */;\n            case 224:\n                if (isMacintosh) {\n                    return 57 /* KeyCode.Meta */;\n                }\n                break;\n        }\n    }\n    else if (isWebKit) {\n        if (isMacintosh && keyCode === 93) {\n            // the two meta keys in the Mac have different key codes (91 and 93)\n            return 57 /* KeyCode.Meta */;\n        }\n        else if (!isMacintosh && keyCode === 92) {\n            return 57 /* KeyCode.Meta */;\n        }\n    }\n    // cross browser keycodes:\n    return EVENT_KEY_CODE_MAP[keyCode] || 0 /* KeyCode.Unknown */;\n}\nconst ctrlKeyMod = (isMacintosh ? 256 /* KeyMod.WinCtrl */ : 2048 /* KeyMod.CtrlCmd */);\nconst altKeyMod = 512 /* KeyMod.Alt */;\nconst shiftKeyMod = 1024 /* KeyMod.Shift */;\nconst metaKeyMod = (isMacintosh ? 2048 /* KeyMod.CtrlCmd */ : 256 /* KeyMod.WinCtrl */);\nclass StandardKeyboardEvent {\n    constructor(source) {\n        this._standardKeyboardEventBrand = true;\n        const e = source;\n        this.browserEvent = e;\n        this.target = e.target;\n        this.ctrlKey = e.ctrlKey;\n        this.shiftKey = e.shiftKey;\n        this.altKey = e.altKey;\n        this.metaKey = e.metaKey;\n        this.altGraphKey = e.getModifierState?.('AltGraph');\n        this.keyCode = extractKeyCode(e);\n        this.code = e.code;\n        // console.info(e.type + \": keyCode: \" + e.keyCode + \", which: \" + e.which + \", charCode: \" + e.charCode + \", detail: \" + e.detail + \" ====> \" + this.keyCode + ' -- ' + KeyCode[this.keyCode]);\n        this.ctrlKey = this.ctrlKey || this.keyCode === 5 /* KeyCode.Ctrl */;\n        this.altKey = this.altKey || this.keyCode === 6 /* KeyCode.Alt */;\n        this.shiftKey = this.shiftKey || this.keyCode === 4 /* KeyCode.Shift */;\n        this.metaKey = this.metaKey || this.keyCode === 57 /* KeyCode.Meta */;\n        this._asKeybinding = this._computeKeybinding();\n        this._asKeyCodeChord = this._computeKeyCodeChord();\n        // console.log(`code: ${e.code}, keyCode: ${e.keyCode}, key: ${e.key}`);\n    }\n    preventDefault() {\n        if (this.browserEvent && this.browserEvent.preventDefault) {\n            this.browserEvent.preventDefault();\n        }\n    }\n    stopPropagation() {\n        if (this.browserEvent && this.browserEvent.stopPropagation) {\n            this.browserEvent.stopPropagation();\n        }\n    }\n    toKeyCodeChord() {\n        return this._asKeyCodeChord;\n    }\n    equals(other) {\n        return this._asKeybinding === other;\n    }\n    _computeKeybinding() {\n        let key = 0 /* KeyCode.Unknown */;\n        if (this.keyCode !== 5 /* KeyCode.Ctrl */ && this.keyCode !== 4 /* KeyCode.Shift */ && this.keyCode !== 6 /* KeyCode.Alt */ && this.keyCode !== 57 /* KeyCode.Meta */) {\n            key = this.keyCode;\n        }\n        let result = 0;\n        if (this.ctrlKey) {\n            result |= ctrlKeyMod;\n        }\n        if (this.altKey) {\n            result |= altKeyMod;\n        }\n        if (this.shiftKey) {\n            result |= shiftKeyMod;\n        }\n        if (this.metaKey) {\n            result |= metaKeyMod;\n        }\n        result |= key;\n        return result;\n    }\n    _computeKeyCodeChord() {\n        let key = 0 /* KeyCode.Unknown */;\n        if (this.keyCode !== 5 /* KeyCode.Ctrl */ && this.keyCode !== 4 /* KeyCode.Shift */ && this.keyCode !== 6 /* KeyCode.Alt */ && this.keyCode !== 57 /* KeyCode.Meta */) {\n            key = this.keyCode;\n        }\n        return new KeyCodeChord(this.ctrlKey, this.shiftKey, this.altKey, this.metaKey, key);\n    }\n}\n\nexport { StandardKeyboardEvent };\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 *--------------------------------------------------------------------------------------------*/\nconst sameOriginWindowChainCache = new WeakMap();\nfunction getParentWindowIfSameOrigin(w) {\n    if (!w.parent || w.parent === w) {\n        return null;\n    }\n    // Cannot really tell if we have access to the parent window unless we try to access something in it\n    try {\n        const location = w.location;\n        const parentLocation = w.parent.location;\n        if (location.origin !== 'null' && parentLocation.origin !== 'null' && location.origin !== parentLocation.origin) {\n            return null;\n        }\n    }\n    catch (e) {\n        return null;\n    }\n    return w.parent;\n}\nclass IframeUtils {\n    /**\n     * Returns a chain of embedded windows with the same origin (which can be accessed programmatically).\n     * Having a chain of length 1 might mean that the current execution environment is running outside of an iframe or inside an iframe embedded in a window with a different origin.\n     */\n    static getSameOriginWindowChain(targetWindow) {\n        let windowChainCache = sameOriginWindowChainCache.get(targetWindow);\n        if (!windowChainCache) {\n            windowChainCache = [];\n            sameOriginWindowChainCache.set(targetWindow, windowChainCache);\n            let w = targetWindow;\n            let parent;\n            do {\n                parent = getParentWindowIfSameOrigin(w);\n                if (parent) {\n                    windowChainCache.push({\n                        window: new WeakRef(w),\n                        iframeElement: w.frameElement || null\n                    });\n                }\n                else {\n                    windowChainCache.push({\n                        window: new WeakRef(w),\n                        iframeElement: null\n                    });\n                }\n                w = parent;\n            } while (w);\n        }\n        return windowChainCache.slice(0);\n    }\n    /**\n     * Returns the position of `childWindow` relative to `ancestorWindow`\n     */\n    static getPositionOfChildWindowRelativeToAncestorWindow(childWindow, ancestorWindow) {\n        if (!ancestorWindow || childWindow === ancestorWindow) {\n            return {\n                top: 0,\n                left: 0\n            };\n        }\n        let top = 0, left = 0;\n        const windowChain = this.getSameOriginWindowChain(childWindow);\n        for (const windowChainEl of windowChain) {\n            const windowInChain = windowChainEl.window.deref();\n            top += windowInChain?.scrollY ?? 0;\n            left += windowInChain?.scrollX ?? 0;\n            if (windowInChain === ancestorWindow) {\n                break;\n            }\n            if (!windowChainEl.iframeElement) {\n                break;\n            }\n            const boundingRect = windowChainEl.iframeElement.getBoundingClientRect();\n            top += boundingRect.top;\n            left += boundingRect.left;\n        }\n        return {\n            top: top,\n            left: left\n        };\n    }\n}\n\nexport { IframeUtils };\n","import { isChrome, isFirefox, isSafari } from './browser.js';\nimport { IframeUtils } from './iframe.js';\nimport { isMacintosh, isWindows } from '../common/platform.js';\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 *--------------------------------------------------------------------------------------------*/\nclass StandardMouseEvent {\n    constructor(targetWindow, e) {\n        this.timestamp = Date.now();\n        this.browserEvent = e;\n        this.leftButton = e.button === 0;\n        this.middleButton = e.button === 1;\n        this.rightButton = e.button === 2;\n        this.buttons = e.buttons;\n        this.defaultPrevented = e.defaultPrevented;\n        this.target = e.target;\n        this.detail = e.detail || 1;\n        if (e.type === 'dblclick') {\n            this.detail = 2;\n        }\n        this.ctrlKey = e.ctrlKey;\n        this.shiftKey = e.shiftKey;\n        this.altKey = e.altKey;\n        this.metaKey = e.metaKey;\n        if (typeof e.pageX === 'number') {\n            this.posx = e.pageX;\n            this.posy = e.pageY;\n        }\n        else {\n            // Probably hit by MSGestureEvent\n            this.posx = e.clientX + this.target.ownerDocument.body.scrollLeft + this.target.ownerDocument.documentElement.scrollLeft;\n            this.posy = e.clientY + this.target.ownerDocument.body.scrollTop + this.target.ownerDocument.documentElement.scrollTop;\n        }\n        // Find the position of the iframe this code is executing in relative to the iframe where the event was captured.\n        const iframeOffsets = IframeUtils.getPositionOfChildWindowRelativeToAncestorWindow(targetWindow, e.view);\n        this.posx -= iframeOffsets.left;\n        this.posy -= iframeOffsets.top;\n    }\n    preventDefault() {\n        this.browserEvent.preventDefault();\n    }\n    stopPropagation() {\n        this.browserEvent.stopPropagation();\n    }\n}\nclass StandardWheelEvent {\n    constructor(e, deltaX = 0, deltaY = 0) {\n        this.browserEvent = e || null;\n        // eslint-disable-next-line local/code-no-any-casts\n        this.target = e ? (e.target || e.targetNode || e.srcElement) : null;\n        this.deltaY = deltaY;\n        this.deltaX = deltaX;\n        let shouldFactorDPR = false;\n        if (isChrome) {\n            // Chrome version >= 123 contains the fix to factor devicePixelRatio into the wheel event.\n            // See https://chromium.googlesource.com/chromium/src.git/+/be51b448441ff0c9d1f17e0f25c4bf1ab3f11f61\n            const chromeVersionMatch = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n            const chromeMajorVersion = chromeVersionMatch ? parseInt(chromeVersionMatch[1]) : 123;\n            shouldFactorDPR = chromeMajorVersion <= 122;\n        }\n        if (e) {\n            // Old (deprecated) wheel events\n            // eslint-disable-next-line local/code-no-any-casts\n            const e1 = e;\n            // eslint-disable-next-line local/code-no-any-casts\n            const e2 = e;\n            const devicePixelRatio = e.view?.devicePixelRatio || 1;\n            // vertical delta scroll\n            if (typeof e1.wheelDeltaY !== 'undefined') {\n                if (shouldFactorDPR) {\n                    // Refs https://github.com/microsoft/vscode/issues/146403#issuecomment-1854538928\n                    this.deltaY = e1.wheelDeltaY / (120 * devicePixelRatio);\n                }\n                else {\n                    this.deltaY = e1.wheelDeltaY / 120;\n                }\n            }\n            else if (typeof e2.VERTICAL_AXIS !== 'undefined' && e2.axis === e2.VERTICAL_AXIS) {\n                this.deltaY = -e2.detail / 3;\n            }\n            else if (e.type === 'wheel') {\n                // Modern wheel event\n                // https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent\n                const ev = e;\n                if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n                    // the deltas are expressed in lines\n                    if (isFirefox && !isMacintosh) {\n                        this.deltaY = -e.deltaY / 3;\n                    }\n                    else {\n                        this.deltaY = -e.deltaY;\n                    }\n                }\n                else {\n                    this.deltaY = -e.deltaY / 40;\n                }\n            }\n            // horizontal delta scroll\n            if (typeof e1.wheelDeltaX !== 'undefined') {\n                if (isSafari && isWindows) {\n                    this.deltaX = -(e1.wheelDeltaX / 120);\n                }\n                else if (shouldFactorDPR) {\n                    // Refs https://github.com/microsoft/vscode/issues/146403#issuecomment-1854538928\n                    this.deltaX = e1.wheelDeltaX / (120 * devicePixelRatio);\n                }\n                else {\n                    this.deltaX = e1.wheelDeltaX / 120;\n                }\n            }\n            else if (typeof e2.HORIZONTAL_AXIS !== 'undefined' && e2.axis === e2.HORIZONTAL_AXIS) {\n                this.deltaX = -e.detail / 3;\n            }\n            else if (e.type === 'wheel') {\n                // Modern wheel event\n                // https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent\n                const ev = e;\n                if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n                    // the deltas are expressed in lines\n                    if (isFirefox && !isMacintosh) {\n                        this.deltaX = -e.deltaX / 3;\n                    }\n                    else {\n                        this.deltaX = -e.deltaX;\n                    }\n                }\n                else {\n                    this.deltaX = -e.deltaX / 40;\n                }\n            }\n            // Assume a vertical scroll if nothing else worked\n            if (this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta) {\n                if (shouldFactorDPR) {\n                    // Refs https://github.com/microsoft/vscode/issues/146403#issuecomment-1854538928\n                    this.deltaY = e.wheelDelta / (120 * devicePixelRatio);\n                }\n                else {\n                    this.deltaY = e.wheelDelta / 120;\n                }\n            }\n        }\n    }\n    preventDefault() {\n        this.browserEvent?.preventDefault();\n    }\n    stopPropagation() {\n        this.browserEvent?.stopPropagation();\n    }\n}\n\nexport { StandardMouseEvent, StandardWheelEvent };\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/**\n * Given a function, returns a function that is only calling that function once.\n */\nfunction createSingleCallFunction(fn, fnDidRunCallback) {\n    const _this = this;\n    let didCall = false;\n    let result;\n    return function () {\n        if (didCall) {\n            return result;\n        }\n        didCall = true;\n        {\n            result = fn.apply(_this, arguments);\n        }\n        return result;\n    };\n}\n\nexport { createSingleCallFunction };\n","import { isIterable } from './types.js';\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 *--------------------------------------------------------------------------------------------*/\nvar Iterable;\n(function (Iterable) {\n    function is(thing) {\n        return !!thing && typeof thing === 'object' && typeof thing[Symbol.iterator] === 'function';\n    }\n    Iterable.is = is;\n    const _empty = Object.freeze([]);\n    function empty() {\n        return _empty;\n    }\n    Iterable.empty = empty;\n    function* single(element) {\n        yield element;\n    }\n    Iterable.single = single;\n    function wrap(iterableOrElement) {\n        if (is(iterableOrElement)) {\n            return iterableOrElement;\n        }\n        else {\n            return single(iterableOrElement);\n        }\n    }\n    Iterable.wrap = wrap;\n    function from(iterable) {\n        return iterable || _empty;\n    }\n    Iterable.from = from;\n    function* reverse(array) {\n        for (let i = array.length - 1; i >= 0; i--) {\n            yield array[i];\n        }\n    }\n    Iterable.reverse = reverse;\n    function isEmpty(iterable) {\n        return !iterable || iterable[Symbol.iterator]().next().done === true;\n    }\n    Iterable.isEmpty = isEmpty;\n    function first(iterable) {\n        return iterable[Symbol.iterator]().next().value;\n    }\n    Iterable.first = first;\n    function some(iterable, predicate) {\n        let i = 0;\n        for (const element of iterable) {\n            if (predicate(element, i++)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    Iterable.some = some;\n    function every(iterable, predicate) {\n        let i = 0;\n        for (const element of iterable) {\n            if (!predicate(element, i++)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    Iterable.every = every;\n    function find(iterable, predicate) {\n        for (const element of iterable) {\n            if (predicate(element)) {\n                return element;\n            }\n        }\n        return undefined;\n    }\n    Iterable.find = find;\n    function* filter(iterable, predicate) {\n        for (const element of iterable) {\n            if (predicate(element)) {\n                yield element;\n            }\n        }\n    }\n    Iterable.filter = filter;\n    function* map(iterable, fn) {\n        let index = 0;\n        for (const element of iterable) {\n            yield fn(element, index++);\n        }\n    }\n    Iterable.map = map;\n    function* flatMap(iterable, fn) {\n        let index = 0;\n        for (const element of iterable) {\n            yield* fn(element, index++);\n        }\n    }\n    Iterable.flatMap = flatMap;\n    function* concat(...iterables) {\n        for (const item of iterables) {\n            if (isIterable(item)) {\n                yield* item;\n            }\n            else {\n                yield item;\n            }\n        }\n    }\n    Iterable.concat = concat;\n    function reduce(iterable, reducer, initialValue) {\n        let value = initialValue;\n        for (const element of iterable) {\n            value = reducer(value, element);\n        }\n        return value;\n    }\n    Iterable.reduce = reduce;\n    function length(iterable) {\n        let count = 0;\n        for (const _ of iterable) {\n            count++;\n        }\n        return count;\n    }\n    Iterable.length = length;\n    /**\n     * Returns an iterable slice of the array, with the same semantics as `array.slice()`.\n     */\n    function* slice(arr, from, to = arr.length) {\n        if (from < -arr.length) {\n            from = 0;\n        }\n        if (from < 0) {\n            from += arr.length;\n        }\n        if (to < 0) {\n            to += arr.length;\n        }\n        else if (to > arr.length) {\n            to = arr.length;\n        }\n        for (; from < to; from++) {\n            yield arr[from];\n        }\n    }\n    Iterable.slice = slice;\n    /**\n     * Consumes `atMost` elements from iterable and returns the consumed elements,\n     * and an iterable for the rest of the elements.\n     */\n    function consume(iterable, atMost = Number.POSITIVE_INFINITY) {\n        const consumed = [];\n        if (atMost === 0) {\n            return [consumed, iterable];\n        }\n        const iterator = iterable[Symbol.iterator]();\n        for (let i = 0; i < atMost; i++) {\n            const next = iterator.next();\n            if (next.done) {\n                return [consumed, Iterable.empty()];\n            }\n            consumed.push(next.value);\n        }\n        return [consumed, { [Symbol.iterator]() { return iterator; } }];\n    }\n    Iterable.consume = consume;\n    async function asyncToArray(iterable) {\n        const result = [];\n        for await (const item of iterable) {\n            result.push(item);\n        }\n        return result;\n    }\n    Iterable.asyncToArray = asyncToArray;\n    async function asyncToArrayFlat(iterable) {\n        let result = [];\n        for await (const item of iterable) {\n            result = result.concat(item);\n        }\n        return result;\n    }\n    Iterable.asyncToArrayFlat = asyncToArrayFlat;\n})(Iterable || (Iterable = {}));\n\nexport { Iterable };\n","import { Iterable } from './iterator.js';\n\nfunction setParentOfDisposable(child, parent) {\n}\n/**\n * Indicates that the given object is a singleton which does not need to be disposed.\n*/\nfunction markAsSingleton(singleton) {\n    return singleton;\n}\n/**\n * Check if `thing` is {@link IDisposable disposable}.\n */\nfunction isDisposable(thing) {\n    // eslint-disable-next-line local/code-no-any-casts\n    return typeof thing === 'object' && thing !== null && typeof thing.dispose === 'function' && thing.dispose.length === 0;\n}\nfunction dispose(arg) {\n    if (Iterable.is(arg)) {\n        const errors = [];\n        for (const d of arg) {\n            if (d) {\n                try {\n                    d.dispose();\n                }\n                catch (e) {\n                    errors.push(e);\n                }\n            }\n        }\n        if (errors.length === 1) {\n            throw errors[0];\n        }\n        else if (errors.length > 1) {\n            throw new AggregateError(errors, 'Encountered errors while disposing of store');\n        }\n        return Array.isArray(arg) ? [] : arg;\n    }\n    else if (arg) {\n        arg.dispose();\n        return arg;\n    }\n}\n/**\n * Combine multiple disposable values into a single {@link IDisposable}.\n */\nfunction combinedDisposable(...disposables) {\n    const parent = toDisposable(() => dispose(disposables));\n    return parent;\n}\nclass FunctionDisposable {\n    constructor(fn) {\n        this._isDisposed = false;\n        this._fn = fn;\n    }\n    dispose() {\n        if (this._isDisposed) {\n            return;\n        }\n        if (!this._fn) {\n            throw new Error(`Unbound disposable context: Need to use an arrow function to preserve the value of this`);\n        }\n        this._isDisposed = true;\n        this._fn();\n    }\n}\n/**\n * Turn a function that implements dispose into an {@link IDisposable}.\n *\n * @param fn Clean up function, guaranteed to be called only **once**.\n */\nfunction toDisposable(fn) {\n    return new FunctionDisposable(fn);\n}\n/**\n * Manages a collection of disposable values.\n *\n * This is the preferred way to manage multiple disposables. A `DisposableStore` is safer to work with than an\n * `IDisposable[]` as it considers edge cases, such as registering the same value multiple times or adding an item to a\n * store that has already been disposed of.\n */\nclass DisposableStore {\n    static { this.DISABLE_DISPOSED_WARNING = false; }\n    constructor() {\n        this._toDispose = new Set();\n        this._isDisposed = false;\n    }\n    /**\n     * Dispose of all registered disposables and mark this object as disposed.\n     *\n     * Any future disposables added to this object will be disposed of on `add`.\n     */\n    dispose() {\n        if (this._isDisposed) {\n            return;\n        }\n        this._isDisposed = true;\n        this.clear();\n    }\n    /**\n     * @return `true` if this object has been disposed of.\n     */\n    get isDisposed() {\n        return this._isDisposed;\n    }\n    /**\n     * Dispose of all registered disposables but do not mark this object as disposed.\n     */\n    clear() {\n        if (this._toDispose.size === 0) {\n            return;\n        }\n        try {\n            dispose(this._toDispose);\n        }\n        finally {\n            this._toDispose.clear();\n        }\n    }\n    /**\n     * Add a new {@link IDisposable disposable} to the collection.\n     */\n    add(o) {\n        if (!o || o === Disposable.None) {\n            return o;\n        }\n        if (o === this) {\n            throw new Error('Cannot register a disposable on itself!');\n        }\n        if (this._isDisposed) {\n            if (!DisposableStore.DISABLE_DISPOSED_WARNING) {\n                console.warn(new Error('Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!').stack);\n            }\n        }\n        else {\n            this._toDispose.add(o);\n        }\n        return o;\n    }\n    /**\n     * Deletes a disposable from store and disposes of it. This will not throw or warn and proceed to dispose the\n     * disposable even when the disposable is not part in the store.\n     */\n    delete(o) {\n        if (!o) {\n            return;\n        }\n        if (o === this) {\n            throw new Error('Cannot dispose a disposable on itself!');\n        }\n        this._toDispose.delete(o);\n        o.dispose();\n    }\n}\n/**\n * Abstract base class for a {@link IDisposable disposable} object.\n *\n * Subclasses can {@linkcode _register} disposables that will be automatically cleaned up when this object is disposed of.\n */\nclass Disposable {\n    /**\n     * A disposable that does nothing when it is disposed of.\n     *\n     * TODO: This should not be a static property.\n     */\n    static { this.None = Object.freeze({ dispose() { } }); }\n    constructor() {\n        this._store = new DisposableStore();\n        setParentOfDisposable(this._store);\n    }\n    dispose() {\n        this._store.dispose();\n    }\n    /**\n     * Adds `o` to the collection of disposables managed by this object.\n     */\n    _register(o) {\n        if (o === this) {\n            throw new Error('Cannot register a disposable on itself!');\n        }\n        return this._store.add(o);\n    }\n}\n/**\n * Manages the lifecycle of a disposable value that may be changed.\n *\n * This ensures that when the disposable value is changed, the previously held disposable is disposed of. You can\n * also register a `MutableDisposable` on a `Disposable` to ensure it is automatically cleaned up.\n */\nclass MutableDisposable {\n    constructor() {\n        this._isDisposed = false;\n    }\n    /**\n     * Get the currently held disposable value, or `undefined` if this MutableDisposable has been disposed\n     */\n    get value() {\n        return this._isDisposed ? undefined : this._value;\n    }\n    /**\n     * Set a new disposable value.\n     *\n     * Behaviour:\n     * - If the MutableDisposable has been disposed, the setter is a no-op.\n     * - If the new value is strictly equal to the current value, the setter is a no-op.\n     * - Otherwise the previous value (if any) is disposed and the new value is stored.\n     *\n     * Related helpers:\n     * - clear() resets the value to `undefined` (and disposes the previous value).\n     * - clearAndLeak() returns the old value without disposing it and removes its parent.\n     */\n    set value(value) {\n        if (this._isDisposed || value === this._value) {\n            return;\n        }\n        this._value?.dispose();\n        this._value = value;\n    }\n    /**\n     * Resets the stored value and disposed of the previously stored value.\n     */\n    clear() {\n        this.value = undefined;\n    }\n    dispose() {\n        this._isDisposed = true;\n        this._value?.dispose();\n        this._value = undefined;\n    }\n}\nclass RefCountedDisposable {\n    constructor(_disposable) {\n        this._disposable = _disposable;\n        this._counter = 1;\n    }\n    acquire() {\n        this._counter++;\n        return this;\n    }\n    release() {\n        if (--this._counter === 0) {\n            this._disposable.dispose();\n        }\n        return this;\n    }\n}\nclass ImmortalReference {\n    constructor(object) {\n        this.object = object;\n    }\n    dispose() { }\n}\n/**\n * A map the manages the lifecycle of the values that it stores.\n */\nclass DisposableMap {\n    constructor() {\n        this._store = new Map();\n        this._isDisposed = false;\n    }\n    /**\n     * Disposes of all stored values and mark this object as disposed.\n     *\n     * Trying to use this object after it has been disposed of is an error.\n     */\n    dispose() {\n        this._isDisposed = true;\n        this.clearAndDisposeAll();\n    }\n    /**\n     * Disposes of all stored values and clear the map, but DO NOT mark this object as disposed.\n     */\n    clearAndDisposeAll() {\n        if (!this._store.size) {\n            return;\n        }\n        try {\n            dispose(this._store.values());\n        }\n        finally {\n            this._store.clear();\n        }\n    }\n    get(key) {\n        return this._store.get(key);\n    }\n    set(key, value, skipDisposeOnOverwrite = false) {\n        if (this._isDisposed) {\n            console.warn(new Error('Trying to add a disposable to a DisposableMap that has already been disposed of. The added object will be leaked!').stack);\n        }\n        if (!skipDisposeOnOverwrite) {\n            this._store.get(key)?.dispose();\n        }\n        this._store.set(key, value);\n    }\n    /**\n     * Delete the value stored for `key` from this map and also dispose of it.\n     */\n    deleteAndDispose(key) {\n        this._store.get(key)?.dispose();\n        this._store.delete(key);\n    }\n    values() {\n        return this._store.values();\n    }\n    [Symbol.iterator]() {\n        return this._store[Symbol.iterator]();\n    }\n}\n\nexport { Disposable, DisposableMap, DisposableStore, ImmortalReference, MutableDisposable, RefCountedDisposable, combinedDisposable, dispose, isDisposable, markAsSingleton, toDisposable };\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 *--------------------------------------------------------------------------------------------*/\nclass Node {\n    static { this.Undefined = new Node(undefined); }\n    constructor(element) {\n        this.element = element;\n        this.next = Node.Undefined;\n        this.prev = Node.Undefined;\n    }\n}\nclass LinkedList {\n    constructor() {\n        this._first = Node.Undefined;\n        this._last = Node.Undefined;\n        this._size = 0;\n    }\n    get size() {\n        return this._size;\n    }\n    isEmpty() {\n        return this._first === Node.Undefined;\n    }\n    clear() {\n        let node = this._first;\n        while (node !== Node.Undefined) {\n            const next = node.next;\n            node.prev = Node.Undefined;\n            node.next = Node.Undefined;\n            node = next;\n        }\n        this._first = Node.Undefined;\n        this._last = Node.Undefined;\n        this._size = 0;\n    }\n    unshift(element) {\n        return this._insert(element, false);\n    }\n    push(element) {\n        return this._insert(element, true);\n    }\n    _insert(element, atTheEnd) {\n        const newNode = new Node(element);\n        if (this._first === Node.Undefined) {\n            this._first = newNode;\n            this._last = newNode;\n        }\n        else if (atTheEnd) {\n            // push\n            const oldLast = this._last;\n            this._last = newNode;\n            newNode.prev = oldLast;\n            oldLast.next = newNode;\n        }\n        else {\n            // unshift\n            const oldFirst = this._first;\n            this._first = newNode;\n            newNode.next = oldFirst;\n            oldFirst.prev = newNode;\n        }\n        this._size += 1;\n        let didRemove = false;\n        return () => {\n            if (!didRemove) {\n                didRemove = true;\n                this._remove(newNode);\n            }\n        };\n    }\n    shift() {\n        if (this._first === Node.Undefined) {\n            return undefined;\n        }\n        else {\n            const res = this._first.element;\n            this._remove(this._first);\n            return res;\n        }\n    }\n    pop() {\n        if (this._last === Node.Undefined) {\n            return undefined;\n        }\n        else {\n            const res = this._last.element;\n            this._remove(this._last);\n            return res;\n        }\n    }\n    _remove(node) {\n        if (node.prev !== Node.Undefined && node.next !== Node.Undefined) {\n            // middle\n            const anchor = node.prev;\n            anchor.next = node.next;\n            node.next.prev = anchor;\n        }\n        else if (node.prev === Node.Undefined && node.next === Node.Undefined) {\n            // only node\n            this._first = Node.Undefined;\n            this._last = Node.Undefined;\n        }\n        else if (node.next === Node.Undefined) {\n            // last\n            this._last = this._last.prev;\n            this._last.next = Node.Undefined;\n        }\n        else if (node.prev === Node.Undefined) {\n            // first\n            this._first = this._first.next;\n            this._first.prev = Node.Undefined;\n        }\n        // done\n        this._size -= 1;\n    }\n    *[Symbol.iterator]() {\n        let node = this._first;\n        while (node !== Node.Undefined) {\n            yield node.element;\n            node = node.next;\n        }\n    }\n}\n\nexport { LinkedList };\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 *--------------------------------------------------------------------------------------------*/\nconst performanceNow = globalThis.performance.now.bind(globalThis.performance);\nclass StopWatch {\n    static create(highResolution) {\n        return new StopWatch(highResolution);\n    }\n    constructor(highResolution) {\n        this._now = highResolution === false ? Date.now : performanceNow;\n        this._startTime = this._now();\n        this._stopTime = -1;\n    }\n    stop() {\n        this._stopTime = this._now();\n    }\n    reset() {\n        this._startTime = this._now();\n        this._stopTime = -1;\n    }\n    elapsed() {\n        if (this._stopTime !== -1) {\n            return this._stopTime - this._startTime;\n        }\n        return this._now() - this._startTime;\n    }\n}\n\nexport { StopWatch };\n","import { onUnexpectedError } from './errors.js';\nimport { createSingleCallFunction } from './functional.js';\nimport { Disposable, combinedDisposable, DisposableStore, toDisposable } from './lifecycle.js';\nimport { LinkedList } from './linkedList.js';\nimport { StopWatch } from './stopwatch.js';\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 *--------------------------------------------------------------------------------------------*/\nvar Event;\n(function (Event) {\n    Event.None = () => Disposable.None;\n    /**\n     * Given an event, returns another event which debounces calls and defers the listeners to a later task via a shared\n     * `setTimeout`. The event is converted into a signal (`Event<void>`) to avoid additional object creation as a\n     * result of merging events and to try prevent race conditions that could arise when using related deferred and\n     * non-deferred events.\n     *\n     * This is useful for deferring non-critical work (eg. general UI updates) to ensure it does not block critical work\n     * (eg. latency of keypress to text rendered).\n     *\n     * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n     * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n     * returned event causes this utility to leak a listener on the original event.\n     *\n     * @param event The event source for the new event.\n     * @param disposable A disposable store to add the new EventEmitter to.\n     */\n    function defer(event, disposable) {\n        return debounce(event, () => void 0, 0, undefined, true, undefined, disposable);\n    }\n    Event.defer = defer;\n    /**\n     * Given an event, returns another event which only fires once.\n     *\n     * @param event The event source for the new event.\n     */\n    function once(event) {\n        return (listener, thisArgs = null, disposables) => {\n            // we need this, in case the event fires during the listener call\n            let didFire = false;\n            let result = undefined;\n            result = event(e => {\n                if (didFire) {\n                    return;\n                }\n                else if (result) {\n                    result.dispose();\n                }\n                else {\n                    didFire = true;\n                }\n                return listener.call(thisArgs, e);\n            }, null, disposables);\n            if (didFire) {\n                result.dispose();\n            }\n            return result;\n        };\n    }\n    Event.once = once;\n    /**\n     * Given an event, returns another event which only fires once, and only when the condition is met.\n     *\n     * @param event The event source for the new event.\n     */\n    function onceIf(event, condition) {\n        return Event.once(Event.filter(event, condition));\n    }\n    Event.onceIf = onceIf;\n    /**\n     * Maps an event of one type into an event of another type using a mapping function, similar to how\n     * `Array.prototype.map` works.\n     *\n     * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n     * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n     * returned event causes this utility to leak a listener on the original event.\n     *\n     * @param event The event source for the new event.\n     * @param map The mapping function.\n     * @param disposable A disposable store to add the new EventEmitter to.\n     */\n    function map(event, map, disposable) {\n        return snapshot((listener, thisArgs = null, disposables) => event(i => listener.call(thisArgs, map(i)), null, disposables), disposable);\n    }\n    Event.map = map;\n    /**\n     * Wraps an event in another event that performs some function on the event object before firing.\n     *\n     * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n     * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n     * returned event causes this utility to leak a listener on the original event.\n     *\n     * @param event The event source for the new event.\n     * @param each The function to perform on the event object.\n     * @param disposable A disposable store to add the new EventEmitter to.\n     */\n    function forEach(event, each, disposable) {\n        return snapshot((listener, thisArgs = null, disposables) => event(i => { each(i); listener.call(thisArgs, i); }, null, disposables), disposable);\n    }\n    Event.forEach = forEach;\n    function filter(event, filter, disposable) {\n        return snapshot((listener, thisArgs = null, disposables) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables), disposable);\n    }\n    Event.filter = filter;\n    /**\n     * Given an event, returns the same event but typed as `Event<void>`.\n     */\n    function signal(event) {\n        return event;\n    }\n    Event.signal = signal;\n    function any(...events) {\n        return (listener, thisArgs = null, disposables) => {\n            const disposable = combinedDisposable(...events.map(event => event(e => listener.call(thisArgs, e))));\n            return addAndReturnDisposable(disposable, disposables);\n        };\n    }\n    Event.any = any;\n    /**\n     * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n     * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n     * returned event causes this utility to leak a listener on the original event.\n     */\n    function reduce(event, merge, initial, disposable) {\n        let output = initial;\n        return map(event, e => {\n            output = merge(output, e);\n            return output;\n        }, disposable);\n    }\n    Event.reduce = reduce;\n    function snapshot(event, disposable) {\n        let listener;\n        const options = {\n            onWillAddFirstListener() {\n                listener = event(emitter.fire, emitter);\n            },\n            onDidRemoveLastListener() {\n                listener?.dispose();\n            }\n        };\n        const emitter = new Emitter(options);\n        disposable?.add(emitter);\n        return emitter.event;\n    }\n    /**\n     * Adds the IDisposable to the store if it's set, and returns it. Useful to\n     * Event function implementation.\n     */\n    function addAndReturnDisposable(d, store) {\n        if (store instanceof Array) {\n            store.push(d);\n        }\n        else if (store) {\n            store.add(d);\n        }\n        return d;\n    }\n    function debounce(event, merge, delay = 100, leading = false, flushOnListenerRemove = false, leakWarningThreshold, disposable) {\n        let subscription;\n        let output = undefined;\n        let handle = undefined;\n        let numDebouncedCalls = 0;\n        let doFire;\n        const options = {\n            leakWarningThreshold,\n            onWillAddFirstListener() {\n                subscription = event(cur => {\n                    numDebouncedCalls++;\n                    output = merge(output, cur);\n                    if (leading && !handle) {\n                        emitter.fire(output);\n                        output = undefined;\n                    }\n                    doFire = () => {\n                        const _output = output;\n                        output = undefined;\n                        handle = undefined;\n                        if (!leading || numDebouncedCalls > 1) {\n                            emitter.fire(_output);\n                        }\n                        numDebouncedCalls = 0;\n                    };\n                    if (typeof delay === 'number') {\n                        if (handle) {\n                            clearTimeout(handle);\n                        }\n                        handle = setTimeout(doFire, delay);\n                    }\n                    else {\n                        if (handle === undefined) {\n                            handle = null;\n                            queueMicrotask(doFire);\n                        }\n                    }\n                });\n            },\n            onWillRemoveListener() {\n                if (flushOnListenerRemove && numDebouncedCalls > 0) {\n                    doFire?.();\n                }\n            },\n            onDidRemoveLastListener() {\n                doFire = undefined;\n                subscription.dispose();\n            }\n        };\n        const emitter = new Emitter(options);\n        disposable?.add(emitter);\n        return emitter.event;\n    }\n    Event.debounce = debounce;\n    /**\n     * Debounces an event, firing after some delay (default=0) with an array of all event original objects.\n     *\n     * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n     * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n     * returned event causes this utility to leak a listener on the original event.\n     */\n    function accumulate(event, delay = 0, disposable) {\n        return Event.debounce(event, (last, e) => {\n            if (!last) {\n                return [e];\n            }\n            last.push(e);\n            return last;\n        }, delay, undefined, true, undefined, disposable);\n    }\n    Event.accumulate = accumulate;\n    /**\n     * Filters an event such that some condition is _not_ met more than once in a row, effectively ensuring duplicate\n     * event objects from different sources do not fire the same event object.\n     *\n     * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n     * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n     * returned event causes this utility to leak a listener on the original event.\n     *\n     * @param event The event source for the new event.\n     * @param equals The equality condition.\n     * @param disposable A disposable store to add the new EventEmitter to.\n     *\n     * @example\n     * ```\n     * // Fire only one time when a single window is opened or focused\n     * Event.latch(Event.any(onDidOpenWindow, onDidFocusWindow))\n     * ```\n     */\n    function latch(event, equals = (a, b) => a === b, disposable) {\n        let firstCall = true;\n        let cache;\n        return filter(event, value => {\n            const shouldEmit = firstCall || !equals(value, cache);\n            firstCall = false;\n            cache = value;\n            return shouldEmit;\n        }, disposable);\n    }\n    Event.latch = latch;\n    /**\n     * Splits an event whose parameter is a union type into 2 separate events for each type in the union.\n     *\n     * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n     * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n     * returned event causes this utility to leak a listener on the original event.\n     *\n     * @example\n     * ```\n     * const event = new EventEmitter<number | undefined>().event;\n     * const [numberEvent, undefinedEvent] = Event.split(event, isUndefined);\n     * ```\n     *\n     * @param event The event source for the new event.\n     * @param isT A function that determines what event is of the first type.\n     * @param disposable A disposable store to add the new EventEmitter to.\n     */\n    function split(event, isT, disposable) {\n        return [\n            Event.filter(event, isT, disposable),\n            Event.filter(event, e => !isT(e), disposable),\n        ];\n    }\n    Event.split = split;\n    /**\n     * Buffers an event until it has a listener attached.\n     *\n     * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n     * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n     * returned event causes this utility to leak a listener on the original event.\n     *\n     * @param event The event source for the new event.\n     * @param flushAfterTimeout Determines whether to flush the buffer after a timeout immediately or after a\n     * `setTimeout` when the first event listener is added.\n     * @param _buffer Internal: A source event array used for tests.\n     *\n     * @example\n     * ```\n     * // Start accumulating events, when the first listener is attached, flush\n     * // the event after a timeout such that multiple listeners attached before\n     * // the timeout would receive the event\n     * this.onInstallExtension = Event.buffer(service.onInstallExtension, true);\n     * ```\n     */\n    function buffer(event, flushAfterTimeout = false, _buffer = [], disposable) {\n        let buffer = _buffer.slice();\n        let listener = event(e => {\n            if (buffer) {\n                buffer.push(e);\n            }\n            else {\n                emitter.fire(e);\n            }\n        });\n        if (disposable) {\n            disposable.add(listener);\n        }\n        const flush = () => {\n            buffer?.forEach(e => emitter.fire(e));\n            buffer = null;\n        };\n        const emitter = new Emitter({\n            onWillAddFirstListener() {\n                if (!listener) {\n                    listener = event(e => emitter.fire(e));\n                    if (disposable) {\n                        disposable.add(listener);\n                    }\n                }\n            },\n            onDidAddFirstListener() {\n                if (buffer) {\n                    if (flushAfterTimeout) {\n                        setTimeout(flush);\n                    }\n                    else {\n                        flush();\n                    }\n                }\n            },\n            onDidRemoveLastListener() {\n                if (listener) {\n                    listener.dispose();\n                }\n                listener = null;\n            }\n        });\n        if (disposable) {\n            disposable.add(emitter);\n        }\n        return emitter.event;\n    }\n    Event.buffer = buffer;\n    /**\n     * Wraps the event in an {@link IChainableEvent}, allowing a more functional programming style.\n     *\n     * @example\n     * ```\n     * // Normal\n     * const onEnterPressNormal = Event.filter(\n     *   Event.map(onKeyPress.event, e => new StandardKeyboardEvent(e)),\n     *   e.keyCode === KeyCode.Enter\n     * ).event;\n     *\n     * // Using chain\n     * const onEnterPressChain = Event.chain(onKeyPress.event, $ => $\n     *   .map(e => new StandardKeyboardEvent(e))\n     *   .filter(e => e.keyCode === KeyCode.Enter)\n     * );\n     * ```\n     */\n    function chain(event, sythensize) {\n        const fn = (listener, thisArgs, disposables) => {\n            const cs = sythensize(new ChainableSynthesis());\n            return event(function (value) {\n                const result = cs.evaluate(value);\n                if (result !== HaltChainable) {\n                    listener.call(thisArgs, result);\n                }\n            }, undefined, disposables);\n        };\n        return fn;\n    }\n    Event.chain = chain;\n    const HaltChainable = Symbol('HaltChainable');\n    class ChainableSynthesis {\n        constructor() {\n            this.steps = [];\n        }\n        map(fn) {\n            this.steps.push(fn);\n            return this;\n        }\n        forEach(fn) {\n            this.steps.push(v => {\n                fn(v);\n                return v;\n            });\n            return this;\n        }\n        filter(fn) {\n            this.steps.push(v => fn(v) ? v : HaltChainable);\n            return this;\n        }\n        reduce(merge, initial) {\n            let last = initial;\n            this.steps.push(v => {\n                last = merge(last, v);\n                return last;\n            });\n            return this;\n        }\n        latch(equals = (a, b) => a === b) {\n            let firstCall = true;\n            let cache;\n            this.steps.push(value => {\n                const shouldEmit = firstCall || !equals(value, cache);\n                firstCall = false;\n                cache = value;\n                return shouldEmit ? value : HaltChainable;\n            });\n            return this;\n        }\n        evaluate(value) {\n            for (const step of this.steps) {\n                value = step(value);\n                if (value === HaltChainable) {\n                    break;\n                }\n            }\n            return value;\n        }\n    }\n    /**\n     * Creates an {@link Event} from a node event emitter.\n     */\n    function fromNodeEventEmitter(emitter, eventName, map = id => id) {\n        const fn = (...args) => result.fire(map(...args));\n        const onFirstListenerAdd = () => emitter.on(eventName, fn);\n        const onLastListenerRemove = () => emitter.removeListener(eventName, fn);\n        const result = new Emitter({ onWillAddFirstListener: onFirstListenerAdd, onDidRemoveLastListener: onLastListenerRemove });\n        return result.event;\n    }\n    Event.fromNodeEventEmitter = fromNodeEventEmitter;\n    /**\n     * Creates an {@link Event} from a DOM event emitter.\n     */\n    function fromDOMEventEmitter(emitter, eventName, map = id => id) {\n        const fn = (...args) => result.fire(map(...args));\n        const onFirstListenerAdd = () => emitter.addEventListener(eventName, fn);\n        const onLastListenerRemove = () => emitter.removeEventListener(eventName, fn);\n        const result = new Emitter({ onWillAddFirstListener: onFirstListenerAdd, onDidRemoveLastListener: onLastListenerRemove });\n        return result.event;\n    }\n    Event.fromDOMEventEmitter = fromDOMEventEmitter;\n    /**\n     * Creates a promise out of an event, using the {@link Event.once} helper.\n     */\n    function toPromise(event, disposables) {\n        let cancelRef;\n        const promise = new Promise((resolve, reject) => {\n            const listener = once(event)(resolve, null, disposables);\n            // not resolved, matching the behavior of a normal disposal\n            cancelRef = () => listener.dispose();\n        });\n        promise.cancel = cancelRef;\n        return promise;\n    }\n    Event.toPromise = toPromise;\n    /**\n     * A convenience function for forwarding an event to another emitter which\n     * improves readability.\n     *\n     * This is similar to {@link Relay} but allows instantiating and forwarding\n     * on a single line and also allows for multiple source events.\n     * @param from The event to forward.\n     * @param to The emitter to forward the event to.\n     * @example\n     * Event.forward(event, emitter);\n     * // equivalent to\n     * event(e => emitter.fire(e));\n     * // equivalent to\n     * event(emitter.fire, emitter);\n     */\n    function forward(from, to) {\n        return from(e => to.fire(e));\n    }\n    Event.forward = forward;\n    function runAndSubscribe(event, handler, initial) {\n        handler(initial);\n        return event(e => handler(e));\n    }\n    Event.runAndSubscribe = runAndSubscribe;\n    class EmitterObserver {\n        constructor(_observable, store) {\n            this._observable = _observable;\n            this._counter = 0;\n            this._hasChanged = false;\n            const options = {\n                onWillAddFirstListener: () => {\n                    _observable.addObserver(this);\n                    // Communicate to the observable that we received its current value and would like to be notified about future changes.\n                    this._observable.reportChanges();\n                },\n                onDidRemoveLastListener: () => {\n                    _observable.removeObserver(this);\n                }\n            };\n            this.emitter = new Emitter(options);\n            if (store) {\n                store.add(this.emitter);\n            }\n        }\n        beginUpdate(_observable) {\n            // assert(_observable === this.obs);\n            this._counter++;\n        }\n        handlePossibleChange(_observable) {\n            // assert(_observable === this.obs);\n        }\n        handleChange(_observable, _change) {\n            // assert(_observable === this.obs);\n            this._hasChanged = true;\n        }\n        endUpdate(_observable) {\n            // assert(_observable === this.obs);\n            this._counter--;\n            if (this._counter === 0) {\n                this._observable.reportChanges();\n                if (this._hasChanged) {\n                    this._hasChanged = false;\n                    this.emitter.fire(this._observable.get());\n                }\n            }\n        }\n    }\n    /**\n     * Creates an event emitter that is fired when the observable changes.\n     * Each listeners subscribes to the emitter.\n     */\n    function fromObservable(obs, store) {\n        const observer = new EmitterObserver(obs, store);\n        return observer.emitter.event;\n    }\n    Event.fromObservable = fromObservable;\n    /**\n     * Each listener is attached to the observable directly.\n     */\n    function fromObservableLight(observable) {\n        return (listener, thisArgs, disposables) => {\n            let count = 0;\n            let didChange = false;\n            const observer = {\n                beginUpdate() {\n                    count++;\n                },\n                endUpdate() {\n                    count--;\n                    if (count === 0) {\n                        observable.reportChanges();\n                        if (didChange) {\n                            didChange = false;\n                            listener.call(thisArgs);\n                        }\n                    }\n                },\n                handlePossibleChange() {\n                    // noop\n                },\n                handleChange() {\n                    didChange = true;\n                }\n            };\n            observable.addObserver(observer);\n            observable.reportChanges();\n            const disposable = {\n                dispose() {\n                    observable.removeObserver(observer);\n                }\n            };\n            if (disposables instanceof DisposableStore) {\n                disposables.add(disposable);\n            }\n            else if (Array.isArray(disposables)) {\n                disposables.push(disposable);\n            }\n            return disposable;\n        };\n    }\n    Event.fromObservableLight = fromObservableLight;\n})(Event || (Event = {}));\nclass EventProfiling {\n    static { this.all = new Set(); }\n    static { this._idPool = 0; }\n    constructor(name) {\n        this.listenerCount = 0;\n        this.invocationCount = 0;\n        this.elapsedOverall = 0;\n        this.durations = [];\n        this.name = `${name}_${EventProfiling._idPool++}`;\n        EventProfiling.all.add(this);\n    }\n    start(listenerCount) {\n        this._stopWatch = new StopWatch();\n        this.listenerCount = listenerCount;\n    }\n    stop() {\n        if (this._stopWatch) {\n            const elapsed = this._stopWatch.elapsed();\n            this.durations.push(elapsed);\n            this.elapsedOverall += elapsed;\n            this.invocationCount += 1;\n            this._stopWatch = undefined;\n        }\n    }\n}\nlet _globalLeakWarningThreshold = -1;\nclass LeakageMonitor {\n    static { this._idPool = 1; }\n    constructor(_errorHandler, threshold, name = (LeakageMonitor._idPool++).toString(16).padStart(3, '0')) {\n        this._errorHandler = _errorHandler;\n        this.threshold = threshold;\n        this.name = name;\n        this._warnCountdown = 0;\n    }\n    dispose() {\n        this._stacks?.clear();\n    }\n    check(stack, listenerCount) {\n        const threshold = this.threshold;\n        if (threshold <= 0 || listenerCount < threshold) {\n            return undefined;\n        }\n        if (!this._stacks) {\n            this._stacks = new Map();\n        }\n        const count = (this._stacks.get(stack.value) || 0);\n        this._stacks.set(stack.value, count + 1);\n        this._warnCountdown -= 1;\n        if (this._warnCountdown <= 0) {\n            // only warn on first exceed and then every time the limit\n            // is exceeded by 50% again\n            this._warnCountdown = threshold * 0.5;\n            const [topStack, topCount] = this.getMostFrequentStack();\n            const message = `[${this.name}] potential listener LEAK detected, having ${listenerCount} listeners already. MOST frequent listener (${topCount}):`;\n            console.warn(message);\n            console.warn(topStack);\n            const error = new ListenerLeakError(message, topStack);\n            this._errorHandler(error);\n        }\n        return () => {\n            const count = (this._stacks.get(stack.value) || 0);\n            this._stacks.set(stack.value, count - 1);\n        };\n    }\n    getMostFrequentStack() {\n        if (!this._stacks) {\n            return undefined;\n        }\n        let topStack;\n        let topCount = 0;\n        for (const [stack, count] of this._stacks) {\n            if (!topStack || topCount < count) {\n                topStack = [stack, count];\n                topCount = count;\n            }\n        }\n        return topStack;\n    }\n}\nclass Stacktrace {\n    static create() {\n        const err = new Error();\n        return new Stacktrace(err.stack ?? '');\n    }\n    constructor(value) {\n        this.value = value;\n    }\n    print() {\n        console.warn(this.value.split('\\n').slice(2).join('\\n'));\n    }\n}\n// error that is logged when going over the configured listener threshold\nclass ListenerLeakError extends Error {\n    constructor(message, stack) {\n        super(message);\n        this.name = 'ListenerLeakError';\n        this.stack = stack;\n    }\n}\n// SEVERE error that is logged when having gone way over the configured listener\n// threshold so that the emitter refuses to accept more listeners\nclass ListenerRefusalError extends Error {\n    constructor(message, stack) {\n        super(message);\n        this.name = 'ListenerRefusalError';\n        this.stack = stack;\n    }\n}\nclass UniqueContainer {\n    constructor(value) {\n        this.value = value;\n    }\n}\nconst compactionThreshold = 2;\n/**\n * The Emitter can be used to expose an Event to the public\n * to fire it from the insides.\n * Sample:\n    class Document {\n\n        private readonly _onDidChange = new Emitter<(value:string)=>any>();\n\n        public onDidChange = this._onDidChange.event;\n\n        // getter-style\n        // get onDidChange(): Event<(value:string)=>any> {\n        // \treturn this._onDidChange.event;\n        // }\n\n        private _doIt() {\n            //...\n            this._onDidChange.fire(value);\n        }\n    }\n */\nclass Emitter {\n    constructor(options) {\n        this._size = 0;\n        this._options = options;\n        this._leakageMon = (this._options?.leakWarningThreshold)\n            ? new LeakageMonitor(options?.onListenerError ?? onUnexpectedError, this._options?.leakWarningThreshold ?? _globalLeakWarningThreshold) :\n            undefined;\n        this._perfMon = this._options?._profName ? new EventProfiling(this._options._profName) : undefined;\n        this._deliveryQueue = this._options?.deliveryQueue;\n    }\n    dispose() {\n        if (!this._disposed) {\n            this._disposed = true;\n            // It is bad to have listeners at the time of disposing an emitter, it is worst to have listeners keep the emitter\n            // alive via the reference that's embedded in their disposables. Therefore we loop over all remaining listeners and\n            // unset their subscriptions/disposables. Looping and blaming remaining listeners is done on next tick because the\n            // the following programming pattern is very popular:\n            //\n            // const someModel = this._disposables.add(new ModelObject()); // (1) create and register model\n            // this._disposables.add(someModel.onDidChange(() => { ... }); // (2) subscribe and register model-event listener\n            // ...later...\n            // this._disposables.dispose(); disposes (1) then (2): don't warn after (1) but after the \"overall dispose\" is done\n            if (this._deliveryQueue?.current === this) {\n                this._deliveryQueue.reset();\n            }\n            if (this._listeners) {\n                this._listeners = undefined;\n                this._size = 0;\n            }\n            this._options?.onDidRemoveLastListener?.();\n            this._leakageMon?.dispose();\n        }\n    }\n    /**\n     * For the public to allow to subscribe\n     * to events from this Emitter\n     */\n    get event() {\n        this._event ??= (callback, thisArgs, disposables) => {\n            if (this._leakageMon && this._size > this._leakageMon.threshold ** 2) {\n                const message = `[${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (${this._size} vs ${this._leakageMon.threshold})`;\n                console.warn(message);\n                const tuple = this._leakageMon.getMostFrequentStack() ?? ['UNKNOWN stack', -1];\n                const error = new ListenerRefusalError(`${message}. HINT: Stack shows most frequent listener (${tuple[1]}-times)`, tuple[0]);\n                const errorHandler = this._options?.onListenerError || onUnexpectedError;\n                errorHandler(error);\n                return Disposable.None;\n            }\n            if (this._disposed) {\n                // todo: should we warn if a listener is added to a disposed emitter? This happens often\n                return Disposable.None;\n            }\n            if (thisArgs) {\n                callback = callback.bind(thisArgs);\n            }\n            const contained = new UniqueContainer(callback);\n            let removeMonitor;\n            if (this._leakageMon && this._size >= Math.ceil(this._leakageMon.threshold * 0.2)) {\n                // check and record this emitter for potential leakage\n                contained.stack = Stacktrace.create();\n                removeMonitor = this._leakageMon.check(contained.stack, this._size + 1);\n            }\n            if (!this._listeners) {\n                this._options?.onWillAddFirstListener?.(this);\n                this._listeners = contained;\n                this._options?.onDidAddFirstListener?.(this);\n            }\n            else if (this._listeners instanceof UniqueContainer) {\n                this._deliveryQueue ??= new EventDeliveryQueuePrivate();\n                this._listeners = [this._listeners, contained];\n            }\n            else {\n                this._listeners.push(contained);\n            }\n            this._options?.onDidAddListener?.(this);\n            this._size++;\n            const result = toDisposable(() => {\n                removeMonitor?.();\n                this._removeListener(contained);\n            });\n            if (disposables instanceof DisposableStore) {\n                disposables.add(result);\n            }\n            else if (Array.isArray(disposables)) {\n                disposables.push(result);\n            }\n            return result;\n        };\n        return this._event;\n    }\n    _removeListener(listener) {\n        this._options?.onWillRemoveListener?.(this);\n        if (!this._listeners) {\n            return; // expected if a listener gets disposed\n        }\n        if (this._size === 1) {\n            this._listeners = undefined;\n            this._options?.onDidRemoveLastListener?.(this);\n            this._size = 0;\n            return;\n        }\n        // size > 1 which requires that listeners be a list:\n        const listeners = this._listeners;\n        const index = listeners.indexOf(listener);\n        if (index === -1) {\n            console.log('disposed?', this._disposed);\n            console.log('size?', this._size);\n            console.log('arr?', JSON.stringify(this._listeners));\n            throw new Error('Attempted to dispose unknown listener');\n        }\n        this._size--;\n        listeners[index] = undefined;\n        const adjustDeliveryQueue = this._deliveryQueue.current === this;\n        if (this._size * compactionThreshold <= listeners.length) {\n            let n = 0;\n            for (let i = 0; i < listeners.length; i++) {\n                if (listeners[i]) {\n                    listeners[n++] = listeners[i];\n                }\n                else if (adjustDeliveryQueue && n < this._deliveryQueue.end) {\n                    this._deliveryQueue.end--;\n                    if (n < this._deliveryQueue.i) {\n                        this._deliveryQueue.i--;\n                    }\n                }\n            }\n            listeners.length = n;\n        }\n    }\n    _deliver(listener, value) {\n        if (!listener) {\n            return;\n        }\n        const errorHandler = this._options?.onListenerError || onUnexpectedError;\n        if (!errorHandler) {\n            listener.value(value);\n            return;\n        }\n        try {\n            listener.value(value);\n        }\n        catch (e) {\n            errorHandler(e);\n        }\n    }\n    /** Delivers items in the queue. Assumes the queue is ready to go. */\n    _deliverQueue(dq) {\n        const listeners = dq.current._listeners;\n        while (dq.i < dq.end) {\n            // important: dq.i is incremented before calling deliver() because it might reenter deliverQueue()\n            this._deliver(listeners[dq.i++], dq.value);\n        }\n        dq.reset();\n    }\n    /**\n     * To be kept private to fire an event to\n     * subscribers\n     */\n    fire(event) {\n        if (this._deliveryQueue?.current) {\n            this._deliverQueue(this._deliveryQueue);\n            this._perfMon?.stop(); // last fire() will have starting perfmon, stop it before starting the next dispatch\n        }\n        this._perfMon?.start(this._size);\n        if (!this._listeners) ;\n        else if (this._listeners instanceof UniqueContainer) {\n            this._deliver(this._listeners, event);\n        }\n        else {\n            const dq = this._deliveryQueue;\n            dq.enqueue(this, event, this._listeners.length);\n            this._deliverQueue(dq);\n        }\n        this._perfMon?.stop();\n    }\n    hasListeners() {\n        return this._size > 0;\n    }\n}\nconst createEventDeliveryQueue = () => new EventDeliveryQueuePrivate();\nclass EventDeliveryQueuePrivate {\n    constructor() {\n        /**\n         * Index in current's listener list.\n         */\n        this.i = -1;\n        /**\n         * The last index in the listener's list to deliver.\n         */\n        this.end = 0;\n    }\n    enqueue(emitter, value, end) {\n        this.i = 0;\n        this.end = end;\n        this.current = emitter;\n        this.value = value;\n    }\n    reset() {\n        this.i = this.end; // force any current emission loop to stop, mainly for during dispose\n        this.current = undefined;\n        this.value = undefined;\n    }\n}\nclass PauseableEmitter extends Emitter {\n    constructor(options) {\n        super(options);\n        this._isPaused = 0;\n        this._eventQueue = new LinkedList();\n        this._mergeFn = options?.merge;\n    }\n    pause() {\n        this._isPaused++;\n    }\n    resume() {\n        if (this._isPaused !== 0 && --this._isPaused === 0) {\n            if (this._mergeFn) {\n                // use the merge function to create a single composite\n                // event. make a copy in case firing pauses this emitter\n                if (this._eventQueue.size > 0) {\n                    const events = Array.from(this._eventQueue);\n                    this._eventQueue.clear();\n                    super.fire(this._mergeFn(events));\n                }\n            }\n            else {\n                // no merging, fire each event individually and test\n                // that this emitter isn't paused halfway through\n                while (!this._isPaused && this._eventQueue.size !== 0) {\n                    super.fire(this._eventQueue.shift());\n                }\n            }\n        }\n    }\n    fire(event) {\n        if (this._size) {\n            if (this._isPaused !== 0) {\n                this._eventQueue.push(event);\n            }\n            else {\n                super.fire(event);\n            }\n        }\n    }\n}\nclass DebounceEmitter extends PauseableEmitter {\n    constructor(options) {\n        super(options);\n        this._delay = options.delay ?? 100;\n    }\n    fire(event) {\n        if (!this._handle) {\n            this.pause();\n            this._handle = setTimeout(() => {\n                this._handle = undefined;\n                this.resume();\n            }, this._delay);\n        }\n        super.fire(event);\n    }\n}\n/**\n * An emitter which queue all events and then process them at the\n * end of the event loop.\n */\nclass MicrotaskEmitter extends Emitter {\n    constructor(options) {\n        super(options);\n        this._queuedEvents = [];\n        this._mergeFn = options?.merge;\n    }\n    fire(event) {\n        if (!this.hasListeners()) {\n            return;\n        }\n        this._queuedEvents.push(event);\n        if (this._queuedEvents.length === 1) {\n            queueMicrotask(() => {\n                if (this._mergeFn) {\n                    super.fire(this._mergeFn(this._queuedEvents));\n                }\n                else {\n                    this._queuedEvents.forEach(e => super.fire(e));\n                }\n                this._queuedEvents = [];\n            });\n        }\n    }\n}\n/**\n * An event emitter that multiplexes many events into a single event.\n *\n * @example Listen to the `onData` event of all `Thing`s, dynamically adding and removing `Thing`s\n * to the multiplexer as needed.\n *\n * ```typescript\n * const anythingDataMultiplexer = new EventMultiplexer<{ data: string }>();\n *\n * const thingListeners = DisposableMap<Thing, IDisposable>();\n *\n * thingService.onDidAddThing(thing => {\n *   thingListeners.set(thing, anythingDataMultiplexer.add(thing.onData);\n * });\n * thingService.onDidRemoveThing(thing => {\n *   thingListeners.deleteAndDispose(thing);\n * });\n *\n * anythingDataMultiplexer.event(e => {\n *   console.log('Something fired data ' + e.data)\n * });\n * ```\n */\nclass EventMultiplexer {\n    constructor() {\n        this.hasListeners = false;\n        this.events = [];\n        this.emitter = new Emitter({\n            onWillAddFirstListener: () => this.onFirstListenerAdd(),\n            onDidRemoveLastListener: () => this.onLastListenerRemove()\n        });\n    }\n    get event() {\n        return this.emitter.event;\n    }\n    add(event) {\n        const e = { event: event, listener: null };\n        this.events.push(e);\n        if (this.hasListeners) {\n            this.hook(e);\n        }\n        const dispose = () => {\n            if (this.hasListeners) {\n                this.unhook(e);\n            }\n            const idx = this.events.indexOf(e);\n            this.events.splice(idx, 1);\n        };\n        return toDisposable(createSingleCallFunction(dispose));\n    }\n    onFirstListenerAdd() {\n        this.hasListeners = true;\n        this.events.forEach(e => this.hook(e));\n    }\n    onLastListenerRemove() {\n        this.hasListeners = false;\n        this.events.forEach(e => this.unhook(e));\n    }\n    hook(e) {\n        e.listener = e.event(r => this.emitter.fire(r));\n    }\n    unhook(e) {\n        e.listener?.dispose();\n        e.listener = null;\n    }\n    dispose() {\n        this.emitter.dispose();\n        for (const e of this.events) {\n            e.listener?.dispose();\n        }\n        this.events = [];\n    }\n}\n/**\n * The EventBufferer is useful in situations in which you want\n * to delay firing your events during some code.\n * You can wrap that code and be sure that the event will not\n * be fired during that wrap.\n *\n * ```\n * const emitter: Emitter;\n * const delayer = new EventDelayer();\n * const delayedEvent = delayer.wrapEvent(emitter.event);\n *\n * delayedEvent(console.log);\n *\n * delayer.bufferEvents(() => {\n *   emitter.fire(); // event will not be fired yet\n * });\n *\n * // event will only be fired at this point\n * ```\n */\nclass EventBufferer {\n    constructor() {\n        this.data = [];\n    }\n    wrapEvent(event, reduce, initial) {\n        return (listener, thisArgs, disposables) => {\n            return event(i => {\n                const data = this.data[this.data.length - 1];\n                // Non-reduce scenario\n                if (!reduce) {\n                    // Buffering case\n                    if (data) {\n                        data.buffers.push(() => listener.call(thisArgs, i));\n                    }\n                    else {\n                        // Not buffering case\n                        listener.call(thisArgs, i);\n                    }\n                    return;\n                }\n                // Reduce scenario\n                const reduceData = data;\n                // Not buffering case\n                if (!reduceData) {\n                    // TODO: Is there a way to cache this reduce call for all listeners?\n                    listener.call(thisArgs, reduce(initial, i));\n                    return;\n                }\n                // Buffering case\n                reduceData.items ??= [];\n                reduceData.items.push(i);\n                if (reduceData.buffers.length === 0) {\n                    // Include a single buffered function that will reduce all events when we're done buffering events\n                    data.buffers.push(() => {\n                        // cache the reduced result so that the value can be shared across all listeners\n                        reduceData.reducedResult ??= initial\n                            ? reduceData.items.reduce(reduce, initial)\n                            : reduceData.items.reduce(reduce);\n                        listener.call(thisArgs, reduceData.reducedResult);\n                    });\n                }\n            }, undefined, disposables);\n        };\n    }\n    bufferEvents(fn) {\n        const data = { buffers: new Array() };\n        this.data.push(data);\n        const r = fn();\n        this.data.pop();\n        data.buffers.forEach(flush => flush());\n        return r;\n    }\n}\n/**\n * A Relay is an event forwarder which functions as a replugabble event pipe.\n * Once created, you can connect an input event to it and it will simply forward\n * events from that input event through its own `event` property. The `input`\n * can be changed at any point in time.\n */\nclass Relay {\n    constructor() {\n        this.listening = false;\n        this.inputEvent = Event.None;\n        this.inputEventListener = Disposable.None;\n        this.emitter = new Emitter({\n            onDidAddFirstListener: () => {\n                this.listening = true;\n                this.inputEventListener = this.inputEvent(this.emitter.fire, this.emitter);\n            },\n            onDidRemoveLastListener: () => {\n                this.listening = false;\n                this.inputEventListener.dispose();\n            }\n        });\n        this.event = this.emitter.event;\n    }\n    set input(event) {\n        this.inputEvent = event;\n        if (this.listening) {\n            this.inputEventListener.dispose();\n            this.inputEventListener = event(this.emitter.fire, this.emitter);\n        }\n    }\n    dispose() {\n        this.inputEventListener.dispose();\n        this.emitter.dispose();\n    }\n}\n\nexport { DebounceEmitter, Emitter, Event, EventBufferer, EventMultiplexer, EventProfiling, ListenerLeakError, ListenerRefusalError, MicrotaskEmitter, PauseableEmitter, Relay, createEventDeliveryQueue };\n","import { Event, Emitter } from './event.js';\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 *--------------------------------------------------------------------------------------------*/\nconst shortcutEvent = Object.freeze(function (callback, context) {\n    const handle = setTimeout(callback.bind(context), 0);\n    return { dispose() { clearTimeout(handle); } };\n});\nvar CancellationToken;\n(function (CancellationToken) {\n    function isCancellationToken(thing) {\n        if (thing === CancellationToken.None || thing === CancellationToken.Cancelled) {\n            return true;\n        }\n        if (thing instanceof MutableToken) {\n            return true;\n        }\n        if (!thing || typeof thing !== 'object') {\n            return false;\n        }\n        return typeof thing.isCancellationRequested === 'boolean'\n            && typeof thing.onCancellationRequested === 'function';\n    }\n    CancellationToken.isCancellationToken = isCancellationToken;\n    CancellationToken.None = Object.freeze({\n        isCancellationRequested: false,\n        onCancellationRequested: Event.None\n    });\n    CancellationToken.Cancelled = Object.freeze({\n        isCancellationRequested: true,\n        onCancellationRequested: shortcutEvent\n    });\n})(CancellationToken || (CancellationToken = {}));\nclass MutableToken {\n    constructor() {\n        this._isCancelled = false;\n        this._emitter = null;\n    }\n    cancel() {\n        if (!this._isCancelled) {\n            this._isCancelled = true;\n            if (this._emitter) {\n                this._emitter.fire(undefined);\n                this.dispose();\n            }\n        }\n    }\n    get isCancellationRequested() {\n        return this._isCancelled;\n    }\n    get onCancellationRequested() {\n        if (this._isCancelled) {\n            return shortcutEvent;\n        }\n        if (!this._emitter) {\n            this._emitter = new Emitter();\n        }\n        return this._emitter.event;\n    }\n    dispose() {\n        if (this._emitter) {\n            this._emitter.dispose();\n            this._emitter = null;\n        }\n    }\n}\nclass CancellationTokenSource {\n    constructor(parent) {\n        this._token = undefined;\n        this._parentListener = undefined;\n        this._parentListener = parent && parent.onCancellationRequested(this.cancel, this);\n    }\n    get token() {\n        if (!this._token) {\n            // be lazy and create the token only when\n            // actually needed\n            this._token = new MutableToken();\n        }\n        return this._token;\n    }\n    cancel() {\n        if (!this._token) {\n            // save an object by returning the default\n            // cancelled token when cancellation happens\n            // before someone asks for the token\n            this._token = CancellationToken.Cancelled;\n        }\n        else if (this._token instanceof MutableToken) {\n            // actually cancel\n            this._token.cancel();\n        }\n    }\n    dispose(cancel = false) {\n        if (cancel) {\n            this.cancel();\n        }\n        this._parentListener?.dispose();\n        if (!this._token) {\n            // ensure to initialize with an empty token if we had none\n            this._token = CancellationToken.None;\n        }\n        else if (this._token instanceof MutableToken) {\n            // actually dispose\n            this._token.dispose();\n        }\n    }\n}\nfunction cancelOnDispose(store) {\n    const source = new CancellationTokenSource();\n    store.add({ dispose() { source.cancel(); } });\n    return source.token;\n}\n\nexport { CancellationToken, CancellationTokenSource, cancelOnDispose };\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/**\n * Can be passed into the Delayed to defer using a microtask\n * */\nconst MicrotaskDelay = Symbol('MicrotaskDelay');\n\nexport { MicrotaskDelay };\n","import { CancellationTokenSource } from './cancellation.js';\nimport { BugIndicatingError, CancellationError } from './errors.js';\nimport { toDisposable, isDisposable } from './lifecycle.js';\nimport { setTimeout0 } from './platform.js';\nimport { MicrotaskDelay } from './symbols.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction isThenable(obj) {\n    return !!obj && typeof obj.then === 'function';\n}\n/**\n * Returns a promise that can be cancelled using the provided cancellation token.\n *\n * @remarks When cancellation is requested, the promise will be rejected with a {@link CancellationError}.\n * If the promise resolves to a disposable object, it will be automatically disposed when cancellation\n * is requested.\n *\n * @param callback A function that accepts a cancellation token and returns a promise\n * @returns A promise that can be cancelled\n */\nfunction createCancelablePromise(callback) {\n    const source = new CancellationTokenSource();\n    const thenable = callback(source.token);\n    let isCancelled = false;\n    const promise = new Promise((resolve, reject) => {\n        const subscription = source.token.onCancellationRequested(() => {\n            isCancelled = true;\n            subscription.dispose();\n            reject(new CancellationError());\n        });\n        Promise.resolve(thenable).then(value => {\n            subscription.dispose();\n            source.dispose();\n            if (!isCancelled) {\n                resolve(value);\n            }\n            else if (isDisposable(value)) {\n                // promise has been cancelled, result is disposable and will\n                // be cleaned up\n                value.dispose();\n            }\n        }, err => {\n            subscription.dispose();\n            source.dispose();\n            reject(err);\n        });\n    });\n    return new class {\n        cancel() {\n            source.cancel();\n            source.dispose();\n        }\n        then(resolve, reject) {\n            return promise.then(resolve, reject);\n        }\n        catch(reject) {\n            return this.then(undefined, reject);\n        }\n        finally(onfinally) {\n            return promise.finally(onfinally);\n        }\n    };\n}\nfunction raceCancellation(promise, token, defaultValue) {\n    return new Promise((resolve, reject) => {\n        const ref = token.onCancellationRequested(() => {\n            ref.dispose();\n            resolve(defaultValue);\n        });\n        promise.then(resolve, reject).finally(() => ref.dispose());\n    });\n}\n/**\n * Returns a promise that rejects with an {@CancellationError} as soon as the passed token is cancelled.\n * @see {@link raceCancellation}\n */\nfunction raceCancellationError(promise, token) {\n    return new Promise((resolve, reject) => {\n        const ref = token.onCancellationRequested(() => {\n            ref.dispose();\n            reject(new CancellationError());\n        });\n        promise.then(resolve, reject).finally(() => ref.dispose());\n    });\n}\n/**\n * A helper to prevent accumulation of sequential async tasks.\n *\n * Imagine a mail man with the sole task of delivering letters. As soon as\n * a letter submitted for delivery, he drives to the destination, delivers it\n * and returns to his base. Imagine that during the trip, N more letters were submitted.\n * When the mail man returns, he picks those N letters and delivers them all in a\n * single trip. Even though N+1 submissions occurred, only 2 deliveries were made.\n *\n * The throttler implements this via the queue() method, by providing it a task\n * factory. Following the example:\n *\n * \t\tconst throttler = new Throttler();\n * \t\tconst letters = [];\n *\n * \t\tfunction deliver() {\n * \t\t\tconst lettersToDeliver = letters;\n * \t\t\tletters = [];\n * \t\t\treturn makeTheTrip(lettersToDeliver);\n * \t\t}\n *\n * \t\tfunction onLetterReceived(l) {\n * \t\t\tletters.push(l);\n * \t\t\tthrottler.queue(deliver);\n * \t\t}\n */\nclass Throttler {\n    constructor() {\n        this.activePromise = null;\n        this.queuedPromise = null;\n        this.queuedPromiseFactory = null;\n        this.cancellationTokenSource = new CancellationTokenSource();\n    }\n    queue(promiseFactory) {\n        if (this.cancellationTokenSource.token.isCancellationRequested) {\n            return Promise.reject(new Error('Throttler is disposed'));\n        }\n        if (this.activePromise) {\n            this.queuedPromiseFactory = promiseFactory;\n            if (!this.queuedPromise) {\n                const onComplete = () => {\n                    this.queuedPromise = null;\n                    if (this.cancellationTokenSource.token.isCancellationRequested) {\n                        return;\n                    }\n                    const result = this.queue(this.queuedPromiseFactory);\n                    this.queuedPromiseFactory = null;\n                    return result;\n                };\n                this.queuedPromise = new Promise(resolve => {\n                    this.activePromise.then(onComplete, onComplete).then(resolve);\n                });\n            }\n            return new Promise((resolve, reject) => {\n                this.queuedPromise.then(resolve, reject);\n            });\n        }\n        this.activePromise = promiseFactory(this.cancellationTokenSource.token);\n        return new Promise((resolve, reject) => {\n            this.activePromise.then((result) => {\n                this.activePromise = null;\n                resolve(result);\n            }, (err) => {\n                this.activePromise = null;\n                reject(err);\n            });\n        });\n    }\n    dispose() {\n        this.cancellationTokenSource.cancel();\n    }\n}\nconst timeoutDeferred = (timeout, fn) => {\n    let scheduled = true;\n    const handle = setTimeout(() => {\n        scheduled = false;\n        fn();\n    }, timeout);\n    return {\n        isTriggered: () => scheduled,\n        dispose: () => {\n            clearTimeout(handle);\n            scheduled = false;\n        },\n    };\n};\nconst microtaskDeferred = (fn) => {\n    let scheduled = true;\n    queueMicrotask(() => {\n        if (scheduled) {\n            scheduled = false;\n            fn();\n        }\n    });\n    return {\n        isTriggered: () => scheduled,\n        dispose: () => { scheduled = false; },\n    };\n};\n/**\n * A helper to delay (debounce) execution of a task that is being requested often.\n *\n * Following the throttler, now imagine the mail man wants to optimize the number of\n * trips proactively. The trip itself can be long, so he decides not to make the trip\n * as soon as a letter is submitted. Instead he waits a while, in case more\n * letters are submitted. After said waiting period, if no letters were submitted, he\n * decides to make the trip. Imagine that N more letters were submitted after the first\n * one, all within a short period of time between each other. Even though N+1\n * submissions occurred, only 1 delivery was made.\n *\n * The delayer offers this behavior via the trigger() method, into which both the task\n * to be executed and the waiting period (delay) must be passed in as arguments. Following\n * the example:\n *\n * \t\tconst delayer = new Delayer(WAITING_PERIOD);\n * \t\tconst letters = [];\n *\n * \t\tfunction letterReceived(l) {\n * \t\t\tletters.push(l);\n * \t\t\tdelayer.trigger(() => { return makeTheTrip(); });\n * \t\t}\n */\nclass Delayer {\n    constructor(defaultDelay) {\n        this.defaultDelay = defaultDelay;\n        this.deferred = null;\n        this.completionPromise = null;\n        this.doResolve = null;\n        this.doReject = null;\n        this.task = null;\n    }\n    trigger(task, delay = this.defaultDelay) {\n        this.task = task;\n        this.cancelTimeout();\n        if (!this.completionPromise) {\n            this.completionPromise = new Promise((resolve, reject) => {\n                this.doResolve = resolve;\n                this.doReject = reject;\n            }).then(() => {\n                this.completionPromise = null;\n                this.doResolve = null;\n                if (this.task) {\n                    const task = this.task;\n                    this.task = null;\n                    return task();\n                }\n                return undefined;\n            });\n        }\n        const fn = () => {\n            this.deferred = null;\n            this.doResolve?.(null);\n        };\n        this.deferred = delay === MicrotaskDelay ? microtaskDeferred(fn) : timeoutDeferred(delay, fn);\n        return this.completionPromise;\n    }\n    isTriggered() {\n        return !!this.deferred?.isTriggered();\n    }\n    cancel() {\n        this.cancelTimeout();\n        if (this.completionPromise) {\n            this.doReject?.(new CancellationError());\n            this.completionPromise = null;\n        }\n    }\n    cancelTimeout() {\n        this.deferred?.dispose();\n        this.deferred = null;\n    }\n    dispose() {\n        this.cancel();\n    }\n}\n/**\n * A helper to delay execution of a task that is being requested often, while\n * preventing accumulation of consecutive executions, while the task runs.\n *\n * The mail man is clever and waits for a certain amount of time, before going\n * out to deliver letters. While the mail man is going out, more letters arrive\n * and can only be delivered once he is back. Once he is back the mail man will\n * do one more trip to deliver the letters that have accumulated while he was out.\n */\nclass ThrottledDelayer {\n    constructor(defaultDelay) {\n        this.delayer = new Delayer(defaultDelay);\n        this.throttler = new Throttler();\n    }\n    trigger(promiseFactory, delay) {\n        return this.delayer.trigger(() => this.throttler.queue(promiseFactory), delay);\n    }\n    cancel() {\n        this.delayer.cancel();\n    }\n    dispose() {\n        this.delayer.dispose();\n        this.throttler.dispose();\n    }\n}\nfunction timeout(millis, token) {\n    if (!token) {\n        return createCancelablePromise(token => timeout(millis, token));\n    }\n    return new Promise((resolve, reject) => {\n        const handle = setTimeout(() => {\n            disposable.dispose();\n            resolve();\n        }, millis);\n        const disposable = token.onCancellationRequested(() => {\n            clearTimeout(handle);\n            disposable.dispose();\n            reject(new CancellationError());\n        });\n    });\n}\n/**\n * Creates a timeout that can be disposed using its returned value.\n * @param handler The timeout handler.\n * @param timeout An optional timeout in milliseconds.\n * @param store An optional {@link DisposableStore} that will have the timeout disposable managed automatically.\n *\n * @example\n * const store = new DisposableStore;\n * // Call the timeout after 1000ms at which point it will be automatically\n * // evicted from the store.\n * const timeoutDisposable = disposableTimeout(() => {}, 1000, store);\n *\n * if (foo) {\n *   // Cancel the timeout and evict it from store.\n *   timeoutDisposable.dispose();\n * }\n */\nfunction disposableTimeout(handler, timeout = 0, store) {\n    const timer = setTimeout(() => {\n        handler();\n        if (store) {\n            disposable.dispose();\n        }\n    }, timeout);\n    const disposable = toDisposable(() => {\n        clearTimeout(timer);\n        store?.delete(disposable);\n    });\n    store?.add(disposable);\n    return disposable;\n}\nfunction first(promiseFactories, shouldStop = t => !!t, defaultValue = null) {\n    let index = 0;\n    const len = promiseFactories.length;\n    const loop = () => {\n        if (index >= len) {\n            return Promise.resolve(defaultValue);\n        }\n        const factory = promiseFactories[index++];\n        const promise = Promise.resolve(factory());\n        return promise.then(result => {\n            if (shouldStop(result)) {\n                return Promise.resolve(result);\n            }\n            return loop();\n        });\n    };\n    return loop();\n}\n/**\n * Processes tasks in the order they were scheduled.\n*/\nclass TaskQueue {\n    constructor() {\n        this._runningTask = undefined;\n        this._pendingTasks = [];\n    }\n    /**\n     * Waits for the current and pending tasks to finish, then runs and awaits the given task.\n     * If the task is skipped because of clearPending, the promise is rejected with a CancellationError.\n    */\n    schedule(task) {\n        const deferred = new DeferredPromise();\n        this._pendingTasks.push({ task, deferred, setUndefinedWhenCleared: false });\n        this._runIfNotRunning();\n        return deferred.p;\n    }\n    _runIfNotRunning() {\n        if (this._runningTask === undefined) {\n            this._processQueue();\n        }\n    }\n    async _processQueue() {\n        if (this._pendingTasks.length === 0) {\n            return;\n        }\n        const next = this._pendingTasks.shift();\n        if (!next) {\n            return;\n        }\n        if (this._runningTask) {\n            throw new BugIndicatingError();\n        }\n        this._runningTask = next.task;\n        try {\n            const result = await next.task();\n            next.deferred.complete(result);\n        }\n        catch (e) {\n            next.deferred.error(e);\n        }\n        finally {\n            this._runningTask = undefined;\n            this._processQueue();\n        }\n    }\n    /**\n     * Clears all pending tasks. Does not cancel the currently running task.\n    */\n    clearPending() {\n        const tasks = this._pendingTasks;\n        this._pendingTasks = [];\n        for (const task of tasks) {\n            if (task.setUndefinedWhenCleared) {\n                task.deferred.complete(undefined);\n            }\n            else {\n                task.deferred.error(new CancellationError());\n            }\n        }\n    }\n}\nclass TimeoutTimer {\n    constructor(runner, timeout) {\n        this._isDisposed = false;\n        this._token = undefined;\n        if (typeof runner === 'function' && typeof timeout === 'number') {\n            this.setIfNotSet(runner, timeout);\n        }\n    }\n    dispose() {\n        this.cancel();\n        this._isDisposed = true;\n    }\n    cancel() {\n        if (this._token !== undefined) {\n            clearTimeout(this._token);\n            this._token = undefined;\n        }\n    }\n    cancelAndSet(runner, timeout) {\n        if (this._isDisposed) {\n            throw new BugIndicatingError(`Calling 'cancelAndSet' on a disposed TimeoutTimer`);\n        }\n        this.cancel();\n        this._token = setTimeout(() => {\n            this._token = undefined;\n            runner();\n        }, timeout);\n    }\n    setIfNotSet(runner, timeout) {\n        if (this._isDisposed) {\n            throw new BugIndicatingError(`Calling 'setIfNotSet' on a disposed TimeoutTimer`);\n        }\n        if (this._token !== undefined) {\n            // timer is already set\n            return;\n        }\n        this._token = setTimeout(() => {\n            this._token = undefined;\n            runner();\n        }, timeout);\n    }\n}\nclass IntervalTimer {\n    constructor() {\n        this.disposable = undefined;\n        this.isDisposed = false;\n    }\n    cancel() {\n        this.disposable?.dispose();\n        this.disposable = undefined;\n    }\n    cancelAndSet(runner, interval, context = globalThis) {\n        if (this.isDisposed) {\n            throw new BugIndicatingError(`Calling 'cancelAndSet' on a disposed IntervalTimer`);\n        }\n        this.cancel();\n        const handle = context.setInterval(() => {\n            runner();\n        }, interval);\n        this.disposable = toDisposable(() => {\n            context.clearInterval(handle);\n            this.disposable = undefined;\n        });\n    }\n    dispose() {\n        this.cancel();\n        this.isDisposed = true;\n    }\n}\nclass RunOnceScheduler {\n    constructor(runner, delay) {\n        this.timeoutToken = undefined;\n        this.runner = runner;\n        this.timeout = delay;\n        this.timeoutHandler = this.onTimeout.bind(this);\n    }\n    /**\n     * Dispose RunOnceScheduler\n     */\n    dispose() {\n        this.cancel();\n        this.runner = null;\n    }\n    /**\n     * Cancel current scheduled runner (if any).\n     */\n    cancel() {\n        if (this.isScheduled()) {\n            clearTimeout(this.timeoutToken);\n            this.timeoutToken = undefined;\n        }\n    }\n    /**\n     * Cancel previous runner (if any) & schedule a new runner.\n     */\n    schedule(delay = this.timeout) {\n        this.cancel();\n        this.timeoutToken = setTimeout(this.timeoutHandler, delay);\n    }\n    get delay() {\n        return this.timeout;\n    }\n    set delay(value) {\n        this.timeout = value;\n    }\n    /**\n     * Returns true if scheduled.\n     */\n    isScheduled() {\n        return this.timeoutToken !== undefined;\n    }\n    onTimeout() {\n        this.timeoutToken = undefined;\n        if (this.runner) {\n            this.doRun();\n        }\n    }\n    doRun() {\n        this.runner?.();\n    }\n}\n/**\n * Execute the callback the next time the browser is idle, returning an\n * {@link IDisposable} that will cancel the callback when disposed. This wraps\n * [requestIdleCallback] so it will fallback to [setTimeout] if the environment\n * doesn't support it.\n *\n * @param callback The callback to run when idle, this includes an\n * [IdleDeadline] that provides the time alloted for the idle callback by the\n * browser. Not respecting this deadline will result in a degraded user\n * experience.\n * @param timeout A timeout at which point to queue no longer wait for an idle\n * callback but queue it on the regular event loop (like setTimeout). Typically\n * this should not be used.\n *\n * [IdleDeadline]: https://developer.mozilla.org/en-US/docs/Web/API/IdleDeadline\n * [requestIdleCallback]: https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback\n * [setTimeout]: https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout\n *\n * **Note** that there is `dom.ts#runWhenWindowIdle` which is better suited when running inside a browser\n * context\n */\nlet runWhenGlobalIdle;\nlet _runWhenIdle;\n(function () {\n    const safeGlobal = globalThis;\n    if (typeof safeGlobal.requestIdleCallback !== 'function' || typeof safeGlobal.cancelIdleCallback !== 'function') {\n        _runWhenIdle = (_targetWindow, runner, timeout) => {\n            setTimeout0(() => {\n                if (disposed) {\n                    return;\n                }\n                const end = Date.now() + 15; // one frame at 64fps\n                const deadline = {\n                    didTimeout: true,\n                    timeRemaining() {\n                        return Math.max(0, end - Date.now());\n                    }\n                };\n                runner(Object.freeze(deadline));\n            });\n            let disposed = false;\n            return {\n                dispose() {\n                    if (disposed) {\n                        return;\n                    }\n                    disposed = true;\n                }\n            };\n        };\n    }\n    else {\n        _runWhenIdle = (targetWindow, runner, timeout) => {\n            const handle = targetWindow.requestIdleCallback(runner, typeof timeout === 'number' ? { timeout } : undefined);\n            let disposed = false;\n            return {\n                dispose() {\n                    if (disposed) {\n                        return;\n                    }\n                    disposed = true;\n                    targetWindow.cancelIdleCallback(handle);\n                }\n            };\n        };\n    }\n    runWhenGlobalIdle = (runner, timeout) => _runWhenIdle(globalThis, runner, timeout);\n})();\nclass AbstractIdleValue {\n    constructor(targetWindow, executor) {\n        this._didRun = false;\n        this._executor = () => {\n            try {\n                this._value = executor();\n            }\n            catch (err) {\n                this._error = err;\n            }\n            finally {\n                this._didRun = true;\n            }\n        };\n        this._handle = _runWhenIdle(targetWindow, () => this._executor());\n    }\n    dispose() {\n        this._handle.dispose();\n    }\n    get value() {\n        if (!this._didRun) {\n            this._handle.dispose();\n            this._executor();\n        }\n        if (this._error) {\n            throw this._error;\n        }\n        return this._value;\n    }\n    get isInitialized() {\n        return this._didRun;\n    }\n}\n/**\n * An `IdleValue` that always uses the current window (which might be throttled or inactive)\n *\n * **Note** that there is `dom.ts#WindowIdleValue` which is better suited when running inside a browser\n * context\n */\nclass GlobalIdleValue extends AbstractIdleValue {\n    constructor(executor) {\n        super(globalThis, executor);\n    }\n}\n/**\n * Creates a promise whose resolution or rejection can be controlled imperatively.\n */\nclass DeferredPromise {\n    get isRejected() {\n        return this.outcome?.outcome === 1 /* DeferredOutcome.Rejected */;\n    }\n    get isSettled() {\n        return !!this.outcome;\n    }\n    constructor() {\n        this.p = new Promise((c, e) => {\n            this.completeCallback = c;\n            this.errorCallback = e;\n        });\n    }\n    complete(value) {\n        if (this.isSettled) {\n            return Promise.resolve();\n        }\n        return new Promise(resolve => {\n            this.completeCallback(value);\n            this.outcome = { outcome: 0 /* DeferredOutcome.Resolved */, value };\n            resolve();\n        });\n    }\n    error(err) {\n        if (this.isSettled) {\n            return Promise.resolve();\n        }\n        return new Promise(resolve => {\n            this.errorCallback(err);\n            this.outcome = { outcome: 1 /* DeferredOutcome.Rejected */, value: err };\n            resolve();\n        });\n    }\n    cancel() {\n        return this.error(new CancellationError());\n    }\n}\n//#endregion\n//#region Promises\nvar Promises;\n(function (Promises) {\n    /**\n     * A drop-in replacement for `Promise.all` with the only difference\n     * that the method awaits every promise to either fulfill or reject.\n     *\n     * Similar to `Promise.all`, only the first error will be returned\n     * if any.\n     */\n    async function settled(promises) {\n        let firstError = undefined;\n        const result = await Promise.all(promises.map(promise => promise.then(value => value, error => {\n            if (!firstError) {\n                firstError = error;\n            }\n            return undefined; // do not rethrow so that other promises can settle\n        })));\n        if (typeof firstError !== 'undefined') {\n            throw firstError;\n        }\n        return result; // cast is needed and protected by the `throw` above\n    }\n    Promises.settled = settled;\n    /**\n     * A helper to create a new `Promise<T>` with a body that is a promise\n     * itself. By default, an error that raises from the async body will\n     * end up as a unhandled rejection, so this utility properly awaits the\n     * body and rejects the promise as a normal promise does without async\n     * body.\n     *\n     * This method should only be used in rare cases where otherwise `async`\n     * cannot be used (e.g. when callbacks are involved that require this).\n     */\n    function withAsyncBody(bodyFn) {\n        // eslint-disable-next-line no-async-promise-executor\n        return new Promise(async (resolve, reject) => {\n            try {\n                await bodyFn(resolve, reject);\n            }\n            catch (error) {\n                reject(error);\n            }\n        });\n    }\n    Promises.withAsyncBody = withAsyncBody;\n})(Promises || (Promises = {}));\nfunction createCancelableAsyncIterableProducer(callback) {\n    const source = new CancellationTokenSource();\n    const innerIterable = callback(source.token);\n    return new CancelableAsyncIterableProducer(source, async (emitter) => {\n        const subscription = source.token.onCancellationRequested(() => {\n            subscription.dispose();\n            source.dispose();\n            emitter.reject(new CancellationError());\n        });\n        try {\n            for await (const item of innerIterable) {\n                if (source.token.isCancellationRequested) {\n                    // canceled in the meantime\n                    return;\n                }\n                emitter.emitOne(item);\n            }\n            subscription.dispose();\n            source.dispose();\n        }\n        catch (err) {\n            subscription.dispose();\n            source.dispose();\n            emitter.reject(err);\n        }\n    });\n}\nclass ProducerConsumer {\n    constructor() {\n        this._unsatisfiedConsumers = [];\n        this._unconsumedValues = [];\n    }\n    get hasFinalValue() {\n        return !!this._finalValue;\n    }\n    produce(value) {\n        this._ensureNoFinalValue();\n        if (this._unsatisfiedConsumers.length > 0) {\n            const deferred = this._unsatisfiedConsumers.shift();\n            this._resolveOrRejectDeferred(deferred, value);\n        }\n        else {\n            this._unconsumedValues.push(value);\n        }\n    }\n    produceFinal(value) {\n        this._ensureNoFinalValue();\n        this._finalValue = value;\n        for (const deferred of this._unsatisfiedConsumers) {\n            this._resolveOrRejectDeferred(deferred, value);\n        }\n        this._unsatisfiedConsumers.length = 0;\n    }\n    _ensureNoFinalValue() {\n        if (this._finalValue) {\n            throw new BugIndicatingError('ProducerConsumer: cannot produce after final value has been set');\n        }\n    }\n    _resolveOrRejectDeferred(deferred, value) {\n        if (value.ok) {\n            deferred.complete(value.value);\n        }\n        else {\n            deferred.error(value.error);\n        }\n    }\n    consume() {\n        if (this._unconsumedValues.length > 0 || this._finalValue) {\n            const value = this._unconsumedValues.length > 0 ? this._unconsumedValues.shift() : this._finalValue;\n            if (value.ok) {\n                return Promise.resolve(value.value);\n            }\n            else {\n                return Promise.reject(value.error);\n            }\n        }\n        else {\n            const deferred = new DeferredPromise();\n            this._unsatisfiedConsumers.push(deferred);\n            return deferred.p;\n        }\n    }\n}\n/**\n * Important difference to AsyncIterableObject:\n * If it is iterated two times, the second iterator will not see the values emitted by the first iterator.\n */\nclass AsyncIterableProducer {\n    constructor(executor, _onReturn) {\n        this._onReturn = _onReturn;\n        this._producerConsumer = new ProducerConsumer();\n        this._iterator = {\n            next: () => this._producerConsumer.consume(),\n            return: () => {\n                this._onReturn?.();\n                return Promise.resolve({ done: true, value: undefined });\n            },\n            throw: async (e) => {\n                this._finishError(e);\n                return { done: true, value: undefined };\n            },\n        };\n        queueMicrotask(async () => {\n            const p = executor({\n                emitOne: value => this._producerConsumer.produce({ ok: true, value: { done: false, value: value } }),\n                emitMany: values => {\n                    for (const value of values) {\n                        this._producerConsumer.produce({ ok: true, value: { done: false, value: value } });\n                    }\n                },\n                reject: error => this._finishError(error),\n            });\n            if (!this._producerConsumer.hasFinalValue) {\n                try {\n                    await p;\n                    this._finishOk();\n                }\n                catch (error) {\n                    this._finishError(error);\n                }\n            }\n        });\n    }\n    static fromArray(items) {\n        return new AsyncIterableProducer((writer) => {\n            writer.emitMany(items);\n        });\n    }\n    static fromPromise(promise) {\n        return new AsyncIterableProducer(async (emitter) => {\n            emitter.emitMany(await promise);\n        });\n    }\n    static fromPromisesResolveOrder(promises) {\n        return new AsyncIterableProducer(async (emitter) => {\n            await Promise.all(promises.map(async (p) => emitter.emitOne(await p)));\n        });\n    }\n    static merge(iterables) {\n        return new AsyncIterableProducer(async (emitter) => {\n            await Promise.all(iterables.map(async (iterable) => {\n                for await (const item of iterable) {\n                    emitter.emitOne(item);\n                }\n            }));\n        });\n    }\n    static { this.EMPTY = AsyncIterableProducer.fromArray([]); }\n    static map(iterable, mapFn) {\n        return new AsyncIterableProducer(async (emitter) => {\n            for await (const item of iterable) {\n                emitter.emitOne(mapFn(item));\n            }\n        });\n    }\n    map(mapFn) {\n        return AsyncIterableProducer.map(this, mapFn);\n    }\n    static coalesce(iterable) {\n        return AsyncIterableProducer.filter(iterable, item => !!item);\n    }\n    coalesce() {\n        return AsyncIterableProducer.coalesce(this);\n    }\n    static filter(iterable, filterFn) {\n        return new AsyncIterableProducer(async (emitter) => {\n            for await (const item of iterable) {\n                if (filterFn(item)) {\n                    emitter.emitOne(item);\n                }\n            }\n        });\n    }\n    filter(filterFn) {\n        return AsyncIterableProducer.filter(this, filterFn);\n    }\n    _finishOk() {\n        if (!this._producerConsumer.hasFinalValue) {\n            this._producerConsumer.produceFinal({ ok: true, value: { done: true, value: undefined } });\n        }\n    }\n    _finishError(error) {\n        if (!this._producerConsumer.hasFinalValue) {\n            this._producerConsumer.produceFinal({ ok: false, error: error });\n        }\n        // Warning: this can cause to dropped errors.\n    }\n    [Symbol.asyncIterator]() {\n        return this._iterator;\n    }\n}\nclass CancelableAsyncIterableProducer extends AsyncIterableProducer {\n    constructor(_source, executor) {\n        super(executor);\n        this._source = _source;\n    }\n    cancel() {\n        this._source.cancel();\n    }\n}\n\nexport { AbstractIdleValue, AsyncIterableProducer, CancelableAsyncIterableProducer, DeferredPromise, Delayer, GlobalIdleValue, IntervalTimer, Promises, RunOnceScheduler, TaskQueue, ThrottledDelayer, Throttler, TimeoutTimer, _runWhenIdle, createCancelableAsyncIterableProducer, createCancelablePromise, disposableTimeout, first, isThenable, raceCancellation, raceCancellationError, runWhenGlobalIdle, timeout };\n","function identity(t) {\n    return t;\n}\n/**\n * Uses a LRU cache to make a given parametrized function cached.\n * Caches just the last key/value.\n*/\nclass LRUCachedFunction {\n    constructor(arg1, arg2) {\n        this.lastCache = undefined;\n        this.lastArgKey = undefined;\n        if (typeof arg1 === 'function') {\n            this._fn = arg1;\n            this._computeKey = identity;\n        }\n        else {\n            this._fn = arg2;\n            this._computeKey = arg1.getCacheKey;\n        }\n    }\n    get(arg) {\n        const key = this._computeKey(arg);\n        if (this.lastArgKey !== key) {\n            this.lastArgKey = key;\n            this.lastCache = this._fn(arg);\n        }\n        return this.lastCache;\n    }\n}\n/**\n * Uses an unbounded cache to memoize the results of the given function.\n*/\nclass CachedFunction {\n    get cachedValues() {\n        return this._map;\n    }\n    constructor(arg1, arg2) {\n        this._map = new Map();\n        this._map2 = new Map();\n        if (typeof arg1 === 'function') {\n            this._fn = arg1;\n            this._computeKey = identity;\n        }\n        else {\n            this._fn = arg2;\n            this._computeKey = arg1.getCacheKey;\n        }\n    }\n    get(arg) {\n        const key = this._computeKey(arg);\n        if (this._map2.has(key)) {\n            return this._map2.get(key);\n        }\n        const value = this._fn(arg);\n        this._map.set(arg, value);\n        this._map2.set(key, value);\n        return value;\n    }\n}\n\nexport { CachedFunction, LRUCachedFunction, identity };\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 *--------------------------------------------------------------------------------------------*/\nvar LazyValueState;\n(function (LazyValueState) {\n    LazyValueState[LazyValueState[\"Uninitialized\"] = 0] = \"Uninitialized\";\n    LazyValueState[LazyValueState[\"Running\"] = 1] = \"Running\";\n    LazyValueState[LazyValueState[\"Completed\"] = 2] = \"Completed\";\n})(LazyValueState || (LazyValueState = {}));\nclass Lazy {\n    constructor(executor) {\n        this.executor = executor;\n        this._state = LazyValueState.Uninitialized;\n    }\n    /**\n     * Get the wrapped value.\n     *\n     * This will force evaluation of the lazy value if it has not been resolved yet. Lazy values are only\n     * resolved once. `getValue` will re-throw exceptions that are hit while resolving the value\n     */\n    get value() {\n        if (this._state === LazyValueState.Uninitialized) {\n            this._state = LazyValueState.Running;\n            try {\n                this._value = this.executor();\n            }\n            catch (err) {\n                this._error = err;\n            }\n            finally {\n                this._state = LazyValueState.Completed;\n            }\n        }\n        else if (this._state === LazyValueState.Running) {\n            throw new Error('Cannot read the value of a lazy that is being initialized');\n        }\n        if (this._error) {\n            throw this._error;\n        }\n        return this._value;\n    }\n    /**\n     * Get the wrapped value without forcing evaluation.\n     */\n    get rawValue() { return this._value; }\n}\n\nexport { Lazy };\n","import { LRUCachedFunction } from './cache.js';\nimport { Lazy } from './lazy.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction isFalsyOrWhitespace(str) {\n    if (!str || typeof str !== 'string') {\n        return true;\n    }\n    return str.trim().length === 0;\n}\nconst _formatRegexp = /{(\\d+)}/g;\n/**\n * Helper to produce a string with a variable number of arguments. Insert variable segments\n * into the string using the {n} notation where N is the index of the argument following the string.\n * @param value string to which formatting is applied\n * @param args replacements for {n}-entries\n */\nfunction format(value, ...args) {\n    if (args.length === 0) {\n        return value;\n    }\n    return value.replace(_formatRegexp, function (match, group) {\n        const idx = parseInt(group, 10);\n        return isNaN(idx) || idx < 0 || idx >= args.length ?\n            match :\n            args[idx];\n    });\n}\n/**\n * Encodes the given value so that it can be used as literal value in html attributes.\n *\n * In other words, computes `$val`, such that `attr` in `<div attr=\"$val\" />` has the runtime value `value`.\n * This prevents XSS injection.\n */\nfunction htmlAttributeEncodeValue(value) {\n    return value.replace(/[<>\"'&]/g, ch => {\n        switch (ch) {\n            case '<': return '&lt;';\n            case '>': return '&gt;';\n            case '\"': return '&quot;';\n            case '\\'': return '&apos;';\n            case '&': return '&amp;';\n        }\n        return ch;\n    });\n}\n/**\n * Converts HTML characters inside the string to use entities instead. Makes the string safe from\n * being used e.g. in HTMLElement.innerHTML.\n */\nfunction escape(html) {\n    return html.replace(/[<>&]/g, function (match) {\n        switch (match) {\n            case '<': return '&lt;';\n            case '>': return '&gt;';\n            case '&': return '&amp;';\n            default: return match;\n        }\n    });\n}\n/**\n * Escapes regular expression characters in a given string\n */\nfunction escapeRegExpCharacters(value) {\n    return value.replace(/[\\\\\\{\\}\\*\\+\\?\\|\\^\\$\\.\\[\\]\\(\\)]/g, '\\\\$&');\n}\n/**\n * Removes all occurrences of needle from the beginning and end of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim (default is a blank)\n */\nfunction trim(haystack, needle = ' ') {\n    const trimmed = ltrim(haystack, needle);\n    return rtrim(trimmed, needle);\n}\n/**\n * Removes all occurrences of needle from the beginning of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim\n */\nfunction ltrim(haystack, needle) {\n    if (!haystack || !needle) {\n        return haystack;\n    }\n    const needleLen = needle.length;\n    if (needleLen === 0 || haystack.length === 0) {\n        return haystack;\n    }\n    let offset = 0;\n    while (haystack.indexOf(needle, offset) === offset) {\n        offset = offset + needleLen;\n    }\n    return haystack.substring(offset);\n}\n/**\n * Removes all occurrences of needle from the end of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim\n */\nfunction rtrim(haystack, needle) {\n    if (!haystack || !needle) {\n        return haystack;\n    }\n    const needleLen = needle.length, haystackLen = haystack.length;\n    if (needleLen === 0 || haystackLen === 0) {\n        return haystack;\n    }\n    let offset = haystackLen, idx = -1;\n    while (true) {\n        idx = haystack.lastIndexOf(needle, offset - 1);\n        if (idx === -1 || idx + needleLen !== offset) {\n            break;\n        }\n        if (idx === 0) {\n            return '';\n        }\n        offset = idx;\n    }\n    return haystack.substring(0, offset);\n}\nfunction convertSimple2RegExpPattern(pattern) {\n    return pattern.replace(/[\\-\\\\\\{\\}\\+\\?\\|\\^\\$\\.\\,\\[\\]\\(\\)\\#\\s]/g, '\\\\$&').replace(/[\\*]/g, '.*');\n}\nfunction createRegExp(searchString, isRegex, options = {}) {\n    if (!searchString) {\n        throw new Error('Cannot create regex from empty string');\n    }\n    if (!isRegex) {\n        searchString = escapeRegExpCharacters(searchString);\n    }\n    if (options.wholeWord) {\n        if (!/\\B/.test(searchString.charAt(0))) {\n            searchString = '\\\\b' + searchString;\n        }\n        if (!/\\B/.test(searchString.charAt(searchString.length - 1))) {\n            searchString = searchString + '\\\\b';\n        }\n    }\n    let modifiers = '';\n    if (options.global) {\n        modifiers += 'g';\n    }\n    if (!options.matchCase) {\n        modifiers += 'i';\n    }\n    if (options.multiline) {\n        modifiers += 'm';\n    }\n    if (options.unicode) {\n        modifiers += 'u';\n    }\n    return new RegExp(searchString, modifiers);\n}\nfunction regExpLeadsToEndlessLoop(regexp) {\n    // Exit early if it's one of these special cases which are meant to match\n    // against an empty string\n    if (regexp.source === '^' || regexp.source === '^$' || regexp.source === '$' || regexp.source === '^\\\\s*$') {\n        return false;\n    }\n    // We check against an empty string. If the regular expression doesn't advance\n    // (e.g. ends in an endless loop) it will match an empty string.\n    const match = regexp.exec('');\n    return !!(match && regexp.lastIndex === 0);\n}\nfunction splitLines(str) {\n    return str.split(/\\r\\n|\\r|\\n/);\n}\n/**\n * Returns first index of the string that is not whitespace.\n * If string is empty or contains only whitespaces, returns -1\n */\nfunction firstNonWhitespaceIndex(str) {\n    for (let i = 0, len = str.length; i < len; i++) {\n        const chCode = str.charCodeAt(i);\n        if (chCode !== 32 /* CharCode.Space */ && chCode !== 9 /* CharCode.Tab */) {\n            return i;\n        }\n    }\n    return -1;\n}\n/**\n * Returns the leading whitespace of the string.\n * If the string contains only whitespaces, returns entire string\n */\nfunction getLeadingWhitespace(str, start = 0, end = str.length) {\n    for (let i = start; i < end; i++) {\n        const chCode = str.charCodeAt(i);\n        if (chCode !== 32 /* CharCode.Space */ && chCode !== 9 /* CharCode.Tab */) {\n            return str.substring(start, i);\n        }\n    }\n    return str.substring(start, end);\n}\n/**\n * Returns last index of the string that is not whitespace.\n * If string is empty or contains only whitespaces, returns -1\n */\nfunction lastNonWhitespaceIndex(str, startIndex = str.length - 1) {\n    for (let i = startIndex; i >= 0; i--) {\n        const chCode = str.charCodeAt(i);\n        if (chCode !== 32 /* CharCode.Space */ && chCode !== 9 /* CharCode.Tab */) {\n            return i;\n        }\n    }\n    return -1;\n}\nfunction compare(a, b) {\n    if (a < b) {\n        return -1;\n    }\n    else if (a > b) {\n        return 1;\n    }\n    else {\n        return 0;\n    }\n}\nfunction compareSubstring(a, b, aStart = 0, aEnd = a.length, bStart = 0, bEnd = b.length) {\n    for (; aStart < aEnd && bStart < bEnd; aStart++, bStart++) {\n        const codeA = a.charCodeAt(aStart);\n        const codeB = b.charCodeAt(bStart);\n        if (codeA < codeB) {\n            return -1;\n        }\n        else if (codeA > codeB) {\n            return 1;\n        }\n    }\n    const aLen = aEnd - aStart;\n    const bLen = bEnd - bStart;\n    if (aLen < bLen) {\n        return -1;\n    }\n    else if (aLen > bLen) {\n        return 1;\n    }\n    return 0;\n}\nfunction compareIgnoreCase(a, b) {\n    return compareSubstringIgnoreCase(a, b, 0, a.length, 0, b.length);\n}\nfunction compareSubstringIgnoreCase(a, b, aStart = 0, aEnd = a.length, bStart = 0, bEnd = b.length) {\n    for (; aStart < aEnd && bStart < bEnd; aStart++, bStart++) {\n        let codeA = a.charCodeAt(aStart);\n        let codeB = b.charCodeAt(bStart);\n        if (codeA === codeB) {\n            // equal\n            continue;\n        }\n        if (codeA >= 128 || codeB >= 128) {\n            // not ASCII letters -> fallback to lower-casing strings\n            return compareSubstring(a.toLowerCase(), b.toLowerCase(), aStart, aEnd, bStart, bEnd);\n        }\n        // mapper lower-case ascii letter onto upper-case varinats\n        // [97-122] (lower ascii) --> [65-90] (upper ascii)\n        if (isLowerAsciiLetter(codeA)) {\n            codeA -= 32;\n        }\n        if (isLowerAsciiLetter(codeB)) {\n            codeB -= 32;\n        }\n        // compare both code points\n        const diff = codeA - codeB;\n        if (diff === 0) {\n            continue;\n        }\n        return diff;\n    }\n    const aLen = aEnd - aStart;\n    const bLen = bEnd - bStart;\n    if (aLen < bLen) {\n        return -1;\n    }\n    else if (aLen > bLen) {\n        return 1;\n    }\n    return 0;\n}\nfunction isAsciiDigit(code) {\n    return code >= 48 /* CharCode.Digit0 */ && code <= 57 /* CharCode.Digit9 */;\n}\nfunction isLowerAsciiLetter(code) {\n    return code >= 97 /* CharCode.a */ && code <= 122 /* CharCode.z */;\n}\nfunction isUpperAsciiLetter(code) {\n    return code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */;\n}\nfunction equalsIgnoreCase(a, b) {\n    return a.length === b.length && compareSubstringIgnoreCase(a, b) === 0;\n}\nfunction startsWithIgnoreCase(str, candidate) {\n    const len = candidate.length;\n    return len <= str.length && compareSubstringIgnoreCase(str, candidate, 0, len) === 0;\n}\nfunction endsWithIgnoreCase(str, candidate) {\n    const len = str.length;\n    const start = len - candidate.length;\n    return start >= 0 && compareSubstringIgnoreCase(str, candidate, start, len) === 0;\n}\n/**\n * @returns the length of the common prefix of the two strings.\n */\nfunction commonPrefixLength(a, b) {\n    const len = Math.min(a.length, b.length);\n    let i;\n    for (i = 0; i < len; i++) {\n        if (a.charCodeAt(i) !== b.charCodeAt(i)) {\n            return i;\n        }\n    }\n    return len;\n}\n/**\n * @returns the length of the common suffix of the two strings.\n */\nfunction commonSuffixLength(a, b) {\n    const len = Math.min(a.length, b.length);\n    let i;\n    const aLastIndex = a.length - 1;\n    const bLastIndex = b.length - 1;\n    for (i = 0; i < len; i++) {\n        if (a.charCodeAt(aLastIndex - i) !== b.charCodeAt(bLastIndex - i)) {\n            return i;\n        }\n    }\n    return len;\n}\n/**\n * See http://en.wikipedia.org/wiki/Surrogate_pair\n */\nfunction isHighSurrogate(charCode) {\n    return (0xD800 <= charCode && charCode <= 0xDBFF);\n}\n/**\n * See http://en.wikipedia.org/wiki/Surrogate_pair\n */\nfunction isLowSurrogate(charCode) {\n    return (0xDC00 <= charCode && charCode <= 0xDFFF);\n}\n/**\n * See http://en.wikipedia.org/wiki/Surrogate_pair\n */\nfunction computeCodePoint(highSurrogate, lowSurrogate) {\n    return ((highSurrogate - 0xD800) << 10) + (lowSurrogate - 0xDC00) + 0x10000;\n}\n/**\n * get the code point that begins at offset `offset`\n */\nfunction getNextCodePoint(str, len, offset) {\n    const charCode = str.charCodeAt(offset);\n    if (isHighSurrogate(charCode) && offset + 1 < len) {\n        const nextCharCode = str.charCodeAt(offset + 1);\n        if (isLowSurrogate(nextCharCode)) {\n            return computeCodePoint(charCode, nextCharCode);\n        }\n    }\n    return charCode;\n}\n/**\n * get the code point that ends right before offset `offset`\n */\nfunction getPrevCodePoint(str, offset) {\n    const charCode = str.charCodeAt(offset - 1);\n    if (isLowSurrogate(charCode) && offset > 1) {\n        const prevCharCode = str.charCodeAt(offset - 2);\n        if (isHighSurrogate(prevCharCode)) {\n            return computeCodePoint(prevCharCode, charCode);\n        }\n    }\n    return charCode;\n}\nclass CodePointIterator {\n    get offset() {\n        return this._offset;\n    }\n    constructor(str, offset = 0) {\n        this._str = str;\n        this._len = str.length;\n        this._offset = offset;\n    }\n    setOffset(offset) {\n        this._offset = offset;\n    }\n    prevCodePoint() {\n        const codePoint = getPrevCodePoint(this._str, this._offset);\n        this._offset -= (codePoint >= 65536 /* Constants.UNICODE_SUPPLEMENTARY_PLANE_BEGIN */ ? 2 : 1);\n        return codePoint;\n    }\n    nextCodePoint() {\n        const codePoint = getNextCodePoint(this._str, this._len, this._offset);\n        this._offset += (codePoint >= 65536 /* Constants.UNICODE_SUPPLEMENTARY_PLANE_BEGIN */ ? 2 : 1);\n        return codePoint;\n    }\n    eol() {\n        return (this._offset >= this._len);\n    }\n}\nclass GraphemeIterator {\n    get offset() {\n        return this._iterator.offset;\n    }\n    constructor(str, offset = 0) {\n        this._iterator = new CodePointIterator(str, offset);\n    }\n    nextGraphemeLength() {\n        const graphemeBreakTree = GraphemeBreakTree.getInstance();\n        const iterator = this._iterator;\n        const initialOffset = iterator.offset;\n        let graphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.nextCodePoint());\n        while (!iterator.eol()) {\n            const offset = iterator.offset;\n            const nextGraphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.nextCodePoint());\n            if (breakBetweenGraphemeBreakType(graphemeBreakType, nextGraphemeBreakType)) {\n                // move iterator back\n                iterator.setOffset(offset);\n                break;\n            }\n            graphemeBreakType = nextGraphemeBreakType;\n        }\n        return (iterator.offset - initialOffset);\n    }\n    prevGraphemeLength() {\n        const graphemeBreakTree = GraphemeBreakTree.getInstance();\n        const iterator = this._iterator;\n        const initialOffset = iterator.offset;\n        let graphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.prevCodePoint());\n        while (iterator.offset > 0) {\n            const offset = iterator.offset;\n            const prevGraphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.prevCodePoint());\n            if (breakBetweenGraphemeBreakType(prevGraphemeBreakType, graphemeBreakType)) {\n                // move iterator back\n                iterator.setOffset(offset);\n                break;\n            }\n            graphemeBreakType = prevGraphemeBreakType;\n        }\n        return (initialOffset - iterator.offset);\n    }\n    eol() {\n        return this._iterator.eol();\n    }\n}\nfunction nextCharLength(str, initialOffset) {\n    const iterator = new GraphemeIterator(str, initialOffset);\n    return iterator.nextGraphemeLength();\n}\nfunction prevCharLength(str, initialOffset) {\n    const iterator = new GraphemeIterator(str, initialOffset);\n    return iterator.prevGraphemeLength();\n}\nfunction getCharContainingOffset(str, offset) {\n    if (offset > 0 && isLowSurrogate(str.charCodeAt(offset))) {\n        offset--;\n    }\n    const endOffset = offset + nextCharLength(str, offset);\n    const startOffset = endOffset - prevCharLength(str, endOffset);\n    return [startOffset, endOffset];\n}\nlet CONTAINS_RTL = undefined;\nfunction makeContainsRtl() {\n    // Generated using https://github.com/alexdima/unicode-utils/blob/main/rtl-test.js\n    return /(?:[\\u05BE\\u05C0\\u05C3\\u05C6\\u05D0-\\u05F4\\u0608\\u060B\\u060D\\u061B-\\u064A\\u066D-\\u066F\\u0671-\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1-\\u07EA\\u07F4\\u07F5\\u07FA\\u07FE-\\u0815\\u081A\\u0824\\u0828\\u0830-\\u0858\\u085E-\\u088E\\u08A0-\\u08C9\\u200F\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFD3D\\uFD50-\\uFDC7\\uFDF0-\\uFDFC\\uFE70-\\uFEFC]|\\uD802[\\uDC00-\\uDD1B\\uDD20-\\uDE00\\uDE10-\\uDE35\\uDE40-\\uDEE4\\uDEEB-\\uDF35\\uDF40-\\uDFFF]|\\uD803[\\uDC00-\\uDD23\\uDE80-\\uDEA9\\uDEAD-\\uDF45\\uDF51-\\uDF81\\uDF86-\\uDFF6]|\\uD83A[\\uDC00-\\uDCCF\\uDD00-\\uDD43\\uDD4B-\\uDFFF]|\\uD83B[\\uDC00-\\uDEBB])/;\n}\n/**\n * Returns true if `str` contains any Unicode character that is classified as \"R\" or \"AL\".\n */\nfunction containsRTL(str) {\n    if (!CONTAINS_RTL) {\n        CONTAINS_RTL = makeContainsRtl();\n    }\n    return CONTAINS_RTL.test(str);\n}\nconst IS_BASIC_ASCII = /^[\\t\\n\\r\\x20-\\x7E]*$/;\n/**\n * Returns true if `str` contains only basic ASCII characters in the range 32 - 126 (including 32 and 126) or \\n, \\r, \\t\n */\nfunction isBasicASCII(str) {\n    return IS_BASIC_ASCII.test(str);\n}\nconst UNUSUAL_LINE_TERMINATORS = /[\\u2028\\u2029]/; // LINE SEPARATOR (LS) or PARAGRAPH SEPARATOR (PS)\n/**\n * Returns true if `str` contains unusual line terminators, like LS or PS\n */\nfunction containsUnusualLineTerminators(str) {\n    return UNUSUAL_LINE_TERMINATORS.test(str);\n}\nfunction isFullWidthCharacter(charCode) {\n    // Do a cheap trick to better support wrapping of wide characters, treat them as 2 columns\n    // http://jrgraphix.net/research/unicode_blocks.php\n    //          2E80 - 2EFF   CJK Radicals Supplement\n    //          2F00 - 2FDF   Kangxi Radicals\n    //          2FF0 - 2FFF   Ideographic Description Characters\n    //          3000 - 303F   CJK Symbols and Punctuation\n    //          3040 - 309F   Hiragana\n    //          30A0 - 30FF   Katakana\n    //          3100 - 312F   Bopomofo\n    //          3130 - 318F   Hangul Compatibility Jamo\n    //          3190 - 319F   Kanbun\n    //          31A0 - 31BF   Bopomofo Extended\n    //          31F0 - 31FF   Katakana Phonetic Extensions\n    //          3200 - 32FF   Enclosed CJK Letters and Months\n    //          3300 - 33FF   CJK Compatibility\n    //          3400 - 4DBF   CJK Unified Ideographs Extension A\n    //          4DC0 - 4DFF   Yijing Hexagram Symbols\n    //          4E00 - 9FFF   CJK Unified Ideographs\n    //          A000 - A48F   Yi Syllables\n    //          A490 - A4CF   Yi Radicals\n    //          AC00 - D7AF   Hangul Syllables\n    // [IGNORE] D800 - DB7F   High Surrogates\n    // [IGNORE] DB80 - DBFF   High Private Use Surrogates\n    // [IGNORE] DC00 - DFFF   Low Surrogates\n    // [IGNORE] E000 - F8FF   Private Use Area\n    //          F900 - FAFF   CJK Compatibility Ideographs\n    // [IGNORE] FB00 - FB4F   Alphabetic Presentation Forms\n    // [IGNORE] FB50 - FDFF   Arabic Presentation Forms-A\n    // [IGNORE] FE00 - FE0F   Variation Selectors\n    // [IGNORE] FE20 - FE2F   Combining Half Marks\n    // [IGNORE] FE30 - FE4F   CJK Compatibility Forms\n    // [IGNORE] FE50 - FE6F   Small Form Variants\n    // [IGNORE] FE70 - FEFF   Arabic Presentation Forms-B\n    //          FF00 - FFEF   Halfwidth and Fullwidth Forms\n    //               [https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms]\n    //               of which FF01 - FF5E fullwidth ASCII of 21 to 7E\n    // [IGNORE]    and FF65 - FFDC halfwidth of Katakana and Hangul\n    // [IGNORE] FFF0 - FFFF   Specials\n    return ((charCode >= 0x2E80 && charCode <= 0xD7AF)\n        || (charCode >= 0xF900 && charCode <= 0xFAFF)\n        || (charCode >= 0xFF01 && charCode <= 0xFF5E));\n}\n/**\n * A fast function (therefore imprecise) to check if code points are emojis.\n * Generated using https://github.com/alexdima/unicode-utils/blob/main/emoji-test.js\n */\nfunction isEmojiImprecise(x) {\n    return ((x >= 0x1F1E6 && x <= 0x1F1FF) || (x === 8986) || (x === 8987) || (x === 9200)\n        || (x === 9203) || (x >= 9728 && x <= 10175) || (x === 11088) || (x === 11093)\n        || (x >= 127744 && x <= 128591) || (x >= 128640 && x <= 128764)\n        || (x >= 128992 && x <= 129008) || (x >= 129280 && x <= 129535)\n        || (x >= 129648 && x <= 129782));\n}\n// -- UTF-8 BOM\nconst UTF8_BOM_CHARACTER = String.fromCharCode(65279 /* CharCode.UTF8_BOM */);\nfunction startsWithUTF8BOM(str) {\n    return !!(str && str.length > 0 && str.charCodeAt(0) === 65279 /* CharCode.UTF8_BOM */);\n}\nfunction containsUppercaseCharacter(target, ignoreEscapedChars = false) {\n    if (!target) {\n        return false;\n    }\n    if (ignoreEscapedChars) {\n        target = target.replace(/\\\\./g, '');\n    }\n    return target.toLowerCase() !== target;\n}\n/**\n * Produces 'a'-'z', followed by 'A'-'Z'... followed by 'a'-'z', etc.\n */\nfunction singleLetterHash(n) {\n    const LETTERS_CNT = (90 /* CharCode.Z */ - 65 /* CharCode.A */ + 1);\n    n = n % (2 * LETTERS_CNT);\n    if (n < LETTERS_CNT) {\n        return String.fromCharCode(97 /* CharCode.a */ + n);\n    }\n    return String.fromCharCode(65 /* CharCode.A */ + n - LETTERS_CNT);\n}\nfunction breakBetweenGraphemeBreakType(breakTypeA, breakTypeB) {\n    // http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundary_Rules\n    // !!! Let's make the common case a bit faster\n    if (breakTypeA === 0 /* GraphemeBreakType.Other */) {\n        // see https://www.unicode.org/Public/13.0.0/ucd/auxiliary/GraphemeBreakTest-13.0.0d10.html#table\n        return (breakTypeB !== 5 /* GraphemeBreakType.Extend */ && breakTypeB !== 7 /* GraphemeBreakType.SpacingMark */);\n    }\n    // Do not break between a CR and LF. Otherwise, break before and after controls.\n    // GB3                                        CR × LF\n    // GB4                       (Control | CR | LF) ÷\n    // GB5                                           ÷ (Control | CR | LF)\n    if (breakTypeA === 2 /* GraphemeBreakType.CR */) {\n        if (breakTypeB === 3 /* GraphemeBreakType.LF */) {\n            return false; // GB3\n        }\n    }\n    if (breakTypeA === 4 /* GraphemeBreakType.Control */ || breakTypeA === 2 /* GraphemeBreakType.CR */ || breakTypeA === 3 /* GraphemeBreakType.LF */) {\n        return true; // GB4\n    }\n    if (breakTypeB === 4 /* GraphemeBreakType.Control */ || breakTypeB === 2 /* GraphemeBreakType.CR */ || breakTypeB === 3 /* GraphemeBreakType.LF */) {\n        return true; // GB5\n    }\n    // Do not break Hangul syllable sequences.\n    // GB6                                         L × (L | V | LV | LVT)\n    // GB7                                  (LV | V) × (V | T)\n    // GB8                                 (LVT | T) × T\n    if (breakTypeA === 8 /* GraphemeBreakType.L */) {\n        if (breakTypeB === 8 /* GraphemeBreakType.L */ || breakTypeB === 9 /* GraphemeBreakType.V */ || breakTypeB === 11 /* GraphemeBreakType.LV */ || breakTypeB === 12 /* GraphemeBreakType.LVT */) {\n            return false; // GB6\n        }\n    }\n    if (breakTypeA === 11 /* GraphemeBreakType.LV */ || breakTypeA === 9 /* GraphemeBreakType.V */) {\n        if (breakTypeB === 9 /* GraphemeBreakType.V */ || breakTypeB === 10 /* GraphemeBreakType.T */) {\n            return false; // GB7\n        }\n    }\n    if (breakTypeA === 12 /* GraphemeBreakType.LVT */ || breakTypeA === 10 /* GraphemeBreakType.T */) {\n        if (breakTypeB === 10 /* GraphemeBreakType.T */) {\n            return false; // GB8\n        }\n    }\n    // Do not break before extending characters or ZWJ.\n    // GB9                                           × (Extend | ZWJ)\n    if (breakTypeB === 5 /* GraphemeBreakType.Extend */ || breakTypeB === 13 /* GraphemeBreakType.ZWJ */) {\n        return false; // GB9\n    }\n    // The GB9a and GB9b rules only apply to extended grapheme clusters:\n    // Do not break before SpacingMarks, or after Prepend characters.\n    // GB9a                                          × SpacingMark\n    // GB9b                                  Prepend ×\n    if (breakTypeB === 7 /* GraphemeBreakType.SpacingMark */) {\n        return false; // GB9a\n    }\n    if (breakTypeA === 1 /* GraphemeBreakType.Prepend */) {\n        return false; // GB9b\n    }\n    // Do not break within emoji modifier sequences or emoji zwj sequences.\n    // GB11    \\p{Extended_Pictographic} Extend* ZWJ × \\p{Extended_Pictographic}\n    if (breakTypeA === 13 /* GraphemeBreakType.ZWJ */ && breakTypeB === 14 /* GraphemeBreakType.Extended_Pictographic */) {\n        // Note: we are not implementing the rule entirely here to avoid introducing states\n        return false; // GB11\n    }\n    // GB12                          sot (RI RI)* RI × RI\n    // GB13                        [^RI] (RI RI)* RI × RI\n    if (breakTypeA === 6 /* GraphemeBreakType.Regional_Indicator */ && breakTypeB === 6 /* GraphemeBreakType.Regional_Indicator */) {\n        // Note: we are not implementing the rule entirely here to avoid introducing states\n        return false; // GB12 & GB13\n    }\n    // GB999                                     Any ÷ Any\n    return true;\n}\nclass GraphemeBreakTree {\n    static { this._INSTANCE = null; }\n    static getInstance() {\n        if (!GraphemeBreakTree._INSTANCE) {\n            GraphemeBreakTree._INSTANCE = new GraphemeBreakTree();\n        }\n        return GraphemeBreakTree._INSTANCE;\n    }\n    constructor() {\n        this._data = getGraphemeBreakRawData();\n    }\n    getGraphemeBreakType(codePoint) {\n        // !!! Let's make 7bit ASCII a bit faster: 0..31\n        if (codePoint < 32) {\n            if (codePoint === 10 /* CharCode.LineFeed */) {\n                return 3 /* GraphemeBreakType.LF */;\n            }\n            if (codePoint === 13 /* CharCode.CarriageReturn */) {\n                return 2 /* GraphemeBreakType.CR */;\n            }\n            return 4 /* GraphemeBreakType.Control */;\n        }\n        // !!! Let's make 7bit ASCII a bit faster: 32..126\n        if (codePoint < 127) {\n            return 0 /* GraphemeBreakType.Other */;\n        }\n        const data = this._data;\n        const nodeCount = data.length / 3;\n        let nodeIndex = 1;\n        while (nodeIndex <= nodeCount) {\n            if (codePoint < data[3 * nodeIndex]) {\n                // go left\n                nodeIndex = 2 * nodeIndex;\n            }\n            else if (codePoint > data[3 * nodeIndex + 1]) {\n                // go right\n                nodeIndex = 2 * nodeIndex + 1;\n            }\n            else {\n                // hit\n                return data[3 * nodeIndex + 2];\n            }\n        }\n        return 0 /* GraphemeBreakType.Other */;\n    }\n}\nfunction getGraphemeBreakRawData() {\n    // generated using https://github.com/alexdima/unicode-utils/blob/main/grapheme-break.js\n    return JSON.parse('[0,0,0,51229,51255,12,44061,44087,12,127462,127487,6,7083,7085,5,47645,47671,12,54813,54839,12,128678,128678,14,3270,3270,5,9919,9923,14,45853,45879,12,49437,49463,12,53021,53047,12,71216,71218,7,128398,128399,14,129360,129374,14,2519,2519,5,4448,4519,9,9742,9742,14,12336,12336,14,44957,44983,12,46749,46775,12,48541,48567,12,50333,50359,12,52125,52151,12,53917,53943,12,69888,69890,5,73018,73018,5,127990,127990,14,128558,128559,14,128759,128760,14,129653,129655,14,2027,2035,5,2891,2892,7,3761,3761,5,6683,6683,5,8293,8293,4,9825,9826,14,9999,9999,14,43452,43453,5,44509,44535,12,45405,45431,12,46301,46327,12,47197,47223,12,48093,48119,12,48989,49015,12,49885,49911,12,50781,50807,12,51677,51703,12,52573,52599,12,53469,53495,12,54365,54391,12,65279,65279,4,70471,70472,7,72145,72147,7,119173,119179,5,127799,127818,14,128240,128244,14,128512,128512,14,128652,128652,14,128721,128722,14,129292,129292,14,129445,129450,14,129734,129743,14,1476,1477,5,2366,2368,7,2750,2752,7,3076,3076,5,3415,3415,5,4141,4144,5,6109,6109,5,6964,6964,5,7394,7400,5,9197,9198,14,9770,9770,14,9877,9877,14,9968,9969,14,10084,10084,14,43052,43052,5,43713,43713,5,44285,44311,12,44733,44759,12,45181,45207,12,45629,45655,12,46077,46103,12,46525,46551,12,46973,46999,12,47421,47447,12,47869,47895,12,48317,48343,12,48765,48791,12,49213,49239,12,49661,49687,12,50109,50135,12,50557,50583,12,51005,51031,12,51453,51479,12,51901,51927,12,52349,52375,12,52797,52823,12,53245,53271,12,53693,53719,12,54141,54167,12,54589,54615,12,55037,55063,12,69506,69509,5,70191,70193,5,70841,70841,7,71463,71467,5,72330,72342,5,94031,94031,5,123628,123631,5,127763,127765,14,127941,127941,14,128043,128062,14,128302,128317,14,128465,128467,14,128539,128539,14,128640,128640,14,128662,128662,14,128703,128703,14,128745,128745,14,129004,129007,14,129329,129330,14,129402,129402,14,129483,129483,14,129686,129704,14,130048,131069,14,173,173,4,1757,1757,1,2200,2207,5,2434,2435,7,2631,2632,5,2817,2817,5,3008,3008,5,3201,3201,5,3387,3388,5,3542,3542,5,3902,3903,7,4190,4192,5,6002,6003,5,6439,6440,5,6765,6770,7,7019,7027,5,7154,7155,7,8205,8205,13,8505,8505,14,9654,9654,14,9757,9757,14,9792,9792,14,9852,9853,14,9890,9894,14,9937,9937,14,9981,9981,14,10035,10036,14,11035,11036,14,42654,42655,5,43346,43347,7,43587,43587,5,44006,44007,7,44173,44199,12,44397,44423,12,44621,44647,12,44845,44871,12,45069,45095,12,45293,45319,12,45517,45543,12,45741,45767,12,45965,45991,12,46189,46215,12,46413,46439,12,46637,46663,12,46861,46887,12,47085,47111,12,47309,47335,12,47533,47559,12,47757,47783,12,47981,48007,12,48205,48231,12,48429,48455,12,48653,48679,12,48877,48903,12,49101,49127,12,49325,49351,12,49549,49575,12,49773,49799,12,49997,50023,12,50221,50247,12,50445,50471,12,50669,50695,12,50893,50919,12,51117,51143,12,51341,51367,12,51565,51591,12,51789,51815,12,52013,52039,12,52237,52263,12,52461,52487,12,52685,52711,12,52909,52935,12,53133,53159,12,53357,53383,12,53581,53607,12,53805,53831,12,54029,54055,12,54253,54279,12,54477,54503,12,54701,54727,12,54925,54951,12,55149,55175,12,68101,68102,5,69762,69762,7,70067,70069,7,70371,70378,5,70720,70721,7,71087,71087,5,71341,71341,5,71995,71996,5,72249,72249,7,72850,72871,5,73109,73109,5,118576,118598,5,121505,121519,5,127245,127247,14,127568,127569,14,127777,127777,14,127872,127891,14,127956,127967,14,128015,128016,14,128110,128172,14,128259,128259,14,128367,128368,14,128424,128424,14,128488,128488,14,128530,128532,14,128550,128551,14,128566,128566,14,128647,128647,14,128656,128656,14,128667,128673,14,128691,128693,14,128715,128715,14,128728,128732,14,128752,128752,14,128765,128767,14,129096,129103,14,129311,129311,14,129344,129349,14,129394,129394,14,129413,129425,14,129466,129471,14,129511,129535,14,129664,129666,14,129719,129722,14,129760,129767,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2307,2307,7,2382,2383,7,2497,2500,5,2563,2563,7,2677,2677,5,2763,2764,7,2879,2879,5,2914,2915,5,3021,3021,5,3142,3144,5,3263,3263,5,3285,3286,5,3398,3400,7,3530,3530,5,3633,3633,5,3864,3865,5,3974,3975,5,4155,4156,7,4229,4230,5,5909,5909,7,6078,6085,7,6277,6278,5,6451,6456,7,6744,6750,5,6846,6846,5,6972,6972,5,7074,7077,5,7146,7148,7,7222,7223,5,7416,7417,5,8234,8238,4,8417,8417,5,9000,9000,14,9203,9203,14,9730,9731,14,9748,9749,14,9762,9763,14,9776,9783,14,9800,9811,14,9831,9831,14,9872,9873,14,9882,9882,14,9900,9903,14,9929,9933,14,9941,9960,14,9974,9974,14,9989,9989,14,10006,10006,14,10062,10062,14,10160,10160,14,11647,11647,5,12953,12953,14,43019,43019,5,43232,43249,5,43443,43443,5,43567,43568,7,43696,43696,5,43765,43765,7,44013,44013,5,44117,44143,12,44229,44255,12,44341,44367,12,44453,44479,12,44565,44591,12,44677,44703,12,44789,44815,12,44901,44927,12,45013,45039,12,45125,45151,12,45237,45263,12,45349,45375,12,45461,45487,12,45573,45599,12,45685,45711,12,45797,45823,12,45909,45935,12,46021,46047,12,46133,46159,12,46245,46271,12,46357,46383,12,46469,46495,12,46581,46607,12,46693,46719,12,46805,46831,12,46917,46943,12,47029,47055,12,47141,47167,12,47253,47279,12,47365,47391,12,47477,47503,12,47589,47615,12,47701,47727,12,47813,47839,12,47925,47951,12,48037,48063,12,48149,48175,12,48261,48287,12,48373,48399,12,48485,48511,12,48597,48623,12,48709,48735,12,48821,48847,12,48933,48959,12,49045,49071,12,49157,49183,12,49269,49295,12,49381,49407,12,49493,49519,12,49605,49631,12,49717,49743,12,49829,49855,12,49941,49967,12,50053,50079,12,50165,50191,12,50277,50303,12,50389,50415,12,50501,50527,12,50613,50639,12,50725,50751,12,50837,50863,12,50949,50975,12,51061,51087,12,51173,51199,12,51285,51311,12,51397,51423,12,51509,51535,12,51621,51647,12,51733,51759,12,51845,51871,12,51957,51983,12,52069,52095,12,52181,52207,12,52293,52319,12,52405,52431,12,52517,52543,12,52629,52655,12,52741,52767,12,52853,52879,12,52965,52991,12,53077,53103,12,53189,53215,12,53301,53327,12,53413,53439,12,53525,53551,12,53637,53663,12,53749,53775,12,53861,53887,12,53973,53999,12,54085,54111,12,54197,54223,12,54309,54335,12,54421,54447,12,54533,54559,12,54645,54671,12,54757,54783,12,54869,54895,12,54981,55007,12,55093,55119,12,55243,55291,10,66045,66045,5,68325,68326,5,69688,69702,5,69817,69818,5,69957,69958,7,70089,70092,5,70198,70199,5,70462,70462,5,70502,70508,5,70750,70750,5,70846,70846,7,71100,71101,5,71230,71230,7,71351,71351,5,71737,71738,5,72000,72000,7,72160,72160,5,72273,72278,5,72752,72758,5,72882,72883,5,73031,73031,5,73461,73462,7,94192,94193,7,119149,119149,7,121403,121452,5,122915,122916,5,126980,126980,14,127358,127359,14,127535,127535,14,127759,127759,14,127771,127771,14,127792,127793,14,127825,127867,14,127897,127899,14,127945,127945,14,127985,127986,14,128000,128007,14,128021,128021,14,128066,128100,14,128184,128235,14,128249,128252,14,128266,128276,14,128335,128335,14,128379,128390,14,128407,128419,14,128444,128444,14,128481,128481,14,128499,128499,14,128526,128526,14,128536,128536,14,128543,128543,14,128556,128556,14,128564,128564,14,128577,128580,14,128643,128645,14,128649,128649,14,128654,128654,14,128660,128660,14,128664,128664,14,128675,128675,14,128686,128689,14,128695,128696,14,128705,128709,14,128717,128719,14,128725,128725,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129009,129023,14,129160,129167,14,129296,129304,14,129320,129327,14,129340,129342,14,129356,129356,14,129388,129392,14,129399,129400,14,129404,129407,14,129432,129442,14,129454,129455,14,129473,129474,14,129485,129487,14,129648,129651,14,129659,129660,14,129671,129679,14,129709,129711,14,129728,129730,14,129751,129753,14,129776,129782,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2274,2274,1,2363,2363,7,2377,2380,7,2402,2403,5,2494,2494,5,2507,2508,7,2558,2558,5,2622,2624,7,2641,2641,5,2691,2691,7,2759,2760,5,2786,2787,5,2876,2876,5,2881,2884,5,2901,2902,5,3006,3006,5,3014,3016,7,3072,3072,5,3134,3136,5,3157,3158,5,3260,3260,5,3266,3266,5,3274,3275,7,3328,3329,5,3391,3392,7,3405,3405,5,3457,3457,5,3536,3537,7,3551,3551,5,3636,3642,5,3764,3772,5,3895,3895,5,3967,3967,7,3993,4028,5,4146,4151,5,4182,4183,7,4226,4226,5,4253,4253,5,4957,4959,5,5940,5940,7,6070,6070,7,6087,6088,7,6158,6158,4,6432,6434,5,6448,6449,7,6679,6680,5,6742,6742,5,6754,6754,5,6783,6783,5,6912,6915,5,6966,6970,5,6978,6978,5,7042,7042,7,7080,7081,5,7143,7143,7,7150,7150,7,7212,7219,5,7380,7392,5,7412,7412,5,8203,8203,4,8232,8232,4,8265,8265,14,8400,8412,5,8421,8432,5,8617,8618,14,9167,9167,14,9200,9200,14,9410,9410,14,9723,9726,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9774,14,9786,9786,14,9794,9794,14,9823,9823,14,9828,9828,14,9833,9850,14,9855,9855,14,9875,9875,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9935,9935,14,9939,9939,14,9962,9962,14,9972,9972,14,9978,9978,14,9986,9986,14,9997,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10133,10135,14,10548,10549,14,11093,11093,14,12330,12333,5,12441,12442,5,42608,42610,5,43010,43010,5,43045,43046,5,43188,43203,7,43302,43309,5,43392,43394,5,43446,43449,5,43493,43493,5,43571,43572,7,43597,43597,7,43703,43704,5,43756,43757,5,44003,44004,7,44009,44010,7,44033,44059,12,44089,44115,12,44145,44171,12,44201,44227,12,44257,44283,12,44313,44339,12,44369,44395,12,44425,44451,12,44481,44507,12,44537,44563,12,44593,44619,12,44649,44675,12,44705,44731,12,44761,44787,12,44817,44843,12,44873,44899,12,44929,44955,12,44985,45011,12,45041,45067,12,45097,45123,12,45153,45179,12,45209,45235,12,45265,45291,12,45321,45347,12,45377,45403,12,45433,45459,12,45489,45515,12,45545,45571,12,45601,45627,12,45657,45683,12,45713,45739,12,45769,45795,12,45825,45851,12,45881,45907,12,45937,45963,12,45993,46019,12,46049,46075,12,46105,46131,12,46161,46187,12,46217,46243,12,46273,46299,12,46329,46355,12,46385,46411,12,46441,46467,12,46497,46523,12,46553,46579,12,46609,46635,12,46665,46691,12,46721,46747,12,46777,46803,12,46833,46859,12,46889,46915,12,46945,46971,12,47001,47027,12,47057,47083,12,47113,47139,12,47169,47195,12,47225,47251,12,47281,47307,12,47337,47363,12,47393,47419,12,47449,47475,12,47505,47531,12,47561,47587,12,47617,47643,12,47673,47699,12,47729,47755,12,47785,47811,12,47841,47867,12,47897,47923,12,47953,47979,12,48009,48035,12,48065,48091,12,48121,48147,12,48177,48203,12,48233,48259,12,48289,48315,12,48345,48371,12,48401,48427,12,48457,48483,12,48513,48539,12,48569,48595,12,48625,48651,12,48681,48707,12,48737,48763,12,48793,48819,12,48849,48875,12,48905,48931,12,48961,48987,12,49017,49043,12,49073,49099,12,49129,49155,12,49185,49211,12,49241,49267,12,49297,49323,12,49353,49379,12,49409,49435,12,49465,49491,12,49521,49547,12,49577,49603,12,49633,49659,12,49689,49715,12,49745,49771,12,49801,49827,12,49857,49883,12,49913,49939,12,49969,49995,12,50025,50051,12,50081,50107,12,50137,50163,12,50193,50219,12,50249,50275,12,50305,50331,12,50361,50387,12,50417,50443,12,50473,50499,12,50529,50555,12,50585,50611,12,50641,50667,12,50697,50723,12,50753,50779,12,50809,50835,12,50865,50891,12,50921,50947,12,50977,51003,12,51033,51059,12,51089,51115,12,51145,51171,12,51201,51227,12,51257,51283,12,51313,51339,12,51369,51395,12,51425,51451,12,51481,51507,12,51537,51563,12,51593,51619,12,51649,51675,12,51705,51731,12,51761,51787,12,51817,51843,12,51873,51899,12,51929,51955,12,51985,52011,12,52041,52067,12,52097,52123,12,52153,52179,12,52209,52235,12,52265,52291,12,52321,52347,12,52377,52403,12,52433,52459,12,52489,52515,12,52545,52571,12,52601,52627,12,52657,52683,12,52713,52739,12,52769,52795,12,52825,52851,12,52881,52907,12,52937,52963,12,52993,53019,12,53049,53075,12,53105,53131,12,53161,53187,12,53217,53243,12,53273,53299,12,53329,53355,12,53385,53411,12,53441,53467,12,53497,53523,12,53553,53579,12,53609,53635,12,53665,53691,12,53721,53747,12,53777,53803,12,53833,53859,12,53889,53915,12,53945,53971,12,54001,54027,12,54057,54083,12,54113,54139,12,54169,54195,12,54225,54251,12,54281,54307,12,54337,54363,12,54393,54419,12,54449,54475,12,54505,54531,12,54561,54587,12,54617,54643,12,54673,54699,12,54729,54755,12,54785,54811,12,54841,54867,12,54897,54923,12,54953,54979,12,55009,55035,12,55065,55091,12,55121,55147,12,55177,55203,12,65024,65039,5,65520,65528,4,66422,66426,5,68152,68154,5,69291,69292,5,69633,69633,5,69747,69748,5,69811,69814,5,69826,69826,5,69932,69932,7,70016,70017,5,70079,70080,7,70095,70095,5,70196,70196,5,70367,70367,5,70402,70403,7,70464,70464,5,70487,70487,5,70709,70711,7,70725,70725,7,70833,70834,7,70843,70844,7,70849,70849,7,71090,71093,5,71103,71104,5,71227,71228,7,71339,71339,5,71344,71349,5,71458,71461,5,71727,71735,5,71985,71989,7,71998,71998,5,72002,72002,7,72154,72155,5,72193,72202,5,72251,72254,5,72281,72283,5,72344,72345,5,72766,72766,7,72874,72880,5,72885,72886,5,73023,73029,5,73104,73105,5,73111,73111,5,92912,92916,5,94095,94098,5,113824,113827,4,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,125252,125258,5,127183,127183,14,127340,127343,14,127377,127386,14,127491,127503,14,127548,127551,14,127744,127756,14,127761,127761,14,127769,127769,14,127773,127774,14,127780,127788,14,127796,127797,14,127820,127823,14,127869,127869,14,127894,127895,14,127902,127903,14,127943,127943,14,127947,127950,14,127972,127972,14,127988,127988,14,127992,127994,14,128009,128011,14,128019,128019,14,128023,128041,14,128064,128064,14,128102,128107,14,128174,128181,14,128238,128238,14,128246,128247,14,128254,128254,14,128264,128264,14,128278,128299,14,128329,128330,14,128348,128359,14,128371,128377,14,128392,128393,14,128401,128404,14,128421,128421,14,128433,128434,14,128450,128452,14,128476,128478,14,128483,128483,14,128495,128495,14,128506,128506,14,128519,128520,14,128528,128528,14,128534,128534,14,128538,128538,14,128540,128542,14,128544,128549,14,128552,128555,14,128557,128557,14,128560,128563,14,128565,128565,14,128567,128576,14,128581,128591,14,128641,128642,14,128646,128646,14,128648,128648,14,128650,128651,14,128653,128653,14,128655,128655,14,128657,128659,14,128661,128661,14,128663,128663,14,128665,128666,14,128674,128674,14,128676,128677,14,128679,128685,14,128690,128690,14,128694,128694,14,128697,128702,14,128704,128704,14,128710,128714,14,128716,128716,14,128720,128720,14,128723,128724,14,128726,128727,14,128733,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129008,129008,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129661,129663,14,129667,129670,14,129680,129685,14,129705,129708,14,129712,129718,14,129723,129727,14,129731,129733,14,129744,129750,14,129754,129759,14,129768,129775,14,129783,129791,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2192,2193,1,2250,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3132,3132,5,3137,3140,7,3146,3149,5,3170,3171,5,3202,3203,7,3262,3262,7,3264,3265,7,3267,3268,7,3271,3272,7,3276,3277,5,3298,3299,5,3330,3331,7,3390,3390,5,3393,3396,5,3402,3404,7,3406,3406,1,3426,3427,5,3458,3459,7,3535,3535,5,3538,3540,5,3544,3550,7,3570,3571,7,3635,3635,7,3655,3662,5,3763,3763,7,3784,3789,5,3893,3893,5,3897,3897,5,3953,3966,5,3968,3972,5,3981,3991,5,4038,4038,5,4145,4145,7,4153,4154,5,4157,4158,5,4184,4185,5,4209,4212,5,4228,4228,7,4237,4237,5,4352,4447,8,4520,4607,10,5906,5908,5,5938,5939,5,5970,5971,5,6068,6069,5,6071,6077,5,6086,6086,5,6089,6099,5,6155,6157,5,6159,6159,5,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6862,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7679,5,8204,8204,5,8206,8207,4,8233,8233,4,8252,8252,14,8288,8292,4,8294,8303,4,8413,8416,5,8418,8420,5,8482,8482,14,8596,8601,14,8986,8987,14,9096,9096,14,9193,9196,14,9199,9199,14,9201,9202,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9729,14,9732,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9775,9775,14,9784,9785,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9874,14,9876,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9934,14,9936,9936,14,9938,9938,14,9940,9940,14,9961,9961,14,9963,9967,14,9970,9971,14,9973,9973,14,9975,9977,14,9979,9980,14,9982,9985,14,9987,9988,14,9992,9996,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10083,14,10085,10087,14,10145,10145,14,10175,10175,14,11013,11015,14,11088,11088,14,11503,11505,5,11744,11775,5,12334,12335,5,12349,12349,14,12951,12951,14,42607,42607,5,42612,42621,5,42736,42737,5,43014,43014,5,43043,43044,7,43047,43047,7,43136,43137,7,43204,43205,5,43263,43263,5,43335,43345,5,43360,43388,8,43395,43395,7,43444,43445,7,43450,43451,7,43454,43456,7,43561,43566,5,43569,43570,5,43573,43574,5,43596,43596,5,43644,43644,5,43698,43700,5,43710,43711,5,43755,43755,7,43758,43759,7,43766,43766,5,44005,44005,5,44008,44008,5,44012,44012,7,44032,44032,11,44060,44060,11,44088,44088,11,44116,44116,11,44144,44144,11,44172,44172,11,44200,44200,11,44228,44228,11,44256,44256,11,44284,44284,11,44312,44312,11,44340,44340,11,44368,44368,11,44396,44396,11,44424,44424,11,44452,44452,11,44480,44480,11,44508,44508,11,44536,44536,11,44564,44564,11,44592,44592,11,44620,44620,11,44648,44648,11,44676,44676,11,44704,44704,11,44732,44732,11,44760,44760,11,44788,44788,11,44816,44816,11,44844,44844,11,44872,44872,11,44900,44900,11,44928,44928,11,44956,44956,11,44984,44984,11,45012,45012,11,45040,45040,11,45068,45068,11,45096,45096,11,45124,45124,11,45152,45152,11,45180,45180,11,45208,45208,11,45236,45236,11,45264,45264,11,45292,45292,11,45320,45320,11,45348,45348,11,45376,45376,11,45404,45404,11,45432,45432,11,45460,45460,11,45488,45488,11,45516,45516,11,45544,45544,11,45572,45572,11,45600,45600,11,45628,45628,11,45656,45656,11,45684,45684,11,45712,45712,11,45740,45740,11,45768,45768,11,45796,45796,11,45824,45824,11,45852,45852,11,45880,45880,11,45908,45908,11,45936,45936,11,45964,45964,11,45992,45992,11,46020,46020,11,46048,46048,11,46076,46076,11,46104,46104,11,46132,46132,11,46160,46160,11,46188,46188,11,46216,46216,11,46244,46244,11,46272,46272,11,46300,46300,11,46328,46328,11,46356,46356,11,46384,46384,11,46412,46412,11,46440,46440,11,46468,46468,11,46496,46496,11,46524,46524,11,46552,46552,11,46580,46580,11,46608,46608,11,46636,46636,11,46664,46664,11,46692,46692,11,46720,46720,11,46748,46748,11,46776,46776,11,46804,46804,11,46832,46832,11,46860,46860,11,46888,46888,11,46916,46916,11,46944,46944,11,46972,46972,11,47000,47000,11,47028,47028,11,47056,47056,11,47084,47084,11,47112,47112,11,47140,47140,11,47168,47168,11,47196,47196,11,47224,47224,11,47252,47252,11,47280,47280,11,47308,47308,11,47336,47336,11,47364,47364,11,47392,47392,11,47420,47420,11,47448,47448,11,47476,47476,11,47504,47504,11,47532,47532,11,47560,47560,11,47588,47588,11,47616,47616,11,47644,47644,11,47672,47672,11,47700,47700,11,47728,47728,11,47756,47756,11,47784,47784,11,47812,47812,11,47840,47840,11,47868,47868,11,47896,47896,11,47924,47924,11,47952,47952,11,47980,47980,11,48008,48008,11,48036,48036,11,48064,48064,11,48092,48092,11,48120,48120,11,48148,48148,11,48176,48176,11,48204,48204,11,48232,48232,11,48260,48260,11,48288,48288,11,48316,48316,11,48344,48344,11,48372,48372,11,48400,48400,11,48428,48428,11,48456,48456,11,48484,48484,11,48512,48512,11,48540,48540,11,48568,48568,11,48596,48596,11,48624,48624,11,48652,48652,11,48680,48680,11,48708,48708,11,48736,48736,11,48764,48764,11,48792,48792,11,48820,48820,11,48848,48848,11,48876,48876,11,48904,48904,11,48932,48932,11,48960,48960,11,48988,48988,11,49016,49016,11,49044,49044,11,49072,49072,11,49100,49100,11,49128,49128,11,49156,49156,11,49184,49184,11,49212,49212,11,49240,49240,11,49268,49268,11,49296,49296,11,49324,49324,11,49352,49352,11,49380,49380,11,49408,49408,11,49436,49436,11,49464,49464,11,49492,49492,11,49520,49520,11,49548,49548,11,49576,49576,11,49604,49604,11,49632,49632,11,49660,49660,11,49688,49688,11,49716,49716,11,49744,49744,11,49772,49772,11,49800,49800,11,49828,49828,11,49856,49856,11,49884,49884,11,49912,49912,11,49940,49940,11,49968,49968,11,49996,49996,11,50024,50024,11,50052,50052,11,50080,50080,11,50108,50108,11,50136,50136,11,50164,50164,11,50192,50192,11,50220,50220,11,50248,50248,11,50276,50276,11,50304,50304,11,50332,50332,11,50360,50360,11,50388,50388,11,50416,50416,11,50444,50444,11,50472,50472,11,50500,50500,11,50528,50528,11,50556,50556,11,50584,50584,11,50612,50612,11,50640,50640,11,50668,50668,11,50696,50696,11,50724,50724,11,50752,50752,11,50780,50780,11,50808,50808,11,50836,50836,11,50864,50864,11,50892,50892,11,50920,50920,11,50948,50948,11,50976,50976,11,51004,51004,11,51032,51032,11,51060,51060,11,51088,51088,11,51116,51116,11,51144,51144,11,51172,51172,11,51200,51200,11,51228,51228,11,51256,51256,11,51284,51284,11,51312,51312,11,51340,51340,11,51368,51368,11,51396,51396,11,51424,51424,11,51452,51452,11,51480,51480,11,51508,51508,11,51536,51536,11,51564,51564,11,51592,51592,11,51620,51620,11,51648,51648,11,51676,51676,11,51704,51704,11,51732,51732,11,51760,51760,11,51788,51788,11,51816,51816,11,51844,51844,11,51872,51872,11,51900,51900,11,51928,51928,11,51956,51956,11,51984,51984,11,52012,52012,11,52040,52040,11,52068,52068,11,52096,52096,11,52124,52124,11,52152,52152,11,52180,52180,11,52208,52208,11,52236,52236,11,52264,52264,11,52292,52292,11,52320,52320,11,52348,52348,11,52376,52376,11,52404,52404,11,52432,52432,11,52460,52460,11,52488,52488,11,52516,52516,11,52544,52544,11,52572,52572,11,52600,52600,11,52628,52628,11,52656,52656,11,52684,52684,11,52712,52712,11,52740,52740,11,52768,52768,11,52796,52796,11,52824,52824,11,52852,52852,11,52880,52880,11,52908,52908,11,52936,52936,11,52964,52964,11,52992,52992,11,53020,53020,11,53048,53048,11,53076,53076,11,53104,53104,11,53132,53132,11,53160,53160,11,53188,53188,11,53216,53216,11,53244,53244,11,53272,53272,11,53300,53300,11,53328,53328,11,53356,53356,11,53384,53384,11,53412,53412,11,53440,53440,11,53468,53468,11,53496,53496,11,53524,53524,11,53552,53552,11,53580,53580,11,53608,53608,11,53636,53636,11,53664,53664,11,53692,53692,11,53720,53720,11,53748,53748,11,53776,53776,11,53804,53804,11,53832,53832,11,53860,53860,11,53888,53888,11,53916,53916,11,53944,53944,11,53972,53972,11,54000,54000,11,54028,54028,11,54056,54056,11,54084,54084,11,54112,54112,11,54140,54140,11,54168,54168,11,54196,54196,11,54224,54224,11,54252,54252,11,54280,54280,11,54308,54308,11,54336,54336,11,54364,54364,11,54392,54392,11,54420,54420,11,54448,54448,11,54476,54476,11,54504,54504,11,54532,54532,11,54560,54560,11,54588,54588,11,54616,54616,11,54644,54644,11,54672,54672,11,54700,54700,11,54728,54728,11,54756,54756,11,54784,54784,11,54812,54812,11,54840,54840,11,54868,54868,11,54896,54896,11,54924,54924,11,54952,54952,11,54980,54980,11,55008,55008,11,55036,55036,11,55064,55064,11,55092,55092,11,55120,55120,11,55148,55148,11,55176,55176,11,55216,55238,9,64286,64286,5,65056,65071,5,65438,65439,5,65529,65531,4,66272,66272,5,68097,68099,5,68108,68111,5,68159,68159,5,68900,68903,5,69446,69456,5,69632,69632,7,69634,69634,7,69744,69744,5,69759,69761,5,69808,69810,7,69815,69816,7,69821,69821,1,69837,69837,1,69927,69931,5,69933,69940,5,70003,70003,5,70018,70018,7,70070,70078,5,70082,70083,1,70094,70094,7,70188,70190,7,70194,70195,7,70197,70197,7,70206,70206,5,70368,70370,7,70400,70401,5,70459,70460,5,70463,70463,7,70465,70468,7,70475,70477,7,70498,70499,7,70512,70516,5,70712,70719,5,70722,70724,5,70726,70726,5,70832,70832,5,70835,70840,5,70842,70842,5,70845,70845,5,70847,70848,5,70850,70851,5,71088,71089,7,71096,71099,7,71102,71102,7,71132,71133,5,71219,71226,5,71229,71229,5,71231,71232,5,71340,71340,7,71342,71343,7,71350,71350,7,71453,71455,5,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,118528,118573,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123566,123566,5,125136,125142,5,126976,126979,14,126981,127182,14,127184,127231,14,127279,127279,14,127344,127345,14,127374,127374,14,127405,127461,14,127489,127490,14,127514,127514,14,127538,127546,14,127561,127567,14,127570,127743,14,127757,127758,14,127760,127760,14,127762,127762,14,127766,127768,14,127770,127770,14,127772,127772,14,127775,127776,14,127778,127779,14,127789,127791,14,127794,127795,14,127798,127798,14,127819,127819,14,127824,127824,14,127868,127868,14,127870,127871,14,127892,127893,14,127896,127896,14,127900,127901,14,127904,127940,14,127942,127942,14,127944,127944,14,127946,127946,14,127951,127955,14,127968,127971,14,127973,127984,14,127987,127987,14,127989,127989,14,127991,127991,14,127995,127999,5,128008,128008,14,128012,128014,14,128017,128018,14,128020,128020,14,128022,128022,14,128042,128042,14,128063,128063,14,128065,128065,14,128101,128101,14,128108,128109,14,128173,128173,14,128182,128183,14,128236,128237,14,128239,128239,14,128245,128245,14,128248,128248,14,128253,128253,14,128255,128258,14,128260,128263,14,128265,128265,14,128277,128277,14,128300,128301,14,128326,128328,14,128331,128334,14,128336,128347,14,128360,128366,14,128369,128370,14,128378,128378,14,128391,128391,14,128394,128397,14,128400,128400,14,128405,128406,14,128420,128420,14,128422,128423,14,128425,128432,14,128435,128443,14,128445,128449,14,128453,128464,14,128468,128475,14,128479,128480,14,128482,128482,14,128484,128487,14,128489,128494,14,128496,128498,14,128500,128505,14,128507,128511,14,128513,128518,14,128521,128525,14,128527,128527,14,128529,128529,14,128533,128533,14,128535,128535,14,128537,128537,14]');\n}\n//#endregion\n/**\n * Computes the offset after performing a left delete on the given string,\n * while considering unicode grapheme/emoji rules.\n*/\nfunction getLeftDeleteOffset(offset, str) {\n    if (offset === 0) {\n        return 0;\n    }\n    // Try to delete emoji part.\n    const emojiOffset = getOffsetBeforeLastEmojiComponent(offset, str);\n    if (emojiOffset !== undefined) {\n        return emojiOffset;\n    }\n    // Otherwise, just skip a single code point.\n    const iterator = new CodePointIterator(str, offset);\n    iterator.prevCodePoint();\n    return iterator.offset;\n}\nfunction getOffsetBeforeLastEmojiComponent(initialOffset, str) {\n    // See https://www.unicode.org/reports/tr51/tr51-14.html#EBNF_and_Regex for the\n    // structure of emojis.\n    const iterator = new CodePointIterator(str, initialOffset);\n    let codePoint = iterator.prevCodePoint();\n    // Skip modifiers\n    while ((isEmojiModifier(codePoint) || codePoint === 65039 /* CodePoint.emojiVariantSelector */ || codePoint === 8419 /* CodePoint.enclosingKeyCap */)) {\n        if (iterator.offset === 0) {\n            // Cannot skip modifier, no preceding emoji base.\n            return undefined;\n        }\n        codePoint = iterator.prevCodePoint();\n    }\n    // Expect base emoji\n    if (!isEmojiImprecise(codePoint)) {\n        // Unexpected code point, not a valid emoji.\n        return undefined;\n    }\n    let resultOffset = iterator.offset;\n    if (resultOffset > 0) {\n        // Skip optional ZWJ code points that combine multiple emojis.\n        // In theory, we should check if that ZWJ actually combines multiple emojis\n        // to prevent deleting ZWJs in situations we didn't account for.\n        const optionalZwjCodePoint = iterator.prevCodePoint();\n        if (optionalZwjCodePoint === 8205 /* CodePoint.zwj */) {\n            resultOffset = iterator.offset;\n        }\n    }\n    return resultOffset;\n}\nfunction isEmojiModifier(codePoint) {\n    return 0x1F3FB <= codePoint && codePoint <= 0x1F3FF;\n}\nconst noBreakWhitespace = '\\xa0';\nclass AmbiguousCharacters {\n    static { this.ambiguousCharacterData = new Lazy(() => {\n        // Generated using https://github.com/hediet/vscode-unicode-data\n        // Stored as key1, value1, key2, value2, ...\n        return JSON.parse('{\\\"_common\\\":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,1523,96,8242,96,1370,96,8175,96,65344,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,118002,50,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,118003,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,118004,52,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,118005,53,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,118006,54,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,118007,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,118008,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,118009,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,117974,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,117975,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71913,67,71922,67,65315,67,8557,67,8450,67,8493,67,117976,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,117977,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,117978,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,117979,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,117980,71,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,117981,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,117983,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,117984,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,118001,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,117982,108,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,117985,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,117986,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,117987,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,118000,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,117988,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,117989,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,117990,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,117991,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,117992,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,117993,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,117994,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,117995,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71910,87,71919,87,117996,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,117997,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,117998,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,71909,90,66293,90,65338,90,8484,90,8488,90,117999,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65283,35,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125,119846,109],\\\"_default\\\":[160,32,8211,45,65374,126,8218,44,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41,65292,44,65297,49,65307,59,65311,63],\\\"cs\\\":[65374,126,8218,44,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41,65292,44,65297,49,65307,59,65311,63],\\\"de\\\":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41,65292,44,65297,49,65307,59,65311,63],\\\"es\\\":[8211,45,65374,126,8218,44,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41,65292,44,65297,49,65307,59,65311,63],\\\"fr\\\":[65374,126,8218,44,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41,65292,44,65297,49,65307,59,65311,63],\\\"it\\\":[160,32,8211,45,65374,126,8218,44,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41,65292,44,65297,49,65307,59,65311,63],\\\"ja\\\":[8211,45,8218,44,65281,33,8216,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65292,44,65297,49,65307,59],\\\"ko\\\":[8211,45,65374,126,8218,44,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41,65292,44,65297,49,65307,59,65311,63],\\\"pl\\\":[65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41,65292,44,65297,49,65307,59,65311,63],\\\"pt-BR\\\":[65374,126,8218,44,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41,65292,44,65297,49,65307,59,65311,63],\\\"qps-ploc\\\":[160,32,8211,45,65374,126,8218,44,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41,65292,44,65297,49,65307,59,65311,63],\\\"ru\\\":[65374,126,8218,44,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65288,40,65289,41,65292,44,65297,49,65307,59,65311,63],\\\"tr\\\":[160,32,8211,45,65374,126,8218,44,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41,65292,44,65297,49,65307,59,65311,63],\\\"zh-hans\\\":[160,32,65374,126,8218,44,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65297,49],\\\"zh-hant\\\":[8211,45,65374,126,8218,44,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89]}');\n    }); }\n    static { this.cache = new LRUCachedFunction({ getCacheKey: JSON.stringify }, (locales) => {\n        function arrayToMap(arr) {\n            const result = new Map();\n            for (let i = 0; i < arr.length; i += 2) {\n                result.set(arr[i], arr[i + 1]);\n            }\n            return result;\n        }\n        function mergeMaps(map1, map2) {\n            const result = new Map(map1);\n            for (const [key, value] of map2) {\n                result.set(key, value);\n            }\n            return result;\n        }\n        function intersectMaps(map1, map2) {\n            if (!map1) {\n                return map2;\n            }\n            const result = new Map();\n            for (const [key, value] of map1) {\n                if (map2.has(key)) {\n                    result.set(key, value);\n                }\n            }\n            return result;\n        }\n        const data = this.ambiguousCharacterData.value;\n        let filteredLocales = locales.filter((l) => !l.startsWith('_') && Object.hasOwn(data, l));\n        if (filteredLocales.length === 0) {\n            filteredLocales = ['_default'];\n        }\n        let languageSpecificMap = undefined;\n        for (const locale of filteredLocales) {\n            const map = arrayToMap(data[locale]);\n            languageSpecificMap = intersectMaps(languageSpecificMap, map);\n        }\n        const commonMap = arrayToMap(data['_common']);\n        const map = mergeMaps(commonMap, languageSpecificMap);\n        return new AmbiguousCharacters(map);\n    }); }\n    static getInstance(locales) {\n        return AmbiguousCharacters.cache.get(Array.from(locales));\n    }\n    static { this._locales = new Lazy(() => Object.keys(AmbiguousCharacters.ambiguousCharacterData.value).filter((k) => !k.startsWith('_'))); }\n    static getLocales() {\n        return AmbiguousCharacters._locales.value;\n    }\n    constructor(confusableDictionary) {\n        this.confusableDictionary = confusableDictionary;\n    }\n    isAmbiguous(codePoint) {\n        return this.confusableDictionary.has(codePoint);\n    }\n    /**\n     * Returns the non basic ASCII code point that the given code point can be confused,\n     * or undefined if such code point does note exist.\n     */\n    getPrimaryConfusable(codePoint) {\n        return this.confusableDictionary.get(codePoint);\n    }\n    getConfusableCodePoints() {\n        return new Set(this.confusableDictionary.keys());\n    }\n}\nclass InvisibleCharacters {\n    static getRawData() {\n        // Generated using https://github.com/hediet/vscode-unicode-data\n        return JSON.parse('{\\\"_common\\\":[11,12,13,127,847,1564,4447,4448,6068,6069,6155,6156,6157,6158,7355,7356,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8204,8205,8206,8207,8234,8235,8236,8237,8238,8239,8287,8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,10240,12644,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65279,65440,65520,65521,65522,65523,65524,65525,65526,65527,65528,65532,78844,119155,119156,119157,119158,119159,119160,119161,119162,917504,917505,917506,917507,917508,917509,917510,917511,917512,917513,917514,917515,917516,917517,917518,917519,917520,917521,917522,917523,917524,917525,917526,917527,917528,917529,917530,917531,917532,917533,917534,917535,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999],\\\"cs\\\":[173,8203,12288],\\\"de\\\":[173,8203,12288],\\\"es\\\":[8203,12288],\\\"fr\\\":[173,8203,12288],\\\"it\\\":[160,173,12288],\\\"ja\\\":[173],\\\"ko\\\":[173,12288],\\\"pl\\\":[173,8203,12288],\\\"pt-BR\\\":[173,8203,12288],\\\"qps-ploc\\\":[160,173,8203,12288],\\\"ru\\\":[173,12288],\\\"tr\\\":[160,173,8203,12288],\\\"zh-hans\\\":[160,173,8203,12288],\\\"zh-hant\\\":[173,12288]}');\n    }\n    static { this._data = undefined; }\n    static getData() {\n        if (!this._data) {\n            this._data = new Set([...Object.values(InvisibleCharacters.getRawData())].flat());\n        }\n        return this._data;\n    }\n    static isInvisibleCharacter(codePoint) {\n        return InvisibleCharacters.getData().has(codePoint);\n    }\n    static get codePoints() {\n        return InvisibleCharacters.getData();\n    }\n}\n\nexport { AmbiguousCharacters, CodePointIterator, GraphemeIterator, InvisibleCharacters, UNUSUAL_LINE_TERMINATORS, UTF8_BOM_CHARACTER, commonPrefixLength, commonSuffixLength, compare, compareIgnoreCase, compareSubstring, compareSubstringIgnoreCase, computeCodePoint, containsRTL, containsUnusualLineTerminators, containsUppercaseCharacter, convertSimple2RegExpPattern, createRegExp, endsWithIgnoreCase, equalsIgnoreCase, escape, escapeRegExpCharacters, firstNonWhitespaceIndex, format, getCharContainingOffset, getLeadingWhitespace, getLeftDeleteOffset, getNextCodePoint, htmlAttributeEncodeValue, isAsciiDigit, isBasicASCII, isEmojiImprecise, isFalsyOrWhitespace, isFullWidthCharacter, isHighSurrogate, isLowSurrogate, isLowerAsciiLetter, isUpperAsciiLetter, lastNonWhitespaceIndex, ltrim, nextCharLength, noBreakWhitespace, prevCharLength, regExpLeadsToEndlessLoop, rtrim, singleLetterHash, splitLines, startsWithIgnoreCase, startsWithUTF8BOM, trim };\n","import { isWindows, isMacintosh } from './platform.js';\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 *--------------------------------------------------------------------------------------------*/\nlet safeProcess;\n// Native sandbox environment\nconst vscodeGlobal = globalThis.vscode;\nif (typeof vscodeGlobal !== 'undefined' && typeof vscodeGlobal.process !== 'undefined') {\n    const sandboxProcess = vscodeGlobal.process;\n    safeProcess = {\n        get platform() { return sandboxProcess.platform; },\n        get arch() { return sandboxProcess.arch; },\n        get env() { return sandboxProcess.env; },\n        cwd() { return sandboxProcess.cwd(); }\n    };\n}\n// Native node.js environment\nelse if (typeof process !== 'undefined' && typeof process?.versions?.node === 'string') {\n    safeProcess = {\n        get platform() { return process.platform; },\n        get arch() { return process.arch; },\n        get env() { return process.env; },\n        cwd() { return process.env['VSCODE_CWD'] || process.cwd(); }\n    };\n}\n// Web environment\nelse {\n    safeProcess = {\n        // Supported\n        get platform() { return isWindows ? 'win32' : isMacintosh ? 'darwin' : 'linux'; },\n        get arch() { return undefined; /* arch is undefined in web */ },\n        // Unsupported\n        get env() { return {}; },\n        cwd() { return '/'; }\n    };\n}\n/**\n * Provides safe access to the `cwd` property in node.js, sandboxed or web\n * environments.\n *\n * Note: in web, this property is hardcoded to be `/`.\n *\n * @skipMangle\n */\nconst cwd = safeProcess.cwd;\n/**\n * Provides safe access to the `env` property in node.js, sandboxed or web\n * environments.\n *\n * Note: in web, this property is hardcoded to be `{}`.\n */\nconst env = safeProcess.env;\n/**\n * Provides safe access to the `platform` property in node.js, sandboxed or web\n * environments.\n */\nconst platform = safeProcess.platform;\n\nexport { cwd, env, platform };\n","import { cwd, env, platform } from './process.js';\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// NOTE: VSCode's copy of nodejs path library to be usable in common (non-node) namespace\n// Copied from: https://github.com/nodejs/node/commits/v22.15.0/lib/path.js\n// Excluding: the change that adds primordials\n// (https://github.com/nodejs/node/commit/187a862d221dec42fa9a5c4214e7034d9092792f and others)\n// Excluding: the change that adds glob matching\n// (https://github.com/nodejs/node/commit/57b8b8e18e5e2007114c63b71bf0baedc01936a6)\n/**\n * Copyright Joyent, Inc. and other Node contributors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to permit\n * persons to whom the Software is furnished to do so, subject to the\n * following conditions:\n *\n * The above copyright notice and this permission notice shall be included\n * in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n * USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\nconst CHAR_UPPERCASE_A = 65; /* A */\nconst CHAR_LOWERCASE_A = 97; /* a */\nconst CHAR_UPPERCASE_Z = 90; /* Z */\nconst CHAR_LOWERCASE_Z = 122; /* z */\nconst CHAR_DOT = 46; /* . */\nconst CHAR_FORWARD_SLASH = 47; /* / */\nconst CHAR_BACKWARD_SLASH = 92; /* \\ */\nconst CHAR_COLON = 58; /* : */\nconst CHAR_QUESTION_MARK = 63; /* ? */\nclass ErrorInvalidArgType extends Error {\n    constructor(name, expected, actual) {\n        // determiner: 'must be' or 'must not be'\n        let determiner;\n        if (typeof expected === 'string' && expected.indexOf('not ') === 0) {\n            determiner = 'must not be';\n            expected = expected.replace(/^not /, '');\n        }\n        else {\n            determiner = 'must be';\n        }\n        const type = name.indexOf('.') !== -1 ? 'property' : 'argument';\n        let msg = `The \"${name}\" ${type} ${determiner} of type ${expected}`;\n        msg += `. Received type ${typeof actual}`;\n        super(msg);\n        this.code = 'ERR_INVALID_ARG_TYPE';\n    }\n}\nfunction validateObject(pathObject, name) {\n    if (pathObject === null || typeof pathObject !== 'object') {\n        throw new ErrorInvalidArgType(name, 'Object', pathObject);\n    }\n}\nfunction validateString(value, name) {\n    if (typeof value !== 'string') {\n        throw new ErrorInvalidArgType(name, 'string', value);\n    }\n}\nconst platformIsWin32 = (platform === 'win32');\nfunction isPathSeparator(code) {\n    return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n}\nfunction isPosixPathSeparator(code) {\n    return code === CHAR_FORWARD_SLASH;\n}\nfunction isWindowsDeviceRoot(code) {\n    return (code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z) ||\n        (code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z);\n}\n// Resolves . and .. elements in a path with directory names\nfunction normalizeString(path, allowAboveRoot, separator, isPathSeparator) {\n    let res = '';\n    let lastSegmentLength = 0;\n    let lastSlash = -1;\n    let dots = 0;\n    let code = 0;\n    for (let i = 0; i <= path.length; ++i) {\n        if (i < path.length) {\n            code = path.charCodeAt(i);\n        }\n        else if (isPathSeparator(code)) {\n            break;\n        }\n        else {\n            code = CHAR_FORWARD_SLASH;\n        }\n        if (isPathSeparator(code)) {\n            if (lastSlash === i - 1 || dots === 1) ;\n            else if (dots === 2) {\n                if (res.length < 2 || lastSegmentLength !== 2 ||\n                    res.charCodeAt(res.length - 1) !== CHAR_DOT ||\n                    res.charCodeAt(res.length - 2) !== CHAR_DOT) {\n                    if (res.length > 2) {\n                        const lastSlashIndex = res.lastIndexOf(separator);\n                        if (lastSlashIndex === -1) {\n                            res = '';\n                            lastSegmentLength = 0;\n                        }\n                        else {\n                            res = res.slice(0, lastSlashIndex);\n                            lastSegmentLength = res.length - 1 - res.lastIndexOf(separator);\n                        }\n                        lastSlash = i;\n                        dots = 0;\n                        continue;\n                    }\n                    else if (res.length !== 0) {\n                        res = '';\n                        lastSegmentLength = 0;\n                        lastSlash = i;\n                        dots = 0;\n                        continue;\n                    }\n                }\n                if (allowAboveRoot) {\n                    res += res.length > 0 ? `${separator}..` : '..';\n                    lastSegmentLength = 2;\n                }\n            }\n            else {\n                if (res.length > 0) {\n                    res += `${separator}${path.slice(lastSlash + 1, i)}`;\n                }\n                else {\n                    res = path.slice(lastSlash + 1, i);\n                }\n                lastSegmentLength = i - lastSlash - 1;\n            }\n            lastSlash = i;\n            dots = 0;\n        }\n        else if (code === CHAR_DOT && dots !== -1) {\n            ++dots;\n        }\n        else {\n            dots = -1;\n        }\n    }\n    return res;\n}\nfunction formatExt(ext) {\n    return ext ? `${ext[0] === '.' ? '' : '.'}${ext}` : '';\n}\nfunction _format(sep, pathObject) {\n    validateObject(pathObject, 'pathObject');\n    const dir = pathObject.dir || pathObject.root;\n    const base = pathObject.base ||\n        `${pathObject.name || ''}${formatExt(pathObject.ext)}`;\n    if (!dir) {\n        return base;\n    }\n    return dir === pathObject.root ? `${dir}${base}` : `${dir}${sep}${base}`;\n}\nconst win32 = {\n    // path.resolve([from ...], to)\n    resolve(...pathSegments) {\n        let resolvedDevice = '';\n        let resolvedTail = '';\n        let resolvedAbsolute = false;\n        for (let i = pathSegments.length - 1; i >= -1; i--) {\n            let path;\n            if (i >= 0) {\n                path = pathSegments[i];\n                validateString(path, `paths[${i}]`);\n                // Skip empty entries\n                if (path.length === 0) {\n                    continue;\n                }\n            }\n            else if (resolvedDevice.length === 0) {\n                path = cwd();\n            }\n            else {\n                // Windows has the concept of drive-specific current working\n                // directories. If we've resolved a drive letter but not yet an\n                // absolute path, get cwd for that drive, or the process cwd if\n                // the drive cwd is not available. We're sure the device is not\n                // a UNC path at this points, because UNC paths are always absolute.\n                path = env[`=${resolvedDevice}`] || cwd();\n                // Verify that a cwd was found and that it actually points\n                // to our drive. If not, default to the drive's root.\n                if (path === undefined ||\n                    (path.slice(0, 2).toLowerCase() !== resolvedDevice.toLowerCase() &&\n                        path.charCodeAt(2) === CHAR_BACKWARD_SLASH)) {\n                    path = `${resolvedDevice}\\\\`;\n                }\n            }\n            const len = path.length;\n            let rootEnd = 0;\n            let device = '';\n            let isAbsolute = false;\n            const code = path.charCodeAt(0);\n            // Try to match a root\n            if (len === 1) {\n                if (isPathSeparator(code)) {\n                    // `path` contains just a path separator\n                    rootEnd = 1;\n                    isAbsolute = true;\n                }\n            }\n            else if (isPathSeparator(code)) {\n                // Possible UNC root\n                // If we started with a separator, we know we at least have an\n                // absolute path of some kind (UNC or otherwise)\n                isAbsolute = true;\n                if (isPathSeparator(path.charCodeAt(1))) {\n                    // Matched double path separator at beginning\n                    let j = 2;\n                    let last = j;\n                    // Match 1 or more non-path separators\n                    while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n                        j++;\n                    }\n                    if (j < len && j !== last) {\n                        const firstPart = path.slice(last, j);\n                        // Matched!\n                        last = j;\n                        // Match 1 or more path separators\n                        while (j < len && isPathSeparator(path.charCodeAt(j))) {\n                            j++;\n                        }\n                        if (j < len && j !== last) {\n                            // Matched!\n                            last = j;\n                            // Match 1 or more non-path separators\n                            while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n                                j++;\n                            }\n                            if (j === len || j !== last) {\n                                // We matched a UNC root\n                                device = `\\\\\\\\${firstPart}\\\\${path.slice(last, j)}`;\n                                rootEnd = j;\n                            }\n                        }\n                    }\n                }\n                else {\n                    rootEnd = 1;\n                }\n            }\n            else if (isWindowsDeviceRoot(code) &&\n                path.charCodeAt(1) === CHAR_COLON) {\n                // Possible device root\n                device = path.slice(0, 2);\n                rootEnd = 2;\n                if (len > 2 && isPathSeparator(path.charCodeAt(2))) {\n                    // Treat separator following drive name as an absolute path\n                    // indicator\n                    isAbsolute = true;\n                    rootEnd = 3;\n                }\n            }\n            if (device.length > 0) {\n                if (resolvedDevice.length > 0) {\n                    if (device.toLowerCase() !== resolvedDevice.toLowerCase()) {\n                        // This path points to another device so it is not applicable\n                        continue;\n                    }\n                }\n                else {\n                    resolvedDevice = device;\n                }\n            }\n            if (resolvedAbsolute) {\n                if (resolvedDevice.length > 0) {\n                    break;\n                }\n            }\n            else {\n                resolvedTail = `${path.slice(rootEnd)}\\\\${resolvedTail}`;\n                resolvedAbsolute = isAbsolute;\n                if (isAbsolute && resolvedDevice.length > 0) {\n                    break;\n                }\n            }\n        }\n        // At this point the path should be resolved to a full absolute path,\n        // but handle relative paths to be safe (might happen when process.cwd()\n        // fails)\n        // Normalize the tail path\n        resolvedTail = normalizeString(resolvedTail, !resolvedAbsolute, '\\\\', isPathSeparator);\n        return resolvedAbsolute ?\n            `${resolvedDevice}\\\\${resolvedTail}` :\n            `${resolvedDevice}${resolvedTail}` || '.';\n    },\n    normalize(path) {\n        validateString(path, 'path');\n        const len = path.length;\n        if (len === 0) {\n            return '.';\n        }\n        let rootEnd = 0;\n        let device;\n        let isAbsolute = false;\n        const code = path.charCodeAt(0);\n        // Try to match a root\n        if (len === 1) {\n            // `path` contains just a single char, exit early to avoid\n            // unnecessary work\n            return isPosixPathSeparator(code) ? '\\\\' : path;\n        }\n        if (isPathSeparator(code)) {\n            // Possible UNC root\n            // If we started with a separator, we know we at least have an absolute\n            // path of some kind (UNC or otherwise)\n            isAbsolute = true;\n            if (isPathSeparator(path.charCodeAt(1))) {\n                // Matched double path separator at beginning\n                let j = 2;\n                let last = j;\n                // Match 1 or more non-path separators\n                while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n                    j++;\n                }\n                if (j < len && j !== last) {\n                    const firstPart = path.slice(last, j);\n                    // Matched!\n                    last = j;\n                    // Match 1 or more path separators\n                    while (j < len && isPathSeparator(path.charCodeAt(j))) {\n                        j++;\n                    }\n                    if (j < len && j !== last) {\n                        // Matched!\n                        last = j;\n                        // Match 1 or more non-path separators\n                        while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n                            j++;\n                        }\n                        if (j === len) {\n                            // We matched a UNC root only\n                            // Return the normalized version of the UNC root since there\n                            // is nothing left to process\n                            return `\\\\\\\\${firstPart}\\\\${path.slice(last)}\\\\`;\n                        }\n                        if (j !== last) {\n                            // We matched a UNC root with leftovers\n                            device = `\\\\\\\\${firstPart}\\\\${path.slice(last, j)}`;\n                            rootEnd = j;\n                        }\n                    }\n                }\n            }\n            else {\n                rootEnd = 1;\n            }\n        }\n        else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) {\n            // Possible device root\n            device = path.slice(0, 2);\n            rootEnd = 2;\n            if (len > 2 && isPathSeparator(path.charCodeAt(2))) {\n                // Treat separator following drive name as an absolute path\n                // indicator\n                isAbsolute = true;\n                rootEnd = 3;\n            }\n        }\n        let tail = rootEnd < len ?\n            normalizeString(path.slice(rootEnd), !isAbsolute, '\\\\', isPathSeparator) :\n            '';\n        if (tail.length === 0 && !isAbsolute) {\n            tail = '.';\n        }\n        if (tail.length > 0 && isPathSeparator(path.charCodeAt(len - 1))) {\n            tail += '\\\\';\n        }\n        if (!isAbsolute && device === undefined && path.includes(':')) {\n            // If the original path was not absolute and if we have not been able to\n            // resolve it relative to a particular device, we need to ensure that the\n            // `tail` has not become something that Windows might interpret as an\n            // absolute path. See CVE-2024-36139.\n            if (tail.length >= 2 &&\n                isWindowsDeviceRoot(tail.charCodeAt(0)) &&\n                tail.charCodeAt(1) === CHAR_COLON) {\n                return `.\\\\${tail}`;\n            }\n            let index = path.indexOf(':');\n            do {\n                if (index === len - 1 || isPathSeparator(path.charCodeAt(index + 1))) {\n                    return `.\\\\${tail}`;\n                }\n            } while ((index = path.indexOf(':', index + 1)) !== -1);\n        }\n        if (device === undefined) {\n            return isAbsolute ? `\\\\${tail}` : tail;\n        }\n        return isAbsolute ? `${device}\\\\${tail}` : `${device}${tail}`;\n    },\n    isAbsolute(path) {\n        validateString(path, 'path');\n        const len = path.length;\n        if (len === 0) {\n            return false;\n        }\n        const code = path.charCodeAt(0);\n        return isPathSeparator(code) ||\n            // Possible device root\n            (len > 2 &&\n                isWindowsDeviceRoot(code) &&\n                path.charCodeAt(1) === CHAR_COLON &&\n                isPathSeparator(path.charCodeAt(2)));\n    },\n    join(...paths) {\n        if (paths.length === 0) {\n            return '.';\n        }\n        let joined;\n        let firstPart;\n        for (let i = 0; i < paths.length; ++i) {\n            const arg = paths[i];\n            validateString(arg, 'path');\n            if (arg.length > 0) {\n                if (joined === undefined) {\n                    joined = firstPart = arg;\n                }\n                else {\n                    joined += `\\\\${arg}`;\n                }\n            }\n        }\n        if (joined === undefined) {\n            return '.';\n        }\n        // Make sure that the joined path doesn't start with two slashes, because\n        // normalize() will mistake it for a UNC path then.\n        //\n        // This step is skipped when it is very clear that the user actually\n        // intended to point at a UNC path. This is assumed when the first\n        // non-empty string arguments starts with exactly two slashes followed by\n        // at least one more non-slash character.\n        //\n        // Note that for normalize() to treat a path as a UNC path it needs to\n        // have at least 2 components, so we don't filter for that here.\n        // This means that the user can use join to construct UNC paths from\n        // a server name and a share name; for example:\n        //   path.join('//server', 'share') -> '\\\\\\\\server\\\\share\\\\')\n        let needsReplace = true;\n        let slashCount = 0;\n        if (typeof firstPart === 'string' && isPathSeparator(firstPart.charCodeAt(0))) {\n            ++slashCount;\n            const firstLen = firstPart.length;\n            if (firstLen > 1 && isPathSeparator(firstPart.charCodeAt(1))) {\n                ++slashCount;\n                if (firstLen > 2) {\n                    if (isPathSeparator(firstPart.charCodeAt(2))) {\n                        ++slashCount;\n                    }\n                    else {\n                        // We matched a UNC path in the first part\n                        needsReplace = false;\n                    }\n                }\n            }\n        }\n        if (needsReplace) {\n            // Find any more consecutive slashes we need to replace\n            while (slashCount < joined.length &&\n                isPathSeparator(joined.charCodeAt(slashCount))) {\n                slashCount++;\n            }\n            // Replace the slashes if needed\n            if (slashCount >= 2) {\n                joined = `\\\\${joined.slice(slashCount)}`;\n            }\n        }\n        return win32.normalize(joined);\n    },\n    // It will solve the relative path from `from` to `to`, for instance:\n    //  from = 'C:\\\\orandea\\\\test\\\\aaa'\n    //  to = 'C:\\\\orandea\\\\impl\\\\bbb'\n    // The output of the function should be: '..\\\\..\\\\impl\\\\bbb'\n    relative(from, to) {\n        validateString(from, 'from');\n        validateString(to, 'to');\n        if (from === to) {\n            return '';\n        }\n        const fromOrig = win32.resolve(from);\n        const toOrig = win32.resolve(to);\n        if (fromOrig === toOrig) {\n            return '';\n        }\n        from = fromOrig.toLowerCase();\n        to = toOrig.toLowerCase();\n        if (from === to) {\n            return '';\n        }\n        if (fromOrig.length !== from.length || toOrig.length !== to.length) {\n            const fromSplit = fromOrig.split('\\\\');\n            const toSplit = toOrig.split('\\\\');\n            if (fromSplit[fromSplit.length - 1] === '') {\n                fromSplit.pop();\n            }\n            if (toSplit[toSplit.length - 1] === '') {\n                toSplit.pop();\n            }\n            const fromLen = fromSplit.length;\n            const toLen = toSplit.length;\n            const length = fromLen < toLen ? fromLen : toLen;\n            let i;\n            for (i = 0; i < length; i++) {\n                if (fromSplit[i].toLowerCase() !== toSplit[i].toLowerCase()) {\n                    break;\n                }\n            }\n            if (i === 0) {\n                return toOrig;\n            }\n            else if (i === length) {\n                if (toLen > length) {\n                    return toSplit.slice(i).join('\\\\');\n                }\n                if (fromLen > length) {\n                    return '..\\\\'.repeat(fromLen - 1 - i) + '..';\n                }\n                return '';\n            }\n            return '..\\\\'.repeat(fromLen - i) + toSplit.slice(i).join('\\\\');\n        }\n        // Trim any leading backslashes\n        let fromStart = 0;\n        while (fromStart < from.length &&\n            from.charCodeAt(fromStart) === CHAR_BACKWARD_SLASH) {\n            fromStart++;\n        }\n        // Trim trailing backslashes (applicable to UNC paths only)\n        let fromEnd = from.length;\n        while (fromEnd - 1 > fromStart &&\n            from.charCodeAt(fromEnd - 1) === CHAR_BACKWARD_SLASH) {\n            fromEnd--;\n        }\n        const fromLen = fromEnd - fromStart;\n        // Trim any leading backslashes\n        let toStart = 0;\n        while (toStart < to.length &&\n            to.charCodeAt(toStart) === CHAR_BACKWARD_SLASH) {\n            toStart++;\n        }\n        // Trim trailing backslashes (applicable to UNC paths only)\n        let toEnd = to.length;\n        while (toEnd - 1 > toStart &&\n            to.charCodeAt(toEnd - 1) === CHAR_BACKWARD_SLASH) {\n            toEnd--;\n        }\n        const toLen = toEnd - toStart;\n        // Compare paths to find the longest common path from root\n        const length = fromLen < toLen ? fromLen : toLen;\n        let lastCommonSep = -1;\n        let i = 0;\n        for (; i < length; i++) {\n            const fromCode = from.charCodeAt(fromStart + i);\n            if (fromCode !== to.charCodeAt(toStart + i)) {\n                break;\n            }\n            else if (fromCode === CHAR_BACKWARD_SLASH) {\n                lastCommonSep = i;\n            }\n        }\n        // We found a mismatch before the first common path separator was seen, so\n        // return the original `to`.\n        if (i !== length) {\n            if (lastCommonSep === -1) {\n                return toOrig;\n            }\n        }\n        else {\n            if (toLen > length) {\n                if (to.charCodeAt(toStart + i) === CHAR_BACKWARD_SLASH) {\n                    // We get here if `from` is the exact base path for `to`.\n                    // For example: from='C:\\\\foo\\\\bar'; to='C:\\\\foo\\\\bar\\\\baz'\n                    return toOrig.slice(toStart + i + 1);\n                }\n                if (i === 2) {\n                    // We get here if `from` is the device root.\n                    // For example: from='C:\\\\'; to='C:\\\\foo'\n                    return toOrig.slice(toStart + i);\n                }\n            }\n            if (fromLen > length) {\n                if (from.charCodeAt(fromStart + i) === CHAR_BACKWARD_SLASH) {\n                    // We get here if `to` is the exact base path for `from`.\n                    // For example: from='C:\\\\foo\\\\bar'; to='C:\\\\foo'\n                    lastCommonSep = i;\n                }\n                else if (i === 2) {\n                    // We get here if `to` is the device root.\n                    // For example: from='C:\\\\foo\\\\bar'; to='C:\\\\'\n                    lastCommonSep = 3;\n                }\n            }\n            if (lastCommonSep === -1) {\n                lastCommonSep = 0;\n            }\n        }\n        let out = '';\n        // Generate the relative path based on the path difference between `to` and\n        // `from`\n        for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n            if (i === fromEnd || from.charCodeAt(i) === CHAR_BACKWARD_SLASH) {\n                out += out.length === 0 ? '..' : '\\\\..';\n            }\n        }\n        toStart += lastCommonSep;\n        // Lastly, append the rest of the destination (`to`) path that comes after\n        // the common path parts\n        if (out.length > 0) {\n            return `${out}${toOrig.slice(toStart, toEnd)}`;\n        }\n        if (toOrig.charCodeAt(toStart) === CHAR_BACKWARD_SLASH) {\n            ++toStart;\n        }\n        return toOrig.slice(toStart, toEnd);\n    },\n    toNamespacedPath(path) {\n        // Note: this will *probably* throw somewhere.\n        if (typeof path !== 'string' || path.length === 0) {\n            return path;\n        }\n        const resolvedPath = win32.resolve(path);\n        if (resolvedPath.length <= 2) {\n            return path;\n        }\n        if (resolvedPath.charCodeAt(0) === CHAR_BACKWARD_SLASH) {\n            // Possible UNC root\n            if (resolvedPath.charCodeAt(1) === CHAR_BACKWARD_SLASH) {\n                const code = resolvedPath.charCodeAt(2);\n                if (code !== CHAR_QUESTION_MARK && code !== CHAR_DOT) {\n                    // Matched non-long UNC root, convert the path to a long UNC path\n                    return `\\\\\\\\?\\\\UNC\\\\${resolvedPath.slice(2)}`;\n                }\n            }\n        }\n        else if (isWindowsDeviceRoot(resolvedPath.charCodeAt(0)) &&\n            resolvedPath.charCodeAt(1) === CHAR_COLON &&\n            resolvedPath.charCodeAt(2) === CHAR_BACKWARD_SLASH) {\n            // Matched device root, convert the path to a long UNC path\n            return `\\\\\\\\?\\\\${resolvedPath}`;\n        }\n        return resolvedPath;\n    },\n    dirname(path) {\n        validateString(path, 'path');\n        const len = path.length;\n        if (len === 0) {\n            return '.';\n        }\n        let rootEnd = -1;\n        let offset = 0;\n        const code = path.charCodeAt(0);\n        if (len === 1) {\n            // `path` contains just a path separator, exit early to avoid\n            // unnecessary work or a dot.\n            return isPathSeparator(code) ? path : '.';\n        }\n        // Try to match a root\n        if (isPathSeparator(code)) {\n            // Possible UNC root\n            rootEnd = offset = 1;\n            if (isPathSeparator(path.charCodeAt(1))) {\n                // Matched double path separator at beginning\n                let j = 2;\n                let last = j;\n                // Match 1 or more non-path separators\n                while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n                    j++;\n                }\n                if (j < len && j !== last) {\n                    // Matched!\n                    last = j;\n                    // Match 1 or more path separators\n                    while (j < len && isPathSeparator(path.charCodeAt(j))) {\n                        j++;\n                    }\n                    if (j < len && j !== last) {\n                        // Matched!\n                        last = j;\n                        // Match 1 or more non-path separators\n                        while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n                            j++;\n                        }\n                        if (j === len) {\n                            // We matched a UNC root only\n                            return path;\n                        }\n                        if (j !== last) {\n                            // We matched a UNC root with leftovers\n                            // Offset by 1 to include the separator after the UNC root to\n                            // treat it as a \"normal root\" on top of a (UNC) root\n                            rootEnd = offset = j + 1;\n                        }\n                    }\n                }\n            }\n            // Possible device root\n        }\n        else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) {\n            rootEnd = len > 2 && isPathSeparator(path.charCodeAt(2)) ? 3 : 2;\n            offset = rootEnd;\n        }\n        let end = -1;\n        let matchedSlash = true;\n        for (let i = len - 1; i >= offset; --i) {\n            if (isPathSeparator(path.charCodeAt(i))) {\n                if (!matchedSlash) {\n                    end = i;\n                    break;\n                }\n            }\n            else {\n                // We saw the first non-path separator\n                matchedSlash = false;\n            }\n        }\n        if (end === -1) {\n            if (rootEnd === -1) {\n                return '.';\n            }\n            end = rootEnd;\n        }\n        return path.slice(0, end);\n    },\n    basename(path, suffix) {\n        if (suffix !== undefined) {\n            validateString(suffix, 'suffix');\n        }\n        validateString(path, 'path');\n        let start = 0;\n        let end = -1;\n        let matchedSlash = true;\n        let i;\n        // Check for a drive letter prefix so as not to mistake the following\n        // path separator as an extra separator at the end of the path that can be\n        // disregarded\n        if (path.length >= 2 &&\n            isWindowsDeviceRoot(path.charCodeAt(0)) &&\n            path.charCodeAt(1) === CHAR_COLON) {\n            start = 2;\n        }\n        if (suffix !== undefined && suffix.length > 0 && suffix.length <= path.length) {\n            if (suffix === path) {\n                return '';\n            }\n            let extIdx = suffix.length - 1;\n            let firstNonSlashEnd = -1;\n            for (i = path.length - 1; i >= start; --i) {\n                const code = path.charCodeAt(i);\n                if (isPathSeparator(code)) {\n                    // If we reached a path separator that was not part of a set of path\n                    // separators at the end of the string, stop now\n                    if (!matchedSlash) {\n                        start = i + 1;\n                        break;\n                    }\n                }\n                else {\n                    if (firstNonSlashEnd === -1) {\n                        // We saw the first non-path separator, remember this index in case\n                        // we need it if the extension ends up not matching\n                        matchedSlash = false;\n                        firstNonSlashEnd = i + 1;\n                    }\n                    if (extIdx >= 0) {\n                        // Try to match the explicit extension\n                        if (code === suffix.charCodeAt(extIdx)) {\n                            if (--extIdx === -1) {\n                                // We matched the extension, so mark this as the end of our path\n                                // component\n                                end = i;\n                            }\n                        }\n                        else {\n                            // Extension does not match, so our result is the entire path\n                            // component\n                            extIdx = -1;\n                            end = firstNonSlashEnd;\n                        }\n                    }\n                }\n            }\n            if (start === end) {\n                end = firstNonSlashEnd;\n            }\n            else if (end === -1) {\n                end = path.length;\n            }\n            return path.slice(start, end);\n        }\n        for (i = path.length - 1; i >= start; --i) {\n            if (isPathSeparator(path.charCodeAt(i))) {\n                // If we reached a path separator that was not part of a set of path\n                // separators at the end of the string, stop now\n                if (!matchedSlash) {\n                    start = i + 1;\n                    break;\n                }\n            }\n            else if (end === -1) {\n                // We saw the first non-path separator, mark this as the end of our\n                // path component\n                matchedSlash = false;\n                end = i + 1;\n            }\n        }\n        if (end === -1) {\n            return '';\n        }\n        return path.slice(start, end);\n    },\n    extname(path) {\n        validateString(path, 'path');\n        let start = 0;\n        let startDot = -1;\n        let startPart = 0;\n        let end = -1;\n        let matchedSlash = true;\n        // Track the state of characters (if any) we see before our first dot and\n        // after any path separator we find\n        let preDotState = 0;\n        // Check for a drive letter prefix so as not to mistake the following\n        // path separator as an extra separator at the end of the path that can be\n        // disregarded\n        if (path.length >= 2 &&\n            path.charCodeAt(1) === CHAR_COLON &&\n            isWindowsDeviceRoot(path.charCodeAt(0))) {\n            start = startPart = 2;\n        }\n        for (let i = path.length - 1; i >= start; --i) {\n            const code = path.charCodeAt(i);\n            if (isPathSeparator(code)) {\n                // If we reached a path separator that was not part of a set of path\n                // separators at the end of the string, stop now\n                if (!matchedSlash) {\n                    startPart = i + 1;\n                    break;\n                }\n                continue;\n            }\n            if (end === -1) {\n                // We saw the first non-path separator, mark this as the end of our\n                // extension\n                matchedSlash = false;\n                end = i + 1;\n            }\n            if (code === CHAR_DOT) {\n                // If this is our first dot, mark it as the start of our extension\n                if (startDot === -1) {\n                    startDot = i;\n                }\n                else if (preDotState !== 1) {\n                    preDotState = 1;\n                }\n            }\n            else if (startDot !== -1) {\n                // We saw a non-dot and non-path separator before our dot, so we should\n                // have a good chance at having a non-empty extension\n                preDotState = -1;\n            }\n        }\n        if (startDot === -1 ||\n            end === -1 ||\n            // We saw a non-dot character immediately before the dot\n            preDotState === 0 ||\n            // The (right-most) trimmed path component is exactly '..'\n            (preDotState === 1 &&\n                startDot === end - 1 &&\n                startDot === startPart + 1)) {\n            return '';\n        }\n        return path.slice(startDot, end);\n    },\n    format: _format.bind(null, '\\\\'),\n    parse(path) {\n        validateString(path, 'path');\n        const ret = { root: '', dir: '', base: '', ext: '', name: '' };\n        if (path.length === 0) {\n            return ret;\n        }\n        const len = path.length;\n        let rootEnd = 0;\n        let code = path.charCodeAt(0);\n        if (len === 1) {\n            if (isPathSeparator(code)) {\n                // `path` contains just a path separator, exit early to avoid\n                // unnecessary work\n                ret.root = ret.dir = path;\n                return ret;\n            }\n            ret.base = ret.name = path;\n            return ret;\n        }\n        // Try to match a root\n        if (isPathSeparator(code)) {\n            // Possible UNC root\n            rootEnd = 1;\n            if (isPathSeparator(path.charCodeAt(1))) {\n                // Matched double path separator at beginning\n                let j = 2;\n                let last = j;\n                // Match 1 or more non-path separators\n                while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n                    j++;\n                }\n                if (j < len && j !== last) {\n                    // Matched!\n                    last = j;\n                    // Match 1 or more path separators\n                    while (j < len && isPathSeparator(path.charCodeAt(j))) {\n                        j++;\n                    }\n                    if (j < len && j !== last) {\n                        // Matched!\n                        last = j;\n                        // Match 1 or more non-path separators\n                        while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n                            j++;\n                        }\n                        if (j === len) {\n                            // We matched a UNC root only\n                            rootEnd = j;\n                        }\n                        else if (j !== last) {\n                            // We matched a UNC root with leftovers\n                            rootEnd = j + 1;\n                        }\n                    }\n                }\n            }\n        }\n        else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) {\n            // Possible device root\n            if (len <= 2) {\n                // `path` contains just a drive root, exit early to avoid\n                // unnecessary work\n                ret.root = ret.dir = path;\n                return ret;\n            }\n            rootEnd = 2;\n            if (isPathSeparator(path.charCodeAt(2))) {\n                if (len === 3) {\n                    // `path` contains just a drive root, exit early to avoid\n                    // unnecessary work\n                    ret.root = ret.dir = path;\n                    return ret;\n                }\n                rootEnd = 3;\n            }\n        }\n        if (rootEnd > 0) {\n            ret.root = path.slice(0, rootEnd);\n        }\n        let startDot = -1;\n        let startPart = rootEnd;\n        let end = -1;\n        let matchedSlash = true;\n        let i = path.length - 1;\n        // Track the state of characters (if any) we see before our first dot and\n        // after any path separator we find\n        let preDotState = 0;\n        // Get non-dir info\n        for (; i >= rootEnd; --i) {\n            code = path.charCodeAt(i);\n            if (isPathSeparator(code)) {\n                // If we reached a path separator that was not part of a set of path\n                // separators at the end of the string, stop now\n                if (!matchedSlash) {\n                    startPart = i + 1;\n                    break;\n                }\n                continue;\n            }\n            if (end === -1) {\n                // We saw the first non-path separator, mark this as the end of our\n                // extension\n                matchedSlash = false;\n                end = i + 1;\n            }\n            if (code === CHAR_DOT) {\n                // If this is our first dot, mark it as the start of our extension\n                if (startDot === -1) {\n                    startDot = i;\n                }\n                else if (preDotState !== 1) {\n                    preDotState = 1;\n                }\n            }\n            else if (startDot !== -1) {\n                // We saw a non-dot and non-path separator before our dot, so we should\n                // have a good chance at having a non-empty extension\n                preDotState = -1;\n            }\n        }\n        if (end !== -1) {\n            if (startDot === -1 ||\n                // We saw a non-dot character immediately before the dot\n                preDotState === 0 ||\n                // The (right-most) trimmed path component is exactly '..'\n                (preDotState === 1 &&\n                    startDot === end - 1 &&\n                    startDot === startPart + 1)) {\n                ret.base = ret.name = path.slice(startPart, end);\n            }\n            else {\n                ret.name = path.slice(startPart, startDot);\n                ret.base = path.slice(startPart, end);\n                ret.ext = path.slice(startDot, end);\n            }\n        }\n        // If the directory is the root, use the entire root as the `dir` including\n        // the trailing slash if any (`C:\\abc` -> `C:\\`). Otherwise, strip out the\n        // trailing slash (`C:\\abc\\def` -> `C:\\abc`).\n        if (startPart > 0 && startPart !== rootEnd) {\n            ret.dir = path.slice(0, startPart - 1);\n        }\n        else {\n            ret.dir = ret.root;\n        }\n        return ret;\n    },\n    sep: '\\\\',\n    delimiter: ';',\n    win32: null,\n    posix: null\n};\nconst posixCwd = (() => {\n    if (platformIsWin32) {\n        // Converts Windows' backslash path separators to POSIX forward slashes\n        // and truncates any drive indicator\n        const regexp = /\\\\/g;\n        return () => {\n            const cwd$1 = cwd().replace(regexp, '/');\n            return cwd$1.slice(cwd$1.indexOf('/'));\n        };\n    }\n    // We're already on POSIX, no need for any transformations\n    return () => cwd();\n})();\nconst posix = {\n    // path.resolve([from ...], to)\n    resolve(...pathSegments) {\n        let resolvedPath = '';\n        let resolvedAbsolute = false;\n        for (let i = pathSegments.length - 1; i >= 0 && !resolvedAbsolute; i--) {\n            const path = pathSegments[i];\n            validateString(path, `paths[${i}]`);\n            // Skip empty entries\n            if (path.length === 0) {\n                continue;\n            }\n            resolvedPath = `${path}/${resolvedPath}`;\n            resolvedAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n        }\n        if (!resolvedAbsolute) {\n            const cwd = posixCwd();\n            resolvedPath = `${cwd}/${resolvedPath}`;\n            resolvedAbsolute =\n                cwd.charCodeAt(0) === CHAR_FORWARD_SLASH;\n        }\n        // At this point the path should be resolved to a full absolute path, but\n        // handle relative paths to be safe (might happen when process.cwd() fails)\n        // Normalize the path\n        resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, '/', isPosixPathSeparator);\n        if (resolvedAbsolute) {\n            return `/${resolvedPath}`;\n        }\n        return resolvedPath.length > 0 ? resolvedPath : '.';\n    },\n    normalize(path) {\n        validateString(path, 'path');\n        if (path.length === 0) {\n            return '.';\n        }\n        const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n        const trailingSeparator = path.charCodeAt(path.length - 1) === CHAR_FORWARD_SLASH;\n        // Normalize the path\n        path = normalizeString(path, !isAbsolute, '/', isPosixPathSeparator);\n        if (path.length === 0) {\n            if (isAbsolute) {\n                return '/';\n            }\n            return trailingSeparator ? './' : '.';\n        }\n        if (trailingSeparator) {\n            path += '/';\n        }\n        return isAbsolute ? `/${path}` : path;\n    },\n    isAbsolute(path) {\n        validateString(path, 'path');\n        return path.length > 0 && path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n    },\n    join(...paths) {\n        if (paths.length === 0) {\n            return '.';\n        }\n        const path = [];\n        for (let i = 0; i < paths.length; ++i) {\n            const arg = paths[i];\n            validateString(arg, 'path');\n            if (arg.length > 0) {\n                path.push(arg);\n            }\n        }\n        if (path.length === 0) {\n            return '.';\n        }\n        return posix.normalize(path.join('/'));\n    },\n    relative(from, to) {\n        validateString(from, 'from');\n        validateString(to, 'to');\n        if (from === to) {\n            return '';\n        }\n        // Trim leading forward slashes.\n        from = posix.resolve(from);\n        to = posix.resolve(to);\n        if (from === to) {\n            return '';\n        }\n        const fromStart = 1;\n        const fromEnd = from.length;\n        const fromLen = fromEnd - fromStart;\n        const toStart = 1;\n        const toLen = to.length - toStart;\n        // Compare paths to find the longest common path from root\n        const length = (fromLen < toLen ? fromLen : toLen);\n        let lastCommonSep = -1;\n        let i = 0;\n        for (; i < length; i++) {\n            const fromCode = from.charCodeAt(fromStart + i);\n            if (fromCode !== to.charCodeAt(toStart + i)) {\n                break;\n            }\n            else if (fromCode === CHAR_FORWARD_SLASH) {\n                lastCommonSep = i;\n            }\n        }\n        if (i === length) {\n            if (toLen > length) {\n                if (to.charCodeAt(toStart + i) === CHAR_FORWARD_SLASH) {\n                    // We get here if `from` is the exact base path for `to`.\n                    // For example: from='/foo/bar'; to='/foo/bar/baz'\n                    return to.slice(toStart + i + 1);\n                }\n                if (i === 0) {\n                    // We get here if `from` is the root\n                    // For example: from='/'; to='/foo'\n                    return to.slice(toStart + i);\n                }\n            }\n            else if (fromLen > length) {\n                if (from.charCodeAt(fromStart + i) === CHAR_FORWARD_SLASH) {\n                    // We get here if `to` is the exact base path for `from`.\n                    // For example: from='/foo/bar/baz'; to='/foo/bar'\n                    lastCommonSep = i;\n                }\n                else if (i === 0) {\n                    // We get here if `to` is the root.\n                    // For example: from='/foo/bar'; to='/'\n                    lastCommonSep = 0;\n                }\n            }\n        }\n        let out = '';\n        // Generate the relative path based on the path difference between `to`\n        // and `from`.\n        for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n            if (i === fromEnd || from.charCodeAt(i) === CHAR_FORWARD_SLASH) {\n                out += out.length === 0 ? '..' : '/..';\n            }\n        }\n        // Lastly, append the rest of the destination (`to`) path that comes after\n        // the common path parts.\n        return `${out}${to.slice(toStart + lastCommonSep)}`;\n    },\n    toNamespacedPath(path) {\n        // Non-op on posix systems\n        return path;\n    },\n    dirname(path) {\n        validateString(path, 'path');\n        if (path.length === 0) {\n            return '.';\n        }\n        const hasRoot = path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n        let end = -1;\n        let matchedSlash = true;\n        for (let i = path.length - 1; i >= 1; --i) {\n            if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) {\n                if (!matchedSlash) {\n                    end = i;\n                    break;\n                }\n            }\n            else {\n                // We saw the first non-path separator\n                matchedSlash = false;\n            }\n        }\n        if (end === -1) {\n            return hasRoot ? '/' : '.';\n        }\n        if (hasRoot && end === 1) {\n            return '//';\n        }\n        return path.slice(0, end);\n    },\n    basename(path, suffix) {\n        if (suffix !== undefined) {\n            validateString(suffix, 'suffix');\n        }\n        validateString(path, 'path');\n        let start = 0;\n        let end = -1;\n        let matchedSlash = true;\n        let i;\n        if (suffix !== undefined && suffix.length > 0 && suffix.length <= path.length) {\n            if (suffix === path) {\n                return '';\n            }\n            let extIdx = suffix.length - 1;\n            let firstNonSlashEnd = -1;\n            for (i = path.length - 1; i >= 0; --i) {\n                const code = path.charCodeAt(i);\n                if (code === CHAR_FORWARD_SLASH) {\n                    // If we reached a path separator that was not part of a set of path\n                    // separators at the end of the string, stop now\n                    if (!matchedSlash) {\n                        start = i + 1;\n                        break;\n                    }\n                }\n                else {\n                    if (firstNonSlashEnd === -1) {\n                        // We saw the first non-path separator, remember this index in case\n                        // we need it if the extension ends up not matching\n                        matchedSlash = false;\n                        firstNonSlashEnd = i + 1;\n                    }\n                    if (extIdx >= 0) {\n                        // Try to match the explicit extension\n                        if (code === suffix.charCodeAt(extIdx)) {\n                            if (--extIdx === -1) {\n                                // We matched the extension, so mark this as the end of our path\n                                // component\n                                end = i;\n                            }\n                        }\n                        else {\n                            // Extension does not match, so our result is the entire path\n                            // component\n                            extIdx = -1;\n                            end = firstNonSlashEnd;\n                        }\n                    }\n                }\n            }\n            if (start === end) {\n                end = firstNonSlashEnd;\n            }\n            else if (end === -1) {\n                end = path.length;\n            }\n            return path.slice(start, end);\n        }\n        for (i = path.length - 1; i >= 0; --i) {\n            if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) {\n                // If we reached a path separator that was not part of a set of path\n                // separators at the end of the string, stop now\n                if (!matchedSlash) {\n                    start = i + 1;\n                    break;\n                }\n            }\n            else if (end === -1) {\n                // We saw the first non-path separator, mark this as the end of our\n                // path component\n                matchedSlash = false;\n                end = i + 1;\n            }\n        }\n        if (end === -1) {\n            return '';\n        }\n        return path.slice(start, end);\n    },\n    extname(path) {\n        validateString(path, 'path');\n        let startDot = -1;\n        let startPart = 0;\n        let end = -1;\n        let matchedSlash = true;\n        // Track the state of characters (if any) we see before our first dot and\n        // after any path separator we find\n        let preDotState = 0;\n        for (let i = path.length - 1; i >= 0; --i) {\n            const char = path[i];\n            if (char === '/') {\n                // If we reached a path separator that was not part of a set of path\n                // separators at the end of the string, stop now\n                if (!matchedSlash) {\n                    startPart = i + 1;\n                    break;\n                }\n                continue;\n            }\n            if (end === -1) {\n                // We saw the first non-path separator, mark this as the end of our\n                // extension\n                matchedSlash = false;\n                end = i + 1;\n            }\n            if (char === '.') {\n                // If this is our first dot, mark it as the start of our extension\n                if (startDot === -1) {\n                    startDot = i;\n                }\n                else if (preDotState !== 1) {\n                    preDotState = 1;\n                }\n            }\n            else if (startDot !== -1) {\n                // We saw a non-dot and non-path separator before our dot, so we should\n                // have a good chance at having a non-empty extension\n                preDotState = -1;\n            }\n        }\n        if (startDot === -1 ||\n            end === -1 ||\n            // We saw a non-dot character immediately before the dot\n            preDotState === 0 ||\n            // The (right-most) trimmed path component is exactly '..'\n            (preDotState === 1 &&\n                startDot === end - 1 &&\n                startDot === startPart + 1)) {\n            return '';\n        }\n        return path.slice(startDot, end);\n    },\n    format: _format.bind(null, '/'),\n    parse(path) {\n        validateString(path, 'path');\n        const ret = { root: '', dir: '', base: '', ext: '', name: '' };\n        if (path.length === 0) {\n            return ret;\n        }\n        const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n        let start;\n        if (isAbsolute) {\n            ret.root = '/';\n            start = 1;\n        }\n        else {\n            start = 0;\n        }\n        let startDot = -1;\n        let startPart = 0;\n        let end = -1;\n        let matchedSlash = true;\n        let i = path.length - 1;\n        // Track the state of characters (if any) we see before our first dot and\n        // after any path separator we find\n        let preDotState = 0;\n        // Get non-dir info\n        for (; i >= start; --i) {\n            const code = path.charCodeAt(i);\n            if (code === CHAR_FORWARD_SLASH) {\n                // If we reached a path separator that was not part of a set of path\n                // separators at the end of the string, stop now\n                if (!matchedSlash) {\n                    startPart = i + 1;\n                    break;\n                }\n                continue;\n            }\n            if (end === -1) {\n                // We saw the first non-path separator, mark this as the end of our\n                // extension\n                matchedSlash = false;\n                end = i + 1;\n            }\n            if (code === CHAR_DOT) {\n                // If this is our first dot, mark it as the start of our extension\n                if (startDot === -1) {\n                    startDot = i;\n                }\n                else if (preDotState !== 1) {\n                    preDotState = 1;\n                }\n            }\n            else if (startDot !== -1) {\n                // We saw a non-dot and non-path separator before our dot, so we should\n                // have a good chance at having a non-empty extension\n                preDotState = -1;\n            }\n        }\n        if (end !== -1) {\n            const start = startPart === 0 && isAbsolute ? 1 : startPart;\n            if (startDot === -1 ||\n                // We saw a non-dot character immediately before the dot\n                preDotState === 0 ||\n                // The (right-most) trimmed path component is exactly '..'\n                (preDotState === 1 &&\n                    startDot === end - 1 &&\n                    startDot === startPart + 1)) {\n                ret.base = ret.name = path.slice(start, end);\n            }\n            else {\n                ret.name = path.slice(start, startDot);\n                ret.base = path.slice(start, end);\n                ret.ext = path.slice(startDot, end);\n            }\n        }\n        if (startPart > 0) {\n            ret.dir = path.slice(0, startPart - 1);\n        }\n        else if (isAbsolute) {\n            ret.dir = '/';\n        }\n        return ret;\n    },\n    sep: '/',\n    delimiter: ':',\n    win32: null,\n    posix: null\n};\nposix.win32 = win32.win32 = win32;\nposix.posix = win32.posix = posix;\nconst normalize = (platformIsWin32 ? win32.normalize : posix.normalize);\nconst resolve = (platformIsWin32 ? win32.resolve : posix.resolve);\nconst relative = (platformIsWin32 ? win32.relative : posix.relative);\nconst dirname = (platformIsWin32 ? win32.dirname : posix.dirname);\nconst basename = (platformIsWin32 ? win32.basename : posix.basename);\nconst extname = (platformIsWin32 ? win32.extname : posix.extname);\nconst sep = (platformIsWin32 ? win32.sep : posix.sep);\n\nexport { basename, dirname, extname, normalize, posix, relative, resolve, sep, win32 };\n","import { win32, posix } from './path.js';\nimport { isWindows } from './platform.js';\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 *--------------------------------------------------------------------------------------------*/\nconst _schemePattern = /^\\w[\\w\\d+.-]*$/;\nconst _singleSlashStart = /^\\//;\nconst _doubleSlashStart = /^\\/\\//;\nfunction _validateUri(ret, _strict) {\n    // scheme, must be set\n    if (!ret.scheme && _strict) {\n        throw new Error(`[UriError]: Scheme is missing: {scheme: \"\", authority: \"${ret.authority}\", path: \"${ret.path}\", query: \"${ret.query}\", fragment: \"${ret.fragment}\"}`);\n    }\n    // scheme, https://tools.ietf.org/html/rfc3986#section-3.1\n    // ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n    if (ret.scheme && !_schemePattern.test(ret.scheme)) {\n        throw new Error('[UriError]: Scheme contains illegal characters.');\n    }\n    // path, http://tools.ietf.org/html/rfc3986#section-3.3\n    // If a URI contains an authority component, then the path component\n    // must either be empty or begin with a slash (\"/\") character.  If a URI\n    // does not contain an authority component, then the path cannot begin\n    // with two slash characters (\"//\").\n    if (ret.path) {\n        if (ret.authority) {\n            if (!_singleSlashStart.test(ret.path)) {\n                throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash (\"/\") character');\n            }\n        }\n        else {\n            if (_doubleSlashStart.test(ret.path)) {\n                throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters (\"//\")');\n            }\n        }\n    }\n}\n// for a while we allowed uris *without* schemes and this is the migration\n// for them, e.g. an uri without scheme and without strict-mode warns and falls\n// back to the file-scheme. that should cause the least carnage and still be a\n// clear warning\nfunction _schemeFix(scheme, _strict) {\n    if (!scheme && !_strict) {\n        return 'file';\n    }\n    return scheme;\n}\n// implements a bit of https://tools.ietf.org/html/rfc3986#section-5\nfunction _referenceResolution(scheme, path) {\n    // the slash-character is our 'default base' as we don't\n    // support constructing URIs relative to other URIs. This\n    // also means that we alter and potentially break paths.\n    // see https://tools.ietf.org/html/rfc3986#section-5.1.4\n    switch (scheme) {\n        case 'https':\n        case 'http':\n        case 'file':\n            if (!path) {\n                path = _slash;\n            }\n            else if (path[0] !== _slash) {\n                path = _slash + path;\n            }\n            break;\n    }\n    return path;\n}\nconst _empty = '';\nconst _slash = '/';\nconst _regexp = /^(([^:/?#]+?):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/;\n/**\n * Uniform Resource Identifier (URI) http://tools.ietf.org/html/rfc3986.\n * This class is a simple parser which creates the basic component parts\n * (http://tools.ietf.org/html/rfc3986#section-3) with minimal validation\n * and encoding.\n *\n * ```txt\n *       foo://example.com:8042/over/there?name=ferret#nose\n *       \\_/   \\______________/\\_________/ \\_________/ \\__/\n *        |           |            |            |        |\n *     scheme     authority       path        query   fragment\n *        |   _____________________|__\n *       / \\ /                        \\\n *       urn:example:animal:ferret:nose\n * ```\n */\nclass URI {\n    static isUri(thing) {\n        if (thing instanceof URI) {\n            return true;\n        }\n        if (!thing || typeof thing !== 'object') {\n            return false;\n        }\n        return typeof thing.authority === 'string'\n            && typeof thing.fragment === 'string'\n            && typeof thing.path === 'string'\n            && typeof thing.query === 'string'\n            && typeof thing.scheme === 'string'\n            && typeof thing.fsPath === 'string'\n            && typeof thing.with === 'function'\n            && typeof thing.toString === 'function';\n    }\n    /**\n     * @internal\n     */\n    constructor(schemeOrData, authority, path, query, fragment, _strict = false) {\n        if (typeof schemeOrData === 'object') {\n            this.scheme = schemeOrData.scheme || _empty;\n            this.authority = schemeOrData.authority || _empty;\n            this.path = schemeOrData.path || _empty;\n            this.query = schemeOrData.query || _empty;\n            this.fragment = schemeOrData.fragment || _empty;\n            // no validation because it's this URI\n            // that creates uri components.\n            // _validateUri(this);\n        }\n        else {\n            this.scheme = _schemeFix(schemeOrData, _strict);\n            this.authority = authority || _empty;\n            this.path = _referenceResolution(this.scheme, path || _empty);\n            this.query = query || _empty;\n            this.fragment = fragment || _empty;\n            _validateUri(this, _strict);\n        }\n    }\n    // ---- filesystem path -----------------------\n    /**\n     * Returns a string representing the corresponding file system path of this URI.\n     * Will handle UNC paths, normalizes windows drive letters to lower-case, and uses the\n     * platform specific path separator.\n     *\n     * * Will *not* validate the path for invalid characters and semantics.\n     * * Will *not* look at the scheme of this URI.\n     * * The result shall *not* be used for display purposes but for accessing a file on disk.\n     *\n     *\n     * The *difference* to `URI#path` is the use of the platform specific separator and the handling\n     * of UNC paths. See the below sample of a file-uri with an authority (UNC path).\n     *\n     * ```ts\n        const u = URI.parse('file://server/c$/folder/file.txt')\n        u.authority === 'server'\n        u.path === '/shares/c$/file.txt'\n        u.fsPath === '\\\\server\\c$\\folder\\file.txt'\n    ```\n     *\n     * Using `URI#path` to read a file (using fs-apis) would not be enough because parts of the path,\n     * namely the server name, would be missing. Therefore `URI#fsPath` exists - it's sugar to ease working\n     * with URIs that represent files on disk (`file` scheme).\n     */\n    get fsPath() {\n        // if (this.scheme !== 'file') {\n        // \tconsole.warn(`[UriError] calling fsPath with scheme ${this.scheme}`);\n        // }\n        return uriToFsPath(this, false);\n    }\n    // ---- modify to new -------------------------\n    with(change) {\n        if (!change) {\n            return this;\n        }\n        let { scheme, authority, path, query, fragment } = change;\n        if (scheme === undefined) {\n            scheme = this.scheme;\n        }\n        else if (scheme === null) {\n            scheme = _empty;\n        }\n        if (authority === undefined) {\n            authority = this.authority;\n        }\n        else if (authority === null) {\n            authority = _empty;\n        }\n        if (path === undefined) {\n            path = this.path;\n        }\n        else if (path === null) {\n            path = _empty;\n        }\n        if (query === undefined) {\n            query = this.query;\n        }\n        else if (query === null) {\n            query = _empty;\n        }\n        if (fragment === undefined) {\n            fragment = this.fragment;\n        }\n        else if (fragment === null) {\n            fragment = _empty;\n        }\n        if (scheme === this.scheme\n            && authority === this.authority\n            && path === this.path\n            && query === this.query\n            && fragment === this.fragment) {\n            return this;\n        }\n        return new Uri(scheme, authority, path, query, fragment);\n    }\n    // ---- parse & validate ------------------------\n    /**\n     * Creates a new URI from a string, e.g. `http://www.example.com/some/path`,\n     * `file:///usr/home`, or `scheme:with/path`.\n     *\n     * @param value A string which represents an URI (see `URI#toString`).\n     */\n    static parse(value, _strict = false) {\n        const match = _regexp.exec(value);\n        if (!match) {\n            return new Uri(_empty, _empty, _empty, _empty, _empty);\n        }\n        return new Uri(match[2] || _empty, percentDecode(match[4] || _empty), percentDecode(match[5] || _empty), percentDecode(match[7] || _empty), percentDecode(match[9] || _empty), _strict);\n    }\n    /**\n     * Creates a new URI from a file system path, e.g. `c:\\my\\files`,\n     * `/usr/home`, or `\\\\server\\share\\some\\path`.\n     *\n     * The *difference* between `URI#parse` and `URI#file` is that the latter treats the argument\n     * as path, not as stringified-uri. E.g. `URI.file(path)` is **not the same as**\n     * `URI.parse('file://' + path)` because the path might contain characters that are\n     * interpreted (# and ?). See the following sample:\n     * ```ts\n    const good = URI.file('/coding/c#/project1');\n    good.scheme === 'file';\n    good.path === '/coding/c#/project1';\n    good.fragment === '';\n    const bad = URI.parse('file://' + '/coding/c#/project1');\n    bad.scheme === 'file';\n    bad.path === '/coding/c'; // path is now broken\n    bad.fragment === '/project1';\n    ```\n     *\n     * @param path A file system path (see `URI#fsPath`)\n     */\n    static file(path) {\n        let authority = _empty;\n        // normalize to fwd-slashes on windows,\n        // on other systems bwd-slashes are valid\n        // filename character, eg /f\\oo/ba\\r.txt\n        if (isWindows) {\n            path = path.replace(/\\\\/g, _slash);\n        }\n        // check for authority as used in UNC shares\n        // or use the path as given\n        if (path[0] === _slash && path[1] === _slash) {\n            const idx = path.indexOf(_slash, 2);\n            if (idx === -1) {\n                authority = path.substring(2);\n                path = _slash;\n            }\n            else {\n                authority = path.substring(2, idx);\n                path = path.substring(idx) || _slash;\n            }\n        }\n        return new Uri('file', authority, path, _empty, _empty);\n    }\n    /**\n     * Creates new URI from uri components.\n     *\n     * Unless `strict` is `true` the scheme is defaults to be `file`. This function performs\n     * validation and should be used for untrusted uri components retrieved from storage,\n     * user input, command arguments etc\n     */\n    static from(components, strict) {\n        const result = new Uri(components.scheme, components.authority, components.path, components.query, components.fragment, strict);\n        return result;\n    }\n    /**\n     * Join a URI path with path fragments and normalizes the resulting path.\n     *\n     * @param uri The input URI.\n     * @param pathFragment The path fragment to add to the URI path.\n     * @returns The resulting URI.\n     */\n    static joinPath(uri, ...pathFragment) {\n        if (!uri.path) {\n            throw new Error(`[UriError]: cannot call joinPath on URI without path`);\n        }\n        let newPath;\n        if (isWindows && uri.scheme === 'file') {\n            newPath = URI.file(win32.join(uriToFsPath(uri, true), ...pathFragment)).path;\n        }\n        else {\n            newPath = posix.join(uri.path, ...pathFragment);\n        }\n        return uri.with({ path: newPath });\n    }\n    // ---- printing/externalize ---------------------------\n    /**\n     * Creates a string representation for this URI. It's guaranteed that calling\n     * `URI.parse` with the result of this function creates an URI which is equal\n     * to this URI.\n     *\n     * * The result shall *not* be used for display purposes but for externalization or transport.\n     * * The result will be encoded using the percentage encoding and encoding happens mostly\n     * ignore the scheme-specific encoding rules.\n     *\n     * @param skipEncoding Do not encode the result, default is `false`\n     */\n    toString(skipEncoding = false) {\n        return _asFormatted(this, skipEncoding);\n    }\n    toJSON() {\n        return this;\n    }\n    static revive(data) {\n        if (!data) {\n            return data;\n        }\n        else if (data instanceof URI) {\n            return data;\n        }\n        else {\n            const result = new Uri(data);\n            result._formatted = data.external ?? null;\n            result._fsPath = data._sep === _pathSepMarker ? data.fsPath ?? null : null;\n            return result;\n        }\n    }\n}\nconst _pathSepMarker = isWindows ? 1 : undefined;\n// This class exists so that URI is compatible with vscode.Uri (API).\nclass Uri extends URI {\n    constructor() {\n        super(...arguments);\n        this._formatted = null;\n        this._fsPath = null;\n    }\n    get fsPath() {\n        if (!this._fsPath) {\n            this._fsPath = uriToFsPath(this, false);\n        }\n        return this._fsPath;\n    }\n    toString(skipEncoding = false) {\n        if (!skipEncoding) {\n            if (!this._formatted) {\n                this._formatted = _asFormatted(this, false);\n            }\n            return this._formatted;\n        }\n        else {\n            // we don't cache that\n            return _asFormatted(this, true);\n        }\n    }\n    toJSON() {\n        // eslint-disable-next-line local/code-no-dangerous-type-assertions\n        const res = {\n            $mid: 1 /* MarshalledId.Uri */\n        };\n        // cached state\n        if (this._fsPath) {\n            res.fsPath = this._fsPath;\n            res._sep = _pathSepMarker;\n        }\n        if (this._formatted) {\n            res.external = this._formatted;\n        }\n        //--- uri components\n        if (this.path) {\n            res.path = this.path;\n        }\n        // TODO\n        // this isn't correct and can violate the UriComponents contract but\n        // this is part of the vscode.Uri API and we shouldn't change how that\n        // works anymore\n        if (this.scheme) {\n            res.scheme = this.scheme;\n        }\n        if (this.authority) {\n            res.authority = this.authority;\n        }\n        if (this.query) {\n            res.query = this.query;\n        }\n        if (this.fragment) {\n            res.fragment = this.fragment;\n        }\n        return res;\n    }\n}\n// reserved characters: https://tools.ietf.org/html/rfc3986#section-2.2\nconst encodeTable = {\n    [58 /* CharCode.Colon */]: '%3A', // gen-delims\n    [47 /* CharCode.Slash */]: '%2F',\n    [63 /* CharCode.QuestionMark */]: '%3F',\n    [35 /* CharCode.Hash */]: '%23',\n    [91 /* CharCode.OpenSquareBracket */]: '%5B',\n    [93 /* CharCode.CloseSquareBracket */]: '%5D',\n    [64 /* CharCode.AtSign */]: '%40',\n    [33 /* CharCode.ExclamationMark */]: '%21', // sub-delims\n    [36 /* CharCode.DollarSign */]: '%24',\n    [38 /* CharCode.Ampersand */]: '%26',\n    [39 /* CharCode.SingleQuote */]: '%27',\n    [40 /* CharCode.OpenParen */]: '%28',\n    [41 /* CharCode.CloseParen */]: '%29',\n    [42 /* CharCode.Asterisk */]: '%2A',\n    [43 /* CharCode.Plus */]: '%2B',\n    [44 /* CharCode.Comma */]: '%2C',\n    [59 /* CharCode.Semicolon */]: '%3B',\n    [61 /* CharCode.Equals */]: '%3D',\n    [32 /* CharCode.Space */]: '%20',\n};\nfunction encodeURIComponentFast(uriComponent, isPath, isAuthority) {\n    let res = undefined;\n    let nativeEncodePos = -1;\n    for (let pos = 0; pos < uriComponent.length; pos++) {\n        const code = uriComponent.charCodeAt(pos);\n        // unreserved characters: https://tools.ietf.org/html/rfc3986#section-2.3\n        if ((code >= 97 /* CharCode.a */ && code <= 122 /* CharCode.z */)\n            || (code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */)\n            || (code >= 48 /* CharCode.Digit0 */ && code <= 57 /* CharCode.Digit9 */)\n            || code === 45 /* CharCode.Dash */\n            || code === 46 /* CharCode.Period */\n            || code === 95 /* CharCode.Underline */\n            || code === 126 /* CharCode.Tilde */\n            || (isPath && code === 47 /* CharCode.Slash */)\n            || (isAuthority && code === 91 /* CharCode.OpenSquareBracket */)\n            || (isAuthority && code === 93 /* CharCode.CloseSquareBracket */)\n            || (isAuthority && code === 58 /* CharCode.Colon */)) {\n            // check if we are delaying native encode\n            if (nativeEncodePos !== -1) {\n                res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n                nativeEncodePos = -1;\n            }\n            // check if we write into a new string (by default we try to return the param)\n            if (res !== undefined) {\n                res += uriComponent.charAt(pos);\n            }\n        }\n        else {\n            // encoding needed, we need to allocate a new string\n            if (res === undefined) {\n                res = uriComponent.substr(0, pos);\n            }\n            // check with default table first\n            const escaped = encodeTable[code];\n            if (escaped !== undefined) {\n                // check if we are delaying native encode\n                if (nativeEncodePos !== -1) {\n                    res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n                    nativeEncodePos = -1;\n                }\n                // append escaped variant to result\n                res += escaped;\n            }\n            else if (nativeEncodePos === -1) {\n                // use native encode only when needed\n                nativeEncodePos = pos;\n            }\n        }\n    }\n    if (nativeEncodePos !== -1) {\n        res += encodeURIComponent(uriComponent.substring(nativeEncodePos));\n    }\n    return res !== undefined ? res : uriComponent;\n}\nfunction encodeURIComponentMinimal(path) {\n    let res = undefined;\n    for (let pos = 0; pos < path.length; pos++) {\n        const code = path.charCodeAt(pos);\n        if (code === 35 /* CharCode.Hash */ || code === 63 /* CharCode.QuestionMark */) {\n            if (res === undefined) {\n                res = path.substr(0, pos);\n            }\n            res += encodeTable[code];\n        }\n        else {\n            if (res !== undefined) {\n                res += path[pos];\n            }\n        }\n    }\n    return res !== undefined ? res : path;\n}\n/**\n * Compute `fsPath` for the given uri\n */\nfunction uriToFsPath(uri, keepDriveLetterCasing) {\n    let value;\n    if (uri.authority && uri.path.length > 1 && uri.scheme === 'file') {\n        // unc path: file://shares/c$/far/boo\n        value = `//${uri.authority}${uri.path}`;\n    }\n    else if (uri.path.charCodeAt(0) === 47 /* CharCode.Slash */\n        && (uri.path.charCodeAt(1) >= 65 /* CharCode.A */ && uri.path.charCodeAt(1) <= 90 /* CharCode.Z */ || uri.path.charCodeAt(1) >= 97 /* CharCode.a */ && uri.path.charCodeAt(1) <= 122 /* CharCode.z */)\n        && uri.path.charCodeAt(2) === 58 /* CharCode.Colon */) {\n        if (!keepDriveLetterCasing) {\n            // windows drive letter: file:///c:/far/boo\n            value = uri.path[1].toLowerCase() + uri.path.substr(2);\n        }\n        else {\n            value = uri.path.substr(1);\n        }\n    }\n    else {\n        // other path\n        value = uri.path;\n    }\n    if (isWindows) {\n        value = value.replace(/\\//g, '\\\\');\n    }\n    return value;\n}\n/**\n * Create the external version of a uri\n */\nfunction _asFormatted(uri, skipEncoding) {\n    const encoder = !skipEncoding\n        ? encodeURIComponentFast\n        : encodeURIComponentMinimal;\n    let res = '';\n    let { scheme, authority, path, query, fragment } = uri;\n    if (scheme) {\n        res += scheme;\n        res += ':';\n    }\n    if (authority || scheme === 'file') {\n        res += _slash;\n        res += _slash;\n    }\n    if (authority) {\n        let idx = authority.indexOf('@');\n        if (idx !== -1) {\n            // <user>@<auth>\n            const userinfo = authority.substr(0, idx);\n            authority = authority.substr(idx + 1);\n            idx = userinfo.lastIndexOf(':');\n            if (idx === -1) {\n                res += encoder(userinfo, false, false);\n            }\n            else {\n                // <user>:<pass>@<auth>\n                res += encoder(userinfo.substr(0, idx), false, false);\n                res += ':';\n                res += encoder(userinfo.substr(idx + 1), false, true);\n            }\n            res += '@';\n        }\n        authority = authority.toLowerCase();\n        idx = authority.lastIndexOf(':');\n        if (idx === -1) {\n            res += encoder(authority, false, true);\n        }\n        else {\n            // <auth>:<port>\n            res += encoder(authority.substr(0, idx), false, true);\n            res += authority.substr(idx);\n        }\n    }\n    if (path) {\n        // lower-case windows drive letters in /C:/fff or C:/fff\n        if (path.length >= 3 && path.charCodeAt(0) === 47 /* CharCode.Slash */ && path.charCodeAt(2) === 58 /* CharCode.Colon */) {\n            const code = path.charCodeAt(1);\n            if (code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */) {\n                path = `/${String.fromCharCode(code + 32)}:${path.substr(3)}`; // \"/c:\".length === 3\n            }\n        }\n        else if (path.length >= 2 && path.charCodeAt(1) === 58 /* CharCode.Colon */) {\n            const code = path.charCodeAt(0);\n            if (code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */) {\n                path = `${String.fromCharCode(code + 32)}:${path.substr(2)}`; // \"/c:\".length === 3\n            }\n        }\n        // encode the rest of the path\n        res += encoder(path, true, false);\n    }\n    if (query) {\n        res += '?';\n        res += encoder(query, false, false);\n    }\n    if (fragment) {\n        res += '#';\n        res += !skipEncoding ? encodeURIComponentFast(fragment, false, false) : fragment;\n    }\n    return res;\n}\n// --- decode\nfunction decodeURIComponentGraceful(str) {\n    try {\n        return decodeURIComponent(str);\n    }\n    catch {\n        if (str.length > 3) {\n            return str.substr(0, 3) + decodeURIComponentGraceful(str.substr(3));\n        }\n        else {\n            return str;\n        }\n    }\n}\nconst _rEncodedAsHex = /(%[0-9A-Za-z][0-9A-Za-z])+/g;\nfunction percentDecode(str) {\n    if (!str.match(_rEncodedAsHex)) {\n        return str;\n    }\n    return str.replace(_rEncodedAsHex, (match) => decodeURIComponentGraceful(match));\n}\n\nexport { URI, uriToFsPath };\n","import { onUnexpectedError } from './errors.js';\nimport { isWeb, isNative, webWorkerOrigin } from './platform.js';\nimport { equalsIgnoreCase, startsWithIgnoreCase } from './strings.js';\nimport { URI } from './uri.js';\nimport { posix } from './path.js';\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 *--------------------------------------------------------------------------------------------*/\nvar Schemas;\n(function (Schemas) {\n    /**\n     * A schema that is used for models that exist in memory\n     * only and that have no correspondence on a server or such.\n     */\n    Schemas.inMemory = 'inmemory';\n    /**\n     * A schema that is used for setting files\n     */\n    Schemas.vscode = 'vscode';\n    /**\n     * A schema that is used for internal private files\n     */\n    Schemas.internal = 'private';\n    /**\n     * A walk-through document.\n     */\n    Schemas.walkThrough = 'walkThrough';\n    /**\n     * An embedded code snippet.\n     */\n    Schemas.walkThroughSnippet = 'walkThroughSnippet';\n    Schemas.http = 'http';\n    Schemas.https = 'https';\n    Schemas.file = 'file';\n    Schemas.mailto = 'mailto';\n    Schemas.untitled = 'untitled';\n    Schemas.data = 'data';\n    Schemas.command = 'command';\n    Schemas.vscodeRemote = 'vscode-remote';\n    Schemas.vscodeRemoteResource = 'vscode-remote-resource';\n    Schemas.vscodeManagedRemoteResource = 'vscode-managed-remote-resource';\n    Schemas.vscodeUserData = 'vscode-userdata';\n    Schemas.vscodeCustomEditor = 'vscode-custom-editor';\n    Schemas.vscodeNotebookCell = 'vscode-notebook-cell';\n    Schemas.vscodeNotebookCellMetadata = 'vscode-notebook-cell-metadata';\n    Schemas.vscodeNotebookCellMetadataDiff = 'vscode-notebook-cell-metadata-diff';\n    Schemas.vscodeNotebookCellOutput = 'vscode-notebook-cell-output';\n    Schemas.vscodeNotebookCellOutputDiff = 'vscode-notebook-cell-output-diff';\n    Schemas.vscodeNotebookMetadata = 'vscode-notebook-metadata';\n    Schemas.vscodeInteractiveInput = 'vscode-interactive-input';\n    Schemas.vscodeSettings = 'vscode-settings';\n    Schemas.vscodeWorkspaceTrust = 'vscode-workspace-trust';\n    Schemas.vscodeTerminal = 'vscode-terminal';\n    /** Scheme used for code blocks in chat. */\n    Schemas.vscodeChatCodeBlock = 'vscode-chat-code-block';\n    /** Scheme used for LHS of code compare (aka diff) blocks in chat. */\n    Schemas.vscodeChatCodeCompareBlock = 'vscode-chat-code-compare-block';\n    /** Scheme used for the chat input editor. */\n    Schemas.vscodeChatEditor = 'vscode-chat-editor';\n    /** Scheme used for the chat input part */\n    Schemas.vscodeChatInput = 'chatSessionInput';\n    /** Scheme used for local chat session content */\n    Schemas.vscodeLocalChatSession = 'vscode-chat-session';\n    /**\n     * Scheme used internally for webviews that aren't linked to a resource (i.e. not custom editors)\n     */\n    Schemas.webviewPanel = 'webview-panel';\n    /**\n     * Scheme used for loading the wrapper html and script in webviews.\n     */\n    Schemas.vscodeWebview = 'vscode-webview';\n    /**\n     * Scheme used for extension pages\n     */\n    Schemas.extension = 'extension';\n    /**\n     * Scheme used as a replacement of `file` scheme to load\n     * files with our custom protocol handler (desktop only).\n     */\n    Schemas.vscodeFileResource = 'vscode-file';\n    /**\n     * Scheme used for temporary resources\n     */\n    Schemas.tmp = 'tmp';\n    /**\n     * Scheme used vs live share\n     */\n    Schemas.vsls = 'vsls';\n    /**\n     * Scheme used for the Source Control commit input's text document\n     */\n    Schemas.vscodeSourceControl = 'vscode-scm';\n    /**\n     * Scheme used for input box for creating comments.\n     */\n    Schemas.commentsInput = 'comment';\n    /**\n     * Scheme used for special rendering of settings in the release notes\n     */\n    Schemas.codeSetting = 'code-setting';\n    /**\n     * Scheme used for output panel resources\n     */\n    Schemas.outputChannel = 'output';\n    /**\n     * Scheme used for the accessible view\n     */\n    Schemas.accessibleView = 'accessible-view';\n    /**\n     * Used for snapshots of chat edits\n     */\n    Schemas.chatEditingSnapshotScheme = 'chat-editing-snapshot-text-model';\n    Schemas.chatEditingModel = 'chat-editing-text-model';\n    /**\n     * Used for rendering multidiffs in copilot agent sessions\n     */\n    Schemas.copilotPr = 'copilot-pr';\n})(Schemas || (Schemas = {}));\nfunction matchesScheme(target, scheme) {\n    if (URI.isUri(target)) {\n        return equalsIgnoreCase(target.scheme, scheme);\n    }\n    else {\n        return startsWithIgnoreCase(target, scheme + ':');\n    }\n}\nfunction matchesSomeScheme(target, ...schemes) {\n    return schemes.some(scheme => matchesScheme(target, scheme));\n}\nconst connectionTokenQueryName = 'tkn';\nclass RemoteAuthoritiesImpl {\n    constructor() {\n        this._hosts = Object.create(null);\n        this._ports = Object.create(null);\n        this._connectionTokens = Object.create(null);\n        this._preferredWebSchema = 'http';\n        this._delegate = null;\n        this._serverRootPath = '/';\n    }\n    setPreferredWebSchema(schema) {\n        this._preferredWebSchema = schema;\n    }\n    get _remoteResourcesPath() {\n        return posix.join(this._serverRootPath, Schemas.vscodeRemoteResource);\n    }\n    rewrite(uri) {\n        if (this._delegate) {\n            try {\n                return this._delegate(uri);\n            }\n            catch (err) {\n                onUnexpectedError(err);\n                return uri;\n            }\n        }\n        const authority = uri.authority;\n        let host = this._hosts[authority];\n        if (host && host.indexOf(':') !== -1 && host.indexOf('[') === -1) {\n            host = `[${host}]`;\n        }\n        const port = this._ports[authority];\n        const connectionToken = this._connectionTokens[authority];\n        let query = `path=${encodeURIComponent(uri.path)}`;\n        if (typeof connectionToken === 'string') {\n            query += `&${connectionTokenQueryName}=${encodeURIComponent(connectionToken)}`;\n        }\n        return URI.from({\n            scheme: isWeb ? this._preferredWebSchema : Schemas.vscodeRemoteResource,\n            authority: `${host}:${port}`,\n            path: this._remoteResourcesPath,\n            query\n        });\n    }\n}\nconst RemoteAuthorities = new RemoteAuthoritiesImpl();\nconst VSCODE_AUTHORITY = 'vscode-app';\nclass FileAccessImpl {\n    static { this.FALLBACK_AUTHORITY = VSCODE_AUTHORITY; }\n    /**\n     * Returns a URI to use in contexts where the browser is responsible\n     * for loading (e.g. fetch()) or when used within the DOM.\n     *\n     * **Note:** use `dom.ts#asCSSUrl` whenever the URL is to be used in CSS context.\n     */\n    uriToBrowserUri(uri) {\n        // Handle remote URIs via `RemoteAuthorities`\n        if (uri.scheme === Schemas.vscodeRemote) {\n            return RemoteAuthorities.rewrite(uri);\n        }\n        // Convert to `vscode-file` resource..\n        if (\n        // ...only ever for `file` resources\n        uri.scheme === Schemas.file &&\n            (\n            // ...and we run in native environments\n            isNative ||\n                // ...or web worker extensions on desktop\n                (webWorkerOrigin === `${Schemas.vscodeFileResource}://${FileAccessImpl.FALLBACK_AUTHORITY}`))) {\n            return uri.with({\n                scheme: Schemas.vscodeFileResource,\n                // We need to provide an authority here so that it can serve\n                // as origin for network and loading matters in chromium.\n                // If the URI is not coming with an authority already, we\n                // add our own\n                authority: uri.authority || FileAccessImpl.FALLBACK_AUTHORITY,\n                query: null,\n                fragment: null\n            });\n        }\n        return uri;\n    }\n}\nconst FileAccess = new FileAccessImpl();\nvar COI;\n(function (COI) {\n    const coiHeaders = new Map([\n        ['1', { 'Cross-Origin-Opener-Policy': 'same-origin' }],\n        ['2', { 'Cross-Origin-Embedder-Policy': 'require-corp' }],\n        ['3', { 'Cross-Origin-Opener-Policy': 'same-origin', 'Cross-Origin-Embedder-Policy': 'require-corp' }],\n    ]);\n    COI.CoopAndCoep = Object.freeze(coiHeaders.get('3'));\n    const coiSearchParamName = 'vscode-coi';\n    /**\n     * Extract desired headers from `vscode-coi` invocation\n     */\n    function getHeadersFromQuery(url) {\n        let params;\n        if (typeof url === 'string') {\n            params = new URL(url).searchParams;\n        }\n        else if (url instanceof URL) {\n            params = url.searchParams;\n        }\n        else if (URI.isUri(url)) {\n            params = new URL(url.toString(true)).searchParams;\n        }\n        const value = params?.get(coiSearchParamName);\n        if (!value) {\n            return undefined;\n        }\n        return coiHeaders.get(value);\n    }\n    COI.getHeadersFromQuery = getHeadersFromQuery;\n    /**\n     * Add the `vscode-coi` query attribute based on wanting `COOP` and `COEP`. Will be a noop when `crossOriginIsolated`\n     * isn't enabled the current context\n     */\n    function addSearchParam(urlOrSearch, coop, coep) {\n        // eslint-disable-next-line local/code-no-any-casts\n        if (!globalThis.crossOriginIsolated) {\n            // depends on the current context being COI\n            return;\n        }\n        const value = coop && coep ? '3' : coep ? '2' : '1';\n        if (urlOrSearch instanceof URLSearchParams) {\n            urlOrSearch.set(coiSearchParamName, value);\n        }\n        else {\n            urlOrSearch[coiSearchParamName] = value;\n        }\n    }\n    COI.addSearchParam = addSearchParam;\n})(COI || (COI = {}));\n\nexport { COI, FileAccess, RemoteAuthorities, Schemas, VSCODE_AUTHORITY, connectionTokenQueryName, matchesScheme, matchesSomeScheme };\n","import { Lazy } from './lazy.js';\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 *--------------------------------------------------------------------------------------------*/\nconst hasBuffer = (typeof Buffer !== 'undefined');\nnew Lazy(() => new Uint8Array(256));\nlet textDecoder;\nclass VSBuffer {\n    /**\n     * When running in a nodejs context, if `actual` is not a nodejs Buffer, the backing store for\n     * the returned `VSBuffer` instance might use a nodejs Buffer allocated from node's Buffer pool,\n     * which is not transferrable.\n     */\n    static wrap(actual) {\n        if (hasBuffer && !(Buffer.isBuffer(actual))) {\n            // https://nodejs.org/dist/latest-v10.x/docs/api/buffer.html#buffer_class_method_buffer_from_arraybuffer_byteoffset_length\n            // Create a zero-copy Buffer wrapper around the ArrayBuffer pointed to by the Uint8Array\n            actual = Buffer.from(actual.buffer, actual.byteOffset, actual.byteLength);\n        }\n        return new VSBuffer(actual);\n    }\n    constructor(buffer) {\n        this.buffer = buffer;\n        this.byteLength = this.buffer.byteLength;\n    }\n    toString() {\n        if (hasBuffer) {\n            return this.buffer.toString();\n        }\n        else {\n            if (!textDecoder) {\n                textDecoder = new TextDecoder();\n            }\n            return textDecoder.decode(this.buffer);\n        }\n    }\n}\nfunction readUInt16LE(source, offset) {\n    return (((source[offset + 0] << 0) >>> 0) |\n        ((source[offset + 1] << 8) >>> 0));\n}\nfunction writeUInt16LE(destination, value, offset) {\n    destination[offset + 0] = (value & 0b11111111);\n    value = value >>> 8;\n    destination[offset + 1] = (value & 0b11111111);\n}\nfunction readUInt32BE(source, offset) {\n    return (source[offset] * 2 ** 24\n        + source[offset + 1] * 2 ** 16\n        + source[offset + 2] * 2 ** 8\n        + source[offset + 3]);\n}\nfunction writeUInt32BE(destination, value, offset) {\n    destination[offset + 3] = value;\n    value = value >>> 8;\n    destination[offset + 2] = value;\n    value = value >>> 8;\n    destination[offset + 1] = value;\n    value = value >>> 8;\n    destination[offset] = value;\n}\nfunction readUInt8(source, offset) {\n    return source[offset];\n}\nfunction writeUInt8(destination, value, offset) {\n    destination[offset] = value;\n}\nconst hexChars = '0123456789abcdef';\nfunction encodeHex({ buffer }) {\n    let result = '';\n    for (let i = 0; i < buffer.length; i++) {\n        const byte = buffer[i];\n        result += hexChars[byte >>> 4];\n        result += hexChars[byte & 0x0f];\n    }\n    return result;\n}\n\nexport { VSBuffer, encodeHex, readUInt16LE, readUInt32BE, readUInt8, writeUInt16LE, writeUInt32BE, writeUInt8 };\n","import { encodeHex, VSBuffer } from './buffer.js';\nimport { isHighSurrogate, isLowSurrogate, computeCodePoint } from './strings.js';\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/**\n * Return a hash value for an object.\n *\n * Note that this should not be used for binary data types. Instead,\n * prefer {@link hashAsync}.\n */\nfunction hash(obj) {\n    return doHash(obj, 0);\n}\nfunction doHash(obj, hashVal) {\n    switch (typeof obj) {\n        case 'object':\n            if (obj === null) {\n                return numberHash(349, hashVal);\n            }\n            else if (Array.isArray(obj)) {\n                return arrayHash(obj, hashVal);\n            }\n            return objectHash(obj, hashVal);\n        case 'string':\n            return stringHash(obj, hashVal);\n        case 'boolean':\n            return booleanHash(obj, hashVal);\n        case 'number':\n            return numberHash(obj, hashVal);\n        case 'undefined':\n            return numberHash(937, hashVal);\n        default:\n            return numberHash(617, hashVal);\n    }\n}\nfunction numberHash(val, initialHashVal) {\n    return (((initialHashVal << 5) - initialHashVal) + val) | 0; // hashVal * 31 + ch, keep as int32\n}\nfunction booleanHash(b, initialHashVal) {\n    return numberHash(b ? 433 : 863, initialHashVal);\n}\nfunction stringHash(s, hashVal) {\n    hashVal = numberHash(149417, hashVal);\n    for (let i = 0, length = s.length; i < length; i++) {\n        hashVal = numberHash(s.charCodeAt(i), hashVal);\n    }\n    return hashVal;\n}\nfunction arrayHash(arr, initialHashVal) {\n    initialHashVal = numberHash(104579, initialHashVal);\n    return arr.reduce((hashVal, item) => doHash(item, hashVal), initialHashVal);\n}\nfunction objectHash(obj, initialHashVal) {\n    initialHashVal = numberHash(181387, initialHashVal);\n    return Object.keys(obj).sort().reduce((hashVal, key) => {\n        hashVal = stringHash(key, hashVal);\n        return doHash(obj[key], hashVal);\n    }, initialHashVal);\n}\nfunction leftRotate(value, bits, totalBits = 32) {\n    // delta + bits = totalBits\n    const delta = totalBits - bits;\n    // All ones, expect `delta` zeros aligned to the right\n    const mask = ~((1 << delta) - 1);\n    // Join (value left-shifted `bits` bits) with (masked value right-shifted `delta` bits)\n    return ((value << bits) | ((mask & value) >>> delta)) >>> 0;\n}\nfunction toHexString(bufferOrValue, bitsize = 32) {\n    if (bufferOrValue instanceof ArrayBuffer) {\n        return encodeHex(VSBuffer.wrap(new Uint8Array(bufferOrValue)));\n    }\n    return (bufferOrValue >>> 0).toString(16).padStart(bitsize / 4, '0');\n}\n/**\n * A SHA1 implementation that works with strings and does not allocate.\n *\n * Prefer to use {@link hashAsync} in async contexts\n */\nclass StringSHA1 {\n    static { this._bigBlock32 = new DataView(new ArrayBuffer(320)); } // 80 * 4 = 320\n    constructor() {\n        this._h0 = 0x67452301;\n        this._h1 = 0xEFCDAB89;\n        this._h2 = 0x98BADCFE;\n        this._h3 = 0x10325476;\n        this._h4 = 0xC3D2E1F0;\n        this._buff = new Uint8Array(64 /* SHA1Constant.BLOCK_SIZE */ + 3 /* to fit any utf-8 */);\n        this._buffDV = new DataView(this._buff.buffer);\n        this._buffLen = 0;\n        this._totalLen = 0;\n        this._leftoverHighSurrogate = 0;\n        this._finished = false;\n    }\n    update(str) {\n        const strLen = str.length;\n        if (strLen === 0) {\n            return;\n        }\n        const buff = this._buff;\n        let buffLen = this._buffLen;\n        let leftoverHighSurrogate = this._leftoverHighSurrogate;\n        let charCode;\n        let offset;\n        if (leftoverHighSurrogate !== 0) {\n            charCode = leftoverHighSurrogate;\n            offset = -1;\n            leftoverHighSurrogate = 0;\n        }\n        else {\n            charCode = str.charCodeAt(0);\n            offset = 0;\n        }\n        while (true) {\n            let codePoint = charCode;\n            if (isHighSurrogate(charCode)) {\n                if (offset + 1 < strLen) {\n                    const nextCharCode = str.charCodeAt(offset + 1);\n                    if (isLowSurrogate(nextCharCode)) {\n                        offset++;\n                        codePoint = computeCodePoint(charCode, nextCharCode);\n                    }\n                    else {\n                        // illegal => unicode replacement character\n                        codePoint = 65533 /* SHA1Constant.UNICODE_REPLACEMENT */;\n                    }\n                }\n                else {\n                    // last character is a surrogate pair\n                    leftoverHighSurrogate = charCode;\n                    break;\n                }\n            }\n            else if (isLowSurrogate(charCode)) {\n                // illegal => unicode replacement character\n                codePoint = 65533 /* SHA1Constant.UNICODE_REPLACEMENT */;\n            }\n            buffLen = this._push(buff, buffLen, codePoint);\n            offset++;\n            if (offset < strLen) {\n                charCode = str.charCodeAt(offset);\n            }\n            else {\n                break;\n            }\n        }\n        this._buffLen = buffLen;\n        this._leftoverHighSurrogate = leftoverHighSurrogate;\n    }\n    _push(buff, buffLen, codePoint) {\n        if (codePoint < 0x0080) {\n            buff[buffLen++] = codePoint;\n        }\n        else if (codePoint < 0x0800) {\n            buff[buffLen++] = 0b11000000 | ((codePoint & 0b00000000000000000000011111000000) >>> 6);\n            buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0);\n        }\n        else if (codePoint < 0x10000) {\n            buff[buffLen++] = 0b11100000 | ((codePoint & 0b00000000000000001111000000000000) >>> 12);\n            buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000111111000000) >>> 6);\n            buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0);\n        }\n        else {\n            buff[buffLen++] = 0b11110000 | ((codePoint & 0b00000000000111000000000000000000) >>> 18);\n            buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000111111000000000000) >>> 12);\n            buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000111111000000) >>> 6);\n            buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0);\n        }\n        if (buffLen >= 64 /* SHA1Constant.BLOCK_SIZE */) {\n            this._step();\n            buffLen -= 64 /* SHA1Constant.BLOCK_SIZE */;\n            this._totalLen += 64 /* SHA1Constant.BLOCK_SIZE */;\n            // take last 3 in case of UTF8 overflow\n            buff[0] = buff[64 /* SHA1Constant.BLOCK_SIZE */ + 0];\n            buff[1] = buff[64 /* SHA1Constant.BLOCK_SIZE */ + 1];\n            buff[2] = buff[64 /* SHA1Constant.BLOCK_SIZE */ + 2];\n        }\n        return buffLen;\n    }\n    digest() {\n        if (!this._finished) {\n            this._finished = true;\n            if (this._leftoverHighSurrogate) {\n                // illegal => unicode replacement character\n                this._leftoverHighSurrogate = 0;\n                this._buffLen = this._push(this._buff, this._buffLen, 65533 /* SHA1Constant.UNICODE_REPLACEMENT */);\n            }\n            this._totalLen += this._buffLen;\n            this._wrapUp();\n        }\n        return toHexString(this._h0) + toHexString(this._h1) + toHexString(this._h2) + toHexString(this._h3) + toHexString(this._h4);\n    }\n    _wrapUp() {\n        this._buff[this._buffLen++] = 0x80;\n        this._buff.subarray(this._buffLen).fill(0);\n        if (this._buffLen > 56) {\n            this._step();\n            this._buff.fill(0);\n        }\n        // this will fit because the mantissa can cover up to 52 bits\n        const ml = 8 * this._totalLen;\n        this._buffDV.setUint32(56, Math.floor(ml / 4294967296), false);\n        this._buffDV.setUint32(60, ml % 4294967296, false);\n        this._step();\n    }\n    _step() {\n        const bigBlock32 = StringSHA1._bigBlock32;\n        const data = this._buffDV;\n        for (let j = 0; j < 64 /* 16*4 */; j += 4) {\n            bigBlock32.setUint32(j, data.getUint32(j, false), false);\n        }\n        for (let j = 64; j < 320 /* 80*4 */; j += 4) {\n            bigBlock32.setUint32(j, leftRotate((bigBlock32.getUint32(j - 12, false) ^ bigBlock32.getUint32(j - 32, false) ^ bigBlock32.getUint32(j - 56, false) ^ bigBlock32.getUint32(j - 64, false)), 1), false);\n        }\n        let a = this._h0;\n        let b = this._h1;\n        let c = this._h2;\n        let d = this._h3;\n        let e = this._h4;\n        let f, k;\n        let temp;\n        for (let j = 0; j < 80; j++) {\n            if (j < 20) {\n                f = (b & c) | ((~b) & d);\n                k = 0x5A827999;\n            }\n            else if (j < 40) {\n                f = b ^ c ^ d;\n                k = 0x6ED9EBA1;\n            }\n            else if (j < 60) {\n                f = (b & c) | (b & d) | (c & d);\n                k = 0x8F1BBCDC;\n            }\n            else {\n                f = b ^ c ^ d;\n                k = 0xCA62C1D6;\n            }\n            temp = (leftRotate(a, 5) + f + e + k + bigBlock32.getUint32(j * 4, false)) & 0xffffffff;\n            e = d;\n            d = c;\n            c = leftRotate(b, 30);\n            b = a;\n            a = temp;\n        }\n        this._h0 = (this._h0 + a) & 0xffffffff;\n        this._h1 = (this._h1 + b) & 0xffffffff;\n        this._h2 = (this._h2 + c) & 0xffffffff;\n        this._h3 = (this._h3 + d) & 0xffffffff;\n        this._h4 = (this._h4 + e) & 0xffffffff;\n    }\n}\n\nexport { StringSHA1, doHash, hash, numberHash, stringHash };\n","/**\n * Returns the last entry and the initial N-1 entries of the array, as a tuple of [rest, last].\n *\n * The array must have at least one element.\n *\n * @param arr The input array\n * @returns A tuple of [rest, last] where rest is all but the last element and last is the last element\n * @throws Error if the array is empty\n */\nfunction tail(arr) {\n    if (arr.length === 0) {\n        throw new Error('Invalid tail call');\n    }\n    return [arr.slice(0, arr.length - 1), arr[arr.length - 1]];\n}\nfunction equals(one, other, itemEquals = (a, b) => a === b) {\n    if (one === other) {\n        return true;\n    }\n    if (!one || !other) {\n        return false;\n    }\n    if (one.length !== other.length) {\n        return false;\n    }\n    for (let i = 0, len = one.length; i < len; i++) {\n        if (!itemEquals(one[i], other[i])) {\n            return false;\n        }\n    }\n    return true;\n}\n/**\n * Remove the element at `index` by replacing it with the last element. This is faster than `splice`\n * but changes the order of the array\n */\nfunction removeFastWithoutKeepingOrder(array, index) {\n    const last = array.length - 1;\n    if (index < last) {\n        array[index] = array[last];\n    }\n    array.pop();\n}\n/**\n * Performs a binary search algorithm over a sorted array.\n *\n * @param array The array being searched.\n * @param key The value we search for.\n * @param comparator A function that takes two array elements and returns zero\n *   if they are equal, a negative number if the first element precedes the\n *   second one in the sorting order, or a positive number if the second element\n *   precedes the first one.\n * @return See {@link binarySearch2}\n */\nfunction binarySearch(array, key, comparator) {\n    return binarySearch2(array.length, i => comparator(array[i], key));\n}\n/**\n * Performs a binary search algorithm over a sorted collection. Useful for cases\n * when we need to perform a binary search over something that isn't actually an\n * array, and converting data to an array would defeat the use of binary search\n * in the first place.\n *\n * @param length The collection length.\n * @param compareToKey A function that takes an index of an element in the\n *   collection and returns zero if the value at this index is equal to the\n *   search key, a negative number if the value precedes the search key in the\n *   sorting order, or a positive number if the search key precedes the value.\n * @return A non-negative index of an element, if found. If not found, the\n *   result is -(n+1) (or ~n, using bitwise notation), where n is the index\n *   where the key should be inserted to maintain the sorting order.\n */\nfunction binarySearch2(length, compareToKey) {\n    let low = 0, high = length - 1;\n    while (low <= high) {\n        const mid = ((low + high) / 2) | 0;\n        const comp = compareToKey(mid);\n        if (comp < 0) {\n            low = mid + 1;\n        }\n        else if (comp > 0) {\n            high = mid - 1;\n        }\n        else {\n            return mid;\n        }\n    }\n    return -(low + 1);\n}\nfunction quickSelect(nth, data, compare) {\n    nth = nth | 0;\n    if (nth >= data.length) {\n        throw new TypeError('invalid index');\n    }\n    const pivotValue = data[Math.floor(data.length * Math.random())];\n    const lower = [];\n    const higher = [];\n    const pivots = [];\n    for (const value of data) {\n        const val = compare(value, pivotValue);\n        if (val < 0) {\n            lower.push(value);\n        }\n        else if (val > 0) {\n            higher.push(value);\n        }\n        else {\n            pivots.push(value);\n        }\n    }\n    if (nth < lower.length) {\n        return quickSelect(nth, lower, compare);\n    }\n    else if (nth < lower.length + pivots.length) {\n        return pivots[0];\n    }\n    else {\n        return quickSelect(nth - (lower.length + pivots.length), higher, compare);\n    }\n}\nfunction groupBy(data, compare) {\n    const result = [];\n    let currentGroup = undefined;\n    for (const element of data.slice(0).sort(compare)) {\n        if (!currentGroup || compare(currentGroup[0], element) !== 0) {\n            currentGroup = [element];\n            result.push(currentGroup);\n        }\n        else {\n            currentGroup.push(element);\n        }\n    }\n    return result;\n}\n/**\n * Splits the given items into a list of (non-empty) groups.\n * `shouldBeGrouped` is used to decide if two consecutive items should be in the same group.\n * The order of the items is preserved.\n */\nfunction* groupAdjacentBy(items, shouldBeGrouped) {\n    let currentGroup;\n    let last;\n    for (const item of items) {\n        if (last !== undefined && shouldBeGrouped(last, item)) {\n            currentGroup.push(item);\n        }\n        else {\n            if (currentGroup) {\n                yield currentGroup;\n            }\n            currentGroup = [item];\n        }\n        last = item;\n    }\n    if (currentGroup) {\n        yield currentGroup;\n    }\n}\nfunction forEachAdjacent(arr, f) {\n    for (let i = 0; i <= arr.length; i++) {\n        f(i === 0 ? undefined : arr[i - 1], i === arr.length ? undefined : arr[i]);\n    }\n}\nfunction forEachWithNeighbors(arr, f) {\n    for (let i = 0; i < arr.length; i++) {\n        f(i === 0 ? undefined : arr[i - 1], arr[i], i + 1 === arr.length ? undefined : arr[i + 1]);\n    }\n}\n/**\n * @returns New array with all falsy values removed. The original array IS NOT modified.\n */\nfunction coalesce(array) {\n    return array.filter((e) => !!e);\n}\n/**\n * Remove all falsy values from `array`. The original array IS modified.\n */\nfunction coalesceInPlace(array) {\n    let to = 0;\n    for (let i = 0; i < array.length; i++) {\n        if (!!array[i]) {\n            array[to] = array[i];\n            to += 1;\n        }\n    }\n    array.length = to;\n}\n/**\n * @returns false if the provided object is an array and not empty.\n */\nfunction isFalsyOrEmpty(obj) {\n    return !Array.isArray(obj) || obj.length === 0;\n}\nfunction isNonEmptyArray(obj) {\n    return Array.isArray(obj) && obj.length > 0;\n}\n/**\n * Removes duplicates from the given array. The optional keyFn allows to specify\n * how elements are checked for equality by returning an alternate value for each.\n */\nfunction distinct(array, keyFn = value => value) {\n    const seen = new Set();\n    return array.filter(element => {\n        const key = keyFn(element);\n        if (seen.has(key)) {\n            return false;\n        }\n        seen.add(key);\n        return true;\n    });\n}\nfunction range(arg, to) {\n    let from = typeof to === 'number' ? arg : 0;\n    if (typeof to === 'number') {\n        from = arg;\n    }\n    else {\n        from = 0;\n        to = arg;\n    }\n    const result = [];\n    if (from <= to) {\n        for (let i = from; i < to; i++) {\n            result.push(i);\n        }\n    }\n    else {\n        for (let i = from; i > to; i--) {\n            result.push(i);\n        }\n    }\n    return result;\n}\n/**\n * Insert `insertArr` inside `target` at `insertIndex`.\n * Please don't touch unless you understand https://jsperf.com/inserting-an-array-within-an-array\n */\nfunction arrayInsert(target, insertIndex, insertArr) {\n    const before = target.slice(0, insertIndex);\n    const after = target.slice(insertIndex);\n    return before.concat(insertArr, after);\n}\n/**\n * Pushes an element to the start of the array, if found.\n */\nfunction pushToStart(arr, value) {\n    const index = arr.indexOf(value);\n    if (index > -1) {\n        arr.splice(index, 1);\n        arr.unshift(value);\n    }\n}\n/**\n * Pushes an element to the end of the array, if found.\n */\nfunction pushToEnd(arr, value) {\n    const index = arr.indexOf(value);\n    if (index > -1) {\n        arr.splice(index, 1);\n        arr.push(value);\n    }\n}\nfunction pushMany(arr, items) {\n    for (const item of items) {\n        arr.push(item);\n    }\n}\nfunction mapFilter(array, fn) {\n    const result = [];\n    for (const item of array) {\n        const mapped = fn(item);\n        if (mapped !== undefined) {\n            result.push(mapped);\n        }\n    }\n    return result;\n}\nfunction asArray(x) {\n    return Array.isArray(x) ? x : [x];\n}\n/**\n * Insert the new items in the array.\n * @param array The original array.\n * @param start The zero-based location in the array from which to start inserting elements.\n * @param newItems The items to be inserted\n */\nfunction insertInto(array, start, newItems) {\n    const startIdx = getActualStartIndex(array, start);\n    const originalLength = array.length;\n    const newItemsLength = newItems.length;\n    array.length = originalLength + newItemsLength;\n    // Move the items after the start index, start from the end so that we don't overwrite any value.\n    for (let i = originalLength - 1; i >= startIdx; i--) {\n        array[i + newItemsLength] = array[i];\n    }\n    for (let i = 0; i < newItemsLength; i++) {\n        array[i + startIdx] = newItems[i];\n    }\n}\n/**\n * Removes elements from an array and inserts new elements in their place, returning the deleted elements. Alternative to the native Array.splice method, it\n * can only support limited number of items due to the maximum call stack size limit.\n * @param array The original array.\n * @param start The zero-based location in the array from which to start removing elements.\n * @param deleteCount The number of elements to remove.\n * @returns An array containing the elements that were deleted.\n */\nfunction splice(array, start, deleteCount, newItems) {\n    const index = getActualStartIndex(array, start);\n    let result = array.splice(index, deleteCount);\n    if (result === undefined) {\n        // see https://bugs.webkit.org/show_bug.cgi?id=261140\n        result = [];\n    }\n    insertInto(array, index, newItems);\n    return result;\n}\n/**\n * Determine the actual start index (same logic as the native splice() or slice())\n * If greater than the length of the array, start will be set to the length of the array. In this case, no element will be deleted but the method will behave as an adding function, adding as many element as item[n*] provided.\n * If negative, it will begin that many elements from the end of the array. (In this case, the origin -1, meaning -n is the index of the nth last element, and is therefore equivalent to the index of array.length - n.) If array.length + start is less than 0, it will begin from index 0.\n * @param array The target array.\n * @param start The operation index.\n */\nfunction getActualStartIndex(array, start) {\n    return start < 0 ? Math.max(start + array.length, 0) : Math.min(start, array.length);\n}\nvar CompareResult;\n(function (CompareResult) {\n    function isLessThan(result) {\n        return result < 0;\n    }\n    CompareResult.isLessThan = isLessThan;\n    function isLessThanOrEqual(result) {\n        return result <= 0;\n    }\n    CompareResult.isLessThanOrEqual = isLessThanOrEqual;\n    function isGreaterThan(result) {\n        return result > 0;\n    }\n    CompareResult.isGreaterThan = isGreaterThan;\n    function isNeitherLessOrGreaterThan(result) {\n        return result === 0;\n    }\n    CompareResult.isNeitherLessOrGreaterThan = isNeitherLessOrGreaterThan;\n    CompareResult.greaterThan = 1;\n    CompareResult.lessThan = -1;\n    CompareResult.neitherLessOrGreaterThan = 0;\n})(CompareResult || (CompareResult = {}));\nfunction compareBy(selector, comparator) {\n    return (a, b) => comparator(selector(a), selector(b));\n}\nfunction tieBreakComparators(...comparators) {\n    return (item1, item2) => {\n        for (const comparator of comparators) {\n            const result = comparator(item1, item2);\n            if (!CompareResult.isNeitherLessOrGreaterThan(result)) {\n                return result;\n            }\n        }\n        return CompareResult.neitherLessOrGreaterThan;\n    };\n}\n/**\n * The natural order on numbers.\n*/\nconst numberComparator = (a, b) => a - b;\nconst booleanComparator = (a, b) => numberComparator(a ? 1 : 0, b ? 1 : 0);\nfunction reverseOrder(comparator) {\n    return (a, b) => -comparator(a, b);\n}\n/**\n * Returns a new comparator that treats `undefined` as the smallest value.\n * All other values are compared using the given comparator.\n*/\nfunction compareUndefinedSmallest(comparator) {\n    return (a, b) => {\n        if (a === undefined) {\n            return b === undefined ? CompareResult.neitherLessOrGreaterThan : CompareResult.lessThan;\n        }\n        else if (b === undefined) {\n            return CompareResult.greaterThan;\n        }\n        return comparator(a, b);\n    };\n}\nclass ArrayQueue {\n    /**\n     * Constructs a queue that is backed by the given array. Runtime is O(1).\n    */\n    constructor(items) {\n        this.firstIdx = 0;\n        this.items = items;\n        this.lastIdx = this.items.length - 1;\n    }\n    get length() {\n        return this.lastIdx - this.firstIdx + 1;\n    }\n    /**\n     * Consumes elements from the beginning of the queue as long as the predicate returns true.\n     * If no elements were consumed, `null` is returned. Has a runtime of O(result.length).\n    */\n    takeWhile(predicate) {\n        // P(k) := k <= this.lastIdx && predicate(this.items[k])\n        // Find s := min { k | k >= this.firstIdx && !P(k) } and return this.data[this.firstIdx...s)\n        let startIdx = this.firstIdx;\n        while (startIdx < this.items.length && predicate(this.items[startIdx])) {\n            startIdx++;\n        }\n        const result = startIdx === this.firstIdx ? null : this.items.slice(this.firstIdx, startIdx);\n        this.firstIdx = startIdx;\n        return result;\n    }\n    /**\n     * Consumes elements from the end of the queue as long as the predicate returns true.\n     * If no elements were consumed, `null` is returned.\n     * The result has the same order as the underlying array!\n    */\n    takeFromEndWhile(predicate) {\n        // P(k) := this.firstIdx >= k && predicate(this.items[k])\n        // Find s := max { k | k <= this.lastIdx && !P(k) } and return this.data(s...this.lastIdx]\n        let endIdx = this.lastIdx;\n        while (endIdx >= 0 && predicate(this.items[endIdx])) {\n            endIdx--;\n        }\n        const result = endIdx === this.lastIdx ? null : this.items.slice(endIdx + 1, this.lastIdx + 1);\n        this.lastIdx = endIdx;\n        return result;\n    }\n    peek() {\n        if (this.length === 0) {\n            return undefined;\n        }\n        return this.items[this.firstIdx];\n    }\n    dequeue() {\n        const result = this.items[this.firstIdx];\n        this.firstIdx++;\n        return result;\n    }\n    takeCount(count) {\n        const result = this.items.slice(this.firstIdx, this.firstIdx + count);\n        this.firstIdx += count;\n        return result;\n    }\n}\n/**\n * This class is faster than an iterator and array for lazy computed data.\n*/\nclass CallbackIterable {\n    static { this.empty = new CallbackIterable(_callback => { }); }\n    constructor(\n    /**\n     * Calls the callback for every item.\n     * Stops when the callback returns false.\n    */\n    iterate) {\n        this.iterate = iterate;\n    }\n    toArray() {\n        const result = [];\n        this.iterate(item => { result.push(item); return true; });\n        return result;\n    }\n    filter(predicate) {\n        return new CallbackIterable(cb => this.iterate(item => predicate(item) ? cb(item) : true));\n    }\n    map(mapFn) {\n        return new CallbackIterable(cb => this.iterate(item => cb(mapFn(item))));\n    }\n    findLast(predicate) {\n        let result;\n        this.iterate(item => {\n            if (predicate(item)) {\n                result = item;\n            }\n            return true;\n        });\n        return result;\n    }\n    findLastMaxBy(comparator) {\n        let result;\n        let first = true;\n        this.iterate(item => {\n            if (first || CompareResult.isGreaterThan(comparator(item, result))) {\n                first = false;\n                result = item;\n            }\n            return true;\n        });\n        return result;\n    }\n}\n/**\n * Represents a re-arrangement of items in an array.\n */\nclass Permutation {\n    constructor(_indexMap) {\n        this._indexMap = _indexMap;\n    }\n    /**\n     * Returns a permutation that sorts the given array according to the given compare function.\n     */\n    static createSortPermutation(arr, compareFn) {\n        const sortIndices = Array.from(arr.keys()).sort((index1, index2) => compareFn(arr[index1], arr[index2]));\n        return new Permutation(sortIndices);\n    }\n    /**\n     * Returns a new array with the elements of the given array re-arranged according to this permutation.\n     */\n    apply(arr) {\n        return arr.map((_, index) => arr[this._indexMap[index]]);\n    }\n    /**\n     * Returns a new permutation that undoes the re-arrangement of this permutation.\n    */\n    inverse() {\n        const inverseIndexMap = this._indexMap.slice();\n        for (let i = 0; i < this._indexMap.length; i++) {\n            inverseIndexMap[this._indexMap[i]] = i;\n        }\n        return new Permutation(inverseIndexMap);\n    }\n}\nfunction sum(array) {\n    return array.reduce((acc, value) => acc + value, 0);\n}\n\nexport { ArrayQueue, CallbackIterable, CompareResult, Permutation, arrayInsert, asArray, binarySearch, binarySearch2, booleanComparator, coalesce, coalesceInPlace, compareBy, compareUndefinedSmallest, distinct, equals, forEachAdjacent, forEachWithNeighbors, groupAdjacentBy, groupBy, insertInto, isFalsyOrEmpty, isNonEmptyArray, mapFilter, numberComparator, pushMany, pushToEnd, pushToStart, quickSelect, range, removeFastWithoutKeepingOrder, reverseOrder, splice, sum, tail, tieBreakComparators };\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 *--------------------------------------------------------------------------------------------*/\nlet globalObservableLogger;\nfunction addLogger(logger) {\n    if (!globalObservableLogger) {\n        globalObservableLogger = logger;\n    }\n    else if (globalObservableLogger instanceof ComposedLogger) {\n        globalObservableLogger.loggers.push(logger);\n    }\n    else {\n        globalObservableLogger = new ComposedLogger([globalObservableLogger, logger]);\n    }\n}\nfunction getLogger() {\n    return globalObservableLogger;\n}\nclass ComposedLogger {\n    constructor(loggers) {\n        this.loggers = loggers;\n    }\n    handleObservableCreated(observable, location) {\n        for (const logger of this.loggers) {\n            logger.handleObservableCreated(observable, location);\n        }\n    }\n    handleOnListenerCountChanged(observable, newCount) {\n        for (const logger of this.loggers) {\n            logger.handleOnListenerCountChanged(observable, newCount);\n        }\n    }\n    handleObservableUpdated(observable, info) {\n        for (const logger of this.loggers) {\n            logger.handleObservableUpdated(observable, info);\n        }\n    }\n    handleAutorunCreated(autorun, location) {\n        for (const logger of this.loggers) {\n            logger.handleAutorunCreated(autorun, location);\n        }\n    }\n    handleAutorunDisposed(autorun) {\n        for (const logger of this.loggers) {\n            logger.handleAutorunDisposed(autorun);\n        }\n    }\n    handleAutorunDependencyChanged(autorun, observable, change) {\n        for (const logger of this.loggers) {\n            logger.handleAutorunDependencyChanged(autorun, observable, change);\n        }\n    }\n    handleAutorunStarted(autorun) {\n        for (const logger of this.loggers) {\n            logger.handleAutorunStarted(autorun);\n        }\n    }\n    handleAutorunFinished(autorun) {\n        for (const logger of this.loggers) {\n            logger.handleAutorunFinished(autorun);\n        }\n    }\n    handleDerivedDependencyChanged(derived, observable, change) {\n        for (const logger of this.loggers) {\n            logger.handleDerivedDependencyChanged(derived, observable, change);\n        }\n    }\n    handleDerivedCleared(observable) {\n        for (const logger of this.loggers) {\n            logger.handleDerivedCleared(observable);\n        }\n    }\n    handleBeginTransaction(transaction) {\n        for (const logger of this.loggers) {\n            logger.handleBeginTransaction(transaction);\n        }\n    }\n    handleEndTransaction(transaction) {\n        for (const logger of this.loggers) {\n            logger.handleEndTransaction(transaction);\n        }\n    }\n}\n\nexport { addLogger, getLogger };\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 *--------------------------------------------------------------------------------------------*/\nvar DebugLocation;\n(function (DebugLocation) {\n    let enabled = false;\n    function enable() {\n        enabled = true;\n    }\n    DebugLocation.enable = enable;\n    function ofCaller() {\n        if (!enabled) {\n            return undefined;\n        }\n        // eslint-disable-next-line local/code-no-any-casts\n        const Err = Error; // For the monaco editor checks, which don't have the nodejs types.\n        const l = Err.stackTraceLimit;\n        Err.stackTraceLimit = 3;\n        const stack = new Error().stack;\n        Err.stackTraceLimit = l;\n        return DebugLocationImpl.fromStack(stack, 2);\n    }\n    DebugLocation.ofCaller = ofCaller;\n})(DebugLocation || (DebugLocation = {}));\nclass DebugLocationImpl {\n    static fromStack(stack, parentIdx) {\n        const lines = stack.split('\\n');\n        const location = parseLine(lines[parentIdx + 1]);\n        if (location) {\n            return new DebugLocationImpl(location.fileName, location.line, location.column, location.id);\n        }\n        else {\n            return undefined;\n        }\n    }\n    constructor(fileName, line, column, id) {\n        this.fileName = fileName;\n        this.line = line;\n        this.column = column;\n        this.id = id;\n    }\n}\nfunction parseLine(stackLine) {\n    const match = stackLine.match(/\\((.*):(\\d+):(\\d+)\\)/);\n    if (match) {\n        return {\n            fileName: match[1],\n            line: parseInt(match[2]),\n            column: parseInt(match[3]),\n            id: stackLine,\n        };\n    }\n    const match2 = stackLine.match(/at ([^\\(\\)]*):(\\d+):(\\d+)/);\n    if (match2) {\n        return {\n            fileName: match2[1],\n            line: parseInt(match2[2]),\n            column: parseInt(match2[3]),\n            id: stackLine,\n        };\n    }\n    return undefined;\n}\n\nexport { DebugLocation };\n","import { equals } from './arrays.js';\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/**\n * Compares two items for equality using strict equality.\n*/\nconst strictEquals = (a, b) => a === b;\n/**\n * Checks if the items of two arrays are equal.\n * By default, strict equality is used to compare elements, but a custom equality comparer can be provided.\n */\nfunction itemsEquals(itemEquals = strictEquals) {\n    return (a, b) => equals(a, b, itemEquals);\n}\n/**\n * Uses `item.equals(other)` to determine equality.\n */\nfunction itemEquals() {\n    return (a, b) => a.equals(b);\n}\nfunction equalsIfDefined(equalsOrV1, v2, equals) {\n    if (equals !== undefined) {\n        const v1 = equalsOrV1;\n        if (v1 === undefined || v1 === null || v2 === undefined || v2 === null) {\n            return v2 === v1;\n        }\n        return equals(v1, v2);\n    }\n    else {\n        const equals = equalsOrV1;\n        return (v1, v2) => {\n            if (v1 === undefined || v1 === null || v2 === undefined || v2 === null) {\n                return v2 === v1;\n            }\n            return equals(v1, v2);\n        };\n    }\n}\n/**\n * Drills into arrays (items ordered) and objects (keys unordered) and uses strict equality on everything else.\n*/\nfunction structuralEquals(a, b) {\n    if (a === b) {\n        return true;\n    }\n    if (Array.isArray(a) && Array.isArray(b)) {\n        if (a.length !== b.length) {\n            return false;\n        }\n        for (let i = 0; i < a.length; i++) {\n            if (!structuralEquals(a[i], b[i])) {\n                return false;\n            }\n        }\n        return true;\n    }\n    if (a && typeof a === 'object' && b && typeof b === 'object') {\n        if (Object.getPrototypeOf(a) === Object.prototype && Object.getPrototypeOf(b) === Object.prototype) {\n            const aObj = a;\n            const bObj = b;\n            const keysA = Object.keys(aObj);\n            const keysB = Object.keys(bObj);\n            const keysBSet = new Set(keysB);\n            if (keysA.length !== keysB.length) {\n                return false;\n            }\n            for (const key of keysA) {\n                if (!keysBSet.has(key)) {\n                    return false;\n                }\n                if (!structuralEquals(aObj[key], bObj[key])) {\n                    return false;\n                }\n            }\n            return true;\n        }\n    }\n    return false;\n}\n\nexport { equalsIfDefined, itemEquals, itemsEquals, strictEquals, structuralEquals };\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 *--------------------------------------------------------------------------------------------*/\nclass DebugNameData {\n    constructor(owner, debugNameSource, referenceFn) {\n        this.owner = owner;\n        this.debugNameSource = debugNameSource;\n        this.referenceFn = referenceFn;\n    }\n    getDebugName(target) {\n        return getDebugName(target, this);\n    }\n}\nconst countPerName = new Map();\nconst cachedDebugName = new WeakMap();\nfunction getDebugName(target, data) {\n    const cached = cachedDebugName.get(target);\n    if (cached) {\n        return cached;\n    }\n    const dbgName = computeDebugName(target, data);\n    if (dbgName) {\n        let count = countPerName.get(dbgName) ?? 0;\n        count++;\n        countPerName.set(dbgName, count);\n        const result = count === 1 ? dbgName : `${dbgName}#${count}`;\n        cachedDebugName.set(target, result);\n        return result;\n    }\n    return undefined;\n}\nfunction computeDebugName(self, data) {\n    const cached = cachedDebugName.get(self);\n    if (cached) {\n        return cached;\n    }\n    const ownerStr = data.owner ? formatOwner(data.owner) + `.` : '';\n    let result;\n    const debugNameSource = data.debugNameSource;\n    if (debugNameSource !== undefined) {\n        if (typeof debugNameSource === 'function') {\n            result = debugNameSource();\n            if (result !== undefined) {\n                return ownerStr + result;\n            }\n        }\n        else {\n            return ownerStr + debugNameSource;\n        }\n    }\n    const referenceFn = data.referenceFn;\n    if (referenceFn !== undefined) {\n        result = getFunctionName(referenceFn);\n        if (result !== undefined) {\n            return ownerStr + result;\n        }\n    }\n    if (data.owner !== undefined) {\n        const key = findKey(data.owner, self);\n        if (key !== undefined) {\n            return ownerStr + key;\n        }\n    }\n    return undefined;\n}\nfunction findKey(obj, value) {\n    for (const key in obj) {\n        // eslint-disable-next-line local/code-no-any-casts\n        if (obj[key] === value) {\n            return key;\n        }\n    }\n    return undefined;\n}\nconst countPerClassName = new Map();\nconst ownerId = new WeakMap();\nfunction formatOwner(owner) {\n    const id = ownerId.get(owner);\n    if (id) {\n        return id;\n    }\n    const className = getClassName(owner) ?? 'Object';\n    let count = countPerClassName.get(className) ?? 0;\n    count++;\n    countPerClassName.set(className, count);\n    const result = count === 1 ? className : `${className}#${count}`;\n    ownerId.set(owner, result);\n    return result;\n}\nfunction getClassName(obj) {\n    const ctor = obj.constructor;\n    if (ctor) {\n        if (ctor.name === 'Object') {\n            return undefined;\n        }\n        return ctor.name;\n    }\n    return undefined;\n}\nfunction getFunctionName(fn) {\n    const fnSrc = fn.toString();\n    // Pattern: /** @description ... */\n    const regexp = /\\/\\*\\*\\s*@description\\s*([^*]*)\\*\\//;\n    const match = regexp.exec(fnSrc);\n    const result = match ? match[1] : undefined;\n    return result?.trim();\n}\n\nexport { DebugNameData, getClassName, getDebugName, getFunctionName };\n","import { DebugLocation } from '../debugLocation.js';\nimport { getFunctionName } from '../debugName.js';\nimport { getLogger } from '../logging/logging.js';\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 *--------------------------------------------------------------------------------------------*/\nlet _derived;\n/**\n * @internal\n * This is to allow splitting files.\n*/\nfunction _setDerivedOpts(derived) {\n    _derived = derived;\n}\nlet _recomputeInitiallyAndOnChange;\nfunction _setRecomputeInitiallyAndOnChange(recomputeInitiallyAndOnChange) {\n    _recomputeInitiallyAndOnChange = recomputeInitiallyAndOnChange;\n}\nclass ConvenientObservable {\n    get TChange() { return null; }\n    reportChanges() {\n        this.get();\n    }\n    /** @sealed */\n    read(reader) {\n        if (reader) {\n            return reader.readObservable(this);\n        }\n        else {\n            return this.get();\n        }\n    }\n    map(fnOrOwner, fnOrUndefined, debugLocation = DebugLocation.ofCaller()) {\n        const owner = fnOrUndefined === undefined ? undefined : fnOrOwner;\n        const fn = fnOrUndefined === undefined ? fnOrOwner : fnOrUndefined;\n        return _derived({\n            owner,\n            debugName: () => {\n                const name = getFunctionName(fn);\n                if (name !== undefined) {\n                    return name;\n                }\n                // regexp to match `x => x.y` or `x => x?.y` where x and y can be arbitrary identifiers (uses backref):\n                const regexp = /^\\s*\\(?\\s*([a-zA-Z_$][a-zA-Z_$0-9]*)\\s*\\)?\\s*=>\\s*\\1(?:\\??)\\.([a-zA-Z_$][a-zA-Z_$0-9]*)\\s*$/;\n                const match = regexp.exec(fn.toString());\n                if (match) {\n                    return `${this.debugName}.${match[2]}`;\n                }\n                if (!owner) {\n                    return `${this.debugName} (mapped)`;\n                }\n                return undefined;\n            },\n            debugReferenceFn: fn,\n        }, (reader) => fn(this.read(reader), reader), debugLocation);\n    }\n    /**\n     * @sealed\n     * Converts an observable of an observable value into a direct observable of the value.\n    */\n    flatten() {\n        return _derived({\n            owner: undefined,\n            debugName: () => `${this.debugName} (flattened)`,\n        }, (reader) => this.read(reader).read(reader));\n    }\n    recomputeInitiallyAndOnChange(store, handleValue) {\n        store.add(_recomputeInitiallyAndOnChange(this, handleValue));\n        return this;\n    }\n}\nclass BaseObservable extends ConvenientObservable {\n    constructor(debugLocation) {\n        super();\n        this._observers = new Set();\n        getLogger()?.handleObservableCreated(this, debugLocation);\n    }\n    addObserver(observer) {\n        const len = this._observers.size;\n        this._observers.add(observer);\n        if (len === 0) {\n            this.onFirstObserverAdded();\n        }\n        if (len !== this._observers.size) {\n            getLogger()?.handleOnListenerCountChanged(this, this._observers.size);\n        }\n    }\n    removeObserver(observer) {\n        const deleted = this._observers.delete(observer);\n        if (deleted && this._observers.size === 0) {\n            this.onLastObserverRemoved();\n        }\n        if (deleted) {\n            getLogger()?.handleOnListenerCountChanged(this, this._observers.size);\n        }\n    }\n    onFirstObserverAdded() { }\n    onLastObserverRemoved() { }\n    debugGetObservers() {\n        return this._observers;\n    }\n}\n\nexport { BaseObservable, ConvenientObservable, _setDerivedOpts, _setRecomputeInitiallyAndOnChange };\n","import { BaseObservable } from './baseObservable.js';\nimport { assertFn } from '../../assert.js';\nimport '../../arrays.js';\nimport { onBugIndicatingError, BugIndicatingError } from '../../errors.js';\nimport '../../event.js';\nimport { DisposableStore } from '../../lifecycle.js';\nimport { getLogger } from '../logging/logging.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction derivedStateToString(state) {\n    switch (state) {\n        case 0 /* DerivedState.initial */: return 'initial';\n        case 1 /* DerivedState.dependenciesMightHaveChanged */: return 'dependenciesMightHaveChanged';\n        case 2 /* DerivedState.stale */: return 'stale';\n        case 3 /* DerivedState.upToDate */: return 'upToDate';\n        default: return '<unknown>';\n    }\n}\nclass Derived extends BaseObservable {\n    get debugName() {\n        return this._debugNameData.getDebugName(this) ?? '(anonymous)';\n    }\n    constructor(_debugNameData, _computeFn, _changeTracker, _handleLastObserverRemoved = undefined, _equalityComparator, debugLocation) {\n        super(debugLocation);\n        this._debugNameData = _debugNameData;\n        this._computeFn = _computeFn;\n        this._changeTracker = _changeTracker;\n        this._handleLastObserverRemoved = _handleLastObserverRemoved;\n        this._equalityComparator = _equalityComparator;\n        this._state = 0 /* DerivedState.initial */;\n        this._value = undefined;\n        this._updateCount = 0;\n        this._dependencies = new Set();\n        this._dependenciesToBeRemoved = new Set();\n        this._changeSummary = undefined;\n        this._isUpdating = false;\n        this._isComputing = false;\n        this._didReportChange = false;\n        this._isInBeforeUpdate = false;\n        this._isReaderValid = false;\n        this._store = undefined;\n        this._delayedStore = undefined;\n        this._removedObserverToCallEndUpdateOn = null;\n        this._changeSummary = this._changeTracker?.createChangeSummary(undefined);\n    }\n    onLastObserverRemoved() {\n        /**\n         * We are not tracking changes anymore, thus we have to assume\n         * that our cache is invalid.\n         */\n        this._state = 0 /* DerivedState.initial */;\n        this._value = undefined;\n        getLogger()?.handleDerivedCleared(this);\n        for (const d of this._dependencies) {\n            d.removeObserver(this);\n        }\n        this._dependencies.clear();\n        if (this._store !== undefined) {\n            this._store.dispose();\n            this._store = undefined;\n        }\n        if (this._delayedStore !== undefined) {\n            this._delayedStore.dispose();\n            this._delayedStore = undefined;\n        }\n        this._handleLastObserverRemoved?.();\n    }\n    get() {\n        const checkEnabled = false; // TODO set to true\n        if (this._isComputing && checkEnabled) ;\n        if (this._observers.size === 0) {\n            let result;\n            // Without observers, we don't know when to clean up stuff.\n            // Thus, we don't cache anything to prevent memory leaks.\n            try {\n                this._isReaderValid = true;\n                let changeSummary = undefined;\n                if (this._changeTracker) {\n                    changeSummary = this._changeTracker.createChangeSummary(undefined);\n                    this._changeTracker.beforeUpdate?.(this, changeSummary);\n                }\n                result = this._computeFn(this, changeSummary);\n            }\n            finally {\n                this._isReaderValid = false;\n            }\n            // Clear new dependencies\n            this.onLastObserverRemoved();\n            return result;\n        }\n        else {\n            do {\n                // We might not get a notification for a dependency that changed while it is updating,\n                // thus we also have to ask all our depedencies if they changed in this case.\n                if (this._state === 1 /* DerivedState.dependenciesMightHaveChanged */) {\n                    for (const d of this._dependencies) {\n                        /** might call {@link handleChange} indirectly, which could make us stale */\n                        d.reportChanges();\n                        if (this._state === 2 /* DerivedState.stale */) {\n                            // The other dependencies will refresh on demand, so early break\n                            break;\n                        }\n                    }\n                }\n                // We called report changes of all dependencies.\n                // If we are still not stale, we can assume to be up to date again.\n                if (this._state === 1 /* DerivedState.dependenciesMightHaveChanged */) {\n                    this._state = 3 /* DerivedState.upToDate */;\n                }\n                if (this._state !== 3 /* DerivedState.upToDate */) {\n                    this._recompute();\n                }\n                // In case recomputation changed one of our dependencies, we need to recompute again.\n            } while (this._state !== 3 /* DerivedState.upToDate */);\n            return this._value;\n        }\n    }\n    _recompute() {\n        let didChange = false;\n        this._isComputing = true;\n        this._didReportChange = false;\n        const emptySet = this._dependenciesToBeRemoved;\n        this._dependenciesToBeRemoved = this._dependencies;\n        this._dependencies = emptySet;\n        try {\n            const changeSummary = this._changeSummary;\n            this._isReaderValid = true;\n            if (this._changeTracker) {\n                this._isInBeforeUpdate = true;\n                this._changeTracker.beforeUpdate?.(this, changeSummary);\n                this._isInBeforeUpdate = false;\n                this._changeSummary = this._changeTracker?.createChangeSummary(changeSummary);\n            }\n            const hadValue = this._state !== 0 /* DerivedState.initial */;\n            const oldValue = this._value;\n            this._state = 3 /* DerivedState.upToDate */;\n            const delayedStore = this._delayedStore;\n            if (delayedStore !== undefined) {\n                this._delayedStore = undefined;\n            }\n            try {\n                if (this._store !== undefined) {\n                    this._store.dispose();\n                    this._store = undefined;\n                }\n                /** might call {@link handleChange} indirectly, which could invalidate us */\n                this._value = this._computeFn(this, changeSummary);\n            }\n            finally {\n                this._isReaderValid = false;\n                // We don't want our observed observables to think that they are (not even temporarily) not being observed.\n                // Thus, we only unsubscribe from observables that are definitely not read anymore.\n                for (const o of this._dependenciesToBeRemoved) {\n                    o.removeObserver(this);\n                }\n                this._dependenciesToBeRemoved.clear();\n                if (delayedStore !== undefined) {\n                    delayedStore.dispose();\n                }\n            }\n            didChange = this._didReportChange || (hadValue && !(this._equalityComparator(oldValue, this._value)));\n            getLogger()?.handleObservableUpdated(this, {\n                oldValue,\n                newValue: this._value,\n                change: undefined,\n                didChange,\n                hadValue,\n            });\n        }\n        catch (e) {\n            onBugIndicatingError(e);\n        }\n        this._isComputing = false;\n        if (!this._didReportChange && didChange) {\n            for (const r of this._observers) {\n                r.handleChange(this, undefined);\n            }\n        }\n        else {\n            this._didReportChange = false;\n        }\n    }\n    toString() {\n        return `LazyDerived<${this.debugName}>`;\n    }\n    // IObserver Implementation\n    beginUpdate(_observable) {\n        if (this._isUpdating) {\n            throw new BugIndicatingError('Cyclic deriveds are not supported yet!');\n        }\n        this._updateCount++;\n        this._isUpdating = true;\n        try {\n            const propagateBeginUpdate = this._updateCount === 1;\n            if (this._state === 3 /* DerivedState.upToDate */) {\n                this._state = 1 /* DerivedState.dependenciesMightHaveChanged */;\n                // If we propagate begin update, that will already signal a possible change.\n                if (!propagateBeginUpdate) {\n                    for (const r of this._observers) {\n                        r.handlePossibleChange(this);\n                    }\n                }\n            }\n            if (propagateBeginUpdate) {\n                for (const r of this._observers) {\n                    r.beginUpdate(this); // This signals a possible change\n                }\n            }\n        }\n        finally {\n            this._isUpdating = false;\n        }\n    }\n    endUpdate(_observable) {\n        this._updateCount--;\n        if (this._updateCount === 0) {\n            // End update could change the observer list.\n            const observers = [...this._observers];\n            for (const r of observers) {\n                r.endUpdate(this);\n            }\n            if (this._removedObserverToCallEndUpdateOn) {\n                const observers = [...this._removedObserverToCallEndUpdateOn];\n                this._removedObserverToCallEndUpdateOn = null;\n                for (const r of observers) {\n                    r.endUpdate(this);\n                }\n            }\n        }\n        assertFn(() => this._updateCount >= 0);\n    }\n    handlePossibleChange(observable) {\n        // In all other states, observers already know that we might have changed.\n        if (this._state === 3 /* DerivedState.upToDate */ && this._dependencies.has(observable) && !this._dependenciesToBeRemoved.has(observable)) {\n            this._state = 1 /* DerivedState.dependenciesMightHaveChanged */;\n            for (const r of this._observers) {\n                r.handlePossibleChange(this);\n            }\n        }\n    }\n    handleChange(observable, change) {\n        if (this._dependencies.has(observable) && !this._dependenciesToBeRemoved.has(observable) || this._isInBeforeUpdate) {\n            getLogger()?.handleDerivedDependencyChanged(this, observable, change);\n            let shouldReact = false;\n            try {\n                shouldReact = this._changeTracker ? this._changeTracker.handleChange({\n                    changedObservable: observable,\n                    change,\n                    // eslint-disable-next-line local/code-no-any-casts\n                    didChange: (o) => o === observable,\n                }, this._changeSummary) : true;\n            }\n            catch (e) {\n                onBugIndicatingError(e);\n            }\n            const wasUpToDate = this._state === 3 /* DerivedState.upToDate */;\n            if (shouldReact && (this._state === 1 /* DerivedState.dependenciesMightHaveChanged */ || wasUpToDate)) {\n                this._state = 2 /* DerivedState.stale */;\n                if (wasUpToDate) {\n                    for (const r of this._observers) {\n                        r.handlePossibleChange(this);\n                    }\n                }\n            }\n        }\n    }\n    // IReader Implementation\n    _ensureReaderValid() {\n        if (!this._isReaderValid) {\n            throw new BugIndicatingError('The reader object cannot be used outside its compute function!');\n        }\n    }\n    readObservable(observable) {\n        this._ensureReaderValid();\n        // Subscribe before getting the value to enable caching\n        observable.addObserver(this);\n        /** This might call {@link handleChange} indirectly, which could invalidate us */\n        const value = observable.get();\n        // Which is why we only add the observable to the dependencies now.\n        this._dependencies.add(observable);\n        this._dependenciesToBeRemoved.delete(observable);\n        return value;\n    }\n    get store() {\n        this._ensureReaderValid();\n        if (this._store === undefined) {\n            this._store = new DisposableStore();\n        }\n        return this._store;\n    }\n    addObserver(observer) {\n        const shouldCallBeginUpdate = !this._observers.has(observer) && this._updateCount > 0;\n        super.addObserver(observer);\n        if (shouldCallBeginUpdate) {\n            if (this._removedObserverToCallEndUpdateOn && this._removedObserverToCallEndUpdateOn.has(observer)) {\n                this._removedObserverToCallEndUpdateOn.delete(observer);\n            }\n            else {\n                observer.beginUpdate(this);\n            }\n        }\n    }\n    removeObserver(observer) {\n        if (this._observers.has(observer) && this._updateCount > 0) {\n            if (!this._removedObserverToCallEndUpdateOn) {\n                this._removedObserverToCallEndUpdateOn = new Set();\n            }\n            this._removedObserverToCallEndUpdateOn.add(observer);\n        }\n        super.removeObserver(observer);\n    }\n    debugGetState() {\n        return {\n            state: this._state,\n            stateStr: derivedStateToString(this._state),\n            updateCount: this._updateCount,\n            isComputing: this._isComputing,\n            dependencies: this._dependencies,\n            value: this._value,\n        };\n    }\n    debugSetValue(newValue) {\n        // eslint-disable-next-line local/code-no-any-casts\n        this._value = newValue;\n    }\n    debugRecompute() {\n        if (!this._isComputing) {\n            this._recompute();\n        }\n        else {\n            this._state = 2 /* DerivedState.stale */;\n        }\n    }\n    setValue(newValue, tx, change) {\n        this._value = newValue;\n        const observers = this._observers;\n        tx.updateObserver(this, this);\n        for (const d of observers) {\n            d.handleChange(this, change);\n        }\n    }\n}\nclass DerivedWithSetter extends Derived {\n    constructor(debugNameData, computeFn, changeTracker, handleLastObserverRemoved = undefined, equalityComparator, set, debugLocation) {\n        super(debugNameData, computeFn, changeTracker, handleLastObserverRemoved, equalityComparator, debugLocation);\n        this.set = set;\n    }\n}\n\nexport { Derived, DerivedWithSetter };\n","import { strictEquals } from '../../equals.js';\nimport '../../event.js';\nimport { DisposableStore } from '../../lifecycle.js';\nimport { DebugLocation } from '../debugLocation.js';\nimport { DebugNameData } from '../debugName.js';\nimport { _setDerivedOpts } from './baseObservable.js';\nimport { Derived, DerivedWithSetter } from './derivedImpl.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction derived(computeFnOrOwner, computeFn, debugLocation = DebugLocation.ofCaller()) {\n    if (computeFn !== undefined) {\n        return new Derived(new DebugNameData(computeFnOrOwner, undefined, computeFn), computeFn, undefined, undefined, strictEquals, debugLocation);\n    }\n    return new Derived(\n    // eslint-disable-next-line local/code-no-any-casts\n    new DebugNameData(undefined, undefined, computeFnOrOwner), \n    // eslint-disable-next-line local/code-no-any-casts\n    computeFnOrOwner, undefined, undefined, strictEquals, debugLocation);\n}\nfunction derivedWithSetter(owner, computeFn, setter, debugLocation = DebugLocation.ofCaller()) {\n    return new DerivedWithSetter(new DebugNameData(owner, undefined, computeFn), computeFn, undefined, undefined, strictEquals, setter, debugLocation);\n}\nfunction derivedOpts(options, computeFn, debugLocation = DebugLocation.ofCaller()) {\n    return new Derived(new DebugNameData(options.owner, options.debugName, options.debugReferenceFn), computeFn, undefined, options.onLastObserverRemoved, options.equalsFn ?? strictEquals, debugLocation);\n}\n_setDerivedOpts(derivedOpts);\n/**\n * Represents an observable that is derived from other observables.\n * The value is only recomputed when absolutely needed.\n *\n * {@link computeFn} should start with a JS Doc using `@description` to name the derived.\n *\n * Use `createEmptyChangeSummary` to create a \"change summary\" that can collect the changes.\n * Use `handleChange` to add a reported change to the change summary.\n * The compute function is given the last change summary.\n * The change summary is discarded after the compute function was called.\n *\n * @see derived\n */\nfunction derivedHandleChanges(options, computeFn, debugLocation = DebugLocation.ofCaller()) {\n    return new Derived(new DebugNameData(options.owner, options.debugName, undefined), computeFn, options.changeTracker, undefined, options.equalityComparer ?? strictEquals, debugLocation);\n}\nfunction derivedDisposable(computeFnOrOwner, computeFnOrUndefined, debugLocation = DebugLocation.ofCaller()) {\n    let computeFn;\n    let owner;\n    if (computeFnOrUndefined === undefined) {\n        // eslint-disable-next-line local/code-no-any-casts\n        computeFn = computeFnOrOwner;\n        owner = undefined;\n    }\n    else {\n        owner = computeFnOrOwner;\n        // eslint-disable-next-line local/code-no-any-casts\n        computeFn = computeFnOrUndefined;\n    }\n    let store = undefined;\n    return new Derived(new DebugNameData(owner, undefined, computeFn), r => {\n        if (!store) {\n            store = new DisposableStore();\n        }\n        else {\n            store.clear();\n        }\n        const result = computeFn(r);\n        if (result) {\n            store.add(result);\n        }\n        return result;\n    }, undefined, () => {\n        if (store) {\n            store.dispose();\n            store = undefined;\n        }\n    }, strictEquals, debugLocation);\n}\n\nexport { derived, derivedDisposable, derivedHandleChanges, derivedOpts, derivedWithSetter };\n","import { assertFn } from '../../assert.js';\nimport '../../arrays.js';\nimport { onBugIndicatingError, BugIndicatingError } from '../../errors.js';\nimport '../../event.js';\nimport { DisposableStore } from '../../lifecycle.js';\nimport { getLogger } from '../logging/logging.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction autorunStateToString(state) {\n    switch (state) {\n        case 1 /* AutorunState.dependenciesMightHaveChanged */: return 'dependenciesMightHaveChanged';\n        case 2 /* AutorunState.stale */: return 'stale';\n        case 3 /* AutorunState.upToDate */: return 'upToDate';\n        default: return '<unknown>';\n    }\n}\nclass AutorunObserver {\n    get debugName() {\n        return this._debugNameData.getDebugName(this) ?? '(anonymous)';\n    }\n    constructor(_debugNameData, _runFn, _changeTracker, debugLocation) {\n        this._debugNameData = _debugNameData;\n        this._runFn = _runFn;\n        this._changeTracker = _changeTracker;\n        this._state = 2 /* AutorunState.stale */;\n        this._updateCount = 0;\n        this._disposed = false;\n        this._dependencies = new Set();\n        this._dependenciesToBeRemoved = new Set();\n        this._isRunning = false;\n        this._store = undefined;\n        this._delayedStore = undefined;\n        this._changeSummary = this._changeTracker?.createChangeSummary(undefined);\n        getLogger()?.handleAutorunCreated(this, debugLocation);\n        this._run();\n    }\n    dispose() {\n        if (this._disposed) {\n            return;\n        }\n        this._disposed = true;\n        for (const o of this._dependencies) {\n            o.removeObserver(this); // Warning: external call!\n        }\n        this._dependencies.clear();\n        if (this._store !== undefined) {\n            this._store.dispose();\n        }\n        if (this._delayedStore !== undefined) {\n            this._delayedStore.dispose();\n        }\n        getLogger()?.handleAutorunDisposed(this);\n    }\n    _run() {\n        const emptySet = this._dependenciesToBeRemoved;\n        this._dependenciesToBeRemoved = this._dependencies;\n        this._dependencies = emptySet;\n        this._state = 3 /* AutorunState.upToDate */;\n        try {\n            if (!this._disposed) {\n                getLogger()?.handleAutorunStarted(this);\n                const changeSummary = this._changeSummary;\n                const delayedStore = this._delayedStore;\n                if (delayedStore !== undefined) {\n                    this._delayedStore = undefined;\n                }\n                try {\n                    this._isRunning = true;\n                    if (this._changeTracker) {\n                        this._changeTracker.beforeUpdate?.(this, changeSummary);\n                        this._changeSummary = this._changeTracker.createChangeSummary(changeSummary); // Warning: external call!\n                    }\n                    if (this._store !== undefined) {\n                        this._store.dispose();\n                        this._store = undefined;\n                    }\n                    this._runFn(this, changeSummary); // Warning: external call!\n                }\n                catch (e) {\n                    onBugIndicatingError(e);\n                }\n                finally {\n                    this._isRunning = false;\n                    if (delayedStore !== undefined) {\n                        delayedStore.dispose();\n                    }\n                }\n            }\n        }\n        finally {\n            if (!this._disposed) {\n                getLogger()?.handleAutorunFinished(this);\n            }\n            // We don't want our observed observables to think that they are (not even temporarily) not being observed.\n            // Thus, we only unsubscribe from observables that are definitely not read anymore.\n            for (const o of this._dependenciesToBeRemoved) {\n                o.removeObserver(this); // Warning: external call!\n            }\n            this._dependenciesToBeRemoved.clear();\n        }\n    }\n    toString() {\n        return `Autorun<${this.debugName}>`;\n    }\n    // IObserver implementation\n    beginUpdate(_observable) {\n        if (this._state === 3 /* AutorunState.upToDate */) {\n            this._state = 1 /* AutorunState.dependenciesMightHaveChanged */;\n        }\n        this._updateCount++;\n    }\n    endUpdate(_observable) {\n        try {\n            if (this._updateCount === 1) {\n                do {\n                    if (this._state === 1 /* AutorunState.dependenciesMightHaveChanged */) {\n                        this._state = 3 /* AutorunState.upToDate */;\n                        for (const d of this._dependencies) {\n                            d.reportChanges(); // Warning: external call!\n                            if (this._state === 2 /* AutorunState.stale */) {\n                                // The other dependencies will refresh on demand\n                                break;\n                            }\n                        }\n                    }\n                    if (this._state !== 3 /* AutorunState.upToDate */) {\n                        this._run(); // Warning: indirect external call!\n                    }\n                } while (this._state !== 3 /* AutorunState.upToDate */);\n            }\n        }\n        finally {\n            this._updateCount--;\n        }\n        assertFn(() => this._updateCount >= 0);\n    }\n    handlePossibleChange(observable) {\n        if (this._state === 3 /* AutorunState.upToDate */ && this._isDependency(observable)) {\n            this._state = 1 /* AutorunState.dependenciesMightHaveChanged */;\n        }\n    }\n    handleChange(observable, change) {\n        if (this._isDependency(observable)) {\n            getLogger()?.handleAutorunDependencyChanged(this, observable, change);\n            try {\n                // Warning: external call!\n                const shouldReact = this._changeTracker ? this._changeTracker.handleChange({\n                    changedObservable: observable,\n                    change,\n                    // eslint-disable-next-line local/code-no-any-casts\n                    didChange: (o) => o === observable,\n                }, this._changeSummary) : true;\n                if (shouldReact) {\n                    this._state = 2 /* AutorunState.stale */;\n                }\n            }\n            catch (e) {\n                onBugIndicatingError(e);\n            }\n        }\n    }\n    _isDependency(observable) {\n        return this._dependencies.has(observable) && !this._dependenciesToBeRemoved.has(observable);\n    }\n    // IReader implementation\n    _ensureNoRunning() {\n        if (!this._isRunning) {\n            throw new BugIndicatingError('The reader object cannot be used outside its compute function!');\n        }\n    }\n    readObservable(observable) {\n        this._ensureNoRunning();\n        // In case the run action disposes the autorun\n        if (this._disposed) {\n            return observable.get(); // warning: external call!\n        }\n        observable.addObserver(this); // warning: external call!\n        const value = observable.get(); // warning: external call!\n        this._dependencies.add(observable);\n        this._dependenciesToBeRemoved.delete(observable);\n        return value;\n    }\n    get store() {\n        this._ensureNoRunning();\n        if (this._disposed) {\n            throw new BugIndicatingError('Cannot access store after dispose');\n        }\n        if (this._store === undefined) {\n            this._store = new DisposableStore();\n        }\n        return this._store;\n    }\n    debugGetState() {\n        return {\n            isRunning: this._isRunning,\n            updateCount: this._updateCount,\n            dependencies: this._dependencies,\n            state: this._state,\n            stateStr: autorunStateToString(this._state),\n        };\n    }\n    debugRerun() {\n        if (!this._isRunning) {\n            this._run();\n        }\n        else {\n            this._state = 2 /* AutorunState.stale */;\n        }\n    }\n}\n\nexport { AutorunObserver };\n","import '../../arrays.js';\nimport '../../event.js';\nimport { toDisposable, DisposableStore } from '../../lifecycle.js';\nimport { DebugNameData } from '../debugName.js';\nimport { AutorunObserver } from './autorunImpl.js';\nimport { DebugLocation } from '../debugLocation.js';\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/**\n * Runs immediately and whenever a transaction ends and an observed observable changed.\n * {@link fn} should start with a JS Doc using `@description` to name the autorun.\n */\nfunction autorun(fn, debugLocation = DebugLocation.ofCaller()) {\n    return new AutorunObserver(new DebugNameData(undefined, undefined, fn), fn, undefined, debugLocation);\n}\n/**\n * Runs immediately and whenever a transaction ends and an observed observable changed.\n * {@link fn} should start with a JS Doc using `@description` to name the autorun.\n */\nfunction autorunOpts(options, fn, debugLocation = DebugLocation.ofCaller()) {\n    return new AutorunObserver(new DebugNameData(options.owner, options.debugName, options.debugReferenceFn ?? fn), fn, undefined, debugLocation);\n}\n/**\n * Runs immediately and whenever a transaction ends and an observed observable changed.\n * {@link fn} should start with a JS Doc using `@description` to name the autorun.\n *\n * Use `changeTracker.createChangeSummary` to create a \"change summary\" that can collect the changes.\n * Use `changeTracker.handleChange` to add a reported change to the change summary.\n * The run function is given the last change summary.\n * The change summary is discarded after the run function was called.\n *\n * @see autorun\n */\nfunction autorunHandleChanges(options, fn, debugLocation = DebugLocation.ofCaller()) {\n    return new AutorunObserver(new DebugNameData(options.owner, options.debugName, options.debugReferenceFn ?? fn), fn, options.changeTracker, debugLocation);\n}\n/**\n * @see autorunHandleChanges (but with a disposable store that is cleared before the next run or on dispose)\n */\nfunction autorunWithStoreHandleChanges(options, fn) {\n    const store = new DisposableStore();\n    const disposable = autorunHandleChanges({\n        owner: options.owner,\n        debugName: options.debugName,\n        debugReferenceFn: options.debugReferenceFn ?? fn,\n        changeTracker: options.changeTracker,\n    }, (reader, changeSummary) => {\n        store.clear();\n        fn(reader, changeSummary, store);\n    });\n    return toDisposable(() => {\n        disposable.dispose();\n        store.dispose();\n    });\n}\n/**\n * @see autorun (but with a disposable store that is cleared before the next run or on dispose)\n *\n * @deprecated Use `autorun(reader => { reader.store.add(...) })` instead!\n */\nfunction autorunWithStore(fn) {\n    const store = new DisposableStore();\n    const disposable = autorunOpts({\n        owner: undefined,\n        debugName: undefined,\n        debugReferenceFn: fn,\n    }, reader => {\n        store.clear();\n        fn(reader, store);\n    });\n    return toDisposable(() => {\n        disposable.dispose();\n        store.dispose();\n    });\n}\nfunction autorunDelta(observable, handler) {\n    let _lastValue;\n    return autorunOpts({ debugReferenceFn: handler }, (reader) => {\n        const newValue = observable.read(reader);\n        const lastValue = _lastValue;\n        _lastValue = newValue;\n        handler({ lastValue, newValue });\n    });\n}\n\nexport { autorun, autorunDelta, autorunHandleChanges, autorunOpts, autorunWithStore, autorunWithStoreHandleChanges };\n","import { onUnexpectedError } from '../errors.js';\nimport '../arrays.js';\nimport '../event.js';\nimport '../lifecycle.js';\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/**\n * This function is used to indicate that the caller recovered from an error that indicates a bug.\n*/\nfunction handleBugIndicatingErrorRecovery(message) {\n    const err = new Error('BugIndicatingErrorRecovery: ' + message);\n    onUnexpectedError(err);\n    console.error('recovered from an error that indicates a bug', err);\n}\n\nexport { handleBugIndicatingErrorRecovery };\n","import { handleBugIndicatingErrorRecovery } from './base.js';\nimport { getFunctionName } from './debugName.js';\nimport { getLogger } from './logging/logging.js';\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/**\n * Starts a transaction in which many observables can be changed at once.\n * {@link fn} should start with a JS Doc using `@description` to give the transaction a debug name.\n * Reaction run on demand or when the transaction ends.\n */\nfunction transaction(fn, getDebugName) {\n    const tx = new TransactionImpl(fn, getDebugName);\n    try {\n        fn(tx);\n    }\n    finally {\n        tx.finish();\n    }\n}\nlet _globalTransaction = undefined;\nfunction globalTransaction(fn) {\n    if (_globalTransaction) {\n        fn(_globalTransaction);\n    }\n    else {\n        const tx = new TransactionImpl(fn, undefined);\n        _globalTransaction = tx;\n        try {\n            fn(tx);\n        }\n        finally {\n            tx.finish(); // During finish, more actions might be added to the transaction.\n            // Which is why we only clear the global transaction after finish.\n            _globalTransaction = undefined;\n        }\n    }\n}\n/** @deprecated */\nasync function asyncTransaction(fn, getDebugName) {\n    const tx = new TransactionImpl(fn, getDebugName);\n    try {\n        await fn(tx);\n    }\n    finally {\n        tx.finish();\n    }\n}\n/**\n * Allows to chain transactions.\n */\nfunction subtransaction(tx, fn, getDebugName) {\n    if (!tx) {\n        transaction(fn, getDebugName);\n    }\n    else {\n        fn(tx);\n    }\n}\nclass TransactionImpl {\n    constructor(_fn, _getDebugName) {\n        this._fn = _fn;\n        this._getDebugName = _getDebugName;\n        this._updatingObservers = [];\n        getLogger()?.handleBeginTransaction(this);\n    }\n    getDebugName() {\n        if (this._getDebugName) {\n            return this._getDebugName();\n        }\n        return getFunctionName(this._fn);\n    }\n    updateObserver(observer, observable) {\n        if (!this._updatingObservers) {\n            // This happens when a transaction is used in a callback or async function.\n            // If an async transaction is used, make sure the promise awaits all users of the transaction (e.g. no race).\n            handleBugIndicatingErrorRecovery('Transaction already finished!');\n            // Error recovery\n            transaction(tx => {\n                tx.updateObserver(observer, observable);\n            });\n            return;\n        }\n        // When this gets called while finish is active, they will still get considered\n        this._updatingObservers.push({ observer, observable });\n        observer.beginUpdate(observable);\n    }\n    finish() {\n        const updatingObservers = this._updatingObservers;\n        if (!updatingObservers) {\n            handleBugIndicatingErrorRecovery('transaction.finish() has already been called!');\n            return;\n        }\n        for (let i = 0; i < updatingObservers.length; i++) {\n            const { observer, observable } = updatingObservers[i];\n            observer.endUpdate(observable);\n        }\n        // Prevent anyone from updating observers from now on.\n        this._updatingObservers = null;\n        getLogger()?.handleEndTransaction(this);\n    }\n    debugGetUpdatingObservers() {\n        return this._updatingObservers;\n    }\n}\n\nexport { TransactionImpl, asyncTransaction, globalTransaction, subtransaction, transaction };\n","import { subtransaction } from '../transaction.js';\nimport { strictEquals } from '../../equals.js';\nimport '../../event.js';\nimport '../../lifecycle.js';\nimport { DebugNameData } from '../debugName.js';\nimport { getLogger } from '../logging/logging.js';\nimport { BaseObservable } from './baseObservable.js';\nimport { DebugLocation } from '../debugLocation.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction observableFromEvent(...args) {\n    let owner;\n    let event;\n    let getValue;\n    let debugLocation;\n    if (args.length === 2) {\n        [event, getValue] = args;\n    }\n    else {\n        [owner, event, getValue, debugLocation] = args;\n    }\n    return new FromEventObservable(new DebugNameData(owner, undefined, getValue), event, getValue, () => FromEventObservable.globalTransaction, strictEquals, debugLocation ?? DebugLocation.ofCaller());\n}\nfunction observableFromEventOpts(options, event, getValue, debugLocation = DebugLocation.ofCaller()) {\n    return new FromEventObservable(new DebugNameData(options.owner, options.debugName, options.debugReferenceFn ?? getValue), event, getValue, () => FromEventObservable.globalTransaction, options.equalsFn ?? strictEquals, debugLocation);\n}\nclass FromEventObservable extends BaseObservable {\n    constructor(_debugNameData, event, _getValue, _getTransaction, _equalityComparator, debugLocation) {\n        super(debugLocation);\n        this._debugNameData = _debugNameData;\n        this.event = event;\n        this._getValue = _getValue;\n        this._getTransaction = _getTransaction;\n        this._equalityComparator = _equalityComparator;\n        this._hasValue = false;\n        this.handleEvent = (args) => {\n            const newValue = this._getValue(args);\n            const oldValue = this._value;\n            const didChange = !this._hasValue || !(this._equalityComparator(oldValue, newValue));\n            let didRunTransaction = false;\n            if (didChange) {\n                this._value = newValue;\n                if (this._hasValue) {\n                    didRunTransaction = true;\n                    subtransaction(this._getTransaction(), (tx) => {\n                        getLogger()?.handleObservableUpdated(this, { oldValue, newValue, change: undefined, didChange, hadValue: this._hasValue });\n                        for (const o of this._observers) {\n                            tx.updateObserver(o, this);\n                            o.handleChange(this, undefined);\n                        }\n                    }, () => {\n                        const name = this.getDebugName();\n                        return 'Event fired' + (name ? `: ${name}` : '');\n                    });\n                }\n                this._hasValue = true;\n            }\n            if (!didRunTransaction) {\n                getLogger()?.handleObservableUpdated(this, { oldValue, newValue, change: undefined, didChange, hadValue: this._hasValue });\n            }\n        };\n    }\n    getDebugName() {\n        return this._debugNameData.getDebugName(this);\n    }\n    get debugName() {\n        const name = this.getDebugName();\n        return 'From Event' + (name ? `: ${name}` : '');\n    }\n    onFirstObserverAdded() {\n        this._subscription = this.event(this.handleEvent);\n    }\n    onLastObserverRemoved() {\n        this._subscription.dispose();\n        this._subscription = undefined;\n        this._hasValue = false;\n        this._value = undefined;\n    }\n    get() {\n        if (this._subscription) {\n            if (!this._hasValue) {\n                this.handleEvent(undefined);\n            }\n            return this._value;\n        }\n        else {\n            // no cache, as there are no subscribers to keep it updated\n            const value = this._getValue(undefined);\n            return value;\n        }\n    }\n    debugSetValue(value) {\n        // eslint-disable-next-line local/code-no-any-casts\n        this._value = value;\n    }\n    debugGetState() {\n        return { value: this._value, hasValue: this._hasValue };\n    }\n}\n(function (observableFromEvent) {\n    observableFromEvent.Observer = FromEventObservable;\n    function batchEventsGlobally(tx, fn) {\n        let didSet = false;\n        if (FromEventObservable.globalTransaction === undefined) {\n            FromEventObservable.globalTransaction = tx;\n            didSet = true;\n        }\n        try {\n            fn();\n        }\n        finally {\n            if (didSet) {\n                FromEventObservable.globalTransaction = undefined;\n            }\n        }\n    }\n    observableFromEvent.batchEventsGlobally = batchEventsGlobally;\n})(observableFromEvent || (observableFromEvent = {}));\n\nexport { FromEventObservable, observableFromEvent, observableFromEventOpts };\n","import { autorun } from '../reactions/autorun.js';\nimport '../../arrays.js';\nimport '../../event.js';\nimport { toDisposable, DisposableStore } from '../../lifecycle.js';\nimport { derivedOpts } from '../observables/derived.js';\nimport { observableFromEvent } from '../observables/observableFromEvent.js';\nimport { _setRecomputeInitiallyAndOnChange } from '../observables/baseObservable.js';\nimport '../debugLocation.js';\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/**\n * Creates an observable that debounces the input observable.\n */\nfunction debouncedObservable(observable, debounceMs) {\n    let hasValue = false;\n    let lastValue;\n    let timeout = undefined;\n    return observableFromEvent(cb => {\n        const d = autorun(reader => {\n            const value = observable.read(reader);\n            if (!hasValue) {\n                hasValue = true;\n                lastValue = value;\n            }\n            else {\n                if (timeout) {\n                    clearTimeout(timeout);\n                }\n                timeout = setTimeout(() => {\n                    lastValue = value;\n                    cb();\n                }, debounceMs);\n            }\n        });\n        return {\n            dispose() {\n                d.dispose();\n                hasValue = false;\n                lastValue = undefined;\n            },\n        };\n    }, () => {\n        if (hasValue) {\n            return lastValue;\n        }\n        else {\n            return observable.get();\n        }\n    });\n}\n/**\n * This converts the given observable into an autorun.\n */\nfunction recomputeInitiallyAndOnChange(observable, handleValue) {\n    const o = new KeepAliveObserver(true, handleValue);\n    observable.addObserver(o);\n    try {\n        o.beginUpdate(observable);\n    }\n    finally {\n        o.endUpdate(observable);\n    }\n    return toDisposable(() => {\n        observable.removeObserver(o);\n    });\n}\n_setRecomputeInitiallyAndOnChange(recomputeInitiallyAndOnChange);\nclass KeepAliveObserver {\n    constructor(_forceRecompute, _handleValue) {\n        this._forceRecompute = _forceRecompute;\n        this._handleValue = _handleValue;\n        this._counter = 0;\n    }\n    beginUpdate(observable) {\n        this._counter++;\n    }\n    endUpdate(observable) {\n        if (this._counter === 1 && this._forceRecompute) {\n            if (this._handleValue) {\n                this._handleValue(observable.get());\n            }\n            else {\n                observable.reportChanges();\n            }\n        }\n        this._counter--;\n    }\n    handlePossibleChange(observable) {\n        // NO OP\n    }\n    handleChange(observable, change) {\n        // NO OP\n    }\n}\nfunction derivedObservableWithCache(owner, computeFn) {\n    let lastValue = undefined;\n    const observable = derivedOpts({ owner, debugReferenceFn: computeFn }, reader => {\n        lastValue = computeFn(reader, lastValue);\n        return lastValue;\n    });\n    return observable;\n}\n/**\n * When the items array changes, referential equal items are not mapped again.\n */\nfunction mapObservableArrayCached(owner, items, map, keySelector) {\n    let m = new ArrayMap(map, keySelector);\n    const self = derivedOpts({\n        debugReferenceFn: map,\n        owner,\n        onLastObserverRemoved: () => {\n            m.dispose();\n            m = new ArrayMap(map);\n        }\n    }, (reader) => {\n        m.setItems(items.read(reader));\n        return m.getItems();\n    });\n    return self;\n}\nclass ArrayMap {\n    constructor(_map, _keySelector) {\n        this._map = _map;\n        this._keySelector = _keySelector;\n        this._cache = new Map();\n        this._items = [];\n    }\n    dispose() {\n        this._cache.forEach(entry => entry.store.dispose());\n        this._cache.clear();\n    }\n    setItems(items) {\n        const newItems = [];\n        const itemsToRemove = new Set(this._cache.keys());\n        for (const item of items) {\n            const key = this._keySelector ? this._keySelector(item) : item;\n            let entry = this._cache.get(key);\n            if (!entry) {\n                const store = new DisposableStore();\n                const out = this._map(item, store);\n                entry = { out, store };\n                this._cache.set(key, entry);\n            }\n            else {\n                itemsToRemove.delete(key);\n            }\n            newItems.push(entry.out);\n        }\n        for (const item of itemsToRemove) {\n            const entry = this._cache.get(item);\n            entry.store.dispose();\n            this._cache.delete(item);\n        }\n        this._items = newItems;\n    }\n    getItems() {\n        return this._items;\n    }\n}\n\nexport { KeepAliveObserver, debouncedObservable, derivedObservableWithCache, mapObservableArrayCached, recomputeInitiallyAndOnChange };\n","import { getClassName } from '../debugName.js';\nimport '../debugLocation.js';\nimport '../../arrays.js';\nimport '../../event.js';\nimport '../../lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction formatValue(value, availableLen) {\n    switch (typeof value) {\n        case 'number':\n            return '' + value;\n        case 'string':\n            if (value.length + 2 <= availableLen) {\n                return `\"${value}\"`;\n            }\n            return `\"${value.substr(0, availableLen - 7)}\"+...`;\n        case 'boolean':\n            return value ? 'true' : 'false';\n        case 'undefined':\n            return 'undefined';\n        case 'object':\n            if (value === null) {\n                return 'null';\n            }\n            if (Array.isArray(value)) {\n                return formatArray(value, availableLen);\n            }\n            return formatObject(value, availableLen);\n        case 'symbol':\n            return value.toString();\n        case 'function':\n            return `[[Function${value.name ? ' ' + value.name : ''}]]`;\n        default:\n            return '' + value;\n    }\n}\nfunction formatArray(value, availableLen) {\n    let result = '[ ';\n    let first = true;\n    for (const val of value) {\n        if (!first) {\n            result += ', ';\n        }\n        if (result.length - 5 > availableLen) {\n            result += '...';\n            break;\n        }\n        first = false;\n        result += `${formatValue(val, availableLen - result.length)}`;\n    }\n    result += ' ]';\n    return result;\n}\nfunction formatObject(value, availableLen) {\n    if (typeof value.toString === 'function' && value.toString !== Object.prototype.toString) {\n        const val = value.toString();\n        if (val.length <= availableLen) {\n            return val;\n        }\n        return val.substring(0, availableLen - 3) + '...';\n    }\n    const className = getClassName(value);\n    let result = className ? className + '(' : '{ ';\n    let first = true;\n    for (const [key, val] of Object.entries(value)) {\n        if (!first) {\n            result += ', ';\n        }\n        if (result.length - 5 > availableLen) {\n            result += '...';\n            break;\n        }\n        first = false;\n        result += `${key}: ${formatValue(val, availableLen - result.length)}`;\n    }\n    result += className ? ')' : ' }';\n    return result;\n}\n\nexport { formatValue };\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 *--------------------------------------------------------------------------------------------*/\nclass SimpleTypedRpcConnection {\n    static createClient(channelFactory, getHandler) {\n        return new SimpleTypedRpcConnection(channelFactory, getHandler);\n    }\n    constructor(_channelFactory, _getHandler) {\n        this._channelFactory = _channelFactory;\n        this._getHandler = _getHandler;\n        this._channel = this._channelFactory({\n            handleNotification: (notificationData) => {\n                const m = notificationData;\n                const fn = this._getHandler().notifications[m[0]];\n                if (!fn) {\n                    throw new Error(`Unknown notification \"${m[0]}\"!`);\n                }\n                fn(...m[1]);\n            },\n            handleRequest: (requestData) => {\n                const m = requestData;\n                try {\n                    const result = this._getHandler().requests[m[0]](...m[1]);\n                    return { type: 'result', value: result };\n                }\n                catch (e) {\n                    return { type: 'error', value: e };\n                }\n            },\n        });\n        const requests = new Proxy({}, {\n            get: (target, key) => {\n                return async (...args) => {\n                    const result = await this._channel.sendRequest([key, args]);\n                    if (result.type === 'error') {\n                        throw result.value;\n                    }\n                    else {\n                        return result.value;\n                    }\n                };\n            }\n        });\n        const notifications = new Proxy({}, {\n            get: (target, key) => {\n                return (...args) => {\n                    this._channel.sendNotification([key, args]);\n                };\n            }\n        });\n        // eslint-disable-next-line local/code-no-any-casts\n        this.api = { notifications: notifications, requests: requests };\n    }\n}\n\nexport { SimpleTypedRpcConnection };\n","import { SimpleTypedRpcConnection } from './rpc.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction registerDebugChannel(channelId, createClient) {\n    // eslint-disable-next-line local/code-no-any-casts\n    const g = globalThis;\n    let queuedNotifications = [];\n    let curHost = undefined;\n    const { channel, handler } = createChannelFactoryFromDebugChannel({\n        sendNotification: (data) => {\n            if (curHost) {\n                curHost.sendNotification(data);\n            }\n            else {\n                queuedNotifications.push(data);\n            }\n        },\n    });\n    let curClient = undefined;\n    (g.$$debugValueEditor_debugChannels ?? (g.$$debugValueEditor_debugChannels = {}))[channelId] = (host) => {\n        curClient = createClient();\n        curHost = host;\n        for (const n of queuedNotifications) {\n            host.sendNotification(n);\n        }\n        queuedNotifications = [];\n        return handler;\n    };\n    return SimpleTypedRpcConnection.createClient(channel, () => {\n        if (!curClient) {\n            throw new Error('Not supported');\n        }\n        return curClient;\n    });\n}\nfunction createChannelFactoryFromDebugChannel(host) {\n    let h;\n    const channel = (handler) => {\n        h = handler;\n        return {\n            sendNotification: data => {\n                host.sendNotification(data);\n            },\n            sendRequest: data => {\n                throw new Error('not supported');\n            },\n        };\n    };\n    return {\n        channel: channel,\n        handler: {\n            handleRequest: (data) => {\n                if (data.type === 'notification') {\n                    return h?.handleNotification(data.data);\n                }\n                else {\n                    return h?.handleRequest(data.data);\n                }\n            },\n        },\n    };\n}\n\nexport { registerDebugChannel };\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 *--------------------------------------------------------------------------------------------*/\nclass Throttler {\n    constructor() {\n        this._timeout = undefined;\n    }\n    throttle(fn, timeoutMs) {\n        if (this._timeout === undefined) {\n            this._timeout = setTimeout(() => {\n                this._timeout = undefined;\n                fn();\n            }, timeoutMs);\n        }\n    }\n    dispose() {\n        if (this._timeout !== undefined) {\n            clearTimeout(this._timeout);\n        }\n    }\n}\nfunction deepAssign(target, source) {\n    for (const key in source) {\n        if (!!target[key] && typeof target[key] === 'object' && !!source[key] && typeof source[key] === 'object') {\n            deepAssign(target[key], source[key]);\n        }\n        else {\n            target[key] = source[key];\n        }\n    }\n}\nfunction deepAssignDeleteNulls(target, source) {\n    for (const key in source) {\n        if (source[key] === null) {\n            delete target[key];\n        }\n        else if (!!target[key] && typeof target[key] === 'object' && !!source[key] && typeof source[key] === 'object') {\n            deepAssignDeleteNulls(target[key], source[key]);\n        }\n        else {\n            target[key] = source[key];\n        }\n    }\n}\n\nexport { Throttler, deepAssign, deepAssignDeleteNulls };\n","import { TransactionImpl } from '../transaction.js';\nimport { BaseObservable } from './baseObservable.js';\nimport { strictEquals } from '../../equals.js';\nimport '../../event.js';\nimport '../../lifecycle.js';\nimport { DebugNameData } from '../debugName.js';\nimport { getLogger } from '../logging/logging.js';\nimport { DebugLocation } from '../debugLocation.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction observableValue(nameOrOwner, initialValue, debugLocation = DebugLocation.ofCaller()) {\n    let debugNameData;\n    if (typeof nameOrOwner === 'string') {\n        debugNameData = new DebugNameData(undefined, nameOrOwner, undefined);\n    }\n    else {\n        debugNameData = new DebugNameData(nameOrOwner, undefined, undefined);\n    }\n    return new ObservableValue(debugNameData, initialValue, strictEquals, debugLocation);\n}\nclass ObservableValue extends BaseObservable {\n    get debugName() {\n        return this._debugNameData.getDebugName(this) ?? 'ObservableValue';\n    }\n    constructor(_debugNameData, initialValue, _equalityComparator, debugLocation) {\n        super(debugLocation);\n        this._debugNameData = _debugNameData;\n        this._equalityComparator = _equalityComparator;\n        this._value = initialValue;\n        getLogger()?.handleObservableUpdated(this, { hadValue: false, newValue: initialValue, change: undefined, didChange: true, oldValue: undefined });\n    }\n    get() {\n        return this._value;\n    }\n    set(value, tx, change) {\n        if (change === undefined && this._equalityComparator(this._value, value)) {\n            return;\n        }\n        let _tx;\n        if (!tx) {\n            tx = _tx = new TransactionImpl(() => { }, () => `Setting ${this.debugName}`);\n        }\n        try {\n            const oldValue = this._value;\n            this._setValue(value);\n            getLogger()?.handleObservableUpdated(this, { oldValue, newValue: value, change, didChange: true, hadValue: true });\n            for (const observer of this._observers) {\n                tx.updateObserver(observer, this);\n                observer.handleChange(this, change);\n            }\n        }\n        finally {\n            if (_tx) {\n                _tx.finish();\n            }\n        }\n    }\n    toString() {\n        return `${this.debugName}: ${this._value}`;\n    }\n    _setValue(newValue) {\n        this._value = newValue;\n    }\n    debugGetState() {\n        return {\n            value: this._value,\n        };\n    }\n    debugSetValue(value) {\n        this._value = value;\n    }\n}\n/**\n * A disposable observable. When disposed, its value is also disposed.\n * When a new value is set, the previous value is disposed.\n */\nfunction disposableObservableValue(nameOrOwner, initialValue, debugLocation = DebugLocation.ofCaller()) {\n    let debugNameData;\n    if (typeof nameOrOwner === 'string') {\n        debugNameData = new DebugNameData(undefined, nameOrOwner, undefined);\n    }\n    else {\n        debugNameData = new DebugNameData(nameOrOwner, undefined, undefined);\n    }\n    return new DisposableObservableValue(debugNameData, initialValue, strictEquals, debugLocation);\n}\nclass DisposableObservableValue extends ObservableValue {\n    _setValue(newValue) {\n        if (this._value === newValue) {\n            return;\n        }\n        if (this._value) {\n            this._value.dispose();\n        }\n        this._value = newValue;\n    }\n    dispose() {\n        this._value?.dispose();\n    }\n}\n\nexport { DisposableObservableValue, ObservableValue, disposableObservableValue, observableValue };\n","import { AutorunObserver } from '../../reactions/autorunImpl.js';\nimport { formatValue } from '../consoleObservableLogger.js';\nimport { registerDebugChannel } from './debuggerRpc.js';\nimport { Throttler, deepAssignDeleteNulls, deepAssign } from './utils.js';\nimport { isDefined } from '../../../types.js';\nimport { FromEventObservable } from '../../observables/observableFromEvent.js';\nimport { onUnexpectedError, BugIndicatingError } from '../../../errors.js';\nimport { Derived } from '../../observables/derivedImpl.js';\nimport { ObservableValue } from '../../observables/observableValue.js';\nimport { DebugLocation } from '../../debugLocation.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DevToolsLogger {\n    static { this._instance = undefined; }\n    static getInstance() {\n        if (DevToolsLogger._instance === undefined) {\n            DevToolsLogger._instance = new DevToolsLogger();\n        }\n        return DevToolsLogger._instance;\n    }\n    getTransactionState() {\n        const affected = [];\n        const txs = [...this._activeTransactions];\n        if (txs.length === 0) {\n            return undefined;\n        }\n        const observerQueue = txs.flatMap(t => t.debugGetUpdatingObservers() ?? []).map(o => o.observer);\n        const processedObservers = new Set();\n        while (observerQueue.length > 0) {\n            const observer = observerQueue.shift();\n            if (processedObservers.has(observer)) {\n                continue;\n            }\n            processedObservers.add(observer);\n            const state = this._getInfo(observer, d => {\n                if (!processedObservers.has(d)) {\n                    observerQueue.push(d);\n                }\n            });\n            if (state) {\n                affected.push(state);\n            }\n        }\n        return { names: txs.map(t => t.getDebugName() ?? 'tx'), affected };\n    }\n    _getObservableInfo(observable) {\n        const info = this._instanceInfos.get(observable);\n        if (!info) {\n            onUnexpectedError(new BugIndicatingError('No info found'));\n            return undefined;\n        }\n        return info;\n    }\n    _getAutorunInfo(autorun) {\n        const info = this._instanceInfos.get(autorun);\n        if (!info) {\n            onUnexpectedError(new BugIndicatingError('No info found'));\n            return undefined;\n        }\n        return info;\n    }\n    _getInfo(observer, queue) {\n        if (observer instanceof Derived) {\n            const observersToUpdate = [...observer.debugGetObservers()];\n            for (const o of observersToUpdate) {\n                queue(o);\n            }\n            const info = this._getObservableInfo(observer);\n            if (!info) {\n                return;\n            }\n            const observerState = observer.debugGetState();\n            const base = { name: observer.debugName, instanceId: info.instanceId, updateCount: observerState.updateCount };\n            const changedDependencies = [...info.changedObservables].map(o => this._instanceInfos.get(o)?.instanceId).filter(isDefined);\n            if (observerState.isComputing) {\n                return { ...base, type: 'observable/derived', state: 'updating', changedDependencies, initialComputation: false };\n            }\n            switch (observerState.state) {\n                case 0 /* DerivedState.initial */:\n                    return { ...base, type: 'observable/derived', state: 'noValue' };\n                case 3 /* DerivedState.upToDate */:\n                    return { ...base, type: 'observable/derived', state: 'upToDate' };\n                case 2 /* DerivedState.stale */:\n                    return { ...base, type: 'observable/derived', state: 'stale', changedDependencies };\n                case 1 /* DerivedState.dependenciesMightHaveChanged */:\n                    return { ...base, type: 'observable/derived', state: 'possiblyStale' };\n            }\n        }\n        else if (observer instanceof AutorunObserver) {\n            const info = this._getAutorunInfo(observer);\n            if (!info) {\n                return undefined;\n            }\n            const base = { name: observer.debugName, instanceId: info.instanceId, updateCount: info.updateCount };\n            const changedDependencies = [...info.changedObservables].map(o => this._instanceInfos.get(o).instanceId);\n            if (observer.debugGetState().isRunning) {\n                return { ...base, type: 'autorun', state: 'updating', changedDependencies };\n            }\n            switch (observer.debugGetState().state) {\n                case 3 /* AutorunState.upToDate */:\n                    return { ...base, type: 'autorun', state: 'upToDate' };\n                case 2 /* AutorunState.stale */:\n                    return { ...base, type: 'autorun', state: 'stale', changedDependencies };\n                case 1 /* AutorunState.dependenciesMightHaveChanged */:\n                    return { ...base, type: 'autorun', state: 'possiblyStale' };\n            }\n        }\n        return undefined;\n    }\n    _formatObservable(obs) {\n        const info = this._getObservableInfo(obs);\n        if (!info) {\n            return undefined;\n        }\n        return { name: obs.debugName, instanceId: info.instanceId };\n    }\n    _formatObserver(obs) {\n        if (obs instanceof Derived) {\n            return { name: obs.toString(), instanceId: this._getObservableInfo(obs)?.instanceId };\n        }\n        const autorunInfo = this._getAutorunInfo(obs);\n        if (autorunInfo) {\n            return { name: obs.toString(), instanceId: autorunInfo.instanceId };\n        }\n        return undefined;\n    }\n    constructor() {\n        this._declarationId = 0;\n        this._instanceId = 0;\n        this._declarations = new Map();\n        this._instanceInfos = new WeakMap();\n        this._aliveInstances = new Map();\n        this._activeTransactions = new Set();\n        this._channel = registerDebugChannel('observableDevTools', () => {\n            return {\n                notifications: {\n                    setDeclarationIdFilter: declarationIds => {\n                    },\n                    logObservableValue: (observableId) => {\n                        console.log('logObservableValue', observableId);\n                    },\n                    flushUpdates: () => {\n                        this._flushUpdates();\n                    },\n                    resetUpdates: () => {\n                        this._pendingChanges = null;\n                        this._channel.api.notifications.handleChange(this._fullState, true);\n                    },\n                },\n                requests: {\n                    getDeclarations: () => {\n                        const result = {};\n                        for (const decl of this._declarations.values()) {\n                            result[decl.id] = decl;\n                        }\n                        return { decls: result };\n                    },\n                    getSummarizedInstances: () => {\n                        return null;\n                    },\n                    getObservableValueInfo: instanceId => {\n                        const obs = this._aliveInstances.get(instanceId);\n                        return {\n                            observers: [...obs.debugGetObservers()].map(d => this._formatObserver(d)).filter(isDefined),\n                        };\n                    },\n                    getDerivedInfo: instanceId => {\n                        const d = this._aliveInstances.get(instanceId);\n                        return {\n                            dependencies: [...d.debugGetState().dependencies].map(d => this._formatObservable(d)).filter(isDefined),\n                            observers: [...d.debugGetObservers()].map(d => this._formatObserver(d)).filter(isDefined),\n                        };\n                    },\n                    getAutorunInfo: instanceId => {\n                        const obs = this._aliveInstances.get(instanceId);\n                        return {\n                            dependencies: [...obs.debugGetState().dependencies].map(d => this._formatObservable(d)).filter(isDefined),\n                        };\n                    },\n                    getTransactionState: () => {\n                        return this.getTransactionState();\n                    },\n                    setValue: (instanceId, jsonValue) => {\n                        const obs = this._aliveInstances.get(instanceId);\n                        if (obs instanceof Derived) {\n                            obs.debugSetValue(jsonValue);\n                        }\n                        else if (obs instanceof ObservableValue) {\n                            obs.debugSetValue(jsonValue);\n                        }\n                        else if (obs instanceof FromEventObservable) {\n                            obs.debugSetValue(jsonValue);\n                        }\n                        else {\n                            throw new BugIndicatingError('Observable is not supported');\n                        }\n                        const observers = [...obs.debugGetObservers()];\n                        for (const d of observers) {\n                            d.beginUpdate(obs);\n                        }\n                        for (const d of observers) {\n                            d.handleChange(obs, undefined);\n                        }\n                        for (const d of observers) {\n                            d.endUpdate(obs);\n                        }\n                    },\n                    getValue: instanceId => {\n                        const obs = this._aliveInstances.get(instanceId);\n                        if (obs instanceof Derived) {\n                            return formatValue(obs.debugGetState().value, 200);\n                        }\n                        else if (obs instanceof ObservableValue) {\n                            return formatValue(obs.debugGetState().value, 200);\n                        }\n                        return undefined;\n                    },\n                    logValue: (instanceId) => {\n                        const obs = this._aliveInstances.get(instanceId);\n                        if (obs && 'get' in obs) {\n                            console.log('Logged Value:', obs.get());\n                        }\n                        else {\n                            throw new BugIndicatingError('Observable is not supported');\n                        }\n                    },\n                    rerun: (instanceId) => {\n                        const obs = this._aliveInstances.get(instanceId);\n                        if (obs instanceof Derived) {\n                            obs.debugRecompute();\n                        }\n                        else if (obs instanceof AutorunObserver) {\n                            obs.debugRerun();\n                        }\n                        else {\n                            throw new BugIndicatingError('Observable is not supported');\n                        }\n                    },\n                }\n            };\n        });\n        this._pendingChanges = null;\n        this._changeThrottler = new Throttler();\n        this._fullState = {};\n        this._flushUpdates = () => {\n            if (this._pendingChanges !== null) {\n                this._channel.api.notifications.handleChange(this._pendingChanges, false);\n                this._pendingChanges = null;\n            }\n        };\n        DebugLocation.enable();\n    }\n    _handleChange(update) {\n        deepAssignDeleteNulls(this._fullState, update);\n        if (this._pendingChanges === null) {\n            this._pendingChanges = update;\n        }\n        else {\n            deepAssign(this._pendingChanges, update);\n        }\n        this._changeThrottler.throttle(this._flushUpdates, 10);\n    }\n    _getDeclarationId(type, location) {\n        if (!location) {\n            return -1;\n        }\n        let decInfo = this._declarations.get(location.id);\n        if (decInfo === undefined) {\n            decInfo = {\n                id: this._declarationId++,\n                type,\n                url: location.fileName,\n                line: location.line,\n                column: location.column,\n            };\n            this._declarations.set(location.id, decInfo);\n            this._handleChange({ decls: { [decInfo.id]: decInfo } });\n        }\n        return decInfo.id;\n    }\n    handleObservableCreated(observable, location) {\n        const declarationId = this._getDeclarationId('observable/value', location);\n        const info = {\n            declarationId,\n            instanceId: this._instanceId++,\n            listenerCount: 0,\n            lastValue: undefined,\n            updateCount: 0,\n            changedObservables: new Set(),\n        };\n        this._instanceInfos.set(observable, info);\n    }\n    handleOnListenerCountChanged(observable, newCount) {\n        const info = this._getObservableInfo(observable);\n        if (!info) {\n            return;\n        }\n        if (info.listenerCount === 0 && newCount > 0) {\n            const type = observable instanceof Derived ? 'observable/derived' : 'observable/value';\n            this._aliveInstances.set(info.instanceId, observable);\n            this._handleChange({\n                instances: {\n                    [info.instanceId]: {\n                        instanceId: info.instanceId,\n                        declarationId: info.declarationId,\n                        formattedValue: info.lastValue,\n                        type,\n                        name: observable.debugName,\n                    }\n                }\n            });\n        }\n        else if (info.listenerCount > 0 && newCount === 0) {\n            this._handleChange({\n                instances: { [info.instanceId]: null }\n            });\n            this._aliveInstances.delete(info.instanceId);\n        }\n        info.listenerCount = newCount;\n    }\n    handleObservableUpdated(observable, changeInfo) {\n        if (observable instanceof Derived) {\n            this._handleDerivedRecomputed(observable, changeInfo);\n            return;\n        }\n        const info = this._getObservableInfo(observable);\n        if (info) {\n            if (changeInfo.didChange) {\n                info.lastValue = formatValue(changeInfo.newValue, 30);\n                if (info.listenerCount > 0) {\n                    this._handleChange({\n                        instances: { [info.instanceId]: { formattedValue: info.lastValue } }\n                    });\n                }\n            }\n        }\n    }\n    handleAutorunCreated(autorun, location) {\n        const declarationId = this._getDeclarationId('autorun', location);\n        const info = {\n            declarationId,\n            instanceId: this._instanceId++,\n            updateCount: 0,\n            changedObservables: new Set(),\n        };\n        this._instanceInfos.set(autorun, info);\n        this._aliveInstances.set(info.instanceId, autorun);\n        if (info) {\n            this._handleChange({\n                instances: {\n                    [info.instanceId]: {\n                        instanceId: info.instanceId,\n                        declarationId: info.declarationId,\n                        runCount: 0,\n                        type: 'autorun',\n                        name: autorun.debugName,\n                    }\n                }\n            });\n        }\n    }\n    handleAutorunDisposed(autorun) {\n        const info = this._getAutorunInfo(autorun);\n        if (!info) {\n            return;\n        }\n        this._handleChange({\n            instances: { [info.instanceId]: null }\n        });\n        this._instanceInfos.delete(autorun);\n        this._aliveInstances.delete(info.instanceId);\n    }\n    handleAutorunDependencyChanged(autorun, observable, change) {\n        const info = this._getAutorunInfo(autorun);\n        if (!info) {\n            return;\n        }\n        info.changedObservables.add(observable);\n    }\n    handleAutorunStarted(autorun) {\n    }\n    handleAutorunFinished(autorun) {\n        const info = this._getAutorunInfo(autorun);\n        if (!info) {\n            return;\n        }\n        info.changedObservables.clear();\n        info.updateCount++;\n        this._handleChange({\n            instances: { [info.instanceId]: { runCount: info.updateCount } }\n        });\n    }\n    handleDerivedDependencyChanged(derived, observable, change) {\n        const info = this._getObservableInfo(derived);\n        if (info) {\n            info.changedObservables.add(observable);\n        }\n    }\n    _handleDerivedRecomputed(observable, changeInfo) {\n        const info = this._getObservableInfo(observable);\n        if (!info) {\n            return;\n        }\n        const formattedValue = formatValue(changeInfo.newValue, 30);\n        info.updateCount++;\n        info.changedObservables.clear();\n        info.lastValue = formattedValue;\n        if (info.listenerCount > 0) {\n            this._handleChange({\n                instances: { [info.instanceId]: { formattedValue: formattedValue, recomputationCount: info.updateCount } }\n            });\n        }\n    }\n    handleDerivedCleared(observable) {\n        const info = this._getObservableInfo(observable);\n        if (!info) {\n            return;\n        }\n        info.lastValue = undefined;\n        info.changedObservables.clear();\n        if (info.listenerCount > 0) {\n            this._handleChange({\n                instances: {\n                    [info.instanceId]: {\n                        formattedValue: undefined,\n                    }\n                }\n            });\n        }\n    }\n    handleBeginTransaction(transaction) {\n        this._activeTransactions.add(transaction);\n    }\n    handleEndTransaction(transaction) {\n        this._activeTransactions.delete(transaction);\n    }\n}\n\nexport { DevToolsLogger };\n","import '../arrays.js';\nimport '../event.js';\nimport '../lifecycle.js';\nimport { addLogger } from './logging/logging.js';\nexport { DebugLocation } from './debugLocation.js';\nexport { derived, derivedDisposable, derivedHandleChanges, derivedOpts, derivedWithSetter } from './observables/derived.js';\nimport '../cancellation.js';\nexport { debouncedObservable, derivedObservableWithCache, mapObservableArrayCached, recomputeInitiallyAndOnChange } from './utils/utils.js';\nexport { observableFromEvent, observableFromEventOpts } from './observables/observableFromEvent.js';\nimport { DevToolsLogger } from './logging/debugger/devToolsLogger.js';\nimport { env } from '../process.js';\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// This is a facade for the observable implementation. Only import from here!\nif (env && env['VSCODE_DEV_DEBUG_OBSERVABLES']) {\n    // To debug observables you also need the extension \"ms-vscode.debug-value-editor\"\n    addLogger(DevToolsLogger.getInstance());\n}\n","import './browser.js';\nimport { BrowserFeatures } from './canIUse.js';\nimport { StandardKeyboardEvent } from './keyboardEvent.js';\nimport { StandardMouseEvent } from './mouseEvent.js';\nimport { IntervalTimer, _runWhenIdle, AbstractIdleValue } from '../common/async.js';\nimport { BugIndicatingError, onUnexpectedError } from '../common/errors.js';\nimport { Emitter, Event } from '../common/event.js';\nimport { DisposableStore, Disposable, toDisposable } from '../common/lifecycle.js';\nimport { RemoteAuthorities } from '../common/network.js';\nimport { isIOS } from '../common/platform.js';\nimport { hash } from '../common/hash.js';\nimport { ensureCodeWindow, mainWindow } from './window.js';\nimport '../common/observableInternal/index.js';\nimport { observableValue } from '../common/observableInternal/observables/observableValue.js';\nimport { derived, derivedOpts } from '../common/observableInternal/observables/derived.js';\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//# region Multi-Window Support Utilities\nconst { getWindow, getDocument, getWindows, getWindowsCount, getWindowId, getWindowById, onDidRegisterWindow, onWillUnregisterWindow, onDidUnregisterWindow } = (function () {\n    const windows = new Map();\n    ensureCodeWindow(mainWindow, 1);\n    const mainWindowRegistration = { window: mainWindow, disposables: new DisposableStore() };\n    windows.set(mainWindow.vscodeWindowId, mainWindowRegistration);\n    const onDidRegisterWindow = new Emitter();\n    const onDidUnregisterWindow = new Emitter();\n    const onWillUnregisterWindow = new Emitter();\n    function getWindowById(windowId, fallbackToMain) {\n        const window = typeof windowId === 'number' ? windows.get(windowId) : undefined;\n        return window ?? (fallbackToMain ? mainWindowRegistration : undefined);\n    }\n    return {\n        onDidRegisterWindow: onDidRegisterWindow.event,\n        onWillUnregisterWindow: onWillUnregisterWindow.event,\n        onDidUnregisterWindow: onDidUnregisterWindow.event,\n        registerWindow(window) {\n            if (windows.has(window.vscodeWindowId)) {\n                return Disposable.None;\n            }\n            const disposables = new DisposableStore();\n            const registeredWindow = {\n                window,\n                disposables: disposables.add(new DisposableStore())\n            };\n            windows.set(window.vscodeWindowId, registeredWindow);\n            disposables.add(toDisposable(() => {\n                windows.delete(window.vscodeWindowId);\n                onDidUnregisterWindow.fire(window);\n            }));\n            disposables.add(addDisposableListener(window, EventType.BEFORE_UNLOAD, () => {\n                onWillUnregisterWindow.fire(window);\n            }));\n            onDidRegisterWindow.fire(registeredWindow);\n            return disposables;\n        },\n        getWindows() {\n            return windows.values();\n        },\n        getWindowsCount() {\n            return windows.size;\n        },\n        getWindowId(targetWindow) {\n            return targetWindow.vscodeWindowId;\n        },\n        hasWindow(windowId) {\n            return windows.has(windowId);\n        },\n        getWindowById,\n        getWindow(e) {\n            const candidateNode = e;\n            if (candidateNode?.ownerDocument?.defaultView) {\n                return candidateNode.ownerDocument.defaultView.window;\n            }\n            const candidateEvent = e;\n            if (candidateEvent?.view) {\n                return candidateEvent.view.window;\n            }\n            return mainWindow;\n        },\n        getDocument(e) {\n            const candidateNode = e;\n            return getWindow(candidateNode).document;\n        }\n    };\n})();\n//#endregion\nfunction clearNode(node) {\n    while (node.firstChild) {\n        node.firstChild.remove();\n    }\n}\nclass DomListener {\n    constructor(node, type, handler, options) {\n        this._node = node;\n        this._type = type;\n        this._handler = handler;\n        this._options = (options || false);\n        this._node.addEventListener(this._type, this._handler, this._options);\n    }\n    dispose() {\n        if (!this._handler) {\n            // Already disposed\n            return;\n        }\n        this._node.removeEventListener(this._type, this._handler, this._options);\n        // Prevent leakers from holding on to the dom or handler func\n        this._node = null;\n        this._handler = null;\n    }\n}\nfunction addDisposableListener(node, type, handler, useCaptureOrOptions) {\n    return new DomListener(node, type, handler, useCaptureOrOptions);\n}\nfunction _wrapAsStandardMouseEvent(targetWindow, handler) {\n    return function (e) {\n        return handler(new StandardMouseEvent(targetWindow, e));\n    };\n}\nfunction _wrapAsStandardKeyboardEvent(handler) {\n    return function (e) {\n        return handler(new StandardKeyboardEvent(e));\n    };\n}\nconst addStandardDisposableListener = function addStandardDisposableListener(node, type, handler, useCapture) {\n    let wrapHandler = handler;\n    if (type === 'click' || type === 'mousedown' || type === 'contextmenu') {\n        wrapHandler = _wrapAsStandardMouseEvent(getWindow(node), handler);\n    }\n    else if (type === 'keydown' || type === 'keypress' || type === 'keyup') {\n        wrapHandler = _wrapAsStandardKeyboardEvent(handler);\n    }\n    return addDisposableListener(node, type, wrapHandler, useCapture);\n};\nconst addStandardDisposableGenericMouseDownListener = function addStandardDisposableListener(node, handler, useCapture) {\n    const wrapHandler = _wrapAsStandardMouseEvent(getWindow(node), handler);\n    return addDisposableGenericMouseDownListener(node, wrapHandler, useCapture);\n};\nfunction addDisposableGenericMouseDownListener(node, handler, useCapture) {\n    return addDisposableListener(node, isIOS && BrowserFeatures.pointerEvents ? EventType.POINTER_DOWN : EventType.MOUSE_DOWN, handler, useCapture);\n}\nfunction addDisposableGenericMouseMoveListener(node, handler, useCapture) {\n    return addDisposableListener(node, isIOS && BrowserFeatures.pointerEvents ? EventType.POINTER_MOVE : EventType.MOUSE_MOVE, handler, useCapture);\n}\nfunction addDisposableGenericMouseUpListener(node, handler, useCapture) {\n    return addDisposableListener(node, isIOS && BrowserFeatures.pointerEvents ? EventType.POINTER_UP : EventType.MOUSE_UP, handler, useCapture);\n}\n/**\n * Execute the callback the next time the browser is idle, returning an\n * {@link IDisposable} that will cancel the callback when disposed. This wraps\n * [requestIdleCallback] so it will fallback to [setTimeout] if the environment\n * doesn't support it.\n *\n * @param targetWindow The window for which to run the idle callback\n * @param callback The callback to run when idle, this includes an\n * [IdleDeadline] that provides the time alloted for the idle callback by the\n * browser. Not respecting this deadline will result in a degraded user\n * experience.\n * @param timeout A timeout at which point to queue no longer wait for an idle\n * callback but queue it on the regular event loop (like setTimeout). Typically\n * this should not be used.\n *\n * [IdleDeadline]: https://developer.mozilla.org/en-US/docs/Web/API/IdleDeadline\n * [requestIdleCallback]: https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback\n * [setTimeout]: https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout\n */\nfunction runWhenWindowIdle(targetWindow, callback, timeout) {\n    return _runWhenIdle(targetWindow, callback, timeout);\n}\n/**\n * An implementation of the \"idle-until-urgent\"-strategy as introduced\n * here: https://philipwalton.com/articles/idle-until-urgent/\n */\nclass WindowIdleValue extends AbstractIdleValue {\n    constructor(targetWindow, executor) {\n        super(targetWindow, executor);\n    }\n}\n/**\n * Schedule a callback to be run at the next animation frame.\n * This allows multiple parties to register callbacks that should run at the next animation frame.\n * If currently in an animation frame, `runner` will be executed immediately.\n * @return token that can be used to cancel the scheduled runner (only if `runner` was not executed immediately).\n */\nlet runAtThisOrScheduleAtNextAnimationFrame;\n/**\n * Schedule a callback to be run at the next animation frame.\n * This allows multiple parties to register callbacks that should run at the next animation frame.\n * If currently in an animation frame, `runner` will be executed at the next animation frame.\n * @return token that can be used to cancel the scheduled runner.\n */\nlet scheduleAtNextAnimationFrame;\nclass WindowIntervalTimer extends IntervalTimer {\n    /**\n     *\n     * @param node The optional node from which the target window is determined\n     */\n    constructor(node) {\n        super();\n        this.defaultTarget = node && getWindow(node);\n    }\n    cancelAndSet(runner, interval, targetWindow) {\n        return super.cancelAndSet(runner, interval, targetWindow ?? this.defaultTarget);\n    }\n}\nclass AnimationFrameQueueItem {\n    constructor(runner, priority = 0) {\n        this._runner = runner;\n        this.priority = priority;\n        this._canceled = false;\n    }\n    dispose() {\n        this._canceled = true;\n    }\n    execute() {\n        if (this._canceled) {\n            return;\n        }\n        try {\n            this._runner();\n        }\n        catch (e) {\n            onUnexpectedError(e);\n        }\n    }\n    // Sort by priority (largest to lowest)\n    static sort(a, b) {\n        return b.priority - a.priority;\n    }\n}\n(function () {\n    /**\n     * The runners scheduled at the next animation frame\n     */\n    const NEXT_QUEUE = new Map();\n    /**\n     * The runners scheduled at the current animation frame\n     */\n    const CURRENT_QUEUE = new Map();\n    /**\n     * A flag to keep track if the native requestAnimationFrame was already called\n     */\n    const animFrameRequested = new Map();\n    /**\n     * A flag to indicate if currently handling a native requestAnimationFrame callback\n     */\n    const inAnimationFrameRunner = new Map();\n    const animationFrameRunner = (targetWindowId) => {\n        animFrameRequested.set(targetWindowId, false);\n        const currentQueue = NEXT_QUEUE.get(targetWindowId) ?? [];\n        CURRENT_QUEUE.set(targetWindowId, currentQueue);\n        NEXT_QUEUE.set(targetWindowId, []);\n        inAnimationFrameRunner.set(targetWindowId, true);\n        while (currentQueue.length > 0) {\n            currentQueue.sort(AnimationFrameQueueItem.sort);\n            const top = currentQueue.shift();\n            top.execute();\n        }\n        inAnimationFrameRunner.set(targetWindowId, false);\n    };\n    scheduleAtNextAnimationFrame = (targetWindow, runner, priority = 0) => {\n        const targetWindowId = getWindowId(targetWindow);\n        const item = new AnimationFrameQueueItem(runner, priority);\n        let nextQueue = NEXT_QUEUE.get(targetWindowId);\n        if (!nextQueue) {\n            nextQueue = [];\n            NEXT_QUEUE.set(targetWindowId, nextQueue);\n        }\n        nextQueue.push(item);\n        if (!animFrameRequested.get(targetWindowId)) {\n            animFrameRequested.set(targetWindowId, true);\n            targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindowId));\n        }\n        return item;\n    };\n    runAtThisOrScheduleAtNextAnimationFrame = (targetWindow, runner, priority) => {\n        const targetWindowId = getWindowId(targetWindow);\n        if (inAnimationFrameRunner.get(targetWindowId)) {\n            const item = new AnimationFrameQueueItem(runner, priority);\n            let currentQueue = CURRENT_QUEUE.get(targetWindowId);\n            if (!currentQueue) {\n                currentQueue = [];\n                CURRENT_QUEUE.set(targetWindowId, currentQueue);\n            }\n            currentQueue.push(item);\n            return item;\n        }\n        else {\n            return scheduleAtNextAnimationFrame(targetWindow, runner, priority);\n        }\n    };\n})();\nfunction getComputedStyle(el) {\n    return getWindow(el).getComputedStyle(el, null);\n}\nfunction getClientArea(element, defaultValue, fallbackElement) {\n    const elWindow = getWindow(element);\n    const elDocument = elWindow.document;\n    // Try with DOM clientWidth / clientHeight\n    if (element !== elDocument.body) {\n        return new Dimension(element.clientWidth, element.clientHeight);\n    }\n    // If visual view port exits and it's on mobile, it should be used instead of window innerWidth / innerHeight, or document.body.clientWidth / document.body.clientHeight\n    if (isIOS && elWindow?.visualViewport) {\n        return new Dimension(elWindow.visualViewport.width, elWindow.visualViewport.height);\n    }\n    // Try innerWidth / innerHeight\n    if (elWindow?.innerWidth && elWindow.innerHeight) {\n        return new Dimension(elWindow.innerWidth, elWindow.innerHeight);\n    }\n    // Try with document.body.clientWidth / document.body.clientHeight\n    if (elDocument.body && elDocument.body.clientWidth && elDocument.body.clientHeight) {\n        return new Dimension(elDocument.body.clientWidth, elDocument.body.clientHeight);\n    }\n    // Try with document.documentElement.clientWidth / document.documentElement.clientHeight\n    if (elDocument.documentElement && elDocument.documentElement.clientWidth && elDocument.documentElement.clientHeight) {\n        return new Dimension(elDocument.documentElement.clientWidth, elDocument.documentElement.clientHeight);\n    }\n    throw new Error('Unable to figure out browser width and height');\n}\nclass SizeUtils {\n    // Adapted from WinJS\n    // Converts a CSS positioning string for the specified element to pixels.\n    static convertToPixels(element, value) {\n        return parseFloat(value) || 0;\n    }\n    static getDimension(element, cssPropertyName) {\n        const computedStyle = getComputedStyle(element);\n        const value = computedStyle ? computedStyle.getPropertyValue(cssPropertyName) : '0';\n        return SizeUtils.convertToPixels(element, value);\n    }\n    static getBorderLeftWidth(element) {\n        return SizeUtils.getDimension(element, 'border-left-width');\n    }\n    static getBorderRightWidth(element) {\n        return SizeUtils.getDimension(element, 'border-right-width');\n    }\n    static getBorderTopWidth(element) {\n        return SizeUtils.getDimension(element, 'border-top-width');\n    }\n    static getBorderBottomWidth(element) {\n        return SizeUtils.getDimension(element, 'border-bottom-width');\n    }\n    static getPaddingLeft(element) {\n        return SizeUtils.getDimension(element, 'padding-left');\n    }\n    static getPaddingRight(element) {\n        return SizeUtils.getDimension(element, 'padding-right');\n    }\n    static getPaddingTop(element) {\n        return SizeUtils.getDimension(element, 'padding-top');\n    }\n    static getPaddingBottom(element) {\n        return SizeUtils.getDimension(element, 'padding-bottom');\n    }\n    static getMarginLeft(element) {\n        return SizeUtils.getDimension(element, 'margin-left');\n    }\n    static getMarginTop(element) {\n        return SizeUtils.getDimension(element, 'margin-top');\n    }\n    static getMarginRight(element) {\n        return SizeUtils.getDimension(element, 'margin-right');\n    }\n    static getMarginBottom(element) {\n        return SizeUtils.getDimension(element, 'margin-bottom');\n    }\n}\nclass Dimension {\n    static { this.None = new Dimension(0, 0); }\n    constructor(width, height) {\n        this.width = width;\n        this.height = height;\n    }\n    with(width = this.width, height = this.height) {\n        if (width !== this.width || height !== this.height) {\n            return new Dimension(width, height);\n        }\n        else {\n            return this;\n        }\n    }\n    static is(obj) {\n        return typeof obj === 'object' && typeof obj.height === 'number' && typeof obj.width === 'number';\n    }\n    static lift(obj) {\n        if (obj instanceof Dimension) {\n            return obj;\n        }\n        else {\n            return new Dimension(obj.width, obj.height);\n        }\n    }\n    static equals(a, b) {\n        if (a === b) {\n            return true;\n        }\n        if (!a || !b) {\n            return false;\n        }\n        return a.width === b.width && a.height === b.height;\n    }\n}\nfunction getTopLeftOffset(element) {\n    // Adapted from WinJS.Utilities.getPosition\n    // and added borders to the mix\n    let offsetParent = element.offsetParent;\n    let top = element.offsetTop;\n    let left = element.offsetLeft;\n    while ((element = element.parentNode) !== null\n        && element !== element.ownerDocument.body\n        && element !== element.ownerDocument.documentElement) {\n        top -= element.scrollTop;\n        const c = isShadowRoot(element) ? null : getComputedStyle(element);\n        if (c) {\n            left -= c.direction !== 'rtl' ? element.scrollLeft : -element.scrollLeft;\n        }\n        if (element === offsetParent) {\n            left += SizeUtils.getBorderLeftWidth(element);\n            top += SizeUtils.getBorderTopWidth(element);\n            top += element.offsetTop;\n            left += element.offsetLeft;\n            offsetParent = element.offsetParent;\n        }\n    }\n    return {\n        left: left,\n        top: top\n    };\n}\nfunction size(element, width, height) {\n    if (typeof width === 'number') {\n        element.style.width = `${width}px`;\n    }\n    if (typeof height === 'number') {\n        element.style.height = `${height}px`;\n    }\n}\n/**\n * Returns the position of a dom node relative to the entire page.\n */\nfunction getDomNodePagePosition(domNode) {\n    const bb = domNode.getBoundingClientRect();\n    const window = getWindow(domNode);\n    return {\n        left: bb.left + window.scrollX,\n        top: bb.top + window.scrollY,\n        width: bb.width,\n        height: bb.height\n    };\n}\n/**\n * Returns the effective zoom on a given element before window zoom level is applied\n */\nfunction getDomNodeZoomLevel(domNode) {\n    let testElement = domNode;\n    let zoom = 1.0;\n    do {\n        // eslint-disable-next-line local/code-no-any-casts\n        const elementZoomLevel = getComputedStyle(testElement).zoom;\n        if (elementZoomLevel !== null && elementZoomLevel !== undefined && elementZoomLevel !== '1') {\n            zoom *= elementZoomLevel;\n        }\n        testElement = testElement.parentElement;\n    } while (testElement !== null && testElement !== testElement.ownerDocument.documentElement);\n    return zoom;\n}\n// Adapted from WinJS\n// Gets the width of the element, including margins.\nfunction getTotalWidth(element) {\n    const margin = SizeUtils.getMarginLeft(element) + SizeUtils.getMarginRight(element);\n    return element.offsetWidth + margin;\n}\nfunction getContentWidth(element) {\n    const border = SizeUtils.getBorderLeftWidth(element) + SizeUtils.getBorderRightWidth(element);\n    const padding = SizeUtils.getPaddingLeft(element) + SizeUtils.getPaddingRight(element);\n    return element.offsetWidth - border - padding;\n}\n// Adapted from WinJS\n// Gets the height of the content of the specified element. The content height does not include borders or padding.\nfunction getContentHeight(element) {\n    const border = SizeUtils.getBorderTopWidth(element) + SizeUtils.getBorderBottomWidth(element);\n    const padding = SizeUtils.getPaddingTop(element) + SizeUtils.getPaddingBottom(element);\n    return element.offsetHeight - border - padding;\n}\n// Adapted from WinJS\n// Gets the height of the element, including its margins.\nfunction getTotalHeight(element) {\n    const margin = SizeUtils.getMarginTop(element) + SizeUtils.getMarginBottom(element);\n    return element.offsetHeight + margin;\n}\n// ----------------------------------------------------------------------------------------\nfunction isAncestor(testChild, testAncestor) {\n    return Boolean(testAncestor?.contains(testChild));\n}\nfunction findParentWithClass(node, clazz, stopAtClazzOrNode) {\n    while (node && node.nodeType === node.ELEMENT_NODE) {\n        if (node.classList.contains(clazz)) {\n            return node;\n        }\n        if (stopAtClazzOrNode) {\n            if (typeof stopAtClazzOrNode === 'string') {\n                if (node.classList.contains(stopAtClazzOrNode)) {\n                    return null;\n                }\n            }\n            else {\n                if (node === stopAtClazzOrNode) {\n                    return null;\n                }\n            }\n        }\n        node = node.parentNode;\n    }\n    return null;\n}\nfunction hasParentWithClass(node, clazz, stopAtClazzOrNode) {\n    return !!findParentWithClass(node, clazz, stopAtClazzOrNode);\n}\nfunction isShadowRoot(node) {\n    return (node && !!node.host && !!node.mode);\n}\nfunction isInShadowDOM(domNode) {\n    return !!getShadowRoot(domNode);\n}\nfunction getShadowRoot(domNode) {\n    while (domNode.parentNode) {\n        if (domNode === domNode.ownerDocument?.body) {\n            // reached the body\n            return null;\n        }\n        domNode = domNode.parentNode;\n    }\n    return isShadowRoot(domNode) ? domNode : null;\n}\n/**\n * Returns the active element across all child windows\n * based on document focus. Falls back to the main\n * window if no window has focus.\n */\nfunction getActiveElement() {\n    let result = getActiveDocument().activeElement;\n    while (result?.shadowRoot) {\n        result = result.shadowRoot.activeElement;\n    }\n    return result;\n}\n/**\n * Returns true if the focused window active element matches\n * the provided element. Falls back to the main window if no\n * window has focus.\n */\nfunction isActiveElement(element) {\n    return getActiveElement() === element;\n}\n/**\n * Returns true if the focused window active element is contained in\n * `ancestor`. Falls back to the main window if no window has focus.\n */\nfunction isAncestorOfActiveElement(ancestor) {\n    return isAncestor(getActiveElement(), ancestor);\n}\n/**\n * Returns the active document across main and child windows.\n * Prefers the window with focus, otherwise falls back to\n * the main windows document.\n */\nfunction getActiveDocument() {\n    if (getWindowsCount() <= 1) {\n        return mainWindow.document;\n    }\n    const documents = Array.from(getWindows()).map(({ window }) => window.document);\n    return documents.find(doc => doc.hasFocus()) ?? mainWindow.document;\n}\n/**\n * Returns the active window across main and child windows.\n * Prefers the window with focus, otherwise falls back to\n * the main window.\n */\nfunction getActiveWindow() {\n    const document = getActiveDocument();\n    return (document.defaultView?.window ?? mainWindow);\n}\nconst sharedMutationObserver = new class {\n    constructor() {\n        this.mutationObservers = new Map();\n    }\n    observe(target, disposables, options) {\n        let mutationObserversPerTarget = this.mutationObservers.get(target);\n        if (!mutationObserversPerTarget) {\n            mutationObserversPerTarget = new Map();\n            this.mutationObservers.set(target, mutationObserversPerTarget);\n        }\n        const optionsHash = hash(options);\n        let mutationObserverPerOptions = mutationObserversPerTarget.get(optionsHash);\n        if (!mutationObserverPerOptions) {\n            const onDidMutate = new Emitter();\n            const observer = new MutationObserver(mutations => onDidMutate.fire(mutations));\n            observer.observe(target, options);\n            const resolvedMutationObserverPerOptions = mutationObserverPerOptions = {\n                users: 1,\n                observer,\n                onDidMutate: onDidMutate.event\n            };\n            disposables.add(toDisposable(() => {\n                resolvedMutationObserverPerOptions.users -= 1;\n                if (resolvedMutationObserverPerOptions.users === 0) {\n                    onDidMutate.dispose();\n                    observer.disconnect();\n                    mutationObserversPerTarget?.delete(optionsHash);\n                    if (mutationObserversPerTarget?.size === 0) {\n                        this.mutationObservers.delete(target);\n                    }\n                }\n            }));\n            mutationObserversPerTarget.set(optionsHash, mutationObserverPerOptions);\n        }\n        else {\n            mutationObserverPerOptions.users += 1;\n        }\n        return mutationObserverPerOptions.onDidMutate;\n    }\n};\nfunction isHTMLElement(e) {\n    // eslint-disable-next-line no-restricted-syntax\n    return e instanceof HTMLElement || e instanceof getWindow(e).HTMLElement;\n}\nfunction isHTMLAnchorElement(e) {\n    // eslint-disable-next-line no-restricted-syntax\n    return e instanceof HTMLAnchorElement || e instanceof getWindow(e).HTMLAnchorElement;\n}\nfunction isSVGElement(e) {\n    // eslint-disable-next-line no-restricted-syntax\n    return e instanceof SVGElement || e instanceof getWindow(e).SVGElement;\n}\nfunction isMouseEvent(e) {\n    // eslint-disable-next-line no-restricted-syntax\n    return e instanceof MouseEvent || e instanceof getWindow(e).MouseEvent;\n}\nfunction isKeyboardEvent(e) {\n    // eslint-disable-next-line no-restricted-syntax\n    return e instanceof KeyboardEvent || e instanceof getWindow(e).KeyboardEvent;\n}\nconst EventType = {\n    // Mouse\n    CLICK: 'click',\n    AUXCLICK: 'auxclick',\n    DBLCLICK: 'dblclick',\n    MOUSE_UP: 'mouseup',\n    MOUSE_DOWN: 'mousedown',\n    MOUSE_OVER: 'mouseover',\n    MOUSE_MOVE: 'mousemove',\n    MOUSE_OUT: 'mouseout',\n    MOUSE_ENTER: 'mouseenter',\n    MOUSE_LEAVE: 'mouseleave',\n    MOUSE_WHEEL: 'wheel',\n    POINTER_UP: 'pointerup',\n    POINTER_DOWN: 'pointerdown',\n    POINTER_MOVE: 'pointermove',\n    POINTER_LEAVE: 'pointerleave',\n    CONTEXT_MENU: 'contextmenu',\n    // Keyboard\n    KEY_DOWN: 'keydown',\n    KEY_UP: 'keyup',\n    BEFORE_UNLOAD: 'beforeunload',\n    FOCUS: 'focus',\n    FOCUS_IN: 'focusin',\n    FOCUS_OUT: 'focusout',\n    BLUR: 'blur',\n    INPUT: 'input',\n    // Drag\n    DRAG_START: 'dragstart',\n    DRAG: 'drag',\n    DRAG_ENTER: 'dragenter',\n    DRAG_LEAVE: 'dragleave',\n    DRAG_OVER: 'dragover',\n    DROP: 'drop',\n    DRAG_END: 'dragend'};\nfunction isEventLike(obj) {\n    const candidate = obj;\n    return !!(candidate && typeof candidate.preventDefault === 'function' && typeof candidate.stopPropagation === 'function');\n}\nconst EventHelper = {\n    stop: (e, cancelBubble) => {\n        e.preventDefault();\n        if (cancelBubble) {\n            e.stopPropagation();\n        }\n        return e;\n    }\n};\nfunction saveParentsScrollTop(node) {\n    const r = [];\n    for (let i = 0; node && node.nodeType === node.ELEMENT_NODE; i++) {\n        r[i] = node.scrollTop;\n        node = node.parentNode;\n    }\n    return r;\n}\nfunction restoreParentsScrollTop(node, state) {\n    for (let i = 0; node && node.nodeType === node.ELEMENT_NODE; i++) {\n        if (node.scrollTop !== state[i]) {\n            node.scrollTop = state[i];\n        }\n        node = node.parentNode;\n    }\n}\nclass FocusTracker extends Disposable {\n    get onDidFocus() { return this._onDidFocus.event; }\n    get onDidBlur() { return this._onDidBlur.event; }\n    static hasFocusWithin(element) {\n        if (isHTMLElement(element)) {\n            const shadowRoot = getShadowRoot(element);\n            const activeElement = (shadowRoot ? shadowRoot.activeElement : element.ownerDocument.activeElement);\n            return isAncestor(activeElement, element);\n        }\n        else {\n            const window = element;\n            return isAncestor(window.document.activeElement, window.document);\n        }\n    }\n    constructor(element) {\n        super();\n        this._onDidFocus = this._register(new Emitter());\n        this._onDidBlur = this._register(new Emitter());\n        let hasFocus = FocusTracker.hasFocusWithin(element);\n        let loosingFocus = false;\n        const onFocus = () => {\n            loosingFocus = false;\n            if (!hasFocus) {\n                hasFocus = true;\n                this._onDidFocus.fire();\n            }\n        };\n        const onBlur = () => {\n            if (hasFocus) {\n                loosingFocus = true;\n                (isHTMLElement(element) ? getWindow(element) : element).setTimeout(() => {\n                    if (loosingFocus) {\n                        loosingFocus = false;\n                        hasFocus = false;\n                        this._onDidBlur.fire();\n                    }\n                }, 0);\n            }\n        };\n        this._refreshStateHandler = () => {\n            const currentNodeHasFocus = FocusTracker.hasFocusWithin(element);\n            if (currentNodeHasFocus !== hasFocus) {\n                if (hasFocus) {\n                    onBlur();\n                }\n                else {\n                    onFocus();\n                }\n            }\n        };\n        this._register(addDisposableListener(element, EventType.FOCUS, onFocus, true));\n        this._register(addDisposableListener(element, EventType.BLUR, onBlur, true));\n        if (isHTMLElement(element)) {\n            this._register(addDisposableListener(element, EventType.FOCUS_IN, () => this._refreshStateHandler()));\n            this._register(addDisposableListener(element, EventType.FOCUS_OUT, () => this._refreshStateHandler()));\n        }\n    }\n}\n/**\n * Creates a new `IFocusTracker` instance that tracks focus changes on the given `element` and its descendants.\n *\n * @param element The `HTMLElement` or `Window` to track focus changes on.\n * @returns An `IFocusTracker` instance.\n */\nfunction trackFocus(element) {\n    return new FocusTracker(element);\n}\nfunction after(sibling, child) {\n    sibling.after(child);\n    return child;\n}\nfunction append(parent, ...children) {\n    parent.append(...children);\n    if (children.length === 1 && typeof children[0] !== 'string') {\n        return children[0];\n    }\n}\nfunction prepend(parent, child) {\n    parent.insertBefore(child, parent.firstChild);\n    return child;\n}\n/**\n * Removes all children from `parent` and appends `children`\n */\nfunction reset(parent, ...children) {\n    parent.textContent = '';\n    append(parent, ...children);\n}\nconst SELECTOR_REGEX = /([\\w\\-]+)?(#([\\w\\-]+))?((\\.([\\w\\-]+))*)/;\nvar Namespace;\n(function (Namespace) {\n    Namespace[\"HTML\"] = \"http://www.w3.org/1999/xhtml\";\n    Namespace[\"SVG\"] = \"http://www.w3.org/2000/svg\";\n})(Namespace || (Namespace = {}));\nfunction _$(namespace, description, attrs, ...children) {\n    const match = SELECTOR_REGEX.exec(description);\n    if (!match) {\n        throw new Error('Bad use of emmet');\n    }\n    const tagName = match[1] || 'div';\n    let result;\n    if (namespace !== Namespace.HTML) {\n        result = document.createElementNS(namespace, tagName);\n    }\n    else {\n        result = document.createElement(tagName);\n    }\n    if (match[3]) {\n        result.id = match[3];\n    }\n    if (match[4]) {\n        result.className = match[4].replace(/\\./g, ' ').trim();\n    }\n    if (attrs) {\n        Object.entries(attrs).forEach(([name, value]) => {\n            if (typeof value === 'undefined') {\n                return;\n            }\n            if (/^on\\w+$/.test(name)) {\n                // eslint-disable-next-line local/code-no-any-casts\n                result[name] = value;\n            }\n            else if (name === 'selected') {\n                if (value) {\n                    result.setAttribute(name, 'true');\n                }\n            }\n            else {\n                result.setAttribute(name, value);\n            }\n        });\n    }\n    result.append(...children);\n    return result;\n}\nfunction $(description, attrs, ...children) {\n    return _$(Namespace.HTML, description, attrs, ...children);\n}\n$.SVG = function (description, attrs, ...children) {\n    return _$(Namespace.SVG, description, attrs, ...children);\n};\nfunction setVisibility(visible, ...elements) {\n    if (visible) {\n        show(...elements);\n    }\n    else {\n        hide(...elements);\n    }\n}\nfunction show(...elements) {\n    for (const element of elements) {\n        element.style.display = '';\n        element.removeAttribute('aria-hidden');\n    }\n}\nfunction hide(...elements) {\n    for (const element of elements) {\n        element.style.display = 'none';\n        element.setAttribute('aria-hidden', 'true');\n    }\n}\n/**\n * Find a value usable for a dom node size such that the likelihood that it would be\n * displayed with constant screen pixels size is as high as possible.\n *\n * e.g. We would desire for the cursors to be 2px (CSS px) wide. Under a devicePixelRatio\n * of 1.25, the cursor will be 2.5 screen pixels wide. Depending on how the dom node aligns/\"snaps\"\n * with the screen pixels, it will sometimes be rendered with 2 screen pixels, and sometimes with 3 screen pixels.\n */\nfunction computeScreenAwareSize(window, cssPx) {\n    const screenPx = window.devicePixelRatio * cssPx;\n    return Math.max(1, Math.floor(screenPx)) / window.devicePixelRatio;\n}\n/**\n * Open safely a new window. This is the best way to do so, but you cannot tell\n * if the window was opened or if it was blocked by the browser's popup blocker.\n * If you want to tell if the browser blocked the new window, use {@link windowOpenWithSuccess}.\n *\n * See https://github.com/microsoft/monaco-editor/issues/601\n * To protect against malicious code in the linked site, particularly phishing attempts,\n * the window.opener should be set to null to prevent the linked site from having access\n * to change the location of the current page.\n * See https://mathiasbynens.github.io/rel-noopener/\n */\nfunction windowOpenNoOpener(url) {\n    // By using 'noopener' in the `windowFeatures` argument, the newly created window will\n    // not be able to use `window.opener` to reach back to the current page.\n    // See https://stackoverflow.com/a/46958731\n    // See https://developer.mozilla.org/en-US/docs/Web/API/Window/open#noopener\n    // However, this also doesn't allow us to realize if the browser blocked\n    // the creation of the window.\n    mainWindow.open(url, '_blank', 'noopener');\n}\nfunction animate(targetWindow, fn) {\n    const step = () => {\n        fn();\n        stepDisposable = scheduleAtNextAnimationFrame(targetWindow, step);\n    };\n    let stepDisposable = scheduleAtNextAnimationFrame(targetWindow, step);\n    return toDisposable(() => stepDisposable.dispose());\n}\nRemoteAuthorities.setPreferredWebSchema(/^https:/.test(mainWindow.location.href) ? 'https' : 'http');\nclass ModifierKeyEmitter extends Emitter {\n    constructor() {\n        super();\n        this._subscriptions = new DisposableStore();\n        this._keyStatus = {\n            altKey: false,\n            shiftKey: false,\n            ctrlKey: false,\n            metaKey: false\n        };\n        this._subscriptions.add(Event.runAndSubscribe(onDidRegisterWindow, ({ window, disposables }) => this.registerListeners(window, disposables), { window: mainWindow, disposables: this._subscriptions }));\n    }\n    registerListeners(window, disposables) {\n        disposables.add(addDisposableListener(window, 'keydown', e => {\n            if (e.defaultPrevented) {\n                return;\n            }\n            const event = new StandardKeyboardEvent(e);\n            // If Alt-key keydown event is repeated, ignore it #112347\n            // Only known to be necessary for Alt-Key at the moment #115810\n            if (event.keyCode === 6 /* KeyCode.Alt */ && e.repeat) {\n                return;\n            }\n            if (e.altKey && !this._keyStatus.altKey) {\n                this._keyStatus.lastKeyPressed = 'alt';\n            }\n            else if (e.ctrlKey && !this._keyStatus.ctrlKey) {\n                this._keyStatus.lastKeyPressed = 'ctrl';\n            }\n            else if (e.metaKey && !this._keyStatus.metaKey) {\n                this._keyStatus.lastKeyPressed = 'meta';\n            }\n            else if (e.shiftKey && !this._keyStatus.shiftKey) {\n                this._keyStatus.lastKeyPressed = 'shift';\n            }\n            else if (event.keyCode !== 6 /* KeyCode.Alt */) {\n                this._keyStatus.lastKeyPressed = undefined;\n            }\n            else {\n                return;\n            }\n            this._keyStatus.altKey = e.altKey;\n            this._keyStatus.ctrlKey = e.ctrlKey;\n            this._keyStatus.metaKey = e.metaKey;\n            this._keyStatus.shiftKey = e.shiftKey;\n            if (this._keyStatus.lastKeyPressed) {\n                this._keyStatus.event = e;\n                this.fire(this._keyStatus);\n            }\n        }, true));\n        disposables.add(addDisposableListener(window, 'keyup', e => {\n            if (e.defaultPrevented) {\n                return;\n            }\n            if (!e.altKey && this._keyStatus.altKey) {\n                this._keyStatus.lastKeyReleased = 'alt';\n            }\n            else if (!e.ctrlKey && this._keyStatus.ctrlKey) {\n                this._keyStatus.lastKeyReleased = 'ctrl';\n            }\n            else if (!e.metaKey && this._keyStatus.metaKey) {\n                this._keyStatus.lastKeyReleased = 'meta';\n            }\n            else if (!e.shiftKey && this._keyStatus.shiftKey) {\n                this._keyStatus.lastKeyReleased = 'shift';\n            }\n            else {\n                this._keyStatus.lastKeyReleased = undefined;\n            }\n            if (this._keyStatus.lastKeyPressed !== this._keyStatus.lastKeyReleased) {\n                this._keyStatus.lastKeyPressed = undefined;\n            }\n            this._keyStatus.altKey = e.altKey;\n            this._keyStatus.ctrlKey = e.ctrlKey;\n            this._keyStatus.metaKey = e.metaKey;\n            this._keyStatus.shiftKey = e.shiftKey;\n            if (this._keyStatus.lastKeyReleased) {\n                this._keyStatus.event = e;\n                this.fire(this._keyStatus);\n            }\n        }, true));\n        disposables.add(addDisposableListener(window.document.body, 'mousedown', () => {\n            this._keyStatus.lastKeyPressed = undefined;\n        }, true));\n        disposables.add(addDisposableListener(window.document.body, 'mouseup', () => {\n            this._keyStatus.lastKeyPressed = undefined;\n        }, true));\n        disposables.add(addDisposableListener(window.document.body, 'mousemove', e => {\n            if (e.buttons) {\n                this._keyStatus.lastKeyPressed = undefined;\n            }\n        }, true));\n        disposables.add(addDisposableListener(window, 'blur', () => {\n            this.resetKeyStatus();\n        }));\n    }\n    get keyStatus() {\n        return this._keyStatus;\n    }\n    /**\n     * Allows to explicitly reset the key status based on more knowledge (#109062)\n     */\n    resetKeyStatus() {\n        this.doResetKeyStatus();\n        this.fire(this._keyStatus);\n    }\n    doResetKeyStatus() {\n        this._keyStatus = {\n            altKey: false,\n            shiftKey: false,\n            ctrlKey: false,\n            metaKey: false\n        };\n    }\n    static getInstance() {\n        if (!ModifierKeyEmitter.instance) {\n            ModifierKeyEmitter.instance = new ModifierKeyEmitter();\n        }\n        return ModifierKeyEmitter.instance;\n    }\n    dispose() {\n        super.dispose();\n        this._subscriptions.dispose();\n    }\n}\nclass DragAndDropObserver extends Disposable {\n    constructor(element, callbacks) {\n        super();\n        this.element = element;\n        this.callbacks = callbacks;\n        // A helper to fix issues with repeated DRAG_ENTER / DRAG_LEAVE\n        // calls see https://github.com/microsoft/vscode/issues/14470\n        // when the element has child elements where the events are fired\n        // repeadedly.\n        this.counter = 0;\n        // Allows to measure the duration of the drag operation.\n        this.dragStartTime = 0;\n        this.registerListeners();\n    }\n    registerListeners() {\n        if (this.callbacks.onDragStart) {\n            this._register(addDisposableListener(this.element, EventType.DRAG_START, (e) => {\n                this.callbacks.onDragStart?.(e);\n            }));\n        }\n        if (this.callbacks.onDrag) {\n            this._register(addDisposableListener(this.element, EventType.DRAG, (e) => {\n                this.callbacks.onDrag?.(e);\n            }));\n        }\n        this._register(addDisposableListener(this.element, EventType.DRAG_ENTER, (e) => {\n            this.counter++;\n            this.dragStartTime = e.timeStamp;\n            this.callbacks.onDragEnter?.(e);\n        }));\n        this._register(addDisposableListener(this.element, EventType.DRAG_OVER, (e) => {\n            e.preventDefault(); // needed so that the drop event fires (https://stackoverflow.com/questions/21339924/drop-event-not-firing-in-chrome)\n            this.callbacks.onDragOver?.(e, e.timeStamp - this.dragStartTime);\n        }));\n        this._register(addDisposableListener(this.element, EventType.DRAG_LEAVE, (e) => {\n            this.counter--;\n            if (this.counter === 0) {\n                this.dragStartTime = 0;\n                this.callbacks.onDragLeave?.(e);\n            }\n        }));\n        this._register(addDisposableListener(this.element, EventType.DRAG_END, (e) => {\n            this.counter = 0;\n            this.dragStartTime = 0;\n            this.callbacks.onDragEnd?.(e);\n        }));\n        this._register(addDisposableListener(this.element, EventType.DROP, (e) => {\n            this.counter = 0;\n            this.dragStartTime = 0;\n            this.callbacks.onDrop?.(e);\n        }));\n    }\n}\nconst H_REGEX = /(?<tag>[\\w\\-]+)?(?:#(?<id>[\\w\\-]+))?(?<class>(?:\\.(?:[\\w\\-]+))*)(?:@(?<name>(?:[\\w\\_])+))?/;\nfunction h(tag, ...args) {\n    let attributes;\n    let children;\n    if (Array.isArray(args[0])) {\n        attributes = {};\n        children = args[0];\n    }\n    else {\n        // eslint-disable-next-line local/code-no-any-casts\n        attributes = args[0] || {};\n        children = args[1];\n    }\n    const match = H_REGEX.exec(tag);\n    if (!match || !match.groups) {\n        throw new Error('Bad use of h');\n    }\n    const tagName = match.groups['tag'] || 'div';\n    const el = document.createElement(tagName);\n    if (match.groups['id']) {\n        el.id = match.groups['id'];\n    }\n    const classNames = [];\n    if (match.groups['class']) {\n        for (const className of match.groups['class'].split('.')) {\n            if (className !== '') {\n                classNames.push(className);\n            }\n        }\n    }\n    if (attributes.className !== undefined) {\n        for (const className of attributes.className.split('.')) {\n            if (className !== '') {\n                classNames.push(className);\n            }\n        }\n    }\n    if (classNames.length > 0) {\n        el.className = classNames.join(' ');\n    }\n    const result = {};\n    if (match.groups['name']) {\n        result[match.groups['name']] = el;\n    }\n    if (children) {\n        for (const c of children) {\n            if (isHTMLElement(c)) {\n                el.appendChild(c);\n            }\n            else if (typeof c === 'string') {\n                el.append(c);\n            }\n            else if ('root' in c) {\n                Object.assign(result, c);\n                el.appendChild(c.root);\n            }\n        }\n    }\n    for (const [key, value] of Object.entries(attributes)) {\n        if (key === 'className') {\n            continue;\n        }\n        else if (key === 'style') {\n            for (const [cssKey, cssValue] of Object.entries(value)) {\n                el.style.setProperty(camelCaseToHyphenCase(cssKey), typeof cssValue === 'number' ? cssValue + 'px' : '' + cssValue);\n            }\n        }\n        else if (key === 'tabIndex') {\n            el.tabIndex = value;\n        }\n        else {\n            el.setAttribute(camelCaseToHyphenCase(key), value.toString());\n        }\n    }\n    result['root'] = el;\n    return result;\n}\nfunction camelCaseToHyphenCase(str) {\n    return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n}\nfunction isEditableElement(element) {\n    return element.tagName.toLowerCase() === 'input' || element.tagName.toLowerCase() === 'textarea' || isHTMLElement(element) && !!element.editContext;\n}\nvar n;\n(function (n) {\n    function nodeNs(elementNs = undefined) {\n        return (tag, attributes, children) => {\n            const className = attributes.class;\n            delete attributes.class;\n            const ref = attributes.ref;\n            delete attributes.ref;\n            const obsRef = attributes.obsRef;\n            delete attributes.obsRef;\n            // eslint-disable-next-line local/code-no-any-casts\n            return new ObserverNodeWithElement(tag, ref, obsRef, elementNs, className, attributes, children);\n        };\n    }\n    function node(tag, elementNs = undefined) {\n        // eslint-disable-next-line local/code-no-any-casts\n        const f = nodeNs(elementNs);\n        return (attributes, children) => {\n            return f(tag, attributes, children);\n        };\n    }\n    n.div = node('div');\n    n.elem = nodeNs(undefined);\n    n.svg = node('svg', 'http://www.w3.org/2000/svg');\n    n.svgElem = nodeNs('http://www.w3.org/2000/svg');\n    function ref() {\n        let value = undefined;\n        const result = function (val) {\n            value = val;\n        };\n        Object.defineProperty(result, 'element', {\n            get() {\n                if (!value) {\n                    throw new BugIndicatingError('Make sure the ref is set before accessing the element. Maybe wrong initialization order?');\n                }\n                return value;\n            }\n        });\n        // eslint-disable-next-line local/code-no-any-casts\n        return result;\n    }\n    n.ref = ref;\n})(n || (n = {}));\nclass ObserverNode {\n    constructor(tag, ref, obsRef, ns, className, attributes, children) {\n        this._deriveds = [];\n        this._element = (ns ? document.createElementNS(ns, tag) : document.createElement(tag));\n        if (ref) {\n            ref(this._element);\n        }\n        if (obsRef) {\n            this._deriveds.push(derived((_reader) => {\n                obsRef(this);\n                _reader.store.add({\n                    dispose: () => {\n                        obsRef(null);\n                    }\n                });\n            }));\n        }\n        if (className) {\n            if (hasObservable(className)) {\n                this._deriveds.push(derived(this, reader => {\n                    /** @description set.class */\n                    setClassName(this._element, getClassName(className, reader));\n                }));\n            }\n            else {\n                setClassName(this._element, getClassName(className, undefined));\n            }\n        }\n        for (const [key, value] of Object.entries(attributes)) {\n            if (key === 'style') {\n                for (const [cssKey, cssValue] of Object.entries(value)) {\n                    const key = camelCaseToHyphenCase(cssKey);\n                    if (isObservable(cssValue)) {\n                        this._deriveds.push(derivedOpts({ owner: this, debugName: () => `set.style.${key}` }, reader => {\n                            this._element.style.setProperty(key, convertCssValue(cssValue.read(reader)));\n                        }));\n                    }\n                    else {\n                        this._element.style.setProperty(key, convertCssValue(cssValue));\n                    }\n                }\n            }\n            else if (key === 'tabIndex') {\n                if (isObservable(value)) {\n                    this._deriveds.push(derived(this, reader => {\n                        /** @description set.tabIndex */\n                        // eslint-disable-next-line local/code-no-any-casts\n                        this._element.tabIndex = value.read(reader);\n                    }));\n                }\n                else {\n                    this._element.tabIndex = value;\n                }\n            }\n            else if (key.startsWith('on')) {\n                // eslint-disable-next-line local/code-no-any-casts\n                this._element[key] = value;\n            }\n            else {\n                if (isObservable(value)) {\n                    this._deriveds.push(derivedOpts({ owner: this, debugName: () => `set.${key}` }, reader => {\n                        setOrRemoveAttribute(this._element, key, value.read(reader));\n                    }));\n                }\n                else {\n                    setOrRemoveAttribute(this._element, key, value);\n                }\n            }\n        }\n        if (children) {\n            function getChildren(reader, children) {\n                if (isObservable(children)) {\n                    return getChildren(reader, children.read(reader));\n                }\n                if (Array.isArray(children)) {\n                    return children.flatMap(c => getChildren(reader, c));\n                }\n                if (children instanceof ObserverNode) {\n                    if (reader) {\n                        children.readEffect(reader);\n                    }\n                    return [children._element];\n                }\n                if (children) {\n                    return [children];\n                }\n                return [];\n            }\n            const d = derived(this, reader => {\n                /** @description set.children */\n                this._element.replaceChildren(...getChildren(reader, children));\n            });\n            this._deriveds.push(d);\n            if (!childrenIsObservable(children)) {\n                d.get();\n            }\n        }\n    }\n    readEffect(reader) {\n        for (const d of this._deriveds) {\n            d.read(reader);\n        }\n    }\n    keepUpdated(store) {\n        derived(reader => {\n            /** update */\n            this.readEffect(reader);\n        }).recomputeInitiallyAndOnChange(store);\n        return this;\n    }\n    /**\n     * Creates a live element that will keep the element updated as long as the returned object is not disposed.\n    */\n    toDisposableLiveElement() {\n        const store = new DisposableStore();\n        this.keepUpdated(store);\n        return new LiveElement(this._element, store);\n    }\n}\nfunction setClassName(domNode, className) {\n    if (isSVGElement(domNode)) {\n        domNode.setAttribute('class', className);\n    }\n    else {\n        domNode.className = className;\n    }\n}\nfunction resolve(value, reader, cb) {\n    if (isObservable(value)) {\n        cb(value.read(reader));\n        return;\n    }\n    if (Array.isArray(value)) {\n        for (const v of value) {\n            resolve(v, reader, cb);\n        }\n        return;\n    }\n    // eslint-disable-next-line local/code-no-any-casts\n    cb(value);\n}\nfunction getClassName(className, reader) {\n    let result = '';\n    resolve(className, reader, val => {\n        if (val) {\n            if (result.length === 0) {\n                result = val;\n            }\n            else {\n                result += ' ' + val;\n            }\n        }\n    });\n    return result;\n}\nfunction hasObservable(value) {\n    if (isObservable(value)) {\n        return true;\n    }\n    if (Array.isArray(value)) {\n        return value.some(v => hasObservable(v));\n    }\n    return false;\n}\nfunction convertCssValue(value) {\n    if (typeof value === 'number') {\n        return value + 'px';\n    }\n    return value;\n}\nfunction childrenIsObservable(children) {\n    if (isObservable(children)) {\n        return true;\n    }\n    if (Array.isArray(children)) {\n        return children.some(c => childrenIsObservable(c));\n    }\n    return false;\n}\nclass LiveElement {\n    constructor(element, _disposable) {\n        this.element = element;\n        this._disposable = _disposable;\n    }\n    dispose() {\n        this._disposable.dispose();\n    }\n}\nclass ObserverNodeWithElement extends ObserverNode {\n    constructor() {\n        super(...arguments);\n        this._isHovered = undefined;\n        this._didMouseMoveDuringHover = undefined;\n    }\n    get element() {\n        return this._element;\n    }\n    get isHovered() {\n        if (!this._isHovered) {\n            const hovered = observableValue('hovered', false);\n            this._element.addEventListener('mouseenter', (_e) => hovered.set(true, undefined));\n            this._element.addEventListener('mouseleave', (_e) => hovered.set(false, undefined));\n            this._isHovered = hovered;\n        }\n        return this._isHovered;\n    }\n    get didMouseMoveDuringHover() {\n        if (!this._didMouseMoveDuringHover) {\n            let _hovering = false;\n            const hovered = observableValue('didMouseMoveDuringHover', false);\n            this._element.addEventListener('mouseenter', (_e) => {\n                _hovering = true;\n            });\n            this._element.addEventListener('mousemove', (_e) => {\n                if (_hovering) {\n                    hovered.set(true, undefined);\n                }\n            });\n            this._element.addEventListener('mouseleave', (_e) => {\n                _hovering = false;\n                hovered.set(false, undefined);\n            });\n            this._didMouseMoveDuringHover = hovered;\n        }\n        return this._didMouseMoveDuringHover;\n    }\n}\nfunction setOrRemoveAttribute(element, key, value) {\n    if (value === null || value === undefined) {\n        element.removeAttribute(camelCaseToHyphenCase(key));\n    }\n    else {\n        element.setAttribute(camelCaseToHyphenCase(key), String(value));\n    }\n}\nfunction isObservable(obj) {\n    return !!obj && obj.read !== undefined && obj.reportChanges !== undefined;\n}\n\nexport { $, Dimension, DragAndDropObserver, EventHelper, EventType, LiveElement, ModifierKeyEmitter, Namespace, ObserverNode, ObserverNodeWithElement, WindowIdleValue, WindowIntervalTimer, addDisposableGenericMouseDownListener, addDisposableGenericMouseMoveListener, addDisposableGenericMouseUpListener, addDisposableListener, addStandardDisposableGenericMouseDownListener, addStandardDisposableListener, after, animate, append, clearNode, computeScreenAwareSize, findParentWithClass, getActiveDocument, getActiveElement, getActiveWindow, getClientArea, getComputedStyle, getContentHeight, getContentWidth, getDocument, getDomNodePagePosition, getDomNodeZoomLevel, getShadowRoot, getTopLeftOffset, getTotalHeight, getTotalWidth, getWindow, getWindowById, getWindowId, getWindows, getWindowsCount, h, hasParentWithClass, hide, isActiveElement, isAncestor, isAncestorOfActiveElement, isEditableElement, isEventLike, isHTMLAnchorElement, isHTMLElement, isInShadowDOM, isKeyboardEvent, isMouseEvent, isSVGElement, isShadowRoot, n, onDidRegisterWindow, onDidUnregisterWindow, onWillUnregisterWindow, prepend, reset, restoreParentsScrollTop, runAtThisOrScheduleAtNextAnimationFrame, runWhenWindowIdle, saveParentsScrollTop, scheduleAtNextAnimationFrame, setVisibility, sharedMutationObserver, show, size, trackFocus, windowOpenNoOpener };\n","import { clearNode } from '../../dom.js';\nimport './aria.css';\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// Use a max length since we are inserting the whole msg in the DOM and that can cause browsers to freeze for long messages #94233\nconst MAX_MESSAGE_LENGTH = 20000;\nlet ariaContainer;\nlet alertContainer;\nlet alertContainer2;\nlet statusContainer;\nlet statusContainer2;\nfunction setARIAContainer(parent) {\n    ariaContainer = document.createElement('div');\n    ariaContainer.className = 'monaco-aria-container';\n    const createAlertContainer = () => {\n        const element = document.createElement('div');\n        element.className = 'monaco-alert';\n        element.setAttribute('role', 'alert');\n        element.setAttribute('aria-atomic', 'true');\n        ariaContainer.appendChild(element);\n        return element;\n    };\n    alertContainer = createAlertContainer();\n    alertContainer2 = createAlertContainer();\n    const createStatusContainer = () => {\n        const element = document.createElement('div');\n        element.className = 'monaco-status';\n        element.setAttribute('aria-live', 'polite');\n        element.setAttribute('aria-atomic', 'true');\n        ariaContainer.appendChild(element);\n        return element;\n    };\n    statusContainer = createStatusContainer();\n    statusContainer2 = createStatusContainer();\n    parent.appendChild(ariaContainer);\n}\n/**\n * Given the provided message, will make sure that it is read as alert to screen readers.\n */\nfunction alert(msg) {\n    if (!ariaContainer) {\n        return;\n    }\n    // Use alternate containers such that duplicated messages get read out by screen readers #99466\n    if (alertContainer.textContent !== msg) {\n        clearNode(alertContainer2);\n        insertMessage(alertContainer, msg);\n    }\n    else {\n        clearNode(alertContainer);\n        insertMessage(alertContainer2, msg);\n    }\n}\n/**\n * Given the provided message, will make sure that it is read as status to screen readers.\n */\nfunction status(msg) {\n    if (!ariaContainer) {\n        return;\n    }\n    if (statusContainer.textContent !== msg) {\n        clearNode(statusContainer2);\n        insertMessage(statusContainer, msg);\n    }\n    else {\n        clearNode(statusContainer);\n        insertMessage(statusContainer2, msg);\n    }\n}\nfunction insertMessage(target, msg) {\n    clearNode(target);\n    if (msg.length > MAX_MESSAGE_LENGTH) {\n        msg = msg.substr(0, MAX_MESSAGE_LENGTH);\n    }\n    target.textContent = msg;\n    // See https://www.paciellogroup.com/blog/2012/06/html5-accessibility-chops-aria-rolealert-browser-support/\n    target.style.visibility = 'hidden';\n    target.style.visibility = 'visible';\n}\n\nexport { alert, setARIAContainer, status };\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// ------ internal util\nvar _util;\n(function (_util) {\n    _util.serviceIds = new Map();\n    _util.DI_TARGET = '$di$target';\n    _util.DI_DEPENDENCIES = '$di$dependencies';\n    function getServiceDependencies(ctor) {\n        return ctor[_util.DI_DEPENDENCIES] || [];\n    }\n    _util.getServiceDependencies = getServiceDependencies;\n})(_util || (_util = {}));\nconst IInstantiationService = createDecorator('instantiationService');\nfunction storeServiceDependency(id, target, index) {\n    if (target[_util.DI_TARGET] === target) {\n        target[_util.DI_DEPENDENCIES].push({ id, index });\n    }\n    else {\n        target[_util.DI_DEPENDENCIES] = [{ id, index }];\n        target[_util.DI_TARGET] = target;\n    }\n}\n/**\n * The *only* valid way to create a {{ServiceIdentifier}}.\n */\nfunction createDecorator(serviceId) {\n    if (_util.serviceIds.has(serviceId)) {\n        return _util.serviceIds.get(serviceId);\n    }\n    const id = function (target, key, index) {\n        if (arguments.length !== 3) {\n            throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n        }\n        storeServiceDependency(id, target, index);\n    };\n    id.toString = () => serviceId;\n    _util.serviceIds.set(serviceId, id);\n    return id;\n}\n\nexport { IInstantiationService, _util, createDecorator };\n","import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst ICodeEditorService = createDecorator('codeEditorService');\n\nexport { ICodeEditorService };\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/**\n * A position in the editor.\n */\nclass Position {\n    constructor(lineNumber, column) {\n        this.lineNumber = lineNumber;\n        this.column = column;\n    }\n    /**\n     * Create a new position from this position.\n     *\n     * @param newLineNumber new line number\n     * @param newColumn new column\n     */\n    with(newLineNumber = this.lineNumber, newColumn = this.column) {\n        if (newLineNumber === this.lineNumber && newColumn === this.column) {\n            return this;\n        }\n        else {\n            return new Position(newLineNumber, newColumn);\n        }\n    }\n    /**\n     * Derive a new position from this position.\n     *\n     * @param deltaLineNumber line number delta\n     * @param deltaColumn column delta\n     */\n    delta(deltaLineNumber = 0, deltaColumn = 0) {\n        return this.with(Math.max(1, this.lineNumber + deltaLineNumber), Math.max(1, this.column + deltaColumn));\n    }\n    /**\n     * Test if this position equals other position\n     */\n    equals(other) {\n        return Position.equals(this, other);\n    }\n    /**\n     * Test if position `a` equals position `b`\n     */\n    static equals(a, b) {\n        if (!a && !b) {\n            return true;\n        }\n        return (!!a &&\n            !!b &&\n            a.lineNumber === b.lineNumber &&\n            a.column === b.column);\n    }\n    /**\n     * Test if this position is before other position.\n     * If the two positions are equal, the result will be false.\n     */\n    isBefore(other) {\n        return Position.isBefore(this, other);\n    }\n    /**\n     * Test if position `a` is before position `b`.\n     * If the two positions are equal, the result will be false.\n     */\n    static isBefore(a, b) {\n        if (a.lineNumber < b.lineNumber) {\n            return true;\n        }\n        if (b.lineNumber < a.lineNumber) {\n            return false;\n        }\n        return a.column < b.column;\n    }\n    /**\n     * Test if this position is before other position.\n     * If the two positions are equal, the result will be true.\n     */\n    isBeforeOrEqual(other) {\n        return Position.isBeforeOrEqual(this, other);\n    }\n    /**\n     * Test if position `a` is before position `b`.\n     * If the two positions are equal, the result will be true.\n     */\n    static isBeforeOrEqual(a, b) {\n        if (a.lineNumber < b.lineNumber) {\n            return true;\n        }\n        if (b.lineNumber < a.lineNumber) {\n            return false;\n        }\n        return a.column <= b.column;\n    }\n    /**\n     * A function that compares positions, useful for sorting\n     */\n    static compare(a, b) {\n        const aLineNumber = a.lineNumber | 0;\n        const bLineNumber = b.lineNumber | 0;\n        if (aLineNumber === bLineNumber) {\n            const aColumn = a.column | 0;\n            const bColumn = b.column | 0;\n            return aColumn - bColumn;\n        }\n        return aLineNumber - bLineNumber;\n    }\n    /**\n     * Clone this position.\n     */\n    clone() {\n        return new Position(this.lineNumber, this.column);\n    }\n    /**\n     * Convert to a human-readable representation.\n     */\n    toString() {\n        return '(' + this.lineNumber + ',' + this.column + ')';\n    }\n    // ---\n    /**\n     * Create a `Position` from an `IPosition`.\n     */\n    static lift(pos) {\n        return new Position(pos.lineNumber, pos.column);\n    }\n    /**\n     * Test if `obj` is an `IPosition`.\n     */\n    static isIPosition(obj) {\n        return (!!obj\n            && (typeof obj.lineNumber === 'number')\n            && (typeof obj.column === 'number'));\n    }\n    toJSON() {\n        return {\n            lineNumber: this.lineNumber,\n            column: this.column\n        };\n    }\n}\n\nexport { Position };\n","import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IModelService = createDecorator('modelService');\n\nexport { IModelService };\n","import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\n\nconst ITextModelService = createDecorator('textModelService');\n\nexport { ITextModelService };\n","import { Emitter } from './event.js';\nimport { Disposable } from './lifecycle.js';\nimport { localize } from '../../nls.js';\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/**\n * A concrete implementation of {@link IAction}.\n *\n * Note that in most cases you should use the lighter-weight {@linkcode toAction} function instead.\n */\nclass Action extends Disposable {\n    get onDidChange() { return this._onDidChange.event; }\n    constructor(id, label = '', cssClass = '', enabled = true, actionCallback) {\n        super();\n        this._onDidChange = this._register(new Emitter());\n        this._enabled = true;\n        this._id = id;\n        this._label = label;\n        this._cssClass = cssClass;\n        this._enabled = enabled;\n        this._actionCallback = actionCallback;\n    }\n    get id() {\n        return this._id;\n    }\n    get label() {\n        return this._label;\n    }\n    set label(value) {\n        this._setLabel(value);\n    }\n    _setLabel(value) {\n        if (this._label !== value) {\n            this._label = value;\n            this._onDidChange.fire({ label: value });\n        }\n    }\n    get tooltip() {\n        return this._tooltip || '';\n    }\n    set tooltip(value) {\n        this._setTooltip(value);\n    }\n    _setTooltip(value) {\n        if (this._tooltip !== value) {\n            this._tooltip = value;\n            this._onDidChange.fire({ tooltip: value });\n        }\n    }\n    get class() {\n        return this._cssClass;\n    }\n    set class(value) {\n        this._setClass(value);\n    }\n    _setClass(value) {\n        if (this._cssClass !== value) {\n            this._cssClass = value;\n            this._onDidChange.fire({ class: value });\n        }\n    }\n    get enabled() {\n        return this._enabled;\n    }\n    set enabled(value) {\n        this._setEnabled(value);\n    }\n    _setEnabled(value) {\n        if (this._enabled !== value) {\n            this._enabled = value;\n            this._onDidChange.fire({ enabled: value });\n        }\n    }\n    get checked() {\n        return this._checked;\n    }\n    set checked(value) {\n        this._setChecked(value);\n    }\n    _setChecked(value) {\n        if (this._checked !== value) {\n            this._checked = value;\n            this._onDidChange.fire({ checked: value });\n        }\n    }\n    async run(event, data) {\n        if (this._actionCallback) {\n            await this._actionCallback(event);\n        }\n    }\n}\nclass ActionRunner extends Disposable {\n    constructor() {\n        super(...arguments);\n        this._onWillRun = this._register(new Emitter());\n        this._onDidRun = this._register(new Emitter());\n    }\n    get onWillRun() { return this._onWillRun.event; }\n    get onDidRun() { return this._onDidRun.event; }\n    async run(action, context) {\n        if (!action.enabled) {\n            return;\n        }\n        this._onWillRun.fire({ action });\n        let error = undefined;\n        try {\n            await this.runAction(action, context);\n        }\n        catch (e) {\n            error = e;\n        }\n        this._onDidRun.fire({ action, error });\n    }\n    async runAction(action, context) {\n        await action.run(context);\n    }\n}\nclass Separator {\n    constructor() {\n        this.id = Separator.ID;\n        this.label = '';\n        this.tooltip = '';\n        this.class = 'separator';\n        this.enabled = false;\n        this.checked = false;\n    }\n    /**\n     * Joins all non-empty lists of actions with separators.\n     */\n    static join(...actionLists) {\n        let out = [];\n        for (const list of actionLists) {\n            if (!list.length) ;\n            else if (out.length) {\n                out = [...out, new Separator(), ...list];\n            }\n            else {\n                out = list;\n            }\n        }\n        return out;\n    }\n    static { this.ID = 'vs.actions.separator'; }\n    async run() { }\n}\nclass SubmenuAction {\n    get actions() { return this._actions; }\n    constructor(id, label, actions, cssClass) {\n        this.tooltip = '';\n        this.enabled = true;\n        this.checked = undefined;\n        this.id = id;\n        this.label = label;\n        this.class = cssClass;\n        this._actions = actions;\n    }\n    async run() { }\n}\nclass EmptySubmenuAction extends Action {\n    static { this.ID = 'vs.actions.empty'; }\n    constructor() {\n        super(EmptySubmenuAction.ID, localize(28, '(empty)'), undefined, false);\n    }\n}\nfunction toAction(props) {\n    return {\n        id: props.id,\n        label: props.label,\n        tooltip: props.tooltip ?? props.label,\n        class: props.class,\n        enabled: props.enabled ?? true,\n        checked: props.checked,\n        run: async (...args) => props.run(...args),\n    };\n}\n\nexport { Action, ActionRunner, EmptySubmenuAction, Separator, SubmenuAction, toAction };\n","import { isString } from './types.js';\n\nconst _codiconFontCharacters = Object.create(null);\nfunction register(id, fontCharacter) {\n    if (isString(fontCharacter)) {\n        const val = _codiconFontCharacters[fontCharacter];\n        if (val === undefined) {\n            throw new Error(`${id} references an unknown codicon: ${fontCharacter}`);\n        }\n        fontCharacter = val;\n    }\n    _codiconFontCharacters[id] = fontCharacter;\n    return { id };\n}\n/**\n * Only to be used by the iconRegistry.\n */\nfunction getCodiconFontCharacters() {\n    return _codiconFontCharacters;\n}\n\nexport { getCodiconFontCharacters, register };\n","import { register } from './codiconsUtil.js';\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// This file is automatically generated by (microsoft/vscode-codicons)/scripts/export-to-ts.js\n// Please don't edit it, as your changes will be overwritten.\n// Instead, add mappings to codiconsDerived in codicons.ts.\nconst codiconsLibrary = {\n    add: register('add', 0xea60),\n    plus: register('plus', 0xea60),\n    gistNew: register('gist-new', 0xea60),\n    repoCreate: register('repo-create', 0xea60),\n    lightbulb: register('lightbulb', 0xea61),\n    lightBulb: register('light-bulb', 0xea61),\n    repo: register('repo', 0xea62),\n    repoDelete: register('repo-delete', 0xea62),\n    gistFork: register('gist-fork', 0xea63),\n    repoForked: register('repo-forked', 0xea63),\n    gitPullRequest: register('git-pull-request', 0xea64),\n    gitPullRequestAbandoned: register('git-pull-request-abandoned', 0xea64),\n    recordKeys: register('record-keys', 0xea65),\n    keyboard: register('keyboard', 0xea65),\n    tag: register('tag', 0xea66),\n    gitPullRequestLabel: register('git-pull-request-label', 0xea66),\n    tagAdd: register('tag-add', 0xea66),\n    tagRemove: register('tag-remove', 0xea66),\n    person: register('person', 0xea67),\n    personFollow: register('person-follow', 0xea67),\n    personOutline: register('person-outline', 0xea67),\n    personFilled: register('person-filled', 0xea67),\n    sourceControl: register('source-control', 0xea68),\n    mirror: register('mirror', 0xea69),\n    mirrorPublic: register('mirror-public', 0xea69),\n    star: register('star', 0xea6a),\n    starAdd: register('star-add', 0xea6a),\n    starDelete: register('star-delete', 0xea6a),\n    starEmpty: register('star-empty', 0xea6a),\n    comment: register('comment', 0xea6b),\n    commentAdd: register('comment-add', 0xea6b),\n    alert: register('alert', 0xea6c),\n    warning: register('warning', 0xea6c),\n    search: register('search', 0xea6d),\n    searchSave: register('search-save', 0xea6d),\n    logOut: register('log-out', 0xea6e),\n    signOut: register('sign-out', 0xea6e),\n    logIn: register('log-in', 0xea6f),\n    signIn: register('sign-in', 0xea6f),\n    eye: register('eye', 0xea70),\n    eyeUnwatch: register('eye-unwatch', 0xea70),\n    eyeWatch: register('eye-watch', 0xea70),\n    circleFilled: register('circle-filled', 0xea71),\n    primitiveDot: register('primitive-dot', 0xea71),\n    closeDirty: register('close-dirty', 0xea71),\n    debugBreakpoint: register('debug-breakpoint', 0xea71),\n    debugBreakpointDisabled: register('debug-breakpoint-disabled', 0xea71),\n    debugHint: register('debug-hint', 0xea71),\n    terminalDecorationSuccess: register('terminal-decoration-success', 0xea71),\n    primitiveSquare: register('primitive-square', 0xea72),\n    edit: register('edit', 0xea73),\n    pencil: register('pencil', 0xea73),\n    info: register('info', 0xea74),\n    issueOpened: register('issue-opened', 0xea74),\n    gistPrivate: register('gist-private', 0xea75),\n    gitForkPrivate: register('git-fork-private', 0xea75),\n    lock: register('lock', 0xea75),\n    mirrorPrivate: register('mirror-private', 0xea75),\n    close: register('close', 0xea76),\n    removeClose: register('remove-close', 0xea76),\n    x: register('x', 0xea76),\n    repoSync: register('repo-sync', 0xea77),\n    sync: register('sync', 0xea77),\n    clone: register('clone', 0xea78),\n    desktopDownload: register('desktop-download', 0xea78),\n    beaker: register('beaker', 0xea79),\n    microscope: register('microscope', 0xea79),\n    vm: register('vm', 0xea7a),\n    deviceDesktop: register('device-desktop', 0xea7a),\n    file: register('file', 0xea7b),\n    more: register('more', 0xea7c),\n    ellipsis: register('ellipsis', 0xea7c),\n    kebabHorizontal: register('kebab-horizontal', 0xea7c),\n    mailReply: register('mail-reply', 0xea7d),\n    reply: register('reply', 0xea7d),\n    organization: register('organization', 0xea7e),\n    organizationFilled: register('organization-filled', 0xea7e),\n    organizationOutline: register('organization-outline', 0xea7e),\n    newFile: register('new-file', 0xea7f),\n    fileAdd: register('file-add', 0xea7f),\n    newFolder: register('new-folder', 0xea80),\n    fileDirectoryCreate: register('file-directory-create', 0xea80),\n    trash: register('trash', 0xea81),\n    trashcan: register('trashcan', 0xea81),\n    history: register('history', 0xea82),\n    clock: register('clock', 0xea82),\n    folder: register('folder', 0xea83),\n    fileDirectory: register('file-directory', 0xea83),\n    symbolFolder: register('symbol-folder', 0xea83),\n    logoGithub: register('logo-github', 0xea84),\n    markGithub: register('mark-github', 0xea84),\n    github: register('github', 0xea84),\n    terminal: register('terminal', 0xea85),\n    console: register('console', 0xea85),\n    repl: register('repl', 0xea85),\n    zap: register('zap', 0xea86),\n    symbolEvent: register('symbol-event', 0xea86),\n    error: register('error', 0xea87),\n    stop: register('stop', 0xea87),\n    variable: register('variable', 0xea88),\n    symbolVariable: register('symbol-variable', 0xea88),\n    array: register('array', 0xea8a),\n    symbolArray: register('symbol-array', 0xea8a),\n    symbolModule: register('symbol-module', 0xea8b),\n    symbolPackage: register('symbol-package', 0xea8b),\n    symbolNamespace: register('symbol-namespace', 0xea8b),\n    symbolObject: register('symbol-object', 0xea8b),\n    symbolMethod: register('symbol-method', 0xea8c),\n    symbolFunction: register('symbol-function', 0xea8c),\n    symbolConstructor: register('symbol-constructor', 0xea8c),\n    symbolBoolean: register('symbol-boolean', 0xea8f),\n    symbolNull: register('symbol-null', 0xea8f),\n    symbolNumeric: register('symbol-numeric', 0xea90),\n    symbolNumber: register('symbol-number', 0xea90),\n    symbolStructure: register('symbol-structure', 0xea91),\n    symbolStruct: register('symbol-struct', 0xea91),\n    symbolParameter: register('symbol-parameter', 0xea92),\n    symbolTypeParameter: register('symbol-type-parameter', 0xea92),\n    symbolKey: register('symbol-key', 0xea93),\n    symbolText: register('symbol-text', 0xea93),\n    symbolReference: register('symbol-reference', 0xea94),\n    goToFile: register('go-to-file', 0xea94),\n    symbolEnum: register('symbol-enum', 0xea95),\n    symbolValue: register('symbol-value', 0xea95),\n    symbolRuler: register('symbol-ruler', 0xea96),\n    symbolUnit: register('symbol-unit', 0xea96),\n    activateBreakpoints: register('activate-breakpoints', 0xea97),\n    archive: register('archive', 0xea98),\n    arrowBoth: register('arrow-both', 0xea99),\n    arrowDown: register('arrow-down', 0xea9a),\n    arrowLeft: register('arrow-left', 0xea9b),\n    arrowRight: register('arrow-right', 0xea9c),\n    arrowSmallDown: register('arrow-small-down', 0xea9d),\n    arrowSmallLeft: register('arrow-small-left', 0xea9e),\n    arrowSmallRight: register('arrow-small-right', 0xea9f),\n    arrowSmallUp: register('arrow-small-up', 0xeaa0),\n    arrowUp: register('arrow-up', 0xeaa1),\n    bell: register('bell', 0xeaa2),\n    bold: register('bold', 0xeaa3),\n    book: register('book', 0xeaa4),\n    bookmark: register('bookmark', 0xeaa5),\n    debugBreakpointConditionalUnverified: register('debug-breakpoint-conditional-unverified', 0xeaa6),\n    debugBreakpointConditional: register('debug-breakpoint-conditional', 0xeaa7),\n    debugBreakpointConditionalDisabled: register('debug-breakpoint-conditional-disabled', 0xeaa7),\n    debugBreakpointDataUnverified: register('debug-breakpoint-data-unverified', 0xeaa8),\n    debugBreakpointData: register('debug-breakpoint-data', 0xeaa9),\n    debugBreakpointDataDisabled: register('debug-breakpoint-data-disabled', 0xeaa9),\n    debugBreakpointLogUnverified: register('debug-breakpoint-log-unverified', 0xeaaa),\n    debugBreakpointLog: register('debug-breakpoint-log', 0xeaab),\n    debugBreakpointLogDisabled: register('debug-breakpoint-log-disabled', 0xeaab),\n    briefcase: register('briefcase', 0xeaac),\n    broadcast: register('broadcast', 0xeaad),\n    browser: register('browser', 0xeaae),\n    bug: register('bug', 0xeaaf),\n    calendar: register('calendar', 0xeab0),\n    caseSensitive: register('case-sensitive', 0xeab1),\n    check: register('check', 0xeab2),\n    checklist: register('checklist', 0xeab3),\n    chevronDown: register('chevron-down', 0xeab4),\n    chevronLeft: register('chevron-left', 0xeab5),\n    chevronRight: register('chevron-right', 0xeab6),\n    chevronUp: register('chevron-up', 0xeab7),\n    chromeClose: register('chrome-close', 0xeab8),\n    chromeMaximize: register('chrome-maximize', 0xeab9),\n    chromeMinimize: register('chrome-minimize', 0xeaba),\n    chromeRestore: register('chrome-restore', 0xeabb),\n    circleOutline: register('circle-outline', 0xeabc),\n    circle: register('circle', 0xeabc),\n    debugBreakpointUnverified: register('debug-breakpoint-unverified', 0xeabc),\n    terminalDecorationIncomplete: register('terminal-decoration-incomplete', 0xeabc),\n    circleSlash: register('circle-slash', 0xeabd),\n    circuitBoard: register('circuit-board', 0xeabe),\n    clearAll: register('clear-all', 0xeabf),\n    clippy: register('clippy', 0xeac0),\n    closeAll: register('close-all', 0xeac1),\n    cloudDownload: register('cloud-download', 0xeac2),\n    cloudUpload: register('cloud-upload', 0xeac3),\n    code: register('code', 0xeac4),\n    collapseAll: register('collapse-all', 0xeac5),\n    colorMode: register('color-mode', 0xeac6),\n    commentDiscussion: register('comment-discussion', 0xeac7),\n    creditCard: register('credit-card', 0xeac9),\n    dash: register('dash', 0xeacc),\n    dashboard: register('dashboard', 0xeacd),\n    database: register('database', 0xeace),\n    debugContinue: register('debug-continue', 0xeacf),\n    debugDisconnect: register('debug-disconnect', 0xead0),\n    debugPause: register('debug-pause', 0xead1),\n    debugRestart: register('debug-restart', 0xead2),\n    debugStart: register('debug-start', 0xead3),\n    debugStepInto: register('debug-step-into', 0xead4),\n    debugStepOut: register('debug-step-out', 0xead5),\n    debugStepOver: register('debug-step-over', 0xead6),\n    debugStop: register('debug-stop', 0xead7),\n    debug: register('debug', 0xead8),\n    deviceCameraVideo: register('device-camera-video', 0xead9),\n    deviceCamera: register('device-camera', 0xeada),\n    deviceMobile: register('device-mobile', 0xeadb),\n    diffAdded: register('diff-added', 0xeadc),\n    diffIgnored: register('diff-ignored', 0xeadd),\n    diffModified: register('diff-modified', 0xeade),\n    diffRemoved: register('diff-removed', 0xeadf),\n    diffRenamed: register('diff-renamed', 0xeae0),\n    diff: register('diff', 0xeae1),\n    diffSidebyside: register('diff-sidebyside', 0xeae1),\n    discard: register('discard', 0xeae2),\n    editorLayout: register('editor-layout', 0xeae3),\n    emptyWindow: register('empty-window', 0xeae4),\n    exclude: register('exclude', 0xeae5),\n    extensions: register('extensions', 0xeae6),\n    eyeClosed: register('eye-closed', 0xeae7),\n    fileBinary: register('file-binary', 0xeae8),\n    fileCode: register('file-code', 0xeae9),\n    fileMedia: register('file-media', 0xeaea),\n    filePdf: register('file-pdf', 0xeaeb),\n    fileSubmodule: register('file-submodule', 0xeaec),\n    fileSymlinkDirectory: register('file-symlink-directory', 0xeaed),\n    fileSymlinkFile: register('file-symlink-file', 0xeaee),\n    fileZip: register('file-zip', 0xeaef),\n    files: register('files', 0xeaf0),\n    filter: register('filter', 0xeaf1),\n    flame: register('flame', 0xeaf2),\n    foldDown: register('fold-down', 0xeaf3),\n    foldUp: register('fold-up', 0xeaf4),\n    fold: register('fold', 0xeaf5),\n    folderActive: register('folder-active', 0xeaf6),\n    folderOpened: register('folder-opened', 0xeaf7),\n    gear: register('gear', 0xeaf8),\n    gift: register('gift', 0xeaf9),\n    gistSecret: register('gist-secret', 0xeafa),\n    gist: register('gist', 0xeafb),\n    gitCommit: register('git-commit', 0xeafc),\n    gitCompare: register('git-compare', 0xeafd),\n    compareChanges: register('compare-changes', 0xeafd),\n    gitMerge: register('git-merge', 0xeafe),\n    githubAction: register('github-action', 0xeaff),\n    githubAlt: register('github-alt', 0xeb00),\n    globe: register('globe', 0xeb01),\n    grabber: register('grabber', 0xeb02),\n    graph: register('graph', 0xeb03),\n    gripper: register('gripper', 0xeb04),\n    heart: register('heart', 0xeb05),\n    home: register('home', 0xeb06),\n    horizontalRule: register('horizontal-rule', 0xeb07),\n    hubot: register('hubot', 0xeb08),\n    inbox: register('inbox', 0xeb09),\n    issueReopened: register('issue-reopened', 0xeb0b),\n    issues: register('issues', 0xeb0c),\n    italic: register('italic', 0xeb0d),\n    jersey: register('jersey', 0xeb0e),\n    json: register('json', 0xeb0f),\n    kebabVertical: register('kebab-vertical', 0xeb10),\n    key: register('key', 0xeb11),\n    law: register('law', 0xeb12),\n    lightbulbAutofix: register('lightbulb-autofix', 0xeb13),\n    linkExternal: register('link-external', 0xeb14),\n    link: register('link', 0xeb15),\n    listOrdered: register('list-ordered', 0xeb16),\n    listUnordered: register('list-unordered', 0xeb17),\n    liveShare: register('live-share', 0xeb18),\n    loading: register('loading', 0xeb19),\n    location: register('location', 0xeb1a),\n    mailRead: register('mail-read', 0xeb1b),\n    mail: register('mail', 0xeb1c),\n    markdown: register('markdown', 0xeb1d),\n    megaphone: register('megaphone', 0xeb1e),\n    mention: register('mention', 0xeb1f),\n    milestone: register('milestone', 0xeb20),\n    gitPullRequestMilestone: register('git-pull-request-milestone', 0xeb20),\n    mortarBoard: register('mortar-board', 0xeb21),\n    move: register('move', 0xeb22),\n    multipleWindows: register('multiple-windows', 0xeb23),\n    mute: register('mute', 0xeb24),\n    noNewline: register('no-newline', 0xeb25),\n    note: register('note', 0xeb26),\n    octoface: register('octoface', 0xeb27),\n    openPreview: register('open-preview', 0xeb28),\n    package: register('package', 0xeb29),\n    paintcan: register('paintcan', 0xeb2a),\n    pin: register('pin', 0xeb2b),\n    play: register('play', 0xeb2c),\n    run: register('run', 0xeb2c),\n    plug: register('plug', 0xeb2d),\n    preserveCase: register('preserve-case', 0xeb2e),\n    preview: register('preview', 0xeb2f),\n    project: register('project', 0xeb30),\n    pulse: register('pulse', 0xeb31),\n    question: register('question', 0xeb32),\n    quote: register('quote', 0xeb33),\n    radioTower: register('radio-tower', 0xeb34),\n    reactions: register('reactions', 0xeb35),\n    references: register('references', 0xeb36),\n    refresh: register('refresh', 0xeb37),\n    regex: register('regex', 0xeb38),\n    remoteExplorer: register('remote-explorer', 0xeb39),\n    remote: register('remote', 0xeb3a),\n    remove: register('remove', 0xeb3b),\n    replaceAll: register('replace-all', 0xeb3c),\n    replace: register('replace', 0xeb3d),\n    repoClone: register('repo-clone', 0xeb3e),\n    repoForcePush: register('repo-force-push', 0xeb3f),\n    repoPull: register('repo-pull', 0xeb40),\n    repoPush: register('repo-push', 0xeb41),\n    report: register('report', 0xeb42),\n    requestChanges: register('request-changes', 0xeb43),\n    rocket: register('rocket', 0xeb44),\n    rootFolderOpened: register('root-folder-opened', 0xeb45),\n    rootFolder: register('root-folder', 0xeb46),\n    rss: register('rss', 0xeb47),\n    ruby: register('ruby', 0xeb48),\n    saveAll: register('save-all', 0xeb49),\n    saveAs: register('save-as', 0xeb4a),\n    save: register('save', 0xeb4b),\n    screenFull: register('screen-full', 0xeb4c),\n    screenNormal: register('screen-normal', 0xeb4d),\n    searchStop: register('search-stop', 0xeb4e),\n    server: register('server', 0xeb50),\n    settingsGear: register('settings-gear', 0xeb51),\n    settings: register('settings', 0xeb52),\n    shield: register('shield', 0xeb53),\n    smiley: register('smiley', 0xeb54),\n    sortPrecedence: register('sort-precedence', 0xeb55),\n    splitHorizontal: register('split-horizontal', 0xeb56),\n    splitVertical: register('split-vertical', 0xeb57),\n    squirrel: register('squirrel', 0xeb58),\n    starFull: register('star-full', 0xeb59),\n    starHalf: register('star-half', 0xeb5a),\n    symbolClass: register('symbol-class', 0xeb5b),\n    symbolColor: register('symbol-color', 0xeb5c),\n    symbolConstant: register('symbol-constant', 0xeb5d),\n    symbolEnumMember: register('symbol-enum-member', 0xeb5e),\n    symbolField: register('symbol-field', 0xeb5f),\n    symbolFile: register('symbol-file', 0xeb60),\n    symbolInterface: register('symbol-interface', 0xeb61),\n    symbolKeyword: register('symbol-keyword', 0xeb62),\n    symbolMisc: register('symbol-misc', 0xeb63),\n    symbolOperator: register('symbol-operator', 0xeb64),\n    symbolProperty: register('symbol-property', 0xeb65),\n    wrench: register('wrench', 0xeb65),\n    wrenchSubaction: register('wrench-subaction', 0xeb65),\n    symbolSnippet: register('symbol-snippet', 0xeb66),\n    tasklist: register('tasklist', 0xeb67),\n    telescope: register('telescope', 0xeb68),\n    textSize: register('text-size', 0xeb69),\n    threeBars: register('three-bars', 0xeb6a),\n    thumbsdown: register('thumbsdown', 0xeb6b),\n    thumbsup: register('thumbsup', 0xeb6c),\n    tools: register('tools', 0xeb6d),\n    triangleDown: register('triangle-down', 0xeb6e),\n    triangleLeft: register('triangle-left', 0xeb6f),\n    triangleRight: register('triangle-right', 0xeb70),\n    triangleUp: register('triangle-up', 0xeb71),\n    twitter: register('twitter', 0xeb72),\n    unfold: register('unfold', 0xeb73),\n    unlock: register('unlock', 0xeb74),\n    unmute: register('unmute', 0xeb75),\n    unverified: register('unverified', 0xeb76),\n    verified: register('verified', 0xeb77),\n    versions: register('versions', 0xeb78),\n    vmActive: register('vm-active', 0xeb79),\n    vmOutline: register('vm-outline', 0xeb7a),\n    vmRunning: register('vm-running', 0xeb7b),\n    watch: register('watch', 0xeb7c),\n    whitespace: register('whitespace', 0xeb7d),\n    wholeWord: register('whole-word', 0xeb7e),\n    window: register('window', 0xeb7f),\n    wordWrap: register('word-wrap', 0xeb80),\n    zoomIn: register('zoom-in', 0xeb81),\n    zoomOut: register('zoom-out', 0xeb82),\n    listFilter: register('list-filter', 0xeb83),\n    listFlat: register('list-flat', 0xeb84),\n    listSelection: register('list-selection', 0xeb85),\n    selection: register('selection', 0xeb85),\n    listTree: register('list-tree', 0xeb86),\n    debugBreakpointFunctionUnverified: register('debug-breakpoint-function-unverified', 0xeb87),\n    debugBreakpointFunction: register('debug-breakpoint-function', 0xeb88),\n    debugBreakpointFunctionDisabled: register('debug-breakpoint-function-disabled', 0xeb88),\n    debugStackframeActive: register('debug-stackframe-active', 0xeb89),\n    circleSmallFilled: register('circle-small-filled', 0xeb8a),\n    debugStackframeDot: register('debug-stackframe-dot', 0xeb8a),\n    terminalDecorationMark: register('terminal-decoration-mark', 0xeb8a),\n    debugStackframe: register('debug-stackframe', 0xeb8b),\n    debugStackframeFocused: register('debug-stackframe-focused', 0xeb8b),\n    debugBreakpointUnsupported: register('debug-breakpoint-unsupported', 0xeb8c),\n    symbolString: register('symbol-string', 0xeb8d),\n    debugReverseContinue: register('debug-reverse-continue', 0xeb8e),\n    debugStepBack: register('debug-step-back', 0xeb8f),\n    debugRestartFrame: register('debug-restart-frame', 0xeb90),\n    debugAlt: register('debug-alt', 0xeb91),\n    callIncoming: register('call-incoming', 0xeb92),\n    callOutgoing: register('call-outgoing', 0xeb93),\n    menu: register('menu', 0xeb94),\n    expandAll: register('expand-all', 0xeb95),\n    feedback: register('feedback', 0xeb96),\n    gitPullRequestReviewer: register('git-pull-request-reviewer', 0xeb96),\n    groupByRefType: register('group-by-ref-type', 0xeb97),\n    ungroupByRefType: register('ungroup-by-ref-type', 0xeb98),\n    account: register('account', 0xeb99),\n    gitPullRequestAssignee: register('git-pull-request-assignee', 0xeb99),\n    bellDot: register('bell-dot', 0xeb9a),\n    debugConsole: register('debug-console', 0xeb9b),\n    library: register('library', 0xeb9c),\n    output: register('output', 0xeb9d),\n    runAll: register('run-all', 0xeb9e),\n    syncIgnored: register('sync-ignored', 0xeb9f),\n    pinned: register('pinned', 0xeba0),\n    githubInverted: register('github-inverted', 0xeba1),\n    serverProcess: register('server-process', 0xeba2),\n    serverEnvironment: register('server-environment', 0xeba3),\n    pass: register('pass', 0xeba4),\n    issueClosed: register('issue-closed', 0xeba4),\n    stopCircle: register('stop-circle', 0xeba5),\n    playCircle: register('play-circle', 0xeba6),\n    record: register('record', 0xeba7),\n    debugAltSmall: register('debug-alt-small', 0xeba8),\n    vmConnect: register('vm-connect', 0xeba9),\n    cloud: register('cloud', 0xebaa),\n    merge: register('merge', 0xebab),\n    export: register('export', 0xebac),\n    graphLeft: register('graph-left', 0xebad),\n    magnet: register('magnet', 0xebae),\n    notebook: register('notebook', 0xebaf),\n    redo: register('redo', 0xebb0),\n    checkAll: register('check-all', 0xebb1),\n    pinnedDirty: register('pinned-dirty', 0xebb2),\n    passFilled: register('pass-filled', 0xebb3),\n    circleLargeFilled: register('circle-large-filled', 0xebb4),\n    circleLarge: register('circle-large', 0xebb5),\n    circleLargeOutline: register('circle-large-outline', 0xebb5),\n    combine: register('combine', 0xebb6),\n    gather: register('gather', 0xebb6),\n    table: register('table', 0xebb7),\n    variableGroup: register('variable-group', 0xebb8),\n    typeHierarchy: register('type-hierarchy', 0xebb9),\n    typeHierarchySub: register('type-hierarchy-sub', 0xebba),\n    typeHierarchySuper: register('type-hierarchy-super', 0xebbb),\n    gitPullRequestCreate: register('git-pull-request-create', 0xebbc),\n    runAbove: register('run-above', 0xebbd),\n    runBelow: register('run-below', 0xebbe),\n    notebookTemplate: register('notebook-template', 0xebbf),\n    debugRerun: register('debug-rerun', 0xebc0),\n    workspaceTrusted: register('workspace-trusted', 0xebc1),\n    workspaceUntrusted: register('workspace-untrusted', 0xebc2),\n    workspaceUnknown: register('workspace-unknown', 0xebc3),\n    terminalCmd: register('terminal-cmd', 0xebc4),\n    terminalDebian: register('terminal-debian', 0xebc5),\n    terminalLinux: register('terminal-linux', 0xebc6),\n    terminalPowershell: register('terminal-powershell', 0xebc7),\n    terminalTmux: register('terminal-tmux', 0xebc8),\n    terminalUbuntu: register('terminal-ubuntu', 0xebc9),\n    terminalBash: register('terminal-bash', 0xebca),\n    arrowSwap: register('arrow-swap', 0xebcb),\n    copy: register('copy', 0xebcc),\n    personAdd: register('person-add', 0xebcd),\n    filterFilled: register('filter-filled', 0xebce),\n    wand: register('wand', 0xebcf),\n    debugLineByLine: register('debug-line-by-line', 0xebd0),\n    inspect: register('inspect', 0xebd1),\n    layers: register('layers', 0xebd2),\n    layersDot: register('layers-dot', 0xebd3),\n    layersActive: register('layers-active', 0xebd4),\n    compass: register('compass', 0xebd5),\n    compassDot: register('compass-dot', 0xebd6),\n    compassActive: register('compass-active', 0xebd7),\n    azure: register('azure', 0xebd8),\n    issueDraft: register('issue-draft', 0xebd9),\n    gitPullRequestClosed: register('git-pull-request-closed', 0xebda),\n    gitPullRequestDraft: register('git-pull-request-draft', 0xebdb),\n    debugAll: register('debug-all', 0xebdc),\n    debugCoverage: register('debug-coverage', 0xebdd),\n    runErrors: register('run-errors', 0xebde),\n    folderLibrary: register('folder-library', 0xebdf),\n    debugContinueSmall: register('debug-continue-small', 0xebe0),\n    beakerStop: register('beaker-stop', 0xebe1),\n    graphLine: register('graph-line', 0xebe2),\n    graphScatter: register('graph-scatter', 0xebe3),\n    pieChart: register('pie-chart', 0xebe4),\n    bracket: register('bracket', 0xeb0f),\n    bracketDot: register('bracket-dot', 0xebe5),\n    bracketError: register('bracket-error', 0xebe6),\n    lockSmall: register('lock-small', 0xebe7),\n    azureDevops: register('azure-devops', 0xebe8),\n    verifiedFilled: register('verified-filled', 0xebe9),\n    newline: register('newline', 0xebea),\n    layout: register('layout', 0xebeb),\n    layoutActivitybarLeft: register('layout-activitybar-left', 0xebec),\n    layoutActivitybarRight: register('layout-activitybar-right', 0xebed),\n    layoutPanelLeft: register('layout-panel-left', 0xebee),\n    layoutPanelCenter: register('layout-panel-center', 0xebef),\n    layoutPanelJustify: register('layout-panel-justify', 0xebf0),\n    layoutPanelRight: register('layout-panel-right', 0xebf1),\n    layoutPanel: register('layout-panel', 0xebf2),\n    layoutSidebarLeft: register('layout-sidebar-left', 0xebf3),\n    layoutSidebarRight: register('layout-sidebar-right', 0xebf4),\n    layoutStatusbar: register('layout-statusbar', 0xebf5),\n    layoutMenubar: register('layout-menubar', 0xebf6),\n    layoutCentered: register('layout-centered', 0xebf7),\n    target: register('target', 0xebf8),\n    indent: register('indent', 0xebf9),\n    recordSmall: register('record-small', 0xebfa),\n    errorSmall: register('error-small', 0xebfb),\n    terminalDecorationError: register('terminal-decoration-error', 0xebfb),\n    arrowCircleDown: register('arrow-circle-down', 0xebfc),\n    arrowCircleLeft: register('arrow-circle-left', 0xebfd),\n    arrowCircleRight: register('arrow-circle-right', 0xebfe),\n    arrowCircleUp: register('arrow-circle-up', 0xebff),\n    layoutSidebarRightOff: register('layout-sidebar-right-off', 0xec00),\n    layoutPanelOff: register('layout-panel-off', 0xec01),\n    layoutSidebarLeftOff: register('layout-sidebar-left-off', 0xec02),\n    blank: register('blank', 0xec03),\n    heartFilled: register('heart-filled', 0xec04),\n    map: register('map', 0xec05),\n    mapHorizontal: register('map-horizontal', 0xec05),\n    foldHorizontal: register('fold-horizontal', 0xec05),\n    mapFilled: register('map-filled', 0xec06),\n    mapHorizontalFilled: register('map-horizontal-filled', 0xec06),\n    foldHorizontalFilled: register('fold-horizontal-filled', 0xec06),\n    circleSmall: register('circle-small', 0xec07),\n    bellSlash: register('bell-slash', 0xec08),\n    bellSlashDot: register('bell-slash-dot', 0xec09),\n    commentUnresolved: register('comment-unresolved', 0xec0a),\n    gitPullRequestGoToChanges: register('git-pull-request-go-to-changes', 0xec0b),\n    gitPullRequestNewChanges: register('git-pull-request-new-changes', 0xec0c),\n    searchFuzzy: register('search-fuzzy', 0xec0d),\n    commentDraft: register('comment-draft', 0xec0e),\n    send: register('send', 0xec0f),\n    sparkle: register('sparkle', 0xec10),\n    insert: register('insert', 0xec11),\n    mic: register('mic', 0xec12),\n    thumbsdownFilled: register('thumbsdown-filled', 0xec13),\n    thumbsupFilled: register('thumbsup-filled', 0xec14),\n    coffee: register('coffee', 0xec15),\n    snake: register('snake', 0xec16),\n    game: register('game', 0xec17),\n    vr: register('vr', 0xec18),\n    chip: register('chip', 0xec19),\n    piano: register('piano', 0xec1a),\n    music: register('music', 0xec1b),\n    micFilled: register('mic-filled', 0xec1c),\n    repoFetch: register('repo-fetch', 0xec1d),\n    copilot: register('copilot', 0xec1e),\n    lightbulbSparkle: register('lightbulb-sparkle', 0xec1f),\n    robot: register('robot', 0xec20),\n    sparkleFilled: register('sparkle-filled', 0xec21),\n    diffSingle: register('diff-single', 0xec22),\n    diffMultiple: register('diff-multiple', 0xec23),\n    surroundWith: register('surround-with', 0xec24),\n    share: register('share', 0xec25),\n    gitStash: register('git-stash', 0xec26),\n    gitStashApply: register('git-stash-apply', 0xec27),\n    gitStashPop: register('git-stash-pop', 0xec28),\n    vscode: register('vscode', 0xec29),\n    vscodeInsiders: register('vscode-insiders', 0xec2a),\n    codeOss: register('code-oss', 0xec2b),\n    runCoverage: register('run-coverage', 0xec2c),\n    runAllCoverage: register('run-all-coverage', 0xec2d),\n    coverage: register('coverage', 0xec2e),\n    githubProject: register('github-project', 0xec2f),\n    mapVertical: register('map-vertical', 0xec30),\n    foldVertical: register('fold-vertical', 0xec30),\n    mapVerticalFilled: register('map-vertical-filled', 0xec31),\n    foldVerticalFilled: register('fold-vertical-filled', 0xec31),\n    goToSearch: register('go-to-search', 0xec32),\n    percentage: register('percentage', 0xec33),\n    sortPercentage: register('sort-percentage', 0xec33),\n    attach: register('attach', 0xec34),\n    goToEditingSession: register('go-to-editing-session', 0xec35),\n    editSession: register('edit-session', 0xec36),\n    codeReview: register('code-review', 0xec37),\n    copilotWarning: register('copilot-warning', 0xec38),\n    python: register('python', 0xec39),\n    copilotLarge: register('copilot-large', 0xec3a),\n    copilotWarningLarge: register('copilot-warning-large', 0xec3b),\n    keyboardTab: register('keyboard-tab', 0xec3c),\n    copilotBlocked: register('copilot-blocked', 0xec3d),\n    copilotNotConnected: register('copilot-not-connected', 0xec3e),\n    flag: register('flag', 0xec3f),\n    lightbulbEmpty: register('lightbulb-empty', 0xec40),\n    symbolMethodArrow: register('symbol-method-arrow', 0xec41),\n    copilotUnavailable: register('copilot-unavailable', 0xec42),\n    repoPinned: register('repo-pinned', 0xec43),\n    keyboardTabAbove: register('keyboard-tab-above', 0xec44),\n    keyboardTabBelow: register('keyboard-tab-below', 0xec45),\n    gitPullRequestDone: register('git-pull-request-done', 0xec46),\n    mcp: register('mcp', 0xec47),\n    extensionsLarge: register('extensions-large', 0xec48),\n    layoutPanelDock: register('layout-panel-dock', 0xec49),\n    layoutSidebarLeftDock: register('layout-sidebar-left-dock', 0xec4a),\n    layoutSidebarRightDock: register('layout-sidebar-right-dock', 0xec4b),\n    copilotInProgress: register('copilot-in-progress', 0xec4c),\n    copilotError: register('copilot-error', 0xec4d),\n    copilotSuccess: register('copilot-success', 0xec4e),\n    chatSparkle: register('chat-sparkle', 0xec4f),\n    searchSparkle: register('search-sparkle', 0xec50),\n    editSparkle: register('edit-sparkle', 0xec51),\n    copilotSnooze: register('copilot-snooze', 0xec52),\n    sendToRemoteAgent: register('send-to-remote-agent', 0xec53),\n    commentDiscussionSparkle: register('comment-discussion-sparkle', 0xec54),\n    chatSparkleWarning: register('chat-sparkle-warning', 0xec55),\n    chatSparkleError: register('chat-sparkle-error', 0xec56),\n    collection: register('collection', 0xec57),\n    newCollection: register('new-collection', 0xec58),\n    thinking: register('thinking', 0xec59),\n    build: register('build', 0xec5a),\n    commentDiscussionQuote: register('comment-discussion-quote', 0xec5b),\n    cursor: register('cursor', 0xec5c),\n    eraser: register('eraser', 0xec5d),\n    fileText: register('file-text', 0xec5e),\n    gitLens: register('git-lens', 0xec5f),\n    quotes: register('quotes', 0xec60),\n    rename: register('rename', 0xec61),\n    runWithDeps: register('run-with-deps', 0xec62),\n    debugConnected: register('debug-connected', 0xec63),\n    strikethrough: register('strikethrough', 0xec64),\n    openInProduct: register('open-in-product', 0xec65),\n    indexZero: register('index-zero', 0xec66),\n    agent: register('agent', 0xec67),\n    editCode: register('edit-code', 0xec68),\n    repoSelected: register('repo-selected', 0xec69),\n    skip: register('skip', 0xec6a),\n    mergeInto: register('merge-into', 0xec6b),\n    gitBranchChanges: register('git-branch-changes', 0xec6c),\n    gitBranchStagedChanges: register('git-branch-staged-changes', 0xec6d),\n    gitBranchConflicts: register('git-branch-conflicts', 0xec6e),\n    gitBranch: register('git-branch', 0xec6f),\n    gitBranchCreate: register('git-branch-create', 0xec6f),\n    gitBranchDelete: register('git-branch-delete', 0xec6f),\n    searchLarge: register('search-large', 0xec70),\n    terminalGitBash: register('terminal-git-bash', 0xec71),\n};\n\nexport { codiconsLibrary };\n","import { register } from './codiconsUtil.js';\nimport { codiconsLibrary } from './codiconsLibrary.js';\n\n/**\n * Derived icons, that could become separate icons.\n * These mappings should be moved into the mapping file in the vscode-codicons repo at some point.\n */\nconst codiconsDerived = {\n    dialogError: register('dialog-error', 'error'),\n    dialogWarning: register('dialog-warning', 'warning'),\n    dialogInfo: register('dialog-info', 'info'),\n    dialogClose: register('dialog-close', 'close'),\n    treeItemExpanded: register('tree-item-expanded', 'chevron-down'), // collapsed is done with rotation\n    treeFilterOnTypeOn: register('tree-filter-on-type-on', 'list-filter'),\n    treeFilterOnTypeOff: register('tree-filter-on-type-off', 'list-selection'),\n    treeFilterClear: register('tree-filter-clear', 'close'),\n    treeItemLoading: register('tree-item-loading', 'loading'),\n    menuSelection: register('menu-selection', 'check'),\n    menuSubmenu: register('menu-submenu', 'chevron-right'),\n    menuBarMore: register('menubar-more', 'more'),\n    scrollbarButtonLeft: register('scrollbar-button-left', 'triangle-left'),\n    scrollbarButtonRight: register('scrollbar-button-right', 'triangle-right'),\n    scrollbarButtonUp: register('scrollbar-button-up', 'triangle-up'),\n    scrollbarButtonDown: register('scrollbar-button-down', 'triangle-down'),\n    toolBarMore: register('toolbar-more', 'more'),\n    quickInputBack: register('quick-input-back', 'arrow-left'),\n    dropDownButton: register('drop-down-button', 0xeab4),\n    symbolCustomColor: register('symbol-customcolor', 0xeb5c),\n    exportIcon: register('export', 0xebac),\n    workspaceUnspecified: register('workspace-unspecified', 0xebc3),\n    newLine: register('newline', 0xebea),\n    thumbsDownFilled: register('thumbsdown-filled', 0xec13),\n    thumbsUpFilled: register('thumbsup-filled', 0xec14),\n    gitFetch: register('git-fetch', 0xec1d),\n    lightbulbSparkleAutofix: register('lightbulb-sparkle-autofix', 0xec1f),\n    debugBreakpointPending: register('debug-breakpoint-pending', 0xebd9),\n};\n/**\n * The Codicon library is a set of default icons that are built-in in VS Code.\n *\n * In the product (outside of base) Codicons should only be used as defaults. In order to have all icons in VS Code\n * themeable, component should define new, UI component specific icons using `iconRegistry.registerIcon`.\n * In that call a Codicon can be named as default.\n */\nconst Codicon = {\n    ...codiconsLibrary,\n    ...codiconsDerived\n};\n\nexport { Codicon, codiconsDerived };\n","import { Codicon } from './codicons.js';\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 *--------------------------------------------------------------------------------------------*/\nvar ThemeColor;\n(function (ThemeColor) {\n    function isThemeColor(obj) {\n        return !!obj && typeof obj === 'object' && typeof obj.id === 'string';\n    }\n    ThemeColor.isThemeColor = isThemeColor;\n})(ThemeColor || (ThemeColor = {}));\nvar ThemeIcon;\n(function (ThemeIcon) {\n    ThemeIcon.iconNameSegment = '[A-Za-z0-9]+';\n    ThemeIcon.iconNameExpression = '[A-Za-z0-9-]+';\n    ThemeIcon.iconModifierExpression = '~[A-Za-z]+';\n    ThemeIcon.iconNameCharacter = '[A-Za-z0-9~-]';\n    const ThemeIconIdRegex = new RegExp(`^(${ThemeIcon.iconNameExpression})(${ThemeIcon.iconModifierExpression})?$`);\n    function asClassNameArray(icon) {\n        const match = ThemeIconIdRegex.exec(icon.id);\n        if (!match) {\n            return asClassNameArray(Codicon.error);\n        }\n        const [, id, modifier] = match;\n        const classNames = ['codicon', 'codicon-' + id];\n        if (modifier) {\n            classNames.push('codicon-modifier-' + modifier.substring(1));\n        }\n        return classNames;\n    }\n    ThemeIcon.asClassNameArray = asClassNameArray;\n    function asClassName(icon) {\n        return asClassNameArray(icon).join(' ');\n    }\n    ThemeIcon.asClassName = asClassName;\n    function asCSSSelector(icon) {\n        return '.' + asClassNameArray(icon).join('.');\n    }\n    ThemeIcon.asCSSSelector = asCSSSelector;\n    function isThemeIcon(obj) {\n        return !!obj && typeof obj === 'object' && typeof obj.id === 'string' && (typeof obj.color === 'undefined' || ThemeColor.isThemeColor(obj.color));\n    }\n    ThemeIcon.isThemeIcon = isThemeIcon;\n    const _regexFromString = new RegExp(`^\\\\$\\\\((${ThemeIcon.iconNameExpression}(?:${ThemeIcon.iconModifierExpression})?)\\\\)$`);\n    function fromString(str) {\n        const match = _regexFromString.exec(str);\n        if (!match) {\n            return undefined;\n        }\n        const [, name] = match;\n        return { id: name };\n    }\n    ThemeIcon.fromString = fromString;\n    function fromId(id) {\n        return { id };\n    }\n    ThemeIcon.fromId = fromId;\n    function modify(icon, modifier) {\n        let id = icon.id;\n        const tildeIndex = id.lastIndexOf('~');\n        if (tildeIndex !== -1) {\n            id = id.substring(0, tildeIndex);\n        }\n        if (modifier) {\n            id = `${id}~${modifier}`;\n        }\n        return { id };\n    }\n    ThemeIcon.modify = modify;\n    function getModifier(icon) {\n        const tildeIndex = icon.id.lastIndexOf('~');\n        if (tildeIndex !== -1) {\n            return icon.id.substring(tildeIndex + 1);\n        }\n        return undefined;\n    }\n    ThemeIcon.getModifier = getModifier;\n    function isEqual(ti1, ti2) {\n        return ti1.id === ti2.id && ti1.color?.id === ti2.color?.id;\n    }\n    ThemeIcon.isEqual = isEqual;\n    /**\n     * Returns whether specified icon is defined and has 'file' ID.\n     */\n    function isFile(icon) {\n        return icon?.id === Codicon.file.id;\n    }\n    ThemeIcon.isFile = isFile;\n    /**\n     * Returns whether specified icon is defined and has 'folder' ID.\n     */\n    function isFolder(icon) {\n        return icon?.id === Codicon.folder.id;\n    }\n    ThemeIcon.isFolder = isFolder;\n})(ThemeIcon || (ThemeIcon = {}));\n\nexport { ThemeColor, ThemeIcon };\n","import { Emitter } from '../../../base/common/event.js';\nimport { Iterable } from '../../../base/common/iterator.js';\nimport { markAsSingleton, toDisposable } from '../../../base/common/lifecycle.js';\nimport { LinkedList } from '../../../base/common/linkedList.js';\nimport { validateConstraints } from '../../../base/common/types.js';\nimport { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst ICommandService = createDecorator('commandService');\nconst CommandsRegistry = new class {\n    constructor() {\n        this._commands = new Map();\n        this._onDidRegisterCommand = new Emitter();\n        this.onDidRegisterCommand = this._onDidRegisterCommand.event;\n    }\n    registerCommand(idOrCommand, handler) {\n        if (!idOrCommand) {\n            throw new Error(`invalid command`);\n        }\n        if (typeof idOrCommand === 'string') {\n            if (!handler) {\n                throw new Error(`invalid command`);\n            }\n            return this.registerCommand({ id: idOrCommand, handler });\n        }\n        // add argument validation if rich command metadata is provided\n        if (idOrCommand.metadata && Array.isArray(idOrCommand.metadata.args)) {\n            const constraints = [];\n            for (const arg of idOrCommand.metadata.args) {\n                constraints.push(arg.constraint);\n            }\n            const actualHandler = idOrCommand.handler;\n            idOrCommand.handler = function (accessor, ...args) {\n                validateConstraints(args, constraints);\n                return actualHandler(accessor, ...args);\n            };\n        }\n        // find a place to store the command\n        const { id } = idOrCommand;\n        let commands = this._commands.get(id);\n        if (!commands) {\n            commands = new LinkedList();\n            this._commands.set(id, commands);\n        }\n        const removeFn = commands.unshift(idOrCommand);\n        const ret = toDisposable(() => {\n            removeFn();\n            const command = this._commands.get(id);\n            if (command?.isEmpty()) {\n                this._commands.delete(id);\n            }\n        });\n        // tell the world about this command\n        this._onDidRegisterCommand.fire(id);\n        return markAsSingleton(ret);\n    }\n    registerCommandAlias(oldId, newId) {\n        return CommandsRegistry.registerCommand(oldId, (accessor, ...args) => accessor.get(ICommandService).executeCommand(newId, ...args));\n    }\n    getCommand(id) {\n        const list = this._commands.get(id);\n        if (!list || list.isEmpty()) {\n            return undefined;\n        }\n        return Iterable.first(list);\n    }\n    getCommands() {\n        const result = new Map();\n        for (const key of this._commands.keys()) {\n            const command = this.getCommand(key);\n            if (command) {\n                result.set(key, command);\n            }\n        }\n        return result;\n    }\n};\nCommandsRegistry.registerCommand('noop', () => { });\n\nexport { CommandsRegistry, ICommandService };\n","import { illegalState } from '../../../base/common/errors.js';\nimport { localize } from '../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction hintDidYouMean(...meant) {\n    switch (meant.length) {\n        case 1:\n            return localize(1693, \"Did you mean {0}?\", meant[0]);\n        case 2:\n            return localize(1694, \"Did you mean {0} or {1}?\", meant[0], meant[1]);\n        case 3:\n            return localize(1695, \"Did you mean {0}, {1} or {2}?\", meant[0], meant[1], meant[2]);\n        default: // we just don't expect that many\n            return undefined;\n    }\n}\nconst hintDidYouForgetToOpenOrCloseQuote = localize(1696, \"Did you forget to open or close the quote?\");\nconst hintDidYouForgetToEscapeSlash = localize(1697, \"Did you forget to escape the '/' (slash) character? Put two backslashes before it to escape, e.g., '\\\\\\\\/\\'.\");\n/**\n * A simple scanner for context keys.\n *\n * Example:\n *\n * ```ts\n * const scanner = new Scanner().reset('resourceFileName =~ /docker/ && !config.docker.enabled');\n * const tokens = [...scanner];\n * if (scanner.errorTokens.length > 0) {\n *     scanner.errorTokens.forEach(err => console.error(`Unexpected token at ${err.offset}: ${err.lexeme}\\nHint: ${err.additional}`));\n * } else {\n *     // process tokens\n * }\n * ```\n */\nclass Scanner {\n    constructor() {\n        this._input = '';\n        this._start = 0;\n        this._current = 0;\n        this._tokens = [];\n        this._errors = [];\n        // u - unicode, y - sticky // TODO@ulugbekna: we accept double quotes as part of the string rather than as a delimiter (to preserve old parser's behavior)\n        this.stringRe = /[a-zA-Z0-9_<>\\-\\./\\\\:\\*\\?\\+\\[\\]\\^,#@;\"%\\$\\p{L}-]+/uy;\n    }\n    static getLexeme(token) {\n        switch (token.type) {\n            case 0 /* TokenType.LParen */:\n                return '(';\n            case 1 /* TokenType.RParen */:\n                return ')';\n            case 2 /* TokenType.Neg */:\n                return '!';\n            case 3 /* TokenType.Eq */:\n                return token.isTripleEq ? '===' : '==';\n            case 4 /* TokenType.NotEq */:\n                return token.isTripleEq ? '!==' : '!=';\n            case 5 /* TokenType.Lt */:\n                return '<';\n            case 6 /* TokenType.LtEq */:\n                return '<=';\n            case 7 /* TokenType.Gt */:\n                return '>=';\n            case 8 /* TokenType.GtEq */:\n                return '>=';\n            case 9 /* TokenType.RegexOp */:\n                return '=~';\n            case 10 /* TokenType.RegexStr */:\n                return token.lexeme;\n            case 11 /* TokenType.True */:\n                return 'true';\n            case 12 /* TokenType.False */:\n                return 'false';\n            case 13 /* TokenType.In */:\n                return 'in';\n            case 14 /* TokenType.Not */:\n                return 'not';\n            case 15 /* TokenType.And */:\n                return '&&';\n            case 16 /* TokenType.Or */:\n                return '||';\n            case 17 /* TokenType.Str */:\n                return token.lexeme;\n            case 18 /* TokenType.QuotedStr */:\n                return token.lexeme;\n            case 19 /* TokenType.Error */:\n                return token.lexeme;\n            case 20 /* TokenType.EOF */:\n                return 'EOF';\n            default:\n                throw illegalState(`unhandled token type: ${JSON.stringify(token)}; have you forgotten to add a case?`);\n        }\n    }\n    static { this._regexFlags = new Set(['i', 'g', 's', 'm', 'y', 'u'].map(ch => ch.charCodeAt(0))); }\n    static { this._keywords = new Map([\n        ['not', 14 /* TokenType.Not */],\n        ['in', 13 /* TokenType.In */],\n        ['false', 12 /* TokenType.False */],\n        ['true', 11 /* TokenType.True */],\n    ]); }\n    reset(value) {\n        this._input = value;\n        this._start = 0;\n        this._current = 0;\n        this._tokens = [];\n        this._errors = [];\n        return this;\n    }\n    scan() {\n        while (!this._isAtEnd()) {\n            this._start = this._current;\n            const ch = this._advance();\n            switch (ch) {\n                case 40 /* CharCode.OpenParen */:\n                    this._addToken(0 /* TokenType.LParen */);\n                    break;\n                case 41 /* CharCode.CloseParen */:\n                    this._addToken(1 /* TokenType.RParen */);\n                    break;\n                case 33 /* CharCode.ExclamationMark */:\n                    if (this._match(61 /* CharCode.Equals */)) {\n                        const isTripleEq = this._match(61 /* CharCode.Equals */); // eat last `=` if `!==`\n                        this._tokens.push({ type: 4 /* TokenType.NotEq */, offset: this._start, isTripleEq });\n                    }\n                    else {\n                        this._addToken(2 /* TokenType.Neg */);\n                    }\n                    break;\n                case 39 /* CharCode.SingleQuote */:\n                    this._quotedString();\n                    break;\n                case 47 /* CharCode.Slash */:\n                    this._regex();\n                    break;\n                case 61 /* CharCode.Equals */:\n                    if (this._match(61 /* CharCode.Equals */)) { // support `==`\n                        const isTripleEq = this._match(61 /* CharCode.Equals */); // eat last `=` if `===`\n                        this._tokens.push({ type: 3 /* TokenType.Eq */, offset: this._start, isTripleEq });\n                    }\n                    else if (this._match(126 /* CharCode.Tilde */)) {\n                        this._addToken(9 /* TokenType.RegexOp */);\n                    }\n                    else {\n                        this._error(hintDidYouMean('==', '=~'));\n                    }\n                    break;\n                case 60 /* CharCode.LessThan */:\n                    this._addToken(this._match(61 /* CharCode.Equals */) ? 6 /* TokenType.LtEq */ : 5 /* TokenType.Lt */);\n                    break;\n                case 62 /* CharCode.GreaterThan */:\n                    this._addToken(this._match(61 /* CharCode.Equals */) ? 8 /* TokenType.GtEq */ : 7 /* TokenType.Gt */);\n                    break;\n                case 38 /* CharCode.Ampersand */:\n                    if (this._match(38 /* CharCode.Ampersand */)) {\n                        this._addToken(15 /* TokenType.And */);\n                    }\n                    else {\n                        this._error(hintDidYouMean('&&'));\n                    }\n                    break;\n                case 124 /* CharCode.Pipe */:\n                    if (this._match(124 /* CharCode.Pipe */)) {\n                        this._addToken(16 /* TokenType.Or */);\n                    }\n                    else {\n                        this._error(hintDidYouMean('||'));\n                    }\n                    break;\n                // TODO@ulugbekna: 1) rewrite using a regex 2) reconsider what characters are considered whitespace, including unicode, nbsp, etc.\n                case 32 /* CharCode.Space */:\n                case 13 /* CharCode.CarriageReturn */:\n                case 9 /* CharCode.Tab */:\n                case 10 /* CharCode.LineFeed */:\n                case 160 /* CharCode.NoBreakSpace */: // &nbsp\n                    break;\n                default:\n                    this._string();\n            }\n        }\n        this._start = this._current;\n        this._addToken(20 /* TokenType.EOF */);\n        return Array.from(this._tokens);\n    }\n    _match(expected) {\n        if (this._isAtEnd()) {\n            return false;\n        }\n        if (this._input.charCodeAt(this._current) !== expected) {\n            return false;\n        }\n        this._current++;\n        return true;\n    }\n    _advance() {\n        return this._input.charCodeAt(this._current++);\n    }\n    _peek() {\n        return this._isAtEnd() ? 0 /* CharCode.Null */ : this._input.charCodeAt(this._current);\n    }\n    _addToken(type) {\n        this._tokens.push({ type, offset: this._start });\n    }\n    _error(additional) {\n        const offset = this._start;\n        const lexeme = this._input.substring(this._start, this._current);\n        const errToken = { type: 19 /* TokenType.Error */, offset: this._start, lexeme };\n        this._errors.push({ offset, lexeme, additionalInfo: additional });\n        this._tokens.push(errToken);\n    }\n    _string() {\n        this.stringRe.lastIndex = this._start;\n        const match = this.stringRe.exec(this._input);\n        if (match) {\n            this._current = this._start + match[0].length;\n            const lexeme = this._input.substring(this._start, this._current);\n            const keyword = Scanner._keywords.get(lexeme);\n            if (keyword) {\n                this._addToken(keyword);\n            }\n            else {\n                this._tokens.push({ type: 17 /* TokenType.Str */, lexeme, offset: this._start });\n            }\n        }\n    }\n    // captures the lexeme without the leading and trailing '\n    _quotedString() {\n        while (this._peek() !== 39 /* CharCode.SingleQuote */ && !this._isAtEnd()) { // TODO@ulugbekna: add support for escaping ' ?\n            this._advance();\n        }\n        if (this._isAtEnd()) {\n            this._error(hintDidYouForgetToOpenOrCloseQuote);\n            return;\n        }\n        // consume the closing '\n        this._advance();\n        this._tokens.push({ type: 18 /* TokenType.QuotedStr */, lexeme: this._input.substring(this._start + 1, this._current - 1), offset: this._start + 1 });\n    }\n    /*\n     * Lexing a regex expression: /.../[igsmyu]*\n     * Based on https://github.com/microsoft/TypeScript/blob/9247ef115e617805983740ba795d7a8164babf89/src/compiler/scanner.ts#L2129-L2181\n     *\n     * Note that we want slashes within a regex to be escaped, e.g., /file:\\\\/\\\\/\\\\// should match `file:///`\n     */\n    _regex() {\n        let p = this._current;\n        let inEscape = false;\n        let inCharacterClass = false;\n        while (true) {\n            if (p >= this._input.length) {\n                this._current = p;\n                this._error(hintDidYouForgetToEscapeSlash);\n                return;\n            }\n            const ch = this._input.charCodeAt(p);\n            if (inEscape) { // parsing an escape character\n                inEscape = false;\n            }\n            else if (ch === 47 /* CharCode.Slash */ && !inCharacterClass) { // end of regex\n                p++;\n                break;\n            }\n            else if (ch === 91 /* CharCode.OpenSquareBracket */) {\n                inCharacterClass = true;\n            }\n            else if (ch === 92 /* CharCode.Backslash */) {\n                inEscape = true;\n            }\n            else if (ch === 93 /* CharCode.CloseSquareBracket */) {\n                inCharacterClass = false;\n            }\n            p++;\n        }\n        // Consume flags // TODO@ulugbekna: use regex instead\n        while (p < this._input.length && Scanner._regexFlags.has(this._input.charCodeAt(p))) {\n            p++;\n        }\n        this._current = p;\n        const lexeme = this._input.substring(this._start, this._current);\n        this._tokens.push({ type: 10 /* TokenType.RegexStr */, lexeme, offset: this._start });\n    }\n    _isAtEnd() {\n        return this._current >= this._input.length;\n    }\n}\n\nexport { Scanner };\n","import { isMacintosh, isLinux, isWindows, isWeb, isEdge, isFirefox, isChrome, isSafari } from '../../../base/common/platform.js';\nimport { isFalsyOrWhitespace } from '../../../base/common/strings.js';\nimport { Scanner } from './scanner.js';\nimport { createDecorator } from '../../instantiation/common/instantiation.js';\nimport { localize } from '../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nconst CONSTANT_VALUES = new Map();\nCONSTANT_VALUES.set('false', false);\nCONSTANT_VALUES.set('true', true);\nCONSTANT_VALUES.set('isMac', isMacintosh);\nCONSTANT_VALUES.set('isLinux', isLinux);\nCONSTANT_VALUES.set('isWindows', isWindows);\nCONSTANT_VALUES.set('isWeb', isWeb);\nCONSTANT_VALUES.set('isMacNative', isMacintosh && !isWeb);\nCONSTANT_VALUES.set('isEdge', isEdge);\nCONSTANT_VALUES.set('isFirefox', isFirefox);\nCONSTANT_VALUES.set('isChrome', isChrome);\nCONSTANT_VALUES.set('isSafari', isSafari);\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst defaultConfig = {\n    regexParsingWithErrorRecovery: true\n};\nconst errorEmptyString = localize(1675, \"Empty context key expression\");\nconst hintEmptyString = localize(1676, \"Did you forget to write an expression? You can also put 'false' or 'true' to always evaluate to false or true, respectively.\");\nconst errorNoInAfterNot = localize(1677, \"'in' after 'not'.\");\nconst errorClosingParenthesis = localize(1678, \"closing parenthesis ')'\");\nconst errorUnexpectedToken = localize(1679, \"Unexpected token\");\nconst hintUnexpectedToken = localize(1680, \"Did you forget to put && or || before the token?\");\nconst errorUnexpectedEOF = localize(1681, \"Unexpected end of expression\");\nconst hintUnexpectedEOF = localize(1682, \"Did you forget to put a context key?\");\n/**\n * A parser for context key expressions.\n *\n * Example:\n * ```ts\n * const parser = new Parser();\n * const expr = parser.parse('foo == \"bar\" && baz == true');\n *\n * if (expr === undefined) {\n * \t// there were lexing or parsing errors\n * \t// process lexing errors with `parser.lexingErrors`\n *  // process parsing errors with `parser.parsingErrors`\n * } else {\n * \t// expr is a valid expression\n * }\n * ```\n */\nclass Parser {\n    // Note: this doesn't produce an exact syntax tree but a normalized one\n    // ContextKeyExpression's that we use as AST nodes do not expose constructors that do not normalize\n    static { this._parseError = new Error(); }\n    constructor(_config = defaultConfig) {\n        this._config = _config;\n        // lifetime note: `_scanner` lives as long as the parser does, i.e., is not reset between calls to `parse`\n        this._scanner = new Scanner();\n        // lifetime note: `_tokens`, `_current`, and `_parsingErrors` must be reset between calls to `parse`\n        this._tokens = [];\n        this._current = 0; // invariant: 0 <= this._current < this._tokens.length ; any incrementation of this value must first call `_isAtEnd`\n        this._parsingErrors = [];\n        this._flagsGYRe = /g|y/g;\n    }\n    /**\n     * Parse a context key expression.\n     *\n     * @param input the expression to parse\n     * @returns the parsed expression or `undefined` if there's an error - call `lexingErrors` and `parsingErrors` to see the errors\n     */\n    parse(input) {\n        if (input === '') {\n            this._parsingErrors.push({ message: errorEmptyString, offset: 0, lexeme: '', additionalInfo: hintEmptyString });\n            return undefined;\n        }\n        this._tokens = this._scanner.reset(input).scan();\n        // @ulugbekna: we do not stop parsing if there are lexing errors to be able to reconstruct regexes with unescaped slashes; TODO@ulugbekna: make this respect config option for recovery\n        this._current = 0;\n        this._parsingErrors = [];\n        try {\n            const expr = this._expr();\n            if (!this._isAtEnd()) {\n                const peek = this._peek();\n                const additionalInfo = peek.type === 17 /* TokenType.Str */ ? hintUnexpectedToken : undefined;\n                this._parsingErrors.push({ message: errorUnexpectedToken, offset: peek.offset, lexeme: Scanner.getLexeme(peek), additionalInfo });\n                throw Parser._parseError;\n            }\n            return expr;\n        }\n        catch (e) {\n            if (!(e === Parser._parseError)) {\n                throw e;\n            }\n            return undefined;\n        }\n    }\n    _expr() {\n        return this._or();\n    }\n    _or() {\n        const expr = [this._and()];\n        while (this._matchOne(16 /* TokenType.Or */)) {\n            const right = this._and();\n            expr.push(right);\n        }\n        return expr.length === 1 ? expr[0] : ContextKeyExpr.or(...expr);\n    }\n    _and() {\n        const expr = [this._term()];\n        while (this._matchOne(15 /* TokenType.And */)) {\n            const right = this._term();\n            expr.push(right);\n        }\n        return expr.length === 1 ? expr[0] : ContextKeyExpr.and(...expr);\n    }\n    _term() {\n        if (this._matchOne(2 /* TokenType.Neg */)) {\n            const peek = this._peek();\n            switch (peek.type) {\n                case 11 /* TokenType.True */:\n                    this._advance();\n                    return ContextKeyFalseExpr.INSTANCE;\n                case 12 /* TokenType.False */:\n                    this._advance();\n                    return ContextKeyTrueExpr.INSTANCE;\n                case 0 /* TokenType.LParen */: {\n                    this._advance();\n                    const expr = this._expr();\n                    this._consume(1 /* TokenType.RParen */, errorClosingParenthesis);\n                    return expr?.negate();\n                }\n                case 17 /* TokenType.Str */:\n                    this._advance();\n                    return ContextKeyNotExpr.create(peek.lexeme);\n                default:\n                    throw this._errExpectedButGot(`KEY | true | false | '(' expression ')'`, peek);\n            }\n        }\n        return this._primary();\n    }\n    _primary() {\n        const peek = this._peek();\n        switch (peek.type) {\n            case 11 /* TokenType.True */:\n                this._advance();\n                return ContextKeyExpr.true();\n            case 12 /* TokenType.False */:\n                this._advance();\n                return ContextKeyExpr.false();\n            case 0 /* TokenType.LParen */: {\n                this._advance();\n                const expr = this._expr();\n                this._consume(1 /* TokenType.RParen */, errorClosingParenthesis);\n                return expr;\n            }\n            case 17 /* TokenType.Str */: {\n                // KEY\n                const key = peek.lexeme;\n                this._advance();\n                // =~ regex\n                if (this._matchOne(9 /* TokenType.RegexOp */)) {\n                    // @ulugbekna: we need to reconstruct the regex from the tokens because some extensions use unescaped slashes in regexes\n                    const expr = this._peek();\n                    if (!this._config.regexParsingWithErrorRecovery) {\n                        this._advance();\n                        if (expr.type !== 10 /* TokenType.RegexStr */) {\n                            throw this._errExpectedButGot(`REGEX`, expr);\n                        }\n                        const regexLexeme = expr.lexeme;\n                        const closingSlashIndex = regexLexeme.lastIndexOf('/');\n                        const flags = closingSlashIndex === regexLexeme.length - 1 ? undefined : this._removeFlagsGY(regexLexeme.substring(closingSlashIndex + 1));\n                        let regexp;\n                        try {\n                            regexp = new RegExp(regexLexeme.substring(1, closingSlashIndex), flags);\n                        }\n                        catch (e) {\n                            throw this._errExpectedButGot(`REGEX`, expr);\n                        }\n                        return ContextKeyRegexExpr.create(key, regexp);\n                    }\n                    switch (expr.type) {\n                        case 10 /* TokenType.RegexStr */:\n                        case 19 /* TokenType.Error */: { // also handle an ErrorToken in case of smth such as /(/file)/\n                            const lexemeReconstruction = [expr.lexeme]; // /REGEX/ or /REGEX/FLAGS\n                            this._advance();\n                            let followingToken = this._peek();\n                            let parenBalance = 0;\n                            for (let i = 0; i < expr.lexeme.length; i++) {\n                                if (expr.lexeme.charCodeAt(i) === 40 /* CharCode.OpenParen */) {\n                                    parenBalance++;\n                                }\n                                else if (expr.lexeme.charCodeAt(i) === 41 /* CharCode.CloseParen */) {\n                                    parenBalance--;\n                                }\n                            }\n                            while (!this._isAtEnd() && followingToken.type !== 15 /* TokenType.And */ && followingToken.type !== 16 /* TokenType.Or */) {\n                                switch (followingToken.type) {\n                                    case 0 /* TokenType.LParen */:\n                                        parenBalance++;\n                                        break;\n                                    case 1 /* TokenType.RParen */:\n                                        parenBalance--;\n                                        break;\n                                    case 10 /* TokenType.RegexStr */:\n                                    case 18 /* TokenType.QuotedStr */:\n                                        for (let i = 0; i < followingToken.lexeme.length; i++) {\n                                            if (followingToken.lexeme.charCodeAt(i) === 40 /* CharCode.OpenParen */) {\n                                                parenBalance++;\n                                            }\n                                            else if (expr.lexeme.charCodeAt(i) === 41 /* CharCode.CloseParen */) {\n                                                parenBalance--;\n                                            }\n                                        }\n                                }\n                                if (parenBalance < 0) {\n                                    break;\n                                }\n                                lexemeReconstruction.push(Scanner.getLexeme(followingToken));\n                                this._advance();\n                                followingToken = this._peek();\n                            }\n                            const regexLexeme = lexemeReconstruction.join('');\n                            const closingSlashIndex = regexLexeme.lastIndexOf('/');\n                            const flags = closingSlashIndex === regexLexeme.length - 1 ? undefined : this._removeFlagsGY(regexLexeme.substring(closingSlashIndex + 1));\n                            let regexp;\n                            try {\n                                regexp = new RegExp(regexLexeme.substring(1, closingSlashIndex), flags);\n                            }\n                            catch (e) {\n                                throw this._errExpectedButGot(`REGEX`, expr);\n                            }\n                            return ContextKeyExpr.regex(key, regexp);\n                        }\n                        case 18 /* TokenType.QuotedStr */: {\n                            const serializedValue = expr.lexeme;\n                            this._advance();\n                            // replicate old regex parsing behavior\n                            let regex = null;\n                            if (!isFalsyOrWhitespace(serializedValue)) {\n                                const start = serializedValue.indexOf('/');\n                                const end = serializedValue.lastIndexOf('/');\n                                if (start !== end && start >= 0) {\n                                    const value = serializedValue.slice(start + 1, end);\n                                    const caseIgnoreFlag = serializedValue[end + 1] === 'i' ? 'i' : '';\n                                    try {\n                                        regex = new RegExp(value, caseIgnoreFlag);\n                                    }\n                                    catch (_e) {\n                                        throw this._errExpectedButGot(`REGEX`, expr);\n                                    }\n                                }\n                            }\n                            if (regex === null) {\n                                throw this._errExpectedButGot('REGEX', expr);\n                            }\n                            return ContextKeyRegexExpr.create(key, regex);\n                        }\n                        default:\n                            throw this._errExpectedButGot('REGEX', this._peek());\n                    }\n                }\n                // [ 'not' 'in' value ]\n                if (this._matchOne(14 /* TokenType.Not */)) {\n                    this._consume(13 /* TokenType.In */, errorNoInAfterNot);\n                    const right = this._value();\n                    return ContextKeyExpr.notIn(key, right);\n                }\n                // [ ('==' | '!=' | '<' | '<=' | '>' | '>=' | 'in') value ]\n                const maybeOp = this._peek().type;\n                switch (maybeOp) {\n                    case 3 /* TokenType.Eq */: {\n                        this._advance();\n                        const right = this._value();\n                        if (this._previous().type === 18 /* TokenType.QuotedStr */) { // to preserve old parser behavior: \"foo == 'true'\" is preserved as \"foo == 'true'\", but \"foo == true\" is optimized as \"foo\"\n                            return ContextKeyExpr.equals(key, right);\n                        }\n                        switch (right) {\n                            case 'true':\n                                return ContextKeyExpr.has(key);\n                            case 'false':\n                                return ContextKeyExpr.not(key);\n                            default:\n                                return ContextKeyExpr.equals(key, right);\n                        }\n                    }\n                    case 4 /* TokenType.NotEq */: {\n                        this._advance();\n                        const right = this._value();\n                        if (this._previous().type === 18 /* TokenType.QuotedStr */) { // same as above with \"foo != 'true'\"\n                            return ContextKeyExpr.notEquals(key, right);\n                        }\n                        switch (right) {\n                            case 'true':\n                                return ContextKeyExpr.not(key);\n                            case 'false':\n                                return ContextKeyExpr.has(key);\n                            default:\n                                return ContextKeyExpr.notEquals(key, right);\n                        }\n                    }\n                    // TODO: ContextKeyExpr.smaller(key, right) accepts only `number` as `right` AND during eval of this node, we just eval to `false` if `right` is not a number\n                    // consequently, package.json linter should _warn_ the user if they're passing undesired things to ops\n                    case 5 /* TokenType.Lt */:\n                        this._advance();\n                        return ContextKeySmallerExpr.create(key, this._value());\n                    case 6 /* TokenType.LtEq */:\n                        this._advance();\n                        return ContextKeySmallerEqualsExpr.create(key, this._value());\n                    case 7 /* TokenType.Gt */:\n                        this._advance();\n                        return ContextKeyGreaterExpr.create(key, this._value());\n                    case 8 /* TokenType.GtEq */:\n                        this._advance();\n                        return ContextKeyGreaterEqualsExpr.create(key, this._value());\n                    case 13 /* TokenType.In */:\n                        this._advance();\n                        return ContextKeyExpr.in(key, this._value());\n                    default:\n                        return ContextKeyExpr.has(key);\n                }\n            }\n            case 20 /* TokenType.EOF */:\n                this._parsingErrors.push({ message: errorUnexpectedEOF, offset: peek.offset, lexeme: '', additionalInfo: hintUnexpectedEOF });\n                throw Parser._parseError;\n            default:\n                throw this._errExpectedButGot(`true | false | KEY \\n\\t| KEY '=~' REGEX \\n\\t| KEY ('==' | '!=' | '<' | '<=' | '>' | '>=' | 'in' | 'not' 'in') value`, this._peek());\n        }\n    }\n    _value() {\n        const token = this._peek();\n        switch (token.type) {\n            case 17 /* TokenType.Str */:\n            case 18 /* TokenType.QuotedStr */:\n                this._advance();\n                return token.lexeme;\n            case 11 /* TokenType.True */:\n                this._advance();\n                return 'true';\n            case 12 /* TokenType.False */:\n                this._advance();\n                return 'false';\n            case 13 /* TokenType.In */: // we support `in` as a value, e.g., \"when\": \"languageId == in\" - exists in existing extensions\n                this._advance();\n                return 'in';\n            default:\n                // this allows \"when\": \"foo == \" which's used by existing extensions\n                // we do not call `_advance` on purpose - we don't want to eat unintended tokens\n                return '';\n        }\n    }\n    _removeFlagsGY(flags) {\n        return flags.replaceAll(this._flagsGYRe, '');\n    }\n    // careful: this can throw if current token is the initial one (ie index = 0)\n    _previous() {\n        return this._tokens[this._current - 1];\n    }\n    _matchOne(token) {\n        if (this._check(token)) {\n            this._advance();\n            return true;\n        }\n        return false;\n    }\n    _advance() {\n        if (!this._isAtEnd()) {\n            this._current++;\n        }\n        return this._previous();\n    }\n    _consume(type, message) {\n        if (this._check(type)) {\n            return this._advance();\n        }\n        throw this._errExpectedButGot(message, this._peek());\n    }\n    _errExpectedButGot(expected, got, additionalInfo) {\n        const message = localize(1683, \"Expected: {0}\\nReceived: '{1}'.\", expected, Scanner.getLexeme(got));\n        const offset = got.offset;\n        const lexeme = Scanner.getLexeme(got);\n        this._parsingErrors.push({ message, offset, lexeme, additionalInfo });\n        return Parser._parseError;\n    }\n    _check(type) {\n        return this._peek().type === type;\n    }\n    _peek() {\n        return this._tokens[this._current];\n    }\n    _isAtEnd() {\n        return this._peek().type === 20 /* TokenType.EOF */;\n    }\n}\nclass ContextKeyExpr {\n    static false() {\n        return ContextKeyFalseExpr.INSTANCE;\n    }\n    static true() {\n        return ContextKeyTrueExpr.INSTANCE;\n    }\n    static has(key) {\n        return ContextKeyDefinedExpr.create(key);\n    }\n    static equals(key, value) {\n        return ContextKeyEqualsExpr.create(key, value);\n    }\n    static notEquals(key, value) {\n        return ContextKeyNotEqualsExpr.create(key, value);\n    }\n    static regex(key, value) {\n        return ContextKeyRegexExpr.create(key, value);\n    }\n    static in(key, value) {\n        return ContextKeyInExpr.create(key, value);\n    }\n    static notIn(key, value) {\n        return ContextKeyNotInExpr.create(key, value);\n    }\n    static not(key) {\n        return ContextKeyNotExpr.create(key);\n    }\n    static and(...expr) {\n        return ContextKeyAndExpr.create(expr, null, true);\n    }\n    static or(...expr) {\n        return ContextKeyOrExpr.create(expr, null, true);\n    }\n    static { this._parser = new Parser({ regexParsingWithErrorRecovery: false }); }\n    static deserialize(serialized) {\n        if (serialized === undefined || serialized === null) { // an empty string needs to be handled by the parser to get a corresponding parsing error reported\n            return undefined;\n        }\n        const expr = this._parser.parse(serialized);\n        return expr;\n    }\n}\nfunction expressionsAreEqualWithConstantSubstitution(a, b) {\n    const aExpr = a ? a.substituteConstants() : undefined;\n    const bExpr = b ? b.substituteConstants() : undefined;\n    if (!aExpr && !bExpr) {\n        return true;\n    }\n    if (!aExpr || !bExpr) {\n        return false;\n    }\n    return aExpr.equals(bExpr);\n}\nfunction cmp(a, b) {\n    return a.cmp(b);\n}\nclass ContextKeyFalseExpr {\n    static { this.INSTANCE = new ContextKeyFalseExpr(); }\n    constructor() {\n        this.type = 0 /* ContextKeyExprType.False */;\n    }\n    cmp(other) {\n        return this.type - other.type;\n    }\n    equals(other) {\n        return (other.type === this.type);\n    }\n    substituteConstants() {\n        return this;\n    }\n    evaluate(context) {\n        return false;\n    }\n    serialize() {\n        return 'false';\n    }\n    keys() {\n        return [];\n    }\n    negate() {\n        return ContextKeyTrueExpr.INSTANCE;\n    }\n}\nclass ContextKeyTrueExpr {\n    static { this.INSTANCE = new ContextKeyTrueExpr(); }\n    constructor() {\n        this.type = 1 /* ContextKeyExprType.True */;\n    }\n    cmp(other) {\n        return this.type - other.type;\n    }\n    equals(other) {\n        return (other.type === this.type);\n    }\n    substituteConstants() {\n        return this;\n    }\n    evaluate(context) {\n        return true;\n    }\n    serialize() {\n        return 'true';\n    }\n    keys() {\n        return [];\n    }\n    negate() {\n        return ContextKeyFalseExpr.INSTANCE;\n    }\n}\nclass ContextKeyDefinedExpr {\n    static create(key, negated = null) {\n        const constantValue = CONSTANT_VALUES.get(key);\n        if (typeof constantValue === 'boolean') {\n            return constantValue ? ContextKeyTrueExpr.INSTANCE : ContextKeyFalseExpr.INSTANCE;\n        }\n        return new ContextKeyDefinedExpr(key, negated);\n    }\n    constructor(key, negated) {\n        this.key = key;\n        this.negated = negated;\n        this.type = 2 /* ContextKeyExprType.Defined */;\n    }\n    cmp(other) {\n        if (other.type !== this.type) {\n            return this.type - other.type;\n        }\n        return cmp1(this.key, other.key);\n    }\n    equals(other) {\n        if (other.type === this.type) {\n            return (this.key === other.key);\n        }\n        return false;\n    }\n    substituteConstants() {\n        const constantValue = CONSTANT_VALUES.get(this.key);\n        if (typeof constantValue === 'boolean') {\n            return constantValue ? ContextKeyTrueExpr.INSTANCE : ContextKeyFalseExpr.INSTANCE;\n        }\n        return this;\n    }\n    evaluate(context) {\n        return (!!context.getValue(this.key));\n    }\n    serialize() {\n        return this.key;\n    }\n    keys() {\n        return [this.key];\n    }\n    negate() {\n        if (!this.negated) {\n            this.negated = ContextKeyNotExpr.create(this.key, this);\n        }\n        return this.negated;\n    }\n}\nclass ContextKeyEqualsExpr {\n    static create(key, value, negated = null) {\n        if (typeof value === 'boolean') {\n            return (value ? ContextKeyDefinedExpr.create(key, negated) : ContextKeyNotExpr.create(key, negated));\n        }\n        const constantValue = CONSTANT_VALUES.get(key);\n        if (typeof constantValue === 'boolean') {\n            const trueValue = constantValue ? 'true' : 'false';\n            return (value === trueValue ? ContextKeyTrueExpr.INSTANCE : ContextKeyFalseExpr.INSTANCE);\n        }\n        return new ContextKeyEqualsExpr(key, value, negated);\n    }\n    constructor(key, value, negated) {\n        this.key = key;\n        this.value = value;\n        this.negated = negated;\n        this.type = 4 /* ContextKeyExprType.Equals */;\n    }\n    cmp(other) {\n        if (other.type !== this.type) {\n            return this.type - other.type;\n        }\n        return cmp2(this.key, this.value, other.key, other.value);\n    }\n    equals(other) {\n        if (other.type === this.type) {\n            return (this.key === other.key && this.value === other.value);\n        }\n        return false;\n    }\n    substituteConstants() {\n        const constantValue = CONSTANT_VALUES.get(this.key);\n        if (typeof constantValue === 'boolean') {\n            const trueValue = constantValue ? 'true' : 'false';\n            return (this.value === trueValue ? ContextKeyTrueExpr.INSTANCE : ContextKeyFalseExpr.INSTANCE);\n        }\n        return this;\n    }\n    evaluate(context) {\n        // Intentional ==\n        // eslint-disable-next-line eqeqeq\n        return (context.getValue(this.key) == this.value);\n    }\n    serialize() {\n        return `${this.key} == '${this.value}'`;\n    }\n    keys() {\n        return [this.key];\n    }\n    negate() {\n        if (!this.negated) {\n            this.negated = ContextKeyNotEqualsExpr.create(this.key, this.value, this);\n        }\n        return this.negated;\n    }\n}\nclass ContextKeyInExpr {\n    static create(key, valueKey) {\n        return new ContextKeyInExpr(key, valueKey);\n    }\n    constructor(key, valueKey) {\n        this.key = key;\n        this.valueKey = valueKey;\n        this.type = 10 /* ContextKeyExprType.In */;\n        this.negated = null;\n    }\n    cmp(other) {\n        if (other.type !== this.type) {\n            return this.type - other.type;\n        }\n        return cmp2(this.key, this.valueKey, other.key, other.valueKey);\n    }\n    equals(other) {\n        if (other.type === this.type) {\n            return (this.key === other.key && this.valueKey === other.valueKey);\n        }\n        return false;\n    }\n    substituteConstants() {\n        return this;\n    }\n    evaluate(context) {\n        const source = context.getValue(this.valueKey);\n        const item = context.getValue(this.key);\n        if (Array.isArray(source)) {\n            // eslint-disable-next-line local/code-no-any-casts\n            return source.includes(item);\n        }\n        if (typeof item === 'string' && typeof source === 'object' && source !== null) {\n            return hasOwnProperty.call(source, item);\n        }\n        return false;\n    }\n    serialize() {\n        return `${this.key} in '${this.valueKey}'`;\n    }\n    keys() {\n        return [this.key, this.valueKey];\n    }\n    negate() {\n        if (!this.negated) {\n            this.negated = ContextKeyNotInExpr.create(this.key, this.valueKey);\n        }\n        return this.negated;\n    }\n}\nclass ContextKeyNotInExpr {\n    static create(key, valueKey) {\n        return new ContextKeyNotInExpr(key, valueKey);\n    }\n    constructor(key, valueKey) {\n        this.key = key;\n        this.valueKey = valueKey;\n        this.type = 11 /* ContextKeyExprType.NotIn */;\n        this._negated = ContextKeyInExpr.create(key, valueKey);\n    }\n    cmp(other) {\n        if (other.type !== this.type) {\n            return this.type - other.type;\n        }\n        return this._negated.cmp(other._negated);\n    }\n    equals(other) {\n        if (other.type === this.type) {\n            return this._negated.equals(other._negated);\n        }\n        return false;\n    }\n    substituteConstants() {\n        return this;\n    }\n    evaluate(context) {\n        return !this._negated.evaluate(context);\n    }\n    serialize() {\n        return `${this.key} not in '${this.valueKey}'`;\n    }\n    keys() {\n        return this._negated.keys();\n    }\n    negate() {\n        return this._negated;\n    }\n}\nclass ContextKeyNotEqualsExpr {\n    static create(key, value, negated = null) {\n        if (typeof value === 'boolean') {\n            if (value) {\n                return ContextKeyNotExpr.create(key, negated);\n            }\n            return ContextKeyDefinedExpr.create(key, negated);\n        }\n        const constantValue = CONSTANT_VALUES.get(key);\n        if (typeof constantValue === 'boolean') {\n            const falseValue = constantValue ? 'true' : 'false';\n            return (value === falseValue ? ContextKeyFalseExpr.INSTANCE : ContextKeyTrueExpr.INSTANCE);\n        }\n        return new ContextKeyNotEqualsExpr(key, value, negated);\n    }\n    constructor(key, value, negated) {\n        this.key = key;\n        this.value = value;\n        this.negated = negated;\n        this.type = 5 /* ContextKeyExprType.NotEquals */;\n    }\n    cmp(other) {\n        if (other.type !== this.type) {\n            return this.type - other.type;\n        }\n        return cmp2(this.key, this.value, other.key, other.value);\n    }\n    equals(other) {\n        if (other.type === this.type) {\n            return (this.key === other.key && this.value === other.value);\n        }\n        return false;\n    }\n    substituteConstants() {\n        const constantValue = CONSTANT_VALUES.get(this.key);\n        if (typeof constantValue === 'boolean') {\n            const falseValue = constantValue ? 'true' : 'false';\n            return (this.value === falseValue ? ContextKeyFalseExpr.INSTANCE : ContextKeyTrueExpr.INSTANCE);\n        }\n        return this;\n    }\n    evaluate(context) {\n        // Intentional !=\n        // eslint-disable-next-line eqeqeq\n        return (context.getValue(this.key) != this.value);\n    }\n    serialize() {\n        return `${this.key} != '${this.value}'`;\n    }\n    keys() {\n        return [this.key];\n    }\n    negate() {\n        if (!this.negated) {\n            this.negated = ContextKeyEqualsExpr.create(this.key, this.value, this);\n        }\n        return this.negated;\n    }\n}\nclass ContextKeyNotExpr {\n    static create(key, negated = null) {\n        const constantValue = CONSTANT_VALUES.get(key);\n        if (typeof constantValue === 'boolean') {\n            return (constantValue ? ContextKeyFalseExpr.INSTANCE : ContextKeyTrueExpr.INSTANCE);\n        }\n        return new ContextKeyNotExpr(key, negated);\n    }\n    constructor(key, negated) {\n        this.key = key;\n        this.negated = negated;\n        this.type = 3 /* ContextKeyExprType.Not */;\n    }\n    cmp(other) {\n        if (other.type !== this.type) {\n            return this.type - other.type;\n        }\n        return cmp1(this.key, other.key);\n    }\n    equals(other) {\n        if (other.type === this.type) {\n            return (this.key === other.key);\n        }\n        return false;\n    }\n    substituteConstants() {\n        const constantValue = CONSTANT_VALUES.get(this.key);\n        if (typeof constantValue === 'boolean') {\n            return (constantValue ? ContextKeyFalseExpr.INSTANCE : ContextKeyTrueExpr.INSTANCE);\n        }\n        return this;\n    }\n    evaluate(context) {\n        return (!context.getValue(this.key));\n    }\n    serialize() {\n        return `!${this.key}`;\n    }\n    keys() {\n        return [this.key];\n    }\n    negate() {\n        if (!this.negated) {\n            this.negated = ContextKeyDefinedExpr.create(this.key, this);\n        }\n        return this.negated;\n    }\n}\nfunction withFloatOrStr(value, callback) {\n    if (typeof value === 'string') {\n        const n = parseFloat(value);\n        if (!isNaN(n)) {\n            value = n;\n        }\n    }\n    if (typeof value === 'string' || typeof value === 'number') {\n        return callback(value);\n    }\n    return ContextKeyFalseExpr.INSTANCE;\n}\nclass ContextKeyGreaterExpr {\n    static create(key, _value, negated = null) {\n        return withFloatOrStr(_value, (value) => new ContextKeyGreaterExpr(key, value, negated));\n    }\n    constructor(key, value, negated) {\n        this.key = key;\n        this.value = value;\n        this.negated = negated;\n        this.type = 12 /* ContextKeyExprType.Greater */;\n    }\n    cmp(other) {\n        if (other.type !== this.type) {\n            return this.type - other.type;\n        }\n        return cmp2(this.key, this.value, other.key, other.value);\n    }\n    equals(other) {\n        if (other.type === this.type) {\n            return (this.key === other.key && this.value === other.value);\n        }\n        return false;\n    }\n    substituteConstants() {\n        return this;\n    }\n    evaluate(context) {\n        if (typeof this.value === 'string') {\n            return false;\n        }\n        return (parseFloat(context.getValue(this.key)) > this.value);\n    }\n    serialize() {\n        return `${this.key} > ${this.value}`;\n    }\n    keys() {\n        return [this.key];\n    }\n    negate() {\n        if (!this.negated) {\n            this.negated = ContextKeySmallerEqualsExpr.create(this.key, this.value, this);\n        }\n        return this.negated;\n    }\n}\nclass ContextKeyGreaterEqualsExpr {\n    static create(key, _value, negated = null) {\n        return withFloatOrStr(_value, (value) => new ContextKeyGreaterEqualsExpr(key, value, negated));\n    }\n    constructor(key, value, negated) {\n        this.key = key;\n        this.value = value;\n        this.negated = negated;\n        this.type = 13 /* ContextKeyExprType.GreaterEquals */;\n    }\n    cmp(other) {\n        if (other.type !== this.type) {\n            return this.type - other.type;\n        }\n        return cmp2(this.key, this.value, other.key, other.value);\n    }\n    equals(other) {\n        if (other.type === this.type) {\n            return (this.key === other.key && this.value === other.value);\n        }\n        return false;\n    }\n    substituteConstants() {\n        return this;\n    }\n    evaluate(context) {\n        if (typeof this.value === 'string') {\n            return false;\n        }\n        return (parseFloat(context.getValue(this.key)) >= this.value);\n    }\n    serialize() {\n        return `${this.key} >= ${this.value}`;\n    }\n    keys() {\n        return [this.key];\n    }\n    negate() {\n        if (!this.negated) {\n            this.negated = ContextKeySmallerExpr.create(this.key, this.value, this);\n        }\n        return this.negated;\n    }\n}\nclass ContextKeySmallerExpr {\n    static create(key, _value, negated = null) {\n        return withFloatOrStr(_value, (value) => new ContextKeySmallerExpr(key, value, negated));\n    }\n    constructor(key, value, negated) {\n        this.key = key;\n        this.value = value;\n        this.negated = negated;\n        this.type = 14 /* ContextKeyExprType.Smaller */;\n    }\n    cmp(other) {\n        if (other.type !== this.type) {\n            return this.type - other.type;\n        }\n        return cmp2(this.key, this.value, other.key, other.value);\n    }\n    equals(other) {\n        if (other.type === this.type) {\n            return (this.key === other.key && this.value === other.value);\n        }\n        return false;\n    }\n    substituteConstants() {\n        return this;\n    }\n    evaluate(context) {\n        if (typeof this.value === 'string') {\n            return false;\n        }\n        return (parseFloat(context.getValue(this.key)) < this.value);\n    }\n    serialize() {\n        return `${this.key} < ${this.value}`;\n    }\n    keys() {\n        return [this.key];\n    }\n    negate() {\n        if (!this.negated) {\n            this.negated = ContextKeyGreaterEqualsExpr.create(this.key, this.value, this);\n        }\n        return this.negated;\n    }\n}\nclass ContextKeySmallerEqualsExpr {\n    static create(key, _value, negated = null) {\n        return withFloatOrStr(_value, (value) => new ContextKeySmallerEqualsExpr(key, value, negated));\n    }\n    constructor(key, value, negated) {\n        this.key = key;\n        this.value = value;\n        this.negated = negated;\n        this.type = 15 /* ContextKeyExprType.SmallerEquals */;\n    }\n    cmp(other) {\n        if (other.type !== this.type) {\n            return this.type - other.type;\n        }\n        return cmp2(this.key, this.value, other.key, other.value);\n    }\n    equals(other) {\n        if (other.type === this.type) {\n            return (this.key === other.key && this.value === other.value);\n        }\n        return false;\n    }\n    substituteConstants() {\n        return this;\n    }\n    evaluate(context) {\n        if (typeof this.value === 'string') {\n            return false;\n        }\n        return (parseFloat(context.getValue(this.key)) <= this.value);\n    }\n    serialize() {\n        return `${this.key} <= ${this.value}`;\n    }\n    keys() {\n        return [this.key];\n    }\n    negate() {\n        if (!this.negated) {\n            this.negated = ContextKeyGreaterExpr.create(this.key, this.value, this);\n        }\n        return this.negated;\n    }\n}\nclass ContextKeyRegexExpr {\n    static create(key, regexp) {\n        return new ContextKeyRegexExpr(key, regexp);\n    }\n    constructor(key, regexp) {\n        this.key = key;\n        this.regexp = regexp;\n        this.type = 7 /* ContextKeyExprType.Regex */;\n        this.negated = null;\n        //\n    }\n    cmp(other) {\n        if (other.type !== this.type) {\n            return this.type - other.type;\n        }\n        if (this.key < other.key) {\n            return -1;\n        }\n        if (this.key > other.key) {\n            return 1;\n        }\n        const thisSource = this.regexp ? this.regexp.source : '';\n        const otherSource = other.regexp ? other.regexp.source : '';\n        if (thisSource < otherSource) {\n            return -1;\n        }\n        if (thisSource > otherSource) {\n            return 1;\n        }\n        return 0;\n    }\n    equals(other) {\n        if (other.type === this.type) {\n            const thisSource = this.regexp ? this.regexp.source : '';\n            const otherSource = other.regexp ? other.regexp.source : '';\n            return (this.key === other.key && thisSource === otherSource);\n        }\n        return false;\n    }\n    substituteConstants() {\n        return this;\n    }\n    evaluate(context) {\n        const value = context.getValue(this.key);\n        return this.regexp ? this.regexp.test(value) : false;\n    }\n    serialize() {\n        const value = this.regexp\n            ? `/${this.regexp.source}/${this.regexp.flags}`\n            : '/invalid/';\n        return `${this.key} =~ ${value}`;\n    }\n    keys() {\n        return [this.key];\n    }\n    negate() {\n        if (!this.negated) {\n            this.negated = ContextKeyNotRegexExpr.create(this);\n        }\n        return this.negated;\n    }\n}\nclass ContextKeyNotRegexExpr {\n    static create(actual) {\n        return new ContextKeyNotRegexExpr(actual);\n    }\n    constructor(_actual) {\n        this._actual = _actual;\n        this.type = 8 /* ContextKeyExprType.NotRegex */;\n        //\n    }\n    cmp(other) {\n        if (other.type !== this.type) {\n            return this.type - other.type;\n        }\n        return this._actual.cmp(other._actual);\n    }\n    equals(other) {\n        if (other.type === this.type) {\n            return this._actual.equals(other._actual);\n        }\n        return false;\n    }\n    substituteConstants() {\n        return this;\n    }\n    evaluate(context) {\n        return !this._actual.evaluate(context);\n    }\n    serialize() {\n        return `!(${this._actual.serialize()})`;\n    }\n    keys() {\n        return this._actual.keys();\n    }\n    negate() {\n        return this._actual;\n    }\n}\n/**\n * @returns the same instance if nothing changed.\n */\nfunction eliminateConstantsInArray(arr) {\n    // Allocate array only if there is a difference\n    let newArr = null;\n    for (let i = 0, len = arr.length; i < len; i++) {\n        const newExpr = arr[i].substituteConstants();\n        if (arr[i] !== newExpr) {\n            // something has changed!\n            // allocate array on first difference\n            if (newArr === null) {\n                newArr = [];\n                for (let j = 0; j < i; j++) {\n                    newArr[j] = arr[j];\n                }\n            }\n        }\n        if (newArr !== null) {\n            newArr[i] = newExpr;\n        }\n    }\n    if (newArr === null) {\n        return arr;\n    }\n    return newArr;\n}\nclass ContextKeyAndExpr {\n    static create(_expr, negated, extraRedundantCheck) {\n        return ContextKeyAndExpr._normalizeArr(_expr, negated, extraRedundantCheck);\n    }\n    constructor(expr, negated) {\n        this.expr = expr;\n        this.negated = negated;\n        this.type = 6 /* ContextKeyExprType.And */;\n    }\n    cmp(other) {\n        if (other.type !== this.type) {\n            return this.type - other.type;\n        }\n        if (this.expr.length < other.expr.length) {\n            return -1;\n        }\n        if (this.expr.length > other.expr.length) {\n            return 1;\n        }\n        for (let i = 0, len = this.expr.length; i < len; i++) {\n            const r = cmp(this.expr[i], other.expr[i]);\n            if (r !== 0) {\n                return r;\n            }\n        }\n        return 0;\n    }\n    equals(other) {\n        if (other.type === this.type) {\n            if (this.expr.length !== other.expr.length) {\n                return false;\n            }\n            for (let i = 0, len = this.expr.length; i < len; i++) {\n                if (!this.expr[i].equals(other.expr[i])) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        return false;\n    }\n    substituteConstants() {\n        const exprArr = eliminateConstantsInArray(this.expr);\n        if (exprArr === this.expr) {\n            // no change\n            return this;\n        }\n        return ContextKeyAndExpr.create(exprArr, this.negated, false);\n    }\n    evaluate(context) {\n        for (let i = 0, len = this.expr.length; i < len; i++) {\n            if (!this.expr[i].evaluate(context)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    static _normalizeArr(arr, negated, extraRedundantCheck) {\n        const expr = [];\n        let hasTrue = false;\n        for (const e of arr) {\n            if (!e) {\n                continue;\n            }\n            if (e.type === 1 /* ContextKeyExprType.True */) {\n                // anything && true ==> anything\n                hasTrue = true;\n                continue;\n            }\n            if (e.type === 0 /* ContextKeyExprType.False */) {\n                // anything && false ==> false\n                return ContextKeyFalseExpr.INSTANCE;\n            }\n            if (e.type === 6 /* ContextKeyExprType.And */) {\n                expr.push(...e.expr);\n                continue;\n            }\n            expr.push(e);\n        }\n        if (expr.length === 0 && hasTrue) {\n            return ContextKeyTrueExpr.INSTANCE;\n        }\n        if (expr.length === 0) {\n            return undefined;\n        }\n        if (expr.length === 1) {\n            return expr[0];\n        }\n        expr.sort(cmp);\n        // eliminate duplicate terms\n        for (let i = 1; i < expr.length; i++) {\n            if (expr[i - 1].equals(expr[i])) {\n                expr.splice(i, 1);\n                i--;\n            }\n        }\n        if (expr.length === 1) {\n            return expr[0];\n        }\n        // We must distribute any OR expression because we don't support parens\n        // OR extensions will be at the end (due to sorting rules)\n        while (expr.length > 1) {\n            const lastElement = expr[expr.length - 1];\n            if (lastElement.type !== 9 /* ContextKeyExprType.Or */) {\n                break;\n            }\n            // pop the last element\n            expr.pop();\n            // pop the second to last element\n            const secondToLastElement = expr.pop();\n            const isFinished = (expr.length === 0);\n            // distribute `lastElement` over `secondToLastElement`\n            const resultElement = ContextKeyOrExpr.create(lastElement.expr.map(el => ContextKeyAndExpr.create([el, secondToLastElement], null, extraRedundantCheck)), null, isFinished);\n            if (resultElement) {\n                expr.push(resultElement);\n                expr.sort(cmp);\n            }\n        }\n        if (expr.length === 1) {\n            return expr[0];\n        }\n        // resolve false AND expressions\n        if (extraRedundantCheck) {\n            for (let i = 0; i < expr.length; i++) {\n                for (let j = i + 1; j < expr.length; j++) {\n                    if (expr[i].negate().equals(expr[j])) {\n                        // A && !A case\n                        return ContextKeyFalseExpr.INSTANCE;\n                    }\n                }\n            }\n            if (expr.length === 1) {\n                return expr[0];\n            }\n        }\n        return new ContextKeyAndExpr(expr, negated);\n    }\n    serialize() {\n        return this.expr.map(e => e.serialize()).join(' && ');\n    }\n    keys() {\n        const result = [];\n        for (const expr of this.expr) {\n            result.push(...expr.keys());\n        }\n        return result;\n    }\n    negate() {\n        if (!this.negated) {\n            const result = [];\n            for (const expr of this.expr) {\n                result.push(expr.negate());\n            }\n            this.negated = ContextKeyOrExpr.create(result, this, true);\n        }\n        return this.negated;\n    }\n}\nclass ContextKeyOrExpr {\n    static create(_expr, negated, extraRedundantCheck) {\n        return ContextKeyOrExpr._normalizeArr(_expr, negated, extraRedundantCheck);\n    }\n    constructor(expr, negated) {\n        this.expr = expr;\n        this.negated = negated;\n        this.type = 9 /* ContextKeyExprType.Or */;\n    }\n    cmp(other) {\n        if (other.type !== this.type) {\n            return this.type - other.type;\n        }\n        if (this.expr.length < other.expr.length) {\n            return -1;\n        }\n        if (this.expr.length > other.expr.length) {\n            return 1;\n        }\n        for (let i = 0, len = this.expr.length; i < len; i++) {\n            const r = cmp(this.expr[i], other.expr[i]);\n            if (r !== 0) {\n                return r;\n            }\n        }\n        return 0;\n    }\n    equals(other) {\n        if (other.type === this.type) {\n            if (this.expr.length !== other.expr.length) {\n                return false;\n            }\n            for (let i = 0, len = this.expr.length; i < len; i++) {\n                if (!this.expr[i].equals(other.expr[i])) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        return false;\n    }\n    substituteConstants() {\n        const exprArr = eliminateConstantsInArray(this.expr);\n        if (exprArr === this.expr) {\n            // no change\n            return this;\n        }\n        return ContextKeyOrExpr.create(exprArr, this.negated, false);\n    }\n    evaluate(context) {\n        for (let i = 0, len = this.expr.length; i < len; i++) {\n            if (this.expr[i].evaluate(context)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    static _normalizeArr(arr, negated, extraRedundantCheck) {\n        let expr = [];\n        let hasFalse = false;\n        if (arr) {\n            for (let i = 0, len = arr.length; i < len; i++) {\n                const e = arr[i];\n                if (!e) {\n                    continue;\n                }\n                if (e.type === 0 /* ContextKeyExprType.False */) {\n                    // anything || false ==> anything\n                    hasFalse = true;\n                    continue;\n                }\n                if (e.type === 1 /* ContextKeyExprType.True */) {\n                    // anything || true ==> true\n                    return ContextKeyTrueExpr.INSTANCE;\n                }\n                if (e.type === 9 /* ContextKeyExprType.Or */) {\n                    expr = expr.concat(e.expr);\n                    continue;\n                }\n                expr.push(e);\n            }\n            if (expr.length === 0 && hasFalse) {\n                return ContextKeyFalseExpr.INSTANCE;\n            }\n            expr.sort(cmp);\n        }\n        if (expr.length === 0) {\n            return undefined;\n        }\n        if (expr.length === 1) {\n            return expr[0];\n        }\n        // eliminate duplicate terms\n        for (let i = 1; i < expr.length; i++) {\n            if (expr[i - 1].equals(expr[i])) {\n                expr.splice(i, 1);\n                i--;\n            }\n        }\n        if (expr.length === 1) {\n            return expr[0];\n        }\n        // resolve true OR expressions\n        if (extraRedundantCheck) {\n            for (let i = 0; i < expr.length; i++) {\n                for (let j = i + 1; j < expr.length; j++) {\n                    if (expr[i].negate().equals(expr[j])) {\n                        // A || !A case\n                        return ContextKeyTrueExpr.INSTANCE;\n                    }\n                }\n            }\n            if (expr.length === 1) {\n                return expr[0];\n            }\n        }\n        return new ContextKeyOrExpr(expr, negated);\n    }\n    serialize() {\n        return this.expr.map(e => e.serialize()).join(' || ');\n    }\n    keys() {\n        const result = [];\n        for (const expr of this.expr) {\n            result.push(...expr.keys());\n        }\n        return result;\n    }\n    negate() {\n        if (!this.negated) {\n            const result = [];\n            for (const expr of this.expr) {\n                result.push(expr.negate());\n            }\n            // We don't support parens, so here we distribute the AND over the OR terminals\n            // We always take the first 2 AND pairs and distribute them\n            while (result.length > 1) {\n                const LEFT = result.shift();\n                const RIGHT = result.shift();\n                const all = [];\n                for (const left of getTerminals(LEFT)) {\n                    for (const right of getTerminals(RIGHT)) {\n                        all.push(ContextKeyAndExpr.create([left, right], null, false));\n                    }\n                }\n                result.unshift(ContextKeyOrExpr.create(all, null, false));\n            }\n            this.negated = ContextKeyOrExpr.create(result, this, true);\n        }\n        return this.negated;\n    }\n}\nclass RawContextKey extends ContextKeyDefinedExpr {\n    static { this._info = []; }\n    static all() {\n        return RawContextKey._info.values();\n    }\n    constructor(key, defaultValue, metaOrHide) {\n        super(key, null);\n        this._defaultValue = defaultValue;\n        // collect all context keys into a central place\n        if (typeof metaOrHide === 'object') {\n            RawContextKey._info.push({ ...metaOrHide, key });\n        }\n        else if (metaOrHide !== true) {\n            RawContextKey._info.push({ key, description: metaOrHide, type: defaultValue !== null && defaultValue !== undefined ? typeof defaultValue : undefined });\n        }\n    }\n    bindTo(target) {\n        return target.createKey(this.key, this._defaultValue);\n    }\n    getValue(target) {\n        return target.getContextKeyValue(this.key);\n    }\n    toNegated() {\n        return this.negate();\n    }\n    isEqualTo(value) {\n        return ContextKeyEqualsExpr.create(this.key, value);\n    }\n}\nconst IContextKeyService = createDecorator('contextKeyService');\nfunction cmp1(key1, key2) {\n    if (key1 < key2) {\n        return -1;\n    }\n    if (key1 > key2) {\n        return 1;\n    }\n    return 0;\n}\nfunction cmp2(key1, value1, key2, value2) {\n    if (key1 < key2) {\n        return -1;\n    }\n    if (key1 > key2) {\n        return 1;\n    }\n    if (value1 < value2) {\n        return -1;\n    }\n    if (value1 > value2) {\n        return 1;\n    }\n    return 0;\n}\n/**\n * Returns true if it is provable `p` implies `q`.\n */\nfunction implies(p, q) {\n    if (p.type === 0 /* ContextKeyExprType.False */ || q.type === 1 /* ContextKeyExprType.True */) {\n        // false implies anything\n        // anything implies true\n        return true;\n    }\n    if (p.type === 9 /* ContextKeyExprType.Or */) {\n        if (q.type === 9 /* ContextKeyExprType.Or */) {\n            // `a || b || c` can only imply something like `a || b || c || d`\n            return allElementsIncluded(p.expr, q.expr);\n        }\n        return false;\n    }\n    if (q.type === 9 /* ContextKeyExprType.Or */) {\n        for (const element of q.expr) {\n            if (implies(p, element)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    if (p.type === 6 /* ContextKeyExprType.And */) {\n        if (q.type === 6 /* ContextKeyExprType.And */) {\n            // `a && b && c` implies `a && c`\n            return allElementsIncluded(q.expr, p.expr);\n        }\n        for (const element of p.expr) {\n            if (implies(element, q)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    return p.equals(q);\n}\n/**\n * Returns true if all elements in `p` are also present in `q`.\n * The two arrays are assumed to be sorted\n */\nfunction allElementsIncluded(p, q) {\n    let pIndex = 0;\n    let qIndex = 0;\n    while (pIndex < p.length && qIndex < q.length) {\n        const cmp = p[pIndex].cmp(q[qIndex]);\n        if (cmp < 0) {\n            // an element from `p` is missing from `q`\n            return false;\n        }\n        else if (cmp === 0) {\n            pIndex++;\n            qIndex++;\n        }\n        else {\n            qIndex++;\n        }\n    }\n    return (pIndex === p.length);\n}\nfunction getTerminals(node) {\n    if (node.type === 9 /* ContextKeyExprType.Or */) {\n        return node.expr;\n    }\n    return [node];\n}\n\nexport { ContextKeyAndExpr, ContextKeyDefinedExpr, ContextKeyEqualsExpr, ContextKeyExpr, ContextKeyFalseExpr, ContextKeyGreaterEqualsExpr, ContextKeyGreaterExpr, ContextKeyInExpr, ContextKeyNotEqualsExpr, ContextKeyNotExpr, ContextKeyNotInExpr, ContextKeyNotRegexExpr, ContextKeyOrExpr, ContextKeyRegexExpr, ContextKeySmallerEqualsExpr, ContextKeySmallerExpr, ContextKeyTrueExpr, IContextKeyService, Parser, RawContextKey, expressionsAreEqualWithConstantSubstitution, implies };\n","import { ok } from '../../../base/common/assert.js';\nimport { isFunction, isString, isObject } from '../../../base/common/types.js';\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 *--------------------------------------------------------------------------------------------*/\nclass RegistryImpl {\n    constructor() {\n        this.data = new Map();\n    }\n    add(id, data) {\n        ok(isString(id));\n        ok(isObject(data));\n        ok(!this.data.has(id), 'There is already an extension with this id');\n        this.data.set(id, data);\n    }\n    as(id) {\n        return this.data.get(id) || null;\n    }\n    dispose() {\n        this.data.forEach((value) => {\n            if (isFunction(value.dispose)) {\n                value.dispose();\n            }\n        });\n        this.data.clear();\n    }\n}\nconst Registry = new RegistryImpl();\n\nexport { Registry };\n","import { decodeKeybinding } from '../../../base/common/keybindings.js';\nimport { OS } from '../../../base/common/platform.js';\nimport { CommandsRegistry } from '../../commands/common/commands.js';\nimport { Registry } from '../../registry/common/platform.js';\nimport { DisposableStore, combinedDisposable, toDisposable } from '../../../base/common/lifecycle.js';\nimport { LinkedList } from '../../../base/common/linkedList.js';\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/**\n * Stores all built-in and extension-provided keybindings (but not ones that user defines themselves)\n */\nclass KeybindingsRegistryImpl {\n    constructor() {\n        this._coreKeybindings = new LinkedList();\n        this._extensionKeybindings = [];\n        this._cachedMergedKeybindings = null;\n    }\n    /**\n     * Take current platform into account and reduce to primary & secondary.\n     */\n    static bindToCurrentPlatform(kb) {\n        if (OS === 1 /* OperatingSystem.Windows */) {\n            if (kb && kb.win) {\n                return kb.win;\n            }\n        }\n        else if (OS === 2 /* OperatingSystem.Macintosh */) {\n            if (kb && kb.mac) {\n                return kb.mac;\n            }\n        }\n        else {\n            if (kb && kb.linux) {\n                return kb.linux;\n            }\n        }\n        return kb;\n    }\n    registerKeybindingRule(rule) {\n        const actualKb = KeybindingsRegistryImpl.bindToCurrentPlatform(rule);\n        const result = new DisposableStore();\n        if (actualKb && actualKb.primary) {\n            const kk = decodeKeybinding(actualKb.primary, OS);\n            if (kk) {\n                result.add(this._registerDefaultKeybinding(kk, rule.id, rule.args, rule.weight, 0, rule.when));\n            }\n        }\n        if (actualKb && Array.isArray(actualKb.secondary)) {\n            for (let i = 0, len = actualKb.secondary.length; i < len; i++) {\n                const k = actualKb.secondary[i];\n                const kk = decodeKeybinding(k, OS);\n                if (kk) {\n                    result.add(this._registerDefaultKeybinding(kk, rule.id, rule.args, rule.weight, -i - 1, rule.when));\n                }\n            }\n        }\n        return result;\n    }\n    registerCommandAndKeybindingRule(desc) {\n        return combinedDisposable(this.registerKeybindingRule(desc), CommandsRegistry.registerCommand(desc));\n    }\n    _registerDefaultKeybinding(keybinding, commandId, commandArgs, weight1, weight2, when) {\n        const remove = this._coreKeybindings.push({\n            keybinding: keybinding,\n            command: commandId,\n            commandArgs: commandArgs,\n            when: when,\n            weight1: weight1,\n            weight2: weight2,\n            extensionId: null,\n            isBuiltinExtension: false\n        });\n        this._cachedMergedKeybindings = null;\n        return toDisposable(() => {\n            remove();\n            this._cachedMergedKeybindings = null;\n        });\n    }\n    getDefaultKeybindings() {\n        if (!this._cachedMergedKeybindings) {\n            this._cachedMergedKeybindings = Array.from(this._coreKeybindings).concat(this._extensionKeybindings);\n            this._cachedMergedKeybindings.sort(sorter);\n        }\n        return this._cachedMergedKeybindings.slice(0);\n    }\n}\nconst KeybindingsRegistry = new KeybindingsRegistryImpl();\n// Define extension point ids\nconst Extensions = {\n    EditorModes: 'platform.keybindingsRegistry'\n};\nRegistry.add(Extensions.EditorModes, KeybindingsRegistry);\nfunction sorter(a, b) {\n    if (a.weight1 !== b.weight1) {\n        return a.weight1 - b.weight1;\n    }\n    if (a.command && b.command) {\n        if (a.command < b.command) {\n            return -1;\n        }\n        if (a.command > b.command) {\n            return 1;\n        }\n    }\n    return a.weight2 - b.weight2;\n}\n\nexport { Extensions, KeybindingsRegistry };\n","import { SubmenuAction } from '../../../base/common/actions.js';\nimport { MicrotaskEmitter } from '../../../base/common/event.js';\nimport { markAsSingleton, toDisposable, DisposableStore, dispose } from '../../../base/common/lifecycle.js';\nimport { LinkedList } from '../../../base/common/linkedList.js';\nimport { ThemeIcon } from '../../../base/common/themables.js';\nimport { ICommandService, CommandsRegistry } from '../../commands/common/commands.js';\nimport { IContextKeyService, ContextKeyExpr } from '../../contextkey/common/contextkey.js';\nimport { createDecorator } from '../../instantiation/common/instantiation.js';\nimport { KeybindingsRegistry } from '../../keybinding/common/keybindingsRegistry.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar MenuItemAction_1;\nfunction isIMenuItem(item) {\n    return item.command !== undefined;\n}\nfunction isISubmenuItem(item) {\n    return item.submenu !== undefined;\n}\nclass MenuId {\n    static { this._instances = new Map(); }\n    static { this.CommandPalette = new MenuId('CommandPalette'); }\n    static { this.DebugBreakpointsContext = new MenuId('DebugBreakpointsContext'); }\n    static { this.DebugCallStackContext = new MenuId('DebugCallStackContext'); }\n    static { this.DebugConsoleContext = new MenuId('DebugConsoleContext'); }\n    static { this.DebugVariablesContext = new MenuId('DebugVariablesContext'); }\n    static { this.NotebookVariablesContext = new MenuId('NotebookVariablesContext'); }\n    static { this.DebugHoverContext = new MenuId('DebugHoverContext'); }\n    static { this.DebugWatchContext = new MenuId('DebugWatchContext'); }\n    static { this.DebugToolBar = new MenuId('DebugToolBar'); }\n    static { this.DebugToolBarStop = new MenuId('DebugToolBarStop'); }\n    static { this.DebugDisassemblyContext = new MenuId('DebugDisassemblyContext'); }\n    static { this.DebugCallStackToolbar = new MenuId('DebugCallStackToolbar'); }\n    static { this.DebugCreateConfiguration = new MenuId('DebugCreateConfiguration'); }\n    static { this.EditorContext = new MenuId('EditorContext'); }\n    static { this.SimpleEditorContext = new MenuId('SimpleEditorContext'); }\n    static { this.EditorContent = new MenuId('EditorContent'); }\n    static { this.EditorLineNumberContext = new MenuId('EditorLineNumberContext'); }\n    static { this.EditorContextCopy = new MenuId('EditorContextCopy'); }\n    static { this.EditorContextPeek = new MenuId('EditorContextPeek'); }\n    static { this.EditorContextShare = new MenuId('EditorContextShare'); }\n    static { this.EditorTitle = new MenuId('EditorTitle'); }\n    static { this.CompactWindowEditorTitle = new MenuId('CompactWindowEditorTitle'); }\n    static { this.EditorTitleRun = new MenuId('EditorTitleRun'); }\n    static { this.EditorTitleContext = new MenuId('EditorTitleContext'); }\n    static { this.EditorTitleContextShare = new MenuId('EditorTitleContextShare'); }\n    static { this.EmptyEditorGroup = new MenuId('EmptyEditorGroup'); }\n    static { this.EmptyEditorGroupContext = new MenuId('EmptyEditorGroupContext'); }\n    static { this.EditorTabsBarContext = new MenuId('EditorTabsBarContext'); }\n    static { this.EditorTabsBarShowTabsSubmenu = new MenuId('EditorTabsBarShowTabsSubmenu'); }\n    static { this.EditorTabsBarShowTabsZenModeSubmenu = new MenuId('EditorTabsBarShowTabsZenModeSubmenu'); }\n    static { this.EditorActionsPositionSubmenu = new MenuId('EditorActionsPositionSubmenu'); }\n    static { this.EditorSplitMoveSubmenu = new MenuId('EditorSplitMoveSubmenu'); }\n    static { this.ExplorerContext = new MenuId('ExplorerContext'); }\n    static { this.ExplorerContextShare = new MenuId('ExplorerContextShare'); }\n    static { this.ExtensionContext = new MenuId('ExtensionContext'); }\n    static { this.ExtensionEditorContextMenu = new MenuId('ExtensionEditorContextMenu'); }\n    static { this.GlobalActivity = new MenuId('GlobalActivity'); }\n    static { this.CommandCenter = new MenuId('CommandCenter'); }\n    static { this.CommandCenterCenter = new MenuId('CommandCenterCenter'); }\n    static { this.LayoutControlMenuSubmenu = new MenuId('LayoutControlMenuSubmenu'); }\n    static { this.LayoutControlMenu = new MenuId('LayoutControlMenu'); }\n    static { this.MenubarMainMenu = new MenuId('MenubarMainMenu'); }\n    static { this.MenubarAppearanceMenu = new MenuId('MenubarAppearanceMenu'); }\n    static { this.MenubarDebugMenu = new MenuId('MenubarDebugMenu'); }\n    static { this.MenubarEditMenu = new MenuId('MenubarEditMenu'); }\n    static { this.MenubarCopy = new MenuId('MenubarCopy'); }\n    static { this.MenubarFileMenu = new MenuId('MenubarFileMenu'); }\n    static { this.MenubarGoMenu = new MenuId('MenubarGoMenu'); }\n    static { this.MenubarHelpMenu = new MenuId('MenubarHelpMenu'); }\n    static { this.MenubarLayoutMenu = new MenuId('MenubarLayoutMenu'); }\n    static { this.MenubarNewBreakpointMenu = new MenuId('MenubarNewBreakpointMenu'); }\n    static { this.PanelAlignmentMenu = new MenuId('PanelAlignmentMenu'); }\n    static { this.PanelPositionMenu = new MenuId('PanelPositionMenu'); }\n    static { this.ActivityBarPositionMenu = new MenuId('ActivityBarPositionMenu'); }\n    static { this.MenubarPreferencesMenu = new MenuId('MenubarPreferencesMenu'); }\n    static { this.MenubarRecentMenu = new MenuId('MenubarRecentMenu'); }\n    static { this.MenubarSelectionMenu = new MenuId('MenubarSelectionMenu'); }\n    static { this.MenubarShare = new MenuId('MenubarShare'); }\n    static { this.MenubarSwitchEditorMenu = new MenuId('MenubarSwitchEditorMenu'); }\n    static { this.MenubarSwitchGroupMenu = new MenuId('MenubarSwitchGroupMenu'); }\n    static { this.MenubarTerminalMenu = new MenuId('MenubarTerminalMenu'); }\n    static { this.MenubarTerminalSuggestStatusMenu = new MenuId('MenubarTerminalSuggestStatusMenu'); }\n    static { this.MenubarViewMenu = new MenuId('MenubarViewMenu'); }\n    static { this.MenubarHomeMenu = new MenuId('MenubarHomeMenu'); }\n    static { this.OpenEditorsContext = new MenuId('OpenEditorsContext'); }\n    static { this.OpenEditorsContextShare = new MenuId('OpenEditorsContextShare'); }\n    static { this.ProblemsPanelContext = new MenuId('ProblemsPanelContext'); }\n    static { this.SCMInputBox = new MenuId('SCMInputBox'); }\n    static { this.SCMChangeContext = new MenuId('SCMChangeContext'); }\n    static { this.SCMResourceContext = new MenuId('SCMResourceContext'); }\n    static { this.SCMResourceContextShare = new MenuId('SCMResourceContextShare'); }\n    static { this.SCMResourceFolderContext = new MenuId('SCMResourceFolderContext'); }\n    static { this.SCMResourceGroupContext = new MenuId('SCMResourceGroupContext'); }\n    static { this.SCMSourceControl = new MenuId('SCMSourceControl'); }\n    static { this.SCMSourceControlInline = new MenuId('SCMSourceControlInline'); }\n    static { this.SCMSourceControlTitle = new MenuId('SCMSourceControlTitle'); }\n    static { this.SCMHistoryTitle = new MenuId('SCMHistoryTitle'); }\n    static { this.SCMHistoryItemContext = new MenuId('SCMHistoryItemContext'); }\n    static { this.SCMHistoryItemChangeContext = new MenuId('SCMHistoryItemChangeContext'); }\n    static { this.SCMHistoryItemRefContext = new MenuId('SCMHistoryItemRefContext'); }\n    static { this.SCMArtifactGroupContext = new MenuId('SCMArtifactGroupContext'); }\n    static { this.SCMArtifactContext = new MenuId('SCMArtifactContext'); }\n    static { this.SCMQuickDiffDecorations = new MenuId('SCMQuickDiffDecorations'); }\n    static { this.SCMTitle = new MenuId('SCMTitle'); }\n    static { this.SearchContext = new MenuId('SearchContext'); }\n    static { this.SearchActionMenu = new MenuId('SearchActionContext'); }\n    static { this.StatusBarWindowIndicatorMenu = new MenuId('StatusBarWindowIndicatorMenu'); }\n    static { this.StatusBarRemoteIndicatorMenu = new MenuId('StatusBarRemoteIndicatorMenu'); }\n    static { this.StickyScrollContext = new MenuId('StickyScrollContext'); }\n    static { this.TestItem = new MenuId('TestItem'); }\n    static { this.TestItemGutter = new MenuId('TestItemGutter'); }\n    static { this.TestProfilesContext = new MenuId('TestProfilesContext'); }\n    static { this.TestMessageContext = new MenuId('TestMessageContext'); }\n    static { this.TestMessageContent = new MenuId('TestMessageContent'); }\n    static { this.TestPeekElement = new MenuId('TestPeekElement'); }\n    static { this.TestPeekTitle = new MenuId('TestPeekTitle'); }\n    static { this.TestCallStack = new MenuId('TestCallStack'); }\n    static { this.TestCoverageFilterItem = new MenuId('TestCoverageFilterItem'); }\n    static { this.TouchBarContext = new MenuId('TouchBarContext'); }\n    static { this.TitleBar = new MenuId('TitleBar'); }\n    static { this.TitleBarContext = new MenuId('TitleBarContext'); }\n    static { this.TitleBarTitleContext = new MenuId('TitleBarTitleContext'); }\n    static { this.TunnelContext = new MenuId('TunnelContext'); }\n    static { this.TunnelPrivacy = new MenuId('TunnelPrivacy'); }\n    static { this.TunnelProtocol = new MenuId('TunnelProtocol'); }\n    static { this.TunnelPortInline = new MenuId('TunnelInline'); }\n    static { this.TunnelTitle = new MenuId('TunnelTitle'); }\n    static { this.TunnelLocalAddressInline = new MenuId('TunnelLocalAddressInline'); }\n    static { this.TunnelOriginInline = new MenuId('TunnelOriginInline'); }\n    static { this.ViewItemContext = new MenuId('ViewItemContext'); }\n    static { this.ViewContainerTitle = new MenuId('ViewContainerTitle'); }\n    static { this.ViewContainerTitleContext = new MenuId('ViewContainerTitleContext'); }\n    static { this.ViewTitle = new MenuId('ViewTitle'); }\n    static { this.ViewTitleContext = new MenuId('ViewTitleContext'); }\n    static { this.CommentEditorActions = new MenuId('CommentEditorActions'); }\n    static { this.CommentThreadTitle = new MenuId('CommentThreadTitle'); }\n    static { this.CommentThreadActions = new MenuId('CommentThreadActions'); }\n    static { this.CommentThreadAdditionalActions = new MenuId('CommentThreadAdditionalActions'); }\n    static { this.CommentThreadTitleContext = new MenuId('CommentThreadTitleContext'); }\n    static { this.CommentThreadCommentContext = new MenuId('CommentThreadCommentContext'); }\n    static { this.CommentTitle = new MenuId('CommentTitle'); }\n    static { this.CommentActions = new MenuId('CommentActions'); }\n    static { this.CommentsViewThreadActions = new MenuId('CommentsViewThreadActions'); }\n    static { this.InteractiveToolbar = new MenuId('InteractiveToolbar'); }\n    static { this.InteractiveCellTitle = new MenuId('InteractiveCellTitle'); }\n    static { this.InteractiveCellDelete = new MenuId('InteractiveCellDelete'); }\n    static { this.InteractiveCellExecute = new MenuId('InteractiveCellExecute'); }\n    static { this.InteractiveInputExecute = new MenuId('InteractiveInputExecute'); }\n    static { this.InteractiveInputConfig = new MenuId('InteractiveInputConfig'); }\n    static { this.ReplInputExecute = new MenuId('ReplInputExecute'); }\n    static { this.IssueReporter = new MenuId('IssueReporter'); }\n    static { this.NotebookToolbar = new MenuId('NotebookToolbar'); }\n    static { this.NotebookToolbarContext = new MenuId('NotebookToolbarContext'); }\n    static { this.NotebookStickyScrollContext = new MenuId('NotebookStickyScrollContext'); }\n    static { this.NotebookCellTitle = new MenuId('NotebookCellTitle'); }\n    static { this.NotebookCellDelete = new MenuId('NotebookCellDelete'); }\n    static { this.NotebookCellInsert = new MenuId('NotebookCellInsert'); }\n    static { this.NotebookCellBetween = new MenuId('NotebookCellBetween'); }\n    static { this.NotebookCellListTop = new MenuId('NotebookCellTop'); }\n    static { this.NotebookCellExecute = new MenuId('NotebookCellExecute'); }\n    static { this.NotebookCellExecuteGoTo = new MenuId('NotebookCellExecuteGoTo'); }\n    static { this.NotebookCellExecutePrimary = new MenuId('NotebookCellExecutePrimary'); }\n    static { this.NotebookDiffCellInputTitle = new MenuId('NotebookDiffCellInputTitle'); }\n    static { this.NotebookDiffDocumentMetadata = new MenuId('NotebookDiffDocumentMetadata'); }\n    static { this.NotebookDiffCellMetadataTitle = new MenuId('NotebookDiffCellMetadataTitle'); }\n    static { this.NotebookDiffCellOutputsTitle = new MenuId('NotebookDiffCellOutputsTitle'); }\n    static { this.NotebookOutputToolbar = new MenuId('NotebookOutputToolbar'); }\n    static { this.NotebookOutlineFilter = new MenuId('NotebookOutlineFilter'); }\n    static { this.NotebookOutlineActionMenu = new MenuId('NotebookOutlineActionMenu'); }\n    static { this.NotebookEditorLayoutConfigure = new MenuId('NotebookEditorLayoutConfigure'); }\n    static { this.NotebookKernelSource = new MenuId('NotebookKernelSource'); }\n    static { this.BulkEditTitle = new MenuId('BulkEditTitle'); }\n    static { this.BulkEditContext = new MenuId('BulkEditContext'); }\n    static { this.TimelineItemContext = new MenuId('TimelineItemContext'); }\n    static { this.TimelineTitle = new MenuId('TimelineTitle'); }\n    static { this.TimelineTitleContext = new MenuId('TimelineTitleContext'); }\n    static { this.TimelineFilterSubMenu = new MenuId('TimelineFilterSubMenu'); }\n    static { this.AccountsContext = new MenuId('AccountsContext'); }\n    static { this.SidebarTitle = new MenuId('SidebarTitle'); }\n    static { this.PanelTitle = new MenuId('PanelTitle'); }\n    static { this.AuxiliaryBarTitle = new MenuId('AuxiliaryBarTitle'); }\n    static { this.TerminalInstanceContext = new MenuId('TerminalInstanceContext'); }\n    static { this.TerminalEditorInstanceContext = new MenuId('TerminalEditorInstanceContext'); }\n    static { this.TerminalNewDropdownContext = new MenuId('TerminalNewDropdownContext'); }\n    static { this.TerminalTabContext = new MenuId('TerminalTabContext'); }\n    static { this.TerminalTabEmptyAreaContext = new MenuId('TerminalTabEmptyAreaContext'); }\n    static { this.TerminalStickyScrollContext = new MenuId('TerminalStickyScrollContext'); }\n    static { this.WebviewContext = new MenuId('WebviewContext'); }\n    static { this.InlineCompletionsActions = new MenuId('InlineCompletionsActions'); }\n    static { this.InlineEditsActions = new MenuId('InlineEditsActions'); }\n    static { this.NewFile = new MenuId('NewFile'); }\n    static { this.MergeInput1Toolbar = new MenuId('MergeToolbar1Toolbar'); }\n    static { this.MergeInput2Toolbar = new MenuId('MergeToolbar2Toolbar'); }\n    static { this.MergeBaseToolbar = new MenuId('MergeBaseToolbar'); }\n    static { this.MergeInputResultToolbar = new MenuId('MergeToolbarResultToolbar'); }\n    static { this.InlineSuggestionToolbar = new MenuId('InlineSuggestionToolbar'); }\n    static { this.InlineEditToolbar = new MenuId('InlineEditToolbar'); }\n    static { this.ChatContext = new MenuId('ChatContext'); }\n    static { this.ChatCodeBlock = new MenuId('ChatCodeblock'); }\n    static { this.ChatCompareBlock = new MenuId('ChatCompareBlock'); }\n    static { this.ChatMessageTitle = new MenuId('ChatMessageTitle'); }\n    static { this.ChatHistory = new MenuId('ChatHistory'); }\n    static { this.ChatWelcomeContext = new MenuId('ChatWelcomeContext'); }\n    static { this.ChatMessageFooter = new MenuId('ChatMessageFooter'); }\n    static { this.ChatExecute = new MenuId('ChatExecute'); }\n    static { this.ChatInput = new MenuId('ChatInput'); }\n    static { this.ChatInputSide = new MenuId('ChatInputSide'); }\n    static { this.ChatModePicker = new MenuId('ChatModePicker'); }\n    static { this.ChatEditingWidgetToolbar = new MenuId('ChatEditingWidgetToolbar'); }\n    static { this.ChatEditingEditorContent = new MenuId('ChatEditingEditorContent'); }\n    static { this.ChatEditingEditorHunk = new MenuId('ChatEditingEditorHunk'); }\n    static { this.ChatEditingDeletedNotebookCell = new MenuId('ChatEditingDeletedNotebookCell'); }\n    static { this.ChatInputAttachmentToolbar = new MenuId('ChatInputAttachmentToolbar'); }\n    static { this.ChatEditingWidgetModifiedFilesToolbar = new MenuId('ChatEditingWidgetModifiedFilesToolbar'); }\n    static { this.ChatInputResourceAttachmentContext = new MenuId('ChatInputResourceAttachmentContext'); }\n    static { this.ChatInputSymbolAttachmentContext = new MenuId('ChatInputSymbolAttachmentContext'); }\n    static { this.ChatInlineResourceAnchorContext = new MenuId('ChatInlineResourceAnchorContext'); }\n    static { this.ChatInlineSymbolAnchorContext = new MenuId('ChatInlineSymbolAnchorContext'); }\n    static { this.ChatMessageCheckpoint = new MenuId('ChatMessageCheckpoint'); }\n    static { this.ChatMessageRestoreCheckpoint = new MenuId('ChatMessageRestoreCheckpoint'); }\n    static { this.ChatNewMenu = new MenuId('ChatNewMenu'); }\n    static { this.ChatEditingCodeBlockContext = new MenuId('ChatEditingCodeBlockContext'); }\n    static { this.ChatTitleBarMenu = new MenuId('ChatTitleBarMenu'); }\n    static { this.ChatAttachmentsContext = new MenuId('ChatAttachmentsContext'); }\n    static { this.ChatToolOutputResourceToolbar = new MenuId('ChatToolOutputResourceToolbar'); }\n    static { this.ChatTextEditorMenu = new MenuId('ChatTextEditorMenu'); }\n    static { this.ChatToolOutputResourceContext = new MenuId('ChatToolOutputResourceContext'); }\n    static { this.ChatMultiDiffContext = new MenuId('ChatMultiDiffContext'); }\n    static { this.ChatSessionsMenu = new MenuId('ChatSessionsMenu'); }\n    static { this.ChatSessionsCreateSubMenu = new MenuId('ChatSessionsCreateSubMenu'); }\n    static { this.ChatConfirmationMenu = new MenuId('ChatConfirmationMenu'); }\n    static { this.ChatEditorInlineExecute = new MenuId('ChatEditorInputExecute'); }\n    static { this.ChatEditorInlineInputSide = new MenuId('ChatEditorInputSide'); }\n    static { this.AccessibleView = new MenuId('AccessibleView'); }\n    static { this.MultiDiffEditorFileToolbar = new MenuId('MultiDiffEditorFileToolbar'); }\n    static { this.DiffEditorHunkToolbar = new MenuId('DiffEditorHunkToolbar'); }\n    static { this.DiffEditorSelectionToolbar = new MenuId('DiffEditorSelectionToolbar'); }\n    /**\n     * Create a new `MenuId` with the unique identifier. Will throw if a menu\n     * with the identifier already exists, use `MenuId.for(ident)` or a unique\n     * identifier\n     */\n    constructor(identifier) {\n        if (MenuId._instances.has(identifier)) {\n            throw new TypeError(`MenuId with identifier '${identifier}' already exists. Use MenuId.for(ident) or a unique identifier`);\n        }\n        MenuId._instances.set(identifier, this);\n        this.id = identifier;\n    }\n}\nconst IMenuService = createDecorator('menuService');\nclass MenuRegistryChangeEvent {\n    static { this._all = new Map(); }\n    static for(id) {\n        let value = this._all.get(id);\n        if (!value) {\n            value = new MenuRegistryChangeEvent(id);\n            this._all.set(id, value);\n        }\n        return value;\n    }\n    static merge(events) {\n        const ids = new Set();\n        for (const item of events) {\n            if (item instanceof MenuRegistryChangeEvent) {\n                ids.add(item.id);\n            }\n        }\n        return ids;\n    }\n    constructor(id) {\n        this.id = id;\n        this.has = candidate => candidate === id;\n    }\n}\nconst MenuRegistry = new class {\n    constructor() {\n        this._commands = new Map();\n        this._menuItems = new Map();\n        this._onDidChangeMenu = new MicrotaskEmitter({\n            merge: MenuRegistryChangeEvent.merge\n        });\n        this.onDidChangeMenu = this._onDidChangeMenu.event;\n    }\n    addCommand(command) {\n        this._commands.set(command.id, command);\n        this._onDidChangeMenu.fire(MenuRegistryChangeEvent.for(MenuId.CommandPalette));\n        return markAsSingleton(toDisposable(() => {\n            if (this._commands.delete(command.id)) {\n                this._onDidChangeMenu.fire(MenuRegistryChangeEvent.for(MenuId.CommandPalette));\n            }\n        }));\n    }\n    getCommand(id) {\n        return this._commands.get(id);\n    }\n    getCommands() {\n        const map = new Map();\n        this._commands.forEach((value, key) => map.set(key, value));\n        return map;\n    }\n    appendMenuItem(id, item) {\n        let list = this._menuItems.get(id);\n        if (!list) {\n            list = new LinkedList();\n            this._menuItems.set(id, list);\n        }\n        const rm = list.push(item);\n        this._onDidChangeMenu.fire(MenuRegistryChangeEvent.for(id));\n        return markAsSingleton(toDisposable(() => {\n            rm();\n            this._onDidChangeMenu.fire(MenuRegistryChangeEvent.for(id));\n        }));\n    }\n    appendMenuItems(items) {\n        const result = new DisposableStore();\n        for (const { id, item } of items) {\n            result.add(this.appendMenuItem(id, item));\n        }\n        return result;\n    }\n    getMenuItems(id) {\n        let result;\n        if (this._menuItems.has(id)) {\n            result = [...this._menuItems.get(id)];\n        }\n        else {\n            result = [];\n        }\n        if (id === MenuId.CommandPalette) {\n            // CommandPalette is special because it shows\n            // all commands by default\n            this._appendImplicitItems(result);\n        }\n        return result;\n    }\n    _appendImplicitItems(result) {\n        const set = new Set();\n        for (const item of result) {\n            if (isIMenuItem(item)) {\n                set.add(item.command.id);\n                if (item.alt) {\n                    set.add(item.alt.id);\n                }\n            }\n        }\n        this._commands.forEach((command, id) => {\n            if (!set.has(id)) {\n                result.push({ command });\n            }\n        });\n    }\n};\nclass SubmenuItemAction extends SubmenuAction {\n    constructor(item, hideActions, actions) {\n        super(`submenuitem.${item.submenu.id}`, typeof item.title === 'string' ? item.title : item.title.value, actions, 'submenu');\n        this.item = item;\n        this.hideActions = hideActions;\n    }\n}\n// implements IAction, does NOT extend Action, so that no one\n// subscribes to events of Action or modified properties\nlet MenuItemAction = MenuItemAction_1 = class MenuItemAction {\n    static label(action, options) {\n        return options?.renderShortTitle && action.shortTitle\n            ? (typeof action.shortTitle === 'string' ? action.shortTitle : action.shortTitle.value)\n            : (typeof action.title === 'string' ? action.title : action.title.value);\n    }\n    constructor(item, alt, options, hideActions, menuKeybinding, contextKeyService, _commandService) {\n        this.hideActions = hideActions;\n        this.menuKeybinding = menuKeybinding;\n        this._commandService = _commandService;\n        this.id = item.id;\n        this.label = MenuItemAction_1.label(item, options);\n        this.tooltip = (typeof item.tooltip === 'string' ? item.tooltip : item.tooltip?.value) ?? '';\n        this.enabled = !item.precondition || contextKeyService.contextMatchesRules(item.precondition);\n        this.checked = undefined;\n        let icon;\n        if (item.toggled) {\n            const toggled = (item.toggled.condition ? item.toggled : { condition: item.toggled });\n            this.checked = contextKeyService.contextMatchesRules(toggled.condition);\n            if (this.checked && toggled.tooltip) {\n                this.tooltip = typeof toggled.tooltip === 'string' ? toggled.tooltip : toggled.tooltip.value;\n            }\n            if (this.checked && ThemeIcon.isThemeIcon(toggled.icon)) {\n                icon = toggled.icon;\n            }\n            if (this.checked && toggled.title) {\n                this.label = typeof toggled.title === 'string' ? toggled.title : toggled.title.value;\n            }\n        }\n        if (!icon) {\n            icon = ThemeIcon.isThemeIcon(item.icon) ? item.icon : undefined;\n        }\n        this.item = item;\n        this.alt = alt ? new MenuItemAction_1(alt, undefined, options, hideActions, undefined, contextKeyService, _commandService) : undefined;\n        this._options = options;\n        this.class = icon && ThemeIcon.asClassName(icon);\n    }\n    run(...args) {\n        let runArgs = [];\n        if (this._options?.arg) {\n            runArgs = [...runArgs, this._options.arg];\n        }\n        if (this._options?.shouldForwardArgs) {\n            runArgs = [...runArgs, ...args];\n        }\n        return this._commandService.executeCommand(this.id, ...runArgs);\n    }\n};\nMenuItemAction = MenuItemAction_1 = __decorate([\n    __param(5, IContextKeyService),\n    __param(6, ICommandService)\n], MenuItemAction);\nclass Action2 {\n    constructor(desc) {\n        this.desc = desc;\n    }\n}\nfunction registerAction2(ctor) {\n    const disposables = []; // not using `DisposableStore` to reduce startup perf cost\n    const action = new ctor();\n    const { f1, menu, keybinding, ...command } = action.desc;\n    if (CommandsRegistry.getCommand(command.id)) {\n        throw new Error(`Cannot register two commands with the same id: ${command.id}`);\n    }\n    // command\n    disposables.push(CommandsRegistry.registerCommand({\n        id: command.id,\n        handler: (accessor, ...args) => action.run(accessor, ...args),\n        metadata: command.metadata ?? { description: action.desc.title }\n    }));\n    // menu\n    if (Array.isArray(menu)) {\n        for (const item of menu) {\n            disposables.push(MenuRegistry.appendMenuItem(item.id, { command: { ...command, precondition: item.precondition === null ? undefined : command.precondition }, ...item }));\n        }\n    }\n    else if (menu) {\n        disposables.push(MenuRegistry.appendMenuItem(menu.id, { command: { ...command, precondition: menu.precondition === null ? undefined : command.precondition }, ...menu }));\n    }\n    if (f1) {\n        disposables.push(MenuRegistry.appendMenuItem(MenuId.CommandPalette, { command, when: command.precondition }));\n        disposables.push(MenuRegistry.addCommand(command));\n    }\n    // keybinding\n    if (Array.isArray(keybinding)) {\n        for (const item of keybinding) {\n            disposables.push(KeybindingsRegistry.registerKeybindingRule({\n                ...item,\n                id: command.id,\n                when: command.precondition ? ContextKeyExpr.and(command.precondition, item.when) : item.when\n            }));\n        }\n    }\n    else if (keybinding) {\n        disposables.push(KeybindingsRegistry.registerKeybindingRule({\n            ...keybinding,\n            id: command.id,\n            when: command.precondition ? ContextKeyExpr.and(command.precondition, keybinding.when) : keybinding.when\n        }));\n    }\n    return {\n        dispose() {\n            dispose(disposables);\n        }\n    };\n}\n//#endregion\n\nexport { Action2, IMenuService, MenuId, MenuItemAction, MenuRegistry, SubmenuItemAction, isIMenuItem, isISubmenuItem, registerAction2 };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst ITelemetryService = createDecorator('telemetryService');\n\nexport { ITelemetryService };\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 *--------------------------------------------------------------------------------------------*/\nvar _a, _b, _c;\nclass ResourceMapEntry {\n    constructor(uri, value) {\n        this.uri = uri;\n        this.value = value;\n    }\n}\nfunction isEntries(arg) {\n    return Array.isArray(arg);\n}\nclass ResourceMap {\n    static { this.defaultToKey = (resource) => resource.toString(); }\n    constructor(arg, toKey) {\n        this[_a] = 'ResourceMap';\n        if (arg instanceof ResourceMap) {\n            this.map = new Map(arg.map);\n            this.toKey = toKey ?? ResourceMap.defaultToKey;\n        }\n        else if (isEntries(arg)) {\n            this.map = new Map();\n            this.toKey = toKey ?? ResourceMap.defaultToKey;\n            for (const [resource, value] of arg) {\n                this.set(resource, value);\n            }\n        }\n        else {\n            this.map = new Map();\n            this.toKey = arg ?? ResourceMap.defaultToKey;\n        }\n    }\n    set(resource, value) {\n        this.map.set(this.toKey(resource), new ResourceMapEntry(resource, value));\n        return this;\n    }\n    get(resource) {\n        return this.map.get(this.toKey(resource))?.value;\n    }\n    has(resource) {\n        return this.map.has(this.toKey(resource));\n    }\n    get size() {\n        return this.map.size;\n    }\n    clear() {\n        this.map.clear();\n    }\n    delete(resource) {\n        return this.map.delete(this.toKey(resource));\n    }\n    forEach(clb, thisArg) {\n        if (typeof thisArg !== 'undefined') {\n            clb = clb.bind(thisArg);\n        }\n        for (const [_, entry] of this.map) {\n            clb(entry.value, entry.uri, this);\n        }\n    }\n    *values() {\n        for (const entry of this.map.values()) {\n            yield entry.value;\n        }\n    }\n    *keys() {\n        for (const entry of this.map.values()) {\n            yield entry.uri;\n        }\n    }\n    *entries() {\n        for (const entry of this.map.values()) {\n            yield [entry.uri, entry.value];\n        }\n    }\n    *[(_a = Symbol.toStringTag, Symbol.iterator)]() {\n        for (const [, entry] of this.map) {\n            yield [entry.uri, entry.value];\n        }\n    }\n}\nclass ResourceSet {\n    constructor(entriesOrKey, toKey) {\n        this[_b] = 'ResourceSet';\n        if (!entriesOrKey || typeof entriesOrKey === 'function') {\n            this._map = new ResourceMap(entriesOrKey);\n        }\n        else {\n            this._map = new ResourceMap(toKey);\n            entriesOrKey.forEach(this.add, this);\n        }\n    }\n    get size() {\n        return this._map.size;\n    }\n    add(value) {\n        this._map.set(value, value);\n        return this;\n    }\n    clear() {\n        this._map.clear();\n    }\n    delete(value) {\n        return this._map.delete(value);\n    }\n    forEach(callbackfn, thisArg) {\n        this._map.forEach((_value, key) => callbackfn.call(thisArg, key, key, this));\n    }\n    has(value) {\n        return this._map.has(value);\n    }\n    entries() {\n        return this._map.entries();\n    }\n    keys() {\n        return this._map.keys();\n    }\n    values() {\n        return this._map.keys();\n    }\n    [(_b = Symbol.toStringTag, Symbol.iterator)]() {\n        return this.keys();\n    }\n}\nclass LinkedMap {\n    constructor() {\n        this[_c] = 'LinkedMap';\n        this._map = new Map();\n        this._head = undefined;\n        this._tail = undefined;\n        this._size = 0;\n        this._state = 0;\n    }\n    clear() {\n        this._map.clear();\n        this._head = undefined;\n        this._tail = undefined;\n        this._size = 0;\n        this._state++;\n    }\n    isEmpty() {\n        return !this._head && !this._tail;\n    }\n    get size() {\n        return this._size;\n    }\n    get first() {\n        return this._head?.value;\n    }\n    get last() {\n        return this._tail?.value;\n    }\n    has(key) {\n        return this._map.has(key);\n    }\n    get(key, touch = 0 /* Touch.None */) {\n        const item = this._map.get(key);\n        if (!item) {\n            return undefined;\n        }\n        if (touch !== 0 /* Touch.None */) {\n            this.touch(item, touch);\n        }\n        return item.value;\n    }\n    set(key, value, touch = 0 /* Touch.None */) {\n        let item = this._map.get(key);\n        if (item) {\n            item.value = value;\n            if (touch !== 0 /* Touch.None */) {\n                this.touch(item, touch);\n            }\n        }\n        else {\n            item = { key, value, next: undefined, previous: undefined };\n            switch (touch) {\n                case 0 /* Touch.None */:\n                    this.addItemLast(item);\n                    break;\n                case 1 /* Touch.AsOld */:\n                    this.addItemFirst(item);\n                    break;\n                case 2 /* Touch.AsNew */:\n                    this.addItemLast(item);\n                    break;\n                default:\n                    this.addItemLast(item);\n                    break;\n            }\n            this._map.set(key, item);\n            this._size++;\n        }\n        return this;\n    }\n    delete(key) {\n        return !!this.remove(key);\n    }\n    remove(key) {\n        const item = this._map.get(key);\n        if (!item) {\n            return undefined;\n        }\n        this._map.delete(key);\n        this.removeItem(item);\n        this._size--;\n        return item.value;\n    }\n    shift() {\n        if (!this._head && !this._tail) {\n            return undefined;\n        }\n        if (!this._head || !this._tail) {\n            throw new Error('Invalid list');\n        }\n        const item = this._head;\n        this._map.delete(item.key);\n        this.removeItem(item);\n        this._size--;\n        return item.value;\n    }\n    forEach(callbackfn, thisArg) {\n        const state = this._state;\n        let current = this._head;\n        while (current) {\n            if (thisArg) {\n                callbackfn.bind(thisArg)(current.value, current.key, this);\n            }\n            else {\n                callbackfn(current.value, current.key, this);\n            }\n            if (this._state !== state) {\n                throw new Error(`LinkedMap got modified during iteration.`);\n            }\n            current = current.next;\n        }\n    }\n    keys() {\n        const map = this;\n        const state = this._state;\n        let current = this._head;\n        const iterator = {\n            [Symbol.iterator]() {\n                return iterator;\n            },\n            next() {\n                if (map._state !== state) {\n                    throw new Error(`LinkedMap got modified during iteration.`);\n                }\n                if (current) {\n                    const result = { value: current.key, done: false };\n                    current = current.next;\n                    return result;\n                }\n                else {\n                    return { value: undefined, done: true };\n                }\n            }\n        };\n        return iterator;\n    }\n    values() {\n        const map = this;\n        const state = this._state;\n        let current = this._head;\n        const iterator = {\n            [Symbol.iterator]() {\n                return iterator;\n            },\n            next() {\n                if (map._state !== state) {\n                    throw new Error(`LinkedMap got modified during iteration.`);\n                }\n                if (current) {\n                    const result = { value: current.value, done: false };\n                    current = current.next;\n                    return result;\n                }\n                else {\n                    return { value: undefined, done: true };\n                }\n            }\n        };\n        return iterator;\n    }\n    entries() {\n        const map = this;\n        const state = this._state;\n        let current = this._head;\n        const iterator = {\n            [Symbol.iterator]() {\n                return iterator;\n            },\n            next() {\n                if (map._state !== state) {\n                    throw new Error(`LinkedMap got modified during iteration.`);\n                }\n                if (current) {\n                    const result = { value: [current.key, current.value], done: false };\n                    current = current.next;\n                    return result;\n                }\n                else {\n                    return { value: undefined, done: true };\n                }\n            }\n        };\n        return iterator;\n    }\n    [(_c = Symbol.toStringTag, Symbol.iterator)]() {\n        return this.entries();\n    }\n    trimOld(newSize) {\n        if (newSize >= this.size) {\n            return;\n        }\n        if (newSize === 0) {\n            this.clear();\n            return;\n        }\n        let current = this._head;\n        let currentSize = this.size;\n        while (current && currentSize > newSize) {\n            this._map.delete(current.key);\n            current = current.next;\n            currentSize--;\n        }\n        this._head = current;\n        this._size = currentSize;\n        if (current) {\n            current.previous = undefined;\n        }\n        this._state++;\n    }\n    trimNew(newSize) {\n        if (newSize >= this.size) {\n            return;\n        }\n        if (newSize === 0) {\n            this.clear();\n            return;\n        }\n        let current = this._tail;\n        let currentSize = this.size;\n        while (current && currentSize > newSize) {\n            this._map.delete(current.key);\n            current = current.previous;\n            currentSize--;\n        }\n        this._tail = current;\n        this._size = currentSize;\n        if (current) {\n            current.next = undefined;\n        }\n        this._state++;\n    }\n    addItemFirst(item) {\n        // First time Insert\n        if (!this._head && !this._tail) {\n            this._tail = item;\n        }\n        else if (!this._head) {\n            throw new Error('Invalid list');\n        }\n        else {\n            item.next = this._head;\n            this._head.previous = item;\n        }\n        this._head = item;\n        this._state++;\n    }\n    addItemLast(item) {\n        // First time Insert\n        if (!this._head && !this._tail) {\n            this._head = item;\n        }\n        else if (!this._tail) {\n            throw new Error('Invalid list');\n        }\n        else {\n            item.previous = this._tail;\n            this._tail.next = item;\n        }\n        this._tail = item;\n        this._state++;\n    }\n    removeItem(item) {\n        if (item === this._head && item === this._tail) {\n            this._head = undefined;\n            this._tail = undefined;\n        }\n        else if (item === this._head) {\n            // This can only happen if size === 1 which is handled\n            // by the case above.\n            if (!item.next) {\n                throw new Error('Invalid list');\n            }\n            item.next.previous = undefined;\n            this._head = item.next;\n        }\n        else if (item === this._tail) {\n            // This can only happen if size === 1 which is handled\n            // by the case above.\n            if (!item.previous) {\n                throw new Error('Invalid list');\n            }\n            item.previous.next = undefined;\n            this._tail = item.previous;\n        }\n        else {\n            const next = item.next;\n            const previous = item.previous;\n            if (!next || !previous) {\n                throw new Error('Invalid list');\n            }\n            next.previous = previous;\n            previous.next = next;\n        }\n        item.next = undefined;\n        item.previous = undefined;\n        this._state++;\n    }\n    touch(item, touch) {\n        if (!this._head || !this._tail) {\n            throw new Error('Invalid list');\n        }\n        if ((touch !== 1 /* Touch.AsOld */ && touch !== 2 /* Touch.AsNew */)) {\n            return;\n        }\n        if (touch === 1 /* Touch.AsOld */) {\n            if (item === this._head) {\n                return;\n            }\n            const next = item.next;\n            const previous = item.previous;\n            // Unlink the item\n            if (item === this._tail) {\n                // previous must be defined since item was not head but is tail\n                // So there are more than on item in the map\n                previous.next = undefined;\n                this._tail = previous;\n            }\n            else {\n                // Both next and previous are not undefined since item was neither head nor tail.\n                next.previous = previous;\n                previous.next = next;\n            }\n            // Insert the node at head\n            item.previous = undefined;\n            item.next = this._head;\n            this._head.previous = item;\n            this._head = item;\n            this._state++;\n        }\n        else if (touch === 2 /* Touch.AsNew */) {\n            if (item === this._tail) {\n                return;\n            }\n            const next = item.next;\n            const previous = item.previous;\n            // Unlink the item.\n            if (item === this._head) {\n                // next must be defined since item was not tail but is head\n                // So there are more than on item in the map\n                next.previous = undefined;\n                this._head = next;\n            }\n            else {\n                // Both next and previous are not undefined since item was neither head nor tail.\n                next.previous = previous;\n                previous.next = next;\n            }\n            item.next = undefined;\n            item.previous = this._tail;\n            this._tail.next = item;\n            this._tail = item;\n            this._state++;\n        }\n    }\n    toJSON() {\n        const data = [];\n        this.forEach((value, key) => {\n            data.push([key, value]);\n        });\n        return data;\n    }\n    fromJSON(data) {\n        this.clear();\n        for (const [key, value] of data) {\n            this.set(key, value);\n        }\n    }\n}\nclass Cache extends LinkedMap {\n    constructor(limit, ratio = 1) {\n        super();\n        this._limit = limit;\n        this._ratio = Math.min(Math.max(0, ratio), 1);\n    }\n    get limit() {\n        return this._limit;\n    }\n    set limit(limit) {\n        this._limit = limit;\n        this.checkTrim();\n    }\n    get(key, touch = 2 /* Touch.AsNew */) {\n        return super.get(key, touch);\n    }\n    peek(key) {\n        return super.get(key, 0 /* Touch.None */);\n    }\n    set(key, value) {\n        super.set(key, value, 2 /* Touch.AsNew */);\n        return this;\n    }\n    checkTrim() {\n        if (this.size > this._limit) {\n            this.trim(Math.round(this._limit * this._ratio));\n        }\n    }\n}\nclass LRUCache extends Cache {\n    constructor(limit, ratio = 1) {\n        super(limit, ratio);\n    }\n    trim(newSize) {\n        this.trimOld(newSize);\n    }\n    set(key, value) {\n        super.set(key, value);\n        this.checkTrim();\n        return this;\n    }\n}\n/**\n * A map that allows access both by keys and values.\n * **NOTE**: values need to be unique.\n */\nclass BidirectionalMap {\n    constructor(entries) {\n        this._m1 = new Map();\n        this._m2 = new Map();\n        if (entries) {\n            for (const [key, value] of entries) {\n                this.set(key, value);\n            }\n        }\n    }\n    clear() {\n        this._m1.clear();\n        this._m2.clear();\n    }\n    set(key, value) {\n        this._m1.set(key, value);\n        this._m2.set(value, key);\n    }\n    get(key) {\n        return this._m1.get(key);\n    }\n    getKey(value) {\n        return this._m2.get(value);\n    }\n    delete(key) {\n        const value = this._m1.get(key);\n        if (value === undefined) {\n            return false;\n        }\n        this._m1.delete(key);\n        this._m2.delete(value);\n        return true;\n    }\n    keys() {\n        return this._m1.keys();\n    }\n    values() {\n        return this._m1.values();\n    }\n}\nclass SetMap {\n    constructor() {\n        this.map = new Map();\n    }\n    add(key, value) {\n        let values = this.map.get(key);\n        if (!values) {\n            values = new Set();\n            this.map.set(key, values);\n        }\n        values.add(value);\n    }\n    delete(key, value) {\n        const values = this.map.get(key);\n        if (!values) {\n            return;\n        }\n        values.delete(value);\n        if (values.size === 0) {\n            this.map.delete(key);\n        }\n    }\n    forEach(key, fn) {\n        const values = this.map.get(key);\n        if (!values) {\n            return;\n        }\n        values.forEach(fn);\n    }\n}\n/**\n * A map that is addressable with an arbitrary number of keys. This is useful in high performance\n * scenarios where creating a composite key whenever the data is accessed is too expensive. For\n * example for a very hot function, constructing a string like `first-second-third` for every call\n * will cause a significant hit to performance.\n */\nclass NKeyMap {\n    constructor() {\n        this._data = new Map();\n    }\n    /**\n     * Sets a value on the map. Note that unlike a standard `Map`, the first argument is the value.\n     * This is because the spread operator is used for the keys and must be last..\n     * @param value The value to set.\n     * @param keys The keys for the value.\n     */\n    set(value, ...keys) {\n        let currentMap = this._data;\n        for (let i = 0; i < keys.length - 1; i++) {\n            if (!currentMap.has(keys[i])) {\n                currentMap.set(keys[i], new Map());\n            }\n            currentMap = currentMap.get(keys[i]);\n        }\n        currentMap.set(keys[keys.length - 1], value);\n    }\n    get(...keys) {\n        let currentMap = this._data;\n        for (let i = 0; i < keys.length - 1; i++) {\n            if (!currentMap.has(keys[i])) {\n                return undefined;\n            }\n            currentMap = currentMap.get(keys[i]);\n        }\n        return currentMap.get(keys[keys.length - 1]);\n    }\n    clear() {\n        this._data.clear();\n    }\n    /**\n     * Get a textual representation of the map for debugging purposes.\n     */\n    toString() {\n        const printMap = (map, depth) => {\n            let result = '';\n            for (const [key, value] of map) {\n                result += `${'  '.repeat(depth)}${key}: `;\n                if (value instanceof Map) {\n                    result += '\\n' + printMap(value, depth + 1);\n                }\n                else {\n                    result += `${value}\\n`;\n                }\n            }\n            return result;\n        };\n        return printMap(this._data, 0);\n    }\n}\n\nexport { BidirectionalMap, LRUCache, LinkedMap, NKeyMap, ResourceMap, ResourceSet, SetMap };\n","import { sep, posix } from './path.js';\nimport { isWindows } from './platform.js';\nimport { startsWithIgnoreCase } from './strings.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction isPathSeparator(code) {\n    return code === 47 /* CharCode.Slash */ || code === 92 /* CharCode.Backslash */;\n}\n/**\n * Takes a Windows OS path and changes backward slashes to forward slashes.\n * This should only be done for OS paths from Windows (or user provided paths potentially from Windows).\n * Using it on a Linux or MaxOS path might change it.\n */\nfunction toSlashes(osPath) {\n    return osPath.replace(/[\\\\/]/g, posix.sep);\n}\n/**\n * Takes a Windows OS path (using backward or forward slashes) and turns it into a posix path:\n * - turns backward slashes into forward slashes\n * - makes it absolute if it starts with a drive letter\n * This should only be done for OS paths from Windows (or user provided paths potentially from Windows).\n * Using it on a Linux or MaxOS path might change it.\n */\nfunction toPosixPath(osPath) {\n    if (osPath.indexOf('/') === -1) {\n        osPath = toSlashes(osPath);\n    }\n    if (/^[a-zA-Z]:(\\/|$)/.test(osPath)) { // starts with a drive letter\n        osPath = '/' + osPath;\n    }\n    return osPath;\n}\n/**\n * Computes the _root_ this path, like `getRoot('c:\\files') === c:\\`,\n * `getRoot('files:///files/path') === files:///`,\n * or `getRoot('\\\\server\\shares\\path') === \\\\server\\shares\\`\n */\nfunction getRoot(path, sep = posix.sep) {\n    if (!path) {\n        return '';\n    }\n    const len = path.length;\n    const firstLetter = path.charCodeAt(0);\n    if (isPathSeparator(firstLetter)) {\n        if (isPathSeparator(path.charCodeAt(1))) {\n            // UNC candidate \\\\localhost\\shares\\ddd\n            //               ^^^^^^^^^^^^^^^^^^^\n            if (!isPathSeparator(path.charCodeAt(2))) {\n                let pos = 3;\n                const start = pos;\n                for (; pos < len; pos++) {\n                    if (isPathSeparator(path.charCodeAt(pos))) {\n                        break;\n                    }\n                }\n                if (start !== pos && !isPathSeparator(path.charCodeAt(pos + 1))) {\n                    pos += 1;\n                    for (; pos < len; pos++) {\n                        if (isPathSeparator(path.charCodeAt(pos))) {\n                            return path.slice(0, pos + 1) // consume this separator\n                                .replace(/[\\\\/]/g, sep);\n                        }\n                    }\n                }\n            }\n        }\n        // /user/far\n        // ^\n        return sep;\n    }\n    else if (isWindowsDriveLetter(firstLetter)) {\n        // check for windows drive letter c:\\ or c:\n        if (path.charCodeAt(1) === 58 /* CharCode.Colon */) {\n            if (isPathSeparator(path.charCodeAt(2))) {\n                // C:\\fff\n                // ^^^\n                return path.slice(0, 2) + sep;\n            }\n            else {\n                // C:\n                // ^^\n                return path.slice(0, 2);\n            }\n        }\n    }\n    // check for URI\n    // scheme://authority/path\n    // ^^^^^^^^^^^^^^^^^^^\n    let pos = path.indexOf('://');\n    if (pos !== -1) {\n        pos += 3; // 3 -> \"://\".length\n        for (; pos < len; pos++) {\n            if (isPathSeparator(path.charCodeAt(pos))) {\n                return path.slice(0, pos + 1); // consume this separator\n            }\n        }\n    }\n    return '';\n}\n/**\n * @deprecated please use `IUriIdentityService.extUri.isEqualOrParent` instead. If\n * you are in a context without services, consider to pass down the `extUri` from the\n * outside, or use `extUriBiasedIgnorePathCase` if you know what you are doing.\n */\nfunction isEqualOrParent(base, parentCandidate, ignoreCase, separator = sep) {\n    if (base === parentCandidate) {\n        return true;\n    }\n    if (!base || !parentCandidate) {\n        return false;\n    }\n    if (parentCandidate.length > base.length) {\n        return false;\n    }\n    if (ignoreCase) {\n        const beginsWith = startsWithIgnoreCase(base, parentCandidate);\n        if (!beginsWith) {\n            return false;\n        }\n        if (parentCandidate.length === base.length) {\n            return true; // same path, different casing\n        }\n        let sepOffset = parentCandidate.length;\n        if (parentCandidate.charAt(parentCandidate.length - 1) === separator) {\n            sepOffset--; // adjust the expected sep offset in case our candidate already ends in separator character\n        }\n        return base.charAt(sepOffset) === separator;\n    }\n    if (parentCandidate.charAt(parentCandidate.length - 1) !== separator) {\n        parentCandidate += separator;\n    }\n    return base.indexOf(parentCandidate) === 0;\n}\nfunction isWindowsDriveLetter(char0) {\n    return char0 >= 65 /* CharCode.A */ && char0 <= 90 /* CharCode.Z */ || char0 >= 97 /* CharCode.a */ && char0 <= 122 /* CharCode.z */;\n}\nfunction hasDriveLetter(path, isWindowsOS = isWindows) {\n    if (isWindowsOS) {\n        return isWindowsDriveLetter(path.charCodeAt(0)) && path.charCodeAt(1) === 58 /* CharCode.Colon */;\n    }\n    return false;\n}\n\nexport { getRoot, hasDriveLetter, isEqualOrParent, isPathSeparator, isWindowsDriveLetter, toPosixPath, toSlashes };\n","import { isEqualOrParent, toSlashes, toPosixPath, getRoot } from './extpath.js';\nimport { Schemas } from './network.js';\nimport { posix, dirname as dirname$1, normalize, relative, resolve, sep } from './path.js';\nimport { isWindows } from './platform.js';\nimport { compare, equalsIgnoreCase } from './strings.js';\nimport { URI, uriToFsPath } from './uri.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction originalFSPath(uri) {\n    return uriToFsPath(uri, true);\n}\nclass ExtUri {\n    constructor(_ignorePathCasing) {\n        this._ignorePathCasing = _ignorePathCasing;\n    }\n    compare(uri1, uri2, ignoreFragment = false) {\n        if (uri1 === uri2) {\n            return 0;\n        }\n        return compare(this.getComparisonKey(uri1, ignoreFragment), this.getComparisonKey(uri2, ignoreFragment));\n    }\n    isEqual(uri1, uri2, ignoreFragment = false) {\n        if (uri1 === uri2) {\n            return true;\n        }\n        if (!uri1 || !uri2) {\n            return false;\n        }\n        return this.getComparisonKey(uri1, ignoreFragment) === this.getComparisonKey(uri2, ignoreFragment);\n    }\n    getComparisonKey(uri, ignoreFragment = false) {\n        return uri.with({\n            path: this._ignorePathCasing(uri) ? uri.path.toLowerCase() : undefined,\n            fragment: ignoreFragment ? null : undefined\n        }).toString();\n    }\n    isEqualOrParent(base, parentCandidate, ignoreFragment = false) {\n        if (base.scheme === parentCandidate.scheme) {\n            if (base.scheme === Schemas.file) {\n                return isEqualOrParent(originalFSPath(base), originalFSPath(parentCandidate), this._ignorePathCasing(base)) && base.query === parentCandidate.query && (ignoreFragment || base.fragment === parentCandidate.fragment);\n            }\n            if (isEqualAuthority(base.authority, parentCandidate.authority)) {\n                return isEqualOrParent(base.path, parentCandidate.path, this._ignorePathCasing(base), '/') && base.query === parentCandidate.query && (ignoreFragment || base.fragment === parentCandidate.fragment);\n            }\n        }\n        return false;\n    }\n    // --- path math\n    joinPath(resource, ...pathFragment) {\n        return URI.joinPath(resource, ...pathFragment);\n    }\n    basenameOrAuthority(resource) {\n        return basename(resource) || resource.authority;\n    }\n    basename(resource) {\n        return posix.basename(resource.path);\n    }\n    extname(resource) {\n        return posix.extname(resource.path);\n    }\n    dirname(resource) {\n        if (resource.path.length === 0) {\n            return resource;\n        }\n        let dirname;\n        if (resource.scheme === Schemas.file) {\n            dirname = URI.file(dirname$1(originalFSPath(resource))).path;\n        }\n        else {\n            dirname = posix.dirname(resource.path);\n            if (resource.authority && dirname.length && dirname.charCodeAt(0) !== 47 /* CharCode.Slash */) {\n                console.error(`dirname(\"${resource.toString})) resulted in a relative path`);\n                dirname = '/'; // If a URI contains an authority component, then the path component must either be empty or begin with a CharCode.Slash (\"/\") character\n            }\n        }\n        return resource.with({\n            path: dirname\n        });\n    }\n    normalizePath(resource) {\n        if (!resource.path.length) {\n            return resource;\n        }\n        let normalizedPath;\n        if (resource.scheme === Schemas.file) {\n            normalizedPath = URI.file(normalize(originalFSPath(resource))).path;\n        }\n        else {\n            normalizedPath = posix.normalize(resource.path);\n        }\n        return resource.with({\n            path: normalizedPath\n        });\n    }\n    relativePath(from, to) {\n        if (from.scheme !== to.scheme || !isEqualAuthority(from.authority, to.authority)) {\n            return undefined;\n        }\n        if (from.scheme === Schemas.file) {\n            const relativePath = relative(originalFSPath(from), originalFSPath(to));\n            return isWindows ? toSlashes(relativePath) : relativePath;\n        }\n        let fromPath = from.path || '/';\n        const toPath = to.path || '/';\n        if (this._ignorePathCasing(from)) {\n            // make casing of fromPath match toPath\n            let i = 0;\n            for (const len = Math.min(fromPath.length, toPath.length); i < len; i++) {\n                if (fromPath.charCodeAt(i) !== toPath.charCodeAt(i)) {\n                    if (fromPath.charAt(i).toLowerCase() !== toPath.charAt(i).toLowerCase()) {\n                        break;\n                    }\n                }\n            }\n            fromPath = toPath.substr(0, i) + fromPath.substr(i);\n        }\n        return posix.relative(fromPath, toPath);\n    }\n    resolvePath(base, path) {\n        if (base.scheme === Schemas.file) {\n            const newURI = URI.file(resolve(originalFSPath(base), path));\n            return base.with({\n                authority: newURI.authority,\n                path: newURI.path\n            });\n        }\n        path = toPosixPath(path); // we allow path to be a windows path\n        return base.with({\n            path: posix.resolve(base.path, path)\n        });\n    }\n    // --- misc\n    isAbsolutePath(resource) {\n        return !!resource.path && resource.path[0] === '/';\n    }\n    isEqualAuthority(a1, a2) {\n        return a1 === a2 || (a1 !== undefined && a2 !== undefined && equalsIgnoreCase(a1, a2));\n    }\n    hasTrailingPathSeparator(resource, sep$1 = sep) {\n        if (resource.scheme === Schemas.file) {\n            const fsp = originalFSPath(resource);\n            return fsp.length > getRoot(fsp).length && fsp[fsp.length - 1] === sep$1;\n        }\n        else {\n            const p = resource.path;\n            return (p.length > 1 && p.charCodeAt(p.length - 1) === 47 /* CharCode.Slash */) && !(/^[a-zA-Z]:(\\/$|\\\\$)/.test(resource.fsPath)); // ignore the slash at offset 0\n        }\n    }\n    removeTrailingPathSeparator(resource, sep$1 = sep) {\n        // Make sure that the path isn't a drive letter. A trailing separator there is not removable.\n        if (hasTrailingPathSeparator(resource, sep$1)) {\n            return resource.with({ path: resource.path.substr(0, resource.path.length - 1) });\n        }\n        return resource;\n    }\n    addTrailingPathSeparator(resource, sep$1 = sep) {\n        let isRootSep = false;\n        if (resource.scheme === Schemas.file) {\n            const fsp = originalFSPath(resource);\n            isRootSep = ((fsp !== undefined) && (fsp.length === getRoot(fsp).length) && (fsp[fsp.length - 1] === sep$1));\n        }\n        else {\n            sep$1 = '/';\n            const p = resource.path;\n            isRootSep = p.length === 1 && p.charCodeAt(p.length - 1) === 47 /* CharCode.Slash */;\n        }\n        if (!isRootSep && !hasTrailingPathSeparator(resource, sep$1)) {\n            return resource.with({ path: resource.path + '/' });\n        }\n        return resource;\n    }\n}\n/**\n * Unbiased utility that takes uris \"as they are\". This means it can be interchanged with\n * uri#toString() usages. The following is true\n * ```\n * assertEqual(aUri.toString() === bUri.toString(), exturi.isEqual(aUri, bUri))\n * ```\n */\nconst extUri = new ExtUri(() => false);\nconst isEqual = extUri.isEqual.bind(extUri);\nextUri.isEqualOrParent.bind(extUri);\nextUri.getComparisonKey.bind(extUri);\nconst basenameOrAuthority = extUri.basenameOrAuthority.bind(extUri);\nconst basename = extUri.basename.bind(extUri);\nconst extname = extUri.extname.bind(extUri);\nconst dirname = extUri.dirname.bind(extUri);\nconst joinPath = extUri.joinPath.bind(extUri);\nconst normalizePath = extUri.normalizePath.bind(extUri);\nconst relativePath = extUri.relativePath.bind(extUri);\nconst resolvePath = extUri.resolvePath.bind(extUri);\nextUri.isAbsolutePath.bind(extUri);\nconst isEqualAuthority = extUri.isEqualAuthority.bind(extUri);\nconst hasTrailingPathSeparator = extUri.hasTrailingPathSeparator.bind(extUri);\nextUri.removeTrailingPathSeparator.bind(extUri);\nextUri.addTrailingPathSeparator.bind(extUri);\n/**\n * Data URI related helpers.\n */\nvar DataUri;\n(function (DataUri) {\n    DataUri.META_DATA_LABEL = 'label';\n    DataUri.META_DATA_DESCRIPTION = 'description';\n    DataUri.META_DATA_SIZE = 'size';\n    DataUri.META_DATA_MIME = 'mime';\n    function parseMetaData(dataUri) {\n        const metadata = new Map();\n        // Given a URI of:  data:image/png;size:2313;label:SomeLabel;description:SomeDescription;base64,77+9UE5...\n        // the metadata is: size:2313;label:SomeLabel;description:SomeDescription\n        const meta = dataUri.path.substring(dataUri.path.indexOf(';') + 1, dataUri.path.lastIndexOf(';'));\n        meta.split(';').forEach(property => {\n            const [key, value] = property.split(':');\n            if (key && value) {\n                metadata.set(key, value);\n            }\n        });\n        // Given a URI of:  data:image/png;size:2313;label:SomeLabel;description:SomeDescription;base64,77+9UE5...\n        // the mime is: image/png\n        const mime = dataUri.path.substring(0, dataUri.path.indexOf(';'));\n        if (mime) {\n            metadata.set(DataUri.META_DATA_MIME, mime);\n        }\n        return metadata;\n    }\n    DataUri.parseMetaData = parseMetaData;\n})(DataUri || (DataUri = {}));\n\nexport { DataUri, ExtUri, basename, basenameOrAuthority, dirname, extUri, extname, hasTrailingPathSeparator, isEqual, isEqualAuthority, joinPath, normalizePath, originalFSPath, relativePath, resolvePath };\n","import { Emitter } from '../../../base/common/event.js';\nimport { hash } from '../../../base/common/hash.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { ResourceMap } from '../../../base/common/map.js';\nimport { joinPath } from '../../../base/common/resources.js';\nimport { isString } from '../../../base/common/types.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { RawContextKey } from '../../contextkey/common/contextkey.js';\nimport { createDecorator } from '../../instantiation/common/instantiation.js';\n\nconst ILogService = createDecorator('logService');\nconst ILoggerService = createDecorator('loggerService');\nvar LogLevel;\n(function (LogLevel) {\n    LogLevel[LogLevel[\"Off\"] = 0] = \"Off\";\n    LogLevel[LogLevel[\"Trace\"] = 1] = \"Trace\";\n    LogLevel[LogLevel[\"Debug\"] = 2] = \"Debug\";\n    LogLevel[LogLevel[\"Info\"] = 3] = \"Info\";\n    LogLevel[LogLevel[\"Warning\"] = 4] = \"Warning\";\n    LogLevel[LogLevel[\"Error\"] = 5] = \"Error\";\n})(LogLevel || (LogLevel = {}));\nconst DEFAULT_LOG_LEVEL = LogLevel.Info;\nfunction canLog(loggerLevel, messageLevel) {\n    return loggerLevel !== LogLevel.Off && loggerLevel <= messageLevel;\n}\nclass AbstractLogger extends Disposable {\n    constructor() {\n        super(...arguments);\n        this.level = DEFAULT_LOG_LEVEL;\n        this._onDidChangeLogLevel = this._register(new Emitter());\n    }\n    get onDidChangeLogLevel() { return this._onDidChangeLogLevel.event; }\n    setLevel(level) {\n        if (this.level !== level) {\n            this.level = level;\n            this._onDidChangeLogLevel.fire(this.level);\n        }\n    }\n    getLevel() {\n        return this.level;\n    }\n    checkLogLevel(level) {\n        return canLog(this.level, level);\n    }\n    canLog(level) {\n        if (this._store.isDisposed) {\n            return false;\n        }\n        return this.checkLogLevel(level);\n    }\n}\nclass ConsoleLogger extends AbstractLogger {\n    constructor(logLevel = DEFAULT_LOG_LEVEL, useColors = true) {\n        super();\n        this.useColors = useColors;\n        this.setLevel(logLevel);\n    }\n    trace(message, ...args) {\n        if (this.canLog(LogLevel.Trace)) {\n            if (this.useColors) {\n                console.log('%cTRACE', 'color: #888', message, ...args);\n            }\n            else {\n                console.log(message, ...args);\n            }\n        }\n    }\n    debug(message, ...args) {\n        if (this.canLog(LogLevel.Debug)) {\n            if (this.useColors) {\n                console.log('%cDEBUG', 'background: #eee; color: #888', message, ...args);\n            }\n            else {\n                console.log(message, ...args);\n            }\n        }\n    }\n    info(message, ...args) {\n        if (this.canLog(LogLevel.Info)) {\n            if (this.useColors) {\n                console.log('%c INFO', 'color: #33f', message, ...args);\n            }\n            else {\n                console.log(message, ...args);\n            }\n        }\n    }\n    warn(message, ...args) {\n        if (this.canLog(LogLevel.Warning)) {\n            if (this.useColors) {\n                console.warn('%c WARN', 'color: #993', message, ...args);\n            }\n            else {\n                console.log(message, ...args);\n            }\n        }\n    }\n    error(message, ...args) {\n        if (this.canLog(LogLevel.Error)) {\n            if (this.useColors) {\n                console.error('%c  ERR', 'color: #f33', message, ...args);\n            }\n            else {\n                console.error(message, ...args);\n            }\n        }\n    }\n}\nclass MultiplexLogger extends AbstractLogger {\n    constructor(loggers) {\n        super();\n        this.loggers = loggers;\n        if (loggers.length) {\n            this.setLevel(loggers[0].getLevel());\n        }\n    }\n    setLevel(level) {\n        for (const logger of this.loggers) {\n            logger.setLevel(level);\n        }\n        super.setLevel(level);\n    }\n    trace(message, ...args) {\n        for (const logger of this.loggers) {\n            logger.trace(message, ...args);\n        }\n    }\n    debug(message, ...args) {\n        for (const logger of this.loggers) {\n            logger.debug(message, ...args);\n        }\n    }\n    info(message, ...args) {\n        for (const logger of this.loggers) {\n            logger.info(message, ...args);\n        }\n    }\n    warn(message, ...args) {\n        for (const logger of this.loggers) {\n            logger.warn(message, ...args);\n        }\n    }\n    error(message, ...args) {\n        for (const logger of this.loggers) {\n            logger.error(message, ...args);\n        }\n    }\n    dispose() {\n        for (const logger of this.loggers) {\n            logger.dispose();\n        }\n        super.dispose();\n    }\n}\nclass AbstractLoggerService extends Disposable {\n    constructor(logLevel, logsHome, loggerResources) {\n        super();\n        this.logLevel = logLevel;\n        this.logsHome = logsHome;\n        this._loggers = new ResourceMap();\n        this._onDidChangeLoggers = this._register(new Emitter);\n        this._onDidChangeVisibility = this._register(new Emitter);\n        if (loggerResources) {\n            for (const loggerResource of loggerResources) {\n                this._loggers.set(loggerResource.resource, { logger: undefined, info: loggerResource });\n            }\n        }\n    }\n    getLoggerEntry(resourceOrId) {\n        if (isString(resourceOrId)) {\n            return [...this._loggers.values()].find(logger => logger.info.id === resourceOrId);\n        }\n        return this._loggers.get(resourceOrId);\n    }\n    createLogger(idOrResource, options) {\n        const resource = this.toResource(idOrResource);\n        const id = isString(idOrResource) ? idOrResource : (options?.id ?? hash(resource.toString()).toString(16));\n        let logger = this._loggers.get(resource)?.logger;\n        const logLevel = options?.logLevel === 'always' ? LogLevel.Trace : options?.logLevel;\n        if (!logger) {\n            logger = this.doCreateLogger(resource, logLevel ?? this.getLogLevel(resource) ?? this.logLevel, { ...options, id });\n        }\n        const loggerEntry = {\n            logger,\n            info: {\n                resource,\n                id,\n                logLevel,\n                name: options?.name,\n                hidden: options?.hidden,\n                group: options?.group,\n                extensionId: options?.extensionId,\n                when: options?.when\n            }\n        };\n        this.registerLogger(loggerEntry.info);\n        // TODO: @sandy081 Remove this once registerLogger can take ILogger\n        this._loggers.set(resource, loggerEntry);\n        return logger;\n    }\n    toResource(idOrResource) {\n        return isString(idOrResource) ? joinPath(this.logsHome, `${idOrResource}.log`) : idOrResource;\n    }\n    setVisibility(resourceOrId, visibility) {\n        const logger = this.getLoggerEntry(resourceOrId);\n        if (logger && visibility !== !logger.info.hidden) {\n            logger.info.hidden = !visibility;\n            this._loggers.set(logger.info.resource, logger);\n            this._onDidChangeVisibility.fire([logger.info.resource, visibility]);\n        }\n    }\n    getLogLevel(resource) {\n        let logLevel;\n        if (resource) {\n            logLevel = this._loggers.get(resource)?.info.logLevel;\n        }\n        return logLevel ?? this.logLevel;\n    }\n    registerLogger(resource) {\n        const existing = this._loggers.get(resource.resource);\n        if (existing) {\n            if (existing.info.hidden !== resource.hidden) {\n                this.setVisibility(resource.resource, !resource.hidden);\n            }\n        }\n        else {\n            this._loggers.set(resource.resource, { info: resource, logger: undefined });\n            this._onDidChangeLoggers.fire({ added: [resource], removed: [] });\n        }\n    }\n    dispose() {\n        this._loggers.forEach(logger => logger.logger?.dispose());\n        this._loggers.clear();\n        super.dispose();\n    }\n}\nclass NullLogger {\n    constructor() {\n        this.onDidChangeLogLevel = new Emitter().event;\n    }\n    setLevel(level) { }\n    getLevel() { return LogLevel.Info; }\n    trace(message, ...args) { }\n    debug(message, ...args) { }\n    info(message, ...args) { }\n    warn(message, ...args) { }\n    error(message, ...args) { }\n    dispose() { }\n}\nclass NullLoggerService extends AbstractLoggerService {\n    constructor() {\n        super(LogLevel.Off, URI.parse('log:///log'));\n    }\n    doCreateLogger(resource, logLevel, options) {\n        return new NullLogger();\n    }\n}\nfunction LogLevelToString(logLevel) {\n    switch (logLevel) {\n        case LogLevel.Trace: return 'trace';\n        case LogLevel.Debug: return 'debug';\n        case LogLevel.Info: return 'info';\n        case LogLevel.Warning: return 'warn';\n        case LogLevel.Error: return 'error';\n        case LogLevel.Off: return 'off';\n    }\n}\n// Contexts\nnew RawContextKey('logLevel', LogLevelToString(LogLevel.Info));\n\nexport { AbstractLogger, AbstractLoggerService, ConsoleLogger, DEFAULT_LOG_LEVEL, ILogService, ILoggerService, LogLevel, LogLevelToString, MultiplexLogger, NullLogger, NullLoggerService, canLog };\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/**\n * Registry for commands that can trigger Inline Edits (NES) when invoked.\n */\nclass TriggerInlineEditCommandsRegistry {\n    static { this.REGISTERED_COMMANDS = new Set(); }\n    static getRegisteredCommands() {\n        return [...TriggerInlineEditCommandsRegistry.REGISTERED_COMMANDS];\n    }\n    static registerCommand(commandId) {\n        TriggerInlineEditCommandsRegistry.REGISTERED_COMMANDS.add(commandId);\n    }\n}\n\nexport { TriggerInlineEditCommandsRegistry };\n","import { localize } from '../../nls.js';\nimport { URI } from '../../base/common/uri.js';\nimport { ICodeEditorService } from './services/codeEditorService.js';\nimport { Position } from '../common/core/position.js';\nimport { IModelService } from '../common/services/model.js';\nimport { ITextModelService } from '../common/services/resolverService.js';\nimport { MenuId, MenuRegistry, Action2 } from '../../platform/actions/common/actions.js';\nimport { CommandsRegistry } from '../../platform/commands/common/commands.js';\nimport { IContextKeyService, ContextKeyExpr } from '../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../platform/instantiation/common/instantiation.js';\nimport { KeybindingsRegistry } from '../../platform/keybinding/common/keybindingsRegistry.js';\nimport { Registry } from '../../platform/registry/common/platform.js';\nimport { ITelemetryService } from '../../platform/telemetry/common/telemetry.js';\nimport { assertType } from '../../base/common/types.js';\nimport { ILogService } from '../../platform/log/common/log.js';\nimport { getActiveElement } from '../../base/browser/dom.js';\nimport { TriggerInlineEditCommandsRegistry } from './triggerInlineEditCommandsRegistry.js';\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 *--------------------------------------------------------------------------------------------*/\nclass Command {\n    constructor(opts) {\n        this.id = opts.id;\n        this.precondition = opts.precondition;\n        this._kbOpts = opts.kbOpts;\n        this._menuOpts = opts.menuOpts;\n        this.metadata = opts.metadata;\n        this.canTriggerInlineEdits = opts.canTriggerInlineEdits;\n    }\n    register() {\n        if (Array.isArray(this._menuOpts)) {\n            this._menuOpts.forEach(this._registerMenuItem, this);\n        }\n        else if (this._menuOpts) {\n            this._registerMenuItem(this._menuOpts);\n        }\n        if (this._kbOpts) {\n            const kbOptsArr = Array.isArray(this._kbOpts) ? this._kbOpts : [this._kbOpts];\n            for (const kbOpts of kbOptsArr) {\n                let kbWhen = kbOpts.kbExpr;\n                if (this.precondition) {\n                    if (kbWhen) {\n                        kbWhen = ContextKeyExpr.and(kbWhen, this.precondition);\n                    }\n                    else {\n                        kbWhen = this.precondition;\n                    }\n                }\n                const desc = {\n                    id: this.id,\n                    weight: kbOpts.weight,\n                    args: kbOpts.args,\n                    when: kbWhen,\n                    primary: kbOpts.primary,\n                    secondary: kbOpts.secondary,\n                    win: kbOpts.win,\n                    linux: kbOpts.linux,\n                    mac: kbOpts.mac,\n                };\n                KeybindingsRegistry.registerKeybindingRule(desc);\n            }\n        }\n        CommandsRegistry.registerCommand({\n            id: this.id,\n            handler: (accessor, args) => this.runCommand(accessor, args),\n            metadata: this.metadata\n        });\n        if (this.canTriggerInlineEdits) {\n            TriggerInlineEditCommandsRegistry.registerCommand(this.id);\n        }\n    }\n    _registerMenuItem(item) {\n        MenuRegistry.appendMenuItem(item.menuId, {\n            group: item.group,\n            command: {\n                id: this.id,\n                title: item.title,\n                icon: item.icon,\n                precondition: this.precondition\n            },\n            when: item.when,\n            order: item.order\n        });\n    }\n}\nclass MultiCommand extends Command {\n    constructor() {\n        super(...arguments);\n        this._implementations = [];\n    }\n    /**\n     * A higher priority gets to be looked at first\n     */\n    addImplementation(priority, name, implementation, when) {\n        this._implementations.push({ priority, name, implementation, when });\n        this._implementations.sort((a, b) => b.priority - a.priority);\n        return {\n            dispose: () => {\n                for (let i = 0; i < this._implementations.length; i++) {\n                    if (this._implementations[i].implementation === implementation) {\n                        this._implementations.splice(i, 1);\n                        return;\n                    }\n                }\n            }\n        };\n    }\n    runCommand(accessor, args) {\n        const logService = accessor.get(ILogService);\n        const contextKeyService = accessor.get(IContextKeyService);\n        logService.trace(`Executing Command '${this.id}' which has ${this._implementations.length} bound.`);\n        for (const impl of this._implementations) {\n            if (impl.when) {\n                const context = contextKeyService.getContext(getActiveElement());\n                const value = impl.when.evaluate(context);\n                if (!value) {\n                    continue;\n                }\n            }\n            const result = impl.implementation(accessor, args);\n            if (result) {\n                logService.trace(`Command '${this.id}' was handled by '${impl.name}'.`);\n                if (typeof result === 'boolean') {\n                    return;\n                }\n                return result;\n            }\n        }\n        logService.trace(`The Command '${this.id}' was not handled by any implementation.`);\n    }\n}\n//#endregion\n/**\n * A command that delegates to another command's implementation.\n *\n * This lets different commands be registered but share the same implementation\n */\nclass ProxyCommand extends Command {\n    constructor(command, opts) {\n        super(opts);\n        this.command = command;\n    }\n    runCommand(accessor, args) {\n        return this.command.runCommand(accessor, args);\n    }\n}\nclass EditorCommand extends Command {\n    /**\n     * Create a command class that is bound to a certain editor contribution.\n     */\n    static bindToContribution(controllerGetter) {\n        return class EditorControllerCommandImpl extends EditorCommand {\n            constructor(opts) {\n                super(opts);\n                this._callback = opts.handler;\n            }\n            runEditorCommand(accessor, editor, args) {\n                const controller = controllerGetter(editor);\n                if (controller) {\n                    this._callback(controller, args);\n                }\n            }\n        };\n    }\n    static runEditorCommand(accessor, args, precondition, runner) {\n        const codeEditorService = accessor.get(ICodeEditorService);\n        // Find the editor with text focus or active\n        const editor = codeEditorService.getFocusedCodeEditor() || codeEditorService.getActiveCodeEditor();\n        if (!editor) {\n            // well, at least we tried...\n            return;\n        }\n        return editor.invokeWithinContext((editorAccessor) => {\n            const kbService = editorAccessor.get(IContextKeyService);\n            if (!kbService.contextMatchesRules(precondition ?? undefined)) {\n                // precondition does not hold\n                return;\n            }\n            return runner(editorAccessor, editor, args);\n        });\n    }\n    runCommand(accessor, args) {\n        return EditorCommand.runEditorCommand(accessor, args, this.precondition, (accessor, editor, args) => this.runEditorCommand(accessor, editor, args));\n    }\n}\nclass EditorAction extends EditorCommand {\n    static convertOptions(opts) {\n        let menuOpts;\n        if (Array.isArray(opts.menuOpts)) {\n            menuOpts = opts.menuOpts;\n        }\n        else if (opts.menuOpts) {\n            menuOpts = [opts.menuOpts];\n        }\n        else {\n            menuOpts = [];\n        }\n        function withDefaults(item) {\n            if (!item.menuId) {\n                item.menuId = MenuId.EditorContext;\n            }\n            if (!item.title) {\n                item.title = typeof opts.label === 'string' ? opts.label : opts.label.value;\n            }\n            item.when = ContextKeyExpr.and(opts.precondition, item.when);\n            return item;\n        }\n        if (Array.isArray(opts.contextMenuOpts)) {\n            menuOpts.push(...opts.contextMenuOpts.map(withDefaults));\n        }\n        else if (opts.contextMenuOpts) {\n            menuOpts.push(withDefaults(opts.contextMenuOpts));\n        }\n        opts.menuOpts = menuOpts;\n        return opts;\n    }\n    constructor(opts) {\n        super(EditorAction.convertOptions(opts));\n        if (typeof opts.label === 'string') {\n            this.label = opts.label;\n            this.alias = opts.alias ?? opts.label;\n        }\n        else {\n            this.label = opts.label.value;\n            this.alias = opts.alias ?? opts.label.original;\n        }\n    }\n    runEditorCommand(accessor, editor, args) {\n        this.reportTelemetry(accessor, editor);\n        return this.run(accessor, editor, args || {});\n    }\n    reportTelemetry(accessor, editor) {\n        accessor.get(ITelemetryService).publicLog2('editorActionInvoked', { name: this.label, id: this.id });\n    }\n}\nclass MultiEditorAction extends EditorAction {\n    constructor() {\n        super(...arguments);\n        this._implementations = [];\n    }\n    /**\n     * A higher priority gets to be looked at first\n     */\n    addImplementation(priority, implementation) {\n        this._implementations.push([priority, implementation]);\n        this._implementations.sort((a, b) => b[0] - a[0]);\n        return {\n            dispose: () => {\n                for (let i = 0; i < this._implementations.length; i++) {\n                    if (this._implementations[i][1] === implementation) {\n                        this._implementations.splice(i, 1);\n                        return;\n                    }\n                }\n            }\n        };\n    }\n    run(accessor, editor, args) {\n        for (const impl of this._implementations) {\n            const result = impl[1](accessor, editor, args);\n            if (result) {\n                if (typeof result === 'boolean') {\n                    return;\n                }\n                return result;\n            }\n        }\n    }\n}\n//#endregion EditorAction\n//#region EditorAction2\nclass EditorAction2 extends Action2 {\n    run(accessor, ...args) {\n        // Find the editor with text focus or active\n        const codeEditorService = accessor.get(ICodeEditorService);\n        const editor = codeEditorService.getFocusedCodeEditor() || codeEditorService.getActiveCodeEditor();\n        if (!editor) {\n            // well, at least we tried...\n            return;\n        }\n        // precondition does hold\n        return editor.invokeWithinContext((editorAccessor) => {\n            const kbService = editorAccessor.get(IContextKeyService);\n            const logService = editorAccessor.get(ILogService);\n            const enabled = kbService.contextMatchesRules(this.desc.precondition ?? undefined);\n            if (!enabled) {\n                logService.debug(`[EditorAction2] NOT running command because its precondition is FALSE`, this.desc.id, this.desc.precondition?.serialize());\n                return;\n            }\n            return this.runEditorCommand(editorAccessor, editor, ...args);\n        });\n    }\n}\n//#endregion\n// --- Registration of commands and actions\nfunction registerModelAndPositionCommand(id, handler) {\n    CommandsRegistry.registerCommand(id, function (accessor, ...args) {\n        const instaService = accessor.get(IInstantiationService);\n        const [resource, position] = args;\n        assertType(URI.isUri(resource));\n        assertType(Position.isIPosition(position));\n        const model = accessor.get(IModelService).getModel(resource);\n        if (model) {\n            const editorPosition = Position.lift(position);\n            return instaService.invokeFunction(handler, model, editorPosition, ...args.slice(2));\n        }\n        return accessor.get(ITextModelService).createModelReference(resource).then(reference => {\n            return new Promise((resolve, reject) => {\n                try {\n                    const result = instaService.invokeFunction(handler, reference.object.textEditorModel, Position.lift(position), args.slice(2));\n                    resolve(result);\n                }\n                catch (err) {\n                    reject(err);\n                }\n            }).finally(() => {\n                reference.dispose();\n            });\n        });\n    });\n}\nfunction registerEditorCommand(editorCommand) {\n    EditorContributionRegistry.INSTANCE.registerEditorCommand(editorCommand);\n    return editorCommand;\n}\nfunction registerEditorAction(ctor) {\n    const action = new ctor();\n    EditorContributionRegistry.INSTANCE.registerEditorAction(action);\n    return action;\n}\nfunction registerMultiEditorAction(action) {\n    EditorContributionRegistry.INSTANCE.registerEditorAction(action);\n    return action;\n}\nfunction registerInstantiatedEditorAction(editorAction) {\n    EditorContributionRegistry.INSTANCE.registerEditorAction(editorAction);\n}\n/**\n * Registers an editor contribution. Editor contributions have a lifecycle which is bound\n * to a specific code editor instance.\n */\nfunction registerEditorContribution(id, ctor, instantiation) {\n    EditorContributionRegistry.INSTANCE.registerEditorContribution(id, ctor, instantiation);\n}\nvar EditorExtensionsRegistry;\n(function (EditorExtensionsRegistry) {\n    function getEditorCommand(commandId) {\n        return EditorContributionRegistry.INSTANCE.getEditorCommand(commandId);\n    }\n    EditorExtensionsRegistry.getEditorCommand = getEditorCommand;\n    function getEditorActions() {\n        return EditorContributionRegistry.INSTANCE.getEditorActions();\n    }\n    EditorExtensionsRegistry.getEditorActions = getEditorActions;\n    function getEditorContributions() {\n        return EditorContributionRegistry.INSTANCE.getEditorContributions();\n    }\n    EditorExtensionsRegistry.getEditorContributions = getEditorContributions;\n    function getSomeEditorContributions(ids) {\n        return EditorContributionRegistry.INSTANCE.getEditorContributions().filter(c => ids.indexOf(c.id) >= 0);\n    }\n    EditorExtensionsRegistry.getSomeEditorContributions = getSomeEditorContributions;\n    function getDiffEditorContributions() {\n        return EditorContributionRegistry.INSTANCE.getDiffEditorContributions();\n    }\n    EditorExtensionsRegistry.getDiffEditorContributions = getDiffEditorContributions;\n})(EditorExtensionsRegistry || (EditorExtensionsRegistry = {}));\n// Editor extension points\nconst Extensions = {\n    EditorCommonContributions: 'editor.contributions'\n};\nclass EditorContributionRegistry {\n    static { this.INSTANCE = new EditorContributionRegistry(); }\n    constructor() {\n        this.editorContributions = [];\n        this.diffEditorContributions = [];\n        this.editorActions = [];\n        this.editorCommands = Object.create(null);\n    }\n    registerEditorContribution(id, ctor, instantiation) {\n        this.editorContributions.push({ id, ctor: ctor, instantiation });\n    }\n    getEditorContributions() {\n        return this.editorContributions.slice(0);\n    }\n    getDiffEditorContributions() {\n        return this.diffEditorContributions.slice(0);\n    }\n    registerEditorAction(action) {\n        action.register();\n        this.editorActions.push(action);\n    }\n    getEditorActions() {\n        return this.editorActions;\n    }\n    registerEditorCommand(editorCommand) {\n        editorCommand.register();\n        this.editorCommands[editorCommand.id] = editorCommand;\n    }\n    getEditorCommand(commandId) {\n        return (this.editorCommands[commandId] || null);\n    }\n}\nRegistry.add(Extensions.EditorCommonContributions, EditorContributionRegistry.INSTANCE);\nfunction registerCommand(command) {\n    command.register();\n    return command;\n}\nconst UndoCommand = registerCommand(new MultiCommand({\n    id: 'undo',\n    precondition: undefined,\n    kbOpts: {\n        weight: 0 /* KeybindingWeight.EditorCore */,\n        primary: 2048 /* KeyMod.CtrlCmd */ | 56 /* KeyCode.KeyZ */\n    },\n    menuOpts: [{\n            menuId: MenuId.MenubarEditMenu,\n            group: '1_do',\n            title: localize(69, \"&&Undo\"),\n            order: 1\n        }, {\n            menuId: MenuId.CommandPalette,\n            group: '',\n            title: localize(70, \"Undo\"),\n            order: 1\n        }, {\n            menuId: MenuId.SimpleEditorContext,\n            group: '1_do',\n            title: localize(71, \"Undo\"),\n            order: 1\n        }]\n}));\nregisterCommand(new ProxyCommand(UndoCommand, { id: 'default:undo', precondition: undefined }));\nconst RedoCommand = registerCommand(new MultiCommand({\n    id: 'redo',\n    precondition: undefined,\n    kbOpts: {\n        weight: 0 /* KeybindingWeight.EditorCore */,\n        primary: 2048 /* KeyMod.CtrlCmd */ | 55 /* KeyCode.KeyY */,\n        secondary: [2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 56 /* KeyCode.KeyZ */],\n        mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 56 /* KeyCode.KeyZ */ }\n    },\n    menuOpts: [{\n            menuId: MenuId.MenubarEditMenu,\n            group: '1_do',\n            title: localize(72, \"&&Redo\"),\n            order: 2\n        }, {\n            menuId: MenuId.CommandPalette,\n            group: '',\n            title: localize(73, \"Redo\"),\n            order: 1\n        }, {\n            menuId: MenuId.SimpleEditorContext,\n            group: '1_do',\n            title: localize(74, \"Redo\"),\n            order: 2\n        }]\n}));\nregisterCommand(new ProxyCommand(RedoCommand, { id: 'default:redo', precondition: undefined }));\nconst SelectAllCommand = registerCommand(new MultiCommand({\n    id: 'editor.action.selectAll',\n    precondition: undefined,\n    kbOpts: {\n        weight: 0 /* KeybindingWeight.EditorCore */,\n        kbExpr: null,\n        primary: 2048 /* KeyMod.CtrlCmd */ | 31 /* KeyCode.KeyA */\n    },\n    menuOpts: [{\n            menuId: MenuId.MenubarSelectionMenu,\n            group: '1_basic',\n            title: localize(75, \"&&Select All\"),\n            order: 1\n        }, {\n            menuId: MenuId.CommandPalette,\n            group: '',\n            title: localize(76, \"Select All\"),\n            order: 1\n        }, {\n            menuId: MenuId.SimpleEditorContext,\n            group: '9_select',\n            title: localize(77, \"Select All\"),\n            order: 1\n        }]\n}));\n\nexport { Command, EditorAction, EditorAction2, EditorCommand, EditorExtensionsRegistry, MultiCommand, MultiEditorAction, ProxyCommand, RedoCommand, SelectAllCommand, UndoCommand, registerEditorAction, registerEditorCommand, registerEditorContribution, registerInstantiatedEditorAction, registerModelAndPositionCommand, registerMultiEditorAction };\n","import { Position } from './position.js';\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/**\n * A range in the editor. (startLineNumber,startColumn) is <= (endLineNumber,endColumn)\n */\nclass Range {\n    constructor(startLineNumber, startColumn, endLineNumber, endColumn) {\n        if ((startLineNumber > endLineNumber) || (startLineNumber === endLineNumber && startColumn > endColumn)) {\n            this.startLineNumber = endLineNumber;\n            this.startColumn = endColumn;\n            this.endLineNumber = startLineNumber;\n            this.endColumn = startColumn;\n        }\n        else {\n            this.startLineNumber = startLineNumber;\n            this.startColumn = startColumn;\n            this.endLineNumber = endLineNumber;\n            this.endColumn = endColumn;\n        }\n    }\n    /**\n     * Test if this range is empty.\n     */\n    isEmpty() {\n        return Range.isEmpty(this);\n    }\n    /**\n     * Test if `range` is empty.\n     */\n    static isEmpty(range) {\n        return (range.startLineNumber === range.endLineNumber && range.startColumn === range.endColumn);\n    }\n    /**\n     * Test if position is in this range. If the position is at the edges, will return true.\n     */\n    containsPosition(position) {\n        return Range.containsPosition(this, position);\n    }\n    /**\n     * Test if `position` is in `range`. If the position is at the edges, will return true.\n     */\n    static containsPosition(range, position) {\n        if (position.lineNumber < range.startLineNumber || position.lineNumber > range.endLineNumber) {\n            return false;\n        }\n        if (position.lineNumber === range.startLineNumber && position.column < range.startColumn) {\n            return false;\n        }\n        if (position.lineNumber === range.endLineNumber && position.column > range.endColumn) {\n            return false;\n        }\n        return true;\n    }\n    /**\n     * Test if `position` is in `range`. If the position is at the edges, will return false.\n     * @internal\n     */\n    static strictContainsPosition(range, position) {\n        if (position.lineNumber < range.startLineNumber || position.lineNumber > range.endLineNumber) {\n            return false;\n        }\n        if (position.lineNumber === range.startLineNumber && position.column <= range.startColumn) {\n            return false;\n        }\n        if (position.lineNumber === range.endLineNumber && position.column >= range.endColumn) {\n            return false;\n        }\n        return true;\n    }\n    /**\n     * Test if range is in this range. If the range is equal to this range, will return true.\n     */\n    containsRange(range) {\n        return Range.containsRange(this, range);\n    }\n    /**\n     * Test if `otherRange` is in `range`. If the ranges are equal, will return true.\n     */\n    static containsRange(range, otherRange) {\n        if (otherRange.startLineNumber < range.startLineNumber || otherRange.endLineNumber < range.startLineNumber) {\n            return false;\n        }\n        if (otherRange.startLineNumber > range.endLineNumber || otherRange.endLineNumber > range.endLineNumber) {\n            return false;\n        }\n        if (otherRange.startLineNumber === range.startLineNumber && otherRange.startColumn < range.startColumn) {\n            return false;\n        }\n        if (otherRange.endLineNumber === range.endLineNumber && otherRange.endColumn > range.endColumn) {\n            return false;\n        }\n        return true;\n    }\n    /**\n     * Test if `range` is strictly in this range. `range` must start after and end before this range for the result to be true.\n     */\n    strictContainsRange(range) {\n        return Range.strictContainsRange(this, range);\n    }\n    /**\n     * Test if `otherRange` is strictly in `range` (must start after, and end before). If the ranges are equal, will return false.\n     */\n    static strictContainsRange(range, otherRange) {\n        if (otherRange.startLineNumber < range.startLineNumber || otherRange.endLineNumber < range.startLineNumber) {\n            return false;\n        }\n        if (otherRange.startLineNumber > range.endLineNumber || otherRange.endLineNumber > range.endLineNumber) {\n            return false;\n        }\n        if (otherRange.startLineNumber === range.startLineNumber && otherRange.startColumn <= range.startColumn) {\n            return false;\n        }\n        if (otherRange.endLineNumber === range.endLineNumber && otherRange.endColumn >= range.endColumn) {\n            return false;\n        }\n        return true;\n    }\n    /**\n     * A reunion of the two ranges.\n     * The smallest position will be used as the start point, and the largest one as the end point.\n     */\n    plusRange(range) {\n        return Range.plusRange(this, range);\n    }\n    /**\n     * A reunion of the two ranges.\n     * The smallest position will be used as the start point, and the largest one as the end point.\n     */\n    static plusRange(a, b) {\n        let startLineNumber;\n        let startColumn;\n        let endLineNumber;\n        let endColumn;\n        if (b.startLineNumber < a.startLineNumber) {\n            startLineNumber = b.startLineNumber;\n            startColumn = b.startColumn;\n        }\n        else if (b.startLineNumber === a.startLineNumber) {\n            startLineNumber = b.startLineNumber;\n            startColumn = Math.min(b.startColumn, a.startColumn);\n        }\n        else {\n            startLineNumber = a.startLineNumber;\n            startColumn = a.startColumn;\n        }\n        if (b.endLineNumber > a.endLineNumber) {\n            endLineNumber = b.endLineNumber;\n            endColumn = b.endColumn;\n        }\n        else if (b.endLineNumber === a.endLineNumber) {\n            endLineNumber = b.endLineNumber;\n            endColumn = Math.max(b.endColumn, a.endColumn);\n        }\n        else {\n            endLineNumber = a.endLineNumber;\n            endColumn = a.endColumn;\n        }\n        return new Range(startLineNumber, startColumn, endLineNumber, endColumn);\n    }\n    /**\n     * A intersection of the two ranges.\n     */\n    intersectRanges(range) {\n        return Range.intersectRanges(this, range);\n    }\n    /**\n     * A intersection of the two ranges.\n     */\n    static intersectRanges(a, b) {\n        let resultStartLineNumber = a.startLineNumber;\n        let resultStartColumn = a.startColumn;\n        let resultEndLineNumber = a.endLineNumber;\n        let resultEndColumn = a.endColumn;\n        const otherStartLineNumber = b.startLineNumber;\n        const otherStartColumn = b.startColumn;\n        const otherEndLineNumber = b.endLineNumber;\n        const otherEndColumn = b.endColumn;\n        if (resultStartLineNumber < otherStartLineNumber) {\n            resultStartLineNumber = otherStartLineNumber;\n            resultStartColumn = otherStartColumn;\n        }\n        else if (resultStartLineNumber === otherStartLineNumber) {\n            resultStartColumn = Math.max(resultStartColumn, otherStartColumn);\n        }\n        if (resultEndLineNumber > otherEndLineNumber) {\n            resultEndLineNumber = otherEndLineNumber;\n            resultEndColumn = otherEndColumn;\n        }\n        else if (resultEndLineNumber === otherEndLineNumber) {\n            resultEndColumn = Math.min(resultEndColumn, otherEndColumn);\n        }\n        // Check if selection is now empty\n        if (resultStartLineNumber > resultEndLineNumber) {\n            return null;\n        }\n        if (resultStartLineNumber === resultEndLineNumber && resultStartColumn > resultEndColumn) {\n            return null;\n        }\n        return new Range(resultStartLineNumber, resultStartColumn, resultEndLineNumber, resultEndColumn);\n    }\n    /**\n     * Test if this range equals other.\n     */\n    equalsRange(other) {\n        return Range.equalsRange(this, other);\n    }\n    /**\n     * Test if range `a` equals `b`.\n     */\n    static equalsRange(a, b) {\n        if (!a && !b) {\n            return true;\n        }\n        return (!!a &&\n            !!b &&\n            a.startLineNumber === b.startLineNumber &&\n            a.startColumn === b.startColumn &&\n            a.endLineNumber === b.endLineNumber &&\n            a.endColumn === b.endColumn);\n    }\n    /**\n     * Return the end position (which will be after or equal to the start position)\n     */\n    getEndPosition() {\n        return Range.getEndPosition(this);\n    }\n    /**\n     * Return the end position (which will be after or equal to the start position)\n     */\n    static getEndPosition(range) {\n        return new Position(range.endLineNumber, range.endColumn);\n    }\n    /**\n     * Return the start position (which will be before or equal to the end position)\n     */\n    getStartPosition() {\n        return Range.getStartPosition(this);\n    }\n    /**\n     * Return the start position (which will be before or equal to the end position)\n     */\n    static getStartPosition(range) {\n        return new Position(range.startLineNumber, range.startColumn);\n    }\n    /**\n     * Transform to a user presentable string representation.\n     */\n    toString() {\n        return '[' + this.startLineNumber + ',' + this.startColumn + ' -> ' + this.endLineNumber + ',' + this.endColumn + ']';\n    }\n    /**\n     * Create a new range using this range's start position, and using endLineNumber and endColumn as the end position.\n     */\n    setEndPosition(endLineNumber, endColumn) {\n        return new Range(this.startLineNumber, this.startColumn, endLineNumber, endColumn);\n    }\n    /**\n     * Create a new range using this range's end position, and using startLineNumber and startColumn as the start position.\n     */\n    setStartPosition(startLineNumber, startColumn) {\n        return new Range(startLineNumber, startColumn, this.endLineNumber, this.endColumn);\n    }\n    /**\n     * Create a new empty range using this range's start position.\n     */\n    collapseToStart() {\n        return Range.collapseToStart(this);\n    }\n    /**\n     * Create a new empty range using this range's start position.\n     */\n    static collapseToStart(range) {\n        return new Range(range.startLineNumber, range.startColumn, range.startLineNumber, range.startColumn);\n    }\n    /**\n     * Create a new empty range using this range's end position.\n     */\n    collapseToEnd() {\n        return Range.collapseToEnd(this);\n    }\n    /**\n     * Create a new empty range using this range's end position.\n     */\n    static collapseToEnd(range) {\n        return new Range(range.endLineNumber, range.endColumn, range.endLineNumber, range.endColumn);\n    }\n    /**\n     * Moves the range by the given amount of lines.\n     */\n    delta(lineCount) {\n        return new Range(this.startLineNumber + lineCount, this.startColumn, this.endLineNumber + lineCount, this.endColumn);\n    }\n    isSingleLine() {\n        return this.startLineNumber === this.endLineNumber;\n    }\n    // ---\n    static fromPositions(start, end = start) {\n        return new Range(start.lineNumber, start.column, end.lineNumber, end.column);\n    }\n    static lift(range) {\n        if (!range) {\n            return null;\n        }\n        return new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn);\n    }\n    /**\n     * Test if `obj` is an `IRange`.\n     */\n    static isIRange(obj) {\n        return (!!obj\n            && (typeof obj.startLineNumber === 'number')\n            && (typeof obj.startColumn === 'number')\n            && (typeof obj.endLineNumber === 'number')\n            && (typeof obj.endColumn === 'number'));\n    }\n    /**\n     * Test if the two ranges are touching in any way.\n     */\n    static areIntersectingOrTouching(a, b) {\n        // Check if `a` is before `b`\n        if (a.endLineNumber < b.startLineNumber || (a.endLineNumber === b.startLineNumber && a.endColumn < b.startColumn)) {\n            return false;\n        }\n        // Check if `b` is before `a`\n        if (b.endLineNumber < a.startLineNumber || (b.endLineNumber === a.startLineNumber && b.endColumn < a.startColumn)) {\n            return false;\n        }\n        // These ranges must intersect\n        return true;\n    }\n    /**\n     * Test if the two ranges are intersecting. If the ranges are touching it returns true.\n     */\n    static areIntersecting(a, b) {\n        // Check if `a` is before `b`\n        if (a.endLineNumber < b.startLineNumber || (a.endLineNumber === b.startLineNumber && a.endColumn <= b.startColumn)) {\n            return false;\n        }\n        // Check if `b` is before `a`\n        if (b.endLineNumber < a.startLineNumber || (b.endLineNumber === a.startLineNumber && b.endColumn <= a.startColumn)) {\n            return false;\n        }\n        // These ranges must intersect\n        return true;\n    }\n    /**\n     * Test if the two ranges are intersecting, but not touching at all.\n     */\n    static areOnlyIntersecting(a, b) {\n        // Check if `a` is before `b`\n        if (a.endLineNumber < (b.startLineNumber - 1) || (a.endLineNumber === b.startLineNumber && a.endColumn < (b.startColumn - 1))) {\n            return false;\n        }\n        // Check if `b` is before `a`\n        if (b.endLineNumber < (a.startLineNumber - 1) || (b.endLineNumber === a.startLineNumber && b.endColumn < (a.startColumn - 1))) {\n            return false;\n        }\n        // These ranges must intersect\n        return true;\n    }\n    /**\n     * A function that compares ranges, useful for sorting ranges\n     * It will first compare ranges on the startPosition and then on the endPosition\n     */\n    static compareRangesUsingStarts(a, b) {\n        if (a && b) {\n            const aStartLineNumber = a.startLineNumber | 0;\n            const bStartLineNumber = b.startLineNumber | 0;\n            if (aStartLineNumber === bStartLineNumber) {\n                const aStartColumn = a.startColumn | 0;\n                const bStartColumn = b.startColumn | 0;\n                if (aStartColumn === bStartColumn) {\n                    const aEndLineNumber = a.endLineNumber | 0;\n                    const bEndLineNumber = b.endLineNumber | 0;\n                    if (aEndLineNumber === bEndLineNumber) {\n                        const aEndColumn = a.endColumn | 0;\n                        const bEndColumn = b.endColumn | 0;\n                        return aEndColumn - bEndColumn;\n                    }\n                    return aEndLineNumber - bEndLineNumber;\n                }\n                return aStartColumn - bStartColumn;\n            }\n            return aStartLineNumber - bStartLineNumber;\n        }\n        const aExists = (a ? 1 : 0);\n        const bExists = (b ? 1 : 0);\n        return aExists - bExists;\n    }\n    /**\n     * A function that compares ranges, useful for sorting ranges\n     * It will first compare ranges on the endPosition and then on the startPosition\n     */\n    static compareRangesUsingEnds(a, b) {\n        if (a.endLineNumber === b.endLineNumber) {\n            if (a.endColumn === b.endColumn) {\n                if (a.startLineNumber === b.startLineNumber) {\n                    return a.startColumn - b.startColumn;\n                }\n                return a.startLineNumber - b.startLineNumber;\n            }\n            return a.endColumn - b.endColumn;\n        }\n        return a.endLineNumber - b.endLineNumber;\n    }\n    /**\n     * Test if the range spans multiple lines.\n     */\n    static spansMultipleLines(range) {\n        return range.endLineNumber > range.startLineNumber;\n    }\n    toJSON() {\n        return this;\n    }\n}\n\nexport { Range };\n","import { Position } from './position.js';\nimport { Range } from './range.js';\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/**\n * A selection in the editor.\n * The selection is a range that has an orientation.\n */\nclass Selection extends Range {\n    constructor(selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn) {\n        super(selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn);\n        this.selectionStartLineNumber = selectionStartLineNumber;\n        this.selectionStartColumn = selectionStartColumn;\n        this.positionLineNumber = positionLineNumber;\n        this.positionColumn = positionColumn;\n    }\n    /**\n     * Transform to a human-readable representation.\n     */\n    toString() {\n        return '[' + this.selectionStartLineNumber + ',' + this.selectionStartColumn + ' -> ' + this.positionLineNumber + ',' + this.positionColumn + ']';\n    }\n    /**\n     * Test if equals other selection.\n     */\n    equalsSelection(other) {\n        return (Selection.selectionsEqual(this, other));\n    }\n    /**\n     * Test if the two selections are equal.\n     */\n    static selectionsEqual(a, b) {\n        return (a.selectionStartLineNumber === b.selectionStartLineNumber &&\n            a.selectionStartColumn === b.selectionStartColumn &&\n            a.positionLineNumber === b.positionLineNumber &&\n            a.positionColumn === b.positionColumn);\n    }\n    /**\n     * Get directions (LTR or RTL).\n     */\n    getDirection() {\n        if (this.selectionStartLineNumber === this.startLineNumber && this.selectionStartColumn === this.startColumn) {\n            return 0 /* SelectionDirection.LTR */;\n        }\n        return 1 /* SelectionDirection.RTL */;\n    }\n    /**\n     * Create a new selection with a different `positionLineNumber` and `positionColumn`.\n     */\n    setEndPosition(endLineNumber, endColumn) {\n        if (this.getDirection() === 0 /* SelectionDirection.LTR */) {\n            return new Selection(this.startLineNumber, this.startColumn, endLineNumber, endColumn);\n        }\n        return new Selection(endLineNumber, endColumn, this.startLineNumber, this.startColumn);\n    }\n    /**\n     * Get the position at `positionLineNumber` and `positionColumn`.\n     */\n    getPosition() {\n        return new Position(this.positionLineNumber, this.positionColumn);\n    }\n    /**\n     * Get the position at the start of the selection.\n    */\n    getSelectionStart() {\n        return new Position(this.selectionStartLineNumber, this.selectionStartColumn);\n    }\n    /**\n     * Create a new selection with a different `selectionStartLineNumber` and `selectionStartColumn`.\n     */\n    setStartPosition(startLineNumber, startColumn) {\n        if (this.getDirection() === 0 /* SelectionDirection.LTR */) {\n            return new Selection(startLineNumber, startColumn, this.endLineNumber, this.endColumn);\n        }\n        return new Selection(this.endLineNumber, this.endColumn, startLineNumber, startColumn);\n    }\n    // ----\n    /**\n     * Create a `Selection` from one or two positions\n     */\n    static fromPositions(start, end = start) {\n        return new Selection(start.lineNumber, start.column, end.lineNumber, end.column);\n    }\n    /**\n     * Creates a `Selection` from a range, given a direction.\n     */\n    static fromRange(range, direction) {\n        if (direction === 0 /* SelectionDirection.LTR */) {\n            return new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn);\n        }\n        else {\n            return new Selection(range.endLineNumber, range.endColumn, range.startLineNumber, range.startColumn);\n        }\n    }\n    /**\n     * Create a `Selection` from an `ISelection`.\n     */\n    static liftSelection(sel) {\n        return new Selection(sel.selectionStartLineNumber, sel.selectionStartColumn, sel.positionLineNumber, sel.positionColumn);\n    }\n    /**\n     * `a` equals `b`.\n     */\n    static selectionsArrEqual(a, b) {\n        if (a && !b || !a && b) {\n            return false;\n        }\n        if (!a && !b) {\n            return true;\n        }\n        if (a.length !== b.length) {\n            return false;\n        }\n        for (let i = 0, len = a.length; i < len; i++) {\n            if (!this.selectionsEqual(a[i], b[i])) {\n                return false;\n            }\n        }\n        return true;\n    }\n    /**\n     * Test if `obj` is an `ISelection`.\n     */\n    static isISelection(obj) {\n        return (!!obj\n            && (typeof obj.selectionStartLineNumber === 'number')\n            && (typeof obj.selectionStartColumn === 'number')\n            && (typeof obj.positionLineNumber === 'number')\n            && (typeof obj.positionColumn === 'number'));\n    }\n    /**\n     * Create with a direction.\n     */\n    static createWithDirection(startLineNumber, startColumn, endLineNumber, endColumn, direction) {\n        if (direction === 0 /* SelectionDirection.LTR */) {\n            return new Selection(startLineNumber, startColumn, endLineNumber, endColumn);\n        }\n        return new Selection(endLineNumber, endColumn, startLineNumber, startColumn);\n    }\n}\n\nexport { Selection };\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 *--------------------------------------------------------------------------------------------*/\nfunction createScopedLineTokens(context, offset) {\n    const tokenCount = context.getCount();\n    const tokenIndex = context.findTokenIndexAtOffset(offset);\n    const desiredLanguageId = context.getLanguageId(tokenIndex);\n    let lastTokenIndex = tokenIndex;\n    while (lastTokenIndex + 1 < tokenCount && context.getLanguageId(lastTokenIndex + 1) === desiredLanguageId) {\n        lastTokenIndex++;\n    }\n    let firstTokenIndex = tokenIndex;\n    while (firstTokenIndex > 0 && context.getLanguageId(firstTokenIndex - 1) === desiredLanguageId) {\n        firstTokenIndex--;\n    }\n    return new ScopedLineTokens(context, desiredLanguageId, firstTokenIndex, lastTokenIndex + 1, context.getStartOffset(firstTokenIndex), context.getEndOffset(lastTokenIndex));\n}\nclass ScopedLineTokens {\n    constructor(actual, languageId, firstTokenIndex, lastTokenIndex, firstCharOffset, lastCharOffset) {\n        this._scopedLineTokensBrand = undefined;\n        this._actual = actual;\n        this.languageId = languageId;\n        this._firstTokenIndex = firstTokenIndex;\n        this._lastTokenIndex = lastTokenIndex;\n        this.firstCharOffset = firstCharOffset;\n        this._lastCharOffset = lastCharOffset;\n        this.languageIdCodec = actual.languageIdCodec;\n    }\n    getLineContent() {\n        const actualLineContent = this._actual.getLineContent();\n        return actualLineContent.substring(this.firstCharOffset, this._lastCharOffset);\n    }\n    getLineLength() {\n        return this._lastCharOffset - this.firstCharOffset;\n    }\n    getActualLineContentBefore(offset) {\n        const actualLineContent = this._actual.getLineContent();\n        return actualLineContent.substring(0, this.firstCharOffset + offset);\n    }\n    getTokenCount() {\n        return this._lastTokenIndex - this._firstTokenIndex;\n    }\n    findTokenIndexAtOffset(offset) {\n        return this._actual.findTokenIndexAtOffset(offset + this.firstCharOffset) - this._firstTokenIndex;\n    }\n    getStandardTokenType(tokenIndex) {\n        return this._actual.getStandardTokenType(tokenIndex + this._firstTokenIndex);\n    }\n    toIViewLineTokens() {\n        return this._actual.sliceAndInflate(this.firstCharOffset, this._lastCharOffset, 0);\n    }\n}\nfunction ignoreBracketsInToken(standardTokenType) {\n    return (standardTokenType & 3 /* IgnoreBracketsInTokens.value */) !== 0;\n}\n\nexport { ScopedLineTokens, createScopedLineTokens, ignoreBracketsInToken };\n","import { isFullWidthCharacter, isEmojiImprecise, GraphemeIterator, getNextCodePoint } from '../../../base/common/strings.js';\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/**\n * A column in a position is the gap between two adjacent characters. The methods here\n * work with a concept called \"visible column\". A visible column is a very rough approximation\n * of the horizontal screen position of a column. For example, using a tab size of 4:\n * ```txt\n * |<TAB>|<TAB>|T|ext\n * |     |     | \\---- column = 4, visible column = 9\n * |     |     \\------ column = 3, visible column = 8\n * |     \\------------ column = 2, visible column = 4\n * \\------------------ column = 1, visible column = 0\n * ```\n *\n * **NOTE**: Visual columns do not work well for RTL text or variable-width fonts or characters.\n *\n * **NOTE**: These methods work and make sense both on the model and on the view model.\n */\nclass CursorColumns {\n    static _nextVisibleColumn(codePoint, visibleColumn, tabSize) {\n        if (codePoint === 9 /* CharCode.Tab */) {\n            return CursorColumns.nextRenderTabStop(visibleColumn, tabSize);\n        }\n        if (isFullWidthCharacter(codePoint) || isEmojiImprecise(codePoint)) {\n            return visibleColumn + 2;\n        }\n        return visibleColumn + 1;\n    }\n    /**\n     * Returns a visible column from a column.\n     * @see {@link CursorColumns}\n     */\n    static visibleColumnFromColumn(lineContent, column, tabSize) {\n        const textLen = Math.min(column - 1, lineContent.length);\n        const text = lineContent.substring(0, textLen);\n        const iterator = new GraphemeIterator(text);\n        let result = 0;\n        while (!iterator.eol()) {\n            const codePoint = getNextCodePoint(text, textLen, iterator.offset);\n            iterator.nextGraphemeLength();\n            result = this._nextVisibleColumn(codePoint, result, tabSize);\n        }\n        return result;\n    }\n    /**\n     * Returns a column from a visible column.\n     * @see {@link CursorColumns}\n     */\n    static columnFromVisibleColumn(lineContent, visibleColumn, tabSize) {\n        if (visibleColumn <= 0) {\n            return 1;\n        }\n        const lineContentLength = lineContent.length;\n        const iterator = new GraphemeIterator(lineContent);\n        let beforeVisibleColumn = 0;\n        let beforeColumn = 1;\n        while (!iterator.eol()) {\n            const codePoint = getNextCodePoint(lineContent, lineContentLength, iterator.offset);\n            iterator.nextGraphemeLength();\n            const afterVisibleColumn = this._nextVisibleColumn(codePoint, beforeVisibleColumn, tabSize);\n            const afterColumn = iterator.offset + 1;\n            if (afterVisibleColumn >= visibleColumn) {\n                const beforeDelta = visibleColumn - beforeVisibleColumn;\n                const afterDelta = afterVisibleColumn - visibleColumn;\n                if (afterDelta < beforeDelta) {\n                    return afterColumn;\n                }\n                else {\n                    return beforeColumn;\n                }\n            }\n            beforeVisibleColumn = afterVisibleColumn;\n            beforeColumn = afterColumn;\n        }\n        // walked the entire string\n        return lineContentLength + 1;\n    }\n    /**\n     * ATTENTION: This works with 0-based columns (as opposed to the regular 1-based columns)\n     * @see {@link CursorColumns}\n     */\n    static nextRenderTabStop(visibleColumn, tabSize) {\n        return visibleColumn + tabSize - visibleColumn % tabSize;\n    }\n    /**\n     * ATTENTION: This works with 0-based columns (as opposed to the regular 1-based columns)\n     * @see {@link CursorColumns}\n     */\n    static nextIndentTabStop(visibleColumn, indentSize) {\n        return CursorColumns.nextRenderTabStop(visibleColumn, indentSize);\n    }\n    /**\n     * ATTENTION: This works with 0-based columns (as opposed to the regular 1-based columns)\n     * @see {@link CursorColumns}\n     */\n    static prevRenderTabStop(column, tabSize) {\n        return Math.max(0, column - 1 - (column - 1) % tabSize);\n    }\n    /**\n     * ATTENTION: This works with 0-based columns (as opposed to the regular 1-based columns)\n     * @see {@link CursorColumns}\n     */\n    static prevIndentTabStop(column, indentSize) {\n        return CursorColumns.prevRenderTabStop(column, indentSize);\n    }\n}\n\nexport { CursorColumns };\n","import { firstNonWhitespaceIndex } from '../../../../base/common/strings.js';\nimport { CursorColumns } from '../cursorColumns.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction _normalizeIndentationFromWhitespace(str, indentSize, insertSpaces) {\n    let spacesCnt = 0;\n    for (let i = 0; i < str.length; i++) {\n        if (str.charAt(i) === '\\t') {\n            spacesCnt = CursorColumns.nextIndentTabStop(spacesCnt, indentSize);\n        }\n        else {\n            spacesCnt++;\n        }\n    }\n    let result = '';\n    if (!insertSpaces) {\n        const tabsCnt = Math.floor(spacesCnt / indentSize);\n        spacesCnt = spacesCnt % indentSize;\n        for (let i = 0; i < tabsCnt; i++) {\n            result += '\\t';\n        }\n    }\n    for (let i = 0; i < spacesCnt; i++) {\n        result += ' ';\n    }\n    return result;\n}\nfunction normalizeIndentation(str, indentSize, insertSpaces) {\n    let firstNonWhitespaceIndex$1 = firstNonWhitespaceIndex(str);\n    if (firstNonWhitespaceIndex$1 === -1) {\n        firstNonWhitespaceIndex$1 = str.length;\n    }\n    return _normalizeIndentationFromWhitespace(str.substring(0, firstNonWhitespaceIndex$1), indentSize, insertSpaces) + str.substring(firstNonWhitespaceIndex$1);\n}\n\nexport { normalizeIndentation };\n","import { Emitter } from '../../base/common/event.js';\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 *--------------------------------------------------------------------------------------------*/\nclass InputModeImpl {\n    constructor() {\n        this._inputMode = 'insert';\n        this._onDidChangeInputMode = new Emitter();\n        this.onDidChangeInputMode = this._onDidChangeInputMode.event;\n    }\n    getInputMode() {\n        return this._inputMode;\n    }\n}\n/**\n * Controls the type mode, whether insert or overtype\n */\nconst InputMode = new InputModeImpl();\n\nexport { InputMode };\n","import { Position } from './core/position.js';\nimport { Range } from './core/range.js';\nimport { Selection } from './core/selection.js';\nimport { createScopedLineTokens } from './languages/supports.js';\nimport { CursorColumns } from './core/cursorColumns.js';\nimport { normalizeIndentation } from './core/misc/indentation.js';\nimport { InputMode } from './inputMode.js';\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 *--------------------------------------------------------------------------------------------*/\nconst autoCloseAlways = () => true;\nconst autoCloseNever = () => false;\nconst autoCloseBeforeWhitespace = (chr) => (chr === ' ' || chr === '\\t');\nclass CursorConfiguration {\n    static shouldRecreate(e) {\n        return (e.hasChanged(165 /* EditorOption.layoutInfo */)\n            || e.hasChanged(148 /* EditorOption.wordSeparators */)\n            || e.hasChanged(45 /* EditorOption.emptySelectionClipboard */)\n            || e.hasChanged(85 /* EditorOption.multiCursorMergeOverlapping */)\n            || e.hasChanged(88 /* EditorOption.multiCursorPaste */)\n            || e.hasChanged(89 /* EditorOption.multiCursorLimit */)\n            || e.hasChanged(10 /* EditorOption.autoClosingBrackets */)\n            || e.hasChanged(11 /* EditorOption.autoClosingComments */)\n            || e.hasChanged(15 /* EditorOption.autoClosingQuotes */)\n            || e.hasChanged(13 /* EditorOption.autoClosingDelete */)\n            || e.hasChanged(14 /* EditorOption.autoClosingOvertype */)\n            || e.hasChanged(20 /* EditorOption.autoSurround */)\n            || e.hasChanged(145 /* EditorOption.useTabStops */)\n            || e.hasChanged(141 /* EditorOption.trimWhitespaceOnDelete */)\n            || e.hasChanged(59 /* EditorOption.fontInfo */)\n            || e.hasChanged(104 /* EditorOption.readOnly */)\n            || e.hasChanged(147 /* EditorOption.wordSegmenterLocales */)\n            || e.hasChanged(93 /* EditorOption.overtypeOnPaste */));\n    }\n    constructor(languageId, modelOptions, configuration, languageConfigurationService) {\n        this.languageConfigurationService = languageConfigurationService;\n        this._cursorMoveConfigurationBrand = undefined;\n        this._languageId = languageId;\n        const options = configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        this.readOnly = options.get(104 /* EditorOption.readOnly */);\n        this.tabSize = modelOptions.tabSize;\n        this.indentSize = modelOptions.indentSize;\n        this.insertSpaces = modelOptions.insertSpaces;\n        this.stickyTabStops = options.get(132 /* EditorOption.stickyTabStops */);\n        this.lineHeight = fontInfo.lineHeight;\n        this.typicalHalfwidthCharacterWidth = fontInfo.typicalHalfwidthCharacterWidth;\n        this.pageSize = Math.max(1, Math.floor(layoutInfo.height / this.lineHeight) - 2);\n        this.useTabStops = options.get(145 /* EditorOption.useTabStops */);\n        this.trimWhitespaceOnDelete = options.get(141 /* EditorOption.trimWhitespaceOnDelete */);\n        this.wordSeparators = options.get(148 /* EditorOption.wordSeparators */);\n        this.emptySelectionClipboard = options.get(45 /* EditorOption.emptySelectionClipboard */);\n        this.copyWithSyntaxHighlighting = options.get(31 /* EditorOption.copyWithSyntaxHighlighting */);\n        this.multiCursorMergeOverlapping = options.get(85 /* EditorOption.multiCursorMergeOverlapping */);\n        this.multiCursorPaste = options.get(88 /* EditorOption.multiCursorPaste */);\n        this.multiCursorLimit = options.get(89 /* EditorOption.multiCursorLimit */);\n        this.autoClosingBrackets = options.get(10 /* EditorOption.autoClosingBrackets */);\n        this.autoClosingComments = options.get(11 /* EditorOption.autoClosingComments */);\n        this.autoClosingQuotes = options.get(15 /* EditorOption.autoClosingQuotes */);\n        this.autoClosingDelete = options.get(13 /* EditorOption.autoClosingDelete */);\n        this.autoClosingOvertype = options.get(14 /* EditorOption.autoClosingOvertype */);\n        this.autoSurround = options.get(20 /* EditorOption.autoSurround */);\n        this.autoIndent = options.get(16 /* EditorOption.autoIndent */);\n        this.wordSegmenterLocales = options.get(147 /* EditorOption.wordSegmenterLocales */);\n        this.overtypeOnPaste = options.get(93 /* EditorOption.overtypeOnPaste */);\n        this.surroundingPairs = {};\n        this._electricChars = null;\n        this.shouldAutoCloseBefore = {\n            quote: this._getShouldAutoClose(languageId, this.autoClosingQuotes, true),\n            comment: this._getShouldAutoClose(languageId, this.autoClosingComments, false),\n            bracket: this._getShouldAutoClose(languageId, this.autoClosingBrackets, false),\n        };\n        this.autoClosingPairs = this.languageConfigurationService.getLanguageConfiguration(languageId).getAutoClosingPairs();\n        const surroundingPairs = this.languageConfigurationService.getLanguageConfiguration(languageId).getSurroundingPairs();\n        if (surroundingPairs) {\n            for (const pair of surroundingPairs) {\n                this.surroundingPairs[pair.open] = pair.close;\n            }\n        }\n        const commentsConfiguration = this.languageConfigurationService.getLanguageConfiguration(languageId).comments;\n        this.blockCommentStartToken = commentsConfiguration?.blockCommentStartToken ?? null;\n    }\n    get electricChars() {\n        if (!this._electricChars) {\n            this._electricChars = {};\n            const electricChars = this.languageConfigurationService.getLanguageConfiguration(this._languageId).electricCharacter?.getElectricCharacters();\n            if (electricChars) {\n                for (const char of electricChars) {\n                    this._electricChars[char] = true;\n                }\n            }\n        }\n        return this._electricChars;\n    }\n    get inputMode() {\n        return InputMode.getInputMode();\n    }\n    /**\n     * Should return opening bracket type to match indentation with\n     */\n    onElectricCharacter(character, context, column) {\n        const scopedLineTokens = createScopedLineTokens(context, column - 1);\n        const electricCharacterSupport = this.languageConfigurationService.getLanguageConfiguration(scopedLineTokens.languageId).electricCharacter;\n        if (!electricCharacterSupport) {\n            return null;\n        }\n        return electricCharacterSupport.onElectricCharacter(character, scopedLineTokens, column - scopedLineTokens.firstCharOffset);\n    }\n    normalizeIndentation(str) {\n        return normalizeIndentation(str, this.indentSize, this.insertSpaces);\n    }\n    _getShouldAutoClose(languageId, autoCloseConfig, forQuotes) {\n        switch (autoCloseConfig) {\n            case 'beforeWhitespace':\n                return autoCloseBeforeWhitespace;\n            case 'languageDefined':\n                return this._getLanguageDefinedShouldAutoClose(languageId, forQuotes);\n            case 'always':\n                return autoCloseAlways;\n            case 'never':\n                return autoCloseNever;\n        }\n    }\n    _getLanguageDefinedShouldAutoClose(languageId, forQuotes) {\n        const autoCloseBeforeSet = this.languageConfigurationService.getLanguageConfiguration(languageId).getAutoCloseBeforeSet(forQuotes);\n        return c => autoCloseBeforeSet.indexOf(c) !== -1;\n    }\n    /**\n     * Returns a visible column from a column.\n     * @see {@link CursorColumns}\n     */\n    visibleColumnFromColumn(model, position) {\n        return CursorColumns.visibleColumnFromColumn(model.getLineContent(position.lineNumber), position.column, this.tabSize);\n    }\n    /**\n     * Returns a visible column from a column.\n     * @see {@link CursorColumns}\n     */\n    columnFromVisibleColumn(model, lineNumber, visibleColumn) {\n        const result = CursorColumns.columnFromVisibleColumn(model.getLineContent(lineNumber), visibleColumn, this.tabSize);\n        const minColumn = model.getLineMinColumn(lineNumber);\n        if (result < minColumn) {\n            return minColumn;\n        }\n        const maxColumn = model.getLineMaxColumn(lineNumber);\n        if (result > maxColumn) {\n            return maxColumn;\n        }\n        return result;\n    }\n}\nclass CursorState {\n    static fromModelState(modelState) {\n        return new PartialModelCursorState(modelState);\n    }\n    static fromViewState(viewState) {\n        return new PartialViewCursorState(viewState);\n    }\n    static fromModelSelection(modelSelection) {\n        const selection = Selection.liftSelection(modelSelection);\n        const modelState = new SingleCursorState(Range.fromPositions(selection.getSelectionStart()), 0 /* SelectionStartKind.Simple */, 0, selection.getPosition(), 0);\n        return CursorState.fromModelState(modelState);\n    }\n    static fromModelSelections(modelSelections) {\n        const states = [];\n        for (let i = 0, len = modelSelections.length; i < len; i++) {\n            states[i] = this.fromModelSelection(modelSelections[i]);\n        }\n        return states;\n    }\n    constructor(modelState, viewState) {\n        this._cursorStateBrand = undefined;\n        this.modelState = modelState;\n        this.viewState = viewState;\n    }\n    equals(other) {\n        return (this.viewState.equals(other.viewState) && this.modelState.equals(other.modelState));\n    }\n}\nclass PartialModelCursorState {\n    constructor(modelState) {\n        this.modelState = modelState;\n        this.viewState = null;\n    }\n}\nclass PartialViewCursorState {\n    constructor(viewState) {\n        this.modelState = null;\n        this.viewState = viewState;\n    }\n}\n/**\n * Represents the cursor state on either the model or on the view model.\n */\nclass SingleCursorState {\n    constructor(selectionStart, selectionStartKind, selectionStartLeftoverVisibleColumns, position, leftoverVisibleColumns) {\n        this.selectionStart = selectionStart;\n        this.selectionStartKind = selectionStartKind;\n        this.selectionStartLeftoverVisibleColumns = selectionStartLeftoverVisibleColumns;\n        this.position = position;\n        this.leftoverVisibleColumns = leftoverVisibleColumns;\n        this._singleCursorStateBrand = undefined;\n        this.selection = SingleCursorState._computeSelection(this.selectionStart, this.position);\n    }\n    equals(other) {\n        return (this.selectionStartLeftoverVisibleColumns === other.selectionStartLeftoverVisibleColumns\n            && this.leftoverVisibleColumns === other.leftoverVisibleColumns\n            && this.selectionStartKind === other.selectionStartKind\n            && this.position.equals(other.position)\n            && this.selectionStart.equalsRange(other.selectionStart));\n    }\n    hasSelection() {\n        return (!this.selection.isEmpty() || !this.selectionStart.isEmpty());\n    }\n    move(inSelectionMode, lineNumber, column, leftoverVisibleColumns) {\n        if (inSelectionMode) {\n            // move just position\n            return new SingleCursorState(this.selectionStart, this.selectionStartKind, this.selectionStartLeftoverVisibleColumns, new Position(lineNumber, column), leftoverVisibleColumns);\n        }\n        else {\n            // move everything\n            return new SingleCursorState(new Range(lineNumber, column, lineNumber, column), 0 /* SelectionStartKind.Simple */, leftoverVisibleColumns, new Position(lineNumber, column), leftoverVisibleColumns);\n        }\n    }\n    static _computeSelection(selectionStart, position) {\n        if (selectionStart.isEmpty() || !position.isBeforeOrEqual(selectionStart.getStartPosition())) {\n            return Selection.fromPositions(selectionStart.getStartPosition(), position);\n        }\n        else {\n            return Selection.fromPositions(selectionStart.getEndPosition(), position);\n        }\n    }\n}\nclass EditOperationResult {\n    constructor(type, commands, opts) {\n        this._editOperationResultBrand = undefined;\n        this.type = type;\n        this.commands = commands;\n        this.shouldPushStackElementBefore = opts.shouldPushStackElementBefore;\n        this.shouldPushStackElementAfter = opts.shouldPushStackElementAfter;\n    }\n}\nfunction isQuote(ch) {\n    return (ch === '\\'' || ch === '\"' || ch === '`');\n}\n\nexport { CursorConfiguration, CursorState, EditOperationResult, PartialModelCursorState, PartialViewCursorState, SingleCursorState, isQuote };\n","import { SingleCursorState } from '../cursorCommon.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ColumnSelection {\n    static columnSelect(config, model, fromLineNumber, fromVisibleColumn, toLineNumber, toVisibleColumn) {\n        const lineCount = Math.abs(toLineNumber - fromLineNumber) + 1;\n        const reversed = (fromLineNumber > toLineNumber);\n        const isRTL = (fromVisibleColumn > toVisibleColumn);\n        const isLTR = (fromVisibleColumn < toVisibleColumn);\n        const result = [];\n        // console.log(`fromVisibleColumn: ${fromVisibleColumn}, toVisibleColumn: ${toVisibleColumn}`);\n        for (let i = 0; i < lineCount; i++) {\n            const lineNumber = fromLineNumber + (reversed ? -i : i);\n            const startColumn = config.columnFromVisibleColumn(model, lineNumber, fromVisibleColumn);\n            const endColumn = config.columnFromVisibleColumn(model, lineNumber, toVisibleColumn);\n            const visibleStartColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, startColumn));\n            const visibleEndColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, endColumn));\n            // console.log(`lineNumber: ${lineNumber}: visibleStartColumn: ${visibleStartColumn}, visibleEndColumn: ${visibleEndColumn}`);\n            if (isLTR) {\n                if (visibleStartColumn > toVisibleColumn) {\n                    continue;\n                }\n                if (visibleEndColumn < fromVisibleColumn) {\n                    continue;\n                }\n            }\n            if (isRTL) {\n                if (visibleEndColumn > fromVisibleColumn) {\n                    continue;\n                }\n                if (visibleStartColumn < toVisibleColumn) {\n                    continue;\n                }\n            }\n            result.push(new SingleCursorState(new Range(lineNumber, startColumn, lineNumber, startColumn), 0 /* SelectionStartKind.Simple */, 0, new Position(lineNumber, endColumn), 0));\n        }\n        if (result.length === 0) {\n            // We are after all the lines, so add cursor at the end of each line\n            for (let i = 0; i < lineCount; i++) {\n                const lineNumber = fromLineNumber + (reversed ? -i : i);\n                const maxColumn = model.getLineMaxColumn(lineNumber);\n                result.push(new SingleCursorState(new Range(lineNumber, maxColumn, lineNumber, maxColumn), 0 /* SelectionStartKind.Simple */, 0, new Position(lineNumber, maxColumn), 0));\n            }\n        }\n        return {\n            viewStates: result,\n            reversed: reversed,\n            fromLineNumber: fromLineNumber,\n            fromVisualColumn: fromVisibleColumn,\n            toLineNumber: toLineNumber,\n            toVisualColumn: toVisibleColumn\n        };\n    }\n    static columnSelectLeft(config, model, prevColumnSelectData) {\n        let toViewVisualColumn = prevColumnSelectData.toViewVisualColumn;\n        if (toViewVisualColumn > 0) {\n            toViewVisualColumn--;\n        }\n        return ColumnSelection.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, prevColumnSelectData.toViewLineNumber, toViewVisualColumn);\n    }\n    static columnSelectRight(config, model, prevColumnSelectData) {\n        let maxVisualViewColumn = 0;\n        const minViewLineNumber = Math.min(prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.toViewLineNumber);\n        const maxViewLineNumber = Math.max(prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.toViewLineNumber);\n        for (let lineNumber = minViewLineNumber; lineNumber <= maxViewLineNumber; lineNumber++) {\n            const lineMaxViewColumn = model.getLineMaxColumn(lineNumber);\n            const lineMaxVisualViewColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, lineMaxViewColumn));\n            maxVisualViewColumn = Math.max(maxVisualViewColumn, lineMaxVisualViewColumn);\n        }\n        let toViewVisualColumn = prevColumnSelectData.toViewVisualColumn;\n        if (toViewVisualColumn < maxVisualViewColumn) {\n            toViewVisualColumn++;\n        }\n        return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, prevColumnSelectData.toViewLineNumber, toViewVisualColumn);\n    }\n    static columnSelectUp(config, model, prevColumnSelectData, isPaged) {\n        const linesCount = isPaged ? config.pageSize : 1;\n        const toViewLineNumber = Math.max(1, prevColumnSelectData.toViewLineNumber - linesCount);\n        return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, toViewLineNumber, prevColumnSelectData.toViewVisualColumn);\n    }\n    static columnSelectDown(config, model, prevColumnSelectData, isPaged) {\n        const linesCount = isPaged ? config.pageSize : 1;\n        const toViewLineNumber = Math.min(model.getLineCount(), prevColumnSelectData.toViewLineNumber + linesCount);\n        return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, toViewLineNumber, prevColumnSelectData.toViewVisualColumn);\n    }\n}\n\nexport { ColumnSelection };\n","import { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { Selection } from '../core/selection.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ReplaceCommand {\n    constructor(range, text, insertsAutoWhitespace = false) {\n        this._range = range;\n        this._text = text;\n        this.insertsAutoWhitespace = insertsAutoWhitespace;\n    }\n    getEditOperations(model, builder) {\n        builder.addTrackedEditOperation(this._range, this._text);\n    }\n    computeCursorState(model, helper) {\n        const inverseEditOperations = helper.getInverseEditOperations();\n        const srcRange = inverseEditOperations[0].range;\n        return Selection.fromPositions(srcRange.getEndPosition());\n    }\n}\nclass ReplaceOvertypeCommand {\n    constructor(range, text, insertsAutoWhitespace = false) {\n        this._range = range;\n        this._text = text;\n        this.insertsAutoWhitespace = insertsAutoWhitespace;\n    }\n    getEditOperations(model, builder) {\n        const intialStartPosition = this._range.getStartPosition();\n        const initialEndPosition = this._range.getEndPosition();\n        const initialEndLineNumber = initialEndPosition.lineNumber;\n        const offsetDelta = this._text.length + (this._range.isEmpty() ? 0 : -1);\n        let endPosition = addPositiveOffsetToModelPosition(model, initialEndPosition, offsetDelta);\n        if (endPosition.lineNumber > initialEndLineNumber) {\n            endPosition = new Position(initialEndLineNumber, model.getLineMaxColumn(initialEndLineNumber));\n        }\n        const replaceRange = Range.fromPositions(intialStartPosition, endPosition);\n        builder.addTrackedEditOperation(replaceRange, this._text);\n    }\n    computeCursorState(model, helper) {\n        const inverseEditOperations = helper.getInverseEditOperations();\n        const srcRange = inverseEditOperations[0].range;\n        return Selection.fromPositions(srcRange.getEndPosition());\n    }\n}\nclass ReplaceCommandThatSelectsText {\n    constructor(range, text) {\n        this._range = range;\n        this._text = text;\n    }\n    getEditOperations(model, builder) {\n        builder.addTrackedEditOperation(this._range, this._text);\n    }\n    computeCursorState(model, helper) {\n        const inverseEditOperations = helper.getInverseEditOperations();\n        const srcRange = inverseEditOperations[0].range;\n        return Selection.fromRange(srcRange, 0 /* SelectionDirection.LTR */);\n    }\n}\nclass ReplaceCommandWithoutChangingPosition {\n    constructor(range, text, insertsAutoWhitespace = false) {\n        this._range = range;\n        this._text = text;\n        this.insertsAutoWhitespace = insertsAutoWhitespace;\n    }\n    getEditOperations(model, builder) {\n        builder.addTrackedEditOperation(this._range, this._text);\n    }\n    computeCursorState(model, helper) {\n        const inverseEditOperations = helper.getInverseEditOperations();\n        const srcRange = inverseEditOperations[0].range;\n        return Selection.fromPositions(srcRange.getStartPosition());\n    }\n}\nclass ReplaceCommandWithOffsetCursorState {\n    constructor(range, text, lineNumberDeltaOffset, columnDeltaOffset, insertsAutoWhitespace = false) {\n        this._range = range;\n        this._text = text;\n        this._columnDeltaOffset = columnDeltaOffset;\n        this._lineNumberDeltaOffset = lineNumberDeltaOffset;\n        this.insertsAutoWhitespace = insertsAutoWhitespace;\n    }\n    getEditOperations(model, builder) {\n        builder.addTrackedEditOperation(this._range, this._text);\n    }\n    computeCursorState(model, helper) {\n        const inverseEditOperations = helper.getInverseEditOperations();\n        const srcRange = inverseEditOperations[0].range;\n        return Selection.fromPositions(srcRange.getEndPosition().delta(this._lineNumberDeltaOffset, this._columnDeltaOffset));\n    }\n}\nclass ReplaceOvertypeCommandOnCompositionEnd {\n    constructor(range) {\n        this._range = range;\n    }\n    getEditOperations(model, builder) {\n        const text = model.getValueInRange(this._range);\n        const initialEndPosition = this._range.getEndPosition();\n        const initialEndLineNumber = initialEndPosition.lineNumber;\n        let endPosition = addPositiveOffsetToModelPosition(model, initialEndPosition, text.length);\n        if (endPosition.lineNumber > initialEndLineNumber) {\n            endPosition = new Position(initialEndLineNumber, model.getLineMaxColumn(initialEndLineNumber));\n        }\n        const replaceRange = Range.fromPositions(initialEndPosition, endPosition);\n        builder.addTrackedEditOperation(replaceRange, '');\n    }\n    computeCursorState(model, helper) {\n        const inverseEditOperations = helper.getInverseEditOperations();\n        const srcRange = inverseEditOperations[0].range;\n        return Selection.fromPositions(srcRange.getEndPosition());\n    }\n}\nclass ReplaceCommandThatPreservesSelection {\n    constructor(editRange, text, initialSelection, forceMoveMarkers = false) {\n        this._range = editRange;\n        this._text = text;\n        this._initialSelection = initialSelection;\n        this._forceMoveMarkers = forceMoveMarkers;\n        this._selectionId = null;\n    }\n    getEditOperations(model, builder) {\n        builder.addTrackedEditOperation(this._range, this._text, this._forceMoveMarkers);\n        this._selectionId = builder.trackSelection(this._initialSelection);\n    }\n    computeCursorState(model, helper) {\n        return helper.getTrackedSelection(this._selectionId);\n    }\n}\nfunction addPositiveOffsetToModelPosition(model, position, offset) {\n    if (offset < 0) {\n        throw new Error('Unexpected negative delta');\n    }\n    const lineCount = model.getLineCount();\n    let endPosition = new Position(lineCount, model.getLineMaxColumn(lineCount));\n    for (let lineNumber = position.lineNumber; lineNumber <= lineCount; lineNumber++) {\n        if (lineNumber === position.lineNumber) {\n            const futureOffset = offset - model.getLineMaxColumn(position.lineNumber) + position.column;\n            if (futureOffset <= 0) {\n                endPosition = new Position(position.lineNumber, position.column + offset);\n                break;\n            }\n            offset = futureOffset;\n        }\n        else {\n            const futureOffset = offset - model.getLineMaxColumn(lineNumber);\n            if (futureOffset <= 0) {\n                endPosition = new Position(lineNumber, offset);\n                break;\n            }\n            offset = futureOffset;\n        }\n    }\n    return endPosition;\n}\n\nexport { ReplaceCommand, ReplaceCommandThatPreservesSelection, ReplaceCommandThatSelectsText, ReplaceCommandWithOffsetCursorState, ReplaceCommandWithoutChangingPosition, ReplaceOvertypeCommand, ReplaceOvertypeCommandOnCompositionEnd };\n","import { CursorColumns } from '../core/cursorColumns.js';\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 *--------------------------------------------------------------------------------------------*/\nclass AtomicTabMoveOperations {\n    /**\n     * Get the visible column at the position. If we get to a non-whitespace character first\n     * or past the end of string then return -1.\n     *\n     * **Note** `position` and the return value are 0-based.\n     */\n    static whitespaceVisibleColumn(lineContent, position, tabSize) {\n        const lineLength = lineContent.length;\n        let visibleColumn = 0;\n        let prevTabStopPosition = -1;\n        let prevTabStopVisibleColumn = -1;\n        for (let i = 0; i < lineLength; i++) {\n            if (i === position) {\n                return [prevTabStopPosition, prevTabStopVisibleColumn, visibleColumn];\n            }\n            if (visibleColumn % tabSize === 0) {\n                prevTabStopPosition = i;\n                prevTabStopVisibleColumn = visibleColumn;\n            }\n            const chCode = lineContent.charCodeAt(i);\n            switch (chCode) {\n                case 32 /* CharCode.Space */:\n                    visibleColumn += 1;\n                    break;\n                case 9 /* CharCode.Tab */:\n                    // Skip to the next multiple of tabSize.\n                    visibleColumn = CursorColumns.nextRenderTabStop(visibleColumn, tabSize);\n                    break;\n                default:\n                    return [-1, -1, -1];\n            }\n        }\n        if (position === lineLength) {\n            return [prevTabStopPosition, prevTabStopVisibleColumn, visibleColumn];\n        }\n        return [-1, -1, -1];\n    }\n    /**\n     * Return the position that should result from a move left, right or to the\n     * nearest tab, if atomic tabs are enabled. Left and right are used for the\n     * arrow key movements, nearest is used for mouse selection. It returns\n     * -1 if atomic tabs are not relevant and you should fall back to normal\n     * behaviour.\n     *\n     * **Note**: `position` and the return value are 0-based.\n     */\n    static atomicPosition(lineContent, position, tabSize, direction) {\n        const lineLength = lineContent.length;\n        // Get the 0-based visible column corresponding to the position, or return\n        // -1 if it is not in the initial whitespace.\n        const [prevTabStopPosition, prevTabStopVisibleColumn, visibleColumn] = AtomicTabMoveOperations.whitespaceVisibleColumn(lineContent, position, tabSize);\n        if (visibleColumn === -1) {\n            return -1;\n        }\n        // Is the output left or right of the current position. The case for nearest\n        // where it is the same as the current position is handled in the switch.\n        let left;\n        switch (direction) {\n            case 0 /* Direction.Left */:\n                left = true;\n                break;\n            case 1 /* Direction.Right */:\n                left = false;\n                break;\n            case 2 /* Direction.Nearest */:\n                // The code below assumes the output position is either left or right\n                // of the input position. If it is the same, return immediately.\n                if (visibleColumn % tabSize === 0) {\n                    return position;\n                }\n                // Go to the nearest indentation.\n                left = visibleColumn % tabSize <= (tabSize / 2);\n                break;\n        }\n        // If going left, we can just use the info about the last tab stop position and\n        // last tab stop visible column that we computed in the first walk over the whitespace.\n        if (left) {\n            if (prevTabStopPosition === -1) {\n                return -1;\n            }\n            // If the direction is left, we need to keep scanning right to ensure\n            // that targetVisibleColumn + tabSize is before non-whitespace.\n            // This is so that when we press left at the end of a partial\n            // indentation it only goes one character. For example '      foo' with\n            // tabSize 4, should jump from position 6 to position 5, not 4.\n            let currentVisibleColumn = prevTabStopVisibleColumn;\n            for (let i = prevTabStopPosition; i < lineLength; ++i) {\n                if (currentVisibleColumn === prevTabStopVisibleColumn + tabSize) {\n                    // It is a full indentation.\n                    return prevTabStopPosition;\n                }\n                const chCode = lineContent.charCodeAt(i);\n                switch (chCode) {\n                    case 32 /* CharCode.Space */:\n                        currentVisibleColumn += 1;\n                        break;\n                    case 9 /* CharCode.Tab */:\n                        currentVisibleColumn = CursorColumns.nextRenderTabStop(currentVisibleColumn, tabSize);\n                        break;\n                    default:\n                        return -1;\n                }\n            }\n            if (currentVisibleColumn === prevTabStopVisibleColumn + tabSize) {\n                return prevTabStopPosition;\n            }\n            // It must have been a partial indentation.\n            return -1;\n        }\n        // We are going right.\n        const targetVisibleColumn = CursorColumns.nextRenderTabStop(visibleColumn, tabSize);\n        // We can just continue from where whitespaceVisibleColumn got to.\n        let currentVisibleColumn = visibleColumn;\n        for (let i = position; i < lineLength; i++) {\n            if (currentVisibleColumn === targetVisibleColumn) {\n                return i;\n            }\n            const chCode = lineContent.charCodeAt(i);\n            switch (chCode) {\n                case 32 /* CharCode.Space */:\n                    currentVisibleColumn += 1;\n                    break;\n                case 9 /* CharCode.Tab */:\n                    currentVisibleColumn = CursorColumns.nextRenderTabStop(currentVisibleColumn, tabSize);\n                    break;\n                default:\n                    return -1;\n            }\n        }\n        // This condition handles when the target column is at the end of the line.\n        if (currentVisibleColumn === targetVisibleColumn) {\n            return lineLength;\n        }\n        return -1;\n    }\n}\n\nexport { AtomicTabMoveOperations };\n","import { prevCharLength, nextCharLength } from '../../../base/common/strings.js';\nimport { CursorColumns } from '../core/cursorColumns.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { AtomicTabMoveOperations } from './cursorAtomicMoveOperations.js';\nimport { SingleCursorState } from '../cursorCommon.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CursorPosition {\n    constructor(lineNumber, column, leftoverVisibleColumns) {\n        this._cursorPositionBrand = undefined;\n        this.lineNumber = lineNumber;\n        this.column = column;\n        this.leftoverVisibleColumns = leftoverVisibleColumns;\n    }\n}\nclass MoveOperations {\n    static leftPosition(model, position) {\n        if (position.column > model.getLineMinColumn(position.lineNumber)) {\n            return position.delta(undefined, -prevCharLength(model.getLineContent(position.lineNumber), position.column - 1));\n        }\n        else if (position.lineNumber > 1) {\n            const newLineNumber = position.lineNumber - 1;\n            return new Position(newLineNumber, model.getLineMaxColumn(newLineNumber));\n        }\n        else {\n            return position;\n        }\n    }\n    static leftPositionAtomicSoftTabs(model, position, tabSize) {\n        if (position.column <= model.getLineIndentColumn(position.lineNumber)) {\n            const minColumn = model.getLineMinColumn(position.lineNumber);\n            const lineContent = model.getLineContent(position.lineNumber);\n            const newPosition = AtomicTabMoveOperations.atomicPosition(lineContent, position.column - 1, tabSize, 0 /* Direction.Left */);\n            if (newPosition !== -1 && newPosition + 1 >= minColumn) {\n                return new Position(position.lineNumber, newPosition + 1);\n            }\n        }\n        return this.leftPosition(model, position);\n    }\n    static left(config, model, position) {\n        const pos = config.stickyTabStops\n            ? MoveOperations.leftPositionAtomicSoftTabs(model, position, config.tabSize)\n            : MoveOperations.leftPosition(model, position);\n        return new CursorPosition(pos.lineNumber, pos.column, 0);\n    }\n    /**\n     * @param noOfColumns Must be either `1`\n     * or `Math.round(viewModel.getLineContent(viewLineNumber).length / 2)` (for half lines).\n    */\n    static moveLeft(config, model, cursor, inSelectionMode, noOfColumns) {\n        let lineNumber, column;\n        if (cursor.hasSelection() && !inSelectionMode) {\n            // If the user has a selection and does not want to extend it,\n            // put the cursor at the beginning of the selection.\n            lineNumber = cursor.selection.startLineNumber;\n            column = cursor.selection.startColumn;\n        }\n        else {\n            // This has no effect if noOfColumns === 1.\n            // It is ok to do so in the half-line scenario.\n            const pos = cursor.position.delta(undefined, -(noOfColumns - 1));\n            // We clip the position before normalization, as normalization is not defined\n            // for possibly negative columns.\n            const normalizedPos = model.normalizePosition(MoveOperations.clipPositionColumn(pos, model), 0 /* PositionAffinity.Left */);\n            const p = MoveOperations.left(config, model, normalizedPos);\n            lineNumber = p.lineNumber;\n            column = p.column;\n        }\n        return cursor.move(inSelectionMode, lineNumber, column, 0);\n    }\n    /**\n     * Adjusts the column so that it is within min/max of the line.\n    */\n    static clipPositionColumn(position, model) {\n        return new Position(position.lineNumber, MoveOperations.clipRange(position.column, model.getLineMinColumn(position.lineNumber), model.getLineMaxColumn(position.lineNumber)));\n    }\n    static clipRange(value, min, max) {\n        if (value < min) {\n            return min;\n        }\n        if (value > max) {\n            return max;\n        }\n        return value;\n    }\n    static rightPosition(model, lineNumber, column) {\n        if (column < model.getLineMaxColumn(lineNumber)) {\n            column = column + nextCharLength(model.getLineContent(lineNumber), column - 1);\n        }\n        else if (lineNumber < model.getLineCount()) {\n            lineNumber = lineNumber + 1;\n            column = model.getLineMinColumn(lineNumber);\n        }\n        return new Position(lineNumber, column);\n    }\n    static rightPositionAtomicSoftTabs(model, lineNumber, column, tabSize, indentSize) {\n        if (column < model.getLineIndentColumn(lineNumber)) {\n            const lineContent = model.getLineContent(lineNumber);\n            const newPosition = AtomicTabMoveOperations.atomicPosition(lineContent, column - 1, tabSize, 1 /* Direction.Right */);\n            if (newPosition !== -1) {\n                return new Position(lineNumber, newPosition + 1);\n            }\n        }\n        return this.rightPosition(model, lineNumber, column);\n    }\n    static right(config, model, position) {\n        const pos = config.stickyTabStops\n            ? MoveOperations.rightPositionAtomicSoftTabs(model, position.lineNumber, position.column, config.tabSize, config.indentSize)\n            : MoveOperations.rightPosition(model, position.lineNumber, position.column);\n        return new CursorPosition(pos.lineNumber, pos.column, 0);\n    }\n    static moveRight(config, model, cursor, inSelectionMode, noOfColumns) {\n        let lineNumber, column;\n        if (cursor.hasSelection() && !inSelectionMode) {\n            // If we are in selection mode, move right without selection cancels selection and puts cursor at the end of the selection\n            lineNumber = cursor.selection.endLineNumber;\n            column = cursor.selection.endColumn;\n        }\n        else {\n            const pos = cursor.position.delta(undefined, noOfColumns - 1);\n            const normalizedPos = model.normalizePosition(MoveOperations.clipPositionColumn(pos, model), 1 /* PositionAffinity.Right */);\n            const r = MoveOperations.right(config, model, normalizedPos);\n            lineNumber = r.lineNumber;\n            column = r.column;\n        }\n        return cursor.move(inSelectionMode, lineNumber, column, 0);\n    }\n    static vertical(config, model, lineNumber, column, leftoverVisibleColumns, newLineNumber, allowMoveOnEdgeLine, normalizationAffinity) {\n        const currentVisibleColumn = CursorColumns.visibleColumnFromColumn(model.getLineContent(lineNumber), column, config.tabSize) + leftoverVisibleColumns;\n        const lineCount = model.getLineCount();\n        const wasOnFirstPosition = (lineNumber === 1 && column === 1);\n        const wasOnLastPosition = (lineNumber === lineCount && column === model.getLineMaxColumn(lineNumber));\n        const wasAtEdgePosition = (newLineNumber < lineNumber ? wasOnFirstPosition : wasOnLastPosition);\n        lineNumber = newLineNumber;\n        if (lineNumber < 1) {\n            lineNumber = 1;\n            if (allowMoveOnEdgeLine) {\n                column = model.getLineMinColumn(lineNumber);\n            }\n            else {\n                column = Math.min(model.getLineMaxColumn(lineNumber), column);\n            }\n        }\n        else if (lineNumber > lineCount) {\n            lineNumber = lineCount;\n            if (allowMoveOnEdgeLine) {\n                column = model.getLineMaxColumn(lineNumber);\n            }\n            else {\n                column = Math.min(model.getLineMaxColumn(lineNumber), column);\n            }\n        }\n        else {\n            column = config.columnFromVisibleColumn(model, lineNumber, currentVisibleColumn);\n        }\n        if (wasAtEdgePosition) {\n            leftoverVisibleColumns = 0;\n        }\n        else {\n            leftoverVisibleColumns = currentVisibleColumn - CursorColumns.visibleColumnFromColumn(model.getLineContent(lineNumber), column, config.tabSize);\n        }\n        if (normalizationAffinity !== undefined) {\n            const position = new Position(lineNumber, column);\n            const newPosition = model.normalizePosition(position, normalizationAffinity);\n            leftoverVisibleColumns = leftoverVisibleColumns + (column - newPosition.column);\n            lineNumber = newPosition.lineNumber;\n            column = newPosition.column;\n        }\n        return new CursorPosition(lineNumber, column, leftoverVisibleColumns);\n    }\n    static down(config, model, lineNumber, column, leftoverVisibleColumns, count, allowMoveOnLastLine) {\n        return this.vertical(config, model, lineNumber, column, leftoverVisibleColumns, lineNumber + count, allowMoveOnLastLine, 4 /* PositionAffinity.RightOfInjectedText */);\n    }\n    static moveDown(config, model, cursor, inSelectionMode, linesCount) {\n        let lineNumber, column;\n        if (cursor.hasSelection() && !inSelectionMode) {\n            // If we are in selection mode, move down acts relative to the end of selection\n            lineNumber = cursor.selection.endLineNumber;\n            column = cursor.selection.endColumn;\n        }\n        else {\n            lineNumber = cursor.position.lineNumber;\n            column = cursor.position.column;\n        }\n        let i = 0;\n        let r;\n        do {\n            r = MoveOperations.down(config, model, lineNumber + i, column, cursor.leftoverVisibleColumns, linesCount, true);\n            const np = model.normalizePosition(new Position(r.lineNumber, r.column), 2 /* PositionAffinity.None */);\n            if (np.lineNumber > lineNumber) {\n                break;\n            }\n        } while (i++ < 10 && lineNumber + i < model.getLineCount());\n        return cursor.move(inSelectionMode, r.lineNumber, r.column, r.leftoverVisibleColumns);\n    }\n    static translateDown(config, model, cursor) {\n        const selection = cursor.selection;\n        const selectionStart = MoveOperations.down(config, model, selection.selectionStartLineNumber, selection.selectionStartColumn, cursor.selectionStartLeftoverVisibleColumns, 1, false);\n        const position = MoveOperations.down(config, model, selection.positionLineNumber, selection.positionColumn, cursor.leftoverVisibleColumns, 1, false);\n        return new SingleCursorState(new Range(selectionStart.lineNumber, selectionStart.column, selectionStart.lineNumber, selectionStart.column), 0 /* SelectionStartKind.Simple */, selectionStart.leftoverVisibleColumns, new Position(position.lineNumber, position.column), position.leftoverVisibleColumns);\n    }\n    static up(config, model, lineNumber, column, leftoverVisibleColumns, count, allowMoveOnFirstLine) {\n        return this.vertical(config, model, lineNumber, column, leftoverVisibleColumns, lineNumber - count, allowMoveOnFirstLine, 3 /* PositionAffinity.LeftOfInjectedText */);\n    }\n    static moveUp(config, model, cursor, inSelectionMode, linesCount) {\n        let lineNumber, column;\n        if (cursor.hasSelection() && !inSelectionMode) {\n            // If we are in selection mode, move up acts relative to the beginning of selection\n            lineNumber = cursor.selection.startLineNumber;\n            column = cursor.selection.startColumn;\n        }\n        else {\n            lineNumber = cursor.position.lineNumber;\n            column = cursor.position.column;\n        }\n        const r = MoveOperations.up(config, model, lineNumber, column, cursor.leftoverVisibleColumns, linesCount, true);\n        return cursor.move(inSelectionMode, r.lineNumber, r.column, r.leftoverVisibleColumns);\n    }\n    static translateUp(config, model, cursor) {\n        const selection = cursor.selection;\n        const selectionStart = MoveOperations.up(config, model, selection.selectionStartLineNumber, selection.selectionStartColumn, cursor.selectionStartLeftoverVisibleColumns, 1, false);\n        const position = MoveOperations.up(config, model, selection.positionLineNumber, selection.positionColumn, cursor.leftoverVisibleColumns, 1, false);\n        return new SingleCursorState(new Range(selectionStart.lineNumber, selectionStart.column, selectionStart.lineNumber, selectionStart.column), 0 /* SelectionStartKind.Simple */, selectionStart.leftoverVisibleColumns, new Position(position.lineNumber, position.column), position.leftoverVisibleColumns);\n    }\n    static _isBlankLine(model, lineNumber) {\n        if (model.getLineFirstNonWhitespaceColumn(lineNumber) === 0) {\n            // empty or contains only whitespace\n            return true;\n        }\n        return false;\n    }\n    static moveToPrevBlankLine(config, model, cursor, inSelectionMode) {\n        let lineNumber = cursor.position.lineNumber;\n        // If our current line is blank, move to the previous non-blank line\n        while (lineNumber > 1 && this._isBlankLine(model, lineNumber)) {\n            lineNumber--;\n        }\n        // Find the previous blank line\n        while (lineNumber > 1 && !this._isBlankLine(model, lineNumber)) {\n            lineNumber--;\n        }\n        return cursor.move(inSelectionMode, lineNumber, model.getLineMinColumn(lineNumber), 0);\n    }\n    static moveToNextBlankLine(config, model, cursor, inSelectionMode) {\n        const lineCount = model.getLineCount();\n        let lineNumber = cursor.position.lineNumber;\n        // If our current line is blank, move to the next non-blank line\n        while (lineNumber < lineCount && this._isBlankLine(model, lineNumber)) {\n            lineNumber++;\n        }\n        // Find the next blank line\n        while (lineNumber < lineCount && !this._isBlankLine(model, lineNumber)) {\n            lineNumber++;\n        }\n        return cursor.move(inSelectionMode, lineNumber, model.getLineMinColumn(lineNumber), 0);\n    }\n    static moveToBeginningOfLine(config, model, cursor, inSelectionMode) {\n        const lineNumber = cursor.position.lineNumber;\n        const minColumn = model.getLineMinColumn(lineNumber);\n        const firstNonBlankColumn = model.getLineFirstNonWhitespaceColumn(lineNumber) || minColumn;\n        let column;\n        const relevantColumnNumber = cursor.position.column;\n        if (relevantColumnNumber === firstNonBlankColumn) {\n            column = minColumn;\n        }\n        else {\n            column = firstNonBlankColumn;\n        }\n        return cursor.move(inSelectionMode, lineNumber, column, 0);\n    }\n    static moveToEndOfLine(config, model, cursor, inSelectionMode, sticky) {\n        const lineNumber = cursor.position.lineNumber;\n        const maxColumn = model.getLineMaxColumn(lineNumber);\n        return cursor.move(inSelectionMode, lineNumber, maxColumn, sticky ? 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */ - maxColumn : 0);\n    }\n    static moveToBeginningOfBuffer(config, model, cursor, inSelectionMode) {\n        return cursor.move(inSelectionMode, 1, 1, 0);\n    }\n    static moveToEndOfBuffer(config, model, cursor, inSelectionMode) {\n        const lastLineNumber = model.getLineCount();\n        const lastColumn = model.getLineMaxColumn(lastLineNumber);\n        return cursor.move(inSelectionMode, lastLineNumber, lastColumn, 0);\n    }\n}\n\nexport { CursorPosition, MoveOperations };\n","import { firstNonWhitespaceIndex, getLeftDeleteOffset } from '../../../base/common/strings.js';\nimport { ReplaceCommand } from '../commands/replaceCommand.js';\nimport { isQuote, EditOperationResult } from '../cursorCommon.js';\nimport { CursorColumns } from '../core/cursorColumns.js';\nimport { MoveOperations } from './cursorMoveOperations.js';\nimport { Range } from '../core/range.js';\nimport { Position } from '../core/position.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DeleteOperations {\n    static deleteRight(prevEditOperationType, config, model, selections) {\n        const commands = [];\n        let shouldPushStackElementBefore = (prevEditOperationType !== 3 /* EditOperationType.DeletingRight */);\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const selection = selections[i];\n            const deleteSelection = this.getDeleteRightRange(selection, model, config);\n            if (deleteSelection.isEmpty()) {\n                // Probably at end of file => ignore\n                commands[i] = null;\n                continue;\n            }\n            if (deleteSelection.startLineNumber !== deleteSelection.endLineNumber) {\n                shouldPushStackElementBefore = true;\n            }\n            commands[i] = new ReplaceCommand(deleteSelection, '');\n        }\n        return [shouldPushStackElementBefore, commands];\n    }\n    static getDeleteRightRange(selection, model, config) {\n        if (!selection.isEmpty()) {\n            return selection;\n        }\n        const position = selection.getPosition();\n        const rightOfPosition = MoveOperations.right(config, model, position);\n        if (config.trimWhitespaceOnDelete && rightOfPosition.lineNumber !== position.lineNumber) {\n            // Smart line join (deleting leading whitespace) is on\n            // (and) Delete is happening at the end of a line\n            const currentLineHasContent = (model.getLineFirstNonWhitespaceColumn(position.lineNumber) > 0);\n            const firstNonWhitespaceColumn = model.getLineFirstNonWhitespaceColumn(rightOfPosition.lineNumber);\n            if (currentLineHasContent && firstNonWhitespaceColumn > 0) {\n                // The next line has content\n                return new Range(rightOfPosition.lineNumber, firstNonWhitespaceColumn, position.lineNumber, position.column);\n            }\n        }\n        return new Range(rightOfPosition.lineNumber, rightOfPosition.column, position.lineNumber, position.column);\n    }\n    static isAutoClosingPairDelete(autoClosingDelete, autoClosingBrackets, autoClosingQuotes, autoClosingPairsOpen, model, selections, autoClosedCharacters) {\n        if (autoClosingBrackets === 'never' && autoClosingQuotes === 'never') {\n            return false;\n        }\n        if (autoClosingDelete === 'never') {\n            return false;\n        }\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const selection = selections[i];\n            const position = selection.getPosition();\n            if (!selection.isEmpty()) {\n                return false;\n            }\n            const lineText = model.getLineContent(position.lineNumber);\n            if (position.column < 2 || position.column >= lineText.length + 1) {\n                return false;\n            }\n            const character = lineText.charAt(position.column - 2);\n            const autoClosingPairCandidates = autoClosingPairsOpen.get(character);\n            if (!autoClosingPairCandidates) {\n                return false;\n            }\n            if (isQuote(character)) {\n                if (autoClosingQuotes === 'never') {\n                    return false;\n                }\n            }\n            else {\n                if (autoClosingBrackets === 'never') {\n                    return false;\n                }\n            }\n            const afterCharacter = lineText.charAt(position.column - 1);\n            let foundAutoClosingPair = false;\n            for (const autoClosingPairCandidate of autoClosingPairCandidates) {\n                if (autoClosingPairCandidate.open === character && autoClosingPairCandidate.close === afterCharacter) {\n                    foundAutoClosingPair = true;\n                }\n            }\n            if (!foundAutoClosingPair) {\n                return false;\n            }\n            // Must delete the pair only if it was automatically inserted by the editor\n            if (autoClosingDelete === 'auto') {\n                let found = false;\n                for (let j = 0, lenJ = autoClosedCharacters.length; j < lenJ; j++) {\n                    const autoClosedCharacter = autoClosedCharacters[j];\n                    if (position.lineNumber === autoClosedCharacter.startLineNumber && position.column === autoClosedCharacter.startColumn) {\n                        found = true;\n                        break;\n                    }\n                }\n                if (!found) {\n                    return false;\n                }\n            }\n        }\n        return true;\n    }\n    static _runAutoClosingPairDelete(config, model, selections) {\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const position = selections[i].getPosition();\n            const deleteSelection = new Range(position.lineNumber, position.column - 1, position.lineNumber, position.column + 1);\n            commands[i] = new ReplaceCommand(deleteSelection, '');\n        }\n        return [true, commands];\n    }\n    static deleteLeft(prevEditOperationType, config, model, selections, autoClosedCharacters) {\n        if (this.isAutoClosingPairDelete(config.autoClosingDelete, config.autoClosingBrackets, config.autoClosingQuotes, config.autoClosingPairs.autoClosingPairsOpenByEnd, model, selections, autoClosedCharacters)) {\n            return this._runAutoClosingPairDelete(config, model, selections);\n        }\n        const commands = [];\n        let shouldPushStackElementBefore = (prevEditOperationType !== 2 /* EditOperationType.DeletingLeft */);\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const deleteRange = DeleteOperations.getDeleteLeftRange(selections[i], model, config);\n            // Ignore empty delete ranges, as they have no effect\n            // They happen if the cursor is at the beginning of the file.\n            if (deleteRange.isEmpty()) {\n                commands[i] = null;\n                continue;\n            }\n            if (deleteRange.startLineNumber !== deleteRange.endLineNumber) {\n                shouldPushStackElementBefore = true;\n            }\n            commands[i] = new ReplaceCommand(deleteRange, '');\n        }\n        return [shouldPushStackElementBefore, commands];\n    }\n    static getDeleteLeftRange(selection, model, config) {\n        if (!selection.isEmpty()) {\n            return selection;\n        }\n        const position = selection.getPosition();\n        // Unintend when using tab stops and cursor is within indentation\n        if (config.useTabStops && position.column > 1) {\n            const lineContent = model.getLineContent(position.lineNumber);\n            const firstNonWhitespaceIndex$1 = firstNonWhitespaceIndex(lineContent);\n            const lastIndentationColumn = (firstNonWhitespaceIndex$1 === -1\n                ? /* entire string is whitespace */ lineContent.length + 1\n                : firstNonWhitespaceIndex$1 + 1);\n            if (position.column <= lastIndentationColumn) {\n                const fromVisibleColumn = config.visibleColumnFromColumn(model, position);\n                const toVisibleColumn = CursorColumns.prevIndentTabStop(fromVisibleColumn, config.indentSize);\n                const toColumn = config.columnFromVisibleColumn(model, position.lineNumber, toVisibleColumn);\n                return new Range(position.lineNumber, toColumn, position.lineNumber, position.column);\n            }\n        }\n        return Range.fromPositions(DeleteOperations.getPositionAfterDeleteLeft(position, model), position);\n    }\n    static getPositionAfterDeleteLeft(position, model) {\n        if (position.column > 1) {\n            // Convert 1-based columns to 0-based offsets and back.\n            const idx = getLeftDeleteOffset(position.column - 1, model.getLineContent(position.lineNumber));\n            return position.with(undefined, idx + 1);\n        }\n        else if (position.lineNumber > 1) {\n            const newLine = position.lineNumber - 1;\n            return new Position(newLine, model.getLineMaxColumn(newLine));\n        }\n        else {\n            return position;\n        }\n    }\n    static cut(config, model, selections) {\n        const commands = [];\n        let lastCutRange = null;\n        selections.sort((a, b) => Position.compare(a.getStartPosition(), b.getEndPosition()));\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const selection = selections[i];\n            if (selection.isEmpty()) {\n                if (config.emptySelectionClipboard) {\n                    // This is a full line cut\n                    const position = selection.getPosition();\n                    let startLineNumber, startColumn, endLineNumber, endColumn;\n                    if (position.lineNumber < model.getLineCount()) {\n                        // Cutting a line in the middle of the model\n                        startLineNumber = position.lineNumber;\n                        startColumn = 1;\n                        endLineNumber = position.lineNumber + 1;\n                        endColumn = 1;\n                    }\n                    else if (position.lineNumber > 1 && lastCutRange?.endLineNumber !== position.lineNumber) {\n                        // Cutting the last line & there are more than 1 lines in the model & a previous cut operation does not touch the current cut operation\n                        startLineNumber = position.lineNumber - 1;\n                        startColumn = model.getLineMaxColumn(position.lineNumber - 1);\n                        endLineNumber = position.lineNumber;\n                        endColumn = model.getLineMaxColumn(position.lineNumber);\n                    }\n                    else {\n                        // Cutting the single line that the model contains\n                        startLineNumber = position.lineNumber;\n                        startColumn = 1;\n                        endLineNumber = position.lineNumber;\n                        endColumn = model.getLineMaxColumn(position.lineNumber);\n                    }\n                    const deleteSelection = new Range(startLineNumber, startColumn, endLineNumber, endColumn);\n                    lastCutRange = deleteSelection;\n                    if (!deleteSelection.isEmpty()) {\n                        commands[i] = new ReplaceCommand(deleteSelection, '');\n                    }\n                    else {\n                        commands[i] = null;\n                    }\n                }\n                else {\n                    // Cannot cut empty selection\n                    commands[i] = null;\n                }\n            }\n            else {\n                commands[i] = new ReplaceCommand(selection, '');\n            }\n        }\n        return new EditOperationResult(0 /* EditOperationType.Other */, commands, {\n            shouldPushStackElementBefore: true,\n            shouldPushStackElementAfter: true\n        });\n    }\n}\n\nexport { DeleteOperations };\n","import { Lazy } from './lazy.js';\nimport { LANGUAGE_DEFAULT } from './platform.js';\n\nconst safeIntl = {\n    DateTimeFormat(locales, options) {\n        return new Lazy(() => {\n            try {\n                return new Intl.DateTimeFormat(locales, options);\n            }\n            catch {\n                return new Intl.DateTimeFormat(undefined, options);\n            }\n        });\n    },\n    Collator(locales, options) {\n        return new Lazy(() => {\n            try {\n                return new Intl.Collator(locales, options);\n            }\n            catch {\n                return new Intl.Collator(undefined, options);\n            }\n        });\n    },\n    Segmenter(locales, options) {\n        return new Lazy(() => {\n            try {\n                return new Intl.Segmenter(locales, options);\n            }\n            catch {\n                return new Intl.Segmenter(undefined, options);\n            }\n        });\n    },\n    Locale(tag, options) {\n        return new Lazy(() => {\n            try {\n                return new Intl.Locale(tag, options);\n            }\n            catch {\n                return new Intl.Locale(LANGUAGE_DEFAULT, options);\n            }\n        });\n    },\n    NumberFormat(locales, options) {\n        return new Lazy(() => {\n            try {\n                return new Intl.NumberFormat(locales, options);\n            }\n            catch {\n                return new Intl.NumberFormat(undefined, options);\n            }\n        });\n    }\n};\n\nexport { safeIntl };\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 *--------------------------------------------------------------------------------------------*/\nfunction toUint8(v) {\n    if (v < 0) {\n        return 0;\n    }\n    if (v > 255 /* Constants.MAX_UINT_8 */) {\n        return 255 /* Constants.MAX_UINT_8 */;\n    }\n    return v | 0;\n}\nfunction toUint32(v) {\n    if (v < 0) {\n        return 0;\n    }\n    if (v > 4294967295 /* Constants.MAX_UINT_32 */) {\n        return 4294967295 /* Constants.MAX_UINT_32 */;\n    }\n    return v | 0;\n}\n\nexport { toUint32, toUint8 };\n","import { toUint8 } from '../../../base/common/uint.js';\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/**\n * A fast character classifier that uses a compact array for ASCII values.\n */\nclass CharacterClassifier {\n    constructor(_defaultValue) {\n        const defaultValue = toUint8(_defaultValue);\n        this._defaultValue = defaultValue;\n        this._asciiMap = CharacterClassifier._createAsciiMap(defaultValue);\n        this._map = new Map();\n    }\n    static _createAsciiMap(defaultValue) {\n        const asciiMap = new Uint8Array(256);\n        asciiMap.fill(defaultValue);\n        return asciiMap;\n    }\n    set(charCode, _value) {\n        const value = toUint8(_value);\n        if (charCode >= 0 && charCode < 256) {\n            this._asciiMap[charCode] = value;\n        }\n        else {\n            this._map.set(charCode, value);\n        }\n    }\n    get(charCode) {\n        if (charCode >= 0 && charCode < 256) {\n            return this._asciiMap[charCode];\n        }\n        else {\n            return (this._map.get(charCode) || this._defaultValue);\n        }\n    }\n    clear() {\n        this._asciiMap.fill(this._defaultValue);\n        this._map.clear();\n    }\n}\nclass CharacterSet {\n    constructor() {\n        this._actual = new CharacterClassifier(0 /* Boolean.False */);\n    }\n    add(charCode) {\n        this._actual.set(charCode, 1 /* Boolean.True */);\n    }\n    has(charCode) {\n        return (this._actual.get(charCode) === 1 /* Boolean.True */);\n    }\n    clear() {\n        return this._actual.clear();\n    }\n}\n\nexport { CharacterClassifier, CharacterSet };\n","import { safeIntl } from '../../../base/common/date.js';\nimport { LRUCache } from '../../../base/common/map.js';\nimport { CharacterClassifier } from './characterClassifier.js';\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 *--------------------------------------------------------------------------------------------*/\nclass WordCharacterClassifier extends CharacterClassifier {\n    constructor(wordSeparators, intlSegmenterLocales) {\n        super(0 /* WordCharacterClass.Regular */);\n        this._segmenter = null;\n        this._cachedLine = null;\n        this._cachedSegments = [];\n        this.intlSegmenterLocales = intlSegmenterLocales;\n        if (this.intlSegmenterLocales.length > 0) {\n            this._segmenter = safeIntl.Segmenter(this.intlSegmenterLocales, { granularity: 'word' });\n        }\n        else {\n            this._segmenter = null;\n        }\n        for (let i = 0, len = wordSeparators.length; i < len; i++) {\n            this.set(wordSeparators.charCodeAt(i), 2 /* WordCharacterClass.WordSeparator */);\n        }\n        this.set(32 /* CharCode.Space */, 1 /* WordCharacterClass.Whitespace */);\n        this.set(9 /* CharCode.Tab */, 1 /* WordCharacterClass.Whitespace */);\n    }\n    findPrevIntlWordBeforeOrAtOffset(line, offset) {\n        let candidate = null;\n        for (const segment of this._getIntlSegmenterWordsOnLine(line)) {\n            if (segment.index > offset) {\n                break;\n            }\n            candidate = segment;\n        }\n        return candidate;\n    }\n    findNextIntlWordAtOrAfterOffset(lineContent, offset) {\n        for (const segment of this._getIntlSegmenterWordsOnLine(lineContent)) {\n            if (segment.index < offset) {\n                continue;\n            }\n            return segment;\n        }\n        return null;\n    }\n    _getIntlSegmenterWordsOnLine(line) {\n        if (!this._segmenter) {\n            return [];\n        }\n        // Check if the line has changed from the previous call\n        if (this._cachedLine === line) {\n            return this._cachedSegments;\n        }\n        // Update the cache with the new line\n        this._cachedLine = line;\n        this._cachedSegments = this._filterWordSegments(this._segmenter.value.segment(line));\n        return this._cachedSegments;\n    }\n    _filterWordSegments(segments) {\n        const result = [];\n        for (const segment of segments) {\n            if (this._isWordLike(segment)) {\n                result.push(segment);\n            }\n        }\n        return result;\n    }\n    _isWordLike(segment) {\n        if (segment.isWordLike) {\n            return true;\n        }\n        return false;\n    }\n}\nconst wordClassifierCache = new LRUCache(10);\nfunction getMapForWordSeparators(wordSeparators, intlSegmenterLocales) {\n    const key = `${wordSeparators}/${intlSegmenterLocales.join(',')}`;\n    let result = wordClassifierCache.get(key);\n    if (!result) {\n        result = new WordCharacterClassifier(wordSeparators, intlSegmenterLocales);\n        wordClassifierCache.set(key, result);\n    }\n    return result;\n}\n\nexport { WordCharacterClassifier, getMapForWordSeparators };\n","import { isLowerAsciiLetter, isAsciiDigit, isUpperAsciiLetter, lastNonWhitespaceIndex } from '../../../base/common/strings.js';\nimport { SingleCursorState } from '../cursorCommon.js';\nimport { DeleteOperations } from './cursorDeleteOperations.js';\nimport { getMapForWordSeparators } from '../core/wordCharacterClassifier.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nclass WordOperations {\n    static _createWord(lineContent, wordType, nextCharClass, start, end) {\n        // console.log('WORD ==> ' + start + ' => ' + end + ':::: <<<' + lineContent.substring(start, end) + '>>>');\n        return { start: start, end: end, wordType: wordType, nextCharClass: nextCharClass };\n    }\n    static _createIntlWord(intlWord, nextCharClass) {\n        // console.log('INTL WORD ==> ' + intlWord.index + ' => ' + intlWord.index + intlWord.segment.length + ':::: <<<' + intlWord.segment + '>>>');\n        return { start: intlWord.index, end: intlWord.index + intlWord.segment.length, wordType: 1 /* WordType.Regular */, nextCharClass: nextCharClass };\n    }\n    static _findPreviousWordOnLine(wordSeparators, model, position) {\n        const lineContent = model.getLineContent(position.lineNumber);\n        return this._doFindPreviousWordOnLine(lineContent, wordSeparators, position);\n    }\n    static _doFindPreviousWordOnLine(lineContent, wordSeparators, position) {\n        let wordType = 0 /* WordType.None */;\n        const previousIntlWord = wordSeparators.findPrevIntlWordBeforeOrAtOffset(lineContent, position.column - 2);\n        for (let chIndex = position.column - 2; chIndex >= 0; chIndex--) {\n            const chCode = lineContent.charCodeAt(chIndex);\n            const chClass = wordSeparators.get(chCode);\n            if (previousIntlWord && chIndex === previousIntlWord.index) {\n                return this._createIntlWord(previousIntlWord, chClass);\n            }\n            if (chClass === 0 /* WordCharacterClass.Regular */) {\n                if (wordType === 2 /* WordType.Separator */) {\n                    return this._createWord(lineContent, wordType, chClass, chIndex + 1, this._findEndOfWord(lineContent, wordSeparators, wordType, chIndex + 1));\n                }\n                wordType = 1 /* WordType.Regular */;\n            }\n            else if (chClass === 2 /* WordCharacterClass.WordSeparator */) {\n                if (wordType === 1 /* WordType.Regular */) {\n                    return this._createWord(lineContent, wordType, chClass, chIndex + 1, this._findEndOfWord(lineContent, wordSeparators, wordType, chIndex + 1));\n                }\n                wordType = 2 /* WordType.Separator */;\n            }\n            else if (chClass === 1 /* WordCharacterClass.Whitespace */) {\n                if (wordType !== 0 /* WordType.None */) {\n                    return this._createWord(lineContent, wordType, chClass, chIndex + 1, this._findEndOfWord(lineContent, wordSeparators, wordType, chIndex + 1));\n                }\n            }\n        }\n        if (wordType !== 0 /* WordType.None */) {\n            return this._createWord(lineContent, wordType, 1 /* WordCharacterClass.Whitespace */, 0, this._findEndOfWord(lineContent, wordSeparators, wordType, 0));\n        }\n        return null;\n    }\n    static _findEndOfWord(lineContent, wordSeparators, wordType, startIndex) {\n        const nextIntlWord = wordSeparators.findNextIntlWordAtOrAfterOffset(lineContent, startIndex);\n        const len = lineContent.length;\n        for (let chIndex = startIndex; chIndex < len; chIndex++) {\n            const chCode = lineContent.charCodeAt(chIndex);\n            const chClass = wordSeparators.get(chCode);\n            if (nextIntlWord && chIndex === nextIntlWord.index + nextIntlWord.segment.length) {\n                return chIndex;\n            }\n            if (chClass === 1 /* WordCharacterClass.Whitespace */) {\n                return chIndex;\n            }\n            if (wordType === 1 /* WordType.Regular */ && chClass === 2 /* WordCharacterClass.WordSeparator */) {\n                return chIndex;\n            }\n            if (wordType === 2 /* WordType.Separator */ && chClass === 0 /* WordCharacterClass.Regular */) {\n                return chIndex;\n            }\n        }\n        return len;\n    }\n    static _findNextWordOnLine(wordSeparators, model, position) {\n        const lineContent = model.getLineContent(position.lineNumber);\n        return this._doFindNextWordOnLine(lineContent, wordSeparators, position);\n    }\n    static _doFindNextWordOnLine(lineContent, wordSeparators, position) {\n        let wordType = 0 /* WordType.None */;\n        const len = lineContent.length;\n        const nextIntlWord = wordSeparators.findNextIntlWordAtOrAfterOffset(lineContent, position.column - 1);\n        for (let chIndex = position.column - 1; chIndex < len; chIndex++) {\n            const chCode = lineContent.charCodeAt(chIndex);\n            const chClass = wordSeparators.get(chCode);\n            if (nextIntlWord && chIndex === nextIntlWord.index) {\n                return this._createIntlWord(nextIntlWord, chClass);\n            }\n            if (chClass === 0 /* WordCharacterClass.Regular */) {\n                if (wordType === 2 /* WordType.Separator */) {\n                    return this._createWord(lineContent, wordType, chClass, this._findStartOfWord(lineContent, wordSeparators, wordType, chIndex - 1), chIndex);\n                }\n                wordType = 1 /* WordType.Regular */;\n            }\n            else if (chClass === 2 /* WordCharacterClass.WordSeparator */) {\n                if (wordType === 1 /* WordType.Regular */) {\n                    return this._createWord(lineContent, wordType, chClass, this._findStartOfWord(lineContent, wordSeparators, wordType, chIndex - 1), chIndex);\n                }\n                wordType = 2 /* WordType.Separator */;\n            }\n            else if (chClass === 1 /* WordCharacterClass.Whitespace */) {\n                if (wordType !== 0 /* WordType.None */) {\n                    return this._createWord(lineContent, wordType, chClass, this._findStartOfWord(lineContent, wordSeparators, wordType, chIndex - 1), chIndex);\n                }\n            }\n        }\n        if (wordType !== 0 /* WordType.None */) {\n            return this._createWord(lineContent, wordType, 1 /* WordCharacterClass.Whitespace */, this._findStartOfWord(lineContent, wordSeparators, wordType, len - 1), len);\n        }\n        return null;\n    }\n    static _findStartOfWord(lineContent, wordSeparators, wordType, startIndex) {\n        const previousIntlWord = wordSeparators.findPrevIntlWordBeforeOrAtOffset(lineContent, startIndex);\n        for (let chIndex = startIndex; chIndex >= 0; chIndex--) {\n            const chCode = lineContent.charCodeAt(chIndex);\n            const chClass = wordSeparators.get(chCode);\n            if (previousIntlWord && chIndex === previousIntlWord.index) {\n                return chIndex;\n            }\n            if (chClass === 1 /* WordCharacterClass.Whitespace */) {\n                return chIndex + 1;\n            }\n            if (wordType === 1 /* WordType.Regular */ && chClass === 2 /* WordCharacterClass.WordSeparator */) {\n                return chIndex + 1;\n            }\n            if (wordType === 2 /* WordType.Separator */ && chClass === 0 /* WordCharacterClass.Regular */) {\n                return chIndex + 1;\n            }\n        }\n        return 0;\n    }\n    static moveWordLeft(wordSeparators, model, position, wordNavigationType, hasMulticursor) {\n        let lineNumber = position.lineNumber;\n        let column = position.column;\n        if (column === 1) {\n            if (lineNumber > 1) {\n                lineNumber = lineNumber - 1;\n                column = model.getLineMaxColumn(lineNumber);\n            }\n        }\n        let prevWordOnLine = WordOperations._findPreviousWordOnLine(wordSeparators, model, new Position(lineNumber, column));\n        if (wordNavigationType === 0 /* WordNavigationType.WordStart */) {\n            return new Position(lineNumber, prevWordOnLine ? prevWordOnLine.start + 1 : 1);\n        }\n        if (wordNavigationType === 1 /* WordNavigationType.WordStartFast */) {\n            if (!hasMulticursor // avoid having multiple cursors stop at different locations when doing word start\n                && prevWordOnLine\n                && prevWordOnLine.wordType === 2 /* WordType.Separator */\n                && prevWordOnLine.end - prevWordOnLine.start === 1\n                && prevWordOnLine.nextCharClass === 0 /* WordCharacterClass.Regular */) {\n                // Skip over a word made up of one single separator and followed by a regular character\n                prevWordOnLine = WordOperations._findPreviousWordOnLine(wordSeparators, model, new Position(lineNumber, prevWordOnLine.start + 1));\n            }\n            return new Position(lineNumber, prevWordOnLine ? prevWordOnLine.start + 1 : 1);\n        }\n        if (wordNavigationType === 3 /* WordNavigationType.WordAccessibility */) {\n            while (prevWordOnLine\n                && prevWordOnLine.wordType === 2 /* WordType.Separator */) {\n                // Skip over words made up of only separators\n                prevWordOnLine = WordOperations._findPreviousWordOnLine(wordSeparators, model, new Position(lineNumber, prevWordOnLine.start + 1));\n            }\n            return new Position(lineNumber, prevWordOnLine ? prevWordOnLine.start + 1 : 1);\n        }\n        // We are stopping at the ending of words\n        if (prevWordOnLine && column <= prevWordOnLine.end + 1) {\n            prevWordOnLine = WordOperations._findPreviousWordOnLine(wordSeparators, model, new Position(lineNumber, prevWordOnLine.start + 1));\n        }\n        return new Position(lineNumber, prevWordOnLine ? prevWordOnLine.end + 1 : 1);\n    }\n    static _moveWordPartLeft(model, position) {\n        const lineNumber = position.lineNumber;\n        const maxColumn = model.getLineMaxColumn(lineNumber);\n        if (position.column === 1) {\n            return (lineNumber > 1 ? new Position(lineNumber - 1, model.getLineMaxColumn(lineNumber - 1)) : position);\n        }\n        const lineContent = model.getLineContent(lineNumber);\n        for (let column = position.column - 1; column > 1; column--) {\n            const left = lineContent.charCodeAt(column - 2);\n            const right = lineContent.charCodeAt(column - 1);\n            if (left === 95 /* CharCode.Underline */ && right !== 95 /* CharCode.Underline */) {\n                // snake_case_variables\n                return new Position(lineNumber, column);\n            }\n            if (left === 45 /* CharCode.Dash */ && right !== 45 /* CharCode.Dash */) {\n                // kebab-case-variables\n                return new Position(lineNumber, column);\n            }\n            if ((isLowerAsciiLetter(left) || isAsciiDigit(left)) && isUpperAsciiLetter(right)) {\n                // camelCaseVariables\n                return new Position(lineNumber, column);\n            }\n            if (isUpperAsciiLetter(left) && isUpperAsciiLetter(right)) {\n                // thisIsACamelCaseWithOneLetterWords\n                if (column + 1 < maxColumn) {\n                    const rightRight = lineContent.charCodeAt(column);\n                    if (isLowerAsciiLetter(rightRight) || isAsciiDigit(rightRight)) {\n                        return new Position(lineNumber, column);\n                    }\n                }\n            }\n        }\n        return new Position(lineNumber, 1);\n    }\n    static moveWordRight(wordSeparators, model, position, wordNavigationType) {\n        let lineNumber = position.lineNumber;\n        let column = position.column;\n        let movedDown = false;\n        if (column === model.getLineMaxColumn(lineNumber)) {\n            if (lineNumber < model.getLineCount()) {\n                movedDown = true;\n                lineNumber = lineNumber + 1;\n                column = 1;\n            }\n        }\n        let nextWordOnLine = WordOperations._findNextWordOnLine(wordSeparators, model, new Position(lineNumber, column));\n        if (wordNavigationType === 2 /* WordNavigationType.WordEnd */) {\n            if (nextWordOnLine && nextWordOnLine.wordType === 2 /* WordType.Separator */) {\n                if (nextWordOnLine.end - nextWordOnLine.start === 1 && nextWordOnLine.nextCharClass === 0 /* WordCharacterClass.Regular */) {\n                    // Skip over a word made up of one single separator and followed by a regular character\n                    nextWordOnLine = WordOperations._findNextWordOnLine(wordSeparators, model, new Position(lineNumber, nextWordOnLine.end + 1));\n                }\n            }\n            if (nextWordOnLine) {\n                column = nextWordOnLine.end + 1;\n            }\n            else {\n                column = model.getLineMaxColumn(lineNumber);\n            }\n        }\n        else if (wordNavigationType === 3 /* WordNavigationType.WordAccessibility */) {\n            if (movedDown) {\n                // If we move to the next line, pretend that the cursor is right before the first character.\n                // This is needed when the first word starts right at the first character - and in order not to miss it,\n                // we need to start before.\n                column = 0;\n            }\n            while (nextWordOnLine\n                && (nextWordOnLine.wordType === 2 /* WordType.Separator */\n                    || nextWordOnLine.start + 1 <= column)) {\n                // Skip over a word made up of one single separator\n                // Also skip over word if it begins before current cursor position to ascertain we're moving forward at least 1 character.\n                nextWordOnLine = WordOperations._findNextWordOnLine(wordSeparators, model, new Position(lineNumber, nextWordOnLine.end + 1));\n            }\n            if (nextWordOnLine) {\n                column = nextWordOnLine.start + 1;\n            }\n            else {\n                column = model.getLineMaxColumn(lineNumber);\n            }\n        }\n        else {\n            if (nextWordOnLine && !movedDown && column >= nextWordOnLine.start + 1) {\n                nextWordOnLine = WordOperations._findNextWordOnLine(wordSeparators, model, new Position(lineNumber, nextWordOnLine.end + 1));\n            }\n            if (nextWordOnLine) {\n                column = nextWordOnLine.start + 1;\n            }\n            else {\n                column = model.getLineMaxColumn(lineNumber);\n            }\n        }\n        return new Position(lineNumber, column);\n    }\n    static _moveWordPartRight(model, position) {\n        const lineNumber = position.lineNumber;\n        const maxColumn = model.getLineMaxColumn(lineNumber);\n        if (position.column === maxColumn) {\n            return (lineNumber < model.getLineCount() ? new Position(lineNumber + 1, 1) : position);\n        }\n        const lineContent = model.getLineContent(lineNumber);\n        for (let column = position.column + 1; column < maxColumn; column++) {\n            const left = lineContent.charCodeAt(column - 2);\n            const right = lineContent.charCodeAt(column - 1);\n            if (left !== 95 /* CharCode.Underline */ && right === 95 /* CharCode.Underline */) {\n                // snake_case_variables\n                return new Position(lineNumber, column);\n            }\n            if (left !== 45 /* CharCode.Dash */ && right === 45 /* CharCode.Dash */) {\n                // kebab-case-variables\n                return new Position(lineNumber, column);\n            }\n            if ((isLowerAsciiLetter(left) || isAsciiDigit(left)) && isUpperAsciiLetter(right)) {\n                // camelCaseVariables\n                return new Position(lineNumber, column);\n            }\n            if (isUpperAsciiLetter(left) && isUpperAsciiLetter(right)) {\n                // thisIsACamelCaseWithOneLetterWords\n                if (column + 1 < maxColumn) {\n                    const rightRight = lineContent.charCodeAt(column);\n                    if (isLowerAsciiLetter(rightRight) || isAsciiDigit(rightRight)) {\n                        return new Position(lineNumber, column);\n                    }\n                }\n            }\n        }\n        return new Position(lineNumber, maxColumn);\n    }\n    static _deleteWordLeftWhitespace(model, position) {\n        const lineContent = model.getLineContent(position.lineNumber);\n        const startIndex = position.column - 2;\n        const lastNonWhitespace = lastNonWhitespaceIndex(lineContent, startIndex);\n        if (lastNonWhitespace + 1 < startIndex) {\n            return new Range(position.lineNumber, lastNonWhitespace + 2, position.lineNumber, position.column);\n        }\n        return null;\n    }\n    static deleteWordLeft(ctx, wordNavigationType) {\n        const wordSeparators = ctx.wordSeparators;\n        const model = ctx.model;\n        const selection = ctx.selection;\n        const whitespaceHeuristics = ctx.whitespaceHeuristics;\n        if (!selection.isEmpty()) {\n            return selection;\n        }\n        if (DeleteOperations.isAutoClosingPairDelete(ctx.autoClosingDelete, ctx.autoClosingBrackets, ctx.autoClosingQuotes, ctx.autoClosingPairs.autoClosingPairsOpenByEnd, ctx.model, [ctx.selection], ctx.autoClosedCharacters)) {\n            const position = ctx.selection.getPosition();\n            return new Range(position.lineNumber, position.column - 1, position.lineNumber, position.column + 1);\n        }\n        const position = new Position(selection.positionLineNumber, selection.positionColumn);\n        let lineNumber = position.lineNumber;\n        let column = position.column;\n        if (lineNumber === 1 && column === 1) {\n            // Ignore deleting at beginning of file\n            return null;\n        }\n        if (whitespaceHeuristics) {\n            const r = this._deleteWordLeftWhitespace(model, position);\n            if (r) {\n                return r;\n            }\n        }\n        let prevWordOnLine = WordOperations._findPreviousWordOnLine(wordSeparators, model, position);\n        if (wordNavigationType === 0 /* WordNavigationType.WordStart */) {\n            if (prevWordOnLine) {\n                column = prevWordOnLine.start + 1;\n            }\n            else {\n                if (column > 1) {\n                    column = 1;\n                }\n                else {\n                    lineNumber--;\n                    column = model.getLineMaxColumn(lineNumber);\n                }\n            }\n        }\n        else {\n            if (prevWordOnLine && column <= prevWordOnLine.end + 1) {\n                prevWordOnLine = WordOperations._findPreviousWordOnLine(wordSeparators, model, new Position(lineNumber, prevWordOnLine.start + 1));\n            }\n            if (prevWordOnLine) {\n                column = prevWordOnLine.end + 1;\n            }\n            else {\n                if (column > 1) {\n                    column = 1;\n                }\n                else {\n                    lineNumber--;\n                    column = model.getLineMaxColumn(lineNumber);\n                }\n            }\n        }\n        return new Range(lineNumber, column, position.lineNumber, position.column);\n    }\n    static deleteInsideWord(wordSeparators, model, selection) {\n        if (!selection.isEmpty()) {\n            return selection;\n        }\n        const position = new Position(selection.positionLineNumber, selection.positionColumn);\n        const r = this._deleteInsideWordWhitespace(model, position);\n        if (r) {\n            return r;\n        }\n        return this._deleteInsideWordDetermineDeleteRange(wordSeparators, model, position);\n    }\n    static _charAtIsWhitespace(str, index) {\n        const charCode = str.charCodeAt(index);\n        return (charCode === 32 /* CharCode.Space */ || charCode === 9 /* CharCode.Tab */);\n    }\n    static _deleteInsideWordWhitespace(model, position) {\n        const lineContent = model.getLineContent(position.lineNumber);\n        const lineContentLength = lineContent.length;\n        if (lineContentLength === 0) {\n            // empty line\n            return null;\n        }\n        let leftIndex = Math.max(position.column - 2, 0);\n        if (!this._charAtIsWhitespace(lineContent, leftIndex)) {\n            // touches a non-whitespace character to the left\n            return null;\n        }\n        let rightIndex = Math.min(position.column - 1, lineContentLength - 1);\n        if (!this._charAtIsWhitespace(lineContent, rightIndex)) {\n            // touches a non-whitespace character to the right\n            return null;\n        }\n        // walk over whitespace to the left\n        while (leftIndex > 0 && this._charAtIsWhitespace(lineContent, leftIndex - 1)) {\n            leftIndex--;\n        }\n        // walk over whitespace to the right\n        while (rightIndex + 1 < lineContentLength && this._charAtIsWhitespace(lineContent, rightIndex + 1)) {\n            rightIndex++;\n        }\n        return new Range(position.lineNumber, leftIndex + 1, position.lineNumber, rightIndex + 2);\n    }\n    static _deleteInsideWordDetermineDeleteRange(wordSeparators, model, position) {\n        const lineContent = model.getLineContent(position.lineNumber);\n        const lineLength = lineContent.length;\n        if (lineLength === 0) {\n            // empty line\n            if (position.lineNumber > 1) {\n                return new Range(position.lineNumber - 1, model.getLineMaxColumn(position.lineNumber - 1), position.lineNumber, 1);\n            }\n            else {\n                if (position.lineNumber < model.getLineCount()) {\n                    return new Range(position.lineNumber, 1, position.lineNumber + 1, 1);\n                }\n                else {\n                    // empty model\n                    return new Range(position.lineNumber, 1, position.lineNumber, 1);\n                }\n            }\n        }\n        const touchesWord = (word) => {\n            return (word.start + 1 <= position.column && position.column <= word.end + 1);\n        };\n        const createRangeWithPosition = (startColumn, endColumn) => {\n            startColumn = Math.min(startColumn, position.column);\n            endColumn = Math.max(endColumn, position.column);\n            return new Range(position.lineNumber, startColumn, position.lineNumber, endColumn);\n        };\n        const deleteWordAndAdjacentWhitespace = (word) => {\n            let startColumn = word.start + 1;\n            let endColumn = word.end + 1;\n            let expandedToTheRight = false;\n            while (endColumn - 1 < lineLength && this._charAtIsWhitespace(lineContent, endColumn - 1)) {\n                expandedToTheRight = true;\n                endColumn++;\n            }\n            if (!expandedToTheRight) {\n                while (startColumn > 1 && this._charAtIsWhitespace(lineContent, startColumn - 2)) {\n                    startColumn--;\n                }\n            }\n            return createRangeWithPosition(startColumn, endColumn);\n        };\n        const prevWordOnLine = WordOperations._findPreviousWordOnLine(wordSeparators, model, position);\n        if (prevWordOnLine && touchesWord(prevWordOnLine)) {\n            return deleteWordAndAdjacentWhitespace(prevWordOnLine);\n        }\n        const nextWordOnLine = WordOperations._findNextWordOnLine(wordSeparators, model, position);\n        if (nextWordOnLine && touchesWord(nextWordOnLine)) {\n            return deleteWordAndAdjacentWhitespace(nextWordOnLine);\n        }\n        if (prevWordOnLine && nextWordOnLine) {\n            return createRangeWithPosition(prevWordOnLine.end + 1, nextWordOnLine.start + 1);\n        }\n        if (prevWordOnLine) {\n            return createRangeWithPosition(prevWordOnLine.start + 1, prevWordOnLine.end + 1);\n        }\n        if (nextWordOnLine) {\n            return createRangeWithPosition(nextWordOnLine.start + 1, nextWordOnLine.end + 1);\n        }\n        return createRangeWithPosition(1, lineLength + 1);\n    }\n    static _deleteWordPartLeft(model, selection) {\n        if (!selection.isEmpty()) {\n            return selection;\n        }\n        const pos = selection.getPosition();\n        const toPosition = WordOperations._moveWordPartLeft(model, pos);\n        return new Range(pos.lineNumber, pos.column, toPosition.lineNumber, toPosition.column);\n    }\n    static _findFirstNonWhitespaceChar(str, startIndex) {\n        const len = str.length;\n        for (let chIndex = startIndex; chIndex < len; chIndex++) {\n            const ch = str.charAt(chIndex);\n            if (ch !== ' ' && ch !== '\\t') {\n                return chIndex;\n            }\n        }\n        return len;\n    }\n    static _deleteWordRightWhitespace(model, position) {\n        const lineContent = model.getLineContent(position.lineNumber);\n        const startIndex = position.column - 1;\n        const firstNonWhitespace = this._findFirstNonWhitespaceChar(lineContent, startIndex);\n        if (startIndex + 1 < firstNonWhitespace) {\n            // bingo\n            return new Range(position.lineNumber, position.column, position.lineNumber, firstNonWhitespace + 1);\n        }\n        return null;\n    }\n    static deleteWordRight(ctx, wordNavigationType) {\n        const wordSeparators = ctx.wordSeparators;\n        const model = ctx.model;\n        const selection = ctx.selection;\n        const whitespaceHeuristics = ctx.whitespaceHeuristics;\n        if (!selection.isEmpty()) {\n            return selection;\n        }\n        const position = new Position(selection.positionLineNumber, selection.positionColumn);\n        let lineNumber = position.lineNumber;\n        let column = position.column;\n        const lineCount = model.getLineCount();\n        const maxColumn = model.getLineMaxColumn(lineNumber);\n        if (lineNumber === lineCount && column === maxColumn) {\n            // Ignore deleting at end of file\n            return null;\n        }\n        if (whitespaceHeuristics) {\n            const r = this._deleteWordRightWhitespace(model, position);\n            if (r) {\n                return r;\n            }\n        }\n        let nextWordOnLine = WordOperations._findNextWordOnLine(wordSeparators, model, position);\n        if (wordNavigationType === 2 /* WordNavigationType.WordEnd */) {\n            if (nextWordOnLine) {\n                column = nextWordOnLine.end + 1;\n            }\n            else {\n                if (column < maxColumn || lineNumber === lineCount) {\n                    column = maxColumn;\n                }\n                else {\n                    lineNumber++;\n                    nextWordOnLine = WordOperations._findNextWordOnLine(wordSeparators, model, new Position(lineNumber, 1));\n                    if (nextWordOnLine) {\n                        column = nextWordOnLine.start + 1;\n                    }\n                    else {\n                        column = model.getLineMaxColumn(lineNumber);\n                    }\n                }\n            }\n        }\n        else {\n            if (nextWordOnLine && column >= nextWordOnLine.start + 1) {\n                nextWordOnLine = WordOperations._findNextWordOnLine(wordSeparators, model, new Position(lineNumber, nextWordOnLine.end + 1));\n            }\n            if (nextWordOnLine) {\n                column = nextWordOnLine.start + 1;\n            }\n            else {\n                if (column < maxColumn || lineNumber === lineCount) {\n                    column = maxColumn;\n                }\n                else {\n                    lineNumber++;\n                    nextWordOnLine = WordOperations._findNextWordOnLine(wordSeparators, model, new Position(lineNumber, 1));\n                    if (nextWordOnLine) {\n                        column = nextWordOnLine.start + 1;\n                    }\n                    else {\n                        column = model.getLineMaxColumn(lineNumber);\n                    }\n                }\n            }\n        }\n        return new Range(lineNumber, column, position.lineNumber, position.column);\n    }\n    static _deleteWordPartRight(model, selection) {\n        if (!selection.isEmpty()) {\n            return selection;\n        }\n        const pos = selection.getPosition();\n        const toPosition = WordOperations._moveWordPartRight(model, pos);\n        return new Range(pos.lineNumber, pos.column, toPosition.lineNumber, toPosition.column);\n    }\n    static _createWordAtPosition(model, lineNumber, word) {\n        const range = new Range(lineNumber, word.start + 1, lineNumber, word.end + 1);\n        return {\n            word: model.getValueInRange(range),\n            startColumn: range.startColumn,\n            endColumn: range.endColumn\n        };\n    }\n    static getWordAtPosition(model, _wordSeparators, _intlSegmenterLocales, position) {\n        const wordSeparators = getMapForWordSeparators(_wordSeparators, _intlSegmenterLocales);\n        const prevWord = WordOperations._findPreviousWordOnLine(wordSeparators, model, position);\n        if (prevWord && prevWord.wordType === 1 /* WordType.Regular */ && prevWord.start <= position.column - 1 && position.column - 1 <= prevWord.end) {\n            return WordOperations._createWordAtPosition(model, position.lineNumber, prevWord);\n        }\n        const nextWord = WordOperations._findNextWordOnLine(wordSeparators, model, position);\n        if (nextWord && nextWord.wordType === 1 /* WordType.Regular */ && nextWord.start <= position.column - 1 && position.column - 1 <= nextWord.end) {\n            return WordOperations._createWordAtPosition(model, position.lineNumber, nextWord);\n        }\n        return null;\n    }\n    static word(config, model, cursor, inSelectionMode, position) {\n        const wordSeparators = getMapForWordSeparators(config.wordSeparators, config.wordSegmenterLocales);\n        const prevWord = WordOperations._findPreviousWordOnLine(wordSeparators, model, position);\n        const nextWord = WordOperations._findNextWordOnLine(wordSeparators, model, position);\n        if (!inSelectionMode) {\n            // Entering word selection for the first time\n            let startColumn;\n            let endColumn;\n            if (prevWord && prevWord.wordType === 1 /* WordType.Regular */ && prevWord.start <= position.column - 1 && position.column - 1 <= prevWord.end) {\n                // isTouchingPrevWord (Regular word)\n                startColumn = prevWord.start + 1;\n                endColumn = prevWord.end + 1;\n            }\n            else if (prevWord && prevWord.wordType === 2 /* WordType.Separator */ && prevWord.start <= position.column - 1 && position.column - 1 < prevWord.end) {\n                // isTouchingPrevWord (Separator word) - stricter check, don't include end boundary\n                startColumn = prevWord.start + 1;\n                endColumn = prevWord.end + 1;\n            }\n            else if (nextWord && nextWord.wordType === 1 /* WordType.Regular */ && nextWord.start <= position.column - 1 && position.column - 1 <= nextWord.end) {\n                // isTouchingNextWord (Regular word)\n                startColumn = nextWord.start + 1;\n                endColumn = nextWord.end + 1;\n            }\n            else if (nextWord && nextWord.wordType === 2 /* WordType.Separator */ && nextWord.start <= position.column - 1 && position.column - 1 < nextWord.end) {\n                // isTouchingNextWord (Separator word) - stricter check, don't include end boundary\n                startColumn = nextWord.start + 1;\n                endColumn = nextWord.end + 1;\n            }\n            else {\n                if (prevWord) {\n                    startColumn = prevWord.end + 1;\n                }\n                else {\n                    startColumn = 1;\n                }\n                if (nextWord) {\n                    endColumn = nextWord.start + 1;\n                }\n                else {\n                    endColumn = model.getLineMaxColumn(position.lineNumber);\n                }\n            }\n            return new SingleCursorState(new Range(position.lineNumber, startColumn, position.lineNumber, endColumn), 1 /* SelectionStartKind.Word */, 0, new Position(position.lineNumber, endColumn), 0);\n        }\n        let startColumn;\n        let endColumn;\n        if (prevWord && prevWord.wordType === 1 /* WordType.Regular */ && prevWord.start < position.column - 1 && position.column - 1 < prevWord.end) {\n            // isInsidePrevWord (Regular word)\n            startColumn = prevWord.start + 1;\n            endColumn = prevWord.end + 1;\n        }\n        else if (nextWord && nextWord.wordType === 1 /* WordType.Regular */ && nextWord.start < position.column - 1 && position.column - 1 < nextWord.end) {\n            // isInsideNextWord (Regular word)\n            startColumn = nextWord.start + 1;\n            endColumn = nextWord.end + 1;\n        }\n        else {\n            startColumn = position.column;\n            endColumn = position.column;\n        }\n        const lineNumber = position.lineNumber;\n        let column;\n        if (cursor.selectionStart.containsPosition(position)) {\n            column = cursor.selectionStart.endColumn;\n        }\n        else if (position.isBeforeOrEqual(cursor.selectionStart.getStartPosition())) {\n            column = startColumn;\n            const possiblePosition = new Position(lineNumber, column);\n            if (cursor.selectionStart.containsPosition(possiblePosition)) {\n                column = cursor.selectionStart.endColumn;\n            }\n        }\n        else {\n            column = endColumn;\n            const possiblePosition = new Position(lineNumber, column);\n            if (cursor.selectionStart.containsPosition(possiblePosition)) {\n                column = cursor.selectionStart.startColumn;\n            }\n        }\n        return cursor.move(true, lineNumber, column, 0);\n    }\n}\nclass WordPartOperations extends WordOperations {\n    static deleteWordPartLeft(ctx) {\n        const candidates = enforceDefined([\n            WordOperations.deleteWordLeft(ctx, 0 /* WordNavigationType.WordStart */),\n            WordOperations.deleteWordLeft(ctx, 2 /* WordNavigationType.WordEnd */),\n            WordOperations._deleteWordPartLeft(ctx.model, ctx.selection)\n        ]);\n        candidates.sort(Range.compareRangesUsingEnds);\n        return candidates[2];\n    }\n    static deleteWordPartRight(ctx) {\n        const candidates = enforceDefined([\n            WordOperations.deleteWordRight(ctx, 0 /* WordNavigationType.WordStart */),\n            WordOperations.deleteWordRight(ctx, 2 /* WordNavigationType.WordEnd */),\n            WordOperations._deleteWordPartRight(ctx.model, ctx.selection)\n        ]);\n        candidates.sort(Range.compareRangesUsingStarts);\n        return candidates[0];\n    }\n    static moveWordPartLeft(wordSeparators, model, position, hasMulticursor) {\n        const candidates = enforceDefined([\n            WordOperations.moveWordLeft(wordSeparators, model, position, 0 /* WordNavigationType.WordStart */, hasMulticursor),\n            WordOperations.moveWordLeft(wordSeparators, model, position, 2 /* WordNavigationType.WordEnd */, hasMulticursor),\n            WordOperations._moveWordPartLeft(model, position)\n        ]);\n        candidates.sort(Position.compare);\n        return candidates[2];\n    }\n    static moveWordPartRight(wordSeparators, model, position) {\n        const candidates = enforceDefined([\n            WordOperations.moveWordRight(wordSeparators, model, position, 0 /* WordNavigationType.WordStart */),\n            WordOperations.moveWordRight(wordSeparators, model, position, 2 /* WordNavigationType.WordEnd */),\n            WordOperations._moveWordPartRight(model, position)\n        ]);\n        candidates.sort(Position.compare);\n        return candidates[0];\n    }\n}\nfunction enforceDefined(arr) {\n    return arr.filter(el => Boolean(el));\n}\n\nexport { WordOperations, WordPartOperations };\n","import { isUndefinedOrNull, isObject, isTypedArray } from './types.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction deepClone(obj) {\n    if (!obj || typeof obj !== 'object') {\n        return obj;\n    }\n    if (obj instanceof RegExp) {\n        return obj;\n    }\n    const result = Array.isArray(obj) ? [] : {};\n    Object.entries(obj).forEach(([key, value]) => {\n        result[key] = value && typeof value === 'object' ? deepClone(value) : value;\n    });\n    return result;\n}\nfunction deepFreeze(obj) {\n    if (!obj || typeof obj !== 'object') {\n        return obj;\n    }\n    const stack = [obj];\n    while (stack.length > 0) {\n        const obj = stack.shift();\n        Object.freeze(obj);\n        for (const key in obj) {\n            if (_hasOwnProperty.call(obj, key)) {\n                const prop = obj[key];\n                if (typeof prop === 'object' && !Object.isFrozen(prop) && !isTypedArray(prop)) {\n                    stack.push(prop);\n                }\n            }\n        }\n    }\n    return obj;\n}\nconst _hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction cloneAndChange(obj, changer) {\n    return _cloneAndChange(obj, changer, new Set());\n}\nfunction _cloneAndChange(obj, changer, seen) {\n    if (isUndefinedOrNull(obj)) {\n        return obj;\n    }\n    const changed = changer(obj);\n    if (typeof changed !== 'undefined') {\n        return changed;\n    }\n    if (Array.isArray(obj)) {\n        const r1 = [];\n        for (const e of obj) {\n            r1.push(_cloneAndChange(e, changer, seen));\n        }\n        return r1;\n    }\n    if (isObject(obj)) {\n        if (seen.has(obj)) {\n            throw new Error('Cannot clone recursive data-structure');\n        }\n        seen.add(obj);\n        const r2 = {};\n        for (const i2 in obj) {\n            if (_hasOwnProperty.call(obj, i2)) {\n                r2[i2] = _cloneAndChange(obj[i2], changer, seen);\n            }\n        }\n        seen.delete(obj);\n        return r2;\n    }\n    return obj;\n}\n/**\n * Copies all properties of source into destination. The optional parameter \"overwrite\" allows to control\n * if existing properties on the destination should be overwritten or not. Defaults to true (overwrite).\n */\nfunction mixin(destination, source, overwrite = true) {\n    if (!isObject(destination)) {\n        return source;\n    }\n    if (isObject(source)) {\n        Object.keys(source).forEach(key => {\n            if (key in destination) {\n                if (overwrite) {\n                    if (isObject(destination[key]) && isObject(source[key])) {\n                        mixin(destination[key], source[key], overwrite);\n                    }\n                    else {\n                        destination[key] = source[key];\n                    }\n                }\n            }\n            else {\n                destination[key] = source[key];\n            }\n        });\n    }\n    return destination;\n}\nfunction equals(one, other) {\n    if (one === other) {\n        return true;\n    }\n    if (one === null || one === undefined || other === null || other === undefined) {\n        return false;\n    }\n    if (typeof one !== typeof other) {\n        return false;\n    }\n    if (typeof one !== 'object') {\n        return false;\n    }\n    if ((Array.isArray(one)) !== (Array.isArray(other))) {\n        return false;\n    }\n    let i;\n    let key;\n    if (Array.isArray(one)) {\n        if (one.length !== other.length) {\n            return false;\n        }\n        for (i = 0; i < one.length; i++) {\n            if (!equals(one[i], other[i])) {\n                return false;\n            }\n        }\n    }\n    else {\n        const oneKeys = [];\n        for (key in one) {\n            oneKeys.push(key);\n        }\n        oneKeys.sort();\n        const otherKeys = [];\n        for (key in other) {\n            otherKeys.push(key);\n        }\n        otherKeys.sort();\n        if (!equals(oneKeys, otherKeys)) {\n            return false;\n        }\n        for (i = 0; i < oneKeys.length; i++) {\n            if (!equals(one[oneKeys[i]], other[oneKeys[i]])) {\n                return false;\n            }\n        }\n    }\n    return true;\n}\n\nexport { cloneAndChange, deepClone, deepFreeze, equals, mixin };\n","import { equals } from '../../base/common/objects.js';\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/**\n * Vertical Lane in the overview ruler of the editor.\n */\nvar OverviewRulerLane;\n(function (OverviewRulerLane) {\n    OverviewRulerLane[OverviewRulerLane[\"Left\"] = 1] = \"Left\";\n    OverviewRulerLane[OverviewRulerLane[\"Center\"] = 2] = \"Center\";\n    OverviewRulerLane[OverviewRulerLane[\"Right\"] = 4] = \"Right\";\n    OverviewRulerLane[OverviewRulerLane[\"Full\"] = 7] = \"Full\";\n})(OverviewRulerLane || (OverviewRulerLane = {}));\n/**\n * Vertical Lane in the glyph margin of the editor.\n */\nvar GlyphMarginLane;\n(function (GlyphMarginLane) {\n    GlyphMarginLane[GlyphMarginLane[\"Left\"] = 1] = \"Left\";\n    GlyphMarginLane[GlyphMarginLane[\"Center\"] = 2] = \"Center\";\n    GlyphMarginLane[GlyphMarginLane[\"Right\"] = 3] = \"Right\";\n})(GlyphMarginLane || (GlyphMarginLane = {}));\n/**\n * Text Direction for a decoration.\n */\nvar TextDirection;\n(function (TextDirection) {\n    TextDirection[TextDirection[\"LTR\"] = 0] = \"LTR\";\n    TextDirection[TextDirection[\"RTL\"] = 1] = \"RTL\";\n})(TextDirection || (TextDirection = {}));\nvar InjectedTextCursorStops;\n(function (InjectedTextCursorStops) {\n    InjectedTextCursorStops[InjectedTextCursorStops[\"Both\"] = 0] = \"Both\";\n    InjectedTextCursorStops[InjectedTextCursorStops[\"Right\"] = 1] = \"Right\";\n    InjectedTextCursorStops[InjectedTextCursorStops[\"Left\"] = 2] = \"Left\";\n    InjectedTextCursorStops[InjectedTextCursorStops[\"None\"] = 3] = \"None\";\n})(InjectedTextCursorStops || (InjectedTextCursorStops = {}));\nclass TextModelResolvedOptions {\n    get originalIndentSize() {\n        return this._indentSizeIsTabSize ? 'tabSize' : this.indentSize;\n    }\n    /**\n     * @internal\n     */\n    constructor(src) {\n        this._textModelResolvedOptionsBrand = undefined;\n        this.tabSize = Math.max(1, src.tabSize | 0);\n        if (src.indentSize === 'tabSize') {\n            this.indentSize = this.tabSize;\n            this._indentSizeIsTabSize = true;\n        }\n        else {\n            this.indentSize = Math.max(1, src.indentSize | 0);\n            this._indentSizeIsTabSize = false;\n        }\n        this.insertSpaces = Boolean(src.insertSpaces);\n        this.defaultEOL = src.defaultEOL | 0;\n        this.trimAutoWhitespace = Boolean(src.trimAutoWhitespace);\n        this.bracketPairColorizationOptions = src.bracketPairColorizationOptions;\n    }\n    /**\n     * @internal\n     */\n    equals(other) {\n        return (this.tabSize === other.tabSize\n            && this._indentSizeIsTabSize === other._indentSizeIsTabSize\n            && this.indentSize === other.indentSize\n            && this.insertSpaces === other.insertSpaces\n            && this.defaultEOL === other.defaultEOL\n            && this.trimAutoWhitespace === other.trimAutoWhitespace\n            && equals(this.bracketPairColorizationOptions, other.bracketPairColorizationOptions));\n    }\n    /**\n     * @internal\n     */\n    createChangeEvent(newOpts) {\n        return {\n            tabSize: this.tabSize !== newOpts.tabSize,\n            indentSize: this.indentSize !== newOpts.indentSize,\n            insertSpaces: this.insertSpaces !== newOpts.insertSpaces,\n            trimAutoWhitespace: this.trimAutoWhitespace !== newOpts.trimAutoWhitespace,\n        };\n    }\n}\nclass FindMatch {\n    /**\n     * @internal\n     */\n    constructor(range, matches) {\n        this._findMatchBrand = undefined;\n        this.range = range;\n        this.matches = matches;\n    }\n}\n/**\n * @internal\n */\nfunction isITextSnapshot(obj) {\n    return (!!obj && typeof obj.read === 'function');\n}\n/**\n * @internal\n */\nclass ValidAnnotatedEditOperation {\n    constructor(identifier, range, text, forceMoveMarkers, isAutoWhitespaceEdit, _isTracked) {\n        this.identifier = identifier;\n        this.range = range;\n        this.text = text;\n        this.forceMoveMarkers = forceMoveMarkers;\n        this.isAutoWhitespaceEdit = isAutoWhitespaceEdit;\n        this._isTracked = _isTracked;\n    }\n}\n/**\n * @internal\n */\nclass SearchData {\n    constructor(regex, wordSeparators, simpleSearch) {\n        this.regex = regex;\n        this.wordSeparators = wordSeparators;\n        this.simpleSearch = simpleSearch;\n    }\n}\n/**\n * @internal\n */\nclass ApplyEditsResult {\n    constructor(reverseEdits, changes, trimAutoWhitespaceLineNumbers) {\n        this.reverseEdits = reverseEdits;\n        this.changes = changes;\n        this.trimAutoWhitespaceLineNumbers = trimAutoWhitespaceLineNumbers;\n    }\n}\n/**\n * @internal\n */\nfunction shouldSynchronizeModel(model) {\n    return (!model.isTooLargeForSyncing() && !model.isForSimpleWidget);\n}\n\nexport { ApplyEditsResult, FindMatch, GlyphMarginLane, InjectedTextCursorStops, OverviewRulerLane, SearchData, TextDirection, TextModelResolvedOptions, ValidAnnotatedEditOperation, isITextSnapshot, shouldSynchronizeModel };\n","import { isObject, isString, isUndefined, isBoolean, isNumber } from '../../../base/common/types.js';\nimport { CursorState, SingleCursorState } from '../cursorCommon.js';\nimport { MoveOperations } from './cursorMoveOperations.js';\nimport { WordOperations } from './cursorWordOperations.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { TextDirection } from '../model.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CursorMoveCommands {\n    static addCursorDown(viewModel, cursors, useLogicalLine) {\n        const result = [];\n        let resultLen = 0;\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            result[resultLen++] = new CursorState(cursor.modelState, cursor.viewState);\n            if (useLogicalLine) {\n                result[resultLen++] = CursorState.fromModelState(MoveOperations.translateDown(viewModel.cursorConfig, viewModel.model, cursor.modelState));\n            }\n            else {\n                result[resultLen++] = CursorState.fromViewState(MoveOperations.translateDown(viewModel.cursorConfig, viewModel, cursor.viewState));\n            }\n        }\n        return result;\n    }\n    static addCursorUp(viewModel, cursors, useLogicalLine) {\n        const result = [];\n        let resultLen = 0;\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            result[resultLen++] = new CursorState(cursor.modelState, cursor.viewState);\n            if (useLogicalLine) {\n                result[resultLen++] = CursorState.fromModelState(MoveOperations.translateUp(viewModel.cursorConfig, viewModel.model, cursor.modelState));\n            }\n            else {\n                result[resultLen++] = CursorState.fromViewState(MoveOperations.translateUp(viewModel.cursorConfig, viewModel, cursor.viewState));\n            }\n        }\n        return result;\n    }\n    static moveToBeginningOfLine(viewModel, cursors, inSelectionMode) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            result[i] = this._moveToLineStart(viewModel, cursor, inSelectionMode);\n        }\n        return result;\n    }\n    static _moveToLineStart(viewModel, cursor, inSelectionMode) {\n        const currentViewStateColumn = cursor.viewState.position.column;\n        const currentModelStateColumn = cursor.modelState.position.column;\n        const isFirstLineOfWrappedLine = currentViewStateColumn === currentModelStateColumn;\n        const currentViewStatelineNumber = cursor.viewState.position.lineNumber;\n        const firstNonBlankColumn = viewModel.getLineFirstNonWhitespaceColumn(currentViewStatelineNumber);\n        const isBeginningOfViewLine = currentViewStateColumn === firstNonBlankColumn;\n        if (!isFirstLineOfWrappedLine && !isBeginningOfViewLine) {\n            return this._moveToLineStartByView(viewModel, cursor, inSelectionMode);\n        }\n        else {\n            return this._moveToLineStartByModel(viewModel, cursor, inSelectionMode);\n        }\n    }\n    static _moveToLineStartByView(viewModel, cursor, inSelectionMode) {\n        return CursorState.fromViewState(MoveOperations.moveToBeginningOfLine(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode));\n    }\n    static _moveToLineStartByModel(viewModel, cursor, inSelectionMode) {\n        return CursorState.fromModelState(MoveOperations.moveToBeginningOfLine(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode));\n    }\n    static moveToEndOfLine(viewModel, cursors, inSelectionMode, sticky) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            result[i] = this._moveToLineEnd(viewModel, cursor, inSelectionMode, sticky);\n        }\n        return result;\n    }\n    static _moveToLineEnd(viewModel, cursor, inSelectionMode, sticky) {\n        const viewStatePosition = cursor.viewState.position;\n        const viewModelMaxColumn = viewModel.getLineMaxColumn(viewStatePosition.lineNumber);\n        const isEndOfViewLine = viewStatePosition.column === viewModelMaxColumn;\n        const modelStatePosition = cursor.modelState.position;\n        const modelMaxColumn = viewModel.model.getLineMaxColumn(modelStatePosition.lineNumber);\n        const isEndLineOfWrappedLine = viewModelMaxColumn - viewStatePosition.column === modelMaxColumn - modelStatePosition.column;\n        if (isEndOfViewLine || isEndLineOfWrappedLine) {\n            return this._moveToLineEndByModel(viewModel, cursor, inSelectionMode, sticky);\n        }\n        else {\n            return this._moveToLineEndByView(viewModel, cursor, inSelectionMode, sticky);\n        }\n    }\n    static _moveToLineEndByView(viewModel, cursor, inSelectionMode, sticky) {\n        return CursorState.fromViewState(MoveOperations.moveToEndOfLine(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, sticky));\n    }\n    static _moveToLineEndByModel(viewModel, cursor, inSelectionMode, sticky) {\n        return CursorState.fromModelState(MoveOperations.moveToEndOfLine(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode, sticky));\n    }\n    static expandLineSelection(viewModel, cursors) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            const startLineNumber = cursor.modelState.selection.startLineNumber;\n            const lineCount = viewModel.model.getLineCount();\n            let endLineNumber = cursor.modelState.selection.endLineNumber;\n            let endColumn;\n            if (endLineNumber === lineCount) {\n                endColumn = viewModel.model.getLineMaxColumn(lineCount);\n            }\n            else {\n                endLineNumber++;\n                endColumn = 1;\n            }\n            result[i] = CursorState.fromModelState(new SingleCursorState(new Range(startLineNumber, 1, startLineNumber, 1), 0 /* SelectionStartKind.Simple */, 0, new Position(endLineNumber, endColumn), 0));\n        }\n        return result;\n    }\n    static moveToBeginningOfBuffer(viewModel, cursors, inSelectionMode) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            result[i] = CursorState.fromModelState(MoveOperations.moveToBeginningOfBuffer(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode));\n        }\n        return result;\n    }\n    static moveToEndOfBuffer(viewModel, cursors, inSelectionMode) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            result[i] = CursorState.fromModelState(MoveOperations.moveToEndOfBuffer(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode));\n        }\n        return result;\n    }\n    static selectAll(viewModel, cursor) {\n        const lineCount = viewModel.model.getLineCount();\n        const maxColumn = viewModel.model.getLineMaxColumn(lineCount);\n        return CursorState.fromModelState(new SingleCursorState(new Range(1, 1, 1, 1), 0 /* SelectionStartKind.Simple */, 0, new Position(lineCount, maxColumn), 0));\n    }\n    static line(viewModel, cursor, inSelectionMode, _position, _viewPosition) {\n        const position = viewModel.model.validatePosition(_position);\n        const viewPosition = (_viewPosition\n            ? viewModel.coordinatesConverter.validateViewPosition(new Position(_viewPosition.lineNumber, _viewPosition.column), position)\n            : viewModel.coordinatesConverter.convertModelPositionToViewPosition(position));\n        if (!inSelectionMode) {\n            // Entering line selection for the first time\n            const lineCount = viewModel.model.getLineCount();\n            let selectToLineNumber = position.lineNumber + 1;\n            let selectToColumn = 1;\n            if (selectToLineNumber > lineCount) {\n                selectToLineNumber = lineCount;\n                selectToColumn = viewModel.model.getLineMaxColumn(selectToLineNumber);\n            }\n            return CursorState.fromModelState(new SingleCursorState(new Range(position.lineNumber, 1, selectToLineNumber, selectToColumn), 2 /* SelectionStartKind.Line */, 0, new Position(selectToLineNumber, selectToColumn), 0));\n        }\n        // Continuing line selection\n        const enteringLineNumber = cursor.modelState.selectionStart.getStartPosition().lineNumber;\n        if (position.lineNumber < enteringLineNumber) {\n            return CursorState.fromViewState(cursor.viewState.move(true, viewPosition.lineNumber, 1, 0));\n        }\n        else if (position.lineNumber > enteringLineNumber) {\n            const lineCount = viewModel.getLineCount();\n            let selectToViewLineNumber = viewPosition.lineNumber + 1;\n            let selectToViewColumn = 1;\n            if (selectToViewLineNumber > lineCount) {\n                selectToViewLineNumber = lineCount;\n                selectToViewColumn = viewModel.getLineMaxColumn(selectToViewLineNumber);\n            }\n            return CursorState.fromViewState(cursor.viewState.move(true, selectToViewLineNumber, selectToViewColumn, 0));\n        }\n        else {\n            const endPositionOfSelectionStart = cursor.modelState.selectionStart.getEndPosition();\n            return CursorState.fromModelState(cursor.modelState.move(true, endPositionOfSelectionStart.lineNumber, endPositionOfSelectionStart.column, 0));\n        }\n    }\n    static word(viewModel, cursor, inSelectionMode, _position) {\n        const position = viewModel.model.validatePosition(_position);\n        return CursorState.fromModelState(WordOperations.word(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode, position));\n    }\n    static cancelSelection(viewModel, cursor) {\n        if (!cursor.modelState.hasSelection()) {\n            return new CursorState(cursor.modelState, cursor.viewState);\n        }\n        const lineNumber = cursor.viewState.position.lineNumber;\n        const column = cursor.viewState.position.column;\n        return CursorState.fromViewState(new SingleCursorState(new Range(lineNumber, column, lineNumber, column), 0 /* SelectionStartKind.Simple */, 0, new Position(lineNumber, column), 0));\n    }\n    static moveTo(viewModel, cursor, inSelectionMode, _position, _viewPosition) {\n        if (inSelectionMode) {\n            if (cursor.modelState.selectionStartKind === 1 /* SelectionStartKind.Word */) {\n                return this.word(viewModel, cursor, inSelectionMode, _position);\n            }\n            if (cursor.modelState.selectionStartKind === 2 /* SelectionStartKind.Line */) {\n                return this.line(viewModel, cursor, inSelectionMode, _position, _viewPosition);\n            }\n        }\n        const position = viewModel.model.validatePosition(_position);\n        const viewPosition = (_viewPosition\n            ? viewModel.coordinatesConverter.validateViewPosition(new Position(_viewPosition.lineNumber, _viewPosition.column), position)\n            : viewModel.coordinatesConverter.convertModelPositionToViewPosition(position));\n        return CursorState.fromViewState(cursor.viewState.move(inSelectionMode, viewPosition.lineNumber, viewPosition.column, 0));\n    }\n    static simpleMove(viewModel, cursors, direction, inSelectionMode, value, unit) {\n        switch (direction) {\n            case 0 /* CursorMove.Direction.Left */: {\n                if (unit === 4 /* CursorMove.Unit.HalfLine */) {\n                    // Move left by half the current line length\n                    return this._moveHalfLineLeft(viewModel, cursors, inSelectionMode);\n                }\n                else {\n                    // Move left by `moveParams.value` columns\n                    return this._moveLeft(viewModel, cursors, inSelectionMode, value);\n                }\n            }\n            case 1 /* CursorMove.Direction.Right */: {\n                if (unit === 4 /* CursorMove.Unit.HalfLine */) {\n                    // Move right by half the current line length\n                    return this._moveHalfLineRight(viewModel, cursors, inSelectionMode);\n                }\n                else {\n                    // Move right by `moveParams.value` columns\n                    return this._moveRight(viewModel, cursors, inSelectionMode, value);\n                }\n            }\n            case 2 /* CursorMove.Direction.Up */: {\n                if (unit === 2 /* CursorMove.Unit.WrappedLine */) {\n                    // Move up by view lines\n                    return this._moveUpByViewLines(viewModel, cursors, inSelectionMode, value);\n                }\n                else {\n                    // Move up by model lines\n                    return this._moveUpByModelLines(viewModel, cursors, inSelectionMode, value);\n                }\n            }\n            case 3 /* CursorMove.Direction.Down */: {\n                if (unit === 2 /* CursorMove.Unit.WrappedLine */) {\n                    // Move down by view lines\n                    return this._moveDownByViewLines(viewModel, cursors, inSelectionMode, value);\n                }\n                else {\n                    // Move down by model lines\n                    return this._moveDownByModelLines(viewModel, cursors, inSelectionMode, value);\n                }\n            }\n            case 4 /* CursorMove.Direction.PrevBlankLine */: {\n                if (unit === 2 /* CursorMove.Unit.WrappedLine */) {\n                    return cursors.map(cursor => CursorState.fromViewState(MoveOperations.moveToPrevBlankLine(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode)));\n                }\n                else {\n                    return cursors.map(cursor => CursorState.fromModelState(MoveOperations.moveToPrevBlankLine(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode)));\n                }\n            }\n            case 5 /* CursorMove.Direction.NextBlankLine */: {\n                if (unit === 2 /* CursorMove.Unit.WrappedLine */) {\n                    return cursors.map(cursor => CursorState.fromViewState(MoveOperations.moveToNextBlankLine(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode)));\n                }\n                else {\n                    return cursors.map(cursor => CursorState.fromModelState(MoveOperations.moveToNextBlankLine(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode)));\n                }\n            }\n            case 6 /* CursorMove.Direction.WrappedLineStart */: {\n                // Move to the beginning of the current view line\n                return this._moveToViewMinColumn(viewModel, cursors, inSelectionMode);\n            }\n            case 7 /* CursorMove.Direction.WrappedLineFirstNonWhitespaceCharacter */: {\n                // Move to the first non-whitespace column of the current view line\n                return this._moveToViewFirstNonWhitespaceColumn(viewModel, cursors, inSelectionMode);\n            }\n            case 8 /* CursorMove.Direction.WrappedLineColumnCenter */: {\n                // Move to the \"center\" of the current view line\n                return this._moveToViewCenterColumn(viewModel, cursors, inSelectionMode);\n            }\n            case 9 /* CursorMove.Direction.WrappedLineEnd */: {\n                // Move to the end of the current view line\n                return this._moveToViewMaxColumn(viewModel, cursors, inSelectionMode);\n            }\n            case 10 /* CursorMove.Direction.WrappedLineLastNonWhitespaceCharacter */: {\n                // Move to the last non-whitespace column of the current view line\n                return this._moveToViewLastNonWhitespaceColumn(viewModel, cursors, inSelectionMode);\n            }\n            default:\n                return null;\n        }\n    }\n    static viewportMove(viewModel, cursors, direction, inSelectionMode, value) {\n        const visibleViewRange = viewModel.getCompletelyVisibleViewRange();\n        const visibleModelRange = viewModel.coordinatesConverter.convertViewRangeToModelRange(visibleViewRange);\n        switch (direction) {\n            case 11 /* CursorMove.Direction.ViewPortTop */: {\n                // Move to the nth line start in the viewport (from the top)\n                const modelLineNumber = this._firstLineNumberInRange(viewModel.model, visibleModelRange, value);\n                const modelColumn = viewModel.model.getLineFirstNonWhitespaceColumn(modelLineNumber);\n                return [this._moveToModelPosition(viewModel, cursors[0], inSelectionMode, modelLineNumber, modelColumn)];\n            }\n            case 13 /* CursorMove.Direction.ViewPortBottom */: {\n                // Move to the nth line start in the viewport (from the bottom)\n                const modelLineNumber = this._lastLineNumberInRange(viewModel.model, visibleModelRange, value);\n                const modelColumn = viewModel.model.getLineFirstNonWhitespaceColumn(modelLineNumber);\n                return [this._moveToModelPosition(viewModel, cursors[0], inSelectionMode, modelLineNumber, modelColumn)];\n            }\n            case 12 /* CursorMove.Direction.ViewPortCenter */: {\n                // Move to the line start in the viewport center\n                const modelLineNumber = Math.round((visibleModelRange.startLineNumber + visibleModelRange.endLineNumber) / 2);\n                const modelColumn = viewModel.model.getLineFirstNonWhitespaceColumn(modelLineNumber);\n                return [this._moveToModelPosition(viewModel, cursors[0], inSelectionMode, modelLineNumber, modelColumn)];\n            }\n            case 14 /* CursorMove.Direction.ViewPortIfOutside */: {\n                // Move to a position inside the viewport\n                const result = [];\n                for (let i = 0, len = cursors.length; i < len; i++) {\n                    const cursor = cursors[i];\n                    result[i] = this.findPositionInViewportIfOutside(viewModel, cursor, visibleViewRange, inSelectionMode);\n                }\n                return result;\n            }\n            default:\n                return null;\n        }\n    }\n    static findPositionInViewportIfOutside(viewModel, cursor, visibleViewRange, inSelectionMode) {\n        const viewLineNumber = cursor.viewState.position.lineNumber;\n        if (visibleViewRange.startLineNumber <= viewLineNumber && viewLineNumber <= visibleViewRange.endLineNumber - 1) {\n            // Nothing to do, cursor is in viewport\n            return new CursorState(cursor.modelState, cursor.viewState);\n        }\n        else {\n            let newViewLineNumber;\n            if (viewLineNumber > visibleViewRange.endLineNumber - 1) {\n                newViewLineNumber = visibleViewRange.endLineNumber - 1;\n            }\n            else if (viewLineNumber < visibleViewRange.startLineNumber) {\n                newViewLineNumber = visibleViewRange.startLineNumber;\n            }\n            else {\n                newViewLineNumber = viewLineNumber;\n            }\n            const position = MoveOperations.vertical(viewModel.cursorConfig, viewModel, viewLineNumber, cursor.viewState.position.column, cursor.viewState.leftoverVisibleColumns, newViewLineNumber, false);\n            return CursorState.fromViewState(cursor.viewState.move(inSelectionMode, position.lineNumber, position.column, position.leftoverVisibleColumns));\n        }\n    }\n    /**\n     * Find the nth line start included in the range (from the start).\n     */\n    static _firstLineNumberInRange(model, range, count) {\n        let startLineNumber = range.startLineNumber;\n        if (range.startColumn !== model.getLineMinColumn(startLineNumber)) {\n            // Move on to the second line if the first line start is not included in the range\n            startLineNumber++;\n        }\n        return Math.min(range.endLineNumber, startLineNumber + count - 1);\n    }\n    /**\n     * Find the nth line start included in the range (from the end).\n     */\n    static _lastLineNumberInRange(model, range, count) {\n        let startLineNumber = range.startLineNumber;\n        if (range.startColumn !== model.getLineMinColumn(startLineNumber)) {\n            // Move on to the second line if the first line start is not included in the range\n            startLineNumber++;\n        }\n        return Math.max(startLineNumber, range.endLineNumber - count + 1);\n    }\n    static _moveLeft(viewModel, cursors, inSelectionMode, noOfColumns) {\n        return cursors.map(cursor => {\n            const direction = viewModel.getTextDirection(cursor.viewState.position.lineNumber);\n            const isRtl = direction === TextDirection.RTL;\n            return CursorState.fromViewState(isRtl\n                ? MoveOperations.moveRight(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, noOfColumns)\n                : MoveOperations.moveLeft(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, noOfColumns));\n        });\n    }\n    static _moveHalfLineLeft(viewModel, cursors, inSelectionMode) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            const viewLineNumber = cursor.viewState.position.lineNumber;\n            const halfLine = Math.round(viewModel.getLineLength(viewLineNumber) / 2);\n            result[i] = CursorState.fromViewState(MoveOperations.moveLeft(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, halfLine));\n        }\n        return result;\n    }\n    static _moveRight(viewModel, cursors, inSelectionMode, noOfColumns) {\n        return cursors.map(cursor => {\n            const direction = viewModel.getTextDirection(cursor.viewState.position.lineNumber);\n            const isRtl = direction === TextDirection.RTL;\n            return CursorState.fromViewState(isRtl\n                ? MoveOperations.moveLeft(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, noOfColumns)\n                : MoveOperations.moveRight(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, noOfColumns));\n        });\n    }\n    static _moveHalfLineRight(viewModel, cursors, inSelectionMode) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            const viewLineNumber = cursor.viewState.position.lineNumber;\n            const halfLine = Math.round(viewModel.getLineLength(viewLineNumber) / 2);\n            result[i] = CursorState.fromViewState(MoveOperations.moveRight(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, halfLine));\n        }\n        return result;\n    }\n    static _moveDownByViewLines(viewModel, cursors, inSelectionMode, linesCount) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            result[i] = CursorState.fromViewState(MoveOperations.moveDown(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, linesCount));\n        }\n        return result;\n    }\n    static _moveDownByModelLines(viewModel, cursors, inSelectionMode, linesCount) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            result[i] = CursorState.fromModelState(MoveOperations.moveDown(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode, linesCount));\n        }\n        return result;\n    }\n    static _moveUpByViewLines(viewModel, cursors, inSelectionMode, linesCount) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            result[i] = CursorState.fromViewState(MoveOperations.moveUp(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, linesCount));\n        }\n        return result;\n    }\n    static _moveUpByModelLines(viewModel, cursors, inSelectionMode, linesCount) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            result[i] = CursorState.fromModelState(MoveOperations.moveUp(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode, linesCount));\n        }\n        return result;\n    }\n    static _moveToViewPosition(viewModel, cursor, inSelectionMode, toViewLineNumber, toViewColumn) {\n        return CursorState.fromViewState(cursor.viewState.move(inSelectionMode, toViewLineNumber, toViewColumn, 0));\n    }\n    static _moveToModelPosition(viewModel, cursor, inSelectionMode, toModelLineNumber, toModelColumn) {\n        return CursorState.fromModelState(cursor.modelState.move(inSelectionMode, toModelLineNumber, toModelColumn, 0));\n    }\n    static _moveToViewMinColumn(viewModel, cursors, inSelectionMode) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            const viewLineNumber = cursor.viewState.position.lineNumber;\n            const viewColumn = viewModel.getLineMinColumn(viewLineNumber);\n            result[i] = this._moveToViewPosition(viewModel, cursor, inSelectionMode, viewLineNumber, viewColumn);\n        }\n        return result;\n    }\n    static _moveToViewFirstNonWhitespaceColumn(viewModel, cursors, inSelectionMode) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            const viewLineNumber = cursor.viewState.position.lineNumber;\n            const viewColumn = viewModel.getLineFirstNonWhitespaceColumn(viewLineNumber);\n            result[i] = this._moveToViewPosition(viewModel, cursor, inSelectionMode, viewLineNumber, viewColumn);\n        }\n        return result;\n    }\n    static _moveToViewCenterColumn(viewModel, cursors, inSelectionMode) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            const viewLineNumber = cursor.viewState.position.lineNumber;\n            const viewColumn = Math.round((viewModel.getLineMaxColumn(viewLineNumber) + viewModel.getLineMinColumn(viewLineNumber)) / 2);\n            result[i] = this._moveToViewPosition(viewModel, cursor, inSelectionMode, viewLineNumber, viewColumn);\n        }\n        return result;\n    }\n    static _moveToViewMaxColumn(viewModel, cursors, inSelectionMode) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            const viewLineNumber = cursor.viewState.position.lineNumber;\n            const viewColumn = viewModel.getLineMaxColumn(viewLineNumber);\n            result[i] = this._moveToViewPosition(viewModel, cursor, inSelectionMode, viewLineNumber, viewColumn);\n        }\n        return result;\n    }\n    static _moveToViewLastNonWhitespaceColumn(viewModel, cursors, inSelectionMode) {\n        const result = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            const cursor = cursors[i];\n            const viewLineNumber = cursor.viewState.position.lineNumber;\n            const viewColumn = viewModel.getLineLastNonWhitespaceColumn(viewLineNumber);\n            result[i] = this._moveToViewPosition(viewModel, cursor, inSelectionMode, viewLineNumber, viewColumn);\n        }\n        return result;\n    }\n}\nvar CursorMove;\n(function (CursorMove) {\n    const isCursorMoveArgs = function (arg) {\n        if (!isObject(arg)) {\n            return false;\n        }\n        const cursorMoveArg = arg;\n        if (!isString(cursorMoveArg.to)) {\n            return false;\n        }\n        if (!isUndefined(cursorMoveArg.select) && !isBoolean(cursorMoveArg.select)) {\n            return false;\n        }\n        if (!isUndefined(cursorMoveArg.by) && !isString(cursorMoveArg.by)) {\n            return false;\n        }\n        if (!isUndefined(cursorMoveArg.value) && !isNumber(cursorMoveArg.value)) {\n            return false;\n        }\n        if (!isUndefined(cursorMoveArg.noHistory) && !isBoolean(cursorMoveArg.noHistory)) {\n            return false;\n        }\n        return true;\n    };\n    CursorMove.metadata = {\n        description: 'Move cursor to a logical position in the view',\n        args: [\n            {\n                name: 'Cursor move argument object',\n                description: `Property-value pairs that can be passed through this argument:\n\t\t\t\t\t* 'to': A mandatory logical position value providing where to move the cursor.\n\t\t\t\t\t\t\\`\\`\\`\n\t\t\t\t\t\t'left', 'right', 'up', 'down', 'prevBlankLine', 'nextBlankLine',\n\t\t\t\t\t\t'wrappedLineStart', 'wrappedLineEnd', 'wrappedLineColumnCenter'\n\t\t\t\t\t\t'wrappedLineFirstNonWhitespaceCharacter', 'wrappedLineLastNonWhitespaceCharacter'\n\t\t\t\t\t\t'viewPortTop', 'viewPortCenter', 'viewPortBottom', 'viewPortIfOutside'\n\t\t\t\t\t\t\\`\\`\\`\n\t\t\t\t\t* 'by': Unit to move. Default is computed based on 'to' value.\n\t\t\t\t\t\t\\`\\`\\`\n\t\t\t\t\t\t'line', 'wrappedLine', 'character', 'halfLine'\n\t\t\t\t\t\t\\`\\`\\`\n\t\t\t\t\t* 'value': Number of units to move. Default is '1'.\n\t\t\t\t\t* 'select': If 'true' makes the selection. Default is 'false'.\n\t\t\t\t\t* 'noHistory': If 'true' does not add the movement to navigation history. Default is 'false'.\n\t\t\t\t`,\n                constraint: isCursorMoveArgs,\n                schema: {\n                    'type': 'object',\n                    'required': ['to'],\n                    'properties': {\n                        'to': {\n                            'type': 'string',\n                            'enum': ['left', 'right', 'up', 'down', 'prevBlankLine', 'nextBlankLine', 'wrappedLineStart', 'wrappedLineEnd', 'wrappedLineColumnCenter', 'wrappedLineFirstNonWhitespaceCharacter', 'wrappedLineLastNonWhitespaceCharacter', 'viewPortTop', 'viewPortCenter', 'viewPortBottom', 'viewPortIfOutside']\n                        },\n                        'by': {\n                            'type': 'string',\n                            'enum': ['line', 'wrappedLine', 'character', 'halfLine']\n                        },\n                        'value': {\n                            'type': 'number',\n                            'default': 1\n                        },\n                        'select': {\n                            'type': 'boolean',\n                            'default': false\n                        },\n                        'noHistory': {\n                            'type': 'boolean',\n                            'default': false\n                        }\n                    }\n                }\n            }\n        ]\n    };\n    /**\n     * Positions in the view for cursor move command.\n     */\n    CursorMove.RawDirection = {\n        Left: 'left',\n        Right: 'right',\n        Up: 'up',\n        Down: 'down',\n        PrevBlankLine: 'prevBlankLine',\n        NextBlankLine: 'nextBlankLine',\n        WrappedLineStart: 'wrappedLineStart',\n        WrappedLineFirstNonWhitespaceCharacter: 'wrappedLineFirstNonWhitespaceCharacter',\n        WrappedLineColumnCenter: 'wrappedLineColumnCenter',\n        WrappedLineEnd: 'wrappedLineEnd',\n        WrappedLineLastNonWhitespaceCharacter: 'wrappedLineLastNonWhitespaceCharacter',\n        ViewPortTop: 'viewPortTop',\n        ViewPortCenter: 'viewPortCenter',\n        ViewPortBottom: 'viewPortBottom',\n        ViewPortIfOutside: 'viewPortIfOutside'\n    };\n    /**\n     * Units for Cursor move 'by' argument\n     */\n    CursorMove.RawUnit = {\n        Line: 'line',\n        WrappedLine: 'wrappedLine',\n        Character: 'character',\n        HalfLine: 'halfLine'\n    };\n    function parse(args) {\n        if (!args.to) {\n            // illegal arguments\n            return null;\n        }\n        let direction;\n        switch (args.to) {\n            case CursorMove.RawDirection.Left:\n                direction = 0 /* Direction.Left */;\n                break;\n            case CursorMove.RawDirection.Right:\n                direction = 1 /* Direction.Right */;\n                break;\n            case CursorMove.RawDirection.Up:\n                direction = 2 /* Direction.Up */;\n                break;\n            case CursorMove.RawDirection.Down:\n                direction = 3 /* Direction.Down */;\n                break;\n            case CursorMove.RawDirection.PrevBlankLine:\n                direction = 4 /* Direction.PrevBlankLine */;\n                break;\n            case CursorMove.RawDirection.NextBlankLine:\n                direction = 5 /* Direction.NextBlankLine */;\n                break;\n            case CursorMove.RawDirection.WrappedLineStart:\n                direction = 6 /* Direction.WrappedLineStart */;\n                break;\n            case CursorMove.RawDirection.WrappedLineFirstNonWhitespaceCharacter:\n                direction = 7 /* Direction.WrappedLineFirstNonWhitespaceCharacter */;\n                break;\n            case CursorMove.RawDirection.WrappedLineColumnCenter:\n                direction = 8 /* Direction.WrappedLineColumnCenter */;\n                break;\n            case CursorMove.RawDirection.WrappedLineEnd:\n                direction = 9 /* Direction.WrappedLineEnd */;\n                break;\n            case CursorMove.RawDirection.WrappedLineLastNonWhitespaceCharacter:\n                direction = 10 /* Direction.WrappedLineLastNonWhitespaceCharacter */;\n                break;\n            case CursorMove.RawDirection.ViewPortTop:\n                direction = 11 /* Direction.ViewPortTop */;\n                break;\n            case CursorMove.RawDirection.ViewPortBottom:\n                direction = 13 /* Direction.ViewPortBottom */;\n                break;\n            case CursorMove.RawDirection.ViewPortCenter:\n                direction = 12 /* Direction.ViewPortCenter */;\n                break;\n            case CursorMove.RawDirection.ViewPortIfOutside:\n                direction = 14 /* Direction.ViewPortIfOutside */;\n                break;\n            default:\n                // illegal arguments\n                return null;\n        }\n        let unit = 0 /* Unit.None */;\n        switch (args.by) {\n            case CursorMove.RawUnit.Line:\n                unit = 1 /* Unit.Line */;\n                break;\n            case CursorMove.RawUnit.WrappedLine:\n                unit = 2 /* Unit.WrappedLine */;\n                break;\n            case CursorMove.RawUnit.Character:\n                unit = 3 /* Unit.Character */;\n                break;\n            case CursorMove.RawUnit.HalfLine:\n                unit = 4 /* Unit.HalfLine */;\n                break;\n        }\n        return {\n            direction: direction,\n            unit: unit,\n            select: (!!args.select),\n            value: (args.value || 1),\n            noHistory: (!!args.noHistory)\n        };\n    }\n    CursorMove.parse = parse;\n})(CursorMove || (CursorMove = {}));\n\nexport { CursorMove, CursorMoveCommands };\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/**\n * Describes what to do with the indentation when pressing Enter.\n */\nvar IndentAction;\n(function (IndentAction) {\n    /**\n     * Insert new line and copy the previous line's indentation.\n     */\n    IndentAction[IndentAction[\"None\"] = 0] = \"None\";\n    /**\n     * Insert new line and indent once (relative to the previous line's indentation).\n     */\n    IndentAction[IndentAction[\"Indent\"] = 1] = \"Indent\";\n    /**\n     * Insert two new lines:\n     *  - the first one indented which will hold the cursor\n     *  - the second one at the same indentation level\n     */\n    IndentAction[IndentAction[\"IndentOutdent\"] = 2] = \"IndentOutdent\";\n    /**\n     * Insert new line and outdent once (relative to the previous line's indentation).\n     */\n    IndentAction[IndentAction[\"Outdent\"] = 3] = \"Outdent\";\n})(IndentAction || (IndentAction = {}));\n/**\n * @internal\n */\nclass StandardAutoClosingPairConditional {\n    constructor(source) {\n        this._neutralCharacter = null;\n        this._neutralCharacterSearched = false;\n        this.open = source.open;\n        this.close = source.close;\n        // initially allowed in all tokens\n        this._inString = true;\n        this._inComment = true;\n        this._inRegEx = true;\n        if (Array.isArray(source.notIn)) {\n            for (let i = 0, len = source.notIn.length; i < len; i++) {\n                const notIn = source.notIn[i];\n                switch (notIn) {\n                    case 'string':\n                        this._inString = false;\n                        break;\n                    case 'comment':\n                        this._inComment = false;\n                        break;\n                    case 'regex':\n                        this._inRegEx = false;\n                        break;\n                }\n            }\n        }\n    }\n    isOK(standardToken) {\n        switch (standardToken) {\n            case 0 /* StandardTokenType.Other */:\n                return true;\n            case 1 /* StandardTokenType.Comment */:\n                return this._inComment;\n            case 2 /* StandardTokenType.String */:\n                return this._inString;\n            case 3 /* StandardTokenType.RegEx */:\n                return this._inRegEx;\n        }\n    }\n    shouldAutoClose(context, column) {\n        // Always complete on empty line\n        if (context.getTokenCount() === 0) {\n            return true;\n        }\n        const tokenIndex = context.findTokenIndexAtOffset(column - 2);\n        const standardTokenType = context.getStandardTokenType(tokenIndex);\n        return this.isOK(standardTokenType);\n    }\n    _findNeutralCharacterInRange(fromCharCode, toCharCode) {\n        for (let charCode = fromCharCode; charCode <= toCharCode; charCode++) {\n            const character = String.fromCharCode(charCode);\n            if (!this.open.includes(character) && !this.close.includes(character)) {\n                return character;\n            }\n        }\n        return null;\n    }\n    /**\n     * Find a character in the range [0-9a-zA-Z] that does not appear in the open or close\n     */\n    findNeutralCharacter() {\n        if (!this._neutralCharacterSearched) {\n            this._neutralCharacterSearched = true;\n            if (!this._neutralCharacter) {\n                this._neutralCharacter = this._findNeutralCharacterInRange(48 /* CharCode.Digit0 */, 57 /* CharCode.Digit9 */);\n            }\n            if (!this._neutralCharacter) {\n                this._neutralCharacter = this._findNeutralCharacterInRange(97 /* CharCode.a */, 122 /* CharCode.z */);\n            }\n            if (!this._neutralCharacter) {\n                this._neutralCharacter = this._findNeutralCharacterInRange(65 /* CharCode.A */, 90 /* CharCode.Z */);\n            }\n        }\n        return this._neutralCharacter;\n    }\n}\n/**\n * @internal\n */\nclass AutoClosingPairs {\n    constructor(autoClosingPairs) {\n        this.autoClosingPairsOpenByStart = new Map();\n        this.autoClosingPairsOpenByEnd = new Map();\n        this.autoClosingPairsCloseByStart = new Map();\n        this.autoClosingPairsCloseByEnd = new Map();\n        this.autoClosingPairsCloseSingleChar = new Map();\n        for (const pair of autoClosingPairs) {\n            appendEntry(this.autoClosingPairsOpenByStart, pair.open.charAt(0), pair);\n            appendEntry(this.autoClosingPairsOpenByEnd, pair.open.charAt(pair.open.length - 1), pair);\n            appendEntry(this.autoClosingPairsCloseByStart, pair.close.charAt(0), pair);\n            appendEntry(this.autoClosingPairsCloseByEnd, pair.close.charAt(pair.close.length - 1), pair);\n            if (pair.close.length === 1 && pair.open.length === 1) {\n                appendEntry(this.autoClosingPairsCloseSingleChar, pair.close, pair);\n            }\n        }\n    }\n}\nfunction appendEntry(target, key, value) {\n    if (target.has(key)) {\n        target.get(key).push(value);\n    }\n    else {\n        target.set(key, [value]);\n    }\n}\n\nexport { AutoClosingPairs, IndentAction, StandardAutoClosingPairConditional };\n","import { Iterable } from '../../../base/common/iterator.js';\nimport { LinkedList } from '../../../base/common/linkedList.js';\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 *--------------------------------------------------------------------------------------------*/\nconst USUAL_WORD_SEPARATORS = '`~!@#$%^&*()-=+[{]}\\\\|;:\\'\",.<>/?';\n/**\n * Create a word definition regular expression based on default word separators.\n * Optionally provide allowed separators that should be included in words.\n *\n * The default would look like this:\n * /(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>\\/\\?\\s]+)/g\n */\nfunction createWordRegExp(allowInWords = '') {\n    let source = '(-?\\\\d*\\\\.\\\\d\\\\w*)|([^';\n    for (const sep of USUAL_WORD_SEPARATORS) {\n        if (allowInWords.indexOf(sep) >= 0) {\n            continue;\n        }\n        source += '\\\\' + sep;\n    }\n    source += '\\\\s]+)';\n    return new RegExp(source, 'g');\n}\n// catches numbers (including floating numbers) in the first group, and alphanum in the second\nconst DEFAULT_WORD_REGEXP = createWordRegExp();\nfunction ensureValidWordDefinition(wordDefinition) {\n    let result = DEFAULT_WORD_REGEXP;\n    if (wordDefinition && (wordDefinition instanceof RegExp)) {\n        if (!wordDefinition.global) {\n            let flags = 'g';\n            if (wordDefinition.ignoreCase) {\n                flags += 'i';\n            }\n            if (wordDefinition.multiline) {\n                flags += 'm';\n            }\n            if (wordDefinition.unicode) {\n                flags += 'u';\n            }\n            result = new RegExp(wordDefinition.source, flags);\n        }\n        else {\n            result = wordDefinition;\n        }\n    }\n    result.lastIndex = 0;\n    return result;\n}\nconst _defaultConfig = new LinkedList();\n_defaultConfig.unshift({\n    maxLen: 1000,\n    windowSize: 15,\n    timeBudget: 150\n});\nfunction getWordAtText(column, wordDefinition, text, textOffset, config) {\n    // Ensure the regex has the 'g' flag, otherwise this will loop forever\n    wordDefinition = ensureValidWordDefinition(wordDefinition);\n    if (!config) {\n        config = Iterable.first(_defaultConfig);\n    }\n    if (text.length > config.maxLen) {\n        // don't throw strings that long at the regexp\n        // but use a sub-string in which a word must occur\n        let start = column - config.maxLen / 2;\n        if (start < 0) {\n            start = 0;\n        }\n        else {\n            textOffset += start;\n        }\n        text = text.substring(start, column + config.maxLen / 2);\n        return getWordAtText(column, wordDefinition, text, textOffset, config);\n    }\n    const t1 = Date.now();\n    const pos = column - 1 - textOffset;\n    let prevRegexIndex = -1;\n    let match = null;\n    for (let i = 1;; i++) {\n        // check time budget\n        if (Date.now() - t1 >= config.timeBudget) {\n            break;\n        }\n        // reset the index at which the regexp should start matching, also know where it\n        // should stop so that subsequent search don't repeat previous searches\n        const regexIndex = pos - config.windowSize * i;\n        wordDefinition.lastIndex = Math.max(0, regexIndex);\n        const thisMatch = _findRegexMatchEnclosingPosition(wordDefinition, text, pos, prevRegexIndex);\n        if (!thisMatch && match) {\n            // stop: we have something\n            break;\n        }\n        match = thisMatch;\n        // stop: searched at start\n        if (regexIndex <= 0) {\n            break;\n        }\n        prevRegexIndex = regexIndex;\n    }\n    if (match) {\n        const result = {\n            word: match[0],\n            startColumn: textOffset + 1 + match.index,\n            endColumn: textOffset + 1 + match.index + match[0].length\n        };\n        wordDefinition.lastIndex = 0;\n        return result;\n    }\n    return null;\n}\nfunction _findRegexMatchEnclosingPosition(wordDefinition, text, pos, stopPos) {\n    let match;\n    while (match = wordDefinition.exec(text)) {\n        const matchIndex = match.index || 0;\n        if (matchIndex <= pos && wordDefinition.lastIndex >= pos) {\n            return match;\n        }\n        else if (stopPos > 0 && matchIndex > stopPos) {\n            return null;\n        }\n    }\n    return null;\n}\n\nexport { DEFAULT_WORD_REGEXP, USUAL_WORD_SEPARATORS, ensureValidWordDefinition, getWordAtText };\n","import { StandardAutoClosingPairConditional } from '../languageConfiguration.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CharacterPairSupport {\n    static { this.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_QUOTES = ';:.,=}])> \\n\\t'; }\n    static { this.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_BRACKETS = '\\'\"`;:.,=}])> \\n\\t'; }\n    constructor(config) {\n        if (config.autoClosingPairs) {\n            this._autoClosingPairs = config.autoClosingPairs.map(el => new StandardAutoClosingPairConditional(el));\n        }\n        else if (config.brackets) {\n            this._autoClosingPairs = config.brackets.map(b => new StandardAutoClosingPairConditional({ open: b[0], close: b[1] }));\n        }\n        else {\n            this._autoClosingPairs = [];\n        }\n        if (config.__electricCharacterSupport && config.__electricCharacterSupport.docComment) {\n            const docComment = config.__electricCharacterSupport.docComment;\n            // IDocComment is legacy, only partially supported\n            this._autoClosingPairs.push(new StandardAutoClosingPairConditional({ open: docComment.open, close: docComment.close || '' }));\n        }\n        this._autoCloseBeforeForQuotes = typeof config.autoCloseBefore === 'string' ? config.autoCloseBefore : CharacterPairSupport.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_QUOTES;\n        this._autoCloseBeforeForBrackets = typeof config.autoCloseBefore === 'string' ? config.autoCloseBefore : CharacterPairSupport.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_BRACKETS;\n        this._surroundingPairs = config.surroundingPairs || this._autoClosingPairs;\n    }\n    getAutoClosingPairs() {\n        return this._autoClosingPairs;\n    }\n    getAutoCloseBeforeSet(forQuotes) {\n        return (forQuotes ? this._autoCloseBeforeForQuotes : this._autoCloseBeforeForBrackets);\n    }\n    getSurroundingPairs() {\n        return this._surroundingPairs;\n    }\n}\n\nexport { CharacterPairSupport };\n","import { isHighSurrogate } from '../../../base/common/strings.js';\nimport { isLittleEndian } from '../../../base/common/platform.js';\nimport { readUInt16LE } from '../../../base/common/buffer.js';\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 *--------------------------------------------------------------------------------------------*/\nlet _utf16LE_TextDecoder;\nfunction getUTF16LE_TextDecoder() {\n    if (!_utf16LE_TextDecoder) {\n        _utf16LE_TextDecoder = new TextDecoder('UTF-16LE');\n    }\n    return _utf16LE_TextDecoder;\n}\nlet _utf16BE_TextDecoder;\nfunction getUTF16BE_TextDecoder() {\n    if (!_utf16BE_TextDecoder) {\n        _utf16BE_TextDecoder = new TextDecoder('UTF-16BE');\n    }\n    return _utf16BE_TextDecoder;\n}\nlet _platformTextDecoder;\nfunction getPlatformTextDecoder() {\n    if (!_platformTextDecoder) {\n        _platformTextDecoder = isLittleEndian() ? getUTF16LE_TextDecoder() : getUTF16BE_TextDecoder();\n    }\n    return _platformTextDecoder;\n}\nfunction decodeUTF16LE(source, offset, len) {\n    const view = new Uint16Array(source.buffer, offset, len);\n    if (len > 0 && (view[0] === 0xFEFF || view[0] === 0xFFFE)) {\n        // UTF16 sometimes starts with a BOM https://de.wikipedia.org/wiki/Byte_Order_Mark\n        // It looks like TextDecoder.decode will eat up a leading BOM (0xFEFF or 0xFFFE)\n        // We don't want that behavior because we know the string is UTF16LE and the BOM should be maintained\n        // So we use the manual decoder\n        return compatDecodeUTF16LE(source, offset, len);\n    }\n    return getUTF16LE_TextDecoder().decode(view);\n}\nfunction compatDecodeUTF16LE(source, offset, len) {\n    const result = [];\n    let resultLen = 0;\n    for (let i = 0; i < len; i++) {\n        const charCode = readUInt16LE(source, offset);\n        offset += 2;\n        result[resultLen++] = String.fromCharCode(charCode);\n    }\n    return result.join('');\n}\nclass StringBuilder {\n    constructor(capacity) {\n        this._capacity = capacity | 0;\n        this._buffer = new Uint16Array(this._capacity);\n        this._completedStrings = null;\n        this._bufferLength = 0;\n    }\n    reset() {\n        this._completedStrings = null;\n        this._bufferLength = 0;\n    }\n    build() {\n        if (this._completedStrings !== null) {\n            this._flushBuffer();\n            return this._completedStrings.join('');\n        }\n        return this._buildBuffer();\n    }\n    _buildBuffer() {\n        if (this._bufferLength === 0) {\n            return '';\n        }\n        const view = new Uint16Array(this._buffer.buffer, 0, this._bufferLength);\n        return getPlatformTextDecoder().decode(view);\n    }\n    _flushBuffer() {\n        const bufferString = this._buildBuffer();\n        this._bufferLength = 0;\n        if (this._completedStrings === null) {\n            this._completedStrings = [bufferString];\n        }\n        else {\n            this._completedStrings[this._completedStrings.length] = bufferString;\n        }\n    }\n    /**\n     * Append a char code (<2^16)\n     */\n    appendCharCode(charCode) {\n        const remainingSpace = this._capacity - this._bufferLength;\n        if (remainingSpace <= 1) {\n            if (remainingSpace === 0 || isHighSurrogate(charCode)) {\n                this._flushBuffer();\n            }\n        }\n        this._buffer[this._bufferLength++] = charCode;\n    }\n    /**\n     * Append an ASCII char code (<2^8)\n     */\n    appendASCIICharCode(charCode) {\n        if (this._bufferLength === this._capacity) {\n            // buffer is full\n            this._flushBuffer();\n        }\n        this._buffer[this._bufferLength++] = charCode;\n    }\n    appendString(str) {\n        const strLen = str.length;\n        if (this._bufferLength + strLen >= this._capacity) {\n            // This string does not fit in the remaining buffer space\n            this._flushBuffer();\n            this._completedStrings[this._completedStrings.length] = str;\n            return;\n        }\n        for (let i = 0; i < strLen; i++) {\n            this._buffer[this._bufferLength++] = str.charCodeAt(i);\n        }\n    }\n}\n\nexport { StringBuilder, decodeUTF16LE, getPlatformTextDecoder };\n","import { createRegExp, escapeRegExpCharacters } from '../../../../base/common/strings.js';\nimport { getPlatformTextDecoder } from '../../core/stringBuilder.js';\nimport { Range } from '../../core/range.js';\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/**\n * Represents a grouping of colliding bracket pairs.\n *\n * Most of the times this contains a single bracket pair,\n * but sometimes this contains multiple bracket pairs in cases\n * where the same string appears as a closing bracket for multiple\n * bracket pairs, or the same string appears an opening bracket for\n * multiple bracket pairs.\n *\n * e.g. of a group containing a single pair:\n *   open: ['{'], close: ['}']\n *\n * e.g. of a group containing multiple pairs:\n *   open: ['if', 'for'], close: ['end', 'end']\n */\nclass RichEditBracket {\n    constructor(languageId, index, open, close, forwardRegex, reversedRegex) {\n        this._richEditBracketBrand = undefined;\n        this.languageId = languageId;\n        this.index = index;\n        this.open = open;\n        this.close = close;\n        this.forwardRegex = forwardRegex;\n        this.reversedRegex = reversedRegex;\n        this._openSet = RichEditBracket._toSet(this.open);\n        this._closeSet = RichEditBracket._toSet(this.close);\n    }\n    /**\n     * Check if the provided `text` is an open bracket in this group.\n     */\n    isOpen(text) {\n        return this._openSet.has(text);\n    }\n    /**\n     * Check if the provided `text` is a close bracket in this group.\n     */\n    isClose(text) {\n        return this._closeSet.has(text);\n    }\n    static _toSet(arr) {\n        const result = new Set();\n        for (const element of arr) {\n            result.add(element);\n        }\n        return result;\n    }\n}\n/**\n * Groups together brackets that have equal open or close sequences.\n *\n * For example, if the following brackets are defined:\n *   ['IF','END']\n *   ['for','end']\n *   ['{','}']\n *\n * Then the grouped brackets would be:\n *   { open: ['if', 'for'], close: ['end', 'end'] }\n *   { open: ['{'], close: ['}'] }\n *\n */\nfunction groupFuzzyBrackets(brackets) {\n    const N = brackets.length;\n    brackets = brackets.map(b => [b[0].toLowerCase(), b[1].toLowerCase()]);\n    const group = [];\n    for (let i = 0; i < N; i++) {\n        group[i] = i;\n    }\n    const areOverlapping = (a, b) => {\n        const [aOpen, aClose] = a;\n        const [bOpen, bClose] = b;\n        return (aOpen === bOpen || aOpen === bClose || aClose === bOpen || aClose === bClose);\n    };\n    const mergeGroups = (g1, g2) => {\n        const newG = Math.min(g1, g2);\n        const oldG = Math.max(g1, g2);\n        for (let i = 0; i < N; i++) {\n            if (group[i] === oldG) {\n                group[i] = newG;\n            }\n        }\n    };\n    // group together brackets that have the same open or the same close sequence\n    for (let i = 0; i < N; i++) {\n        const a = brackets[i];\n        for (let j = i + 1; j < N; j++) {\n            const b = brackets[j];\n            if (areOverlapping(a, b)) {\n                mergeGroups(group[i], group[j]);\n            }\n        }\n    }\n    const result = [];\n    for (let g = 0; g < N; g++) {\n        const currentOpen = [];\n        const currentClose = [];\n        for (let i = 0; i < N; i++) {\n            if (group[i] === g) {\n                const [open, close] = brackets[i];\n                currentOpen.push(open);\n                currentClose.push(close);\n            }\n        }\n        if (currentOpen.length > 0) {\n            result.push({\n                open: currentOpen,\n                close: currentClose\n            });\n        }\n    }\n    return result;\n}\nclass RichEditBrackets {\n    constructor(languageId, _brackets) {\n        this._richEditBracketsBrand = undefined;\n        const brackets = groupFuzzyBrackets(_brackets);\n        this.brackets = brackets.map((b, index) => {\n            return new RichEditBracket(languageId, index, b.open, b.close, getRegexForBracketPair(b.open, b.close, brackets, index), getReversedRegexForBracketPair(b.open, b.close, brackets, index));\n        });\n        this.forwardRegex = getRegexForBrackets(this.brackets);\n        this.reversedRegex = getReversedRegexForBrackets(this.brackets);\n        this.textIsBracket = {};\n        this.textIsOpenBracket = {};\n        this.maxBracketLength = 0;\n        for (const bracket of this.brackets) {\n            for (const open of bracket.open) {\n                this.textIsBracket[open] = bracket;\n                this.textIsOpenBracket[open] = true;\n                this.maxBracketLength = Math.max(this.maxBracketLength, open.length);\n            }\n            for (const close of bracket.close) {\n                this.textIsBracket[close] = bracket;\n                this.textIsOpenBracket[close] = false;\n                this.maxBracketLength = Math.max(this.maxBracketLength, close.length);\n            }\n        }\n    }\n}\nfunction collectSuperstrings(str, brackets, currentIndex, dest) {\n    for (let i = 0, len = brackets.length; i < len; i++) {\n        if (i === currentIndex) {\n            continue;\n        }\n        const bracket = brackets[i];\n        for (const open of bracket.open) {\n            if (open.indexOf(str) >= 0) {\n                dest.push(open);\n            }\n        }\n        for (const close of bracket.close) {\n            if (close.indexOf(str) >= 0) {\n                dest.push(close);\n            }\n        }\n    }\n}\nfunction lengthcmp(a, b) {\n    return a.length - b.length;\n}\nfunction unique(arr) {\n    if (arr.length <= 1) {\n        return arr;\n    }\n    const result = [];\n    const seen = new Set();\n    for (const element of arr) {\n        if (seen.has(element)) {\n            continue;\n        }\n        result.push(element);\n        seen.add(element);\n    }\n    return result;\n}\n/**\n * Create a regular expression that can be used to search forward in a piece of text\n * for a group of bracket pairs. But this regex must be built in a way in which\n * it is aware of the other bracket pairs defined for the language.\n *\n * For example, if a language contains the following bracket pairs:\n *   ['begin', 'end']\n *   ['if', 'end if']\n * The two bracket pairs do not collide because no open or close brackets are equal.\n * So the function getRegexForBracketPair is called twice, once with\n * the ['begin'], ['end'] group consisting of one bracket pair, and once with\n * the ['if'], ['end if'] group consiting of the other bracket pair.\n *\n * But there could be a situation where an occurrence of 'end if' is mistaken\n * for an occurrence of 'end'.\n *\n * Therefore, for the bracket pair ['begin', 'end'], the regex will also\n * target 'end if'. The regex will be something like:\n *   /(\\bend if\\b)|(\\bend\\b)|(\\bif\\b)/\n *\n * The regex also searches for \"superstrings\" (other brackets that might be mistaken with the current bracket).\n *\n */\nfunction getRegexForBracketPair(open, close, brackets, currentIndex) {\n    // search in all brackets for other brackets that are a superstring of these brackets\n    let pieces = [];\n    pieces = pieces.concat(open);\n    pieces = pieces.concat(close);\n    for (let i = 0, len = pieces.length; i < len; i++) {\n        collectSuperstrings(pieces[i], brackets, currentIndex, pieces);\n    }\n    pieces = unique(pieces);\n    pieces.sort(lengthcmp);\n    pieces.reverse();\n    return createBracketOrRegExp(pieces);\n}\n/**\n * Matching a regular expression in JS can only be done \"forwards\". So JS offers natively only\n * methods to find the first match of a regex in a string. But sometimes, it is useful to\n * find the last match of a regex in a string. For such a situation, a nice solution is to\n * simply reverse the string and then search for a reversed regex.\n *\n * This function also has the fine details of `getRegexForBracketPair`. For the same example\n * given above, the regex produced here would look like:\n *   /(\\bfi dne\\b)|(\\bdne\\b)|(\\bfi\\b)/\n */\nfunction getReversedRegexForBracketPair(open, close, brackets, currentIndex) {\n    // search in all brackets for other brackets that are a superstring of these brackets\n    let pieces = [];\n    pieces = pieces.concat(open);\n    pieces = pieces.concat(close);\n    for (let i = 0, len = pieces.length; i < len; i++) {\n        collectSuperstrings(pieces[i], brackets, currentIndex, pieces);\n    }\n    pieces = unique(pieces);\n    pieces.sort(lengthcmp);\n    pieces.reverse();\n    return createBracketOrRegExp(pieces.map(toReversedString));\n}\n/**\n * Creates a regular expression that targets all bracket pairs.\n *\n * e.g. for the bracket pairs:\n *  ['{','}']\n *  ['begin,'end']\n *  ['for','end']\n * the regex would look like:\n *  /(\\{)|(\\})|(\\bbegin\\b)|(\\bend\\b)|(\\bfor\\b)/\n */\nfunction getRegexForBrackets(brackets) {\n    let pieces = [];\n    for (const bracket of brackets) {\n        for (const open of bracket.open) {\n            pieces.push(open);\n        }\n        for (const close of bracket.close) {\n            pieces.push(close);\n        }\n    }\n    pieces = unique(pieces);\n    return createBracketOrRegExp(pieces);\n}\n/**\n * Matching a regular expression in JS can only be done \"forwards\". So JS offers natively only\n * methods to find the first match of a regex in a string. But sometimes, it is useful to\n * find the last match of a regex in a string. For such a situation, a nice solution is to\n * simply reverse the string and then search for a reversed regex.\n *\n * e.g. for the bracket pairs:\n *  ['{','}']\n *  ['begin,'end']\n *  ['for','end']\n * the regex would look like:\n *  /(\\{)|(\\})|(\\bnigeb\\b)|(\\bdne\\b)|(\\brof\\b)/\n */\nfunction getReversedRegexForBrackets(brackets) {\n    let pieces = [];\n    for (const bracket of brackets) {\n        for (const open of bracket.open) {\n            pieces.push(open);\n        }\n        for (const close of bracket.close) {\n            pieces.push(close);\n        }\n    }\n    pieces = unique(pieces);\n    return createBracketOrRegExp(pieces.map(toReversedString));\n}\nfunction prepareBracketForRegExp(str) {\n    // This bracket pair uses letters like e.g. \"begin\" - \"end\"\n    const insertWordBoundaries = (/^[\\w ]+$/.test(str));\n    str = escapeRegExpCharacters(str);\n    return (insertWordBoundaries ? `\\\\b${str}\\\\b` : str);\n}\nfunction createBracketOrRegExp(pieces, options) {\n    const regexStr = `(${pieces.map(prepareBracketForRegExp).join(')|(')})`;\n    return createRegExp(regexStr, true, options);\n}\nconst toReversedString = (function () {\n    function reverse(str) {\n        // create a Uint16Array and then use a TextDecoder to create a string\n        const arr = new Uint16Array(str.length);\n        let offset = 0;\n        for (let i = str.length - 1; i >= 0; i--) {\n            arr[offset++] = str.charCodeAt(i);\n        }\n        return getPlatformTextDecoder().decode(arr);\n    }\n    let lastInput = null;\n    let lastOutput = null;\n    return function toReversedString(str) {\n        if (lastInput !== str) {\n            lastInput = str;\n            lastOutput = reverse(lastInput);\n        }\n        return lastOutput;\n    };\n})();\nclass BracketsUtils {\n    static _findPrevBracketInText(reversedBracketRegex, lineNumber, reversedText, offset) {\n        const m = reversedText.match(reversedBracketRegex);\n        if (!m) {\n            return null;\n        }\n        const matchOffset = reversedText.length - (m.index || 0);\n        const matchLength = m[0].length;\n        const absoluteMatchOffset = offset + matchOffset;\n        return new Range(lineNumber, absoluteMatchOffset - matchLength + 1, lineNumber, absoluteMatchOffset + 1);\n    }\n    static findPrevBracketInRange(reversedBracketRegex, lineNumber, lineText, startOffset, endOffset) {\n        // Because JS does not support backwards regex search, we search forwards in a reversed string with a reversed regex ;)\n        const reversedLineText = toReversedString(lineText);\n        const reversedSubstr = reversedLineText.substring(lineText.length - endOffset, lineText.length - startOffset);\n        return this._findPrevBracketInText(reversedBracketRegex, lineNumber, reversedSubstr, startOffset);\n    }\n    static findNextBracketInText(bracketRegex, lineNumber, text, offset) {\n        const m = text.match(bracketRegex);\n        if (!m) {\n            return null;\n        }\n        const matchOffset = m.index || 0;\n        const matchLength = m[0].length;\n        if (matchLength === 0) {\n            return null;\n        }\n        const absoluteMatchOffset = offset + matchOffset;\n        return new Range(lineNumber, absoluteMatchOffset + 1, lineNumber, absoluteMatchOffset + 1 + matchLength);\n    }\n    static findNextBracketInRange(bracketRegex, lineNumber, lineText, startOffset, endOffset) {\n        const substr = lineText.substring(startOffset, endOffset);\n        return this.findNextBracketInText(bracketRegex, lineNumber, substr, startOffset);\n    }\n}\n\nexport { BracketsUtils, RichEditBracket, RichEditBrackets, createBracketOrRegExp };\n","import { distinct } from '../../../../base/common/arrays.js';\nimport { ignoreBracketsInToken } from '../supports.js';\nimport { BracketsUtils } from './richEditBrackets.js';\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 *--------------------------------------------------------------------------------------------*/\nclass BracketElectricCharacterSupport {\n    constructor(richEditBrackets) {\n        this._richEditBrackets = richEditBrackets;\n    }\n    getElectricCharacters() {\n        const result = [];\n        if (this._richEditBrackets) {\n            for (const bracket of this._richEditBrackets.brackets) {\n                for (const close of bracket.close) {\n                    const lastChar = close.charAt(close.length - 1);\n                    result.push(lastChar);\n                }\n            }\n        }\n        return distinct(result);\n    }\n    onElectricCharacter(character, context, column) {\n        if (!this._richEditBrackets || this._richEditBrackets.brackets.length === 0) {\n            return null;\n        }\n        const tokenIndex = context.findTokenIndexAtOffset(column - 1);\n        if (ignoreBracketsInToken(context.getStandardTokenType(tokenIndex))) {\n            return null;\n        }\n        const reversedBracketRegex = this._richEditBrackets.reversedRegex;\n        const text = context.getLineContent().substring(0, column - 1) + character;\n        const r = BracketsUtils.findPrevBracketInRange(reversedBracketRegex, 1, text, 0, text.length);\n        if (!r) {\n            return null;\n        }\n        const bracketText = text.substring(r.startColumn - 1, r.endColumn - 1).toLowerCase();\n        const isOpen = this._richEditBrackets.textIsOpenBracket[bracketText];\n        if (isOpen) {\n            return null;\n        }\n        const textBeforeBracket = context.getActualLineContentBefore(r.startColumn - 1);\n        if (!/^\\s*$/.test(textBeforeBracket)) {\n            // There is other text on the line before the bracket\n            return null;\n        }\n        return {\n            matchOpenBracket: bracketText\n        };\n    }\n}\n\nexport { BracketElectricCharacterSupport };\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 *--------------------------------------------------------------------------------------------*/\nfunction resetGlobalRegex(reg) {\n    if (reg.global) {\n        reg.lastIndex = 0;\n    }\n    return true;\n}\nclass IndentRulesSupport {\n    constructor(indentationRules) {\n        this._indentationRules = indentationRules;\n    }\n    shouldIncrease(text) {\n        if (this._indentationRules) {\n            if (this._indentationRules.increaseIndentPattern && resetGlobalRegex(this._indentationRules.increaseIndentPattern) && this._indentationRules.increaseIndentPattern.test(text)) {\n                return true;\n            }\n            // if (this._indentationRules.indentNextLinePattern && this._indentationRules.indentNextLinePattern.test(text)) {\n            // \treturn true;\n            // }\n        }\n        return false;\n    }\n    shouldDecrease(text) {\n        if (this._indentationRules && this._indentationRules.decreaseIndentPattern && resetGlobalRegex(this._indentationRules.decreaseIndentPattern) && this._indentationRules.decreaseIndentPattern.test(text)) {\n            return true;\n        }\n        return false;\n    }\n    shouldIndentNextLine(text) {\n        if (this._indentationRules && this._indentationRules.indentNextLinePattern && resetGlobalRegex(this._indentationRules.indentNextLinePattern) && this._indentationRules.indentNextLinePattern.test(text)) {\n            return true;\n        }\n        return false;\n    }\n    shouldIgnore(text) {\n        // the text matches `unIndentedLinePattern`\n        if (this._indentationRules && this._indentationRules.unIndentedLinePattern && resetGlobalRegex(this._indentationRules.unIndentedLinePattern) && this._indentationRules.unIndentedLinePattern.test(text)) {\n            return true;\n        }\n        return false;\n    }\n    getIndentMetadata(text) {\n        let ret = 0;\n        if (this.shouldIncrease(text)) {\n            ret += 1 /* IndentConsts.INCREASE_MASK */;\n        }\n        if (this.shouldDecrease(text)) {\n            ret += 2 /* IndentConsts.DECREASE_MASK */;\n        }\n        if (this.shouldIndentNextLine(text)) {\n            ret += 4 /* IndentConsts.INDENT_NEXTLINE_MASK */;\n        }\n        if (this.shouldIgnore(text)) {\n            ret += 8 /* IndentConsts.UNINDENT_MASK */;\n        }\n        return ret;\n    }\n}\n\nexport { IndentRulesSupport };\n","import { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { escapeRegExpCharacters } from '../../../../base/common/strings.js';\nimport { IndentAction } from '../languageConfiguration.js';\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 *--------------------------------------------------------------------------------------------*/\nclass OnEnterSupport {\n    constructor(opts) {\n        opts = opts || {};\n        opts.brackets = opts.brackets || [\n            ['(', ')'],\n            ['{', '}'],\n            ['[', ']']\n        ];\n        this._brackets = [];\n        opts.brackets.forEach((bracket) => {\n            const openRegExp = OnEnterSupport._createOpenBracketRegExp(bracket[0]);\n            const closeRegExp = OnEnterSupport._createCloseBracketRegExp(bracket[1]);\n            if (openRegExp && closeRegExp) {\n                this._brackets.push({\n                    open: bracket[0],\n                    openRegExp: openRegExp,\n                    close: bracket[1],\n                    closeRegExp: closeRegExp,\n                });\n            }\n        });\n        this._regExpRules = opts.onEnterRules || [];\n    }\n    onEnter(autoIndent, previousLineText, beforeEnterText, afterEnterText) {\n        // (1): `regExpRules`\n        if (autoIndent >= 3 /* EditorAutoIndentStrategy.Advanced */) {\n            for (let i = 0, len = this._regExpRules.length; i < len; i++) {\n                const rule = this._regExpRules[i];\n                const regResult = [{\n                        reg: rule.beforeText,\n                        text: beforeEnterText\n                    }, {\n                        reg: rule.afterText,\n                        text: afterEnterText\n                    }, {\n                        reg: rule.previousLineText,\n                        text: previousLineText\n                    }].every((obj) => {\n                    if (!obj.reg) {\n                        return true;\n                    }\n                    obj.reg.lastIndex = 0; // To disable the effect of the \"g\" flag.\n                    return obj.reg.test(obj.text);\n                });\n                if (regResult) {\n                    return rule.action;\n                }\n            }\n        }\n        // (2): Special indent-outdent\n        if (autoIndent >= 2 /* EditorAutoIndentStrategy.Brackets */) {\n            if (beforeEnterText.length > 0 && afterEnterText.length > 0) {\n                for (let i = 0, len = this._brackets.length; i < len; i++) {\n                    const bracket = this._brackets[i];\n                    if (bracket.openRegExp.test(beforeEnterText) && bracket.closeRegExp.test(afterEnterText)) {\n                        return { indentAction: IndentAction.IndentOutdent };\n                    }\n                }\n            }\n        }\n        // (4): Open bracket based logic\n        if (autoIndent >= 2 /* EditorAutoIndentStrategy.Brackets */) {\n            if (beforeEnterText.length > 0) {\n                for (let i = 0, len = this._brackets.length; i < len; i++) {\n                    const bracket = this._brackets[i];\n                    if (bracket.openRegExp.test(beforeEnterText)) {\n                        return { indentAction: IndentAction.Indent };\n                    }\n                }\n            }\n        }\n        return null;\n    }\n    static _createOpenBracketRegExp(bracket) {\n        let str = escapeRegExpCharacters(bracket);\n        if (!/\\B/.test(str.charAt(0))) {\n            str = '\\\\b' + str;\n        }\n        str += '\\\\s*$';\n        return OnEnterSupport._safeRegExp(str);\n    }\n    static _createCloseBracketRegExp(bracket) {\n        let str = escapeRegExpCharacters(bracket);\n        if (!/\\B/.test(str.charAt(str.length - 1))) {\n            str = str + '\\\\b';\n        }\n        str = '^\\\\s*' + str;\n        return OnEnterSupport._safeRegExp(str);\n    }\n    static _safeRegExp(def) {\n        try {\n            return new RegExp(def);\n        }\n        catch (err) {\n            onUnexpectedError(err);\n            return null;\n        }\n    }\n}\n\nexport { OnEnterSupport };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\n\nconst IConfigurationService = createDecorator('configurationService');\nfunction toValuesTree(properties, conflictReporter) {\n    const root = Object.create(null);\n    for (const key in properties) {\n        addToValueTree(root, key, properties[key], conflictReporter);\n    }\n    return root;\n}\nfunction addToValueTree(settingsTreeRoot, key, value, conflictReporter) {\n    const segments = key.split('.');\n    const last = segments.pop();\n    let curr = settingsTreeRoot;\n    for (let i = 0; i < segments.length; i++) {\n        const s = segments[i];\n        let obj = curr[s];\n        switch (typeof obj) {\n            case 'undefined':\n                obj = curr[s] = Object.create(null);\n                break;\n            case 'object':\n                if (obj === null) {\n                    conflictReporter(`Ignoring ${key} as ${segments.slice(0, i + 1).join('.')} is null`);\n                    return;\n                }\n                break;\n            default:\n                conflictReporter(`Ignoring ${key} as ${segments.slice(0, i + 1).join('.')} is ${JSON.stringify(obj)}`);\n                return;\n        }\n        curr = obj;\n    }\n    if (typeof curr === 'object' && curr !== null) {\n        try {\n            curr[last] = value; // workaround https://github.com/microsoft/vscode/issues/13606\n        }\n        catch (e) {\n            conflictReporter(`Ignoring ${key} as ${segments.join('.')} is ${JSON.stringify(curr)}`);\n        }\n    }\n    else {\n        conflictReporter(`Ignoring ${key} as ${segments.join('.')} is ${JSON.stringify(curr)}`);\n    }\n}\nfunction removeFromValueTree(valueTree, key) {\n    const segments = key.split('.');\n    doRemoveFromValueTree(valueTree, segments);\n}\nfunction doRemoveFromValueTree(valueTree, segments) {\n    if (!valueTree) {\n        return;\n    }\n    const first = segments.shift();\n    if (segments.length === 0) {\n        // Reached last segment\n        delete valueTree[first];\n        return;\n    }\n    if (Object.keys(valueTree).indexOf(first) !== -1) {\n        const value = valueTree[first];\n        if (typeof value === 'object' && !Array.isArray(value)) {\n            doRemoveFromValueTree(value, segments);\n            if (Object.keys(value).length === 0) {\n                delete valueTree[first];\n            }\n        }\n    }\n}\nfunction getConfigurationValue(config, settingPath, defaultValue) {\n    function accessSetting(config, path) {\n        let current = config;\n        for (const component of path) {\n            if (typeof current !== 'object' || current === null) {\n                return undefined;\n            }\n            current = current[component];\n        }\n        return current;\n    }\n    const path = settingPath.split('.');\n    const result = accessSetting(config, path);\n    return typeof result === 'undefined' ? defaultValue : result;\n}\nfunction getLanguageTagSettingPlainKey(settingKey) {\n    return settingKey\n        .replace(/^\\[/, '')\n        .replace(/]$/g, '')\n        .replace(/\\]\\[/g, ', ');\n}\n\nexport { IConfigurationService, addToValueTree, getConfigurationValue, getLanguageTagSettingPlainKey, removeFromValueTree, toValuesTree };\n","import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst ILanguageService = createDecorator('languageService');\n\nexport { ILanguageService };\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 *--------------------------------------------------------------------------------------------*/\nclass SyncDescriptor {\n    constructor(ctor, staticArguments = [], supportsDelayedInstantiation = false) {\n        this.ctor = ctor;\n        this.staticArguments = staticArguments;\n        this.supportsDelayedInstantiation = supportsDelayedInstantiation;\n    }\n}\n\nexport { SyncDescriptor };\n","import { SyncDescriptor } from './descriptors.js';\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 *--------------------------------------------------------------------------------------------*/\nconst _registry = [];\nfunction registerSingleton(id, ctorOrDescriptor, supportsDelayedInstantiation) {\n    if (!(ctorOrDescriptor instanceof SyncDescriptor)) {\n        ctorOrDescriptor = new SyncDescriptor(ctorOrDescriptor, [], Boolean(supportsDelayedInstantiation));\n    }\n    _registry.push([id, ctorOrDescriptor]);\n}\nfunction getSingletonServiceDescriptors() {\n    return _registry;\n}\n\nexport { getSingletonServiceDescriptors, registerSingleton };\n","const Mimes = Object.freeze({\n    text: 'text/plain',\n    binary: 'application/octet-stream',\n    unknown: 'application/unknown',\n    markdown: 'text/markdown',\n    latex: 'text/latex',\n    uriList: 'text/uri-list',\n    html: 'text/html',\n});\n\nexport { Mimes };\n","import { Emitter } from '../../../base/common/event.js';\nimport { Disposable, toDisposable } from '../../../base/common/lifecycle.js';\nimport { Registry } from '../../registry/common/platform.js';\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 *--------------------------------------------------------------------------------------------*/\nconst Extensions = {\n    JSONContribution: 'base.contributions.json'\n};\nfunction normalizeId(id) {\n    if (id.length > 0 && id.charAt(id.length - 1) === '#') {\n        return id.substring(0, id.length - 1);\n    }\n    return id;\n}\nclass JSONContributionRegistry extends Disposable {\n    constructor() {\n        super(...arguments);\n        this.schemasById = {};\n        this._onDidChangeSchema = this._register(new Emitter());\n    }\n    registerSchema(uri, unresolvedSchemaContent, store) {\n        const normalizedUri = normalizeId(uri);\n        this.schemasById[normalizedUri] = unresolvedSchemaContent;\n        this._onDidChangeSchema.fire(uri);\n        if (store) {\n            store.add(toDisposable(() => {\n                delete this.schemasById[normalizedUri];\n                this._onDidChangeSchema.fire(uri);\n            }));\n        }\n    }\n    notifySchemaChanged(uri) {\n        this._onDidChangeSchema.fire(uri);\n    }\n}\nconst jsonContributionRegistry = new JSONContributionRegistry();\nRegistry.add(Extensions.JSONContribution, jsonContributionRegistry);\n\nexport { Extensions };\n","import { env } from '../../../base/common/process.js';\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/**\n * @deprecated It is preferred that you use `IProductService` if you can. This\n * allows web embedders to override our defaults. But for things like `product.quality`,\n * the use is fine because that property is not overridable.\n */\nlet product;\n// Native sandbox environment\nconst vscodeGlobal = globalThis.vscode;\nif (typeof vscodeGlobal !== 'undefined' && typeof vscodeGlobal.context !== 'undefined') {\n    const configuration = vscodeGlobal.context.configuration();\n    if (configuration) {\n        product = configuration.product;\n    }\n    else {\n        throw new Error('Sandbox: unable to resolve product configuration from preload script.');\n    }\n}\n// _VSCODE environment\nelse if (globalThis._VSCODE_PRODUCT_JSON && globalThis._VSCODE_PACKAGE_JSON) {\n    // Obtain values from product.json and package.json-data\n    product = globalThis._VSCODE_PRODUCT_JSON;\n    // Running out of sources\n    if (env['VSCODE_DEV']) {\n        Object.assign(product, {\n            nameShort: `${product.nameShort} Dev`,\n            nameLong: `${product.nameLong} Dev`,\n            dataFolderName: `${product.dataFolderName}-dev`,\n            serverDataFolderName: product.serverDataFolderName ? `${product.serverDataFolderName}-dev` : undefined\n        });\n    }\n    // Version is added during built time, but we still\n    // want to have it running out of sources so we\n    // read it from package.json only when we need it.\n    if (!product.version) {\n        const pkg = globalThis._VSCODE_PACKAGE_JSON;\n        Object.assign(product, {\n            version: pkg.version\n        });\n    }\n}\n// Web environment or unknown\nelse {\n    // Built time configuration (do NOT modify)\n    // eslint-disable-next-line local/code-no-dangerous-type-assertions\n    product = { /*BUILD->INSERT_PRODUCT_CONFIGURATION*/};\n    // Running out of sources\n    if (Object.keys(product).length === 0) {\n        Object.assign(product, {\n            version: '1.104.0-dev',\n            nameShort: 'Code - OSS Dev',\n            nameLong: 'Code - OSS Dev',\n            applicationName: 'code-oss',\n            dataFolderName: '.vscode-oss',\n            urlProtocol: 'code-oss',\n            reportIssueUrl: 'https://github.com/microsoft/vscode/issues/new',\n            licenseName: 'MIT',\n            licenseUrl: 'https://github.com/microsoft/vscode/blob/main/LICENSE.txt',\n            serverLicenseUrl: 'https://github.com/microsoft/vscode/blob/main/LICENSE.txt'\n        });\n    }\n}\nvar product$1 = product;\n\nexport { product$1 as default };\n","import { distinct } from '../../../base/common/arrays.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { isObject, isUndefined, isUndefinedOrNull } from '../../../base/common/types.js';\nimport { localize } from '../../../nls.js';\nimport { getLanguageTagSettingPlainKey } from './configuration.js';\nimport { Extensions as Extensions$1 } from '../../jsonschemas/common/jsonContributionRegistry.js';\nimport { Registry } from '../../registry/common/platform.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport product from '../../product/common/product.js';\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 *--------------------------------------------------------------------------------------------*/\nconst Extensions = {\n    Configuration: 'base.contributions.configuration'\n};\nconst resourceLanguageSettingsSchemaId = 'vscode://schemas/settings/resourceLanguage';\nconst contributionRegistry = Registry.as(Extensions$1.JSONContribution);\nclass ConfigurationRegistry extends Disposable {\n    constructor() {\n        super();\n        this.registeredConfigurationDefaults = [];\n        this.overrideIdentifiers = new Set();\n        this._onDidSchemaChange = this._register(new Emitter());\n        this._onDidUpdateConfiguration = this._register(new Emitter());\n        this.configurationDefaultsOverrides = new Map();\n        this.defaultLanguageConfigurationOverridesNode = {\n            id: 'defaultOverrides',\n            title: localize(1664, \"Default Language Configuration Overrides\"),\n            properties: {}\n        };\n        this.configurationContributors = [this.defaultLanguageConfigurationOverridesNode];\n        this.resourceLanguageSettingsSchema = {\n            properties: {},\n            patternProperties: {},\n            additionalProperties: true,\n            allowTrailingCommas: true,\n            allowComments: true\n        };\n        this.configurationProperties = {};\n        this.policyConfigurations = new Map();\n        this.excludedConfigurationProperties = {};\n        contributionRegistry.registerSchema(resourceLanguageSettingsSchemaId, this.resourceLanguageSettingsSchema);\n        this.registerOverridePropertyPatternKey();\n    }\n    registerConfiguration(configuration, validate = true) {\n        this.registerConfigurations([configuration], validate);\n        return configuration;\n    }\n    registerConfigurations(configurations, validate = true) {\n        const properties = new Set();\n        this.doRegisterConfigurations(configurations, validate, properties);\n        contributionRegistry.registerSchema(resourceLanguageSettingsSchemaId, this.resourceLanguageSettingsSchema);\n        this._onDidSchemaChange.fire();\n        this._onDidUpdateConfiguration.fire({ properties });\n    }\n    registerDefaultConfigurations(configurationDefaults) {\n        const properties = new Set();\n        this.doRegisterDefaultConfigurations(configurationDefaults, properties);\n        this._onDidSchemaChange.fire();\n        this._onDidUpdateConfiguration.fire({ properties, defaultsOverrides: true });\n    }\n    doRegisterDefaultConfigurations(configurationDefaults, bucket) {\n        this.registeredConfigurationDefaults.push(...configurationDefaults);\n        const overrideIdentifiers = [];\n        for (const { overrides, source } of configurationDefaults) {\n            for (const key in overrides) {\n                bucket.add(key);\n                const configurationDefaultOverridesForKey = this.configurationDefaultsOverrides.get(key)\n                    ?? this.configurationDefaultsOverrides.set(key, { configurationDefaultOverrides: [] }).get(key);\n                const value = overrides[key];\n                configurationDefaultOverridesForKey.configurationDefaultOverrides.push({ value, source });\n                // Configuration defaults for Override Identifiers\n                if (OVERRIDE_PROPERTY_REGEX.test(key)) {\n                    const newDefaultOverride = this.mergeDefaultConfigurationsForOverrideIdentifier(key, value, source, configurationDefaultOverridesForKey.configurationDefaultOverrideValue);\n                    if (!newDefaultOverride) {\n                        continue;\n                    }\n                    configurationDefaultOverridesForKey.configurationDefaultOverrideValue = newDefaultOverride;\n                    this.updateDefaultOverrideProperty(key, newDefaultOverride, source);\n                    overrideIdentifiers.push(...overrideIdentifiersFromKey(key));\n                }\n                // Configuration defaults for Configuration Properties\n                else {\n                    const newDefaultOverride = this.mergeDefaultConfigurationsForConfigurationProperty(key, value, source, configurationDefaultOverridesForKey.configurationDefaultOverrideValue);\n                    if (!newDefaultOverride) {\n                        continue;\n                    }\n                    configurationDefaultOverridesForKey.configurationDefaultOverrideValue = newDefaultOverride;\n                    const property = this.configurationProperties[key];\n                    if (property) {\n                        this.updatePropertyDefaultValue(key, property);\n                        this.updateSchema(key, property);\n                    }\n                }\n            }\n        }\n        this.doRegisterOverrideIdentifiers(overrideIdentifiers);\n    }\n    updateDefaultOverrideProperty(key, newDefaultOverride, source) {\n        const property = {\n            section: {\n                id: this.defaultLanguageConfigurationOverridesNode.id,\n                title: this.defaultLanguageConfigurationOverridesNode.title,\n                order: this.defaultLanguageConfigurationOverridesNode.order,\n                extensionInfo: this.defaultLanguageConfigurationOverridesNode.extensionInfo\n            },\n            type: 'object',\n            default: newDefaultOverride.value,\n            description: localize(1665, \"Configure settings to be overridden for {0}.\", getLanguageTagSettingPlainKey(key)),\n            $ref: resourceLanguageSettingsSchemaId,\n            defaultDefaultValue: newDefaultOverride.value,\n            source,\n            defaultValueSource: source\n        };\n        this.configurationProperties[key] = property;\n        this.defaultLanguageConfigurationOverridesNode.properties[key] = property;\n    }\n    mergeDefaultConfigurationsForOverrideIdentifier(overrideIdentifier, configurationValueObject, valueSource, existingDefaultOverride) {\n        const defaultValue = existingDefaultOverride?.value || {};\n        const source = existingDefaultOverride?.source ?? new Map();\n        // This should not happen\n        if (!(source instanceof Map)) {\n            console.error('objectConfigurationSources is not a Map');\n            return undefined;\n        }\n        for (const propertyKey of Object.keys(configurationValueObject)) {\n            const propertyDefaultValue = configurationValueObject[propertyKey];\n            const isObjectSetting = isObject(propertyDefaultValue) &&\n                (isUndefined(defaultValue[propertyKey]) || isObject(defaultValue[propertyKey]));\n            // If the default value is an object, merge the objects and store the source of each keys\n            if (isObjectSetting) {\n                defaultValue[propertyKey] = { ...(defaultValue[propertyKey] ?? {}), ...propertyDefaultValue };\n                // Track the source of each value in the object\n                if (valueSource) {\n                    for (const objectKey in propertyDefaultValue) {\n                        source.set(`${propertyKey}.${objectKey}`, valueSource);\n                    }\n                }\n            }\n            // Primitive values are overridden\n            else {\n                defaultValue[propertyKey] = propertyDefaultValue;\n                if (valueSource) {\n                    source.set(propertyKey, valueSource);\n                }\n                else {\n                    source.delete(propertyKey);\n                }\n            }\n        }\n        return { value: defaultValue, source };\n    }\n    mergeDefaultConfigurationsForConfigurationProperty(propertyKey, value, valuesSource, existingDefaultOverride) {\n        const property = this.configurationProperties[propertyKey];\n        const existingDefaultValue = existingDefaultOverride?.value ?? property?.defaultDefaultValue;\n        let source = valuesSource;\n        const isObjectSetting = isObject(value) &&\n            (property !== undefined && property.type === 'object' ||\n                property === undefined && (isUndefined(existingDefaultValue) || isObject(existingDefaultValue)));\n        // If the default value is an object, merge the objects and store the source of each keys\n        if (isObjectSetting) {\n            source = existingDefaultOverride?.source ?? new Map();\n            // This should not happen\n            if (!(source instanceof Map)) {\n                console.error('defaultValueSource is not a Map');\n                return undefined;\n            }\n            for (const objectKey in value) {\n                if (valuesSource) {\n                    source.set(`${propertyKey}.${objectKey}`, valuesSource);\n                }\n            }\n            value = { ...(isObject(existingDefaultValue) ? existingDefaultValue : {}), ...value };\n        }\n        return { value, source };\n    }\n    registerOverrideIdentifiers(overrideIdentifiers) {\n        this.doRegisterOverrideIdentifiers(overrideIdentifiers);\n        this._onDidSchemaChange.fire();\n    }\n    doRegisterOverrideIdentifiers(overrideIdentifiers) {\n        for (const overrideIdentifier of overrideIdentifiers) {\n            this.overrideIdentifiers.add(overrideIdentifier);\n        }\n        this.updateOverridePropertyPatternKey();\n    }\n    doRegisterConfigurations(configurations, validate, bucket) {\n        configurations.forEach(configuration => {\n            this.validateAndRegisterProperties(configuration, validate, configuration.extensionInfo, configuration.restrictedProperties, undefined, bucket);\n            this.configurationContributors.push(configuration);\n            this.registerJSONConfiguration(configuration);\n        });\n    }\n    validateAndRegisterProperties(configuration, validate = true, extensionInfo, restrictedProperties, scope = 4 /* ConfigurationScope.WINDOW */, bucket) {\n        scope = isUndefinedOrNull(configuration.scope) ? scope : configuration.scope;\n        const properties = configuration.properties;\n        if (properties) {\n            for (const key in properties) {\n                const property = properties[key];\n                property.section = {\n                    id: configuration.id,\n                    title: configuration.title,\n                    order: configuration.order,\n                    extensionInfo: configuration.extensionInfo\n                };\n                if (validate && validateProperty(key, property, extensionInfo?.id)) {\n                    delete properties[key];\n                    continue;\n                }\n                property.source = extensionInfo;\n                // update default value\n                property.defaultDefaultValue = properties[key].default;\n                this.updatePropertyDefaultValue(key, property);\n                // update scope\n                if (OVERRIDE_PROPERTY_REGEX.test(key)) {\n                    property.scope = undefined; // No scope for overridable properties `[${identifier}]`\n                }\n                else {\n                    property.scope = isUndefinedOrNull(property.scope) ? scope : property.scope;\n                    property.restricted = isUndefinedOrNull(property.restricted) ? !!restrictedProperties?.includes(key) : property.restricted;\n                }\n                if (property.experiment) {\n                    if (!property.tags?.some(tag => tag.toLowerCase() === 'onexp')) {\n                        property.tags = property.tags ?? [];\n                        property.tags.push('onExP');\n                    }\n                }\n                else if (property.tags?.some(tag => tag.toLowerCase() === 'onexp')) {\n                    console.error(`Invalid tag 'onExP' found for property '${key}'. Please use 'experiment' property instead.`);\n                    property.experiment = { mode: 'startup' };\n                }\n                const excluded = properties[key].hasOwnProperty('included') && !properties[key].included;\n                const policyName = properties[key].policy?.name;\n                if (excluded) {\n                    this.excludedConfigurationProperties[key] = properties[key];\n                    if (policyName) {\n                        this.policyConfigurations.set(policyName, key);\n                        bucket.add(key);\n                    }\n                    delete properties[key];\n                }\n                else {\n                    bucket.add(key);\n                    if (policyName) {\n                        this.policyConfigurations.set(policyName, key);\n                    }\n                    this.configurationProperties[key] = properties[key];\n                    if (!properties[key].deprecationMessage && properties[key].markdownDeprecationMessage) {\n                        // If not set, default deprecationMessage to the markdown source\n                        properties[key].deprecationMessage = properties[key].markdownDeprecationMessage;\n                    }\n                }\n            }\n        }\n        const subNodes = configuration.allOf;\n        if (subNodes) {\n            for (const node of subNodes) {\n                this.validateAndRegisterProperties(node, validate, extensionInfo, restrictedProperties, scope, bucket);\n            }\n        }\n    }\n    getConfigurationProperties() {\n        return this.configurationProperties;\n    }\n    getPolicyConfigurations() {\n        return this.policyConfigurations;\n    }\n    getExcludedConfigurationProperties() {\n        return this.excludedConfigurationProperties;\n    }\n    registerJSONConfiguration(configuration) {\n        const register = (configuration) => {\n            const properties = configuration.properties;\n            if (properties) {\n                for (const key in properties) {\n                    this.updateSchema(key, properties[key]);\n                }\n            }\n            const subNodes = configuration.allOf;\n            subNodes?.forEach(register);\n        };\n        register(configuration);\n    }\n    updateSchema(key, property) {\n        switch (property.scope) {\n            case 1 /* ConfigurationScope.APPLICATION */:\n                break;\n            case 2 /* ConfigurationScope.MACHINE */:\n                break;\n            case 3 /* ConfigurationScope.APPLICATION_MACHINE */:\n                break;\n            case 7 /* ConfigurationScope.MACHINE_OVERRIDABLE */:\n                break;\n            case 4 /* ConfigurationScope.WINDOW */:\n                break;\n            case 5 /* ConfigurationScope.RESOURCE */:\n                break;\n            case 6 /* ConfigurationScope.LANGUAGE_OVERRIDABLE */:\n                this.resourceLanguageSettingsSchema.properties[key] = property;\n                break;\n        }\n    }\n    updateOverridePropertyPatternKey() {\n        for (const overrideIdentifier of this.overrideIdentifiers.values()) {\n            const overrideIdentifierProperty = `[${overrideIdentifier}]`;\n            const resourceLanguagePropertiesSchema = {\n                type: 'object',\n                description: localize(1666, \"Configure editor settings to be overridden for a language.\"),\n                errorMessage: localize(1667, \"This setting does not support per-language configuration.\"),\n                $ref: resourceLanguageSettingsSchemaId,\n            };\n            this.updatePropertyDefaultValue(overrideIdentifierProperty, resourceLanguagePropertiesSchema);\n        }\n    }\n    registerOverridePropertyPatternKey() {\n        ({\n            description: localize(1668, \"Configure editor settings to be overridden for a language.\"),\n            errorMessage: localize(1669, \"This setting does not support per-language configuration.\")});\n        this._onDidSchemaChange.fire();\n    }\n    updatePropertyDefaultValue(key, property) {\n        const configurationdefaultOverride = this.configurationDefaultsOverrides.get(key)?.configurationDefaultOverrideValue;\n        let defaultValue = undefined;\n        let defaultSource = undefined;\n        if (configurationdefaultOverride\n            && (!property.disallowConfigurationDefault || !configurationdefaultOverride.source) // Prevent overriding the default value if the property is disallowed to be overridden by configuration defaults from extensions\n        ) {\n            defaultValue = configurationdefaultOverride.value;\n            defaultSource = configurationdefaultOverride.source;\n        }\n        if (isUndefined(defaultValue)) {\n            defaultValue = property.defaultDefaultValue;\n            defaultSource = undefined;\n        }\n        if (isUndefined(defaultValue)) {\n            defaultValue = getDefaultValue(property.type);\n        }\n        property.default = defaultValue;\n        property.defaultValueSource = defaultSource;\n    }\n}\nconst OVERRIDE_IDENTIFIER_PATTERN = `\\\\[([^\\\\]]+)\\\\]`;\nconst OVERRIDE_IDENTIFIER_REGEX = new RegExp(OVERRIDE_IDENTIFIER_PATTERN, 'g');\nconst OVERRIDE_PROPERTY_PATTERN = `^(${OVERRIDE_IDENTIFIER_PATTERN})+$`;\nconst OVERRIDE_PROPERTY_REGEX = new RegExp(OVERRIDE_PROPERTY_PATTERN);\nfunction overrideIdentifiersFromKey(key) {\n    const identifiers = [];\n    if (OVERRIDE_PROPERTY_REGEX.test(key)) {\n        let matches = OVERRIDE_IDENTIFIER_REGEX.exec(key);\n        while (matches?.length) {\n            const identifier = matches[1].trim();\n            if (identifier) {\n                identifiers.push(identifier);\n            }\n            matches = OVERRIDE_IDENTIFIER_REGEX.exec(key);\n        }\n    }\n    return distinct(identifiers);\n}\nfunction getDefaultValue(type) {\n    const t = Array.isArray(type) ? type[0] : type;\n    switch (t) {\n        case 'boolean':\n            return false;\n        case 'integer':\n        case 'number':\n            return 0;\n        case 'string':\n            return '';\n        case 'array':\n            return [];\n        case 'object':\n            return {};\n        default:\n            return null;\n    }\n}\nconst configurationRegistry = new ConfigurationRegistry();\nRegistry.add(Extensions.Configuration, configurationRegistry);\nfunction validateProperty(property, schema, extensionId) {\n    if (!property.trim()) {\n        return localize(1670, \"Cannot register an empty property\");\n    }\n    if (OVERRIDE_PROPERTY_REGEX.test(property)) {\n        return localize(1671, \"Cannot register '{0}'. This matches property pattern '\\\\\\\\[.*\\\\\\\\]$' for describing language specific editor settings. Use 'configurationDefaults' contribution.\", property);\n    }\n    if (configurationRegistry.getConfigurationProperties()[property] !== undefined && (!extensionId || !EXTENSION_UNIFICATION_EXTENSION_IDS.has(extensionId.toLowerCase()))) {\n        return localize(1672, \"Cannot register '{0}'. This property is already registered.\", property);\n    }\n    if (schema.policy?.name && configurationRegistry.getPolicyConfigurations().get(schema.policy?.name) !== undefined) {\n        return localize(1673, \"Cannot register '{0}'. The associated policy {1} is already registered with {2}.\", property, schema.policy?.name, configurationRegistry.getPolicyConfigurations().get(schema.policy?.name));\n    }\n    return null;\n}\n// Used for extension unification. Should be removed when complete.\nconst EXTENSION_UNIFICATION_EXTENSION_IDS = new Set(product.defaultChatAgent ? [product.defaultChatAgent.extensionId, product.defaultChatAgent.chatExtensionId].map(id => id.toLowerCase()) : []);\n\nexport { EXTENSION_UNIFICATION_EXTENSION_IDS, Extensions, OVERRIDE_PROPERTY_PATTERN, OVERRIDE_PROPERTY_REGEX, getDefaultValue, overrideIdentifiersFromKey, resourceLanguageSettingsSchemaId, validateProperty };\n","import { localize } from '../../../nls.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { Registry } from '../../../platform/registry/common/platform.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { Mimes } from '../../../base/common/mime.js';\nimport { Extensions as Extensions$1 } from '../../../platform/configuration/common/configurationRegistry.js';\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// Define extension point ids\nconst Extensions = {\n    ModesRegistry: 'editor.modesRegistry'\n};\nclass EditorModesRegistry extends Disposable {\n    constructor() {\n        super();\n        this._onDidChangeLanguages = this._register(new Emitter());\n        this.onDidChangeLanguages = this._onDidChangeLanguages.event;\n        this._languages = [];\n    }\n    registerLanguage(def) {\n        this._languages.push(def);\n        this._onDidChangeLanguages.fire(undefined);\n        return {\n            dispose: () => {\n                for (let i = 0, len = this._languages.length; i < len; i++) {\n                    if (this._languages[i] === def) {\n                        this._languages.splice(i, 1);\n                        return;\n                    }\n                }\n            }\n        };\n    }\n    getLanguages() {\n        return this._languages;\n    }\n}\nconst ModesRegistry = new EditorModesRegistry();\nRegistry.add(Extensions.ModesRegistry, ModesRegistry);\nconst PLAINTEXT_LANGUAGE_ID = 'plaintext';\nconst PLAINTEXT_EXTENSION = '.txt';\nModesRegistry.registerLanguage({\n    id: PLAINTEXT_LANGUAGE_ID,\n    extensions: [PLAINTEXT_EXTENSION],\n    aliases: [localize(784, \"Plain Text\"), 'text'],\n    mimetypes: [Mimes.text]\n});\nRegistry.as(Extensions$1.Configuration)\n    .registerDefaultConfigurations([{\n        overrides: {\n            '[plaintext]': {\n                'editor.unicodeHighlight.ambiguousCharacters': false,\n                'editor.unicodeHighlight.invisibleCharacters': false\n            },\n            // TODO: Below is a workaround for: https://github.com/microsoft/vscode/issues/240567\n            '[go]': {\n                'editor.insertSpaces': false\n            },\n            '[makefile]': {\n                'editor.insertSpaces': false,\n            },\n            '[shellscript]': {\n                'files.eol': '\\n'\n            },\n            '[yaml]': {\n                'editor.insertSpaces': true,\n                'editor.tabSize': 2\n            }\n        }\n    }]);\n\nexport { EditorModesRegistry, Extensions, ModesRegistry, PLAINTEXT_EXTENSION, PLAINTEXT_LANGUAGE_ID };\n","import { CachedFunction } from '../../../../base/common/cache.js';\nimport { createBracketOrRegExp } from './richEditBrackets.js';\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/**\n * Captures all bracket related configurations for a single language.\n * Immutable.\n*/\nclass LanguageBracketsConfiguration {\n    constructor(languageId, config) {\n        this.languageId = languageId;\n        const bracketPairs = config.brackets ? filterValidBrackets(config.brackets) : [];\n        const openingBracketInfos = new CachedFunction((bracket) => {\n            const closing = new Set();\n            return {\n                info: new OpeningBracketKind(this, bracket, closing),\n                closing,\n            };\n        });\n        const closingBracketInfos = new CachedFunction((bracket) => {\n            const opening = new Set();\n            const openingColorized = new Set();\n            return {\n                info: new ClosingBracketKind(this, bracket, opening, openingColorized),\n                opening,\n                openingColorized,\n            };\n        });\n        for (const [open, close] of bracketPairs) {\n            const opening = openingBracketInfos.get(open);\n            const closing = closingBracketInfos.get(close);\n            opening.closing.add(closing.info);\n            closing.opening.add(opening.info);\n        }\n        // Treat colorized brackets as brackets, and mark them as colorized.\n        const colorizedBracketPairs = config.colorizedBracketPairs\n            ? filterValidBrackets(config.colorizedBracketPairs)\n            // If not configured: Take all brackets except `<` ... `>`\n            // Many languages set < ... > as bracket pair, even though they also use it as comparison operator.\n            // This leads to problems when colorizing this bracket, so we exclude it if not explicitly configured otherwise.\n            // https://github.com/microsoft/vscode/issues/132476\n            : bracketPairs.filter((p) => !(p[0] === '<' && p[1] === '>'));\n        for (const [open, close] of colorizedBracketPairs) {\n            const opening = openingBracketInfos.get(open);\n            const closing = closingBracketInfos.get(close);\n            opening.closing.add(closing.info);\n            closing.openingColorized.add(opening.info);\n            closing.opening.add(opening.info);\n        }\n        this._openingBrackets = new Map([...openingBracketInfos.cachedValues].map(([k, v]) => [k, v.info]));\n        this._closingBrackets = new Map([...closingBracketInfos.cachedValues].map(([k, v]) => [k, v.info]));\n    }\n    /**\n     * No two brackets have the same bracket text.\n    */\n    get openingBrackets() {\n        return [...this._openingBrackets.values()];\n    }\n    /**\n     * No two brackets have the same bracket text.\n    */\n    get closingBrackets() {\n        return [...this._closingBrackets.values()];\n    }\n    getOpeningBracketInfo(bracketText) {\n        return this._openingBrackets.get(bracketText);\n    }\n    getClosingBracketInfo(bracketText) {\n        return this._closingBrackets.get(bracketText);\n    }\n    getBracketInfo(bracketText) {\n        return this.getOpeningBracketInfo(bracketText) || this.getClosingBracketInfo(bracketText);\n    }\n    getBracketRegExp(options) {\n        const brackets = Array.from([...this._openingBrackets.keys(), ...this._closingBrackets.keys()]);\n        return createBracketOrRegExp(brackets, options);\n    }\n}\nfunction filterValidBrackets(bracketPairs) {\n    return bracketPairs.filter(([open, close]) => open !== '' && close !== '');\n}\nclass BracketKindBase {\n    constructor(config, bracketText) {\n        this.config = config;\n        this.bracketText = bracketText;\n    }\n    get languageId() {\n        return this.config.languageId;\n    }\n}\nclass OpeningBracketKind extends BracketKindBase {\n    constructor(config, bracketText, openedBrackets) {\n        super(config, bracketText);\n        this.openedBrackets = openedBrackets;\n        this.isOpeningBracket = true;\n    }\n}\nclass ClosingBracketKind extends BracketKindBase {\n    constructor(config, bracketText, \n    /**\n     * Non empty array of all opening brackets this bracket closes.\n    */\n    openingBrackets, openingColorizedBrackets) {\n        super(config, bracketText);\n        this.openingBrackets = openingBrackets;\n        this.openingColorizedBrackets = openingColorizedBrackets;\n        this.isOpeningBracket = false;\n    }\n    /**\n     * Checks if this bracket closes the given other bracket.\n     * If the bracket infos come from different configurations, this method will return false.\n    */\n    closes(other) {\n        if (other['config'] !== this.config) {\n            return false;\n        }\n        return this.openingBrackets.has(other);\n    }\n    closesColorized(other) {\n        if (other['config'] !== this.config) {\n            return false;\n        }\n        return this.openingColorizedBrackets.has(other);\n    }\n    getOpeningBrackets() {\n        return [...this.openingBrackets];\n    }\n}\n\nexport { BracketKindBase, ClosingBracketKind, LanguageBracketsConfiguration, OpeningBracketKind };\n","import { Emitter } from '../../../base/common/event.js';\nimport { Disposable, markAsSingleton, toDisposable } from '../../../base/common/lifecycle.js';\nimport { getLeadingWhitespace } from '../../../base/common/strings.js';\nimport { DEFAULT_WORD_REGEXP, ensureValidWordDefinition } from '../core/wordHelper.js';\nimport { AutoClosingPairs } from './languageConfiguration.js';\nimport { CharacterPairSupport } from './supports/characterPair.js';\nimport { BracketElectricCharacterSupport } from './supports/electricCharacter.js';\nimport { IndentRulesSupport } from './supports/indentRules.js';\nimport { OnEnterSupport } from './supports/onEnter.js';\nimport { RichEditBrackets } from './supports/richEditBrackets.js';\nimport { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\nimport { IConfigurationService } from '../../../platform/configuration/common/configuration.js';\nimport { ILanguageService } from './language.js';\nimport { registerSingleton } from '../../../platform/instantiation/common/extensions.js';\nimport { PLAINTEXT_LANGUAGE_ID } from './modesRegistry.js';\nimport { LanguageBracketsConfiguration } from './supports/languageBracketsConfiguration.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass LanguageConfigurationServiceChangeEvent {\n    constructor(languageId) {\n        this.languageId = languageId;\n    }\n    affects(languageId) {\n        return !this.languageId ? true : this.languageId === languageId;\n    }\n}\nconst ILanguageConfigurationService = createDecorator('languageConfigurationService');\nlet LanguageConfigurationService = class LanguageConfigurationService extends Disposable {\n    constructor(configurationService, languageService) {\n        super();\n        this.configurationService = configurationService;\n        this.languageService = languageService;\n        this._registry = this._register(new LanguageConfigurationRegistry());\n        this.onDidChangeEmitter = this._register(new Emitter());\n        this.onDidChange = this.onDidChangeEmitter.event;\n        this.configurations = new Map();\n        const languageConfigKeys = new Set(Object.values(customizedLanguageConfigKeys));\n        this._register(this.configurationService.onDidChangeConfiguration((e) => {\n            const globalConfigChanged = e.change.keys.some((k) => languageConfigKeys.has(k));\n            const localConfigChanged = e.change.overrides\n                .filter(([overrideLangName, keys]) => keys.some((k) => languageConfigKeys.has(k)))\n                .map(([overrideLangName]) => overrideLangName);\n            if (globalConfigChanged) {\n                this.configurations.clear();\n                this.onDidChangeEmitter.fire(new LanguageConfigurationServiceChangeEvent(undefined));\n            }\n            else {\n                for (const languageId of localConfigChanged) {\n                    if (this.languageService.isRegisteredLanguageId(languageId)) {\n                        this.configurations.delete(languageId);\n                        this.onDidChangeEmitter.fire(new LanguageConfigurationServiceChangeEvent(languageId));\n                    }\n                }\n            }\n        }));\n        this._register(this._registry.onDidChange((e) => {\n            this.configurations.delete(e.languageId);\n            this.onDidChangeEmitter.fire(new LanguageConfigurationServiceChangeEvent(e.languageId));\n        }));\n    }\n    register(languageId, configuration, priority) {\n        return this._registry.register(languageId, configuration, priority);\n    }\n    getLanguageConfiguration(languageId) {\n        let result = this.configurations.get(languageId);\n        if (!result) {\n            result = computeConfig(languageId, this._registry, this.configurationService, this.languageService);\n            this.configurations.set(languageId, result);\n        }\n        return result;\n    }\n};\nLanguageConfigurationService = __decorate([\n    __param(0, IConfigurationService),\n    __param(1, ILanguageService)\n], LanguageConfigurationService);\nfunction computeConfig(languageId, registry, configurationService, languageService) {\n    let languageConfig = registry.getLanguageConfiguration(languageId);\n    if (!languageConfig) {\n        if (!languageService.isRegisteredLanguageId(languageId)) {\n            // this happens for the null language, which can be returned by monarch.\n            // Instead of throwing an error, we just return a default config.\n            return new ResolvedLanguageConfiguration(languageId, {});\n        }\n        languageConfig = new ResolvedLanguageConfiguration(languageId, {});\n    }\n    const customizedConfig = getCustomizedLanguageConfig(languageConfig.languageId, configurationService);\n    const data = combineLanguageConfigurations([languageConfig.underlyingConfig, customizedConfig]);\n    const config = new ResolvedLanguageConfiguration(languageConfig.languageId, data);\n    return config;\n}\nconst customizedLanguageConfigKeys = {\n    brackets: 'editor.language.brackets',\n    colorizedBracketPairs: 'editor.language.colorizedBracketPairs'\n};\nfunction getCustomizedLanguageConfig(languageId, configurationService) {\n    const brackets = configurationService.getValue(customizedLanguageConfigKeys.brackets, {\n        overrideIdentifier: languageId,\n    });\n    const colorizedBracketPairs = configurationService.getValue(customizedLanguageConfigKeys.colorizedBracketPairs, {\n        overrideIdentifier: languageId,\n    });\n    return {\n        brackets: validateBracketPairs(brackets),\n        colorizedBracketPairs: validateBracketPairs(colorizedBracketPairs),\n    };\n}\nfunction validateBracketPairs(data) {\n    if (!Array.isArray(data)) {\n        return undefined;\n    }\n    return data.map(pair => {\n        if (!Array.isArray(pair) || pair.length !== 2) {\n            return undefined;\n        }\n        return [pair[0], pair[1]];\n    }).filter((p) => !!p);\n}\nfunction getIndentationAtPosition(model, lineNumber, column) {\n    const lineText = model.getLineContent(lineNumber);\n    let indentation = getLeadingWhitespace(lineText);\n    if (indentation.length > column - 1) {\n        indentation = indentation.substring(0, column - 1);\n    }\n    return indentation;\n}\nclass ComposedLanguageConfiguration {\n    constructor(languageId) {\n        this.languageId = languageId;\n        this._resolved = null;\n        this._entries = [];\n        this._order = 0;\n        this._resolved = null;\n    }\n    register(configuration, priority) {\n        const entry = new LanguageConfigurationContribution(configuration, priority, ++this._order);\n        this._entries.push(entry);\n        this._resolved = null;\n        return markAsSingleton(toDisposable(() => {\n            for (let i = 0; i < this._entries.length; i++) {\n                if (this._entries[i] === entry) {\n                    this._entries.splice(i, 1);\n                    this._resolved = null;\n                    break;\n                }\n            }\n        }));\n    }\n    getResolvedConfiguration() {\n        if (!this._resolved) {\n            const config = this._resolve();\n            if (config) {\n                this._resolved = new ResolvedLanguageConfiguration(this.languageId, config);\n            }\n        }\n        return this._resolved;\n    }\n    _resolve() {\n        if (this._entries.length === 0) {\n            return null;\n        }\n        this._entries.sort(LanguageConfigurationContribution.cmp);\n        return combineLanguageConfigurations(this._entries.map(e => e.configuration));\n    }\n}\nfunction combineLanguageConfigurations(configs) {\n    let result = {\n        comments: undefined,\n        brackets: undefined,\n        wordPattern: undefined,\n        indentationRules: undefined,\n        onEnterRules: undefined,\n        autoClosingPairs: undefined,\n        surroundingPairs: undefined,\n        autoCloseBefore: undefined,\n        folding: undefined,\n        colorizedBracketPairs: undefined,\n        __electricCharacterSupport: undefined,\n    };\n    for (const entry of configs) {\n        result = {\n            comments: entry.comments || result.comments,\n            brackets: entry.brackets || result.brackets,\n            wordPattern: entry.wordPattern || result.wordPattern,\n            indentationRules: entry.indentationRules || result.indentationRules,\n            onEnterRules: entry.onEnterRules || result.onEnterRules,\n            autoClosingPairs: entry.autoClosingPairs || result.autoClosingPairs,\n            surroundingPairs: entry.surroundingPairs || result.surroundingPairs,\n            autoCloseBefore: entry.autoCloseBefore || result.autoCloseBefore,\n            folding: entry.folding || result.folding,\n            colorizedBracketPairs: entry.colorizedBracketPairs || result.colorizedBracketPairs,\n            __electricCharacterSupport: entry.__electricCharacterSupport || result.__electricCharacterSupport,\n        };\n    }\n    return result;\n}\nclass LanguageConfigurationContribution {\n    constructor(configuration, priority, order) {\n        this.configuration = configuration;\n        this.priority = priority;\n        this.order = order;\n    }\n    static cmp(a, b) {\n        if (a.priority === b.priority) {\n            // higher order last\n            return a.order - b.order;\n        }\n        // higher priority last\n        return a.priority - b.priority;\n    }\n}\nclass LanguageConfigurationChangeEvent {\n    constructor(languageId) {\n        this.languageId = languageId;\n    }\n}\nclass LanguageConfigurationRegistry extends Disposable {\n    constructor() {\n        super();\n        this._entries = new Map();\n        this._onDidChange = this._register(new Emitter());\n        this.onDidChange = this._onDidChange.event;\n        this._register(this.register(PLAINTEXT_LANGUAGE_ID, {\n            brackets: [\n                ['(', ')'],\n                ['[', ']'],\n                ['{', '}'],\n            ],\n            surroundingPairs: [\n                { open: '{', close: '}' },\n                { open: '[', close: ']' },\n                { open: '(', close: ')' },\n                { open: '<', close: '>' },\n                { open: '\\\"', close: '\\\"' },\n                { open: '\\'', close: '\\'' },\n                { open: '`', close: '`' },\n            ],\n            colorizedBracketPairs: [],\n            folding: {\n                offSide: true\n            }\n        }, 0));\n    }\n    /**\n     * @param priority Use a higher number for higher priority\n     */\n    register(languageId, configuration, priority = 0) {\n        let entries = this._entries.get(languageId);\n        if (!entries) {\n            entries = new ComposedLanguageConfiguration(languageId);\n            this._entries.set(languageId, entries);\n        }\n        const disposable = entries.register(configuration, priority);\n        this._onDidChange.fire(new LanguageConfigurationChangeEvent(languageId));\n        return markAsSingleton(toDisposable(() => {\n            disposable.dispose();\n            this._onDidChange.fire(new LanguageConfigurationChangeEvent(languageId));\n        }));\n    }\n    getLanguageConfiguration(languageId) {\n        const entries = this._entries.get(languageId);\n        return entries?.getResolvedConfiguration() || null;\n    }\n}\n/**\n * Immutable.\n*/\nclass ResolvedLanguageConfiguration {\n    constructor(languageId, underlyingConfig) {\n        this.languageId = languageId;\n        this.underlyingConfig = underlyingConfig;\n        this._brackets = null;\n        this._electricCharacter = null;\n        this._onEnterSupport =\n            this.underlyingConfig.brackets ||\n                this.underlyingConfig.indentationRules ||\n                this.underlyingConfig.onEnterRules\n                ? new OnEnterSupport(this.underlyingConfig)\n                : null;\n        this.comments = ResolvedLanguageConfiguration._handleComments(this.underlyingConfig);\n        this.characterPair = new CharacterPairSupport(this.underlyingConfig);\n        this.wordDefinition = this.underlyingConfig.wordPattern || DEFAULT_WORD_REGEXP;\n        this.indentationRules = this.underlyingConfig.indentationRules;\n        if (this.underlyingConfig.indentationRules) {\n            this.indentRulesSupport = new IndentRulesSupport(this.underlyingConfig.indentationRules);\n        }\n        else {\n            this.indentRulesSupport = null;\n        }\n        this.foldingRules = this.underlyingConfig.folding || {};\n        this.bracketsNew = new LanguageBracketsConfiguration(languageId, this.underlyingConfig);\n    }\n    getWordDefinition() {\n        return ensureValidWordDefinition(this.wordDefinition);\n    }\n    get brackets() {\n        if (!this._brackets && this.underlyingConfig.brackets) {\n            this._brackets = new RichEditBrackets(this.languageId, this.underlyingConfig.brackets);\n        }\n        return this._brackets;\n    }\n    get electricCharacter() {\n        if (!this._electricCharacter) {\n            this._electricCharacter = new BracketElectricCharacterSupport(this.brackets);\n        }\n        return this._electricCharacter;\n    }\n    onEnter(autoIndent, previousLineText, beforeEnterText, afterEnterText) {\n        if (!this._onEnterSupport) {\n            return null;\n        }\n        return this._onEnterSupport.onEnter(autoIndent, previousLineText, beforeEnterText, afterEnterText);\n    }\n    getAutoClosingPairs() {\n        return new AutoClosingPairs(this.characterPair.getAutoClosingPairs());\n    }\n    getAutoCloseBeforeSet(forQuotes) {\n        return this.characterPair.getAutoCloseBeforeSet(forQuotes);\n    }\n    getSurroundingPairs() {\n        return this.characterPair.getSurroundingPairs();\n    }\n    static _handleComments(conf) {\n        const commentRule = conf.comments;\n        if (!commentRule) {\n            return null;\n        }\n        // comment configuration\n        const comments = {};\n        if (commentRule.lineComment) {\n            if (typeof commentRule.lineComment === 'string') {\n                comments.lineCommentToken = commentRule.lineComment;\n            }\n            else {\n                comments.lineCommentToken = commentRule.lineComment.comment;\n                comments.lineCommentNoIndent = commentRule.lineComment.noIndent;\n            }\n        }\n        if (commentRule.blockComment) {\n            const [blockStart, blockEnd] = commentRule.blockComment;\n            comments.blockCommentStartToken = blockStart;\n            comments.blockCommentEndToken = blockEnd;\n        }\n        return comments;\n    }\n}\nregisterSingleton(ILanguageConfigurationService, LanguageConfigurationService, 1 /* InstantiationType.Delayed */);\n\nexport { ILanguageConfigurationService, LanguageConfigurationChangeEvent, LanguageConfigurationRegistry, LanguageConfigurationService, LanguageConfigurationServiceChangeEvent, ResolvedLanguageConfiguration, getIndentationAtPosition };\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/**\n */\nclass TokenMetadata {\n    static getLanguageId(metadata) {\n        return (metadata & 255 /* MetadataConsts.LANGUAGEID_MASK */) >>> 0 /* MetadataConsts.LANGUAGEID_OFFSET */;\n    }\n    static getTokenType(metadata) {\n        return (metadata & 768 /* MetadataConsts.TOKEN_TYPE_MASK */) >>> 8 /* MetadataConsts.TOKEN_TYPE_OFFSET */;\n    }\n    static containsBalancedBrackets(metadata) {\n        return (metadata & 1024 /* MetadataConsts.BALANCED_BRACKETS_MASK */) !== 0;\n    }\n    static getFontStyle(metadata) {\n        return (metadata & 30720 /* MetadataConsts.FONT_STYLE_MASK */) >>> 11 /* MetadataConsts.FONT_STYLE_OFFSET */;\n    }\n    static getForeground(metadata) {\n        return (metadata & 16744448 /* MetadataConsts.FOREGROUND_MASK */) >>> 15 /* MetadataConsts.FOREGROUND_OFFSET */;\n    }\n    static getBackground(metadata) {\n        return (metadata & 4278190080 /* MetadataConsts.BACKGROUND_MASK */) >>> 24 /* MetadataConsts.BACKGROUND_OFFSET */;\n    }\n    static getClassNameFromMetadata(metadata) {\n        const foreground = this.getForeground(metadata);\n        let className = 'mtk' + foreground;\n        const fontStyle = this.getFontStyle(metadata);\n        if (fontStyle & 1 /* FontStyle.Italic */) {\n            className += ' mtki';\n        }\n        if (fontStyle & 2 /* FontStyle.Bold */) {\n            className += ' mtkb';\n        }\n        if (fontStyle & 4 /* FontStyle.Underline */) {\n            className += ' mtku';\n        }\n        if (fontStyle & 8 /* FontStyle.Strikethrough */) {\n            className += ' mtks';\n        }\n        return className;\n    }\n    static getInlineStyleFromMetadata(metadata, colorMap) {\n        const foreground = this.getForeground(metadata);\n        const fontStyle = this.getFontStyle(metadata);\n        let result = `color: ${colorMap[foreground]};`;\n        if (fontStyle & 1 /* FontStyle.Italic */) {\n            result += 'font-style: italic;';\n        }\n        if (fontStyle & 2 /* FontStyle.Bold */) {\n            result += 'font-weight: bold;';\n        }\n        let textDecoration = '';\n        if (fontStyle & 4 /* FontStyle.Underline */) {\n            textDecoration += ' underline';\n        }\n        if (fontStyle & 8 /* FontStyle.Strikethrough */) {\n            textDecoration += ' line-through';\n        }\n        if (textDecoration) {\n            result += `text-decoration:${textDecoration};`;\n        }\n        return result;\n    }\n    static getPresentationFromMetadata(metadata) {\n        const foreground = this.getForeground(metadata);\n        const fontStyle = this.getFontStyle(metadata);\n        return {\n            foreground: foreground,\n            italic: Boolean(fontStyle & 1 /* FontStyle.Italic */),\n            bold: Boolean(fontStyle & 2 /* FontStyle.Bold */),\n            underline: Boolean(fontStyle & 4 /* FontStyle.Underline */),\n            strikethrough: Boolean(fontStyle & 8 /* FontStyle.Strikethrough */),\n        };\n    }\n}\n\nexport { TokenMetadata };\n","import { BugIndicatingError } from '../../../../base/common/errors.js';\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/**\n * A range of offsets (0-based).\n*/\nclass OffsetRange {\n    static fromTo(start, endExclusive) {\n        return new OffsetRange(start, endExclusive);\n    }\n    static addRange(range, sortedRanges) {\n        let i = 0;\n        while (i < sortedRanges.length && sortedRanges[i].endExclusive < range.start) {\n            i++;\n        }\n        let j = i;\n        while (j < sortedRanges.length && sortedRanges[j].start <= range.endExclusive) {\n            j++;\n        }\n        if (i === j) {\n            sortedRanges.splice(i, 0, range);\n        }\n        else {\n            const start = Math.min(range.start, sortedRanges[i].start);\n            const end = Math.max(range.endExclusive, sortedRanges[j - 1].endExclusive);\n            sortedRanges.splice(i, j - i, new OffsetRange(start, end));\n        }\n    }\n    static tryCreate(start, endExclusive) {\n        if (start > endExclusive) {\n            return undefined;\n        }\n        return new OffsetRange(start, endExclusive);\n    }\n    static ofLength(length) {\n        return new OffsetRange(0, length);\n    }\n    static ofStartAndLength(start, length) {\n        return new OffsetRange(start, start + length);\n    }\n    static emptyAt(offset) {\n        return new OffsetRange(offset, offset);\n    }\n    constructor(start, endExclusive) {\n        this.start = start;\n        this.endExclusive = endExclusive;\n        if (start > endExclusive) {\n            throw new BugIndicatingError(`Invalid range: ${this.toString()}`);\n        }\n    }\n    get isEmpty() {\n        return this.start === this.endExclusive;\n    }\n    delta(offset) {\n        return new OffsetRange(this.start + offset, this.endExclusive + offset);\n    }\n    deltaStart(offset) {\n        return new OffsetRange(this.start + offset, this.endExclusive);\n    }\n    deltaEnd(offset) {\n        return new OffsetRange(this.start, this.endExclusive + offset);\n    }\n    get length() {\n        return this.endExclusive - this.start;\n    }\n    toString() {\n        return `[${this.start}, ${this.endExclusive})`;\n    }\n    equals(other) {\n        return this.start === other.start && this.endExclusive === other.endExclusive;\n    }\n    contains(offset) {\n        return this.start <= offset && offset < this.endExclusive;\n    }\n    /**\n     * for all numbers n: range1.contains(n) or range2.contains(n) => range1.join(range2).contains(n)\n     * The joined range is the smallest range that contains both ranges.\n     */\n    join(other) {\n        return new OffsetRange(Math.min(this.start, other.start), Math.max(this.endExclusive, other.endExclusive));\n    }\n    /**\n     * for all numbers n: range1.contains(n) and range2.contains(n) <=> range1.intersect(range2).contains(n)\n     *\n     * The resulting range is empty if the ranges do not intersect, but touch.\n     * If the ranges don't even touch, the result is undefined.\n     */\n    intersect(other) {\n        const start = Math.max(this.start, other.start);\n        const end = Math.min(this.endExclusive, other.endExclusive);\n        if (start <= end) {\n            return new OffsetRange(start, end);\n        }\n        return undefined;\n    }\n    intersectionLength(range) {\n        const start = Math.max(this.start, range.start);\n        const end = Math.min(this.endExclusive, range.endExclusive);\n        return Math.max(0, end - start);\n    }\n    intersects(other) {\n        const start = Math.max(this.start, other.start);\n        const end = Math.min(this.endExclusive, other.endExclusive);\n        return start < end;\n    }\n    intersectsOrTouches(other) {\n        const start = Math.max(this.start, other.start);\n        const end = Math.min(this.endExclusive, other.endExclusive);\n        return start <= end;\n    }\n    isBefore(other) {\n        return this.endExclusive <= other.start;\n    }\n    isAfter(other) {\n        return this.start >= other.endExclusive;\n    }\n    slice(arr) {\n        return arr.slice(this.start, this.endExclusive);\n    }\n    substring(str) {\n        return str.substring(this.start, this.endExclusive);\n    }\n    /**\n     * Returns the given value if it is contained in this instance, otherwise the closest value that is contained.\n     * The range must not be empty.\n     */\n    clip(value) {\n        if (this.isEmpty) {\n            throw new BugIndicatingError(`Invalid clipping range: ${this.toString()}`);\n        }\n        return Math.max(this.start, Math.min(this.endExclusive - 1, value));\n    }\n    /**\n     * Returns `r := value + k * length` such that `r` is contained in this range.\n     * The range must not be empty.\n     *\n     * E.g. `[5, 10).clipCyclic(10) === 5`, `[5, 10).clipCyclic(11) === 6` and `[5, 10).clipCyclic(4) === 9`.\n     */\n    clipCyclic(value) {\n        if (this.isEmpty) {\n            throw new BugIndicatingError(`Invalid clipping range: ${this.toString()}`);\n        }\n        if (value < this.start) {\n            return this.endExclusive - ((this.start - value) % this.length);\n        }\n        if (value >= this.endExclusive) {\n            return this.start + ((value - this.start) % this.length);\n        }\n        return value;\n    }\n    forEach(f) {\n        for (let i = this.start; i < this.endExclusive; i++) {\n            f(i);\n        }\n    }\n    /**\n     * this: [ 5, 10), range: [10, 15) => [5, 15)]\n     * Throws if the ranges are not touching.\n    */\n    joinRightTouching(range) {\n        if (this.endExclusive !== range.start) {\n            throw new BugIndicatingError(`Invalid join: ${this.toString()} and ${range.toString()}`);\n        }\n        return new OffsetRange(this.start, range.endExclusive);\n    }\n}\nclass OffsetRangeSet {\n    constructor() {\n        this._sortedRanges = [];\n    }\n    addRange(range) {\n        let i = 0;\n        while (i < this._sortedRanges.length && this._sortedRanges[i].endExclusive < range.start) {\n            i++;\n        }\n        let j = i;\n        while (j < this._sortedRanges.length && this._sortedRanges[j].start <= range.endExclusive) {\n            j++;\n        }\n        if (i === j) {\n            this._sortedRanges.splice(i, 0, range);\n        }\n        else {\n            const start = Math.min(range.start, this._sortedRanges[i].start);\n            const end = Math.max(range.endExclusive, this._sortedRanges[j - 1].endExclusive);\n            this._sortedRanges.splice(i, j - i, new OffsetRange(start, end));\n        }\n    }\n    toString() {\n        return this._sortedRanges.map(r => r.toString()).join(', ');\n    }\n    /**\n     * Returns of there is a value that is contained in this instance and the given range.\n     */\n    intersectsStrict(other) {\n        // TODO use binary search\n        let i = 0;\n        while (i < this._sortedRanges.length && this._sortedRanges[i].endExclusive <= other.start) {\n            i++;\n        }\n        return i < this._sortedRanges.length && this._sortedRanges[i].start < other.endExclusive;\n    }\n    intersectWithRange(other) {\n        // TODO use binary search + slice\n        const result = new OffsetRangeSet();\n        for (const range of this._sortedRanges) {\n            const intersection = range.intersect(other);\n            if (intersection) {\n                result.addRange(intersection);\n            }\n        }\n        return result;\n    }\n    intersectWithRangeLength(other) {\n        return this.intersectWithRange(other).length;\n    }\n    get length() {\n        return this._sortedRanges.reduce((prev, cur) => prev + cur.length, 0);\n    }\n}\n\nexport { OffsetRange, OffsetRangeSet };\n","import { TokenMetadata } from '../encodedTokenAttributes.js';\nimport { OffsetRange } from '../core/ranges/offsetRange.js';\nimport { onUnexpectedError } from '../../../base/common/errors.js';\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 *--------------------------------------------------------------------------------------------*/\nclass LineTokens {\n    static createEmpty(lineContent, decoder) {\n        const defaultMetadata = LineTokens.defaultTokenMetadata;\n        const tokens = new Uint32Array(2);\n        tokens[0] = lineContent.length;\n        tokens[1] = defaultMetadata;\n        return new LineTokens(tokens, lineContent, decoder);\n    }\n    static createFromTextAndMetadata(data, decoder) {\n        let offset = 0;\n        let fullText = '';\n        const tokens = new Array();\n        for (const { text, metadata } of data) {\n            tokens.push(offset + text.length, metadata);\n            offset += text.length;\n            fullText += text;\n        }\n        return new LineTokens(new Uint32Array(tokens), fullText, decoder);\n    }\n    static convertToEndOffset(tokens, lineTextLength) {\n        const tokenCount = (tokens.length >>> 1);\n        const lastTokenIndex = tokenCount - 1;\n        for (let tokenIndex = 0; tokenIndex < lastTokenIndex; tokenIndex++) {\n            tokens[tokenIndex << 1] = tokens[(tokenIndex + 1) << 1];\n        }\n        tokens[lastTokenIndex << 1] = lineTextLength;\n    }\n    static findIndexInTokensArray(tokens, desiredIndex) {\n        if (tokens.length <= 2) {\n            return 0;\n        }\n        let low = 0;\n        let high = (tokens.length >>> 1) - 1;\n        while (low < high) {\n            const mid = low + Math.floor((high - low) / 2);\n            const endOffset = tokens[(mid << 1)];\n            if (endOffset === desiredIndex) {\n                return mid + 1;\n            }\n            else if (endOffset < desiredIndex) {\n                low = mid + 1;\n            }\n            else if (endOffset > desiredIndex) {\n                high = mid;\n            }\n        }\n        return low;\n    }\n    static { this.defaultTokenMetadata = ((0 /* FontStyle.None */ << 11 /* MetadataConsts.FONT_STYLE_OFFSET */)\n        | (1 /* ColorId.DefaultForeground */ << 15 /* MetadataConsts.FOREGROUND_OFFSET */)\n        | (2 /* ColorId.DefaultBackground */ << 24 /* MetadataConsts.BACKGROUND_OFFSET */)) >>> 0; }\n    constructor(tokens, text, decoder) {\n        this._lineTokensBrand = undefined;\n        const tokensLength = tokens.length > 1 ? tokens[tokens.length - 2] : 0;\n        if (tokensLength !== text.length) {\n            onUnexpectedError(new Error('Token length and text length do not match!'));\n        }\n        this._tokens = tokens;\n        this._tokensCount = (this._tokens.length >>> 1);\n        this._text = text;\n        this.languageIdCodec = decoder;\n    }\n    getTextLength() {\n        return this._text.length;\n    }\n    equals(other) {\n        if (other instanceof LineTokens) {\n            return this.slicedEquals(other, 0, this._tokensCount);\n        }\n        return false;\n    }\n    slicedEquals(other, sliceFromTokenIndex, sliceTokenCount) {\n        if (this._text !== other._text) {\n            return false;\n        }\n        if (this._tokensCount !== other._tokensCount) {\n            return false;\n        }\n        const from = (sliceFromTokenIndex << 1);\n        const to = from + (sliceTokenCount << 1);\n        for (let i = from; i < to; i++) {\n            if (this._tokens[i] !== other._tokens[i]) {\n                return false;\n            }\n        }\n        return true;\n    }\n    getLineContent() {\n        return this._text;\n    }\n    getCount() {\n        return this._tokensCount;\n    }\n    getStartOffset(tokenIndex) {\n        if (tokenIndex > 0) {\n            return this._tokens[(tokenIndex - 1) << 1];\n        }\n        return 0;\n    }\n    getMetadata(tokenIndex) {\n        const metadata = this._tokens[(tokenIndex << 1) + 1];\n        return metadata;\n    }\n    getLanguageId(tokenIndex) {\n        const metadata = this._tokens[(tokenIndex << 1) + 1];\n        const languageId = TokenMetadata.getLanguageId(metadata);\n        return this.languageIdCodec.decodeLanguageId(languageId);\n    }\n    getStandardTokenType(tokenIndex) {\n        const metadata = this._tokens[(tokenIndex << 1) + 1];\n        return TokenMetadata.getTokenType(metadata);\n    }\n    getForeground(tokenIndex) {\n        const metadata = this._tokens[(tokenIndex << 1) + 1];\n        return TokenMetadata.getForeground(metadata);\n    }\n    getClassName(tokenIndex) {\n        const metadata = this._tokens[(tokenIndex << 1) + 1];\n        return TokenMetadata.getClassNameFromMetadata(metadata);\n    }\n    getInlineStyle(tokenIndex, colorMap) {\n        const metadata = this._tokens[(tokenIndex << 1) + 1];\n        return TokenMetadata.getInlineStyleFromMetadata(metadata, colorMap);\n    }\n    getPresentation(tokenIndex) {\n        const metadata = this._tokens[(tokenIndex << 1) + 1];\n        return TokenMetadata.getPresentationFromMetadata(metadata);\n    }\n    getEndOffset(tokenIndex) {\n        return this._tokens[tokenIndex << 1];\n    }\n    /**\n     * Find the token containing offset `offset`.\n     * @param offset The search offset\n     * @return The index of the token containing the offset.\n     */\n    findTokenIndexAtOffset(offset) {\n        return LineTokens.findIndexInTokensArray(this._tokens, offset);\n    }\n    inflate() {\n        return this;\n    }\n    sliceAndInflate(startOffset, endOffset, deltaOffset) {\n        return new SliceLineTokens(this, startOffset, endOffset, deltaOffset);\n    }\n    sliceZeroCopy(range) {\n        return this.sliceAndInflate(range.start, range.endExclusive, 0);\n    }\n    /**\n     * @pure\n     * @param insertTokens Must be sorted by offset.\n    */\n    withInserted(insertTokens) {\n        if (insertTokens.length === 0) {\n            return this;\n        }\n        let nextOriginalTokenIdx = 0;\n        let nextInsertTokenIdx = 0;\n        let text = '';\n        const newTokens = new Array();\n        let originalEndOffset = 0;\n        while (true) {\n            const nextOriginalTokenEndOffset = nextOriginalTokenIdx < this._tokensCount ? this._tokens[nextOriginalTokenIdx << 1] : -1;\n            const nextInsertToken = nextInsertTokenIdx < insertTokens.length ? insertTokens[nextInsertTokenIdx] : null;\n            if (nextOriginalTokenEndOffset !== -1 && (nextInsertToken === null || nextOriginalTokenEndOffset <= nextInsertToken.offset)) {\n                // original token ends before next insert token\n                text += this._text.substring(originalEndOffset, nextOriginalTokenEndOffset);\n                const metadata = this._tokens[(nextOriginalTokenIdx << 1) + 1];\n                newTokens.push(text.length, metadata);\n                nextOriginalTokenIdx++;\n                originalEndOffset = nextOriginalTokenEndOffset;\n            }\n            else if (nextInsertToken) {\n                if (nextInsertToken.offset > originalEndOffset) {\n                    // insert token is in the middle of the next token.\n                    text += this._text.substring(originalEndOffset, nextInsertToken.offset);\n                    const metadata = this._tokens[(nextOriginalTokenIdx << 1) + 1];\n                    newTokens.push(text.length, metadata);\n                    originalEndOffset = nextInsertToken.offset;\n                }\n                text += nextInsertToken.text;\n                newTokens.push(text.length, nextInsertToken.tokenMetadata);\n                nextInsertTokenIdx++;\n            }\n            else {\n                break;\n            }\n        }\n        return new LineTokens(new Uint32Array(newTokens), text, this.languageIdCodec);\n    }\n    getTokensInRange(range) {\n        const builder = new TokenArrayBuilder();\n        const startTokenIndex = this.findTokenIndexAtOffset(range.start);\n        const endTokenIndex = this.findTokenIndexAtOffset(range.endExclusive);\n        for (let tokenIndex = startTokenIndex; tokenIndex <= endTokenIndex; tokenIndex++) {\n            const tokenRange = new OffsetRange(this.getStartOffset(tokenIndex), this.getEndOffset(tokenIndex));\n            const length = tokenRange.intersectionLength(range);\n            if (length > 0) {\n                builder.add(length, this.getMetadata(tokenIndex));\n            }\n        }\n        return builder.build();\n    }\n    getTokenText(tokenIndex) {\n        const startOffset = this.getStartOffset(tokenIndex);\n        const endOffset = this.getEndOffset(tokenIndex);\n        const text = this._text.substring(startOffset, endOffset);\n        return text;\n    }\n    forEach(callback) {\n        const tokenCount = this.getCount();\n        for (let tokenIndex = 0; tokenIndex < tokenCount; tokenIndex++) {\n            callback(tokenIndex);\n        }\n    }\n    toString() {\n        let result = '';\n        this.forEach((i) => {\n            result += `[${this.getTokenText(i)}]{${this.getClassName(i)}}`;\n        });\n        return result;\n    }\n}\nclass SliceLineTokens {\n    constructor(source, startOffset, endOffset, deltaOffset) {\n        this._source = source;\n        this._startOffset = startOffset;\n        this._endOffset = endOffset;\n        this._deltaOffset = deltaOffset;\n        this._firstTokenIndex = source.findTokenIndexAtOffset(startOffset);\n        this.languageIdCodec = source.languageIdCodec;\n        this._tokensCount = 0;\n        for (let i = this._firstTokenIndex, len = source.getCount(); i < len; i++) {\n            const tokenStartOffset = source.getStartOffset(i);\n            if (tokenStartOffset >= endOffset) {\n                break;\n            }\n            this._tokensCount++;\n        }\n    }\n    getMetadata(tokenIndex) {\n        return this._source.getMetadata(this._firstTokenIndex + tokenIndex);\n    }\n    getLanguageId(tokenIndex) {\n        return this._source.getLanguageId(this._firstTokenIndex + tokenIndex);\n    }\n    getLineContent() {\n        return this._source.getLineContent().substring(this._startOffset, this._endOffset);\n    }\n    equals(other) {\n        if (other instanceof SliceLineTokens) {\n            return (this._startOffset === other._startOffset\n                && this._endOffset === other._endOffset\n                && this._deltaOffset === other._deltaOffset\n                && this._source.slicedEquals(other._source, this._firstTokenIndex, this._tokensCount));\n        }\n        return false;\n    }\n    getCount() {\n        return this._tokensCount;\n    }\n    getStandardTokenType(tokenIndex) {\n        return this._source.getStandardTokenType(this._firstTokenIndex + tokenIndex);\n    }\n    getForeground(tokenIndex) {\n        return this._source.getForeground(this._firstTokenIndex + tokenIndex);\n    }\n    getEndOffset(tokenIndex) {\n        const tokenEndOffset = this._source.getEndOffset(this._firstTokenIndex + tokenIndex);\n        return Math.min(this._endOffset, tokenEndOffset) - this._startOffset + this._deltaOffset;\n    }\n    getClassName(tokenIndex) {\n        return this._source.getClassName(this._firstTokenIndex + tokenIndex);\n    }\n    getInlineStyle(tokenIndex, colorMap) {\n        return this._source.getInlineStyle(this._firstTokenIndex + tokenIndex, colorMap);\n    }\n    getPresentation(tokenIndex) {\n        return this._source.getPresentation(this._firstTokenIndex + tokenIndex);\n    }\n    findTokenIndexAtOffset(offset) {\n        return this._source.findTokenIndexAtOffset(offset + this._startOffset - this._deltaOffset) - this._firstTokenIndex;\n    }\n    getTokenText(tokenIndex) {\n        const adjustedTokenIndex = this._firstTokenIndex + tokenIndex;\n        const tokenStartOffset = this._source.getStartOffset(adjustedTokenIndex);\n        const tokenEndOffset = this._source.getEndOffset(adjustedTokenIndex);\n        let text = this._source.getTokenText(adjustedTokenIndex);\n        if (tokenStartOffset < this._startOffset) {\n            text = text.substring(this._startOffset - tokenStartOffset);\n        }\n        if (tokenEndOffset > this._endOffset) {\n            text = text.substring(0, text.length - (tokenEndOffset - this._endOffset));\n        }\n        return text;\n    }\n    forEach(callback) {\n        for (let tokenIndex = 0; tokenIndex < this.getCount(); tokenIndex++) {\n            callback(tokenIndex);\n        }\n    }\n}\nfunction getStandardTokenTypeAtPosition(model, position) {\n    const lineNumber = position.lineNumber;\n    if (!model.tokenization.isCheapToTokenize(lineNumber)) {\n        return undefined;\n    }\n    model.tokenization.forceTokenization(lineNumber);\n    const lineTokens = model.tokenization.getLineTokens(lineNumber);\n    const tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1);\n    const tokenType = lineTokens.getStandardTokenType(tokenIndex);\n    return tokenType;\n}\n/**\n * This class represents a sequence of tokens.\n * Conceptually, each token has a length and a metadata number.\n * A token array might be used to annotate a string with metadata.\n * Use {@link TokenArrayBuilder} to efficiently create a token array.\n *\n * TODO: Make this class more efficient (e.g. by using a Int32Array).\n*/\nclass TokenArray {\n    static fromLineTokens(lineTokens) {\n        const tokenInfo = [];\n        for (let i = 0; i < lineTokens.getCount(); i++) {\n            tokenInfo.push(new TokenInfo(lineTokens.getEndOffset(i) - lineTokens.getStartOffset(i), lineTokens.getMetadata(i)));\n        }\n        return TokenArray.create(tokenInfo);\n    }\n    static create(tokenInfo) {\n        return new TokenArray(tokenInfo);\n    }\n    constructor(_tokenInfo) {\n        this._tokenInfo = _tokenInfo;\n    }\n    toLineTokens(lineContent, decoder) {\n        return LineTokens.createFromTextAndMetadata(this.map((r, t) => ({ text: r.substring(lineContent), metadata: t.metadata })), decoder);\n    }\n    forEach(cb) {\n        let lengthSum = 0;\n        for (const tokenInfo of this._tokenInfo) {\n            const range = new OffsetRange(lengthSum, lengthSum + tokenInfo.length);\n            cb(range, tokenInfo);\n            lengthSum += tokenInfo.length;\n        }\n    }\n    map(cb) {\n        const result = [];\n        let lengthSum = 0;\n        for (const tokenInfo of this._tokenInfo) {\n            const range = new OffsetRange(lengthSum, lengthSum + tokenInfo.length);\n            result.push(cb(range, tokenInfo));\n            lengthSum += tokenInfo.length;\n        }\n        return result;\n    }\n    slice(range) {\n        const result = [];\n        let lengthSum = 0;\n        for (const tokenInfo of this._tokenInfo) {\n            const tokenStart = lengthSum;\n            const tokenEndEx = tokenStart + tokenInfo.length;\n            if (tokenEndEx > range.start) {\n                if (tokenStart >= range.endExclusive) {\n                    break;\n                }\n                const deltaBefore = Math.max(0, range.start - tokenStart);\n                const deltaAfter = Math.max(0, tokenEndEx - range.endExclusive);\n                result.push(new TokenInfo(tokenInfo.length - deltaBefore - deltaAfter, tokenInfo.metadata));\n            }\n            lengthSum += tokenInfo.length;\n        }\n        return TokenArray.create(result);\n    }\n}\nclass TokenInfo {\n    constructor(length, metadata) {\n        this.length = length;\n        this.metadata = metadata;\n    }\n}\n/**\n * TODO: Make this class more efficient (e.g. by using a Int32Array).\n*/\nclass TokenArrayBuilder {\n    constructor() {\n        this._tokens = [];\n    }\n    add(length, metadata) {\n        this._tokens.push(new TokenInfo(length, metadata));\n    }\n    build() {\n        return TokenArray.create(this._tokens);\n    }\n}\n\nexport { LineTokens, TokenArray, TokenArrayBuilder, TokenInfo, getStandardTokenTypeAtPosition };\n","import { getLeadingWhitespace } from '../../../../base/common/strings.js';\nimport { createScopedLineTokens } from '../supports.js';\nimport { LineTokens } from '../../tokens/lineTokens.js';\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/**\n * This class is a wrapper class around {@link IndentRulesSupport}.\n * It processes the lines by removing the language configuration brackets from the regex, string and comment tokens.\n * It then calls into the {@link IndentRulesSupport} to validate the indentation conditions.\n */\nclass ProcessedIndentRulesSupport {\n    constructor(model, indentRulesSupport, languageConfigurationService) {\n        this._indentRulesSupport = indentRulesSupport;\n        this._indentationLineProcessor = new IndentationLineProcessor(model, languageConfigurationService);\n    }\n    /**\n     * Apply the new indentation and return whether the indentation level should be increased after the given line number\n     */\n    shouldIncrease(lineNumber, newIndentation) {\n        const processedLine = this._indentationLineProcessor.getProcessedLine(lineNumber, newIndentation);\n        return this._indentRulesSupport.shouldIncrease(processedLine);\n    }\n    /**\n     * Apply the new indentation and return whether the indentation level should be decreased after the given line number\n     */\n    shouldDecrease(lineNumber, newIndentation) {\n        const processedLine = this._indentationLineProcessor.getProcessedLine(lineNumber, newIndentation);\n        return this._indentRulesSupport.shouldDecrease(processedLine);\n    }\n    /**\n     * Apply the new indentation and return whether the indentation level should remain unchanged at the given line number\n     */\n    shouldIgnore(lineNumber, newIndentation) {\n        const processedLine = this._indentationLineProcessor.getProcessedLine(lineNumber, newIndentation);\n        return this._indentRulesSupport.shouldIgnore(processedLine);\n    }\n    /**\n     * Apply the new indentation and return whether the indentation level should increase on the line after the given line number\n     */\n    shouldIndentNextLine(lineNumber, newIndentation) {\n        const processedLine = this._indentationLineProcessor.getProcessedLine(lineNumber, newIndentation);\n        return this._indentRulesSupport.shouldIndentNextLine(processedLine);\n    }\n}\n/**\n * This class fetches the processed text around a range which can be used for indentation evaluation.\n * It returns:\n * - The processed text before the given range and on the same start line\n * - The processed text after the given range and on the same end line\n * - The processed text on the previous line\n */\nclass IndentationContextProcessor {\n    constructor(model, languageConfigurationService) {\n        this.model = model;\n        this.indentationLineProcessor = new IndentationLineProcessor(model, languageConfigurationService);\n    }\n    /**\n     * Returns the processed text, stripped from the language configuration brackets within the string, comment and regex tokens, around the given range\n     */\n    getProcessedTokenContextAroundRange(range) {\n        const beforeRangeProcessedTokens = this._getProcessedTokensBeforeRange(range);\n        const afterRangeProcessedTokens = this._getProcessedTokensAfterRange(range);\n        const previousLineProcessedTokens = this._getProcessedPreviousLineTokens(range);\n        return { beforeRangeProcessedTokens, afterRangeProcessedTokens, previousLineProcessedTokens };\n    }\n    _getProcessedTokensBeforeRange(range) {\n        this.model.tokenization.forceTokenization(range.startLineNumber);\n        const lineTokens = this.model.tokenization.getLineTokens(range.startLineNumber);\n        const scopedLineTokens = createScopedLineTokens(lineTokens, range.startColumn - 1);\n        let slicedTokens;\n        if (isLanguageDifferentFromLineStart(this.model, range.getStartPosition())) {\n            const columnIndexWithinScope = (range.startColumn - 1) - scopedLineTokens.firstCharOffset;\n            const firstCharacterOffset = scopedLineTokens.firstCharOffset;\n            const lastCharacterOffset = firstCharacterOffset + columnIndexWithinScope;\n            slicedTokens = lineTokens.sliceAndInflate(firstCharacterOffset, lastCharacterOffset, 0);\n        }\n        else {\n            const columnWithinLine = range.startColumn - 1;\n            slicedTokens = lineTokens.sliceAndInflate(0, columnWithinLine, 0);\n        }\n        const processedTokens = this.indentationLineProcessor.getProcessedTokens(slicedTokens);\n        return processedTokens;\n    }\n    _getProcessedTokensAfterRange(range) {\n        const position = range.isEmpty() ? range.getStartPosition() : range.getEndPosition();\n        this.model.tokenization.forceTokenization(position.lineNumber);\n        const lineTokens = this.model.tokenization.getLineTokens(position.lineNumber);\n        const scopedLineTokens = createScopedLineTokens(lineTokens, position.column - 1);\n        const columnIndexWithinScope = position.column - 1 - scopedLineTokens.firstCharOffset;\n        const firstCharacterOffset = scopedLineTokens.firstCharOffset + columnIndexWithinScope;\n        const lastCharacterOffset = scopedLineTokens.firstCharOffset + scopedLineTokens.getLineLength();\n        const slicedTokens = lineTokens.sliceAndInflate(firstCharacterOffset, lastCharacterOffset, 0);\n        const processedTokens = this.indentationLineProcessor.getProcessedTokens(slicedTokens);\n        return processedTokens;\n    }\n    _getProcessedPreviousLineTokens(range) {\n        const getScopedLineTokensAtEndColumnOfLine = (lineNumber) => {\n            this.model.tokenization.forceTokenization(lineNumber);\n            const lineTokens = this.model.tokenization.getLineTokens(lineNumber);\n            const endColumnOfLine = this.model.getLineMaxColumn(lineNumber) - 1;\n            const scopedLineTokensAtEndColumn = createScopedLineTokens(lineTokens, endColumnOfLine);\n            return scopedLineTokensAtEndColumn;\n        };\n        this.model.tokenization.forceTokenization(range.startLineNumber);\n        const lineTokens = this.model.tokenization.getLineTokens(range.startLineNumber);\n        const scopedLineTokens = createScopedLineTokens(lineTokens, range.startColumn - 1);\n        const emptyTokens = LineTokens.createEmpty('', scopedLineTokens.languageIdCodec);\n        const previousLineNumber = range.startLineNumber - 1;\n        const isFirstLine = previousLineNumber === 0;\n        if (isFirstLine) {\n            return emptyTokens;\n        }\n        const canScopeExtendOnPreviousLine = scopedLineTokens.firstCharOffset === 0;\n        if (!canScopeExtendOnPreviousLine) {\n            return emptyTokens;\n        }\n        const scopedLineTokensAtEndColumnOfPreviousLine = getScopedLineTokensAtEndColumnOfLine(previousLineNumber);\n        const doesLanguageContinueOnPreviousLine = scopedLineTokens.languageId === scopedLineTokensAtEndColumnOfPreviousLine.languageId;\n        if (!doesLanguageContinueOnPreviousLine) {\n            return emptyTokens;\n        }\n        const previousSlicedLineTokens = scopedLineTokensAtEndColumnOfPreviousLine.toIViewLineTokens();\n        const processedTokens = this.indentationLineProcessor.getProcessedTokens(previousSlicedLineTokens);\n        return processedTokens;\n    }\n}\n/**\n * This class performs the actual processing of the indentation lines.\n * The brackets of the language configuration are removed from the regex, string and comment tokens.\n */\nclass IndentationLineProcessor {\n    constructor(model, languageConfigurationService) {\n        this.model = model;\n        this.languageConfigurationService = languageConfigurationService;\n    }\n    /**\n     * Get the processed line for the given line number and potentially adjust the indentation level.\n     * Remove the language configuration brackets from the regex, string and comment tokens.\n     */\n    getProcessedLine(lineNumber, newIndentation) {\n        const replaceIndentation = (line, newIndentation) => {\n            const currentIndentation = getLeadingWhitespace(line);\n            const adjustedLine = newIndentation + line.substring(currentIndentation.length);\n            return adjustedLine;\n        };\n        this.model.tokenization.forceTokenization?.(lineNumber);\n        const tokens = this.model.tokenization.getLineTokens(lineNumber);\n        let processedLine = this.getProcessedTokens(tokens).getLineContent();\n        if (newIndentation !== undefined) {\n            processedLine = replaceIndentation(processedLine, newIndentation);\n        }\n        return processedLine;\n    }\n    /**\n     * Process the line with the given tokens, remove the language configuration brackets from the regex, string and comment tokens.\n     */\n    getProcessedTokens(tokens) {\n        const shouldRemoveBracketsFromTokenType = (tokenType) => {\n            return tokenType === 2 /* StandardTokenType.String */\n                || tokenType === 3 /* StandardTokenType.RegEx */\n                || tokenType === 1 /* StandardTokenType.Comment */;\n        };\n        const languageId = tokens.getLanguageId(0);\n        const bracketsConfiguration = this.languageConfigurationService.getLanguageConfiguration(languageId).bracketsNew;\n        const bracketsRegExp = bracketsConfiguration.getBracketRegExp({ global: true });\n        const textAndMetadata = [];\n        tokens.forEach((tokenIndex) => {\n            const tokenType = tokens.getStandardTokenType(tokenIndex);\n            let text = tokens.getTokenText(tokenIndex);\n            if (shouldRemoveBracketsFromTokenType(tokenType)) {\n                text = text.replace(bracketsRegExp, '');\n            }\n            const metadata = tokens.getMetadata(tokenIndex);\n            textAndMetadata.push({ text, metadata });\n        });\n        const processedLineTokens = LineTokens.createFromTextAndMetadata(textAndMetadata, tokens.languageIdCodec);\n        return processedLineTokens;\n    }\n}\nfunction isLanguageDifferentFromLineStart(model, position) {\n    model.tokenization.forceTokenization(position.lineNumber);\n    const lineTokens = model.tokenization.getLineTokens(position.lineNumber);\n    const scopedLineTokens = createScopedLineTokens(lineTokens, position.column - 1);\n    const doesScopeStartAtOffsetZero = scopedLineTokens.firstCharOffset === 0;\n    const isScopedLanguageEqualToFirstLanguageOnLine = lineTokens.getLanguageId(0) === scopedLineTokens.languageId;\n    const languageIsDifferentFromLineStart = !doesScopeStartAtOffsetZero && !isScopedLanguageEqualToFirstLanguageOnLine;\n    return languageIsDifferentFromLineStart;\n}\n\nexport { IndentationContextProcessor, ProcessedIndentRulesSupport, isLanguageDifferentFromLineStart };\n","import { IndentAction } from './languageConfiguration.js';\nimport { getIndentationAtPosition } from './languageConfigurationRegistry.js';\nimport { IndentationContextProcessor } from './supports/indentationLineProcessor.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction getEnterAction(autoIndent, model, range, languageConfigurationService) {\n    model.tokenization.forceTokenization(range.startLineNumber);\n    const languageId = model.getLanguageIdAtPosition(range.startLineNumber, range.startColumn);\n    const richEditSupport = languageConfigurationService.getLanguageConfiguration(languageId);\n    if (!richEditSupport) {\n        return null;\n    }\n    const indentationContextProcessor = new IndentationContextProcessor(model, languageConfigurationService);\n    const processedContextTokens = indentationContextProcessor.getProcessedTokenContextAroundRange(range);\n    const previousLineText = processedContextTokens.previousLineProcessedTokens.getLineContent();\n    const beforeEnterText = processedContextTokens.beforeRangeProcessedTokens.getLineContent();\n    const afterEnterText = processedContextTokens.afterRangeProcessedTokens.getLineContent();\n    const enterResult = richEditSupport.onEnter(autoIndent, previousLineText, beforeEnterText, afterEnterText);\n    if (!enterResult) {\n        return null;\n    }\n    const indentAction = enterResult.indentAction;\n    let appendText = enterResult.appendText;\n    const removeText = enterResult.removeText || 0;\n    // Here we add `\\t` to appendText first because enterAction is leveraging appendText and removeText to change indentation.\n    if (!appendText) {\n        if ((indentAction === IndentAction.Indent) ||\n            (indentAction === IndentAction.IndentOutdent)) {\n            appendText = '\\t';\n        }\n        else {\n            appendText = '';\n        }\n    }\n    else if (indentAction === IndentAction.Indent) {\n        appendText = '\\t' + appendText;\n    }\n    let indentation = getIndentationAtPosition(model, range.startLineNumber, range.startColumn);\n    if (removeText) {\n        indentation = indentation.substring(0, indentation.length - removeText);\n    }\n    return {\n        indentAction: indentAction,\n        appendText: appendText,\n        removeText: removeText,\n        indentation: indentation\n    };\n}\n\nexport { getEnterAction };\n","import { firstNonWhitespaceIndex } from '../../../base/common/strings.js';\nimport { CursorColumns } from '../core/cursorColumns.js';\nimport { Range } from '../core/range.js';\nimport { Selection } from '../core/selection.js';\nimport { getEnterAction } from '../languages/enterAction.js';\nimport { ILanguageConfigurationService } from '../languages/languageConfigurationRegistry.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ShiftCommand_1;\nconst repeatCache = Object.create(null);\nfunction cachedStringRepeat(str, count) {\n    if (count <= 0) {\n        return '';\n    }\n    if (!repeatCache[str]) {\n        repeatCache[str] = ['', str];\n    }\n    const cache = repeatCache[str];\n    for (let i = cache.length; i <= count; i++) {\n        cache[i] = cache[i - 1] + str;\n    }\n    return cache[count];\n}\nlet ShiftCommand = ShiftCommand_1 = class ShiftCommand {\n    static unshiftIndent(line, column, tabSize, indentSize, insertSpaces) {\n        // Determine the visible column where the content starts\n        const contentStartVisibleColumn = CursorColumns.visibleColumnFromColumn(line, column, tabSize);\n        if (insertSpaces) {\n            const indent = cachedStringRepeat(' ', indentSize);\n            const desiredTabStop = CursorColumns.prevIndentTabStop(contentStartVisibleColumn, indentSize);\n            const indentCount = desiredTabStop / indentSize; // will be an integer\n            return cachedStringRepeat(indent, indentCount);\n        }\n        else {\n            const indent = '\\t';\n            const desiredTabStop = CursorColumns.prevRenderTabStop(contentStartVisibleColumn, tabSize);\n            const indentCount = desiredTabStop / tabSize; // will be an integer\n            return cachedStringRepeat(indent, indentCount);\n        }\n    }\n    static shiftIndent(line, column, tabSize, indentSize, insertSpaces) {\n        // Determine the visible column where the content starts\n        const contentStartVisibleColumn = CursorColumns.visibleColumnFromColumn(line, column, tabSize);\n        if (insertSpaces) {\n            const indent = cachedStringRepeat(' ', indentSize);\n            const desiredTabStop = CursorColumns.nextIndentTabStop(contentStartVisibleColumn, indentSize);\n            const indentCount = desiredTabStop / indentSize; // will be an integer\n            return cachedStringRepeat(indent, indentCount);\n        }\n        else {\n            const indent = '\\t';\n            const desiredTabStop = CursorColumns.nextRenderTabStop(contentStartVisibleColumn, tabSize);\n            const indentCount = desiredTabStop / tabSize; // will be an integer\n            return cachedStringRepeat(indent, indentCount);\n        }\n    }\n    constructor(range, opts, _languageConfigurationService) {\n        this._languageConfigurationService = _languageConfigurationService;\n        this._opts = opts;\n        this._selection = range;\n        this._selectionId = null;\n        this._useLastEditRangeForCursorEndPosition = false;\n        this._selectionStartColumnStaysPut = false;\n    }\n    _addEditOperation(builder, range, text) {\n        if (this._useLastEditRangeForCursorEndPosition) {\n            builder.addTrackedEditOperation(range, text);\n        }\n        else {\n            builder.addEditOperation(range, text);\n        }\n    }\n    getEditOperations(model, builder) {\n        const startLine = this._selection.startLineNumber;\n        let endLine = this._selection.endLineNumber;\n        if (this._selection.endColumn === 1 && startLine !== endLine) {\n            endLine = endLine - 1;\n        }\n        const { tabSize, indentSize, insertSpaces } = this._opts;\n        const shouldIndentEmptyLines = (startLine === endLine);\n        if (this._opts.useTabStops) {\n            // if indenting or outdenting on a whitespace only line\n            if (this._selection.isEmpty()) {\n                if (/^\\s*$/.test(model.getLineContent(startLine))) {\n                    this._useLastEditRangeForCursorEndPosition = true;\n                }\n            }\n            // keep track of previous line's \"miss-alignment\"\n            let previousLineExtraSpaces = 0, extraSpaces = 0;\n            for (let lineNumber = startLine; lineNumber <= endLine; lineNumber++, previousLineExtraSpaces = extraSpaces) {\n                extraSpaces = 0;\n                const lineText = model.getLineContent(lineNumber);\n                let indentationEndIndex = firstNonWhitespaceIndex(lineText);\n                if (this._opts.isUnshift && (lineText.length === 0 || indentationEndIndex === 0)) {\n                    // empty line or line with no leading whitespace => nothing to do\n                    continue;\n                }\n                if (!shouldIndentEmptyLines && !this._opts.isUnshift && lineText.length === 0) {\n                    // do not indent empty lines => nothing to do\n                    continue;\n                }\n                if (indentationEndIndex === -1) {\n                    // the entire line is whitespace\n                    indentationEndIndex = lineText.length;\n                }\n                if (lineNumber > 1) {\n                    const contentStartVisibleColumn = CursorColumns.visibleColumnFromColumn(lineText, indentationEndIndex + 1, tabSize);\n                    if (contentStartVisibleColumn % indentSize !== 0) {\n                        // The current line is \"miss-aligned\", so let's see if this is expected...\n                        // This can only happen when it has trailing commas in the indent\n                        if (model.tokenization.isCheapToTokenize(lineNumber - 1)) {\n                            const enterAction = getEnterAction(this._opts.autoIndent, model, new Range(lineNumber - 1, model.getLineMaxColumn(lineNumber - 1), lineNumber - 1, model.getLineMaxColumn(lineNumber - 1)), this._languageConfigurationService);\n                            if (enterAction) {\n                                extraSpaces = previousLineExtraSpaces;\n                                if (enterAction.appendText) {\n                                    for (let j = 0, lenJ = enterAction.appendText.length; j < lenJ && extraSpaces < indentSize; j++) {\n                                        if (enterAction.appendText.charCodeAt(j) === 32 /* CharCode.Space */) {\n                                            extraSpaces++;\n                                        }\n                                        else {\n                                            break;\n                                        }\n                                    }\n                                }\n                                if (enterAction.removeText) {\n                                    extraSpaces = Math.max(0, extraSpaces - enterAction.removeText);\n                                }\n                                // Act as if `prefixSpaces` is not part of the indentation\n                                for (let j = 0; j < extraSpaces; j++) {\n                                    if (indentationEndIndex === 0 || lineText.charCodeAt(indentationEndIndex - 1) !== 32 /* CharCode.Space */) {\n                                        break;\n                                    }\n                                    indentationEndIndex--;\n                                }\n                            }\n                        }\n                    }\n                }\n                if (this._opts.isUnshift && indentationEndIndex === 0) {\n                    // line with no leading whitespace => nothing to do\n                    continue;\n                }\n                let desiredIndent;\n                if (this._opts.isUnshift) {\n                    desiredIndent = ShiftCommand_1.unshiftIndent(lineText, indentationEndIndex + 1, tabSize, indentSize, insertSpaces);\n                }\n                else {\n                    desiredIndent = ShiftCommand_1.shiftIndent(lineText, indentationEndIndex + 1, tabSize, indentSize, insertSpaces);\n                }\n                this._addEditOperation(builder, new Range(lineNumber, 1, lineNumber, indentationEndIndex + 1), desiredIndent);\n                if (lineNumber === startLine && !this._selection.isEmpty()) {\n                    // Force the startColumn to stay put because we're inserting after it\n                    this._selectionStartColumnStaysPut = (this._selection.startColumn <= indentationEndIndex + 1);\n                }\n            }\n        }\n        else {\n            // if indenting or outdenting on a whitespace only line\n            if (!this._opts.isUnshift && this._selection.isEmpty() && model.getLineLength(startLine) === 0) {\n                this._useLastEditRangeForCursorEndPosition = true;\n            }\n            const oneIndent = (insertSpaces ? cachedStringRepeat(' ', indentSize) : '\\t');\n            for (let lineNumber = startLine; lineNumber <= endLine; lineNumber++) {\n                const lineText = model.getLineContent(lineNumber);\n                let indentationEndIndex = firstNonWhitespaceIndex(lineText);\n                if (this._opts.isUnshift && (lineText.length === 0 || indentationEndIndex === 0)) {\n                    // empty line or line with no leading whitespace => nothing to do\n                    continue;\n                }\n                if (!shouldIndentEmptyLines && !this._opts.isUnshift && lineText.length === 0) {\n                    // do not indent empty lines => nothing to do\n                    continue;\n                }\n                if (indentationEndIndex === -1) {\n                    // the entire line is whitespace\n                    indentationEndIndex = lineText.length;\n                }\n                if (this._opts.isUnshift && indentationEndIndex === 0) {\n                    // line with no leading whitespace => nothing to do\n                    continue;\n                }\n                if (this._opts.isUnshift) {\n                    indentationEndIndex = Math.min(indentationEndIndex, indentSize);\n                    for (let i = 0; i < indentationEndIndex; i++) {\n                        const chr = lineText.charCodeAt(i);\n                        if (chr === 9 /* CharCode.Tab */) {\n                            indentationEndIndex = i + 1;\n                            break;\n                        }\n                    }\n                    this._addEditOperation(builder, new Range(lineNumber, 1, lineNumber, indentationEndIndex + 1), '');\n                }\n                else {\n                    this._addEditOperation(builder, new Range(lineNumber, 1, lineNumber, 1), oneIndent);\n                    if (lineNumber === startLine && !this._selection.isEmpty()) {\n                        // Force the startColumn to stay put because we're inserting after it\n                        this._selectionStartColumnStaysPut = (this._selection.startColumn === 1);\n                    }\n                }\n            }\n        }\n        this._selectionId = builder.trackSelection(this._selection);\n    }\n    computeCursorState(model, helper) {\n        if (this._useLastEditRangeForCursorEndPosition) {\n            const lastOp = helper.getInverseEditOperations()[0];\n            return new Selection(lastOp.range.endLineNumber, lastOp.range.endColumn, lastOp.range.endLineNumber, lastOp.range.endColumn);\n        }\n        const result = helper.getTrackedSelection(this._selectionId);\n        if (this._selectionStartColumnStaysPut) {\n            // The selection start should not move\n            const initialStartColumn = this._selection.startColumn;\n            const resultStartColumn = result.startColumn;\n            if (resultStartColumn <= initialStartColumn) {\n                return result;\n            }\n            if (result.getDirection() === 0 /* SelectionDirection.LTR */) {\n                return new Selection(result.startLineNumber, initialStartColumn, result.endLineNumber, result.endColumn);\n            }\n            return new Selection(result.endLineNumber, result.endColumn, result.startLineNumber, initialStartColumn);\n        }\n        return result;\n    }\n};\nShiftCommand = ShiftCommand_1 = __decorate([\n    __param(2, ILanguageConfigurationService)\n], ShiftCommand);\n\nexport { ShiftCommand };\n","import { Range } from '../core/range.js';\nimport { Selection } from '../core/selection.js';\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 *--------------------------------------------------------------------------------------------*/\nclass SurroundSelectionCommand {\n    constructor(range, charBeforeSelection, charAfterSelection) {\n        this._range = range;\n        this._charBeforeSelection = charBeforeSelection;\n        this._charAfterSelection = charAfterSelection;\n    }\n    getEditOperations(model, builder) {\n        builder.addTrackedEditOperation(new Range(this._range.startLineNumber, this._range.startColumn, this._range.startLineNumber, this._range.startColumn), this._charBeforeSelection);\n        builder.addTrackedEditOperation(new Range(this._range.endLineNumber, this._range.endColumn, this._range.endLineNumber, this._range.endColumn), this._charAfterSelection || null); // addTrackedEditOperation() ignores us if the text == ''. Causing a chain of errors in computeCursorState()\n    }\n    computeCursorState(model, helper) {\n        const inverseEditOperations = helper.getInverseEditOperations();\n        const firstOperationRange = inverseEditOperations[0].range;\n        const secondOperationRange = inverseEditOperations[1].range;\n        return new Selection(firstOperationRange.endLineNumber, firstOperationRange.endColumn, secondOperationRange.endLineNumber, secondOperationRange.endColumn - this._charAfterSelection.length);\n    }\n}\n/**\n * A surround selection command that runs after composition finished.\n */\nclass CompositionSurroundSelectionCommand {\n    constructor(_position, _text, _charAfter) {\n        this._position = _position;\n        this._text = _text;\n        this._charAfter = _charAfter;\n    }\n    getEditOperations(model, builder) {\n        builder.addTrackedEditOperation(new Range(this._position.lineNumber, this._position.column, this._position.lineNumber, this._position.column), this._text + this._charAfter);\n    }\n    computeCursorState(model, helper) {\n        const inverseEditOperations = helper.getInverseEditOperations();\n        const opRange = inverseEditOperations[0].range;\n        return new Selection(opRange.endLineNumber, opRange.startColumn, opRange.endLineNumber, opRange.endColumn - this._charAfter.length);\n    }\n}\n\nexport { CompositionSurroundSelectionCommand, SurroundSelectionCommand };\n","import { getLeadingWhitespace } from '../../../base/common/strings.js';\nimport { IndentAction } from './languageConfiguration.js';\nimport { IndentationContextProcessor, isLanguageDifferentFromLineStart, ProcessedIndentRulesSupport } from './supports/indentationLineProcessor.js';\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/**\n * Get nearest preceding line which doesn't match unIndentPattern or contains all whitespace.\n * Result:\n * -1: run into the boundary of embedded languages\n * 0: every line above are invalid\n * else: nearest preceding line of the same language\n */\nfunction getPrecedingValidLine(model, lineNumber, processedIndentRulesSupport) {\n    const languageId = model.tokenization.getLanguageIdAtPosition(lineNumber, 0);\n    if (lineNumber > 1) {\n        let lastLineNumber;\n        let resultLineNumber = -1;\n        for (lastLineNumber = lineNumber - 1; lastLineNumber >= 1; lastLineNumber--) {\n            if (model.tokenization.getLanguageIdAtPosition(lastLineNumber, 0) !== languageId) {\n                return resultLineNumber;\n            }\n            const text = model.getLineContent(lastLineNumber);\n            if (processedIndentRulesSupport.shouldIgnore(lastLineNumber) || /^\\s+$/.test(text) || text === '') {\n                resultLineNumber = lastLineNumber;\n                continue;\n            }\n            return lastLineNumber;\n        }\n    }\n    return -1;\n}\n/**\n * Get inherited indentation from above lines.\n * 1. Find the nearest preceding line which doesn't match unIndentedLinePattern.\n * 2. If this line matches indentNextLinePattern or increaseIndentPattern, it means that the indent level of `lineNumber` should be 1 greater than this line.\n * 3. If this line doesn't match any indent rules\n *   a. check whether the line above it matches indentNextLinePattern\n *   b. If not, the indent level of this line is the result\n *   c. If so, it means the indent of this line is *temporary*, go upward utill we find a line whose indent is not temporary (the same workflow a -> b -> c).\n * 4. Otherwise, we fail to get an inherited indent from aboves. Return null and we should not touch the indent of `lineNumber`\n *\n * This function only return the inherited indent based on above lines, it doesn't check whether current line should decrease or not.\n */\nfunction getInheritIndentForLine(autoIndent, model, lineNumber, honorIntentialIndent = true, languageConfigurationService) {\n    if (autoIndent < 4 /* EditorAutoIndentStrategy.Full */) {\n        return null;\n    }\n    const indentRulesSupport = languageConfigurationService.getLanguageConfiguration(model.tokenization.getLanguageId()).indentRulesSupport;\n    if (!indentRulesSupport) {\n        return null;\n    }\n    const processedIndentRulesSupport = new ProcessedIndentRulesSupport(model, indentRulesSupport, languageConfigurationService);\n    if (lineNumber <= 1) {\n        return {\n            indentation: '',\n            action: null\n        };\n    }\n    // Use no indent if this is the first non-blank line\n    for (let priorLineNumber = lineNumber - 1; priorLineNumber > 0; priorLineNumber--) {\n        if (model.getLineContent(priorLineNumber) !== '') {\n            break;\n        }\n        if (priorLineNumber === 1) {\n            return {\n                indentation: '',\n                action: null\n            };\n        }\n    }\n    const precedingUnIgnoredLine = getPrecedingValidLine(model, lineNumber, processedIndentRulesSupport);\n    if (precedingUnIgnoredLine < 0) {\n        return null;\n    }\n    else if (precedingUnIgnoredLine < 1) {\n        return {\n            indentation: '',\n            action: null\n        };\n    }\n    if (processedIndentRulesSupport.shouldIncrease(precedingUnIgnoredLine) || processedIndentRulesSupport.shouldIndentNextLine(precedingUnIgnoredLine)) {\n        const precedingUnIgnoredLineContent = model.getLineContent(precedingUnIgnoredLine);\n        return {\n            indentation: getLeadingWhitespace(precedingUnIgnoredLineContent),\n            action: IndentAction.Indent,\n            line: precedingUnIgnoredLine\n        };\n    }\n    else if (processedIndentRulesSupport.shouldDecrease(precedingUnIgnoredLine)) {\n        const precedingUnIgnoredLineContent = model.getLineContent(precedingUnIgnoredLine);\n        return {\n            indentation: getLeadingWhitespace(precedingUnIgnoredLineContent),\n            action: null,\n            line: precedingUnIgnoredLine\n        };\n    }\n    else {\n        // precedingUnIgnoredLine can not be ignored.\n        // it doesn't increase indent of following lines\n        // it doesn't increase just next line\n        // so current line is not affect by precedingUnIgnoredLine\n        // and then we should get a correct inheritted indentation from above lines\n        if (precedingUnIgnoredLine === 1) {\n            return {\n                indentation: getLeadingWhitespace(model.getLineContent(precedingUnIgnoredLine)),\n                action: null,\n                line: precedingUnIgnoredLine\n            };\n        }\n        const previousLine = precedingUnIgnoredLine - 1;\n        const previousLineIndentMetadata = indentRulesSupport.getIndentMetadata(model.getLineContent(previousLine));\n        if (!(previousLineIndentMetadata & (1 /* IndentConsts.INCREASE_MASK */ | 2 /* IndentConsts.DECREASE_MASK */)) &&\n            (previousLineIndentMetadata & 4 /* IndentConsts.INDENT_NEXTLINE_MASK */)) {\n            let stopLine = 0;\n            for (let i = previousLine - 1; i > 0; i--) {\n                if (processedIndentRulesSupport.shouldIndentNextLine(i)) {\n                    continue;\n                }\n                stopLine = i;\n                break;\n            }\n            return {\n                indentation: getLeadingWhitespace(model.getLineContent(stopLine + 1)),\n                action: null,\n                line: stopLine + 1\n            };\n        }\n        if (honorIntentialIndent) {\n            return {\n                indentation: getLeadingWhitespace(model.getLineContent(precedingUnIgnoredLine)),\n                action: null,\n                line: precedingUnIgnoredLine\n            };\n        }\n        else {\n            // search from precedingUnIgnoredLine until we find one whose indent is not temporary\n            for (let i = precedingUnIgnoredLine; i > 0; i--) {\n                if (processedIndentRulesSupport.shouldIncrease(i)) {\n                    return {\n                        indentation: getLeadingWhitespace(model.getLineContent(i)),\n                        action: IndentAction.Indent,\n                        line: i\n                    };\n                }\n                else if (processedIndentRulesSupport.shouldIndentNextLine(i)) {\n                    let stopLine = 0;\n                    for (let j = i - 1; j > 0; j--) {\n                        if (processedIndentRulesSupport.shouldIndentNextLine(i)) {\n                            continue;\n                        }\n                        stopLine = j;\n                        break;\n                    }\n                    return {\n                        indentation: getLeadingWhitespace(model.getLineContent(stopLine + 1)),\n                        action: null,\n                        line: stopLine + 1\n                    };\n                }\n                else if (processedIndentRulesSupport.shouldDecrease(i)) {\n                    return {\n                        indentation: getLeadingWhitespace(model.getLineContent(i)),\n                        action: null,\n                        line: i\n                    };\n                }\n            }\n            return {\n                indentation: getLeadingWhitespace(model.getLineContent(1)),\n                action: null,\n                line: 1\n            };\n        }\n    }\n}\nfunction getGoodIndentForLine(autoIndent, virtualModel, languageId, lineNumber, indentConverter, languageConfigurationService) {\n    if (autoIndent < 4 /* EditorAutoIndentStrategy.Full */) {\n        return null;\n    }\n    const richEditSupport = languageConfigurationService.getLanguageConfiguration(languageId);\n    if (!richEditSupport) {\n        return null;\n    }\n    const indentRulesSupport = languageConfigurationService.getLanguageConfiguration(languageId).indentRulesSupport;\n    if (!indentRulesSupport) {\n        return null;\n    }\n    const processedIndentRulesSupport = new ProcessedIndentRulesSupport(virtualModel, indentRulesSupport, languageConfigurationService);\n    const indent = getInheritIndentForLine(autoIndent, virtualModel, lineNumber, undefined, languageConfigurationService);\n    if (indent) {\n        const inheritLine = indent.line;\n        if (inheritLine !== undefined) {\n            // Apply enter action as long as there are only whitespace lines between inherited line and this line.\n            let shouldApplyEnterRules = true;\n            for (let inBetweenLine = inheritLine; inBetweenLine < lineNumber - 1; inBetweenLine++) {\n                if (!/^\\s*$/.test(virtualModel.getLineContent(inBetweenLine))) {\n                    shouldApplyEnterRules = false;\n                    break;\n                }\n            }\n            if (shouldApplyEnterRules) {\n                const enterResult = richEditSupport.onEnter(autoIndent, '', virtualModel.getLineContent(inheritLine), '');\n                if (enterResult) {\n                    let indentation = getLeadingWhitespace(virtualModel.getLineContent(inheritLine));\n                    if (enterResult.removeText) {\n                        indentation = indentation.substring(0, indentation.length - enterResult.removeText);\n                    }\n                    if ((enterResult.indentAction === IndentAction.Indent) ||\n                        (enterResult.indentAction === IndentAction.IndentOutdent)) {\n                        indentation = indentConverter.shiftIndent(indentation);\n                    }\n                    else if (enterResult.indentAction === IndentAction.Outdent) {\n                        indentation = indentConverter.unshiftIndent(indentation);\n                    }\n                    if (processedIndentRulesSupport.shouldDecrease(lineNumber)) {\n                        indentation = indentConverter.unshiftIndent(indentation);\n                    }\n                    if (enterResult.appendText) {\n                        indentation += enterResult.appendText;\n                    }\n                    return getLeadingWhitespace(indentation);\n                }\n            }\n        }\n        if (processedIndentRulesSupport.shouldDecrease(lineNumber)) {\n            if (indent.action === IndentAction.Indent) {\n                return indent.indentation;\n            }\n            else {\n                return indentConverter.unshiftIndent(indent.indentation);\n            }\n        }\n        else {\n            if (indent.action === IndentAction.Indent) {\n                return indentConverter.shiftIndent(indent.indentation);\n            }\n            else {\n                return indent.indentation;\n            }\n        }\n    }\n    return null;\n}\nfunction getIndentForEnter(autoIndent, model, range, indentConverter, languageConfigurationService) {\n    if (autoIndent < 4 /* EditorAutoIndentStrategy.Full */) {\n        return null;\n    }\n    const languageId = model.getLanguageIdAtPosition(range.startLineNumber, range.startColumn);\n    const indentRulesSupport = languageConfigurationService.getLanguageConfiguration(languageId).indentRulesSupport;\n    if (!indentRulesSupport) {\n        return null;\n    }\n    model.tokenization.forceTokenization(range.startLineNumber);\n    const indentationContextProcessor = new IndentationContextProcessor(model, languageConfigurationService);\n    const processedContextTokens = indentationContextProcessor.getProcessedTokenContextAroundRange(range);\n    const afterEnterProcessedTokens = processedContextTokens.afterRangeProcessedTokens;\n    const beforeEnterProcessedTokens = processedContextTokens.beforeRangeProcessedTokens;\n    const beforeEnterIndent = getLeadingWhitespace(beforeEnterProcessedTokens.getLineContent());\n    const virtualModel = createVirtualModelWithModifiedTokensAtLine(model, range.startLineNumber, beforeEnterProcessedTokens);\n    const languageIsDifferentFromLineStart = isLanguageDifferentFromLineStart(model, range.getStartPosition());\n    const currentLine = model.getLineContent(range.startLineNumber);\n    const currentLineIndent = getLeadingWhitespace(currentLine);\n    const afterEnterAction = getInheritIndentForLine(autoIndent, virtualModel, range.startLineNumber + 1, undefined, languageConfigurationService);\n    if (!afterEnterAction) {\n        const beforeEnter = languageIsDifferentFromLineStart ? currentLineIndent : beforeEnterIndent;\n        return {\n            beforeEnter: beforeEnter,\n            afterEnter: beforeEnter\n        };\n    }\n    let afterEnterIndent = languageIsDifferentFromLineStart ? currentLineIndent : afterEnterAction.indentation;\n    if (afterEnterAction.action === IndentAction.Indent) {\n        afterEnterIndent = indentConverter.shiftIndent(afterEnterIndent);\n    }\n    if (indentRulesSupport.shouldDecrease(afterEnterProcessedTokens.getLineContent())) {\n        afterEnterIndent = indentConverter.unshiftIndent(afterEnterIndent);\n    }\n    return {\n        beforeEnter: languageIsDifferentFromLineStart ? currentLineIndent : beforeEnterIndent,\n        afterEnter: afterEnterIndent\n    };\n}\n/**\n * We should always allow intentional indentation. It means, if users change the indentation of `lineNumber` and the content of\n * this line doesn't match decreaseIndentPattern, we should not adjust the indentation.\n */\nfunction getIndentActionForType(cursorConfig, model, range, ch, indentConverter, languageConfigurationService) {\n    const autoIndent = cursorConfig.autoIndent;\n    if (autoIndent < 4 /* EditorAutoIndentStrategy.Full */) {\n        return null;\n    }\n    const languageIsDifferentFromLineStart = isLanguageDifferentFromLineStart(model, range.getStartPosition());\n    if (languageIsDifferentFromLineStart) {\n        // this line has mixed languages and indentation rules will not work\n        return null;\n    }\n    const languageId = model.getLanguageIdAtPosition(range.startLineNumber, range.startColumn);\n    const indentRulesSupport = languageConfigurationService.getLanguageConfiguration(languageId).indentRulesSupport;\n    if (!indentRulesSupport) {\n        return null;\n    }\n    const indentationContextProcessor = new IndentationContextProcessor(model, languageConfigurationService);\n    const processedContextTokens = indentationContextProcessor.getProcessedTokenContextAroundRange(range);\n    const beforeRangeText = processedContextTokens.beforeRangeProcessedTokens.getLineContent();\n    const afterRangeText = processedContextTokens.afterRangeProcessedTokens.getLineContent();\n    const textAroundRange = beforeRangeText + afterRangeText;\n    const textAroundRangeWithCharacter = beforeRangeText + ch + afterRangeText;\n    // If previous content already matches decreaseIndentPattern, it means indentation of this line should already be adjusted\n    // Users might change the indentation by purpose and we should honor that instead of readjusting.\n    if (!indentRulesSupport.shouldDecrease(textAroundRange) && indentRulesSupport.shouldDecrease(textAroundRangeWithCharacter)) {\n        // after typing `ch`, the content matches decreaseIndentPattern, we should adjust the indent to a good manner.\n        // 1. Get inherited indent action\n        const r = getInheritIndentForLine(autoIndent, model, range.startLineNumber, false, languageConfigurationService);\n        if (!r) {\n            return null;\n        }\n        let indentation = r.indentation;\n        if (r.action !== IndentAction.Indent) {\n            indentation = indentConverter.unshiftIndent(indentation);\n        }\n        return indentation;\n    }\n    const previousLineNumber = range.startLineNumber - 1;\n    if (previousLineNumber > 0) {\n        const previousLine = model.getLineContent(previousLineNumber);\n        if (indentRulesSupport.shouldIndentNextLine(previousLine) && indentRulesSupport.shouldIncrease(textAroundRangeWithCharacter)) {\n            const inheritedIndentationData = getInheritIndentForLine(autoIndent, model, range.startLineNumber, false, languageConfigurationService);\n            const inheritedIndentation = inheritedIndentationData?.indentation;\n            if (inheritedIndentation !== undefined) {\n                const currentLine = model.getLineContent(range.startLineNumber);\n                const actualCurrentIndentation = getLeadingWhitespace(currentLine);\n                const inferredCurrentIndentation = indentConverter.shiftIndent(inheritedIndentation);\n                // If the inferred current indentation is not equal to the actual current indentation, then the indentation has been intentionally changed, in that case keep it\n                const inferredIndentationEqualsActual = inferredCurrentIndentation === actualCurrentIndentation;\n                const textAroundRangeContainsOnlyWhitespace = /^\\s*$/.test(textAroundRange);\n                const autoClosingPairs = cursorConfig.autoClosingPairs.autoClosingPairsOpenByEnd.get(ch);\n                const autoClosingPairExists = autoClosingPairs && autoClosingPairs.length > 0;\n                const isChFirstNonWhitespaceCharacterAndInAutoClosingPair = autoClosingPairExists && textAroundRangeContainsOnlyWhitespace;\n                if (inferredIndentationEqualsActual && isChFirstNonWhitespaceCharacterAndInAutoClosingPair) {\n                    return inheritedIndentation;\n                }\n            }\n        }\n    }\n    return null;\n}\nfunction getIndentMetadata(model, lineNumber, languageConfigurationService) {\n    const indentRulesSupport = languageConfigurationService.getLanguageConfiguration(model.getLanguageId()).indentRulesSupport;\n    if (!indentRulesSupport) {\n        return null;\n    }\n    if (lineNumber < 1 || lineNumber > model.getLineCount()) {\n        return null;\n    }\n    return indentRulesSupport.getIndentMetadata(model.getLineContent(lineNumber));\n}\nfunction createVirtualModelWithModifiedTokensAtLine(model, modifiedLineNumber, modifiedTokens) {\n    const virtualModel = {\n        tokenization: {\n            getLineTokens: (lineNumber) => {\n                if (lineNumber === modifiedLineNumber) {\n                    return modifiedTokens;\n                }\n                else {\n                    return model.tokenization.getLineTokens(lineNumber);\n                }\n            },\n            getLanguageId: () => {\n                return model.getLanguageId();\n            },\n            getLanguageIdAtPosition: (lineNumber, column) => {\n                return model.getLanguageIdAtPosition(lineNumber, column);\n            },\n        },\n        getLineContent: (lineNumber) => {\n            if (lineNumber === modifiedLineNumber) {\n                return modifiedTokens.getLineContent();\n            }\n            else {\n                return model.getLineContent(lineNumber);\n            }\n        }\n    };\n    return virtualModel;\n}\n\nexport { getGoodIndentForLine, getIndentActionForType, getIndentForEnter, getIndentMetadata, getInheritIndentForLine };\n","import { onUnexpectedError } from '../../../base/common/errors.js';\nimport { getLeadingWhitespace, firstNonWhitespaceIndex, splitLines, lastNonWhitespaceIndex } from '../../../base/common/strings.js';\nimport { ReplaceCommandWithoutChangingPosition, ReplaceCommandWithOffsetCursorState, ReplaceCommand, ReplaceOvertypeCommand, ReplaceOvertypeCommandOnCompositionEnd, ReplaceCommandThatPreservesSelection } from '../commands/replaceCommand.js';\nimport { ShiftCommand } from '../commands/shiftCommand.js';\nimport { SurroundSelectionCommand } from '../commands/surroundSelectionCommand.js';\nimport { EditOperationResult, isQuote } from '../cursorCommon.js';\nimport { getMapForWordSeparators } from '../core/wordCharacterClassifier.js';\nimport { Range } from '../core/range.js';\nimport { Position } from '../core/position.js';\nimport { IndentAction } from '../languages/languageConfiguration.js';\nimport { getIndentationAtPosition } from '../languages/languageConfigurationRegistry.js';\nimport { createScopedLineTokens } from '../languages/supports.js';\nimport { getIndentForEnter, getInheritIndentForLine, getIndentActionForType } from '../languages/autoIndent.js';\nimport { getEnterAction } from '../languages/enterAction.js';\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 *--------------------------------------------------------------------------------------------*/\nclass AutoIndentOperation {\n    static getEdits(config, model, selections, ch, isDoingComposition) {\n        if (!isDoingComposition && this._isAutoIndentType(config, model, selections)) {\n            const indentationForSelections = [];\n            for (const selection of selections) {\n                const indentation = this._findActualIndentationForSelection(config, model, selection, ch);\n                if (indentation === null) {\n                    // Auto indentation failed\n                    return;\n                }\n                indentationForSelections.push({ selection, indentation });\n            }\n            const autoClosingPairClose = AutoClosingOpenCharTypeOperation.getAutoClosingPairClose(config, model, selections, ch, false);\n            return this._getIndentationAndAutoClosingPairEdits(config, model, indentationForSelections, ch, autoClosingPairClose);\n        }\n        return;\n    }\n    static _isAutoIndentType(config, model, selections) {\n        if (config.autoIndent < 4 /* EditorAutoIndentStrategy.Full */) {\n            return false;\n        }\n        for (let i = 0, len = selections.length; i < len; i++) {\n            if (!model.tokenization.isCheapToTokenize(selections[i].getEndPosition().lineNumber)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    static _findActualIndentationForSelection(config, model, selection, ch) {\n        const actualIndentation = getIndentActionForType(config, model, selection, ch, {\n            shiftIndent: (indentation) => {\n                return shiftIndent(config, indentation);\n            },\n            unshiftIndent: (indentation) => {\n                return unshiftIndent(config, indentation);\n            },\n        }, config.languageConfigurationService);\n        if (actualIndentation === null) {\n            return null;\n        }\n        const currentIndentation = getIndentationAtPosition(model, selection.startLineNumber, selection.startColumn);\n        if (actualIndentation === config.normalizeIndentation(currentIndentation)) {\n            return null;\n        }\n        return actualIndentation;\n    }\n    static _getIndentationAndAutoClosingPairEdits(config, model, indentationForSelections, ch, autoClosingPairClose) {\n        const commands = indentationForSelections.map(({ selection, indentation }) => {\n            if (autoClosingPairClose !== null) {\n                // Apply both auto closing pair edits and auto indentation edits\n                const indentationEdit = this._getEditFromIndentationAndSelection(config, model, indentation, selection, ch, false);\n                return new TypeWithIndentationAndAutoClosingCommand(indentationEdit, selection, ch, autoClosingPairClose);\n            }\n            else {\n                // Apply only auto indentation edits\n                const indentationEdit = this._getEditFromIndentationAndSelection(config, model, indentation, selection, ch, true);\n                return typeCommand(indentationEdit.range, indentationEdit.text, false);\n            }\n        });\n        const editOptions = { shouldPushStackElementBefore: true, shouldPushStackElementAfter: false };\n        return new EditOperationResult(4 /* EditOperationType.TypingOther */, commands, editOptions);\n    }\n    static _getEditFromIndentationAndSelection(config, model, indentation, selection, ch, includeChInEdit = true) {\n        const startLineNumber = selection.startLineNumber;\n        const firstNonWhitespaceColumn = model.getLineFirstNonWhitespaceColumn(startLineNumber);\n        let text = config.normalizeIndentation(indentation);\n        if (firstNonWhitespaceColumn !== 0) {\n            const startLine = model.getLineContent(startLineNumber);\n            text += startLine.substring(firstNonWhitespaceColumn - 1, selection.startColumn - 1);\n        }\n        text += includeChInEdit ? ch : '';\n        const range = new Range(startLineNumber, 1, selection.endLineNumber, selection.endColumn);\n        return { range, text };\n    }\n}\nclass AutoClosingOvertypeOperation {\n    static getEdits(prevEditOperationType, config, model, selections, autoClosedCharacters, ch) {\n        if (isAutoClosingOvertype(config, model, selections, autoClosedCharacters, ch)) {\n            return this._runAutoClosingOvertype(prevEditOperationType, selections, ch);\n        }\n        return;\n    }\n    static _runAutoClosingOvertype(prevEditOperationType, selections, ch) {\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const selection = selections[i];\n            const position = selection.getPosition();\n            const typeSelection = new Range(position.lineNumber, position.column, position.lineNumber, position.column + 1);\n            commands[i] = new ReplaceCommand(typeSelection, ch);\n        }\n        return new EditOperationResult(4 /* EditOperationType.TypingOther */, commands, {\n            shouldPushStackElementBefore: shouldPushStackElementBetween(prevEditOperationType, 4 /* EditOperationType.TypingOther */),\n            shouldPushStackElementAfter: false\n        });\n    }\n}\nclass AutoClosingOvertypeWithInterceptorsOperation {\n    static getEdits(config, model, selections, autoClosedCharacters, ch) {\n        if (isAutoClosingOvertype(config, model, selections, autoClosedCharacters, ch)) {\n            // Unfortunately, the close character is at this point \"doubled\", so we need to delete it...\n            const commands = selections.map(s => new ReplaceCommand(new Range(s.positionLineNumber, s.positionColumn, s.positionLineNumber, s.positionColumn + 1), '', false));\n            return new EditOperationResult(4 /* EditOperationType.TypingOther */, commands, {\n                shouldPushStackElementBefore: true,\n                shouldPushStackElementAfter: false\n            });\n        }\n        return;\n    }\n}\nclass AutoClosingOpenCharTypeOperation {\n    static getEdits(config, model, selections, ch, chIsAlreadyTyped, isDoingComposition) {\n        if (!isDoingComposition) {\n            const autoClosingPairClose = this.getAutoClosingPairClose(config, model, selections, ch, chIsAlreadyTyped);\n            if (autoClosingPairClose !== null) {\n                return this._runAutoClosingOpenCharType(selections, ch, chIsAlreadyTyped, autoClosingPairClose);\n            }\n        }\n        return;\n    }\n    static _runAutoClosingOpenCharType(selections, ch, chIsAlreadyTyped, autoClosingPairClose) {\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const selection = selections[i];\n            commands[i] = new TypeWithAutoClosingCommand(selection, ch, !chIsAlreadyTyped, autoClosingPairClose);\n        }\n        return new EditOperationResult(4 /* EditOperationType.TypingOther */, commands, {\n            shouldPushStackElementBefore: true,\n            shouldPushStackElementAfter: false\n        });\n    }\n    static getAutoClosingPairClose(config, model, selections, ch, chIsAlreadyTyped) {\n        for (const selection of selections) {\n            if (!selection.isEmpty()) {\n                return null;\n            }\n        }\n        // This method is called both when typing (regularly) and when composition ends\n        // This means that we need to work with a text buffer where sometimes `ch` is not\n        // there (it is being typed right now) or with a text buffer where `ch` has already been typed\n        //\n        // In order to avoid adding checks for `chIsAlreadyTyped` in all places, we will work\n        // with two conceptual positions, the position before `ch` and the position after `ch`\n        //\n        const positions = selections.map((s) => {\n            const position = s.getPosition();\n            if (chIsAlreadyTyped) {\n                return { lineNumber: position.lineNumber, beforeColumn: position.column - ch.length, afterColumn: position.column };\n            }\n            else {\n                return { lineNumber: position.lineNumber, beforeColumn: position.column, afterColumn: position.column };\n            }\n        });\n        // Find the longest auto-closing open pair in case of multiple ending in `ch`\n        // e.g. when having [f\",\"] and [\",\"], it picks [f\",\"] if the character before is f\n        const pair = this._findAutoClosingPairOpen(config, model, positions.map(p => new Position(p.lineNumber, p.beforeColumn)), ch);\n        if (!pair) {\n            return null;\n        }\n        let autoCloseConfig;\n        let shouldAutoCloseBefore;\n        const chIsQuote = isQuote(ch);\n        if (chIsQuote) {\n            autoCloseConfig = config.autoClosingQuotes;\n            shouldAutoCloseBefore = config.shouldAutoCloseBefore.quote;\n        }\n        else {\n            const pairIsForComments = config.blockCommentStartToken ? pair.open.includes(config.blockCommentStartToken) : false;\n            if (pairIsForComments) {\n                autoCloseConfig = config.autoClosingComments;\n                shouldAutoCloseBefore = config.shouldAutoCloseBefore.comment;\n            }\n            else {\n                autoCloseConfig = config.autoClosingBrackets;\n                shouldAutoCloseBefore = config.shouldAutoCloseBefore.bracket;\n            }\n        }\n        if (autoCloseConfig === 'never') {\n            return null;\n        }\n        // Sometimes, it is possible to have two auto-closing pairs that have a containment relationship\n        // e.g. when having [(,)] and [(*,*)]\n        // - when typing (, the resulting state is (|)\n        // - when typing *, the desired resulting state is (*|*), not (*|*))\n        const containedPair = this._findContainedAutoClosingPair(config, pair);\n        const containedPairClose = containedPair ? containedPair.close : '';\n        let isContainedPairPresent = true;\n        for (const position of positions) {\n            const { lineNumber, beforeColumn, afterColumn } = position;\n            const lineText = model.getLineContent(lineNumber);\n            const lineBefore = lineText.substring(0, beforeColumn - 1);\n            const lineAfter = lineText.substring(afterColumn - 1);\n            if (!lineAfter.startsWith(containedPairClose)) {\n                isContainedPairPresent = false;\n            }\n            // Only consider auto closing the pair if an allowed character follows or if another autoclosed pair closing brace follows\n            if (lineAfter.length > 0) {\n                const characterAfter = lineAfter.charAt(0);\n                const isBeforeCloseBrace = this._isBeforeClosingBrace(config, lineAfter);\n                if (!isBeforeCloseBrace && !shouldAutoCloseBefore(characterAfter)) {\n                    return null;\n                }\n            }\n            // Do not auto-close ' or \" after a word character\n            if (pair.open.length === 1 && (ch === '\\'' || ch === '\"') && autoCloseConfig !== 'always') {\n                const wordSeparators = getMapForWordSeparators(config.wordSeparators, []);\n                if (lineBefore.length > 0) {\n                    const characterBefore = lineBefore.charCodeAt(lineBefore.length - 1);\n                    if (wordSeparators.get(characterBefore) === 0 /* WordCharacterClass.Regular */) {\n                        return null;\n                    }\n                }\n            }\n            if (!model.tokenization.isCheapToTokenize(lineNumber)) {\n                // Do not force tokenization\n                return null;\n            }\n            model.tokenization.forceTokenization(lineNumber);\n            const lineTokens = model.tokenization.getLineTokens(lineNumber);\n            const scopedLineTokens = createScopedLineTokens(lineTokens, beforeColumn - 1);\n            if (!pair.shouldAutoClose(scopedLineTokens, beforeColumn - scopedLineTokens.firstCharOffset)) {\n                return null;\n            }\n            // Typing for example a quote could either start a new string, in which case auto-closing is desirable\n            // or it could end a previously started string, in which case auto-closing is not desirable\n            //\n            // In certain cases, it is really not possible to look at the previous token to determine\n            // what would happen. That's why we do something really unusual, we pretend to type a different\n            // character and ask the tokenizer what the outcome of doing that is: after typing a neutral\n            // character, are we in a string (i.e. the quote would most likely end a string) or not?\n            //\n            const neutralCharacter = pair.findNeutralCharacter();\n            if (neutralCharacter) {\n                const tokenType = model.tokenization.getTokenTypeIfInsertingCharacter(lineNumber, beforeColumn, neutralCharacter);\n                if (!pair.isOK(tokenType)) {\n                    return null;\n                }\n            }\n        }\n        if (isContainedPairPresent) {\n            return pair.close.substring(0, pair.close.length - containedPairClose.length);\n        }\n        else {\n            return pair.close;\n        }\n    }\n    /**\n     * Find another auto-closing pair that is contained by the one passed in.\n     *\n     * e.g. when having [(,)] and [(*,*)] as auto-closing pairs\n     * this method will find [(,)] as a containment pair for [(*,*)]\n     */\n    static _findContainedAutoClosingPair(config, pair) {\n        if (pair.open.length <= 1) {\n            return null;\n        }\n        const lastChar = pair.close.charAt(pair.close.length - 1);\n        // get candidates with the same last character as close\n        const candidates = config.autoClosingPairs.autoClosingPairsCloseByEnd.get(lastChar) || [];\n        let result = null;\n        for (const candidate of candidates) {\n            if (candidate.open !== pair.open && pair.open.includes(candidate.open) && pair.close.endsWith(candidate.close)) {\n                if (!result || candidate.open.length > result.open.length) {\n                    result = candidate;\n                }\n            }\n        }\n        return result;\n    }\n    /**\n     * Determine if typing `ch` at all `positions` in the `model` results in an\n     * auto closing open sequence being typed.\n     *\n     * Auto closing open sequences can consist of multiple characters, which\n     * can lead to ambiguities. In such a case, the longest auto-closing open\n     * sequence is returned.\n     */\n    static _findAutoClosingPairOpen(config, model, positions, ch) {\n        const candidates = config.autoClosingPairs.autoClosingPairsOpenByEnd.get(ch);\n        if (!candidates) {\n            return null;\n        }\n        // Determine which auto-closing pair it is\n        let result = null;\n        for (const candidate of candidates) {\n            if (result === null || candidate.open.length > result.open.length) {\n                let candidateIsMatch = true;\n                for (const position of positions) {\n                    const relevantText = model.getValueInRange(new Range(position.lineNumber, position.column - candidate.open.length + 1, position.lineNumber, position.column));\n                    if (relevantText + ch !== candidate.open) {\n                        candidateIsMatch = false;\n                        break;\n                    }\n                }\n                if (candidateIsMatch) {\n                    result = candidate;\n                }\n            }\n        }\n        return result;\n    }\n    static _isBeforeClosingBrace(config, lineAfter) {\n        // If the start of lineAfter can be interpretted as both a starting or ending brace, default to returning false\n        const nextChar = lineAfter.charAt(0);\n        const potentialStartingBraces = config.autoClosingPairs.autoClosingPairsOpenByStart.get(nextChar) || [];\n        const potentialClosingBraces = config.autoClosingPairs.autoClosingPairsCloseByStart.get(nextChar) || [];\n        const isBeforeStartingBrace = potentialStartingBraces.some(x => lineAfter.startsWith(x.open));\n        const isBeforeClosingBrace = potentialClosingBraces.some(x => lineAfter.startsWith(x.close));\n        return !isBeforeStartingBrace && isBeforeClosingBrace;\n    }\n}\nclass CompositionEndOvertypeOperation {\n    static getEdits(config, compositions) {\n        const isOvertypeMode = config.inputMode === 'overtype';\n        if (!isOvertypeMode) {\n            return null;\n        }\n        const commands = compositions.map(composition => new ReplaceOvertypeCommandOnCompositionEnd(composition.insertedTextRange));\n        return new EditOperationResult(4 /* EditOperationType.TypingOther */, commands, {\n            shouldPushStackElementBefore: true,\n            shouldPushStackElementAfter: false\n        });\n    }\n}\nclass SurroundSelectionOperation {\n    static getEdits(config, model, selections, ch, isDoingComposition) {\n        if (!isDoingComposition && this._isSurroundSelectionType(config, model, selections, ch)) {\n            return this._runSurroundSelectionType(config, selections, ch);\n        }\n        return;\n    }\n    static _runSurroundSelectionType(config, selections, ch) {\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const selection = selections[i];\n            const closeCharacter = config.surroundingPairs[ch];\n            commands[i] = new SurroundSelectionCommand(selection, ch, closeCharacter);\n        }\n        return new EditOperationResult(0 /* EditOperationType.Other */, commands, {\n            shouldPushStackElementBefore: true,\n            shouldPushStackElementAfter: true\n        });\n    }\n    static _isSurroundSelectionType(config, model, selections, ch) {\n        if (!shouldSurroundChar(config, ch) || !config.surroundingPairs.hasOwnProperty(ch)) {\n            return false;\n        }\n        const isTypingAQuoteCharacter = isQuote(ch);\n        for (const selection of selections) {\n            if (selection.isEmpty()) {\n                return false;\n            }\n            let selectionContainsOnlyWhitespace = true;\n            for (let lineNumber = selection.startLineNumber; lineNumber <= selection.endLineNumber; lineNumber++) {\n                const lineText = model.getLineContent(lineNumber);\n                const startIndex = (lineNumber === selection.startLineNumber ? selection.startColumn - 1 : 0);\n                const endIndex = (lineNumber === selection.endLineNumber ? selection.endColumn - 1 : lineText.length);\n                const selectedText = lineText.substring(startIndex, endIndex);\n                if (/[^ \\t]/.test(selectedText)) {\n                    // this selected text contains something other than whitespace\n                    selectionContainsOnlyWhitespace = false;\n                    break;\n                }\n            }\n            if (selectionContainsOnlyWhitespace) {\n                return false;\n            }\n            if (isTypingAQuoteCharacter && selection.startLineNumber === selection.endLineNumber && selection.startColumn + 1 === selection.endColumn) {\n                const selectionText = model.getValueInRange(selection);\n                if (isQuote(selectionText)) {\n                    // Typing a quote character on top of another quote character\n                    // => disable surround selection type\n                    return false;\n                }\n            }\n        }\n        return true;\n    }\n}\nclass InterceptorElectricCharOperation {\n    static getEdits(prevEditOperationType, config, model, selections, ch, isDoingComposition) {\n        // Electric characters make sense only when dealing with a single cursor,\n        // as multiple cursors typing brackets for example would interfer with bracket matching\n        if (!isDoingComposition && this._isTypeInterceptorElectricChar(config, model, selections)) {\n            const r = this._typeInterceptorElectricChar(prevEditOperationType, config, model, selections[0], ch);\n            if (r) {\n                return r;\n            }\n        }\n        return;\n    }\n    static _isTypeInterceptorElectricChar(config, model, selections) {\n        if (selections.length === 1 && model.tokenization.isCheapToTokenize(selections[0].getEndPosition().lineNumber)) {\n            return true;\n        }\n        return false;\n    }\n    static _typeInterceptorElectricChar(prevEditOperationType, config, model, selection, ch) {\n        if (!config.electricChars.hasOwnProperty(ch) || !selection.isEmpty()) {\n            return null;\n        }\n        const position = selection.getPosition();\n        model.tokenization.forceTokenization(position.lineNumber);\n        const lineTokens = model.tokenization.getLineTokens(position.lineNumber);\n        let electricAction;\n        try {\n            electricAction = config.onElectricCharacter(ch, lineTokens, position.column);\n        }\n        catch (e) {\n            onUnexpectedError(e);\n            return null;\n        }\n        if (!electricAction) {\n            return null;\n        }\n        if (electricAction.matchOpenBracket) {\n            const endColumn = (lineTokens.getLineContent() + ch).lastIndexOf(electricAction.matchOpenBracket) + 1;\n            const match = model.bracketPairs.findMatchingBracketUp(electricAction.matchOpenBracket, {\n                lineNumber: position.lineNumber,\n                column: endColumn\n            }, 500 /* give at most 500ms to compute */);\n            if (match) {\n                if (match.startLineNumber === position.lineNumber) {\n                    // matched something on the same line => no change in indentation\n                    return null;\n                }\n                const matchLine = model.getLineContent(match.startLineNumber);\n                const matchLineIndentation = getLeadingWhitespace(matchLine);\n                const newIndentation = config.normalizeIndentation(matchLineIndentation);\n                const lineText = model.getLineContent(position.lineNumber);\n                const lineFirstNonBlankColumn = model.getLineFirstNonWhitespaceColumn(position.lineNumber) || position.column;\n                const prefix = lineText.substring(lineFirstNonBlankColumn - 1, position.column - 1);\n                const typeText = newIndentation + prefix + ch;\n                const typeSelection = new Range(position.lineNumber, 1, position.lineNumber, position.column);\n                const command = new ReplaceCommand(typeSelection, typeText);\n                return new EditOperationResult(getTypingOperation(typeText, prevEditOperationType), [command], {\n                    shouldPushStackElementBefore: false,\n                    shouldPushStackElementAfter: true\n                });\n            }\n        }\n        return null;\n    }\n}\nclass SimpleCharacterTypeOperation {\n    static getEdits(config, prevEditOperationType, selections, ch, isDoingComposition) {\n        // A simple character type\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const ChosenReplaceCommand = config.inputMode === 'overtype' && !isDoingComposition ? ReplaceOvertypeCommand : ReplaceCommand;\n            commands[i] = new ChosenReplaceCommand(selections[i], ch);\n        }\n        const opType = getTypingOperation(ch, prevEditOperationType);\n        return new EditOperationResult(opType, commands, {\n            shouldPushStackElementBefore: shouldPushStackElementBetween(prevEditOperationType, opType),\n            shouldPushStackElementAfter: false\n        });\n    }\n}\nclass EnterOperation {\n    static getEdits(config, model, selections, ch, isDoingComposition) {\n        if (!isDoingComposition && ch === '\\n') {\n            const commands = [];\n            for (let i = 0, len = selections.length; i < len; i++) {\n                commands[i] = this._enter(config, model, false, selections[i]);\n            }\n            return new EditOperationResult(4 /* EditOperationType.TypingOther */, commands, {\n                shouldPushStackElementBefore: true,\n                shouldPushStackElementAfter: false,\n            });\n        }\n        return;\n    }\n    static _enter(config, model, keepPosition, range) {\n        if (config.autoIndent === 0 /* EditorAutoIndentStrategy.None */) {\n            return typeCommand(range, '\\n', keepPosition);\n        }\n        if (!model.tokenization.isCheapToTokenize(range.getStartPosition().lineNumber) || config.autoIndent === 1 /* EditorAutoIndentStrategy.Keep */) {\n            const lineText = model.getLineContent(range.startLineNumber);\n            const indentation = getLeadingWhitespace(lineText).substring(0, range.startColumn - 1);\n            return typeCommand(range, '\\n' + config.normalizeIndentation(indentation), keepPosition);\n        }\n        const r = getEnterAction(config.autoIndent, model, range, config.languageConfigurationService);\n        if (r) {\n            if (r.indentAction === IndentAction.None) {\n                // Nothing special\n                return typeCommand(range, '\\n' + config.normalizeIndentation(r.indentation + r.appendText), keepPosition);\n            }\n            else if (r.indentAction === IndentAction.Indent) {\n                // Indent once\n                return typeCommand(range, '\\n' + config.normalizeIndentation(r.indentation + r.appendText), keepPosition);\n            }\n            else if (r.indentAction === IndentAction.IndentOutdent) {\n                // Ultra special\n                const normalIndent = config.normalizeIndentation(r.indentation);\n                const increasedIndent = config.normalizeIndentation(r.indentation + r.appendText);\n                const typeText = '\\n' + increasedIndent + '\\n' + normalIndent;\n                if (keepPosition) {\n                    return new ReplaceCommandWithoutChangingPosition(range, typeText, true);\n                }\n                else {\n                    return new ReplaceCommandWithOffsetCursorState(range, typeText, -1, increasedIndent.length - normalIndent.length, true);\n                }\n            }\n            else if (r.indentAction === IndentAction.Outdent) {\n                const actualIndentation = unshiftIndent(config, r.indentation);\n                return typeCommand(range, '\\n' + config.normalizeIndentation(actualIndentation + r.appendText), keepPosition);\n            }\n        }\n        const lineText = model.getLineContent(range.startLineNumber);\n        const indentation = getLeadingWhitespace(lineText).substring(0, range.startColumn - 1);\n        if (config.autoIndent >= 4 /* EditorAutoIndentStrategy.Full */) {\n            const ir = getIndentForEnter(config.autoIndent, model, range, {\n                unshiftIndent: (indent) => {\n                    return unshiftIndent(config, indent);\n                },\n                shiftIndent: (indent) => {\n                    return shiftIndent(config, indent);\n                },\n                normalizeIndentation: (indent) => {\n                    return config.normalizeIndentation(indent);\n                }\n            }, config.languageConfigurationService);\n            if (ir) {\n                let oldEndViewColumn = config.visibleColumnFromColumn(model, range.getEndPosition());\n                const oldEndColumn = range.endColumn;\n                const newLineContent = model.getLineContent(range.endLineNumber);\n                const firstNonWhitespace = firstNonWhitespaceIndex(newLineContent);\n                if (firstNonWhitespace >= 0) {\n                    range = range.setEndPosition(range.endLineNumber, Math.max(range.endColumn, firstNonWhitespace + 1));\n                }\n                else {\n                    range = range.setEndPosition(range.endLineNumber, model.getLineMaxColumn(range.endLineNumber));\n                }\n                if (keepPosition) {\n                    return new ReplaceCommandWithoutChangingPosition(range, '\\n' + config.normalizeIndentation(ir.afterEnter), true);\n                }\n                else {\n                    let offset = 0;\n                    if (oldEndColumn <= firstNonWhitespace + 1) {\n                        if (!config.insertSpaces) {\n                            oldEndViewColumn = Math.ceil(oldEndViewColumn / config.indentSize);\n                        }\n                        offset = Math.min(oldEndViewColumn + 1 - config.normalizeIndentation(ir.afterEnter).length - 1, 0);\n                    }\n                    return new ReplaceCommandWithOffsetCursorState(range, '\\n' + config.normalizeIndentation(ir.afterEnter), 0, offset, true);\n                }\n            }\n        }\n        return typeCommand(range, '\\n' + config.normalizeIndentation(indentation), keepPosition);\n    }\n    static lineInsertBefore(config, model, selections) {\n        if (model === null || selections === null) {\n            return [];\n        }\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            let lineNumber = selections[i].positionLineNumber;\n            if (lineNumber === 1) {\n                commands[i] = new ReplaceCommandWithoutChangingPosition(new Range(1, 1, 1, 1), '\\n');\n            }\n            else {\n                lineNumber--;\n                const column = model.getLineMaxColumn(lineNumber);\n                commands[i] = this._enter(config, model, false, new Range(lineNumber, column, lineNumber, column));\n            }\n        }\n        return commands;\n    }\n    static lineInsertAfter(config, model, selections) {\n        if (model === null || selections === null) {\n            return [];\n        }\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const lineNumber = selections[i].positionLineNumber;\n            const column = model.getLineMaxColumn(lineNumber);\n            commands[i] = this._enter(config, model, false, new Range(lineNumber, column, lineNumber, column));\n        }\n        return commands;\n    }\n    static lineBreakInsert(config, model, selections) {\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            commands[i] = this._enter(config, model, true, selections[i]);\n        }\n        return commands;\n    }\n}\nclass PasteOperation {\n    static getEdits(config, model, selections, text, pasteOnNewLine, multicursorText) {\n        const distributedPaste = this._distributePasteToCursors(config, selections, text, pasteOnNewLine, multicursorText);\n        if (distributedPaste) {\n            selections = selections.sort(Range.compareRangesUsingStarts);\n            return this._distributedPaste(config, model, selections, distributedPaste);\n        }\n        else {\n            return this._simplePaste(config, model, selections, text, pasteOnNewLine);\n        }\n    }\n    static _distributePasteToCursors(config, selections, text, pasteOnNewLine, multicursorText) {\n        if (pasteOnNewLine) {\n            return null;\n        }\n        if (selections.length === 1) {\n            return null;\n        }\n        if (multicursorText && multicursorText.length === selections.length) {\n            return multicursorText;\n        }\n        if (config.multiCursorPaste === 'spread') {\n            // Try to spread the pasted text in case the line count matches the cursor count\n            // Remove trailing \\n if present\n            if (text.charCodeAt(text.length - 1) === 10 /* CharCode.LineFeed */) {\n                text = text.substring(0, text.length - 1);\n            }\n            // Remove trailing \\r if present\n            if (text.charCodeAt(text.length - 1) === 13 /* CharCode.CarriageReturn */) {\n                text = text.substring(0, text.length - 1);\n            }\n            const lines = splitLines(text);\n            if (lines.length === selections.length) {\n                return lines;\n            }\n        }\n        return null;\n    }\n    static _distributedPaste(config, model, selections, text) {\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const shouldOvertypeOnPaste = config.overtypeOnPaste && config.inputMode === 'overtype';\n            const ChosenReplaceCommand = shouldOvertypeOnPaste ? ReplaceOvertypeCommand : ReplaceCommand;\n            commands[i] = new ChosenReplaceCommand(selections[i], text[i]);\n        }\n        return new EditOperationResult(0 /* EditOperationType.Other */, commands, {\n            shouldPushStackElementBefore: true,\n            shouldPushStackElementAfter: true\n        });\n    }\n    static _simplePaste(config, model, selections, text, pasteOnNewLine) {\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const selection = selections[i];\n            const position = selection.getPosition();\n            if (pasteOnNewLine && !selection.isEmpty()) {\n                pasteOnNewLine = false;\n            }\n            if (pasteOnNewLine && text.indexOf('\\n') !== text.length - 1) {\n                pasteOnNewLine = false;\n            }\n            if (pasteOnNewLine) {\n                // Paste entire line at the beginning of line\n                const typeSelection = new Range(position.lineNumber, 1, position.lineNumber, 1);\n                commands[i] = new ReplaceCommandThatPreservesSelection(typeSelection, text, selection, true);\n            }\n            else {\n                const shouldOvertypeOnPaste = config.overtypeOnPaste && config.inputMode === 'overtype';\n                const ChosenReplaceCommand = shouldOvertypeOnPaste ? ReplaceOvertypeCommand : ReplaceCommand;\n                commands[i] = new ChosenReplaceCommand(selection, text);\n            }\n        }\n        return new EditOperationResult(0 /* EditOperationType.Other */, commands, {\n            shouldPushStackElementBefore: true,\n            shouldPushStackElementAfter: true\n        });\n    }\n}\nclass CompositionOperation {\n    static getEdits(prevEditOperationType, config, model, selections, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta) {\n        const commands = selections.map(selection => this._compositionType(model, selection, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta));\n        return new EditOperationResult(4 /* EditOperationType.TypingOther */, commands, {\n            shouldPushStackElementBefore: shouldPushStackElementBetween(prevEditOperationType, 4 /* EditOperationType.TypingOther */),\n            shouldPushStackElementAfter: false\n        });\n    }\n    static _compositionType(model, selection, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta) {\n        if (!selection.isEmpty()) {\n            // looks like https://github.com/microsoft/vscode/issues/2773\n            // where a cursor operation occurred before a canceled composition\n            // => ignore composition\n            return null;\n        }\n        const pos = selection.getPosition();\n        const startColumn = Math.max(1, pos.column - replacePrevCharCnt);\n        const endColumn = Math.min(model.getLineMaxColumn(pos.lineNumber), pos.column + replaceNextCharCnt);\n        const range = new Range(pos.lineNumber, startColumn, pos.lineNumber, endColumn);\n        return new ReplaceCommandWithOffsetCursorState(range, text, 0, positionDelta);\n    }\n}\nclass TypeWithoutInterceptorsOperation {\n    static getEdits(prevEditOperationType, selections, str) {\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            commands[i] = new ReplaceCommand(selections[i], str);\n        }\n        const opType = getTypingOperation(str, prevEditOperationType);\n        return new EditOperationResult(opType, commands, {\n            shouldPushStackElementBefore: shouldPushStackElementBetween(prevEditOperationType, opType),\n            shouldPushStackElementAfter: false\n        });\n    }\n}\nclass TabOperation {\n    static getCommands(config, model, selections) {\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const selection = selections[i];\n            if (selection.isEmpty()) {\n                const lineText = model.getLineContent(selection.startLineNumber);\n                if (/^\\s*$/.test(lineText) && model.tokenization.isCheapToTokenize(selection.startLineNumber)) {\n                    let goodIndent = this._goodIndentForLine(config, model, selection.startLineNumber);\n                    goodIndent = goodIndent || '\\t';\n                    const possibleTypeText = config.normalizeIndentation(goodIndent);\n                    if (!lineText.startsWith(possibleTypeText)) {\n                        commands[i] = new ReplaceCommand(new Range(selection.startLineNumber, 1, selection.startLineNumber, lineText.length + 1), possibleTypeText, true);\n                        continue;\n                    }\n                }\n                commands[i] = this._replaceJumpToNextIndent(config, model, selection, true);\n            }\n            else {\n                if (selection.startLineNumber === selection.endLineNumber) {\n                    const lineMaxColumn = model.getLineMaxColumn(selection.startLineNumber);\n                    if (selection.startColumn !== 1 || selection.endColumn !== lineMaxColumn) {\n                        // This is a single line selection that is not the entire line\n                        commands[i] = this._replaceJumpToNextIndent(config, model, selection, false);\n                        continue;\n                    }\n                }\n                commands[i] = new ShiftCommand(selection, {\n                    isUnshift: false,\n                    tabSize: config.tabSize,\n                    indentSize: config.indentSize,\n                    insertSpaces: config.insertSpaces,\n                    useTabStops: config.useTabStops,\n                    autoIndent: config.autoIndent\n                }, config.languageConfigurationService);\n            }\n        }\n        return commands;\n    }\n    static _goodIndentForLine(config, model, lineNumber) {\n        let action = null;\n        let indentation = '';\n        const expectedIndentAction = getInheritIndentForLine(config.autoIndent, model, lineNumber, false, config.languageConfigurationService);\n        if (expectedIndentAction) {\n            action = expectedIndentAction.action;\n            indentation = expectedIndentAction.indentation;\n        }\n        else if (lineNumber > 1) {\n            let lastLineNumber;\n            for (lastLineNumber = lineNumber - 1; lastLineNumber >= 1; lastLineNumber--) {\n                const lineText = model.getLineContent(lastLineNumber);\n                const nonWhitespaceIdx = lastNonWhitespaceIndex(lineText);\n                if (nonWhitespaceIdx >= 0) {\n                    break;\n                }\n            }\n            if (lastLineNumber < 1) {\n                // No previous line with content found\n                return null;\n            }\n            const maxColumn = model.getLineMaxColumn(lastLineNumber);\n            const expectedEnterAction = getEnterAction(config.autoIndent, model, new Range(lastLineNumber, maxColumn, lastLineNumber, maxColumn), config.languageConfigurationService);\n            if (expectedEnterAction) {\n                indentation = expectedEnterAction.indentation + expectedEnterAction.appendText;\n            }\n        }\n        if (action) {\n            if (action === IndentAction.Indent) {\n                indentation = shiftIndent(config, indentation);\n            }\n            if (action === IndentAction.Outdent) {\n                indentation = unshiftIndent(config, indentation);\n            }\n            indentation = config.normalizeIndentation(indentation);\n        }\n        if (!indentation) {\n            return null;\n        }\n        return indentation;\n    }\n    static _replaceJumpToNextIndent(config, model, selection, insertsAutoWhitespace) {\n        let typeText = '';\n        const position = selection.getStartPosition();\n        if (config.insertSpaces) {\n            const visibleColumnFromColumn = config.visibleColumnFromColumn(model, position);\n            const indentSize = config.indentSize;\n            const spacesCnt = indentSize - (visibleColumnFromColumn % indentSize);\n            for (let i = 0; i < spacesCnt; i++) {\n                typeText += ' ';\n            }\n        }\n        else {\n            typeText = '\\t';\n        }\n        return new ReplaceCommand(selection, typeText, insertsAutoWhitespace);\n    }\n}\nclass BaseTypeWithAutoClosingCommand extends ReplaceCommandWithOffsetCursorState {\n    constructor(selection, text, lineNumberDeltaOffset, columnDeltaOffset, openCharacter, closeCharacter) {\n        super(selection, text, lineNumberDeltaOffset, columnDeltaOffset);\n        this._openCharacter = openCharacter;\n        this._closeCharacter = closeCharacter;\n        this.closeCharacterRange = null;\n        this.enclosingRange = null;\n    }\n    _computeCursorStateWithRange(model, range, helper) {\n        this.closeCharacterRange = new Range(range.startLineNumber, range.endColumn - this._closeCharacter.length, range.endLineNumber, range.endColumn);\n        this.enclosingRange = new Range(range.startLineNumber, range.endColumn - this._openCharacter.length - this._closeCharacter.length, range.endLineNumber, range.endColumn);\n        return super.computeCursorState(model, helper);\n    }\n}\nclass TypeWithAutoClosingCommand extends BaseTypeWithAutoClosingCommand {\n    constructor(selection, openCharacter, insertOpenCharacter, closeCharacter) {\n        const text = (insertOpenCharacter ? openCharacter : '') + closeCharacter;\n        const lineNumberDeltaOffset = 0;\n        const columnDeltaOffset = -closeCharacter.length;\n        super(selection, text, lineNumberDeltaOffset, columnDeltaOffset, openCharacter, closeCharacter);\n    }\n    computeCursorState(model, helper) {\n        const inverseEditOperations = helper.getInverseEditOperations();\n        const range = inverseEditOperations[0].range;\n        return this._computeCursorStateWithRange(model, range, helper);\n    }\n}\nclass TypeWithIndentationAndAutoClosingCommand extends BaseTypeWithAutoClosingCommand {\n    constructor(autoIndentationEdit, selection, openCharacter, closeCharacter) {\n        const text = openCharacter + closeCharacter;\n        const lineNumberDeltaOffset = 0;\n        const columnDeltaOffset = openCharacter.length;\n        super(selection, text, lineNumberDeltaOffset, columnDeltaOffset, openCharacter, closeCharacter);\n        this._autoIndentationEdit = autoIndentationEdit;\n        this._autoClosingEdit = { range: selection, text };\n    }\n    getEditOperations(model, builder) {\n        builder.addTrackedEditOperation(this._autoIndentationEdit.range, this._autoIndentationEdit.text);\n        builder.addTrackedEditOperation(this._autoClosingEdit.range, this._autoClosingEdit.text);\n    }\n    computeCursorState(model, helper) {\n        const inverseEditOperations = helper.getInverseEditOperations();\n        if (inverseEditOperations.length !== 2) {\n            throw new Error('There should be two inverse edit operations!');\n        }\n        const range1 = inverseEditOperations[0].range;\n        const range2 = inverseEditOperations[1].range;\n        const range = range1.plusRange(range2);\n        return this._computeCursorStateWithRange(model, range, helper);\n    }\n}\nfunction getTypingOperation(typedText, previousTypingOperation) {\n    if (typedText === ' ') {\n        return previousTypingOperation === 5 /* EditOperationType.TypingFirstSpace */\n            || previousTypingOperation === 6 /* EditOperationType.TypingConsecutiveSpace */\n            ? 6 /* EditOperationType.TypingConsecutiveSpace */\n            : 5 /* EditOperationType.TypingFirstSpace */;\n    }\n    return 4 /* EditOperationType.TypingOther */;\n}\nfunction shouldPushStackElementBetween(previousTypingOperation, typingOperation) {\n    if (isTypingOperation(previousTypingOperation) && !isTypingOperation(typingOperation)) {\n        // Always set an undo stop before non-type operations\n        return true;\n    }\n    if (previousTypingOperation === 5 /* EditOperationType.TypingFirstSpace */) {\n        // `abc |d`: No undo stop\n        // `abc  |d`: Undo stop\n        return false;\n    }\n    // Insert undo stop between different operation types\n    return normalizeOperationType(previousTypingOperation) !== normalizeOperationType(typingOperation);\n}\nfunction normalizeOperationType(type) {\n    return (type === 6 /* EditOperationType.TypingConsecutiveSpace */ || type === 5 /* EditOperationType.TypingFirstSpace */)\n        ? 'space'\n        : type;\n}\nfunction isTypingOperation(type) {\n    return type === 4 /* EditOperationType.TypingOther */\n        || type === 5 /* EditOperationType.TypingFirstSpace */\n        || type === 6 /* EditOperationType.TypingConsecutiveSpace */;\n}\nfunction isAutoClosingOvertype(config, model, selections, autoClosedCharacters, ch) {\n    if (config.autoClosingOvertype === 'never') {\n        return false;\n    }\n    if (!config.autoClosingPairs.autoClosingPairsCloseSingleChar.has(ch)) {\n        return false;\n    }\n    for (let i = 0, len = selections.length; i < len; i++) {\n        const selection = selections[i];\n        if (!selection.isEmpty()) {\n            return false;\n        }\n        const position = selection.getPosition();\n        const lineText = model.getLineContent(position.lineNumber);\n        const afterCharacter = lineText.charAt(position.column - 1);\n        if (afterCharacter !== ch) {\n            return false;\n        }\n        // Do not over-type quotes after a backslash\n        const chIsQuote = isQuote(ch);\n        const beforeCharacter = position.column > 2 ? lineText.charCodeAt(position.column - 2) : 0 /* CharCode.Null */;\n        if (beforeCharacter === 92 /* CharCode.Backslash */ && chIsQuote) {\n            return false;\n        }\n        // Must over-type a closing character typed by the editor\n        if (config.autoClosingOvertype === 'auto') {\n            let found = false;\n            for (let j = 0, lenJ = autoClosedCharacters.length; j < lenJ; j++) {\n                const autoClosedCharacter = autoClosedCharacters[j];\n                if (position.lineNumber === autoClosedCharacter.startLineNumber && position.column === autoClosedCharacter.startColumn) {\n                    found = true;\n                    break;\n                }\n            }\n            if (!found) {\n                return false;\n            }\n        }\n    }\n    return true;\n}\nfunction typeCommand(range, text, keepPosition) {\n    if (keepPosition) {\n        return new ReplaceCommandWithoutChangingPosition(range, text, true);\n    }\n    else {\n        return new ReplaceCommand(range, text, true);\n    }\n}\nfunction shiftIndent(config, indentation, count) {\n    count = count || 1;\n    return ShiftCommand.shiftIndent(indentation, indentation.length + count, config.tabSize, config.indentSize, config.insertSpaces);\n}\nfunction unshiftIndent(config, indentation, count) {\n    count = count || 1;\n    return ShiftCommand.unshiftIndent(indentation, indentation.length + count, config.tabSize, config.indentSize, config.insertSpaces);\n}\nfunction shouldSurroundChar(config, ch) {\n    if (isQuote(ch)) {\n        return (config.autoSurround === 'quotes' || config.autoSurround === 'languageDefined');\n    }\n    else {\n        // Character is a bracket\n        return (config.autoSurround === 'brackets' || config.autoSurround === 'languageDefined');\n    }\n}\n\nexport { AutoClosingOpenCharTypeOperation, AutoClosingOvertypeOperation, AutoClosingOvertypeWithInterceptorsOperation, AutoIndentOperation, BaseTypeWithAutoClosingCommand, CompositionEndOvertypeOperation, CompositionOperation, EnterOperation, InterceptorElectricCharOperation, PasteOperation, SimpleCharacterTypeOperation, SurroundSelectionOperation, TabOperation, TypeWithoutInterceptorsOperation, shiftIndent, shouldSurroundChar, unshiftIndent };\n","import { ShiftCommand } from '../commands/shiftCommand.js';\nimport { CompositionSurroundSelectionCommand } from '../commands/surroundSelectionCommand.js';\nimport { isQuote, EditOperationResult } from '../cursorCommon.js';\nimport { PasteOperation, TabOperation, CompositionOperation, CompositionEndOvertypeOperation, shouldSurroundChar, AutoClosingOvertypeWithInterceptorsOperation, AutoClosingOpenCharTypeOperation, EnterOperation, AutoIndentOperation, AutoClosingOvertypeOperation, SurroundSelectionOperation, InterceptorElectricCharOperation, SimpleCharacterTypeOperation, TypeWithoutInterceptorsOperation } from './cursorTypeEditOperations.js';\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 *--------------------------------------------------------------------------------------------*/\nclass TypeOperations {\n    static indent(config, model, selections) {\n        if (model === null || selections === null) {\n            return [];\n        }\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            commands[i] = new ShiftCommand(selections[i], {\n                isUnshift: false,\n                tabSize: config.tabSize,\n                indentSize: config.indentSize,\n                insertSpaces: config.insertSpaces,\n                useTabStops: config.useTabStops,\n                autoIndent: config.autoIndent\n            }, config.languageConfigurationService);\n        }\n        return commands;\n    }\n    static outdent(config, model, selections) {\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            commands[i] = new ShiftCommand(selections[i], {\n                isUnshift: true,\n                tabSize: config.tabSize,\n                indentSize: config.indentSize,\n                insertSpaces: config.insertSpaces,\n                useTabStops: config.useTabStops,\n                autoIndent: config.autoIndent\n            }, config.languageConfigurationService);\n        }\n        return commands;\n    }\n    static paste(config, model, selections, text, pasteOnNewLine, multicursorText) {\n        return PasteOperation.getEdits(config, model, selections, text, pasteOnNewLine, multicursorText);\n    }\n    static tab(config, model, selections) {\n        return TabOperation.getCommands(config, model, selections);\n    }\n    static compositionType(prevEditOperationType, config, model, selections, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta) {\n        return CompositionOperation.getEdits(prevEditOperationType, config, model, selections, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta);\n    }\n    /**\n     * This is very similar with typing, but the character is already in the text buffer!\n     */\n    static compositionEndWithInterceptors(prevEditOperationType, config, model, compositions, selections, autoClosedCharacters) {\n        if (!compositions) {\n            // could not deduce what the composition did\n            return null;\n        }\n        let insertedText = null;\n        for (const composition of compositions) {\n            if (insertedText === null) {\n                insertedText = composition.insertedText;\n            }\n            else if (insertedText !== composition.insertedText) {\n                // not all selections agree on what was typed\n                return null;\n            }\n        }\n        if (!insertedText || insertedText.length !== 1) {\n            // we're only interested in the case where a single character was inserted\n            return CompositionEndOvertypeOperation.getEdits(config, compositions);\n        }\n        const ch = insertedText;\n        let hasDeletion = false;\n        for (const composition of compositions) {\n            if (composition.deletedText.length !== 0) {\n                hasDeletion = true;\n                break;\n            }\n        }\n        if (hasDeletion) {\n            // Check if this could have been a surround selection\n            if (!shouldSurroundChar(config, ch) || !config.surroundingPairs.hasOwnProperty(ch)) {\n                return null;\n            }\n            const isTypingAQuoteCharacter = isQuote(ch);\n            for (const composition of compositions) {\n                if (composition.deletedSelectionStart !== 0 || composition.deletedSelectionEnd !== composition.deletedText.length) {\n                    // more text was deleted than was selected, so this could not have been a surround selection\n                    return null;\n                }\n                if (/^[ \\t]+$/.test(composition.deletedText)) {\n                    // deleted text was only whitespace\n                    return null;\n                }\n                if (isTypingAQuoteCharacter && isQuote(composition.deletedText)) {\n                    // deleted text was a quote\n                    return null;\n                }\n            }\n            const positions = [];\n            for (const selection of selections) {\n                if (!selection.isEmpty()) {\n                    return null;\n                }\n                positions.push(selection.getPosition());\n            }\n            if (positions.length !== compositions.length) {\n                return null;\n            }\n            const commands = [];\n            for (let i = 0, len = positions.length; i < len; i++) {\n                commands.push(new CompositionSurroundSelectionCommand(positions[i], compositions[i].deletedText, config.surroundingPairs[ch]));\n            }\n            return new EditOperationResult(4 /* EditOperationType.TypingOther */, commands, {\n                shouldPushStackElementBefore: true,\n                shouldPushStackElementAfter: false\n            });\n        }\n        const autoClosingOvertypeEdits = AutoClosingOvertypeWithInterceptorsOperation.getEdits(config, model, selections, autoClosedCharacters, ch);\n        if (autoClosingOvertypeEdits !== undefined) {\n            return autoClosingOvertypeEdits;\n        }\n        const autoClosingOpenCharEdits = AutoClosingOpenCharTypeOperation.getEdits(config, model, selections, ch, true, false);\n        if (autoClosingOpenCharEdits !== undefined) {\n            return autoClosingOpenCharEdits;\n        }\n        return CompositionEndOvertypeOperation.getEdits(config, compositions);\n    }\n    static typeWithInterceptors(isDoingComposition, prevEditOperationType, config, model, selections, autoClosedCharacters, ch) {\n        const enterEdits = EnterOperation.getEdits(config, model, selections, ch, isDoingComposition);\n        if (enterEdits !== undefined) {\n            return enterEdits;\n        }\n        const autoIndentEdits = AutoIndentOperation.getEdits(config, model, selections, ch, isDoingComposition);\n        if (autoIndentEdits !== undefined) {\n            return autoIndentEdits;\n        }\n        const autoClosingOverTypeEdits = AutoClosingOvertypeOperation.getEdits(prevEditOperationType, config, model, selections, autoClosedCharacters, ch);\n        if (autoClosingOverTypeEdits !== undefined) {\n            return autoClosingOverTypeEdits;\n        }\n        const autoClosingOpenCharEdits = AutoClosingOpenCharTypeOperation.getEdits(config, model, selections, ch, false, isDoingComposition);\n        if (autoClosingOpenCharEdits !== undefined) {\n            return autoClosingOpenCharEdits;\n        }\n        const surroundSelectionEdits = SurroundSelectionOperation.getEdits(config, model, selections, ch, isDoingComposition);\n        if (surroundSelectionEdits !== undefined) {\n            return surroundSelectionEdits;\n        }\n        const interceptorElectricCharOperation = InterceptorElectricCharOperation.getEdits(prevEditOperationType, config, model, selections, ch, isDoingComposition);\n        if (interceptorElectricCharOperation !== undefined) {\n            return interceptorElectricCharOperation;\n        }\n        return SimpleCharacterTypeOperation.getEdits(config, prevEditOperationType, selections, ch, isDoingComposition);\n    }\n    static typeWithoutInterceptors(prevEditOperationType, config, model, selections, str) {\n        return TypeWithoutInterceptorsOperation.getEdits(prevEditOperationType, selections, str);\n    }\n}\nclass CompositionOutcome {\n    constructor(deletedText, deletedSelectionStart, deletedSelectionEnd, insertedText, insertedSelectionStart, insertedSelectionEnd, insertedTextRange) {\n        this.deletedText = deletedText;\n        this.deletedSelectionStart = deletedSelectionStart;\n        this.deletedSelectionEnd = deletedSelectionEnd;\n        this.insertedText = insertedText;\n        this.insertedSelectionStart = insertedSelectionStart;\n        this.insertedSelectionEnd = insertedSelectionEnd;\n        this.insertedTextRange = insertedTextRange;\n    }\n}\n\nexport { CompositionOutcome, TypeOperations };\n","import { localize } from '../../nls.js';\nimport { RawContextKey } from '../../platform/contextkey/common/contextkey.js';\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 *--------------------------------------------------------------------------------------------*/\nvar EditorContextKeys;\n(function (EditorContextKeys) {\n    EditorContextKeys.editorSimpleInput = new RawContextKey('editorSimpleInput', false, true);\n    /**\n     * A context key that is set when the editor's text has focus (cursor is blinking).\n     * Is false when focus is in simple editor widgets (repl input, scm commit input).\n     */\n    EditorContextKeys.editorTextFocus = new RawContextKey('editorTextFocus', false, localize(681, \"Whether the editor text has focus (cursor is blinking)\"));\n    /**\n     * A context key that is set when the editor's text or an editor's widget has focus.\n     */\n    EditorContextKeys.focus = new RawContextKey('editorFocus', false, localize(682, \"Whether the editor or an editor widget has focus (e.g. focus is in the find widget)\"));\n    /**\n     * A context key that is set when any editor input has focus (regular editor, repl input...).\n     */\n    EditorContextKeys.textInputFocus = new RawContextKey('textInputFocus', false, localize(683, \"Whether an editor or a rich text input has focus (cursor is blinking)\"));\n    EditorContextKeys.readOnly = new RawContextKey('editorReadonly', false, localize(684, \"Whether the editor is read-only\"));\n    EditorContextKeys.inDiffEditor = new RawContextKey('inDiffEditor', false, localize(685, \"Whether the context is a diff editor\"));\n    EditorContextKeys.isEmbeddedDiffEditor = new RawContextKey('isEmbeddedDiffEditor', false, localize(686, \"Whether the context is an embedded diff editor\"));\n    EditorContextKeys.inMultiDiffEditor = new RawContextKey('inMultiDiffEditor', false, localize(687, \"Whether the context is a multi diff editor\"));\n    EditorContextKeys.multiDiffEditorAllCollapsed = new RawContextKey('multiDiffEditorAllCollapsed', undefined, localize(688, \"Whether all files in multi diff editor are collapsed\"));\n    EditorContextKeys.hasChanges = new RawContextKey('diffEditorHasChanges', false, localize(689, \"Whether the diff editor has changes\"));\n    EditorContextKeys.comparingMovedCode = new RawContextKey('comparingMovedCode', false, localize(690, \"Whether a moved code block is selected for comparison\"));\n    EditorContextKeys.accessibleDiffViewerVisible = new RawContextKey('accessibleDiffViewerVisible', false, localize(691, \"Whether the accessible diff viewer is visible\"));\n    EditorContextKeys.diffEditorRenderSideBySideInlineBreakpointReached = new RawContextKey('diffEditorRenderSideBySideInlineBreakpointReached', false, localize(692, \"Whether the diff editor render side by side inline breakpoint is reached\"));\n    EditorContextKeys.diffEditorInlineMode = new RawContextKey('diffEditorInlineMode', false, localize(693, \"Whether inline mode is active\"));\n    EditorContextKeys.diffEditorOriginalWritable = new RawContextKey('diffEditorOriginalWritable', false, localize(694, \"Whether modified is writable in the diff editor\"));\n    EditorContextKeys.diffEditorModifiedWritable = new RawContextKey('diffEditorModifiedWritable', false, localize(695, \"Whether modified is writable in the diff editor\"));\n    EditorContextKeys.diffEditorOriginalUri = new RawContextKey('diffEditorOriginalUri', '', localize(696, \"The uri of the original document\"));\n    EditorContextKeys.diffEditorModifiedUri = new RawContextKey('diffEditorModifiedUri', '', localize(697, \"The uri of the modified document\"));\n    EditorContextKeys.columnSelection = new RawContextKey('editorColumnSelection', false, localize(698, \"Whether `editor.columnSelection` is enabled\"));\n    EditorContextKeys.writable = EditorContextKeys.readOnly.toNegated();\n    EditorContextKeys.hasNonEmptySelection = new RawContextKey('editorHasSelection', false, localize(699, \"Whether the editor has text selected\"));\n    EditorContextKeys.hasOnlyEmptySelection = EditorContextKeys.hasNonEmptySelection.toNegated();\n    EditorContextKeys.hasMultipleSelections = new RawContextKey('editorHasMultipleSelections', false, localize(700, \"Whether the editor has multiple selections\"));\n    EditorContextKeys.hasSingleSelection = EditorContextKeys.hasMultipleSelections.toNegated();\n    EditorContextKeys.tabMovesFocus = new RawContextKey('editorTabMovesFocus', false, localize(701, \"Whether `Tab` will move focus out of the editor\"));\n    EditorContextKeys.tabDoesNotMoveFocus = EditorContextKeys.tabMovesFocus.toNegated();\n    EditorContextKeys.isInEmbeddedEditor = new RawContextKey('isInEmbeddedEditor', false, true);\n    EditorContextKeys.canUndo = new RawContextKey('canUndo', false, true);\n    EditorContextKeys.canRedo = new RawContextKey('canRedo', false, true);\n    EditorContextKeys.hoverVisible = new RawContextKey('editorHoverVisible', false, localize(702, \"Whether the editor hover is visible\"));\n    EditorContextKeys.hoverFocused = new RawContextKey('editorHoverFocused', false, localize(703, \"Whether the editor hover is focused\"));\n    EditorContextKeys.stickyScrollFocused = new RawContextKey('stickyScrollFocused', false, localize(704, \"Whether the sticky scroll is focused\"));\n    EditorContextKeys.stickyScrollVisible = new RawContextKey('stickyScrollVisible', false, localize(705, \"Whether the sticky scroll is visible\"));\n    EditorContextKeys.standaloneColorPickerVisible = new RawContextKey('standaloneColorPickerVisible', false, localize(706, \"Whether the standalone color picker is visible\"));\n    EditorContextKeys.standaloneColorPickerFocused = new RawContextKey('standaloneColorPickerFocused', false, localize(707, \"Whether the standalone color picker is focused\"));\n    /**\n     * A context key that is set when an editor is part of a larger editor, like notebooks or\n     * (future) a diff editor\n     */\n    EditorContextKeys.inCompositeEditor = new RawContextKey('inCompositeEditor', undefined, localize(708, \"Whether the editor is part of a larger editor (e.g. notebooks)\"));\n    EditorContextKeys.notInCompositeEditor = EditorContextKeys.inCompositeEditor.toNegated();\n    // -- mode context keys\n    EditorContextKeys.languageId = new RawContextKey('editorLangId', '', localize(709, \"The language identifier of the editor\"));\n    EditorContextKeys.hasCompletionItemProvider = new RawContextKey('editorHasCompletionItemProvider', false, localize(710, \"Whether the editor has a completion item provider\"));\n    EditorContextKeys.hasCodeActionsProvider = new RawContextKey('editorHasCodeActionsProvider', false, localize(711, \"Whether the editor has a code actions provider\"));\n    EditorContextKeys.hasCodeLensProvider = new RawContextKey('editorHasCodeLensProvider', false, localize(712, \"Whether the editor has a code lens provider\"));\n    EditorContextKeys.hasDefinitionProvider = new RawContextKey('editorHasDefinitionProvider', false, localize(713, \"Whether the editor has a definition provider\"));\n    EditorContextKeys.hasDeclarationProvider = new RawContextKey('editorHasDeclarationProvider', false, localize(714, \"Whether the editor has a declaration provider\"));\n    EditorContextKeys.hasImplementationProvider = new RawContextKey('editorHasImplementationProvider', false, localize(715, \"Whether the editor has an implementation provider\"));\n    EditorContextKeys.hasTypeDefinitionProvider = new RawContextKey('editorHasTypeDefinitionProvider', false, localize(716, \"Whether the editor has a type definition provider\"));\n    EditorContextKeys.hasHoverProvider = new RawContextKey('editorHasHoverProvider', false, localize(717, \"Whether the editor has a hover provider\"));\n    EditorContextKeys.hasDocumentHighlightProvider = new RawContextKey('editorHasDocumentHighlightProvider', false, localize(718, \"Whether the editor has a document highlight provider\"));\n    EditorContextKeys.hasDocumentSymbolProvider = new RawContextKey('editorHasDocumentSymbolProvider', false, localize(719, \"Whether the editor has a document symbol provider\"));\n    EditorContextKeys.hasReferenceProvider = new RawContextKey('editorHasReferenceProvider', false, localize(720, \"Whether the editor has a reference provider\"));\n    EditorContextKeys.hasRenameProvider = new RawContextKey('editorHasRenameProvider', false, localize(721, \"Whether the editor has a rename provider\"));\n    EditorContextKeys.hasSignatureHelpProvider = new RawContextKey('editorHasSignatureHelpProvider', false, localize(722, \"Whether the editor has a signature help provider\"));\n    EditorContextKeys.hasInlayHintsProvider = new RawContextKey('editorHasInlayHintsProvider', false, localize(723, \"Whether the editor has an inline hints provider\"));\n    // -- mode context keys: formatting\n    EditorContextKeys.hasDocumentFormattingProvider = new RawContextKey('editorHasDocumentFormattingProvider', false, localize(724, \"Whether the editor has a document formatting provider\"));\n    EditorContextKeys.hasDocumentSelectionFormattingProvider = new RawContextKey('editorHasDocumentSelectionFormattingProvider', false, localize(725, \"Whether the editor has a document selection formatting provider\"));\n    EditorContextKeys.hasMultipleDocumentFormattingProvider = new RawContextKey('editorHasMultipleDocumentFormattingProvider', false, localize(726, \"Whether the editor has multiple document formatting providers\"));\n    EditorContextKeys.hasMultipleDocumentSelectionFormattingProvider = new RawContextKey('editorHasMultipleDocumentSelectionFormattingProvider', false, localize(727, \"Whether the editor has multiple document selection formatting providers\"));\n})(EditorContextKeys || (EditorContextKeys = {}));\n\nexport { EditorContextKeys };\n","import { localize } from '../../nls.js';\nimport { isFirefox } from '../../base/browser/browser.js';\nimport { isObject, isString, isUndefined, isNumber, isBoolean } from '../../base/common/types.js';\nimport { status } from '../../base/browser/ui/aria/aria.js';\nimport { registerEditorCommand, SelectAllCommand, UndoCommand, RedoCommand, EditorCommand, Command } from './editorExtensions.js';\nimport { ICodeEditorService } from './services/codeEditorService.js';\nimport { ColumnSelection } from '../common/cursor/cursorColumnSelection.js';\nimport { CursorState } from '../common/cursorCommon.js';\nimport { DeleteOperations } from '../common/cursor/cursorDeleteOperations.js';\nimport { CursorMoveCommands, CursorMove } from '../common/cursor/cursorMoveCommands.js';\nimport { TypeOperations } from '../common/cursor/cursorTypeOperations.js';\nimport { Position } from '../common/core/position.js';\nimport { Range } from '../common/core/range.js';\nimport { EditorContextKeys } from '../common/editorContextKeys.js';\nimport { ContextKeyExpr } from '../../platform/contextkey/common/contextkey.js';\nimport { KeybindingsRegistry } from '../../platform/keybinding/common/keybindingsRegistry.js';\nimport { getActiveElement, isEditableElement } from '../../base/browser/dom.js';\nimport { EnterOperation } from '../common/cursor/cursorTypeEditOperations.js';\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 *--------------------------------------------------------------------------------------------*/\nconst CORE_WEIGHT = 0 /* KeybindingWeight.EditorCore */;\nclass CoreEditorCommand extends EditorCommand {\n    runEditorCommand(accessor, editor, args) {\n        const viewModel = editor._getViewModel();\n        if (!viewModel) {\n            // the editor has no view => has no cursors\n            return;\n        }\n        this.runCoreEditorCommand(viewModel, args || {});\n    }\n}\nvar EditorScroll_;\n(function (EditorScroll_) {\n    const isEditorScrollArgs = function (arg) {\n        if (!isObject(arg)) {\n            return false;\n        }\n        const scrollArg = arg;\n        if (!isString(scrollArg.to)) {\n            return false;\n        }\n        if (!isUndefined(scrollArg.by) && !isString(scrollArg.by)) {\n            return false;\n        }\n        if (!isUndefined(scrollArg.value) && !isNumber(scrollArg.value)) {\n            return false;\n        }\n        if (!isUndefined(scrollArg.revealCursor) && !isBoolean(scrollArg.revealCursor)) {\n            return false;\n        }\n        return true;\n    };\n    EditorScroll_.metadata = {\n        description: 'Scroll editor in the given direction',\n        args: [\n            {\n                name: 'Editor scroll argument object',\n                description: `Property-value pairs that can be passed through this argument:\n\t\t\t\t\t* 'to': A mandatory direction value.\n\t\t\t\t\t\t\\`\\`\\`\n\t\t\t\t\t\t'up', 'down'\n\t\t\t\t\t\t\\`\\`\\`\n\t\t\t\t\t* 'by': Unit to move. Default is computed based on 'to' value.\n\t\t\t\t\t\t\\`\\`\\`\n\t\t\t\t\t\t'line', 'wrappedLine', 'page', 'halfPage', 'editor'\n\t\t\t\t\t\t\\`\\`\\`\n\t\t\t\t\t* 'value': Number of units to move. Default is '1'.\n\t\t\t\t\t* 'revealCursor': If 'true' reveals the cursor if it is outside view port.\n\t\t\t\t`,\n                constraint: isEditorScrollArgs,\n                schema: {\n                    'type': 'object',\n                    'required': ['to'],\n                    'properties': {\n                        'to': {\n                            'type': 'string',\n                            'enum': ['up', 'down']\n                        },\n                        'by': {\n                            'type': 'string',\n                            'enum': ['line', 'wrappedLine', 'page', 'halfPage', 'editor']\n                        },\n                        'value': {\n                            'type': 'number',\n                            'default': 1\n                        },\n                        'revealCursor': {\n                            'type': 'boolean',\n                        }\n                    }\n                }\n            }\n        ]\n    };\n    /**\n     * Directions in the view for editor scroll command.\n     */\n    EditorScroll_.RawDirection = {\n        Up: 'up',\n        Right: 'right',\n        Down: 'down',\n        Left: 'left'\n    };\n    /**\n     * Units for editor scroll 'by' argument\n     */\n    EditorScroll_.RawUnit = {\n        Line: 'line',\n        WrappedLine: 'wrappedLine',\n        Page: 'page',\n        HalfPage: 'halfPage',\n        Editor: 'editor',\n        Column: 'column'\n    };\n    function parse(args) {\n        let direction;\n        switch (args.to) {\n            case EditorScroll_.RawDirection.Up:\n                direction = 1 /* Direction.Up */;\n                break;\n            case EditorScroll_.RawDirection.Right:\n                direction = 2 /* Direction.Right */;\n                break;\n            case EditorScroll_.RawDirection.Down:\n                direction = 3 /* Direction.Down */;\n                break;\n            case EditorScroll_.RawDirection.Left:\n                direction = 4 /* Direction.Left */;\n                break;\n            default:\n                // Illegal arguments\n                return null;\n        }\n        let unit;\n        switch (args.by) {\n            case EditorScroll_.RawUnit.Line:\n                unit = 1 /* Unit.Line */;\n                break;\n            case EditorScroll_.RawUnit.WrappedLine:\n                unit = 2 /* Unit.WrappedLine */;\n                break;\n            case EditorScroll_.RawUnit.Page:\n                unit = 3 /* Unit.Page */;\n                break;\n            case EditorScroll_.RawUnit.HalfPage:\n                unit = 4 /* Unit.HalfPage */;\n                break;\n            case EditorScroll_.RawUnit.Editor:\n                unit = 5 /* Unit.Editor */;\n                break;\n            case EditorScroll_.RawUnit.Column:\n                unit = 6 /* Unit.Column */;\n                break;\n            default:\n                unit = 2 /* Unit.WrappedLine */;\n        }\n        const value = Math.floor(args.value || 1);\n        const revealCursor = !!args.revealCursor;\n        return {\n            direction: direction,\n            unit: unit,\n            value: value,\n            revealCursor: revealCursor,\n            select: (!!args.select)\n        };\n    }\n    EditorScroll_.parse = parse;\n})(EditorScroll_ || (EditorScroll_ = {}));\nvar RevealLine_;\n(function (RevealLine_) {\n    const isRevealLineArgs = function (arg) {\n        if (!isObject(arg)) {\n            return false;\n        }\n        const reveaLineArg = arg;\n        if (!isNumber(reveaLineArg.lineNumber) && !isString(reveaLineArg.lineNumber)) {\n            return false;\n        }\n        if (!isUndefined(reveaLineArg.at) && !isString(reveaLineArg.at)) {\n            return false;\n        }\n        return true;\n    };\n    RevealLine_.metadata = {\n        description: 'Reveal the given line at the given logical position',\n        args: [\n            {\n                name: 'Reveal line argument object',\n                description: `Property-value pairs that can be passed through this argument:\n\t\t\t\t\t* 'lineNumber': A mandatory line number value.\n\t\t\t\t\t* 'at': Logical position at which line has to be revealed.\n\t\t\t\t\t\t\\`\\`\\`\n\t\t\t\t\t\t'top', 'center', 'bottom'\n\t\t\t\t\t\t\\`\\`\\`\n\t\t\t\t`,\n                constraint: isRevealLineArgs,\n                schema: {\n                    'type': 'object',\n                    'required': ['lineNumber'],\n                    'properties': {\n                        'lineNumber': {\n                            'type': ['number', 'string'],\n                        },\n                        'at': {\n                            'type': 'string',\n                            'enum': ['top', 'center', 'bottom']\n                        }\n                    }\n                }\n            }\n        ]\n    };\n    /**\n     * Values for reveal line 'at' argument\n     */\n    RevealLine_.RawAtArgument = {\n        Top: 'top',\n        Center: 'center',\n        Bottom: 'bottom'\n    };\n})(RevealLine_ || (RevealLine_ = {}));\nclass EditorOrNativeTextInputCommand {\n    constructor(target) {\n        // 1. handle case when focus is in editor.\n        target.addImplementation(10000, 'code-editor', (accessor, args) => {\n            // Only if editor text focus (i.e. not if editor has widget focus).\n            const focusedEditor = accessor.get(ICodeEditorService).getFocusedCodeEditor();\n            if (focusedEditor && focusedEditor.hasTextFocus()) {\n                return this._runEditorCommand(accessor, focusedEditor, args);\n            }\n            return false;\n        });\n        // 2. handle case when focus is in some other `input` / `textarea`.\n        target.addImplementation(1000, 'generic-dom-input-textarea', (accessor, args) => {\n            // Only if focused on an element that allows for entering text\n            const activeElement = getActiveElement();\n            if (activeElement && isEditableElement(activeElement)) {\n                this.runDOMCommand(activeElement);\n                return true;\n            }\n            return false;\n        });\n        // 3. (default) handle case when focus is somewhere else.\n        target.addImplementation(0, 'generic-dom', (accessor, args) => {\n            // Redirecting to active editor\n            const activeEditor = accessor.get(ICodeEditorService).getActiveCodeEditor();\n            if (activeEditor) {\n                activeEditor.focus();\n                return this._runEditorCommand(accessor, activeEditor, args);\n            }\n            return false;\n        });\n    }\n    _runEditorCommand(accessor, editor, args) {\n        const result = this.runEditorCommand(accessor, editor, args);\n        if (result) {\n            return result;\n        }\n        return true;\n    }\n}\nvar CoreNavigationCommands;\n(function (CoreNavigationCommands) {\n    class BaseMoveToCommand extends CoreEditorCommand {\n        constructor(opts) {\n            super(opts);\n            this._inSelectionMode = opts.inSelectionMode;\n        }\n        runCoreEditorCommand(viewModel, args) {\n            if (!args.position) {\n                return;\n            }\n            viewModel.model.pushStackElement();\n            const cursorStateChanged = viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, [\n                CursorMoveCommands.moveTo(viewModel, viewModel.getPrimaryCursorState(), this._inSelectionMode, args.position, args.viewPosition)\n            ]);\n            if (cursorStateChanged && args.revealType !== 2 /* NavigationCommandRevealType.None */) {\n                viewModel.revealAllCursors(args.source, true, true);\n            }\n        }\n    }\n    CoreNavigationCommands.MoveTo = registerEditorCommand(new BaseMoveToCommand({\n        id: '_moveTo',\n        inSelectionMode: false,\n        precondition: undefined\n    }));\n    CoreNavigationCommands.MoveToSelect = registerEditorCommand(new BaseMoveToCommand({\n        id: '_moveToSelect',\n        inSelectionMode: true,\n        precondition: undefined\n    }));\n    class ColumnSelectCommand extends CoreEditorCommand {\n        runCoreEditorCommand(viewModel, args) {\n            viewModel.model.pushStackElement();\n            const result = this._getColumnSelectResult(viewModel, viewModel.getPrimaryCursorState(), viewModel.getCursorColumnSelectData(), args);\n            if (result === null) {\n                // invalid arguments\n                return;\n            }\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, result.viewStates.map((viewState) => CursorState.fromViewState(viewState)));\n            viewModel.setCursorColumnSelectData({\n                isReal: true,\n                fromViewLineNumber: result.fromLineNumber,\n                fromViewVisualColumn: result.fromVisualColumn,\n                toViewLineNumber: result.toLineNumber,\n                toViewVisualColumn: result.toVisualColumn\n            });\n            if (result.reversed) {\n                viewModel.revealTopMostCursor(args.source);\n            }\n            else {\n                viewModel.revealBottomMostCursor(args.source);\n            }\n        }\n    }\n    CoreNavigationCommands.ColumnSelect = registerEditorCommand(new class extends ColumnSelectCommand {\n        constructor() {\n            super({\n                id: 'columnSelect',\n                precondition: undefined\n            });\n        }\n        _getColumnSelectResult(viewModel, primary, prevColumnSelectData, args) {\n            if (typeof args.position === 'undefined' || typeof args.viewPosition === 'undefined' || typeof args.mouseColumn === 'undefined') {\n                return null;\n            }\n            // validate `args`\n            const validatedPosition = viewModel.model.validatePosition(args.position);\n            const validatedViewPosition = viewModel.coordinatesConverter.validateViewPosition(new Position(args.viewPosition.lineNumber, args.viewPosition.column), validatedPosition);\n            const fromViewLineNumber = args.doColumnSelect ? prevColumnSelectData.fromViewLineNumber : validatedViewPosition.lineNumber;\n            const fromViewVisualColumn = args.doColumnSelect ? prevColumnSelectData.fromViewVisualColumn : args.mouseColumn - 1;\n            return ColumnSelection.columnSelect(viewModel.cursorConfig, viewModel, fromViewLineNumber, fromViewVisualColumn, validatedViewPosition.lineNumber, args.mouseColumn - 1);\n        }\n    });\n    CoreNavigationCommands.CursorColumnSelectLeft = registerEditorCommand(new class extends ColumnSelectCommand {\n        constructor() {\n            super({\n                id: 'cursorColumnSelectLeft',\n                precondition: undefined,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                    primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 15 /* KeyCode.LeftArrow */,\n                    linux: { primary: 0 }\n                }\n            });\n        }\n        _getColumnSelectResult(viewModel, primary, prevColumnSelectData, args) {\n            return ColumnSelection.columnSelectLeft(viewModel.cursorConfig, viewModel, prevColumnSelectData);\n        }\n    });\n    CoreNavigationCommands.CursorColumnSelectRight = registerEditorCommand(new class extends ColumnSelectCommand {\n        constructor() {\n            super({\n                id: 'cursorColumnSelectRight',\n                precondition: undefined,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                    primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 17 /* KeyCode.RightArrow */,\n                    linux: { primary: 0 }\n                }\n            });\n        }\n        _getColumnSelectResult(viewModel, primary, prevColumnSelectData, args) {\n            return ColumnSelection.columnSelectRight(viewModel.cursorConfig, viewModel, prevColumnSelectData);\n        }\n    });\n    class ColumnSelectUpCommand extends ColumnSelectCommand {\n        constructor(opts) {\n            super(opts);\n            this._isPaged = opts.isPaged;\n        }\n        _getColumnSelectResult(viewModel, primary, prevColumnSelectData, args) {\n            return ColumnSelection.columnSelectUp(viewModel.cursorConfig, viewModel, prevColumnSelectData, this._isPaged);\n        }\n    }\n    CoreNavigationCommands.CursorColumnSelectUp = registerEditorCommand(new ColumnSelectUpCommand({\n        isPaged: false,\n        id: 'cursorColumnSelectUp',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 16 /* KeyCode.UpArrow */,\n            linux: { primary: 0 }\n        }\n    }));\n    CoreNavigationCommands.CursorColumnSelectPageUp = registerEditorCommand(new ColumnSelectUpCommand({\n        isPaged: true,\n        id: 'cursorColumnSelectPageUp',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 11 /* KeyCode.PageUp */,\n            linux: { primary: 0 }\n        }\n    }));\n    class ColumnSelectDownCommand extends ColumnSelectCommand {\n        constructor(opts) {\n            super(opts);\n            this._isPaged = opts.isPaged;\n        }\n        _getColumnSelectResult(viewModel, primary, prevColumnSelectData, args) {\n            return ColumnSelection.columnSelectDown(viewModel.cursorConfig, viewModel, prevColumnSelectData, this._isPaged);\n        }\n    }\n    CoreNavigationCommands.CursorColumnSelectDown = registerEditorCommand(new ColumnSelectDownCommand({\n        isPaged: false,\n        id: 'cursorColumnSelectDown',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 18 /* KeyCode.DownArrow */,\n            linux: { primary: 0 }\n        }\n    }));\n    CoreNavigationCommands.CursorColumnSelectPageDown = registerEditorCommand(new ColumnSelectDownCommand({\n        isPaged: true,\n        id: 'cursorColumnSelectPageDown',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 12 /* KeyCode.PageDown */,\n            linux: { primary: 0 }\n        }\n    }));\n    class CursorMoveImpl extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'cursorMove',\n                precondition: undefined,\n                metadata: CursorMove.metadata\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            const parsed = CursorMove.parse(args);\n            if (!parsed) {\n                // illegal arguments\n                return;\n            }\n            this._runCursorMove(viewModel, args.source, parsed);\n        }\n        _runCursorMove(viewModel, source, args) {\n            // If noHistory is true, use PROGRAMMATIC source to prevent adding to navigation history\n            const effectiveSource = args.noHistory ? \"api\" /* TextEditorSelectionSource.PROGRAMMATIC */ : source;\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(effectiveSource, 3 /* CursorChangeReason.Explicit */, CursorMoveImpl._move(viewModel, viewModel.getCursorStates(), args));\n            viewModel.revealAllCursors(effectiveSource, true);\n        }\n        static _move(viewModel, cursors, args) {\n            const inSelectionMode = args.select;\n            const value = args.value;\n            switch (args.direction) {\n                case 0 /* CursorMove_.Direction.Left */:\n                case 1 /* CursorMove_.Direction.Right */:\n                case 2 /* CursorMove_.Direction.Up */:\n                case 3 /* CursorMove_.Direction.Down */:\n                case 4 /* CursorMove_.Direction.PrevBlankLine */:\n                case 5 /* CursorMove_.Direction.NextBlankLine */:\n                case 6 /* CursorMove_.Direction.WrappedLineStart */:\n                case 7 /* CursorMove_.Direction.WrappedLineFirstNonWhitespaceCharacter */:\n                case 8 /* CursorMove_.Direction.WrappedLineColumnCenter */:\n                case 9 /* CursorMove_.Direction.WrappedLineEnd */:\n                case 10 /* CursorMove_.Direction.WrappedLineLastNonWhitespaceCharacter */:\n                    return CursorMoveCommands.simpleMove(viewModel, cursors, args.direction, inSelectionMode, value, args.unit);\n                case 11 /* CursorMove_.Direction.ViewPortTop */:\n                case 13 /* CursorMove_.Direction.ViewPortBottom */:\n                case 12 /* CursorMove_.Direction.ViewPortCenter */:\n                case 14 /* CursorMove_.Direction.ViewPortIfOutside */:\n                    return CursorMoveCommands.viewportMove(viewModel, cursors, args.direction, inSelectionMode, value);\n                default:\n                    return null;\n            }\n        }\n    }\n    CoreNavigationCommands.CursorMoveImpl = CursorMoveImpl;\n    CoreNavigationCommands.CursorMove = registerEditorCommand(new CursorMoveImpl());\n    class CursorMoveBasedCommand extends CoreEditorCommand {\n        constructor(opts) {\n            super(opts);\n            this._staticArgs = opts.args;\n        }\n        runCoreEditorCommand(viewModel, dynamicArgs) {\n            let args = this._staticArgs;\n            if (this._staticArgs.value === -1 /* Constants.PAGE_SIZE_MARKER */) {\n                // -1 is a marker for page size\n                args = {\n                    direction: this._staticArgs.direction,\n                    unit: this._staticArgs.unit,\n                    select: this._staticArgs.select,\n                    value: dynamicArgs.pageSize || viewModel.cursorConfig.pageSize\n                };\n            }\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(dynamicArgs.source, 3 /* CursorChangeReason.Explicit */, CursorMoveCommands.simpleMove(viewModel, viewModel.getCursorStates(), args.direction, args.select, args.value, args.unit));\n            viewModel.revealAllCursors(dynamicArgs.source, true);\n        }\n    }\n    CoreNavigationCommands.CursorLeft = registerEditorCommand(new CursorMoveBasedCommand({\n        args: {\n            direction: 0 /* CursorMove_.Direction.Left */,\n            unit: 0 /* CursorMove_.Unit.None */,\n            select: false,\n            value: 1\n        },\n        id: 'cursorLeft',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 15 /* KeyCode.LeftArrow */,\n            mac: { primary: 15 /* KeyCode.LeftArrow */, secondary: [256 /* KeyMod.WinCtrl */ | 32 /* KeyCode.KeyB */] }\n        }\n    }));\n    CoreNavigationCommands.CursorLeftSelect = registerEditorCommand(new CursorMoveBasedCommand({\n        args: {\n            direction: 0 /* CursorMove_.Direction.Left */,\n            unit: 0 /* CursorMove_.Unit.None */,\n            select: true,\n            value: 1\n        },\n        id: 'cursorLeftSelect',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 1024 /* KeyMod.Shift */ | 15 /* KeyCode.LeftArrow */\n        }\n    }));\n    CoreNavigationCommands.CursorRight = registerEditorCommand(new CursorMoveBasedCommand({\n        args: {\n            direction: 1 /* CursorMove_.Direction.Right */,\n            unit: 0 /* CursorMove_.Unit.None */,\n            select: false,\n            value: 1\n        },\n        id: 'cursorRight',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 17 /* KeyCode.RightArrow */,\n            mac: { primary: 17 /* KeyCode.RightArrow */, secondary: [256 /* KeyMod.WinCtrl */ | 36 /* KeyCode.KeyF */] }\n        }\n    }));\n    CoreNavigationCommands.CursorRightSelect = registerEditorCommand(new CursorMoveBasedCommand({\n        args: {\n            direction: 1 /* CursorMove_.Direction.Right */,\n            unit: 0 /* CursorMove_.Unit.None */,\n            select: true,\n            value: 1\n        },\n        id: 'cursorRightSelect',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 1024 /* KeyMod.Shift */ | 17 /* KeyCode.RightArrow */\n        }\n    }));\n    CoreNavigationCommands.CursorUp = registerEditorCommand(new CursorMoveBasedCommand({\n        args: {\n            direction: 2 /* CursorMove_.Direction.Up */,\n            unit: 2 /* CursorMove_.Unit.WrappedLine */,\n            select: false,\n            value: 1\n        },\n        id: 'cursorUp',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 16 /* KeyCode.UpArrow */,\n            mac: { primary: 16 /* KeyCode.UpArrow */, secondary: [256 /* KeyMod.WinCtrl */ | 46 /* KeyCode.KeyP */] }\n        }\n    }));\n    CoreNavigationCommands.CursorUpSelect = registerEditorCommand(new CursorMoveBasedCommand({\n        args: {\n            direction: 2 /* CursorMove_.Direction.Up */,\n            unit: 2 /* CursorMove_.Unit.WrappedLine */,\n            select: true,\n            value: 1\n        },\n        id: 'cursorUpSelect',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 1024 /* KeyMod.Shift */ | 16 /* KeyCode.UpArrow */,\n            secondary: [2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 16 /* KeyCode.UpArrow */],\n            mac: { primary: 1024 /* KeyMod.Shift */ | 16 /* KeyCode.UpArrow */ },\n            linux: { primary: 1024 /* KeyMod.Shift */ | 16 /* KeyCode.UpArrow */ }\n        }\n    }));\n    CoreNavigationCommands.CursorPageUp = registerEditorCommand(new CursorMoveBasedCommand({\n        args: {\n            direction: 2 /* CursorMove_.Direction.Up */,\n            unit: 2 /* CursorMove_.Unit.WrappedLine */,\n            select: false,\n            value: -1 /* Constants.PAGE_SIZE_MARKER */\n        },\n        id: 'cursorPageUp',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 11 /* KeyCode.PageUp */\n        }\n    }));\n    CoreNavigationCommands.CursorPageUpSelect = registerEditorCommand(new CursorMoveBasedCommand({\n        args: {\n            direction: 2 /* CursorMove_.Direction.Up */,\n            unit: 2 /* CursorMove_.Unit.WrappedLine */,\n            select: true,\n            value: -1 /* Constants.PAGE_SIZE_MARKER */\n        },\n        id: 'cursorPageUpSelect',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 1024 /* KeyMod.Shift */ | 11 /* KeyCode.PageUp */\n        }\n    }));\n    CoreNavigationCommands.CursorDown = registerEditorCommand(new CursorMoveBasedCommand({\n        args: {\n            direction: 3 /* CursorMove_.Direction.Down */,\n            unit: 2 /* CursorMove_.Unit.WrappedLine */,\n            select: false,\n            value: 1\n        },\n        id: 'cursorDown',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 18 /* KeyCode.DownArrow */,\n            mac: { primary: 18 /* KeyCode.DownArrow */, secondary: [256 /* KeyMod.WinCtrl */ | 44 /* KeyCode.KeyN */] }\n        }\n    }));\n    CoreNavigationCommands.CursorDownSelect = registerEditorCommand(new CursorMoveBasedCommand({\n        args: {\n            direction: 3 /* CursorMove_.Direction.Down */,\n            unit: 2 /* CursorMove_.Unit.WrappedLine */,\n            select: true,\n            value: 1\n        },\n        id: 'cursorDownSelect',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 1024 /* KeyMod.Shift */ | 18 /* KeyCode.DownArrow */,\n            secondary: [2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 18 /* KeyCode.DownArrow */],\n            mac: { primary: 1024 /* KeyMod.Shift */ | 18 /* KeyCode.DownArrow */ },\n            linux: { primary: 1024 /* KeyMod.Shift */ | 18 /* KeyCode.DownArrow */ }\n        }\n    }));\n    CoreNavigationCommands.CursorPageDown = registerEditorCommand(new CursorMoveBasedCommand({\n        args: {\n            direction: 3 /* CursorMove_.Direction.Down */,\n            unit: 2 /* CursorMove_.Unit.WrappedLine */,\n            select: false,\n            value: -1 /* Constants.PAGE_SIZE_MARKER */\n        },\n        id: 'cursorPageDown',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 12 /* KeyCode.PageDown */\n        }\n    }));\n    CoreNavigationCommands.CursorPageDownSelect = registerEditorCommand(new CursorMoveBasedCommand({\n        args: {\n            direction: 3 /* CursorMove_.Direction.Down */,\n            unit: 2 /* CursorMove_.Unit.WrappedLine */,\n            select: true,\n            value: -1 /* Constants.PAGE_SIZE_MARKER */\n        },\n        id: 'cursorPageDownSelect',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 1024 /* KeyMod.Shift */ | 12 /* KeyCode.PageDown */\n        }\n    }));\n    CoreNavigationCommands.CreateCursor = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'createCursor',\n                precondition: undefined\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            if (!args.position) {\n                return;\n            }\n            let newState;\n            if (args.wholeLine) {\n                newState = CursorMoveCommands.line(viewModel, viewModel.getPrimaryCursorState(), false, args.position, args.viewPosition);\n            }\n            else {\n                newState = CursorMoveCommands.moveTo(viewModel, viewModel.getPrimaryCursorState(), false, args.position, args.viewPosition);\n            }\n            const states = viewModel.getCursorStates();\n            // Check if we should remove a cursor (sort of like a toggle)\n            if (states.length > 1) {\n                const newModelPosition = (newState.modelState ? newState.modelState.position : null);\n                const newViewPosition = (newState.viewState ? newState.viewState.position : null);\n                for (let i = 0, len = states.length; i < len; i++) {\n                    const state = states[i];\n                    if (newModelPosition && !state.modelState.selection.containsPosition(newModelPosition)) {\n                        continue;\n                    }\n                    if (newViewPosition && !state.viewState.selection.containsPosition(newViewPosition)) {\n                        continue;\n                    }\n                    // => Remove the cursor\n                    states.splice(i, 1);\n                    viewModel.model.pushStackElement();\n                    viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, states);\n                    return;\n                }\n            }\n            // => Add the new cursor\n            states.push(newState);\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, states);\n        }\n    });\n    CoreNavigationCommands.LastCursorMoveToSelect = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: '_lastCursorMoveToSelect',\n                precondition: undefined\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            if (!args.position) {\n                return;\n            }\n            const lastAddedCursorIndex = viewModel.getLastAddedCursorIndex();\n            const states = viewModel.getCursorStates();\n            const newStates = states.slice(0);\n            newStates[lastAddedCursorIndex] = CursorMoveCommands.moveTo(viewModel, states[lastAddedCursorIndex], true, args.position, args.viewPosition);\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, newStates);\n        }\n    });\n    class HomeCommand extends CoreEditorCommand {\n        constructor(opts) {\n            super(opts);\n            this._inSelectionMode = opts.inSelectionMode;\n        }\n        runCoreEditorCommand(viewModel, args) {\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, CursorMoveCommands.moveToBeginningOfLine(viewModel, viewModel.getCursorStates(), this._inSelectionMode));\n            viewModel.revealAllCursors(args.source, true);\n        }\n    }\n    CoreNavigationCommands.CursorHome = registerEditorCommand(new HomeCommand({\n        inSelectionMode: false,\n        id: 'cursorHome',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 14 /* KeyCode.Home */,\n            mac: { primary: 14 /* KeyCode.Home */, secondary: [2048 /* KeyMod.CtrlCmd */ | 15 /* KeyCode.LeftArrow */] }\n        }\n    }));\n    CoreNavigationCommands.CursorHomeSelect = registerEditorCommand(new HomeCommand({\n        inSelectionMode: true,\n        id: 'cursorHomeSelect',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 1024 /* KeyMod.Shift */ | 14 /* KeyCode.Home */,\n            mac: { primary: 1024 /* KeyMod.Shift */ | 14 /* KeyCode.Home */, secondary: [2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 15 /* KeyCode.LeftArrow */] }\n        }\n    }));\n    class LineStartCommand extends CoreEditorCommand {\n        constructor(opts) {\n            super(opts);\n            this._inSelectionMode = opts.inSelectionMode;\n        }\n        runCoreEditorCommand(viewModel, args) {\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, this._exec(viewModel.getCursorStates()));\n            viewModel.revealAllCursors(args.source, true);\n        }\n        _exec(cursors) {\n            const result = [];\n            for (let i = 0, len = cursors.length; i < len; i++) {\n                const cursor = cursors[i];\n                const lineNumber = cursor.modelState.position.lineNumber;\n                result[i] = CursorState.fromModelState(cursor.modelState.move(this._inSelectionMode, lineNumber, 1, 0));\n            }\n            return result;\n        }\n    }\n    CoreNavigationCommands.CursorLineStart = registerEditorCommand(new LineStartCommand({\n        inSelectionMode: false,\n        id: 'cursorLineStart',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 0,\n            mac: { primary: 256 /* KeyMod.WinCtrl */ | 31 /* KeyCode.KeyA */ }\n        }\n    }));\n    CoreNavigationCommands.CursorLineStartSelect = registerEditorCommand(new LineStartCommand({\n        inSelectionMode: true,\n        id: 'cursorLineStartSelect',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 0,\n            mac: { primary: 256 /* KeyMod.WinCtrl */ | 1024 /* KeyMod.Shift */ | 31 /* KeyCode.KeyA */ }\n        }\n    }));\n    class EndCommand extends CoreEditorCommand {\n        constructor(opts) {\n            super(opts);\n            this._inSelectionMode = opts.inSelectionMode;\n        }\n        runCoreEditorCommand(viewModel, args) {\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, CursorMoveCommands.moveToEndOfLine(viewModel, viewModel.getCursorStates(), this._inSelectionMode, args.sticky || false));\n            viewModel.revealAllCursors(args.source, true);\n        }\n    }\n    CoreNavigationCommands.CursorEnd = registerEditorCommand(new EndCommand({\n        inSelectionMode: false,\n        id: 'cursorEnd',\n        precondition: undefined,\n        kbOpts: {\n            args: { sticky: false },\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 13 /* KeyCode.End */,\n            mac: { primary: 13 /* KeyCode.End */, secondary: [2048 /* KeyMod.CtrlCmd */ | 17 /* KeyCode.RightArrow */] }\n        },\n        metadata: {\n            description: `Go to End`,\n            args: [{\n                    name: 'args',\n                    schema: {\n                        type: 'object',\n                        properties: {\n                            'sticky': {\n                                description: localize(66, \"Stick to the end even when going to longer lines\"),\n                                type: 'boolean',\n                                default: false\n                            }\n                        }\n                    }\n                }]\n        }\n    }));\n    CoreNavigationCommands.CursorEndSelect = registerEditorCommand(new EndCommand({\n        inSelectionMode: true,\n        id: 'cursorEndSelect',\n        precondition: undefined,\n        kbOpts: {\n            args: { sticky: false },\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 1024 /* KeyMod.Shift */ | 13 /* KeyCode.End */,\n            mac: { primary: 1024 /* KeyMod.Shift */ | 13 /* KeyCode.End */, secondary: [2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 17 /* KeyCode.RightArrow */] }\n        },\n        metadata: {\n            description: `Select to End`,\n            args: [{\n                    name: 'args',\n                    schema: {\n                        type: 'object',\n                        properties: {\n                            'sticky': {\n                                description: localize(67, \"Stick to the end even when going to longer lines\"),\n                                type: 'boolean',\n                                default: false\n                            }\n                        }\n                    }\n                }]\n        }\n    }));\n    class LineEndCommand extends CoreEditorCommand {\n        constructor(opts) {\n            super(opts);\n            this._inSelectionMode = opts.inSelectionMode;\n        }\n        runCoreEditorCommand(viewModel, args) {\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, this._exec(viewModel, viewModel.getCursorStates()));\n            viewModel.revealAllCursors(args.source, true);\n        }\n        _exec(viewModel, cursors) {\n            const result = [];\n            for (let i = 0, len = cursors.length; i < len; i++) {\n                const cursor = cursors[i];\n                const lineNumber = cursor.modelState.position.lineNumber;\n                const maxColumn = viewModel.model.getLineMaxColumn(lineNumber);\n                result[i] = CursorState.fromModelState(cursor.modelState.move(this._inSelectionMode, lineNumber, maxColumn, 0));\n            }\n            return result;\n        }\n    }\n    CoreNavigationCommands.CursorLineEnd = registerEditorCommand(new LineEndCommand({\n        inSelectionMode: false,\n        id: 'cursorLineEnd',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 0,\n            mac: { primary: 256 /* KeyMod.WinCtrl */ | 35 /* KeyCode.KeyE */ }\n        }\n    }));\n    CoreNavigationCommands.CursorLineEndSelect = registerEditorCommand(new LineEndCommand({\n        inSelectionMode: true,\n        id: 'cursorLineEndSelect',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 0,\n            mac: { primary: 256 /* KeyMod.WinCtrl */ | 1024 /* KeyMod.Shift */ | 35 /* KeyCode.KeyE */ }\n        }\n    }));\n    class TopCommand extends CoreEditorCommand {\n        constructor(opts) {\n            super(opts);\n            this._inSelectionMode = opts.inSelectionMode;\n        }\n        runCoreEditorCommand(viewModel, args) {\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, CursorMoveCommands.moveToBeginningOfBuffer(viewModel, viewModel.getCursorStates(), this._inSelectionMode));\n            viewModel.revealAllCursors(args.source, true);\n        }\n    }\n    CoreNavigationCommands.CursorTop = registerEditorCommand(new TopCommand({\n        inSelectionMode: false,\n        id: 'cursorTop',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 2048 /* KeyMod.CtrlCmd */ | 14 /* KeyCode.Home */,\n            mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 16 /* KeyCode.UpArrow */ }\n        }\n    }));\n    CoreNavigationCommands.CursorTopSelect = registerEditorCommand(new TopCommand({\n        inSelectionMode: true,\n        id: 'cursorTopSelect',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 14 /* KeyCode.Home */,\n            mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 16 /* KeyCode.UpArrow */ }\n        }\n    }));\n    class BottomCommand extends CoreEditorCommand {\n        constructor(opts) {\n            super(opts);\n            this._inSelectionMode = opts.inSelectionMode;\n        }\n        runCoreEditorCommand(viewModel, args) {\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, CursorMoveCommands.moveToEndOfBuffer(viewModel, viewModel.getCursorStates(), this._inSelectionMode));\n            viewModel.revealAllCursors(args.source, true);\n        }\n    }\n    CoreNavigationCommands.CursorBottom = registerEditorCommand(new BottomCommand({\n        inSelectionMode: false,\n        id: 'cursorBottom',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 2048 /* KeyMod.CtrlCmd */ | 13 /* KeyCode.End */,\n            mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 18 /* KeyCode.DownArrow */ }\n        }\n    }));\n    CoreNavigationCommands.CursorBottomSelect = registerEditorCommand(new BottomCommand({\n        inSelectionMode: true,\n        id: 'cursorBottomSelect',\n        precondition: undefined,\n        kbOpts: {\n            weight: CORE_WEIGHT,\n            kbExpr: EditorContextKeys.textInputFocus,\n            primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 13 /* KeyCode.End */,\n            mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 18 /* KeyCode.DownArrow */ }\n        }\n    }));\n    class EditorScrollImpl extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'editorScroll',\n                precondition: undefined,\n                metadata: EditorScroll_.metadata\n            });\n        }\n        determineScrollMethod(args) {\n            const horizontalUnits = [6 /* EditorScroll_.Unit.Column */];\n            const verticalUnits = [\n                1 /* EditorScroll_.Unit.Line */,\n                2 /* EditorScroll_.Unit.WrappedLine */,\n                3 /* EditorScroll_.Unit.Page */,\n                4 /* EditorScroll_.Unit.HalfPage */,\n                5 /* EditorScroll_.Unit.Editor */,\n                6 /* EditorScroll_.Unit.Column */\n            ];\n            const horizontalDirections = [4 /* EditorScroll_.Direction.Left */, 2 /* EditorScroll_.Direction.Right */];\n            const verticalDirections = [1 /* EditorScroll_.Direction.Up */, 3 /* EditorScroll_.Direction.Down */];\n            if (horizontalUnits.includes(args.unit) && horizontalDirections.includes(args.direction)) {\n                return this._runHorizontalEditorScroll.bind(this);\n            }\n            if (verticalUnits.includes(args.unit) && verticalDirections.includes(args.direction)) {\n                return this._runVerticalEditorScroll.bind(this);\n            }\n            return null;\n        }\n        runCoreEditorCommand(viewModel, args) {\n            const parsed = EditorScroll_.parse(args);\n            if (!parsed) {\n                // illegal arguments\n                return;\n            }\n            const runEditorScroll = this.determineScrollMethod(parsed);\n            if (!runEditorScroll) {\n                // Incompatible unit and direction\n                return;\n            }\n            runEditorScroll(viewModel, args.source, parsed);\n        }\n        _runVerticalEditorScroll(viewModel, source, args) {\n            const desiredScrollTop = this._computeDesiredScrollTop(viewModel, args);\n            if (args.revealCursor) {\n                // must ensure cursor is in new visible range\n                const desiredVisibleViewRange = viewModel.getCompletelyVisibleViewRangeAtScrollTop(desiredScrollTop);\n                viewModel.setCursorStates(source, 3 /* CursorChangeReason.Explicit */, [\n                    CursorMoveCommands.findPositionInViewportIfOutside(viewModel, viewModel.getPrimaryCursorState(), desiredVisibleViewRange, args.select)\n                ]);\n            }\n            viewModel.viewLayout.setScrollPosition({ scrollTop: desiredScrollTop }, 0 /* ScrollType.Smooth */);\n        }\n        _computeDesiredScrollTop(viewModel, args) {\n            if (args.unit === 1 /* EditorScroll_.Unit.Line */) {\n                // scrolling by model lines\n                const futureViewport = viewModel.viewLayout.getFutureViewport();\n                const visibleViewRange = viewModel.getCompletelyVisibleViewRangeAtScrollTop(futureViewport.top);\n                const visibleModelRange = viewModel.coordinatesConverter.convertViewRangeToModelRange(visibleViewRange);\n                let desiredTopModelLineNumber;\n                if (args.direction === 1 /* EditorScroll_.Direction.Up */) {\n                    // must go x model lines up\n                    desiredTopModelLineNumber = Math.max(1, visibleModelRange.startLineNumber - args.value);\n                }\n                else {\n                    // must go x model lines down\n                    desiredTopModelLineNumber = Math.min(viewModel.model.getLineCount(), visibleModelRange.startLineNumber + args.value);\n                }\n                const viewPosition = viewModel.coordinatesConverter.convertModelPositionToViewPosition(new Position(desiredTopModelLineNumber, 1));\n                return viewModel.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber);\n            }\n            if (args.unit === 5 /* EditorScroll_.Unit.Editor */) {\n                let desiredTopModelLineNumber = 0;\n                if (args.direction === 3 /* EditorScroll_.Direction.Down */) {\n                    desiredTopModelLineNumber = viewModel.model.getLineCount() - viewModel.cursorConfig.pageSize;\n                }\n                return viewModel.viewLayout.getVerticalOffsetForLineNumber(desiredTopModelLineNumber);\n            }\n            let noOfLines;\n            if (args.unit === 3 /* EditorScroll_.Unit.Page */) {\n                noOfLines = viewModel.cursorConfig.pageSize * args.value;\n            }\n            else if (args.unit === 4 /* EditorScroll_.Unit.HalfPage */) {\n                noOfLines = Math.round(viewModel.cursorConfig.pageSize / 2) * args.value;\n            }\n            else {\n                noOfLines = args.value;\n            }\n            const deltaLines = (args.direction === 1 /* EditorScroll_.Direction.Up */ ? -1 : 1) * noOfLines;\n            return viewModel.viewLayout.getCurrentScrollTop() + deltaLines * viewModel.cursorConfig.lineHeight;\n        }\n        _runHorizontalEditorScroll(viewModel, source, args) {\n            const desiredScrollLeft = this._computeDesiredScrollLeft(viewModel, args);\n            viewModel.viewLayout.setScrollPosition({ scrollLeft: desiredScrollLeft }, 0 /* ScrollType.Smooth */);\n        }\n        _computeDesiredScrollLeft(viewModel, args) {\n            const deltaColumns = (args.direction === 4 /* EditorScroll_.Direction.Left */ ? -1 : 1) * args.value;\n            return viewModel.viewLayout.getCurrentScrollLeft() + deltaColumns * viewModel.cursorConfig.typicalHalfwidthCharacterWidth;\n        }\n    }\n    CoreNavigationCommands.EditorScrollImpl = EditorScrollImpl;\n    CoreNavigationCommands.EditorScroll = registerEditorCommand(new EditorScrollImpl());\n    CoreNavigationCommands.ScrollLineUp = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'scrollLineUp',\n                precondition: undefined,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                    primary: 2048 /* KeyMod.CtrlCmd */ | 16 /* KeyCode.UpArrow */,\n                    mac: { primary: 256 /* KeyMod.WinCtrl */ | 11 /* KeyCode.PageUp */ }\n                }\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            CoreNavigationCommands.EditorScroll.runCoreEditorCommand(viewModel, {\n                to: EditorScroll_.RawDirection.Up,\n                by: EditorScroll_.RawUnit.WrappedLine,\n                value: 1,\n                revealCursor: false,\n                select: false,\n                source: args.source\n            });\n        }\n    });\n    CoreNavigationCommands.ScrollPageUp = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'scrollPageUp',\n                precondition: undefined,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                    primary: 2048 /* KeyMod.CtrlCmd */ | 11 /* KeyCode.PageUp */,\n                    win: { primary: 512 /* KeyMod.Alt */ | 11 /* KeyCode.PageUp */ },\n                    linux: { primary: 512 /* KeyMod.Alt */ | 11 /* KeyCode.PageUp */ }\n                }\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            CoreNavigationCommands.EditorScroll.runCoreEditorCommand(viewModel, {\n                to: EditorScroll_.RawDirection.Up,\n                by: EditorScroll_.RawUnit.Page,\n                value: 1,\n                revealCursor: false,\n                select: false,\n                source: args.source\n            });\n        }\n    });\n    CoreNavigationCommands.ScrollEditorTop = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'scrollEditorTop',\n                precondition: undefined,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                }\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            CoreNavigationCommands.EditorScroll.runCoreEditorCommand(viewModel, {\n                to: EditorScroll_.RawDirection.Up,\n                by: EditorScroll_.RawUnit.Editor,\n                value: 1,\n                revealCursor: false,\n                select: false,\n                source: args.source\n            });\n        }\n    });\n    CoreNavigationCommands.ScrollLineDown = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'scrollLineDown',\n                precondition: undefined,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                    primary: 2048 /* KeyMod.CtrlCmd */ | 18 /* KeyCode.DownArrow */,\n                    mac: { primary: 256 /* KeyMod.WinCtrl */ | 12 /* KeyCode.PageDown */ }\n                }\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            CoreNavigationCommands.EditorScroll.runCoreEditorCommand(viewModel, {\n                to: EditorScroll_.RawDirection.Down,\n                by: EditorScroll_.RawUnit.WrappedLine,\n                value: 1,\n                revealCursor: false,\n                select: false,\n                source: args.source\n            });\n        }\n    });\n    CoreNavigationCommands.ScrollPageDown = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'scrollPageDown',\n                precondition: undefined,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                    primary: 2048 /* KeyMod.CtrlCmd */ | 12 /* KeyCode.PageDown */,\n                    win: { primary: 512 /* KeyMod.Alt */ | 12 /* KeyCode.PageDown */ },\n                    linux: { primary: 512 /* KeyMod.Alt */ | 12 /* KeyCode.PageDown */ }\n                }\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            CoreNavigationCommands.EditorScroll.runCoreEditorCommand(viewModel, {\n                to: EditorScroll_.RawDirection.Down,\n                by: EditorScroll_.RawUnit.Page,\n                value: 1,\n                revealCursor: false,\n                select: false,\n                source: args.source\n            });\n        }\n    });\n    CoreNavigationCommands.ScrollEditorBottom = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'scrollEditorBottom',\n                precondition: undefined,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                }\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            CoreNavigationCommands.EditorScroll.runCoreEditorCommand(viewModel, {\n                to: EditorScroll_.RawDirection.Down,\n                by: EditorScroll_.RawUnit.Editor,\n                value: 1,\n                revealCursor: false,\n                select: false,\n                source: args.source\n            });\n        }\n    });\n    CoreNavigationCommands.ScrollLeft = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'scrollLeft',\n                precondition: undefined,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                }\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            CoreNavigationCommands.EditorScroll.runCoreEditorCommand(viewModel, {\n                to: EditorScroll_.RawDirection.Left,\n                by: EditorScroll_.RawUnit.Column,\n                value: 2,\n                revealCursor: false,\n                select: false,\n                source: args.source\n            });\n        }\n    });\n    CoreNavigationCommands.ScrollRight = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'scrollRight',\n                precondition: undefined,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                }\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            CoreNavigationCommands.EditorScroll.runCoreEditorCommand(viewModel, {\n                to: EditorScroll_.RawDirection.Right,\n                by: EditorScroll_.RawUnit.Column,\n                value: 2,\n                revealCursor: false,\n                select: false,\n                source: args.source\n            });\n        }\n    });\n    class WordCommand extends CoreEditorCommand {\n        constructor(opts) {\n            super(opts);\n            this._inSelectionMode = opts.inSelectionMode;\n        }\n        runCoreEditorCommand(viewModel, args) {\n            if (!args.position) {\n                return;\n            }\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, [\n                CursorMoveCommands.word(viewModel, viewModel.getPrimaryCursorState(), this._inSelectionMode, args.position)\n            ]);\n            if (args.revealType !== 2 /* NavigationCommandRevealType.None */) {\n                viewModel.revealAllCursors(args.source, true, true);\n            }\n        }\n    }\n    CoreNavigationCommands.WordSelect = registerEditorCommand(new WordCommand({\n        inSelectionMode: false,\n        id: '_wordSelect',\n        precondition: undefined\n    }));\n    CoreNavigationCommands.WordSelectDrag = registerEditorCommand(new WordCommand({\n        inSelectionMode: true,\n        id: '_wordSelectDrag',\n        precondition: undefined\n    }));\n    CoreNavigationCommands.LastCursorWordSelect = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'lastCursorWordSelect',\n                precondition: undefined\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            if (!args.position) {\n                return;\n            }\n            const lastAddedCursorIndex = viewModel.getLastAddedCursorIndex();\n            const states = viewModel.getCursorStates();\n            const newStates = states.slice(0);\n            const lastAddedState = states[lastAddedCursorIndex];\n            newStates[lastAddedCursorIndex] = CursorMoveCommands.word(viewModel, lastAddedState, lastAddedState.modelState.hasSelection(), args.position);\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, newStates);\n        }\n    });\n    class LineCommand extends CoreEditorCommand {\n        constructor(opts) {\n            super(opts);\n            this._inSelectionMode = opts.inSelectionMode;\n        }\n        runCoreEditorCommand(viewModel, args) {\n            if (!args.position) {\n                return;\n            }\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, [\n                CursorMoveCommands.line(viewModel, viewModel.getPrimaryCursorState(), this._inSelectionMode, args.position, args.viewPosition)\n            ]);\n            if (args.revealType !== 2 /* NavigationCommandRevealType.None */) {\n                viewModel.revealAllCursors(args.source, false, true);\n            }\n        }\n    }\n    CoreNavigationCommands.LineSelect = registerEditorCommand(new LineCommand({\n        inSelectionMode: false,\n        id: '_lineSelect',\n        precondition: undefined\n    }));\n    CoreNavigationCommands.LineSelectDrag = registerEditorCommand(new LineCommand({\n        inSelectionMode: true,\n        id: '_lineSelectDrag',\n        precondition: undefined\n    }));\n    class LastCursorLineCommand extends CoreEditorCommand {\n        constructor(opts) {\n            super(opts);\n            this._inSelectionMode = opts.inSelectionMode;\n        }\n        runCoreEditorCommand(viewModel, args) {\n            if (!args.position) {\n                return;\n            }\n            const lastAddedCursorIndex = viewModel.getLastAddedCursorIndex();\n            const states = viewModel.getCursorStates();\n            const newStates = states.slice(0);\n            newStates[lastAddedCursorIndex] = CursorMoveCommands.line(viewModel, states[lastAddedCursorIndex], this._inSelectionMode, args.position, args.viewPosition);\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, newStates);\n        }\n    }\n    CoreNavigationCommands.LastCursorLineSelect = registerEditorCommand(new LastCursorLineCommand({\n        inSelectionMode: false,\n        id: 'lastCursorLineSelect',\n        precondition: undefined\n    }));\n    CoreNavigationCommands.LastCursorLineSelectDrag = registerEditorCommand(new LastCursorLineCommand({\n        inSelectionMode: true,\n        id: 'lastCursorLineSelectDrag',\n        precondition: undefined\n    }));\n    CoreNavigationCommands.CancelSelection = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'cancelSelection',\n                precondition: EditorContextKeys.hasNonEmptySelection,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                    primary: 9 /* KeyCode.Escape */,\n                    secondary: [1024 /* KeyMod.Shift */ | 9 /* KeyCode.Escape */]\n                }\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, [\n                CursorMoveCommands.cancelSelection(viewModel, viewModel.getPrimaryCursorState())\n            ]);\n            viewModel.revealAllCursors(args.source, true);\n        }\n    });\n    CoreNavigationCommands.RemoveSecondaryCursors = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'removeSecondaryCursors',\n                precondition: EditorContextKeys.hasMultipleSelections,\n                kbOpts: {\n                    weight: CORE_WEIGHT + 1,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                    primary: 9 /* KeyCode.Escape */,\n                    secondary: [1024 /* KeyMod.Shift */ | 9 /* KeyCode.Escape */]\n                }\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, [\n                viewModel.getPrimaryCursorState()\n            ]);\n            viewModel.revealAllCursors(args.source, true);\n            status(localize(68, \"Removed secondary cursors\"));\n        }\n    });\n    CoreNavigationCommands.RevealLine = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'revealLine',\n                precondition: undefined,\n                metadata: RevealLine_.metadata\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            const revealLineArg = args;\n            const lineNumberArg = revealLineArg.lineNumber || 0;\n            let lineNumber = typeof lineNumberArg === 'number' ? (lineNumberArg + 1) : (parseInt(lineNumberArg) + 1);\n            if (lineNumber < 1) {\n                lineNumber = 1;\n            }\n            const lineCount = viewModel.model.getLineCount();\n            if (lineNumber > lineCount) {\n                lineNumber = lineCount;\n            }\n            const range = new Range(lineNumber, 1, lineNumber, viewModel.model.getLineMaxColumn(lineNumber));\n            let revealAt = 0 /* VerticalRevealType.Simple */;\n            if (revealLineArg.at) {\n                switch (revealLineArg.at) {\n                    case RevealLine_.RawAtArgument.Top:\n                        revealAt = 3 /* VerticalRevealType.Top */;\n                        break;\n                    case RevealLine_.RawAtArgument.Center:\n                        revealAt = 1 /* VerticalRevealType.Center */;\n                        break;\n                    case RevealLine_.RawAtArgument.Bottom:\n                        revealAt = 4 /* VerticalRevealType.Bottom */;\n                        break;\n                }\n            }\n            const viewRange = viewModel.coordinatesConverter.convertModelRangeToViewRange(range);\n            viewModel.revealRange(args.source, false, viewRange, revealAt, 0 /* ScrollType.Smooth */);\n        }\n    });\n    CoreNavigationCommands.SelectAll = new class extends EditorOrNativeTextInputCommand {\n        constructor() {\n            super(SelectAllCommand);\n        }\n        runDOMCommand(activeElement) {\n            if (isFirefox) {\n                activeElement.focus();\n                activeElement.select();\n            }\n            activeElement.ownerDocument.execCommand('selectAll');\n        }\n        runEditorCommand(accessor, editor, args) {\n            const viewModel = editor._getViewModel();\n            if (!viewModel) {\n                // the editor has no view => has no cursors\n                return;\n            }\n            this.runCoreEditorCommand(viewModel, args);\n        }\n        runCoreEditorCommand(viewModel, args) {\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates('keyboard', 3 /* CursorChangeReason.Explicit */, [\n                CursorMoveCommands.selectAll(viewModel, viewModel.getPrimaryCursorState())\n            ]);\n        }\n    }();\n    CoreNavigationCommands.SetSelection = registerEditorCommand(new class extends CoreEditorCommand {\n        constructor() {\n            super({\n                id: 'setSelection',\n                precondition: undefined\n            });\n        }\n        runCoreEditorCommand(viewModel, args) {\n            if (!args.selection) {\n                return;\n            }\n            viewModel.model.pushStackElement();\n            viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, [\n                CursorState.fromModelSelection(args.selection)\n            ]);\n        }\n    });\n})(CoreNavigationCommands || (CoreNavigationCommands = {}));\nconst columnSelectionCondition = ContextKeyExpr.and(EditorContextKeys.textInputFocus, EditorContextKeys.columnSelection);\nfunction registerColumnSelection(id, keybinding) {\n    KeybindingsRegistry.registerKeybindingRule({\n        id: id,\n        primary: keybinding,\n        when: columnSelectionCondition,\n        weight: CORE_WEIGHT + 1\n    });\n}\nregisterColumnSelection(CoreNavigationCommands.CursorColumnSelectLeft.id, 1024 /* KeyMod.Shift */ | 15 /* KeyCode.LeftArrow */);\nregisterColumnSelection(CoreNavigationCommands.CursorColumnSelectRight.id, 1024 /* KeyMod.Shift */ | 17 /* KeyCode.RightArrow */);\nregisterColumnSelection(CoreNavigationCommands.CursorColumnSelectUp.id, 1024 /* KeyMod.Shift */ | 16 /* KeyCode.UpArrow */);\nregisterColumnSelection(CoreNavigationCommands.CursorColumnSelectPageUp.id, 1024 /* KeyMod.Shift */ | 11 /* KeyCode.PageUp */);\nregisterColumnSelection(CoreNavigationCommands.CursorColumnSelectDown.id, 1024 /* KeyMod.Shift */ | 18 /* KeyCode.DownArrow */);\nregisterColumnSelection(CoreNavigationCommands.CursorColumnSelectPageDown.id, 1024 /* KeyMod.Shift */ | 12 /* KeyCode.PageDown */);\nfunction registerCommand(command) {\n    command.register();\n    return command;\n}\nvar CoreEditingCommands;\n(function (CoreEditingCommands) {\n    class CoreEditingCommand extends EditorCommand {\n        runEditorCommand(accessor, editor, args) {\n            const viewModel = editor._getViewModel();\n            if (!viewModel) {\n                // the editor has no view => has no cursors\n                return;\n            }\n            this.runCoreEditingCommand(editor, viewModel, args || {});\n        }\n    }\n    CoreEditingCommands.CoreEditingCommand = CoreEditingCommand;\n    CoreEditingCommands.LineBreakInsert = registerEditorCommand(new class extends CoreEditingCommand {\n        constructor() {\n            super({\n                id: 'lineBreakInsert',\n                precondition: EditorContextKeys.writable,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                    primary: 0,\n                    mac: { primary: 256 /* KeyMod.WinCtrl */ | 45 /* KeyCode.KeyO */ }\n                }\n            });\n        }\n        runCoreEditingCommand(editor, viewModel, args) {\n            editor.pushUndoStop();\n            editor.executeCommands(this.id, EnterOperation.lineBreakInsert(viewModel.cursorConfig, viewModel.model, viewModel.getCursorStates().map(s => s.modelState.selection)));\n        }\n    });\n    CoreEditingCommands.Outdent = registerEditorCommand(new class extends CoreEditingCommand {\n        constructor() {\n            super({\n                id: 'outdent',\n                precondition: EditorContextKeys.writable,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: ContextKeyExpr.and(EditorContextKeys.editorTextFocus, EditorContextKeys.tabDoesNotMoveFocus),\n                    primary: 1024 /* KeyMod.Shift */ | 2 /* KeyCode.Tab */\n                }\n            });\n        }\n        runCoreEditingCommand(editor, viewModel, args) {\n            editor.pushUndoStop();\n            editor.executeCommands(this.id, TypeOperations.outdent(viewModel.cursorConfig, viewModel.model, viewModel.getCursorStates().map(s => s.modelState.selection)));\n            editor.pushUndoStop();\n        }\n    });\n    CoreEditingCommands.Tab = registerEditorCommand(new class extends CoreEditingCommand {\n        constructor() {\n            super({\n                id: 'tab',\n                precondition: EditorContextKeys.writable,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: ContextKeyExpr.and(EditorContextKeys.editorTextFocus, EditorContextKeys.tabDoesNotMoveFocus),\n                    primary: 2 /* KeyCode.Tab */\n                }\n            });\n        }\n        runCoreEditingCommand(editor, viewModel, args) {\n            editor.pushUndoStop();\n            editor.executeCommands(this.id, TypeOperations.tab(viewModel.cursorConfig, viewModel.model, viewModel.getCursorStates().map(s => s.modelState.selection)));\n            editor.pushUndoStop();\n        }\n    });\n    CoreEditingCommands.DeleteLeft = registerEditorCommand(new class extends CoreEditingCommand {\n        constructor() {\n            super({\n                id: 'deleteLeft',\n                precondition: undefined,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                    primary: 1 /* KeyCode.Backspace */,\n                    secondary: [1024 /* KeyMod.Shift */ | 1 /* KeyCode.Backspace */],\n                    mac: { primary: 1 /* KeyCode.Backspace */, secondary: [1024 /* KeyMod.Shift */ | 1 /* KeyCode.Backspace */, 256 /* KeyMod.WinCtrl */ | 38 /* KeyCode.KeyH */, 256 /* KeyMod.WinCtrl */ | 1 /* KeyCode.Backspace */] }\n                }\n            });\n        }\n        runCoreEditingCommand(editor, viewModel, args) {\n            const [shouldPushStackElementBefore, commands] = DeleteOperations.deleteLeft(viewModel.getPrevEditOperationType(), viewModel.cursorConfig, viewModel.model, viewModel.getCursorStates().map(s => s.modelState.selection), viewModel.getCursorAutoClosedCharacters());\n            if (shouldPushStackElementBefore) {\n                editor.pushUndoStop();\n            }\n            editor.executeCommands(this.id, commands);\n            viewModel.setPrevEditOperationType(2 /* EditOperationType.DeletingLeft */);\n        }\n    });\n    CoreEditingCommands.DeleteRight = registerEditorCommand(new class extends CoreEditingCommand {\n        constructor() {\n            super({\n                id: 'deleteRight',\n                precondition: undefined,\n                kbOpts: {\n                    weight: CORE_WEIGHT,\n                    kbExpr: EditorContextKeys.textInputFocus,\n                    primary: 20 /* KeyCode.Delete */,\n                    mac: { primary: 20 /* KeyCode.Delete */, secondary: [256 /* KeyMod.WinCtrl */ | 34 /* KeyCode.KeyD */, 256 /* KeyMod.WinCtrl */ | 20 /* KeyCode.Delete */] }\n                }\n            });\n        }\n        runCoreEditingCommand(editor, viewModel, args) {\n            const [shouldPushStackElementBefore, commands] = DeleteOperations.deleteRight(viewModel.getPrevEditOperationType(), viewModel.cursorConfig, viewModel.model, viewModel.getCursorStates().map(s => s.modelState.selection));\n            if (shouldPushStackElementBefore) {\n                editor.pushUndoStop();\n            }\n            editor.executeCommands(this.id, commands);\n            viewModel.setPrevEditOperationType(3 /* EditOperationType.DeletingRight */);\n        }\n    });\n    CoreEditingCommands.Undo = new class extends EditorOrNativeTextInputCommand {\n        constructor() {\n            super(UndoCommand);\n        }\n        runDOMCommand(activeElement) {\n            activeElement.ownerDocument.execCommand('undo');\n        }\n        runEditorCommand(accessor, editor, args) {\n            if (!editor.hasModel() || editor.getOption(104 /* EditorOption.readOnly */) === true) {\n                return;\n            }\n            return editor.getModel().undo();\n        }\n    }();\n    CoreEditingCommands.Redo = new class extends EditorOrNativeTextInputCommand {\n        constructor() {\n            super(RedoCommand);\n        }\n        runDOMCommand(activeElement) {\n            activeElement.ownerDocument.execCommand('redo');\n        }\n        runEditorCommand(accessor, editor, args) {\n            if (!editor.hasModel() || editor.getOption(104 /* EditorOption.readOnly */) === true) {\n                return;\n            }\n            return editor.getModel().redo();\n        }\n    }();\n})(CoreEditingCommands || (CoreEditingCommands = {}));\n/**\n * A command that will invoke a command on the focused editor.\n */\nclass EditorHandlerCommand extends Command {\n    constructor(id, handlerId, metadata) {\n        super({\n            id: id,\n            precondition: undefined,\n            metadata\n        });\n        this._handlerId = handlerId;\n    }\n    runCommand(accessor, args) {\n        const editor = accessor.get(ICodeEditorService).getFocusedCodeEditor();\n        if (!editor) {\n            return;\n        }\n        editor.trigger('keyboard', this._handlerId, args);\n    }\n}\nfunction registerOverwritableCommand(handlerId, metadata) {\n    registerCommand(new EditorHandlerCommand('default:' + handlerId, handlerId));\n    registerCommand(new EditorHandlerCommand(handlerId, handlerId, metadata));\n}\nregisterOverwritableCommand(\"type\" /* Handler.Type */, {\n    description: `Type`,\n    args: [{\n            name: 'args',\n            schema: {\n                'type': 'object',\n                'required': ['text'],\n                'properties': {\n                    'text': {\n                        'type': 'string'\n                    }\n                },\n            }\n        }]\n});\nregisterOverwritableCommand(\"replacePreviousChar\" /* Handler.ReplacePreviousChar */);\nregisterOverwritableCommand(\"compositionType\" /* Handler.CompositionType */);\nregisterOverwritableCommand(\"compositionStart\" /* Handler.CompositionStart */);\nregisterOverwritableCommand(\"compositionEnd\" /* Handler.CompositionEnd */);\nregisterOverwritableCommand(\"paste\" /* Handler.Paste */);\nregisterOverwritableCommand(\"cut\" /* Handler.Cut */);\n\nexport { CoreEditingCommands, CoreEditorCommand, CoreNavigationCommands, EditorScroll_, RevealLine_ };\n","import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IMarkerDecorationsService = createDecorator('markerDecorationsService');\n\nexport { IMarkerDecorationsService };\n","import { IMarkerDecorationsService } from '../../common/services/markerDecorations.js';\nimport { registerEditorContribution } from '../editorExtensions.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet MarkerDecorationsContribution = class MarkerDecorationsContribution {\n    static { this.ID = 'editor.contrib.markerDecorations'; }\n    constructor(_editor, _markerDecorationsService) {\n        // Doesn't do anything, just requires `IMarkerDecorationsService` to make sure it gets instantiated\n    }\n    dispose() {\n    }\n};\nMarkerDecorationsContribution = __decorate([\n    __param(1, IMarkerDecorationsService)\n], MarkerDecorationsContribution);\nregisterEditorContribution(MarkerDecorationsContribution.ID, MarkerDecorationsContribution, 0 /* EditorContributionInstantiation.Eager */); // eager because it instantiates IMarkerDecorationsService which is responsible for rendering squiggles\n\nexport { MarkerDecorationsContribution };\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 *--------------------------------------------------------------------------------------------*/\nclass FastDomNode {\n    constructor(domNode) {\n        this.domNode = domNode;\n        this._maxWidth = '';\n        this._width = '';\n        this._height = '';\n        this._top = '';\n        this._left = '';\n        this._bottom = '';\n        this._right = '';\n        this._paddingLeft = '';\n        this._fontFamily = '';\n        this._fontWeight = '';\n        this._fontSize = '';\n        this._fontStyle = '';\n        this._fontFeatureSettings = '';\n        this._fontVariationSettings = '';\n        this._textDecoration = '';\n        this._lineHeight = '';\n        this._letterSpacing = '';\n        this._className = '';\n        this._display = '';\n        this._position = '';\n        this._visibility = '';\n        this._color = '';\n        this._backgroundColor = '';\n        this._layerHint = false;\n        this._contain = 'none';\n        this._boxShadow = '';\n    }\n    focus() {\n        this.domNode.focus();\n    }\n    setMaxWidth(_maxWidth) {\n        const maxWidth = numberAsPixels(_maxWidth);\n        if (this._maxWidth === maxWidth) {\n            return;\n        }\n        this._maxWidth = maxWidth;\n        this.domNode.style.maxWidth = this._maxWidth;\n    }\n    setWidth(_width) {\n        const width = numberAsPixels(_width);\n        if (this._width === width) {\n            return;\n        }\n        this._width = width;\n        this.domNode.style.width = this._width;\n    }\n    setHeight(_height) {\n        const height = numberAsPixels(_height);\n        if (this._height === height) {\n            return;\n        }\n        this._height = height;\n        this.domNode.style.height = this._height;\n    }\n    setTop(_top) {\n        const top = numberAsPixels(_top);\n        if (this._top === top) {\n            return;\n        }\n        this._top = top;\n        this.domNode.style.top = this._top;\n    }\n    setLeft(_left) {\n        const left = numberAsPixels(_left);\n        if (this._left === left) {\n            return;\n        }\n        this._left = left;\n        this.domNode.style.left = this._left;\n    }\n    setBottom(_bottom) {\n        const bottom = numberAsPixels(_bottom);\n        if (this._bottom === bottom) {\n            return;\n        }\n        this._bottom = bottom;\n        this.domNode.style.bottom = this._bottom;\n    }\n    setRight(_right) {\n        const right = numberAsPixels(_right);\n        if (this._right === right) {\n            return;\n        }\n        this._right = right;\n        this.domNode.style.right = this._right;\n    }\n    setPaddingLeft(_paddingLeft) {\n        const paddingLeft = numberAsPixels(_paddingLeft);\n        if (this._paddingLeft === paddingLeft) {\n            return;\n        }\n        this._paddingLeft = paddingLeft;\n        this.domNode.style.paddingLeft = this._paddingLeft;\n    }\n    setFontFamily(fontFamily) {\n        if (this._fontFamily === fontFamily) {\n            return;\n        }\n        this._fontFamily = fontFamily;\n        this.domNode.style.fontFamily = this._fontFamily;\n    }\n    setFontWeight(fontWeight) {\n        if (this._fontWeight === fontWeight) {\n            return;\n        }\n        this._fontWeight = fontWeight;\n        this.domNode.style.fontWeight = this._fontWeight;\n    }\n    setFontSize(_fontSize) {\n        const fontSize = numberAsPixels(_fontSize);\n        if (this._fontSize === fontSize) {\n            return;\n        }\n        this._fontSize = fontSize;\n        this.domNode.style.fontSize = this._fontSize;\n    }\n    setFontStyle(fontStyle) {\n        if (this._fontStyle === fontStyle) {\n            return;\n        }\n        this._fontStyle = fontStyle;\n        this.domNode.style.fontStyle = this._fontStyle;\n    }\n    setFontFeatureSettings(fontFeatureSettings) {\n        if (this._fontFeatureSettings === fontFeatureSettings) {\n            return;\n        }\n        this._fontFeatureSettings = fontFeatureSettings;\n        this.domNode.style.fontFeatureSettings = this._fontFeatureSettings;\n    }\n    setFontVariationSettings(fontVariationSettings) {\n        if (this._fontVariationSettings === fontVariationSettings) {\n            return;\n        }\n        this._fontVariationSettings = fontVariationSettings;\n        this.domNode.style.fontVariationSettings = this._fontVariationSettings;\n    }\n    setTextDecoration(textDecoration) {\n        if (this._textDecoration === textDecoration) {\n            return;\n        }\n        this._textDecoration = textDecoration;\n        this.domNode.style.textDecoration = this._textDecoration;\n    }\n    setLineHeight(_lineHeight) {\n        const lineHeight = numberAsPixels(_lineHeight);\n        if (this._lineHeight === lineHeight) {\n            return;\n        }\n        this._lineHeight = lineHeight;\n        this.domNode.style.lineHeight = this._lineHeight;\n    }\n    setLetterSpacing(_letterSpacing) {\n        const letterSpacing = numberAsPixels(_letterSpacing);\n        if (this._letterSpacing === letterSpacing) {\n            return;\n        }\n        this._letterSpacing = letterSpacing;\n        this.domNode.style.letterSpacing = this._letterSpacing;\n    }\n    setClassName(className) {\n        if (this._className === className) {\n            return;\n        }\n        this._className = className;\n        this.domNode.className = this._className;\n    }\n    toggleClassName(className, shouldHaveIt) {\n        this.domNode.classList.toggle(className, shouldHaveIt);\n        this._className = this.domNode.className;\n    }\n    setDisplay(display) {\n        if (this._display === display) {\n            return;\n        }\n        this._display = display;\n        this.domNode.style.display = this._display;\n    }\n    setPosition(position) {\n        if (this._position === position) {\n            return;\n        }\n        this._position = position;\n        this.domNode.style.position = this._position;\n    }\n    setVisibility(visibility) {\n        if (this._visibility === visibility) {\n            return;\n        }\n        this._visibility = visibility;\n        this.domNode.style.visibility = this._visibility;\n    }\n    setColor(color) {\n        if (this._color === color) {\n            return;\n        }\n        this._color = color;\n        this.domNode.style.color = this._color;\n    }\n    setBackgroundColor(backgroundColor) {\n        if (this._backgroundColor === backgroundColor) {\n            return;\n        }\n        this._backgroundColor = backgroundColor;\n        this.domNode.style.backgroundColor = this._backgroundColor;\n    }\n    setLayerHinting(layerHint) {\n        if (this._layerHint === layerHint) {\n            return;\n        }\n        this._layerHint = layerHint;\n        this.domNode.style.transform = this._layerHint ? 'translate3d(0px, 0px, 0px)' : '';\n    }\n    setBoxShadow(boxShadow) {\n        if (this._boxShadow === boxShadow) {\n            return;\n        }\n        this._boxShadow = boxShadow;\n        this.domNode.style.boxShadow = boxShadow;\n    }\n    setContain(contain) {\n        if (this._contain === contain) {\n            return;\n        }\n        this._contain = contain;\n        this.domNode.style.contain = this._contain;\n    }\n    setAttribute(name, value) {\n        this.domNode.setAttribute(name, value);\n    }\n    removeAttribute(name) {\n        this.domNode.removeAttribute(name);\n    }\n    appendChild(child) {\n        this.domNode.appendChild(child.domNode);\n    }\n    removeChild(child) {\n        this.domNode.removeChild(child.domNode);\n    }\n}\nfunction numberAsPixels(value) {\n    return (typeof value === 'number' ? `${value}px` : value);\n}\nfunction createFastDomNode(domNode) {\n    return new FastDomNode(domNode);\n}\n\nexport { FastDomNode, createFastDomNode };\n","import { FastDomNode } from '../../../base/browser/fastDomNode.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction applyFontInfo(domNode, fontInfo) {\n    if (domNode instanceof FastDomNode) {\n        domNode.setFontFamily(fontInfo.getMassagedFontFamily());\n        domNode.setFontWeight(fontInfo.fontWeight);\n        domNode.setFontSize(fontInfo.fontSize);\n        domNode.setFontFeatureSettings(fontInfo.fontFeatureSettings);\n        domNode.setFontVariationSettings(fontInfo.fontVariationSettings);\n        domNode.setLineHeight(fontInfo.lineHeight);\n        domNode.setLetterSpacing(fontInfo.letterSpacing);\n    }\n    else {\n        domNode.style.fontFamily = fontInfo.getMassagedFontFamily();\n        domNode.style.fontWeight = fontInfo.fontWeight;\n        domNode.style.fontSize = fontInfo.fontSize + 'px';\n        domNode.style.fontFeatureSettings = fontInfo.fontFeatureSettings;\n        domNode.style.fontVariationSettings = fontInfo.fontVariationSettings;\n        domNode.style.lineHeight = fontInfo.lineHeight + 'px';\n        domNode.style.letterSpacing = fontInfo.letterSpacing + 'px';\n    }\n}\n\nexport { applyFontInfo };\n","import { Disposable } from '../../../base/common/lifecycle.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { scheduleAtNextAnimationFrame, getWindow } from '../../../base/browser/dom.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ElementSizeObserver extends Disposable {\n    constructor(referenceDomElement, dimension) {\n        super();\n        this._onDidChange = this._register(new Emitter());\n        this.onDidChange = this._onDidChange.event;\n        this._referenceDomElement = referenceDomElement;\n        this._width = -1;\n        this._height = -1;\n        this._resizeObserver = null;\n        this.measureReferenceDomElement(false, dimension);\n    }\n    dispose() {\n        this.stopObserving();\n        super.dispose();\n    }\n    getWidth() {\n        return this._width;\n    }\n    getHeight() {\n        return this._height;\n    }\n    startObserving() {\n        if (!this._resizeObserver && this._referenceDomElement) {\n            // We want to react to the resize observer only once per animation frame\n            // The first time the resize observer fires, we will react to it immediately.\n            // Otherwise we will postpone to the next animation frame.\n            // We'll use `observeContentRect` to store the content rect we received.\n            let observedDimenstion = null;\n            const observeNow = () => {\n                if (observedDimenstion) {\n                    this.observe({ width: observedDimenstion.width, height: observedDimenstion.height });\n                }\n                else {\n                    this.observe();\n                }\n            };\n            let shouldObserve = false;\n            let alreadyObservedThisAnimationFrame = false;\n            const update = () => {\n                if (shouldObserve && !alreadyObservedThisAnimationFrame) {\n                    try {\n                        shouldObserve = false;\n                        alreadyObservedThisAnimationFrame = true;\n                        observeNow();\n                    }\n                    finally {\n                        scheduleAtNextAnimationFrame(getWindow(this._referenceDomElement), () => {\n                            alreadyObservedThisAnimationFrame = false;\n                            update();\n                        });\n                    }\n                }\n            };\n            this._resizeObserver = new ResizeObserver((entries) => {\n                if (entries && entries[0] && entries[0].contentRect) {\n                    observedDimenstion = { width: entries[0].contentRect.width, height: entries[0].contentRect.height };\n                }\n                else {\n                    observedDimenstion = null;\n                }\n                shouldObserve = true;\n                update();\n            });\n            this._resizeObserver.observe(this._referenceDomElement);\n        }\n    }\n    stopObserving() {\n        if (this._resizeObserver) {\n            this._resizeObserver.disconnect();\n            this._resizeObserver = null;\n        }\n    }\n    observe(dimension) {\n        this.measureReferenceDomElement(true, dimension);\n    }\n    measureReferenceDomElement(emitEvent, dimension) {\n        let observedWidth = 0;\n        let observedHeight = 0;\n        if (dimension) {\n            observedWidth = dimension.width;\n            observedHeight = dimension.height;\n        }\n        else if (this._referenceDomElement) {\n            observedWidth = this._referenceDomElement.clientWidth;\n            observedHeight = this._referenceDomElement.clientHeight;\n        }\n        observedWidth = Math.max(5, observedWidth);\n        observedHeight = Math.max(5, observedHeight);\n        if (this._width !== observedWidth || this._height !== observedHeight) {\n            this._width = observedWidth;\n            this._height = observedHeight;\n            if (emitEvent) {\n                this._onDidChange.fire();\n            }\n        }\n    }\n}\n\nexport { ElementSizeObserver };\n","import { getWindowId, onDidUnregisterWindow } from './dom.js';\nimport { Event, Emitter } from '../common/event.js';\nimport { markAsSingleton, Disposable } from '../common/lifecycle.js';\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/**\n * See https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio#monitoring_screen_resolution_or_zoom_level_changes\n */\nclass DevicePixelRatioMonitor extends Disposable {\n    constructor(targetWindow) {\n        super();\n        this._onDidChange = this._register(new Emitter());\n        this.onDidChange = this._onDidChange.event;\n        this._listener = () => this._handleChange(targetWindow, true);\n        this._mediaQueryList = null;\n        this._handleChange(targetWindow, false);\n    }\n    _handleChange(targetWindow, fireEvent) {\n        this._mediaQueryList?.removeEventListener('change', this._listener);\n        this._mediaQueryList = targetWindow.matchMedia(`(resolution: ${targetWindow.devicePixelRatio}dppx)`);\n        this._mediaQueryList.addEventListener('change', this._listener);\n        if (fireEvent) {\n            this._onDidChange.fire();\n        }\n    }\n}\nclass PixelRatioMonitorImpl extends Disposable {\n    get value() {\n        return this._value;\n    }\n    constructor(targetWindow) {\n        super();\n        this._onDidChange = this._register(new Emitter());\n        this.onDidChange = this._onDidChange.event;\n        this._value = this._getPixelRatio(targetWindow);\n        const dprMonitor = this._register(new DevicePixelRatioMonitor(targetWindow));\n        this._register(dprMonitor.onDidChange(() => {\n            this._value = this._getPixelRatio(targetWindow);\n            this._onDidChange.fire(this._value);\n        }));\n    }\n    _getPixelRatio(targetWindow) {\n        const ctx = document.createElement('canvas').getContext('2d');\n        const dpr = targetWindow.devicePixelRatio || 1;\n        const bsr = ctx.webkitBackingStorePixelRatio ||\n            ctx.mozBackingStorePixelRatio ||\n            ctx.msBackingStorePixelRatio ||\n            ctx.oBackingStorePixelRatio ||\n            ctx.backingStorePixelRatio || 1;\n        return dpr / bsr;\n    }\n}\nclass PixelRatioMonitorFacade {\n    constructor() {\n        this.mapWindowIdToPixelRatioMonitor = new Map();\n    }\n    _getOrCreatePixelRatioMonitor(targetWindow) {\n        const targetWindowId = getWindowId(targetWindow);\n        let pixelRatioMonitor = this.mapWindowIdToPixelRatioMonitor.get(targetWindowId);\n        if (!pixelRatioMonitor) {\n            pixelRatioMonitor = markAsSingleton(new PixelRatioMonitorImpl(targetWindow));\n            this.mapWindowIdToPixelRatioMonitor.set(targetWindowId, pixelRatioMonitor);\n            markAsSingleton(Event.once(onDidUnregisterWindow)(({ vscodeWindowId }) => {\n                if (vscodeWindowId === targetWindowId) {\n                    pixelRatioMonitor?.dispose();\n                    this.mapWindowIdToPixelRatioMonitor.delete(targetWindowId);\n                }\n            }));\n        }\n        return pixelRatioMonitor;\n    }\n    getInstance(targetWindow) {\n        return this._getOrCreatePixelRatioMonitor(targetWindow);\n    }\n}\n/**\n * Returns the pixel ratio.\n *\n * This is useful for rendering <canvas> elements at native screen resolution or for being used as\n * a cache key when storing font measurements. Fonts might render differently depending on resolution\n * and any measurements need to be discarded for example when a window is moved from a monitor to another.\n */\nconst PixelRatio = new PixelRatioMonitorFacade();\n\nexport { PixelRatio };\n","import { applyFontInfo } from './domFontInfo.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CharWidthRequest {\n    constructor(chr, type) {\n        this.chr = chr;\n        this.type = type;\n        this.width = 0;\n    }\n    fulfill(width) {\n        this.width = width;\n    }\n}\nclass DomCharWidthReader {\n    constructor(bareFontInfo, requests) {\n        this._bareFontInfo = bareFontInfo;\n        this._requests = requests;\n        this._container = null;\n        this._testElements = null;\n    }\n    read(targetWindow) {\n        // Create a test container with all these test elements\n        this._createDomElements();\n        // Add the container to the DOM\n        targetWindow.document.body.appendChild(this._container);\n        // Read character widths\n        this._readFromDomElements();\n        // Remove the container from the DOM\n        this._container?.remove();\n        this._container = null;\n        this._testElements = null;\n    }\n    _createDomElements() {\n        const container = document.createElement('div');\n        container.style.position = 'absolute';\n        container.style.top = '-50000px';\n        container.style.width = '50000px';\n        const regularDomNode = document.createElement('div');\n        applyFontInfo(regularDomNode, this._bareFontInfo);\n        container.appendChild(regularDomNode);\n        const boldDomNode = document.createElement('div');\n        applyFontInfo(boldDomNode, this._bareFontInfo);\n        boldDomNode.style.fontWeight = 'bold';\n        container.appendChild(boldDomNode);\n        const italicDomNode = document.createElement('div');\n        applyFontInfo(italicDomNode, this._bareFontInfo);\n        italicDomNode.style.fontStyle = 'italic';\n        container.appendChild(italicDomNode);\n        const testElements = [];\n        for (const request of this._requests) {\n            let parent;\n            if (request.type === 0 /* CharWidthRequestType.Regular */) {\n                parent = regularDomNode;\n            }\n            if (request.type === 2 /* CharWidthRequestType.Bold */) {\n                parent = boldDomNode;\n            }\n            if (request.type === 1 /* CharWidthRequestType.Italic */) {\n                parent = italicDomNode;\n            }\n            parent.appendChild(document.createElement('br'));\n            const testElement = document.createElement('span');\n            DomCharWidthReader._render(testElement, request);\n            parent.appendChild(testElement);\n            testElements.push(testElement);\n        }\n        this._container = container;\n        this._testElements = testElements;\n    }\n    static _render(testElement, request) {\n        if (request.chr === ' ') {\n            let htmlString = '\\u00a0';\n            // Repeat character 256 (2^8) times\n            for (let i = 0; i < 8; i++) {\n                htmlString += htmlString;\n            }\n            testElement.innerText = htmlString;\n        }\n        else {\n            let testString = request.chr;\n            // Repeat character 256 (2^8) times\n            for (let i = 0; i < 8; i++) {\n                testString += testString;\n            }\n            testElement.textContent = testString;\n        }\n    }\n    _readFromDomElements() {\n        for (let i = 0, len = this._requests.length; i < len; i++) {\n            const request = this._requests[i];\n            const testElement = this._testElements[i];\n            request.fulfill(testElement.offsetWidth / 256);\n        }\n    }\n}\nfunction readCharWidths(targetWindow, bareFontInfo, requests) {\n    const reader = new DomCharWidthReader(bareFontInfo, requests);\n    reader.read(targetWindow);\n}\n\nexport { CharWidthRequest, readCharWidths };\n","import { Emitter } from '../../../base/common/event.js';\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 *--------------------------------------------------------------------------------------------*/\nconst EditorZoom = new class {\n    constructor() {\n        this._zoomLevel = 0;\n        this._onDidChangeZoomLevel = new Emitter();\n        this.onDidChangeZoomLevel = this._onDidChangeZoomLevel.event;\n    }\n    getZoomLevel() {\n        return this._zoomLevel;\n    }\n    setZoomLevel(zoomLevel) {\n        zoomLevel = Math.min(Math.max(-5, zoomLevel), 20);\n        if (this._zoomLevel === zoomLevel) {\n            return;\n        }\n        this._zoomLevel = zoomLevel;\n        this._onDidChangeZoomLevel.fire(this._zoomLevel);\n    }\n};\n\nexport { EditorZoom };\n","import { isMacintosh, isWindows } from '../../../base/common/platform.js';\nimport { EditorZoom } from './editorZoom.js';\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/**\n * Determined from empirical observations.\n * @internal\n */\nconst GOLDEN_LINE_HEIGHT_RATIO = isMacintosh ? 1.5 : 1.35;\n/**\n * @internal\n */\nconst MINIMUM_LINE_HEIGHT = 8;\nclass BareFontInfo {\n    /**\n     * @internal\n     */\n    static _create(fontFamily, fontWeight, fontSize, fontFeatureSettings, fontVariationSettings, lineHeight, letterSpacing, pixelRatio, ignoreEditorZoom) {\n        if (lineHeight === 0) {\n            lineHeight = GOLDEN_LINE_HEIGHT_RATIO * fontSize;\n        }\n        else if (lineHeight < MINIMUM_LINE_HEIGHT) {\n            // Values too small to be line heights in pixels are in ems.\n            lineHeight = lineHeight * fontSize;\n        }\n        // Enforce integer, minimum constraints\n        lineHeight = Math.round(lineHeight);\n        if (lineHeight < MINIMUM_LINE_HEIGHT) {\n            lineHeight = MINIMUM_LINE_HEIGHT;\n        }\n        const editorZoomLevelMultiplier = 1 + (ignoreEditorZoom ? 0 : EditorZoom.getZoomLevel() * 0.1);\n        fontSize *= editorZoomLevelMultiplier;\n        lineHeight *= editorZoomLevelMultiplier;\n        if (fontVariationSettings === FONT_VARIATION_TRANSLATE) {\n            if (fontWeight === 'normal' || fontWeight === 'bold') {\n                fontVariationSettings = FONT_VARIATION_OFF;\n            }\n            else {\n                const fontWeightAsNumber = parseInt(fontWeight, 10);\n                fontVariationSettings = `'wght' ${fontWeightAsNumber}`;\n                fontWeight = 'normal';\n            }\n        }\n        return new BareFontInfo({\n            pixelRatio: pixelRatio,\n            fontFamily: fontFamily,\n            fontWeight: fontWeight,\n            fontSize: fontSize,\n            fontFeatureSettings: fontFeatureSettings,\n            fontVariationSettings,\n            lineHeight: lineHeight,\n            letterSpacing: letterSpacing\n        });\n    }\n    /**\n     * @internal\n     */\n    constructor(opts) {\n        this._bareFontInfoBrand = undefined;\n        this.pixelRatio = opts.pixelRatio;\n        this.fontFamily = String(opts.fontFamily);\n        this.fontWeight = String(opts.fontWeight);\n        this.fontSize = opts.fontSize;\n        this.fontFeatureSettings = opts.fontFeatureSettings;\n        this.fontVariationSettings = opts.fontVariationSettings;\n        this.lineHeight = opts.lineHeight | 0;\n        this.letterSpacing = opts.letterSpacing;\n    }\n    /**\n     * @internal\n     */\n    getId() {\n        return `${this.pixelRatio}-${this.fontFamily}-${this.fontWeight}-${this.fontSize}-${this.fontFeatureSettings}-${this.fontVariationSettings}-${this.lineHeight}-${this.letterSpacing}`;\n    }\n    /**\n     * @internal\n     */\n    getMassagedFontFamily() {\n        const fallbackFontFamily = EDITOR_FONT_DEFAULTS.fontFamily;\n        const fontFamily = BareFontInfo._wrapInQuotes(this.fontFamily);\n        if (this.fontFamily !== fallbackFontFamily) {\n            return `${fontFamily}, ${fallbackFontFamily}`;\n        }\n        return fontFamily;\n    }\n    static _wrapInQuotes(fontFamily) {\n        if (/[,\"']/.test(fontFamily)) {\n            // Looks like the font family might be already escaped\n            return fontFamily;\n        }\n        if (/[+ ]/.test(fontFamily)) {\n            // Wrap a font family using + or <space> with quotes\n            return `\"${fontFamily}\"`;\n        }\n        return fontFamily;\n    }\n}\n// change this whenever `FontInfo` members are changed\nconst SERIALIZED_FONT_INFO_VERSION = 2;\nclass FontInfo extends BareFontInfo {\n    /**\n     * @internal\n     */\n    constructor(opts, isTrusted) {\n        super(opts);\n        this._editorStylingBrand = undefined;\n        this.version = SERIALIZED_FONT_INFO_VERSION;\n        this.isTrusted = isTrusted;\n        this.isMonospace = opts.isMonospace;\n        this.typicalHalfwidthCharacterWidth = opts.typicalHalfwidthCharacterWidth;\n        this.typicalFullwidthCharacterWidth = opts.typicalFullwidthCharacterWidth;\n        this.canUseHalfwidthRightwardsArrow = opts.canUseHalfwidthRightwardsArrow;\n        this.spaceWidth = opts.spaceWidth;\n        this.middotWidth = opts.middotWidth;\n        this.wsmiddotWidth = opts.wsmiddotWidth;\n        this.maxDigitWidth = opts.maxDigitWidth;\n    }\n    /**\n     * @internal\n     */\n    equals(other) {\n        return (this.fontFamily === other.fontFamily\n            && this.fontWeight === other.fontWeight\n            && this.fontSize === other.fontSize\n            && this.fontFeatureSettings === other.fontFeatureSettings\n            && this.fontVariationSettings === other.fontVariationSettings\n            && this.lineHeight === other.lineHeight\n            && this.letterSpacing === other.letterSpacing\n            && this.typicalHalfwidthCharacterWidth === other.typicalHalfwidthCharacterWidth\n            && this.typicalFullwidthCharacterWidth === other.typicalFullwidthCharacterWidth\n            && this.canUseHalfwidthRightwardsArrow === other.canUseHalfwidthRightwardsArrow\n            && this.spaceWidth === other.spaceWidth\n            && this.middotWidth === other.middotWidth\n            && this.wsmiddotWidth === other.wsmiddotWidth\n            && this.maxDigitWidth === other.maxDigitWidth);\n    }\n}\n/**\n * @internal\n */\nconst FONT_VARIATION_OFF = 'normal';\n/**\n * @internal\n */\nconst FONT_VARIATION_TRANSLATE = 'translate';\n/**\n * @internal\n */\nconst DEFAULT_WINDOWS_FONT_FAMILY = 'Consolas, \\'Courier New\\', monospace';\n/**\n * @internal\n */\nconst DEFAULT_MAC_FONT_FAMILY = 'Menlo, Monaco, \\'Courier New\\', monospace';\n/**\n * @internal\n */\nconst DEFAULT_LINUX_FONT_FAMILY = '\\'Droid Sans Mono\\', \\'monospace\\', monospace';\n/**\n * @internal\n */\nconst EDITOR_FONT_DEFAULTS = {\n    fontFamily: (isMacintosh ? DEFAULT_MAC_FONT_FAMILY : (isWindows ? DEFAULT_WINDOWS_FONT_FAMILY : DEFAULT_LINUX_FONT_FAMILY)),\n    fontWeight: 'normal',\n    fontSize: (isMacintosh ? 12 : 14),\n    lineHeight: 0,\n    letterSpacing: 0,\n};\n\nexport { BareFontInfo, DEFAULT_LINUX_FONT_FAMILY, DEFAULT_MAC_FONT_FAMILY, DEFAULT_WINDOWS_FONT_FAMILY, EDITOR_FONT_DEFAULTS, FONT_VARIATION_OFF, FONT_VARIATION_TRANSLATE, FontInfo, GOLDEN_LINE_HEIGHT_RATIO, MINIMUM_LINE_HEIGHT, SERIALIZED_FONT_INFO_VERSION };\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 *--------------------------------------------------------------------------------------------*/\nconst EDITOR_MODEL_DEFAULTS = {\n    tabSize: 4,\n    indentSize: 4,\n    insertSpaces: true,\n    detectIndentation: true,\n    trimAutoWhitespace: true,\n    largeFileOptimizations: true,\n    bracketPairColorizationOptions: {\n        enabled: true,\n        independentColorPoolPerBracketType: false,\n    },\n};\n\nexport { EDITOR_MODEL_DEFAULTS };\n","import { equals as equals$1 } from '../../../base/common/arrays.js';\nimport { equals } from '../../../base/common/objects.js';\nimport { isLinux, isMacintosh, isChrome, isEdge, isNative } from '../../../base/common/platform.js';\nimport { EDITOR_FONT_DEFAULTS, FONT_VARIATION_OFF, FONT_VARIATION_TRANSLATE, FontInfo } from './fontInfo.js';\nimport { EDITOR_MODEL_DEFAULTS } from '../core/misc/textModelDefaults.js';\nimport { USUAL_WORD_SEPARATORS } from '../core/wordHelper.js';\nimport { localize } from '../../../nls.js';\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/**\n * @internal\n * The width of the minimap gutter, in pixels.\n */\nconst MINIMAP_GUTTER_WIDTH = 8;\n//#endregion\n/**\n * An event describing that the configuration of the editor has changed.\n */\nclass ConfigurationChangedEvent {\n    /**\n     * @internal\n     */\n    constructor(values) {\n        this._values = values;\n    }\n    hasChanged(id) {\n        return this._values[id];\n    }\n}\n/**\n * @internal\n */\nclass ComputeOptionsMemory {\n    constructor() {\n        this.stableMinimapLayoutInput = null;\n        this.stableFitMaxMinimapScale = 0;\n        this.stableFitRemainingWidth = 0;\n    }\n}\n/**\n * @internal\n */\nclass BaseEditorOption {\n    constructor(id, name, defaultValue, schema) {\n        this.id = id;\n        this.name = name;\n        this.defaultValue = defaultValue;\n        this.schema = schema;\n    }\n    applyUpdate(value, update) {\n        return applyUpdate(value, update);\n    }\n    compute(env, options, value) {\n        return value;\n    }\n}\nclass ApplyUpdateResult {\n    constructor(newValue, didChange) {\n        this.newValue = newValue;\n        this.didChange = didChange;\n    }\n}\nfunction applyUpdate(value, update) {\n    if (typeof value !== 'object' || typeof update !== 'object' || !value || !update) {\n        return new ApplyUpdateResult(update, value !== update);\n    }\n    if (Array.isArray(value) || Array.isArray(update)) {\n        const arrayEquals = Array.isArray(value) && Array.isArray(update) && equals$1(value, update);\n        return new ApplyUpdateResult(update, !arrayEquals);\n    }\n    let didChange = false;\n    for (const key in update) {\n        if (update.hasOwnProperty(key)) {\n            const result = applyUpdate(value[key], update[key]);\n            if (result.didChange) {\n                value[key] = result.newValue;\n                didChange = true;\n            }\n        }\n    }\n    return new ApplyUpdateResult(value, didChange);\n}\n/**\n * @internal\n */\nclass ComputedEditorOption {\n    constructor(id, defaultValue) {\n        this.schema = undefined;\n        this.id = id;\n        this.name = '_never_';\n        this.defaultValue = defaultValue;\n    }\n    applyUpdate(value, update) {\n        return applyUpdate(value, update);\n    }\n    validate(input) {\n        return this.defaultValue;\n    }\n}\nclass SimpleEditorOption {\n    constructor(id, name, defaultValue, schema) {\n        this.id = id;\n        this.name = name;\n        this.defaultValue = defaultValue;\n        this.schema = schema;\n    }\n    applyUpdate(value, update) {\n        return applyUpdate(value, update);\n    }\n    compute(env, options, value) {\n        return value;\n    }\n}\n/**\n * @internal\n */\nfunction boolean(value, defaultValue) {\n    if (typeof value === 'undefined') {\n        return defaultValue;\n    }\n    if (value === 'false') {\n        // treat the string 'false' as false\n        return false;\n    }\n    return Boolean(value);\n}\nclass EditorBooleanOption extends SimpleEditorOption {\n    constructor(id, name, defaultValue, schema = undefined) {\n        if (typeof schema !== 'undefined') {\n            schema.type = 'boolean';\n            schema.default = defaultValue;\n        }\n        super(id, name, defaultValue, schema);\n    }\n    validate(input) {\n        return boolean(input, this.defaultValue);\n    }\n}\n/**\n * @internal\n */\nfunction clampedInt(value, defaultValue, minimum, maximum) {\n    if (typeof value === 'string') {\n        value = parseInt(value, 10);\n    }\n    if (typeof value !== 'number' || isNaN(value)) {\n        return defaultValue;\n    }\n    let r = value;\n    r = Math.max(minimum, r);\n    r = Math.min(maximum, r);\n    return r | 0;\n}\nclass EditorIntOption extends SimpleEditorOption {\n    static clampedInt(value, defaultValue, minimum, maximum) {\n        return clampedInt(value, defaultValue, minimum, maximum);\n    }\n    constructor(id, name, defaultValue, minimum, maximum, schema = undefined) {\n        if (typeof schema !== 'undefined') {\n            schema.type = 'integer';\n            schema.default = defaultValue;\n            schema.minimum = minimum;\n            schema.maximum = maximum;\n        }\n        super(id, name, defaultValue, schema);\n        this.minimum = minimum;\n        this.maximum = maximum;\n    }\n    validate(input) {\n        return EditorIntOption.clampedInt(input, this.defaultValue, this.minimum, this.maximum);\n    }\n}\n/**\n * @internal\n */\nfunction clampedFloat(value, defaultValue, minimum, maximum) {\n    if (typeof value === 'undefined') {\n        return defaultValue;\n    }\n    const r = EditorFloatOption.float(value, defaultValue);\n    return EditorFloatOption.clamp(r, minimum, maximum);\n}\nclass EditorFloatOption extends SimpleEditorOption {\n    static clamp(n, min, max) {\n        if (n < min) {\n            return min;\n        }\n        if (n > max) {\n            return max;\n        }\n        return n;\n    }\n    static float(value, defaultValue) {\n        if (typeof value === 'string') {\n            value = parseFloat(value);\n        }\n        if (typeof value !== 'number' || isNaN(value)) {\n            return defaultValue;\n        }\n        return value;\n    }\n    constructor(id, name, defaultValue, validationFn, schema, minimum, maximum) {\n        if (typeof schema !== 'undefined') {\n            schema.type = 'number';\n            schema.default = defaultValue;\n            schema.minimum = minimum;\n            schema.maximum = maximum;\n        }\n        super(id, name, defaultValue, schema);\n        this.validationFn = validationFn;\n        this.minimum = minimum;\n        this.maximum = maximum;\n    }\n    validate(input) {\n        return this.validationFn(EditorFloatOption.float(input, this.defaultValue));\n    }\n}\nclass EditorStringOption extends SimpleEditorOption {\n    static string(value, defaultValue) {\n        if (typeof value !== 'string') {\n            return defaultValue;\n        }\n        return value;\n    }\n    constructor(id, name, defaultValue, schema = undefined) {\n        if (typeof schema !== 'undefined') {\n            schema.type = 'string';\n            schema.default = defaultValue;\n        }\n        super(id, name, defaultValue, schema);\n    }\n    validate(input) {\n        return EditorStringOption.string(input, this.defaultValue);\n    }\n}\n/**\n * @internal\n */\nfunction stringSet(value, defaultValue, allowedValues, renamedValues) {\n    if (typeof value !== 'string') {\n        return defaultValue;\n    }\n    if (renamedValues && value in renamedValues) {\n        return renamedValues[value];\n    }\n    if (allowedValues.indexOf(value) === -1) {\n        return defaultValue;\n    }\n    return value;\n}\nclass EditorStringEnumOption extends SimpleEditorOption {\n    constructor(id, name, defaultValue, allowedValues, schema = undefined) {\n        if (typeof schema !== 'undefined') {\n            schema.type = 'string';\n            schema.enum = allowedValues.slice(0);\n            schema.default = defaultValue;\n        }\n        super(id, name, defaultValue, schema);\n        this._allowedValues = allowedValues;\n    }\n    validate(input) {\n        return stringSet(input, this.defaultValue, this._allowedValues);\n    }\n}\nclass EditorEnumOption extends BaseEditorOption {\n    constructor(id, name, defaultValue, defaultStringValue, allowedValues, convert, schema = undefined) {\n        if (typeof schema !== 'undefined') {\n            schema.type = 'string';\n            schema.enum = allowedValues;\n            schema.default = defaultStringValue;\n        }\n        super(id, name, defaultValue, schema);\n        this._allowedValues = allowedValues;\n        this._convert = convert;\n    }\n    validate(input) {\n        if (typeof input !== 'string') {\n            return this.defaultValue;\n        }\n        if (this._allowedValues.indexOf(input) === -1) {\n            return this.defaultValue;\n        }\n        return this._convert(input);\n    }\n}\n//#endregion\n//#region autoIndent\nfunction _autoIndentFromString(autoIndent) {\n    switch (autoIndent) {\n        case 'none': return 0 /* EditorAutoIndentStrategy.None */;\n        case 'keep': return 1 /* EditorAutoIndentStrategy.Keep */;\n        case 'brackets': return 2 /* EditorAutoIndentStrategy.Brackets */;\n        case 'advanced': return 3 /* EditorAutoIndentStrategy.Advanced */;\n        case 'full': return 4 /* EditorAutoIndentStrategy.Full */;\n    }\n}\n//#endregion\n//#region accessibilitySupport\nclass EditorAccessibilitySupport extends BaseEditorOption {\n    constructor() {\n        super(2 /* EditorOption.accessibilitySupport */, 'accessibilitySupport', 0 /* AccessibilitySupport.Unknown */, {\n            type: 'string',\n            enum: ['auto', 'on', 'off'],\n            enumDescriptions: [\n                localize(201, \"Use platform APIs to detect when a Screen Reader is attached.\"),\n                localize(202, \"Optimize for usage with a Screen Reader.\"),\n                localize(203, \"Assume a screen reader is not attached.\"),\n            ],\n            default: 'auto',\n            tags: ['accessibility'],\n            description: localize(204, \"Controls if the UI should run in a mode where it is optimized for screen readers.\")\n        });\n    }\n    validate(input) {\n        switch (input) {\n            case 'auto': return 0 /* AccessibilitySupport.Unknown */;\n            case 'off': return 1 /* AccessibilitySupport.Disabled */;\n            case 'on': return 2 /* AccessibilitySupport.Enabled */;\n        }\n        return this.defaultValue;\n    }\n    compute(env, options, value) {\n        if (value === 0 /* AccessibilitySupport.Unknown */) {\n            // The editor reads the `accessibilitySupport` from the environment\n            return env.accessibilitySupport;\n        }\n        return value;\n    }\n}\nclass EditorComments extends BaseEditorOption {\n    constructor() {\n        const defaults = {\n            insertSpace: true,\n            ignoreEmptyLines: true,\n        };\n        super(29 /* EditorOption.comments */, 'comments', defaults, {\n            'editor.comments.insertSpace': {\n                type: 'boolean',\n                default: defaults.insertSpace,\n                description: localize(205, \"Controls whether a space character is inserted when commenting.\")\n            },\n            'editor.comments.ignoreEmptyLines': {\n                type: 'boolean',\n                default: defaults.ignoreEmptyLines,\n                description: localize(206, 'Controls if empty lines should be ignored with toggle, add or remove actions for line comments.')\n            },\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            insertSpace: boolean(input.insertSpace, this.defaultValue.insertSpace),\n            ignoreEmptyLines: boolean(input.ignoreEmptyLines, this.defaultValue.ignoreEmptyLines),\n        };\n    }\n}\n/**\n * @internal\n */\nfunction cursorBlinkingStyleFromString(cursorBlinkingStyle) {\n    switch (cursorBlinkingStyle) {\n        case 'blink': return 1 /* TextEditorCursorBlinkingStyle.Blink */;\n        case 'smooth': return 2 /* TextEditorCursorBlinkingStyle.Smooth */;\n        case 'phase': return 3 /* TextEditorCursorBlinkingStyle.Phase */;\n        case 'expand': return 4 /* TextEditorCursorBlinkingStyle.Expand */;\n        case 'solid': return 5 /* TextEditorCursorBlinkingStyle.Solid */;\n    }\n}\n//#endregion\n//#region cursorStyle\n/**\n * The style in which the editor's cursor should be rendered.\n */\nvar TextEditorCursorStyle;\n(function (TextEditorCursorStyle) {\n    /**\n     * As a vertical line (sitting between two characters).\n     */\n    TextEditorCursorStyle[TextEditorCursorStyle[\"Line\"] = 1] = \"Line\";\n    /**\n     * As a block (sitting on top of a character).\n     */\n    TextEditorCursorStyle[TextEditorCursorStyle[\"Block\"] = 2] = \"Block\";\n    /**\n     * As a horizontal line (sitting under a character).\n     */\n    TextEditorCursorStyle[TextEditorCursorStyle[\"Underline\"] = 3] = \"Underline\";\n    /**\n     * As a thin vertical line (sitting between two characters).\n     */\n    TextEditorCursorStyle[TextEditorCursorStyle[\"LineThin\"] = 4] = \"LineThin\";\n    /**\n     * As an outlined block (sitting on top of a character).\n     */\n    TextEditorCursorStyle[TextEditorCursorStyle[\"BlockOutline\"] = 5] = \"BlockOutline\";\n    /**\n     * As a thin horizontal line (sitting under a character).\n     */\n    TextEditorCursorStyle[TextEditorCursorStyle[\"UnderlineThin\"] = 6] = \"UnderlineThin\";\n})(TextEditorCursorStyle || (TextEditorCursorStyle = {}));\n/**\n * @internal\n */\nfunction cursorStyleFromString(cursorStyle) {\n    switch (cursorStyle) {\n        case 'line': return TextEditorCursorStyle.Line;\n        case 'block': return TextEditorCursorStyle.Block;\n        case 'underline': return TextEditorCursorStyle.Underline;\n        case 'line-thin': return TextEditorCursorStyle.LineThin;\n        case 'block-outline': return TextEditorCursorStyle.BlockOutline;\n        case 'underline-thin': return TextEditorCursorStyle.UnderlineThin;\n    }\n}\n//#endregion\n//#region editorClassName\nclass EditorClassName extends ComputedEditorOption {\n    constructor() {\n        super(162 /* EditorOption.editorClassName */, '');\n    }\n    compute(env, options, _) {\n        const classNames = ['monaco-editor'];\n        if (options.get(48 /* EditorOption.extraEditorClassName */)) {\n            classNames.push(options.get(48 /* EditorOption.extraEditorClassName */));\n        }\n        if (env.extraEditorClassName) {\n            classNames.push(env.extraEditorClassName);\n        }\n        if (options.get(82 /* EditorOption.mouseStyle */) === 'default') {\n            classNames.push('mouse-default');\n        }\n        else if (options.get(82 /* EditorOption.mouseStyle */) === 'copy') {\n            classNames.push('mouse-copy');\n        }\n        if (options.get(127 /* EditorOption.showUnused */)) {\n            classNames.push('showUnused');\n        }\n        if (options.get(157 /* EditorOption.showDeprecated */)) {\n            classNames.push('showDeprecated');\n        }\n        return classNames.join(' ');\n    }\n}\n//#endregion\n//#region emptySelectionClipboard\nclass EditorEmptySelectionClipboard extends EditorBooleanOption {\n    constructor() {\n        super(45 /* EditorOption.emptySelectionClipboard */, 'emptySelectionClipboard', true, { description: localize(207, \"Controls whether copying without a selection copies the current line.\") });\n    }\n    compute(env, options, value) {\n        return value && env.emptySelectionClipboard;\n    }\n}\nclass EditorFind extends BaseEditorOption {\n    constructor() {\n        const defaults = {\n            cursorMoveOnType: true,\n            findOnType: true,\n            seedSearchStringFromSelection: 'always',\n            autoFindInSelection: 'never',\n            globalFindClipboard: false,\n            addExtraSpaceOnTop: true,\n            loop: true,\n            history: 'workspace',\n            replaceHistory: 'workspace',\n        };\n        super(50 /* EditorOption.find */, 'find', defaults, {\n            'editor.find.cursorMoveOnType': {\n                type: 'boolean',\n                default: defaults.cursorMoveOnType,\n                description: localize(208, \"Controls whether the cursor should jump to find matches while typing.\")\n            },\n            'editor.find.seedSearchStringFromSelection': {\n                type: 'string',\n                enum: ['never', 'always', 'selection'],\n                default: defaults.seedSearchStringFromSelection,\n                enumDescriptions: [\n                    localize(209, 'Never seed search string from the editor selection.'),\n                    localize(210, 'Always seed search string from the editor selection, including word at cursor position.'),\n                    localize(211, 'Only seed search string from the editor selection.')\n                ],\n                description: localize(212, \"Controls whether the search string in the Find Widget is seeded from the editor selection.\")\n            },\n            'editor.find.autoFindInSelection': {\n                type: 'string',\n                enum: ['never', 'always', 'multiline'],\n                default: defaults.autoFindInSelection,\n                enumDescriptions: [\n                    localize(213, 'Never turn on Find in Selection automatically (default).'),\n                    localize(214, 'Always turn on Find in Selection automatically.'),\n                    localize(215, 'Turn on Find in Selection automatically when multiple lines of content are selected.')\n                ],\n                description: localize(216, \"Controls the condition for turning on Find in Selection automatically.\")\n            },\n            'editor.find.globalFindClipboard': {\n                type: 'boolean',\n                default: defaults.globalFindClipboard,\n                description: localize(217, \"Controls whether the Find Widget should read or modify the shared find clipboard on macOS.\"),\n                included: isMacintosh\n            },\n            'editor.find.addExtraSpaceOnTop': {\n                type: 'boolean',\n                default: defaults.addExtraSpaceOnTop,\n                description: localize(218, \"Controls whether the Find Widget should add extra lines on top of the editor. When true, you can scroll beyond the first line when the Find Widget is visible.\")\n            },\n            'editor.find.loop': {\n                type: 'boolean',\n                default: defaults.loop,\n                description: localize(219, \"Controls whether the search automatically restarts from the beginning (or the end) when no further matches can be found.\")\n            },\n            'editor.find.history': {\n                type: 'string',\n                enum: ['never', 'workspace'],\n                default: 'workspace',\n                enumDescriptions: [\n                    localize(220, 'Do not store search history from the find widget.'),\n                    localize(221, 'Store search history across the active workspace'),\n                ],\n                description: localize(222, \"Controls how the find widget history should be stored\")\n            },\n            'editor.find.replaceHistory': {\n                type: 'string',\n                enum: ['never', 'workspace'],\n                default: 'workspace',\n                enumDescriptions: [\n                    localize(223, 'Do not store history from the replace widget.'),\n                    localize(224, 'Store replace history across the active workspace'),\n                ],\n                description: localize(225, \"Controls how the replace widget history should be stored\")\n            },\n            'editor.find.findOnType': {\n                type: 'boolean',\n                default: defaults.findOnType,\n                description: localize(226, \"Controls whether the Find Widget should search as you type.\")\n            },\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            cursorMoveOnType: boolean(input.cursorMoveOnType, this.defaultValue.cursorMoveOnType),\n            findOnType: boolean(input.findOnType, this.defaultValue.findOnType),\n            seedSearchStringFromSelection: typeof input.seedSearchStringFromSelection === 'boolean'\n                ? (input.seedSearchStringFromSelection ? 'always' : 'never')\n                : stringSet(input.seedSearchStringFromSelection, this.defaultValue.seedSearchStringFromSelection, ['never', 'always', 'selection']),\n            autoFindInSelection: typeof input.autoFindInSelection === 'boolean'\n                ? (input.autoFindInSelection ? 'always' : 'never')\n                : stringSet(input.autoFindInSelection, this.defaultValue.autoFindInSelection, ['never', 'always', 'multiline']),\n            globalFindClipboard: boolean(input.globalFindClipboard, this.defaultValue.globalFindClipboard),\n            addExtraSpaceOnTop: boolean(input.addExtraSpaceOnTop, this.defaultValue.addExtraSpaceOnTop),\n            loop: boolean(input.loop, this.defaultValue.loop),\n            history: stringSet(input.history, this.defaultValue.history, ['never', 'workspace']),\n            replaceHistory: stringSet(input.replaceHistory, this.defaultValue.replaceHistory, ['never', 'workspace']),\n        };\n    }\n}\n//#endregion\n//#region fontLigatures\n/**\n * @internal\n */\nclass EditorFontLigatures extends BaseEditorOption {\n    static { this.OFF = '\"liga\" off, \"calt\" off'; }\n    static { this.ON = '\"liga\" on, \"calt\" on'; }\n    constructor() {\n        super(60 /* EditorOption.fontLigatures */, 'fontLigatures', EditorFontLigatures.OFF, {\n            anyOf: [\n                {\n                    type: 'boolean',\n                    description: localize(227, \"Enables/Disables font ligatures ('calt' and 'liga' font features). Change this to a string for fine-grained control of the 'font-feature-settings' CSS property.\"),\n                },\n                {\n                    type: 'string',\n                    description: localize(228, \"Explicit 'font-feature-settings' CSS property. A boolean can be passed instead if one only needs to turn on/off ligatures.\")\n                }\n            ],\n            description: localize(229, \"Configures font ligatures or font features. Can be either a boolean to enable/disable ligatures or a string for the value of the CSS 'font-feature-settings' property.\"),\n            default: false\n        });\n    }\n    validate(input) {\n        if (typeof input === 'undefined') {\n            return this.defaultValue;\n        }\n        if (typeof input === 'string') {\n            if (input === 'false' || input.length === 0) {\n                return EditorFontLigatures.OFF;\n            }\n            if (input === 'true') {\n                return EditorFontLigatures.ON;\n            }\n            return input;\n        }\n        if (Boolean(input)) {\n            return EditorFontLigatures.ON;\n        }\n        return EditorFontLigatures.OFF;\n    }\n}\n//#endregion\n//#region fontVariations\n/**\n * @internal\n */\nclass EditorFontVariations extends BaseEditorOption {\n    // Text is laid out using default settings.\n    static { this.OFF = FONT_VARIATION_OFF; }\n    // Translate `fontWeight` config to the `font-variation-settings` CSS property.\n    static { this.TRANSLATE = FONT_VARIATION_TRANSLATE; }\n    constructor() {\n        super(63 /* EditorOption.fontVariations */, 'fontVariations', EditorFontVariations.OFF, {\n            anyOf: [\n                {\n                    type: 'boolean',\n                    description: localize(230, \"Enables/Disables the translation from font-weight to font-variation-settings. Change this to a string for fine-grained control of the 'font-variation-settings' CSS property.\"),\n                },\n                {\n                    type: 'string',\n                    description: localize(231, \"Explicit 'font-variation-settings' CSS property. A boolean can be passed instead if one only needs to translate font-weight to font-variation-settings.\")\n                }\n            ],\n            description: localize(232, \"Configures font variations. Can be either a boolean to enable/disable the translation from font-weight to font-variation-settings or a string for the value of the CSS 'font-variation-settings' property.\"),\n            default: false\n        });\n    }\n    validate(input) {\n        if (typeof input === 'undefined') {\n            return this.defaultValue;\n        }\n        if (typeof input === 'string') {\n            if (input === 'false') {\n                return EditorFontVariations.OFF;\n            }\n            if (input === 'true') {\n                return EditorFontVariations.TRANSLATE;\n            }\n            return input;\n        }\n        if (Boolean(input)) {\n            return EditorFontVariations.TRANSLATE;\n        }\n        return EditorFontVariations.OFF;\n    }\n    compute(env, options, value) {\n        // The value is computed from the fontWeight if it is true.\n        // So take the result from env.fontInfo\n        return env.fontInfo.fontVariationSettings;\n    }\n}\n//#endregion\n//#region fontInfo\nclass EditorFontInfo extends ComputedEditorOption {\n    constructor() {\n        super(59 /* EditorOption.fontInfo */, new FontInfo({\n            pixelRatio: 0,\n            fontFamily: '',\n            fontWeight: '',\n            fontSize: 0,\n            fontFeatureSettings: '',\n            fontVariationSettings: '',\n            lineHeight: 0,\n            letterSpacing: 0,\n            isMonospace: false,\n            typicalHalfwidthCharacterWidth: 0,\n            typicalFullwidthCharacterWidth: 0,\n            canUseHalfwidthRightwardsArrow: false,\n            spaceWidth: 0,\n            middotWidth: 0,\n            wsmiddotWidth: 0,\n            maxDigitWidth: 0,\n        }, false));\n    }\n    compute(env, options, _) {\n        return env.fontInfo;\n    }\n}\n//#endregion\n//#region effectiveCursorStyle\nclass EffectiveCursorStyle extends ComputedEditorOption {\n    constructor() {\n        super(161 /* EditorOption.effectiveCursorStyle */, TextEditorCursorStyle.Line);\n    }\n    compute(env, options, _) {\n        return env.inputMode === 'overtype' ?\n            options.get(92 /* EditorOption.overtypeCursorStyle */) :\n            options.get(34 /* EditorOption.cursorStyle */);\n    }\n}\n//#endregion\n//#region effectiveExperimentalEditContext\nclass EffectiveEditContextEnabled extends ComputedEditorOption {\n    constructor() {\n        super(170 /* EditorOption.effectiveEditContext */, false);\n    }\n    compute(env, options) {\n        return env.editContextSupported && options.get(44 /* EditorOption.editContext */);\n    }\n}\n//#endregion\n//#region effectiveAllowVariableFonts\nclass EffectiveAllowVariableFonts extends ComputedEditorOption {\n    constructor() {\n        super(172 /* EditorOption.effectiveAllowVariableFonts */, false);\n    }\n    compute(env, options) {\n        const accessibilitySupport = env.accessibilitySupport;\n        if (accessibilitySupport === 2 /* AccessibilitySupport.Enabled */) {\n            return options.get(7 /* EditorOption.allowVariableFontsInAccessibilityMode */);\n        }\n        else {\n            return options.get(6 /* EditorOption.allowVariableFonts */);\n        }\n    }\n}\n//#engregion\n//#region fontSize\nclass EditorFontSize extends SimpleEditorOption {\n    constructor() {\n        super(61 /* EditorOption.fontSize */, 'fontSize', EDITOR_FONT_DEFAULTS.fontSize, {\n            type: 'number',\n            minimum: 6,\n            maximum: 100,\n            default: EDITOR_FONT_DEFAULTS.fontSize,\n            description: localize(233, \"Controls the font size in pixels.\")\n        });\n    }\n    validate(input) {\n        const r = EditorFloatOption.float(input, this.defaultValue);\n        if (r === 0) {\n            return EDITOR_FONT_DEFAULTS.fontSize;\n        }\n        return EditorFloatOption.clamp(r, 6, 100);\n    }\n    compute(env, options, value) {\n        // The final fontSize respects the editor zoom level.\n        // So take the result from env.fontInfo\n        return env.fontInfo.fontSize;\n    }\n}\n//#endregion\n//#region fontWeight\nclass EditorFontWeight extends BaseEditorOption {\n    static { this.SUGGESTION_VALUES = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900']; }\n    static { this.MINIMUM_VALUE = 1; }\n    static { this.MAXIMUM_VALUE = 1000; }\n    constructor() {\n        super(62 /* EditorOption.fontWeight */, 'fontWeight', EDITOR_FONT_DEFAULTS.fontWeight, {\n            anyOf: [\n                {\n                    type: 'number',\n                    minimum: EditorFontWeight.MINIMUM_VALUE,\n                    maximum: EditorFontWeight.MAXIMUM_VALUE,\n                    errorMessage: localize(234, \"Only \\\"normal\\\" and \\\"bold\\\" keywords or numbers between 1 and 1000 are allowed.\")\n                },\n                {\n                    type: 'string',\n                    pattern: '^(normal|bold|1000|[1-9][0-9]{0,2})$'\n                },\n                {\n                    enum: EditorFontWeight.SUGGESTION_VALUES\n                }\n            ],\n            default: EDITOR_FONT_DEFAULTS.fontWeight,\n            description: localize(235, \"Controls the font weight. Accepts \\\"normal\\\" and \\\"bold\\\" keywords or numbers between 1 and 1000.\")\n        });\n    }\n    validate(input) {\n        if (input === 'normal' || input === 'bold') {\n            return input;\n        }\n        return String(EditorIntOption.clampedInt(input, EDITOR_FONT_DEFAULTS.fontWeight, EditorFontWeight.MINIMUM_VALUE, EditorFontWeight.MAXIMUM_VALUE));\n    }\n}\nclass EditorGoToLocation extends BaseEditorOption {\n    constructor() {\n        const defaults = {\n            multiple: 'peek',\n            multipleDefinitions: 'peek',\n            multipleTypeDefinitions: 'peek',\n            multipleDeclarations: 'peek',\n            multipleImplementations: 'peek',\n            multipleReferences: 'peek',\n            multipleTests: 'peek',\n            alternativeDefinitionCommand: 'editor.action.goToReferences',\n            alternativeTypeDefinitionCommand: 'editor.action.goToReferences',\n            alternativeDeclarationCommand: 'editor.action.goToReferences',\n            alternativeImplementationCommand: '',\n            alternativeReferenceCommand: '',\n            alternativeTestsCommand: '',\n        };\n        const jsonSubset = {\n            type: 'string',\n            enum: ['peek', 'gotoAndPeek', 'goto'],\n            default: defaults.multiple,\n            enumDescriptions: [\n                localize(236, 'Show Peek view of the results (default)'),\n                localize(237, 'Go to the primary result and show a Peek view'),\n                localize(238, 'Go to the primary result and enable Peek-less navigation to others')\n            ]\n        };\n        const alternativeCommandOptions = ['', 'editor.action.referenceSearch.trigger', 'editor.action.goToReferences', 'editor.action.peekImplementation', 'editor.action.goToImplementation', 'editor.action.peekTypeDefinition', 'editor.action.goToTypeDefinition', 'editor.action.peekDeclaration', 'editor.action.revealDeclaration', 'editor.action.peekDefinition', 'editor.action.revealDefinitionAside', 'editor.action.revealDefinition'];\n        super(67 /* EditorOption.gotoLocation */, 'gotoLocation', defaults, {\n            'editor.gotoLocation.multiple': {\n                deprecationMessage: localize(239, \"This setting is deprecated, please use separate settings like 'editor.editor.gotoLocation.multipleDefinitions' or 'editor.editor.gotoLocation.multipleImplementations' instead.\"),\n            },\n            'editor.gotoLocation.multipleDefinitions': {\n                description: localize(240, \"Controls the behavior the 'Go to Definition'-command when multiple target locations exist.\"),\n                ...jsonSubset,\n            },\n            'editor.gotoLocation.multipleTypeDefinitions': {\n                description: localize(241, \"Controls the behavior the 'Go to Type Definition'-command when multiple target locations exist.\"),\n                ...jsonSubset,\n            },\n            'editor.gotoLocation.multipleDeclarations': {\n                description: localize(242, \"Controls the behavior the 'Go to Declaration'-command when multiple target locations exist.\"),\n                ...jsonSubset,\n            },\n            'editor.gotoLocation.multipleImplementations': {\n                description: localize(243, \"Controls the behavior the 'Go to Implementations'-command when multiple target locations exist.\"),\n                ...jsonSubset,\n            },\n            'editor.gotoLocation.multipleReferences': {\n                description: localize(244, \"Controls the behavior the 'Go to References'-command when multiple target locations exist.\"),\n                ...jsonSubset,\n            },\n            'editor.gotoLocation.alternativeDefinitionCommand': {\n                type: 'string',\n                default: defaults.alternativeDefinitionCommand,\n                enum: alternativeCommandOptions,\n                description: localize(245, \"Alternative command id that is being executed when the result of 'Go to Definition' is the current location.\")\n            },\n            'editor.gotoLocation.alternativeTypeDefinitionCommand': {\n                type: 'string',\n                default: defaults.alternativeTypeDefinitionCommand,\n                enum: alternativeCommandOptions,\n                description: localize(246, \"Alternative command id that is being executed when the result of 'Go to Type Definition' is the current location.\")\n            },\n            'editor.gotoLocation.alternativeDeclarationCommand': {\n                type: 'string',\n                default: defaults.alternativeDeclarationCommand,\n                enum: alternativeCommandOptions,\n                description: localize(247, \"Alternative command id that is being executed when the result of 'Go to Declaration' is the current location.\")\n            },\n            'editor.gotoLocation.alternativeImplementationCommand': {\n                type: 'string',\n                default: defaults.alternativeImplementationCommand,\n                enum: alternativeCommandOptions,\n                description: localize(248, \"Alternative command id that is being executed when the result of 'Go to Implementation' is the current location.\")\n            },\n            'editor.gotoLocation.alternativeReferenceCommand': {\n                type: 'string',\n                default: defaults.alternativeReferenceCommand,\n                enum: alternativeCommandOptions,\n                description: localize(249, \"Alternative command id that is being executed when the result of 'Go to Reference' is the current location.\")\n            },\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            multiple: stringSet(input.multiple, this.defaultValue.multiple, ['peek', 'gotoAndPeek', 'goto']),\n            multipleDefinitions: stringSet(input.multipleDefinitions, 'peek', ['peek', 'gotoAndPeek', 'goto']),\n            multipleTypeDefinitions: stringSet(input.multipleTypeDefinitions, 'peek', ['peek', 'gotoAndPeek', 'goto']),\n            multipleDeclarations: stringSet(input.multipleDeclarations, 'peek', ['peek', 'gotoAndPeek', 'goto']),\n            multipleImplementations: stringSet(input.multipleImplementations, 'peek', ['peek', 'gotoAndPeek', 'goto']),\n            multipleReferences: stringSet(input.multipleReferences, 'peek', ['peek', 'gotoAndPeek', 'goto']),\n            multipleTests: stringSet(input.multipleTests, 'peek', ['peek', 'gotoAndPeek', 'goto']),\n            alternativeDefinitionCommand: EditorStringOption.string(input.alternativeDefinitionCommand, this.defaultValue.alternativeDefinitionCommand),\n            alternativeTypeDefinitionCommand: EditorStringOption.string(input.alternativeTypeDefinitionCommand, this.defaultValue.alternativeTypeDefinitionCommand),\n            alternativeDeclarationCommand: EditorStringOption.string(input.alternativeDeclarationCommand, this.defaultValue.alternativeDeclarationCommand),\n            alternativeImplementationCommand: EditorStringOption.string(input.alternativeImplementationCommand, this.defaultValue.alternativeImplementationCommand),\n            alternativeReferenceCommand: EditorStringOption.string(input.alternativeReferenceCommand, this.defaultValue.alternativeReferenceCommand),\n            alternativeTestsCommand: EditorStringOption.string(input.alternativeTestsCommand, this.defaultValue.alternativeTestsCommand),\n        };\n    }\n}\nclass EditorHover extends BaseEditorOption {\n    constructor() {\n        const defaults = {\n            enabled: true,\n            delay: 300,\n            hidingDelay: 300,\n            sticky: true,\n            above: true,\n        };\n        super(69 /* EditorOption.hover */, 'hover', defaults, {\n            'editor.hover.enabled': {\n                type: 'boolean',\n                default: defaults.enabled,\n                description: localize(250, \"Controls whether the hover is shown.\")\n            },\n            'editor.hover.delay': {\n                type: 'number',\n                default: defaults.delay,\n                minimum: 0,\n                maximum: 10000,\n                description: localize(251, \"Controls the delay in milliseconds after which the hover is shown.\")\n            },\n            'editor.hover.sticky': {\n                type: 'boolean',\n                default: defaults.sticky,\n                description: localize(252, \"Controls whether the hover should remain visible when mouse is moved over it.\")\n            },\n            'editor.hover.hidingDelay': {\n                type: 'integer',\n                minimum: 0,\n                default: defaults.hidingDelay,\n                markdownDescription: localize(253, \"Controls the delay in milliseconds after which the hover is hidden. Requires `#editor.hover.sticky#` to be enabled.\")\n            },\n            'editor.hover.above': {\n                type: 'boolean',\n                default: defaults.above,\n                description: localize(254, \"Prefer showing hovers above the line, if there's space.\")\n            },\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            enabled: boolean(input.enabled, this.defaultValue.enabled),\n            delay: EditorIntOption.clampedInt(input.delay, this.defaultValue.delay, 0, 10000),\n            sticky: boolean(input.sticky, this.defaultValue.sticky),\n            hidingDelay: EditorIntOption.clampedInt(input.hidingDelay, this.defaultValue.hidingDelay, 0, 600000),\n            above: boolean(input.above, this.defaultValue.above),\n        };\n    }\n}\n/**\n * @internal\n */\nclass EditorLayoutInfoComputer extends ComputedEditorOption {\n    constructor() {\n        super(165 /* EditorOption.layoutInfo */, {\n            width: 0,\n            height: 0,\n            glyphMarginLeft: 0,\n            glyphMarginWidth: 0,\n            glyphMarginDecorationLaneCount: 0,\n            lineNumbersLeft: 0,\n            lineNumbersWidth: 0,\n            decorationsLeft: 0,\n            decorationsWidth: 0,\n            contentLeft: 0,\n            contentWidth: 0,\n            minimap: {\n                renderMinimap: 0 /* RenderMinimap.None */,\n                minimapLeft: 0,\n                minimapWidth: 0,\n                minimapHeightIsEditorHeight: false,\n                minimapIsSampling: false,\n                minimapScale: 1,\n                minimapLineHeight: 1,\n                minimapCanvasInnerWidth: 0,\n                minimapCanvasInnerHeight: 0,\n                minimapCanvasOuterWidth: 0,\n                minimapCanvasOuterHeight: 0,\n            },\n            viewportColumn: 0,\n            isWordWrapMinified: false,\n            isViewportWrapping: false,\n            wrappingColumn: -1,\n            verticalScrollbarWidth: 0,\n            horizontalScrollbarHeight: 0,\n            overviewRuler: {\n                top: 0,\n                width: 0,\n                height: 0,\n                right: 0\n            }\n        });\n    }\n    compute(env, options, _) {\n        return EditorLayoutInfoComputer.computeLayout(options, {\n            memory: env.memory,\n            outerWidth: env.outerWidth,\n            outerHeight: env.outerHeight,\n            isDominatedByLongLines: env.isDominatedByLongLines,\n            lineHeight: env.fontInfo.lineHeight,\n            viewLineCount: env.viewLineCount,\n            lineNumbersDigitCount: env.lineNumbersDigitCount,\n            typicalHalfwidthCharacterWidth: env.fontInfo.typicalHalfwidthCharacterWidth,\n            maxDigitWidth: env.fontInfo.maxDigitWidth,\n            pixelRatio: env.pixelRatio,\n            glyphMarginDecorationLaneCount: env.glyphMarginDecorationLaneCount\n        });\n    }\n    static computeContainedMinimapLineCount(input) {\n        const typicalViewportLineCount = input.height / input.lineHeight;\n        const extraLinesBeforeFirstLine = Math.floor(input.paddingTop / input.lineHeight);\n        let extraLinesBeyondLastLine = Math.floor(input.paddingBottom / input.lineHeight);\n        if (input.scrollBeyondLastLine) {\n            extraLinesBeyondLastLine = Math.max(extraLinesBeyondLastLine, typicalViewportLineCount - 1);\n        }\n        const desiredRatio = (extraLinesBeforeFirstLine + input.viewLineCount + extraLinesBeyondLastLine) / (input.pixelRatio * input.height);\n        const minimapLineCount = Math.floor(input.viewLineCount / desiredRatio);\n        return { typicalViewportLineCount, extraLinesBeforeFirstLine, extraLinesBeyondLastLine, desiredRatio, minimapLineCount };\n    }\n    static _computeMinimapLayout(input, memory) {\n        const outerWidth = input.outerWidth;\n        const outerHeight = input.outerHeight;\n        const pixelRatio = input.pixelRatio;\n        if (!input.minimap.enabled) {\n            return {\n                renderMinimap: 0 /* RenderMinimap.None */,\n                minimapLeft: 0,\n                minimapWidth: 0,\n                minimapHeightIsEditorHeight: false,\n                minimapIsSampling: false,\n                minimapScale: 1,\n                minimapLineHeight: 1,\n                minimapCanvasInnerWidth: 0,\n                minimapCanvasInnerHeight: Math.floor(pixelRatio * outerHeight),\n                minimapCanvasOuterWidth: 0,\n                minimapCanvasOuterHeight: outerHeight,\n            };\n        }\n        // Can use memory if only the `viewLineCount` and `remainingWidth` have changed\n        const stableMinimapLayoutInput = memory.stableMinimapLayoutInput;\n        const couldUseMemory = (stableMinimapLayoutInput\n            // && input.outerWidth === lastMinimapLayoutInput.outerWidth !!! INTENTIONAL OMITTED\n            && input.outerHeight === stableMinimapLayoutInput.outerHeight\n            && input.lineHeight === stableMinimapLayoutInput.lineHeight\n            && input.typicalHalfwidthCharacterWidth === stableMinimapLayoutInput.typicalHalfwidthCharacterWidth\n            && input.pixelRatio === stableMinimapLayoutInput.pixelRatio\n            && input.scrollBeyondLastLine === stableMinimapLayoutInput.scrollBeyondLastLine\n            && input.paddingTop === stableMinimapLayoutInput.paddingTop\n            && input.paddingBottom === stableMinimapLayoutInput.paddingBottom\n            && input.minimap.enabled === stableMinimapLayoutInput.minimap.enabled\n            && input.minimap.side === stableMinimapLayoutInput.minimap.side\n            && input.minimap.size === stableMinimapLayoutInput.minimap.size\n            && input.minimap.showSlider === stableMinimapLayoutInput.minimap.showSlider\n            && input.minimap.renderCharacters === stableMinimapLayoutInput.minimap.renderCharacters\n            && input.minimap.maxColumn === stableMinimapLayoutInput.minimap.maxColumn\n            && input.minimap.scale === stableMinimapLayoutInput.minimap.scale\n            && input.verticalScrollbarWidth === stableMinimapLayoutInput.verticalScrollbarWidth\n            // && input.viewLineCount === lastMinimapLayoutInput.viewLineCount !!! INTENTIONAL OMITTED\n            // && input.remainingWidth === lastMinimapLayoutInput.remainingWidth !!! INTENTIONAL OMITTED\n            && input.isViewportWrapping === stableMinimapLayoutInput.isViewportWrapping);\n        const lineHeight = input.lineHeight;\n        const typicalHalfwidthCharacterWidth = input.typicalHalfwidthCharacterWidth;\n        const scrollBeyondLastLine = input.scrollBeyondLastLine;\n        const minimapRenderCharacters = input.minimap.renderCharacters;\n        let minimapScale = (pixelRatio >= 2 ? Math.round(input.minimap.scale * 2) : input.minimap.scale);\n        const minimapMaxColumn = input.minimap.maxColumn;\n        const minimapSize = input.minimap.size;\n        const minimapSide = input.minimap.side;\n        const verticalScrollbarWidth = input.verticalScrollbarWidth;\n        const viewLineCount = input.viewLineCount;\n        const remainingWidth = input.remainingWidth;\n        const isViewportWrapping = input.isViewportWrapping;\n        const baseCharHeight = minimapRenderCharacters ? 2 : 3;\n        let minimapCanvasInnerHeight = Math.floor(pixelRatio * outerHeight);\n        const minimapCanvasOuterHeight = minimapCanvasInnerHeight / pixelRatio;\n        let minimapHeightIsEditorHeight = false;\n        let minimapIsSampling = false;\n        let minimapLineHeight = baseCharHeight * minimapScale;\n        let minimapCharWidth = minimapScale / pixelRatio;\n        let minimapWidthMultiplier = 1;\n        if (minimapSize === 'fill' || minimapSize === 'fit') {\n            const { typicalViewportLineCount, extraLinesBeforeFirstLine, extraLinesBeyondLastLine, desiredRatio, minimapLineCount } = EditorLayoutInfoComputer.computeContainedMinimapLineCount({\n                viewLineCount: viewLineCount,\n                scrollBeyondLastLine: scrollBeyondLastLine,\n                paddingTop: input.paddingTop,\n                paddingBottom: input.paddingBottom,\n                height: outerHeight,\n                lineHeight: lineHeight,\n                pixelRatio: pixelRatio\n            });\n            // ratio is intentionally not part of the layout to avoid the layout changing all the time\n            // when doing sampling\n            const ratio = viewLineCount / minimapLineCount;\n            if (ratio > 1) {\n                minimapHeightIsEditorHeight = true;\n                minimapIsSampling = true;\n                minimapScale = 1;\n                minimapLineHeight = 1;\n                minimapCharWidth = minimapScale / pixelRatio;\n            }\n            else {\n                let fitBecomesFill = false;\n                let maxMinimapScale = minimapScale + 1;\n                if (minimapSize === 'fit') {\n                    const effectiveMinimapHeight = Math.ceil((extraLinesBeforeFirstLine + viewLineCount + extraLinesBeyondLastLine) * minimapLineHeight);\n                    if (isViewportWrapping && couldUseMemory && remainingWidth <= memory.stableFitRemainingWidth) {\n                        // There is a loop when using `fit` and viewport wrapping:\n                        // - view line count impacts minimap layout\n                        // - minimap layout impacts viewport width\n                        // - viewport width impacts view line count\n                        // To break the loop, once we go to a smaller minimap scale, we try to stick with it.\n                        fitBecomesFill = true;\n                        maxMinimapScale = memory.stableFitMaxMinimapScale;\n                    }\n                    else {\n                        fitBecomesFill = (effectiveMinimapHeight > minimapCanvasInnerHeight);\n                    }\n                }\n                if (minimapSize === 'fill' || fitBecomesFill) {\n                    minimapHeightIsEditorHeight = true;\n                    const configuredMinimapScale = minimapScale;\n                    minimapLineHeight = Math.min(lineHeight * pixelRatio, Math.max(1, Math.floor(1 / desiredRatio)));\n                    if (isViewportWrapping && couldUseMemory && remainingWidth <= memory.stableFitRemainingWidth) {\n                        // There is a loop when using `fill` and viewport wrapping:\n                        // - view line count impacts minimap layout\n                        // - minimap layout impacts viewport width\n                        // - viewport width impacts view line count\n                        // To break the loop, once we go to a smaller minimap scale, we try to stick with it.\n                        maxMinimapScale = memory.stableFitMaxMinimapScale;\n                    }\n                    minimapScale = Math.min(maxMinimapScale, Math.max(1, Math.floor(minimapLineHeight / baseCharHeight)));\n                    if (minimapScale > configuredMinimapScale) {\n                        minimapWidthMultiplier = Math.min(2, minimapScale / configuredMinimapScale);\n                    }\n                    minimapCharWidth = minimapScale / pixelRatio / minimapWidthMultiplier;\n                    minimapCanvasInnerHeight = Math.ceil((Math.max(typicalViewportLineCount, extraLinesBeforeFirstLine + viewLineCount + extraLinesBeyondLastLine)) * minimapLineHeight);\n                    if (isViewportWrapping) {\n                        // remember for next time\n                        memory.stableMinimapLayoutInput = input;\n                        memory.stableFitRemainingWidth = remainingWidth;\n                        memory.stableFitMaxMinimapScale = minimapScale;\n                    }\n                    else {\n                        memory.stableMinimapLayoutInput = null;\n                        memory.stableFitRemainingWidth = 0;\n                    }\n                }\n            }\n        }\n        // Given:\n        // (leaving 2px for the cursor to have space after the last character)\n        // viewportColumn = (contentWidth - verticalScrollbarWidth - 2) / typicalHalfwidthCharacterWidth\n        // minimapWidth = viewportColumn * minimapCharWidth\n        // contentWidth = remainingWidth - minimapWidth\n        // What are good values for contentWidth and minimapWidth ?\n        // minimapWidth = ((contentWidth - verticalScrollbarWidth - 2) / typicalHalfwidthCharacterWidth) * minimapCharWidth\n        // typicalHalfwidthCharacterWidth * minimapWidth = (contentWidth - verticalScrollbarWidth - 2) * minimapCharWidth\n        // typicalHalfwidthCharacterWidth * minimapWidth = (remainingWidth - minimapWidth - verticalScrollbarWidth - 2) * minimapCharWidth\n        // (typicalHalfwidthCharacterWidth + minimapCharWidth) * minimapWidth = (remainingWidth - verticalScrollbarWidth - 2) * minimapCharWidth\n        // minimapWidth = ((remainingWidth - verticalScrollbarWidth - 2) * minimapCharWidth) / (typicalHalfwidthCharacterWidth + minimapCharWidth)\n        const minimapMaxWidth = Math.floor(minimapMaxColumn * minimapCharWidth);\n        const minimapWidth = Math.min(minimapMaxWidth, Math.max(0, Math.floor(((remainingWidth - verticalScrollbarWidth - 2) * minimapCharWidth) / (typicalHalfwidthCharacterWidth + minimapCharWidth))) + MINIMAP_GUTTER_WIDTH);\n        let minimapCanvasInnerWidth = Math.floor(pixelRatio * minimapWidth);\n        const minimapCanvasOuterWidth = minimapCanvasInnerWidth / pixelRatio;\n        minimapCanvasInnerWidth = Math.floor(minimapCanvasInnerWidth * minimapWidthMultiplier);\n        const renderMinimap = (minimapRenderCharacters ? 1 /* RenderMinimap.Text */ : 2 /* RenderMinimap.Blocks */);\n        const minimapLeft = (minimapSide === 'left' ? 0 : (outerWidth - minimapWidth - verticalScrollbarWidth));\n        return {\n            renderMinimap,\n            minimapLeft,\n            minimapWidth,\n            minimapHeightIsEditorHeight,\n            minimapIsSampling,\n            minimapScale,\n            minimapLineHeight,\n            minimapCanvasInnerWidth,\n            minimapCanvasInnerHeight,\n            minimapCanvasOuterWidth,\n            minimapCanvasOuterHeight,\n        };\n    }\n    static computeLayout(options, env) {\n        const outerWidth = env.outerWidth | 0;\n        const outerHeight = env.outerHeight | 0;\n        const lineHeight = env.lineHeight | 0;\n        const lineNumbersDigitCount = env.lineNumbersDigitCount | 0;\n        const typicalHalfwidthCharacterWidth = env.typicalHalfwidthCharacterWidth;\n        const maxDigitWidth = env.maxDigitWidth;\n        const pixelRatio = env.pixelRatio;\n        const viewLineCount = env.viewLineCount;\n        const wordWrapOverride2 = options.get(154 /* EditorOption.wordWrapOverride2 */);\n        const wordWrapOverride1 = (wordWrapOverride2 === 'inherit' ? options.get(153 /* EditorOption.wordWrapOverride1 */) : wordWrapOverride2);\n        const wordWrap = (wordWrapOverride1 === 'inherit' ? options.get(149 /* EditorOption.wordWrap */) : wordWrapOverride1);\n        const wordWrapColumn = options.get(152 /* EditorOption.wordWrapColumn */);\n        const isDominatedByLongLines = env.isDominatedByLongLines;\n        const showGlyphMargin = options.get(66 /* EditorOption.glyphMargin */);\n        const showLineNumbers = (options.get(76 /* EditorOption.lineNumbers */).renderType !== 0 /* RenderLineNumbersType.Off */);\n        const lineNumbersMinChars = options.get(77 /* EditorOption.lineNumbersMinChars */);\n        const scrollBeyondLastLine = options.get(119 /* EditorOption.scrollBeyondLastLine */);\n        const padding = options.get(96 /* EditorOption.padding */);\n        const minimap = options.get(81 /* EditorOption.minimap */);\n        const scrollbar = options.get(117 /* EditorOption.scrollbar */);\n        const verticalScrollbarWidth = scrollbar.verticalScrollbarSize;\n        const verticalScrollbarHasArrows = scrollbar.verticalHasArrows;\n        const scrollbarArrowSize = scrollbar.arrowSize;\n        const horizontalScrollbarHeight = scrollbar.horizontalScrollbarSize;\n        const folding = options.get(52 /* EditorOption.folding */);\n        const showFoldingDecoration = options.get(126 /* EditorOption.showFoldingControls */) !== 'never';\n        let lineDecorationsWidth = options.get(74 /* EditorOption.lineDecorationsWidth */);\n        if (folding && showFoldingDecoration) {\n            lineDecorationsWidth += 16;\n        }\n        let lineNumbersWidth = 0;\n        if (showLineNumbers) {\n            const digitCount = Math.max(lineNumbersDigitCount, lineNumbersMinChars);\n            lineNumbersWidth = Math.round(digitCount * maxDigitWidth);\n        }\n        let glyphMarginWidth = 0;\n        if (showGlyphMargin) {\n            glyphMarginWidth = lineHeight * env.glyphMarginDecorationLaneCount;\n        }\n        let glyphMarginLeft = 0;\n        let lineNumbersLeft = glyphMarginLeft + glyphMarginWidth;\n        let decorationsLeft = lineNumbersLeft + lineNumbersWidth;\n        let contentLeft = decorationsLeft + lineDecorationsWidth;\n        const remainingWidth = outerWidth - glyphMarginWidth - lineNumbersWidth - lineDecorationsWidth;\n        let isWordWrapMinified = false;\n        let isViewportWrapping = false;\n        let wrappingColumn = -1;\n        if (options.get(2 /* EditorOption.accessibilitySupport */) === 2 /* AccessibilitySupport.Enabled */ && wordWrapOverride1 === 'inherit' && isDominatedByLongLines) {\n            // Force viewport width wrapping if model is dominated by long lines\n            isWordWrapMinified = true;\n            isViewportWrapping = true;\n        }\n        else if (wordWrap === 'on' || wordWrap === 'bounded') {\n            isViewportWrapping = true;\n        }\n        else if (wordWrap === 'wordWrapColumn') {\n            wrappingColumn = wordWrapColumn;\n        }\n        const minimapLayout = EditorLayoutInfoComputer._computeMinimapLayout({\n            outerWidth: outerWidth,\n            outerHeight: outerHeight,\n            lineHeight: lineHeight,\n            typicalHalfwidthCharacterWidth: typicalHalfwidthCharacterWidth,\n            pixelRatio: pixelRatio,\n            scrollBeyondLastLine: scrollBeyondLastLine,\n            paddingTop: padding.top,\n            paddingBottom: padding.bottom,\n            minimap: minimap,\n            verticalScrollbarWidth: verticalScrollbarWidth,\n            viewLineCount: viewLineCount,\n            remainingWidth: remainingWidth,\n            isViewportWrapping: isViewportWrapping,\n        }, env.memory || new ComputeOptionsMemory());\n        if (minimapLayout.renderMinimap !== 0 /* RenderMinimap.None */ && minimapLayout.minimapLeft === 0) {\n            // the minimap is rendered to the left, so move everything to the right\n            glyphMarginLeft += minimapLayout.minimapWidth;\n            lineNumbersLeft += minimapLayout.minimapWidth;\n            decorationsLeft += minimapLayout.minimapWidth;\n            contentLeft += minimapLayout.minimapWidth;\n        }\n        const contentWidth = remainingWidth - minimapLayout.minimapWidth;\n        // (leaving 2px for the cursor to have space after the last character)\n        const viewportColumn = Math.max(1, Math.floor((contentWidth - verticalScrollbarWidth - 2) / typicalHalfwidthCharacterWidth));\n        const verticalArrowSize = (verticalScrollbarHasArrows ? scrollbarArrowSize : 0);\n        if (isViewportWrapping) {\n            // compute the actual wrappingColumn\n            wrappingColumn = Math.max(1, viewportColumn);\n            if (wordWrap === 'bounded') {\n                wrappingColumn = Math.min(wrappingColumn, wordWrapColumn);\n            }\n        }\n        return {\n            width: outerWidth,\n            height: outerHeight,\n            glyphMarginLeft: glyphMarginLeft,\n            glyphMarginWidth: glyphMarginWidth,\n            glyphMarginDecorationLaneCount: env.glyphMarginDecorationLaneCount,\n            lineNumbersLeft: lineNumbersLeft,\n            lineNumbersWidth: lineNumbersWidth,\n            decorationsLeft: decorationsLeft,\n            decorationsWidth: lineDecorationsWidth,\n            contentLeft: contentLeft,\n            contentWidth: contentWidth,\n            minimap: minimapLayout,\n            viewportColumn: viewportColumn,\n            isWordWrapMinified: isWordWrapMinified,\n            isViewportWrapping: isViewportWrapping,\n            wrappingColumn: wrappingColumn,\n            verticalScrollbarWidth: verticalScrollbarWidth,\n            horizontalScrollbarHeight: horizontalScrollbarHeight,\n            overviewRuler: {\n                top: verticalArrowSize,\n                width: verticalScrollbarWidth,\n                height: (outerHeight - 2 * verticalArrowSize),\n                right: 0\n            }\n        };\n    }\n}\n//#endregion\n//#region WrappingStrategy\nclass WrappingStrategy extends BaseEditorOption {\n    constructor() {\n        super(156 /* EditorOption.wrappingStrategy */, 'wrappingStrategy', 'simple', {\n            'editor.wrappingStrategy': {\n                enumDescriptions: [\n                    localize(255, \"Assumes that all characters are of the same width. This is a fast algorithm that works correctly for monospace fonts and certain scripts (like Latin characters) where glyphs are of equal width.\"),\n                    localize(256, \"Delegates wrapping points computation to the browser. This is a slow algorithm, that might cause freezes for large files, but it works correctly in all cases.\")\n                ],\n                type: 'string',\n                enum: ['simple', 'advanced'],\n                default: 'simple',\n                description: localize(257, \"Controls the algorithm that computes wrapping points. Note that when in accessibility mode, advanced will be used for the best experience.\")\n            }\n        });\n    }\n    validate(input) {\n        return stringSet(input, 'simple', ['simple', 'advanced']);\n    }\n    compute(env, options, value) {\n        const accessibilitySupport = options.get(2 /* EditorOption.accessibilitySupport */);\n        if (accessibilitySupport === 2 /* AccessibilitySupport.Enabled */) {\n            // if we know for a fact that a screen reader is attached, we switch our strategy to advanced to\n            // help that the editor's wrapping points match the textarea's wrapping points\n            return 'advanced';\n        }\n        return value;\n    }\n}\n//#endregion\n//#region lightbulb\nvar ShowLightbulbIconMode;\n(function (ShowLightbulbIconMode) {\n    ShowLightbulbIconMode[\"Off\"] = \"off\";\n    ShowLightbulbIconMode[\"OnCode\"] = \"onCode\";\n    ShowLightbulbIconMode[\"On\"] = \"on\";\n})(ShowLightbulbIconMode || (ShowLightbulbIconMode = {}));\nclass EditorLightbulb extends BaseEditorOption {\n    constructor() {\n        const defaults = { enabled: ShowLightbulbIconMode.OnCode };\n        super(73 /* EditorOption.lightbulb */, 'lightbulb', defaults, {\n            'editor.lightbulb.enabled': {\n                type: 'string',\n                enum: [ShowLightbulbIconMode.Off, ShowLightbulbIconMode.OnCode, ShowLightbulbIconMode.On],\n                default: defaults.enabled,\n                enumDescriptions: [\n                    localize(258, 'Disable the code action menu.'),\n                    localize(259, 'Show the code action menu when the cursor is on lines with code.'),\n                    localize(260, 'Show the code action menu when the cursor is on lines with code or on empty lines.'),\n                ],\n                description: localize(261, \"Enables the Code Action lightbulb in the editor.\")\n            }\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            enabled: stringSet(input.enabled, this.defaultValue.enabled, [ShowLightbulbIconMode.Off, ShowLightbulbIconMode.OnCode, ShowLightbulbIconMode.On])\n        };\n    }\n}\nclass EditorStickyScroll extends BaseEditorOption {\n    constructor() {\n        const defaults = { enabled: true, maxLineCount: 5, defaultModel: 'outlineModel', scrollWithEditor: true };\n        super(131 /* EditorOption.stickyScroll */, 'stickyScroll', defaults, {\n            'editor.stickyScroll.enabled': {\n                type: 'boolean',\n                default: defaults.enabled,\n                description: localize(262, \"Shows the nested current scopes during the scroll at the top of the editor.\")\n            },\n            'editor.stickyScroll.maxLineCount': {\n                type: 'number',\n                default: defaults.maxLineCount,\n                minimum: 1,\n                maximum: 20,\n                description: localize(263, \"Defines the maximum number of sticky lines to show.\")\n            },\n            'editor.stickyScroll.defaultModel': {\n                type: 'string',\n                enum: ['outlineModel', 'foldingProviderModel', 'indentationModel'],\n                default: defaults.defaultModel,\n                description: localize(264, \"Defines the model to use for determining which lines to stick. If the outline model does not exist, it will fall back on the folding provider model which falls back on the indentation model. This order is respected in all three cases.\")\n            },\n            'editor.stickyScroll.scrollWithEditor': {\n                type: 'boolean',\n                default: defaults.scrollWithEditor,\n                description: localize(265, \"Enable scrolling of Sticky Scroll with the editor's horizontal scrollbar.\")\n            },\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            enabled: boolean(input.enabled, this.defaultValue.enabled),\n            maxLineCount: EditorIntOption.clampedInt(input.maxLineCount, this.defaultValue.maxLineCount, 1, 20),\n            defaultModel: stringSet(input.defaultModel, this.defaultValue.defaultModel, ['outlineModel', 'foldingProviderModel', 'indentationModel']),\n            scrollWithEditor: boolean(input.scrollWithEditor, this.defaultValue.scrollWithEditor)\n        };\n    }\n}\nclass EditorInlayHints extends BaseEditorOption {\n    constructor() {\n        const defaults = { enabled: 'on', fontSize: 0, fontFamily: '', padding: false, maximumLength: 43 };\n        super(159 /* EditorOption.inlayHints */, 'inlayHints', defaults, {\n            'editor.inlayHints.enabled': {\n                type: 'string',\n                default: defaults.enabled,\n                description: localize(266, \"Enables the inlay hints in the editor.\"),\n                enum: ['on', 'onUnlessPressed', 'offUnlessPressed', 'off'],\n                markdownEnumDescriptions: [\n                    localize(267, \"Inlay hints are enabled\"),\n                    localize(268, \"Inlay hints are showing by default and hide when holding {0}\", isMacintosh ? `Ctrl+Option` : `Ctrl+Alt`),\n                    localize(269, \"Inlay hints are hidden by default and show when holding {0}\", isMacintosh ? `Ctrl+Option` : `Ctrl+Alt`),\n                    localize(270, \"Inlay hints are disabled\"),\n                ],\n            },\n            'editor.inlayHints.fontSize': {\n                type: 'number',\n                default: defaults.fontSize,\n                markdownDescription: localize(271, \"Controls font size of inlay hints in the editor. As default the {0} is used when the configured value is less than {1} or greater than the editor font size.\", '`#editor.fontSize#`', '`5`')\n            },\n            'editor.inlayHints.fontFamily': {\n                type: 'string',\n                default: defaults.fontFamily,\n                markdownDescription: localize(272, \"Controls font family of inlay hints in the editor. When set to empty, the {0} is used.\", '`#editor.fontFamily#`')\n            },\n            'editor.inlayHints.padding': {\n                type: 'boolean',\n                default: defaults.padding,\n                description: localize(273, \"Enables the padding around the inlay hints in the editor.\")\n            },\n            'editor.inlayHints.maximumLength': {\n                type: 'number',\n                default: defaults.maximumLength,\n                markdownDescription: localize(274, \"Maximum overall length of inlay hints, for a single line, before they get truncated by the editor. Set to `0` to never truncate\")\n            }\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        if (typeof input.enabled === 'boolean') {\n            input.enabled = input.enabled ? 'on' : 'off';\n        }\n        return {\n            enabled: stringSet(input.enabled, this.defaultValue.enabled, ['on', 'off', 'offUnlessPressed', 'onUnlessPressed']),\n            fontSize: EditorIntOption.clampedInt(input.fontSize, this.defaultValue.fontSize, 0, 100),\n            fontFamily: EditorStringOption.string(input.fontFamily, this.defaultValue.fontFamily),\n            padding: boolean(input.padding, this.defaultValue.padding),\n            maximumLength: EditorIntOption.clampedInt(input.maximumLength, this.defaultValue.maximumLength, 0, Number.MAX_SAFE_INTEGER),\n        };\n    }\n}\n//#endregion\n//#region lineDecorationsWidth\nclass EditorLineDecorationsWidth extends BaseEditorOption {\n    constructor() {\n        super(74 /* EditorOption.lineDecorationsWidth */, 'lineDecorationsWidth', 10);\n    }\n    validate(input) {\n        if (typeof input === 'string' && /^\\d+(\\.\\d+)?ch$/.test(input)) {\n            const multiple = parseFloat(input.substring(0, input.length - 2));\n            return -multiple; // negative numbers signal a multiple\n        }\n        else {\n            return EditorIntOption.clampedInt(input, this.defaultValue, 0, 1000);\n        }\n    }\n    compute(env, options, value) {\n        if (value < 0) {\n            // negative numbers signal a multiple\n            return EditorIntOption.clampedInt(-value * env.fontInfo.typicalHalfwidthCharacterWidth, this.defaultValue, 0, 1000);\n        }\n        else {\n            return value;\n        }\n    }\n}\n//#endregion\n//#region lineHeight\nclass EditorLineHeight extends EditorFloatOption {\n    constructor() {\n        super(75 /* EditorOption.lineHeight */, 'lineHeight', EDITOR_FONT_DEFAULTS.lineHeight, x => EditorFloatOption.clamp(x, 0, 150), { markdownDescription: localize(275, \"Controls the line height. \\n - Use 0 to automatically compute the line height from the font size.\\n - Values between 0 and 8 will be used as a multiplier with the font size.\\n - Values greater than or equal to 8 will be used as effective values.\") }, 0, 150);\n    }\n    compute(env, options, value) {\n        // The lineHeight is computed from the fontSize if it is 0.\n        // Moreover, the final lineHeight respects the editor zoom level.\n        // So take the result from env.fontInfo\n        return env.fontInfo.lineHeight;\n    }\n}\nclass EditorMinimap extends BaseEditorOption {\n    constructor() {\n        const defaults = {\n            enabled: true,\n            size: 'proportional',\n            side: 'right',\n            showSlider: 'mouseover',\n            autohide: 'none',\n            renderCharacters: true,\n            maxColumn: 120,\n            scale: 1,\n            showRegionSectionHeaders: true,\n            showMarkSectionHeaders: true,\n            markSectionHeaderRegex: '\\\\bMARK:\\\\s*(?<separator>\\-?)\\\\s*(?<label>.*)$',\n            sectionHeaderFontSize: 9,\n            sectionHeaderLetterSpacing: 1,\n        };\n        super(81 /* EditorOption.minimap */, 'minimap', defaults, {\n            'editor.minimap.enabled': {\n                type: 'boolean',\n                default: defaults.enabled,\n                description: localize(276, \"Controls whether the minimap is shown.\")\n            },\n            'editor.minimap.autohide': {\n                type: 'string',\n                enum: ['none', 'mouseover', 'scroll'],\n                enumDescriptions: [\n                    localize(277, \"The minimap is always shown.\"),\n                    localize(278, \"The minimap is hidden when mouse is not over the minimap and shown when mouse is over the minimap.\"),\n                    localize(279, \"The minimap is only shown when the editor is scrolled\"),\n                ],\n                default: defaults.autohide,\n                description: localize(280, \"Controls whether the minimap is hidden automatically.\")\n            },\n            'editor.minimap.size': {\n                type: 'string',\n                enum: ['proportional', 'fill', 'fit'],\n                enumDescriptions: [\n                    localize(281, \"The minimap has the same size as the editor contents (and might scroll).\"),\n                    localize(282, \"The minimap will stretch or shrink as necessary to fill the height of the editor (no scrolling).\"),\n                    localize(283, \"The minimap will shrink as necessary to never be larger than the editor (no scrolling).\"),\n                ],\n                default: defaults.size,\n                description: localize(284, \"Controls the size of the minimap.\")\n            },\n            'editor.minimap.side': {\n                type: 'string',\n                enum: ['left', 'right'],\n                default: defaults.side,\n                description: localize(285, \"Controls the side where to render the minimap.\")\n            },\n            'editor.minimap.showSlider': {\n                type: 'string',\n                enum: ['always', 'mouseover'],\n                default: defaults.showSlider,\n                description: localize(286, \"Controls when the minimap slider is shown.\")\n            },\n            'editor.minimap.scale': {\n                type: 'number',\n                default: defaults.scale,\n                minimum: 1,\n                maximum: 3,\n                enum: [1, 2, 3],\n                description: localize(287, \"Scale of content drawn in the minimap: 1, 2 or 3.\")\n            },\n            'editor.minimap.renderCharacters': {\n                type: 'boolean',\n                default: defaults.renderCharacters,\n                description: localize(288, \"Render the actual characters on a line as opposed to color blocks.\")\n            },\n            'editor.minimap.maxColumn': {\n                type: 'number',\n                default: defaults.maxColumn,\n                description: localize(289, \"Limit the width of the minimap to render at most a certain number of columns.\")\n            },\n            'editor.minimap.showRegionSectionHeaders': {\n                type: 'boolean',\n                default: defaults.showRegionSectionHeaders,\n                description: localize(290, \"Controls whether named regions are shown as section headers in the minimap.\")\n            },\n            'editor.minimap.showMarkSectionHeaders': {\n                type: 'boolean',\n                default: defaults.showMarkSectionHeaders,\n                description: localize(291, \"Controls whether MARK: comments are shown as section headers in the minimap.\")\n            },\n            'editor.minimap.markSectionHeaderRegex': {\n                type: 'string',\n                default: defaults.markSectionHeaderRegex,\n                description: localize(292, \"Defines the regular expression used to find section headers in comments. The regex must contain a named match group `label` (written as `(?<label>.+)`) that encapsulates the section header, otherwise it will not work. Optionally you can include another match group named `separator`. Use \\\\n in the pattern to match multi-line headers.\"),\n            },\n            'editor.minimap.sectionHeaderFontSize': {\n                type: 'number',\n                default: defaults.sectionHeaderFontSize,\n                description: localize(293, \"Controls the font size of section headers in the minimap.\")\n            },\n            'editor.minimap.sectionHeaderLetterSpacing': {\n                type: 'number',\n                default: defaults.sectionHeaderLetterSpacing,\n                description: localize(294, \"Controls the amount of space (in pixels) between characters of section header. This helps the readability of the header in small font sizes.\")\n            }\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        // Validate mark section header regex\n        let markSectionHeaderRegex = this.defaultValue.markSectionHeaderRegex;\n        const inputRegex = input.markSectionHeaderRegex;\n        if (typeof inputRegex === 'string') {\n            try {\n                new RegExp(inputRegex, 'd');\n                markSectionHeaderRegex = inputRegex;\n            }\n            catch { }\n        }\n        return {\n            enabled: boolean(input.enabled, this.defaultValue.enabled),\n            autohide: stringSet(input.autohide, this.defaultValue.autohide, ['none', 'mouseover', 'scroll']),\n            size: stringSet(input.size, this.defaultValue.size, ['proportional', 'fill', 'fit']),\n            side: stringSet(input.side, this.defaultValue.side, ['right', 'left']),\n            showSlider: stringSet(input.showSlider, this.defaultValue.showSlider, ['always', 'mouseover']),\n            renderCharacters: boolean(input.renderCharacters, this.defaultValue.renderCharacters),\n            scale: EditorIntOption.clampedInt(input.scale, 1, 1, 3),\n            maxColumn: EditorIntOption.clampedInt(input.maxColumn, this.defaultValue.maxColumn, 1, 10000),\n            showRegionSectionHeaders: boolean(input.showRegionSectionHeaders, this.defaultValue.showRegionSectionHeaders),\n            showMarkSectionHeaders: boolean(input.showMarkSectionHeaders, this.defaultValue.showMarkSectionHeaders),\n            markSectionHeaderRegex: markSectionHeaderRegex,\n            sectionHeaderFontSize: EditorFloatOption.clamp(EditorFloatOption.float(input.sectionHeaderFontSize, this.defaultValue.sectionHeaderFontSize), 4, 32),\n            sectionHeaderLetterSpacing: EditorFloatOption.clamp(EditorFloatOption.float(input.sectionHeaderLetterSpacing, this.defaultValue.sectionHeaderLetterSpacing), 0, 5),\n        };\n    }\n}\n//#endregion\n//#region multiCursorModifier\nfunction _multiCursorModifierFromString(multiCursorModifier) {\n    if (multiCursorModifier === 'ctrlCmd') {\n        return (isMacintosh ? 'metaKey' : 'ctrlKey');\n    }\n    return 'altKey';\n}\nclass EditorPadding extends BaseEditorOption {\n    constructor() {\n        super(96 /* EditorOption.padding */, 'padding', { top: 0, bottom: 0 }, {\n            'editor.padding.top': {\n                type: 'number',\n                default: 0,\n                minimum: 0,\n                maximum: 1000,\n                description: localize(295, \"Controls the amount of space between the top edge of the editor and the first line.\")\n            },\n            'editor.padding.bottom': {\n                type: 'number',\n                default: 0,\n                minimum: 0,\n                maximum: 1000,\n                description: localize(296, \"Controls the amount of space between the bottom edge of the editor and the last line.\")\n            }\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            top: EditorIntOption.clampedInt(input.top, 0, 0, 1000),\n            bottom: EditorIntOption.clampedInt(input.bottom, 0, 0, 1000)\n        };\n    }\n}\nclass EditorParameterHints extends BaseEditorOption {\n    constructor() {\n        const defaults = {\n            enabled: true,\n            cycle: true\n        };\n        super(98 /* EditorOption.parameterHints */, 'parameterHints', defaults, {\n            'editor.parameterHints.enabled': {\n                type: 'boolean',\n                default: defaults.enabled,\n                description: localize(297, \"Enables a pop-up that shows parameter documentation and type information as you type.\")\n            },\n            'editor.parameterHints.cycle': {\n                type: 'boolean',\n                default: defaults.cycle,\n                description: localize(298, \"Controls whether the parameter hints menu cycles or closes when reaching the end of the list.\")\n            },\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            enabled: boolean(input.enabled, this.defaultValue.enabled),\n            cycle: boolean(input.cycle, this.defaultValue.cycle)\n        };\n    }\n}\n//#endregion\n//#region pixelRatio\nclass EditorPixelRatio extends ComputedEditorOption {\n    constructor() {\n        super(163 /* EditorOption.pixelRatio */, 1);\n    }\n    compute(env, options, _) {\n        return env.pixelRatio;\n    }\n}\n//#endregion\n//#region\nclass PlaceholderOption extends BaseEditorOption {\n    constructor() {\n        super(100 /* EditorOption.placeholder */, 'placeholder', undefined);\n    }\n    validate(input) {\n        if (typeof input === 'undefined') {\n            return this.defaultValue;\n        }\n        if (typeof input === 'string') {\n            return input;\n        }\n        return this.defaultValue;\n    }\n}\nclass EditorQuickSuggestions extends BaseEditorOption {\n    constructor() {\n        const defaults = {\n            other: 'on',\n            comments: 'off',\n            strings: 'off'\n        };\n        const types = [\n            { type: 'boolean' },\n            {\n                type: 'string',\n                enum: ['on', 'inline', 'off'],\n                enumDescriptions: [localize(299, \"Quick suggestions show inside the suggest widget\"), localize(300, \"Quick suggestions show as ghost text\"), localize(301, \"Quick suggestions are disabled\")]\n            }\n        ];\n        super(102 /* EditorOption.quickSuggestions */, 'quickSuggestions', defaults, {\n            type: 'object',\n            additionalProperties: false,\n            properties: {\n                strings: {\n                    anyOf: types,\n                    default: defaults.strings,\n                    description: localize(302, \"Enable quick suggestions inside strings.\")\n                },\n                comments: {\n                    anyOf: types,\n                    default: defaults.comments,\n                    description: localize(303, \"Enable quick suggestions inside comments.\")\n                },\n                other: {\n                    anyOf: types,\n                    default: defaults.other,\n                    description: localize(304, \"Enable quick suggestions outside of strings and comments.\")\n                },\n            },\n            default: defaults,\n            markdownDescription: localize(305, \"Controls whether suggestions should automatically show up while typing. This can be controlled for typing in comments, strings, and other code. Quick suggestion can be configured to show as ghost text or with the suggest widget. Also be aware of the {0}-setting which controls if suggestions are triggered by special characters.\", '`#editor.suggestOnTriggerCharacters#`')\n        });\n        this.defaultValue = defaults;\n    }\n    validate(input) {\n        if (typeof input === 'boolean') {\n            // boolean -> all on/off\n            const value = input ? 'on' : 'off';\n            return { comments: value, strings: value, other: value };\n        }\n        if (!input || typeof input !== 'object') {\n            // invalid object\n            return this.defaultValue;\n        }\n        const { other, comments, strings } = input;\n        const allowedValues = ['on', 'inline', 'off'];\n        let validatedOther;\n        let validatedComments;\n        let validatedStrings;\n        if (typeof other === 'boolean') {\n            validatedOther = other ? 'on' : 'off';\n        }\n        else {\n            validatedOther = stringSet(other, this.defaultValue.other, allowedValues);\n        }\n        if (typeof comments === 'boolean') {\n            validatedComments = comments ? 'on' : 'off';\n        }\n        else {\n            validatedComments = stringSet(comments, this.defaultValue.comments, allowedValues);\n        }\n        if (typeof strings === 'boolean') {\n            validatedStrings = strings ? 'on' : 'off';\n        }\n        else {\n            validatedStrings = stringSet(strings, this.defaultValue.strings, allowedValues);\n        }\n        return {\n            other: validatedOther,\n            comments: validatedComments,\n            strings: validatedStrings\n        };\n    }\n}\nclass EditorRenderLineNumbersOption extends BaseEditorOption {\n    constructor() {\n        super(76 /* EditorOption.lineNumbers */, 'lineNumbers', { renderType: 1 /* RenderLineNumbersType.On */, renderFn: null }, {\n            type: 'string',\n            enum: ['off', 'on', 'relative', 'interval'],\n            enumDescriptions: [\n                localize(306, \"Line numbers are not rendered.\"),\n                localize(307, \"Line numbers are rendered as absolute number.\"),\n                localize(308, \"Line numbers are rendered as distance in lines to cursor position.\"),\n                localize(309, \"Line numbers are rendered every 10 lines.\")\n            ],\n            default: 'on',\n            description: localize(310, \"Controls the display of line numbers.\")\n        });\n    }\n    validate(lineNumbers) {\n        let renderType = this.defaultValue.renderType;\n        let renderFn = this.defaultValue.renderFn;\n        if (typeof lineNumbers !== 'undefined') {\n            if (typeof lineNumbers === 'function') {\n                renderType = 4 /* RenderLineNumbersType.Custom */;\n                renderFn = lineNumbers;\n            }\n            else if (lineNumbers === 'interval') {\n                renderType = 3 /* RenderLineNumbersType.Interval */;\n            }\n            else if (lineNumbers === 'relative') {\n                renderType = 2 /* RenderLineNumbersType.Relative */;\n            }\n            else if (lineNumbers === 'on') {\n                renderType = 1 /* RenderLineNumbersType.On */;\n            }\n            else {\n                renderType = 0 /* RenderLineNumbersType.Off */;\n            }\n        }\n        return {\n            renderType,\n            renderFn\n        };\n    }\n}\n//#endregion\n//#region renderValidationDecorations\n/**\n * @internal\n */\nfunction filterValidationDecorations(options) {\n    const renderValidationDecorations = options.get(112 /* EditorOption.renderValidationDecorations */);\n    if (renderValidationDecorations === 'editable') {\n        return options.get(104 /* EditorOption.readOnly */);\n    }\n    return renderValidationDecorations === 'on' ? false : true;\n}\n//#endregion\n//#region filterFontDecorations\n/**\n * @internal\n */\nfunction filterFontDecorations(options) {\n    return !options.get(172 /* EditorOption.effectiveAllowVariableFonts */);\n}\nclass EditorRulers extends BaseEditorOption {\n    constructor() {\n        const defaults = [];\n        const columnSchema = { type: 'number', description: localize(311, \"Number of monospace characters at which this editor ruler will render.\") };\n        super(116 /* EditorOption.rulers */, 'rulers', defaults, {\n            type: 'array',\n            items: {\n                anyOf: [\n                    columnSchema,\n                    {\n                        type: [\n                            'object'\n                        ],\n                        properties: {\n                            column: columnSchema,\n                            color: {\n                                type: 'string',\n                                description: localize(312, \"Color of this editor ruler.\"),\n                                format: 'color-hex'\n                            }\n                        }\n                    }\n                ]\n            },\n            default: defaults,\n            description: localize(313, \"Render vertical rulers after a certain number of monospace characters. Use multiple values for multiple rulers. No rulers are drawn if array is empty.\")\n        });\n    }\n    validate(input) {\n        if (Array.isArray(input)) {\n            const rulers = [];\n            for (const _element of input) {\n                if (typeof _element === 'number') {\n                    rulers.push({\n                        column: EditorIntOption.clampedInt(_element, 0, 0, 10000),\n                        color: null\n                    });\n                }\n                else if (_element && typeof _element === 'object') {\n                    const element = _element;\n                    rulers.push({\n                        column: EditorIntOption.clampedInt(element.column, 0, 0, 10000),\n                        color: element.color\n                    });\n                }\n            }\n            rulers.sort((a, b) => a.column - b.column);\n            return rulers;\n        }\n        return this.defaultValue;\n    }\n}\n//#endregion\n//#region readonly\n/**\n * Configuration options for readonly message\n */\nclass ReadonlyMessage extends BaseEditorOption {\n    constructor() {\n        const defaults = undefined;\n        super(105 /* EditorOption.readOnlyMessage */, 'readOnlyMessage', defaults);\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        return _input;\n    }\n}\nfunction _scrollbarVisibilityFromString(visibility, defaultValue) {\n    if (typeof visibility !== 'string') {\n        return defaultValue;\n    }\n    switch (visibility) {\n        case 'hidden': return 2 /* ScrollbarVisibility.Hidden */;\n        case 'visible': return 3 /* ScrollbarVisibility.Visible */;\n        default: return 1 /* ScrollbarVisibility.Auto */;\n    }\n}\nclass EditorScrollbar extends BaseEditorOption {\n    constructor() {\n        const defaults = {\n            vertical: 1 /* ScrollbarVisibility.Auto */,\n            horizontal: 1 /* ScrollbarVisibility.Auto */,\n            arrowSize: 11,\n            useShadows: true,\n            verticalHasArrows: false,\n            horizontalHasArrows: false,\n            horizontalScrollbarSize: 12,\n            horizontalSliderSize: 12,\n            verticalScrollbarSize: 14,\n            verticalSliderSize: 14,\n            handleMouseWheel: true,\n            alwaysConsumeMouseWheel: true,\n            scrollByPage: false,\n            ignoreHorizontalScrollbarInContentHeight: false,\n        };\n        super(117 /* EditorOption.scrollbar */, 'scrollbar', defaults, {\n            'editor.scrollbar.vertical': {\n                type: 'string',\n                enum: ['auto', 'visible', 'hidden'],\n                enumDescriptions: [\n                    localize(314, \"The vertical scrollbar will be visible only when necessary.\"),\n                    localize(315, \"The vertical scrollbar will always be visible.\"),\n                    localize(316, \"The vertical scrollbar will always be hidden.\"),\n                ],\n                default: 'auto',\n                description: localize(317, \"Controls the visibility of the vertical scrollbar.\")\n            },\n            'editor.scrollbar.horizontal': {\n                type: 'string',\n                enum: ['auto', 'visible', 'hidden'],\n                enumDescriptions: [\n                    localize(318, \"The horizontal scrollbar will be visible only when necessary.\"),\n                    localize(319, \"The horizontal scrollbar will always be visible.\"),\n                    localize(320, \"The horizontal scrollbar will always be hidden.\"),\n                ],\n                default: 'auto',\n                description: localize(321, \"Controls the visibility of the horizontal scrollbar.\")\n            },\n            'editor.scrollbar.verticalScrollbarSize': {\n                type: 'number',\n                default: defaults.verticalScrollbarSize,\n                description: localize(322, \"The width of the vertical scrollbar.\")\n            },\n            'editor.scrollbar.horizontalScrollbarSize': {\n                type: 'number',\n                default: defaults.horizontalScrollbarSize,\n                description: localize(323, \"The height of the horizontal scrollbar.\")\n            },\n            'editor.scrollbar.scrollByPage': {\n                type: 'boolean',\n                default: defaults.scrollByPage,\n                description: localize(324, \"Controls whether clicks scroll by page or jump to click position.\")\n            },\n            'editor.scrollbar.ignoreHorizontalScrollbarInContentHeight': {\n                type: 'boolean',\n                default: defaults.ignoreHorizontalScrollbarInContentHeight,\n                description: localize(325, \"When set, the horizontal scrollbar will not increase the size of the editor's content.\")\n            }\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        const horizontalScrollbarSize = EditorIntOption.clampedInt(input.horizontalScrollbarSize, this.defaultValue.horizontalScrollbarSize, 0, 1000);\n        const verticalScrollbarSize = EditorIntOption.clampedInt(input.verticalScrollbarSize, this.defaultValue.verticalScrollbarSize, 0, 1000);\n        return {\n            arrowSize: EditorIntOption.clampedInt(input.arrowSize, this.defaultValue.arrowSize, 0, 1000),\n            vertical: _scrollbarVisibilityFromString(input.vertical, this.defaultValue.vertical),\n            horizontal: _scrollbarVisibilityFromString(input.horizontal, this.defaultValue.horizontal),\n            useShadows: boolean(input.useShadows, this.defaultValue.useShadows),\n            verticalHasArrows: boolean(input.verticalHasArrows, this.defaultValue.verticalHasArrows),\n            horizontalHasArrows: boolean(input.horizontalHasArrows, this.defaultValue.horizontalHasArrows),\n            handleMouseWheel: boolean(input.handleMouseWheel, this.defaultValue.handleMouseWheel),\n            alwaysConsumeMouseWheel: boolean(input.alwaysConsumeMouseWheel, this.defaultValue.alwaysConsumeMouseWheel),\n            horizontalScrollbarSize: horizontalScrollbarSize,\n            horizontalSliderSize: EditorIntOption.clampedInt(input.horizontalSliderSize, horizontalScrollbarSize, 0, 1000),\n            verticalScrollbarSize: verticalScrollbarSize,\n            verticalSliderSize: EditorIntOption.clampedInt(input.verticalSliderSize, verticalScrollbarSize, 0, 1000),\n            scrollByPage: boolean(input.scrollByPage, this.defaultValue.scrollByPage),\n            ignoreHorizontalScrollbarInContentHeight: boolean(input.ignoreHorizontalScrollbarInContentHeight, this.defaultValue.ignoreHorizontalScrollbarInContentHeight),\n        };\n    }\n}\n/**\n * @internal\n*/\nconst inUntrustedWorkspace = 'inUntrustedWorkspace';\n/**\n * @internal\n */\nconst unicodeHighlightConfigKeys = {\n    allowedCharacters: 'editor.unicodeHighlight.allowedCharacters',\n    invisibleCharacters: 'editor.unicodeHighlight.invisibleCharacters',\n    nonBasicASCII: 'editor.unicodeHighlight.nonBasicASCII',\n    ambiguousCharacters: 'editor.unicodeHighlight.ambiguousCharacters',\n    includeComments: 'editor.unicodeHighlight.includeComments',\n    includeStrings: 'editor.unicodeHighlight.includeStrings',\n    allowedLocales: 'editor.unicodeHighlight.allowedLocales',\n};\nclass UnicodeHighlight extends BaseEditorOption {\n    constructor() {\n        const defaults = {\n            nonBasicASCII: inUntrustedWorkspace,\n            invisibleCharacters: true,\n            ambiguousCharacters: true,\n            includeComments: inUntrustedWorkspace,\n            includeStrings: true,\n            allowedCharacters: {},\n            allowedLocales: { _os: true, _vscode: true },\n        };\n        super(142 /* EditorOption.unicodeHighlighting */, 'unicodeHighlight', defaults, {\n            [unicodeHighlightConfigKeys.nonBasicASCII]: {\n                restricted: true,\n                type: ['boolean', 'string'],\n                enum: [true, false, inUntrustedWorkspace],\n                default: defaults.nonBasicASCII,\n                description: localize(326, \"Controls whether all non-basic ASCII characters are highlighted. Only characters between U+0020 and U+007E, tab, line-feed and carriage-return are considered basic ASCII.\")\n            },\n            [unicodeHighlightConfigKeys.invisibleCharacters]: {\n                restricted: true,\n                type: 'boolean',\n                default: defaults.invisibleCharacters,\n                description: localize(327, \"Controls whether characters that just reserve space or have no width at all are highlighted.\")\n            },\n            [unicodeHighlightConfigKeys.ambiguousCharacters]: {\n                restricted: true,\n                type: 'boolean',\n                default: defaults.ambiguousCharacters,\n                description: localize(328, \"Controls whether characters are highlighted that can be confused with basic ASCII characters, except those that are common in the current user locale.\")\n            },\n            [unicodeHighlightConfigKeys.includeComments]: {\n                restricted: true,\n                type: ['boolean', 'string'],\n                enum: [true, false, inUntrustedWorkspace],\n                default: defaults.includeComments,\n                description: localize(329, \"Controls whether characters in comments should also be subject to Unicode highlighting.\")\n            },\n            [unicodeHighlightConfigKeys.includeStrings]: {\n                restricted: true,\n                type: ['boolean', 'string'],\n                enum: [true, false, inUntrustedWorkspace],\n                default: defaults.includeStrings,\n                description: localize(330, \"Controls whether characters in strings should also be subject to Unicode highlighting.\")\n            },\n            [unicodeHighlightConfigKeys.allowedCharacters]: {\n                restricted: true,\n                type: 'object',\n                default: defaults.allowedCharacters,\n                description: localize(331, \"Defines allowed characters that are not being highlighted.\"),\n                additionalProperties: {\n                    type: 'boolean'\n                }\n            },\n            [unicodeHighlightConfigKeys.allowedLocales]: {\n                restricted: true,\n                type: 'object',\n                additionalProperties: {\n                    type: 'boolean'\n                },\n                default: defaults.allowedLocales,\n                description: localize(332, \"Unicode characters that are common in allowed locales are not being highlighted.\")\n            },\n        });\n    }\n    applyUpdate(value, update) {\n        let didChange = false;\n        if (update.allowedCharacters && value) {\n            // Treat allowedCharacters atomically\n            if (!equals(value.allowedCharacters, update.allowedCharacters)) {\n                value = { ...value, allowedCharacters: update.allowedCharacters };\n                didChange = true;\n            }\n        }\n        if (update.allowedLocales && value) {\n            // Treat allowedLocales atomically\n            if (!equals(value.allowedLocales, update.allowedLocales)) {\n                value = { ...value, allowedLocales: update.allowedLocales };\n                didChange = true;\n            }\n        }\n        const result = super.applyUpdate(value, update);\n        if (didChange) {\n            return new ApplyUpdateResult(result.newValue, true);\n        }\n        return result;\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            nonBasicASCII: primitiveSet(input.nonBasicASCII, inUntrustedWorkspace, [true, false, inUntrustedWorkspace]),\n            invisibleCharacters: boolean(input.invisibleCharacters, this.defaultValue.invisibleCharacters),\n            ambiguousCharacters: boolean(input.ambiguousCharacters, this.defaultValue.ambiguousCharacters),\n            includeComments: primitiveSet(input.includeComments, inUntrustedWorkspace, [true, false, inUntrustedWorkspace]),\n            includeStrings: primitiveSet(input.includeStrings, inUntrustedWorkspace, [true, false, inUntrustedWorkspace]),\n            allowedCharacters: this.validateBooleanMap(input.allowedCharacters, this.defaultValue.allowedCharacters),\n            allowedLocales: this.validateBooleanMap(input.allowedLocales, this.defaultValue.allowedLocales),\n        };\n    }\n    validateBooleanMap(map, defaultValue) {\n        if ((typeof map !== 'object') || !map) {\n            return defaultValue;\n        }\n        const result = {};\n        for (const [key, value] of Object.entries(map)) {\n            if (value === true) {\n                result[key] = true;\n            }\n        }\n        return result;\n    }\n}\n/**\n * Configuration options for inline suggestions\n */\nclass InlineEditorSuggest extends BaseEditorOption {\n    constructor() {\n        const defaults = {\n            enabled: true,\n            mode: 'subwordSmart',\n            showToolbar: 'onHover',\n            suppressSuggestions: false,\n            keepOnBlur: false,\n            fontFamily: 'default',\n            syntaxHighlightingEnabled: true,\n            minShowDelay: 0,\n            suppressInSnippetMode: true,\n            edits: {\n                enabled: true,\n                showCollapsed: false,\n                renderSideBySide: 'auto',\n                allowCodeShifting: 'always',\n            },\n            triggerCommandOnProviderChange: false,\n            experimental: {\n                suppressInlineSuggestions: '',\n                showOnSuggestConflict: 'never',\n                emptyResponseInformation: true,\n            },\n        };\n        super(71 /* EditorOption.inlineSuggest */, 'inlineSuggest', defaults, {\n            'editor.inlineSuggest.enabled': {\n                type: 'boolean',\n                default: defaults.enabled,\n                description: localize(333, \"Controls whether to automatically show inline suggestions in the editor.\")\n            },\n            'editor.inlineSuggest.showToolbar': {\n                type: 'string',\n                default: defaults.showToolbar,\n                enum: ['always', 'onHover', 'never'],\n                enumDescriptions: [\n                    localize(334, \"Show the inline suggestion toolbar whenever an inline suggestion is shown.\"),\n                    localize(335, \"Show the inline suggestion toolbar when hovering over an inline suggestion.\"),\n                    localize(336, \"Never show the inline suggestion toolbar.\"),\n                ],\n                description: localize(337, \"Controls when to show the inline suggestion toolbar.\"),\n            },\n            'editor.inlineSuggest.syntaxHighlightingEnabled': {\n                type: 'boolean',\n                default: defaults.syntaxHighlightingEnabled,\n                description: localize(338, \"Controls whether to show syntax highlighting for inline suggestions in the editor.\"),\n            },\n            'editor.inlineSuggest.suppressSuggestions': {\n                type: 'boolean',\n                default: defaults.suppressSuggestions,\n                description: localize(339, \"Controls how inline suggestions interact with the suggest widget. If enabled, the suggest widget is not shown automatically when inline suggestions are available.\")\n            },\n            'editor.inlineSuggest.suppressInSnippetMode': {\n                type: 'boolean',\n                default: defaults.suppressInSnippetMode,\n                description: localize(340, \"Controls whether inline suggestions are suppressed when in snippet mode.\"),\n            },\n            'editor.inlineSuggest.minShowDelay': {\n                type: 'number',\n                default: 0,\n                minimum: 0,\n                maximum: 10000,\n                description: localize(341, \"Controls the minimal delay in milliseconds after which inline suggestions are shown after typing.\"),\n            },\n            'editor.inlineSuggest.experimental.suppressInlineSuggestions': {\n                type: 'string',\n                default: defaults.experimental.suppressInlineSuggestions,\n                tags: ['experimental'],\n                description: localize(342, \"Suppresses inline completions for specified extension IDs -- comma separated.\"),\n                experiment: {\n                    mode: 'auto'\n                }\n            },\n            'editor.inlineSuggest.experimental.emptyResponseInformation': {\n                type: 'boolean',\n                default: defaults.experimental.emptyResponseInformation,\n                tags: ['experimental'],\n                description: localize(343, \"Controls whether to send request information from the inline suggestion provider.\"),\n                experiment: {\n                    mode: 'auto'\n                }\n            },\n            'editor.inlineSuggest.triggerCommandOnProviderChange': {\n                type: 'boolean',\n                default: defaults.triggerCommandOnProviderChange,\n                tags: ['experimental'],\n                description: localize(344, \"Controls whether to trigger a command when the inline suggestion provider changes.\"),\n                experiment: {\n                    mode: 'auto'\n                }\n            },\n            'editor.inlineSuggest.experimental.showOnSuggestConflict': {\n                type: 'string',\n                default: defaults.experimental.showOnSuggestConflict,\n                tags: ['experimental'],\n                enum: ['always', 'never', 'whenSuggestListIsIncomplete'],\n                description: localize(345, \"Controls whether to show inline suggestions when there is a suggest conflict.\"),\n                experiment: {\n                    mode: 'auto'\n                }\n            },\n            'editor.inlineSuggest.fontFamily': {\n                type: 'string',\n                default: defaults.fontFamily,\n                description: localize(346, \"Controls the font family of the inline suggestions.\")\n            },\n            'editor.inlineSuggest.edits.allowCodeShifting': {\n                type: 'string',\n                default: defaults.edits.allowCodeShifting,\n                description: localize(347, \"Controls whether showing a suggestion will shift the code to make space for the suggestion inline.\"),\n                enum: ['always', 'horizontal', 'never'],\n                tags: ['nextEditSuggestions']\n            },\n            'editor.inlineSuggest.edits.renderSideBySide': {\n                type: 'string',\n                default: defaults.edits.renderSideBySide,\n                description: localize(348, \"Controls whether larger suggestions can be shown side by side.\"),\n                enum: ['auto', 'never'],\n                enumDescriptions: [\n                    localize(349, \"Larger suggestions will show side by side if there is enough space, otherwise they will be shown below.\"),\n                    localize(350, \"Larger suggestions are never shown side by side and will always be shown below.\"),\n                ],\n                tags: ['nextEditSuggestions']\n            },\n            'editor.inlineSuggest.edits.showCollapsed': {\n                type: 'boolean',\n                default: defaults.edits.showCollapsed,\n                description: localize(351, \"Controls whether the suggestion will show as collapsed until jumping to it.\"),\n                tags: ['nextEditSuggestions']\n            },\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            enabled: boolean(input.enabled, this.defaultValue.enabled),\n            mode: stringSet(input.mode, this.defaultValue.mode, ['prefix', 'subword', 'subwordSmart']),\n            showToolbar: stringSet(input.showToolbar, this.defaultValue.showToolbar, ['always', 'onHover', 'never']),\n            suppressSuggestions: boolean(input.suppressSuggestions, this.defaultValue.suppressSuggestions),\n            keepOnBlur: boolean(input.keepOnBlur, this.defaultValue.keepOnBlur),\n            fontFamily: EditorStringOption.string(input.fontFamily, this.defaultValue.fontFamily),\n            syntaxHighlightingEnabled: boolean(input.syntaxHighlightingEnabled, this.defaultValue.syntaxHighlightingEnabled),\n            minShowDelay: EditorIntOption.clampedInt(input.minShowDelay, 0, 0, 10000),\n            suppressInSnippetMode: boolean(input.suppressInSnippetMode, this.defaultValue.suppressInSnippetMode),\n            edits: this._validateEdits(input.edits),\n            triggerCommandOnProviderChange: boolean(input.triggerCommandOnProviderChange, this.defaultValue.triggerCommandOnProviderChange),\n            experimental: this._validateExperimental(input.experimental),\n        };\n    }\n    _validateEdits(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue.edits;\n        }\n        const input = _input;\n        return {\n            enabled: boolean(input.enabled, this.defaultValue.edits.enabled),\n            showCollapsed: boolean(input.showCollapsed, this.defaultValue.edits.showCollapsed),\n            allowCodeShifting: stringSet(input.allowCodeShifting, this.defaultValue.edits.allowCodeShifting, ['always', 'horizontal', 'never']),\n            renderSideBySide: stringSet(input.renderSideBySide, this.defaultValue.edits.renderSideBySide, ['never', 'auto']),\n        };\n    }\n    _validateExperimental(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue.experimental;\n        }\n        const input = _input;\n        return {\n            suppressInlineSuggestions: EditorStringOption.string(input.suppressInlineSuggestions, this.defaultValue.experimental.suppressInlineSuggestions),\n            showOnSuggestConflict: stringSet(input.showOnSuggestConflict, this.defaultValue.experimental.showOnSuggestConflict, ['always', 'never', 'whenSuggestListIsIncomplete']),\n            emptyResponseInformation: boolean(input.emptyResponseInformation, this.defaultValue.experimental.emptyResponseInformation),\n        };\n    }\n}\n/**\n * Configuration options for inline suggestions\n */\nclass BracketPairColorization extends BaseEditorOption {\n    constructor() {\n        const defaults = {\n            enabled: EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions.enabled,\n            independentColorPoolPerBracketType: EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions.independentColorPoolPerBracketType,\n        };\n        super(21 /* EditorOption.bracketPairColorization */, 'bracketPairColorization', defaults, {\n            'editor.bracketPairColorization.enabled': {\n                type: 'boolean',\n                default: defaults.enabled,\n                markdownDescription: localize(352, \"Controls whether bracket pair colorization is enabled or not. Use {0} to override the bracket highlight colors.\", '`#workbench.colorCustomizations#`')\n            },\n            'editor.bracketPairColorization.independentColorPoolPerBracketType': {\n                type: 'boolean',\n                default: defaults.independentColorPoolPerBracketType,\n                description: localize(353, \"Controls whether each bracket type has its own independent color pool.\")\n            },\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            enabled: boolean(input.enabled, this.defaultValue.enabled),\n            independentColorPoolPerBracketType: boolean(input.independentColorPoolPerBracketType, this.defaultValue.independentColorPoolPerBracketType),\n        };\n    }\n}\n/**\n * Configuration options for inline suggestions\n */\nclass GuideOptions extends BaseEditorOption {\n    constructor() {\n        const defaults = {\n            bracketPairs: false,\n            bracketPairsHorizontal: 'active',\n            highlightActiveBracketPair: true,\n            indentation: true,\n            highlightActiveIndentation: true\n        };\n        super(22 /* EditorOption.guides */, 'guides', defaults, {\n            'editor.guides.bracketPairs': {\n                type: ['boolean', 'string'],\n                enum: [true, 'active', false],\n                enumDescriptions: [\n                    localize(354, \"Enables bracket pair guides.\"),\n                    localize(355, \"Enables bracket pair guides only for the active bracket pair.\"),\n                    localize(356, \"Disables bracket pair guides.\"),\n                ],\n                default: defaults.bracketPairs,\n                description: localize(357, \"Controls whether bracket pair guides are enabled or not.\")\n            },\n            'editor.guides.bracketPairsHorizontal': {\n                type: ['boolean', 'string'],\n                enum: [true, 'active', false],\n                enumDescriptions: [\n                    localize(358, \"Enables horizontal guides as addition to vertical bracket pair guides.\"),\n                    localize(359, \"Enables horizontal guides only for the active bracket pair.\"),\n                    localize(360, \"Disables horizontal bracket pair guides.\"),\n                ],\n                default: defaults.bracketPairsHorizontal,\n                description: localize(361, \"Controls whether horizontal bracket pair guides are enabled or not.\")\n            },\n            'editor.guides.highlightActiveBracketPair': {\n                type: 'boolean',\n                default: defaults.highlightActiveBracketPair,\n                description: localize(362, \"Controls whether the editor should highlight the active bracket pair.\")\n            },\n            'editor.guides.indentation': {\n                type: 'boolean',\n                default: defaults.indentation,\n                description: localize(363, \"Controls whether the editor should render indent guides.\")\n            },\n            'editor.guides.highlightActiveIndentation': {\n                type: ['boolean', 'string'],\n                enum: [true, 'always', false],\n                enumDescriptions: [\n                    localize(364, \"Highlights the active indent guide.\"),\n                    localize(365, \"Highlights the active indent guide even if bracket guides are highlighted.\"),\n                    localize(366, \"Do not highlight the active indent guide.\"),\n                ],\n                default: defaults.highlightActiveIndentation,\n                description: localize(367, \"Controls whether the editor should highlight the active indent guide.\")\n            }\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            bracketPairs: primitiveSet(input.bracketPairs, this.defaultValue.bracketPairs, [true, false, 'active']),\n            bracketPairsHorizontal: primitiveSet(input.bracketPairsHorizontal, this.defaultValue.bracketPairsHorizontal, [true, false, 'active']),\n            highlightActiveBracketPair: boolean(input.highlightActiveBracketPair, this.defaultValue.highlightActiveBracketPair),\n            indentation: boolean(input.indentation, this.defaultValue.indentation),\n            highlightActiveIndentation: primitiveSet(input.highlightActiveIndentation, this.defaultValue.highlightActiveIndentation, [true, false, 'always']),\n        };\n    }\n}\nfunction primitiveSet(value, defaultValue, allowedValues) {\n    const idx = allowedValues.indexOf(value);\n    if (idx === -1) {\n        return defaultValue;\n    }\n    return allowedValues[idx];\n}\nclass EditorSuggest extends BaseEditorOption {\n    constructor() {\n        const defaults = {\n            insertMode: 'insert',\n            filterGraceful: true,\n            snippetsPreventQuickSuggestions: false,\n            localityBonus: false,\n            shareSuggestSelections: false,\n            selectionMode: 'always',\n            showIcons: true,\n            showStatusBar: false,\n            preview: false,\n            previewMode: 'subwordSmart',\n            showInlineDetails: true,\n            showMethods: true,\n            showFunctions: true,\n            showConstructors: true,\n            showDeprecated: true,\n            matchOnWordStartOnly: true,\n            showFields: true,\n            showVariables: true,\n            showClasses: true,\n            showStructs: true,\n            showInterfaces: true,\n            showModules: true,\n            showProperties: true,\n            showEvents: true,\n            showOperators: true,\n            showUnits: true,\n            showValues: true,\n            showConstants: true,\n            showEnums: true,\n            showEnumMembers: true,\n            showKeywords: true,\n            showWords: true,\n            showColors: true,\n            showFiles: true,\n            showReferences: true,\n            showFolders: true,\n            showTypeParameters: true,\n            showSnippets: true,\n            showUsers: true,\n            showIssues: true,\n        };\n        super(134 /* EditorOption.suggest */, 'suggest', defaults, {\n            'editor.suggest.insertMode': {\n                type: 'string',\n                enum: ['insert', 'replace'],\n                enumDescriptions: [\n                    localize(368, \"Insert suggestion without overwriting text right of the cursor.\"),\n                    localize(369, \"Insert suggestion and overwrite text right of the cursor.\"),\n                ],\n                default: defaults.insertMode,\n                description: localize(370, \"Controls whether words are overwritten when accepting completions. Note that this depends on extensions opting into this feature.\")\n            },\n            'editor.suggest.filterGraceful': {\n                type: 'boolean',\n                default: defaults.filterGraceful,\n                description: localize(371, \"Controls whether filtering and sorting suggestions accounts for small typos.\")\n            },\n            'editor.suggest.localityBonus': {\n                type: 'boolean',\n                default: defaults.localityBonus,\n                description: localize(372, \"Controls whether sorting favors words that appear close to the cursor.\")\n            },\n            'editor.suggest.shareSuggestSelections': {\n                type: 'boolean',\n                default: defaults.shareSuggestSelections,\n                markdownDescription: localize(373, \"Controls whether remembered suggestion selections are shared between multiple workspaces and windows (needs `#editor.suggestSelection#`).\")\n            },\n            'editor.suggest.selectionMode': {\n                type: 'string',\n                enum: ['always', 'never', 'whenTriggerCharacter', 'whenQuickSuggestion'],\n                enumDescriptions: [\n                    localize(374, \"Always select a suggestion when automatically triggering IntelliSense.\"),\n                    localize(375, \"Never select a suggestion when automatically triggering IntelliSense.\"),\n                    localize(376, \"Select a suggestion only when triggering IntelliSense from a trigger character.\"),\n                    localize(377, \"Select a suggestion only when triggering IntelliSense as you type.\"),\n                ],\n                default: defaults.selectionMode,\n                markdownDescription: localize(378, \"Controls whether a suggestion is selected when the widget shows. Note that this only applies to automatically triggered suggestions ({0} and {1}) and that a suggestion is always selected when explicitly invoked, e.g via `Ctrl+Space`.\", '`#editor.quickSuggestions#`', '`#editor.suggestOnTriggerCharacters#`')\n            },\n            'editor.suggest.snippetsPreventQuickSuggestions': {\n                type: 'boolean',\n                default: defaults.snippetsPreventQuickSuggestions,\n                description: localize(379, \"Controls whether an active snippet prevents quick suggestions.\")\n            },\n            'editor.suggest.showIcons': {\n                type: 'boolean',\n                default: defaults.showIcons,\n                description: localize(380, \"Controls whether to show or hide icons in suggestions.\")\n            },\n            'editor.suggest.showStatusBar': {\n                type: 'boolean',\n                default: defaults.showStatusBar,\n                description: localize(381, \"Controls the visibility of the status bar at the bottom of the suggest widget.\")\n            },\n            'editor.suggest.preview': {\n                type: 'boolean',\n                default: defaults.preview,\n                description: localize(382, \"Controls whether to preview the suggestion outcome in the editor.\")\n            },\n            'editor.suggest.showInlineDetails': {\n                type: 'boolean',\n                default: defaults.showInlineDetails,\n                description: localize(383, \"Controls whether suggest details show inline with the label or only in the details widget.\")\n            },\n            'editor.suggest.maxVisibleSuggestions': {\n                type: 'number',\n                deprecationMessage: localize(384, \"This setting is deprecated. The suggest widget can now be resized.\"),\n            },\n            'editor.suggest.filteredTypes': {\n                type: 'object',\n                deprecationMessage: localize(385, \"This setting is deprecated, please use separate settings like 'editor.suggest.showKeywords' or 'editor.suggest.showSnippets' instead.\")\n            },\n            'editor.suggest.showMethods': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(386, \"When enabled IntelliSense shows `method`-suggestions.\")\n            },\n            'editor.suggest.showFunctions': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(387, \"When enabled IntelliSense shows `function`-suggestions.\")\n            },\n            'editor.suggest.showConstructors': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(388, \"When enabled IntelliSense shows `constructor`-suggestions.\")\n            },\n            'editor.suggest.showDeprecated': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(389, \"When enabled IntelliSense shows `deprecated`-suggestions.\")\n            },\n            'editor.suggest.matchOnWordStartOnly': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(390, \"When enabled IntelliSense filtering requires that the first character matches on a word start. For example, `c` on `Console` or `WebContext` but _not_ on `description`. When disabled IntelliSense will show more results but still sorts them by match quality.\")\n            },\n            'editor.suggest.showFields': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(391, \"When enabled IntelliSense shows `field`-suggestions.\")\n            },\n            'editor.suggest.showVariables': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(392, \"When enabled IntelliSense shows `variable`-suggestions.\")\n            },\n            'editor.suggest.showClasses': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(393, \"When enabled IntelliSense shows `class`-suggestions.\")\n            },\n            'editor.suggest.showStructs': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(394, \"When enabled IntelliSense shows `struct`-suggestions.\")\n            },\n            'editor.suggest.showInterfaces': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(395, \"When enabled IntelliSense shows `interface`-suggestions.\")\n            },\n            'editor.suggest.showModules': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(396, \"When enabled IntelliSense shows `module`-suggestions.\")\n            },\n            'editor.suggest.showProperties': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(397, \"When enabled IntelliSense shows `property`-suggestions.\")\n            },\n            'editor.suggest.showEvents': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(398, \"When enabled IntelliSense shows `event`-suggestions.\")\n            },\n            'editor.suggest.showOperators': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(399, \"When enabled IntelliSense shows `operator`-suggestions.\")\n            },\n            'editor.suggest.showUnits': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(400, \"When enabled IntelliSense shows `unit`-suggestions.\")\n            },\n            'editor.suggest.showValues': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(401, \"When enabled IntelliSense shows `value`-suggestions.\")\n            },\n            'editor.suggest.showConstants': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(402, \"When enabled IntelliSense shows `constant`-suggestions.\")\n            },\n            'editor.suggest.showEnums': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(403, \"When enabled IntelliSense shows `enum`-suggestions.\")\n            },\n            'editor.suggest.showEnumMembers': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(404, \"When enabled IntelliSense shows `enumMember`-suggestions.\")\n            },\n            'editor.suggest.showKeywords': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(405, \"When enabled IntelliSense shows `keyword`-suggestions.\")\n            },\n            'editor.suggest.showWords': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(406, \"When enabled IntelliSense shows `text`-suggestions.\")\n            },\n            'editor.suggest.showColors': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(407, \"When enabled IntelliSense shows `color`-suggestions.\")\n            },\n            'editor.suggest.showFiles': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(408, \"When enabled IntelliSense shows `file`-suggestions.\")\n            },\n            'editor.suggest.showReferences': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(409, \"When enabled IntelliSense shows `reference`-suggestions.\")\n            },\n            'editor.suggest.showCustomcolors': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(410, \"When enabled IntelliSense shows `customcolor`-suggestions.\")\n            },\n            'editor.suggest.showFolders': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(411, \"When enabled IntelliSense shows `folder`-suggestions.\")\n            },\n            'editor.suggest.showTypeParameters': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(412, \"When enabled IntelliSense shows `typeParameter`-suggestions.\")\n            },\n            'editor.suggest.showSnippets': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(413, \"When enabled IntelliSense shows `snippet`-suggestions.\")\n            },\n            'editor.suggest.showUsers': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(414, \"When enabled IntelliSense shows `user`-suggestions.\")\n            },\n            'editor.suggest.showIssues': {\n                type: 'boolean',\n                default: true,\n                markdownDescription: localize(415, \"When enabled IntelliSense shows `issues`-suggestions.\")\n            }\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            insertMode: stringSet(input.insertMode, this.defaultValue.insertMode, ['insert', 'replace']),\n            filterGraceful: boolean(input.filterGraceful, this.defaultValue.filterGraceful),\n            snippetsPreventQuickSuggestions: boolean(input.snippetsPreventQuickSuggestions, this.defaultValue.filterGraceful),\n            localityBonus: boolean(input.localityBonus, this.defaultValue.localityBonus),\n            shareSuggestSelections: boolean(input.shareSuggestSelections, this.defaultValue.shareSuggestSelections),\n            selectionMode: stringSet(input.selectionMode, this.defaultValue.selectionMode, ['always', 'never', 'whenQuickSuggestion', 'whenTriggerCharacter']),\n            showIcons: boolean(input.showIcons, this.defaultValue.showIcons),\n            showStatusBar: boolean(input.showStatusBar, this.defaultValue.showStatusBar),\n            preview: boolean(input.preview, this.defaultValue.preview),\n            previewMode: stringSet(input.previewMode, this.defaultValue.previewMode, ['prefix', 'subword', 'subwordSmart']),\n            showInlineDetails: boolean(input.showInlineDetails, this.defaultValue.showInlineDetails),\n            showMethods: boolean(input.showMethods, this.defaultValue.showMethods),\n            showFunctions: boolean(input.showFunctions, this.defaultValue.showFunctions),\n            showConstructors: boolean(input.showConstructors, this.defaultValue.showConstructors),\n            showDeprecated: boolean(input.showDeprecated, this.defaultValue.showDeprecated),\n            matchOnWordStartOnly: boolean(input.matchOnWordStartOnly, this.defaultValue.matchOnWordStartOnly),\n            showFields: boolean(input.showFields, this.defaultValue.showFields),\n            showVariables: boolean(input.showVariables, this.defaultValue.showVariables),\n            showClasses: boolean(input.showClasses, this.defaultValue.showClasses),\n            showStructs: boolean(input.showStructs, this.defaultValue.showStructs),\n            showInterfaces: boolean(input.showInterfaces, this.defaultValue.showInterfaces),\n            showModules: boolean(input.showModules, this.defaultValue.showModules),\n            showProperties: boolean(input.showProperties, this.defaultValue.showProperties),\n            showEvents: boolean(input.showEvents, this.defaultValue.showEvents),\n            showOperators: boolean(input.showOperators, this.defaultValue.showOperators),\n            showUnits: boolean(input.showUnits, this.defaultValue.showUnits),\n            showValues: boolean(input.showValues, this.defaultValue.showValues),\n            showConstants: boolean(input.showConstants, this.defaultValue.showConstants),\n            showEnums: boolean(input.showEnums, this.defaultValue.showEnums),\n            showEnumMembers: boolean(input.showEnumMembers, this.defaultValue.showEnumMembers),\n            showKeywords: boolean(input.showKeywords, this.defaultValue.showKeywords),\n            showWords: boolean(input.showWords, this.defaultValue.showWords),\n            showColors: boolean(input.showColors, this.defaultValue.showColors),\n            showFiles: boolean(input.showFiles, this.defaultValue.showFiles),\n            showReferences: boolean(input.showReferences, this.defaultValue.showReferences),\n            showFolders: boolean(input.showFolders, this.defaultValue.showFolders),\n            showTypeParameters: boolean(input.showTypeParameters, this.defaultValue.showTypeParameters),\n            showSnippets: boolean(input.showSnippets, this.defaultValue.showSnippets),\n            showUsers: boolean(input.showUsers, this.defaultValue.showUsers),\n            showIssues: boolean(input.showIssues, this.defaultValue.showIssues),\n        };\n    }\n}\nclass SmartSelect extends BaseEditorOption {\n    constructor() {\n        super(129 /* EditorOption.smartSelect */, 'smartSelect', {\n            selectLeadingAndTrailingWhitespace: true,\n            selectSubwords: true,\n        }, {\n            'editor.smartSelect.selectLeadingAndTrailingWhitespace': {\n                description: localize(416, \"Whether leading and trailing whitespace should always be selected.\"),\n                default: true,\n                type: 'boolean'\n            },\n            'editor.smartSelect.selectSubwords': {\n                description: localize(417, \"Whether subwords (like 'foo' in 'fooBar' or 'foo_bar') should be selected.\"),\n                default: true,\n                type: 'boolean'\n            }\n        });\n    }\n    validate(input) {\n        if (!input || typeof input !== 'object') {\n            return this.defaultValue;\n        }\n        return {\n            selectLeadingAndTrailingWhitespace: boolean(input.selectLeadingAndTrailingWhitespace, this.defaultValue.selectLeadingAndTrailingWhitespace),\n            selectSubwords: boolean(input.selectSubwords, this.defaultValue.selectSubwords),\n        };\n    }\n}\n//#endregion\n//#region wordSegmenterLocales\n/**\n * Locales used for segmenting lines into words when doing word related navigations or operations.\n *\n * Specify the BCP 47 language tag of the word you wish to recognize (e.g., ja, zh-CN, zh-Hant-TW, etc.).\n */\nclass WordSegmenterLocales extends BaseEditorOption {\n    constructor() {\n        const defaults = [];\n        super(147 /* EditorOption.wordSegmenterLocales */, 'wordSegmenterLocales', defaults, {\n            anyOf: [\n                {\n                    type: 'string',\n                }, {\n                    type: 'array',\n                    items: {\n                        type: 'string'\n                    }\n                }\n            ],\n            description: localize(418, \"Locales to be used for word segmentation when doing word related navigations or operations. Specify the BCP 47 language tag of the word you wish to recognize (e.g., ja, zh-CN, zh-Hant-TW, etc.).\"),\n            type: 'array',\n            items: {\n                type: 'string',\n            },\n            default: defaults,\n        });\n    }\n    validate(input) {\n        if (typeof input === 'string') {\n            input = [input];\n        }\n        if (Array.isArray(input)) {\n            const validLocales = [];\n            for (const locale of input) {\n                if (typeof locale === 'string') {\n                    try {\n                        if (Intl.Segmenter.supportedLocalesOf(locale).length > 0) {\n                            validLocales.push(locale);\n                        }\n                    }\n                    catch {\n                        // ignore invalid locales\n                    }\n                }\n            }\n            return validLocales;\n        }\n        return this.defaultValue;\n    }\n}\nclass WrappingIndentOption extends BaseEditorOption {\n    constructor() {\n        super(155 /* EditorOption.wrappingIndent */, 'wrappingIndent', 1 /* WrappingIndent.Same */, {\n            'editor.wrappingIndent': {\n                type: 'string',\n                enum: ['none', 'same', 'indent', 'deepIndent'],\n                enumDescriptions: [\n                    localize(419, \"No indentation. Wrapped lines begin at column 1.\"),\n                    localize(420, \"Wrapped lines get the same indentation as the parent.\"),\n                    localize(421, \"Wrapped lines get +1 indentation toward the parent.\"),\n                    localize(422, \"Wrapped lines get +2 indentation toward the parent.\"),\n                ],\n                description: localize(423, \"Controls the indentation of wrapped lines.\"),\n                default: 'same'\n            }\n        });\n    }\n    validate(input) {\n        switch (input) {\n            case 'none': return 0 /* WrappingIndent.None */;\n            case 'same': return 1 /* WrappingIndent.Same */;\n            case 'indent': return 2 /* WrappingIndent.Indent */;\n            case 'deepIndent': return 3 /* WrappingIndent.DeepIndent */;\n        }\n        return 1 /* WrappingIndent.Same */;\n    }\n    compute(env, options, value) {\n        const accessibilitySupport = options.get(2 /* EditorOption.accessibilitySupport */);\n        if (accessibilitySupport === 2 /* AccessibilitySupport.Enabled */) {\n            // if we know for a fact that a screen reader is attached, we use no indent wrapping to\n            // help that the editor's wrapping points match the textarea's wrapping points\n            return 0 /* WrappingIndent.None */;\n        }\n        return value;\n    }\n}\nclass EditorWrappingInfoComputer extends ComputedEditorOption {\n    constructor() {\n        super(166 /* EditorOption.wrappingInfo */, {\n            isDominatedByLongLines: false,\n            isWordWrapMinified: false,\n            isViewportWrapping: false,\n            wrappingColumn: -1\n        });\n    }\n    compute(env, options, _) {\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        return {\n            isDominatedByLongLines: env.isDominatedByLongLines,\n            isWordWrapMinified: layoutInfo.isWordWrapMinified,\n            isViewportWrapping: layoutInfo.isViewportWrapping,\n            wrappingColumn: layoutInfo.wrappingColumn,\n        };\n    }\n}\nclass EditorDropIntoEditor extends BaseEditorOption {\n    constructor() {\n        const defaults = { enabled: true, showDropSelector: 'afterDrop' };\n        super(43 /* EditorOption.dropIntoEditor */, 'dropIntoEditor', defaults, {\n            'editor.dropIntoEditor.enabled': {\n                type: 'boolean',\n                default: defaults.enabled,\n                markdownDescription: localize(424, \"Controls whether you can drag and drop a file into a text editor by holding down the `Shift` key (instead of opening the file in an editor).\"),\n            },\n            'editor.dropIntoEditor.showDropSelector': {\n                type: 'string',\n                markdownDescription: localize(425, \"Controls if a widget is shown when dropping files into the editor. This widget lets you control how the file is dropped.\"),\n                enum: [\n                    'afterDrop',\n                    'never'\n                ],\n                enumDescriptions: [\n                    localize(426, \"Show the drop selector widget after a file is dropped into the editor.\"),\n                    localize(427, \"Never show the drop selector widget. Instead the default drop provider is always used.\"),\n                ],\n                default: 'afterDrop',\n            },\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            enabled: boolean(input.enabled, this.defaultValue.enabled),\n            showDropSelector: stringSet(input.showDropSelector, this.defaultValue.showDropSelector, ['afterDrop', 'never']),\n        };\n    }\n}\nclass EditorPasteAs extends BaseEditorOption {\n    constructor() {\n        const defaults = { enabled: true, showPasteSelector: 'afterPaste' };\n        super(97 /* EditorOption.pasteAs */, 'pasteAs', defaults, {\n            'editor.pasteAs.enabled': {\n                type: 'boolean',\n                default: defaults.enabled,\n                markdownDescription: localize(428, \"Controls whether you can paste content in different ways.\"),\n            },\n            'editor.pasteAs.showPasteSelector': {\n                type: 'string',\n                markdownDescription: localize(429, \"Controls if a widget is shown when pasting content in to the editor. This widget lets you control how the file is pasted.\"),\n                enum: [\n                    'afterPaste',\n                    'never'\n                ],\n                enumDescriptions: [\n                    localize(430, \"Show the paste selector widget after content is pasted into the editor.\"),\n                    localize(431, \"Never show the paste selector widget. Instead the default pasting behavior is always used.\"),\n                ],\n                default: 'afterPaste',\n            },\n        });\n    }\n    validate(_input) {\n        if (!_input || typeof _input !== 'object') {\n            return this.defaultValue;\n        }\n        const input = _input;\n        return {\n            enabled: boolean(input.enabled, this.defaultValue.enabled),\n            showPasteSelector: stringSet(input.showPasteSelector, this.defaultValue.showPasteSelector, ['afterPaste', 'never']),\n        };\n    }\n}\n//#endregion\n/**\n * @internal\n */\nconst editorOptionsRegistry = [];\nfunction register(option) {\n    editorOptionsRegistry[option.id] = option;\n    return option;\n}\nconst EditorOptions = {\n    acceptSuggestionOnCommitCharacter: register(new EditorBooleanOption(0 /* EditorOption.acceptSuggestionOnCommitCharacter */, 'acceptSuggestionOnCommitCharacter', true, { markdownDescription: localize(432, \"Controls whether suggestions should be accepted on commit characters. For example, in JavaScript, the semi-colon (`;`) can be a commit character that accepts a suggestion and types that character.\") })),\n    acceptSuggestionOnEnter: register(new EditorStringEnumOption(1 /* EditorOption.acceptSuggestionOnEnter */, 'acceptSuggestionOnEnter', 'on', ['on', 'smart', 'off'], {\n        markdownEnumDescriptions: [\n            '',\n            localize(433, \"Only accept a suggestion with `Enter` when it makes a textual change.\"),\n            ''\n        ],\n        markdownDescription: localize(434, \"Controls whether suggestions should be accepted on `Enter`, in addition to `Tab`. Helps to avoid ambiguity between inserting new lines or accepting suggestions.\")\n    })),\n    accessibilitySupport: register(new EditorAccessibilitySupport()),\n    accessibilityPageSize: register(new EditorIntOption(3 /* EditorOption.accessibilityPageSize */, 'accessibilityPageSize', 500, 1, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */, {\n        description: localize(435, \"Controls the number of lines in the editor that can be read out by a screen reader at once. When we detect a screen reader we automatically set the default to be 500. Warning: this has a performance implication for numbers larger than the default.\"),\n        tags: ['accessibility']\n    })),\n    allowOverflow: register(new EditorBooleanOption(4 /* EditorOption.allowOverflow */, 'allowOverflow', true)),\n    allowVariableLineHeights: register(new EditorBooleanOption(5 /* EditorOption.allowVariableLineHeights */, 'allowVariableLineHeights', true, {\n        description: localize(436, \"Controls whether to allow using variable line heights in the editor.\")\n    })),\n    allowVariableFonts: register(new EditorBooleanOption(6 /* EditorOption.allowVariableFonts */, 'allowVariableFonts', true, {\n        description: localize(437, \"Controls whether to allow using variable fonts in the editor.\")\n    })),\n    allowVariableFontsInAccessibilityMode: register(new EditorBooleanOption(7 /* EditorOption.allowVariableFontsInAccessibilityMode */, 'allowVariableFontsInAccessibilityMode', false, {\n        description: localize(438, \"Controls whether to allow using variable fonts in the editor in the accessibility mode.\"),\n        tags: ['accessibility']\n    })),\n    ariaLabel: register(new EditorStringOption(8 /* EditorOption.ariaLabel */, 'ariaLabel', localize(439, \"Editor content\"))),\n    ariaRequired: register(new EditorBooleanOption(9 /* EditorOption.ariaRequired */, 'ariaRequired', false, undefined)),\n    screenReaderAnnounceInlineSuggestion: register(new EditorBooleanOption(12 /* EditorOption.screenReaderAnnounceInlineSuggestion */, 'screenReaderAnnounceInlineSuggestion', true, {\n        description: localize(440, \"Control whether inline suggestions are announced by a screen reader.\"),\n        tags: ['accessibility']\n    })),\n    autoClosingBrackets: register(new EditorStringEnumOption(10 /* EditorOption.autoClosingBrackets */, 'autoClosingBrackets', 'languageDefined', ['always', 'languageDefined', 'beforeWhitespace', 'never'], {\n        enumDescriptions: [\n            '',\n            localize(441, \"Use language configurations to determine when to autoclose brackets.\"),\n            localize(442, \"Autoclose brackets only when the cursor is to the left of whitespace.\"),\n            '',\n        ],\n        description: localize(443, \"Controls whether the editor should automatically close brackets after the user adds an opening bracket.\")\n    })),\n    autoClosingComments: register(new EditorStringEnumOption(11 /* EditorOption.autoClosingComments */, 'autoClosingComments', 'languageDefined', ['always', 'languageDefined', 'beforeWhitespace', 'never'], {\n        enumDescriptions: [\n            '',\n            localize(444, \"Use language configurations to determine when to autoclose comments.\"),\n            localize(445, \"Autoclose comments only when the cursor is to the left of whitespace.\"),\n            '',\n        ],\n        description: localize(446, \"Controls whether the editor should automatically close comments after the user adds an opening comment.\")\n    })),\n    autoClosingDelete: register(new EditorStringEnumOption(13 /* EditorOption.autoClosingDelete */, 'autoClosingDelete', 'auto', ['always', 'auto', 'never'], {\n        enumDescriptions: [\n            '',\n            localize(447, \"Remove adjacent closing quotes or brackets only if they were automatically inserted.\"),\n            '',\n        ],\n        description: localize(448, \"Controls whether the editor should remove adjacent closing quotes or brackets when deleting.\")\n    })),\n    autoClosingOvertype: register(new EditorStringEnumOption(14 /* EditorOption.autoClosingOvertype */, 'autoClosingOvertype', 'auto', ['always', 'auto', 'never'], {\n        enumDescriptions: [\n            '',\n            localize(449, \"Type over closing quotes or brackets only if they were automatically inserted.\"),\n            '',\n        ],\n        description: localize(450, \"Controls whether the editor should type over closing quotes or brackets.\")\n    })),\n    autoClosingQuotes: register(new EditorStringEnumOption(15 /* EditorOption.autoClosingQuotes */, 'autoClosingQuotes', 'languageDefined', ['always', 'languageDefined', 'beforeWhitespace', 'never'], {\n        enumDescriptions: [\n            '',\n            localize(451, \"Use language configurations to determine when to autoclose quotes.\"),\n            localize(452, \"Autoclose quotes only when the cursor is to the left of whitespace.\"),\n            '',\n        ],\n        description: localize(453, \"Controls whether the editor should automatically close quotes after the user adds an opening quote.\")\n    })),\n    autoIndent: register(new EditorEnumOption(16 /* EditorOption.autoIndent */, 'autoIndent', 4 /* EditorAutoIndentStrategy.Full */, 'full', ['none', 'keep', 'brackets', 'advanced', 'full'], _autoIndentFromString, {\n        enumDescriptions: [\n            localize(454, \"The editor will not insert indentation automatically.\"),\n            localize(455, \"The editor will keep the current line's indentation.\"),\n            localize(456, \"The editor will keep the current line's indentation and honor language defined brackets.\"),\n            localize(457, \"The editor will keep the current line's indentation, honor language defined brackets and invoke special onEnterRules defined by languages.\"),\n            localize(458, \"The editor will keep the current line's indentation, honor language defined brackets, invoke special onEnterRules defined by languages, and honor indentationRules defined by languages.\"),\n        ],\n        description: localize(459, \"Controls whether the editor should automatically adjust the indentation when users type, paste, move or indent lines.\")\n    })),\n    autoIndentOnPaste: register(new EditorBooleanOption(17 /* EditorOption.autoIndentOnPaste */, 'autoIndentOnPaste', false, { description: localize(460, \"Controls whether the editor should automatically auto-indent the pasted content.\") })),\n    autoIndentOnPasteWithinString: register(new EditorBooleanOption(18 /* EditorOption.autoIndentOnPasteWithinString */, 'autoIndentOnPasteWithinString', true, { description: localize(461, \"Controls whether the editor should automatically auto-indent the pasted content when pasted within a string. This takes effect when autoIndentOnPaste is true.\") })),\n    automaticLayout: register(new EditorBooleanOption(19 /* EditorOption.automaticLayout */, 'automaticLayout', false)),\n    autoSurround: register(new EditorStringEnumOption(20 /* EditorOption.autoSurround */, 'autoSurround', 'languageDefined', ['languageDefined', 'quotes', 'brackets', 'never'], {\n        enumDescriptions: [\n            localize(462, \"Use language configurations to determine when to automatically surround selections.\"),\n            localize(463, \"Surround with quotes but not brackets.\"),\n            localize(464, \"Surround with brackets but not quotes.\"),\n            ''\n        ],\n        description: localize(465, \"Controls whether the editor should automatically surround selections when typing quotes or brackets.\")\n    })),\n    bracketPairColorization: register(new BracketPairColorization()),\n    bracketPairGuides: register(new GuideOptions()),\n    stickyTabStops: register(new EditorBooleanOption(132 /* EditorOption.stickyTabStops */, 'stickyTabStops', false, { description: localize(466, \"Emulate selection behavior of tab characters when using spaces for indentation. Selection will stick to tab stops.\") })),\n    codeLens: register(new EditorBooleanOption(23 /* EditorOption.codeLens */, 'codeLens', true, { description: localize(467, \"Controls whether the editor shows CodeLens.\") })),\n    codeLensFontFamily: register(new EditorStringOption(24 /* EditorOption.codeLensFontFamily */, 'codeLensFontFamily', '', { description: localize(468, \"Controls the font family for CodeLens.\") })),\n    codeLensFontSize: register(new EditorIntOption(25 /* EditorOption.codeLensFontSize */, 'codeLensFontSize', 0, 0, 100, {\n        type: 'number',\n        default: 0,\n        minimum: 0,\n        maximum: 100,\n        markdownDescription: localize(469, \"Controls the font size in pixels for CodeLens. When set to 0, 90% of `#editor.fontSize#` is used.\")\n    })),\n    colorDecorators: register(new EditorBooleanOption(26 /* EditorOption.colorDecorators */, 'colorDecorators', true, { description: localize(470, \"Controls whether the editor should render the inline color decorators and color picker.\") })),\n    colorDecoratorActivatedOn: register(new EditorStringEnumOption(168 /* EditorOption.colorDecoratorsActivatedOn */, 'colorDecoratorsActivatedOn', 'clickAndHover', ['clickAndHover', 'hover', 'click'], {\n        enumDescriptions: [\n            localize(471, \"Make the color picker appear both on click and hover of the color decorator\"),\n            localize(472, \"Make the color picker appear on hover of the color decorator\"),\n            localize(473, \"Make the color picker appear on click of the color decorator\")\n        ],\n        description: localize(474, \"Controls the condition to make a color picker appear from a color decorator.\")\n    })),\n    colorDecoratorsLimit: register(new EditorIntOption(27 /* EditorOption.colorDecoratorsLimit */, 'colorDecoratorsLimit', 500, 1, 1000000, {\n        markdownDescription: localize(475, \"Controls the max number of color decorators that can be rendered in an editor at once.\")\n    })),\n    columnSelection: register(new EditorBooleanOption(28 /* EditorOption.columnSelection */, 'columnSelection', false, { description: localize(476, \"Enable that the selection with the mouse and keys is doing column selection.\") })),\n    comments: register(new EditorComments()),\n    contextmenu: register(new EditorBooleanOption(30 /* EditorOption.contextmenu */, 'contextmenu', true)),\n    copyWithSyntaxHighlighting: register(new EditorBooleanOption(31 /* EditorOption.copyWithSyntaxHighlighting */, 'copyWithSyntaxHighlighting', true, { description: localize(477, \"Controls whether syntax highlighting should be copied into the clipboard.\") })),\n    cursorBlinking: register(new EditorEnumOption(32 /* EditorOption.cursorBlinking */, 'cursorBlinking', 1 /* TextEditorCursorBlinkingStyle.Blink */, 'blink', ['blink', 'smooth', 'phase', 'expand', 'solid'], cursorBlinkingStyleFromString, { description: localize(478, \"Control the cursor animation style.\") })),\n    cursorSmoothCaretAnimation: register(new EditorStringEnumOption(33 /* EditorOption.cursorSmoothCaretAnimation */, 'cursorSmoothCaretAnimation', 'off', ['off', 'explicit', 'on'], {\n        enumDescriptions: [\n            localize(479, \"Smooth caret animation is disabled.\"),\n            localize(480, \"Smooth caret animation is enabled only when the user moves the cursor with an explicit gesture.\"),\n            localize(481, \"Smooth caret animation is always enabled.\")\n        ],\n        description: localize(482, \"Controls whether the smooth caret animation should be enabled.\")\n    })),\n    cursorStyle: register(new EditorEnumOption(34 /* EditorOption.cursorStyle */, 'cursorStyle', TextEditorCursorStyle.Line, 'line', ['line', 'block', 'underline', 'line-thin', 'block-outline', 'underline-thin'], cursorStyleFromString, { description: localize(483, \"Controls the cursor style in insert input mode.\") })),\n    overtypeCursorStyle: register(new EditorEnumOption(92 /* EditorOption.overtypeCursorStyle */, 'overtypeCursorStyle', TextEditorCursorStyle.Block, 'block', ['line', 'block', 'underline', 'line-thin', 'block-outline', 'underline-thin'], cursorStyleFromString, { description: localize(484, \"Controls the cursor style in overtype input mode.\") })),\n    cursorSurroundingLines: register(new EditorIntOption(35 /* EditorOption.cursorSurroundingLines */, 'cursorSurroundingLines', 0, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */, { description: localize(485, \"Controls the minimal number of visible leading lines (minimum 0) and trailing lines (minimum 1) surrounding the cursor. Known as 'scrollOff' or 'scrollOffset' in some other editors.\") })),\n    cursorSurroundingLinesStyle: register(new EditorStringEnumOption(36 /* EditorOption.cursorSurroundingLinesStyle */, 'cursorSurroundingLinesStyle', 'default', ['default', 'all'], {\n        enumDescriptions: [\n            localize(486, \"`cursorSurroundingLines` is enforced only when triggered via the keyboard or API.\"),\n            localize(487, \"`cursorSurroundingLines` is enforced always.\")\n        ],\n        markdownDescription: localize(488, \"Controls when `#editor.cursorSurroundingLines#` should be enforced.\")\n    })),\n    cursorWidth: register(new EditorIntOption(37 /* EditorOption.cursorWidth */, 'cursorWidth', 0, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */, { markdownDescription: localize(489, \"Controls the width of the cursor when `#editor.cursorStyle#` is set to `line`.\") })),\n    cursorHeight: register(new EditorIntOption(38 /* EditorOption.cursorHeight */, 'cursorHeight', 0, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */, { markdownDescription: localize(490, \"Controls the height of the cursor when `#editor.cursorStyle#` is set to `line`. Cursor's max height depends on line height.\") })),\n    disableLayerHinting: register(new EditorBooleanOption(39 /* EditorOption.disableLayerHinting */, 'disableLayerHinting', false)),\n    disableMonospaceOptimizations: register(new EditorBooleanOption(40 /* EditorOption.disableMonospaceOptimizations */, 'disableMonospaceOptimizations', false)),\n    domReadOnly: register(new EditorBooleanOption(41 /* EditorOption.domReadOnly */, 'domReadOnly', false)),\n    dragAndDrop: register(new EditorBooleanOption(42 /* EditorOption.dragAndDrop */, 'dragAndDrop', true, { description: localize(491, \"Controls whether the editor should allow moving selections via drag and drop.\") })),\n    emptySelectionClipboard: register(new EditorEmptySelectionClipboard()),\n    dropIntoEditor: register(new EditorDropIntoEditor()),\n    editContext: register(new EditorBooleanOption(44 /* EditorOption.editContext */, 'editContext', true, {\n        description: localize(492, \"Sets whether the EditContext API should be used instead of the text area to power input in the editor.\"),\n        included: isChrome || isEdge || isNative\n    })),\n    renderRichScreenReaderContent: register(new EditorBooleanOption(107 /* EditorOption.renderRichScreenReaderContent */, 'renderRichScreenReaderContent', false, {\n        markdownDescription: localize(493, \"Whether to render rich screen reader content when the `#editor.editContext#` setting is enabled.\"),\n    })),\n    stickyScroll: register(new EditorStickyScroll()),\n    experimentalGpuAcceleration: register(new EditorStringEnumOption(46 /* EditorOption.experimentalGpuAcceleration */, 'experimentalGpuAcceleration', 'off', ['off', 'on'], {\n        tags: ['experimental'],\n        enumDescriptions: [\n            localize(494, \"Use regular DOM-based rendering.\"),\n            localize(495, \"Use GPU acceleration.\"),\n        ],\n        description: localize(496, \"Controls whether to use the experimental GPU acceleration to render the editor.\")\n    })),\n    experimentalWhitespaceRendering: register(new EditorStringEnumOption(47 /* EditorOption.experimentalWhitespaceRendering */, 'experimentalWhitespaceRendering', 'svg', ['svg', 'font', 'off'], {\n        enumDescriptions: [\n            localize(497, \"Use a new rendering method with svgs.\"),\n            localize(498, \"Use a new rendering method with font characters.\"),\n            localize(499, \"Use the stable rendering method.\"),\n        ],\n        description: localize(500, \"Controls whether whitespace is rendered with a new, experimental method.\")\n    })),\n    extraEditorClassName: register(new EditorStringOption(48 /* EditorOption.extraEditorClassName */, 'extraEditorClassName', '')),\n    fastScrollSensitivity: register(new EditorFloatOption(49 /* EditorOption.fastScrollSensitivity */, 'fastScrollSensitivity', 5, x => (x <= 0 ? 5 : x), { markdownDescription: localize(501, \"Scrolling speed multiplier when pressing `Alt`.\") })),\n    find: register(new EditorFind()),\n    fixedOverflowWidgets: register(new EditorBooleanOption(51 /* EditorOption.fixedOverflowWidgets */, 'fixedOverflowWidgets', false)),\n    folding: register(new EditorBooleanOption(52 /* EditorOption.folding */, 'folding', true, { description: localize(502, \"Controls whether the editor has code folding enabled.\") })),\n    foldingStrategy: register(new EditorStringEnumOption(53 /* EditorOption.foldingStrategy */, 'foldingStrategy', 'auto', ['auto', 'indentation'], {\n        enumDescriptions: [\n            localize(503, \"Use a language-specific folding strategy if available, else the indentation-based one.\"),\n            localize(504, \"Use the indentation-based folding strategy.\"),\n        ],\n        description: localize(505, \"Controls the strategy for computing folding ranges.\")\n    })),\n    foldingHighlight: register(new EditorBooleanOption(54 /* EditorOption.foldingHighlight */, 'foldingHighlight', true, { description: localize(506, \"Controls whether the editor should highlight folded ranges.\") })),\n    foldingImportsByDefault: register(new EditorBooleanOption(55 /* EditorOption.foldingImportsByDefault */, 'foldingImportsByDefault', false, { description: localize(507, \"Controls whether the editor automatically collapses import ranges.\") })),\n    foldingMaximumRegions: register(new EditorIntOption(56 /* EditorOption.foldingMaximumRegions */, 'foldingMaximumRegions', 5000, 10, 65000, // limit must be less than foldingRanges MAX_FOLDING_REGIONS\n    { description: localize(508, \"The maximum number of foldable regions. Increasing this value may result in the editor becoming less responsive when the current source has a large number of foldable regions.\") })),\n    unfoldOnClickAfterEndOfLine: register(new EditorBooleanOption(57 /* EditorOption.unfoldOnClickAfterEndOfLine */, 'unfoldOnClickAfterEndOfLine', false, { description: localize(509, \"Controls whether clicking on the empty content after a folded line will unfold the line.\") })),\n    fontFamily: register(new EditorStringOption(58 /* EditorOption.fontFamily */, 'fontFamily', EDITOR_FONT_DEFAULTS.fontFamily, { description: localize(510, \"Controls the font family.\") })),\n    fontInfo: register(new EditorFontInfo()),\n    fontLigatures2: register(new EditorFontLigatures()),\n    fontSize: register(new EditorFontSize()),\n    fontWeight: register(new EditorFontWeight()),\n    fontVariations: register(new EditorFontVariations()),\n    formatOnPaste: register(new EditorBooleanOption(64 /* EditorOption.formatOnPaste */, 'formatOnPaste', false, { description: localize(511, \"Controls whether the editor should automatically format the pasted content. A formatter must be available and the formatter should be able to format a range in a document.\") })),\n    formatOnType: register(new EditorBooleanOption(65 /* EditorOption.formatOnType */, 'formatOnType', false, { description: localize(512, \"Controls whether the editor should automatically format the line after typing.\") })),\n    glyphMargin: register(new EditorBooleanOption(66 /* EditorOption.glyphMargin */, 'glyphMargin', true, { description: localize(513, \"Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.\") })),\n    gotoLocation: register(new EditorGoToLocation()),\n    hideCursorInOverviewRuler: register(new EditorBooleanOption(68 /* EditorOption.hideCursorInOverviewRuler */, 'hideCursorInOverviewRuler', false, { description: localize(514, \"Controls whether the cursor should be hidden in the overview ruler.\") })),\n    hover: register(new EditorHover()),\n    inDiffEditor: register(new EditorBooleanOption(70 /* EditorOption.inDiffEditor */, 'inDiffEditor', false)),\n    inertialScroll: register(new EditorBooleanOption(158 /* EditorOption.inertialScroll */, 'inertialScroll', false, { description: localize(515, \"Make scrolling inertial - mostly useful with touchpad on linux.\") })),\n    letterSpacing: register(new EditorFloatOption(72 /* EditorOption.letterSpacing */, 'letterSpacing', EDITOR_FONT_DEFAULTS.letterSpacing, x => EditorFloatOption.clamp(x, -5, 20), { description: localize(516, \"Controls the letter spacing in pixels.\") })),\n    lightbulb: register(new EditorLightbulb()),\n    lineDecorationsWidth: register(new EditorLineDecorationsWidth()),\n    lineHeight: register(new EditorLineHeight()),\n    lineNumbers: register(new EditorRenderLineNumbersOption()),\n    lineNumbersMinChars: register(new EditorIntOption(77 /* EditorOption.lineNumbersMinChars */, 'lineNumbersMinChars', 5, 1, 300)),\n    linkedEditing: register(new EditorBooleanOption(78 /* EditorOption.linkedEditing */, 'linkedEditing', false, { description: localize(517, \"Controls whether the editor has linked editing enabled. Depending on the language, related symbols such as HTML tags, are updated while editing.\") })),\n    links: register(new EditorBooleanOption(79 /* EditorOption.links */, 'links', true, { description: localize(518, \"Controls whether the editor should detect links and make them clickable.\") })),\n    matchBrackets: register(new EditorStringEnumOption(80 /* EditorOption.matchBrackets */, 'matchBrackets', 'always', ['always', 'near', 'never'], { description: localize(519, \"Highlight matching brackets.\") })),\n    minimap: register(new EditorMinimap()),\n    mouseStyle: register(new EditorStringEnumOption(82 /* EditorOption.mouseStyle */, 'mouseStyle', 'text', ['text', 'default', 'copy'])),\n    mouseWheelScrollSensitivity: register(new EditorFloatOption(83 /* EditorOption.mouseWheelScrollSensitivity */, 'mouseWheelScrollSensitivity', 1, x => (x === 0 ? 1 : x), { markdownDescription: localize(520, \"A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.\") })),\n    mouseWheelZoom: register(new EditorBooleanOption(84 /* EditorOption.mouseWheelZoom */, 'mouseWheelZoom', false, {\n        markdownDescription: isMacintosh\n            ? localize(521, \"Zoom the font of the editor when using mouse wheel and holding `Cmd`.\")\n            : localize(522, \"Zoom the font of the editor when using mouse wheel and holding `Ctrl`.\")\n    })),\n    multiCursorMergeOverlapping: register(new EditorBooleanOption(85 /* EditorOption.multiCursorMergeOverlapping */, 'multiCursorMergeOverlapping', true, { description: localize(523, \"Merge multiple cursors when they are overlapping.\") })),\n    multiCursorModifier: register(new EditorEnumOption(86 /* EditorOption.multiCursorModifier */, 'multiCursorModifier', 'altKey', 'alt', ['ctrlCmd', 'alt'], _multiCursorModifierFromString, {\n        markdownEnumDescriptions: [\n            localize(524, \"Maps to `Control` on Windows and Linux and to `Command` on macOS.\"),\n            localize(525, \"Maps to `Alt` on Windows and Linux and to `Option` on macOS.\")\n        ],\n        markdownDescription: localize(526, \"The modifier to be used to add multiple cursors with the mouse. The Go to Definition and Open Link mouse gestures will adapt such that they do not conflict with the [multicursor modifier](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).\")\n\n\n\n\n\n\n    })),\n    mouseMiddleClickAction: register(new EditorStringEnumOption(87 /* EditorOption.mouseMiddleClickAction */, 'mouseMiddleClickAction', 'default', ['default', 'openLink', 'ctrlLeftClick'], { description: localize(527, \"Controls what happens when middle mouse button is clicked in the editor.\") })),\n    multiCursorPaste: register(new EditorStringEnumOption(88 /* EditorOption.multiCursorPaste */, 'multiCursorPaste', 'spread', ['spread', 'full'], {\n        markdownEnumDescriptions: [\n            localize(528, \"Each cursor pastes a single line of the text.\"),\n            localize(529, \"Each cursor pastes the full text.\")\n        ],\n        markdownDescription: localize(530, \"Controls pasting when the line count of the pasted text matches the cursor count.\")\n    })),\n    multiCursorLimit: register(new EditorIntOption(89 /* EditorOption.multiCursorLimit */, 'multiCursorLimit', 10000, 1, 100000, {\n        markdownDescription: localize(531, \"Controls the max number of cursors that can be in an active editor at once.\")\n    })),\n    occurrencesHighlight: register(new EditorStringEnumOption(90 /* EditorOption.occurrencesHighlight */, 'occurrencesHighlight', 'singleFile', ['off', 'singleFile', 'multiFile'], {\n        markdownEnumDescriptions: [\n            localize(532, \"Does not highlight occurrences.\"),\n            localize(533, \"Highlights occurrences only in the current file.\"),\n            localize(534, \"Experimental: Highlights occurrences across all valid open files.\")\n        ],\n        markdownDescription: localize(535, \"Controls whether occurrences should be highlighted across open files.\")\n    })),\n    occurrencesHighlightDelay: register(new EditorIntOption(91 /* EditorOption.occurrencesHighlightDelay */, 'occurrencesHighlightDelay', 0, 0, 2000, {\n        description: localize(536, \"Controls the delay in milliseconds after which occurrences are highlighted.\"),\n        tags: ['preview']\n    })),\n    overtypeOnPaste: register(new EditorBooleanOption(93 /* EditorOption.overtypeOnPaste */, 'overtypeOnPaste', true, { description: localize(537, \"Controls whether pasting should overtype.\") })),\n    overviewRulerBorder: register(new EditorBooleanOption(94 /* EditorOption.overviewRulerBorder */, 'overviewRulerBorder', true, { description: localize(538, \"Controls whether a border should be drawn around the overview ruler.\") })),\n    overviewRulerLanes: register(new EditorIntOption(95 /* EditorOption.overviewRulerLanes */, 'overviewRulerLanes', 3, 0, 3)),\n    padding: register(new EditorPadding()),\n    pasteAs: register(new EditorPasteAs()),\n    parameterHints: register(new EditorParameterHints()),\n    peekWidgetDefaultFocus: register(new EditorStringEnumOption(99 /* EditorOption.peekWidgetDefaultFocus */, 'peekWidgetDefaultFocus', 'tree', ['tree', 'editor'], {\n        enumDescriptions: [\n            localize(539, \"Focus the tree when opening peek\"),\n            localize(540, \"Focus the editor when opening peek\")\n        ],\n        description: localize(541, \"Controls whether to focus the inline editor or the tree in the peek widget.\")\n    })),\n    placeholder: register(new PlaceholderOption()),\n    definitionLinkOpensInPeek: register(new EditorBooleanOption(101 /* EditorOption.definitionLinkOpensInPeek */, 'definitionLinkOpensInPeek', false, { description: localize(542, \"Controls whether the Go to Definition mouse gesture always opens the peek widget.\") })),\n    quickSuggestions: register(new EditorQuickSuggestions()),\n    quickSuggestionsDelay: register(new EditorIntOption(103 /* EditorOption.quickSuggestionsDelay */, 'quickSuggestionsDelay', 10, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */, {\n        description: localize(543, \"Controls the delay in milliseconds after which quick suggestions will show up.\"),\n        experiment: {\n            mode: 'auto'\n        }\n    })),\n    readOnly: register(new EditorBooleanOption(104 /* EditorOption.readOnly */, 'readOnly', false)),\n    readOnlyMessage: register(new ReadonlyMessage()),\n    renameOnType: register(new EditorBooleanOption(106 /* EditorOption.renameOnType */, 'renameOnType', false, { description: localize(544, \"Controls whether the editor auto renames on type.\"), markdownDeprecationMessage: localize(545, \"Deprecated, use `#editor.linkedEditing#` instead.\") })),\n    renderControlCharacters: register(new EditorBooleanOption(108 /* EditorOption.renderControlCharacters */, 'renderControlCharacters', true, { description: localize(546, \"Controls whether the editor should render control characters.\"), restricted: true })),\n    renderFinalNewline: register(new EditorStringEnumOption(109 /* EditorOption.renderFinalNewline */, 'renderFinalNewline', (isLinux ? 'dimmed' : 'on'), ['off', 'on', 'dimmed'], { description: localize(547, \"Render last line number when the file ends with a newline.\") })),\n    renderLineHighlight: register(new EditorStringEnumOption(110 /* EditorOption.renderLineHighlight */, 'renderLineHighlight', 'line', ['none', 'gutter', 'line', 'all'], {\n        enumDescriptions: [\n            '',\n            '',\n            '',\n            localize(548, \"Highlights both the gutter and the current line.\"),\n        ],\n        description: localize(549, \"Controls how the editor should render the current line highlight.\")\n    })),\n    renderLineHighlightOnlyWhenFocus: register(new EditorBooleanOption(111 /* EditorOption.renderLineHighlightOnlyWhenFocus */, 'renderLineHighlightOnlyWhenFocus', false, { description: localize(550, \"Controls if the editor should render the current line highlight only when the editor is focused.\") })),\n    renderValidationDecorations: register(new EditorStringEnumOption(112 /* EditorOption.renderValidationDecorations */, 'renderValidationDecorations', 'editable', ['editable', 'on', 'off'])),\n    renderWhitespace: register(new EditorStringEnumOption(113 /* EditorOption.renderWhitespace */, 'renderWhitespace', 'selection', ['none', 'boundary', 'selection', 'trailing', 'all'], {\n        enumDescriptions: [\n            '',\n            localize(551, \"Render whitespace characters except for single spaces between words.\"),\n            localize(552, \"Render whitespace characters only on selected text.\"),\n            localize(553, \"Render only trailing whitespace characters.\"),\n            ''\n        ],\n        description: localize(554, \"Controls how the editor should render whitespace characters.\")\n    })),\n    revealHorizontalRightPadding: register(new EditorIntOption(114 /* EditorOption.revealHorizontalRightPadding */, 'revealHorizontalRightPadding', 15, 0, 1000)),\n    roundedSelection: register(new EditorBooleanOption(115 /* EditorOption.roundedSelection */, 'roundedSelection', true, { description: localize(555, \"Controls whether selections should have rounded corners.\") })),\n    rulers: register(new EditorRulers()),\n    scrollbar: register(new EditorScrollbar()),\n    scrollBeyondLastColumn: register(new EditorIntOption(118 /* EditorOption.scrollBeyondLastColumn */, 'scrollBeyondLastColumn', 4, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */, { description: localize(556, \"Controls the number of extra characters beyond which the editor will scroll horizontally.\") })),\n    scrollBeyondLastLine: register(new EditorBooleanOption(119 /* EditorOption.scrollBeyondLastLine */, 'scrollBeyondLastLine', true, { description: localize(557, \"Controls whether the editor will scroll beyond the last line.\") })),\n    scrollOnMiddleClick: register(new EditorBooleanOption(171 /* EditorOption.scrollOnMiddleClick */, 'scrollOnMiddleClick', false, { description: localize(558, \"Controls whether the editor will scroll when the middle button is pressed.\") })),\n    scrollPredominantAxis: register(new EditorBooleanOption(120 /* EditorOption.scrollPredominantAxis */, 'scrollPredominantAxis', true, { description: localize(559, \"Scroll only along the predominant axis when scrolling both vertically and horizontally at the same time. Prevents horizontal drift when scrolling vertically on a trackpad.\") })),\n    selectionClipboard: register(new EditorBooleanOption(121 /* EditorOption.selectionClipboard */, 'selectionClipboard', true, {\n        description: localize(560, \"Controls whether the Linux primary clipboard should be supported.\"),\n        included: isLinux\n    })),\n    selectionHighlight: register(new EditorBooleanOption(122 /* EditorOption.selectionHighlight */, 'selectionHighlight', true, { description: localize(561, \"Controls whether the editor should highlight matches similar to the selection.\") })),\n    selectionHighlightMaxLength: register(new EditorIntOption(123 /* EditorOption.selectionHighlightMaxLength */, 'selectionHighlightMaxLength', 200, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */, { description: localize(562, \"Controls how many characters can be in the selection before similiar matches are not highlighted. Set to zero for unlimited.\") })),\n    selectionHighlightMultiline: register(new EditorBooleanOption(124 /* EditorOption.selectionHighlightMultiline */, 'selectionHighlightMultiline', false, { description: localize(563, \"Controls whether the editor should highlight selection matches that span multiple lines.\") })),\n    selectOnLineNumbers: register(new EditorBooleanOption(125 /* EditorOption.selectOnLineNumbers */, 'selectOnLineNumbers', true)),\n    showFoldingControls: register(new EditorStringEnumOption(126 /* EditorOption.showFoldingControls */, 'showFoldingControls', 'mouseover', ['always', 'never', 'mouseover'], {\n        enumDescriptions: [\n            localize(564, \"Always show the folding controls.\"),\n            localize(565, \"Never show the folding controls and reduce the gutter size.\"),\n            localize(566, \"Only show the folding controls when the mouse is over the gutter.\"),\n        ],\n        description: localize(567, \"Controls when the folding controls on the gutter are shown.\")\n    })),\n    showUnused: register(new EditorBooleanOption(127 /* EditorOption.showUnused */, 'showUnused', true, { description: localize(568, \"Controls fading out of unused code.\") })),\n    showDeprecated: register(new EditorBooleanOption(157 /* EditorOption.showDeprecated */, 'showDeprecated', true, { description: localize(569, \"Controls strikethrough deprecated variables.\") })),\n    inlayHints: register(new EditorInlayHints()),\n    snippetSuggestions: register(new EditorStringEnumOption(128 /* EditorOption.snippetSuggestions */, 'snippetSuggestions', 'inline', ['top', 'bottom', 'inline', 'none'], {\n        enumDescriptions: [\n            localize(570, \"Show snippet suggestions on top of other suggestions.\"),\n            localize(571, \"Show snippet suggestions below other suggestions.\"),\n            localize(572, \"Show snippets suggestions with other suggestions.\"),\n            localize(573, \"Do not show snippet suggestions.\"),\n        ],\n        description: localize(574, \"Controls whether snippets are shown with other suggestions and how they are sorted.\")\n    })),\n    smartSelect: register(new SmartSelect()),\n    smoothScrolling: register(new EditorBooleanOption(130 /* EditorOption.smoothScrolling */, 'smoothScrolling', false, { description: localize(575, \"Controls whether the editor will scroll using an animation.\") })),\n    stopRenderingLineAfter: register(new EditorIntOption(133 /* EditorOption.stopRenderingLineAfter */, 'stopRenderingLineAfter', 10000, -1, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */)),\n    suggest: register(new EditorSuggest()),\n    inlineSuggest: register(new InlineEditorSuggest()),\n    inlineCompletionsAccessibilityVerbose: register(new EditorBooleanOption(169 /* EditorOption.inlineCompletionsAccessibilityVerbose */, 'inlineCompletionsAccessibilityVerbose', false, { description: localize(576, \"Controls whether the accessibility hint should be provided to screen reader users when an inline completion is shown.\") })),\n    suggestFontSize: register(new EditorIntOption(135 /* EditorOption.suggestFontSize */, 'suggestFontSize', 0, 0, 1000, { markdownDescription: localize(577, \"Font size for the suggest widget. When set to {0}, the value of {1} is used.\", '`0`', '`#editor.fontSize#`') })),\n    suggestLineHeight: register(new EditorIntOption(136 /* EditorOption.suggestLineHeight */, 'suggestLineHeight', 0, 0, 1000, { markdownDescription: localize(578, \"Line height for the suggest widget. When set to {0}, the value of {1} is used. The minimum value is 8.\", '`0`', '`#editor.lineHeight#`') })),\n    suggestOnTriggerCharacters: register(new EditorBooleanOption(137 /* EditorOption.suggestOnTriggerCharacters */, 'suggestOnTriggerCharacters', true, { description: localize(579, \"Controls whether suggestions should automatically show up when typing trigger characters.\") })),\n    suggestSelection: register(new EditorStringEnumOption(138 /* EditorOption.suggestSelection */, 'suggestSelection', 'first', ['first', 'recentlyUsed', 'recentlyUsedByPrefix'], {\n        markdownEnumDescriptions: [\n            localize(580, \"Always select the first suggestion.\"),\n            localize(581, \"Select recent suggestions unless further typing selects one, e.g. `console.| -> console.log` because `log` has been completed recently.\"),\n            localize(582, \"Select suggestions based on previous prefixes that have completed those suggestions, e.g. `co -> console` and `con -> const`.\"),\n        ],\n        description: localize(583, \"Controls how suggestions are pre-selected when showing the suggest list.\")\n    })),\n    tabCompletion: register(new EditorStringEnumOption(139 /* EditorOption.tabCompletion */, 'tabCompletion', 'off', ['on', 'off', 'onlySnippets'], {\n        enumDescriptions: [\n            localize(584, \"Tab complete will insert the best matching suggestion when pressing tab.\"),\n            localize(585, \"Disable tab completions.\"),\n            localize(586, \"Tab complete snippets when their prefix match. Works best when 'quickSuggestions' aren't enabled.\"),\n        ],\n        description: localize(587, \"Enables tab completions.\")\n    })),\n    tabIndex: register(new EditorIntOption(140 /* EditorOption.tabIndex */, 'tabIndex', 0, -1, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */)),\n    trimWhitespaceOnDelete: register(new EditorBooleanOption(141 /* EditorOption.trimWhitespaceOnDelete */, 'trimWhitespaceOnDelete', false, { description: localize(588, \"Controls whether the editor will also delete the next line's indentation whitespace when deleting a newline.\") })),\n    unicodeHighlight: register(new UnicodeHighlight()),\n    unusualLineTerminators: register(new EditorStringEnumOption(143 /* EditorOption.unusualLineTerminators */, 'unusualLineTerminators', 'prompt', ['auto', 'off', 'prompt'], {\n        enumDescriptions: [\n            localize(589, \"Unusual line terminators are automatically removed.\"),\n            localize(590, \"Unusual line terminators are ignored.\"),\n            localize(591, \"Unusual line terminators prompt to be removed.\"),\n        ],\n        description: localize(592, \"Remove unusual line terminators that might cause problems.\")\n    })),\n    useShadowDOM: register(new EditorBooleanOption(144 /* EditorOption.useShadowDOM */, 'useShadowDOM', true)),\n    useTabStops: register(new EditorBooleanOption(145 /* EditorOption.useTabStops */, 'useTabStops', true, { description: localize(593, \"Spaces and tabs are inserted and deleted in alignment with tab stops.\") })),\n    wordBreak: register(new EditorStringEnumOption(146 /* EditorOption.wordBreak */, 'wordBreak', 'normal', ['normal', 'keepAll'], {\n        markdownEnumDescriptions: [\n            localize(594, \"Use the default line break rule.\"),\n            localize(595, \"Word breaks should not be used for Chinese/Japanese/Korean (CJK) text. Non-CJK text behavior is the same as for normal.\"),\n        ],\n        description: localize(596, \"Controls the word break rules used for Chinese/Japanese/Korean (CJK) text.\")\n    })),\n    wordSegmenterLocales: register(new WordSegmenterLocales()),\n    wordSeparators: register(new EditorStringOption(148 /* EditorOption.wordSeparators */, 'wordSeparators', USUAL_WORD_SEPARATORS, { description: localize(597, \"Characters that will be used as word separators when doing word related navigations or operations.\") })),\n    wordWrap: register(new EditorStringEnumOption(149 /* EditorOption.wordWrap */, 'wordWrap', 'off', ['off', 'on', 'wordWrapColumn', 'bounded'], {\n        markdownEnumDescriptions: [\n            localize(598, \"Lines will never wrap.\"),\n            localize(599, \"Lines will wrap at the viewport width.\"),\n            localize(600, \"Lines will wrap at `#editor.wordWrapColumn#`.\"),\n\n\n\n\n\n            localize(601, \"Lines will wrap at the minimum of viewport and `#editor.wordWrapColumn#`.\"),\n\n\n\n\n\n\n        ],\n        description: localize(602, \"Controls how lines should wrap.\")\n\n\n\n\n\n\n    })),\n    wordWrapBreakAfterCharacters: register(new EditorStringOption(150 /* EditorOption.wordWrapBreakAfterCharacters */, 'wordWrapBreakAfterCharacters', \n    // allow-any-unicode-next-line\n    ' \\t})]?|/&.,;¢°′″‰℃、。｡､￠，．：；？！％・･ゝゞヽヾーァィゥェォッャュョヮヵヶぁぃぅぇぉっゃゅょゎゕゖㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ々〻ｧｨｩｪｫｬｭｮｯｰ”〉》」』】〕）］｝｣')),\n    wordWrapBreakBeforeCharacters: register(new EditorStringOption(151 /* EditorOption.wordWrapBreakBeforeCharacters */, 'wordWrapBreakBeforeCharacters', \n    // allow-any-unicode-next-line\n    '([{‘“〈《「『【〔（［｛｢£¥＄￡￥+＋')),\n    wordWrapColumn: register(new EditorIntOption(152 /* EditorOption.wordWrapColumn */, 'wordWrapColumn', 80, 1, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */, {\n        markdownDescription: localize(603, \"Controls the wrapping column of the editor when `#editor.wordWrap#` is `wordWrapColumn` or `bounded`.\")\n\n\n\n\n\n\n    })),\n    wordWrapOverride1: register(new EditorStringEnumOption(153 /* EditorOption.wordWrapOverride1 */, 'wordWrapOverride1', 'inherit', ['off', 'on', 'inherit'])),\n    wordWrapOverride2: register(new EditorStringEnumOption(154 /* EditorOption.wordWrapOverride2 */, 'wordWrapOverride2', 'inherit', ['off', 'on', 'inherit'])),\n    wrapOnEscapedLineFeeds: register(new EditorBooleanOption(160 /* EditorOption.wrapOnEscapedLineFeeds */, 'wrapOnEscapedLineFeeds', false, { markdownDescription: localize(604, \"Controls whether literal `\\\\n` shall trigger a wordWrap when `#editor.wordWrap#` is enabled.\\n\\nFor example:\\n```c\\nchar* str=\\\"hello\\\\nworld\\\"\\n```\\nwill be displayed as\\n```c\\nchar* str=\\\"hello\\\\n\\n           world\\\"\\n```\") })),\n    // Leave these at the end (because they have dependencies!)\n    effectiveCursorStyle: register(new EffectiveCursorStyle()),\n    editorClassName: register(new EditorClassName()),\n    defaultColorDecorators: register(new EditorStringEnumOption(167 /* EditorOption.defaultColorDecorators */, 'defaultColorDecorators', 'auto', ['auto', 'always', 'never'], {\n        enumDescriptions: [\n            localize(605, \"Show default color decorators only when no extension provides colors decorators.\"),\n            localize(606, \"Always show default color decorators.\"),\n            localize(607, \"Never show default color decorators.\"),\n        ],\n        description: localize(608, \"Controls whether inline color decorations should be shown using the default document color provider.\")\n    })),\n    pixelRatio: register(new EditorPixelRatio()),\n    tabFocusMode: register(new EditorBooleanOption(164 /* EditorOption.tabFocusMode */, 'tabFocusMode', false, { markdownDescription: localize(609, \"Controls whether the editor receives tabs or defers them to the workbench for navigation.\") })),\n    layoutInfo: register(new EditorLayoutInfoComputer()),\n    wrappingInfo: register(new EditorWrappingInfoComputer()),\n    wrappingIndent: register(new WrappingIndentOption()),\n    wrappingStrategy: register(new WrappingStrategy()),\n    effectiveEditContextEnabled: register(new EffectiveEditContextEnabled()),\n    effectiveAllowVariableFonts: register(new EffectiveAllowVariableFonts())\n};\n\nexport { ApplyUpdateResult, ComputeOptionsMemory, ConfigurationChangedEvent, EditorFontLigatures, EditorFontVariations, EditorLayoutInfoComputer, EditorOptions, MINIMAP_GUTTER_WIDTH, ShowLightbulbIconMode, TextEditorCursorStyle, boolean, clampedFloat, clampedInt, cursorBlinkingStyleFromString, cursorStyleFromString, editorOptionsRegistry, filterFontDecorations, filterValidationDecorations, inUntrustedWorkspace, stringSet, unicodeHighlightConfigKeys };\n","import { getWindowId } from '../../../base/browser/dom.js';\nimport { PixelRatio } from '../../../base/browser/pixelRatio.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { CharWidthRequest, readCharWidths } from './charWidthReader.js';\nimport { EditorFontLigatures } from '../../common/config/editorOptions.js';\nimport { FontInfo } from '../../common/config/fontInfo.js';\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 *--------------------------------------------------------------------------------------------*/\nclass FontMeasurementsImpl extends Disposable {\n    constructor() {\n        super(...arguments);\n        this._cache = new Map();\n        this._evictUntrustedReadingsTimeout = -1;\n        this._onDidChange = this._register(new Emitter());\n        this.onDidChange = this._onDidChange.event;\n    }\n    dispose() {\n        if (this._evictUntrustedReadingsTimeout !== -1) {\n            clearTimeout(this._evictUntrustedReadingsTimeout);\n            this._evictUntrustedReadingsTimeout = -1;\n        }\n        super.dispose();\n    }\n    /**\n     * Clear all cached font information and trigger a change event.\n     */\n    clearAllFontInfos() {\n        this._cache.clear();\n        this._onDidChange.fire();\n    }\n    _ensureCache(targetWindow) {\n        const windowId = getWindowId(targetWindow);\n        let cache = this._cache.get(windowId);\n        if (!cache) {\n            cache = new FontMeasurementsCache();\n            this._cache.set(windowId, cache);\n        }\n        return cache;\n    }\n    _writeToCache(targetWindow, item, value) {\n        const cache = this._ensureCache(targetWindow);\n        cache.put(item, value);\n        if (!value.isTrusted && this._evictUntrustedReadingsTimeout === -1) {\n            // Try reading again after some time\n            this._evictUntrustedReadingsTimeout = targetWindow.setTimeout(() => {\n                this._evictUntrustedReadingsTimeout = -1;\n                this._evictUntrustedReadings(targetWindow);\n            }, 5000);\n        }\n    }\n    _evictUntrustedReadings(targetWindow) {\n        const cache = this._ensureCache(targetWindow);\n        const values = cache.getValues();\n        let somethingRemoved = false;\n        for (const item of values) {\n            if (!item.isTrusted) {\n                somethingRemoved = true;\n                cache.remove(item);\n            }\n        }\n        if (somethingRemoved) {\n            this._onDidChange.fire();\n        }\n    }\n    /**\n     * Read font information.\n     */\n    readFontInfo(targetWindow, bareFontInfo) {\n        const cache = this._ensureCache(targetWindow);\n        if (!cache.has(bareFontInfo)) {\n            let readConfig = this._actualReadFontInfo(targetWindow, bareFontInfo);\n            if (readConfig.typicalHalfwidthCharacterWidth <= 2 || readConfig.typicalFullwidthCharacterWidth <= 2 || readConfig.spaceWidth <= 2 || readConfig.maxDigitWidth <= 2) {\n                // Hey, it's Bug 14341 ... we couldn't read\n                readConfig = new FontInfo({\n                    pixelRatio: PixelRatio.getInstance(targetWindow).value,\n                    fontFamily: readConfig.fontFamily,\n                    fontWeight: readConfig.fontWeight,\n                    fontSize: readConfig.fontSize,\n                    fontFeatureSettings: readConfig.fontFeatureSettings,\n                    fontVariationSettings: readConfig.fontVariationSettings,\n                    lineHeight: readConfig.lineHeight,\n                    letterSpacing: readConfig.letterSpacing,\n                    isMonospace: readConfig.isMonospace,\n                    typicalHalfwidthCharacterWidth: Math.max(readConfig.typicalHalfwidthCharacterWidth, 5),\n                    typicalFullwidthCharacterWidth: Math.max(readConfig.typicalFullwidthCharacterWidth, 5),\n                    canUseHalfwidthRightwardsArrow: readConfig.canUseHalfwidthRightwardsArrow,\n                    spaceWidth: Math.max(readConfig.spaceWidth, 5),\n                    middotWidth: Math.max(readConfig.middotWidth, 5),\n                    wsmiddotWidth: Math.max(readConfig.wsmiddotWidth, 5),\n                    maxDigitWidth: Math.max(readConfig.maxDigitWidth, 5),\n                }, false);\n            }\n            this._writeToCache(targetWindow, bareFontInfo, readConfig);\n        }\n        return cache.get(bareFontInfo);\n    }\n    _createRequest(chr, type, all, monospace) {\n        const result = new CharWidthRequest(chr, type);\n        all.push(result);\n        monospace?.push(result);\n        return result;\n    }\n    _actualReadFontInfo(targetWindow, bareFontInfo) {\n        const all = [];\n        const monospace = [];\n        const typicalHalfwidthCharacter = this._createRequest('n', 0 /* CharWidthRequestType.Regular */, all, monospace);\n        const typicalFullwidthCharacter = this._createRequest('\\uff4d', 0 /* CharWidthRequestType.Regular */, all, null);\n        const space = this._createRequest(' ', 0 /* CharWidthRequestType.Regular */, all, monospace);\n        const digit0 = this._createRequest('0', 0 /* CharWidthRequestType.Regular */, all, monospace);\n        const digit1 = this._createRequest('1', 0 /* CharWidthRequestType.Regular */, all, monospace);\n        const digit2 = this._createRequest('2', 0 /* CharWidthRequestType.Regular */, all, monospace);\n        const digit3 = this._createRequest('3', 0 /* CharWidthRequestType.Regular */, all, monospace);\n        const digit4 = this._createRequest('4', 0 /* CharWidthRequestType.Regular */, all, monospace);\n        const digit5 = this._createRequest('5', 0 /* CharWidthRequestType.Regular */, all, monospace);\n        const digit6 = this._createRequest('6', 0 /* CharWidthRequestType.Regular */, all, monospace);\n        const digit7 = this._createRequest('7', 0 /* CharWidthRequestType.Regular */, all, monospace);\n        const digit8 = this._createRequest('8', 0 /* CharWidthRequestType.Regular */, all, monospace);\n        const digit9 = this._createRequest('9', 0 /* CharWidthRequestType.Regular */, all, monospace);\n        // monospace test: used for whitespace rendering\n        const rightwardsArrow = this._createRequest('→', 0 /* CharWidthRequestType.Regular */, all, monospace);\n        const halfwidthRightwardsArrow = this._createRequest('￫', 0 /* CharWidthRequestType.Regular */, all, null);\n        // U+00B7 - MIDDLE DOT\n        const middot = this._createRequest('·', 0 /* CharWidthRequestType.Regular */, all, monospace);\n        // U+2E31 - WORD SEPARATOR MIDDLE DOT\n        const wsmiddotWidth = this._createRequest(String.fromCharCode(0x2E31), 0 /* CharWidthRequestType.Regular */, all, null);\n        // monospace test: some characters\n        const monospaceTestChars = '|/-_ilm%';\n        for (let i = 0, len = monospaceTestChars.length; i < len; i++) {\n            this._createRequest(monospaceTestChars.charAt(i), 0 /* CharWidthRequestType.Regular */, all, monospace);\n            this._createRequest(monospaceTestChars.charAt(i), 1 /* CharWidthRequestType.Italic */, all, monospace);\n            this._createRequest(monospaceTestChars.charAt(i), 2 /* CharWidthRequestType.Bold */, all, monospace);\n        }\n        readCharWidths(targetWindow, bareFontInfo, all);\n        const maxDigitWidth = Math.max(digit0.width, digit1.width, digit2.width, digit3.width, digit4.width, digit5.width, digit6.width, digit7.width, digit8.width, digit9.width);\n        let isMonospace = (bareFontInfo.fontFeatureSettings === EditorFontLigatures.OFF);\n        const referenceWidth = monospace[0].width;\n        for (let i = 1, len = monospace.length; isMonospace && i < len; i++) {\n            const diff = referenceWidth - monospace[i].width;\n            if (diff < -1e-3 || diff > 0.001) {\n                isMonospace = false;\n                break;\n            }\n        }\n        let canUseHalfwidthRightwardsArrow = true;\n        if (isMonospace && halfwidthRightwardsArrow.width !== referenceWidth) {\n            // using a halfwidth rightwards arrow would break monospace...\n            canUseHalfwidthRightwardsArrow = false;\n        }\n        if (halfwidthRightwardsArrow.width > rightwardsArrow.width) {\n            // using a halfwidth rightwards arrow would paint a larger arrow than a regular rightwards arrow\n            canUseHalfwidthRightwardsArrow = false;\n        }\n        return new FontInfo({\n            pixelRatio: PixelRatio.getInstance(targetWindow).value,\n            fontFamily: bareFontInfo.fontFamily,\n            fontWeight: bareFontInfo.fontWeight,\n            fontSize: bareFontInfo.fontSize,\n            fontFeatureSettings: bareFontInfo.fontFeatureSettings,\n            fontVariationSettings: bareFontInfo.fontVariationSettings,\n            lineHeight: bareFontInfo.lineHeight,\n            letterSpacing: bareFontInfo.letterSpacing,\n            isMonospace: isMonospace,\n            typicalHalfwidthCharacterWidth: typicalHalfwidthCharacter.width,\n            typicalFullwidthCharacterWidth: typicalFullwidthCharacter.width,\n            canUseHalfwidthRightwardsArrow: canUseHalfwidthRightwardsArrow,\n            spaceWidth: space.width,\n            middotWidth: middot.width,\n            wsmiddotWidth: wsmiddotWidth.width,\n            maxDigitWidth: maxDigitWidth\n        }, true);\n    }\n}\nclass FontMeasurementsCache {\n    constructor() {\n        this._keys = Object.create(null);\n        this._values = Object.create(null);\n    }\n    has(item) {\n        const itemId = item.getId();\n        return !!this._values[itemId];\n    }\n    get(item) {\n        const itemId = item.getId();\n        return this._values[itemId];\n    }\n    put(item, value) {\n        const itemId = item.getId();\n        this._keys[itemId] = item;\n        this._values[itemId] = value;\n    }\n    remove(item) {\n        const itemId = item.getId();\n        delete this._keys[itemId];\n        delete this._values[itemId];\n    }\n    getValues() {\n        return Object.keys(this._keys).map(id => this._values[id]);\n    }\n}\nconst FontMeasurements = new FontMeasurementsImpl();\n\nexport { FontMeasurements, FontMeasurementsImpl };\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 *--------------------------------------------------------------------------------------------*/\nclass EditorSettingMigration {\n    static { this.items = []; }\n    constructor(key, migrate) {\n        this.key = key;\n        this.migrate = migrate;\n    }\n    apply(options) {\n        const value = EditorSettingMigration._read(options, this.key);\n        const read = (key) => EditorSettingMigration._read(options, key);\n        const write = (key, value) => EditorSettingMigration._write(options, key, value);\n        this.migrate(value, read, write);\n    }\n    static _read(source, key) {\n        if (typeof source === 'undefined' || source === null) {\n            return undefined;\n        }\n        const firstDotIndex = key.indexOf('.');\n        if (firstDotIndex >= 0) {\n            const firstSegment = key.substring(0, firstDotIndex);\n            return this._read(source[firstSegment], key.substring(firstDotIndex + 1));\n        }\n        return source[key];\n    }\n    static _write(target, key, value) {\n        const firstDotIndex = key.indexOf('.');\n        if (firstDotIndex >= 0) {\n            const firstSegment = key.substring(0, firstDotIndex);\n            target[firstSegment] = target[firstSegment] || {};\n            this._write(target[firstSegment], key.substring(firstDotIndex + 1), value);\n            return;\n        }\n        target[key] = value;\n    }\n}\nfunction registerEditorSettingMigration(key, migrate) {\n    EditorSettingMigration.items.push(new EditorSettingMigration(key, migrate));\n}\nfunction registerSimpleEditorSettingMigration(key, values) {\n    registerEditorSettingMigration(key, (value, read, write) => {\n        if (typeof value !== 'undefined') {\n            for (const [oldValue, newValue] of values) {\n                if (value === oldValue) {\n                    write(key, newValue);\n                    return;\n                }\n            }\n        }\n    });\n}\n/**\n * Compatibility with old options\n */\nfunction migrateOptions(options) {\n    EditorSettingMigration.items.forEach(migration => migration.apply(options));\n}\nregisterSimpleEditorSettingMigration('wordWrap', [[true, 'on'], [false, 'off']]);\nregisterSimpleEditorSettingMigration('lineNumbers', [[true, 'on'], [false, 'off']]);\nregisterSimpleEditorSettingMigration('cursorBlinking', [['visible', 'solid']]);\nregisterSimpleEditorSettingMigration('renderWhitespace', [[true, 'boundary'], [false, 'none']]);\nregisterSimpleEditorSettingMigration('renderLineHighlight', [[true, 'line'], [false, 'none']]);\nregisterSimpleEditorSettingMigration('acceptSuggestionOnEnter', [[true, 'on'], [false, 'off']]);\nregisterSimpleEditorSettingMigration('tabCompletion', [[false, 'off'], [true, 'onlySnippets']]);\nregisterSimpleEditorSettingMigration('hover', [[true, { enabled: true }], [false, { enabled: false }]]);\nregisterSimpleEditorSettingMigration('parameterHints', [[true, { enabled: true }], [false, { enabled: false }]]);\nregisterSimpleEditorSettingMigration('autoIndent', [[false, 'advanced'], [true, 'full']]);\nregisterSimpleEditorSettingMigration('matchBrackets', [[true, 'always'], [false, 'never']]);\nregisterSimpleEditorSettingMigration('renderFinalNewline', [[true, 'on'], [false, 'off']]);\nregisterSimpleEditorSettingMigration('cursorSmoothCaretAnimation', [[true, 'on'], [false, 'off']]);\nregisterSimpleEditorSettingMigration('occurrencesHighlight', [[true, 'singleFile'], [false, 'off']]);\nregisterSimpleEditorSettingMigration('wordBasedSuggestions', [[true, 'matchingDocuments'], [false, 'off']]);\nregisterSimpleEditorSettingMigration('defaultColorDecorators', [[true, 'auto'], [false, 'never']]);\nregisterSimpleEditorSettingMigration('minimap.autohide', [[true, 'mouseover'], [false, 'none']]);\nregisterEditorSettingMigration('autoClosingBrackets', (value, read, write) => {\n    if (value === false) {\n        write('autoClosingBrackets', 'never');\n        if (typeof read('autoClosingQuotes') === 'undefined') {\n            write('autoClosingQuotes', 'never');\n        }\n        if (typeof read('autoSurround') === 'undefined') {\n            write('autoSurround', 'never');\n        }\n    }\n});\nregisterEditorSettingMigration('renderIndentGuides', (value, read, write) => {\n    if (typeof value !== 'undefined') {\n        write('renderIndentGuides', undefined);\n        if (typeof read('guides.indentation') === 'undefined') {\n            write('guides.indentation', !!value);\n        }\n    }\n});\nregisterEditorSettingMigration('highlightActiveIndentGuide', (value, read, write) => {\n    if (typeof value !== 'undefined') {\n        write('highlightActiveIndentGuide', undefined);\n        if (typeof read('guides.highlightActiveIndentation') === 'undefined') {\n            write('guides.highlightActiveIndentation', !!value);\n        }\n    }\n});\nconst suggestFilteredTypesMapping = {\n    method: 'showMethods',\n    function: 'showFunctions',\n    constructor: 'showConstructors',\n    deprecated: 'showDeprecated',\n    field: 'showFields',\n    variable: 'showVariables',\n    class: 'showClasses',\n    struct: 'showStructs',\n    interface: 'showInterfaces',\n    module: 'showModules',\n    property: 'showProperties',\n    event: 'showEvents',\n    operator: 'showOperators',\n    unit: 'showUnits',\n    value: 'showValues',\n    constant: 'showConstants',\n    enum: 'showEnums',\n    enumMember: 'showEnumMembers',\n    keyword: 'showKeywords',\n    text: 'showWords',\n    color: 'showColors',\n    file: 'showFiles',\n    reference: 'showReferences',\n    folder: 'showFolders',\n    typeParameter: 'showTypeParameters',\n    snippet: 'showSnippets',\n};\nregisterEditorSettingMigration('suggest.filteredTypes', (value, read, write) => {\n    if (value && typeof value === 'object') {\n        for (const entry of Object.entries(suggestFilteredTypesMapping)) {\n            const v = value[entry[0]];\n            if (v === false) {\n                if (typeof read(`suggest.${entry[1]}`) === 'undefined') {\n                    write(`suggest.${entry[1]}`, false);\n                }\n            }\n        }\n        write('suggest.filteredTypes', undefined);\n    }\n});\nregisterEditorSettingMigration('quickSuggestions', (input, read, write) => {\n    if (typeof input === 'boolean') {\n        const value = input ? 'on' : 'off';\n        const newValue = { comments: value, strings: value, other: value };\n        write('quickSuggestions', newValue);\n    }\n});\n// Sticky Scroll\nregisterEditorSettingMigration('experimental.stickyScroll.enabled', (value, read, write) => {\n    if (typeof value === 'boolean') {\n        write('experimental.stickyScroll.enabled', undefined);\n        if (typeof read('stickyScroll.enabled') === 'undefined') {\n            write('stickyScroll.enabled', value);\n        }\n    }\n});\nregisterEditorSettingMigration('experimental.stickyScroll.maxLineCount', (value, read, write) => {\n    if (typeof value === 'number') {\n        write('experimental.stickyScroll.maxLineCount', undefined);\n        if (typeof read('stickyScroll.maxLineCount') === 'undefined') {\n            write('stickyScroll.maxLineCount', value);\n        }\n    }\n});\n// Edit Context\nregisterEditorSettingMigration('editor.experimentalEditContextEnabled', (value, read, write) => {\n    if (typeof value === 'boolean') {\n        write('editor.experimentalEditContextEnabled', undefined);\n        if (typeof read('editor.editContext') === 'undefined') {\n            write('editor.editContext', value);\n        }\n    }\n});\n// Code Actions on Save\nregisterEditorSettingMigration('codeActionsOnSave', (value, read, write) => {\n    if (value && typeof value === 'object') {\n        let toBeModified = false;\n        const newValue = {};\n        for (const entry of Object.entries(value)) {\n            if (typeof entry[1] === 'boolean') {\n                toBeModified = true;\n                newValue[entry[0]] = entry[1] ? 'explicit' : 'never';\n            }\n            else {\n                newValue[entry[0]] = entry[1];\n            }\n        }\n        if (toBeModified) {\n            write(`codeActionsOnSave`, newValue);\n        }\n    }\n});\n// Migrate Quick Fix Settings\nregisterEditorSettingMigration('codeActionWidget.includeNearbyQuickfixes', (value, read, write) => {\n    if (typeof value === 'boolean') {\n        write('codeActionWidget.includeNearbyQuickfixes', undefined);\n        if (typeof read('codeActionWidget.includeNearbyQuickFixes') === 'undefined') {\n            write('codeActionWidget.includeNearbyQuickFixes', value);\n        }\n    }\n});\n// Migrate the lightbulb settings\nregisterEditorSettingMigration('lightbulb.enabled', (value, read, write) => {\n    if (typeof value === 'boolean') {\n        write('lightbulb.enabled', value ? undefined : 'off');\n    }\n});\n// NES Code Shifting\nregisterEditorSettingMigration('inlineSuggest.edits.codeShifting', (value, read, write) => {\n    if (typeof value === 'boolean') {\n        write('inlineSuggest.edits.codeShifting', undefined);\n        write('inlineSuggest.edits.allowCodeShifting', value ? 'always' : 'never');\n    }\n});\n\nexport { EditorSettingMigration, migrateOptions };\n","import { Emitter } from '../../../base/common/event.js';\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 *--------------------------------------------------------------------------------------------*/\nclass TabFocusImpl {\n    constructor() {\n        this._tabFocus = false;\n        this._onDidChangeTabFocus = new Emitter();\n        this.onDidChangeTabFocus = this._onDidChangeTabFocus.event;\n    }\n    getTabFocusMode() {\n        return this._tabFocus;\n    }\n    setTabFocusMode(tabFocusMode) {\n        this._tabFocus = tabFocusMode;\n        this._onDidChangeTabFocus.fire(this._tabFocus);\n    }\n}\n/**\n * Control what pressing Tab does.\n * If it is false, pressing Tab or Shift-Tab will be handled by the editor.\n * If it is true, pressing Tab or Shift-Tab will move the browser focus.\n * Defaults to false.\n */\nconst TabFocus = new TabFocusImpl();\n\nexport { TabFocus };\n","import { EditorOptions } from './editorOptions.js';\nimport { BareFontInfo } from './fontInfo.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction createBareFontInfoFromValidatedSettings(options, pixelRatio, ignoreEditorZoom) {\n    const fontFamily = options.get(58 /* EditorOption.fontFamily */);\n    const fontWeight = options.get(62 /* EditorOption.fontWeight */);\n    const fontSize = options.get(61 /* EditorOption.fontSize */);\n    const fontFeatureSettings = options.get(60 /* EditorOption.fontLigatures */);\n    const fontVariationSettings = options.get(63 /* EditorOption.fontVariations */);\n    const lineHeight = options.get(75 /* EditorOption.lineHeight */);\n    const letterSpacing = options.get(72 /* EditorOption.letterSpacing */);\n    return BareFontInfo._create(fontFamily, fontWeight, fontSize, fontFeatureSettings, fontVariationSettings, lineHeight, letterSpacing, pixelRatio, ignoreEditorZoom);\n}\nfunction createBareFontInfoFromRawSettings(opts, pixelRatio, ignoreEditorZoom = false) {\n    const fontFamily = EditorOptions.fontFamily.validate(opts.fontFamily);\n    const fontWeight = EditorOptions.fontWeight.validate(opts.fontWeight);\n    const fontSize = EditorOptions.fontSize.validate(opts.fontSize);\n    const fontFeatureSettings = EditorOptions.fontLigatures2.validate(opts.fontLigatures);\n    const fontVariationSettings = EditorOptions.fontVariations.validate(opts.fontVariations);\n    const lineHeight = EditorOptions.lineHeight.validate(opts.lineHeight);\n    const letterSpacing = EditorOptions.letterSpacing.validate(opts.letterSpacing);\n    return BareFontInfo._create(fontFamily, fontWeight, fontSize, fontFeatureSettings, fontVariationSettings, lineHeight, letterSpacing, pixelRatio, ignoreEditorZoom);\n}\n\nexport { createBareFontInfoFromRawSettings, createBareFontInfoFromValidatedSettings };\n","import { RawContextKey } from '../../contextkey/common/contextkey.js';\nimport { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IAccessibilityService = createDecorator('accessibilityService');\nconst CONTEXT_ACCESSIBILITY_MODE_ENABLED = new RawContextKey('accessibilityModeEnabled', false);\n\nexport { CONTEXT_ACCESSIBILITY_MODE_ENABLED, IAccessibilityService };\n","import { isWebKit, isFirefox, isSafari, isWebkitWebView } from '../../../base/browser/browser.js';\nimport { equals } from '../../../base/common/arrays.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { deepClone } from '../../../base/common/objects.js';\nimport { isMacintosh } from '../../../base/common/platform.js';\nimport { ElementSizeObserver } from './elementSizeObserver.js';\nimport { FontMeasurements } from './fontMeasurements.js';\nimport { migrateOptions } from './migrateOptions.js';\nimport { TabFocus } from './tabFocus.js';\nimport { ComputeOptionsMemory, editorOptionsRegistry, ConfigurationChangedEvent } from '../../common/config/editorOptions.js';\nimport { EditorZoom } from '../../common/config/editorZoom.js';\nimport { createBareFontInfoFromValidatedSettings } from '../../common/config/fontInfoFromSettings.js';\nimport { IAccessibilityService } from '../../../platform/accessibility/common/accessibility.js';\nimport { getWindow, getWindowById } from '../../../base/browser/dom.js';\nimport { PixelRatio } from '../../../base/browser/pixelRatio.js';\nimport { InputMode } from '../../common/inputMode.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet EditorConfiguration = class EditorConfiguration extends Disposable {\n    constructor(isSimpleWidget, contextMenuId, options, container, _accessibilityService) {\n        super();\n        this._accessibilityService = _accessibilityService;\n        this._onDidChange = this._register(new Emitter());\n        this.onDidChange = this._onDidChange.event;\n        this._onDidChangeFast = this._register(new Emitter());\n        this.onDidChangeFast = this._onDidChangeFast.event;\n        this._isDominatedByLongLines = false;\n        this._viewLineCount = 1;\n        this._lineNumbersDigitCount = 1;\n        this._reservedHeight = 0;\n        this._glyphMarginDecorationLaneCount = 1;\n        this._computeOptionsMemory = new ComputeOptionsMemory();\n        this.isSimpleWidget = isSimpleWidget;\n        this.contextMenuId = contextMenuId;\n        this._containerObserver = this._register(new ElementSizeObserver(container, options.dimension));\n        this._targetWindowId = getWindow(container).vscodeWindowId;\n        this._rawOptions = deepCloneAndMigrateOptions(options);\n        this._validatedOptions = EditorOptionsUtil.validateOptions(this._rawOptions);\n        this.options = this._computeOptions();\n        if (this.options.get(19 /* EditorOption.automaticLayout */)) {\n            this._containerObserver.startObserving();\n        }\n        this._register(EditorZoom.onDidChangeZoomLevel(() => this._recomputeOptions()));\n        this._register(TabFocus.onDidChangeTabFocus(() => this._recomputeOptions()));\n        this._register(this._containerObserver.onDidChange(() => this._recomputeOptions()));\n        this._register(FontMeasurements.onDidChange(() => this._recomputeOptions()));\n        this._register(PixelRatio.getInstance(getWindow(container)).onDidChange(() => this._recomputeOptions()));\n        this._register(this._accessibilityService.onDidChangeScreenReaderOptimized(() => this._recomputeOptions()));\n        this._register(InputMode.onDidChangeInputMode(() => this._recomputeOptions()));\n    }\n    _recomputeOptions() {\n        const newOptions = this._computeOptions();\n        const changeEvent = EditorOptionsUtil.checkEquals(this.options, newOptions);\n        if (changeEvent === null) {\n            // nothing changed!\n            return;\n        }\n        this.options = newOptions;\n        this._onDidChangeFast.fire(changeEvent);\n        this._onDidChange.fire(changeEvent);\n    }\n    _computeOptions() {\n        const partialEnv = this._readEnvConfiguration();\n        const bareFontInfo = createBareFontInfoFromValidatedSettings(this._validatedOptions, partialEnv.pixelRatio, this.isSimpleWidget);\n        const fontInfo = this._readFontInfo(bareFontInfo);\n        const env = {\n            memory: this._computeOptionsMemory,\n            outerWidth: partialEnv.outerWidth,\n            outerHeight: partialEnv.outerHeight - this._reservedHeight,\n            fontInfo: fontInfo,\n            extraEditorClassName: partialEnv.extraEditorClassName,\n            isDominatedByLongLines: this._isDominatedByLongLines,\n            viewLineCount: this._viewLineCount,\n            lineNumbersDigitCount: this._lineNumbersDigitCount,\n            emptySelectionClipboard: partialEnv.emptySelectionClipboard,\n            pixelRatio: partialEnv.pixelRatio,\n            tabFocusMode: this._validatedOptions.get(164 /* EditorOption.tabFocusMode */) || TabFocus.getTabFocusMode(),\n            inputMode: InputMode.getInputMode(),\n            accessibilitySupport: partialEnv.accessibilitySupport,\n            glyphMarginDecorationLaneCount: this._glyphMarginDecorationLaneCount,\n            editContextSupported: partialEnv.editContextSupported\n        };\n        return EditorOptionsUtil.computeOptions(this._validatedOptions, env);\n    }\n    _readEnvConfiguration() {\n        return {\n            extraEditorClassName: getExtraEditorClassName(),\n            outerWidth: this._containerObserver.getWidth(),\n            outerHeight: this._containerObserver.getHeight(),\n            emptySelectionClipboard: isWebKit || isFirefox,\n            pixelRatio: PixelRatio.getInstance(getWindowById(this._targetWindowId, true).window).value,\n            // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n            editContextSupported: typeof globalThis.EditContext === 'function',\n            accessibilitySupport: (this._accessibilityService.isScreenReaderOptimized()\n                ? 2 /* AccessibilitySupport.Enabled */\n                : this._accessibilityService.getAccessibilitySupport())\n        };\n    }\n    _readFontInfo(bareFontInfo) {\n        return FontMeasurements.readFontInfo(getWindowById(this._targetWindowId, true).window, bareFontInfo);\n    }\n    getRawOptions() {\n        return this._rawOptions;\n    }\n    updateOptions(_newOptions) {\n        const newOptions = deepCloneAndMigrateOptions(_newOptions);\n        const didChange = EditorOptionsUtil.applyUpdate(this._rawOptions, newOptions);\n        if (!didChange) {\n            return;\n        }\n        this._validatedOptions = EditorOptionsUtil.validateOptions(this._rawOptions);\n        this._recomputeOptions();\n    }\n    observeContainer(dimension) {\n        this._containerObserver.observe(dimension);\n    }\n    setIsDominatedByLongLines(isDominatedByLongLines) {\n        if (this._isDominatedByLongLines === isDominatedByLongLines) {\n            return;\n        }\n        this._isDominatedByLongLines = isDominatedByLongLines;\n        this._recomputeOptions();\n    }\n    setModelLineCount(modelLineCount) {\n        const lineNumbersDigitCount = digitCount(modelLineCount);\n        if (this._lineNumbersDigitCount === lineNumbersDigitCount) {\n            return;\n        }\n        this._lineNumbersDigitCount = lineNumbersDigitCount;\n        this._recomputeOptions();\n    }\n    setViewLineCount(viewLineCount) {\n        if (this._viewLineCount === viewLineCount) {\n            return;\n        }\n        this._viewLineCount = viewLineCount;\n        this._recomputeOptions();\n    }\n    setReservedHeight(reservedHeight) {\n        if (this._reservedHeight === reservedHeight) {\n            return;\n        }\n        this._reservedHeight = reservedHeight;\n        this._recomputeOptions();\n    }\n    setGlyphMarginDecorationLaneCount(decorationLaneCount) {\n        if (this._glyphMarginDecorationLaneCount === decorationLaneCount) {\n            return;\n        }\n        this._glyphMarginDecorationLaneCount = decorationLaneCount;\n        this._recomputeOptions();\n    }\n};\nEditorConfiguration = __decorate([\n    __param(4, IAccessibilityService)\n], EditorConfiguration);\nfunction digitCount(n) {\n    let r = 0;\n    while (n) {\n        n = Math.floor(n / 10);\n        r++;\n    }\n    return r ? r : 1;\n}\nfunction getExtraEditorClassName() {\n    let extra = '';\n    if (isSafari || isWebkitWebView) {\n        // See https://github.com/microsoft/vscode/issues/108822\n        extra += 'no-minimap-shadow ';\n        extra += 'enable-user-select ';\n    }\n    else {\n        // Use user-select: none in all browsers except Safari and native macOS WebView\n        extra += 'no-user-select ';\n    }\n    if (isMacintosh) {\n        extra += 'mac ';\n    }\n    return extra;\n}\nclass ValidatedEditorOptions {\n    constructor() {\n        this._values = [];\n    }\n    _read(option) {\n        return this._values[option];\n    }\n    get(id) {\n        return this._values[id];\n    }\n    _write(option, value) {\n        this._values[option] = value;\n    }\n}\nclass ComputedEditorOptions {\n    constructor() {\n        this._values = [];\n    }\n    _read(id) {\n        if (id >= this._values.length) {\n            throw new Error('Cannot read uninitialized value');\n        }\n        return this._values[id];\n    }\n    get(id) {\n        return this._read(id);\n    }\n    _write(id, value) {\n        this._values[id] = value;\n    }\n}\nclass EditorOptionsUtil {\n    static validateOptions(options) {\n        const result = new ValidatedEditorOptions();\n        for (const editorOption of editorOptionsRegistry) {\n            const value = (editorOption.name === '_never_' ? undefined : options[editorOption.name]);\n            result._write(editorOption.id, editorOption.validate(value));\n        }\n        return result;\n    }\n    static computeOptions(options, env) {\n        const result = new ComputedEditorOptions();\n        for (const editorOption of editorOptionsRegistry) {\n            result._write(editorOption.id, editorOption.compute(env, result, options._read(editorOption.id)));\n        }\n        return result;\n    }\n    static _deepEquals(a, b) {\n        if (typeof a !== 'object' || typeof b !== 'object' || !a || !b) {\n            return a === b;\n        }\n        if (Array.isArray(a) || Array.isArray(b)) {\n            return (Array.isArray(a) && Array.isArray(b) ? equals(a, b) : false);\n        }\n        if (Object.keys(a).length !== Object.keys(b).length) {\n            return false;\n        }\n        for (const key in a) {\n            if (!EditorOptionsUtil._deepEquals(a[key], b[key])) {\n                return false;\n            }\n        }\n        return true;\n    }\n    static checkEquals(a, b) {\n        const result = [];\n        let somethingChanged = false;\n        for (const editorOption of editorOptionsRegistry) {\n            const changed = !EditorOptionsUtil._deepEquals(a._read(editorOption.id), b._read(editorOption.id));\n            result[editorOption.id] = changed;\n            if (changed) {\n                somethingChanged = true;\n            }\n        }\n        return (somethingChanged ? new ConfigurationChangedEvent(result) : null);\n    }\n    /**\n     * Returns true if something changed.\n     * Modifies `options`.\n    */\n    static applyUpdate(options, update) {\n        let changed = false;\n        for (const editorOption of editorOptionsRegistry) {\n            if (update.hasOwnProperty(editorOption.name)) {\n                const result = editorOption.applyUpdate(options[editorOption.name], update[editorOption.name]);\n                options[editorOption.name] = result.newValue;\n                changed = changed || result.didChange;\n            }\n        }\n        return changed;\n    }\n}\nfunction deepCloneAndMigrateOptions(_options) {\n    const options = deepClone(_options);\n    migrateOptions(options);\n    return options;\n}\n\nexport { ComputedEditorOptions, EditorConfiguration };\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 *--------------------------------------------------------------------------------------------*/\nvar inputLatency;\n(function (inputLatency) {\n    const totalKeydownTime = { total: 0, min: Number.MAX_VALUE, max: 0 };\n    const totalInputTime = { ...totalKeydownTime };\n    const totalRenderTime = { ...totalKeydownTime };\n    const totalInputLatencyTime = { ...totalKeydownTime };\n    let measurementsCount = 0;\n    const state = {\n        keydown: 0 /* EventPhase.Before */,\n        input: 0 /* EventPhase.Before */,\n        render: 0 /* EventPhase.Before */,\n    };\n    /**\n     * Record the start of the keydown event.\n     */\n    function onKeyDown() {\n        /** Direct Check C. See explanation in {@link recordIfFinished} */\n        recordIfFinished();\n        performance.mark('inputlatency/start');\n        performance.mark('keydown/start');\n        state.keydown = 1 /* EventPhase.InProgress */;\n        queueMicrotask(markKeyDownEnd);\n    }\n    inputLatency.onKeyDown = onKeyDown;\n    /**\n     * Mark the end of the keydown event.\n     */\n    function markKeyDownEnd() {\n        if (state.keydown === 1 /* EventPhase.InProgress */) {\n            performance.mark('keydown/end');\n            state.keydown = 2 /* EventPhase.Finished */;\n        }\n    }\n    /**\n     * Record the start of the beforeinput event.\n     */\n    function onBeforeInput() {\n        performance.mark('input/start');\n        state.input = 1 /* EventPhase.InProgress */;\n        /** Schedule Task A. See explanation in {@link recordIfFinished} */\n        scheduleRecordIfFinishedTask();\n    }\n    inputLatency.onBeforeInput = onBeforeInput;\n    /**\n     * Record the start of the input event.\n     */\n    function onInput() {\n        if (state.input === 0 /* EventPhase.Before */) {\n            // it looks like we didn't receive a `beforeinput`\n            onBeforeInput();\n        }\n        queueMicrotask(markInputEnd);\n    }\n    inputLatency.onInput = onInput;\n    function markInputEnd() {\n        if (state.input === 1 /* EventPhase.InProgress */) {\n            performance.mark('input/end');\n            state.input = 2 /* EventPhase.Finished */;\n        }\n    }\n    /**\n     * Record the start of the keyup event.\n     */\n    function onKeyUp() {\n        /** Direct Check D. See explanation in {@link recordIfFinished} */\n        recordIfFinished();\n    }\n    inputLatency.onKeyUp = onKeyUp;\n    /**\n     * Record the start of the selectionchange event.\n     */\n    function onSelectionChange() {\n        /** Direct Check E. See explanation in {@link recordIfFinished} */\n        recordIfFinished();\n    }\n    inputLatency.onSelectionChange = onSelectionChange;\n    /**\n     * Record the start of the animation frame performing the rendering.\n     */\n    function onRenderStart() {\n        // Render may be triggered during input, but we only measure the following animation frame\n        if (state.keydown === 2 /* EventPhase.Finished */ && state.input === 2 /* EventPhase.Finished */ && state.render === 0 /* EventPhase.Before */) {\n            // Only measure the first render after keyboard input\n            performance.mark('render/start');\n            state.render = 1 /* EventPhase.InProgress */;\n            queueMicrotask(markRenderEnd);\n            /** Schedule Task B. See explanation in {@link recordIfFinished} */\n            scheduleRecordIfFinishedTask();\n        }\n    }\n    inputLatency.onRenderStart = onRenderStart;\n    /**\n     * Mark the end of the animation frame performing the rendering.\n     */\n    function markRenderEnd() {\n        if (state.render === 1 /* EventPhase.InProgress */) {\n            performance.mark('render/end');\n            state.render = 2 /* EventPhase.Finished */;\n        }\n    }\n    function scheduleRecordIfFinishedTask() {\n        // Here we can safely assume that the `setTimeout` will not be\n        // artificially delayed by 4ms because we schedule it from\n        // event handlers\n        setTimeout(recordIfFinished);\n    }\n    /**\n     * Record the input latency sample if input handling and rendering are finished.\n     *\n     * The challenge here is that we want to record the latency in such a way that it includes\n     * also the layout and painting work the browser does during the animation frame task.\n     *\n     * Simply scheduling a new task (via `setTimeout`) from the animation frame task would\n     * schedule the new task at the end of the task queue (after other code that uses `setTimeout`),\n     * so we need to use multiple strategies to make sure our task runs before others:\n     *\n     * We schedule tasks (A and B):\n     *    - we schedule a task A (via a `setTimeout` call) when the input starts in `markInputStart`.\n     *      If the animation frame task is scheduled quickly by the browser, then task A has a very good\n     *      chance of being the very first task after the animation frame and thus will record the input latency.\n     *    - however, if the animation frame task is scheduled a bit later, then task A might execute\n     *      before the animation frame task. We therefore schedule another task B from `markRenderStart`.\n     *\n     * We do direct checks in browser event handlers (C, D, E):\n     *    - if the browser has multiple keydown events queued up, they will be scheduled before the `setTimeout` tasks,\n     *      so we do a direct check in the keydown event handler (C).\n     *    - depending on timing, sometimes the animation frame is scheduled even before the `keyup` event, so we\n     *      do a direct check there too (E).\n     *    - the browser oftentimes emits a `selectionchange` event after an `input`, so we do a direct check there (D).\n     */\n    function recordIfFinished() {\n        if (state.keydown === 2 /* EventPhase.Finished */ && state.input === 2 /* EventPhase.Finished */ && state.render === 2 /* EventPhase.Finished */) {\n            performance.mark('inputlatency/end');\n            performance.measure('keydown', 'keydown/start', 'keydown/end');\n            performance.measure('input', 'input/start', 'input/end');\n            performance.measure('render', 'render/start', 'render/end');\n            performance.measure('inputlatency', 'inputlatency/start', 'inputlatency/end');\n            addMeasure('keydown', totalKeydownTime);\n            addMeasure('input', totalInputTime);\n            addMeasure('render', totalRenderTime);\n            addMeasure('inputlatency', totalInputLatencyTime);\n            // console.info(\n            // \t`input latency=${performance.getEntriesByName('inputlatency')[0].duration.toFixed(1)} [` +\n            // \t`keydown=${performance.getEntriesByName('keydown')[0].duration.toFixed(1)}, ` +\n            // \t`input=${performance.getEntriesByName('input')[0].duration.toFixed(1)}, ` +\n            // \t`render=${performance.getEntriesByName('render')[0].duration.toFixed(1)}` +\n            // \t`]`\n            // );\n            measurementsCount++;\n            reset();\n        }\n    }\n    function addMeasure(entryName, cumulativeMeasurement) {\n        const duration = performance.getEntriesByName(entryName)[0].duration;\n        cumulativeMeasurement.total += duration;\n        cumulativeMeasurement.min = Math.min(cumulativeMeasurement.min, duration);\n        cumulativeMeasurement.max = Math.max(cumulativeMeasurement.max, duration);\n    }\n    /**\n     * Clear the current sample.\n     */\n    function reset() {\n        performance.clearMarks('keydown/start');\n        performance.clearMarks('keydown/end');\n        performance.clearMarks('input/start');\n        performance.clearMarks('input/end');\n        performance.clearMarks('render/start');\n        performance.clearMarks('render/end');\n        performance.clearMarks('inputlatency/start');\n        performance.clearMarks('inputlatency/end');\n        performance.clearMeasures('keydown');\n        performance.clearMeasures('input');\n        performance.clearMeasures('render');\n        performance.clearMeasures('inputlatency');\n        state.keydown = 0 /* EventPhase.Before */;\n        state.input = 0 /* EventPhase.Before */;\n        state.render = 0 /* EventPhase.Before */;\n    }\n    /**\n     * Gets all input latency samples and clears the internal buffers to start recording a new set\n     * of samples.\n     */\n    function getAndClearMeasurements() {\n        if (measurementsCount === 0) {\n            return undefined;\n        }\n        // Assemble the result\n        const result = {\n            keydown: cumulativeToFinalMeasurement(totalKeydownTime),\n            input: cumulativeToFinalMeasurement(totalInputTime),\n            render: cumulativeToFinalMeasurement(totalRenderTime),\n            total: cumulativeToFinalMeasurement(totalInputLatencyTime),\n            sampleCount: measurementsCount\n        };\n        // Clear the cumulative measurements\n        clearCumulativeMeasurement(totalKeydownTime);\n        clearCumulativeMeasurement(totalInputTime);\n        clearCumulativeMeasurement(totalRenderTime);\n        clearCumulativeMeasurement(totalInputLatencyTime);\n        measurementsCount = 0;\n        return result;\n    }\n    inputLatency.getAndClearMeasurements = getAndClearMeasurements;\n    function cumulativeToFinalMeasurement(cumulative) {\n        return {\n            average: cumulative.total / measurementsCount,\n            max: cumulative.max,\n            min: cumulative.min,\n        };\n    }\n    function clearCumulativeMeasurement(cumulative) {\n        cumulative.total = 0;\n        cumulative.min = Number.MAX_VALUE;\n        cumulative.max = 0;\n    }\n})(inputLatency || (inputLatency = {}));\n\nexport { inputLatency };\n","import { DisposableStore, toDisposable } from '../common/lifecycle.js';\nimport '../common/observableInternal/index.js';\nimport { isFirefox } from './browser.js';\nimport { getWindows, sharedMutationObserver } from './dom.js';\nimport { mainWindow } from './window.js';\nimport { autorun } from '../common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nconst globalStylesheets = new Map();\n/**\n * A version of createStyleSheet which has a unified API to initialize/set the style content.\n */\nfunction createStyleSheet2() {\n    return new WrappedStyleElement();\n}\nclass WrappedStyleElement {\n    constructor() {\n        this._currentCssStyle = '';\n        this._styleSheet = undefined;\n    }\n    setStyle(cssStyle) {\n        if (cssStyle === this._currentCssStyle) {\n            return;\n        }\n        this._currentCssStyle = cssStyle;\n        if (!this._styleSheet) {\n            this._styleSheet = createStyleSheet(mainWindow.document.head, (s) => s.textContent = cssStyle);\n        }\n        else {\n            this._styleSheet.textContent = cssStyle;\n        }\n    }\n    dispose() {\n        if (this._styleSheet) {\n            this._styleSheet.remove();\n            this._styleSheet = undefined;\n        }\n    }\n}\nfunction createStyleSheet(container = mainWindow.document.head, beforeAppend, disposableStore) {\n    const style = document.createElement('style');\n    style.type = 'text/css';\n    style.media = 'screen';\n    beforeAppend?.(style);\n    container.appendChild(style);\n    if (disposableStore) {\n        disposableStore.add(toDisposable(() => style.remove()));\n    }\n    // With <head> as container, the stylesheet becomes global and is tracked\n    // to support auxiliary windows to clone the stylesheet.\n    if (container === mainWindow.document.head) {\n        const globalStylesheetClones = new Set();\n        globalStylesheets.set(style, globalStylesheetClones);\n        if (disposableStore) {\n            disposableStore.add(toDisposable(() => globalStylesheets.delete(style)));\n        }\n        for (const { window: targetWindow, disposables } of getWindows()) {\n            if (targetWindow === mainWindow) {\n                continue; // main window is already tracked\n            }\n            const cloneDisposable = disposables.add(cloneGlobalStyleSheet(style, globalStylesheetClones, targetWindow));\n            disposableStore?.add(cloneDisposable);\n        }\n    }\n    return style;\n}\nfunction cloneGlobalStyleSheet(globalStylesheet, globalStylesheetClones, targetWindow) {\n    const disposables = new DisposableStore();\n    const clone = globalStylesheet.cloneNode(true);\n    targetWindow.document.head.appendChild(clone);\n    disposables.add(toDisposable(() => clone.remove()));\n    for (const rule of getDynamicStyleSheetRules(globalStylesheet)) {\n        clone.sheet?.insertRule(rule.cssText, clone.sheet?.cssRules.length);\n    }\n    disposables.add(sharedMutationObserver.observe(globalStylesheet, disposables, { childList: true, subtree: isFirefox, characterData: isFirefox })(() => {\n        clone.textContent = globalStylesheet.textContent;\n    }));\n    globalStylesheetClones.add(clone);\n    disposables.add(toDisposable(() => globalStylesheetClones.delete(clone)));\n    return disposables;\n}\nlet _sharedStyleSheet = null;\nfunction getSharedStyleSheet() {\n    if (!_sharedStyleSheet) {\n        _sharedStyleSheet = createStyleSheet();\n    }\n    return _sharedStyleSheet;\n}\nfunction getDynamicStyleSheetRules(style) {\n    if (style?.sheet?.rules) {\n        // Chrome, IE\n        return style.sheet.rules;\n    }\n    if (style?.sheet?.cssRules) {\n        // FF\n        return style.sheet.cssRules;\n    }\n    return [];\n}\nfunction createCSSRule(selector, cssText, style = getSharedStyleSheet()) {\n    if (!style || !cssText) {\n        return;\n    }\n    style.sheet?.insertRule(`${selector} {${cssText}}`, 0);\n    // Apply rule also to all cloned global stylesheets\n    for (const clonedGlobalStylesheet of globalStylesheets.get(style) ?? []) {\n        createCSSRule(selector, cssText, clonedGlobalStylesheet);\n    }\n}\nfunction removeCSSRulesContainingSelector(ruleName, style = getSharedStyleSheet()) {\n    if (!style) {\n        return;\n    }\n    const rules = getDynamicStyleSheetRules(style);\n    const toDelete = [];\n    for (let i = 0; i < rules.length; i++) {\n        const rule = rules[i];\n        if (isCSSStyleRule(rule) && rule.selectorText.indexOf(ruleName) !== -1) {\n            toDelete.push(i);\n        }\n    }\n    for (let i = toDelete.length - 1; i >= 0; i--) {\n        style.sheet?.deleteRule(toDelete[i]);\n    }\n    // Remove rules also from all cloned global stylesheets\n    for (const clonedGlobalStylesheet of globalStylesheets.get(style) ?? []) {\n        removeCSSRulesContainingSelector(ruleName, clonedGlobalStylesheet);\n    }\n}\nfunction isCSSStyleRule(rule) {\n    return typeof rule.selectorText === 'string';\n}\nfunction createStyleSheetFromObservable(css) {\n    const store = new DisposableStore();\n    const w = store.add(createStyleSheet2());\n    store.add(autorun(reader => {\n        w.setStyle(css.read(reader));\n    }));\n    return store;\n}\n\nexport { createCSSRule, createStyleSheet, createStyleSheet2, createStyleSheetFromObservable, removeCSSRulesContainingSelector };\n","import { getWindow, addDisposableListener, EventType } from './dom.js';\nimport { DisposableStore, toDisposable } from '../common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass GlobalPointerMoveMonitor {\n    constructor() {\n        this._hooks = new DisposableStore();\n        this._pointerMoveCallback = null;\n        this._onStopCallback = null;\n    }\n    dispose() {\n        this.stopMonitoring(false);\n        this._hooks.dispose();\n    }\n    stopMonitoring(invokeStopCallback, browserEvent) {\n        if (!this.isMonitoring()) {\n            // Not monitoring\n            return;\n        }\n        // Unhook\n        this._hooks.clear();\n        this._pointerMoveCallback = null;\n        const onStopCallback = this._onStopCallback;\n        this._onStopCallback = null;\n        if (invokeStopCallback && onStopCallback) {\n            onStopCallback(browserEvent);\n        }\n    }\n    isMonitoring() {\n        return !!this._pointerMoveCallback;\n    }\n    startMonitoring(initialElement, pointerId, initialButtons, pointerMoveCallback, onStopCallback) {\n        if (this.isMonitoring()) {\n            this.stopMonitoring(false);\n        }\n        this._pointerMoveCallback = pointerMoveCallback;\n        this._onStopCallback = onStopCallback;\n        let eventSource = initialElement;\n        try {\n            initialElement.setPointerCapture(pointerId);\n            this._hooks.add(toDisposable(() => {\n                try {\n                    initialElement.releasePointerCapture(pointerId);\n                }\n                catch (err) {\n                    // See https://github.com/microsoft/vscode/issues/161731\n                    //\n                    // `releasePointerCapture` sometimes fails when being invoked with the exception:\n                    //     DOMException: Failed to execute 'releasePointerCapture' on 'Element':\n                    //     No active pointer with the given id is found.\n                    //\n                    // There's no need to do anything in case of failure\n                }\n            }));\n        }\n        catch (err) {\n            // See https://github.com/microsoft/vscode/issues/144584\n            // See https://github.com/microsoft/vscode/issues/146947\n            // `setPointerCapture` sometimes fails when being invoked\n            // from a `mousedown` listener on macOS and Windows\n            // and it always fails on Linux with the exception:\n            //     DOMException: Failed to execute 'setPointerCapture' on 'Element':\n            //     No active pointer with the given id is found.\n            // In case of failure, we bind the listeners on the window\n            eventSource = getWindow(initialElement);\n        }\n        this._hooks.add(addDisposableListener(eventSource, EventType.POINTER_MOVE, (e) => {\n            if (e.buttons !== initialButtons) {\n                // Buttons state has changed in the meantime\n                this.stopMonitoring(true);\n                return;\n            }\n            e.preventDefault();\n            this._pointerMoveCallback(e);\n        }));\n        this._hooks.add(addDisposableListener(eventSource, EventType.POINTER_UP, (e) => this.stopMonitoring(true)));\n    }\n}\n\nexport { GlobalPointerMoveMonitor };\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 *--------------------------------------------------------------------------------------------*/\nfunction roundFloat(number, decimalPoints) {\n    const decimal = Math.pow(10, decimalPoints);\n    return Math.round(number * decimal) / decimal;\n}\nclass RGBA {\n    constructor(r, g, b, a = 1) {\n        this._rgbaBrand = undefined;\n        this.r = Math.min(255, Math.max(0, r)) | 0;\n        this.g = Math.min(255, Math.max(0, g)) | 0;\n        this.b = Math.min(255, Math.max(0, b)) | 0;\n        this.a = roundFloat(Math.max(Math.min(1, a), 0), 3);\n    }\n    static equals(a, b) {\n        return a.r === b.r && a.g === b.g && a.b === b.b && a.a === b.a;\n    }\n}\nclass HSLA {\n    constructor(h, s, l, a) {\n        this._hslaBrand = undefined;\n        this.h = Math.max(Math.min(360, h), 0) | 0;\n        this.s = roundFloat(Math.max(Math.min(1, s), 0), 3);\n        this.l = roundFloat(Math.max(Math.min(1, l), 0), 3);\n        this.a = roundFloat(Math.max(Math.min(1, a), 0), 3);\n    }\n    static equals(a, b) {\n        return a.h === b.h && a.s === b.s && a.l === b.l && a.a === b.a;\n    }\n    /**\n     * Converts an RGB color value to HSL. Conversion formula\n     * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n     * Assumes r, g, and b are contained in the set [0, 255] and\n     * returns h in the set [0, 360], s, and l in the set [0, 1].\n     */\n    static fromRGBA(rgba) {\n        const r = rgba.r / 255;\n        const g = rgba.g / 255;\n        const b = rgba.b / 255;\n        const a = rgba.a;\n        const max = Math.max(r, g, b);\n        const min = Math.min(r, g, b);\n        let h = 0;\n        let s = 0;\n        const l = (min + max) / 2;\n        const chroma = max - min;\n        if (chroma > 0) {\n            s = Math.min((l <= 0.5 ? chroma / (2 * l) : chroma / (2 - (2 * l))), 1);\n            switch (max) {\n                case r:\n                    h = (g - b) / chroma + (g < b ? 6 : 0);\n                    break;\n                case g:\n                    h = (b - r) / chroma + 2;\n                    break;\n                case b:\n                    h = (r - g) / chroma + 4;\n                    break;\n            }\n            h *= 60;\n            h = Math.round(h);\n        }\n        return new HSLA(h, s, l, a);\n    }\n    static _hue2rgb(p, q, t) {\n        if (t < 0) {\n            t += 1;\n        }\n        if (t > 1) {\n            t -= 1;\n        }\n        if (t < 1 / 6) {\n            return p + (q - p) * 6 * t;\n        }\n        if (t < 1 / 2) {\n            return q;\n        }\n        if (t < 2 / 3) {\n            return p + (q - p) * (2 / 3 - t) * 6;\n        }\n        return p;\n    }\n    /**\n     * Converts an HSL color value to RGB. Conversion formula\n     * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n     * Assumes h in the set [0, 360] s, and l are contained in the set [0, 1] and\n     * returns r, g, and b in the set [0, 255].\n     */\n    static toRGBA(hsla) {\n        const h = hsla.h / 360;\n        const { s, l, a } = hsla;\n        let r, g, b;\n        if (s === 0) {\n            r = g = b = l; // achromatic\n        }\n        else {\n            const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n            const p = 2 * l - q;\n            r = HSLA._hue2rgb(p, q, h + 1 / 3);\n            g = HSLA._hue2rgb(p, q, h);\n            b = HSLA._hue2rgb(p, q, h - 1 / 3);\n        }\n        return new RGBA(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), a);\n    }\n}\nclass HSVA {\n    constructor(h, s, v, a) {\n        this._hsvaBrand = undefined;\n        this.h = Math.max(Math.min(360, h), 0) | 0;\n        this.s = roundFloat(Math.max(Math.min(1, s), 0), 3);\n        this.v = roundFloat(Math.max(Math.min(1, v), 0), 3);\n        this.a = roundFloat(Math.max(Math.min(1, a), 0), 3);\n    }\n    static equals(a, b) {\n        return a.h === b.h && a.s === b.s && a.v === b.v && a.a === b.a;\n    }\n    // from http://www.rapidtables.com/convert/color/rgb-to-hsv.htm\n    static fromRGBA(rgba) {\n        const r = rgba.r / 255;\n        const g = rgba.g / 255;\n        const b = rgba.b / 255;\n        const cmax = Math.max(r, g, b);\n        const cmin = Math.min(r, g, b);\n        const delta = cmax - cmin;\n        const s = cmax === 0 ? 0 : (delta / cmax);\n        let m;\n        if (delta === 0) {\n            m = 0;\n        }\n        else if (cmax === r) {\n            m = ((((g - b) / delta) % 6) + 6) % 6;\n        }\n        else if (cmax === g) {\n            m = ((b - r) / delta) + 2;\n        }\n        else {\n            m = ((r - g) / delta) + 4;\n        }\n        return new HSVA(Math.round(m * 60), s, cmax, rgba.a);\n    }\n    // from http://www.rapidtables.com/convert/color/hsv-to-rgb.htm\n    static toRGBA(hsva) {\n        const { h, s, v, a } = hsva;\n        const c = v * s;\n        const x = c * (1 - Math.abs((h / 60) % 2 - 1));\n        const m = v - c;\n        let [r, g, b] = [0, 0, 0];\n        if (h < 60) {\n            r = c;\n            g = x;\n        }\n        else if (h < 120) {\n            r = x;\n            g = c;\n        }\n        else if (h < 180) {\n            g = c;\n            b = x;\n        }\n        else if (h < 240) {\n            g = x;\n            b = c;\n        }\n        else if (h < 300) {\n            r = x;\n            b = c;\n        }\n        else if (h <= 360) {\n            r = c;\n            b = x;\n        }\n        r = Math.round((r + m) * 255);\n        g = Math.round((g + m) * 255);\n        b = Math.round((b + m) * 255);\n        return new RGBA(r, g, b, a);\n    }\n}\nclass Color {\n    static fromHex(hex) {\n        return Color.Format.CSS.parseHex(hex) || Color.red;\n    }\n    static equals(a, b) {\n        if (!a && !b) {\n            return true;\n        }\n        if (!a || !b) {\n            return false;\n        }\n        return a.equals(b);\n    }\n    get hsla() {\n        if (this._hsla) {\n            return this._hsla;\n        }\n        else {\n            return HSLA.fromRGBA(this.rgba);\n        }\n    }\n    get hsva() {\n        if (this._hsva) {\n            return this._hsva;\n        }\n        return HSVA.fromRGBA(this.rgba);\n    }\n    constructor(arg) {\n        if (!arg) {\n            throw new Error('Color needs a value');\n        }\n        else if (arg instanceof RGBA) {\n            this.rgba = arg;\n        }\n        else if (arg instanceof HSLA) {\n            this._hsla = arg;\n            this.rgba = HSLA.toRGBA(arg);\n        }\n        else if (arg instanceof HSVA) {\n            this._hsva = arg;\n            this.rgba = HSVA.toRGBA(arg);\n        }\n        else {\n            throw new Error('Invalid color ctor argument');\n        }\n    }\n    equals(other) {\n        return !!other && RGBA.equals(this.rgba, other.rgba) && HSLA.equals(this.hsla, other.hsla) && HSVA.equals(this.hsva, other.hsva);\n    }\n    /**\n     * http://www.w3.org/TR/WCAG20/#relativeluminancedef\n     * Returns the number in the set [0, 1]. O => Darkest Black. 1 => Lightest white.\n     */\n    getRelativeLuminance() {\n        const R = Color._relativeLuminanceForComponent(this.rgba.r);\n        const G = Color._relativeLuminanceForComponent(this.rgba.g);\n        const B = Color._relativeLuminanceForComponent(this.rgba.b);\n        const luminance = 0.2126 * R + 0.7152 * G + 0.0722 * B;\n        return roundFloat(luminance, 4);\n    }\n    static _relativeLuminanceForComponent(color) {\n        const c = color / 255;\n        return (c <= 0.03928) ? c / 12.92 : Math.pow(((c + 0.055) / 1.055), 2.4);\n    }\n    /**\n     *\thttp://24ways.org/2010/calculating-color-contrast\n     *  Return 'true' if lighter color otherwise 'false'\n     */\n    isLighter() {\n        const yiq = (this.rgba.r * 299 + this.rgba.g * 587 + this.rgba.b * 114) / 1000;\n        return yiq >= 128;\n    }\n    isLighterThan(another) {\n        const lum1 = this.getRelativeLuminance();\n        const lum2 = another.getRelativeLuminance();\n        return lum1 > lum2;\n    }\n    isDarkerThan(another) {\n        const lum1 = this.getRelativeLuminance();\n        const lum2 = another.getRelativeLuminance();\n        return lum1 < lum2;\n    }\n    lighten(factor) {\n        return new Color(new HSLA(this.hsla.h, this.hsla.s, this.hsla.l + this.hsla.l * factor, this.hsla.a));\n    }\n    darken(factor) {\n        return new Color(new HSLA(this.hsla.h, this.hsla.s, this.hsla.l - this.hsla.l * factor, this.hsla.a));\n    }\n    transparent(factor) {\n        const { r, g, b, a } = this.rgba;\n        return new Color(new RGBA(r, g, b, a * factor));\n    }\n    isTransparent() {\n        return this.rgba.a === 0;\n    }\n    isOpaque() {\n        return this.rgba.a === 1;\n    }\n    opposite() {\n        return new Color(new RGBA(255 - this.rgba.r, 255 - this.rgba.g, 255 - this.rgba.b, this.rgba.a));\n    }\n    /**\n     * Mixes the current color with the provided color based on the given factor.\n     * @param color The color to mix with\n     * @param factor The factor of mixing (0 means this color, 1 means the input color, 0.5 means equal mix)\n     * @returns A new color representing the mix\n     */\n    mix(color, factor = 0.5) {\n        const normalize = Math.min(Math.max(factor, 0), 1);\n        const thisRGBA = this.rgba;\n        const otherRGBA = color.rgba;\n        const r = thisRGBA.r + (otherRGBA.r - thisRGBA.r) * normalize;\n        const g = thisRGBA.g + (otherRGBA.g - thisRGBA.g) * normalize;\n        const b = thisRGBA.b + (otherRGBA.b - thisRGBA.b) * normalize;\n        const a = thisRGBA.a + (otherRGBA.a - thisRGBA.a) * normalize;\n        return new Color(new RGBA(r, g, b, a));\n    }\n    makeOpaque(opaqueBackground) {\n        if (this.isOpaque() || opaqueBackground.rgba.a !== 1) {\n            // only allow to blend onto a non-opaque color onto a opaque color\n            return this;\n        }\n        const { r, g, b, a } = this.rgba;\n        // https://stackoverflow.com/questions/12228548/finding-equivalent-color-with-opacity\n        return new Color(new RGBA(opaqueBackground.rgba.r - a * (opaqueBackground.rgba.r - r), opaqueBackground.rgba.g - a * (opaqueBackground.rgba.g - g), opaqueBackground.rgba.b - a * (opaqueBackground.rgba.b - b), 1));\n    }\n    toString() {\n        if (!this._toString) {\n            this._toString = Color.Format.CSS.format(this);\n        }\n        return this._toString;\n    }\n    toNumber32Bit() {\n        if (!this._toNumber32Bit) {\n            this._toNumber32Bit = (this.rgba.r /*  */ << 24 |\n                this.rgba.g /*  */ << 16 |\n                this.rgba.b /*  */ << 8 |\n                this.rgba.a * 0xFF << 0) >>> 0;\n        }\n        return this._toNumber32Bit;\n    }\n    static getLighterColor(of, relative, factor) {\n        if (of.isLighterThan(relative)) {\n            return of;\n        }\n        factor = factor ? factor : 0.5;\n        const lum1 = of.getRelativeLuminance();\n        const lum2 = relative.getRelativeLuminance();\n        factor = factor * (lum2 - lum1) / lum2;\n        return of.lighten(factor);\n    }\n    static getDarkerColor(of, relative, factor) {\n        if (of.isDarkerThan(relative)) {\n            return of;\n        }\n        factor = factor ? factor : 0.5;\n        const lum1 = of.getRelativeLuminance();\n        const lum2 = relative.getRelativeLuminance();\n        factor = factor * (lum1 - lum2) / lum1;\n        return of.darken(factor);\n    }\n    static { this.white = new Color(new RGBA(255, 255, 255, 1)); }\n    static { this.black = new Color(new RGBA(0, 0, 0, 1)); }\n    static { this.red = new Color(new RGBA(255, 0, 0, 1)); }\n    static { this.blue = new Color(new RGBA(0, 0, 255, 1)); }\n    static { this.green = new Color(new RGBA(0, 255, 0, 1)); }\n    static { this.cyan = new Color(new RGBA(0, 255, 255, 1)); }\n    static { this.lightgrey = new Color(new RGBA(211, 211, 211, 1)); }\n    static { this.transparent = new Color(new RGBA(0, 0, 0, 0)); }\n}\n(function (Color) {\n    (function (Format) {\n        (function (CSS) {\n            function formatRGB(color) {\n                if (color.rgba.a === 1) {\n                    return `rgb(${color.rgba.r}, ${color.rgba.g}, ${color.rgba.b})`;\n                }\n                return Color.Format.CSS.formatRGBA(color);\n            }\n            CSS.formatRGB = formatRGB;\n            function formatRGBA(color) {\n                return `rgba(${color.rgba.r}, ${color.rgba.g}, ${color.rgba.b}, ${+(color.rgba.a).toFixed(2)})`;\n            }\n            CSS.formatRGBA = formatRGBA;\n            function formatHSL(color) {\n                if (color.hsla.a === 1) {\n                    return `hsl(${color.hsla.h}, ${Math.round(color.hsla.s * 100)}%, ${Math.round(color.hsla.l * 100)}%)`;\n                }\n                return Color.Format.CSS.formatHSLA(color);\n            }\n            CSS.formatHSL = formatHSL;\n            function formatHSLA(color) {\n                return `hsla(${color.hsla.h}, ${Math.round(color.hsla.s * 100)}%, ${Math.round(color.hsla.l * 100)}%, ${color.hsla.a.toFixed(2)})`;\n            }\n            CSS.formatHSLA = formatHSLA;\n            function _toTwoDigitHex(n) {\n                const r = n.toString(16);\n                return r.length !== 2 ? '0' + r : r;\n            }\n            /**\n             * Formats the color as #RRGGBB\n             */\n            function formatHex(color) {\n                return `#${_toTwoDigitHex(color.rgba.r)}${_toTwoDigitHex(color.rgba.g)}${_toTwoDigitHex(color.rgba.b)}`;\n            }\n            CSS.formatHex = formatHex;\n            /**\n             * Formats the color as #RRGGBBAA\n             * If 'compact' is set, colors without transparancy will be printed as #RRGGBB\n             */\n            function formatHexA(color, compact = false) {\n                if (compact && color.rgba.a === 1) {\n                    return Color.Format.CSS.formatHex(color);\n                }\n                return `#${_toTwoDigitHex(color.rgba.r)}${_toTwoDigitHex(color.rgba.g)}${_toTwoDigitHex(color.rgba.b)}${_toTwoDigitHex(Math.round(color.rgba.a * 255))}`;\n            }\n            CSS.formatHexA = formatHexA;\n            /**\n             * The default format will use HEX if opaque and RGBA otherwise.\n             */\n            function format(color) {\n                if (color.isOpaque()) {\n                    return Color.Format.CSS.formatHex(color);\n                }\n                return Color.Format.CSS.formatRGBA(color);\n            }\n            CSS.format = format;\n            /**\n             * Parse a CSS color and return a {@link Color}.\n             * @param css The CSS color to parse.\n             * @see https://drafts.csswg.org/css-color/#typedef-color\n             */\n            function parse(css) {\n                if (css === 'transparent') {\n                    return Color.transparent;\n                }\n                if (css.startsWith('#')) {\n                    return parseHex(css);\n                }\n                if (css.startsWith('rgba(')) {\n                    const color = css.match(/rgba\\((?<r>(?:\\+|-)?\\d+), *(?<g>(?:\\+|-)?\\d+), *(?<b>(?:\\+|-)?\\d+), *(?<a>(?:\\+|-)?\\d+(\\.\\d+)?)\\)/);\n                    if (!color) {\n                        throw new Error('Invalid color format ' + css);\n                    }\n                    const r = parseInt(color.groups?.r ?? '0');\n                    const g = parseInt(color.groups?.g ?? '0');\n                    const b = parseInt(color.groups?.b ?? '0');\n                    const a = parseFloat(color.groups?.a ?? '0');\n                    return new Color(new RGBA(r, g, b, a));\n                }\n                if (css.startsWith('rgb(')) {\n                    const color = css.match(/rgb\\((?<r>(?:\\+|-)?\\d+), *(?<g>(?:\\+|-)?\\d+), *(?<b>(?:\\+|-)?\\d+)\\)/);\n                    if (!color) {\n                        throw new Error('Invalid color format ' + css);\n                    }\n                    const r = parseInt(color.groups?.r ?? '0');\n                    const g = parseInt(color.groups?.g ?? '0');\n                    const b = parseInt(color.groups?.b ?? '0');\n                    return new Color(new RGBA(r, g, b));\n                }\n                // TODO: Support more formats as needed\n                return parseNamedKeyword(css);\n            }\n            CSS.parse = parse;\n            function parseNamedKeyword(css) {\n                // https://drafts.csswg.org/css-color/#named-colors\n                switch (css) {\n                    case 'aliceblue': return new Color(new RGBA(240, 248, 255, 1));\n                    case 'antiquewhite': return new Color(new RGBA(250, 235, 215, 1));\n                    case 'aqua': return new Color(new RGBA(0, 255, 255, 1));\n                    case 'aquamarine': return new Color(new RGBA(127, 255, 212, 1));\n                    case 'azure': return new Color(new RGBA(240, 255, 255, 1));\n                    case 'beige': return new Color(new RGBA(245, 245, 220, 1));\n                    case 'bisque': return new Color(new RGBA(255, 228, 196, 1));\n                    case 'black': return new Color(new RGBA(0, 0, 0, 1));\n                    case 'blanchedalmond': return new Color(new RGBA(255, 235, 205, 1));\n                    case 'blue': return new Color(new RGBA(0, 0, 255, 1));\n                    case 'blueviolet': return new Color(new RGBA(138, 43, 226, 1));\n                    case 'brown': return new Color(new RGBA(165, 42, 42, 1));\n                    case 'burlywood': return new Color(new RGBA(222, 184, 135, 1));\n                    case 'cadetblue': return new Color(new RGBA(95, 158, 160, 1));\n                    case 'chartreuse': return new Color(new RGBA(127, 255, 0, 1));\n                    case 'chocolate': return new Color(new RGBA(210, 105, 30, 1));\n                    case 'coral': return new Color(new RGBA(255, 127, 80, 1));\n                    case 'cornflowerblue': return new Color(new RGBA(100, 149, 237, 1));\n                    case 'cornsilk': return new Color(new RGBA(255, 248, 220, 1));\n                    case 'crimson': return new Color(new RGBA(220, 20, 60, 1));\n                    case 'cyan': return new Color(new RGBA(0, 255, 255, 1));\n                    case 'darkblue': return new Color(new RGBA(0, 0, 139, 1));\n                    case 'darkcyan': return new Color(new RGBA(0, 139, 139, 1));\n                    case 'darkgoldenrod': return new Color(new RGBA(184, 134, 11, 1));\n                    case 'darkgray': return new Color(new RGBA(169, 169, 169, 1));\n                    case 'darkgreen': return new Color(new RGBA(0, 100, 0, 1));\n                    case 'darkgrey': return new Color(new RGBA(169, 169, 169, 1));\n                    case 'darkkhaki': return new Color(new RGBA(189, 183, 107, 1));\n                    case 'darkmagenta': return new Color(new RGBA(139, 0, 139, 1));\n                    case 'darkolivegreen': return new Color(new RGBA(85, 107, 47, 1));\n                    case 'darkorange': return new Color(new RGBA(255, 140, 0, 1));\n                    case 'darkorchid': return new Color(new RGBA(153, 50, 204, 1));\n                    case 'darkred': return new Color(new RGBA(139, 0, 0, 1));\n                    case 'darksalmon': return new Color(new RGBA(233, 150, 122, 1));\n                    case 'darkseagreen': return new Color(new RGBA(143, 188, 143, 1));\n                    case 'darkslateblue': return new Color(new RGBA(72, 61, 139, 1));\n                    case 'darkslategray': return new Color(new RGBA(47, 79, 79, 1));\n                    case 'darkslategrey': return new Color(new RGBA(47, 79, 79, 1));\n                    case 'darkturquoise': return new Color(new RGBA(0, 206, 209, 1));\n                    case 'darkviolet': return new Color(new RGBA(148, 0, 211, 1));\n                    case 'deeppink': return new Color(new RGBA(255, 20, 147, 1));\n                    case 'deepskyblue': return new Color(new RGBA(0, 191, 255, 1));\n                    case 'dimgray': return new Color(new RGBA(105, 105, 105, 1));\n                    case 'dimgrey': return new Color(new RGBA(105, 105, 105, 1));\n                    case 'dodgerblue': return new Color(new RGBA(30, 144, 255, 1));\n                    case 'firebrick': return new Color(new RGBA(178, 34, 34, 1));\n                    case 'floralwhite': return new Color(new RGBA(255, 250, 240, 1));\n                    case 'forestgreen': return new Color(new RGBA(34, 139, 34, 1));\n                    case 'fuchsia': return new Color(new RGBA(255, 0, 255, 1));\n                    case 'gainsboro': return new Color(new RGBA(220, 220, 220, 1));\n                    case 'ghostwhite': return new Color(new RGBA(248, 248, 255, 1));\n                    case 'gold': return new Color(new RGBA(255, 215, 0, 1));\n                    case 'goldenrod': return new Color(new RGBA(218, 165, 32, 1));\n                    case 'gray': return new Color(new RGBA(128, 128, 128, 1));\n                    case 'green': return new Color(new RGBA(0, 128, 0, 1));\n                    case 'greenyellow': return new Color(new RGBA(173, 255, 47, 1));\n                    case 'grey': return new Color(new RGBA(128, 128, 128, 1));\n                    case 'honeydew': return new Color(new RGBA(240, 255, 240, 1));\n                    case 'hotpink': return new Color(new RGBA(255, 105, 180, 1));\n                    case 'indianred': return new Color(new RGBA(205, 92, 92, 1));\n                    case 'indigo': return new Color(new RGBA(75, 0, 130, 1));\n                    case 'ivory': return new Color(new RGBA(255, 255, 240, 1));\n                    case 'khaki': return new Color(new RGBA(240, 230, 140, 1));\n                    case 'lavender': return new Color(new RGBA(230, 230, 250, 1));\n                    case 'lavenderblush': return new Color(new RGBA(255, 240, 245, 1));\n                    case 'lawngreen': return new Color(new RGBA(124, 252, 0, 1));\n                    case 'lemonchiffon': return new Color(new RGBA(255, 250, 205, 1));\n                    case 'lightblue': return new Color(new RGBA(173, 216, 230, 1));\n                    case 'lightcoral': return new Color(new RGBA(240, 128, 128, 1));\n                    case 'lightcyan': return new Color(new RGBA(224, 255, 255, 1));\n                    case 'lightgoldenrodyellow': return new Color(new RGBA(250, 250, 210, 1));\n                    case 'lightgray': return new Color(new RGBA(211, 211, 211, 1));\n                    case 'lightgreen': return new Color(new RGBA(144, 238, 144, 1));\n                    case 'lightgrey': return new Color(new RGBA(211, 211, 211, 1));\n                    case 'lightpink': return new Color(new RGBA(255, 182, 193, 1));\n                    case 'lightsalmon': return new Color(new RGBA(255, 160, 122, 1));\n                    case 'lightseagreen': return new Color(new RGBA(32, 178, 170, 1));\n                    case 'lightskyblue': return new Color(new RGBA(135, 206, 250, 1));\n                    case 'lightslategray': return new Color(new RGBA(119, 136, 153, 1));\n                    case 'lightslategrey': return new Color(new RGBA(119, 136, 153, 1));\n                    case 'lightsteelblue': return new Color(new RGBA(176, 196, 222, 1));\n                    case 'lightyellow': return new Color(new RGBA(255, 255, 224, 1));\n                    case 'lime': return new Color(new RGBA(0, 255, 0, 1));\n                    case 'limegreen': return new Color(new RGBA(50, 205, 50, 1));\n                    case 'linen': return new Color(new RGBA(250, 240, 230, 1));\n                    case 'magenta': return new Color(new RGBA(255, 0, 255, 1));\n                    case 'maroon': return new Color(new RGBA(128, 0, 0, 1));\n                    case 'mediumaquamarine': return new Color(new RGBA(102, 205, 170, 1));\n                    case 'mediumblue': return new Color(new RGBA(0, 0, 205, 1));\n                    case 'mediumorchid': return new Color(new RGBA(186, 85, 211, 1));\n                    case 'mediumpurple': return new Color(new RGBA(147, 112, 219, 1));\n                    case 'mediumseagreen': return new Color(new RGBA(60, 179, 113, 1));\n                    case 'mediumslateblue': return new Color(new RGBA(123, 104, 238, 1));\n                    case 'mediumspringgreen': return new Color(new RGBA(0, 250, 154, 1));\n                    case 'mediumturquoise': return new Color(new RGBA(72, 209, 204, 1));\n                    case 'mediumvioletred': return new Color(new RGBA(199, 21, 133, 1));\n                    case 'midnightblue': return new Color(new RGBA(25, 25, 112, 1));\n                    case 'mintcream': return new Color(new RGBA(245, 255, 250, 1));\n                    case 'mistyrose': return new Color(new RGBA(255, 228, 225, 1));\n                    case 'moccasin': return new Color(new RGBA(255, 228, 181, 1));\n                    case 'navajowhite': return new Color(new RGBA(255, 222, 173, 1));\n                    case 'navy': return new Color(new RGBA(0, 0, 128, 1));\n                    case 'oldlace': return new Color(new RGBA(253, 245, 230, 1));\n                    case 'olive': return new Color(new RGBA(128, 128, 0, 1));\n                    case 'olivedrab': return new Color(new RGBA(107, 142, 35, 1));\n                    case 'orange': return new Color(new RGBA(255, 165, 0, 1));\n                    case 'orangered': return new Color(new RGBA(255, 69, 0, 1));\n                    case 'orchid': return new Color(new RGBA(218, 112, 214, 1));\n                    case 'palegoldenrod': return new Color(new RGBA(238, 232, 170, 1));\n                    case 'palegreen': return new Color(new RGBA(152, 251, 152, 1));\n                    case 'paleturquoise': return new Color(new RGBA(175, 238, 238, 1));\n                    case 'palevioletred': return new Color(new RGBA(219, 112, 147, 1));\n                    case 'papayawhip': return new Color(new RGBA(255, 239, 213, 1));\n                    case 'peachpuff': return new Color(new RGBA(255, 218, 185, 1));\n                    case 'peru': return new Color(new RGBA(205, 133, 63, 1));\n                    case 'pink': return new Color(new RGBA(255, 192, 203, 1));\n                    case 'plum': return new Color(new RGBA(221, 160, 221, 1));\n                    case 'powderblue': return new Color(new RGBA(176, 224, 230, 1));\n                    case 'purple': return new Color(new RGBA(128, 0, 128, 1));\n                    case 'rebeccapurple': return new Color(new RGBA(102, 51, 153, 1));\n                    case 'red': return new Color(new RGBA(255, 0, 0, 1));\n                    case 'rosybrown': return new Color(new RGBA(188, 143, 143, 1));\n                    case 'royalblue': return new Color(new RGBA(65, 105, 225, 1));\n                    case 'saddlebrown': return new Color(new RGBA(139, 69, 19, 1));\n                    case 'salmon': return new Color(new RGBA(250, 128, 114, 1));\n                    case 'sandybrown': return new Color(new RGBA(244, 164, 96, 1));\n                    case 'seagreen': return new Color(new RGBA(46, 139, 87, 1));\n                    case 'seashell': return new Color(new RGBA(255, 245, 238, 1));\n                    case 'sienna': return new Color(new RGBA(160, 82, 45, 1));\n                    case 'silver': return new Color(new RGBA(192, 192, 192, 1));\n                    case 'skyblue': return new Color(new RGBA(135, 206, 235, 1));\n                    case 'slateblue': return new Color(new RGBA(106, 90, 205, 1));\n                    case 'slategray': return new Color(new RGBA(112, 128, 144, 1));\n                    case 'slategrey': return new Color(new RGBA(112, 128, 144, 1));\n                    case 'snow': return new Color(new RGBA(255, 250, 250, 1));\n                    case 'springgreen': return new Color(new RGBA(0, 255, 127, 1));\n                    case 'steelblue': return new Color(new RGBA(70, 130, 180, 1));\n                    case 'tan': return new Color(new RGBA(210, 180, 140, 1));\n                    case 'teal': return new Color(new RGBA(0, 128, 128, 1));\n                    case 'thistle': return new Color(new RGBA(216, 191, 216, 1));\n                    case 'tomato': return new Color(new RGBA(255, 99, 71, 1));\n                    case 'turquoise': return new Color(new RGBA(64, 224, 208, 1));\n                    case 'violet': return new Color(new RGBA(238, 130, 238, 1));\n                    case 'wheat': return new Color(new RGBA(245, 222, 179, 1));\n                    case 'white': return new Color(new RGBA(255, 255, 255, 1));\n                    case 'whitesmoke': return new Color(new RGBA(245, 245, 245, 1));\n                    case 'yellow': return new Color(new RGBA(255, 255, 0, 1));\n                    case 'yellowgreen': return new Color(new RGBA(154, 205, 50, 1));\n                    default: return null;\n                }\n            }\n            /**\n             * Converts an Hex color value to a Color.\n             * returns r, g, and b are contained in the set [0, 255]\n             * @param hex string (#RGB, #RGBA, #RRGGBB or #RRGGBBAA).\n             */\n            function parseHex(hex) {\n                const length = hex.length;\n                if (length === 0) {\n                    // Invalid color\n                    return null;\n                }\n                if (hex.charCodeAt(0) !== 35 /* CharCode.Hash */) {\n                    // Does not begin with a #\n                    return null;\n                }\n                if (length === 7) {\n                    // #RRGGBB format\n                    const r = 16 * _parseHexDigit(hex.charCodeAt(1)) + _parseHexDigit(hex.charCodeAt(2));\n                    const g = 16 * _parseHexDigit(hex.charCodeAt(3)) + _parseHexDigit(hex.charCodeAt(4));\n                    const b = 16 * _parseHexDigit(hex.charCodeAt(5)) + _parseHexDigit(hex.charCodeAt(6));\n                    return new Color(new RGBA(r, g, b, 1));\n                }\n                if (length === 9) {\n                    // #RRGGBBAA format\n                    const r = 16 * _parseHexDigit(hex.charCodeAt(1)) + _parseHexDigit(hex.charCodeAt(2));\n                    const g = 16 * _parseHexDigit(hex.charCodeAt(3)) + _parseHexDigit(hex.charCodeAt(4));\n                    const b = 16 * _parseHexDigit(hex.charCodeAt(5)) + _parseHexDigit(hex.charCodeAt(6));\n                    const a = 16 * _parseHexDigit(hex.charCodeAt(7)) + _parseHexDigit(hex.charCodeAt(8));\n                    return new Color(new RGBA(r, g, b, a / 255));\n                }\n                if (length === 4) {\n                    // #RGB format\n                    const r = _parseHexDigit(hex.charCodeAt(1));\n                    const g = _parseHexDigit(hex.charCodeAt(2));\n                    const b = _parseHexDigit(hex.charCodeAt(3));\n                    return new Color(new RGBA(16 * r + r, 16 * g + g, 16 * b + b));\n                }\n                if (length === 5) {\n                    // #RGBA format\n                    const r = _parseHexDigit(hex.charCodeAt(1));\n                    const g = _parseHexDigit(hex.charCodeAt(2));\n                    const b = _parseHexDigit(hex.charCodeAt(3));\n                    const a = _parseHexDigit(hex.charCodeAt(4));\n                    return new Color(new RGBA(16 * r + r, 16 * g + g, 16 * b + b, (16 * a + a) / 255));\n                }\n                // Invalid color\n                return null;\n            }\n            CSS.parseHex = parseHex;\n            function _parseHexDigit(charCode) {\n                switch (charCode) {\n                    case 48 /* CharCode.Digit0 */: return 0;\n                    case 49 /* CharCode.Digit1 */: return 1;\n                    case 50 /* CharCode.Digit2 */: return 2;\n                    case 51 /* CharCode.Digit3 */: return 3;\n                    case 52 /* CharCode.Digit4 */: return 4;\n                    case 53 /* CharCode.Digit5 */: return 5;\n                    case 54 /* CharCode.Digit6 */: return 6;\n                    case 55 /* CharCode.Digit7 */: return 7;\n                    case 56 /* CharCode.Digit8 */: return 8;\n                    case 57 /* CharCode.Digit9 */: return 9;\n                    case 97 /* CharCode.a */: return 10;\n                    case 65 /* CharCode.A */: return 10;\n                    case 98 /* CharCode.b */: return 11;\n                    case 66 /* CharCode.B */: return 11;\n                    case 99 /* CharCode.c */: return 12;\n                    case 67 /* CharCode.C */: return 12;\n                    case 100 /* CharCode.d */: return 13;\n                    case 68 /* CharCode.D */: return 13;\n                    case 101 /* CharCode.e */: return 14;\n                    case 69 /* CharCode.E */: return 14;\n                    case 102 /* CharCode.f */: return 15;\n                    case 70 /* CharCode.F */: return 15;\n                }\n                return 0;\n            }\n        })(Format.CSS || (Format.CSS = {}));\n    })(Color.Format || (Color.Format = {}));\n})(Color || (Color = {}));\n\nexport { Color, HSLA, HSVA, RGBA };\n","import { assertNever } from '../../../base/common/assert.js';\nimport { RunOnceScheduler } from '../../../base/common/async.js';\nimport { Color } from '../../../base/common/color.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { Extensions as Extensions$1 } from '../../jsonschemas/common/jsonContributionRegistry.js';\nimport { Registry } from '../../registry/common/platform.js';\nimport { localize } from '../../../nls.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\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/**\n * Returns the css variable name for the given color identifier. Dots (`.`) are replaced with hyphens (`-`) and\n * everything is prefixed with `--vscode-`.\n *\n * @sample `editorSuggestWidget.background` is `--vscode-editorSuggestWidget-background`.\n */\nfunction asCssVariableName(colorIdent) {\n    return `--vscode-${colorIdent.replace(/\\./g, '-')}`;\n}\nfunction asCssVariable(color) {\n    return `var(${asCssVariableName(color)})`;\n}\nfunction asCssVariableWithDefault(color, defaultCssValue) {\n    return `var(${asCssVariableName(color)}, ${defaultCssValue})`;\n}\nfunction isColorDefaults(value) {\n    return value !== null && typeof value === 'object' && 'light' in value && 'dark' in value;\n}\n// color registry\nconst Extensions = {\n    ColorContribution: 'base.contributions.colors'\n};\nconst DEFAULT_COLOR_CONFIG_VALUE = 'default';\nclass ColorRegistry extends Disposable {\n    constructor() {\n        super();\n        this._onDidChangeSchema = this._register(new Emitter());\n        this.onDidChangeSchema = this._onDidChangeSchema.event;\n        this.colorSchema = { type: 'object', properties: {} };\n        this.colorReferenceSchema = { type: 'string', enum: [], enumDescriptions: [] };\n        this.colorsById = {};\n    }\n    registerColor(id, defaults, description, needsTransparency = false, deprecationMessage) {\n        const colorContribution = { id, description, defaults, needsTransparency, deprecationMessage };\n        this.colorsById[id] = colorContribution;\n        const propertySchema = { type: 'string', format: 'color-hex', defaultSnippets: [{ body: '${1:#ff0000}' }] };\n        if (deprecationMessage) {\n            propertySchema.deprecationMessage = deprecationMessage;\n        }\n        if (needsTransparency) {\n            propertySchema.pattern = '^#(?:(?<rgba>[0-9a-fA-f]{3}[0-9a-eA-E])|(?:[0-9a-fA-F]{6}(?:(?![fF]{2})(?:[0-9a-fA-F]{2}))))?$';\n            propertySchema.patternErrorMessage = localize(2022, 'This color must be transparent or it will obscure content');\n        }\n        this.colorSchema.properties[id] = {\n            description,\n            oneOf: [\n                propertySchema,\n                { type: 'string', const: DEFAULT_COLOR_CONFIG_VALUE, description: localize(2023, 'Use the default color.') }\n            ]\n        };\n        this.colorReferenceSchema.enum.push(id);\n        this.colorReferenceSchema.enumDescriptions.push(description);\n        this._onDidChangeSchema.fire();\n        return id;\n    }\n    getColors() {\n        return Object.keys(this.colorsById).map(id => this.colorsById[id]);\n    }\n    resolveDefaultColor(id, theme) {\n        const colorDesc = this.colorsById[id];\n        if (colorDesc?.defaults) {\n            const colorValue = isColorDefaults(colorDesc.defaults) ? colorDesc.defaults[theme.type] : colorDesc.defaults;\n            return resolveColorValue(colorValue, theme);\n        }\n        return undefined;\n    }\n    getColorSchema() {\n        return this.colorSchema;\n    }\n    toString() {\n        const sorter = (a, b) => {\n            const cat1 = a.indexOf('.') === -1 ? 0 : 1;\n            const cat2 = b.indexOf('.') === -1 ? 0 : 1;\n            if (cat1 !== cat2) {\n                return cat1 - cat2;\n            }\n            return a.localeCompare(b);\n        };\n        return Object.keys(this.colorsById).sort(sorter).map(k => `- \\`${k}\\`: ${this.colorsById[k].description}`).join('\\n');\n    }\n}\nconst colorRegistry = new ColorRegistry();\nRegistry.add(Extensions.ColorContribution, colorRegistry);\nfunction registerColor(id, defaults, description, needsTransparency, deprecationMessage) {\n    return colorRegistry.registerColor(id, defaults, description, needsTransparency, deprecationMessage);\n}\n// ----- color functions\nfunction executeTransform(transform, theme) {\n    switch (transform.op) {\n        case 0 /* ColorTransformType.Darken */:\n            return resolveColorValue(transform.value, theme)?.darken(transform.factor);\n        case 1 /* ColorTransformType.Lighten */:\n            return resolveColorValue(transform.value, theme)?.lighten(transform.factor);\n        case 2 /* ColorTransformType.Transparent */:\n            return resolveColorValue(transform.value, theme)?.transparent(transform.factor);\n        case 7 /* ColorTransformType.Mix */: {\n            const primaryColor = resolveColorValue(transform.color, theme) || Color.transparent;\n            const otherColor = resolveColorValue(transform.with, theme) || Color.transparent;\n            return primaryColor.mix(otherColor, transform.ratio);\n        }\n        case 3 /* ColorTransformType.Opaque */: {\n            const backgroundColor = resolveColorValue(transform.background, theme);\n            if (!backgroundColor) {\n                return resolveColorValue(transform.value, theme);\n            }\n            return resolveColorValue(transform.value, theme)?.makeOpaque(backgroundColor);\n        }\n        case 4 /* ColorTransformType.OneOf */:\n            for (const candidate of transform.values) {\n                const color = resolveColorValue(candidate, theme);\n                if (color) {\n                    return color;\n                }\n            }\n            return undefined;\n        case 6 /* ColorTransformType.IfDefinedThenElse */:\n            return resolveColorValue(theme.defines(transform.if) ? transform.then : transform.else, theme);\n        case 5 /* ColorTransformType.LessProminent */: {\n            const from = resolveColorValue(transform.value, theme);\n            if (!from) {\n                return undefined;\n            }\n            const backgroundColor = resolveColorValue(transform.background, theme);\n            if (!backgroundColor) {\n                return from.transparent(transform.factor * transform.transparency);\n            }\n            return from.isDarkerThan(backgroundColor)\n                ? Color.getLighterColor(from, backgroundColor, transform.factor).transparent(transform.transparency)\n                : Color.getDarkerColor(from, backgroundColor, transform.factor).transparent(transform.transparency);\n        }\n        default:\n            throw assertNever();\n    }\n}\nfunction darken(colorValue, factor) {\n    return { op: 0 /* ColorTransformType.Darken */, value: colorValue, factor };\n}\nfunction lighten(colorValue, factor) {\n    return { op: 1 /* ColorTransformType.Lighten */, value: colorValue, factor };\n}\nfunction transparent(colorValue, factor) {\n    return { op: 2 /* ColorTransformType.Transparent */, value: colorValue, factor };\n}\nfunction oneOf(...colorValues) {\n    return { op: 4 /* ColorTransformType.OneOf */, values: colorValues };\n}\nfunction ifDefinedThenElse(ifArg, thenArg, elseArg) {\n    return { op: 6 /* ColorTransformType.IfDefinedThenElse */, if: ifArg, then: thenArg, else: elseArg };\n}\nfunction lessProminent(colorValue, backgroundColorValue, factor, transparency) {\n    return { op: 5 /* ColorTransformType.LessProminent */, value: colorValue, background: backgroundColorValue, factor, transparency };\n}\n// ----- implementation\n/**\n * @param colorValue Resolve a color value in the context of a theme\n */\nfunction resolveColorValue(colorValue, theme) {\n    if (colorValue === null) {\n        return undefined;\n    }\n    else if (typeof colorValue === 'string') {\n        if (colorValue[0] === '#') {\n            return Color.fromHex(colorValue);\n        }\n        return theme.getColor(colorValue);\n    }\n    else if (colorValue instanceof Color) {\n        return colorValue;\n    }\n    else if (typeof colorValue === 'object') {\n        return executeTransform(colorValue, theme);\n    }\n    return undefined;\n}\nconst workbenchColorsSchemaId = 'vscode://schemas/workbench-colors';\nconst schemaRegistry = Registry.as(Extensions$1.JSONContribution);\nschemaRegistry.registerSchema(workbenchColorsSchemaId, colorRegistry.getColorSchema());\nconst delayer = new RunOnceScheduler(() => schemaRegistry.notifySchemaChanged(workbenchColorsSchemaId), 200);\ncolorRegistry.onDidChangeSchema(() => {\n    if (!delayer.isScheduled()) {\n        delayer.schedule();\n    }\n});\n// setTimeout(_ => console.log(colorRegistry.toString()), 5000);\n\nexport { DEFAULT_COLOR_CONFIG_VALUE, Extensions, asCssVariable, asCssVariableName, asCssVariableWithDefault, darken, executeTransform, ifDefinedThenElse, isColorDefaults, lessProminent, lighten, oneOf, registerColor, resolveColorValue, transparent, workbenchColorsSchemaId };\n","import { localize } from '../../../../nls.js';\nimport { Color } from '../../../../base/common/color.js';\nimport { registerColor, transparent } from '../colorUtils.js';\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 *--------------------------------------------------------------------------------------------*/\nconst foreground = registerColor('foreground', { dark: '#CCCCCC', light: '#616161', hcDark: '#FFFFFF', hcLight: '#292929' }, localize(1773, \"Overall foreground color. This color is only used if not overridden by a component.\"));\nregisterColor('disabledForeground', { dark: '#CCCCCC80', light: '#61616180', hcDark: '#A5A5A5', hcLight: '#7F7F7F' }, localize(1774, \"Overall foreground for disabled elements. This color is only used if not overridden by a component.\"));\nregisterColor('errorForeground', { dark: '#F48771', light: '#A1260D', hcDark: '#F48771', hcLight: '#B5200D' }, localize(1775, \"Overall foreground color for error messages. This color is only used if not overridden by a component.\"));\nconst descriptionForeground = registerColor('descriptionForeground', { light: '#717171', dark: transparent(foreground, 0.7), hcDark: transparent(foreground, 0.7), hcLight: transparent(foreground, 0.7) }, localize(1776, \"Foreground color for description text providing additional information, for example for a label.\"));\nconst iconForeground = registerColor('icon.foreground', { dark: '#C5C5C5', light: '#424242', hcDark: '#FFFFFF', hcLight: '#292929' }, localize(1777, \"The default color for icons in the workbench.\"));\nconst focusBorder = registerColor('focusBorder', { dark: '#007FD4', light: '#0090F1', hcDark: '#F38518', hcLight: '#006BBD' }, localize(1778, \"Overall border color for focused elements. This color is only used if not overridden by a component.\"));\nconst contrastBorder = registerColor('contrastBorder', { light: null, dark: null, hcDark: '#6FC3DF', hcLight: '#0F4A85' }, localize(1779, \"An extra border around elements to separate them from others for greater contrast.\"));\nconst activeContrastBorder = registerColor('contrastActiveBorder', { light: null, dark: null, hcDark: focusBorder, hcLight: focusBorder }, localize(1780, \"An extra border around active elements to separate them from others for greater contrast.\"));\nregisterColor('selection.background', null, localize(1781, \"The background color of text selections in the workbench (e.g. for input fields or text areas). Note that this does not apply to selections within the editor.\"));\n// ------ text link\nconst textLinkForeground = registerColor('textLink.foreground', { light: '#006AB1', dark: '#3794FF', hcDark: '#21A6FF', hcLight: '#0F4A85' }, localize(1782, \"Foreground color for links in text.\"));\nregisterColor('textLink.activeForeground', { light: '#006AB1', dark: '#3794FF', hcDark: '#21A6FF', hcLight: '#0F4A85' }, localize(1783, \"Foreground color for links in text when clicked on and on mouse hover.\"));\nregisterColor('textSeparator.foreground', { light: '#0000002e', dark: '#ffffff2e', hcDark: Color.black, hcLight: '#292929' }, localize(1784, \"Color for text separators.\"));\n// ------ text preformat\nregisterColor('textPreformat.foreground', { light: '#A31515', dark: '#D7BA7D', hcDark: '#000000', hcLight: '#FFFFFF' }, localize(1785, \"Foreground color for preformatted text segments.\"));\nregisterColor('textPreformat.background', { light: '#0000001A', dark: '#FFFFFF1A', hcDark: '#FFFFFF', hcLight: '#09345f' }, localize(1786, \"Background color for preformatted text segments.\"));\n// ------ text block quote\nregisterColor('textBlockQuote.background', { light: '#f2f2f2', dark: '#222222', hcDark: null, hcLight: '#F2F2F2' }, localize(1787, \"Background color for block quotes in text.\"));\nregisterColor('textBlockQuote.border', { light: '#007acc80', dark: '#007acc80', hcDark: Color.white, hcLight: '#292929' }, localize(1788, \"Border color for block quotes in text.\"));\n// ------ text code block\nregisterColor('textCodeBlock.background', { light: '#dcdcdc66', dark: '#0a0a0a66', hcDark: Color.black, hcLight: '#F2F2F2' }, localize(1789, \"Background color for code blocks in text.\"));\n\nexport { activeContrastBorder, contrastBorder, descriptionForeground, focusBorder, foreground, iconForeground, textLinkForeground };\n","import { localize } from '../../../../nls.js';\nimport { Color } from '../../../../base/common/color.js';\nimport { registerColor, transparent } from '../colorUtils.js';\nimport { focusBorder, contrastBorder } from './baseColors.js';\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// ----- sash\nregisterColor('sash.hoverBorder', focusBorder, localize(1994, \"Border color of active sashes.\"));\n// ----- badge\nconst badgeBackground = registerColor('badge.background', { dark: '#4D4D4D', light: '#C4C4C4', hcDark: Color.black, hcLight: '#0F4A85' }, localize(1995, \"Badge background color. Badges are small information labels, e.g. for search results count.\"));\nconst badgeForeground = registerColor('badge.foreground', { dark: Color.white, light: '#333', hcDark: Color.white, hcLight: Color.white }, localize(1996, \"Badge foreground color. Badges are small information labels, e.g. for search results count.\"));\nregisterColor('activityWarningBadge.foreground', { dark: Color.black.lighten(0.2), light: Color.white, hcDark: null, hcLight: Color.black.lighten(0.2) }, localize(1997, 'Foreground color of the warning activity badge'));\nregisterColor('activityWarningBadge.background', { dark: '#CCA700', light: '#BF8803', hcDark: null, hcLight: '#CCA700' }, localize(1998, 'Background color of the warning activity badge'));\nregisterColor('activityErrorBadge.foreground', { dark: Color.black.lighten(0.2), light: Color.white, hcDark: null, hcLight: Color.black.lighten(0.2) }, localize(1999, 'Foreground color of the error activity badge'));\nregisterColor('activityErrorBadge.background', { dark: '#F14C4C', light: '#E51400', hcDark: null, hcLight: '#F14C4C' }, localize(2000, 'Background color of the error activity badge'));\n// ----- scrollbar\nconst scrollbarShadow = registerColor('scrollbar.shadow', { dark: '#000000', light: '#DDDDDD', hcDark: null, hcLight: null }, localize(2001, \"Scrollbar shadow to indicate that the view is scrolled.\"));\nconst scrollbarSliderBackground = registerColor('scrollbarSlider.background', { dark: Color.fromHex('#797979').transparent(0.4), light: Color.fromHex('#646464').transparent(0.4), hcDark: transparent(contrastBorder, 0.6), hcLight: transparent(contrastBorder, 0.4) }, localize(2002, \"Scrollbar slider background color.\"));\nconst scrollbarSliderHoverBackground = registerColor('scrollbarSlider.hoverBackground', { dark: Color.fromHex('#646464').transparent(0.7), light: Color.fromHex('#646464').transparent(0.7), hcDark: transparent(contrastBorder, 0.8), hcLight: transparent(contrastBorder, 0.8) }, localize(2003, \"Scrollbar slider background color when hovering.\"));\nconst scrollbarSliderActiveBackground = registerColor('scrollbarSlider.activeBackground', { dark: Color.fromHex('#BFBFBF').transparent(0.4), light: Color.fromHex('#000000').transparent(0.6), hcDark: contrastBorder, hcLight: contrastBorder }, localize(2004, \"Scrollbar slider background color when clicked on.\"));\nregisterColor('scrollbar.background', null, localize(2005, \"Scrollbar track background color.\"));\n// ----- progress bar\nconst progressBarBackground = registerColor('progressBar.background', { dark: Color.fromHex('#0E70C0'), light: Color.fromHex('#0E70C0'), hcDark: contrastBorder, hcLight: contrastBorder }, localize(2006, \"Background color of the progress bar that can show for long running operations.\"));\n// ----- chart\nregisterColor('chart.line', { dark: '#236B8E', light: '#236B8E', hcDark: '#236B8E', hcLight: '#236B8E' }, localize(2007, \"Line color for the chart.\"));\nregisterColor('chart.axis', { dark: Color.fromHex('#BFBFBF').transparent(0.4), light: Color.fromHex('#000000').transparent(0.6), hcDark: contrastBorder, hcLight: contrastBorder }, localize(2008, \"Axis color for the chart.\"));\nregisterColor('chart.guide', { dark: Color.fromHex('#BFBFBF').transparent(0.2), light: Color.fromHex('#000000').transparent(0.2), hcDark: contrastBorder, hcLight: contrastBorder }, localize(2009, \"Guide line for the chart.\"));\n\nexport { badgeBackground, badgeForeground, progressBarBackground, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground };\n","import { localize } from '../../../../nls.js';\nimport { Color, RGBA } from '../../../../base/common/color.js';\nimport { registerColor, transparent, lessProminent, darken, lighten } from '../colorUtils.js';\nimport { foreground, contrastBorder, activeContrastBorder } from './baseColors.js';\nimport { scrollbarShadow, badgeBackground } from './miscColors.js';\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// ----- editor\nconst editorBackground = registerColor('editor.background', { light: '#ffffff', dark: '#1E1E1E', hcDark: Color.black, hcLight: Color.white }, localize(1798, \"Editor background color.\"));\nconst editorForeground = registerColor('editor.foreground', { light: '#333333', dark: '#BBBBBB', hcDark: Color.white, hcLight: foreground }, localize(1799, \"Editor default foreground color.\"));\nregisterColor('editorStickyScroll.background', editorBackground, localize(1800, \"Background color of sticky scroll in the editor\"));\nregisterColor('editorStickyScrollGutter.background', editorBackground, localize(1801, \"Background color of the gutter part of sticky scroll in the editor\"));\nregisterColor('editorStickyScrollHover.background', { dark: '#2A2D2E', light: '#F0F0F0', hcDark: null, hcLight: Color.fromHex('#0F4A85').transparent(0.1) }, localize(1802, \"Background color of sticky scroll on hover in the editor\"));\nregisterColor('editorStickyScroll.border', { dark: null, light: null, hcDark: contrastBorder, hcLight: contrastBorder }, localize(1803, \"Border color of sticky scroll in the editor\"));\nregisterColor('editorStickyScroll.shadow', scrollbarShadow, localize(1804, \" Shadow color of sticky scroll in the editor\"));\nconst editorWidgetBackground = registerColor('editorWidget.background', { dark: '#252526', light: '#F3F3F3', hcDark: '#0C141F', hcLight: Color.white }, localize(1805, 'Background color of editor widgets, such as find/replace.'));\nconst editorWidgetForeground = registerColor('editorWidget.foreground', foreground, localize(1806, 'Foreground color of editor widgets, such as find/replace.'));\nconst editorWidgetBorder = registerColor('editorWidget.border', { dark: '#454545', light: '#C8C8C8', hcDark: contrastBorder, hcLight: contrastBorder }, localize(1807, 'Border color of editor widgets. The color is only used if the widget chooses to have a border and if the color is not overridden by a widget.'));\nregisterColor('editorWidget.resizeBorder', null, localize(1808, \"Border color of the resize bar of editor widgets. The color is only used if the widget chooses to have a resize border and if the color is not overridden by a widget.\"));\nregisterColor('editorError.background', null, localize(1809, 'Background color of error text in the editor. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst editorErrorForeground = registerColor('editorError.foreground', { dark: '#F14C4C', light: '#E51400', hcDark: '#F48771', hcLight: '#B5200D' }, localize(1810, 'Foreground color of error squigglies in the editor.'));\nconst editorErrorBorder = registerColor('editorError.border', { dark: null, light: null, hcDark: Color.fromHex('#E47777').transparent(0.8), hcLight: '#B5200D' }, localize(1811, 'If set, color of double underlines for errors in the editor.'));\nconst editorWarningBackground = registerColor('editorWarning.background', null, localize(1812, 'Background color of warning text in the editor. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst editorWarningForeground = registerColor('editorWarning.foreground', { dark: '#CCA700', light: '#BF8803', hcDark: '#FFD370', hcLight: '#895503' }, localize(1813, 'Foreground color of warning squigglies in the editor.'));\nconst editorWarningBorder = registerColor('editorWarning.border', { dark: null, light: null, hcDark: Color.fromHex('#FFCC00').transparent(0.8), hcLight: Color.fromHex('#FFCC00').transparent(0.8) }, localize(1814, 'If set, color of double underlines for warnings in the editor.'));\nregisterColor('editorInfo.background', null, localize(1815, 'Background color of info text in the editor. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst editorInfoForeground = registerColor('editorInfo.foreground', { dark: '#3794FF', light: '#1a85ff', hcDark: '#3794FF', hcLight: '#1a85ff' }, localize(1816, 'Foreground color of info squigglies in the editor.'));\nconst editorInfoBorder = registerColor('editorInfo.border', { dark: null, light: null, hcDark: Color.fromHex('#3794FF').transparent(0.8), hcLight: '#292929' }, localize(1817, 'If set, color of double underlines for infos in the editor.'));\nconst editorHintForeground = registerColor('editorHint.foreground', { dark: Color.fromHex('#eeeeee').transparent(0.7), light: '#6c6c6c', hcDark: null, hcLight: null }, localize(1818, 'Foreground color of hint squigglies in the editor.'));\nregisterColor('editorHint.border', { dark: null, light: null, hcDark: Color.fromHex('#eeeeee').transparent(0.8), hcLight: '#292929' }, localize(1819, 'If set, color of double underlines for hints in the editor.'));\nconst editorActiveLinkForeground = registerColor('editorLink.activeForeground', { dark: '#4E94CE', light: Color.blue, hcDark: Color.cyan, hcLight: '#292929' }, localize(1820, 'Color of active links.'));\n// ----- editor selection\nconst editorSelectionBackground = registerColor('editor.selectionBackground', { light: '#ADD6FF', dark: '#264F78', hcDark: '#f3f518', hcLight: '#0F4A85' }, localize(1821, \"Color of the editor selection.\"));\nconst editorSelectionForeground = registerColor('editor.selectionForeground', { light: null, dark: null, hcDark: '#000000', hcLight: Color.white }, localize(1822, \"Color of the selected text for high contrast.\"));\nconst editorInactiveSelection = registerColor('editor.inactiveSelectionBackground', { light: transparent(editorSelectionBackground, 0.5), dark: transparent(editorSelectionBackground, 0.5), hcDark: transparent(editorSelectionBackground, 0.7), hcLight: transparent(editorSelectionBackground, 0.5) }, localize(1823, \"Color of the selection in an inactive editor. The color must not be opaque so as not to hide underlying decorations.\"), true);\nconst editorSelectionHighlight = registerColor('editor.selectionHighlightBackground', { light: lessProminent(editorSelectionBackground, editorBackground, 0.3, 0.6), dark: lessProminent(editorSelectionBackground, editorBackground, 0.3, 0.6), hcDark: null, hcLight: null }, localize(1824, 'Color for regions with the same content as the selection. The color must not be opaque so as not to hide underlying decorations.'), true);\nregisterColor('editor.selectionHighlightBorder', { light: null, dark: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize(1825, \"Border color for regions with the same content as the selection.\"));\nregisterColor('editor.compositionBorder', { light: '#000000', dark: '#ffffff', hcLight: '#000000', hcDark: '#ffffff' }, localize(1826, \"The border color for an IME composition.\"));\n// ----- editor find\nregisterColor('editor.findMatchBackground', { light: '#A8AC94', dark: '#515C6A', hcDark: null, hcLight: null }, localize(1827, \"Color of the current search match.\"));\nconst editorFindMatchForeground = registerColor('editor.findMatchForeground', null, localize(1828, \"Text color of the current search match.\"));\nconst editorFindMatchHighlight = registerColor('editor.findMatchHighlightBackground', { light: '#EA5C0055', dark: '#EA5C0055', hcDark: null, hcLight: null }, localize(1829, \"Color of the other search matches. The color must not be opaque so as not to hide underlying decorations.\"), true);\nconst editorFindMatchHighlightForeground = registerColor('editor.findMatchHighlightForeground', null, localize(1830, \"Foreground color of the other search matches.\"), true);\nregisterColor('editor.findRangeHighlightBackground', { dark: '#3a3d4166', light: '#b4b4b44d', hcDark: null, hcLight: null }, localize(1831, \"Color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations.\"), true);\nregisterColor('editor.findMatchBorder', { light: null, dark: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize(1832, \"Border color of the current search match.\"));\nconst editorFindMatchHighlightBorder = registerColor('editor.findMatchHighlightBorder', { light: null, dark: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize(1833, \"Border color of the other search matches.\"));\nconst editorFindRangeHighlightBorder = registerColor('editor.findRangeHighlightBorder', { dark: null, light: null, hcDark: transparent(activeContrastBorder, 0.4), hcLight: transparent(activeContrastBorder, 0.4) }, localize(1834, \"Border color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations.\"), true);\n// ----- editor hover\nregisterColor('editor.hoverHighlightBackground', { light: '#ADD6FF26', dark: '#264f7840', hcDark: '#ADD6FF26', hcLight: null }, localize(1835, 'Highlight below the word for which a hover is shown. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst editorHoverBackground = registerColor('editorHoverWidget.background', editorWidgetBackground, localize(1836, 'Background color of the editor hover.'));\nconst editorHoverForeground = registerColor('editorHoverWidget.foreground', editorWidgetForeground, localize(1837, 'Foreground color of the editor hover.'));\nconst editorHoverBorder = registerColor('editorHoverWidget.border', editorWidgetBorder, localize(1838, 'Border color of the editor hover.'));\nregisterColor('editorHoverWidget.statusBarBackground', { dark: lighten(editorHoverBackground, 0.2), light: darken(editorHoverBackground, 0.05), hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, localize(1839, \"Background color of the editor hover status bar.\"));\n// ----- editor inlay hint\nconst editorInlayHintForeground = registerColor('editorInlayHint.foreground', { dark: '#969696', light: '#969696', hcDark: Color.white, hcLight: Color.black }, localize(1840, 'Foreground color of inline hints'));\nconst editorInlayHintBackground = registerColor('editorInlayHint.background', { dark: transparent(badgeBackground, .10), light: transparent(badgeBackground, .10), hcDark: transparent(Color.white, .10), hcLight: transparent(badgeBackground, .10) }, localize(1841, 'Background color of inline hints'));\nconst editorInlayHintTypeForeground = registerColor('editorInlayHint.typeForeground', editorInlayHintForeground, localize(1842, 'Foreground color of inline hints for types'));\nconst editorInlayHintTypeBackground = registerColor('editorInlayHint.typeBackground', editorInlayHintBackground, localize(1843, 'Background color of inline hints for types'));\nconst editorInlayHintParameterForeground = registerColor('editorInlayHint.parameterForeground', editorInlayHintForeground, localize(1844, 'Foreground color of inline hints for parameters'));\nconst editorInlayHintParameterBackground = registerColor('editorInlayHint.parameterBackground', editorInlayHintBackground, localize(1845, 'Background color of inline hints for parameters'));\n// ----- editor lightbulb\nconst editorLightBulbForeground = registerColor('editorLightBulb.foreground', { dark: '#FFCC00', light: '#DDB100', hcDark: '#FFCC00', hcLight: '#007ACC' }, localize(1846, \"The color used for the lightbulb actions icon.\"));\nregisterColor('editorLightBulbAutoFix.foreground', { dark: '#75BEFF', light: '#007ACC', hcDark: '#75BEFF', hcLight: '#007ACC' }, localize(1847, \"The color used for the lightbulb auto fix actions icon.\"));\nregisterColor('editorLightBulbAi.foreground', editorLightBulbForeground, localize(1848, \"The color used for the lightbulb AI icon.\"));\n// ----- editor snippet\nregisterColor('editor.snippetTabstopHighlightBackground', { dark: new Color(new RGBA(124, 124, 124, 0.3)), light: new Color(new RGBA(10, 50, 100, 0.2)), hcDark: new Color(new RGBA(124, 124, 124, 0.3)), hcLight: new Color(new RGBA(10, 50, 100, 0.2)) }, localize(1849, \"Highlight background color of a snippet tabstop.\"));\nregisterColor('editor.snippetTabstopHighlightBorder', null, localize(1850, \"Highlight border color of a snippet tabstop.\"));\nregisterColor('editor.snippetFinalTabstopHighlightBackground', null, localize(1851, \"Highlight background color of the final tabstop of a snippet.\"));\nregisterColor('editor.snippetFinalTabstopHighlightBorder', { dark: '#525252', light: new Color(new RGBA(10, 50, 100, 0.5)), hcDark: '#525252', hcLight: '#292929' }, localize(1852, \"Highlight border color of the final tabstop of a snippet.\"));\n// ----- diff editor\nconst defaultInsertColor = new Color(new RGBA(155, 185, 85, .2));\nconst defaultRemoveColor = new Color(new RGBA(255, 0, 0, .2));\nconst diffInserted = registerColor('diffEditor.insertedTextBackground', { dark: '#9ccc2c33', light: '#9ccc2c40', hcDark: null, hcLight: null }, localize(1853, 'Background color for text that got inserted. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst diffRemoved = registerColor('diffEditor.removedTextBackground', { dark: '#ff000033', light: '#ff000033', hcDark: null, hcLight: null }, localize(1854, 'Background color for text that got removed. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst diffInsertedLine = registerColor('diffEditor.insertedLineBackground', { dark: defaultInsertColor, light: defaultInsertColor, hcDark: null, hcLight: null }, localize(1855, 'Background color for lines that got inserted. The color must not be opaque so as not to hide underlying decorations.'), true);\nregisterColor('diffEditor.removedLineBackground', { dark: defaultRemoveColor, light: defaultRemoveColor, hcDark: null, hcLight: null }, localize(1856, 'Background color for lines that got removed. The color must not be opaque so as not to hide underlying decorations.'), true);\nregisterColor('diffEditorGutter.insertedLineBackground', null, localize(1857, 'Background color for the margin where lines got inserted.'));\nregisterColor('diffEditorGutter.removedLineBackground', null, localize(1858, 'Background color for the margin where lines got removed.'));\nconst diffOverviewRulerInserted = registerColor('diffEditorOverview.insertedForeground', null, localize(1859, 'Diff overview ruler foreground for inserted content.'));\nconst diffOverviewRulerRemoved = registerColor('diffEditorOverview.removedForeground', null, localize(1860, 'Diff overview ruler foreground for removed content.'));\nregisterColor('diffEditor.insertedTextBorder', { dark: null, light: null, hcDark: '#33ff2eff', hcLight: '#374E06' }, localize(1861, 'Outline color for the text that got inserted.'));\nregisterColor('diffEditor.removedTextBorder', { dark: null, light: null, hcDark: '#FF008F', hcLight: '#AD0707' }, localize(1862, 'Outline color for text that got removed.'));\nregisterColor('diffEditor.border', { dark: null, light: null, hcDark: contrastBorder, hcLight: contrastBorder }, localize(1863, 'Border color between the two text editors.'));\nregisterColor('diffEditor.diagonalFill', { dark: '#cccccc33', light: '#22222233', hcDark: null, hcLight: null }, localize(1864, \"Color of the diff editor's diagonal fill. The diagonal fill is used in side-by-side diff views.\"));\nregisterColor('diffEditor.unchangedRegionBackground', 'sideBar.background', localize(1865, \"The background color of unchanged blocks in the diff editor.\"));\nregisterColor('diffEditor.unchangedRegionForeground', 'foreground', localize(1866, \"The foreground color of unchanged blocks in the diff editor.\"));\nregisterColor('diffEditor.unchangedCodeBackground', { dark: '#74747429', light: '#b8b8b829', hcDark: null, hcLight: null }, localize(1867, \"The background color of unchanged code in the diff editor.\"));\n// ----- widget\nconst widgetShadow = registerColor('widget.shadow', { dark: transparent(Color.black, .36), light: transparent(Color.black, .16), hcDark: null, hcLight: null }, localize(1868, 'Shadow color of widgets such as find/replace inside the editor.'));\nconst widgetBorder = registerColor('widget.border', { dark: null, light: null, hcDark: contrastBorder, hcLight: contrastBorder }, localize(1869, 'Border color of widgets such as find/replace inside the editor.'));\n// ----- toolbar\nconst toolbarHoverBackground = registerColor('toolbar.hoverBackground', { dark: '#5a5d5e50', light: '#b8b8b850', hcDark: null, hcLight: null }, localize(1870, \"Toolbar background when hovering over actions using the mouse\"));\nregisterColor('toolbar.hoverOutline', { dark: null, light: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize(1871, \"Toolbar outline when hovering over actions using the mouse\"));\nregisterColor('toolbar.activeBackground', { dark: lighten(toolbarHoverBackground, 0.1), light: darken(toolbarHoverBackground, 0.1), hcDark: null, hcLight: null }, localize(1872, \"Toolbar background when holding the mouse over actions\"));\n// ----- breadcumbs\nconst breadcrumbsForeground = registerColor('breadcrumb.foreground', transparent(foreground, 0.8), localize(1873, \"Color of focused breadcrumb items.\"));\nconst breadcrumbsBackground = registerColor('breadcrumb.background', editorBackground, localize(1874, \"Background color of breadcrumb items.\"));\nconst breadcrumbsFocusForeground = registerColor('breadcrumb.focusForeground', { light: darken(foreground, 0.2), dark: lighten(foreground, 0.1), hcDark: lighten(foreground, 0.1), hcLight: lighten(foreground, 0.1) }, localize(1875, \"Color of focused breadcrumb items.\"));\nconst breadcrumbsActiveSelectionForeground = registerColor('breadcrumb.activeSelectionForeground', { light: darken(foreground, 0.2), dark: lighten(foreground, 0.1), hcDark: lighten(foreground, 0.1), hcLight: lighten(foreground, 0.1) }, localize(1876, \"Color of selected breadcrumb items.\"));\nregisterColor('breadcrumbPicker.background', editorWidgetBackground, localize(1877, \"Background color of breadcrumb item picker.\"));\n// ----- merge\nconst headerTransparency = 0.5;\nconst currentBaseColor = Color.fromHex('#40C8AE').transparent(headerTransparency);\nconst incomingBaseColor = Color.fromHex('#40A6FF').transparent(headerTransparency);\nconst commonBaseColor = Color.fromHex('#606060').transparent(0.4);\nconst contentTransparency = 0.4;\nconst rulerTransparency = 1;\nconst mergeCurrentHeaderBackground = registerColor('merge.currentHeaderBackground', { dark: currentBaseColor, light: currentBaseColor, hcDark: null, hcLight: null }, localize(1878, 'Current header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.'), true);\nregisterColor('merge.currentContentBackground', transparent(mergeCurrentHeaderBackground, contentTransparency), localize(1879, 'Current content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst mergeIncomingHeaderBackground = registerColor('merge.incomingHeaderBackground', { dark: incomingBaseColor, light: incomingBaseColor, hcDark: null, hcLight: null }, localize(1880, 'Incoming header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.'), true);\nregisterColor('merge.incomingContentBackground', transparent(mergeIncomingHeaderBackground, contentTransparency), localize(1881, 'Incoming content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst mergeCommonHeaderBackground = registerColor('merge.commonHeaderBackground', { dark: commonBaseColor, light: commonBaseColor, hcDark: null, hcLight: null }, localize(1882, 'Common ancestor header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.'), true);\nregisterColor('merge.commonContentBackground', transparent(mergeCommonHeaderBackground, contentTransparency), localize(1883, 'Common ancestor content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst mergeBorder = registerColor('merge.border', { dark: null, light: null, hcDark: '#C3DF6F', hcLight: '#007ACC' }, localize(1884, 'Border color on headers and the splitter in inline merge-conflicts.'));\nregisterColor('editorOverviewRuler.currentContentForeground', { dark: transparent(mergeCurrentHeaderBackground, rulerTransparency), light: transparent(mergeCurrentHeaderBackground, rulerTransparency), hcDark: mergeBorder, hcLight: mergeBorder }, localize(1885, 'Current overview ruler foreground for inline merge-conflicts.'));\nregisterColor('editorOverviewRuler.incomingContentForeground', { dark: transparent(mergeIncomingHeaderBackground, rulerTransparency), light: transparent(mergeIncomingHeaderBackground, rulerTransparency), hcDark: mergeBorder, hcLight: mergeBorder }, localize(1886, 'Incoming overview ruler foreground for inline merge-conflicts.'));\nregisterColor('editorOverviewRuler.commonContentForeground', { dark: transparent(mergeCommonHeaderBackground, rulerTransparency), light: transparent(mergeCommonHeaderBackground, rulerTransparency), hcDark: mergeBorder, hcLight: mergeBorder }, localize(1887, 'Common ancestor overview ruler foreground for inline merge-conflicts.'));\nconst overviewRulerFindMatchForeground = registerColor('editorOverviewRuler.findMatchForeground', { dark: '#d186167e', light: '#d186167e', hcDark: '#AB5A00', hcLight: '#AB5A00' }, localize(1888, 'Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst overviewRulerSelectionHighlightForeground = registerColor('editorOverviewRuler.selectionHighlightForeground', '#A0A0A0CC', localize(1889, 'Overview ruler marker color for selection highlights. The color must not be opaque so as not to hide underlying decorations.'), true);\n// ----- problems\nconst problemsErrorIconForeground = registerColor('problemsErrorIcon.foreground', editorErrorForeground, localize(1890, \"The color used for the problems error icon.\"));\nconst problemsWarningIconForeground = registerColor('problemsWarningIcon.foreground', editorWarningForeground, localize(1891, \"The color used for the problems warning icon.\"));\nconst problemsInfoIconForeground = registerColor('problemsInfoIcon.foreground', editorInfoForeground, localize(1892, \"The color used for the problems info icon.\"));\n\nexport { breadcrumbsActiveSelectionForeground, breadcrumbsBackground, breadcrumbsFocusForeground, breadcrumbsForeground, defaultInsertColor, defaultRemoveColor, diffInserted, diffInsertedLine, diffOverviewRulerInserted, diffOverviewRulerRemoved, diffRemoved, editorActiveLinkForeground, editorBackground, editorErrorBorder, editorErrorForeground, editorFindMatchForeground, editorFindMatchHighlight, editorFindMatchHighlightBorder, editorFindMatchHighlightForeground, editorFindRangeHighlightBorder, editorForeground, editorHintForeground, editorHoverBackground, editorHoverBorder, editorHoverForeground, editorInactiveSelection, editorInfoBorder, editorInfoForeground, editorInlayHintBackground, editorInlayHintForeground, editorInlayHintParameterBackground, editorInlayHintParameterForeground, editorInlayHintTypeBackground, editorInlayHintTypeForeground, editorLightBulbForeground, editorSelectionBackground, editorSelectionForeground, editorSelectionHighlight, editorWarningBackground, editorWarningBorder, editorWarningForeground, editorWidgetBackground, editorWidgetBorder, editorWidgetForeground, mergeBorder, mergeCommonHeaderBackground, mergeCurrentHeaderBackground, mergeIncomingHeaderBackground, overviewRulerFindMatchForeground, overviewRulerSelectionHighlightForeground, problemsErrorIconForeground, problemsInfoIconForeground, problemsWarningIconForeground, toolbarHoverBackground, widgetBorder, widgetShadow };\n","import { localize } from '../../../../nls.js';\nimport { Color, RGBA } from '../../../../base/common/color.js';\nimport { registerColor, transparent } from '../colorUtils.js';\nimport { editorInfoBorder, editorInfoForeground, editorWarningBorder, editorWarningForeground } from './editorColors.js';\nimport { scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground } from './miscColors.js';\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 *--------------------------------------------------------------------------------------------*/\nconst minimapFindMatch = registerColor('minimap.findMatchHighlight', { light: '#d18616', dark: '#d18616', hcDark: '#AB5A00', hcLight: '#0F4A85' }, localize(1983, 'Minimap marker color for find matches.'), true);\nconst minimapSelectionOccurrenceHighlight = registerColor('minimap.selectionOccurrenceHighlight', { light: '#c9c9c9', dark: '#676767', hcDark: '#ffffff', hcLight: '#0F4A85' }, localize(1984, 'Minimap marker color for repeating editor selections.'), true);\nconst minimapSelection = registerColor('minimap.selectionHighlight', { light: '#ADD6FF', dark: '#264F78', hcDark: '#ffffff', hcLight: '#0F4A85' }, localize(1985, 'Minimap marker color for the editor selection.'), true);\nconst minimapInfo = registerColor('minimap.infoHighlight', { dark: editorInfoForeground, light: editorInfoForeground, hcDark: editorInfoBorder, hcLight: editorInfoBorder }, localize(1986, 'Minimap marker color for infos.'));\nconst minimapWarning = registerColor('minimap.warningHighlight', { dark: editorWarningForeground, light: editorWarningForeground, hcDark: editorWarningBorder, hcLight: editorWarningBorder }, localize(1987, 'Minimap marker color for warnings.'));\nconst minimapError = registerColor('minimap.errorHighlight', { dark: new Color(new RGBA(255, 18, 18, 0.7)), light: new Color(new RGBA(255, 18, 18, 0.7)), hcDark: new Color(new RGBA(255, 50, 50, 1)), hcLight: '#B5200D' }, localize(1988, 'Minimap marker color for errors.'));\nconst minimapBackground = registerColor('minimap.background', null, localize(1989, \"Minimap background color.\"));\nconst minimapForegroundOpacity = registerColor('minimap.foregroundOpacity', Color.fromHex('#000f'), localize(1990, 'Opacity of foreground elements rendered in the minimap. For example, \"#000000c0\" will render the elements with 75% opacity.'));\nregisterColor('minimapSlider.background', transparent(scrollbarSliderBackground, 0.5), localize(1991, \"Minimap slider background color.\"));\nregisterColor('minimapSlider.hoverBackground', transparent(scrollbarSliderHoverBackground, 0.5), localize(1992, \"Minimap slider background color when hovering.\"));\nregisterColor('minimapSlider.activeBackground', transparent(scrollbarSliderActiveBackground, 0.5), localize(1993, \"Minimap slider background color when clicked on.\"));\n\nexport { minimapBackground, minimapError, minimapFindMatch, minimapForegroundOpacity, minimapInfo, minimapSelection, minimapSelectionOccurrenceHighlight, minimapWarning };\n","import { localize } from '../../../../nls.js';\nimport { registerColor, transparent } from '../colorUtils.js';\nimport { foreground } from './baseColors.js';\nimport { editorErrorForeground, editorInfoForeground, editorWarningForeground } from './editorColors.js';\nimport { minimapFindMatch } from './minimapColors.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterColor('charts.foreground', foreground, localize(1790, \"The foreground color used in charts.\"));\nregisterColor('charts.lines', transparent(foreground, .5), localize(1791, \"The color used for horizontal lines in charts.\"));\nregisterColor('charts.red', editorErrorForeground, localize(1792, \"The red color used in chart visualizations.\"));\nregisterColor('charts.blue', editorInfoForeground, localize(1793, \"The blue color used in chart visualizations.\"));\nregisterColor('charts.yellow', editorWarningForeground, localize(1794, \"The yellow color used in chart visualizations.\"));\nregisterColor('charts.orange', minimapFindMatch, localize(1795, \"The orange color used in chart visualizations.\"));\nregisterColor('charts.green', { dark: '#89D185', light: '#388A34', hcDark: '#89D185', hcLight: '#374e06' }, localize(1796, \"The green color used in chart visualizations.\"));\nregisterColor('charts.purple', { dark: '#B180D7', light: '#652D90', hcDark: '#B180D7', hcLight: '#652D90' }, localize(1797, \"The purple color used in chart visualizations.\"));\n","import { localize } from '../../../../nls.js';\nimport { Color, RGBA } from '../../../../base/common/color.js';\nimport { registerColor, transparent, darken, lighten } from '../colorUtils.js';\nimport { foreground, contrastBorder, focusBorder, iconForeground } from './baseColors.js';\nimport { editorWidgetBackground } from './editorColors.js';\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// ----- input\nconst inputBackground = registerColor('input.background', { dark: '#3C3C3C', light: Color.white, hcDark: Color.black, hcLight: Color.white }, localize(1893, \"Input box background.\"));\nconst inputForeground = registerColor('input.foreground', foreground, localize(1894, \"Input box foreground.\"));\nconst inputBorder = registerColor('input.border', { dark: null, light: null, hcDark: contrastBorder, hcLight: contrastBorder }, localize(1895, \"Input box border.\"));\nconst inputActiveOptionBorder = registerColor('inputOption.activeBorder', { dark: '#007ACC', light: '#007ACC', hcDark: contrastBorder, hcLight: contrastBorder }, localize(1896, \"Border color of activated options in input fields.\"));\nconst inputActiveOptionHoverBackground = registerColor('inputOption.hoverBackground', { dark: '#5a5d5e80', light: '#b8b8b850', hcDark: null, hcLight: null }, localize(1897, \"Background color of activated options in input fields.\"));\nconst inputActiveOptionBackground = registerColor('inputOption.activeBackground', { dark: transparent(focusBorder, 0.4), light: transparent(focusBorder, 0.2), hcDark: Color.transparent, hcLight: Color.transparent }, localize(1898, \"Background hover color of options in input fields.\"));\nconst inputActiveOptionForeground = registerColor('inputOption.activeForeground', { dark: Color.white, light: Color.black, hcDark: foreground, hcLight: foreground }, localize(1899, \"Foreground color of activated options in input fields.\"));\nregisterColor('input.placeholderForeground', { light: transparent(foreground, 0.5), dark: transparent(foreground, 0.5), hcDark: transparent(foreground, 0.7), hcLight: transparent(foreground, 0.7) }, localize(1900, \"Input box foreground color for placeholder text.\"));\n// ----- input validation\nconst inputValidationInfoBackground = registerColor('inputValidation.infoBackground', { dark: '#063B49', light: '#D6ECF2', hcDark: Color.black, hcLight: Color.white }, localize(1901, \"Input validation background color for information severity.\"));\nconst inputValidationInfoForeground = registerColor('inputValidation.infoForeground', { dark: null, light: null, hcDark: null, hcLight: foreground }, localize(1902, \"Input validation foreground color for information severity.\"));\nconst inputValidationInfoBorder = registerColor('inputValidation.infoBorder', { dark: '#007acc', light: '#007acc', hcDark: contrastBorder, hcLight: contrastBorder }, localize(1903, \"Input validation border color for information severity.\"));\nconst inputValidationWarningBackground = registerColor('inputValidation.warningBackground', { dark: '#352A05', light: '#F6F5D2', hcDark: Color.black, hcLight: Color.white }, localize(1904, \"Input validation background color for warning severity.\"));\nconst inputValidationWarningForeground = registerColor('inputValidation.warningForeground', { dark: null, light: null, hcDark: null, hcLight: foreground }, localize(1905, \"Input validation foreground color for warning severity.\"));\nconst inputValidationWarningBorder = registerColor('inputValidation.warningBorder', { dark: '#B89500', light: '#B89500', hcDark: contrastBorder, hcLight: contrastBorder }, localize(1906, \"Input validation border color for warning severity.\"));\nconst inputValidationErrorBackground = registerColor('inputValidation.errorBackground', { dark: '#5A1D1D', light: '#F2DEDE', hcDark: Color.black, hcLight: Color.white }, localize(1907, \"Input validation background color for error severity.\"));\nconst inputValidationErrorForeground = registerColor('inputValidation.errorForeground', { dark: null, light: null, hcDark: null, hcLight: foreground }, localize(1908, \"Input validation foreground color for error severity.\"));\nconst inputValidationErrorBorder = registerColor('inputValidation.errorBorder', { dark: '#BE1100', light: '#BE1100', hcDark: contrastBorder, hcLight: contrastBorder }, localize(1909, \"Input validation border color for error severity.\"));\n// ----- select\nconst selectBackground = registerColor('dropdown.background', { dark: '#3C3C3C', light: Color.white, hcDark: Color.black, hcLight: Color.white }, localize(1910, \"Dropdown background.\"));\nconst selectListBackground = registerColor('dropdown.listBackground', { dark: null, light: null, hcDark: Color.black, hcLight: Color.white }, localize(1911, \"Dropdown list background.\"));\nconst selectForeground = registerColor('dropdown.foreground', { dark: '#F0F0F0', light: foreground, hcDark: Color.white, hcLight: foreground }, localize(1912, \"Dropdown foreground.\"));\nconst selectBorder = registerColor('dropdown.border', { dark: selectBackground, light: '#CECECE', hcDark: contrastBorder, hcLight: contrastBorder }, localize(1913, \"Dropdown border.\"));\n// ------ button\nconst buttonForeground = registerColor('button.foreground', Color.white, localize(1914, \"Button foreground color.\"));\nconst buttonSeparator = registerColor('button.separator', transparent(buttonForeground, .4), localize(1915, \"Button separator color.\"));\nconst buttonBackground = registerColor('button.background', { dark: '#0E639C', light: '#007ACC', hcDark: Color.black, hcLight: '#0F4A85' }, localize(1916, \"Button background color.\"));\nconst buttonHoverBackground = registerColor('button.hoverBackground', { dark: lighten(buttonBackground, 0.2), light: darken(buttonBackground, 0.2), hcDark: buttonBackground, hcLight: buttonBackground }, localize(1917, \"Button background color when hovering.\"));\nconst buttonBorder = registerColor('button.border', contrastBorder, localize(1918, \"Button border color.\"));\nconst buttonSecondaryForeground = registerColor('button.secondaryForeground', { dark: Color.white, light: Color.white, hcDark: Color.white, hcLight: foreground }, localize(1919, \"Secondary button foreground color.\"));\nconst buttonSecondaryBackground = registerColor('button.secondaryBackground', { dark: '#3A3D41', light: '#5F6A79', hcDark: null, hcLight: Color.white }, localize(1920, \"Secondary button background color.\"));\nconst buttonSecondaryHoverBackground = registerColor('button.secondaryHoverBackground', { dark: lighten(buttonSecondaryBackground, 0.2), light: darken(buttonSecondaryBackground, 0.2), hcDark: null, hcLight: null }, localize(1921, \"Secondary button background color when hovering.\"));\n// ------ radio\nconst radioActiveForeground = registerColor('radio.activeForeground', inputActiveOptionForeground, localize(1922, \"Foreground color of active radio option.\"));\nconst radioActiveBackground = registerColor('radio.activeBackground', inputActiveOptionBackground, localize(1923, \"Background color of active radio option.\"));\nconst radioActiveBorder = registerColor('radio.activeBorder', inputActiveOptionBorder, localize(1924, \"Border color of the active radio option.\"));\nconst radioInactiveForeground = registerColor('radio.inactiveForeground', null, localize(1925, \"Foreground color of inactive radio option.\"));\nconst radioInactiveBackground = registerColor('radio.inactiveBackground', null, localize(1926, \"Background color of inactive radio option.\"));\nconst radioInactiveBorder = registerColor('radio.inactiveBorder', { light: transparent(radioActiveForeground, .2), dark: transparent(radioActiveForeground, .2), hcDark: transparent(radioActiveForeground, .4), hcLight: transparent(radioActiveForeground, .2) }, localize(1927, \"Border color of the inactive radio option.\"));\nconst radioInactiveHoverBackground = registerColor('radio.inactiveHoverBackground', inputActiveOptionHoverBackground, localize(1928, \"Background color of inactive active radio option when hovering.\"));\n// ------ checkbox\nconst checkboxBackground = registerColor('checkbox.background', selectBackground, localize(1929, \"Background color of checkbox widget.\"));\nregisterColor('checkbox.selectBackground', editorWidgetBackground, localize(1930, \"Background color of checkbox widget when the element it's in is selected.\"));\nconst checkboxForeground = registerColor('checkbox.foreground', selectForeground, localize(1931, \"Foreground color of checkbox widget.\"));\nconst checkboxBorder = registerColor('checkbox.border', selectBorder, localize(1932, \"Border color of checkbox widget.\"));\nregisterColor('checkbox.selectBorder', iconForeground, localize(1933, \"Border color of checkbox widget when the element it's in is selected.\"));\nconst checkboxDisabledBackground = registerColor('checkbox.disabled.background', { op: 7 /* ColorTransformType.Mix */, color: checkboxBackground, with: checkboxForeground, ratio: 0.33 }, localize(1934, \"Background of a disabled checkbox.\"));\nconst checkboxDisabledForeground = registerColor('checkbox.disabled.foreground', { op: 7 /* ColorTransformType.Mix */, color: checkboxForeground, with: checkboxBackground, ratio: 0.33 }, localize(1935, \"Foreground of a disabled checkbox.\"));\n// ------ keybinding label\nconst keybindingLabelBackground = registerColor('keybindingLabel.background', { dark: new Color(new RGBA(128, 128, 128, 0.17)), light: new Color(new RGBA(221, 221, 221, 0.4)), hcDark: Color.transparent, hcLight: Color.transparent }, localize(1936, \"Keybinding label background color. The keybinding label is used to represent a keyboard shortcut.\"));\nconst keybindingLabelForeground = registerColor('keybindingLabel.foreground', { dark: Color.fromHex('#CCCCCC'), light: Color.fromHex('#555555'), hcDark: Color.white, hcLight: foreground }, localize(1937, \"Keybinding label foreground color. The keybinding label is used to represent a keyboard shortcut.\"));\nconst keybindingLabelBorder = registerColor('keybindingLabel.border', { dark: new Color(new RGBA(51, 51, 51, 0.6)), light: new Color(new RGBA(204, 204, 204, 0.4)), hcDark: new Color(new RGBA(111, 195, 223)), hcLight: contrastBorder }, localize(1938, \"Keybinding label border color. The keybinding label is used to represent a keyboard shortcut.\"));\nconst keybindingLabelBottomBorder = registerColor('keybindingLabel.bottomBorder', { dark: new Color(new RGBA(68, 68, 68, 0.6)), light: new Color(new RGBA(187, 187, 187, 0.4)), hcDark: new Color(new RGBA(111, 195, 223)), hcLight: foreground }, localize(1939, \"Keybinding label border bottom color. The keybinding label is used to represent a keyboard shortcut.\"));\n\nexport { buttonBackground, buttonBorder, buttonForeground, buttonHoverBackground, buttonSecondaryBackground, buttonSecondaryForeground, buttonSecondaryHoverBackground, buttonSeparator, checkboxBackground, checkboxBorder, checkboxDisabledBackground, checkboxDisabledForeground, checkboxForeground, inputActiveOptionBackground, inputActiveOptionBorder, inputActiveOptionForeground, inputActiveOptionHoverBackground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, keybindingLabelBackground, keybindingLabelBorder, keybindingLabelBottomBorder, keybindingLabelForeground, radioActiveBackground, radioActiveBorder, radioActiveForeground, radioInactiveBackground, radioInactiveBorder, radioInactiveForeground, radioInactiveHoverBackground, selectBackground, selectBorder, selectForeground, selectListBackground };\n","import { localize } from '../../../../nls.js';\nimport { Color } from '../../../../base/common/color.js';\nimport { registerColor, ifDefinedThenElse, lighten, darken, transparent } from '../colorUtils.js';\nimport { activeContrastBorder, focusBorder, iconForeground, contrastBorder, foreground } from './baseColors.js';\nimport { editorWidgetBackground, widgetShadow, editorFindMatchHighlight, editorFindMatchHighlightBorder, editorWidgetForeground } from './editorColors.js';\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 *--------------------------------------------------------------------------------------------*/\nconst listFocusBackground = registerColor('list.focusBackground', null, localize(1940, \"List/Tree background color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.\"));\nconst listFocusForeground = registerColor('list.focusForeground', null, localize(1941, \"List/Tree foreground color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.\"));\nconst listFocusOutline = registerColor('list.focusOutline', { dark: focusBorder, light: focusBorder, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize(1942, \"List/Tree outline color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.\"));\nconst listFocusAndSelectionOutline = registerColor('list.focusAndSelectionOutline', null, localize(1943, \"List/Tree outline color for the focused item when the list/tree is active and selected. An active list/tree has keyboard focus, an inactive does not.\"));\nconst listActiveSelectionBackground = registerColor('list.activeSelectionBackground', { dark: '#04395E', light: '#0060C0', hcDark: null, hcLight: Color.fromHex('#0F4A85').transparent(0.1) }, localize(1944, \"List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.\"));\nconst listActiveSelectionForeground = registerColor('list.activeSelectionForeground', { dark: Color.white, light: Color.white, hcDark: null, hcLight: null }, localize(1945, \"List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.\"));\nconst listActiveSelectionIconForeground = registerColor('list.activeSelectionIconForeground', null, localize(1946, \"List/Tree icon foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.\"));\nconst listInactiveSelectionBackground = registerColor('list.inactiveSelectionBackground', { dark: '#37373D', light: '#E4E6F1', hcDark: null, hcLight: Color.fromHex('#0F4A85').transparent(0.1) }, localize(1947, \"List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.\"));\nconst listInactiveSelectionForeground = registerColor('list.inactiveSelectionForeground', null, localize(1948, \"List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.\"));\nconst listInactiveSelectionIconForeground = registerColor('list.inactiveSelectionIconForeground', null, localize(1949, \"List/Tree icon foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.\"));\nconst listInactiveFocusBackground = registerColor('list.inactiveFocusBackground', null, localize(1950, \"List/Tree background color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.\"));\nconst listInactiveFocusOutline = registerColor('list.inactiveFocusOutline', null, localize(1951, \"List/Tree outline color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.\"));\nconst listHoverBackground = registerColor('list.hoverBackground', { dark: '#2A2D2E', light: '#F0F0F0', hcDark: Color.white.transparent(0.1), hcLight: Color.fromHex('#0F4A85').transparent(0.1) }, localize(1952, \"List/Tree background when hovering over items using the mouse.\"));\nconst listHoverForeground = registerColor('list.hoverForeground', null, localize(1953, \"List/Tree foreground when hovering over items using the mouse.\"));\nconst listDropOverBackground = registerColor('list.dropBackground', { dark: '#062F4A', light: '#D6EBFF', hcDark: null, hcLight: null }, localize(1954, \"List/Tree drag and drop background when moving items over other items when using the mouse.\"));\nconst listDropBetweenBackground = registerColor('list.dropBetweenBackground', { dark: iconForeground, light: iconForeground, hcDark: null, hcLight: null }, localize(1955, \"List/Tree drag and drop border color when moving items between items when using the mouse.\"));\nconst listHighlightForeground = registerColor('list.highlightForeground', { dark: '#2AAAFF', light: '#0066BF', hcDark: focusBorder, hcLight: focusBorder }, localize(1956, 'List/Tree foreground color of the match highlights when searching inside the list/tree.'));\nconst listFocusHighlightForeground = registerColor('list.focusHighlightForeground', { dark: listHighlightForeground, light: ifDefinedThenElse(listActiveSelectionBackground, listHighlightForeground, '#BBE7FF'), hcDark: listHighlightForeground, hcLight: listHighlightForeground }, localize(1957, 'List/Tree foreground color of the match highlights on actively focused items when searching inside the list/tree.'));\nregisterColor('list.invalidItemForeground', { dark: '#B89500', light: '#B89500', hcDark: '#B89500', hcLight: '#B5200D' }, localize(1958, 'List/Tree foreground color for invalid items, for example an unresolved root in explorer.'));\nregisterColor('list.errorForeground', { dark: '#F88070', light: '#B01011', hcDark: null, hcLight: null }, localize(1959, 'Foreground color of list items containing errors.'));\nregisterColor('list.warningForeground', { dark: '#CCA700', light: '#855F00', hcDark: null, hcLight: null }, localize(1960, 'Foreground color of list items containing warnings.'));\nconst listFilterWidgetBackground = registerColor('listFilterWidget.background', { light: darken(editorWidgetBackground, 0), dark: lighten(editorWidgetBackground, 0), hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, localize(1961, 'Background color of the type filter widget in lists and trees.'));\nconst listFilterWidgetOutline = registerColor('listFilterWidget.outline', { dark: Color.transparent, light: Color.transparent, hcDark: '#f38518', hcLight: '#007ACC' }, localize(1962, 'Outline color of the type filter widget in lists and trees.'));\nconst listFilterWidgetNoMatchesOutline = registerColor('listFilterWidget.noMatchesOutline', { dark: '#BE1100', light: '#BE1100', hcDark: contrastBorder, hcLight: contrastBorder }, localize(1963, 'Outline color of the type filter widget in lists and trees, when there are no matches.'));\nconst listFilterWidgetShadow = registerColor('listFilterWidget.shadow', widgetShadow, localize(1964, 'Shadow color of the type filter widget in lists and trees.'));\nregisterColor('list.filterMatchBackground', { dark: editorFindMatchHighlight, light: editorFindMatchHighlight, hcDark: null, hcLight: null }, localize(1965, 'Background color of the filtered match.'));\nregisterColor('list.filterMatchBorder', { dark: editorFindMatchHighlightBorder, light: editorFindMatchHighlightBorder, hcDark: contrastBorder, hcLight: activeContrastBorder }, localize(1966, 'Border color of the filtered match.'));\nregisterColor('list.deemphasizedForeground', { dark: '#8C8C8C', light: '#8E8E90', hcDark: '#A7A8A9', hcLight: '#666666' }, localize(1967, \"List/Tree foreground color for items that are deemphasized.\"));\n// ------ tree\nconst treeIndentGuidesStroke = registerColor('tree.indentGuidesStroke', { dark: '#585858', light: '#a9a9a9', hcDark: '#a9a9a9', hcLight: '#a5a5a5' }, localize(1968, \"Tree stroke color for the indentation guides.\"));\nconst treeInactiveIndentGuidesStroke = registerColor('tree.inactiveIndentGuidesStroke', transparent(treeIndentGuidesStroke, 0.4), localize(1969, \"Tree stroke color for the indentation guides that are not active.\"));\n// ------ table\nconst tableColumnsBorder = registerColor('tree.tableColumnsBorder', { dark: '#CCCCCC20', light: '#61616120', hcDark: null, hcLight: null }, localize(1970, \"Table border color between columns.\"));\nconst tableOddRowsBackgroundColor = registerColor('tree.tableOddRowsBackground', { dark: transparent(foreground, 0.04), light: transparent(foreground, 0.04), hcDark: null, hcLight: null }, localize(1971, \"Background color for odd table rows.\"));\n// ------ action list\nregisterColor('editorActionList.background', editorWidgetBackground, localize(1972, \"Action List background color.\"));\nconst editorActionListForeground = registerColor('editorActionList.foreground', editorWidgetForeground, localize(1973, \"Action List foreground color.\"));\nregisterColor('editorActionList.focusForeground', listActiveSelectionForeground, localize(1974, \"Action List foreground color for the focused item.\"));\nregisterColor('editorActionList.focusBackground', listActiveSelectionBackground, localize(1975, \"Action List background color for the focused item.\"));\n\nexport { editorActionListForeground, listActiveSelectionBackground, listActiveSelectionForeground, listActiveSelectionIconForeground, listDropBetweenBackground, listDropOverBackground, listFilterWidgetBackground, listFilterWidgetNoMatchesOutline, listFilterWidgetOutline, listFilterWidgetShadow, listFocusAndSelectionOutline, listFocusBackground, listFocusForeground, listFocusHighlightForeground, listFocusOutline, listHighlightForeground, listHoverBackground, listHoverForeground, listInactiveFocusBackground, listInactiveFocusOutline, listInactiveSelectionBackground, listInactiveSelectionForeground, listInactiveSelectionIconForeground, tableColumnsBorder, tableOddRowsBackgroundColor, treeInactiveIndentGuidesStroke, treeIndentGuidesStroke };\n","import { localize } from '../../../../nls.js';\nimport { registerColor } from '../colorUtils.js';\nimport { contrastBorder, activeContrastBorder } from './baseColors.js';\nimport { selectForeground, selectBackground } from './inputColors.js';\nimport { listActiveSelectionForeground, listActiveSelectionBackground } from './listColors.js';\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 *--------------------------------------------------------------------------------------------*/\nconst menuBorder = registerColor('menu.border', { dark: null, light: null, hcDark: contrastBorder, hcLight: contrastBorder }, localize(1976, \"Border color of menus.\"));\nconst menuForeground = registerColor('menu.foreground', selectForeground, localize(1977, \"Foreground color of menu items.\"));\nconst menuBackground = registerColor('menu.background', selectBackground, localize(1978, \"Background color of menu items.\"));\nconst menuSelectionForeground = registerColor('menu.selectionForeground', listActiveSelectionForeground, localize(1979, \"Foreground color of the selected menu item in menus.\"));\nconst menuSelectionBackground = registerColor('menu.selectionBackground', listActiveSelectionBackground, localize(1980, \"Background color of the selected menu item in menus.\"));\nconst menuSelectionBorder = registerColor('menu.selectionBorder', { dark: null, light: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize(1981, \"Border color of the selected menu item in menus.\"));\nconst menuSeparatorBackground = registerColor('menu.separatorBackground', { dark: '#606060', light: '#D4D4D4', hcDark: contrastBorder, hcLight: contrastBorder }, localize(1982, \"Color of a separator menu item in menus.\"));\n\nexport { menuBackground, menuBorder, menuForeground, menuSelectionBackground, menuSelectionBorder, menuSelectionForeground, menuSeparatorBackground };\n","import { localize } from '../../../../nls.js';\nimport { Color, RGBA } from '../../../../base/common/color.js';\nimport { registerColor, oneOf } from '../colorUtils.js';\nimport { editorWidgetBackground, editorWidgetForeground } from './editorColors.js';\nimport { listActiveSelectionForeground, listActiveSelectionIconForeground, listActiveSelectionBackground } from './listColors.js';\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 *--------------------------------------------------------------------------------------------*/\nconst quickInputBackground = registerColor('quickInput.background', editorWidgetBackground, localize(2010, \"Quick picker background color. The quick picker widget is the container for pickers like the command palette.\"));\nconst quickInputForeground = registerColor('quickInput.foreground', editorWidgetForeground, localize(2011, \"Quick picker foreground color. The quick picker widget is the container for pickers like the command palette.\"));\nconst quickInputTitleBackground = registerColor('quickInputTitle.background', { dark: new Color(new RGBA(255, 255, 255, 0.105)), light: new Color(new RGBA(0, 0, 0, 0.06)), hcDark: '#000000', hcLight: Color.white }, localize(2012, \"Quick picker title background color. The quick picker widget is the container for pickers like the command palette.\"));\nconst pickerGroupForeground = registerColor('pickerGroup.foreground', { dark: '#3794FF', light: '#0066BF', hcDark: Color.white, hcLight: '#0F4A85' }, localize(2013, \"Quick picker color for grouping labels.\"));\nconst pickerGroupBorder = registerColor('pickerGroup.border', { dark: '#3F3F46', light: '#CCCEDB', hcDark: Color.white, hcLight: '#0F4A85' }, localize(2014, \"Quick picker color for grouping borders.\"));\nconst _deprecatedQuickInputListFocusBackground = registerColor('quickInput.list.focusBackground', null, '', undefined, localize(2015, \"Please use quickInputList.focusBackground instead\"));\nconst quickInputListFocusForeground = registerColor('quickInputList.focusForeground', listActiveSelectionForeground, localize(2016, \"Quick picker foreground color for the focused item.\"));\nconst quickInputListFocusIconForeground = registerColor('quickInputList.focusIconForeground', listActiveSelectionIconForeground, localize(2017, \"Quick picker icon foreground color for the focused item.\"));\nconst quickInputListFocusBackground = registerColor('quickInputList.focusBackground', { dark: oneOf(_deprecatedQuickInputListFocusBackground, listActiveSelectionBackground), light: oneOf(_deprecatedQuickInputListFocusBackground, listActiveSelectionBackground), hcDark: null, hcLight: null }, localize(2018, \"Quick picker background color for the focused item.\"));\n\nexport { _deprecatedQuickInputListFocusBackground, pickerGroupBorder, pickerGroupForeground, quickInputBackground, quickInputForeground, quickInputListFocusBackground, quickInputListFocusForeground, quickInputListFocusIconForeground, quickInputTitleBackground };\n","import { localize } from '../../../../nls.js';\nimport { registerColor, transparent } from '../colorUtils.js';\nimport { foreground } from './baseColors.js';\nimport { editorFindMatchHighlight, editorFindMatchHighlightBorder } from './editorColors.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterColor('search.resultsInfoForeground', { light: foreground, dark: transparent(foreground, 0.65), hcDark: foreground, hcLight: foreground }, localize(2019, \"Color of the text in the search viewlet's completion message.\"));\n// ----- search editor (Distinct from normal editor find match to allow for better differentiation)\nregisterColor('searchEditor.findMatchBackground', { light: transparent(editorFindMatchHighlight, 0.66), dark: transparent(editorFindMatchHighlight, 0.66), hcDark: editorFindMatchHighlight, hcLight: editorFindMatchHighlight }, localize(2020, \"Color of the Search Editor query matches.\"));\nregisterColor('searchEditor.findMatchBorder', { light: transparent(editorFindMatchHighlightBorder, 0.66), dark: transparent(editorFindMatchHighlightBorder, 0.66), hcDark: editorFindMatchHighlightBorder, hcLight: editorFindMatchHighlightBorder }, localize(2021, \"Border color of the Search Editor query matches.\"));\n","import { getWindow, addDisposableListener, EventType, getDomNodePagePosition, addStandardDisposableListener, isInShadowDOM } from '../../base/browser/dom.js';\nimport { createStyleSheet } from '../../base/browser/domStylesheets.js';\nimport { GlobalPointerMoveMonitor } from '../../base/browser/globalPointerMoveMonitor.js';\nimport { StandardMouseEvent } from '../../base/browser/mouseEvent.js';\nimport { RunOnceScheduler } from '../../base/common/async.js';\nimport { Disposable, DisposableMap, DisposableStore } from '../../base/common/lifecycle.js';\nimport { asCssVariable } from '../../platform/theme/common/colorUtils.js';\nimport '../../platform/theme/common/colors/baseColors.js';\nimport '../../platform/theme/common/colors/chartsColors.js';\nimport '../../platform/theme/common/colors/editorColors.js';\nimport '../../platform/theme/common/colors/inputColors.js';\nimport '../../platform/theme/common/colors/listColors.js';\nimport '../../platform/theme/common/colors/menuColors.js';\nimport '../../platform/theme/common/colors/minimapColors.js';\nimport '../../platform/theme/common/colors/miscColors.js';\nimport '../../platform/theme/common/colors/quickpickColors.js';\nimport '../../platform/theme/common/colors/searchColors.js';\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/**\n * Coordinates relative to the whole document (e.g. mouse event's pageX and pageY)\n */\nclass PageCoordinates {\n    constructor(x, y) {\n        this.x = x;\n        this.y = y;\n        this._pageCoordinatesBrand = undefined;\n    }\n    toClientCoordinates(targetWindow) {\n        return new ClientCoordinates(this.x - targetWindow.scrollX, this.y - targetWindow.scrollY);\n    }\n}\n/**\n * Coordinates within the application's client area (i.e. origin is document's scroll position).\n *\n * For example, clicking in the top-left corner of the client area will\n * always result in a mouse event with a client.x value of 0, regardless\n * of whether the page is scrolled horizontally.\n */\nclass ClientCoordinates {\n    constructor(clientX, clientY) {\n        this.clientX = clientX;\n        this.clientY = clientY;\n        this._clientCoordinatesBrand = undefined;\n    }\n    toPageCoordinates(targetWindow) {\n        return new PageCoordinates(this.clientX + targetWindow.scrollX, this.clientY + targetWindow.scrollY);\n    }\n}\n/**\n * The position of the editor in the page.\n */\nclass EditorPagePosition {\n    constructor(x, y, width, height) {\n        this.x = x;\n        this.y = y;\n        this.width = width;\n        this.height = height;\n        this._editorPagePositionBrand = undefined;\n    }\n}\n/**\n * Coordinates relative to the (top;left) of the editor that can be used safely with other internal editor metrics.\n * **NOTE**: This position is obtained by taking page coordinates and transforming them relative to the\n * editor's (top;left) position in a way in which scale transformations are taken into account.\n * **NOTE**: These coordinates could be negative if the mouse position is outside the editor.\n */\nclass CoordinatesRelativeToEditor {\n    constructor(x, y) {\n        this.x = x;\n        this.y = y;\n        this._positionRelativeToEditorBrand = undefined;\n    }\n}\nfunction createEditorPagePosition(editorViewDomNode) {\n    const editorPos = getDomNodePagePosition(editorViewDomNode);\n    return new EditorPagePosition(editorPos.left, editorPos.top, editorPos.width, editorPos.height);\n}\nfunction createCoordinatesRelativeToEditor(editorViewDomNode, editorPagePosition, pos) {\n    // The editor's page position is read from the DOM using getBoundingClientRect().\n    //\n    // getBoundingClientRect() returns the actual dimensions, while offsetWidth and offsetHeight\n    // reflect the unscaled size. We can use this difference to detect a transform:scale()\n    // and we will apply the transformation in inverse to get mouse coordinates that make sense inside the editor.\n    //\n    // This could be expanded to cover rotation as well maybe by walking the DOM up from `editorViewDomNode`\n    // and computing the effective transformation matrix using getComputedStyle(element).transform.\n    //\n    const scaleX = editorPagePosition.width / editorViewDomNode.offsetWidth;\n    const scaleY = editorPagePosition.height / editorViewDomNode.offsetHeight;\n    // Adjust mouse offsets if editor appears to be scaled via transforms\n    const relativeX = (pos.x - editorPagePosition.x) / scaleX;\n    const relativeY = (pos.y - editorPagePosition.y) / scaleY;\n    return new CoordinatesRelativeToEditor(relativeX, relativeY);\n}\nclass EditorMouseEvent extends StandardMouseEvent {\n    constructor(e, isFromPointerCapture, editorViewDomNode) {\n        super(getWindow(editorViewDomNode), e);\n        this._editorMouseEventBrand = undefined;\n        this.isFromPointerCapture = isFromPointerCapture;\n        this.pos = new PageCoordinates(this.posx, this.posy);\n        this.editorPos = createEditorPagePosition(editorViewDomNode);\n        this.relativePos = createCoordinatesRelativeToEditor(editorViewDomNode, this.editorPos, this.pos);\n    }\n}\nclass EditorMouseEventFactory {\n    constructor(editorViewDomNode) {\n        this._editorViewDomNode = editorViewDomNode;\n    }\n    _create(e) {\n        return new EditorMouseEvent(e, false, this._editorViewDomNode);\n    }\n    onContextMenu(target, callback) {\n        return addDisposableListener(target, EventType.CONTEXT_MENU, (e) => {\n            callback(this._create(e));\n        });\n    }\n    onMouseUp(target, callback) {\n        return addDisposableListener(target, EventType.MOUSE_UP, (e) => {\n            callback(this._create(e));\n        });\n    }\n    onMouseDown(target, callback) {\n        return addDisposableListener(target, EventType.MOUSE_DOWN, (e) => {\n            callback(this._create(e));\n        });\n    }\n    onPointerDown(target, callback) {\n        return addDisposableListener(target, EventType.POINTER_DOWN, (e) => {\n            callback(this._create(e), e.pointerId);\n        });\n    }\n    onMouseLeave(target, callback) {\n        return addDisposableListener(target, EventType.MOUSE_LEAVE, (e) => {\n            callback(this._create(e));\n        });\n    }\n    onMouseMove(target, callback) {\n        return addDisposableListener(target, EventType.MOUSE_MOVE, (e) => callback(this._create(e)));\n    }\n}\nclass EditorPointerEventFactory {\n    constructor(editorViewDomNode) {\n        this._editorViewDomNode = editorViewDomNode;\n    }\n    _create(e) {\n        return new EditorMouseEvent(e, false, this._editorViewDomNode);\n    }\n    onPointerUp(target, callback) {\n        return addDisposableListener(target, 'pointerup', (e) => {\n            callback(this._create(e));\n        });\n    }\n    onPointerDown(target, callback) {\n        return addDisposableListener(target, EventType.POINTER_DOWN, (e) => {\n            callback(this._create(e), e.pointerId);\n        });\n    }\n    onPointerLeave(target, callback) {\n        return addDisposableListener(target, EventType.POINTER_LEAVE, (e) => {\n            callback(this._create(e));\n        });\n    }\n    onPointerMove(target, callback) {\n        return addDisposableListener(target, 'pointermove', (e) => callback(this._create(e)));\n    }\n}\nclass GlobalEditorPointerMoveMonitor extends Disposable {\n    constructor(editorViewDomNode) {\n        super();\n        this._editorViewDomNode = editorViewDomNode;\n        this._globalPointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n        this._keydownListener = null;\n    }\n    startMonitoring(initialElement, pointerId, initialButtons, pointerMoveCallback, onStopCallback) {\n        // Add a <<capture>> keydown event listener that will cancel the monitoring\n        // if something other than a modifier key is pressed\n        this._keydownListener = addStandardDisposableListener(initialElement.ownerDocument, 'keydown', (e) => {\n            const chord = e.toKeyCodeChord();\n            if (chord.isModifierKey()) {\n                // Allow modifier keys\n                return;\n            }\n            this._globalPointerMoveMonitor.stopMonitoring(true, e.browserEvent);\n        }, true);\n        this._globalPointerMoveMonitor.startMonitoring(initialElement, pointerId, initialButtons, (e) => {\n            pointerMoveCallback(new EditorMouseEvent(e, true, this._editorViewDomNode));\n        }, (e) => {\n            this._keydownListener.dispose();\n            onStopCallback(e);\n        });\n    }\n    stopMonitoring() {\n        this._globalPointerMoveMonitor.stopMonitoring(true);\n    }\n}\n/**\n * A helper to create dynamic css rules, bound to a class name.\n * Rules are reused.\n * Reference counting and delayed garbage collection ensure that no rules leak.\n*/\nclass DynamicCssRules {\n    static { this._idPool = 0; }\n    constructor(_editor) {\n        this._editor = _editor;\n        this._instanceId = ++DynamicCssRules._idPool;\n        this._counter = 0;\n        this._rules = new DisposableMap();\n        // We delay garbage collection so that hanging rules can be reused.\n        this._garbageCollectionScheduler = new RunOnceScheduler(() => this.garbageCollect(), 1000);\n    }\n    dispose() {\n        this._rules.dispose();\n        this._garbageCollectionScheduler.dispose();\n    }\n    createClassNameRef(options) {\n        const rule = this.getOrCreateRule(options);\n        rule.increaseRefCount();\n        return {\n            className: rule.className,\n            dispose: () => {\n                rule.decreaseRefCount();\n                this._garbageCollectionScheduler.schedule();\n            }\n        };\n    }\n    getOrCreateRule(properties) {\n        const key = this.computeUniqueKey(properties);\n        let existingRule = this._rules.get(key);\n        if (!existingRule) {\n            const counter = this._counter++;\n            existingRule = new RefCountedCssRule(key, `dyn-rule-${this._instanceId}-${counter}`, isInShadowDOM(this._editor.getContainerDomNode())\n                ? this._editor.getContainerDomNode()\n                : undefined, properties);\n            this._rules.set(key, existingRule);\n        }\n        return existingRule;\n    }\n    computeUniqueKey(properties) {\n        return JSON.stringify(properties);\n    }\n    garbageCollect() {\n        for (const rule of this._rules.values()) {\n            if (!rule.hasReferences()) {\n                this._rules.deleteAndDispose(rule.key);\n            }\n        }\n    }\n}\nclass RefCountedCssRule {\n    constructor(key, className, _containerElement, properties) {\n        this.key = key;\n        this.className = className;\n        this.properties = properties;\n        this._referenceCount = 0;\n        this._styleElementDisposables = new DisposableStore();\n        this._styleElement = createStyleSheet(_containerElement, undefined, this._styleElementDisposables);\n        this._styleElement.textContent = this.getCssText(this.className, this.properties);\n    }\n    getCssText(className, properties) {\n        let str = `.${className} {`;\n        for (const prop in properties) {\n            const value = properties[prop];\n            let cssValue;\n            if (typeof value === 'object') {\n                cssValue = asCssVariable(value.id);\n            }\n            else {\n                cssValue = value;\n            }\n            const cssPropName = camelToDashes(prop);\n            str += `\\n\\t${cssPropName}: ${cssValue};`;\n        }\n        str += `\\n}`;\n        return str;\n    }\n    dispose() {\n        this._styleElementDisposables.dispose();\n        this._styleElement = undefined;\n    }\n    increaseRefCount() {\n        this._referenceCount++;\n    }\n    decreaseRefCount() {\n        this._referenceCount--;\n    }\n    hasReferences() {\n        return this._referenceCount > 0;\n    }\n}\nfunction camelToDashes(str) {\n    return str.replace(/(^[A-Z])/, ([first]) => first.toLowerCase())\n        .replace(/([A-Z])/g, ([letter]) => `-${letter.toLowerCase()}`);\n}\n\nexport { ClientCoordinates, CoordinatesRelativeToEditor, DynamicCssRules, EditorMouseEvent, EditorMouseEventFactory, EditorPagePosition, EditorPointerEventFactory, GlobalEditorPointerMoveMonitor, PageCoordinates, createCoordinatesRelativeToEditor, createEditorPagePosition };\n","import { Disposable } from '../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ViewEventHandler extends Disposable {\n    constructor() {\n        super();\n        this._shouldRender = true;\n    }\n    shouldRender() {\n        return this._shouldRender;\n    }\n    forceShouldRender() {\n        this._shouldRender = true;\n    }\n    setShouldRender() {\n        this._shouldRender = true;\n    }\n    onDidRender() {\n        this._shouldRender = false;\n    }\n    // --- begin event handlers\n    onCompositionStart(e) {\n        return false;\n    }\n    onCompositionEnd(e) {\n        return false;\n    }\n    onConfigurationChanged(e) {\n        return false;\n    }\n    onCursorStateChanged(e) {\n        return false;\n    }\n    onDecorationsChanged(e) {\n        return false;\n    }\n    onFlushed(e) {\n        return false;\n    }\n    onFocusChanged(e) {\n        return false;\n    }\n    onLanguageConfigurationChanged(e) {\n        return false;\n    }\n    onLineMappingChanged(e) {\n        return false;\n    }\n    onLinesChanged(e) {\n        return false;\n    }\n    onLinesDeleted(e) {\n        return false;\n    }\n    onLinesInserted(e) {\n        return false;\n    }\n    onRevealRangeRequest(e) {\n        return false;\n    }\n    onScrollChanged(e) {\n        return false;\n    }\n    onThemeChanged(e) {\n        return false;\n    }\n    onTokensChanged(e) {\n        return false;\n    }\n    onTokensColorsChanged(e) {\n        return false;\n    }\n    onZonesChanged(e) {\n        return false;\n    }\n    // --- end event handlers\n    handleEvents(events) {\n        let shouldRender = false;\n        for (let i = 0, len = events.length; i < len; i++) {\n            const e = events[i];\n            switch (e.type) {\n                case 0 /* viewEvents.ViewEventType.ViewCompositionStart */:\n                    if (this.onCompositionStart(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 1 /* viewEvents.ViewEventType.ViewCompositionEnd */:\n                    if (this.onCompositionEnd(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 2 /* viewEvents.ViewEventType.ViewConfigurationChanged */:\n                    if (this.onConfigurationChanged(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 3 /* viewEvents.ViewEventType.ViewCursorStateChanged */:\n                    if (this.onCursorStateChanged(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 4 /* viewEvents.ViewEventType.ViewDecorationsChanged */:\n                    if (this.onDecorationsChanged(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 5 /* viewEvents.ViewEventType.ViewFlushed */:\n                    if (this.onFlushed(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 6 /* viewEvents.ViewEventType.ViewFocusChanged */:\n                    if (this.onFocusChanged(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 7 /* viewEvents.ViewEventType.ViewLanguageConfigurationChanged */:\n                    if (this.onLanguageConfigurationChanged(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 8 /* viewEvents.ViewEventType.ViewLineMappingChanged */:\n                    if (this.onLineMappingChanged(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 9 /* viewEvents.ViewEventType.ViewLinesChanged */:\n                    if (this.onLinesChanged(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 10 /* viewEvents.ViewEventType.ViewLinesDeleted */:\n                    if (this.onLinesDeleted(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 11 /* viewEvents.ViewEventType.ViewLinesInserted */:\n                    if (this.onLinesInserted(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 12 /* viewEvents.ViewEventType.ViewRevealRangeRequest */:\n                    if (this.onRevealRangeRequest(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 13 /* viewEvents.ViewEventType.ViewScrollChanged */:\n                    if (this.onScrollChanged(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 15 /* viewEvents.ViewEventType.ViewTokensChanged */:\n                    if (this.onTokensChanged(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 14 /* viewEvents.ViewEventType.ViewThemeChanged */:\n                    if (this.onThemeChanged(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 16 /* viewEvents.ViewEventType.ViewTokensColorsChanged */:\n                    if (this.onTokensColorsChanged(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                case 17 /* viewEvents.ViewEventType.ViewZonesChanged */:\n                    if (this.onZonesChanged(e)) {\n                        shouldRender = true;\n                    }\n                    break;\n                default:\n                    console.info('View received unknown event: ');\n                    console.info(e);\n            }\n        }\n        if (shouldRender) {\n            this._shouldRender = true;\n        }\n    }\n}\n\nexport { ViewEventHandler };\n","import { ViewEventHandler } from '../../common/viewEventHandler.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ViewPart extends ViewEventHandler {\n    constructor(context) {\n        super();\n        this._context = context;\n        this._context.addEventHandler(this);\n    }\n    dispose() {\n        this._context.removeEventHandler(this);\n        super.dispose();\n    }\n}\nclass PartFingerprints {\n    static write(target, partId) {\n        target.setAttribute('data-mprt', String(partId));\n    }\n    static read(target) {\n        const r = target.getAttribute('data-mprt');\n        if (r === null) {\n            return 0 /* PartFingerprint.None */;\n        }\n        return parseInt(r, 10);\n    }\n    static collect(child, stopAt) {\n        const result = [];\n        let resultLen = 0;\n        while (child && child !== child.ownerDocument.body) {\n            if (child === stopAt) {\n                break;\n            }\n            if (child.nodeType === child.ELEMENT_NODE) {\n                result[resultLen++] = this.read(child);\n            }\n            child = child.parentElement;\n        }\n        const r = new Uint8Array(resultLen);\n        for (let i = 0; i < resultLen; i++) {\n            r[i] = result[resultLen - i - 1];\n        }\n        return r;\n    }\n}\n\nexport { PartFingerprints, ViewPart };\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 *--------------------------------------------------------------------------------------------*/\nclass RestrictedRenderingContext {\n    constructor(viewLayout, viewportData) {\n        this._restrictedRenderingContextBrand = undefined;\n        this._viewLayout = viewLayout;\n        this.viewportData = viewportData;\n        this.scrollWidth = this._viewLayout.getScrollWidth();\n        this.scrollHeight = this._viewLayout.getScrollHeight();\n        this.visibleRange = this.viewportData.visibleRange;\n        this.bigNumbersDelta = this.viewportData.bigNumbersDelta;\n        const vInfo = this._viewLayout.getCurrentViewport();\n        this.scrollTop = vInfo.top;\n        this.scrollLeft = vInfo.left;\n        this.viewportWidth = vInfo.width;\n        this.viewportHeight = vInfo.height;\n    }\n    getScrolledTopFromAbsoluteTop(absoluteTop) {\n        return absoluteTop - this.scrollTop;\n    }\n    getVerticalOffsetForLineNumber(lineNumber, includeViewZones) {\n        return this._viewLayout.getVerticalOffsetForLineNumber(lineNumber, includeViewZones);\n    }\n    getVerticalOffsetAfterLineNumber(lineNumber, includeViewZones) {\n        return this._viewLayout.getVerticalOffsetAfterLineNumber(lineNumber, includeViewZones);\n    }\n    getLineHeightForLineNumber(lineNumber) {\n        return this._viewLayout.getLineHeightForLineNumber(lineNumber);\n    }\n    getDecorationsInViewport() {\n        return this.viewportData.getDecorationsInViewport();\n    }\n}\nclass RenderingContext extends RestrictedRenderingContext {\n    constructor(viewLayout, viewportData, viewLines, viewLinesGpu) {\n        super(viewLayout, viewportData);\n        this._renderingContextBrand = undefined;\n        this._viewLines = viewLines;\n        this._viewLinesGpu = viewLinesGpu;\n    }\n    linesVisibleRangesForRange(range, includeNewLines) {\n        const domRanges = this._viewLines.linesVisibleRangesForRange(range, includeNewLines);\n        if (!this._viewLinesGpu) {\n            return domRanges ?? null;\n        }\n        const gpuRanges = this._viewLinesGpu.linesVisibleRangesForRange(range, includeNewLines);\n        if (!domRanges) {\n            return gpuRanges;\n        }\n        if (!gpuRanges) {\n            return domRanges;\n        }\n        return domRanges.concat(gpuRanges).sort((a, b) => a.lineNumber - b.lineNumber);\n    }\n    visibleRangeForPosition(position) {\n        return this._viewLines.visibleRangeForPosition(position) ?? this._viewLinesGpu?.visibleRangeForPosition(position) ?? null;\n    }\n}\nclass LineVisibleRanges {\n    constructor(outsideRenderedLine, lineNumber, ranges, \n    /**\n     * Indicates if the requested range does not end in this line, but continues on the next line.\n     */\n    continuesOnNextLine) {\n        this.outsideRenderedLine = outsideRenderedLine;\n        this.lineNumber = lineNumber;\n        this.ranges = ranges;\n        this.continuesOnNextLine = continuesOnNextLine;\n    }\n}\nclass HorizontalRange {\n    static from(ranges) {\n        const result = new Array(ranges.length);\n        for (let i = 0, len = ranges.length; i < len; i++) {\n            const range = ranges[i];\n            result[i] = new HorizontalRange(range.left, range.width);\n        }\n        return result;\n    }\n    constructor(left, width) {\n        this._horizontalRangeBrand = undefined;\n        this.left = Math.round(left);\n        this.width = Math.round(width);\n    }\n    toString() {\n        return `[${this.left},${this.width}]`;\n    }\n}\nclass FloatHorizontalRange {\n    constructor(left, width) {\n        this._floatHorizontalRangeBrand = undefined;\n        this.left = left;\n        this.width = width;\n    }\n    toString() {\n        return `[${this.left},${this.width}]`;\n    }\n    static compare(a, b) {\n        return a.left - b.left;\n    }\n}\nclass HorizontalPosition {\n    constructor(outsideRenderedLine, left) {\n        this.outsideRenderedLine = outsideRenderedLine;\n        this.originalLeft = left;\n        this.left = Math.round(this.originalLeft);\n    }\n}\nclass VisibleRanges {\n    constructor(outsideRenderedLine, ranges) {\n        this.outsideRenderedLine = outsideRenderedLine;\n        this.ranges = ranges;\n    }\n}\n\nexport { FloatHorizontalRange, HorizontalPosition, HorizontalRange, LineVisibleRanges, RenderingContext, RestrictedRenderingContext, VisibleRanges };\n","import { FloatHorizontalRange } from '../../view/renderingContext.js';\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 *--------------------------------------------------------------------------------------------*/\nclass RangeUtil {\n    static _createRange() {\n        if (!this._handyReadyRange) {\n            this._handyReadyRange = document.createRange();\n        }\n        return this._handyReadyRange;\n    }\n    static _detachRange(range, endNode) {\n        // Move range out of the span node, IE doesn't like having many ranges in\n        // the same spot and will act badly for lines containing dashes ('-')\n        range.selectNodeContents(endNode);\n    }\n    static _readClientRects(startElement, startOffset, endElement, endOffset, endNode) {\n        const range = this._createRange();\n        try {\n            range.setStart(startElement, startOffset);\n            range.setEnd(endElement, endOffset);\n            return range.getClientRects();\n        }\n        catch (e) {\n            // This is life ...\n            return null;\n        }\n        finally {\n            this._detachRange(range, endNode);\n        }\n    }\n    static _mergeAdjacentRanges(ranges) {\n        if (ranges.length === 1) {\n            // There is nothing to merge\n            return ranges;\n        }\n        ranges.sort(FloatHorizontalRange.compare);\n        const result = [];\n        let resultLen = 0;\n        let prev = ranges[0];\n        for (let i = 1, len = ranges.length; i < len; i++) {\n            const range = ranges[i];\n            if (prev.left + prev.width + 0.9 /* account for browser's rounding errors*/ >= range.left) {\n                prev.width = Math.max(prev.width, range.left + range.width - prev.left);\n            }\n            else {\n                result[resultLen++] = prev;\n                prev = range;\n            }\n        }\n        result[resultLen++] = prev;\n        return result;\n    }\n    static _createHorizontalRangesFromClientRects(clientRects, clientRectDeltaLeft, clientRectScale) {\n        if (!clientRects || clientRects.length === 0) {\n            return null;\n        }\n        // We go through FloatHorizontalRange because it has been observed in bi-di text\n        // that the clientRects are not coming in sorted from the browser\n        const result = [];\n        for (let i = 0, len = clientRects.length; i < len; i++) {\n            const clientRect = clientRects[i];\n            result[i] = new FloatHorizontalRange(Math.max(0, (clientRect.left - clientRectDeltaLeft) / clientRectScale), clientRect.width / clientRectScale);\n        }\n        return this._mergeAdjacentRanges(result);\n    }\n    static readHorizontalRanges(domNode, startChildIndex, startOffset, endChildIndex, endOffset, context) {\n        // Panic check\n        const min = 0;\n        const max = domNode.children.length - 1;\n        if (min > max) {\n            return null;\n        }\n        startChildIndex = Math.min(max, Math.max(min, startChildIndex));\n        endChildIndex = Math.min(max, Math.max(min, endChildIndex));\n        if (startChildIndex === endChildIndex && startOffset === endOffset && startOffset === 0 && !domNode.children[startChildIndex].firstChild) {\n            // We must find the position at the beginning of a <span>\n            // To cover cases of empty <span>s, avoid using a range and use the <span>'s bounding box\n            const clientRects = domNode.children[startChildIndex].getClientRects();\n            context.markDidDomLayout();\n            return this._createHorizontalRangesFromClientRects(clientRects, context.clientRectDeltaLeft, context.clientRectScale);\n        }\n        // If crossing over to a span only to select offset 0, then use the previous span's maximum offset\n        // Chrome is buggy and doesn't handle 0 offsets well sometimes.\n        if (startChildIndex !== endChildIndex) {\n            if (endChildIndex > 0 && endOffset === 0) {\n                endChildIndex--;\n                endOffset = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n            }\n        }\n        let startElement = domNode.children[startChildIndex].firstChild;\n        let endElement = domNode.children[endChildIndex].firstChild;\n        if (!startElement || !endElement) {\n            // When having an empty <span> (without any text content), try to move to the previous <span>\n            if (!startElement && startOffset === 0 && startChildIndex > 0) {\n                startElement = domNode.children[startChildIndex - 1].firstChild;\n                startOffset = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n            }\n            if (!endElement && endOffset === 0 && endChildIndex > 0) {\n                endElement = domNode.children[endChildIndex - 1].firstChild;\n                endOffset = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n            }\n        }\n        if (!startElement || !endElement) {\n            return null;\n        }\n        startOffset = Math.min(startElement.textContent.length, Math.max(0, startOffset));\n        endOffset = Math.min(endElement.textContent.length, Math.max(0, endOffset));\n        const clientRects = this._readClientRects(startElement, startOffset, endElement, endOffset, context.endNode);\n        context.markDidDomLayout();\n        return this._createHorizontalRangesFromClientRects(clientRects, context.clientRectDeltaLeft, context.clientRectScale);\n    }\n}\n\nexport { RangeUtil };\n","import { isHighSurrogate } from '../../../base/common/strings.js';\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 *--------------------------------------------------------------------------------------------*/\nclass LineDecoration {\n    constructor(startColumn, endColumn, className, type) {\n        this.startColumn = startColumn;\n        this.endColumn = endColumn;\n        this.className = className;\n        this.type = type;\n        this._lineDecorationBrand = undefined;\n    }\n    static _equals(a, b) {\n        return (a.startColumn === b.startColumn\n            && a.endColumn === b.endColumn\n            && a.className === b.className\n            && a.type === b.type);\n    }\n    static equalsArr(a, b) {\n        const aLen = a.length;\n        const bLen = b.length;\n        if (aLen !== bLen) {\n            return false;\n        }\n        for (let i = 0; i < aLen; i++) {\n            if (!LineDecoration._equals(a[i], b[i])) {\n                return false;\n            }\n        }\n        return true;\n    }\n    static extractWrapped(arr, startOffset, endOffset) {\n        if (arr.length === 0) {\n            return arr;\n        }\n        const startColumn = startOffset + 1;\n        const endColumn = endOffset + 1;\n        const lineLength = endOffset - startOffset;\n        const r = [];\n        let rLength = 0;\n        for (const dec of arr) {\n            if (dec.endColumn <= startColumn || dec.startColumn >= endColumn) {\n                continue;\n            }\n            r[rLength++] = new LineDecoration(Math.max(1, dec.startColumn - startColumn + 1), Math.min(lineLength + 1, dec.endColumn - startColumn + 1), dec.className, dec.type);\n        }\n        return r;\n    }\n    static filter(lineDecorations, lineNumber, minLineColumn, maxLineColumn) {\n        if (lineDecorations.length === 0) {\n            return [];\n        }\n        const result = [];\n        let resultLen = 0;\n        for (let i = 0, len = lineDecorations.length; i < len; i++) {\n            const d = lineDecorations[i];\n            const range = d.range;\n            if (range.endLineNumber < lineNumber || range.startLineNumber > lineNumber) {\n                // Ignore decorations that sit outside this line\n                continue;\n            }\n            if (range.isEmpty() && (d.type === 0 /* InlineDecorationType.Regular */ || d.type === 3 /* InlineDecorationType.RegularAffectingLetterSpacing */)) {\n                // Ignore empty range decorations\n                continue;\n            }\n            const startColumn = (range.startLineNumber === lineNumber ? range.startColumn : minLineColumn);\n            const endColumn = (range.endLineNumber === lineNumber ? range.endColumn : maxLineColumn);\n            result[resultLen++] = new LineDecoration(startColumn, endColumn, d.inlineClassName, d.type);\n        }\n        return result;\n    }\n    static _typeCompare(a, b) {\n        const ORDER = [2, 0, 1, 3];\n        return ORDER[a] - ORDER[b];\n    }\n    static compare(a, b) {\n        if (a.startColumn !== b.startColumn) {\n            return a.startColumn - b.startColumn;\n        }\n        if (a.endColumn !== b.endColumn) {\n            return a.endColumn - b.endColumn;\n        }\n        const typeCmp = LineDecoration._typeCompare(a.type, b.type);\n        if (typeCmp !== 0) {\n            return typeCmp;\n        }\n        if (a.className !== b.className) {\n            return a.className < b.className ? -1 : 1;\n        }\n        return 0;\n    }\n}\nclass DecorationSegment {\n    constructor(startOffset, endOffset, className, metadata) {\n        this.startOffset = startOffset;\n        this.endOffset = endOffset;\n        this.className = className;\n        this.metadata = metadata;\n    }\n}\nclass Stack {\n    constructor() {\n        this.stopOffsets = [];\n        this.classNames = [];\n        this.metadata = [];\n        this.count = 0;\n    }\n    static _metadata(metadata) {\n        let result = 0;\n        for (let i = 0, len = metadata.length; i < len; i++) {\n            result |= metadata[i];\n        }\n        return result;\n    }\n    consumeLowerThan(maxStopOffset, nextStartOffset, result) {\n        while (this.count > 0 && this.stopOffsets[0] < maxStopOffset) {\n            let i = 0;\n            // Take all equal stopping offsets\n            while (i + 1 < this.count && this.stopOffsets[i] === this.stopOffsets[i + 1]) {\n                i++;\n            }\n            // Basically we are consuming the first i + 1 elements of the stack\n            result.push(new DecorationSegment(nextStartOffset, this.stopOffsets[i], this.classNames.join(' '), Stack._metadata(this.metadata)));\n            nextStartOffset = this.stopOffsets[i] + 1;\n            // Consume them\n            this.stopOffsets.splice(0, i + 1);\n            this.classNames.splice(0, i + 1);\n            this.metadata.splice(0, i + 1);\n            this.count -= (i + 1);\n        }\n        if (this.count > 0 && nextStartOffset < maxStopOffset) {\n            result.push(new DecorationSegment(nextStartOffset, maxStopOffset - 1, this.classNames.join(' '), Stack._metadata(this.metadata)));\n            nextStartOffset = maxStopOffset;\n        }\n        return nextStartOffset;\n    }\n    insert(stopOffset, className, metadata) {\n        if (this.count === 0 || this.stopOffsets[this.count - 1] <= stopOffset) {\n            // Insert at the end\n            this.stopOffsets.push(stopOffset);\n            this.classNames.push(className);\n            this.metadata.push(metadata);\n        }\n        else {\n            // Find the insertion position for `stopOffset`\n            for (let i = 0; i < this.count; i++) {\n                if (this.stopOffsets[i] >= stopOffset) {\n                    this.stopOffsets.splice(i, 0, stopOffset);\n                    this.classNames.splice(i, 0, className);\n                    this.metadata.splice(i, 0, metadata);\n                    break;\n                }\n            }\n        }\n        this.count++;\n        return;\n    }\n}\nclass LineDecorationsNormalizer {\n    /**\n     * Normalize line decorations. Overlapping decorations will generate multiple segments\n     */\n    static normalize(lineContent, lineDecorations) {\n        if (lineDecorations.length === 0) {\n            return [];\n        }\n        const result = [];\n        const stack = new Stack();\n        let nextStartOffset = 0;\n        for (let i = 0, len = lineDecorations.length; i < len; i++) {\n            const d = lineDecorations[i];\n            let startColumn = d.startColumn;\n            let endColumn = d.endColumn;\n            const className = d.className;\n            const metadata = (d.type === 1 /* InlineDecorationType.Before */\n                ? 2 /* LinePartMetadata.PSEUDO_BEFORE */\n                : d.type === 2 /* InlineDecorationType.After */\n                    ? 4 /* LinePartMetadata.PSEUDO_AFTER */\n                    : 0);\n            // If the position would end up in the middle of a high-low surrogate pair, we move it to before the pair\n            if (startColumn > 1) {\n                const charCodeBefore = lineContent.charCodeAt(startColumn - 2);\n                if (isHighSurrogate(charCodeBefore)) {\n                    startColumn--;\n                }\n            }\n            if (endColumn > 1) {\n                const charCodeBefore = lineContent.charCodeAt(endColumn - 2);\n                if (isHighSurrogate(charCodeBefore)) {\n                    endColumn--;\n                }\n            }\n            const currentStartOffset = startColumn - 1;\n            const currentEndOffset = endColumn - 2;\n            nextStartOffset = stack.consumeLowerThan(currentStartOffset, nextStartOffset, result);\n            if (stack.count === 0) {\n                nextStartOffset = currentStartOffset;\n            }\n            stack.insert(currentEndOffset, className, metadata);\n        }\n        stack.consumeLowerThan(1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */, nextStartOffset, result);\n        return result;\n    }\n}\n\nexport { DecorationSegment, LineDecoration, LineDecorationsNormalizer };\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 *--------------------------------------------------------------------------------------------*/\nclass LinePart {\n    constructor(\n    /**\n     * last char index of this token (not inclusive).\n     */\n    endIndex, type, metadata, containsRTL) {\n        this.endIndex = endIndex;\n        this.type = type;\n        this.metadata = metadata;\n        this.containsRTL = containsRTL;\n        this._linePartBrand = undefined;\n    }\n    isWhitespace() {\n        return (this.metadata & 1 /* LinePartMetadata.IS_WHITESPACE_MASK */ ? true : false);\n    }\n    isPseudoAfter() {\n        return (this.metadata & 4 /* LinePartMetadata.PSEUDO_AFTER_MASK */ ? true : false);\n    }\n}\n\nexport { LinePart };\n","import { localize } from '../../../nls.js';\nimport { containsRTL, firstNonWhitespaceIndex, lastNonWhitespaceIndex, isFullWidthCharacter } from '../../../base/common/strings.js';\nimport { StringBuilder } from '../core/stringBuilder.js';\nimport { LineDecoration, LineDecorationsNormalizer } from './lineDecorations.js';\nimport { LinePart } from './linePart.js';\nimport { TextDirection } from '../model.js';\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 *--------------------------------------------------------------------------------------------*/\nclass RenderLineInput {\n    get isLTR() {\n        return !this.containsRTL && this.textDirection !== TextDirection.RTL;\n    }\n    constructor(useMonospaceOptimizations, canUseHalfwidthRightwardsArrow, lineContent, continuesWithWrappedLine, isBasicASCII, containsRTL, fauxIndentLength, lineTokens, lineDecorations, tabSize, startVisibleColumn, spaceWidth, middotWidth, wsmiddotWidth, stopRenderingLineAfter, renderWhitespace, renderControlCharacters, fontLigatures, selectionsOnLine, textDirection, verticalScrollbarSize, renderNewLineWhenEmpty = false) {\n        this.useMonospaceOptimizations = useMonospaceOptimizations;\n        this.canUseHalfwidthRightwardsArrow = canUseHalfwidthRightwardsArrow;\n        this.lineContent = lineContent;\n        this.continuesWithWrappedLine = continuesWithWrappedLine;\n        this.isBasicASCII = isBasicASCII;\n        this.containsRTL = containsRTL;\n        this.fauxIndentLength = fauxIndentLength;\n        this.lineTokens = lineTokens;\n        this.lineDecorations = lineDecorations.sort(LineDecoration.compare);\n        this.tabSize = tabSize;\n        this.startVisibleColumn = startVisibleColumn;\n        this.spaceWidth = spaceWidth;\n        this.stopRenderingLineAfter = stopRenderingLineAfter;\n        this.renderWhitespace = (renderWhitespace === 'all'\n            ? 4 /* RenderWhitespace.All */\n            : renderWhitespace === 'boundary'\n                ? 1 /* RenderWhitespace.Boundary */\n                : renderWhitespace === 'selection'\n                    ? 2 /* RenderWhitespace.Selection */\n                    : renderWhitespace === 'trailing'\n                        ? 3 /* RenderWhitespace.Trailing */\n                        : 0 /* RenderWhitespace.None */);\n        this.renderControlCharacters = renderControlCharacters;\n        this.fontLigatures = fontLigatures;\n        this.selectionsOnLine = selectionsOnLine && selectionsOnLine.sort((a, b) => a.start < b.start ? -1 : 1);\n        this.renderNewLineWhenEmpty = renderNewLineWhenEmpty;\n        this.textDirection = textDirection;\n        this.verticalScrollbarSize = verticalScrollbarSize;\n        const wsmiddotDiff = Math.abs(wsmiddotWidth - spaceWidth);\n        const middotDiff = Math.abs(middotWidth - spaceWidth);\n        if (wsmiddotDiff < middotDiff) {\n            this.renderSpaceWidth = wsmiddotWidth;\n            this.renderSpaceCharCode = 0x2E31; // U+2E31 - WORD SEPARATOR MIDDLE DOT\n        }\n        else {\n            this.renderSpaceWidth = middotWidth;\n            this.renderSpaceCharCode = 0xB7; // U+00B7 - MIDDLE DOT\n        }\n    }\n    sameSelection(otherSelections) {\n        if (this.selectionsOnLine === null) {\n            return otherSelections === null;\n        }\n        if (otherSelections === null) {\n            return false;\n        }\n        if (otherSelections.length !== this.selectionsOnLine.length) {\n            return false;\n        }\n        for (let i = 0; i < this.selectionsOnLine.length; i++) {\n            if (!this.selectionsOnLine[i].equals(otherSelections[i])) {\n                return false;\n            }\n        }\n        return true;\n    }\n    equals(other) {\n        return (this.useMonospaceOptimizations === other.useMonospaceOptimizations\n            && this.canUseHalfwidthRightwardsArrow === other.canUseHalfwidthRightwardsArrow\n            && this.lineContent === other.lineContent\n            && this.continuesWithWrappedLine === other.continuesWithWrappedLine\n            && this.isBasicASCII === other.isBasicASCII\n            && this.containsRTL === other.containsRTL\n            && this.fauxIndentLength === other.fauxIndentLength\n            && this.tabSize === other.tabSize\n            && this.startVisibleColumn === other.startVisibleColumn\n            && this.spaceWidth === other.spaceWidth\n            && this.renderSpaceWidth === other.renderSpaceWidth\n            && this.renderSpaceCharCode === other.renderSpaceCharCode\n            && this.stopRenderingLineAfter === other.stopRenderingLineAfter\n            && this.renderWhitespace === other.renderWhitespace\n            && this.renderControlCharacters === other.renderControlCharacters\n            && this.fontLigatures === other.fontLigatures\n            && LineDecoration.equalsArr(this.lineDecorations, other.lineDecorations)\n            && this.lineTokens.equals(other.lineTokens)\n            && this.sameSelection(other.selectionsOnLine)\n            && this.textDirection === other.textDirection\n            && this.verticalScrollbarSize === other.verticalScrollbarSize\n            && this.renderNewLineWhenEmpty === other.renderNewLineWhenEmpty);\n    }\n}\nclass DomPosition {\n    constructor(partIndex, charIndex) {\n        this.partIndex = partIndex;\n        this.charIndex = charIndex;\n    }\n}\n/**\n * Provides a both direction mapping between a line's character and its rendered position.\n */\nclass CharacterMapping {\n    static getPartIndex(partData) {\n        return (partData & 4294901760 /* CharacterMappingConstants.PART_INDEX_MASK */) >>> 16 /* CharacterMappingConstants.PART_INDEX_OFFSET */;\n    }\n    static getCharIndex(partData) {\n        return (partData & 65535 /* CharacterMappingConstants.CHAR_INDEX_MASK */) >>> 0 /* CharacterMappingConstants.CHAR_INDEX_OFFSET */;\n    }\n    constructor(length, partCount) {\n        this.length = length;\n        this._data = new Uint32Array(this.length);\n        this._horizontalOffset = new Uint32Array(this.length);\n    }\n    setColumnInfo(column, partIndex, charIndex, horizontalOffset) {\n        const partData = ((partIndex << 16 /* CharacterMappingConstants.PART_INDEX_OFFSET */)\n            | (charIndex << 0 /* CharacterMappingConstants.CHAR_INDEX_OFFSET */)) >>> 0;\n        this._data[column - 1] = partData;\n        this._horizontalOffset[column - 1] = horizontalOffset;\n    }\n    getHorizontalOffset(column) {\n        if (this._horizontalOffset.length === 0) {\n            // No characters on this line\n            return 0;\n        }\n        return this._horizontalOffset[column - 1];\n    }\n    charOffsetToPartData(charOffset) {\n        if (this.length === 0) {\n            return 0;\n        }\n        if (charOffset < 0) {\n            return this._data[0];\n        }\n        if (charOffset >= this.length) {\n            return this._data[this.length - 1];\n        }\n        return this._data[charOffset];\n    }\n    getDomPosition(column) {\n        const partData = this.charOffsetToPartData(column - 1);\n        const partIndex = CharacterMapping.getPartIndex(partData);\n        const charIndex = CharacterMapping.getCharIndex(partData);\n        return new DomPosition(partIndex, charIndex);\n    }\n    getColumn(domPosition, partLength) {\n        const charOffset = this.partDataToCharOffset(domPosition.partIndex, partLength, domPosition.charIndex);\n        return charOffset + 1;\n    }\n    partDataToCharOffset(partIndex, partLength, charIndex) {\n        if (this.length === 0) {\n            return 0;\n        }\n        const searchEntry = ((partIndex << 16 /* CharacterMappingConstants.PART_INDEX_OFFSET */)\n            | (charIndex << 0 /* CharacterMappingConstants.CHAR_INDEX_OFFSET */)) >>> 0;\n        let min = 0;\n        let max = this.length - 1;\n        while (min + 1 < max) {\n            const mid = ((min + max) >>> 1);\n            const midEntry = this._data[mid];\n            if (midEntry === searchEntry) {\n                return mid;\n            }\n            else if (midEntry > searchEntry) {\n                max = mid;\n            }\n            else {\n                min = mid;\n            }\n        }\n        if (min === max) {\n            return min;\n        }\n        const minEntry = this._data[min];\n        const maxEntry = this._data[max];\n        if (minEntry === searchEntry) {\n            return min;\n        }\n        if (maxEntry === searchEntry) {\n            return max;\n        }\n        const minPartIndex = CharacterMapping.getPartIndex(minEntry);\n        const minCharIndex = CharacterMapping.getCharIndex(minEntry);\n        const maxPartIndex = CharacterMapping.getPartIndex(maxEntry);\n        let maxCharIndex;\n        if (minPartIndex !== maxPartIndex) {\n            // sitting between parts\n            maxCharIndex = partLength;\n        }\n        else {\n            maxCharIndex = CharacterMapping.getCharIndex(maxEntry);\n        }\n        const minEntryDistance = charIndex - minCharIndex;\n        const maxEntryDistance = maxCharIndex - charIndex;\n        if (minEntryDistance <= maxEntryDistance) {\n            return min;\n        }\n        return max;\n    }\n}\nclass RenderLineOutput {\n    constructor(characterMapping, containsForeignElements) {\n        this._renderLineOutputBrand = undefined;\n        this.characterMapping = characterMapping;\n        this.containsForeignElements = containsForeignElements;\n    }\n}\nfunction renderViewLine(input, sb) {\n    if (input.lineContent.length === 0) {\n        if (input.lineDecorations.length > 0) {\n            // This line is empty, but it contains inline decorations\n            sb.appendString(`<span>`);\n            let beforeCount = 0;\n            let afterCount = 0;\n            let containsForeignElements = 0 /* ForeignElementType.None */;\n            for (const lineDecoration of input.lineDecorations) {\n                if (lineDecoration.type === 1 /* InlineDecorationType.Before */ || lineDecoration.type === 2 /* InlineDecorationType.After */) {\n                    sb.appendString(`<span class=\"`);\n                    sb.appendString(lineDecoration.className);\n                    sb.appendString(`\"></span>`);\n                    if (lineDecoration.type === 1 /* InlineDecorationType.Before */) {\n                        containsForeignElements |= 1 /* ForeignElementType.Before */;\n                        beforeCount++;\n                    }\n                    if (lineDecoration.type === 2 /* InlineDecorationType.After */) {\n                        containsForeignElements |= 2 /* ForeignElementType.After */;\n                        afterCount++;\n                    }\n                }\n            }\n            sb.appendString(`</span>`);\n            const characterMapping = new CharacterMapping(1, beforeCount + afterCount);\n            characterMapping.setColumnInfo(1, beforeCount, 0, 0);\n            return new RenderLineOutput(characterMapping, containsForeignElements);\n        }\n        // completely empty line\n        if (input.renderNewLineWhenEmpty) {\n            sb.appendString('<span><span>\\n</span></span>');\n        }\n        else {\n            sb.appendString('<span><span></span></span>');\n        }\n        return new RenderLineOutput(new CharacterMapping(0, 0), 0 /* ForeignElementType.None */);\n    }\n    return _renderLine(resolveRenderLineInput(input), sb);\n}\nclass RenderLineOutput2 {\n    constructor(characterMapping, html, containsForeignElements) {\n        this.characterMapping = characterMapping;\n        this.html = html;\n        this.containsForeignElements = containsForeignElements;\n    }\n}\nfunction renderViewLine2(input) {\n    const sb = new StringBuilder(10000);\n    const out = renderViewLine(input, sb);\n    return new RenderLineOutput2(out.characterMapping, sb.build(), out.containsForeignElements);\n}\nclass ResolvedRenderLineInput {\n    constructor(fontIsMonospace, canUseHalfwidthRightwardsArrow, lineContent, len, isOverflowing, overflowingCharCount, parts, containsForeignElements, fauxIndentLength, tabSize, startVisibleColumn, spaceWidth, renderSpaceCharCode, renderWhitespace, renderControlCharacters) {\n        this.fontIsMonospace = fontIsMonospace;\n        this.canUseHalfwidthRightwardsArrow = canUseHalfwidthRightwardsArrow;\n        this.lineContent = lineContent;\n        this.len = len;\n        this.isOverflowing = isOverflowing;\n        this.overflowingCharCount = overflowingCharCount;\n        this.parts = parts;\n        this.containsForeignElements = containsForeignElements;\n        this.fauxIndentLength = fauxIndentLength;\n        this.tabSize = tabSize;\n        this.startVisibleColumn = startVisibleColumn;\n        this.spaceWidth = spaceWidth;\n        this.renderSpaceCharCode = renderSpaceCharCode;\n        this.renderWhitespace = renderWhitespace;\n        this.renderControlCharacters = renderControlCharacters;\n        //\n    }\n}\nfunction resolveRenderLineInput(input) {\n    const lineContent = input.lineContent;\n    let isOverflowing;\n    let overflowingCharCount;\n    let len;\n    if (input.stopRenderingLineAfter !== -1 && input.stopRenderingLineAfter < lineContent.length) {\n        isOverflowing = true;\n        overflowingCharCount = lineContent.length - input.stopRenderingLineAfter;\n        len = input.stopRenderingLineAfter;\n    }\n    else {\n        isOverflowing = false;\n        overflowingCharCount = 0;\n        len = lineContent.length;\n    }\n    let tokens = transformAndRemoveOverflowing(lineContent, input.containsRTL, input.lineTokens, input.fauxIndentLength, len);\n    if (input.renderControlCharacters && !input.isBasicASCII) {\n        // Calling `extractControlCharacters` before adding (possibly empty) line parts\n        // for inline decorations. `extractControlCharacters` removes empty line parts.\n        tokens = extractControlCharacters(lineContent, tokens);\n    }\n    if (input.renderWhitespace === 4 /* RenderWhitespace.All */ ||\n        input.renderWhitespace === 1 /* RenderWhitespace.Boundary */ ||\n        (input.renderWhitespace === 2 /* RenderWhitespace.Selection */ && !!input.selectionsOnLine) ||\n        (input.renderWhitespace === 3 /* RenderWhitespace.Trailing */ && !input.continuesWithWrappedLine)) {\n        tokens = _applyRenderWhitespace(input, lineContent, len, tokens);\n    }\n    let containsForeignElements = 0 /* ForeignElementType.None */;\n    if (input.lineDecorations.length > 0) {\n        for (let i = 0, len = input.lineDecorations.length; i < len; i++) {\n            const lineDecoration = input.lineDecorations[i];\n            if (lineDecoration.type === 3 /* InlineDecorationType.RegularAffectingLetterSpacing */) {\n                // Pretend there are foreign elements... although not 100% accurate.\n                containsForeignElements |= 1 /* ForeignElementType.Before */;\n            }\n            else if (lineDecoration.type === 1 /* InlineDecorationType.Before */) {\n                containsForeignElements |= 1 /* ForeignElementType.Before */;\n            }\n            else if (lineDecoration.type === 2 /* InlineDecorationType.After */) {\n                containsForeignElements |= 2 /* ForeignElementType.After */;\n            }\n        }\n        tokens = _applyInlineDecorations(lineContent, len, tokens, input.lineDecorations);\n    }\n    if (!input.containsRTL) {\n        // We can never split RTL text, as it ruins the rendering\n        tokens = splitLargeTokens(lineContent, tokens, !input.isBasicASCII || input.fontLigatures);\n    }\n    else {\n        // Split the first token if it contains both leading whitespace and RTL text\n        tokens = splitLeadingWhitespaceFromRTL(lineContent, tokens);\n    }\n    return new ResolvedRenderLineInput(input.useMonospaceOptimizations, input.canUseHalfwidthRightwardsArrow, lineContent, len, isOverflowing, overflowingCharCount, tokens, containsForeignElements, input.fauxIndentLength, input.tabSize, input.startVisibleColumn, input.spaceWidth, input.renderSpaceCharCode, input.renderWhitespace, input.renderControlCharacters);\n}\n/**\n * In the rendering phase, characters are always looped until token.endIndex.\n * Ensure that all tokens end before `len` and the last one ends precisely at `len`.\n */\nfunction transformAndRemoveOverflowing(lineContent, lineContainsRTL, tokens, fauxIndentLength, len) {\n    const result = [];\n    let resultLen = 0;\n    // The faux indent part of the line should have no token type\n    if (fauxIndentLength > 0) {\n        result[resultLen++] = new LinePart(fauxIndentLength, '', 0, false);\n    }\n    let startOffset = fauxIndentLength;\n    for (let tokenIndex = 0, tokensLen = tokens.getCount(); tokenIndex < tokensLen; tokenIndex++) {\n        const endIndex = tokens.getEndOffset(tokenIndex);\n        if (endIndex <= fauxIndentLength) {\n            // The faux indent part of the line should have no token type\n            continue;\n        }\n        const type = tokens.getClassName(tokenIndex);\n        if (endIndex >= len) {\n            const tokenContainsRTL = (lineContainsRTL ? containsRTL(lineContent.substring(startOffset, len)) : false);\n            result[resultLen++] = new LinePart(len, type, 0, tokenContainsRTL);\n            break;\n        }\n        const tokenContainsRTL = (lineContainsRTL ? containsRTL(lineContent.substring(startOffset, endIndex)) : false);\n        result[resultLen++] = new LinePart(endIndex, type, 0, tokenContainsRTL);\n        startOffset = endIndex;\n    }\n    return result;\n}\n/**\n * See https://github.com/microsoft/vscode/issues/6885.\n * It appears that having very large spans causes very slow reading of character positions.\n * So here we try to avoid that.\n */\nfunction splitLargeTokens(lineContent, tokens, onlyAtSpaces) {\n    let lastTokenEndIndex = 0;\n    const result = [];\n    let resultLen = 0;\n    if (onlyAtSpaces) {\n        // Split only at spaces => we need to walk each character\n        for (let i = 0, len = tokens.length; i < len; i++) {\n            const token = tokens[i];\n            const tokenEndIndex = token.endIndex;\n            if (lastTokenEndIndex + 50 /* Constants.LongToken */ < tokenEndIndex) {\n                const tokenType = token.type;\n                const tokenMetadata = token.metadata;\n                const tokenContainsRTL = token.containsRTL;\n                let lastSpaceOffset = -1;\n                let currTokenStart = lastTokenEndIndex;\n                for (let j = lastTokenEndIndex; j < tokenEndIndex; j++) {\n                    if (lineContent.charCodeAt(j) === 32 /* CharCode.Space */) {\n                        lastSpaceOffset = j;\n                    }\n                    if (lastSpaceOffset !== -1 && j - currTokenStart >= 50 /* Constants.LongToken */) {\n                        // Split at `lastSpaceOffset` + 1\n                        result[resultLen++] = new LinePart(lastSpaceOffset + 1, tokenType, tokenMetadata, tokenContainsRTL);\n                        currTokenStart = lastSpaceOffset + 1;\n                        lastSpaceOffset = -1;\n                    }\n                }\n                if (currTokenStart !== tokenEndIndex) {\n                    result[resultLen++] = new LinePart(tokenEndIndex, tokenType, tokenMetadata, tokenContainsRTL);\n                }\n            }\n            else {\n                result[resultLen++] = token;\n            }\n            lastTokenEndIndex = tokenEndIndex;\n        }\n    }\n    else {\n        // Split anywhere => we don't need to walk each character\n        for (let i = 0, len = tokens.length; i < len; i++) {\n            const token = tokens[i];\n            const tokenEndIndex = token.endIndex;\n            const diff = (tokenEndIndex - lastTokenEndIndex);\n            if (diff > 50 /* Constants.LongToken */) {\n                const tokenType = token.type;\n                const tokenMetadata = token.metadata;\n                const tokenContainsRTL = token.containsRTL;\n                const piecesCount = Math.ceil(diff / 50 /* Constants.LongToken */);\n                for (let j = 1; j < piecesCount; j++) {\n                    const pieceEndIndex = lastTokenEndIndex + (j * 50 /* Constants.LongToken */);\n                    result[resultLen++] = new LinePart(pieceEndIndex, tokenType, tokenMetadata, tokenContainsRTL);\n                }\n                result[resultLen++] = new LinePart(tokenEndIndex, tokenType, tokenMetadata, tokenContainsRTL);\n            }\n            else {\n                result[resultLen++] = token;\n            }\n            lastTokenEndIndex = tokenEndIndex;\n        }\n    }\n    return result;\n}\n/**\n * Splits leading whitespace from the first token if it contains RTL text.\n */\nfunction splitLeadingWhitespaceFromRTL(lineContent, tokens) {\n    if (tokens.length === 0) {\n        return tokens;\n    }\n    const firstToken = tokens[0];\n    if (!firstToken.containsRTL) {\n        return tokens;\n    }\n    // Check if the first token starts with whitespace\n    const firstTokenEndIndex = firstToken.endIndex;\n    let firstNonWhitespaceIndex = 0;\n    for (let i = 0; i < firstTokenEndIndex; i++) {\n        const charCode = lineContent.charCodeAt(i);\n        if (charCode !== 32 /* CharCode.Space */ && charCode !== 9 /* CharCode.Tab */) {\n            firstNonWhitespaceIndex = i;\n            break;\n        }\n    }\n    if (firstNonWhitespaceIndex === 0) {\n        // No leading whitespace\n        return tokens;\n    }\n    // Split the first token into leading whitespace and the rest\n    const result = [];\n    result.push(new LinePart(firstNonWhitespaceIndex, firstToken.type, firstToken.metadata, false));\n    result.push(new LinePart(firstTokenEndIndex, firstToken.type, firstToken.metadata, firstToken.containsRTL));\n    // Add remaining tokens\n    for (let i = 1; i < tokens.length; i++) {\n        result.push(tokens[i]);\n    }\n    return result;\n}\nfunction isControlCharacter(charCode) {\n    if (charCode < 32) {\n        return (charCode !== 9 /* CharCode.Tab */);\n    }\n    if (charCode === 127) {\n        // DEL\n        return true;\n    }\n    if ((charCode >= 0x202A && charCode <= 0x202E)\n        || (charCode >= 0x2066 && charCode <= 0x2069)\n        || (charCode >= 0x200E && charCode <= 0x200F)\n        || charCode === 0x061C) {\n        // Unicode Directional Formatting Characters\n        // LRE\tU+202A\tLEFT-TO-RIGHT EMBEDDING\n        // RLE\tU+202B\tRIGHT-TO-LEFT EMBEDDING\n        // PDF\tU+202C\tPOP DIRECTIONAL FORMATTING\n        // LRO\tU+202D\tLEFT-TO-RIGHT OVERRIDE\n        // RLO\tU+202E\tRIGHT-TO-LEFT OVERRIDE\n        // LRI\tU+2066\tLEFT-TO-RIGHT ISOLATE\n        // RLI\tU+2067\tRIGHT-TO-LEFT ISOLATE\n        // FSI\tU+2068\tFIRST STRONG ISOLATE\n        // PDI\tU+2069\tPOP DIRECTIONAL ISOLATE\n        // LRM\tU+200E\tLEFT-TO-RIGHT MARK\n        // RLM\tU+200F\tRIGHT-TO-LEFT MARK\n        // ALM\tU+061C\tARABIC LETTER MARK\n        return true;\n    }\n    return false;\n}\nfunction extractControlCharacters(lineContent, tokens) {\n    const result = [];\n    let lastLinePart = new LinePart(0, '', 0, false);\n    let charOffset = 0;\n    for (const token of tokens) {\n        const tokenEndIndex = token.endIndex;\n        for (; charOffset < tokenEndIndex; charOffset++) {\n            const charCode = lineContent.charCodeAt(charOffset);\n            if (isControlCharacter(charCode)) {\n                if (charOffset > lastLinePart.endIndex) {\n                    // emit previous part if it has text\n                    lastLinePart = new LinePart(charOffset, token.type, token.metadata, token.containsRTL);\n                    result.push(lastLinePart);\n                }\n                lastLinePart = new LinePart(charOffset + 1, 'mtkcontrol', token.metadata, false);\n                result.push(lastLinePart);\n            }\n        }\n        if (charOffset > lastLinePart.endIndex) {\n            // emit previous part if it has text\n            lastLinePart = new LinePart(tokenEndIndex, token.type, token.metadata, token.containsRTL);\n            result.push(lastLinePart);\n        }\n    }\n    return result;\n}\n/**\n * Whitespace is rendered by \"replacing\" tokens with a special-purpose `mtkw` type that is later recognized in the rendering phase.\n * Moreover, a token is created for every visual indent because on some fonts the glyphs used for rendering whitespace (&rarr; or &middot;) do not have the same width as &nbsp;.\n * The rendering phase will generate `style=\"width:...\"` for these tokens.\n */\nfunction _applyRenderWhitespace(input, lineContent, len, tokens) {\n    const continuesWithWrappedLine = input.continuesWithWrappedLine;\n    const fauxIndentLength = input.fauxIndentLength;\n    const tabSize = input.tabSize;\n    const startVisibleColumn = input.startVisibleColumn;\n    const useMonospaceOptimizations = input.useMonospaceOptimizations;\n    const selections = input.selectionsOnLine;\n    const onlyBoundary = (input.renderWhitespace === 1 /* RenderWhitespace.Boundary */);\n    const onlyTrailing = (input.renderWhitespace === 3 /* RenderWhitespace.Trailing */);\n    const generateLinePartForEachWhitespace = (input.renderSpaceWidth !== input.spaceWidth);\n    const result = [];\n    let resultLen = 0;\n    let tokenIndex = 0;\n    let tokenType = tokens[tokenIndex].type;\n    let tokenContainsRTL = tokens[tokenIndex].containsRTL;\n    let tokenEndIndex = tokens[tokenIndex].endIndex;\n    const tokensLength = tokens.length;\n    let lineIsEmptyOrWhitespace = false;\n    let firstNonWhitespaceIndex$1 = firstNonWhitespaceIndex(lineContent);\n    let lastNonWhitespaceIndex$1;\n    if (firstNonWhitespaceIndex$1 === -1) {\n        lineIsEmptyOrWhitespace = true;\n        firstNonWhitespaceIndex$1 = len;\n        lastNonWhitespaceIndex$1 = len;\n    }\n    else {\n        lastNonWhitespaceIndex$1 = lastNonWhitespaceIndex(lineContent);\n    }\n    let wasInWhitespace = false;\n    let currentSelectionIndex = 0;\n    let currentSelection = selections && selections[currentSelectionIndex];\n    let tmpIndent = startVisibleColumn % tabSize;\n    for (let charIndex = fauxIndentLength; charIndex < len; charIndex++) {\n        const chCode = lineContent.charCodeAt(charIndex);\n        if (currentSelection && currentSelection.endExclusive <= charIndex) {\n            currentSelectionIndex++;\n            currentSelection = selections && selections[currentSelectionIndex];\n        }\n        let isInWhitespace;\n        if (charIndex < firstNonWhitespaceIndex$1 || charIndex > lastNonWhitespaceIndex$1) {\n            // in leading or trailing whitespace\n            isInWhitespace = true;\n        }\n        else if (chCode === 9 /* CharCode.Tab */) {\n            // a tab character is rendered both in all and boundary cases\n            isInWhitespace = true;\n        }\n        else if (chCode === 32 /* CharCode.Space */) {\n            // hit a space character\n            if (onlyBoundary) {\n                // rendering only boundary whitespace\n                if (wasInWhitespace) {\n                    isInWhitespace = true;\n                }\n                else {\n                    const nextChCode = (charIndex + 1 < len ? lineContent.charCodeAt(charIndex + 1) : 0 /* CharCode.Null */);\n                    isInWhitespace = (nextChCode === 32 /* CharCode.Space */ || nextChCode === 9 /* CharCode.Tab */);\n                }\n            }\n            else {\n                isInWhitespace = true;\n            }\n        }\n        else {\n            isInWhitespace = false;\n        }\n        // If rendering whitespace on selection, check that the charIndex falls within a selection\n        if (isInWhitespace && selections) {\n            isInWhitespace = !!currentSelection && currentSelection.start <= charIndex && charIndex < currentSelection.endExclusive;\n        }\n        // If rendering only trailing whitespace, check that the charIndex points to trailing whitespace.\n        if (isInWhitespace && onlyTrailing) {\n            isInWhitespace = lineIsEmptyOrWhitespace || charIndex > lastNonWhitespaceIndex$1;\n        }\n        if (isInWhitespace && tokenContainsRTL) {\n            // If the token contains RTL text, breaking it up into multiple line parts\n            // to render whitespace might affect the browser's bidi layout.\n            //\n            // We render whitespace in such tokens only if the whitespace\n            // is the leading or the trailing whitespace of the line,\n            // which doesn't affect the browser's bidi layout.\n            if (charIndex >= firstNonWhitespaceIndex$1 && charIndex <= lastNonWhitespaceIndex$1) {\n                isInWhitespace = false;\n            }\n        }\n        if (wasInWhitespace) {\n            // was in whitespace token\n            if (!isInWhitespace || (!useMonospaceOptimizations && tmpIndent >= tabSize)) {\n                // leaving whitespace token or entering a new indent\n                if (generateLinePartForEachWhitespace) {\n                    const lastEndIndex = (resultLen > 0 ? result[resultLen - 1].endIndex : fauxIndentLength);\n                    for (let i = lastEndIndex + 1; i <= charIndex; i++) {\n                        result[resultLen++] = new LinePart(i, 'mtkw', 1 /* LinePartMetadata.IS_WHITESPACE */, false);\n                    }\n                }\n                else {\n                    result[resultLen++] = new LinePart(charIndex, 'mtkw', 1 /* LinePartMetadata.IS_WHITESPACE */, false);\n                }\n                tmpIndent = tmpIndent % tabSize;\n            }\n        }\n        else {\n            // was in regular token\n            if (charIndex === tokenEndIndex || (isInWhitespace && charIndex > fauxIndentLength)) {\n                result[resultLen++] = new LinePart(charIndex, tokenType, 0, tokenContainsRTL);\n                tmpIndent = tmpIndent % tabSize;\n            }\n        }\n        if (chCode === 9 /* CharCode.Tab */) {\n            tmpIndent = tabSize;\n        }\n        else if (isFullWidthCharacter(chCode)) {\n            tmpIndent += 2;\n        }\n        else {\n            tmpIndent++;\n        }\n        wasInWhitespace = isInWhitespace;\n        while (charIndex === tokenEndIndex) {\n            tokenIndex++;\n            if (tokenIndex < tokensLength) {\n                tokenType = tokens[tokenIndex].type;\n                tokenContainsRTL = tokens[tokenIndex].containsRTL;\n                tokenEndIndex = tokens[tokenIndex].endIndex;\n            }\n            else {\n                break;\n            }\n        }\n    }\n    let generateWhitespace = false;\n    if (wasInWhitespace) {\n        // was in whitespace token\n        if (continuesWithWrappedLine && onlyBoundary) {\n            const lastCharCode = (len > 0 ? lineContent.charCodeAt(len - 1) : 0 /* CharCode.Null */);\n            const prevCharCode = (len > 1 ? lineContent.charCodeAt(len - 2) : 0 /* CharCode.Null */);\n            const isSingleTrailingSpace = (lastCharCode === 32 /* CharCode.Space */ && (prevCharCode !== 32 /* CharCode.Space */ && prevCharCode !== 9 /* CharCode.Tab */));\n            if (!isSingleTrailingSpace) {\n                generateWhitespace = true;\n            }\n        }\n        else {\n            generateWhitespace = true;\n        }\n    }\n    if (generateWhitespace) {\n        if (generateLinePartForEachWhitespace) {\n            const lastEndIndex = (resultLen > 0 ? result[resultLen - 1].endIndex : fauxIndentLength);\n            for (let i = lastEndIndex + 1; i <= len; i++) {\n                result[resultLen++] = new LinePart(i, 'mtkw', 1 /* LinePartMetadata.IS_WHITESPACE */, false);\n            }\n        }\n        else {\n            result[resultLen++] = new LinePart(len, 'mtkw', 1 /* LinePartMetadata.IS_WHITESPACE */, false);\n        }\n    }\n    else {\n        result[resultLen++] = new LinePart(len, tokenType, 0, tokenContainsRTL);\n    }\n    return result;\n}\n/**\n * Inline decorations are \"merged\" on top of tokens.\n * Special care must be taken when multiple inline decorations are at play and they overlap.\n */\nfunction _applyInlineDecorations(lineContent, len, tokens, _lineDecorations) {\n    _lineDecorations.sort(LineDecoration.compare);\n    const lineDecorations = LineDecorationsNormalizer.normalize(lineContent, _lineDecorations);\n    const lineDecorationsLen = lineDecorations.length;\n    let lineDecorationIndex = 0;\n    const result = [];\n    let resultLen = 0;\n    let lastResultEndIndex = 0;\n    for (let tokenIndex = 0, len = tokens.length; tokenIndex < len; tokenIndex++) {\n        const token = tokens[tokenIndex];\n        const tokenEndIndex = token.endIndex;\n        const tokenType = token.type;\n        const tokenMetadata = token.metadata;\n        const tokenContainsRTL = token.containsRTL;\n        while (lineDecorationIndex < lineDecorationsLen && lineDecorations[lineDecorationIndex].startOffset < tokenEndIndex) {\n            const lineDecoration = lineDecorations[lineDecorationIndex];\n            if (lineDecoration.startOffset > lastResultEndIndex) {\n                lastResultEndIndex = lineDecoration.startOffset;\n                result[resultLen++] = new LinePart(lastResultEndIndex, tokenType, tokenMetadata, tokenContainsRTL);\n            }\n            if (lineDecoration.endOffset + 1 <= tokenEndIndex) {\n                // This line decoration ends before this token ends\n                lastResultEndIndex = lineDecoration.endOffset + 1;\n                result[resultLen++] = new LinePart(lastResultEndIndex, tokenType + ' ' + lineDecoration.className, tokenMetadata | lineDecoration.metadata, tokenContainsRTL);\n                lineDecorationIndex++;\n            }\n            else {\n                // This line decoration continues on to the next token\n                lastResultEndIndex = tokenEndIndex;\n                result[resultLen++] = new LinePart(lastResultEndIndex, tokenType + ' ' + lineDecoration.className, tokenMetadata | lineDecoration.metadata, tokenContainsRTL);\n                break;\n            }\n        }\n        if (tokenEndIndex > lastResultEndIndex) {\n            lastResultEndIndex = tokenEndIndex;\n            result[resultLen++] = new LinePart(lastResultEndIndex, tokenType, tokenMetadata, tokenContainsRTL);\n        }\n    }\n    const lastTokenEndIndex = tokens[tokens.length - 1].endIndex;\n    if (lineDecorationIndex < lineDecorationsLen && lineDecorations[lineDecorationIndex].startOffset === lastTokenEndIndex) {\n        while (lineDecorationIndex < lineDecorationsLen && lineDecorations[lineDecorationIndex].startOffset === lastTokenEndIndex) {\n            const lineDecoration = lineDecorations[lineDecorationIndex];\n            result[resultLen++] = new LinePart(lastResultEndIndex, lineDecoration.className, lineDecoration.metadata, false);\n            lineDecorationIndex++;\n        }\n    }\n    return result;\n}\n/**\n * This function is on purpose not split up into multiple functions to allow runtime type inference (i.e. performance reasons).\n * Notice how all the needed data is fully resolved and passed in (i.e. no other calls).\n */\nfunction _renderLine(input, sb) {\n    const fontIsMonospace = input.fontIsMonospace;\n    const canUseHalfwidthRightwardsArrow = input.canUseHalfwidthRightwardsArrow;\n    const containsForeignElements = input.containsForeignElements;\n    const lineContent = input.lineContent;\n    const len = input.len;\n    const isOverflowing = input.isOverflowing;\n    const overflowingCharCount = input.overflowingCharCount;\n    const parts = input.parts;\n    const fauxIndentLength = input.fauxIndentLength;\n    const tabSize = input.tabSize;\n    const startVisibleColumn = input.startVisibleColumn;\n    const spaceWidth = input.spaceWidth;\n    const renderSpaceCharCode = input.renderSpaceCharCode;\n    const renderWhitespace = input.renderWhitespace;\n    const renderControlCharacters = input.renderControlCharacters;\n    const characterMapping = new CharacterMapping(len + 1, parts.length);\n    let lastCharacterMappingDefined = false;\n    let charIndex = 0;\n    let visibleColumn = startVisibleColumn;\n    let charOffsetInPart = 0; // the character offset in the current part\n    let charHorizontalOffset = 0; // the character horizontal position in terms of chars relative to line start\n    let partDisplacement = 0;\n    sb.appendString('<span>');\n    for (let partIndex = 0, tokensLen = parts.length; partIndex < tokensLen; partIndex++) {\n        const part = parts[partIndex];\n        const partEndIndex = part.endIndex;\n        const partType = part.type;\n        const partContainsRTL = part.containsRTL;\n        const partRendersWhitespace = (renderWhitespace !== 0 /* RenderWhitespace.None */ && part.isWhitespace());\n        const partRendersWhitespaceWithWidth = partRendersWhitespace && !fontIsMonospace && (partType === 'mtkw' /*only whitespace*/ || !containsForeignElements);\n        const partIsEmptyAndHasPseudoAfter = (charIndex === partEndIndex && part.isPseudoAfter());\n        charOffsetInPart = 0;\n        sb.appendString('<span ');\n        if (partContainsRTL) {\n            sb.appendString('dir=\"rtl\" style=\"unicode-bidi:isolate\" ');\n        }\n        sb.appendString('class=\"');\n        sb.appendString(partRendersWhitespaceWithWidth ? 'mtkz' : partType);\n        sb.appendASCIICharCode(34 /* CharCode.DoubleQuote */);\n        if (partRendersWhitespace) {\n            let partWidth = 0;\n            {\n                let _charIndex = charIndex;\n                let _visibleColumn = visibleColumn;\n                for (; _charIndex < partEndIndex; _charIndex++) {\n                    const charCode = lineContent.charCodeAt(_charIndex);\n                    const charWidth = (charCode === 9 /* CharCode.Tab */ ? (tabSize - (_visibleColumn % tabSize)) : 1) | 0;\n                    partWidth += charWidth;\n                    if (_charIndex >= fauxIndentLength) {\n                        _visibleColumn += charWidth;\n                    }\n                }\n            }\n            if (partRendersWhitespaceWithWidth) {\n                sb.appendString(' style=\"width:');\n                sb.appendString(String(spaceWidth * partWidth));\n                sb.appendString('px\"');\n            }\n            sb.appendASCIICharCode(62 /* CharCode.GreaterThan */);\n            for (; charIndex < partEndIndex; charIndex++) {\n                characterMapping.setColumnInfo(charIndex + 1, partIndex - partDisplacement, charOffsetInPart, charHorizontalOffset);\n                partDisplacement = 0;\n                const charCode = lineContent.charCodeAt(charIndex);\n                let producedCharacters;\n                let charWidth;\n                if (charCode === 9 /* CharCode.Tab */) {\n                    producedCharacters = (tabSize - (visibleColumn % tabSize)) | 0;\n                    charWidth = producedCharacters;\n                    if (!canUseHalfwidthRightwardsArrow || charWidth > 1) {\n                        sb.appendCharCode(0x2192); // RIGHTWARDS ARROW\n                    }\n                    else {\n                        sb.appendCharCode(0xFFEB); // HALFWIDTH RIGHTWARDS ARROW\n                    }\n                    for (let space = 2; space <= charWidth; space++) {\n                        sb.appendCharCode(0xA0); // &nbsp;\n                    }\n                }\n                else { // must be CharCode.Space\n                    producedCharacters = 2;\n                    charWidth = 1;\n                    sb.appendCharCode(renderSpaceCharCode); // &middot; or word separator middle dot\n                    sb.appendCharCode(0x200C); // ZERO WIDTH NON-JOINER\n                }\n                charOffsetInPart += producedCharacters;\n                charHorizontalOffset += charWidth;\n                if (charIndex >= fauxIndentLength) {\n                    visibleColumn += charWidth;\n                }\n            }\n        }\n        else {\n            sb.appendASCIICharCode(62 /* CharCode.GreaterThan */);\n            for (; charIndex < partEndIndex; charIndex++) {\n                characterMapping.setColumnInfo(charIndex + 1, partIndex - partDisplacement, charOffsetInPart, charHorizontalOffset);\n                partDisplacement = 0;\n                const charCode = lineContent.charCodeAt(charIndex);\n                let producedCharacters = 1;\n                let charWidth = 1;\n                switch (charCode) {\n                    case 9 /* CharCode.Tab */:\n                        producedCharacters = (tabSize - (visibleColumn % tabSize));\n                        charWidth = producedCharacters;\n                        for (let space = 1; space <= producedCharacters; space++) {\n                            sb.appendCharCode(0xA0); // &nbsp;\n                        }\n                        break;\n                    case 32 /* CharCode.Space */:\n                        sb.appendCharCode(0xA0); // &nbsp;\n                        break;\n                    case 60 /* CharCode.LessThan */:\n                        sb.appendString('&lt;');\n                        break;\n                    case 62 /* CharCode.GreaterThan */:\n                        sb.appendString('&gt;');\n                        break;\n                    case 38 /* CharCode.Ampersand */:\n                        sb.appendString('&amp;');\n                        break;\n                    case 0 /* CharCode.Null */:\n                        if (renderControlCharacters) {\n                            // See https://unicode-table.com/en/blocks/control-pictures/\n                            sb.appendCharCode(9216);\n                        }\n                        else {\n                            sb.appendString('&#00;');\n                        }\n                        break;\n                    case 65279 /* CharCode.UTF8_BOM */:\n                    case 8232 /* CharCode.LINE_SEPARATOR */:\n                    case 8233 /* CharCode.PARAGRAPH_SEPARATOR */:\n                    case 133 /* CharCode.NEXT_LINE */:\n                        sb.appendCharCode(0xFFFD);\n                        break;\n                    default:\n                        if (isFullWidthCharacter(charCode)) {\n                            charWidth++;\n                        }\n                        // See https://unicode-table.com/en/blocks/control-pictures/\n                        if (renderControlCharacters && charCode < 32) {\n                            sb.appendCharCode(9216 + charCode);\n                        }\n                        else if (renderControlCharacters && charCode === 127) {\n                            // DEL\n                            sb.appendCharCode(9249);\n                        }\n                        else if (renderControlCharacters && isControlCharacter(charCode)) {\n                            sb.appendString('[U+');\n                            sb.appendString(to4CharHex(charCode));\n                            sb.appendString(']');\n                            producedCharacters = 8;\n                            charWidth = producedCharacters;\n                        }\n                        else {\n                            sb.appendCharCode(charCode);\n                        }\n                }\n                charOffsetInPart += producedCharacters;\n                charHorizontalOffset += charWidth;\n                if (charIndex >= fauxIndentLength) {\n                    visibleColumn += charWidth;\n                }\n            }\n        }\n        if (partIsEmptyAndHasPseudoAfter) {\n            partDisplacement++;\n        }\n        else {\n            partDisplacement = 0;\n        }\n        if (charIndex >= len && !lastCharacterMappingDefined && part.isPseudoAfter()) {\n            lastCharacterMappingDefined = true;\n            characterMapping.setColumnInfo(charIndex + 1, partIndex, charOffsetInPart, charHorizontalOffset);\n        }\n        sb.appendString('</span>');\n    }\n    if (!lastCharacterMappingDefined) {\n        // When getting client rects for the last character, we will position the\n        // text range at the end of the span, insteaf of at the beginning of next span\n        characterMapping.setColumnInfo(len + 1, parts.length - 1, charOffsetInPart, charHorizontalOffset);\n    }\n    if (isOverflowing) {\n        sb.appendString('<span class=\"mtkoverflow\">');\n        sb.appendString(localize(796, \"Show more ({0})\", renderOverflowingCharCount(overflowingCharCount)));\n        sb.appendString('</span>');\n    }\n    sb.appendString('</span>');\n    return new RenderLineOutput(characterMapping, containsForeignElements);\n}\nfunction to4CharHex(n) {\n    return n.toString(16).toUpperCase().padStart(4, '0');\n}\nfunction renderOverflowingCharCount(n) {\n    if (n < 1024) {\n        return localize(797, \"{0} chars\", n);\n    }\n    if (n < 1024 * 1024) {\n        return `${(n / 1024).toFixed(1)} KB`;\n    }\n    return `${(n / 1024 / 1024).toFixed(1)} MB`;\n}\n\nexport { CharacterMapping, DomPosition, RenderLineInput, RenderLineOutput, RenderLineOutput2, renderViewLine, renderViewLine2 };\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/**\n * Color scheme used by the OS and by color themes.\n */\nvar ColorScheme;\n(function (ColorScheme) {\n    ColorScheme[\"DARK\"] = \"dark\";\n    ColorScheme[\"LIGHT\"] = \"light\";\n    ColorScheme[\"HIGH_CONTRAST_DARK\"] = \"hcDark\";\n    ColorScheme[\"HIGH_CONTRAST_LIGHT\"] = \"hcLight\";\n})(ColorScheme || (ColorScheme = {}));\nvar ThemeTypeSelector;\n(function (ThemeTypeSelector) {\n    ThemeTypeSelector[\"VS\"] = \"vs\";\n    ThemeTypeSelector[\"VS_DARK\"] = \"vs-dark\";\n    ThemeTypeSelector[\"HC_BLACK\"] = \"hc-black\";\n    ThemeTypeSelector[\"HC_LIGHT\"] = \"hc-light\";\n})(ThemeTypeSelector || (ThemeTypeSelector = {}));\nfunction isHighContrast(scheme) {\n    return scheme === ColorScheme.HIGH_CONTRAST_DARK || scheme === ColorScheme.HIGH_CONTRAST_LIGHT;\n}\nfunction isDark(scheme) {\n    return scheme === ColorScheme.DARK || scheme === ColorScheme.HIGH_CONTRAST_DARK;\n}\n\nexport { ColorScheme, ThemeTypeSelector, isDark, isHighContrast };\n","import { isFirefox, isSafari, isWebKit } from '../../../../base/browser/browser.js';\nimport { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport { isNative, isLinux } from '../../../../base/common/platform.js';\nimport { RangeUtil } from './rangeUtil.js';\nimport { VisibleRanges, FloatHorizontalRange } from '../../view/renderingContext.js';\nimport { LineDecoration } from '../../../common/viewLayout/lineDecorations.js';\nimport { RenderLineInput, renderViewLine, DomPosition } from '../../../common/viewLayout/viewLineRenderer.js';\nimport { isHighContrast } from '../../../../platform/theme/common/theme.js';\nimport { EditorFontLigatures } from '../../../common/config/editorOptions.js';\nimport { OffsetRange } from '../../../common/core/ranges/offsetRange.js';\nimport { TextDirection } from '../../../common/model.js';\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 *--------------------------------------------------------------------------------------------*/\nconst canUseFastRenderedViewLine = (function () {\n    if (isNative) {\n        // In VSCode we know very well when the zoom level changes\n        return true;\n    }\n    if (isLinux || isFirefox || isSafari) {\n        // On Linux, it appears that zooming affects char widths (in pixels), which is unexpected.\n        // --\n        // Even though we read character widths correctly, having read them at a specific zoom level\n        // does not mean they are the same at the current zoom level.\n        // --\n        // This could be improved if we ever figure out how to get an event when browsers zoom,\n        // but until then we have to stick with reading client rects.\n        // --\n        // The same has been observed with Firefox on Windows7\n        // --\n        // The same has been oversved with Safari\n        return false;\n    }\n    return true;\n})();\nlet monospaceAssumptionsAreValid = true;\nclass ViewLine {\n    static { this.CLASS_NAME = 'view-line'; }\n    constructor(_viewGpuContext, options) {\n        this._viewGpuContext = _viewGpuContext;\n        this._options = options;\n        this._isMaybeInvalid = true;\n        this._renderedViewLine = null;\n    }\n    // --- begin IVisibleLineData\n    getDomNode() {\n        if (this._renderedViewLine && this._renderedViewLine.domNode) {\n            return this._renderedViewLine.domNode.domNode;\n        }\n        return null;\n    }\n    setDomNode(domNode) {\n        if (this._renderedViewLine) {\n            this._renderedViewLine.domNode = createFastDomNode(domNode);\n        }\n        else {\n            throw new Error('I have no rendered view line to set the dom node to...');\n        }\n    }\n    onContentChanged() {\n        this._isMaybeInvalid = true;\n    }\n    onTokensChanged() {\n        this._isMaybeInvalid = true;\n    }\n    onDecorationsChanged() {\n        this._isMaybeInvalid = true;\n    }\n    onOptionsChanged(newOptions) {\n        this._isMaybeInvalid = true;\n        this._options = newOptions;\n    }\n    onSelectionChanged() {\n        if (isHighContrast(this._options.themeType) || this._renderedViewLine?.input.renderWhitespace === 2 /* RenderWhitespace.Selection */) {\n            this._isMaybeInvalid = true;\n            return true;\n        }\n        return false;\n    }\n    renderLine(lineNumber, deltaTop, lineHeight, viewportData, sb) {\n        if (this._options.useGpu && this._viewGpuContext?.canRender(this._options, viewportData, lineNumber)) {\n            this._renderedViewLine?.domNode?.domNode.remove();\n            this._renderedViewLine = null;\n            return false;\n        }\n        if (this._isMaybeInvalid === false) {\n            // it appears that nothing relevant has changed\n            return false;\n        }\n        this._isMaybeInvalid = false;\n        const lineData = viewportData.getViewLineRenderingData(lineNumber);\n        const options = this._options;\n        const actualInlineDecorations = LineDecoration.filter(lineData.inlineDecorations, lineNumber, lineData.minColumn, lineData.maxColumn);\n        const renderWhitespace = (lineData.hasVariableFonts || options.experimentalWhitespaceRendering === 'off') ? options.renderWhitespace : 'none';\n        const allowFastRendering = !lineData.hasVariableFonts;\n        // Only send selection information when needed for rendering whitespace\n        let selectionsOnLine = null;\n        if (isHighContrast(options.themeType) || renderWhitespace === 'selection') {\n            const selections = viewportData.selections;\n            for (const selection of selections) {\n                if (selection.endLineNumber < lineNumber || selection.startLineNumber > lineNumber) {\n                    // Selection does not intersect line\n                    continue;\n                }\n                const startColumn = (selection.startLineNumber === lineNumber ? selection.startColumn : lineData.minColumn);\n                const endColumn = (selection.endLineNumber === lineNumber ? selection.endColumn : lineData.maxColumn);\n                if (startColumn < endColumn) {\n                    if (isHighContrast(options.themeType)) {\n                        actualInlineDecorations.push(new LineDecoration(startColumn, endColumn, 'inline-selected-text', 0 /* InlineDecorationType.Regular */));\n                    }\n                    if (renderWhitespace === 'selection') {\n                        if (!selectionsOnLine) {\n                            selectionsOnLine = [];\n                        }\n                        selectionsOnLine.push(new OffsetRange(startColumn - 1, endColumn - 1));\n                    }\n                }\n            }\n        }\n        const renderLineInput = new RenderLineInput(options.useMonospaceOptimizations, options.canUseHalfwidthRightwardsArrow, lineData.content, lineData.continuesWithWrappedLine, lineData.isBasicASCII, lineData.containsRTL, lineData.minColumn - 1, lineData.tokens, actualInlineDecorations, lineData.tabSize, lineData.startVisibleColumn, options.spaceWidth, options.middotWidth, options.wsmiddotWidth, options.stopRenderingLineAfter, renderWhitespace, options.renderControlCharacters, options.fontLigatures !== EditorFontLigatures.OFF, selectionsOnLine, lineData.textDirection, options.verticalScrollbarSize);\n        if (this._renderedViewLine && this._renderedViewLine.input.equals(renderLineInput)) {\n            // no need to do anything, we have the same render input\n            return false;\n        }\n        sb.appendString('<div ');\n        if (lineData.textDirection === TextDirection.RTL) {\n            sb.appendString('dir=\"rtl\" ');\n        }\n        else if (lineData.containsRTL) {\n            sb.appendString('dir=\"ltr\" ');\n        }\n        sb.appendString('style=\"top:');\n        sb.appendString(String(deltaTop));\n        sb.appendString('px;height:');\n        sb.appendString(String(lineHeight));\n        sb.appendString('px;line-height:');\n        sb.appendString(String(lineHeight));\n        if (lineData.textDirection === TextDirection.RTL) {\n            sb.appendString('px;padding-right:');\n            sb.appendString(String(options.verticalScrollbarSize));\n        }\n        sb.appendString('px;\" class=\"');\n        sb.appendString(ViewLine.CLASS_NAME);\n        sb.appendString('\">');\n        const output = renderViewLine(renderLineInput, sb);\n        sb.appendString('</div>');\n        let renderedViewLine = null;\n        if (allowFastRendering\n            && monospaceAssumptionsAreValid\n            && canUseFastRenderedViewLine\n            && lineData.isBasicASCII\n            && renderLineInput.isLTR\n            && options.useMonospaceOptimizations\n            && output.containsForeignElements === 0 /* ForeignElementType.None */) {\n            renderedViewLine = new FastRenderedViewLine(this._renderedViewLine ? this._renderedViewLine.domNode : null, renderLineInput, output.characterMapping);\n        }\n        if (!renderedViewLine) {\n            renderedViewLine = createRenderedLine(this._renderedViewLine ? this._renderedViewLine.domNode : null, renderLineInput, output.characterMapping, output.containsForeignElements);\n        }\n        this._renderedViewLine = renderedViewLine;\n        return true;\n    }\n    layoutLine(lineNumber, deltaTop, lineHeight) {\n        if (this._renderedViewLine && this._renderedViewLine.domNode) {\n            this._renderedViewLine.domNode.setTop(deltaTop);\n            this._renderedViewLine.domNode.setHeight(lineHeight);\n            this._renderedViewLine.domNode.setLineHeight(lineHeight);\n        }\n    }\n    // --- end IVisibleLineData\n    isRenderedRTL() {\n        if (!this._renderedViewLine) {\n            return false;\n        }\n        return this._renderedViewLine.input.textDirection === TextDirection.RTL;\n    }\n    getWidth(context) {\n        if (!this._renderedViewLine) {\n            return 0;\n        }\n        return this._renderedViewLine.getWidth(context);\n    }\n    getWidthIsFast() {\n        if (!this._renderedViewLine) {\n            return true;\n        }\n        return this._renderedViewLine.getWidthIsFast();\n    }\n    needsMonospaceFontCheck() {\n        if (!this._renderedViewLine) {\n            return false;\n        }\n        return (this._renderedViewLine instanceof FastRenderedViewLine);\n    }\n    monospaceAssumptionsAreValid() {\n        if (!this._renderedViewLine) {\n            return monospaceAssumptionsAreValid;\n        }\n        if (this._renderedViewLine instanceof FastRenderedViewLine) {\n            return this._renderedViewLine.monospaceAssumptionsAreValid();\n        }\n        return monospaceAssumptionsAreValid;\n    }\n    onMonospaceAssumptionsInvalidated() {\n        if (this._renderedViewLine && this._renderedViewLine instanceof FastRenderedViewLine) {\n            this._renderedViewLine = this._renderedViewLine.toSlowRenderedLine();\n        }\n    }\n    getVisibleRangesForRange(lineNumber, startColumn, endColumn, context) {\n        if (!this._renderedViewLine) {\n            return null;\n        }\n        startColumn = Math.min(this._renderedViewLine.input.lineContent.length + 1, Math.max(1, startColumn));\n        endColumn = Math.min(this._renderedViewLine.input.lineContent.length + 1, Math.max(1, endColumn));\n        const stopRenderingLineAfter = this._renderedViewLine.input.stopRenderingLineAfter;\n        if (stopRenderingLineAfter !== -1 && startColumn > stopRenderingLineAfter + 1 && endColumn > stopRenderingLineAfter + 1) {\n            // This range is obviously not visible\n            return new VisibleRanges(true, [new FloatHorizontalRange(this.getWidth(context), 0)]);\n        }\n        if (stopRenderingLineAfter !== -1 && startColumn > stopRenderingLineAfter + 1) {\n            startColumn = stopRenderingLineAfter + 1;\n        }\n        if (stopRenderingLineAfter !== -1 && endColumn > stopRenderingLineAfter + 1) {\n            endColumn = stopRenderingLineAfter + 1;\n        }\n        const horizontalRanges = this._renderedViewLine.getVisibleRangesForRange(lineNumber, startColumn, endColumn, context);\n        if (horizontalRanges && horizontalRanges.length > 0) {\n            return new VisibleRanges(false, horizontalRanges);\n        }\n        return null;\n    }\n    getColumnOfNodeOffset(spanNode, offset) {\n        if (!this._renderedViewLine) {\n            return 1;\n        }\n        return this._renderedViewLine.getColumnOfNodeOffset(spanNode, offset);\n    }\n}\n/**\n * A rendered line which is guaranteed to contain only regular ASCII and is rendered with a monospace font.\n */\nclass FastRenderedViewLine {\n    constructor(domNode, renderLineInput, characterMapping) {\n        this._cachedWidth = -1;\n        this.domNode = domNode;\n        this.input = renderLineInput;\n        const keyColumnCount = Math.floor(renderLineInput.lineContent.length / 300 /* Constants.MaxMonospaceDistance */);\n        if (keyColumnCount > 0) {\n            this._keyColumnPixelOffsetCache = new Float32Array(keyColumnCount);\n            for (let i = 0; i < keyColumnCount; i++) {\n                this._keyColumnPixelOffsetCache[i] = -1;\n            }\n        }\n        else {\n            this._keyColumnPixelOffsetCache = null;\n        }\n        this._characterMapping = characterMapping;\n        this._charWidth = renderLineInput.spaceWidth;\n    }\n    getWidth(context) {\n        if (!this.domNode || this.input.lineContent.length < 300 /* Constants.MaxMonospaceDistance */) {\n            const horizontalOffset = this._characterMapping.getHorizontalOffset(this._characterMapping.length);\n            return Math.round(this._charWidth * horizontalOffset);\n        }\n        if (this._cachedWidth === -1) {\n            this._cachedWidth = this._getReadingTarget(this.domNode).offsetWidth;\n            context?.markDidDomLayout();\n        }\n        return this._cachedWidth;\n    }\n    getWidthIsFast() {\n        return (this.input.lineContent.length < 300 /* Constants.MaxMonospaceDistance */) || this._cachedWidth !== -1;\n    }\n    monospaceAssumptionsAreValid() {\n        if (!this.domNode) {\n            return monospaceAssumptionsAreValid;\n        }\n        if (this.input.lineContent.length < 300 /* Constants.MaxMonospaceDistance */) {\n            const expectedWidth = this.getWidth(null);\n            const actualWidth = this.domNode.domNode.firstChild.offsetWidth;\n            if (Math.abs(expectedWidth - actualWidth) >= 2) {\n                // more than 2px off\n                console.warn(`monospace assumptions have been violated, therefore disabling monospace optimizations!`);\n                monospaceAssumptionsAreValid = false;\n            }\n        }\n        return monospaceAssumptionsAreValid;\n    }\n    toSlowRenderedLine() {\n        return createRenderedLine(this.domNode, this.input, this._characterMapping, 0 /* ForeignElementType.None */);\n    }\n    getVisibleRangesForRange(lineNumber, startColumn, endColumn, context) {\n        const startPosition = this._getColumnPixelOffset(lineNumber, startColumn, context);\n        const endPosition = this._getColumnPixelOffset(lineNumber, endColumn, context);\n        return [new FloatHorizontalRange(startPosition, endPosition - startPosition)];\n    }\n    _getColumnPixelOffset(lineNumber, column, context) {\n        if (column <= 300 /* Constants.MaxMonospaceDistance */) {\n            const horizontalOffset = this._characterMapping.getHorizontalOffset(column);\n            return this._charWidth * horizontalOffset;\n        }\n        const keyColumnOrdinal = Math.floor((column - 1) / 300 /* Constants.MaxMonospaceDistance */) - 1;\n        const keyColumn = (keyColumnOrdinal + 1) * 300 /* Constants.MaxMonospaceDistance */ + 1;\n        let keyColumnPixelOffset = -1;\n        if (this._keyColumnPixelOffsetCache) {\n            keyColumnPixelOffset = this._keyColumnPixelOffsetCache[keyColumnOrdinal];\n            if (keyColumnPixelOffset === -1) {\n                keyColumnPixelOffset = this._actualReadPixelOffset(lineNumber, keyColumn, context);\n                this._keyColumnPixelOffsetCache[keyColumnOrdinal] = keyColumnPixelOffset;\n            }\n        }\n        if (keyColumnPixelOffset === -1) {\n            // Could not read actual key column pixel offset\n            const horizontalOffset = this._characterMapping.getHorizontalOffset(column);\n            return this._charWidth * horizontalOffset;\n        }\n        const keyColumnHorizontalOffset = this._characterMapping.getHorizontalOffset(keyColumn);\n        const horizontalOffset = this._characterMapping.getHorizontalOffset(column);\n        return keyColumnPixelOffset + this._charWidth * (horizontalOffset - keyColumnHorizontalOffset);\n    }\n    _getReadingTarget(myDomNode) {\n        return myDomNode.domNode.firstChild;\n    }\n    _actualReadPixelOffset(lineNumber, column, context) {\n        if (!this.domNode) {\n            return -1;\n        }\n        const domPosition = this._characterMapping.getDomPosition(column);\n        const r = RangeUtil.readHorizontalRanges(this._getReadingTarget(this.domNode), domPosition.partIndex, domPosition.charIndex, domPosition.partIndex, domPosition.charIndex, context);\n        if (!r || r.length === 0) {\n            return -1;\n        }\n        return r[0].left;\n    }\n    getColumnOfNodeOffset(spanNode, offset) {\n        return getColumnOfNodeOffset(this._characterMapping, spanNode, offset);\n    }\n}\n/**\n * Every time we render a line, we save what we have rendered in an instance of this class.\n */\nclass RenderedViewLine {\n    constructor(domNode, renderLineInput, characterMapping, containsForeignElements) {\n        this.domNode = domNode;\n        this.input = renderLineInput;\n        this._characterMapping = characterMapping;\n        this._isWhitespaceOnly = /^\\s*$/.test(renderLineInput.lineContent);\n        this._containsForeignElements = containsForeignElements;\n        this._cachedWidth = -1;\n        this._pixelOffsetCache = null;\n        if (renderLineInput.isLTR) {\n            this._pixelOffsetCache = new Float32Array(Math.max(2, this._characterMapping.length + 1));\n            for (let column = 0, len = this._characterMapping.length; column <= len; column++) {\n                this._pixelOffsetCache[column] = -1;\n            }\n        }\n    }\n    // --- Reading from the DOM methods\n    _getReadingTarget(myDomNode) {\n        return myDomNode.domNode.firstChild;\n    }\n    /**\n     * Width of the line in pixels\n     */\n    getWidth(context) {\n        if (!this.domNode) {\n            return 0;\n        }\n        if (this._cachedWidth === -1) {\n            this._cachedWidth = this._getReadingTarget(this.domNode).offsetWidth;\n            context?.markDidDomLayout();\n        }\n        return this._cachedWidth;\n    }\n    getWidthIsFast() {\n        if (this._cachedWidth === -1) {\n            return false;\n        }\n        return true;\n    }\n    /**\n     * Visible ranges for a model range\n     */\n    getVisibleRangesForRange(lineNumber, startColumn, endColumn, context) {\n        if (!this.domNode) {\n            return null;\n        }\n        if (this._pixelOffsetCache !== null) {\n            // the text is guaranteed to be entirely LTR\n            const startOffset = this._readPixelOffset(this.domNode, lineNumber, startColumn, context);\n            if (startOffset === -1) {\n                return null;\n            }\n            const endOffset = this._readPixelOffset(this.domNode, lineNumber, endColumn, context);\n            if (endOffset === -1) {\n                return null;\n            }\n            return [new FloatHorizontalRange(startOffset, endOffset - startOffset)];\n        }\n        return this._readVisibleRangesForRange(this.domNode, lineNumber, startColumn, endColumn, context);\n    }\n    _readVisibleRangesForRange(domNode, lineNumber, startColumn, endColumn, context) {\n        if (startColumn === endColumn) {\n            const pixelOffset = this._readPixelOffset(domNode, lineNumber, startColumn, context);\n            if (pixelOffset === -1) {\n                return null;\n            }\n            else {\n                return [new FloatHorizontalRange(pixelOffset, 0)];\n            }\n        }\n        else {\n            return this._readRawVisibleRangesForRange(domNode, startColumn, endColumn, context);\n        }\n    }\n    _readPixelOffset(domNode, lineNumber, column, context) {\n        if (this.input.isLTR && this._characterMapping.length === 0) {\n            // This line has no content\n            if (this._containsForeignElements === 0 /* ForeignElementType.None */) {\n                // We can assume the line is really empty\n                return 0;\n            }\n            if (this._containsForeignElements === 2 /* ForeignElementType.After */) {\n                // We have foreign elements after the (empty) line\n                return 0;\n            }\n            if (this._containsForeignElements === 1 /* ForeignElementType.Before */) {\n                // We have foreign elements before the (empty) line\n                return this.getWidth(context);\n            }\n            // We have foreign elements before & after the (empty) line\n            const readingTarget = this._getReadingTarget(domNode);\n            if (readingTarget.firstChild) {\n                context.markDidDomLayout();\n                return readingTarget.firstChild.offsetWidth;\n            }\n            else {\n                return 0;\n            }\n        }\n        if (this._pixelOffsetCache !== null) {\n            // the text is guaranteed to be LTR\n            const cachedPixelOffset = this._pixelOffsetCache[column];\n            if (cachedPixelOffset !== -1) {\n                return cachedPixelOffset;\n            }\n            const result = this._actualReadPixelOffset(domNode, lineNumber, column, context);\n            this._pixelOffsetCache[column] = result;\n            return result;\n        }\n        return this._actualReadPixelOffset(domNode, lineNumber, column, context);\n    }\n    _actualReadPixelOffset(domNode, lineNumber, column, context) {\n        if (this._characterMapping.length === 0) {\n            // This line has no content\n            const r = RangeUtil.readHorizontalRanges(this._getReadingTarget(domNode), 0, 0, 0, 0, context);\n            if (!r || r.length === 0) {\n                return -1;\n            }\n            return r[0].left;\n        }\n        if (this.input.isLTR && column === this._characterMapping.length && this._isWhitespaceOnly && this._containsForeignElements === 0 /* ForeignElementType.None */) {\n            // This branch helps in the case of whitespace only lines which have a width set\n            return this.getWidth(context);\n        }\n        const domPosition = this._characterMapping.getDomPosition(column);\n        const r = RangeUtil.readHorizontalRanges(this._getReadingTarget(domNode), domPosition.partIndex, domPosition.charIndex, domPosition.partIndex, domPosition.charIndex, context);\n        if (!r || r.length === 0) {\n            return -1;\n        }\n        const result = r[0].left;\n        if (this.input.isBasicASCII) {\n            const horizontalOffset = this._characterMapping.getHorizontalOffset(column);\n            const expectedResult = Math.round(this.input.spaceWidth * horizontalOffset);\n            if (Math.abs(expectedResult - result) <= 1) {\n                return expectedResult;\n            }\n        }\n        return result;\n    }\n    _readRawVisibleRangesForRange(domNode, startColumn, endColumn, context) {\n        if (this.input.isLTR && startColumn === 1 && endColumn === this._characterMapping.length) {\n            // This branch helps IE with bidi text & gives a performance boost to other browsers when reading visible ranges for an entire line\n            return [new FloatHorizontalRange(0, this.getWidth(context))];\n        }\n        const startDomPosition = this._characterMapping.getDomPosition(startColumn);\n        const endDomPosition = this._characterMapping.getDomPosition(endColumn);\n        return RangeUtil.readHorizontalRanges(this._getReadingTarget(domNode), startDomPosition.partIndex, startDomPosition.charIndex, endDomPosition.partIndex, endDomPosition.charIndex, context);\n    }\n    /**\n     * Returns the column for the text found at a specific offset inside a rendered dom node\n     */\n    getColumnOfNodeOffset(spanNode, offset) {\n        return getColumnOfNodeOffset(this._characterMapping, spanNode, offset);\n    }\n}\nclass WebKitRenderedViewLine extends RenderedViewLine {\n    _readVisibleRangesForRange(domNode, lineNumber, startColumn, endColumn, context) {\n        const output = super._readVisibleRangesForRange(domNode, lineNumber, startColumn, endColumn, context);\n        if (!output || output.length === 0 || startColumn === endColumn || (startColumn === 1 && endColumn === this._characterMapping.length)) {\n            return output;\n        }\n        // WebKit is buggy and returns an expanded range (to contain words in some cases)\n        // The last client rect is enlarged (I think)\n        if (this.input.isLTR) {\n            // This is an attempt to patch things up\n            // Find position of last column\n            const endPixelOffset = this._readPixelOffset(domNode, lineNumber, endColumn, context);\n            if (endPixelOffset !== -1) {\n                const lastRange = output[output.length - 1];\n                if (lastRange.left < endPixelOffset) {\n                    // Trim down the width of the last visible range to not go after the last column's position\n                    lastRange.width = endPixelOffset - lastRange.left;\n                }\n            }\n        }\n        return output;\n    }\n}\nconst createRenderedLine = (function () {\n    if (isWebKit) {\n        return createWebKitRenderedLine;\n    }\n    return createNormalRenderedLine;\n})();\nfunction createWebKitRenderedLine(domNode, renderLineInput, characterMapping, containsForeignElements) {\n    return new WebKitRenderedViewLine(domNode, renderLineInput, characterMapping, containsForeignElements);\n}\nfunction createNormalRenderedLine(domNode, renderLineInput, characterMapping, containsForeignElements) {\n    return new RenderedViewLine(domNode, renderLineInput, characterMapping, containsForeignElements);\n}\nfunction getColumnOfNodeOffset(characterMapping, spanNode, offset) {\n    const spanNodeTextContentLength = spanNode.textContent.length;\n    let spanIndex = -1;\n    while (spanNode) {\n        spanNode = spanNode.previousSibling;\n        spanIndex++;\n    }\n    return characterMapping.getColumn(new DomPosition(spanIndex, offset), spanNodeTextContentLength);\n}\n\nexport { ViewLine, getColumnOfNodeOffset };\n","import { PageCoordinates } from '../editorDom.js';\nimport { PartFingerprints } from '../view/viewPart.js';\nimport { ViewLine } from '../viewParts/viewLines/viewLine.js';\nimport { Position } from '../../common/core/position.js';\nimport { Range } from '../../common/core/range.js';\nimport { CursorColumns } from '../../common/core/cursorColumns.js';\nimport { getWindow, getShadowRoot } from '../../../base/browser/dom.js';\nimport { AtomicTabMoveOperations } from '../../common/cursor/cursorAtomicMoveOperations.js';\nimport { TextDirection } from '../../common/model.js';\nimport { Lazy } from '../../../base/common/lazy.js';\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 *--------------------------------------------------------------------------------------------*/\nclass UnknownHitTestResult {\n    constructor(hitTarget = null) {\n        this.hitTarget = hitTarget;\n        this.type = 0 /* HitTestResultType.Unknown */;\n    }\n}\nclass ContentHitTestResult {\n    get hitTarget() { return this.spanNode; }\n    constructor(position, spanNode, injectedText) {\n        this.position = position;\n        this.spanNode = spanNode;\n        this.injectedText = injectedText;\n        this.type = 1 /* HitTestResultType.Content */;\n    }\n}\nvar HitTestResult;\n(function (HitTestResult) {\n    function createFromDOMInfo(ctx, spanNode, offset) {\n        const position = ctx.getPositionFromDOMInfo(spanNode, offset);\n        if (position) {\n            return new ContentHitTestResult(position, spanNode, null);\n        }\n        return new UnknownHitTestResult(spanNode);\n    }\n    HitTestResult.createFromDOMInfo = createFromDOMInfo;\n})(HitTestResult || (HitTestResult = {}));\nclass PointerHandlerLastRenderData {\n    constructor(lastViewCursorsRenderData, lastTextareaPosition) {\n        this.lastViewCursorsRenderData = lastViewCursorsRenderData;\n        this.lastTextareaPosition = lastTextareaPosition;\n    }\n}\nclass MouseTarget {\n    static _deduceRage(position, range = null) {\n        if (!range && position) {\n            return new Range(position.lineNumber, position.column, position.lineNumber, position.column);\n        }\n        return range ?? null;\n    }\n    static createUnknown(element, mouseColumn, position) {\n        return { type: 0 /* MouseTargetType.UNKNOWN */, element, mouseColumn, position, range: this._deduceRage(position) };\n    }\n    static createTextarea(element, mouseColumn) {\n        return { type: 1 /* MouseTargetType.TEXTAREA */, element, mouseColumn, position: null, range: null };\n    }\n    static createMargin(type, element, mouseColumn, position, range, detail) {\n        return { type, element, mouseColumn, position, range, detail };\n    }\n    static createViewZone(type, element, mouseColumn, position, detail) {\n        return { type, element, mouseColumn, position, range: this._deduceRage(position), detail };\n    }\n    static createContentText(element, mouseColumn, position, range, detail) {\n        return { type: 6 /* MouseTargetType.CONTENT_TEXT */, element, mouseColumn, position, range: this._deduceRage(position, range), detail };\n    }\n    static createContentEmpty(element, mouseColumn, position, detail) {\n        return { type: 7 /* MouseTargetType.CONTENT_EMPTY */, element, mouseColumn, position, range: this._deduceRage(position), detail };\n    }\n    static createContentWidget(element, mouseColumn, detail) {\n        return { type: 9 /* MouseTargetType.CONTENT_WIDGET */, element, mouseColumn, position: null, range: null, detail };\n    }\n    static createScrollbar(element, mouseColumn, position) {\n        return { type: 11 /* MouseTargetType.SCROLLBAR */, element, mouseColumn, position, range: this._deduceRage(position) };\n    }\n    static createOverlayWidget(element, mouseColumn, detail) {\n        return { type: 12 /* MouseTargetType.OVERLAY_WIDGET */, element, mouseColumn, position: null, range: null, detail };\n    }\n    static createOutsideEditor(mouseColumn, position, outsidePosition, outsideDistance) {\n        return { type: 13 /* MouseTargetType.OUTSIDE_EDITOR */, element: null, mouseColumn, position, range: this._deduceRage(position), outsidePosition, outsideDistance };\n    }\n    static _typeToString(type) {\n        if (type === 1 /* MouseTargetType.TEXTAREA */) {\n            return 'TEXTAREA';\n        }\n        if (type === 2 /* MouseTargetType.GUTTER_GLYPH_MARGIN */) {\n            return 'GUTTER_GLYPH_MARGIN';\n        }\n        if (type === 3 /* MouseTargetType.GUTTER_LINE_NUMBERS */) {\n            return 'GUTTER_LINE_NUMBERS';\n        }\n        if (type === 4 /* MouseTargetType.GUTTER_LINE_DECORATIONS */) {\n            return 'GUTTER_LINE_DECORATIONS';\n        }\n        if (type === 5 /* MouseTargetType.GUTTER_VIEW_ZONE */) {\n            return 'GUTTER_VIEW_ZONE';\n        }\n        if (type === 6 /* MouseTargetType.CONTENT_TEXT */) {\n            return 'CONTENT_TEXT';\n        }\n        if (type === 7 /* MouseTargetType.CONTENT_EMPTY */) {\n            return 'CONTENT_EMPTY';\n        }\n        if (type === 8 /* MouseTargetType.CONTENT_VIEW_ZONE */) {\n            return 'CONTENT_VIEW_ZONE';\n        }\n        if (type === 9 /* MouseTargetType.CONTENT_WIDGET */) {\n            return 'CONTENT_WIDGET';\n        }\n        if (type === 10 /* MouseTargetType.OVERVIEW_RULER */) {\n            return 'OVERVIEW_RULER';\n        }\n        if (type === 11 /* MouseTargetType.SCROLLBAR */) {\n            return 'SCROLLBAR';\n        }\n        if (type === 12 /* MouseTargetType.OVERLAY_WIDGET */) {\n            return 'OVERLAY_WIDGET';\n        }\n        return 'UNKNOWN';\n    }\n    static toString(target) {\n        return this._typeToString(target.type) + ': ' + target.position + ' - ' + target.range + ' - ' + JSON.stringify(target.detail);\n    }\n}\nclass ElementPath {\n    static isTextArea(path) {\n        return (path.length === 2\n            && path[0] === 3 /* PartFingerprint.OverflowGuard */\n            && path[1] === 7 /* PartFingerprint.TextArea */);\n    }\n    static isChildOfViewLines(path) {\n        return (path.length >= 4\n            && path[0] === 3 /* PartFingerprint.OverflowGuard */\n            && path[3] === 8 /* PartFingerprint.ViewLines */);\n    }\n    static isStrictChildOfViewLines(path) {\n        return (path.length > 4\n            && path[0] === 3 /* PartFingerprint.OverflowGuard */\n            && path[3] === 8 /* PartFingerprint.ViewLines */);\n    }\n    static isChildOfScrollableElement(path) {\n        return (path.length >= 2\n            && path[0] === 3 /* PartFingerprint.OverflowGuard */\n            && path[1] === 6 /* PartFingerprint.ScrollableElement */);\n    }\n    static isChildOfMinimap(path) {\n        return (path.length >= 2\n            && path[0] === 3 /* PartFingerprint.OverflowGuard */\n            && path[1] === 9 /* PartFingerprint.Minimap */);\n    }\n    static isChildOfContentWidgets(path) {\n        return (path.length >= 4\n            && path[0] === 3 /* PartFingerprint.OverflowGuard */\n            && path[3] === 1 /* PartFingerprint.ContentWidgets */);\n    }\n    static isChildOfOverflowGuard(path) {\n        return (path.length >= 1\n            && path[0] === 3 /* PartFingerprint.OverflowGuard */);\n    }\n    static isChildOfOverflowingContentWidgets(path) {\n        return (path.length >= 1\n            && path[0] === 2 /* PartFingerprint.OverflowingContentWidgets */);\n    }\n    static isChildOfOverlayWidgets(path) {\n        return (path.length >= 2\n            && path[0] === 3 /* PartFingerprint.OverflowGuard */\n            && path[1] === 4 /* PartFingerprint.OverlayWidgets */);\n    }\n    static isChildOfOverflowingOverlayWidgets(path) {\n        return (path.length >= 1\n            && path[0] === 5 /* PartFingerprint.OverflowingOverlayWidgets */);\n    }\n}\nclass HitTestContext {\n    constructor(context, viewHelper, lastRenderData) {\n        this.viewModel = context.viewModel;\n        const options = context.configuration.options;\n        this.layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this.viewDomNode = viewHelper.viewDomNode;\n        this.viewLinesGpu = viewHelper.viewLinesGpu;\n        this.lineHeight = options.get(75 /* EditorOption.lineHeight */);\n        this.stickyTabStops = options.get(132 /* EditorOption.stickyTabStops */);\n        this.typicalHalfwidthCharacterWidth = options.get(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;\n        this.lastRenderData = lastRenderData;\n        this._context = context;\n        this._viewHelper = viewHelper;\n    }\n    getZoneAtCoord(mouseVerticalOffset) {\n        return HitTestContext.getZoneAtCoord(this._context, mouseVerticalOffset);\n    }\n    static getZoneAtCoord(context, mouseVerticalOffset) {\n        // The target is either a view zone or the empty space after the last view-line\n        const viewZoneWhitespace = context.viewLayout.getWhitespaceAtVerticalOffset(mouseVerticalOffset);\n        if (viewZoneWhitespace) {\n            const viewZoneMiddle = viewZoneWhitespace.verticalOffset + viewZoneWhitespace.height / 2;\n            const lineCount = context.viewModel.getLineCount();\n            let positionBefore = null;\n            let position;\n            let positionAfter = null;\n            if (viewZoneWhitespace.afterLineNumber !== lineCount) {\n                // There are more lines after this view zone\n                positionAfter = new Position(viewZoneWhitespace.afterLineNumber + 1, 1);\n            }\n            if (viewZoneWhitespace.afterLineNumber > 0) {\n                // There are more lines above this view zone\n                positionBefore = new Position(viewZoneWhitespace.afterLineNumber, context.viewModel.getLineMaxColumn(viewZoneWhitespace.afterLineNumber));\n            }\n            if (positionAfter === null) {\n                position = positionBefore;\n            }\n            else if (positionBefore === null) {\n                position = positionAfter;\n            }\n            else if (mouseVerticalOffset < viewZoneMiddle) {\n                position = positionBefore;\n            }\n            else {\n                position = positionAfter;\n            }\n            return {\n                viewZoneId: viewZoneWhitespace.id,\n                afterLineNumber: viewZoneWhitespace.afterLineNumber,\n                positionBefore: positionBefore,\n                positionAfter: positionAfter,\n                position: position\n            };\n        }\n        return null;\n    }\n    getFullLineRangeAtCoord(mouseVerticalOffset) {\n        if (this._context.viewLayout.isAfterLines(mouseVerticalOffset)) {\n            // Below the last line\n            const lineNumber = this._context.viewModel.getLineCount();\n            const maxLineColumn = this._context.viewModel.getLineMaxColumn(lineNumber);\n            return {\n                range: new Range(lineNumber, maxLineColumn, lineNumber, maxLineColumn),\n                isAfterLines: true\n            };\n        }\n        const lineNumber = this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset);\n        const maxLineColumn = this._context.viewModel.getLineMaxColumn(lineNumber);\n        return {\n            range: new Range(lineNumber, 1, lineNumber, maxLineColumn),\n            isAfterLines: false\n        };\n    }\n    getLineNumberAtVerticalOffset(mouseVerticalOffset) {\n        return this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset);\n    }\n    isAfterLines(mouseVerticalOffset) {\n        return this._context.viewLayout.isAfterLines(mouseVerticalOffset);\n    }\n    isInTopPadding(mouseVerticalOffset) {\n        return this._context.viewLayout.isInTopPadding(mouseVerticalOffset);\n    }\n    isInBottomPadding(mouseVerticalOffset) {\n        return this._context.viewLayout.isInBottomPadding(mouseVerticalOffset);\n    }\n    getVerticalOffsetForLineNumber(lineNumber) {\n        return this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber);\n    }\n    findAttribute(element, attr) {\n        return HitTestContext._findAttribute(element, attr, this._viewHelper.viewDomNode);\n    }\n    static _findAttribute(element, attr, stopAt) {\n        while (element && element !== element.ownerDocument.body) {\n            if (element.hasAttribute && element.hasAttribute(attr)) {\n                return element.getAttribute(attr);\n            }\n            if (element === stopAt) {\n                return null;\n            }\n            element = element.parentNode;\n        }\n        return null;\n    }\n    getLineWidth(lineNumber) {\n        return this._viewHelper.getLineWidth(lineNumber);\n    }\n    isRtl(lineNumber) {\n        return this.viewModel.getTextDirection(lineNumber) === TextDirection.RTL;\n    }\n    visibleRangeForPosition(lineNumber, column) {\n        return this._viewHelper.visibleRangeForPosition(lineNumber, column);\n    }\n    getPositionFromDOMInfo(spanNode, offset) {\n        return this._viewHelper.getPositionFromDOMInfo(spanNode, offset);\n    }\n    getCurrentScrollTop() {\n        return this._context.viewLayout.getCurrentScrollTop();\n    }\n    getCurrentScrollLeft() {\n        return this._context.viewLayout.getCurrentScrollLeft();\n    }\n}\nclass BareHitTestRequest {\n    constructor(ctx, editorPos, pos, relativePos) {\n        this.editorPos = editorPos;\n        this.pos = pos;\n        this.relativePos = relativePos;\n        this.mouseVerticalOffset = Math.max(0, ctx.getCurrentScrollTop() + this.relativePos.y);\n        this.mouseContentHorizontalOffset = ctx.getCurrentScrollLeft() + this.relativePos.x - ctx.layoutInfo.contentLeft;\n        this.isInMarginArea = (this.relativePos.x < ctx.layoutInfo.contentLeft && this.relativePos.x >= ctx.layoutInfo.glyphMarginLeft);\n        this.isInContentArea = !this.isInMarginArea;\n        this.mouseColumn = Math.max(0, MouseTargetFactory._getMouseColumn(this.mouseContentHorizontalOffset, ctx.typicalHalfwidthCharacterWidth));\n    }\n}\nclass HitTestRequest extends BareHitTestRequest {\n    get target() {\n        if (this._useHitTestTarget) {\n            return this.hitTestResult.value.hitTarget;\n        }\n        return this._eventTarget;\n    }\n    get targetPath() {\n        if (this._targetPathCacheElement !== this.target) {\n            this._targetPathCacheElement = this.target;\n            this._targetPathCacheValue = PartFingerprints.collect(this.target, this._ctx.viewDomNode);\n        }\n        return this._targetPathCacheValue;\n    }\n    constructor(ctx, editorPos, pos, relativePos, eventTarget) {\n        super(ctx, editorPos, pos, relativePos);\n        this.hitTestResult = new Lazy(() => MouseTargetFactory.doHitTest(this._ctx, this));\n        this._targetPathCacheElement = null;\n        this._targetPathCacheValue = new Uint8Array(0);\n        this._ctx = ctx;\n        this._eventTarget = eventTarget;\n        // If no event target is passed in, we will use the hit test target\n        const hasEventTarget = Boolean(this._eventTarget);\n        this._useHitTestTarget = !hasEventTarget;\n    }\n    toString() {\n        return `pos(${this.pos.x},${this.pos.y}), editorPos(${this.editorPos.x},${this.editorPos.y}), relativePos(${this.relativePos.x},${this.relativePos.y}), mouseVerticalOffset: ${this.mouseVerticalOffset}, mouseContentHorizontalOffset: ${this.mouseContentHorizontalOffset}\\n\\ttarget: ${this.target ? this.target.outerHTML : null}`;\n    }\n    get wouldBenefitFromHitTestTargetSwitch() {\n        return (!this._useHitTestTarget\n            && this.hitTestResult.value.hitTarget !== null\n            && this.target !== this.hitTestResult.value.hitTarget);\n    }\n    switchToHitTestTarget() {\n        this._useHitTestTarget = true;\n    }\n    _getMouseColumn(position = null) {\n        if (position && position.column < this._ctx.viewModel.getLineMaxColumn(position.lineNumber)) {\n            // Most likely, the line contains foreign decorations...\n            return CursorColumns.visibleColumnFromColumn(this._ctx.viewModel.getLineContent(position.lineNumber), position.column, this._ctx.viewModel.model.getOptions().tabSize) + 1;\n        }\n        return this.mouseColumn;\n    }\n    fulfillUnknown(position = null) {\n        return MouseTarget.createUnknown(this.target, this._getMouseColumn(position), position);\n    }\n    fulfillTextarea() {\n        return MouseTarget.createTextarea(this.target, this._getMouseColumn());\n    }\n    fulfillMargin(type, position, range, detail) {\n        return MouseTarget.createMargin(type, this.target, this._getMouseColumn(position), position, range, detail);\n    }\n    fulfillViewZone(type, position, detail) {\n        // Always return the usual mouse column for a view zone.\n        return MouseTarget.createViewZone(type, this.target, this._getMouseColumn(), position, detail);\n    }\n    fulfillContentText(position, range, detail) {\n        return MouseTarget.createContentText(this.target, this._getMouseColumn(position), position, range, detail);\n    }\n    fulfillContentEmpty(position, detail) {\n        return MouseTarget.createContentEmpty(this.target, this._getMouseColumn(position), position, detail);\n    }\n    fulfillContentWidget(detail) {\n        return MouseTarget.createContentWidget(this.target, this._getMouseColumn(), detail);\n    }\n    fulfillScrollbar(position) {\n        return MouseTarget.createScrollbar(this.target, this._getMouseColumn(position), position);\n    }\n    fulfillOverlayWidget(detail) {\n        return MouseTarget.createOverlayWidget(this.target, this._getMouseColumn(), detail);\n    }\n}\nconst EMPTY_CONTENT_AFTER_LINES = { isAfterLines: true };\nfunction createEmptyContentDataInLines(horizontalDistanceToText) {\n    return {\n        isAfterLines: false,\n        horizontalDistanceToText: horizontalDistanceToText\n    };\n}\nclass MouseTargetFactory {\n    constructor(context, viewHelper) {\n        this._context = context;\n        this._viewHelper = viewHelper;\n    }\n    mouseTargetIsWidget(e) {\n        const t = e.target;\n        const path = PartFingerprints.collect(t, this._viewHelper.viewDomNode);\n        // Is it a content widget?\n        if (ElementPath.isChildOfContentWidgets(path) || ElementPath.isChildOfOverflowingContentWidgets(path)) {\n            return true;\n        }\n        // Is it an overlay widget?\n        if (ElementPath.isChildOfOverlayWidgets(path) || ElementPath.isChildOfOverflowingOverlayWidgets(path)) {\n            return true;\n        }\n        return false;\n    }\n    createMouseTarget(lastRenderData, editorPos, pos, relativePos, target) {\n        const ctx = new HitTestContext(this._context, this._viewHelper, lastRenderData);\n        const request = new HitTestRequest(ctx, editorPos, pos, relativePos, target);\n        try {\n            const r = MouseTargetFactory._createMouseTarget(ctx, request);\n            if (r.type === 6 /* MouseTargetType.CONTENT_TEXT */) {\n                // Snap to the nearest soft tab boundary if atomic soft tabs are enabled.\n                if (ctx.stickyTabStops && r.position !== null) {\n                    const position = MouseTargetFactory._snapToSoftTabBoundary(r.position, ctx.viewModel);\n                    const range = Range.fromPositions(position, position).plusRange(r.range);\n                    return request.fulfillContentText(position, range, r.detail);\n                }\n            }\n            // console.log(MouseTarget.toString(r));\n            return r;\n        }\n        catch (err) {\n            // console.log(err);\n            return request.fulfillUnknown();\n        }\n    }\n    static _createMouseTarget(ctx, request) {\n        // console.log(`${domHitTestExecuted ? '=>' : ''}CAME IN REQUEST: ${request}`);\n        if (request.target === null) {\n            // No target\n            return request.fulfillUnknown();\n        }\n        // we know for a fact that request.target is not null\n        const resolvedRequest = request;\n        let result = null;\n        if (!ElementPath.isChildOfOverflowGuard(request.targetPath) && !ElementPath.isChildOfOverflowingContentWidgets(request.targetPath) && !ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath)) {\n            // We only render dom nodes inside the overflow guard or in the overflowing content widgets\n            result = result || request.fulfillUnknown();\n        }\n        result = result || MouseTargetFactory._hitTestContentWidget(ctx, resolvedRequest);\n        result = result || MouseTargetFactory._hitTestOverlayWidget(ctx, resolvedRequest);\n        result = result || MouseTargetFactory._hitTestMinimap(ctx, resolvedRequest);\n        result = result || MouseTargetFactory._hitTestScrollbarSlider(ctx, resolvedRequest);\n        result = result || MouseTargetFactory._hitTestViewZone(ctx, resolvedRequest);\n        result = result || MouseTargetFactory._hitTestMargin(ctx, resolvedRequest);\n        result = result || MouseTargetFactory._hitTestViewCursor(ctx, resolvedRequest);\n        result = result || MouseTargetFactory._hitTestTextArea(ctx, resolvedRequest);\n        result = result || MouseTargetFactory._hitTestViewLines(ctx, resolvedRequest);\n        result = result || MouseTargetFactory._hitTestScrollbar(ctx, resolvedRequest);\n        return (result || request.fulfillUnknown());\n    }\n    static _hitTestContentWidget(ctx, request) {\n        // Is it a content widget?\n        if (ElementPath.isChildOfContentWidgets(request.targetPath) || ElementPath.isChildOfOverflowingContentWidgets(request.targetPath)) {\n            const widgetId = ctx.findAttribute(request.target, 'widgetId');\n            if (widgetId) {\n                return request.fulfillContentWidget(widgetId);\n            }\n            else {\n                return request.fulfillUnknown();\n            }\n        }\n        return null;\n    }\n    static _hitTestOverlayWidget(ctx, request) {\n        // Is it an overlay widget?\n        if (ElementPath.isChildOfOverlayWidgets(request.targetPath) || ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath)) {\n            const widgetId = ctx.findAttribute(request.target, 'widgetId');\n            if (widgetId) {\n                return request.fulfillOverlayWidget(widgetId);\n            }\n            else {\n                return request.fulfillUnknown();\n            }\n        }\n        return null;\n    }\n    static _hitTestViewCursor(ctx, request) {\n        if (request.target) {\n            // Check if we've hit a painted cursor\n            const lastViewCursorsRenderData = ctx.lastRenderData.lastViewCursorsRenderData;\n            for (const d of lastViewCursorsRenderData) {\n                if (request.target === d.domNode) {\n                    return request.fulfillContentText(d.position, null, { mightBeForeignElement: false, injectedText: null });\n                }\n            }\n        }\n        if (request.isInContentArea) {\n            // Edge has a bug when hit-testing the exact position of a cursor,\n            // instead of returning the correct dom node, it returns the\n            // first or last rendered view line dom node, therefore help it out\n            // and first check if we are on top of a cursor\n            const lastViewCursorsRenderData = ctx.lastRenderData.lastViewCursorsRenderData;\n            const mouseContentHorizontalOffset = request.mouseContentHorizontalOffset;\n            const mouseVerticalOffset = request.mouseVerticalOffset;\n            for (const d of lastViewCursorsRenderData) {\n                if (mouseContentHorizontalOffset < d.contentLeft) {\n                    // mouse position is to the left of the cursor\n                    continue;\n                }\n                if (mouseContentHorizontalOffset > d.contentLeft + d.width) {\n                    // mouse position is to the right of the cursor\n                    continue;\n                }\n                const cursorVerticalOffset = ctx.getVerticalOffsetForLineNumber(d.position.lineNumber);\n                if (cursorVerticalOffset <= mouseVerticalOffset\n                    && mouseVerticalOffset <= cursorVerticalOffset + d.height) {\n                    return request.fulfillContentText(d.position, null, { mightBeForeignElement: false, injectedText: null });\n                }\n            }\n        }\n        return null;\n    }\n    static _hitTestViewZone(ctx, request) {\n        const viewZoneData = ctx.getZoneAtCoord(request.mouseVerticalOffset);\n        if (viewZoneData) {\n            const mouseTargetType = (request.isInContentArea ? 8 /* MouseTargetType.CONTENT_VIEW_ZONE */ : 5 /* MouseTargetType.GUTTER_VIEW_ZONE */);\n            return request.fulfillViewZone(mouseTargetType, viewZoneData.position, viewZoneData);\n        }\n        return null;\n    }\n    static _hitTestTextArea(ctx, request) {\n        // Is it the textarea?\n        if (ElementPath.isTextArea(request.targetPath)) {\n            if (ctx.lastRenderData.lastTextareaPosition) {\n                return request.fulfillContentText(ctx.lastRenderData.lastTextareaPosition, null, { mightBeForeignElement: false, injectedText: null });\n            }\n            return request.fulfillTextarea();\n        }\n        return null;\n    }\n    static _hitTestMargin(ctx, request) {\n        if (request.isInMarginArea) {\n            const res = ctx.getFullLineRangeAtCoord(request.mouseVerticalOffset);\n            const pos = res.range.getStartPosition();\n            let offset = Math.abs(request.relativePos.x);\n            const detail = {\n                isAfterLines: res.isAfterLines,\n                glyphMarginLeft: ctx.layoutInfo.glyphMarginLeft,\n                glyphMarginWidth: ctx.layoutInfo.glyphMarginWidth,\n                lineNumbersWidth: ctx.layoutInfo.lineNumbersWidth,\n                offsetX: offset\n            };\n            offset -= ctx.layoutInfo.glyphMarginLeft;\n            if (offset <= ctx.layoutInfo.glyphMarginWidth) {\n                // On the glyph margin\n                const modelCoordinate = ctx.viewModel.coordinatesConverter.convertViewPositionToModelPosition(res.range.getStartPosition());\n                const lanes = ctx.viewModel.glyphLanes.getLanesAtLine(modelCoordinate.lineNumber);\n                detail.glyphMarginLane = lanes[Math.floor(offset / ctx.lineHeight)];\n                return request.fulfillMargin(2 /* MouseTargetType.GUTTER_GLYPH_MARGIN */, pos, res.range, detail);\n            }\n            offset -= ctx.layoutInfo.glyphMarginWidth;\n            if (offset <= ctx.layoutInfo.lineNumbersWidth) {\n                // On the line numbers\n                return request.fulfillMargin(3 /* MouseTargetType.GUTTER_LINE_NUMBERS */, pos, res.range, detail);\n            }\n            offset -= ctx.layoutInfo.lineNumbersWidth;\n            // On the line decorations\n            return request.fulfillMargin(4 /* MouseTargetType.GUTTER_LINE_DECORATIONS */, pos, res.range, detail);\n        }\n        return null;\n    }\n    static _hitTestViewLines(ctx, request) {\n        if (!ElementPath.isChildOfViewLines(request.targetPath)) {\n            return null;\n        }\n        if (ctx.isInTopPadding(request.mouseVerticalOffset)) {\n            return request.fulfillContentEmpty(new Position(1, 1), EMPTY_CONTENT_AFTER_LINES);\n        }\n        // Check if it is below any lines and any view zones\n        if (ctx.isAfterLines(request.mouseVerticalOffset) || ctx.isInBottomPadding(request.mouseVerticalOffset)) {\n            // This most likely indicates it happened after the last view-line\n            const lineCount = ctx.viewModel.getLineCount();\n            const maxLineColumn = ctx.viewModel.getLineMaxColumn(lineCount);\n            return request.fulfillContentEmpty(new Position(lineCount, maxLineColumn), EMPTY_CONTENT_AFTER_LINES);\n        }\n        // Check if we are hitting a view-line (can happen in the case of inline decorations on empty lines)\n        // See https://github.com/microsoft/vscode/issues/46942\n        if (ElementPath.isStrictChildOfViewLines(request.targetPath)) {\n            const lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n            const lineLength = ctx.viewModel.getLineLength(lineNumber);\n            const lineWidth = ctx.getLineWidth(lineNumber);\n            if (lineLength === 0) {\n                const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n                return request.fulfillContentEmpty(new Position(lineNumber, 1), detail);\n            }\n            const isRtl = ctx.isRtl(lineNumber);\n            if (isRtl) {\n                if (request.mouseContentHorizontalOffset + lineWidth <= ctx.layoutInfo.contentWidth - ctx.layoutInfo.verticalScrollbarWidth) {\n                    const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n                    const pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n                    return request.fulfillContentEmpty(pos, detail);\n                }\n            }\n            else if (request.mouseContentHorizontalOffset >= lineWidth) {\n                const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n                const pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n                return request.fulfillContentEmpty(pos, detail);\n            }\n        }\n        else {\n            if (ctx.viewLinesGpu) {\n                const lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n                if (ctx.viewModel.getLineLength(lineNumber) === 0) {\n                    const lineWidth = ctx.getLineWidth(lineNumber);\n                    const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n                    return request.fulfillContentEmpty(new Position(lineNumber, 1), detail);\n                }\n                const lineWidth = ctx.getLineWidth(lineNumber);\n                const isRtl = ctx.isRtl(lineNumber);\n                if (isRtl) {\n                    if (request.mouseContentHorizontalOffset + lineWidth <= ctx.layoutInfo.contentWidth - ctx.layoutInfo.verticalScrollbarWidth) {\n                        const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n                        const pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n                        return request.fulfillContentEmpty(pos, detail);\n                    }\n                }\n                else if (request.mouseContentHorizontalOffset >= lineWidth) {\n                    const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n                    const pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n                    return request.fulfillContentEmpty(pos, detail);\n                }\n                const position = ctx.viewLinesGpu.getPositionAtCoordinate(lineNumber, request.mouseContentHorizontalOffset);\n                if (position) {\n                    const detail = {\n                        injectedText: null,\n                        mightBeForeignElement: false\n                    };\n                    return request.fulfillContentText(position, Range.fromPositions(position, position), detail);\n                }\n            }\n        }\n        // Do the hit test (if not already done)\n        const hitTestResult = request.hitTestResult.value;\n        if (hitTestResult.type === 1 /* HitTestResultType.Content */) {\n            return MouseTargetFactory.createMouseTargetFromHitTestPosition(ctx, request, hitTestResult.spanNode, hitTestResult.position, hitTestResult.injectedText);\n        }\n        // We didn't hit content...\n        if (request.wouldBenefitFromHitTestTargetSwitch) {\n            // We actually hit something different... Give it one last change by trying again with this new target\n            request.switchToHitTestTarget();\n            return this._createMouseTarget(ctx, request);\n        }\n        // We have tried everything...\n        return request.fulfillUnknown();\n    }\n    static _hitTestMinimap(ctx, request) {\n        if (ElementPath.isChildOfMinimap(request.targetPath)) {\n            const possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n            const maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n            return request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n        }\n        return null;\n    }\n    static _hitTestScrollbarSlider(ctx, request) {\n        if (ElementPath.isChildOfScrollableElement(request.targetPath)) {\n            if (request.target && request.target.nodeType === 1) {\n                const className = request.target.className;\n                if (className && /\\b(slider|scrollbar)\\b/.test(className)) {\n                    const possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n                    const maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n                    return request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n                }\n            }\n        }\n        return null;\n    }\n    static _hitTestScrollbar(ctx, request) {\n        // Is it the overview ruler?\n        // Is it a child of the scrollable element?\n        if (ElementPath.isChildOfScrollableElement(request.targetPath)) {\n            const possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n            const maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n            return request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n        }\n        return null;\n    }\n    getMouseColumn(relativePos) {\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        const mouseContentHorizontalOffset = this._context.viewLayout.getCurrentScrollLeft() + relativePos.x - layoutInfo.contentLeft;\n        return MouseTargetFactory._getMouseColumn(mouseContentHorizontalOffset, options.get(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth);\n    }\n    static _getMouseColumn(mouseContentHorizontalOffset, typicalHalfwidthCharacterWidth) {\n        if (mouseContentHorizontalOffset < 0) {\n            return 1;\n        }\n        const chars = Math.round(mouseContentHorizontalOffset / typicalHalfwidthCharacterWidth);\n        return (chars + 1);\n    }\n    static createMouseTargetFromHitTestPosition(ctx, request, spanNode, pos, injectedText) {\n        const lineNumber = pos.lineNumber;\n        const column = pos.column;\n        const lineWidth = ctx.getLineWidth(lineNumber);\n        if (request.mouseContentHorizontalOffset > lineWidth) {\n            const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n            return request.fulfillContentEmpty(pos, detail);\n        }\n        const visibleRange = ctx.visibleRangeForPosition(lineNumber, column);\n        if (!visibleRange) {\n            return request.fulfillUnknown(pos);\n        }\n        const columnHorizontalOffset = visibleRange.left;\n        if (Math.abs(request.mouseContentHorizontalOffset - columnHorizontalOffset) < 1) {\n            return request.fulfillContentText(pos, null, { mightBeForeignElement: !!injectedText, injectedText });\n        }\n        const points = [];\n        points.push({ offset: visibleRange.left, column: column });\n        if (column > 1) {\n            const visibleRange = ctx.visibleRangeForPosition(lineNumber, column - 1);\n            if (visibleRange) {\n                points.push({ offset: visibleRange.left, column: column - 1 });\n            }\n        }\n        const lineMaxColumn = ctx.viewModel.getLineMaxColumn(lineNumber);\n        if (column < lineMaxColumn) {\n            const visibleRange = ctx.visibleRangeForPosition(lineNumber, column + 1);\n            if (visibleRange) {\n                points.push({ offset: visibleRange.left, column: column + 1 });\n            }\n        }\n        points.sort((a, b) => a.offset - b.offset);\n        const mouseCoordinates = request.pos.toClientCoordinates(getWindow(ctx.viewDomNode));\n        const spanNodeClientRect = spanNode.getBoundingClientRect();\n        const mouseIsOverSpanNode = (spanNodeClientRect.left <= mouseCoordinates.clientX && mouseCoordinates.clientX <= spanNodeClientRect.right);\n        let rng = null;\n        for (let i = 1; i < points.length; i++) {\n            const prev = points[i - 1];\n            const curr = points[i];\n            if (prev.offset <= request.mouseContentHorizontalOffset && request.mouseContentHorizontalOffset <= curr.offset) {\n                rng = new Range(lineNumber, prev.column, lineNumber, curr.column);\n                // See https://github.com/microsoft/vscode/issues/152819\n                // Due to the use of zwj, the browser's hit test result is skewed towards the left\n                // Here we try to correct that if the mouse horizontal offset is closer to the right than the left\n                const prevDelta = Math.abs(prev.offset - request.mouseContentHorizontalOffset);\n                const nextDelta = Math.abs(curr.offset - request.mouseContentHorizontalOffset);\n                pos = (prevDelta < nextDelta\n                    ? new Position(lineNumber, prev.column)\n                    : new Position(lineNumber, curr.column));\n                break;\n            }\n        }\n        return request.fulfillContentText(pos, rng, { mightBeForeignElement: !mouseIsOverSpanNode || !!injectedText, injectedText });\n    }\n    /**\n     * Most probably WebKit browsers and Edge\n     */\n    static _doHitTestWithCaretRangeFromPoint(ctx, request) {\n        // In Chrome, especially on Linux it is possible to click between lines,\n        // so try to adjust the `hity` below so that it lands in the center of a line\n        const lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n        const lineStartVerticalOffset = ctx.getVerticalOffsetForLineNumber(lineNumber);\n        const lineEndVerticalOffset = lineStartVerticalOffset + ctx.lineHeight;\n        const isBelowLastLine = (lineNumber === ctx.viewModel.getLineCount()\n            && request.mouseVerticalOffset > lineEndVerticalOffset);\n        if (!isBelowLastLine) {\n            const lineCenteredVerticalOffset = Math.floor((lineStartVerticalOffset + lineEndVerticalOffset) / 2);\n            let adjustedPageY = request.pos.y + (lineCenteredVerticalOffset - request.mouseVerticalOffset);\n            if (adjustedPageY <= request.editorPos.y) {\n                adjustedPageY = request.editorPos.y + 1;\n            }\n            if (adjustedPageY >= request.editorPos.y + request.editorPos.height) {\n                adjustedPageY = request.editorPos.y + request.editorPos.height - 1;\n            }\n            const adjustedPage = new PageCoordinates(request.pos.x, adjustedPageY);\n            const r = this._actualDoHitTestWithCaretRangeFromPoint(ctx, adjustedPage.toClientCoordinates(getWindow(ctx.viewDomNode)));\n            if (r.type === 1 /* HitTestResultType.Content */) {\n                return r;\n            }\n        }\n        // Also try to hit test without the adjustment (for the edge cases that we are near the top or bottom)\n        return this._actualDoHitTestWithCaretRangeFromPoint(ctx, request.pos.toClientCoordinates(getWindow(ctx.viewDomNode)));\n    }\n    static _actualDoHitTestWithCaretRangeFromPoint(ctx, coords) {\n        const shadowRoot = getShadowRoot(ctx.viewDomNode);\n        let range;\n        if (shadowRoot) {\n            // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n            if (typeof shadowRoot.caretRangeFromPoint === 'undefined') {\n                range = shadowCaretRangeFromPoint(shadowRoot, coords.clientX, coords.clientY);\n            }\n            else {\n                // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n                range = shadowRoot.caretRangeFromPoint(coords.clientX, coords.clientY);\n            }\n        }\n        else {\n            // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n            range = ctx.viewDomNode.ownerDocument.caretRangeFromPoint(coords.clientX, coords.clientY);\n        }\n        if (!range || !range.startContainer) {\n            return new UnknownHitTestResult();\n        }\n        // Chrome always hits a TEXT_NODE, while Edge sometimes hits a token span\n        const startContainer = range.startContainer;\n        if (startContainer.nodeType === startContainer.TEXT_NODE) {\n            // startContainer is expected to be the token text\n            const parent1 = startContainer.parentNode; // expected to be the token span\n            const parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line container span\n            const parent3 = parent2 ? parent2.parentNode : null; // expected to be the view line div\n            const parent3ClassName = parent3 && parent3.nodeType === parent3.ELEMENT_NODE ? parent3.className : null;\n            if (parent3ClassName === ViewLine.CLASS_NAME) {\n                return HitTestResult.createFromDOMInfo(ctx, parent1, range.startOffset);\n            }\n            else {\n                return new UnknownHitTestResult(startContainer.parentNode);\n            }\n        }\n        else if (startContainer.nodeType === startContainer.ELEMENT_NODE) {\n            // startContainer is expected to be the token span\n            const parent1 = startContainer.parentNode; // expected to be the view line container span\n            const parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line div\n            const parent2ClassName = parent2 && parent2.nodeType === parent2.ELEMENT_NODE ? parent2.className : null;\n            if (parent2ClassName === ViewLine.CLASS_NAME) {\n                return HitTestResult.createFromDOMInfo(ctx, startContainer, startContainer.textContent.length);\n            }\n            else {\n                return new UnknownHitTestResult(startContainer);\n            }\n        }\n        return new UnknownHitTestResult();\n    }\n    /**\n     * Most probably Gecko\n     */\n    static _doHitTestWithCaretPositionFromPoint(ctx, coords) {\n        // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n        const hitResult = ctx.viewDomNode.ownerDocument.caretPositionFromPoint(coords.clientX, coords.clientY);\n        if (hitResult.offsetNode.nodeType === hitResult.offsetNode.TEXT_NODE) {\n            // offsetNode is expected to be the token text\n            const parent1 = hitResult.offsetNode.parentNode; // expected to be the token span\n            const parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line container span\n            const parent3 = parent2 ? parent2.parentNode : null; // expected to be the view line div\n            const parent3ClassName = parent3 && parent3.nodeType === parent3.ELEMENT_NODE ? parent3.className : null;\n            if (parent3ClassName === ViewLine.CLASS_NAME) {\n                return HitTestResult.createFromDOMInfo(ctx, hitResult.offsetNode.parentNode, hitResult.offset);\n            }\n            else {\n                return new UnknownHitTestResult(hitResult.offsetNode.parentNode);\n            }\n        }\n        // For inline decorations, Gecko sometimes returns the `<span>` of the line and the offset is the `<span>` with the inline decoration\n        // Some other times, it returns the `<span>` with the inline decoration\n        if (hitResult.offsetNode.nodeType === hitResult.offsetNode.ELEMENT_NODE) {\n            const parent1 = hitResult.offsetNode.parentNode;\n            const parent1ClassName = parent1 && parent1.nodeType === parent1.ELEMENT_NODE ? parent1.className : null;\n            const parent2 = parent1 ? parent1.parentNode : null;\n            const parent2ClassName = parent2 && parent2.nodeType === parent2.ELEMENT_NODE ? parent2.className : null;\n            if (parent1ClassName === ViewLine.CLASS_NAME) {\n                // it returned the `<span>` of the line and the offset is the `<span>` with the inline decoration\n                const tokenSpan = hitResult.offsetNode.childNodes[Math.min(hitResult.offset, hitResult.offsetNode.childNodes.length - 1)];\n                if (tokenSpan) {\n                    return HitTestResult.createFromDOMInfo(ctx, tokenSpan, 0);\n                }\n            }\n            else if (parent2ClassName === ViewLine.CLASS_NAME) {\n                // it returned the `<span>` with the inline decoration\n                return HitTestResult.createFromDOMInfo(ctx, hitResult.offsetNode, 0);\n            }\n        }\n        return new UnknownHitTestResult(hitResult.offsetNode);\n    }\n    static _snapToSoftTabBoundary(position, viewModel) {\n        const lineContent = viewModel.getLineContent(position.lineNumber);\n        const { tabSize } = viewModel.model.getOptions();\n        const newPosition = AtomicTabMoveOperations.atomicPosition(lineContent, position.column - 1, tabSize, 2 /* Direction.Nearest */);\n        if (newPosition !== -1) {\n            return new Position(position.lineNumber, newPosition + 1);\n        }\n        return position;\n    }\n    static doHitTest(ctx, request) {\n        let result = new UnknownHitTestResult();\n        // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n        if (typeof ctx.viewDomNode.ownerDocument.caretRangeFromPoint === 'function') {\n            result = this._doHitTestWithCaretRangeFromPoint(ctx, request);\n            // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n        }\n        else if (ctx.viewDomNode.ownerDocument.caretPositionFromPoint) {\n            result = this._doHitTestWithCaretPositionFromPoint(ctx, request.pos.toClientCoordinates(getWindow(ctx.viewDomNode)));\n        }\n        if (result.type === 1 /* HitTestResultType.Content */) {\n            const injectedText = ctx.viewModel.getInjectedTextAt(result.position);\n            const normalizedPosition = ctx.viewModel.normalizePosition(result.position, 2 /* PositionAffinity.None */);\n            if (injectedText || !normalizedPosition.equals(result.position)) {\n                result = new ContentHitTestResult(normalizedPosition, result.spanNode, injectedText);\n            }\n        }\n        return result;\n    }\n}\nfunction shadowCaretRangeFromPoint(shadowRoot, x, y) {\n    const range = document.createRange();\n    // Get the element under the point\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    let el = shadowRoot.elementFromPoint(x, y);\n    // When el is not null, it may be div.monaco-mouse-cursor-text Element, which has not childNodes, we don't need to handle it.\n    if (el?.hasChildNodes()) {\n        // Get the last child of the element until its firstChild is a text node\n        // This assumes that the pointer is on the right of the line, out of the tokens\n        // and that we want to get the offset of the last token of the line\n        while (el && el.firstChild && el.firstChild.nodeType !== el.firstChild.TEXT_NODE && el.lastChild && el.lastChild.firstChild) {\n            el = el.lastChild;\n        }\n        // Grab its rect\n        const rect = el.getBoundingClientRect();\n        // And its font (the computed shorthand font property might be empty, see #3217)\n        const elWindow = getWindow(el);\n        const fontStyle = elWindow.getComputedStyle(el, null).getPropertyValue('font-style');\n        const fontVariant = elWindow.getComputedStyle(el, null).getPropertyValue('font-variant');\n        const fontWeight = elWindow.getComputedStyle(el, null).getPropertyValue('font-weight');\n        const fontSize = elWindow.getComputedStyle(el, null).getPropertyValue('font-size');\n        const lineHeight = elWindow.getComputedStyle(el, null).getPropertyValue('line-height');\n        const fontFamily = elWindow.getComputedStyle(el, null).getPropertyValue('font-family');\n        const font = `${fontStyle} ${fontVariant} ${fontWeight} ${fontSize}/${lineHeight} ${fontFamily}`;\n        // And also its txt content\n        const text = el.innerText;\n        // Position the pixel cursor at the left of the element\n        let pixelCursor = rect.left;\n        let offset = 0;\n        let step;\n        // If the point is on the right of the box put the cursor after the last character\n        if (x > rect.left + rect.width) {\n            offset = text.length;\n        }\n        else {\n            const charWidthReader = CharWidthReader.getInstance();\n            // Goes through all the characters of the innerText, and checks if the x of the point\n            // belongs to the character.\n            for (let i = 0; i < text.length + 1; i++) {\n                // The step is half the width of the character\n                step = charWidthReader.getCharWidth(text.charAt(i), font) / 2;\n                // Move to the center of the character\n                pixelCursor += step;\n                // If the x of the point is smaller that the position of the cursor, the point is over that character\n                if (x < pixelCursor) {\n                    offset = i;\n                    break;\n                }\n                // Move between the current character and the next\n                pixelCursor += step;\n            }\n        }\n        // Creates a range with the text node of the element and set the offset found\n        range.setStart(el.firstChild, offset);\n        range.setEnd(el.firstChild, offset);\n    }\n    return range;\n}\nclass CharWidthReader {\n    static { this._INSTANCE = null; }\n    static getInstance() {\n        if (!CharWidthReader._INSTANCE) {\n            CharWidthReader._INSTANCE = new CharWidthReader();\n        }\n        return CharWidthReader._INSTANCE;\n    }\n    constructor() {\n        this._cache = {};\n        this._canvas = document.createElement('canvas');\n    }\n    getCharWidth(char, font) {\n        const cacheKey = char + font;\n        if (this._cache[cacheKey]) {\n            return this._cache[cacheKey];\n        }\n        const context = this._canvas.getContext('2d');\n        context.font = font;\n        const metrics = context.measureText(char);\n        const width = metrics.width;\n        this._cache[cacheKey] = width;\n        return width;\n    }\n}\n\nexport { HitTestContext, MouseTarget, MouseTargetFactory, PointerHandlerLastRenderData };\n","function memoize(_target, key, descriptor) {\n    let fnKey = null;\n    let fn = null;\n    if (typeof descriptor.value === 'function') {\n        fnKey = 'value';\n        fn = descriptor.value;\n        if (fn.length !== 0) {\n            console.warn('Memoize should only be used in functions with zero parameters');\n        }\n    }\n    else if (typeof descriptor.get === 'function') {\n        fnKey = 'get';\n        fn = descriptor.get;\n    }\n    if (!fn) {\n        throw new Error('not supported');\n    }\n    const memoizeKey = `$memoize$${key}`;\n    descriptor[fnKey] = function (...args) {\n        if (!this.hasOwnProperty(memoizeKey)) {\n            Object.defineProperty(this, memoizeKey, {\n                configurable: false,\n                enumerable: false,\n                writable: false,\n                value: fn.apply(this, args)\n            });\n        }\n        // eslint-disable-next-line local/code-no-any-casts\n        return this[memoizeKey];\n    };\n}\n\nexport { memoize };\n","import { onDidRegisterWindow, addDisposableListener, scheduleAtNextAnimationFrame } from './dom.js';\nimport { mainWindow } from './window.js';\nimport { memoize } from '../common/decorators.js';\nimport { Event } from '../common/event.js';\nimport { Disposable, markAsSingleton, toDisposable } from '../common/lifecycle.js';\nimport { LinkedList } from '../common/linkedList.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar EventType;\n(function (EventType) {\n    EventType.Tap = '-monaco-gesturetap';\n    EventType.Change = '-monaco-gesturechange';\n    EventType.Start = '-monaco-gesturestart';\n    EventType.End = '-monaco-gesturesend';\n    EventType.Contextmenu = '-monaco-gesturecontextmenu';\n})(EventType || (EventType = {}));\nclass Gesture extends Disposable {\n    static { this.SCROLL_FRICTION = -5e-3; }\n    static { this.HOLD_DELAY = 700; }\n    static { this.CLEAR_TAP_COUNT_TIME = 400; } // ms\n    constructor() {\n        super();\n        this.dispatched = false;\n        this.targets = new LinkedList();\n        this.ignoreTargets = new LinkedList();\n        this.activeTouches = {};\n        this.handle = null;\n        this._lastSetTapCountTime = 0;\n        this._register(Event.runAndSubscribe(onDidRegisterWindow, ({ window, disposables }) => {\n            disposables.add(addDisposableListener(window.document, 'touchstart', (e) => this.onTouchStart(e), { passive: false }));\n            disposables.add(addDisposableListener(window.document, 'touchend', (e) => this.onTouchEnd(window, e)));\n            disposables.add(addDisposableListener(window.document, 'touchmove', (e) => this.onTouchMove(e), { passive: false }));\n        }, { window: mainWindow, disposables: this._store }));\n    }\n    static addTarget(element) {\n        if (!Gesture.isTouchDevice()) {\n            return Disposable.None;\n        }\n        if (!Gesture.INSTANCE) {\n            Gesture.INSTANCE = markAsSingleton(new Gesture());\n        }\n        const remove = Gesture.INSTANCE.targets.push(element);\n        return toDisposable(remove);\n    }\n    static ignoreTarget(element) {\n        if (!Gesture.isTouchDevice()) {\n            return Disposable.None;\n        }\n        if (!Gesture.INSTANCE) {\n            Gesture.INSTANCE = markAsSingleton(new Gesture());\n        }\n        const remove = Gesture.INSTANCE.ignoreTargets.push(element);\n        return toDisposable(remove);\n    }\n    static isTouchDevice() {\n        // `'ontouchstart' in window` always evaluates to true with typescript's modern typings. This causes `window` to be\n        // `never` later in `window.navigator`. That's why we need the explicit `window as Window` cast\n        return 'ontouchstart' in mainWindow || navigator.maxTouchPoints > 0;\n    }\n    dispose() {\n        if (this.handle) {\n            this.handle.dispose();\n            this.handle = null;\n        }\n        super.dispose();\n    }\n    onTouchStart(e) {\n        const timestamp = Date.now(); // use Date.now() because on FF e.timeStamp is not epoch based.\n        if (this.handle) {\n            this.handle.dispose();\n            this.handle = null;\n        }\n        for (let i = 0, len = e.targetTouches.length; i < len; i++) {\n            const touch = e.targetTouches.item(i);\n            this.activeTouches[touch.identifier] = {\n                id: touch.identifier,\n                initialTarget: touch.target,\n                initialTimeStamp: timestamp,\n                initialPageX: touch.pageX,\n                initialPageY: touch.pageY,\n                rollingTimestamps: [timestamp],\n                rollingPageX: [touch.pageX],\n                rollingPageY: [touch.pageY]\n            };\n            const evt = this.newGestureEvent(EventType.Start, touch.target);\n            evt.pageX = touch.pageX;\n            evt.pageY = touch.pageY;\n            this.dispatchEvent(evt);\n        }\n        if (this.dispatched) {\n            e.preventDefault();\n            e.stopPropagation();\n            this.dispatched = false;\n        }\n    }\n    onTouchEnd(targetWindow, e) {\n        const timestamp = Date.now(); // use Date.now() because on FF e.timeStamp is not epoch based.\n        const activeTouchCount = Object.keys(this.activeTouches).length;\n        for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n            const touch = e.changedTouches.item(i);\n            if (!this.activeTouches.hasOwnProperty(String(touch.identifier))) {\n                console.warn('move of an UNKNOWN touch', touch);\n                continue;\n            }\n            const data = this.activeTouches[touch.identifier], holdTime = Date.now() - data.initialTimeStamp;\n            if (holdTime < Gesture.HOLD_DELAY\n                && Math.abs(data.initialPageX - data.rollingPageX.at(-1)) < 30\n                && Math.abs(data.initialPageY - data.rollingPageY.at(-1)) < 30) {\n                const evt = this.newGestureEvent(EventType.Tap, data.initialTarget);\n                evt.pageX = data.rollingPageX.at(-1);\n                evt.pageY = data.rollingPageY.at(-1);\n                this.dispatchEvent(evt);\n            }\n            else if (holdTime >= Gesture.HOLD_DELAY\n                && Math.abs(data.initialPageX - data.rollingPageX.at(-1)) < 30\n                && Math.abs(data.initialPageY - data.rollingPageY.at(-1)) < 30) {\n                const evt = this.newGestureEvent(EventType.Contextmenu, data.initialTarget);\n                evt.pageX = data.rollingPageX.at(-1);\n                evt.pageY = data.rollingPageY.at(-1);\n                this.dispatchEvent(evt);\n            }\n            else if (activeTouchCount === 1) {\n                const finalX = data.rollingPageX.at(-1);\n                const finalY = data.rollingPageY.at(-1);\n                const deltaT = data.rollingTimestamps.at(-1) - data.rollingTimestamps[0];\n                const deltaX = finalX - data.rollingPageX[0];\n                const deltaY = finalY - data.rollingPageY[0];\n                // We need to get all the dispatch targets on the start of the inertia event\n                const dispatchTo = [...this.targets].filter(t => data.initialTarget instanceof Node && t.contains(data.initialTarget));\n                this.inertia(targetWindow, dispatchTo, timestamp, // time now\n                Math.abs(deltaX) / deltaT, // speed\n                deltaX > 0 ? 1 : -1, // x direction\n                finalX, // x now\n                Math.abs(deltaY) / deltaT, // y speed\n                deltaY > 0 ? 1 : -1, // y direction\n                finalY // y now\n                );\n            }\n            this.dispatchEvent(this.newGestureEvent(EventType.End, data.initialTarget));\n            // forget about this touch\n            delete this.activeTouches[touch.identifier];\n        }\n        if (this.dispatched) {\n            e.preventDefault();\n            e.stopPropagation();\n            this.dispatched = false;\n        }\n    }\n    newGestureEvent(type, initialTarget) {\n        const event = document.createEvent('CustomEvent');\n        event.initEvent(type, false, true);\n        event.initialTarget = initialTarget;\n        event.tapCount = 0;\n        return event;\n    }\n    dispatchEvent(event) {\n        if (event.type === EventType.Tap) {\n            const currentTime = (new Date()).getTime();\n            let setTapCount = 0;\n            if (currentTime - this._lastSetTapCountTime > Gesture.CLEAR_TAP_COUNT_TIME) {\n                setTapCount = 1;\n            }\n            else {\n                setTapCount = 2;\n            }\n            this._lastSetTapCountTime = currentTime;\n            event.tapCount = setTapCount;\n        }\n        else if (event.type === EventType.Change || event.type === EventType.Contextmenu) {\n            // tap is canceled by scrolling or context menu\n            this._lastSetTapCountTime = 0;\n        }\n        if (event.initialTarget instanceof Node) {\n            for (const ignoreTarget of this.ignoreTargets) {\n                if (ignoreTarget.contains(event.initialTarget)) {\n                    return;\n                }\n            }\n            const targets = [];\n            for (const target of this.targets) {\n                if (target.contains(event.initialTarget)) {\n                    let depth = 0;\n                    let now = event.initialTarget;\n                    while (now && now !== target) {\n                        depth++;\n                        now = now.parentElement;\n                    }\n                    targets.push([depth, target]);\n                }\n            }\n            targets.sort((a, b) => a[0] - b[0]);\n            for (const [_, target] of targets) {\n                target.dispatchEvent(event);\n                this.dispatched = true;\n            }\n        }\n    }\n    inertia(targetWindow, dispatchTo, t1, vX, dirX, x, vY, dirY, y) {\n        this.handle = scheduleAtNextAnimationFrame(targetWindow, () => {\n            const now = Date.now();\n            // velocity: old speed + accel_over_time\n            const deltaT = now - t1;\n            let delta_pos_x = 0, delta_pos_y = 0;\n            let stopped = true;\n            vX += Gesture.SCROLL_FRICTION * deltaT;\n            vY += Gesture.SCROLL_FRICTION * deltaT;\n            if (vX > 0) {\n                stopped = false;\n                delta_pos_x = dirX * vX * deltaT;\n            }\n            if (vY > 0) {\n                stopped = false;\n                delta_pos_y = dirY * vY * deltaT;\n            }\n            // dispatch translation event\n            const evt = this.newGestureEvent(EventType.Change);\n            evt.translationX = delta_pos_x;\n            evt.translationY = delta_pos_y;\n            dispatchTo.forEach(d => d.dispatchEvent(evt));\n            if (!stopped) {\n                this.inertia(targetWindow, dispatchTo, now, vX, dirX, x + delta_pos_x, vY, dirY, y + delta_pos_y);\n            }\n        });\n    }\n    onTouchMove(e) {\n        const timestamp = Date.now(); // use Date.now() because on FF e.timeStamp is not epoch based.\n        for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n            const touch = e.changedTouches.item(i);\n            if (!this.activeTouches.hasOwnProperty(String(touch.identifier))) {\n                console.warn('end of an UNKNOWN touch', touch);\n                continue;\n            }\n            const data = this.activeTouches[touch.identifier];\n            const evt = this.newGestureEvent(EventType.Change, data.initialTarget);\n            evt.translationX = touch.pageX - data.rollingPageX.at(-1);\n            evt.translationY = touch.pageY - data.rollingPageY.at(-1);\n            evt.pageX = touch.pageX;\n            evt.pageY = touch.pageY;\n            this.dispatchEvent(evt);\n            // only keep a few data points, to average the final speed\n            if (data.rollingPageX.length > 3) {\n                data.rollingPageX.shift();\n                data.rollingPageY.shift();\n                data.rollingTimestamps.shift();\n            }\n            data.rollingPageX.push(touch.pageX);\n            data.rollingPageY.push(touch.pageY);\n            data.rollingTimestamps.push(timestamp);\n        }\n        if (this.dispatched) {\n            e.preventDefault();\n            e.stopPropagation();\n            this.dispatched = false;\n        }\n    }\n}\n__decorate([\n    memoize\n], Gesture, \"isTouchDevice\", null);\n\nexport { EventType, Gesture };\n","import { addDisposableListener, getWindow, EventType } from '../dom.js';\nimport { StandardKeyboardEvent } from '../keyboardEvent.js';\nimport { StandardMouseEvent } from '../mouseEvent.js';\nimport { Gesture } from '../touch.js';\nimport { Disposable } from '../../common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass Widget extends Disposable {\n    onclick(domNode, listener) {\n        this._register(addDisposableListener(domNode, EventType.CLICK, (e) => listener(new StandardMouseEvent(getWindow(domNode), e))));\n    }\n    onmousedown(domNode, listener) {\n        this._register(addDisposableListener(domNode, EventType.MOUSE_DOWN, (e) => listener(new StandardMouseEvent(getWindow(domNode), e))));\n    }\n    onmouseover(domNode, listener) {\n        this._register(addDisposableListener(domNode, EventType.MOUSE_OVER, (e) => listener(new StandardMouseEvent(getWindow(domNode), e))));\n    }\n    onmouseleave(domNode, listener) {\n        this._register(addDisposableListener(domNode, EventType.MOUSE_LEAVE, (e) => listener(new StandardMouseEvent(getWindow(domNode), e))));\n    }\n    onkeydown(domNode, listener) {\n        this._register(addDisposableListener(domNode, EventType.KEY_DOWN, (e) => listener(new StandardKeyboardEvent(e))));\n    }\n    onkeyup(domNode, listener) {\n        this._register(addDisposableListener(domNode, EventType.KEY_UP, (e) => listener(new StandardKeyboardEvent(e))));\n    }\n    oninput(domNode, listener) {\n        this._register(addDisposableListener(domNode, EventType.INPUT, listener));\n    }\n    onblur(domNode, listener) {\n        this._register(addDisposableListener(domNode, EventType.BLUR, listener));\n    }\n    onfocus(domNode, listener) {\n        this._register(addDisposableListener(domNode, EventType.FOCUS, listener));\n    }\n    ignoreGesture(domNode) {\n        return Gesture.ignoreTarget(domNode);\n    }\n}\n\nexport { Widget };\n","import { GlobalPointerMoveMonitor } from '../../globalPointerMoveMonitor.js';\nimport { Widget } from '../widget.js';\nimport { TimeoutTimer } from '../../../common/async.js';\nimport { ThemeIcon } from '../../../common/themables.js';\nimport { addStandardDisposableListener, EventType, WindowIntervalTimer, getWindow } from '../../dom.js';\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/**\n * The arrow image size.\n */\nconst ARROW_IMG_SIZE = 11;\nclass ScrollbarArrow extends Widget {\n    constructor(opts) {\n        super();\n        this._onActivate = opts.onActivate;\n        this.bgDomNode = document.createElement('div');\n        this.bgDomNode.className = 'arrow-background';\n        this.bgDomNode.style.position = 'absolute';\n        this.bgDomNode.style.width = opts.bgWidth + 'px';\n        this.bgDomNode.style.height = opts.bgHeight + 'px';\n        if (typeof opts.top !== 'undefined') {\n            this.bgDomNode.style.top = '0px';\n        }\n        if (typeof opts.left !== 'undefined') {\n            this.bgDomNode.style.left = '0px';\n        }\n        if (typeof opts.bottom !== 'undefined') {\n            this.bgDomNode.style.bottom = '0px';\n        }\n        if (typeof opts.right !== 'undefined') {\n            this.bgDomNode.style.right = '0px';\n        }\n        this.domNode = document.createElement('div');\n        this.domNode.className = opts.className;\n        this.domNode.classList.add(...ThemeIcon.asClassNameArray(opts.icon));\n        this.domNode.style.position = 'absolute';\n        this.domNode.style.width = ARROW_IMG_SIZE + 'px';\n        this.domNode.style.height = ARROW_IMG_SIZE + 'px';\n        if (typeof opts.top !== 'undefined') {\n            this.domNode.style.top = opts.top + 'px';\n        }\n        if (typeof opts.left !== 'undefined') {\n            this.domNode.style.left = opts.left + 'px';\n        }\n        if (typeof opts.bottom !== 'undefined') {\n            this.domNode.style.bottom = opts.bottom + 'px';\n        }\n        if (typeof opts.right !== 'undefined') {\n            this.domNode.style.right = opts.right + 'px';\n        }\n        this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n        this._register(addStandardDisposableListener(this.bgDomNode, EventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n        this._register(addStandardDisposableListener(this.domNode, EventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n        this._pointerdownRepeatTimer = this._register(new WindowIntervalTimer());\n        this._pointerdownScheduleRepeatTimer = this._register(new TimeoutTimer());\n    }\n    _arrowPointerDown(e) {\n        if (!e.target || !(e.target instanceof Element)) {\n            return;\n        }\n        const scheduleRepeater = () => {\n            this._pointerdownRepeatTimer.cancelAndSet(() => this._onActivate(), 1000 / 24, getWindow(e));\n        };\n        this._onActivate();\n        this._pointerdownRepeatTimer.cancel();\n        this._pointerdownScheduleRepeatTimer.cancelAndSet(scheduleRepeater, 200);\n        this._pointerMoveMonitor.startMonitoring(e.target, e.pointerId, e.buttons, (pointerMoveData) => { }, () => {\n            this._pointerdownRepeatTimer.cancel();\n            this._pointerdownScheduleRepeatTimer.cancel();\n        });\n        e.preventDefault();\n    }\n}\n\nexport { ARROW_IMG_SIZE, ScrollbarArrow };\n","import { TimeoutTimer } from '../../../common/async.js';\nimport { Disposable } from '../../../common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ScrollbarVisibilityController extends Disposable {\n    constructor(visibility, visibleClassName, invisibleClassName) {\n        super();\n        this._visibility = visibility;\n        this._visibleClassName = visibleClassName;\n        this._invisibleClassName = invisibleClassName;\n        this._domNode = null;\n        this._isVisible = false;\n        this._isNeeded = false;\n        this._rawShouldBeVisible = false;\n        this._shouldBeVisible = false;\n        this._revealTimer = this._register(new TimeoutTimer());\n    }\n    setVisibility(visibility) {\n        if (this._visibility !== visibility) {\n            this._visibility = visibility;\n            this._updateShouldBeVisible();\n        }\n    }\n    // ----------------- Hide / Reveal\n    setShouldBeVisible(rawShouldBeVisible) {\n        this._rawShouldBeVisible = rawShouldBeVisible;\n        this._updateShouldBeVisible();\n    }\n    _applyVisibilitySetting() {\n        if (this._visibility === 2 /* ScrollbarVisibility.Hidden */) {\n            return false;\n        }\n        if (this._visibility === 3 /* ScrollbarVisibility.Visible */) {\n            return true;\n        }\n        return this._rawShouldBeVisible;\n    }\n    _updateShouldBeVisible() {\n        const shouldBeVisible = this._applyVisibilitySetting();\n        if (this._shouldBeVisible !== shouldBeVisible) {\n            this._shouldBeVisible = shouldBeVisible;\n            this.ensureVisibility();\n        }\n    }\n    setIsNeeded(isNeeded) {\n        if (this._isNeeded !== isNeeded) {\n            this._isNeeded = isNeeded;\n            this.ensureVisibility();\n        }\n    }\n    setDomNode(domNode) {\n        this._domNode = domNode;\n        this._domNode.setClassName(this._invisibleClassName);\n        // Now that the flags & the dom node are in a consistent state, ensure the Hidden/Visible configuration\n        this.setShouldBeVisible(false);\n    }\n    ensureVisibility() {\n        if (!this._isNeeded) {\n            // Nothing to be rendered\n            this._hide(false);\n            return;\n        }\n        if (this._shouldBeVisible) {\n            this._reveal();\n        }\n        else {\n            this._hide(true);\n        }\n    }\n    _reveal() {\n        if (this._isVisible) {\n            return;\n        }\n        this._isVisible = true;\n        // The CSS animation doesn't play otherwise\n        this._revealTimer.setIfNotSet(() => {\n            this._domNode?.setClassName(this._visibleClassName);\n        }, 0);\n    }\n    _hide(withFadeAway) {\n        this._revealTimer.cancel();\n        if (!this._isVisible) {\n            return;\n        }\n        this._isVisible = false;\n        this._domNode?.setClassName(this._invisibleClassName + (withFadeAway ? ' fade' : ''));\n    }\n}\n\nexport { ScrollbarVisibilityController };\n","import { addDisposableListener, EventType, getDomNodePagePosition } from '../../dom.js';\nimport { createFastDomNode } from '../../fastDomNode.js';\nimport { GlobalPointerMoveMonitor } from '../../globalPointerMoveMonitor.js';\nimport { ScrollbarArrow } from './scrollbarArrow.js';\nimport { ScrollbarVisibilityController } from './scrollbarVisibilityController.js';\nimport { Widget } from '../widget.js';\nimport { isWindows } from '../../../common/platform.js';\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/**\n * The orthogonal distance to the slider at which dragging \"resets\". This implements \"snapping\"\n */\nconst POINTER_DRAG_RESET_DISTANCE = 140;\nclass AbstractScrollbar extends Widget {\n    constructor(opts) {\n        super();\n        this._lazyRender = opts.lazyRender;\n        this._host = opts.host;\n        this._scrollable = opts.scrollable;\n        this._scrollByPage = opts.scrollByPage;\n        this._scrollbarState = opts.scrollbarState;\n        this._visibilityController = this._register(new ScrollbarVisibilityController(opts.visibility, 'visible scrollbar ' + opts.extraScrollbarClassName, 'invisible scrollbar ' + opts.extraScrollbarClassName));\n        this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n        this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n        this._shouldRender = true;\n        this.domNode = createFastDomNode(document.createElement('div'));\n        this.domNode.setAttribute('role', 'presentation');\n        this.domNode.setAttribute('aria-hidden', 'true');\n        this._visibilityController.setDomNode(this.domNode);\n        this.domNode.setPosition('absolute');\n        this._register(addDisposableListener(this.domNode.domNode, EventType.POINTER_DOWN, (e) => this._domNodePointerDown(e)));\n    }\n    // ----------------- creation\n    /**\n     * Creates the dom node for an arrow & adds it to the container\n     */\n    _createArrow(opts) {\n        const arrow = this._register(new ScrollbarArrow(opts));\n        this.domNode.domNode.appendChild(arrow.bgDomNode);\n        this.domNode.domNode.appendChild(arrow.domNode);\n    }\n    /**\n     * Creates the slider dom node, adds it to the container & hooks up the events\n     */\n    _createSlider(top, left, width, height) {\n        this.slider = createFastDomNode(document.createElement('div'));\n        this.slider.setClassName('slider');\n        this.slider.setPosition('absolute');\n        this.slider.setTop(top);\n        this.slider.setLeft(left);\n        if (typeof width === 'number') {\n            this.slider.setWidth(width);\n        }\n        if (typeof height === 'number') {\n            this.slider.setHeight(height);\n        }\n        this.slider.setLayerHinting(true);\n        this.slider.setContain('strict');\n        this.domNode.domNode.appendChild(this.slider.domNode);\n        this._register(addDisposableListener(this.slider.domNode, EventType.POINTER_DOWN, (e) => {\n            if (e.button === 0) {\n                e.preventDefault();\n                this._sliderPointerDown(e);\n            }\n        }));\n        this.onclick(this.slider.domNode, e => {\n            if (e.leftButton) {\n                e.stopPropagation();\n            }\n        });\n    }\n    // ----------------- Update state\n    _onElementSize(visibleSize) {\n        if (this._scrollbarState.setVisibleSize(visibleSize)) {\n            this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n            this._shouldRender = true;\n            if (!this._lazyRender) {\n                this.render();\n            }\n        }\n        return this._shouldRender;\n    }\n    _onElementScrollSize(elementScrollSize) {\n        if (this._scrollbarState.setScrollSize(elementScrollSize)) {\n            this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n            this._shouldRender = true;\n            if (!this._lazyRender) {\n                this.render();\n            }\n        }\n        return this._shouldRender;\n    }\n    _onElementScrollPosition(elementScrollPosition) {\n        if (this._scrollbarState.setScrollPosition(elementScrollPosition)) {\n            this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n            this._shouldRender = true;\n            if (!this._lazyRender) {\n                this.render();\n            }\n        }\n        return this._shouldRender;\n    }\n    // ----------------- rendering\n    beginReveal() {\n        this._visibilityController.setShouldBeVisible(true);\n    }\n    beginHide() {\n        this._visibilityController.setShouldBeVisible(false);\n    }\n    render() {\n        if (!this._shouldRender) {\n            return;\n        }\n        this._shouldRender = false;\n        this._renderDomNode(this._scrollbarState.getRectangleLargeSize(), this._scrollbarState.getRectangleSmallSize());\n        this._updateSlider(this._scrollbarState.getSliderSize(), this._scrollbarState.getArrowSize() + this._scrollbarState.getSliderPosition());\n    }\n    // ----------------- DOM events\n    _domNodePointerDown(e) {\n        if (e.target !== this.domNode.domNode) {\n            return;\n        }\n        this._onPointerDown(e);\n    }\n    delegatePointerDown(e) {\n        const domTop = this.domNode.domNode.getClientRects()[0].top;\n        const sliderStart = domTop + this._scrollbarState.getSliderPosition();\n        const sliderStop = domTop + this._scrollbarState.getSliderPosition() + this._scrollbarState.getSliderSize();\n        const pointerPos = this._sliderPointerPosition(e);\n        if (sliderStart <= pointerPos && pointerPos <= sliderStop) {\n            // Act as if it was a pointer down on the slider\n            if (e.button === 0) {\n                e.preventDefault();\n                this._sliderPointerDown(e);\n            }\n        }\n        else {\n            // Act as if it was a pointer down on the scrollbar\n            this._onPointerDown(e);\n        }\n    }\n    _onPointerDown(e) {\n        let offsetX;\n        let offsetY;\n        if (e.target === this.domNode.domNode && typeof e.offsetX === 'number' && typeof e.offsetY === 'number') {\n            offsetX = e.offsetX;\n            offsetY = e.offsetY;\n        }\n        else {\n            const domNodePosition = getDomNodePagePosition(this.domNode.domNode);\n            offsetX = e.pageX - domNodePosition.left;\n            offsetY = e.pageY - domNodePosition.top;\n        }\n        const isMouse = (e.pointerType === 'mouse');\n        const isLeftClick = (e.button === 0);\n        if (isLeftClick || !isMouse) {\n            const offset = this._pointerDownRelativePosition(offsetX, offsetY);\n            this._setDesiredScrollPositionNow(this._scrollByPage\n                ? this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(offset)\n                : this._scrollbarState.getDesiredScrollPositionFromOffset(offset));\n        }\n        if (isLeftClick) {\n            // left button\n            e.preventDefault();\n            this._sliderPointerDown(e);\n        }\n    }\n    _sliderPointerDown(e) {\n        if (!e.target || !(e.target instanceof Element)) {\n            return;\n        }\n        const initialPointerPosition = this._sliderPointerPosition(e);\n        const initialPointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(e);\n        const initialScrollbarState = this._scrollbarState.clone();\n        this.slider.toggleClassName('active', true);\n        this._pointerMoveMonitor.startMonitoring(e.target, e.pointerId, e.buttons, (pointerMoveData) => {\n            const pointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(pointerMoveData);\n            const pointerOrthogonalDelta = Math.abs(pointerOrthogonalPosition - initialPointerOrthogonalPosition);\n            if (isWindows && pointerOrthogonalDelta > POINTER_DRAG_RESET_DISTANCE) {\n                // The pointer has wondered away from the scrollbar => reset dragging\n                this._setDesiredScrollPositionNow(initialScrollbarState.getScrollPosition());\n                return;\n            }\n            const pointerPosition = this._sliderPointerPosition(pointerMoveData);\n            const pointerDelta = pointerPosition - initialPointerPosition;\n            this._setDesiredScrollPositionNow(initialScrollbarState.getDesiredScrollPositionFromDelta(pointerDelta));\n        }, () => {\n            this.slider.toggleClassName('active', false);\n            this._host.onDragEnd();\n        });\n        this._host.onDragStart();\n    }\n    _setDesiredScrollPositionNow(_desiredScrollPosition) {\n        const desiredScrollPosition = {};\n        this.writeScrollPosition(desiredScrollPosition, _desiredScrollPosition);\n        this._scrollable.setScrollPositionNow(desiredScrollPosition);\n    }\n    updateScrollbarSize(scrollbarSize) {\n        this._updateScrollbarSize(scrollbarSize);\n        this._scrollbarState.setScrollbarSize(scrollbarSize);\n        this._shouldRender = true;\n        if (!this._lazyRender) {\n            this.render();\n        }\n    }\n    isNeeded() {\n        return this._scrollbarState.isNeeded();\n    }\n}\n\nexport { AbstractScrollbar };\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/**\n * The minimal size of the slider (such that it can still be clickable) -- it is artificially enlarged.\n */\nconst MINIMUM_SLIDER_SIZE = 20;\nclass ScrollbarState {\n    constructor(arrowSize, scrollbarSize, oppositeScrollbarSize, visibleSize, scrollSize, scrollPosition) {\n        this._scrollbarSize = Math.round(scrollbarSize);\n        this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n        this._arrowSize = Math.round(arrowSize);\n        this._visibleSize = visibleSize;\n        this._scrollSize = scrollSize;\n        this._scrollPosition = scrollPosition;\n        this._computedAvailableSize = 0;\n        this._computedIsNeeded = false;\n        this._computedSliderSize = 0;\n        this._computedSliderRatio = 0;\n        this._computedSliderPosition = 0;\n        this._refreshComputedValues();\n    }\n    clone() {\n        return new ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n    }\n    setVisibleSize(visibleSize) {\n        const iVisibleSize = Math.round(visibleSize);\n        if (this._visibleSize !== iVisibleSize) {\n            this._visibleSize = iVisibleSize;\n            this._refreshComputedValues();\n            return true;\n        }\n        return false;\n    }\n    setScrollSize(scrollSize) {\n        const iScrollSize = Math.round(scrollSize);\n        if (this._scrollSize !== iScrollSize) {\n            this._scrollSize = iScrollSize;\n            this._refreshComputedValues();\n            return true;\n        }\n        return false;\n    }\n    setScrollPosition(scrollPosition) {\n        const iScrollPosition = Math.round(scrollPosition);\n        if (this._scrollPosition !== iScrollPosition) {\n            this._scrollPosition = iScrollPosition;\n            this._refreshComputedValues();\n            return true;\n        }\n        return false;\n    }\n    setScrollbarSize(scrollbarSize) {\n        this._scrollbarSize = Math.round(scrollbarSize);\n    }\n    setOppositeScrollbarSize(oppositeScrollbarSize) {\n        this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n    }\n    static _computeValues(oppositeScrollbarSize, arrowSize, visibleSize, scrollSize, scrollPosition) {\n        const computedAvailableSize = Math.max(0, visibleSize - oppositeScrollbarSize);\n        const computedRepresentableSize = Math.max(0, computedAvailableSize - 2 * arrowSize);\n        const computedIsNeeded = (scrollSize > 0 && scrollSize > visibleSize);\n        if (!computedIsNeeded) {\n            // There is no need for a slider\n            return {\n                computedAvailableSize: Math.round(computedAvailableSize),\n                computedIsNeeded: computedIsNeeded,\n                computedSliderSize: Math.round(computedRepresentableSize),\n                computedSliderRatio: 0,\n                computedSliderPosition: 0,\n            };\n        }\n        // We must artificially increase the size of the slider if needed, since the slider would be too small to grab with the mouse otherwise\n        const computedSliderSize = Math.round(Math.max(MINIMUM_SLIDER_SIZE, Math.floor(visibleSize * computedRepresentableSize / scrollSize)));\n        // The slider can move from 0 to `computedRepresentableSize` - `computedSliderSize`\n        // in the same way `scrollPosition` can move from 0 to `scrollSize` - `visibleSize`.\n        const computedSliderRatio = (computedRepresentableSize - computedSliderSize) / (scrollSize - visibleSize);\n        const computedSliderPosition = (scrollPosition * computedSliderRatio);\n        return {\n            computedAvailableSize: Math.round(computedAvailableSize),\n            computedIsNeeded: computedIsNeeded,\n            computedSliderSize: Math.round(computedSliderSize),\n            computedSliderRatio: computedSliderRatio,\n            computedSliderPosition: Math.round(computedSliderPosition),\n        };\n    }\n    _refreshComputedValues() {\n        const r = ScrollbarState._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n        this._computedAvailableSize = r.computedAvailableSize;\n        this._computedIsNeeded = r.computedIsNeeded;\n        this._computedSliderSize = r.computedSliderSize;\n        this._computedSliderRatio = r.computedSliderRatio;\n        this._computedSliderPosition = r.computedSliderPosition;\n    }\n    getArrowSize() {\n        return this._arrowSize;\n    }\n    getScrollPosition() {\n        return this._scrollPosition;\n    }\n    getRectangleLargeSize() {\n        return this._computedAvailableSize;\n    }\n    getRectangleSmallSize() {\n        return this._scrollbarSize;\n    }\n    isNeeded() {\n        return this._computedIsNeeded;\n    }\n    getSliderSize() {\n        return this._computedSliderSize;\n    }\n    getSliderPosition() {\n        return this._computedSliderPosition;\n    }\n    /**\n     * Compute a desired `scrollPosition` such that `offset` ends up in the center of the slider.\n     * `offset` is based on the same coordinate system as the `sliderPosition`.\n     */\n    getDesiredScrollPositionFromOffset(offset) {\n        if (!this._computedIsNeeded) {\n            // no need for a slider\n            return 0;\n        }\n        const desiredSliderPosition = offset - this._arrowSize - this._computedSliderSize / 2;\n        return Math.round(desiredSliderPosition / this._computedSliderRatio);\n    }\n    /**\n     * Compute a desired `scrollPosition` from if offset is before or after the slider position.\n     * If offset is before slider, treat as a page up (or left).  If after, page down (or right).\n     * `offset` and `_computedSliderPosition` are based on the same coordinate system.\n     * `_visibleSize` corresponds to a \"page\" of lines in the returned coordinate system.\n     */\n    getDesiredScrollPositionFromOffsetPaged(offset) {\n        if (!this._computedIsNeeded) {\n            // no need for a slider\n            return 0;\n        }\n        const correctedOffset = offset - this._arrowSize; // compensate if has arrows\n        let desiredScrollPosition = this._scrollPosition;\n        if (correctedOffset < this._computedSliderPosition) {\n            desiredScrollPosition -= this._visibleSize; // page up/left\n        }\n        else {\n            desiredScrollPosition += this._visibleSize; // page down/right\n        }\n        return desiredScrollPosition;\n    }\n    /**\n     * Compute a desired `scrollPosition` such that the slider moves by `delta`.\n     */\n    getDesiredScrollPositionFromDelta(delta) {\n        if (!this._computedIsNeeded) {\n            // no need for a slider\n            return 0;\n        }\n        const desiredSliderPosition = this._computedSliderPosition + delta;\n        return Math.round(desiredSliderPosition / this._computedSliderRatio);\n    }\n}\n\nexport { ScrollbarState };\n","import { StandardWheelEvent } from '../../mouseEvent.js';\nimport { AbstractScrollbar } from './abstractScrollbar.js';\nimport { ARROW_IMG_SIZE } from './scrollbarArrow.js';\nimport { ScrollbarState } from './scrollbarState.js';\nimport { Codicon } from '../../../common/codicons.js';\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 *--------------------------------------------------------------------------------------------*/\nclass HorizontalScrollbar extends AbstractScrollbar {\n    constructor(scrollable, options, host) {\n        const scrollDimensions = scrollable.getScrollDimensions();\n        const scrollPosition = scrollable.getCurrentScrollPosition();\n        super({\n            lazyRender: options.lazyRender,\n            host: host,\n            scrollbarState: new ScrollbarState((options.horizontalHasArrows ? options.arrowSize : 0), (options.horizontal === 2 /* ScrollbarVisibility.Hidden */ ? 0 : options.horizontalScrollbarSize), (options.vertical === 2 /* ScrollbarVisibility.Hidden */ ? 0 : options.verticalScrollbarSize), scrollDimensions.width, scrollDimensions.scrollWidth, scrollPosition.scrollLeft),\n            visibility: options.horizontal,\n            extraScrollbarClassName: 'horizontal',\n            scrollable: scrollable,\n            scrollByPage: options.scrollByPage\n        });\n        if (options.horizontalHasArrows) {\n            const arrowDelta = (options.arrowSize - ARROW_IMG_SIZE) / 2;\n            const scrollbarDelta = (options.horizontalScrollbarSize - ARROW_IMG_SIZE) / 2;\n            this._createArrow({\n                className: 'scra',\n                icon: Codicon.scrollbarButtonLeft,\n                top: scrollbarDelta,\n                left: arrowDelta,\n                bottom: undefined,\n                right: undefined,\n                bgWidth: options.arrowSize,\n                bgHeight: options.horizontalScrollbarSize,\n                onActivate: () => this._host.onMouseWheel(new StandardWheelEvent(null, 1, 0)),\n            });\n            this._createArrow({\n                className: 'scra',\n                icon: Codicon.scrollbarButtonRight,\n                top: scrollbarDelta,\n                left: undefined,\n                bottom: undefined,\n                right: arrowDelta,\n                bgWidth: options.arrowSize,\n                bgHeight: options.horizontalScrollbarSize,\n                onActivate: () => this._host.onMouseWheel(new StandardWheelEvent(null, -1, 0)),\n            });\n        }\n        this._createSlider(Math.floor((options.horizontalScrollbarSize - options.horizontalSliderSize) / 2), 0, undefined, options.horizontalSliderSize);\n    }\n    _updateSlider(sliderSize, sliderPosition) {\n        this.slider.setWidth(sliderSize);\n        this.slider.setLeft(sliderPosition);\n    }\n    _renderDomNode(largeSize, smallSize) {\n        this.domNode.setWidth(largeSize);\n        this.domNode.setHeight(smallSize);\n        this.domNode.setLeft(0);\n        this.domNode.setBottom(0);\n    }\n    onDidScroll(e) {\n        this._shouldRender = this._onElementScrollSize(e.scrollWidth) || this._shouldRender;\n        this._shouldRender = this._onElementScrollPosition(e.scrollLeft) || this._shouldRender;\n        this._shouldRender = this._onElementSize(e.width) || this._shouldRender;\n        return this._shouldRender;\n    }\n    _pointerDownRelativePosition(offsetX, offsetY) {\n        return offsetX;\n    }\n    _sliderPointerPosition(e) {\n        return e.pageX;\n    }\n    _sliderOrthogonalPointerPosition(e) {\n        return e.pageY;\n    }\n    _updateScrollbarSize(size) {\n        this.slider.setHeight(size);\n    }\n    writeScrollPosition(target, scrollPosition) {\n        target.scrollLeft = scrollPosition;\n    }\n    updateOptions(options) {\n        this.updateScrollbarSize(options.horizontal === 2 /* ScrollbarVisibility.Hidden */ ? 0 : options.horizontalScrollbarSize);\n        this._scrollbarState.setOppositeScrollbarSize(options.vertical === 2 /* ScrollbarVisibility.Hidden */ ? 0 : options.verticalScrollbarSize);\n        this._visibilityController.setVisibility(options.horizontal);\n        this._scrollByPage = options.scrollByPage;\n    }\n}\n\nexport { HorizontalScrollbar };\n","import { StandardWheelEvent } from '../../mouseEvent.js';\nimport { AbstractScrollbar } from './abstractScrollbar.js';\nimport { ARROW_IMG_SIZE } from './scrollbarArrow.js';\nimport { ScrollbarState } from './scrollbarState.js';\nimport { Codicon } from '../../../common/codicons.js';\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 *--------------------------------------------------------------------------------------------*/\nclass VerticalScrollbar extends AbstractScrollbar {\n    constructor(scrollable, options, host) {\n        const scrollDimensions = scrollable.getScrollDimensions();\n        const scrollPosition = scrollable.getCurrentScrollPosition();\n        super({\n            lazyRender: options.lazyRender,\n            host: host,\n            scrollbarState: new ScrollbarState((options.verticalHasArrows ? options.arrowSize : 0), (options.vertical === 2 /* ScrollbarVisibility.Hidden */ ? 0 : options.verticalScrollbarSize), \n            // give priority to vertical scroll bar over horizontal and let it scroll all the way to the bottom\n            0, scrollDimensions.height, scrollDimensions.scrollHeight, scrollPosition.scrollTop),\n            visibility: options.vertical,\n            extraScrollbarClassName: 'vertical',\n            scrollable: scrollable,\n            scrollByPage: options.scrollByPage\n        });\n        if (options.verticalHasArrows) {\n            const arrowDelta = (options.arrowSize - ARROW_IMG_SIZE) / 2;\n            const scrollbarDelta = (options.verticalScrollbarSize - ARROW_IMG_SIZE) / 2;\n            this._createArrow({\n                className: 'scra',\n                icon: Codicon.scrollbarButtonUp,\n                top: arrowDelta,\n                left: scrollbarDelta,\n                bottom: undefined,\n                right: undefined,\n                bgWidth: options.verticalScrollbarSize,\n                bgHeight: options.arrowSize,\n                onActivate: () => this._host.onMouseWheel(new StandardWheelEvent(null, 0, 1)),\n            });\n            this._createArrow({\n                className: 'scra',\n                icon: Codicon.scrollbarButtonDown,\n                top: undefined,\n                left: scrollbarDelta,\n                bottom: arrowDelta,\n                right: undefined,\n                bgWidth: options.verticalScrollbarSize,\n                bgHeight: options.arrowSize,\n                onActivate: () => this._host.onMouseWheel(new StandardWheelEvent(null, 0, -1)),\n            });\n        }\n        this._createSlider(0, Math.floor((options.verticalScrollbarSize - options.verticalSliderSize) / 2), options.verticalSliderSize, undefined);\n    }\n    _updateSlider(sliderSize, sliderPosition) {\n        this.slider.setHeight(sliderSize);\n        this.slider.setTop(sliderPosition);\n    }\n    _renderDomNode(largeSize, smallSize) {\n        this.domNode.setWidth(smallSize);\n        this.domNode.setHeight(largeSize);\n        this.domNode.setRight(0);\n        this.domNode.setTop(0);\n    }\n    onDidScroll(e) {\n        this._shouldRender = this._onElementScrollSize(e.scrollHeight) || this._shouldRender;\n        this._shouldRender = this._onElementScrollPosition(e.scrollTop) || this._shouldRender;\n        this._shouldRender = this._onElementSize(e.height) || this._shouldRender;\n        return this._shouldRender;\n    }\n    _pointerDownRelativePosition(offsetX, offsetY) {\n        return offsetY;\n    }\n    _sliderPointerPosition(e) {\n        return e.pageY;\n    }\n    _sliderOrthogonalPointerPosition(e) {\n        return e.pageX;\n    }\n    _updateScrollbarSize(size) {\n        this.slider.setWidth(size);\n    }\n    writeScrollPosition(target, scrollPosition) {\n        target.scrollTop = scrollPosition;\n    }\n    updateOptions(options) {\n        this.updateScrollbarSize(options.vertical === 2 /* ScrollbarVisibility.Hidden */ ? 0 : options.verticalScrollbarSize);\n        // give priority to vertical scroll bar over horizontal and let it scroll all the way to the bottom\n        this._scrollbarState.setOppositeScrollbarSize(0);\n        this._visibilityController.setVisibility(options.vertical);\n        this._scrollByPage = options.scrollByPage;\n    }\n}\n\nexport { VerticalScrollbar };\n","import { Emitter } from './event.js';\nimport { Disposable } from './lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ScrollState {\n    constructor(_forceIntegerValues, width, scrollWidth, scrollLeft, height, scrollHeight, scrollTop) {\n        this._forceIntegerValues = _forceIntegerValues;\n        this._scrollStateBrand = undefined;\n        if (this._forceIntegerValues) {\n            width = width | 0;\n            scrollWidth = scrollWidth | 0;\n            scrollLeft = scrollLeft | 0;\n            height = height | 0;\n            scrollHeight = scrollHeight | 0;\n            scrollTop = scrollTop | 0;\n        }\n        this.rawScrollLeft = scrollLeft; // before validation\n        this.rawScrollTop = scrollTop; // before validation\n        if (width < 0) {\n            width = 0;\n        }\n        if (scrollLeft + width > scrollWidth) {\n            scrollLeft = scrollWidth - width;\n        }\n        if (scrollLeft < 0) {\n            scrollLeft = 0;\n        }\n        if (height < 0) {\n            height = 0;\n        }\n        if (scrollTop + height > scrollHeight) {\n            scrollTop = scrollHeight - height;\n        }\n        if (scrollTop < 0) {\n            scrollTop = 0;\n        }\n        this.width = width;\n        this.scrollWidth = scrollWidth;\n        this.scrollLeft = scrollLeft;\n        this.height = height;\n        this.scrollHeight = scrollHeight;\n        this.scrollTop = scrollTop;\n    }\n    equals(other) {\n        return (this.rawScrollLeft === other.rawScrollLeft\n            && this.rawScrollTop === other.rawScrollTop\n            && this.width === other.width\n            && this.scrollWidth === other.scrollWidth\n            && this.scrollLeft === other.scrollLeft\n            && this.height === other.height\n            && this.scrollHeight === other.scrollHeight\n            && this.scrollTop === other.scrollTop);\n    }\n    withScrollDimensions(update, useRawScrollPositions) {\n        return new ScrollState(this._forceIntegerValues, (typeof update.width !== 'undefined' ? update.width : this.width), (typeof update.scrollWidth !== 'undefined' ? update.scrollWidth : this.scrollWidth), useRawScrollPositions ? this.rawScrollLeft : this.scrollLeft, (typeof update.height !== 'undefined' ? update.height : this.height), (typeof update.scrollHeight !== 'undefined' ? update.scrollHeight : this.scrollHeight), useRawScrollPositions ? this.rawScrollTop : this.scrollTop);\n    }\n    withScrollPosition(update) {\n        return new ScrollState(this._forceIntegerValues, this.width, this.scrollWidth, (typeof update.scrollLeft !== 'undefined' ? update.scrollLeft : this.rawScrollLeft), this.height, this.scrollHeight, (typeof update.scrollTop !== 'undefined' ? update.scrollTop : this.rawScrollTop));\n    }\n    createScrollEvent(previous, inSmoothScrolling) {\n        const widthChanged = (this.width !== previous.width);\n        const scrollWidthChanged = (this.scrollWidth !== previous.scrollWidth);\n        const scrollLeftChanged = (this.scrollLeft !== previous.scrollLeft);\n        const heightChanged = (this.height !== previous.height);\n        const scrollHeightChanged = (this.scrollHeight !== previous.scrollHeight);\n        const scrollTopChanged = (this.scrollTop !== previous.scrollTop);\n        return {\n            inSmoothScrolling: inSmoothScrolling,\n            oldWidth: previous.width,\n            oldScrollWidth: previous.scrollWidth,\n            oldScrollLeft: previous.scrollLeft,\n            width: this.width,\n            scrollWidth: this.scrollWidth,\n            scrollLeft: this.scrollLeft,\n            oldHeight: previous.height,\n            oldScrollHeight: previous.scrollHeight,\n            oldScrollTop: previous.scrollTop,\n            height: this.height,\n            scrollHeight: this.scrollHeight,\n            scrollTop: this.scrollTop,\n            widthChanged: widthChanged,\n            scrollWidthChanged: scrollWidthChanged,\n            scrollLeftChanged: scrollLeftChanged,\n            heightChanged: heightChanged,\n            scrollHeightChanged: scrollHeightChanged,\n            scrollTopChanged: scrollTopChanged,\n        };\n    }\n}\nclass Scrollable extends Disposable {\n    constructor(options) {\n        super();\n        this._scrollableBrand = undefined;\n        this._onScroll = this._register(new Emitter());\n        this.onScroll = this._onScroll.event;\n        this._smoothScrollDuration = options.smoothScrollDuration;\n        this._scheduleAtNextAnimationFrame = options.scheduleAtNextAnimationFrame;\n        this._state = new ScrollState(options.forceIntegerValues, 0, 0, 0, 0, 0, 0);\n        this._smoothScrolling = null;\n    }\n    dispose() {\n        if (this._smoothScrolling) {\n            this._smoothScrolling.dispose();\n            this._smoothScrolling = null;\n        }\n        super.dispose();\n    }\n    setSmoothScrollDuration(smoothScrollDuration) {\n        this._smoothScrollDuration = smoothScrollDuration;\n    }\n    validateScrollPosition(scrollPosition) {\n        return this._state.withScrollPosition(scrollPosition);\n    }\n    getScrollDimensions() {\n        return this._state;\n    }\n    setScrollDimensions(dimensions, useRawScrollPositions) {\n        const newState = this._state.withScrollDimensions(dimensions, useRawScrollPositions);\n        this._setState(newState, Boolean(this._smoothScrolling));\n        // Validate outstanding animated scroll position target\n        this._smoothScrolling?.acceptScrollDimensions(this._state);\n    }\n    /**\n     * Returns the final scroll position that the instance will have once the smooth scroll animation concludes.\n     * If no scroll animation is occurring, it will return the current scroll position instead.\n     */\n    getFutureScrollPosition() {\n        if (this._smoothScrolling) {\n            return this._smoothScrolling.to;\n        }\n        return this._state;\n    }\n    /**\n     * Returns the current scroll position.\n     * Note: This result might be an intermediate scroll position, as there might be an ongoing smooth scroll animation.\n     */\n    getCurrentScrollPosition() {\n        return this._state;\n    }\n    setScrollPositionNow(update) {\n        // no smooth scrolling requested\n        const newState = this._state.withScrollPosition(update);\n        // Terminate any outstanding smooth scrolling\n        if (this._smoothScrolling) {\n            this._smoothScrolling.dispose();\n            this._smoothScrolling = null;\n        }\n        this._setState(newState, false);\n    }\n    setScrollPositionSmooth(update, reuseAnimation) {\n        if (this._smoothScrollDuration === 0) {\n            // Smooth scrolling not supported.\n            return this.setScrollPositionNow(update);\n        }\n        if (this._smoothScrolling) {\n            // Combine our pending scrollLeft/scrollTop with incoming scrollLeft/scrollTop\n            update = {\n                scrollLeft: (typeof update.scrollLeft === 'undefined' ? this._smoothScrolling.to.scrollLeft : update.scrollLeft),\n                scrollTop: (typeof update.scrollTop === 'undefined' ? this._smoothScrolling.to.scrollTop : update.scrollTop)\n            };\n            // Validate `update`\n            const validTarget = this._state.withScrollPosition(update);\n            if (this._smoothScrolling.to.scrollLeft === validTarget.scrollLeft && this._smoothScrolling.to.scrollTop === validTarget.scrollTop) {\n                // No need to interrupt or extend the current animation since we're going to the same place\n                return;\n            }\n            let newSmoothScrolling;\n            if (reuseAnimation) {\n                newSmoothScrolling = new SmoothScrollingOperation(this._smoothScrolling.from, validTarget, this._smoothScrolling.startTime, this._smoothScrolling.duration);\n            }\n            else {\n                newSmoothScrolling = this._smoothScrolling.combine(this._state, validTarget, this._smoothScrollDuration);\n            }\n            this._smoothScrolling.dispose();\n            this._smoothScrolling = newSmoothScrolling;\n        }\n        else {\n            // Validate `update`\n            const validTarget = this._state.withScrollPosition(update);\n            this._smoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n        }\n        // Begin smooth scrolling animation\n        this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n            if (!this._smoothScrolling) {\n                return;\n            }\n            this._smoothScrolling.animationFrameDisposable = null;\n            this._performSmoothScrolling();\n        });\n    }\n    hasPendingScrollAnimation() {\n        return Boolean(this._smoothScrolling);\n    }\n    _performSmoothScrolling() {\n        if (!this._smoothScrolling) {\n            return;\n        }\n        const update = this._smoothScrolling.tick();\n        const newState = this._state.withScrollPosition(update);\n        this._setState(newState, true);\n        if (!this._smoothScrolling) {\n            // Looks like someone canceled the smooth scrolling\n            // from the scroll event handler\n            return;\n        }\n        if (update.isDone) {\n            this._smoothScrolling.dispose();\n            this._smoothScrolling = null;\n            return;\n        }\n        // Continue smooth scrolling animation\n        this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n            if (!this._smoothScrolling) {\n                return;\n            }\n            this._smoothScrolling.animationFrameDisposable = null;\n            this._performSmoothScrolling();\n        });\n    }\n    _setState(newState, inSmoothScrolling) {\n        const oldState = this._state;\n        if (oldState.equals(newState)) {\n            // no change\n            return;\n        }\n        this._state = newState;\n        this._onScroll.fire(this._state.createScrollEvent(oldState, inSmoothScrolling));\n    }\n}\nclass SmoothScrollingUpdate {\n    constructor(scrollLeft, scrollTop, isDone) {\n        this.scrollLeft = scrollLeft;\n        this.scrollTop = scrollTop;\n        this.isDone = isDone;\n    }\n}\nfunction createEaseOutCubic(from, to) {\n    const delta = to - from;\n    return function (completion) {\n        return from + delta * easeOutCubic(completion);\n    };\n}\nfunction createComposed(a, b, cut) {\n    return function (completion) {\n        if (completion < cut) {\n            return a(completion / cut);\n        }\n        return b((completion - cut) / (1 - cut));\n    };\n}\nclass SmoothScrollingOperation {\n    constructor(from, to, startTime, duration) {\n        this.from = from;\n        this.to = to;\n        this.duration = duration;\n        this.startTime = startTime;\n        this.animationFrameDisposable = null;\n        this._initAnimations();\n    }\n    _initAnimations() {\n        this.scrollLeft = this._initAnimation(this.from.scrollLeft, this.to.scrollLeft, this.to.width);\n        this.scrollTop = this._initAnimation(this.from.scrollTop, this.to.scrollTop, this.to.height);\n    }\n    _initAnimation(from, to, viewportSize) {\n        const delta = Math.abs(from - to);\n        if (delta > 2.5 * viewportSize) {\n            let stop1, stop2;\n            if (from < to) {\n                // scroll to 75% of the viewportSize\n                stop1 = from + 0.75 * viewportSize;\n                stop2 = to - 0.75 * viewportSize;\n            }\n            else {\n                stop1 = from - 0.75 * viewportSize;\n                stop2 = to + 0.75 * viewportSize;\n            }\n            return createComposed(createEaseOutCubic(from, stop1), createEaseOutCubic(stop2, to), 0.33);\n        }\n        return createEaseOutCubic(from, to);\n    }\n    dispose() {\n        if (this.animationFrameDisposable !== null) {\n            this.animationFrameDisposable.dispose();\n            this.animationFrameDisposable = null;\n        }\n    }\n    acceptScrollDimensions(state) {\n        this.to = state.withScrollPosition(this.to);\n        this._initAnimations();\n    }\n    tick() {\n        return this._tick(Date.now());\n    }\n    _tick(now) {\n        const completion = (now - this.startTime) / this.duration;\n        if (completion < 1) {\n            const newScrollLeft = this.scrollLeft(completion);\n            const newScrollTop = this.scrollTop(completion);\n            return new SmoothScrollingUpdate(newScrollLeft, newScrollTop, false);\n        }\n        return new SmoothScrollingUpdate(this.to.scrollLeft, this.to.scrollTop, true);\n    }\n    combine(from, to, duration) {\n        return SmoothScrollingOperation.start(from, to, duration);\n    }\n    static start(from, to, duration) {\n        // +10 / -10 : pretend the animation already started for a quicker response to a scroll request\n        duration = duration + 10;\n        const startTime = Date.now() - 10;\n        return new SmoothScrollingOperation(from, to, startTime, duration);\n    }\n}\nfunction easeInCubic(t) {\n    return Math.pow(t, 3);\n}\nfunction easeOutCubic(t) {\n    return 1 - easeInCubic(1 - t);\n}\n\nexport { ScrollState, Scrollable, SmoothScrollingOperation, SmoothScrollingUpdate };\n","import { isChrome, getZoomFactor } from '../../browser.js';\nimport { getWindow, addDisposableListener, EventType, scheduleAtNextAnimationFrame } from '../../dom.js';\nimport { createFastDomNode } from '../../fastDomNode.js';\nimport { StandardWheelEvent } from '../../mouseEvent.js';\nimport { HorizontalScrollbar } from './horizontalScrollbar.js';\nimport { VerticalScrollbar } from './verticalScrollbar.js';\nimport { Widget } from '../widget.js';\nimport { TimeoutTimer } from '../../../common/async.js';\nimport { Emitter } from '../../../common/event.js';\nimport { dispose } from '../../../common/lifecycle.js';\nimport { isMacintosh } from '../../../common/platform.js';\nimport { Scrollable } from '../../../common/scrollable.js';\nimport './media/scrollbars.css';\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 *--------------------------------------------------------------------------------------------*/\nconst HIDE_TIMEOUT = 500;\nconst SCROLL_WHEEL_SENSITIVITY = 50;\nclass MouseWheelClassifierItem {\n    constructor(timestamp, deltaX, deltaY) {\n        this.timestamp = timestamp;\n        this.deltaX = deltaX;\n        this.deltaY = deltaY;\n        this.score = 0;\n    }\n}\nclass MouseWheelClassifier {\n    static { this.INSTANCE = new MouseWheelClassifier(); }\n    constructor() {\n        this._capacity = 5;\n        this._memory = [];\n        this._front = -1;\n        this._rear = -1;\n    }\n    isPhysicalMouseWheel() {\n        if (this._front === -1 && this._rear === -1) {\n            // no elements\n            return false;\n        }\n        // 0.5 * last + 0.25 * 2nd last + 0.125 * 3rd last + ...\n        let remainingInfluence = 1;\n        let score = 0;\n        let iteration = 1;\n        let index = this._rear;\n        do {\n            const influence = (index === this._front ? remainingInfluence : Math.pow(2, -iteration));\n            remainingInfluence -= influence;\n            score += this._memory[index].score * influence;\n            if (index === this._front) {\n                break;\n            }\n            index = (this._capacity + index - 1) % this._capacity;\n            iteration++;\n        } while (true);\n        return (score <= 0.5);\n    }\n    acceptStandardWheelEvent(e) {\n        if (isChrome) {\n            const targetWindow = getWindow(e.browserEvent);\n            const pageZoomFactor = getZoomFactor(targetWindow);\n            // On Chrome, the incoming delta events are multiplied with the OS zoom factor.\n            // The OS zoom factor can be reverse engineered by using the device pixel ratio and the configured zoom factor into account.\n            this.accept(Date.now(), e.deltaX * pageZoomFactor, e.deltaY * pageZoomFactor);\n        }\n        else {\n            this.accept(Date.now(), e.deltaX, e.deltaY);\n        }\n    }\n    accept(timestamp, deltaX, deltaY) {\n        let previousItem = null;\n        const item = new MouseWheelClassifierItem(timestamp, deltaX, deltaY);\n        if (this._front === -1 && this._rear === -1) {\n            this._memory[0] = item;\n            this._front = 0;\n            this._rear = 0;\n        }\n        else {\n            previousItem = this._memory[this._rear];\n            this._rear = (this._rear + 1) % this._capacity;\n            if (this._rear === this._front) {\n                // Drop oldest\n                this._front = (this._front + 1) % this._capacity;\n            }\n            this._memory[this._rear] = item;\n        }\n        item.score = this._computeScore(item, previousItem);\n    }\n    /**\n     * A score between 0 and 1 for `item`.\n     *  - a score towards 0 indicates that the source appears to be a physical mouse wheel\n     *  - a score towards 1 indicates that the source appears to be a touchpad or magic mouse, etc.\n     */\n    _computeScore(item, previousItem) {\n        if (Math.abs(item.deltaX) > 0 && Math.abs(item.deltaY) > 0) {\n            // both axes exercised => definitely not a physical mouse wheel\n            return 1;\n        }\n        let score = 0.5;\n        if (!this._isAlmostInt(item.deltaX) || !this._isAlmostInt(item.deltaY)) {\n            // non-integer deltas => indicator that this is not a physical mouse wheel\n            score += 0.25;\n        }\n        // Non-accelerating scroll => indicator that this is a physical mouse wheel\n        // These can be identified by seeing whether they are the module of one another.\n        if (previousItem) {\n            const absDeltaX = Math.abs(item.deltaX);\n            const absDeltaY = Math.abs(item.deltaY);\n            const absPreviousDeltaX = Math.abs(previousItem.deltaX);\n            const absPreviousDeltaY = Math.abs(previousItem.deltaY);\n            // Min 1 to avoid division by zero, module 1 will still be 0.\n            const minDeltaX = Math.max(Math.min(absDeltaX, absPreviousDeltaX), 1);\n            const minDeltaY = Math.max(Math.min(absDeltaY, absPreviousDeltaY), 1);\n            const maxDeltaX = Math.max(absDeltaX, absPreviousDeltaX);\n            const maxDeltaY = Math.max(absDeltaY, absPreviousDeltaY);\n            const isSameModulo = (maxDeltaX % minDeltaX === 0 && maxDeltaY % minDeltaY === 0);\n            if (isSameModulo) {\n                score -= 0.5;\n            }\n        }\n        return Math.min(Math.max(score, 0), 1);\n    }\n    _isAlmostInt(value) {\n        const epsilon = Number.EPSILON * 100; // Use a small tolerance factor for floating-point errors\n        const delta = Math.abs(Math.round(value) - value);\n        return (delta < 0.01 + epsilon);\n    }\n}\nclass AbstractScrollableElement extends Widget {\n    get onScroll() { return this._onScroll.event; }\n    get options() {\n        return this._options;\n    }\n    constructor(element, options, scrollable) {\n        super();\n        this._inertialTimeout = null;\n        this._inertialSpeed = { X: 0, Y: 0 };\n        this._onScroll = this._register(new Emitter());\n        this._onWillScroll = this._register(new Emitter());\n        element.style.overflow = 'hidden';\n        this._options = resolveOptions(options);\n        this._scrollable = scrollable;\n        this._register(this._scrollable.onScroll((e) => {\n            this._onWillScroll.fire(e);\n            this._onDidScroll(e);\n            this._onScroll.fire(e);\n        }));\n        const scrollbarHost = {\n            onMouseWheel: (mouseWheelEvent) => this._onMouseWheel(mouseWheelEvent),\n            onDragStart: () => this._onDragStart(),\n            onDragEnd: () => this._onDragEnd(),\n        };\n        this._verticalScrollbar = this._register(new VerticalScrollbar(this._scrollable, this._options, scrollbarHost));\n        this._horizontalScrollbar = this._register(new HorizontalScrollbar(this._scrollable, this._options, scrollbarHost));\n        this._domNode = document.createElement('div');\n        this._domNode.className = 'monaco-scrollable-element ' + this._options.className;\n        this._domNode.setAttribute('role', 'presentation');\n        this._domNode.style.position = 'relative';\n        this._domNode.style.overflow = 'hidden';\n        this._domNode.appendChild(element);\n        this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode);\n        this._domNode.appendChild(this._verticalScrollbar.domNode.domNode);\n        if (this._options.useShadows) {\n            this._leftShadowDomNode = createFastDomNode(document.createElement('div'));\n            this._leftShadowDomNode.setClassName('shadow');\n            this._domNode.appendChild(this._leftShadowDomNode.domNode);\n            this._topShadowDomNode = createFastDomNode(document.createElement('div'));\n            this._topShadowDomNode.setClassName('shadow');\n            this._domNode.appendChild(this._topShadowDomNode.domNode);\n            this._topLeftShadowDomNode = createFastDomNode(document.createElement('div'));\n            this._topLeftShadowDomNode.setClassName('shadow');\n            this._domNode.appendChild(this._topLeftShadowDomNode.domNode);\n        }\n        else {\n            this._leftShadowDomNode = null;\n            this._topShadowDomNode = null;\n            this._topLeftShadowDomNode = null;\n        }\n        this._listenOnDomNode = this._options.listenOnDomNode || this._domNode;\n        this._mouseWheelToDispose = [];\n        this._setListeningToMouseWheel(this._options.handleMouseWheel);\n        this.onmouseover(this._listenOnDomNode, (e) => this._onMouseOver(e));\n        this.onmouseleave(this._listenOnDomNode, (e) => this._onMouseLeave(e));\n        this._hideTimeout = this._register(new TimeoutTimer());\n        this._isDragging = false;\n        this._mouseIsOver = false;\n        this._shouldRender = true;\n        this._revealOnScroll = true;\n    }\n    dispose() {\n        this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n        if (this._inertialTimeout) {\n            this._inertialTimeout.dispose();\n            this._inertialTimeout = null;\n        }\n        super.dispose();\n    }\n    /**\n     * Get the generated 'scrollable' dom node\n     */\n    getDomNode() {\n        return this._domNode;\n    }\n    getOverviewRulerLayoutInfo() {\n        return {\n            parent: this._domNode,\n            insertBefore: this._verticalScrollbar.domNode.domNode,\n        };\n    }\n    /**\n     * Delegate a pointer down event to the vertical scrollbar.\n     * This is to help with clicking somewhere else and having the scrollbar react.\n     */\n    delegateVerticalScrollbarPointerDown(browserEvent) {\n        this._verticalScrollbar.delegatePointerDown(browserEvent);\n    }\n    getScrollDimensions() {\n        return this._scrollable.getScrollDimensions();\n    }\n    setScrollDimensions(dimensions) {\n        this._scrollable.setScrollDimensions(dimensions, false);\n    }\n    /**\n     * Update the class name of the scrollable element.\n     */\n    updateClassName(newClassName) {\n        this._options.className = newClassName;\n        // Defaults are different on Macs\n        if (isMacintosh) {\n            this._options.className += ' mac';\n        }\n        this._domNode.className = 'monaco-scrollable-element ' + this._options.className;\n    }\n    /**\n     * Update configuration options for the scrollbar.\n     */\n    updateOptions(newOptions) {\n        if (typeof newOptions.handleMouseWheel !== 'undefined') {\n            this._options.handleMouseWheel = newOptions.handleMouseWheel;\n            this._setListeningToMouseWheel(this._options.handleMouseWheel);\n        }\n        if (typeof newOptions.mouseWheelScrollSensitivity !== 'undefined') {\n            this._options.mouseWheelScrollSensitivity = newOptions.mouseWheelScrollSensitivity;\n        }\n        if (typeof newOptions.fastScrollSensitivity !== 'undefined') {\n            this._options.fastScrollSensitivity = newOptions.fastScrollSensitivity;\n        }\n        if (typeof newOptions.scrollPredominantAxis !== 'undefined') {\n            this._options.scrollPredominantAxis = newOptions.scrollPredominantAxis;\n        }\n        if (typeof newOptions.horizontal !== 'undefined') {\n            this._options.horizontal = newOptions.horizontal;\n        }\n        if (typeof newOptions.vertical !== 'undefined') {\n            this._options.vertical = newOptions.vertical;\n        }\n        if (typeof newOptions.horizontalScrollbarSize !== 'undefined') {\n            this._options.horizontalScrollbarSize = newOptions.horizontalScrollbarSize;\n        }\n        if (typeof newOptions.verticalScrollbarSize !== 'undefined') {\n            this._options.verticalScrollbarSize = newOptions.verticalScrollbarSize;\n        }\n        if (typeof newOptions.scrollByPage !== 'undefined') {\n            this._options.scrollByPage = newOptions.scrollByPage;\n        }\n        this._horizontalScrollbar.updateOptions(this._options);\n        this._verticalScrollbar.updateOptions(this._options);\n        if (!this._options.lazyRender) {\n            this._render();\n        }\n    }\n    delegateScrollFromMouseWheelEvent(browserEvent) {\n        this._onMouseWheel(new StandardWheelEvent(browserEvent));\n    }\n    async _periodicSync() {\n        let scheduleAgain = false;\n        if (this._inertialSpeed.X !== 0 || this._inertialSpeed.Y !== 0) {\n            this._scrollable.setScrollPositionNow({\n                scrollTop: this._scrollable.getCurrentScrollPosition().scrollTop - this._inertialSpeed.Y * 100,\n                scrollLeft: this._scrollable.getCurrentScrollPosition().scrollLeft - this._inertialSpeed.X * 100\n            });\n            this._inertialSpeed.X *= 0.9;\n            this._inertialSpeed.Y *= 0.9;\n            if (Math.abs(this._inertialSpeed.X) < 0.01) {\n                this._inertialSpeed.X = 0;\n            }\n            if (Math.abs(this._inertialSpeed.Y) < 0.01) {\n                this._inertialSpeed.Y = 0;\n            }\n            scheduleAgain = (this._inertialSpeed.X !== 0 || this._inertialSpeed.Y !== 0);\n        }\n        if (scheduleAgain) {\n            if (!this._inertialTimeout) {\n                this._inertialTimeout = new TimeoutTimer();\n            }\n            this._inertialTimeout.cancelAndSet(() => this._periodicSync(), 1000 / 60);\n        }\n        else {\n            this._inertialTimeout?.dispose();\n            this._inertialTimeout = null;\n        }\n    }\n    // -------------------- mouse wheel scrolling --------------------\n    _setListeningToMouseWheel(shouldListen) {\n        const isListening = (this._mouseWheelToDispose.length > 0);\n        if (isListening === shouldListen) {\n            // No change\n            return;\n        }\n        // Stop listening (if necessary)\n        this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n        // Start listening (if necessary)\n        if (shouldListen) {\n            const onMouseWheel = (browserEvent) => {\n                this._onMouseWheel(new StandardWheelEvent(browserEvent));\n            };\n            this._mouseWheelToDispose.push(addDisposableListener(this._listenOnDomNode, EventType.MOUSE_WHEEL, onMouseWheel, { passive: false }));\n        }\n    }\n    _onMouseWheel(e) {\n        if (e.browserEvent?.defaultPrevented) {\n            return;\n        }\n        const classifier = MouseWheelClassifier.INSTANCE;\n        {\n            classifier.acceptStandardWheelEvent(e);\n        }\n        // useful for creating unit tests:\n        // console.log(`${Date.now()}, ${e.deltaY}, ${e.deltaX}`);\n        let didScroll = false;\n        if (e.deltaY || e.deltaX) {\n            let deltaY = e.deltaY * this._options.mouseWheelScrollSensitivity;\n            let deltaX = e.deltaX * this._options.mouseWheelScrollSensitivity;\n            if (this._options.scrollPredominantAxis) {\n                if (this._options.scrollYToX && deltaX + deltaY === 0) {\n                    // when configured to map Y to X and we both see\n                    // no dominant axis and X and Y are competing with\n                    // identical values into opposite directions, we\n                    // ignore the delta as we cannot make a decision then\n                    deltaX = deltaY = 0;\n                }\n                else if (Math.abs(deltaY) >= Math.abs(deltaX)) {\n                    deltaX = 0;\n                }\n                else {\n                    deltaY = 0;\n                }\n            }\n            if (this._options.flipAxes) {\n                [deltaY, deltaX] = [deltaX, deltaY];\n            }\n            // Convert vertical scrolling to horizontal if shift is held, this\n            // is handled at a higher level on Mac\n            const shiftConvert = !isMacintosh && e.browserEvent && e.browserEvent.shiftKey;\n            if ((this._options.scrollYToX || shiftConvert) && !deltaX) {\n                deltaX = deltaY;\n                deltaY = 0;\n            }\n            if (e.browserEvent && e.browserEvent.altKey) {\n                // fastScrolling\n                deltaX = deltaX * this._options.fastScrollSensitivity;\n                deltaY = deltaY * this._options.fastScrollSensitivity;\n            }\n            const futureScrollPosition = this._scrollable.getFutureScrollPosition();\n            let desiredScrollPosition = {};\n            if (deltaY) {\n                const deltaScrollTop = SCROLL_WHEEL_SENSITIVITY * deltaY;\n                // Here we convert values such as -0.3 to -1 or 0.3 to 1, otherwise low speed scrolling will never scroll\n                const desiredScrollTop = futureScrollPosition.scrollTop - (deltaScrollTop < 0 ? Math.floor(deltaScrollTop) : Math.ceil(deltaScrollTop));\n                this._verticalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollTop);\n            }\n            if (deltaX) {\n                const deltaScrollLeft = SCROLL_WHEEL_SENSITIVITY * deltaX;\n                // Here we convert values such as -0.3 to -1 or 0.3 to 1, otherwise low speed scrolling will never scroll\n                const desiredScrollLeft = futureScrollPosition.scrollLeft - (deltaScrollLeft < 0 ? Math.floor(deltaScrollLeft) : Math.ceil(deltaScrollLeft));\n                this._horizontalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollLeft);\n            }\n            // Check that we are scrolling towards a location which is valid\n            desiredScrollPosition = this._scrollable.validateScrollPosition(desiredScrollPosition);\n            if (this._options.inertialScroll && (deltaX || deltaY) && !classifier.isPhysicalMouseWheel()) {\n                let startPeriodic = false;\n                // Only start periodic if it's not running\n                if (this._inertialSpeed.X === 0 && this._inertialSpeed.Y === 0) {\n                    startPeriodic = true;\n                }\n                this._inertialSpeed.Y = (deltaY < 0 ? -1 : 1) * (Math.abs(deltaY) ** 1.02);\n                this._inertialSpeed.X = (deltaX < 0 ? -1 : 1) * (Math.abs(deltaX) ** 1.02);\n                if (startPeriodic) {\n                    this._periodicSync();\n                }\n            }\n            if (futureScrollPosition.scrollLeft !== desiredScrollPosition.scrollLeft || futureScrollPosition.scrollTop !== desiredScrollPosition.scrollTop) {\n                const canPerformSmoothScroll = (this._options.mouseWheelSmoothScroll\n                    && classifier.isPhysicalMouseWheel());\n                if (canPerformSmoothScroll) {\n                    this._scrollable.setScrollPositionSmooth(desiredScrollPosition);\n                }\n                else {\n                    this._scrollable.setScrollPositionNow(desiredScrollPosition);\n                }\n                didScroll = true;\n            }\n        }\n        let consumeMouseWheel = didScroll;\n        if (!consumeMouseWheel && this._options.alwaysConsumeMouseWheel) {\n            consumeMouseWheel = true;\n        }\n        if (!consumeMouseWheel && this._options.consumeMouseWheelIfScrollbarIsNeeded && (this._verticalScrollbar.isNeeded() || this._horizontalScrollbar.isNeeded())) {\n            consumeMouseWheel = true;\n        }\n        if (consumeMouseWheel) {\n            e.preventDefault();\n            e.stopPropagation();\n        }\n    }\n    _onDidScroll(e) {\n        this._shouldRender = this._horizontalScrollbar.onDidScroll(e) || this._shouldRender;\n        this._shouldRender = this._verticalScrollbar.onDidScroll(e) || this._shouldRender;\n        if (this._options.useShadows) {\n            this._shouldRender = true;\n        }\n        if (this._revealOnScroll) {\n            this._reveal();\n        }\n        if (!this._options.lazyRender) {\n            this._render();\n        }\n    }\n    /**\n     * Render / mutate the DOM now.\n     * Should be used together with the ctor option `lazyRender`.\n     */\n    renderNow() {\n        if (!this._options.lazyRender) {\n            throw new Error('Please use `lazyRender` together with `renderNow`!');\n        }\n        this._render();\n    }\n    _render() {\n        if (!this._shouldRender) {\n            return;\n        }\n        this._shouldRender = false;\n        this._horizontalScrollbar.render();\n        this._verticalScrollbar.render();\n        if (this._options.useShadows) {\n            const scrollState = this._scrollable.getCurrentScrollPosition();\n            const enableTop = scrollState.scrollTop > 0;\n            const enableLeft = scrollState.scrollLeft > 0;\n            const leftClassName = (enableLeft ? ' left' : '');\n            const topClassName = (enableTop ? ' top' : '');\n            const topLeftClassName = (enableLeft || enableTop ? ' top-left-corner' : '');\n            this._leftShadowDomNode.setClassName(`shadow${leftClassName}`);\n            this._topShadowDomNode.setClassName(`shadow${topClassName}`);\n            this._topLeftShadowDomNode.setClassName(`shadow${topLeftClassName}${topClassName}${leftClassName}`);\n        }\n    }\n    // -------------------- fade in / fade out --------------------\n    _onDragStart() {\n        this._isDragging = true;\n        this._reveal();\n    }\n    _onDragEnd() {\n        this._isDragging = false;\n        this._hide();\n    }\n    _onMouseLeave(e) {\n        this._mouseIsOver = false;\n        this._hide();\n    }\n    _onMouseOver(e) {\n        this._mouseIsOver = true;\n        this._reveal();\n    }\n    _reveal() {\n        this._verticalScrollbar.beginReveal();\n        this._horizontalScrollbar.beginReveal();\n        this._scheduleHide();\n    }\n    _hide() {\n        if (!this._mouseIsOver && !this._isDragging) {\n            this._verticalScrollbar.beginHide();\n            this._horizontalScrollbar.beginHide();\n        }\n    }\n    _scheduleHide() {\n        if (!this._mouseIsOver && !this._isDragging) {\n            this._hideTimeout.cancelAndSet(() => this._hide(), HIDE_TIMEOUT);\n        }\n    }\n}\nclass ScrollableElement extends AbstractScrollableElement {\n    constructor(element, options) {\n        options = options || {};\n        options.mouseWheelSmoothScroll = false;\n        const scrollable = new Scrollable({\n            forceIntegerValues: true,\n            smoothScrollDuration: 0,\n            scheduleAtNextAnimationFrame: (callback) => scheduleAtNextAnimationFrame(getWindow(element), callback)\n        });\n        super(element, options, scrollable);\n        this._register(scrollable);\n    }\n    setScrollPosition(update) {\n        this._scrollable.setScrollPositionNow(update);\n    }\n}\nclass SmoothScrollableElement extends AbstractScrollableElement {\n    constructor(element, options, scrollable) {\n        super(element, options, scrollable);\n    }\n    setScrollPosition(update) {\n        if (update.reuseAnimation) {\n            this._scrollable.setScrollPositionSmooth(update, update.reuseAnimation);\n        }\n        else {\n            this._scrollable.setScrollPositionNow(update);\n        }\n    }\n    getScrollPosition() {\n        return this._scrollable.getCurrentScrollPosition();\n    }\n}\nclass DomScrollableElement extends AbstractScrollableElement {\n    constructor(element, options) {\n        options = options || {};\n        options.mouseWheelSmoothScroll = false;\n        const scrollable = new Scrollable({\n            forceIntegerValues: false, // See https://github.com/microsoft/vscode/issues/139877\n            smoothScrollDuration: 0,\n            scheduleAtNextAnimationFrame: (callback) => scheduleAtNextAnimationFrame(getWindow(element), callback)\n        });\n        super(element, options, scrollable);\n        this._register(scrollable);\n        this._element = element;\n        this._register(this.onScroll((e) => {\n            if (e.scrollTopChanged) {\n                this._element.scrollTop = e.scrollTop;\n            }\n            if (e.scrollLeftChanged) {\n                this._element.scrollLeft = e.scrollLeft;\n            }\n        }));\n        this.scanDomNode();\n    }\n    setScrollPosition(update) {\n        this._scrollable.setScrollPositionNow(update);\n    }\n    getScrollPosition() {\n        return this._scrollable.getCurrentScrollPosition();\n    }\n    scanDomNode() {\n        // width, scrollLeft, scrollWidth, height, scrollTop, scrollHeight\n        this.setScrollDimensions({\n            width: this._element.clientWidth,\n            scrollWidth: this._element.scrollWidth,\n            height: this._element.clientHeight,\n            scrollHeight: this._element.scrollHeight\n        });\n        this.setScrollPosition({\n            scrollLeft: this._element.scrollLeft,\n            scrollTop: this._element.scrollTop,\n        });\n    }\n}\nfunction resolveOptions(opts) {\n    const result = {\n        lazyRender: (typeof opts.lazyRender !== 'undefined' ? opts.lazyRender : false),\n        className: (typeof opts.className !== 'undefined' ? opts.className : ''),\n        useShadows: (typeof opts.useShadows !== 'undefined' ? opts.useShadows : true),\n        handleMouseWheel: (typeof opts.handleMouseWheel !== 'undefined' ? opts.handleMouseWheel : true),\n        flipAxes: (typeof opts.flipAxes !== 'undefined' ? opts.flipAxes : false),\n        consumeMouseWheelIfScrollbarIsNeeded: (typeof opts.consumeMouseWheelIfScrollbarIsNeeded !== 'undefined' ? opts.consumeMouseWheelIfScrollbarIsNeeded : false),\n        alwaysConsumeMouseWheel: (typeof opts.alwaysConsumeMouseWheel !== 'undefined' ? opts.alwaysConsumeMouseWheel : false),\n        scrollYToX: (typeof opts.scrollYToX !== 'undefined' ? opts.scrollYToX : false),\n        mouseWheelScrollSensitivity: (typeof opts.mouseWheelScrollSensitivity !== 'undefined' ? opts.mouseWheelScrollSensitivity : 1),\n        fastScrollSensitivity: (typeof opts.fastScrollSensitivity !== 'undefined' ? opts.fastScrollSensitivity : 5),\n        scrollPredominantAxis: (typeof opts.scrollPredominantAxis !== 'undefined' ? opts.scrollPredominantAxis : true),\n        mouseWheelSmoothScroll: (typeof opts.mouseWheelSmoothScroll !== 'undefined' ? opts.mouseWheelSmoothScroll : true),\n        inertialScroll: (typeof opts.inertialScroll !== 'undefined' ? opts.inertialScroll : false),\n        arrowSize: (typeof opts.arrowSize !== 'undefined' ? opts.arrowSize : 11),\n        listenOnDomNode: (typeof opts.listenOnDomNode !== 'undefined' ? opts.listenOnDomNode : null),\n        horizontal: (typeof opts.horizontal !== 'undefined' ? opts.horizontal : 1 /* ScrollbarVisibility.Auto */),\n        horizontalScrollbarSize: (typeof opts.horizontalScrollbarSize !== 'undefined' ? opts.horizontalScrollbarSize : 10),\n        horizontalSliderSize: (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : 0),\n        horizontalHasArrows: (typeof opts.horizontalHasArrows !== 'undefined' ? opts.horizontalHasArrows : false),\n        vertical: (typeof opts.vertical !== 'undefined' ? opts.vertical : 1 /* ScrollbarVisibility.Auto */),\n        verticalScrollbarSize: (typeof opts.verticalScrollbarSize !== 'undefined' ? opts.verticalScrollbarSize : 10),\n        verticalHasArrows: (typeof opts.verticalHasArrows !== 'undefined' ? opts.verticalHasArrows : false),\n        verticalSliderSize: (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : 0),\n        scrollByPage: (typeof opts.scrollByPage !== 'undefined' ? opts.scrollByPage : false)\n    };\n    result.horizontalSliderSize = (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : result.horizontalScrollbarSize);\n    result.verticalSliderSize = (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : result.verticalScrollbarSize);\n    // Defaults are different on Macs\n    if (isMacintosh) {\n        result.className += ' mac';\n    }\n    return result;\n}\n\nexport { AbstractScrollableElement, DomScrollableElement, MouseWheelClassifier, ScrollableElement, SmoothScrollableElement };\n","import { scheduleAtNextAnimationFrame, getWindow } from '../../../base/browser/dom.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { Position } from '../../common/core/position.js';\nimport { createEditorPagePosition, PageCoordinates, createCoordinatesRelativeToEditor } from '../editorDom.js';\nimport { MouseTarget } from './mouseTarget.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DragScrolling extends Disposable {\n    constructor(_context, _viewHelper, _mouseTargetFactory, _dispatchMouse) {\n        super();\n        this._context = _context;\n        this._viewHelper = _viewHelper;\n        this._mouseTargetFactory = _mouseTargetFactory;\n        this._dispatchMouse = _dispatchMouse;\n        this._operation = null;\n    }\n    dispose() {\n        super.dispose();\n        this.stop();\n    }\n    start(position, mouseEvent) {\n        if (this._operation) {\n            this._operation.setPosition(position, mouseEvent);\n        }\n        else {\n            this._operation = this._createDragScrollingOperation(position, mouseEvent);\n        }\n    }\n    stop() {\n        if (this._operation) {\n            this._operation.dispose();\n            this._operation = null;\n        }\n    }\n}\nclass DragScrollingOperation extends Disposable {\n    constructor(_context, _viewHelper, _mouseTargetFactory, _dispatchMouse, position, mouseEvent) {\n        super();\n        this._context = _context;\n        this._viewHelper = _viewHelper;\n        this._mouseTargetFactory = _mouseTargetFactory;\n        this._dispatchMouse = _dispatchMouse;\n        this._position = position;\n        this._mouseEvent = mouseEvent;\n        this._lastTime = Date.now();\n        this._animationFrameDisposable = scheduleAtNextAnimationFrame(getWindow(mouseEvent.browserEvent), () => this._execute());\n    }\n    dispose() {\n        this._animationFrameDisposable.dispose();\n        super.dispose();\n    }\n    setPosition(position, mouseEvent) {\n        this._position = position;\n        this._mouseEvent = mouseEvent;\n    }\n    /**\n     * update internal state and return elapsed ms since last time\n     */\n    _tick() {\n        const now = Date.now();\n        const elapsed = now - this._lastTime;\n        this._lastTime = now;\n        return elapsed;\n    }\n}\nclass TopBottomDragScrolling extends DragScrolling {\n    _createDragScrollingOperation(position, mouseEvent) {\n        return new TopBottomDragScrollingOperation(this._context, this._viewHelper, this._mouseTargetFactory, this._dispatchMouse, position, mouseEvent);\n    }\n}\nclass TopBottomDragScrollingOperation extends DragScrollingOperation {\n    /**\n     * get the number of lines per second to auto-scroll\n     */\n    _getScrollSpeed() {\n        const lineHeight = this._context.configuration.options.get(75 /* EditorOption.lineHeight */);\n        const viewportInLines = this._context.configuration.options.get(165 /* EditorOption.layoutInfo */).height / lineHeight;\n        const outsideDistanceInLines = this._position.outsideDistance / lineHeight;\n        if (outsideDistanceInLines <= 1.5) {\n            return Math.max(30, viewportInLines * (1 + outsideDistanceInLines));\n        }\n        if (outsideDistanceInLines <= 3) {\n            return Math.max(60, viewportInLines * (2 + outsideDistanceInLines));\n        }\n        return Math.max(200, viewportInLines * (7 + outsideDistanceInLines));\n    }\n    _execute() {\n        const lineHeight = this._context.configuration.options.get(75 /* EditorOption.lineHeight */);\n        const scrollSpeedInLines = this._getScrollSpeed();\n        const elapsed = this._tick();\n        const scrollInPixels = scrollSpeedInLines * (elapsed / 1000) * lineHeight;\n        const scrollValue = (this._position.outsidePosition === 'above' ? -scrollInPixels : scrollInPixels);\n        this._context.viewModel.viewLayout.deltaScrollNow(0, scrollValue);\n        this._viewHelper.renderNow();\n        const viewportData = this._context.viewLayout.getLinesViewportData();\n        const edgeLineNumber = (this._position.outsidePosition === 'above' ? viewportData.startLineNumber : viewportData.endLineNumber);\n        // First, try to find a position that matches the horizontal position of the mouse\n        let mouseTarget;\n        {\n            const editorPos = createEditorPagePosition(this._viewHelper.viewDomNode);\n            const horizontalScrollbarHeight = this._context.configuration.options.get(165 /* EditorOption.layoutInfo */).horizontalScrollbarHeight;\n            const pos = new PageCoordinates(this._mouseEvent.pos.x, editorPos.y + editorPos.height - horizontalScrollbarHeight - 0.1);\n            const relativePos = createCoordinatesRelativeToEditor(this._viewHelper.viewDomNode, editorPos, pos);\n            mouseTarget = this._mouseTargetFactory.createMouseTarget(this._viewHelper.getLastRenderData(), editorPos, pos, relativePos, null);\n        }\n        if (!mouseTarget.position || mouseTarget.position.lineNumber !== edgeLineNumber) {\n            if (this._position.outsidePosition === 'above') {\n                mouseTarget = MouseTarget.createOutsideEditor(this._position.mouseColumn, new Position(edgeLineNumber, 1), 'above', this._position.outsideDistance);\n            }\n            else {\n                mouseTarget = MouseTarget.createOutsideEditor(this._position.mouseColumn, new Position(edgeLineNumber, this._context.viewModel.getLineMaxColumn(edgeLineNumber)), 'below', this._position.outsideDistance);\n            }\n        }\n        this._dispatchMouse(mouseTarget, true, 2 /* NavigationCommandRevealType.None */);\n        this._animationFrameDisposable = scheduleAtNextAnimationFrame(getWindow(mouseTarget.element), () => this._execute());\n    }\n}\nclass LeftRightDragScrolling extends DragScrolling {\n    _createDragScrollingOperation(position, mouseEvent) {\n        return new LeftRightDragScrollingOperation(this._context, this._viewHelper, this._mouseTargetFactory, this._dispatchMouse, position, mouseEvent);\n    }\n}\nclass LeftRightDragScrollingOperation extends DragScrollingOperation {\n    /**\n     * get the number of cols per second to auto-scroll\n     */\n    _getScrollSpeed() {\n        const charWidth = this._context.configuration.options.get(59 /* EditorOption.fontInfo */).typicalFullwidthCharacterWidth;\n        const viewportInChars = this._context.configuration.options.get(165 /* EditorOption.layoutInfo */).contentWidth / charWidth;\n        const outsideDistanceInChars = this._position.outsideDistance / charWidth;\n        if (outsideDistanceInChars <= 1.5) {\n            return Math.max(30, viewportInChars * (1 + outsideDistanceInChars));\n        }\n        if (outsideDistanceInChars <= 3) {\n            return Math.max(60, viewportInChars * (2 + outsideDistanceInChars));\n        }\n        return Math.max(200, viewportInChars * (7 + outsideDistanceInChars));\n    }\n    _execute() {\n        const charWidth = this._context.configuration.options.get(59 /* EditorOption.fontInfo */).typicalFullwidthCharacterWidth;\n        const scrollSpeedInChars = this._getScrollSpeed();\n        const elapsed = this._tick();\n        const scrollInPixels = scrollSpeedInChars * (elapsed / 1000) * charWidth * 0.5;\n        const scrollValue = (this._position.outsidePosition === 'left' ? -scrollInPixels : scrollInPixels);\n        this._context.viewModel.viewLayout.deltaScrollNow(scrollValue, 0);\n        this._viewHelper.renderNow();\n        if (!this._position.position) {\n            return;\n        }\n        const edgeLineNumber = this._position.position.lineNumber;\n        // First, try to find a position that matches the horizontal position of the mouse\n        let mouseTarget;\n        {\n            const editorPos = createEditorPagePosition(this._viewHelper.viewDomNode);\n            const horizontalScrollbarHeight = this._context.configuration.options.get(165 /* EditorOption.layoutInfo */).horizontalScrollbarHeight;\n            const pos = new PageCoordinates(this._mouseEvent.pos.x, editorPos.y + editorPos.height - horizontalScrollbarHeight - 0.1);\n            const relativePos = createCoordinatesRelativeToEditor(this._viewHelper.viewDomNode, editorPos, pos);\n            mouseTarget = this._mouseTargetFactory.createMouseTarget(this._viewHelper.getLastRenderData(), editorPos, pos, relativePos, null);\n        }\n        if (this._position.outsidePosition === 'left') {\n            mouseTarget = MouseTarget.createOutsideEditor(mouseTarget.mouseColumn, new Position(edgeLineNumber, mouseTarget.mouseColumn), 'left', this._position.outsideDistance);\n        }\n        else {\n            mouseTarget = MouseTarget.createOutsideEditor(mouseTarget.mouseColumn, new Position(edgeLineNumber, mouseTarget.mouseColumn), 'right', this._position.outsideDistance);\n        }\n        this._dispatchMouse(mouseTarget, true, 2 /* NavigationCommandRevealType.None */);\n        this._animationFrameDisposable = scheduleAtNextAnimationFrame(getWindow(mouseTarget.element), () => this._execute());\n    }\n}\n\nexport { DragScrolling, DragScrollingOperation, LeftRightDragScrolling, LeftRightDragScrollingOperation, TopBottomDragScrolling, TopBottomDragScrollingOperation };\n","import { addDisposableListener, EventType, getWindow, getShadowRoot, isKeyboardEvent } from '../../../base/browser/dom.js';\nimport { StandardWheelEvent } from '../../../base/browser/mouseEvent.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { isMacintosh } from '../../../base/common/platform.js';\nimport { MouseTargetFactory, HitTestContext, MouseTarget } from './mouseTarget.js';\nimport { EditorMouseEventFactory, EditorMouseEvent, ClientCoordinates, createEditorPagePosition, createCoordinatesRelativeToEditor, GlobalEditorPointerMoveMonitor } from '../editorDom.js';\nimport { EditorZoom } from '../../common/config/editorZoom.js';\nimport { Position } from '../../common/core/position.js';\nimport { Selection } from '../../common/core/selection.js';\nimport { ViewEventHandler } from '../../common/viewEventHandler.js';\nimport { MouseWheelClassifier } from '../../../base/browser/ui/scrollbar/scrollableElement.js';\nimport { TopBottomDragScrolling, LeftRightDragScrolling } from './dragScrolling.js';\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 *--------------------------------------------------------------------------------------------*/\nclass MouseHandler extends ViewEventHandler {\n    constructor(context, viewController, viewHelper) {\n        super();\n        this._mouseLeaveMonitor = null;\n        this._context = context;\n        this.viewController = viewController;\n        this.viewHelper = viewHelper;\n        this.mouseTargetFactory = new MouseTargetFactory(this._context, viewHelper);\n        this._mouseDownOperation = this._register(new MouseDownOperation(this._context, this.viewController, this.viewHelper, this.mouseTargetFactory, (e, testEventTarget) => this._createMouseTarget(e, testEventTarget), (e) => this._getMouseColumn(e)));\n        this.lastMouseLeaveTime = -1;\n        this._height = this._context.configuration.options.get(165 /* EditorOption.layoutInfo */).height;\n        const mouseEvents = new EditorMouseEventFactory(this.viewHelper.viewDomNode);\n        this._register(mouseEvents.onContextMenu(this.viewHelper.viewDomNode, (e) => this._onContextMenu(e, true)));\n        this._register(mouseEvents.onMouseMove(this.viewHelper.viewDomNode, (e) => {\n            this._onMouseMove(e);\n            // See https://github.com/microsoft/vscode/issues/138789\n            // When moving the mouse really quickly, the browser sometimes forgets to\n            // send us a `mouseleave` or `mouseout` event. We therefore install here\n            // a global `mousemove` listener to manually recover if the mouse goes outside\n            // the editor. As soon as the mouse leaves outside of the editor, we\n            // remove this listener\n            if (!this._mouseLeaveMonitor) {\n                this._mouseLeaveMonitor = addDisposableListener(this.viewHelper.viewDomNode.ownerDocument, 'mousemove', (e) => {\n                    if (!this.viewHelper.viewDomNode.contains(e.target)) {\n                        // went outside the editor!\n                        this._onMouseLeave(new EditorMouseEvent(e, false, this.viewHelper.viewDomNode));\n                    }\n                });\n            }\n        }));\n        this._register(mouseEvents.onMouseUp(this.viewHelper.viewDomNode, (e) => this._onMouseUp(e)));\n        this._register(mouseEvents.onMouseLeave(this.viewHelper.viewDomNode, (e) => this._onMouseLeave(e)));\n        // `pointerdown` events can't be used to determine if there's a double click, or triple click\n        // because their `e.detail` is always 0.\n        // We will therefore save the pointer id for the mouse and then reuse it in the `mousedown` event\n        // for `element.setPointerCapture`.\n        let capturePointerId = 0;\n        this._register(mouseEvents.onPointerDown(this.viewHelper.viewDomNode, (e, pointerId) => {\n            capturePointerId = pointerId;\n        }));\n        // The `pointerup` listener registered by `GlobalEditorPointerMoveMonitor` does not get invoked 100% of the times.\n        // I speculate that this is because the `pointerup` listener is only registered during the `mousedown` event, and perhaps\n        // the `pointerup` event is already queued for dispatching, which makes it that the new listener doesn't get fired.\n        // See https://github.com/microsoft/vscode/issues/146486 for repro steps.\n        // To compensate for that, we simply register here a `pointerup` listener and just communicate it.\n        this._register(addDisposableListener(this.viewHelper.viewDomNode, EventType.POINTER_UP, (e) => {\n            this._mouseDownOperation.onPointerUp();\n        }));\n        this._register(mouseEvents.onMouseDown(this.viewHelper.viewDomNode, (e) => this._onMouseDown(e, capturePointerId)));\n        this._setupMouseWheelZoomListener();\n        this._context.addEventHandler(this);\n    }\n    _setupMouseWheelZoomListener() {\n        const classifier = MouseWheelClassifier.INSTANCE;\n        let prevMouseWheelTime = 0;\n        let gestureStartZoomLevel = EditorZoom.getZoomLevel();\n        let gestureHasZoomModifiers = false;\n        let gestureAccumulatedDelta = 0;\n        const onMouseWheel = (browserEvent) => {\n            this.viewController.emitMouseWheel(browserEvent);\n            if (!this._context.configuration.options.get(84 /* EditorOption.mouseWheelZoom */)) {\n                return;\n            }\n            const e = new StandardWheelEvent(browserEvent);\n            classifier.acceptStandardWheelEvent(e);\n            if (classifier.isPhysicalMouseWheel()) {\n                if (hasMouseWheelZoomModifiers(browserEvent)) {\n                    const zoomLevel = EditorZoom.getZoomLevel();\n                    const delta = e.deltaY > 0 ? 1 : -1;\n                    EditorZoom.setZoomLevel(zoomLevel + delta);\n                    e.preventDefault();\n                    e.stopPropagation();\n                }\n            }\n            else {\n                // we consider mousewheel events that occur within 50ms of each other to be part of the same gesture\n                // we don't want to consider mouse wheel events where ctrl/cmd is pressed during the inertia phase\n                // we also want to accumulate deltaY values from the same gesture and use that to set the zoom level\n                if (Date.now() - prevMouseWheelTime > 50) {\n                    // reset if more than 50ms have passed\n                    gestureStartZoomLevel = EditorZoom.getZoomLevel();\n                    gestureHasZoomModifiers = hasMouseWheelZoomModifiers(browserEvent);\n                    gestureAccumulatedDelta = 0;\n                }\n                prevMouseWheelTime = Date.now();\n                gestureAccumulatedDelta += e.deltaY;\n                if (gestureHasZoomModifiers) {\n                    EditorZoom.setZoomLevel(gestureStartZoomLevel + gestureAccumulatedDelta / 5);\n                    e.preventDefault();\n                    e.stopPropagation();\n                }\n            }\n        };\n        this._register(addDisposableListener(this.viewHelper.viewDomNode, EventType.MOUSE_WHEEL, onMouseWheel, { capture: true, passive: false }));\n        function hasMouseWheelZoomModifiers(browserEvent) {\n            return (isMacintosh\n                // on macOS we support cmd + two fingers scroll (`metaKey` set)\n                // and also the two fingers pinch gesture (`ctrKey` set)\n                ? ((browserEvent.metaKey || browserEvent.ctrlKey) && !browserEvent.shiftKey && !browserEvent.altKey)\n                : (browserEvent.ctrlKey && !browserEvent.metaKey && !browserEvent.shiftKey && !browserEvent.altKey));\n        }\n    }\n    dispose() {\n        this._context.removeEventHandler(this);\n        if (this._mouseLeaveMonitor) {\n            this._mouseLeaveMonitor.dispose();\n            this._mouseLeaveMonitor = null;\n        }\n        super.dispose();\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        if (e.hasChanged(165 /* EditorOption.layoutInfo */)) {\n            // layout change\n            const height = this._context.configuration.options.get(165 /* EditorOption.layoutInfo */).height;\n            if (this._height !== height) {\n                this._height = height;\n                this._mouseDownOperation.onHeightChanged();\n            }\n        }\n        return false;\n    }\n    onCursorStateChanged(e) {\n        this._mouseDownOperation.onCursorStateChanged(e);\n        return false;\n    }\n    onFocusChanged(e) {\n        return false;\n    }\n    // --- end event handlers\n    getTargetAtClientPoint(clientX, clientY) {\n        const clientPos = new ClientCoordinates(clientX, clientY);\n        const pos = clientPos.toPageCoordinates(getWindow(this.viewHelper.viewDomNode));\n        const editorPos = createEditorPagePosition(this.viewHelper.viewDomNode);\n        if (pos.y < editorPos.y || pos.y > editorPos.y + editorPos.height || pos.x < editorPos.x || pos.x > editorPos.x + editorPos.width) {\n            return null;\n        }\n        const relativePos = createCoordinatesRelativeToEditor(this.viewHelper.viewDomNode, editorPos, pos);\n        return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(), editorPos, pos, relativePos, null);\n    }\n    _createMouseTarget(e, testEventTarget) {\n        let target = e.target;\n        if (!this.viewHelper.viewDomNode.contains(target)) {\n            const shadowRoot = getShadowRoot(this.viewHelper.viewDomNode);\n            if (shadowRoot) {\n                const potentialTarget = shadowRoot.elementsFromPoint(e.posx, e.posy).find((el) => this.viewHelper.viewDomNode.contains(el)) ?? null;\n                target = potentialTarget;\n            }\n        }\n        return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(), e.editorPos, e.pos, e.relativePos, testEventTarget ? target : null);\n    }\n    _getMouseColumn(e) {\n        return this.mouseTargetFactory.getMouseColumn(e.relativePos);\n    }\n    _onContextMenu(e, testEventTarget) {\n        this.viewController.emitContextMenu({\n            event: e,\n            target: this._createMouseTarget(e, testEventTarget)\n        });\n    }\n    _onMouseMove(e) {\n        const targetIsWidget = this.mouseTargetFactory.mouseTargetIsWidget(e);\n        if (!targetIsWidget) {\n            e.preventDefault();\n        }\n        if (this._mouseDownOperation.isActive()) {\n            // In selection/drag operation\n            return;\n        }\n        const actualMouseMoveTime = e.timestamp;\n        if (actualMouseMoveTime < this.lastMouseLeaveTime) {\n            // Due to throttling, this event occurred before the mouse left the editor, therefore ignore it.\n            return;\n        }\n        this.viewController.emitMouseMove({\n            event: e,\n            target: this._createMouseTarget(e, true)\n        });\n    }\n    _onMouseLeave(e) {\n        if (this._mouseLeaveMonitor) {\n            this._mouseLeaveMonitor.dispose();\n            this._mouseLeaveMonitor = null;\n        }\n        this.lastMouseLeaveTime = (new Date()).getTime();\n        this.viewController.emitMouseLeave({\n            event: e,\n            target: null\n        });\n    }\n    _onMouseUp(e) {\n        this.viewController.emitMouseUp({\n            event: e,\n            target: this._createMouseTarget(e, true)\n        });\n    }\n    _onMouseDown(e, pointerId) {\n        const t = this._createMouseTarget(e, true);\n        const targetIsContent = (t.type === 6 /* MouseTargetType.CONTENT_TEXT */ || t.type === 7 /* MouseTargetType.CONTENT_EMPTY */);\n        const targetIsGutter = (t.type === 2 /* MouseTargetType.GUTTER_GLYPH_MARGIN */ || t.type === 3 /* MouseTargetType.GUTTER_LINE_NUMBERS */ || t.type === 4 /* MouseTargetType.GUTTER_LINE_DECORATIONS */);\n        const targetIsLineNumbers = (t.type === 3 /* MouseTargetType.GUTTER_LINE_NUMBERS */);\n        const selectOnLineNumbers = this._context.configuration.options.get(125 /* EditorOption.selectOnLineNumbers */);\n        const targetIsViewZone = (t.type === 8 /* MouseTargetType.CONTENT_VIEW_ZONE */ || t.type === 5 /* MouseTargetType.GUTTER_VIEW_ZONE */);\n        const targetIsWidget = (t.type === 9 /* MouseTargetType.CONTENT_WIDGET */);\n        let shouldHandle = e.leftButton || e.middleButton;\n        if (isMacintosh && e.leftButton && e.ctrlKey) {\n            shouldHandle = false;\n        }\n        const focus = () => {\n            e.preventDefault();\n            this.viewHelper.focusTextArea();\n        };\n        if (shouldHandle && (targetIsContent || (targetIsLineNumbers && selectOnLineNumbers))) {\n            focus();\n            this._mouseDownOperation.start(t.type, e, pointerId);\n        }\n        else if (targetIsGutter) {\n            // Do not steal focus\n            e.preventDefault();\n        }\n        else if (targetIsViewZone) {\n            const viewZoneData = t.detail;\n            if (shouldHandle && this.viewHelper.shouldSuppressMouseDownOnViewZone(viewZoneData.viewZoneId)) {\n                focus();\n                this._mouseDownOperation.start(t.type, e, pointerId);\n                e.preventDefault();\n            }\n        }\n        else if (targetIsWidget && this.viewHelper.shouldSuppressMouseDownOnWidget(t.detail)) {\n            focus();\n            e.preventDefault();\n        }\n        this.viewController.emitMouseDown({\n            event: e,\n            target: t\n        });\n    }\n}\nclass MouseDownOperation extends Disposable {\n    constructor(_context, _viewController, _viewHelper, _mouseTargetFactory, createMouseTarget, getMouseColumn) {\n        super();\n        this._context = _context;\n        this._viewController = _viewController;\n        this._viewHelper = _viewHelper;\n        this._mouseTargetFactory = _mouseTargetFactory;\n        this._createMouseTarget = createMouseTarget;\n        this._getMouseColumn = getMouseColumn;\n        this._mouseMoveMonitor = this._register(new GlobalEditorPointerMoveMonitor(this._viewHelper.viewDomNode));\n        this._topBottomDragScrolling = this._register(new TopBottomDragScrolling(this._context, this._viewHelper, this._mouseTargetFactory, (position, inSelectionMode, revealType) => this._dispatchMouse(position, inSelectionMode, revealType)));\n        this._leftRightDragScrolling = this._register(new LeftRightDragScrolling(this._context, this._viewHelper, this._mouseTargetFactory, (position, inSelectionMode, revealType) => this._dispatchMouse(position, inSelectionMode, revealType)));\n        this._mouseState = new MouseDownState();\n        this._currentSelection = new Selection(1, 1, 1, 1);\n        this._isActive = false;\n        this._lastMouseEvent = null;\n    }\n    dispose() {\n        super.dispose();\n    }\n    isActive() {\n        return this._isActive;\n    }\n    _onMouseDownThenMove(e) {\n        this._lastMouseEvent = e;\n        this._mouseState.setModifiers(e);\n        const position = this._findMousePosition(e, false);\n        if (!position) {\n            // Ignoring because position is unknown\n            return;\n        }\n        if (this._mouseState.isDragAndDrop) {\n            this._viewController.emitMouseDrag({\n                event: e,\n                target: position\n            });\n        }\n        else {\n            if (position.type === 13 /* MouseTargetType.OUTSIDE_EDITOR */) {\n                if (position.outsidePosition === 'above' || position.outsidePosition === 'below') {\n                    this._topBottomDragScrolling.start(position, e);\n                    this._leftRightDragScrolling.stop();\n                }\n                else {\n                    this._leftRightDragScrolling.start(position, e);\n                    this._topBottomDragScrolling.stop();\n                }\n            }\n            else {\n                this._topBottomDragScrolling.stop();\n                this._leftRightDragScrolling.stop();\n                this._dispatchMouse(position, true, 1 /* NavigationCommandRevealType.Minimal */);\n            }\n        }\n    }\n    start(targetType, e, pointerId) {\n        this._lastMouseEvent = e;\n        this._mouseState.setStartedOnLineNumbers(targetType === 3 /* MouseTargetType.GUTTER_LINE_NUMBERS */);\n        this._mouseState.setStartButtons(e);\n        this._mouseState.setModifiers(e);\n        const position = this._findMousePosition(e, true);\n        if (!position || !position.position) {\n            // Ignoring because position is unknown\n            return;\n        }\n        this._mouseState.trySetCount(e.detail, position.position);\n        // Overwrite the detail of the MouseEvent, as it will be sent out in an event and contributions might rely on it.\n        e.detail = this._mouseState.count;\n        const options = this._context.configuration.options;\n        if (!options.get(104 /* EditorOption.readOnly */)\n            && options.get(42 /* EditorOption.dragAndDrop */)\n            && !options.get(28 /* EditorOption.columnSelection */)\n            && !this._mouseState.altKey // we don't support multiple mouse\n            && e.detail < 2 // only single click on a selection can work\n            && !this._isActive // the mouse is not down yet\n            && !this._currentSelection.isEmpty() // we don't drag single cursor\n            && (position.type === 6 /* MouseTargetType.CONTENT_TEXT */) // single click on text\n            && position.position && this._currentSelection.containsPosition(position.position) // single click on a selection\n        ) {\n            this._mouseState.isDragAndDrop = true;\n            this._isActive = true;\n            this._mouseMoveMonitor.startMonitoring(this._viewHelper.viewLinesDomNode, pointerId, e.buttons, (e) => this._onMouseDownThenMove(e), (browserEvent) => {\n                const position = this._findMousePosition(this._lastMouseEvent, false);\n                if (isKeyboardEvent(browserEvent)) {\n                    // cancel\n                    this._viewController.emitMouseDropCanceled();\n                }\n                else {\n                    this._viewController.emitMouseDrop({\n                        event: this._lastMouseEvent,\n                        target: (position ? this._createMouseTarget(this._lastMouseEvent, true) : null) // Ignoring because position is unknown, e.g., Content View Zone\n                    });\n                }\n                this._stop();\n            });\n            return;\n        }\n        this._mouseState.isDragAndDrop = false;\n        this._dispatchMouse(position, e.shiftKey, 1 /* NavigationCommandRevealType.Minimal */);\n        if (!this._isActive) {\n            this._isActive = true;\n            this._mouseMoveMonitor.startMonitoring(this._viewHelper.viewLinesDomNode, pointerId, e.buttons, (e) => this._onMouseDownThenMove(e), () => this._stop());\n        }\n    }\n    _stop() {\n        this._isActive = false;\n        this._topBottomDragScrolling.stop();\n        this._leftRightDragScrolling.stop();\n    }\n    onHeightChanged() {\n        this._mouseMoveMonitor.stopMonitoring();\n    }\n    onPointerUp() {\n        this._mouseMoveMonitor.stopMonitoring();\n    }\n    onCursorStateChanged(e) {\n        this._currentSelection = e.selections[0];\n    }\n    _getPositionOutsideEditor(e) {\n        const editorContent = e.editorPos;\n        const model = this._context.viewModel;\n        const viewLayout = this._context.viewLayout;\n        const mouseColumn = this._getMouseColumn(e);\n        if (e.posy < editorContent.y) {\n            const outsideDistance = editorContent.y - e.posy;\n            const verticalOffset = Math.max(viewLayout.getCurrentScrollTop() - outsideDistance, 0);\n            const viewZoneData = HitTestContext.getZoneAtCoord(this._context, verticalOffset);\n            if (viewZoneData) {\n                const newPosition = this._helpPositionJumpOverViewZone(viewZoneData);\n                if (newPosition) {\n                    return MouseTarget.createOutsideEditor(mouseColumn, newPosition, 'above', outsideDistance);\n                }\n            }\n            const aboveLineNumber = viewLayout.getLineNumberAtVerticalOffset(verticalOffset);\n            return MouseTarget.createOutsideEditor(mouseColumn, new Position(aboveLineNumber, 1), 'above', outsideDistance);\n        }\n        if (e.posy > editorContent.y + editorContent.height) {\n            const outsideDistance = e.posy - editorContent.y - editorContent.height;\n            const verticalOffset = viewLayout.getCurrentScrollTop() + e.relativePos.y;\n            const viewZoneData = HitTestContext.getZoneAtCoord(this._context, verticalOffset);\n            if (viewZoneData) {\n                const newPosition = this._helpPositionJumpOverViewZone(viewZoneData);\n                if (newPosition) {\n                    return MouseTarget.createOutsideEditor(mouseColumn, newPosition, 'below', outsideDistance);\n                }\n            }\n            const belowLineNumber = viewLayout.getLineNumberAtVerticalOffset(verticalOffset);\n            return MouseTarget.createOutsideEditor(mouseColumn, new Position(belowLineNumber, model.getLineMaxColumn(belowLineNumber)), 'below', outsideDistance);\n        }\n        const possibleLineNumber = viewLayout.getLineNumberAtVerticalOffset(viewLayout.getCurrentScrollTop() + e.relativePos.y);\n        const layoutInfo = this._context.configuration.options.get(165 /* EditorOption.layoutInfo */);\n        const xLeftBoundary = layoutInfo.contentLeft;\n        if (e.relativePos.x <= xLeftBoundary) {\n            const outsideDistance = xLeftBoundary - e.relativePos.x;\n            return MouseTarget.createOutsideEditor(mouseColumn, new Position(possibleLineNumber, 1), 'left', outsideDistance);\n        }\n        const contentRight = (layoutInfo.minimap.minimapLeft === 0\n            ? layoutInfo.width - layoutInfo.verticalScrollbarWidth // Happens when minimap is hidden\n            : layoutInfo.minimap.minimapLeft);\n        const xRightBoundary = contentRight;\n        if (e.relativePos.x >= xRightBoundary) {\n            const outsideDistance = e.relativePos.x - xRightBoundary;\n            return MouseTarget.createOutsideEditor(mouseColumn, new Position(possibleLineNumber, model.getLineMaxColumn(possibleLineNumber)), 'right', outsideDistance);\n        }\n        return null;\n    }\n    _findMousePosition(e, testEventTarget) {\n        const positionOutsideEditor = this._getPositionOutsideEditor(e);\n        if (positionOutsideEditor) {\n            return positionOutsideEditor;\n        }\n        const t = this._createMouseTarget(e, testEventTarget);\n        const hintedPosition = t.position;\n        if (!hintedPosition) {\n            return null;\n        }\n        if (t.type === 8 /* MouseTargetType.CONTENT_VIEW_ZONE */ || t.type === 5 /* MouseTargetType.GUTTER_VIEW_ZONE */) {\n            const newPosition = this._helpPositionJumpOverViewZone(t.detail);\n            if (newPosition) {\n                return MouseTarget.createViewZone(t.type, t.element, t.mouseColumn, newPosition, t.detail);\n            }\n        }\n        return t;\n    }\n    _helpPositionJumpOverViewZone(viewZoneData) {\n        // Force position on view zones to go above or below depending on where selection started from\n        const selectionStart = new Position(this._currentSelection.selectionStartLineNumber, this._currentSelection.selectionStartColumn);\n        const positionBefore = viewZoneData.positionBefore;\n        const positionAfter = viewZoneData.positionAfter;\n        if (positionBefore && positionAfter) {\n            if (positionBefore.isBefore(selectionStart)) {\n                return positionBefore;\n            }\n            else {\n                return positionAfter;\n            }\n        }\n        return null;\n    }\n    _dispatchMouse(position, inSelectionMode, revealType) {\n        if (!position.position) {\n            return;\n        }\n        this._viewController.dispatchMouse({\n            position: position.position,\n            mouseColumn: position.mouseColumn,\n            startedOnLineNumbers: this._mouseState.startedOnLineNumbers,\n            revealType,\n            inSelectionMode: inSelectionMode,\n            mouseDownCount: this._mouseState.count,\n            altKey: this._mouseState.altKey,\n            ctrlKey: this._mouseState.ctrlKey,\n            metaKey: this._mouseState.metaKey,\n            shiftKey: this._mouseState.shiftKey,\n            leftButton: this._mouseState.leftButton,\n            middleButton: this._mouseState.middleButton,\n            onInjectedText: position.type === 6 /* MouseTargetType.CONTENT_TEXT */ && position.detail.injectedText !== null\n        });\n    }\n}\nclass MouseDownState {\n    static { this.CLEAR_MOUSE_DOWN_COUNT_TIME = 400; } // ms\n    get altKey() { return this._altKey; }\n    get ctrlKey() { return this._ctrlKey; }\n    get metaKey() { return this._metaKey; }\n    get shiftKey() { return this._shiftKey; }\n    get leftButton() { return this._leftButton; }\n    get middleButton() { return this._middleButton; }\n    get startedOnLineNumbers() { return this._startedOnLineNumbers; }\n    constructor() {\n        this._altKey = false;\n        this._ctrlKey = false;\n        this._metaKey = false;\n        this._shiftKey = false;\n        this._leftButton = false;\n        this._middleButton = false;\n        this._startedOnLineNumbers = false;\n        this._lastMouseDownPosition = null;\n        this._lastMouseDownPositionEqualCount = 0;\n        this._lastMouseDownCount = 0;\n        this._lastSetMouseDownCountTime = 0;\n        this.isDragAndDrop = false;\n    }\n    get count() {\n        return this._lastMouseDownCount;\n    }\n    setModifiers(source) {\n        this._altKey = source.altKey;\n        this._ctrlKey = source.ctrlKey;\n        this._metaKey = source.metaKey;\n        this._shiftKey = source.shiftKey;\n    }\n    setStartButtons(source) {\n        this._leftButton = source.leftButton;\n        this._middleButton = source.middleButton;\n    }\n    setStartedOnLineNumbers(startedOnLineNumbers) {\n        this._startedOnLineNumbers = startedOnLineNumbers;\n    }\n    trySetCount(setMouseDownCount, newMouseDownPosition) {\n        // a. Invalidate multiple clicking if too much time has passed (will be hit by IE because the detail field of mouse events contains garbage in IE10)\n        const currentTime = (new Date()).getTime();\n        if (currentTime - this._lastSetMouseDownCountTime > MouseDownState.CLEAR_MOUSE_DOWN_COUNT_TIME) {\n            setMouseDownCount = 1;\n        }\n        this._lastSetMouseDownCountTime = currentTime;\n        // b. Ensure that we don't jump from single click to triple click in one go (will be hit by IE because the detail field of mouse events contains garbage in IE10)\n        if (setMouseDownCount > this._lastMouseDownCount + 1) {\n            setMouseDownCount = this._lastMouseDownCount + 1;\n        }\n        // c. Invalidate multiple clicking if the logical position is different\n        if (this._lastMouseDownPosition && this._lastMouseDownPosition.equals(newMouseDownPosition)) {\n            this._lastMouseDownPositionEqualCount++;\n        }\n        else {\n            this._lastMouseDownPositionEqualCount = 1;\n        }\n        this._lastMouseDownPosition = newMouseDownPosition;\n        // Finally set the lastMouseDownCount\n        this._lastMouseDownCount = Math.min(setMouseDownCount, this._lastMouseDownPositionEqualCount);\n    }\n}\n\nexport { MouseHandler };\n","import { Emitter } from '../common/event.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DomEmitter {\n    get event() {\n        return this.emitter.event;\n    }\n    constructor(element, type, useCapture) {\n        const fn = (e) => this.emitter.fire(e);\n        this.emitter = new Emitter({\n            onWillAddFirstListener: () => element.addEventListener(type, fn, useCapture),\n            onDidRemoveLastListener: () => element.removeEventListener(type, fn, useCapture)\n        });\n    }\n    dispose() {\n        this.emitter.dispose();\n    }\n}\n\nexport { DomEmitter };\n","import { isWindows } from '../../../../base/common/platform.js';\nimport { Mimes } from '../../../../base/common/mime.js';\n\nfunction getDataToCopy(viewModel, modelSelections, emptySelectionClipboard, copyWithSyntaxHighlighting) {\n    const rawTextToCopy = viewModel.getPlainTextToCopy(modelSelections, emptySelectionClipboard, isWindows);\n    const newLineCharacter = viewModel.model.getEOL();\n    const isFromEmptySelection = (emptySelectionClipboard && modelSelections.length === 1 && modelSelections[0].isEmpty());\n    const multicursorText = (Array.isArray(rawTextToCopy) ? rawTextToCopy : null);\n    const text = (Array.isArray(rawTextToCopy) ? rawTextToCopy.join(newLineCharacter) : rawTextToCopy);\n    let html = undefined;\n    let mode = null;\n    if (CopyOptions.forceCopyWithSyntaxHighlighting || (copyWithSyntaxHighlighting && text.length < 65536)) {\n        const richText = viewModel.getRichTextToCopy(modelSelections, emptySelectionClipboard);\n        if (richText) {\n            html = richText.html;\n            mode = richText.mode;\n        }\n    }\n    const dataToCopy = {\n        isFromEmptySelection,\n        multicursorText,\n        text,\n        html,\n        mode\n    };\n    return dataToCopy;\n}\n/**\n * Every time we write to the clipboard, we record a bit of extra metadata here.\n * Every time we read from the cipboard, if the text matches our last written text,\n * we can fetch the previous metadata.\n */\nclass InMemoryClipboardMetadataManager {\n    static { this.INSTANCE = new InMemoryClipboardMetadataManager(); }\n    constructor() {\n        this._lastState = null;\n    }\n    set(lastCopiedValue, data) {\n        this._lastState = { lastCopiedValue, data };\n    }\n    get(pastedText) {\n        if (this._lastState && this._lastState.lastCopiedValue === pastedText) {\n            // match!\n            return this._lastState.data;\n        }\n        this._lastState = null;\n        return null;\n    }\n}\nconst CopyOptions = {\n    forceCopyWithSyntaxHighlighting: false\n};\nconst ClipboardEventUtils = {\n    getTextData(clipboardData) {\n        const text = clipboardData.getData(Mimes.text);\n        let metadata = null;\n        const rawmetadata = clipboardData.getData('vscode-editor-data');\n        if (typeof rawmetadata === 'string') {\n            try {\n                metadata = JSON.parse(rawmetadata);\n                if (metadata.version !== 1) {\n                    metadata = null;\n                }\n            }\n            catch (err) {\n                // no problem!\n            }\n        }\n        if (text.length === 0 && metadata === null && clipboardData.files.length > 0) {\n            // no textual data pasted, generate text from file names\n            const files = Array.prototype.slice.call(clipboardData.files, 0);\n            return [files.map(file => file.name).join('\\n'), null];\n        }\n        return [text, metadata];\n    },\n    setTextData(clipboardData, text, html, metadata) {\n        clipboardData.setData(Mimes.text, text);\n        if (typeof html === 'string') {\n            clipboardData.setData('text/html', html);\n        }\n        clipboardData.setData('vscode-editor-data', JSON.stringify(metadata));\n    }\n};\n\nexport { ClipboardEventUtils, CopyOptions, InMemoryClipboardMetadataManager, getDataToCopy };\n","import { commonPrefixLength, commonSuffixLength } from '../../../../../base/common/strings.js';\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 *--------------------------------------------------------------------------------------------*/\nclass TextAreaState {\n    static { this.EMPTY = new TextAreaState('', 0, 0, null, undefined); }\n    constructor(value, \n    /** the offset where selection starts inside `value` */\n    selectionStart, \n    /** the offset where selection ends inside `value` */\n    selectionEnd, \n    /** the editor range in the view coordinate system that matches the selection inside `value` */\n    selection, \n    /** the visible line count (wrapped, not necessarily matching \\n characters) for the text in `value` before `selectionStart` */\n    newlineCountBeforeSelection) {\n        this.value = value;\n        this.selectionStart = selectionStart;\n        this.selectionEnd = selectionEnd;\n        this.selection = selection;\n        this.newlineCountBeforeSelection = newlineCountBeforeSelection;\n    }\n    toString() {\n        return `[ <${this.value}>, selectionStart: ${this.selectionStart}, selectionEnd: ${this.selectionEnd}]`;\n    }\n    static readFromTextArea(textArea, previousState) {\n        const value = textArea.getValue();\n        const selectionStart = textArea.getSelectionStart();\n        const selectionEnd = textArea.getSelectionEnd();\n        let newlineCountBeforeSelection = undefined;\n        if (previousState) {\n            const valueBeforeSelectionStart = value.substring(0, selectionStart);\n            const previousValueBeforeSelectionStart = previousState.value.substring(0, previousState.selectionStart);\n            if (valueBeforeSelectionStart === previousValueBeforeSelectionStart) {\n                newlineCountBeforeSelection = previousState.newlineCountBeforeSelection;\n            }\n        }\n        return new TextAreaState(value, selectionStart, selectionEnd, null, newlineCountBeforeSelection);\n    }\n    collapseSelection() {\n        if (this.selectionStart === this.value.length) {\n            return this;\n        }\n        return new TextAreaState(this.value, this.value.length, this.value.length, null, undefined);\n    }\n    isWrittenToTextArea(textArea, select) {\n        const valuesEqual = this.value === textArea.getValue();\n        if (!select) {\n            return valuesEqual;\n        }\n        const selectionsEqual = this.selectionStart === textArea.getSelectionStart() && this.selectionEnd === textArea.getSelectionEnd();\n        return selectionsEqual && valuesEqual;\n    }\n    writeToTextArea(reason, textArea, select) {\n        textArea.setValue(reason, this.value);\n        if (select) {\n            textArea.setSelectionRange(reason, this.selectionStart, this.selectionEnd);\n        }\n    }\n    deduceEditorPosition(offset) {\n        if (offset <= this.selectionStart) {\n            const str = this.value.substring(offset, this.selectionStart);\n            return this._finishDeduceEditorPosition(this.selection?.getStartPosition() ?? null, str, -1);\n        }\n        if (offset >= this.selectionEnd) {\n            const str = this.value.substring(this.selectionEnd, offset);\n            return this._finishDeduceEditorPosition(this.selection?.getEndPosition() ?? null, str, 1);\n        }\n        const str1 = this.value.substring(this.selectionStart, offset);\n        if (str1.indexOf(String.fromCharCode(8230)) === -1) {\n            return this._finishDeduceEditorPosition(this.selection?.getStartPosition() ?? null, str1, 1);\n        }\n        const str2 = this.value.substring(offset, this.selectionEnd);\n        return this._finishDeduceEditorPosition(this.selection?.getEndPosition() ?? null, str2, -1);\n    }\n    _finishDeduceEditorPosition(anchor, deltaText, signum) {\n        let lineFeedCnt = 0;\n        let lastLineFeedIndex = -1;\n        while ((lastLineFeedIndex = deltaText.indexOf('\\n', lastLineFeedIndex + 1)) !== -1) {\n            lineFeedCnt++;\n        }\n        return [anchor, signum * deltaText.length, lineFeedCnt];\n    }\n    static deduceInput(previousState, currentState, couldBeEmojiInput) {\n        if (!previousState) {\n            // This is the EMPTY state\n            return {\n                text: '',\n                replacePrevCharCnt: 0,\n                replaceNextCharCnt: 0,\n                positionDelta: 0\n            };\n        }\n        const prefixLength = Math.min(commonPrefixLength(previousState.value, currentState.value), previousState.selectionStart, currentState.selectionStart);\n        const suffixLength = Math.min(commonSuffixLength(previousState.value, currentState.value), previousState.value.length - previousState.selectionEnd, currentState.value.length - currentState.selectionEnd);\n        previousState.value.substring(prefixLength, previousState.value.length - suffixLength);\n        const currentValue = currentState.value.substring(prefixLength, currentState.value.length - suffixLength);\n        const previousSelectionStart = previousState.selectionStart - prefixLength;\n        const previousSelectionEnd = previousState.selectionEnd - prefixLength;\n        const currentSelectionStart = currentState.selectionStart - prefixLength;\n        const currentSelectionEnd = currentState.selectionEnd - prefixLength;\n        if (currentSelectionStart === currentSelectionEnd) {\n            // no current selection\n            const replacePreviousCharacters = (previousState.selectionStart - prefixLength);\n            return {\n                text: currentValue,\n                replacePrevCharCnt: replacePreviousCharacters,\n                replaceNextCharCnt: 0,\n                positionDelta: 0\n            };\n        }\n        // there is a current selection => composition case\n        const replacePreviousCharacters = previousSelectionEnd - previousSelectionStart;\n        return {\n            text: currentValue,\n            replacePrevCharCnt: replacePreviousCharacters,\n            replaceNextCharCnt: 0,\n            positionDelta: 0\n        };\n    }\n    static deduceAndroidCompositionInput(previousState, currentState) {\n        if (!previousState) {\n            // This is the EMPTY state\n            return {\n                text: '',\n                replacePrevCharCnt: 0,\n                replaceNextCharCnt: 0,\n                positionDelta: 0\n            };\n        }\n        if (previousState.value === currentState.value) {\n            return {\n                text: '',\n                replacePrevCharCnt: 0,\n                replaceNextCharCnt: 0,\n                positionDelta: currentState.selectionEnd - previousState.selectionEnd\n            };\n        }\n        const prefixLength = Math.min(commonPrefixLength(previousState.value, currentState.value), previousState.selectionEnd);\n        const suffixLength = Math.min(commonSuffixLength(previousState.value, currentState.value), previousState.value.length - previousState.selectionEnd);\n        const previousValue = previousState.value.substring(prefixLength, previousState.value.length - suffixLength);\n        const currentValue = currentState.value.substring(prefixLength, currentState.value.length - suffixLength);\n        previousState.selectionStart - prefixLength;\n        const previousSelectionEnd = previousState.selectionEnd - prefixLength;\n        currentState.selectionStart - prefixLength;\n        const currentSelectionEnd = currentState.selectionEnd - prefixLength;\n        return {\n            text: currentValue,\n            replacePrevCharCnt: previousSelectionEnd,\n            replaceNextCharCnt: previousValue.length - previousSelectionEnd,\n            positionDelta: currentSelectionEnd - currentValue.length\n        };\n    }\n    static fromScreenReaderContentState(screenReaderContentState) {\n        return new TextAreaState(screenReaderContentState.value, screenReaderContentState.selectionStart, screenReaderContentState.selectionEnd, screenReaderContentState.selection, screenReaderContentState.newlineCountBeforeSelection);\n    }\n}\n\nexport { TextAreaState };\n","const generateUuid = (function () {\n    // use `randomUUID` if possible\n    if (typeof crypto.randomUUID === 'function') {\n        // see https://developer.mozilla.org/en-US/docs/Web/API/Window/crypto\n        // > Although crypto is available on all windows, the returned Crypto object only has one\n        // > usable feature in insecure contexts: the getRandomValues() method.\n        // > In general, you should use this API only in secure contexts.\n        return crypto.randomUUID.bind(crypto);\n    }\n    // prep-work\n    const _data = new Uint8Array(16);\n    const _hex = [];\n    for (let i = 0; i < 256; i++) {\n        _hex.push(i.toString(16).padStart(2, '0'));\n    }\n    return function generateUuid() {\n        // get data\n        crypto.getRandomValues(_data);\n        // set version bits\n        _data[6] = (_data[6] & 0x0f) | 0x40;\n        _data[8] = (_data[8] & 0x3f) | 0x80;\n        // print as string\n        let i = 0;\n        let result = '';\n        result += _hex[_data[i++]];\n        result += _hex[_data[i++]];\n        result += _hex[_data[i++]];\n        result += _hex[_data[i++]];\n        result += '-';\n        result += _hex[_data[i++]];\n        result += _hex[_data[i++]];\n        result += '-';\n        result += _hex[_data[i++]];\n        result += _hex[_data[i++]];\n        result += '-';\n        result += _hex[_data[i++]];\n        result += _hex[_data[i++]];\n        result += '-';\n        result += _hex[_data[i++]];\n        result += _hex[_data[i++]];\n        result += _hex[_data[i++]];\n        result += _hex[_data[i++]];\n        result += _hex[_data[i++]];\n        result += _hex[_data[i++]];\n        return result;\n    };\n})();\n/** Namespace should be 3 letter. */\nfunction prefixedUuid(namespace) {\n    return `${namespace}-${generateUuid()}`;\n}\n\nexport { generateUuid, prefixedUuid };\n","import { isFirefox } from '../../../../../base/browser/browser.js';\nimport { addDisposableListener, getShadowRoot, getActiveElement, getWindow, saveParentsScrollTop, restoreParentsScrollTop } from '../../../../../base/browser/dom.js';\nimport { DomEmitter } from '../../../../../base/browser/event.js';\nimport { StandardKeyboardEvent } from '../../../../../base/browser/keyboardEvent.js';\nimport { inputLatency } from '../../../../../base/browser/performance.js';\nimport { RunOnceScheduler } from '../../../../../base/common/async.js';\nimport { Emitter, Event } from '../../../../../base/common/event.js';\nimport { Disposable, MutableDisposable } from '../../../../../base/common/lifecycle.js';\nimport { isHighSurrogate } from '../../../../../base/common/strings.js';\nimport { Selection } from '../../../../common/core/selection.js';\nimport { IAccessibilityService } from '../../../../../platform/accessibility/common/accessibility.js';\nimport { ILogService, LogLevel } from '../../../../../platform/log/common/log.js';\nimport { InMemoryClipboardMetadataManager, ClipboardEventUtils } from '../clipboardUtils.js';\nimport { TextAreaState } from './textAreaEditContextState.js';\nimport { generateUuid } from '../../../../../base/common/uuid.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar TextAreaSyntethicEvents;\n(function (TextAreaSyntethicEvents) {\n    TextAreaSyntethicEvents.Tap = '-monaco-textarea-synthetic-tap';\n})(TextAreaSyntethicEvents || (TextAreaSyntethicEvents = {}));\nclass CompositionContext {\n    constructor() {\n        this._lastTypeTextLength = 0;\n    }\n    handleCompositionUpdate(text) {\n        text = text || '';\n        const typeInput = {\n            text: text,\n            replacePrevCharCnt: this._lastTypeTextLength,\n            replaceNextCharCnt: 0,\n            positionDelta: 0\n        };\n        this._lastTypeTextLength = text.length;\n        return typeInput;\n    }\n}\n/**\n * Writes screen reader content to the textarea and is able to analyze its input events to generate:\n *  - onCut\n *  - onPaste\n *  - onType\n *\n * Composition events are generated for presentation purposes (composition input is reflected in onType).\n */\nlet TextAreaInput = class TextAreaInput extends Disposable {\n    get textAreaState() {\n        return this._textAreaState;\n    }\n    constructor(_host, _textArea, _OS, _browser, _accessibilityService, _logService) {\n        super();\n        this._host = _host;\n        this._textArea = _textArea;\n        this._OS = _OS;\n        this._browser = _browser;\n        this._accessibilityService = _accessibilityService;\n        this._logService = _logService;\n        this._onFocus = this._register(new Emitter());\n        this.onFocus = this._onFocus.event;\n        this._onBlur = this._register(new Emitter());\n        this.onBlur = this._onBlur.event;\n        this._onKeyDown = this._register(new Emitter());\n        this.onKeyDown = this._onKeyDown.event;\n        this._onKeyUp = this._register(new Emitter());\n        this.onKeyUp = this._onKeyUp.event;\n        this._onCut = this._register(new Emitter());\n        this.onCut = this._onCut.event;\n        this._onPaste = this._register(new Emitter());\n        this.onPaste = this._onPaste.event;\n        this._onType = this._register(new Emitter());\n        this.onType = this._onType.event;\n        this._onCompositionStart = this._register(new Emitter());\n        this.onCompositionStart = this._onCompositionStart.event;\n        this._onCompositionUpdate = this._register(new Emitter());\n        this.onCompositionUpdate = this._onCompositionUpdate.event;\n        this._onCompositionEnd = this._register(new Emitter());\n        this.onCompositionEnd = this._onCompositionEnd.event;\n        this._onSelectionChangeRequest = this._register(new Emitter());\n        this.onSelectionChangeRequest = this._onSelectionChangeRequest.event;\n        this._asyncFocusGainWriteScreenReaderContent = this._register(new MutableDisposable());\n        this._asyncTriggerCut = this._register(new RunOnceScheduler(() => this._onCut.fire(), 0));\n        this._textAreaState = TextAreaState.EMPTY;\n        this._selectionChangeListener = null;\n        if (this._accessibilityService.isScreenReaderOptimized()) {\n            this.writeNativeTextAreaContent('ctor');\n        }\n        this._register(Event.runAndSubscribe(this._accessibilityService.onDidChangeScreenReaderOptimized, () => {\n            if (this._accessibilityService.isScreenReaderOptimized() && !this._asyncFocusGainWriteScreenReaderContent.value) {\n                this._asyncFocusGainWriteScreenReaderContent.value = this._register(new RunOnceScheduler(() => this.writeNativeTextAreaContent('asyncFocusGain'), 0));\n            }\n            else {\n                this._asyncFocusGainWriteScreenReaderContent.clear();\n            }\n        }));\n        this._hasFocus = false;\n        this._currentComposition = null;\n        let lastKeyDown = null;\n        this._register(this._textArea.onKeyDown((_e) => {\n            const e = new StandardKeyboardEvent(_e);\n            if (e.keyCode === 114 /* KeyCode.KEY_IN_COMPOSITION */\n                || (this._currentComposition && e.keyCode === 1 /* KeyCode.Backspace */)) {\n                // Stop propagation for keyDown events if the IME is processing key input\n                e.stopPropagation();\n            }\n            if (e.equals(9 /* KeyCode.Escape */)) {\n                // Prevent default always for `Esc`, otherwise it will generate a keypress\n                // See https://msdn.microsoft.com/en-us/library/ie/ms536939(v=vs.85).aspx\n                e.preventDefault();\n            }\n            lastKeyDown = e;\n            this._onKeyDown.fire(e);\n        }));\n        this._register(this._textArea.onKeyUp((_e) => {\n            const e = new StandardKeyboardEvent(_e);\n            this._onKeyUp.fire(e);\n        }));\n        this._register(this._textArea.onCompositionStart((e) => {\n            const currentComposition = new CompositionContext();\n            if (this._currentComposition) {\n                // simply reset the composition context\n                this._currentComposition = currentComposition;\n                return;\n            }\n            this._currentComposition = currentComposition;\n            if (this._OS === 2 /* OperatingSystem.Macintosh */\n                && lastKeyDown\n                && lastKeyDown.equals(114 /* KeyCode.KEY_IN_COMPOSITION */)\n                && this._textAreaState.selectionStart === this._textAreaState.selectionEnd\n                && this._textAreaState.selectionStart > 0\n                && this._textAreaState.value.substr(this._textAreaState.selectionStart - 1, 1) === e.data\n                && (lastKeyDown.code === 'ArrowRight' || lastKeyDown.code === 'ArrowLeft')) {\n                // Pretend the previous character was composed (in order to get it removed by subsequent compositionupdate events)\n                currentComposition.handleCompositionUpdate('x');\n                this._onCompositionStart.fire({ data: e.data });\n                return;\n            }\n            if (this._browser.isAndroid) {\n                // when tapping on the editor, Android enters composition mode to edit the current word\n                // so we cannot clear the textarea on Android and we must pretend the current word was selected\n                this._onCompositionStart.fire({ data: e.data });\n                return;\n            }\n            this._onCompositionStart.fire({ data: e.data });\n        }));\n        this._register(this._textArea.onCompositionUpdate((e) => {\n            const currentComposition = this._currentComposition;\n            if (!currentComposition) {\n                // should not be possible to receive a 'compositionupdate' without a 'compositionstart'\n                return;\n            }\n            if (this._browser.isAndroid) {\n                // On Android, the data sent with the composition update event is unusable.\n                // For example, if the cursor is in the middle of a word like Mic|osoft\n                // and Microsoft is chosen from the keyboard's suggestions, the e.data will contain \"Microsoft\".\n                // This is not really usable because it doesn't tell us where the edit began and where it ended.\n                const newState = TextAreaState.readFromTextArea(this._textArea, this._textAreaState);\n                const typeInput = TextAreaState.deduceAndroidCompositionInput(this._textAreaState, newState);\n                this._textAreaState = newState;\n                this._onType.fire(typeInput);\n                this._onCompositionUpdate.fire(e);\n                return;\n            }\n            const typeInput = currentComposition.handleCompositionUpdate(e.data);\n            this._textAreaState = TextAreaState.readFromTextArea(this._textArea, this._textAreaState);\n            this._onType.fire(typeInput);\n            this._onCompositionUpdate.fire(e);\n        }));\n        this._register(this._textArea.onCompositionEnd((e) => {\n            const currentComposition = this._currentComposition;\n            if (!currentComposition) {\n                // https://github.com/microsoft/monaco-editor/issues/1663\n                // On iOS 13.2, Chinese system IME randomly trigger an additional compositionend event with empty data\n                return;\n            }\n            this._currentComposition = null;\n            if (this._browser.isAndroid) {\n                // On Android, the data sent with the composition update event is unusable.\n                // For example, if the cursor is in the middle of a word like Mic|osoft\n                // and Microsoft is chosen from the keyboard's suggestions, the e.data will contain \"Microsoft\".\n                // This is not really usable because it doesn't tell us where the edit began and where it ended.\n                const newState = TextAreaState.readFromTextArea(this._textArea, this._textAreaState);\n                const typeInput = TextAreaState.deduceAndroidCompositionInput(this._textAreaState, newState);\n                this._textAreaState = newState;\n                this._onType.fire(typeInput);\n                this._onCompositionEnd.fire();\n                return;\n            }\n            const typeInput = currentComposition.handleCompositionUpdate(e.data);\n            this._textAreaState = TextAreaState.readFromTextArea(this._textArea, this._textAreaState);\n            this._onType.fire(typeInput);\n            this._onCompositionEnd.fire();\n        }));\n        this._register(this._textArea.onInput((e) => {\n            // Pretend here we touched the text area, as the `input` event will most likely\n            // result in a `selectionchange` event which we want to ignore\n            this._textArea.setIgnoreSelectionChangeTime('received input event');\n            if (this._currentComposition) {\n                return;\n            }\n            const newState = TextAreaState.readFromTextArea(this._textArea, this._textAreaState);\n            const typeInput = TextAreaState.deduceInput(this._textAreaState, newState, /*couldBeEmojiInput*/ this._OS === 2 /* OperatingSystem.Macintosh */);\n            if (typeInput.replacePrevCharCnt === 0 && typeInput.text.length === 1) {\n                // one character was typed\n                if (isHighSurrogate(typeInput.text.charCodeAt(0))\n                    || typeInput.text.charCodeAt(0) === 0x7f /* Delete */) {\n                    // Ignore invalid input but keep it around for next time\n                    return;\n                }\n            }\n            this._textAreaState = newState;\n            if (typeInput.text !== ''\n                || typeInput.replacePrevCharCnt !== 0\n                || typeInput.replaceNextCharCnt !== 0\n                || typeInput.positionDelta !== 0) {\n                // https://w3c.github.io/input-events/#interface-InputEvent-Attributes\n                if (e.inputType === 'insertFromPaste') {\n                    this._onPaste.fire({\n                        text: typeInput.text,\n                        metadata: InMemoryClipboardMetadataManager.INSTANCE.get(typeInput.text)\n                    });\n                }\n                else {\n                    this._onType.fire(typeInput);\n                }\n            }\n        }));\n        // --- Clipboard operations\n        this._register(this._textArea.onCut((e) => {\n            this._logService.trace(`TextAreaInput#onCut`, e);\n            // Pretend here we touched the text area, as the `cut` event will most likely\n            // result in a `selectionchange` event which we want to ignore\n            this._textArea.setIgnoreSelectionChangeTime('received cut event');\n            this._ensureClipboardGetsEditorSelection(e);\n            this._asyncTriggerCut.schedule();\n        }));\n        this._register(this._textArea.onCopy((e) => {\n            this._logService.trace(`TextAreaInput#onCopy`, e);\n            this._ensureClipboardGetsEditorSelection(e);\n        }));\n        this._register(this._textArea.onPaste((e) => {\n            this._logService.trace(`TextAreaInput#onPaste`, e);\n            // Pretend here we touched the text area, as the `paste` event will most likely\n            // result in a `selectionchange` event which we want to ignore\n            this._textArea.setIgnoreSelectionChangeTime('received paste event');\n            e.preventDefault();\n            if (!e.clipboardData) {\n                return;\n            }\n            let [text, metadata] = ClipboardEventUtils.getTextData(e.clipboardData);\n            this._logService.trace(`TextAreaInput#onPaste with id : `, metadata?.id, ' with text.length: ', text.length);\n            if (!text) {\n                return;\n            }\n            // try the in-memory store\n            metadata = metadata || InMemoryClipboardMetadataManager.INSTANCE.get(text);\n            this._logService.trace(`TextAreaInput#onPaste (before onPaste)`);\n            this._onPaste.fire({\n                text: text,\n                metadata: metadata\n            });\n        }));\n        this._register(this._textArea.onFocus(() => {\n            const hadFocus = this._hasFocus;\n            this._setHasFocus(true);\n            if (this._accessibilityService.isScreenReaderOptimized() && this._browser.isSafari && !hadFocus && this._hasFocus) {\n                // When \"tabbing into\" the textarea, immediately after dispatching the 'focus' event,\n                // Safari will always move the selection at offset 0 in the textarea\n                if (!this._asyncFocusGainWriteScreenReaderContent.value) {\n                    this._asyncFocusGainWriteScreenReaderContent.value = new RunOnceScheduler(() => this.writeNativeTextAreaContent('asyncFocusGain'), 0);\n                }\n                this._asyncFocusGainWriteScreenReaderContent.value.schedule();\n            }\n        }));\n        this._register(this._textArea.onBlur(() => {\n            if (this._currentComposition) {\n                // See https://github.com/microsoft/vscode/issues/112621\n                // where compositionend is not triggered when the editor\n                // is taken off-dom during a composition\n                // Clear the flag to be able to write to the textarea\n                this._currentComposition = null;\n                // Clear the textarea to avoid an unwanted cursor type\n                this.writeNativeTextAreaContent('blurWithoutCompositionEnd');\n                // Fire artificial composition end\n                this._onCompositionEnd.fire();\n            }\n            this._setHasFocus(false);\n        }));\n        this._register(this._textArea.onSyntheticTap(() => {\n            if (this._browser.isAndroid && this._currentComposition) {\n                // on Android, tapping does not cancel the current composition, so the\n                // textarea is stuck showing the old composition\n                // Clear the flag to be able to write to the textarea\n                this._currentComposition = null;\n                // Clear the textarea to avoid an unwanted cursor type\n                this.writeNativeTextAreaContent('tapWithoutCompositionEnd');\n                // Fire artificial composition end\n                this._onCompositionEnd.fire();\n            }\n        }));\n    }\n    _installSelectionChangeListener() {\n        // See https://github.com/microsoft/vscode/issues/27216 and https://github.com/microsoft/vscode/issues/98256\n        // When using a Braille display, it is possible for users to reposition the\n        // system caret. This is reflected in Chrome as a `selectionchange` event.\n        //\n        // The `selectionchange` event appears to be emitted under numerous other circumstances,\n        // so it is quite a challenge to distinguish a `selectionchange` coming in from a user\n        // using a Braille display from all the other cases.\n        //\n        // The problems with the `selectionchange` event are:\n        //  * the event is emitted when the textarea is focused programmatically -- textarea.focus()\n        //  * the event is emitted when the selection is changed in the textarea programmatically -- textarea.setSelectionRange(...)\n        //  * the event is emitted when the value of the textarea is changed programmatically -- textarea.value = '...'\n        //  * the event is emitted when tabbing into the textarea\n        //  * the event is emitted asynchronously (sometimes with a delay as high as a few tens of ms)\n        //  * the event sometimes comes in bursts for a single logical textarea operation\n        // `selectionchange` events often come multiple times for a single logical change\n        // so throttle multiple `selectionchange` events that burst in a short period of time.\n        let previousSelectionChangeEventTime = 0;\n        return addDisposableListener(this._textArea.ownerDocument, 'selectionchange', (e) => {\n            inputLatency.onSelectionChange();\n            if (!this._hasFocus) {\n                return;\n            }\n            if (this._currentComposition) {\n                return;\n            }\n            if (!this._browser.isChrome) {\n                // Support only for Chrome until testing happens on other browsers\n                return;\n            }\n            const now = Date.now();\n            const delta1 = now - previousSelectionChangeEventTime;\n            previousSelectionChangeEventTime = now;\n            if (delta1 < 5) {\n                // received another `selectionchange` event within 5ms of the previous `selectionchange` event\n                // => ignore it\n                return;\n            }\n            const delta2 = now - this._textArea.getIgnoreSelectionChangeTime();\n            this._textArea.resetSelectionChangeTime();\n            if (delta2 < 100) {\n                // received a `selectionchange` event within 100ms since we touched the textarea\n                // => ignore it, since we caused it\n                return;\n            }\n            if (!this._textAreaState.selection) {\n                // Cannot correlate a position in the textarea with a position in the editor...\n                return;\n            }\n            const newValue = this._textArea.getValue();\n            if (this._textAreaState.value !== newValue) {\n                // Cannot correlate a position in the textarea with a position in the editor...\n                return;\n            }\n            const newSelectionStart = this._textArea.getSelectionStart();\n            const newSelectionEnd = this._textArea.getSelectionEnd();\n            if (this._textAreaState.selectionStart === newSelectionStart && this._textAreaState.selectionEnd === newSelectionEnd) {\n                // Nothing to do...\n                return;\n            }\n            const _newSelectionStartPosition = this._textAreaState.deduceEditorPosition(newSelectionStart);\n            const newSelectionStartPosition = this._host.deduceModelPosition(_newSelectionStartPosition[0], _newSelectionStartPosition[1], _newSelectionStartPosition[2]);\n            const _newSelectionEndPosition = this._textAreaState.deduceEditorPosition(newSelectionEnd);\n            const newSelectionEndPosition = this._host.deduceModelPosition(_newSelectionEndPosition[0], _newSelectionEndPosition[1], _newSelectionEndPosition[2]);\n            const newSelection = new Selection(newSelectionStartPosition.lineNumber, newSelectionStartPosition.column, newSelectionEndPosition.lineNumber, newSelectionEndPosition.column);\n            this._onSelectionChangeRequest.fire(newSelection);\n        });\n    }\n    dispose() {\n        super.dispose();\n        if (this._selectionChangeListener) {\n            this._selectionChangeListener.dispose();\n            this._selectionChangeListener = null;\n        }\n    }\n    focusTextArea() {\n        // Setting this._hasFocus and writing the screen reader content\n        // will result in a focus() and setSelectionRange() in the textarea\n        this._setHasFocus(true);\n        // If the editor is off DOM, focus cannot be really set, so let's double check that we have managed to set the focus\n        this.refreshFocusState();\n    }\n    isFocused() {\n        return this._hasFocus;\n    }\n    refreshFocusState() {\n        this._setHasFocus(this._textArea.hasFocus());\n    }\n    _setHasFocus(newHasFocus) {\n        if (this._hasFocus === newHasFocus) {\n            // no change\n            return;\n        }\n        this._hasFocus = newHasFocus;\n        if (this._selectionChangeListener) {\n            this._selectionChangeListener.dispose();\n            this._selectionChangeListener = null;\n        }\n        if (this._hasFocus) {\n            this._selectionChangeListener = this._installSelectionChangeListener();\n        }\n        if (this._hasFocus) {\n            this.writeNativeTextAreaContent('focusgain');\n        }\n        if (this._hasFocus) {\n            this._onFocus.fire();\n        }\n        else {\n            this._onBlur.fire();\n        }\n    }\n    _setAndWriteTextAreaState(reason, textAreaState) {\n        if (!this._hasFocus) {\n            textAreaState = textAreaState.collapseSelection();\n        }\n        if (!textAreaState.isWrittenToTextArea(this._textArea, this._hasFocus)) {\n            this._logService.trace(`writeTextAreaState(reason: ${reason})`);\n        }\n        textAreaState.writeToTextArea(reason, this._textArea, this._hasFocus);\n        this._textAreaState = textAreaState;\n    }\n    writeNativeTextAreaContent(reason) {\n        if ((!this._accessibilityService.isScreenReaderOptimized() && reason === 'render') || this._currentComposition) {\n            // Do not write to the text on render unless a screen reader is being used #192278\n            // Do not write to the text area when doing composition\n            return;\n        }\n        this._setAndWriteTextAreaState(reason, this._host.getScreenReaderContent());\n    }\n    _ensureClipboardGetsEditorSelection(e) {\n        const dataToCopy = this._host.getDataToCopy();\n        let id = undefined;\n        if (this._logService.getLevel() === LogLevel.Trace) {\n            id = generateUuid();\n        }\n        const storedMetadata = {\n            version: 1,\n            id,\n            isFromEmptySelection: dataToCopy.isFromEmptySelection,\n            multicursorText: dataToCopy.multicursorText,\n            mode: dataToCopy.mode\n        };\n        InMemoryClipboardMetadataManager.INSTANCE.set(\n        // When writing \"LINE\\r\\n\" to the clipboard and then pasting,\n        // Firefox pastes \"LINE\\n\", so let's work around this quirk\n        (this._browser.isFirefox ? dataToCopy.text.replace(/\\r\\n/g, '\\n') : dataToCopy.text), storedMetadata);\n        e.preventDefault();\n        if (e.clipboardData) {\n            ClipboardEventUtils.setTextData(e.clipboardData, dataToCopy.text, dataToCopy.html, storedMetadata);\n        }\n        this._logService.trace('TextAreaEditContextInput#_ensureClipboardGetsEditorSelection with id : ', id, ' with text.length: ', dataToCopy.text.length);\n    }\n};\nTextAreaInput = __decorate([\n    __param(4, IAccessibilityService),\n    __param(5, ILogService)\n], TextAreaInput);\nclass TextAreaWrapper extends Disposable {\n    get ownerDocument() {\n        return this._actual.ownerDocument;\n    }\n    constructor(_actual) {\n        super();\n        this._actual = _actual;\n        this._onSyntheticTap = this._register(new Emitter());\n        this.onSyntheticTap = this._onSyntheticTap.event;\n        this._ignoreSelectionChangeTime = 0;\n        this.onKeyDown = this._register(new DomEmitter(this._actual, 'keydown')).event;\n        this.onKeyPress = this._register(new DomEmitter(this._actual, 'keypress')).event;\n        this.onKeyUp = this._register(new DomEmitter(this._actual, 'keyup')).event;\n        this.onCompositionStart = this._register(new DomEmitter(this._actual, 'compositionstart')).event;\n        this.onCompositionUpdate = this._register(new DomEmitter(this._actual, 'compositionupdate')).event;\n        this.onCompositionEnd = this._register(new DomEmitter(this._actual, 'compositionend')).event;\n        this.onBeforeInput = this._register(new DomEmitter(this._actual, 'beforeinput')).event;\n        this.onInput = this._register(new DomEmitter(this._actual, 'input')).event;\n        this.onCut = this._register(new DomEmitter(this._actual, 'cut')).event;\n        this.onCopy = this._register(new DomEmitter(this._actual, 'copy')).event;\n        this.onPaste = this._register(new DomEmitter(this._actual, 'paste')).event;\n        this.onFocus = this._register(new DomEmitter(this._actual, 'focus')).event;\n        this.onBlur = this._register(new DomEmitter(this._actual, 'blur')).event;\n        this._register(this.onKeyDown(() => inputLatency.onKeyDown()));\n        this._register(this.onBeforeInput(() => inputLatency.onBeforeInput()));\n        this._register(this.onInput(() => inputLatency.onInput()));\n        this._register(this.onKeyUp(() => inputLatency.onKeyUp()));\n        this._register(addDisposableListener(this._actual, TextAreaSyntethicEvents.Tap, () => this._onSyntheticTap.fire()));\n    }\n    hasFocus() {\n        const shadowRoot = getShadowRoot(this._actual);\n        if (shadowRoot) {\n            return shadowRoot.activeElement === this._actual;\n        }\n        else if (this._actual.isConnected) {\n            return getActiveElement() === this._actual;\n        }\n        else {\n            return false;\n        }\n    }\n    setIgnoreSelectionChangeTime(reason) {\n        this._ignoreSelectionChangeTime = Date.now();\n    }\n    getIgnoreSelectionChangeTime() {\n        return this._ignoreSelectionChangeTime;\n    }\n    resetSelectionChangeTime() {\n        this._ignoreSelectionChangeTime = 0;\n    }\n    getValue() {\n        // console.log('current value: ' + this._textArea.value);\n        return this._actual.value;\n    }\n    setValue(reason, value) {\n        const textArea = this._actual;\n        if (textArea.value === value) {\n            // No change\n            return;\n        }\n        // console.log('reason: ' + reason + ', current value: ' + textArea.value + ' => new value: ' + value);\n        this.setIgnoreSelectionChangeTime('setValue');\n        textArea.value = value;\n    }\n    getSelectionStart() {\n        return this._actual.selectionDirection === 'backward' ? this._actual.selectionEnd : this._actual.selectionStart;\n    }\n    getSelectionEnd() {\n        return this._actual.selectionDirection === 'backward' ? this._actual.selectionStart : this._actual.selectionEnd;\n    }\n    setSelectionRange(reason, selectionStart, selectionEnd) {\n        const textArea = this._actual;\n        let activeElement = null;\n        const shadowRoot = getShadowRoot(textArea);\n        if (shadowRoot) {\n            activeElement = shadowRoot.activeElement;\n        }\n        else {\n            activeElement = getActiveElement();\n        }\n        const activeWindow = getWindow(activeElement);\n        const currentIsFocused = (activeElement === textArea);\n        const currentSelectionStart = textArea.selectionStart;\n        const currentSelectionEnd = textArea.selectionEnd;\n        if (currentIsFocused && currentSelectionStart === selectionStart && currentSelectionEnd === selectionEnd) {\n            // No change\n            // Firefox iframe bug https://github.com/microsoft/monaco-editor/issues/643#issuecomment-367871377\n            if (isFirefox && activeWindow.parent !== activeWindow) {\n                textArea.focus();\n            }\n            return;\n        }\n        // console.log('reason: ' + reason + ', setSelectionRange: ' + selectionStart + ' -> ' + selectionEnd);\n        if (currentIsFocused) {\n            // No need to focus, only need to change the selection range\n            this.setIgnoreSelectionChangeTime('setSelectionRange');\n            textArea.setSelectionRange(selectionStart, selectionEnd);\n            if (isFirefox && activeWindow.parent !== activeWindow) {\n                textArea.focus();\n            }\n            return;\n        }\n        // If the focus is outside the textarea, browsers will try really hard to reveal the textarea.\n        // Here, we try to undo the browser's desperate reveal.\n        try {\n            const scrollState = saveParentsScrollTop(textArea);\n            this.setIgnoreSelectionChangeTime('setSelectionRange');\n            textArea.focus();\n            textArea.setSelectionRange(selectionStart, selectionEnd);\n            restoreParentsScrollTop(textArea, scrollState);\n        }\n        catch (e) {\n            // Sometimes IE throws when setting selection (e.g. textarea is off-DOM)\n        }\n    }\n}\n\nexport { TextAreaInput, TextAreaSyntethicEvents, TextAreaWrapper };\n","import { BrowserFeatures } from '../../../base/browser/canIUse.js';\nimport { addDisposableListener } from '../../../base/browser/dom.js';\nimport { Gesture, EventType } from '../../../base/browser/touch.js';\nimport { mainWindow } from '../../../base/browser/window.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { isIOS, isAndroid, isMobile } from '../../../base/common/platform.js';\nimport { MouseHandler } from './mouseHandler.js';\nimport { EditorMouseEvent, EditorPointerEventFactory } from '../editorDom.js';\nimport { TextAreaSyntethicEvents } from './editContext/textArea/textAreaEditContextInput.js';\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/**\n * Currently only tested on iOS 13/ iPadOS.\n */\nclass PointerEventHandler extends MouseHandler {\n    constructor(context, viewController, viewHelper) {\n        super(context, viewController, viewHelper);\n        this._register(Gesture.addTarget(this.viewHelper.linesContentDomNode));\n        this._register(addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Tap, (e) => this.onTap(e)));\n        this._register(addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Change, (e) => this.onChange(e)));\n        this._register(addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Contextmenu, (e) => this._onContextMenu(new EditorMouseEvent(e, false, this.viewHelper.viewDomNode), false)));\n        this._lastPointerType = 'mouse';\n        this._register(addDisposableListener(this.viewHelper.linesContentDomNode, 'pointerdown', (e) => {\n            const pointerType = e.pointerType;\n            if (pointerType === 'mouse') {\n                this._lastPointerType = 'mouse';\n                return;\n            }\n            else if (pointerType === 'touch') {\n                this._lastPointerType = 'touch';\n            }\n            else {\n                this._lastPointerType = 'pen';\n            }\n        }));\n        // PonterEvents\n        const pointerEvents = new EditorPointerEventFactory(this.viewHelper.viewDomNode);\n        this._register(pointerEvents.onPointerMove(this.viewHelper.viewDomNode, (e) => this._onMouseMove(e)));\n        this._register(pointerEvents.onPointerUp(this.viewHelper.viewDomNode, (e) => this._onMouseUp(e)));\n        this._register(pointerEvents.onPointerLeave(this.viewHelper.viewDomNode, (e) => this._onMouseLeave(e)));\n        this._register(pointerEvents.onPointerDown(this.viewHelper.viewDomNode, (e, pointerId) => this._onMouseDown(e, pointerId)));\n    }\n    onTap(event) {\n        if (!event.initialTarget || !this.viewHelper.linesContentDomNode.contains(event.initialTarget)) {\n            return;\n        }\n        event.preventDefault();\n        this.viewHelper.focusTextArea();\n        this._dispatchGesture(event, /*inSelectionMode*/ false);\n    }\n    onChange(event) {\n        if (this._lastPointerType === 'touch') {\n            this._context.viewModel.viewLayout.deltaScrollNow(-event.translationX, -event.translationY);\n        }\n        if (this._lastPointerType === 'pen') {\n            this._dispatchGesture(event, /*inSelectionMode*/ true);\n        }\n    }\n    _dispatchGesture(event, inSelectionMode) {\n        const target = this._createMouseTarget(new EditorMouseEvent(event, false, this.viewHelper.viewDomNode), false);\n        if (target.position) {\n            this.viewController.dispatchMouse({\n                position: target.position,\n                mouseColumn: target.position.column,\n                startedOnLineNumbers: false,\n                revealType: 1 /* NavigationCommandRevealType.Minimal */,\n                mouseDownCount: event.tapCount,\n                inSelectionMode,\n                altKey: false,\n                ctrlKey: false,\n                metaKey: false,\n                shiftKey: false,\n                leftButton: false,\n                middleButton: false,\n                onInjectedText: target.type === 6 /* MouseTargetType.CONTENT_TEXT */ && target.detail.injectedText !== null\n            });\n        }\n    }\n    _onMouseDown(e, pointerId) {\n        if (e.browserEvent.pointerType === 'touch') {\n            return;\n        }\n        super._onMouseDown(e, pointerId);\n    }\n}\nclass TouchHandler extends MouseHandler {\n    constructor(context, viewController, viewHelper) {\n        super(context, viewController, viewHelper);\n        this._register(Gesture.addTarget(this.viewHelper.linesContentDomNode));\n        this._register(addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Tap, (e) => this.onTap(e)));\n        this._register(addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Change, (e) => this.onChange(e)));\n        this._register(addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Contextmenu, (e) => this._onContextMenu(new EditorMouseEvent(e, false, this.viewHelper.viewDomNode), false)));\n    }\n    onTap(event) {\n        event.preventDefault();\n        this.viewHelper.focusTextArea();\n        const target = this._createMouseTarget(new EditorMouseEvent(event, false, this.viewHelper.viewDomNode), false);\n        if (target.position) {\n            // Send the tap event also to the <textarea> (for input purposes)\n            const event = document.createEvent('CustomEvent');\n            event.initEvent(TextAreaSyntethicEvents.Tap, false, true);\n            this.viewHelper.dispatchTextAreaEvent(event);\n            this.viewController.moveTo(target.position, 1 /* NavigationCommandRevealType.Minimal */);\n        }\n    }\n    onChange(e) {\n        this._context.viewModel.viewLayout.deltaScrollNow(-e.translationX, -e.translationY);\n    }\n}\nclass PointerHandler extends Disposable {\n    constructor(context, viewController, viewHelper) {\n        super();\n        const isPhone = isIOS || (isAndroid && isMobile);\n        if (isPhone && BrowserFeatures.pointerEvents) {\n            this.handler = this._register(new PointerEventHandler(context, viewController, viewHelper));\n        }\n        else if (mainWindow.TouchEvent) {\n            this.handler = this._register(new TouchHandler(context, viewController, viewHelper));\n        }\n        else {\n            this.handler = this._register(new MouseHandler(context, viewController, viewHelper));\n        }\n    }\n    getTargetAtClientPoint(clientX, clientY) {\n        return this.handler.getTargetAtClientPoint(clientX, clientY);\n    }\n}\n\nexport { PointerEventHandler, PointerHandler };\n","import { CoreNavigationCommands } from '../coreCommands.js';\nimport { Position } from '../../common/core/position.js';\nimport { isLinux } from '../../../base/common/platform.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ViewController {\n    constructor(configuration, viewModel, userInputEvents, commandDelegate) {\n        this.configuration = configuration;\n        this.viewModel = viewModel;\n        this.userInputEvents = userInputEvents;\n        this.commandDelegate = commandDelegate;\n    }\n    paste(text, pasteOnNewLine, multicursorText, mode) {\n        this.commandDelegate.paste(text, pasteOnNewLine, multicursorText, mode);\n    }\n    type(text) {\n        this.commandDelegate.type(text);\n    }\n    compositionType(text, replacePrevCharCnt, replaceNextCharCnt, positionDelta) {\n        this.commandDelegate.compositionType(text, replacePrevCharCnt, replaceNextCharCnt, positionDelta);\n    }\n    compositionStart() {\n        this.commandDelegate.startComposition();\n    }\n    compositionEnd() {\n        this.commandDelegate.endComposition();\n    }\n    cut() {\n        this.commandDelegate.cut();\n    }\n    setSelection(modelSelection) {\n        CoreNavigationCommands.SetSelection.runCoreEditorCommand(this.viewModel, {\n            source: 'keyboard',\n            selection: modelSelection\n        });\n    }\n    _validateViewColumn(viewPosition) {\n        const minColumn = this.viewModel.getLineMinColumn(viewPosition.lineNumber);\n        if (viewPosition.column < minColumn) {\n            return new Position(viewPosition.lineNumber, minColumn);\n        }\n        return viewPosition;\n    }\n    _hasMulticursorModifier(data) {\n        switch (this.configuration.options.get(86 /* EditorOption.multiCursorModifier */)) {\n            case 'altKey':\n                return data.altKey;\n            case 'ctrlKey':\n                return data.ctrlKey;\n            case 'metaKey':\n                return data.metaKey;\n            default:\n                return false;\n        }\n    }\n    _hasNonMulticursorModifier(data) {\n        switch (this.configuration.options.get(86 /* EditorOption.multiCursorModifier */)) {\n            case 'altKey':\n                return data.ctrlKey || data.metaKey;\n            case 'ctrlKey':\n                return data.altKey || data.metaKey;\n            case 'metaKey':\n                return data.ctrlKey || data.altKey;\n            default:\n                return false;\n        }\n    }\n    dispatchMouse(data) {\n        const options = this.configuration.options;\n        const selectionClipboardIsOn = (isLinux && options.get(121 /* EditorOption.selectionClipboard */));\n        const columnSelection = options.get(28 /* EditorOption.columnSelection */);\n        const scrollOnMiddleClick = options.get(171 /* EditorOption.scrollOnMiddleClick */);\n        if (data.middleButton && !selectionClipboardIsOn) {\n            if (scrollOnMiddleClick) ;\n            else {\n                this._columnSelect(data.position, data.mouseColumn, data.inSelectionMode);\n            }\n        }\n        else if (data.startedOnLineNumbers) {\n            // If the dragging started on the gutter, then have operations work on the entire line\n            if (this._hasMulticursorModifier(data)) {\n                if (data.inSelectionMode) {\n                    this._lastCursorLineSelect(data.position, data.revealType);\n                }\n                else {\n                    this._createCursor(data.position, true);\n                }\n            }\n            else {\n                if (data.inSelectionMode) {\n                    this._lineSelectDrag(data.position, data.revealType);\n                }\n                else {\n                    this._lineSelect(data.position, data.revealType);\n                }\n            }\n        }\n        else if (data.mouseDownCount >= 4) {\n            this._selectAll();\n        }\n        else if (data.mouseDownCount === 3) {\n            if (this._hasMulticursorModifier(data)) {\n                if (data.inSelectionMode) {\n                    this._lastCursorLineSelectDrag(data.position, data.revealType);\n                }\n                else {\n                    this._lastCursorLineSelect(data.position, data.revealType);\n                }\n            }\n            else {\n                if (data.inSelectionMode) {\n                    this._lineSelectDrag(data.position, data.revealType);\n                }\n                else {\n                    this._lineSelect(data.position, data.revealType);\n                }\n            }\n        }\n        else if (data.mouseDownCount === 2) {\n            if (!data.onInjectedText) {\n                if (this._hasMulticursorModifier(data)) {\n                    this._lastCursorWordSelect(data.position, data.revealType);\n                }\n                else {\n                    if (data.inSelectionMode) {\n                        this._wordSelectDrag(data.position, data.revealType);\n                    }\n                    else {\n                        this._wordSelect(data.position, data.revealType);\n                    }\n                }\n            }\n        }\n        else {\n            if (this._hasMulticursorModifier(data)) {\n                if (!this._hasNonMulticursorModifier(data)) {\n                    if (data.shiftKey) {\n                        this._columnSelect(data.position, data.mouseColumn, true);\n                    }\n                    else {\n                        // Do multi-cursor operations only when purely alt is pressed\n                        if (data.inSelectionMode) {\n                            this._lastCursorMoveToSelect(data.position, data.revealType);\n                        }\n                        else {\n                            this._createCursor(data.position, false);\n                        }\n                    }\n                }\n            }\n            else {\n                if (data.inSelectionMode) {\n                    if (data.altKey) {\n                        this._columnSelect(data.position, data.mouseColumn, true);\n                    }\n                    else {\n                        if (columnSelection) {\n                            this._columnSelect(data.position, data.mouseColumn, true);\n                        }\n                        else {\n                            this._moveToSelect(data.position, data.revealType);\n                        }\n                    }\n                }\n                else {\n                    this.moveTo(data.position, data.revealType);\n                }\n            }\n        }\n    }\n    _usualArgs(viewPosition, revealType) {\n        viewPosition = this._validateViewColumn(viewPosition);\n        return {\n            source: 'mouse',\n            position: this._convertViewToModelPosition(viewPosition),\n            viewPosition,\n            revealType\n        };\n    }\n    moveTo(viewPosition, revealType) {\n        CoreNavigationCommands.MoveTo.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType));\n    }\n    _moveToSelect(viewPosition, revealType) {\n        CoreNavigationCommands.MoveToSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType));\n    }\n    _columnSelect(viewPosition, mouseColumn, doColumnSelect) {\n        viewPosition = this._validateViewColumn(viewPosition);\n        CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(this.viewModel, {\n            source: 'mouse',\n            position: this._convertViewToModelPosition(viewPosition),\n            viewPosition: viewPosition,\n            mouseColumn: mouseColumn,\n            doColumnSelect: doColumnSelect\n        });\n    }\n    _createCursor(viewPosition, wholeLine) {\n        viewPosition = this._validateViewColumn(viewPosition);\n        CoreNavigationCommands.CreateCursor.runCoreEditorCommand(this.viewModel, {\n            source: 'mouse',\n            position: this._convertViewToModelPosition(viewPosition),\n            viewPosition: viewPosition,\n            wholeLine: wholeLine\n        });\n    }\n    _lastCursorMoveToSelect(viewPosition, revealType) {\n        CoreNavigationCommands.LastCursorMoveToSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType));\n    }\n    _wordSelect(viewPosition, revealType) {\n        CoreNavigationCommands.WordSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType));\n    }\n    _wordSelectDrag(viewPosition, revealType) {\n        CoreNavigationCommands.WordSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType));\n    }\n    _lastCursorWordSelect(viewPosition, revealType) {\n        CoreNavigationCommands.LastCursorWordSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType));\n    }\n    _lineSelect(viewPosition, revealType) {\n        CoreNavigationCommands.LineSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType));\n    }\n    _lineSelectDrag(viewPosition, revealType) {\n        CoreNavigationCommands.LineSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType));\n    }\n    _lastCursorLineSelect(viewPosition, revealType) {\n        CoreNavigationCommands.LastCursorLineSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType));\n    }\n    _lastCursorLineSelectDrag(viewPosition, revealType) {\n        CoreNavigationCommands.LastCursorLineSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition, revealType));\n    }\n    _selectAll() {\n        CoreNavigationCommands.SelectAll.runCoreEditorCommand(this.viewModel, { source: 'mouse' });\n    }\n    // ----------------------\n    _convertViewToModelPosition(viewPosition) {\n        return this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(viewPosition);\n    }\n    emitKeyDown(e) {\n        this.userInputEvents.emitKeyDown(e);\n    }\n    emitKeyUp(e) {\n        this.userInputEvents.emitKeyUp(e);\n    }\n    emitContextMenu(e) {\n        this.userInputEvents.emitContextMenu(e);\n    }\n    emitMouseMove(e) {\n        this.userInputEvents.emitMouseMove(e);\n    }\n    emitMouseLeave(e) {\n        this.userInputEvents.emitMouseLeave(e);\n    }\n    emitMouseUp(e) {\n        this.userInputEvents.emitMouseUp(e);\n    }\n    emitMouseDown(e) {\n        this.userInputEvents.emitMouseDown(e);\n    }\n    emitMouseDrag(e) {\n        this.userInputEvents.emitMouseDrag(e);\n    }\n    emitMouseDrop(e) {\n        this.userInputEvents.emitMouseDrop(e);\n    }\n    emitMouseDropCanceled() {\n        this.userInputEvents.emitMouseDropCanceled();\n    }\n    emitMouseWheel(e) {\n        this.userInputEvents.emitMouseWheel(e);\n    }\n}\n\nexport { ViewController };\n","import { onUnexpectedError } from '../common/errors.js';\nimport { getMonacoEnvironment } from './browser.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction createTrustedTypesPolicy(policyName, policyOptions) {\n    const monacoEnvironment = getMonacoEnvironment();\n    if (monacoEnvironment?.createTrustedTypesPolicy) {\n        try {\n            return monacoEnvironment.createTrustedTypesPolicy(policyName, policyOptions);\n        }\n        catch (err) {\n            onUnexpectedError(err);\n            return undefined;\n        }\n    }\n    try {\n        // eslint-disable-next-line local/code-no-any-casts\n        return globalThis.trustedTypes?.createPolicy(policyName, policyOptions);\n    }\n    catch (err) {\n        onUnexpectedError(err);\n        return undefined;\n    }\n}\n\nexport { createTrustedTypesPolicy };\n","import { createFastDomNode } from '../../../base/browser/fastDomNode.js';\nimport { createTrustedTypesPolicy } from '../../../base/browser/trustedTypes.js';\nimport { BugIndicatingError } from '../../../base/common/errors.js';\nimport { StringBuilder } from '../../common/core/stringBuilder.js';\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 *--------------------------------------------------------------------------------------------*/\nclass RenderedLinesCollection {\n    constructor(_lineFactory) {\n        this._lineFactory = _lineFactory;\n        this._set(1, []);\n    }\n    flush() {\n        this._set(1, []);\n    }\n    _set(rendLineNumberStart, lines) {\n        this._lines = lines;\n        this._rendLineNumberStart = rendLineNumberStart;\n    }\n    _get() {\n        return {\n            rendLineNumberStart: this._rendLineNumberStart,\n            lines: this._lines\n        };\n    }\n    /**\n     * @returns Inclusive line number that is inside this collection\n     */\n    getStartLineNumber() {\n        return this._rendLineNumberStart;\n    }\n    /**\n     * @returns Inclusive line number that is inside this collection\n     */\n    getEndLineNumber() {\n        return this._rendLineNumberStart + this._lines.length - 1;\n    }\n    getCount() {\n        return this._lines.length;\n    }\n    getLine(lineNumber) {\n        const lineIndex = lineNumber - this._rendLineNumberStart;\n        if (lineIndex < 0 || lineIndex >= this._lines.length) {\n            throw new BugIndicatingError('Illegal value for lineNumber');\n        }\n        return this._lines[lineIndex];\n    }\n    /**\n     * @returns Lines that were removed from this collection\n     */\n    onLinesDeleted(deleteFromLineNumber, deleteToLineNumber) {\n        if (this.getCount() === 0) {\n            // no lines\n            return null;\n        }\n        const startLineNumber = this.getStartLineNumber();\n        const endLineNumber = this.getEndLineNumber();\n        if (deleteToLineNumber < startLineNumber) {\n            // deleting above the viewport\n            const deleteCnt = deleteToLineNumber - deleteFromLineNumber + 1;\n            this._rendLineNumberStart -= deleteCnt;\n            return null;\n        }\n        if (deleteFromLineNumber > endLineNumber) {\n            // deleted below the viewport\n            return null;\n        }\n        // Record what needs to be deleted\n        let deleteStartIndex = 0;\n        let deleteCount = 0;\n        for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n            const lineIndex = lineNumber - this._rendLineNumberStart;\n            if (deleteFromLineNumber <= lineNumber && lineNumber <= deleteToLineNumber) {\n                // this is a line to be deleted\n                if (deleteCount === 0) {\n                    // this is the first line to be deleted\n                    deleteStartIndex = lineIndex;\n                    deleteCount = 1;\n                }\n                else {\n                    deleteCount++;\n                }\n            }\n        }\n        // Adjust this._rendLineNumberStart for lines deleted above\n        if (deleteFromLineNumber < startLineNumber) {\n            // Something was deleted above\n            let deleteAboveCount = 0;\n            if (deleteToLineNumber < startLineNumber) {\n                // the entire deleted lines are above\n                deleteAboveCount = deleteToLineNumber - deleteFromLineNumber + 1;\n            }\n            else {\n                deleteAboveCount = startLineNumber - deleteFromLineNumber;\n            }\n            this._rendLineNumberStart -= deleteAboveCount;\n        }\n        const deleted = this._lines.splice(deleteStartIndex, deleteCount);\n        return deleted;\n    }\n    onLinesChanged(changeFromLineNumber, changeCount) {\n        const changeToLineNumber = changeFromLineNumber + changeCount - 1;\n        if (this.getCount() === 0) {\n            // no lines\n            return false;\n        }\n        const startLineNumber = this.getStartLineNumber();\n        const endLineNumber = this.getEndLineNumber();\n        let someoneNotified = false;\n        for (let changedLineNumber = changeFromLineNumber; changedLineNumber <= changeToLineNumber; changedLineNumber++) {\n            if (changedLineNumber >= startLineNumber && changedLineNumber <= endLineNumber) {\n                // Notify the line\n                this._lines[changedLineNumber - this._rendLineNumberStart].onContentChanged();\n                someoneNotified = true;\n            }\n        }\n        return someoneNotified;\n    }\n    onLinesInserted(insertFromLineNumber, insertToLineNumber) {\n        if (this.getCount() === 0) {\n            // no lines\n            return null;\n        }\n        const insertCnt = insertToLineNumber - insertFromLineNumber + 1;\n        const startLineNumber = this.getStartLineNumber();\n        const endLineNumber = this.getEndLineNumber();\n        if (insertFromLineNumber <= startLineNumber) {\n            // inserting above the viewport\n            this._rendLineNumberStart += insertCnt;\n            return null;\n        }\n        if (insertFromLineNumber > endLineNumber) {\n            // inserting below the viewport\n            return null;\n        }\n        if (insertCnt + insertFromLineNumber > endLineNumber) {\n            // insert inside the viewport in such a way that all remaining lines are pushed outside\n            const deleted = this._lines.splice(insertFromLineNumber - this._rendLineNumberStart, endLineNumber - insertFromLineNumber + 1);\n            return deleted;\n        }\n        // insert inside the viewport, push out some lines, but not all remaining lines\n        const newLines = [];\n        for (let i = 0; i < insertCnt; i++) {\n            newLines[i] = this._lineFactory.createLine();\n        }\n        const insertIndex = insertFromLineNumber - this._rendLineNumberStart;\n        const beforeLines = this._lines.slice(0, insertIndex);\n        const afterLines = this._lines.slice(insertIndex, this._lines.length - insertCnt);\n        const deletedLines = this._lines.slice(this._lines.length - insertCnt, this._lines.length);\n        this._lines = beforeLines.concat(newLines).concat(afterLines);\n        return deletedLines;\n    }\n    onTokensChanged(ranges) {\n        if (this.getCount() === 0) {\n            // no lines\n            return false;\n        }\n        const startLineNumber = this.getStartLineNumber();\n        const endLineNumber = this.getEndLineNumber();\n        let notifiedSomeone = false;\n        for (let i = 0, len = ranges.length; i < len; i++) {\n            const rng = ranges[i];\n            if (rng.toLineNumber < startLineNumber || rng.fromLineNumber > endLineNumber) {\n                // range outside viewport\n                continue;\n            }\n            const from = Math.max(startLineNumber, rng.fromLineNumber);\n            const to = Math.min(endLineNumber, rng.toLineNumber);\n            for (let lineNumber = from; lineNumber <= to; lineNumber++) {\n                const lineIndex = lineNumber - this._rendLineNumberStart;\n                this._lines[lineIndex].onTokensChanged();\n                notifiedSomeone = true;\n            }\n        }\n        return notifiedSomeone;\n    }\n}\nclass VisibleLinesCollection {\n    constructor(_viewContext, _lineFactory) {\n        this._viewContext = _viewContext;\n        this._lineFactory = _lineFactory;\n        this.domNode = this._createDomNode();\n        this._linesCollection = new RenderedLinesCollection(this._lineFactory);\n    }\n    _createDomNode() {\n        const domNode = createFastDomNode(document.createElement('div'));\n        domNode.setClassName('view-layer');\n        domNode.setPosition('absolute');\n        domNode.domNode.setAttribute('role', 'presentation');\n        domNode.domNode.setAttribute('aria-hidden', 'true');\n        return domNode;\n    }\n    // ---- begin view event handlers\n    onConfigurationChanged(e) {\n        if (e.hasChanged(165 /* EditorOption.layoutInfo */)) {\n            return true;\n        }\n        return false;\n    }\n    onFlushed(e, flushDom) {\n        // No need to clear the dom node because a full .innerHTML will occur in\n        // ViewLayerRenderer._render, however the fallback mechanism in the\n        // GPU renderer may cause this to be necessary as the .innerHTML call\n        // may not happen depending on the new state, leaving stale DOM nodes\n        // around.\n        if (flushDom) {\n            const start = this._linesCollection.getStartLineNumber();\n            const end = this._linesCollection.getEndLineNumber();\n            for (let i = start; i <= end; i++) {\n                this._linesCollection.getLine(i).getDomNode()?.remove();\n            }\n        }\n        this._linesCollection.flush();\n        return true;\n    }\n    onLinesChanged(e) {\n        return this._linesCollection.onLinesChanged(e.fromLineNumber, e.count);\n    }\n    onLinesDeleted(e) {\n        const deleted = this._linesCollection.onLinesDeleted(e.fromLineNumber, e.toLineNumber);\n        if (deleted) {\n            // Remove from DOM\n            for (let i = 0, len = deleted.length; i < len; i++) {\n                const lineDomNode = deleted[i].getDomNode();\n                lineDomNode?.remove();\n            }\n        }\n        return true;\n    }\n    onLinesInserted(e) {\n        const deleted = this._linesCollection.onLinesInserted(e.fromLineNumber, e.toLineNumber);\n        if (deleted) {\n            // Remove from DOM\n            for (let i = 0, len = deleted.length; i < len; i++) {\n                const lineDomNode = deleted[i].getDomNode();\n                lineDomNode?.remove();\n            }\n        }\n        return true;\n    }\n    onScrollChanged(e) {\n        return e.scrollTopChanged;\n    }\n    onTokensChanged(e) {\n        return this._linesCollection.onTokensChanged(e.ranges);\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    // ---- end view event handlers\n    getStartLineNumber() {\n        return this._linesCollection.getStartLineNumber();\n    }\n    getEndLineNumber() {\n        return this._linesCollection.getEndLineNumber();\n    }\n    getVisibleLine(lineNumber) {\n        return this._linesCollection.getLine(lineNumber);\n    }\n    renderLines(viewportData) {\n        const inp = this._linesCollection._get();\n        const renderer = new ViewLayerRenderer(this.domNode.domNode, this._lineFactory, viewportData, this._viewContext);\n        const ctx = {\n            rendLineNumberStart: inp.rendLineNumberStart,\n            lines: inp.lines,\n            linesLength: inp.lines.length\n        };\n        // Decide if this render will do a single update (single large .innerHTML) or many updates (inserting/removing dom nodes)\n        const resCtx = renderer.render(ctx, viewportData.startLineNumber, viewportData.endLineNumber, viewportData.relativeVerticalOffset);\n        this._linesCollection._set(resCtx.rendLineNumberStart, resCtx.lines);\n    }\n}\nclass ViewLayerRenderer {\n    static { this._ttPolicy = createTrustedTypesPolicy('editorViewLayer', { createHTML: value => value }); }\n    constructor(_domNode, _lineFactory, _viewportData, _viewContext) {\n        this._domNode = _domNode;\n        this._lineFactory = _lineFactory;\n        this._viewportData = _viewportData;\n        this._viewContext = _viewContext;\n    }\n    render(inContext, startLineNumber, stopLineNumber, deltaTop) {\n        const ctx = {\n            rendLineNumberStart: inContext.rendLineNumberStart,\n            lines: inContext.lines.slice(0),\n            linesLength: inContext.linesLength\n        };\n        if ((ctx.rendLineNumberStart + ctx.linesLength - 1 < startLineNumber) || (stopLineNumber < ctx.rendLineNumberStart)) {\n            // There is no overlap whatsoever\n            ctx.rendLineNumberStart = startLineNumber;\n            ctx.linesLength = stopLineNumber - startLineNumber + 1;\n            ctx.lines = [];\n            for (let x = startLineNumber; x <= stopLineNumber; x++) {\n                ctx.lines[x - startLineNumber] = this._lineFactory.createLine();\n            }\n            this._finishRendering(ctx, true, deltaTop);\n            return ctx;\n        }\n        // Update lines which will remain untouched\n        this._renderUntouchedLines(ctx, Math.max(startLineNumber - ctx.rendLineNumberStart, 0), Math.min(stopLineNumber - ctx.rendLineNumberStart, ctx.linesLength - 1), deltaTop, startLineNumber);\n        if (ctx.rendLineNumberStart > startLineNumber) {\n            // Insert lines before\n            const fromLineNumber = startLineNumber;\n            const toLineNumber = Math.min(stopLineNumber, ctx.rendLineNumberStart - 1);\n            if (fromLineNumber <= toLineNumber) {\n                this._insertLinesBefore(ctx, fromLineNumber, toLineNumber, deltaTop, startLineNumber);\n                ctx.linesLength += toLineNumber - fromLineNumber + 1;\n            }\n        }\n        else if (ctx.rendLineNumberStart < startLineNumber) {\n            // Remove lines before\n            const removeCnt = Math.min(ctx.linesLength, startLineNumber - ctx.rendLineNumberStart);\n            if (removeCnt > 0) {\n                this._removeLinesBefore(ctx, removeCnt);\n                ctx.linesLength -= removeCnt;\n            }\n        }\n        ctx.rendLineNumberStart = startLineNumber;\n        if (ctx.rendLineNumberStart + ctx.linesLength - 1 < stopLineNumber) {\n            // Insert lines after\n            const fromLineNumber = ctx.rendLineNumberStart + ctx.linesLength;\n            const toLineNumber = stopLineNumber;\n            if (fromLineNumber <= toLineNumber) {\n                this._insertLinesAfter(ctx, fromLineNumber, toLineNumber, deltaTop, startLineNumber);\n                ctx.linesLength += toLineNumber - fromLineNumber + 1;\n            }\n        }\n        else if (ctx.rendLineNumberStart + ctx.linesLength - 1 > stopLineNumber) {\n            // Remove lines after\n            const fromLineNumber = Math.max(0, stopLineNumber - ctx.rendLineNumberStart + 1);\n            const toLineNumber = ctx.linesLength - 1;\n            const removeCnt = toLineNumber - fromLineNumber + 1;\n            if (removeCnt > 0) {\n                this._removeLinesAfter(ctx, removeCnt);\n                ctx.linesLength -= removeCnt;\n            }\n        }\n        this._finishRendering(ctx, false, deltaTop);\n        return ctx;\n    }\n    _renderUntouchedLines(ctx, startIndex, endIndex, deltaTop, deltaLN) {\n        const rendLineNumberStart = ctx.rendLineNumberStart;\n        const lines = ctx.lines;\n        for (let i = startIndex; i <= endIndex; i++) {\n            const lineNumber = rendLineNumberStart + i;\n            lines[i].layoutLine(lineNumber, deltaTop[lineNumber - deltaLN], this._lineHeightForLineNumber(lineNumber));\n        }\n    }\n    _insertLinesBefore(ctx, fromLineNumber, toLineNumber, deltaTop, deltaLN) {\n        const newLines = [];\n        let newLinesLen = 0;\n        for (let lineNumber = fromLineNumber; lineNumber <= toLineNumber; lineNumber++) {\n            newLines[newLinesLen++] = this._lineFactory.createLine();\n        }\n        ctx.lines = newLines.concat(ctx.lines);\n    }\n    _removeLinesBefore(ctx, removeCount) {\n        for (let i = 0; i < removeCount; i++) {\n            const lineDomNode = ctx.lines[i].getDomNode();\n            lineDomNode?.remove();\n        }\n        ctx.lines.splice(0, removeCount);\n    }\n    _insertLinesAfter(ctx, fromLineNumber, toLineNumber, deltaTop, deltaLN) {\n        const newLines = [];\n        let newLinesLen = 0;\n        for (let lineNumber = fromLineNumber; lineNumber <= toLineNumber; lineNumber++) {\n            newLines[newLinesLen++] = this._lineFactory.createLine();\n        }\n        ctx.lines = ctx.lines.concat(newLines);\n    }\n    _removeLinesAfter(ctx, removeCount) {\n        const removeIndex = ctx.linesLength - removeCount;\n        for (let i = 0; i < removeCount; i++) {\n            const lineDomNode = ctx.lines[removeIndex + i].getDomNode();\n            lineDomNode?.remove();\n        }\n        ctx.lines.splice(removeIndex, removeCount);\n    }\n    _finishRenderingNewLines(ctx, domNodeIsEmpty, newLinesHTML, wasNew) {\n        if (ViewLayerRenderer._ttPolicy) {\n            newLinesHTML = ViewLayerRenderer._ttPolicy.createHTML(newLinesHTML);\n        }\n        const lastChild = this._domNode.lastChild;\n        if (domNodeIsEmpty || !lastChild) {\n            this._domNode.innerHTML = newLinesHTML; // explains the ugly casts -> https://github.com/microsoft/vscode/issues/106396#issuecomment-692625393;\n        }\n        else {\n            lastChild.insertAdjacentHTML('afterend', newLinesHTML);\n        }\n        let currChild = this._domNode.lastChild;\n        for (let i = ctx.linesLength - 1; i >= 0; i--) {\n            const line = ctx.lines[i];\n            if (wasNew[i]) {\n                line.setDomNode(currChild);\n                currChild = currChild.previousSibling;\n            }\n        }\n    }\n    _finishRenderingInvalidLines(ctx, invalidLinesHTML, wasInvalid) {\n        const hugeDomNode = document.createElement('div');\n        if (ViewLayerRenderer._ttPolicy) {\n            invalidLinesHTML = ViewLayerRenderer._ttPolicy.createHTML(invalidLinesHTML);\n        }\n        hugeDomNode.innerHTML = invalidLinesHTML;\n        for (let i = 0; i < ctx.linesLength; i++) {\n            const line = ctx.lines[i];\n            if (wasInvalid[i]) {\n                const source = hugeDomNode.firstChild;\n                const lineDomNode = line.getDomNode();\n                lineDomNode.replaceWith(source);\n                line.setDomNode(source);\n            }\n        }\n    }\n    static { this._sb = new StringBuilder(100000); }\n    _finishRendering(ctx, domNodeIsEmpty, deltaTop) {\n        const sb = ViewLayerRenderer._sb;\n        const linesLength = ctx.linesLength;\n        const lines = ctx.lines;\n        const rendLineNumberStart = ctx.rendLineNumberStart;\n        const wasNew = [];\n        {\n            sb.reset();\n            let hadNewLine = false;\n            for (let i = 0; i < linesLength; i++) {\n                const line = lines[i];\n                wasNew[i] = false;\n                const lineDomNode = line.getDomNode();\n                if (lineDomNode) {\n                    // line is not new\n                    continue;\n                }\n                const renderedLineNumber = i + rendLineNumberStart;\n                const renderResult = line.renderLine(renderedLineNumber, deltaTop[i], this._lineHeightForLineNumber(renderedLineNumber), this._viewportData, sb);\n                if (!renderResult) {\n                    // line does not need rendering\n                    continue;\n                }\n                wasNew[i] = true;\n                hadNewLine = true;\n            }\n            if (hadNewLine) {\n                this._finishRenderingNewLines(ctx, domNodeIsEmpty, sb.build(), wasNew);\n            }\n        }\n        {\n            sb.reset();\n            let hadInvalidLine = false;\n            const wasInvalid = [];\n            for (let i = 0; i < linesLength; i++) {\n                const line = lines[i];\n                wasInvalid[i] = false;\n                if (wasNew[i]) {\n                    // line was new\n                    continue;\n                }\n                const renderedLineNumber = i + rendLineNumberStart;\n                const renderResult = line.renderLine(renderedLineNumber, deltaTop[i], this._lineHeightForLineNumber(renderedLineNumber), this._viewportData, sb);\n                if (!renderResult) {\n                    // line does not need rendering\n                    continue;\n                }\n                wasInvalid[i] = true;\n                hadInvalidLine = true;\n            }\n            if (hadInvalidLine) {\n                this._finishRenderingInvalidLines(ctx, sb.build(), wasInvalid);\n            }\n        }\n    }\n    _lineHeightForLineNumber(lineNumber) {\n        return this._viewContext.viewLayout.getLineHeightForLineNumber(lineNumber);\n    }\n}\n\nexport { RenderedLinesCollection, VisibleLinesCollection };\n","import { createFastDomNode } from '../../../base/browser/fastDomNode.js';\nimport { applyFontInfo } from '../config/domFontInfo.js';\nimport { VisibleLinesCollection } from './viewLayer.js';\nimport { ViewPart } from './viewPart.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ViewOverlays extends ViewPart {\n    constructor(context) {\n        super(context);\n        this._dynamicOverlays = [];\n        this._isFocused = false;\n        this._visibleLines = new VisibleLinesCollection(this._context, {\n            createLine: () => new ViewOverlayLine(this._dynamicOverlays)\n        });\n        this.domNode = this._visibleLines.domNode;\n        const options = this._context.configuration.options;\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        applyFontInfo(this.domNode, fontInfo);\n        this.domNode.setClassName('view-overlays');\n    }\n    shouldRender() {\n        if (super.shouldRender()) {\n            return true;\n        }\n        for (let i = 0, len = this._dynamicOverlays.length; i < len; i++) {\n            const dynamicOverlay = this._dynamicOverlays[i];\n            if (dynamicOverlay.shouldRender()) {\n                return true;\n            }\n        }\n        return false;\n    }\n    dispose() {\n        super.dispose();\n        for (let i = 0, len = this._dynamicOverlays.length; i < len; i++) {\n            const dynamicOverlay = this._dynamicOverlays[i];\n            dynamicOverlay.dispose();\n        }\n        this._dynamicOverlays = [];\n    }\n    getDomNode() {\n        return this.domNode;\n    }\n    addDynamicOverlay(overlay) {\n        this._dynamicOverlays.push(overlay);\n    }\n    // ----- event handlers\n    onConfigurationChanged(e) {\n        this._visibleLines.onConfigurationChanged(e);\n        const options = this._context.configuration.options;\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        applyFontInfo(this.domNode, fontInfo);\n        return true;\n    }\n    onFlushed(e) {\n        return this._visibleLines.onFlushed(e);\n    }\n    onFocusChanged(e) {\n        this._isFocused = e.isFocused;\n        return true;\n    }\n    onLinesChanged(e) {\n        return this._visibleLines.onLinesChanged(e);\n    }\n    onLinesDeleted(e) {\n        return this._visibleLines.onLinesDeleted(e);\n    }\n    onLinesInserted(e) {\n        return this._visibleLines.onLinesInserted(e);\n    }\n    onScrollChanged(e) {\n        return this._visibleLines.onScrollChanged(e) || true;\n    }\n    onTokensChanged(e) {\n        return this._visibleLines.onTokensChanged(e);\n    }\n    onZonesChanged(e) {\n        return this._visibleLines.onZonesChanged(e);\n    }\n    // ----- end event handlers\n    prepareRender(ctx) {\n        const toRender = this._dynamicOverlays.filter(overlay => overlay.shouldRender());\n        for (let i = 0, len = toRender.length; i < len; i++) {\n            const dynamicOverlay = toRender[i];\n            dynamicOverlay.prepareRender(ctx);\n            dynamicOverlay.onDidRender();\n        }\n    }\n    render(ctx) {\n        // Overwriting to bypass `shouldRender` flag\n        this._viewOverlaysRender(ctx);\n        this.domNode.toggleClassName('focused', this._isFocused);\n    }\n    _viewOverlaysRender(ctx) {\n        this._visibleLines.renderLines(ctx.viewportData);\n    }\n}\nclass ViewOverlayLine {\n    constructor(dynamicOverlays) {\n        this._dynamicOverlays = dynamicOverlays;\n        this._domNode = null;\n        this._renderedContent = null;\n    }\n    getDomNode() {\n        if (!this._domNode) {\n            return null;\n        }\n        return this._domNode.domNode;\n    }\n    setDomNode(domNode) {\n        this._domNode = createFastDomNode(domNode);\n    }\n    onContentChanged() {\n        // Nothing\n    }\n    onTokensChanged() {\n        // Nothing\n    }\n    renderLine(lineNumber, deltaTop, lineHeight, viewportData, sb) {\n        let result = '';\n        for (let i = 0, len = this._dynamicOverlays.length; i < len; i++) {\n            const dynamicOverlay = this._dynamicOverlays[i];\n            result += dynamicOverlay.render(viewportData.startLineNumber, lineNumber);\n        }\n        if (this._renderedContent === result) {\n            // No rendering needed\n            return false;\n        }\n        this._renderedContent = result;\n        sb.appendString('<div style=\"top:');\n        sb.appendString(String(deltaTop));\n        sb.appendString('px;height:');\n        sb.appendString(String(lineHeight));\n        sb.appendString('px;line-height:');\n        sb.appendString(String(lineHeight));\n        sb.appendString('px;\">');\n        sb.appendString(result);\n        sb.appendString('</div>');\n        return true;\n    }\n    layoutLine(lineNumber, deltaTop, lineHeight) {\n        if (this._domNode) {\n            this._domNode.setTop(deltaTop);\n            this._domNode.setHeight(lineHeight);\n            this._domNode.setLineHeight(lineHeight);\n        }\n    }\n}\nclass ContentViewOverlays extends ViewOverlays {\n    constructor(context) {\n        super(context);\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._contentWidth = layoutInfo.contentWidth;\n        this.domNode.setHeight(0);\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._contentWidth = layoutInfo.contentWidth;\n        return super.onConfigurationChanged(e) || true;\n    }\n    onScrollChanged(e) {\n        return super.onScrollChanged(e) || e.scrollWidthChanged;\n    }\n    // --- end event handlers\n    _viewOverlaysRender(ctx) {\n        super._viewOverlaysRender(ctx);\n        this.domNode.setWidth(Math.max(ctx.scrollWidth, this._contentWidth));\n    }\n}\nclass MarginViewOverlays extends ViewOverlays {\n    constructor(context) {\n        super(context);\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._contentLeft = layoutInfo.contentLeft;\n        this.domNode.setClassName('margin-view-overlays');\n        this.domNode.setWidth(1);\n        applyFontInfo(this.domNode, options.get(59 /* EditorOption.fontInfo */));\n    }\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        applyFontInfo(this.domNode, options.get(59 /* EditorOption.fontInfo */));\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._contentLeft = layoutInfo.contentLeft;\n        return super.onConfigurationChanged(e) || true;\n    }\n    onScrollChanged(e) {\n        return super.onScrollChanged(e) || e.scrollHeightChanged;\n    }\n    _viewOverlaysRender(ctx) {\n        super._viewOverlaysRender(ctx);\n        const height = Math.min(ctx.scrollHeight, 1000000);\n        this.domNode.setHeight(height);\n        this.domNode.setWidth(this._contentLeft);\n    }\n}\n\nexport { ContentViewOverlays, MarginViewOverlays, ViewOverlayLine, ViewOverlays };\n","import { Position } from '../../common/core/position.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ViewUserInputEvents {\n    constructor(coordinatesConverter) {\n        this.onKeyDown = null;\n        this.onKeyUp = null;\n        this.onContextMenu = null;\n        this.onMouseMove = null;\n        this.onMouseLeave = null;\n        this.onMouseDown = null;\n        this.onMouseUp = null;\n        this.onMouseDrag = null;\n        this.onMouseDrop = null;\n        this.onMouseDropCanceled = null;\n        this.onMouseWheel = null;\n        this._coordinatesConverter = coordinatesConverter;\n    }\n    emitKeyDown(e) {\n        this.onKeyDown?.(e);\n    }\n    emitKeyUp(e) {\n        this.onKeyUp?.(e);\n    }\n    emitContextMenu(e) {\n        this.onContextMenu?.(this._convertViewToModelMouseEvent(e));\n    }\n    emitMouseMove(e) {\n        this.onMouseMove?.(this._convertViewToModelMouseEvent(e));\n    }\n    emitMouseLeave(e) {\n        this.onMouseLeave?.(this._convertViewToModelMouseEvent(e));\n    }\n    emitMouseDown(e) {\n        this.onMouseDown?.(this._convertViewToModelMouseEvent(e));\n    }\n    emitMouseUp(e) {\n        this.onMouseUp?.(this._convertViewToModelMouseEvent(e));\n    }\n    emitMouseDrag(e) {\n        this.onMouseDrag?.(this._convertViewToModelMouseEvent(e));\n    }\n    emitMouseDrop(e) {\n        this.onMouseDrop?.(this._convertViewToModelMouseEvent(e));\n    }\n    emitMouseDropCanceled() {\n        this.onMouseDropCanceled?.();\n    }\n    emitMouseWheel(e) {\n        this.onMouseWheel?.(e);\n    }\n    _convertViewToModelMouseEvent(e) {\n        if (e.target) {\n            return {\n                event: e.event,\n                target: this._convertViewToModelMouseTarget(e.target)\n            };\n        }\n        return e;\n    }\n    _convertViewToModelMouseTarget(target) {\n        return ViewUserInputEvents.convertViewToModelMouseTarget(target, this._coordinatesConverter);\n    }\n    static convertViewToModelMouseTarget(target, coordinatesConverter) {\n        const result = { ...target };\n        if (result.position) {\n            result.position = coordinatesConverter.convertViewPositionToModelPosition(result.position);\n        }\n        if (result.range) {\n            result.range = coordinatesConverter.convertViewRangeToModelRange(result.range);\n        }\n        if (result.type === 5 /* MouseTargetType.GUTTER_VIEW_ZONE */ || result.type === 8 /* MouseTargetType.CONTENT_VIEW_ZONE */) {\n            result.detail = this.convertViewToModelViewZoneData(result.detail, coordinatesConverter);\n        }\n        return result;\n    }\n    static convertViewToModelViewZoneData(data, coordinatesConverter) {\n        return {\n            viewZoneId: data.viewZoneId,\n            positionBefore: data.positionBefore ? coordinatesConverter.convertViewPositionToModelPosition(data.positionBefore) : data.positionBefore,\n            positionAfter: data.positionAfter ? coordinatesConverter.convertViewPositionToModelPosition(data.positionAfter) : data.positionAfter,\n            position: coordinatesConverter.convertViewPositionToModelPosition(data.position),\n            afterLineNumber: coordinatesConverter.convertViewPositionToModelPosition(new Position(data.afterLineNumber, 1)).lineNumber,\n        };\n    }\n}\n\nexport { ViewUserInputEvents };\n","import { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport './blockDecorations.css';\nimport { ViewPart } from '../../view/viewPart.js';\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 *--------------------------------------------------------------------------------------------*/\nclass BlockDecorations extends ViewPart {\n    constructor(context) {\n        super(context);\n        this.blocks = [];\n        this.contentWidth = -1;\n        this.contentLeft = 0;\n        this.domNode = createFastDomNode(document.createElement('div'));\n        this.domNode.setAttribute('role', 'presentation');\n        this.domNode.setAttribute('aria-hidden', 'true');\n        this.domNode.setClassName('blockDecorations-container');\n        this.update();\n    }\n    update() {\n        let didChange = false;\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        const newContentWidth = layoutInfo.contentWidth - layoutInfo.verticalScrollbarWidth;\n        if (this.contentWidth !== newContentWidth) {\n            this.contentWidth = newContentWidth;\n            didChange = true;\n        }\n        const newContentLeft = layoutInfo.contentLeft;\n        if (this.contentLeft !== newContentLeft) {\n            this.contentLeft = newContentLeft;\n            didChange = true;\n        }\n        return didChange;\n    }\n    dispose() {\n        super.dispose();\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        return this.update();\n    }\n    onScrollChanged(e) {\n        return e.scrollTopChanged || e.scrollLeftChanged;\n    }\n    onDecorationsChanged(e) {\n        return true;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    // --- end event handlers\n    prepareRender(ctx) {\n        // Nothing to read\n    }\n    render(ctx) {\n        let count = 0;\n        const decorations = ctx.getDecorationsInViewport();\n        for (const decoration of decorations) {\n            if (!decoration.options.blockClassName) {\n                continue;\n            }\n            let block = this.blocks[count];\n            if (!block) {\n                block = this.blocks[count] = createFastDomNode(document.createElement('div'));\n                this.domNode.appendChild(block);\n            }\n            let top;\n            let bottom;\n            if (decoration.options.blockIsAfterEnd) {\n                // range must be empty\n                top = ctx.getVerticalOffsetAfterLineNumber(decoration.range.endLineNumber, false);\n                bottom = ctx.getVerticalOffsetAfterLineNumber(decoration.range.endLineNumber, true);\n            }\n            else {\n                top = ctx.getVerticalOffsetForLineNumber(decoration.range.startLineNumber, true);\n                bottom = decoration.range.isEmpty() && !decoration.options.blockDoesNotCollapse\n                    ? ctx.getVerticalOffsetForLineNumber(decoration.range.startLineNumber, false)\n                    : ctx.getVerticalOffsetAfterLineNumber(decoration.range.endLineNumber, true);\n            }\n            const [paddingTop, paddingRight, paddingBottom, paddingLeft] = decoration.options.blockPadding ?? [0, 0, 0, 0];\n            block.setClassName('blockDecorations-block ' + decoration.options.blockClassName);\n            block.setLeft(this.contentLeft - paddingLeft);\n            block.setWidth(this.contentWidth + paddingLeft + paddingRight);\n            block.setTop(top - ctx.scrollTop - paddingTop);\n            block.setHeight(bottom - top + paddingTop + paddingBottom);\n            count++;\n        }\n        for (let i = count; i < this.blocks.length; i++) {\n            this.blocks[i].domNode.remove();\n        }\n        this.blocks.length = count;\n    }\n}\n\nexport { BlockDecorations };\n","import { getDomNodePagePosition, getClientArea } from '../../../../base/browser/dom.js';\nimport { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport { ViewPart, PartFingerprints } from '../../view/viewPart.js';\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/**\n * This view part is responsible for rendering the content widgets, which are\n * used for rendering elements that are associated to an editor position,\n * such as suggestions or the parameter hints.\n */\nclass ViewContentWidgets extends ViewPart {\n    constructor(context, viewDomNode) {\n        super(context);\n        this._viewDomNode = viewDomNode;\n        this._widgets = {};\n        this.domNode = createFastDomNode(document.createElement('div'));\n        PartFingerprints.write(this.domNode, 1 /* PartFingerprint.ContentWidgets */);\n        this.domNode.setClassName('contentWidgets');\n        this.domNode.setPosition('absolute');\n        this.domNode.setTop(0);\n        this.overflowingContentWidgetsDomNode = createFastDomNode(document.createElement('div'));\n        PartFingerprints.write(this.overflowingContentWidgetsDomNode, 2 /* PartFingerprint.OverflowingContentWidgets */);\n        this.overflowingContentWidgetsDomNode.setClassName('overflowingContentWidgets');\n    }\n    dispose() {\n        super.dispose();\n        this._widgets = {};\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        const keys = Object.keys(this._widgets);\n        for (const widgetId of keys) {\n            this._widgets[widgetId].onConfigurationChanged(e);\n        }\n        return true;\n    }\n    onDecorationsChanged(e) {\n        // true for inline decorations that can end up relayouting text\n        return true;\n    }\n    onFlushed(e) {\n        return true;\n    }\n    onLineMappingChanged(e) {\n        this._updateAnchorsViewPositions();\n        return true;\n    }\n    onLinesChanged(e) {\n        this._updateAnchorsViewPositions();\n        return true;\n    }\n    onLinesDeleted(e) {\n        this._updateAnchorsViewPositions();\n        return true;\n    }\n    onLinesInserted(e) {\n        this._updateAnchorsViewPositions();\n        return true;\n    }\n    onScrollChanged(e) {\n        return true;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    // ---- end view event handlers\n    _updateAnchorsViewPositions() {\n        const keys = Object.keys(this._widgets);\n        for (const widgetId of keys) {\n            this._widgets[widgetId].updateAnchorViewPosition();\n        }\n    }\n    addWidget(_widget) {\n        const myWidget = new Widget(this._context, this._viewDomNode, _widget);\n        this._widgets[myWidget.id] = myWidget;\n        if (myWidget.allowEditorOverflow) {\n            this.overflowingContentWidgetsDomNode.appendChild(myWidget.domNode);\n        }\n        else {\n            this.domNode.appendChild(myWidget.domNode);\n        }\n        this.setShouldRender();\n    }\n    setWidgetPosition(widget, primaryAnchor, secondaryAnchor, preference, affinity) {\n        const myWidget = this._widgets[widget.getId()];\n        myWidget.setPosition(primaryAnchor, secondaryAnchor, preference, affinity);\n        this.setShouldRender();\n    }\n    removeWidget(widget) {\n        const widgetId = widget.getId();\n        if (this._widgets.hasOwnProperty(widgetId)) {\n            const myWidget = this._widgets[widgetId];\n            delete this._widgets[widgetId];\n            const domNode = myWidget.domNode.domNode;\n            domNode.remove();\n            domNode.removeAttribute('monaco-visible-content-widget');\n            this.setShouldRender();\n        }\n    }\n    shouldSuppressMouseDownOnWidget(widgetId) {\n        if (this._widgets.hasOwnProperty(widgetId)) {\n            return this._widgets[widgetId].suppressMouseDown;\n        }\n        return false;\n    }\n    onBeforeRender(viewportData) {\n        const keys = Object.keys(this._widgets);\n        for (const widgetId of keys) {\n            this._widgets[widgetId].onBeforeRender(viewportData);\n        }\n    }\n    prepareRender(ctx) {\n        const keys = Object.keys(this._widgets);\n        for (const widgetId of keys) {\n            this._widgets[widgetId].prepareRender(ctx);\n        }\n    }\n    render(ctx) {\n        const keys = Object.keys(this._widgets);\n        for (const widgetId of keys) {\n            this._widgets[widgetId].render(ctx);\n        }\n    }\n}\nclass Widget {\n    constructor(context, viewDomNode, actual) {\n        this._primaryAnchor = new PositionPair(null, null);\n        this._secondaryAnchor = new PositionPair(null, null);\n        this._context = context;\n        this._viewDomNode = viewDomNode;\n        this._actual = actual;\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        const allowOverflow = options.get(4 /* EditorOption.allowOverflow */);\n        this.domNode = createFastDomNode(this._actual.getDomNode());\n        this.id = this._actual.getId();\n        this.allowEditorOverflow = (this._actual.allowEditorOverflow || false) && allowOverflow;\n        this.suppressMouseDown = this._actual.suppressMouseDown || false;\n        this._fixedOverflowWidgets = options.get(51 /* EditorOption.fixedOverflowWidgets */);\n        this._contentWidth = layoutInfo.contentWidth;\n        this._contentLeft = layoutInfo.contentLeft;\n        this._affinity = null;\n        this._preference = [];\n        this._cachedDomNodeOffsetWidth = -1;\n        this._cachedDomNodeOffsetHeight = -1;\n        this._maxWidth = this._getMaxWidth();\n        this._isVisible = false;\n        this._renderData = null;\n        this.domNode.setPosition((this._fixedOverflowWidgets && this.allowEditorOverflow) ? 'fixed' : 'absolute');\n        this.domNode.setDisplay('none');\n        this.domNode.setVisibility('hidden');\n        this.domNode.setAttribute('widgetId', this.id);\n        this.domNode.setMaxWidth(this._maxWidth);\n    }\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        if (e.hasChanged(165 /* EditorOption.layoutInfo */)) {\n            const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n            this._contentLeft = layoutInfo.contentLeft;\n            this._contentWidth = layoutInfo.contentWidth;\n            this._maxWidth = this._getMaxWidth();\n        }\n    }\n    updateAnchorViewPosition() {\n        this._setPosition(this._affinity, this._primaryAnchor.modelPosition, this._secondaryAnchor.modelPosition);\n    }\n    _setPosition(affinity, primaryAnchor, secondaryAnchor) {\n        this._affinity = affinity;\n        this._primaryAnchor = getValidPositionPair(primaryAnchor, this._context.viewModel, this._affinity);\n        this._secondaryAnchor = getValidPositionPair(secondaryAnchor, this._context.viewModel, this._affinity);\n        function getValidPositionPair(position, viewModel, affinity) {\n            if (!position) {\n                return new PositionPair(null, null);\n            }\n            // Do not trust that widgets give a valid position\n            const validModelPosition = viewModel.model.validatePosition(position);\n            if (viewModel.coordinatesConverter.modelPositionIsVisible(validModelPosition)) {\n                const viewPosition = viewModel.coordinatesConverter.convertModelPositionToViewPosition(validModelPosition, affinity ?? undefined);\n                return new PositionPair(position, viewPosition);\n            }\n            return new PositionPair(position, null);\n        }\n    }\n    _getMaxWidth() {\n        const elDocument = this.domNode.domNode.ownerDocument;\n        const elWindow = elDocument.defaultView;\n        return (this.allowEditorOverflow\n            ? elWindow?.innerWidth || elDocument.documentElement.offsetWidth || elDocument.body.offsetWidth\n            : this._contentWidth);\n    }\n    setPosition(primaryAnchor, secondaryAnchor, preference, affinity) {\n        this._setPosition(affinity, primaryAnchor, secondaryAnchor);\n        this._preference = preference;\n        if (this._primaryAnchor.viewPosition && this._preference && this._preference.length > 0) {\n            // this content widget would like to be visible if possible\n            // we change it from `display:none` to `display:block` even if it\n            // might be outside the viewport such that we can measure its size\n            // in `prepareRender`\n            this.domNode.setDisplay('block');\n        }\n        else {\n            this.domNode.setDisplay('none');\n        }\n        this._cachedDomNodeOffsetWidth = -1;\n        this._cachedDomNodeOffsetHeight = -1;\n    }\n    _layoutBoxInViewport(anchor, width, height, ctx) {\n        // Our visible box is split horizontally by the current line => 2 boxes\n        // a) the box above the line\n        const aboveLineTop = anchor.top;\n        const heightAvailableAboveLine = aboveLineTop;\n        // b) the box under the line\n        const underLineTop = anchor.top + anchor.height;\n        const heightAvailableUnderLine = ctx.viewportHeight - underLineTop;\n        const aboveTop = aboveLineTop - height;\n        const fitsAbove = (heightAvailableAboveLine >= height);\n        const belowTop = underLineTop;\n        const fitsBelow = (heightAvailableUnderLine >= height);\n        // And its left\n        let left = anchor.left;\n        if (left + width > ctx.scrollLeft + ctx.viewportWidth) {\n            left = ctx.scrollLeft + ctx.viewportWidth - width;\n        }\n        if (left < ctx.scrollLeft) {\n            left = ctx.scrollLeft;\n        }\n        return { fitsAbove, aboveTop, fitsBelow, belowTop, left };\n    }\n    _layoutHorizontalSegmentInPage(windowSize, domNodePosition, left, width) {\n        // Leave some clearance to the left/right\n        const LEFT_PADDING = 15;\n        const RIGHT_PADDING = 15;\n        // Initially, the limits are defined as the dom node limits\n        const MIN_LIMIT = Math.max(LEFT_PADDING, domNodePosition.left - width);\n        const MAX_LIMIT = Math.min(domNodePosition.left + domNodePosition.width + width, windowSize.width - RIGHT_PADDING);\n        const elDocument = this._viewDomNode.domNode.ownerDocument;\n        const elWindow = elDocument.defaultView;\n        let absoluteLeft = domNodePosition.left + left - (elWindow?.scrollX ?? 0);\n        if (absoluteLeft + width > MAX_LIMIT) {\n            const delta = absoluteLeft - (MAX_LIMIT - width);\n            absoluteLeft -= delta;\n            left -= delta;\n        }\n        if (absoluteLeft < MIN_LIMIT) {\n            const delta = absoluteLeft - MIN_LIMIT;\n            absoluteLeft -= delta;\n            left -= delta;\n        }\n        return [left, absoluteLeft];\n    }\n    _layoutBoxInPage(anchor, width, height, ctx) {\n        const aboveTop = anchor.top - height;\n        const belowTop = anchor.top + anchor.height;\n        const domNodePosition = getDomNodePagePosition(this._viewDomNode.domNode);\n        const elDocument = this._viewDomNode.domNode.ownerDocument;\n        const elWindow = elDocument.defaultView;\n        const absoluteAboveTop = domNodePosition.top + aboveTop - (elWindow?.scrollY ?? 0);\n        const absoluteBelowTop = domNodePosition.top + belowTop - (elWindow?.scrollY ?? 0);\n        const windowSize = getClientArea(elDocument.body);\n        const [left, absoluteAboveLeft] = this._layoutHorizontalSegmentInPage(windowSize, domNodePosition, anchor.left - ctx.scrollLeft + this._contentLeft, width);\n        // Leave some clearance to the top/bottom\n        const TOP_PADDING = 22;\n        const BOTTOM_PADDING = 22;\n        const fitsAbove = (absoluteAboveTop >= TOP_PADDING);\n        const fitsBelow = (absoluteBelowTop + height <= windowSize.height - BOTTOM_PADDING);\n        if (this._fixedOverflowWidgets) {\n            return {\n                fitsAbove,\n                aboveTop: Math.max(absoluteAboveTop, TOP_PADDING),\n                fitsBelow,\n                belowTop: absoluteBelowTop,\n                left: absoluteAboveLeft\n            };\n        }\n        return { fitsAbove, aboveTop, fitsBelow, belowTop, left };\n    }\n    _prepareRenderWidgetAtExactPositionOverflowing(topLeft) {\n        return new Coordinate(topLeft.top, topLeft.left + this._contentLeft);\n    }\n    /**\n     * Compute the coordinates above and below the primary and secondary anchors.\n     * The content widget *must* touch the primary anchor.\n     * The content widget should touch if possible the secondary anchor.\n     */\n    _getAnchorsCoordinates(ctx) {\n        const primary = getCoordinates(this._primaryAnchor.viewPosition, this._affinity);\n        const secondaryViewPosition = (this._secondaryAnchor.viewPosition?.lineNumber === this._primaryAnchor.viewPosition?.lineNumber ? this._secondaryAnchor.viewPosition : null);\n        const secondary = getCoordinates(secondaryViewPosition, this._affinity);\n        return { primary, secondary };\n        function getCoordinates(position, affinity) {\n            if (!position) {\n                return null;\n            }\n            const horizontalPosition = ctx.visibleRangeForPosition(position);\n            if (!horizontalPosition) {\n                return null;\n            }\n            // Left-align widgets that should appear :before content\n            const left = (position.column === 1 && affinity === 3 /* PositionAffinity.LeftOfInjectedText */ ? 0 : horizontalPosition.left);\n            const top = ctx.getVerticalOffsetForLineNumber(position.lineNumber) - ctx.scrollTop;\n            const lineHeight = ctx.getLineHeightForLineNumber(position.lineNumber);\n            return new AnchorCoordinate(top, left, lineHeight);\n        }\n    }\n    _reduceAnchorCoordinates(primary, secondary, width) {\n        if (!secondary) {\n            return primary;\n        }\n        const fontInfo = this._context.configuration.options.get(59 /* EditorOption.fontInfo */);\n        let left = secondary.left;\n        if (left < primary.left) {\n            left = Math.max(left, primary.left - width + fontInfo.typicalFullwidthCharacterWidth);\n        }\n        else {\n            left = Math.min(left, primary.left + width - fontInfo.typicalFullwidthCharacterWidth);\n        }\n        return new AnchorCoordinate(primary.top, left, primary.height);\n    }\n    _prepareRenderWidget(ctx) {\n        if (!this._preference || this._preference.length === 0) {\n            return null;\n        }\n        const { primary, secondary } = this._getAnchorsCoordinates(ctx);\n        if (!primary) {\n            return {\n                kind: 'offViewport',\n                preserveFocus: this.domNode.domNode.contains(this.domNode.domNode.ownerDocument.activeElement)\n            };\n            // return null;\n        }\n        if (this._cachedDomNodeOffsetWidth === -1 || this._cachedDomNodeOffsetHeight === -1) {\n            let preferredDimensions = null;\n            if (typeof this._actual.beforeRender === 'function') {\n                preferredDimensions = safeInvoke(this._actual.beforeRender, this._actual);\n            }\n            if (preferredDimensions) {\n                this._cachedDomNodeOffsetWidth = preferredDimensions.width;\n                this._cachedDomNodeOffsetHeight = preferredDimensions.height;\n            }\n            else {\n                const domNode = this.domNode.domNode;\n                const clientRect = domNode.getBoundingClientRect();\n                this._cachedDomNodeOffsetWidth = Math.round(clientRect.width);\n                this._cachedDomNodeOffsetHeight = Math.round(clientRect.height);\n            }\n        }\n        const anchor = this._reduceAnchorCoordinates(primary, secondary, this._cachedDomNodeOffsetWidth);\n        let placement;\n        if (this.allowEditorOverflow) {\n            placement = this._layoutBoxInPage(anchor, this._cachedDomNodeOffsetWidth, this._cachedDomNodeOffsetHeight, ctx);\n        }\n        else {\n            placement = this._layoutBoxInViewport(anchor, this._cachedDomNodeOffsetWidth, this._cachedDomNodeOffsetHeight, ctx);\n        }\n        // Do two passes, first for perfect fit, second picks first option\n        for (let pass = 1; pass <= 2; pass++) {\n            for (const pref of this._preference) {\n                // placement\n                if (pref === 1 /* ContentWidgetPositionPreference.ABOVE */) {\n                    if (!placement) {\n                        // Widget outside of viewport\n                        return null;\n                    }\n                    if (pass === 2 || placement.fitsAbove) {\n                        return {\n                            kind: 'inViewport',\n                            coordinate: new Coordinate(placement.aboveTop, placement.left),\n                            position: 1 /* ContentWidgetPositionPreference.ABOVE */\n                        };\n                    }\n                }\n                else if (pref === 2 /* ContentWidgetPositionPreference.BELOW */) {\n                    if (!placement) {\n                        // Widget outside of viewport\n                        return null;\n                    }\n                    if (pass === 2 || placement.fitsBelow) {\n                        return {\n                            kind: 'inViewport',\n                            coordinate: new Coordinate(placement.belowTop, placement.left),\n                            position: 2 /* ContentWidgetPositionPreference.BELOW */\n                        };\n                    }\n                }\n                else {\n                    if (this.allowEditorOverflow) {\n                        return {\n                            kind: 'inViewport',\n                            coordinate: this._prepareRenderWidgetAtExactPositionOverflowing(new Coordinate(anchor.top, anchor.left)),\n                            position: 0 /* ContentWidgetPositionPreference.EXACT */\n                        };\n                    }\n                    else {\n                        return {\n                            kind: 'inViewport',\n                            coordinate: new Coordinate(anchor.top, anchor.left),\n                            position: 0 /* ContentWidgetPositionPreference.EXACT */\n                        };\n                    }\n                }\n            }\n        }\n        return null;\n    }\n    /**\n     * On this first pass, we ensure that the content widget (if it is in the viewport) has the max width set correctly.\n     */\n    onBeforeRender(viewportData) {\n        if (!this._primaryAnchor.viewPosition || !this._preference) {\n            return;\n        }\n        if (this._primaryAnchor.viewPosition.lineNumber < viewportData.startLineNumber || this._primaryAnchor.viewPosition.lineNumber > viewportData.endLineNumber) {\n            // Outside of viewport\n            return;\n        }\n        this.domNode.setMaxWidth(this._maxWidth);\n    }\n    prepareRender(ctx) {\n        this._renderData = this._prepareRenderWidget(ctx);\n    }\n    render(ctx) {\n        if (!this._renderData || this._renderData.kind === 'offViewport') {\n            // This widget should be invisible\n            if (this._isVisible) {\n                this.domNode.removeAttribute('monaco-visible-content-widget');\n                this._isVisible = false;\n                if (this._renderData?.kind === 'offViewport' && this._renderData.preserveFocus) {\n                    // widget wants to be shown, but it is outside of the viewport and it\n                    // has focus which we need to preserve\n                    this.domNode.setTop(-1e3);\n                }\n                else {\n                    this.domNode.setVisibility('hidden');\n                }\n            }\n            if (typeof this._actual.afterRender === 'function') {\n                safeInvoke(this._actual.afterRender, this._actual, null, null);\n            }\n            return;\n        }\n        // This widget should be visible\n        if (this.allowEditorOverflow) {\n            this.domNode.setTop(this._renderData.coordinate.top);\n            this.domNode.setLeft(this._renderData.coordinate.left);\n        }\n        else {\n            this.domNode.setTop(this._renderData.coordinate.top + ctx.scrollTop - ctx.bigNumbersDelta);\n            this.domNode.setLeft(this._renderData.coordinate.left);\n        }\n        if (!this._isVisible) {\n            this.domNode.setVisibility('inherit');\n            this.domNode.setAttribute('monaco-visible-content-widget', 'true');\n            this._isVisible = true;\n        }\n        if (typeof this._actual.afterRender === 'function') {\n            safeInvoke(this._actual.afterRender, this._actual, this._renderData.position, this._renderData.coordinate);\n        }\n    }\n}\nclass PositionPair {\n    constructor(modelPosition, viewPosition) {\n        this.modelPosition = modelPosition;\n        this.viewPosition = viewPosition;\n    }\n}\nclass Coordinate {\n    constructor(top, left) {\n        this.top = top;\n        this.left = left;\n        this._coordinateBrand = undefined;\n    }\n}\nclass AnchorCoordinate {\n    constructor(top, left, height) {\n        this.top = top;\n        this.left = left;\n        this.height = height;\n        this._anchorCoordinateBrand = undefined;\n    }\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction safeInvoke(fn, thisArg, ...args) {\n    try {\n        return fn.call(thisArg, ...args);\n    }\n    catch {\n        // ignore\n        return null;\n    }\n}\n\nexport { ViewContentWidgets };\n","import { ViewEventHandler } from '../../common/viewEventHandler.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DynamicViewOverlay extends ViewEventHandler {\n}\n\nexport { DynamicViewOverlay };\n","import { Emitter } from '../../../base/common/event.js';\nimport { Disposable, toDisposable } from '../../../base/common/lifecycle.js';\nimport { createDecorator } from '../../instantiation/common/instantiation.js';\nimport { Registry } from '../../registry/common/platform.js';\nimport { ThemeTypeSelector, ColorScheme } from './theme.js';\n\nconst IThemeService = createDecorator('themeService');\nfunction themeColorFromId(id) {\n    return { id };\n}\nfunction getThemeTypeSelector(type) {\n    switch (type) {\n        case ColorScheme.DARK: return ThemeTypeSelector.VS_DARK;\n        case ColorScheme.HIGH_CONTRAST_DARK: return ThemeTypeSelector.HC_BLACK;\n        case ColorScheme.HIGH_CONTRAST_LIGHT: return ThemeTypeSelector.HC_LIGHT;\n        default: return ThemeTypeSelector.VS;\n    }\n}\n// static theming participant\nconst Extensions = {\n    ThemingContribution: 'base.contributions.theming'\n};\nclass ThemingRegistry extends Disposable {\n    constructor() {\n        super();\n        this.themingParticipants = [];\n        this.themingParticipants = [];\n        this.onThemingParticipantAddedEmitter = this._register(new Emitter());\n    }\n    onColorThemeChange(participant) {\n        this.themingParticipants.push(participant);\n        this.onThemingParticipantAddedEmitter.fire(participant);\n        return toDisposable(() => {\n            const idx = this.themingParticipants.indexOf(participant);\n            this.themingParticipants.splice(idx, 1);\n        });\n    }\n    getThemingParticipants() {\n        return this.themingParticipants;\n    }\n}\nconst themingRegistry = new ThemingRegistry();\nRegistry.add(Extensions.ThemingContribution, themingRegistry);\nfunction registerThemingParticipant(participant) {\n    return themingRegistry.onColorThemeChange(participant);\n}\n/**\n * Utility base class for all themable components.\n */\nclass Themable extends Disposable {\n    constructor(themeService) {\n        super();\n        this.themeService = themeService;\n        this.theme = themeService.getColorTheme();\n        // Hook up to theme changes\n        this._register(this.themeService.onDidColorThemeChange(theme => this.onThemeChange(theme)));\n    }\n    onThemeChange(theme) {\n        this.theme = theme;\n        this.updateStyles();\n    }\n    updateStyles() {\n        // Subclasses to override\n    }\n}\n\nexport { Extensions, IThemeService, Themable, getThemeTypeSelector, registerThemingParticipant, themeColorFromId };\n","import { localize } from '../../../nls.js';\nimport { Color, RGBA } from '../../../base/common/color.js';\nimport { registerColor } from '../../../platform/theme/common/colorUtils.js';\nimport { contrastBorder, activeContrastBorder } from '../../../platform/theme/common/colors/baseColors.js';\nimport '../../../platform/theme/common/colors/chartsColors.js';\nimport { editorFindMatchHighlight, editorBackground, editorWarningBorder, editorWarningForeground, editorInfoBorder, editorInfoForeground, editorWarningBackground } from '../../../platform/theme/common/colors/editorColors.js';\nimport '../../../platform/theme/common/colors/inputColors.js';\nimport '../../../platform/theme/common/colors/listColors.js';\nimport '../../../platform/theme/common/colors/menuColors.js';\nimport '../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../platform/theme/common/colors/miscColors.js';\nimport '../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../platform/theme/common/colors/searchColors.js';\nimport { registerThemingParticipant } from '../../../platform/theme/common/themeService.js';\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/**\n * Definition of the editor colors\n */\nconst editorLineHighlight = registerColor('editor.lineHighlightBackground', null, localize(610, 'Background color for the highlight of line at the cursor position.'));\nconst editorLineHighlightBorder = registerColor('editor.lineHighlightBorder', { dark: '#282828', light: '#eeeeee', hcDark: '#f38518', hcLight: contrastBorder }, localize(611, 'Background color for the border around the line at the cursor position.'));\nregisterColor('editor.rangeHighlightBackground', { dark: '#ffffff0b', light: '#fdff0033', hcDark: null, hcLight: null }, localize(612, 'Background color of highlighted ranges, like by quick open and find features. The color must not be opaque so as not to hide underlying decorations.'), true);\nregisterColor('editor.rangeHighlightBorder', { dark: null, light: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize(613, 'Background color of the border around highlighted ranges.'));\nregisterColor('editor.symbolHighlightBackground', { dark: editorFindMatchHighlight, light: editorFindMatchHighlight, hcDark: null, hcLight: null }, localize(614, 'Background color of highlighted symbol, like for go to definition or go next/previous symbol. The color must not be opaque so as not to hide underlying decorations.'), true);\nregisterColor('editor.symbolHighlightBorder', { dark: null, light: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize(615, 'Background color of the border around highlighted symbols.'));\nconst editorCursorForeground = registerColor('editorCursor.foreground', { dark: '#AEAFAD', light: Color.black, hcDark: Color.white, hcLight: '#0F4A85' }, localize(616, 'Color of the editor cursor.'));\nconst editorCursorBackground = registerColor('editorCursor.background', null, localize(617, 'The background color of the editor cursor. Allows customizing the color of a character overlapped by a block cursor.'));\nconst editorMultiCursorPrimaryForeground = registerColor('editorMultiCursor.primary.foreground', editorCursorForeground, localize(618, 'Color of the primary editor cursor when multiple cursors are present.'));\nconst editorMultiCursorPrimaryBackground = registerColor('editorMultiCursor.primary.background', editorCursorBackground, localize(619, 'The background color of the primary editor cursor when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.'));\nconst editorMultiCursorSecondaryForeground = registerColor('editorMultiCursor.secondary.foreground', editorCursorForeground, localize(620, 'Color of secondary editor cursors when multiple cursors are present.'));\nconst editorMultiCursorSecondaryBackground = registerColor('editorMultiCursor.secondary.background', editorCursorBackground, localize(621, 'The background color of secondary editor cursors when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.'));\nconst editorWhitespaces = registerColor('editorWhitespace.foreground', { dark: '#e3e4e229', light: '#33333333', hcDark: '#e3e4e229', hcLight: '#CCCCCC' }, localize(622, 'Color of whitespace characters in the editor.'));\nconst editorLineNumbers = registerColor('editorLineNumber.foreground', { dark: '#858585', light: '#237893', hcDark: Color.white, hcLight: '#292929' }, localize(623, 'Color of editor line numbers.'));\nconst deprecatedEditorIndentGuides = registerColor('editorIndentGuide.background', editorWhitespaces, localize(624, 'Color of the editor indentation guides.'), false, localize(625, '\\'editorIndentGuide.background\\' is deprecated. Use \\'editorIndentGuide.background1\\' instead.'));\nconst deprecatedEditorActiveIndentGuides = registerColor('editorIndentGuide.activeBackground', editorWhitespaces, localize(626, 'Color of the active editor indentation guides.'), false, localize(627, '\\'editorIndentGuide.activeBackground\\' is deprecated. Use \\'editorIndentGuide.activeBackground1\\' instead.'));\nconst editorIndentGuide1 = registerColor('editorIndentGuide.background1', deprecatedEditorIndentGuides, localize(628, 'Color of the editor indentation guides (1).'));\nconst editorIndentGuide2 = registerColor('editorIndentGuide.background2', '#00000000', localize(629, 'Color of the editor indentation guides (2).'));\nconst editorIndentGuide3 = registerColor('editorIndentGuide.background3', '#00000000', localize(630, 'Color of the editor indentation guides (3).'));\nconst editorIndentGuide4 = registerColor('editorIndentGuide.background4', '#00000000', localize(631, 'Color of the editor indentation guides (4).'));\nconst editorIndentGuide5 = registerColor('editorIndentGuide.background5', '#00000000', localize(632, 'Color of the editor indentation guides (5).'));\nconst editorIndentGuide6 = registerColor('editorIndentGuide.background6', '#00000000', localize(633, 'Color of the editor indentation guides (6).'));\nconst editorActiveIndentGuide1 = registerColor('editorIndentGuide.activeBackground1', deprecatedEditorActiveIndentGuides, localize(634, 'Color of the active editor indentation guides (1).'));\nconst editorActiveIndentGuide2 = registerColor('editorIndentGuide.activeBackground2', '#00000000', localize(635, 'Color of the active editor indentation guides (2).'));\nconst editorActiveIndentGuide3 = registerColor('editorIndentGuide.activeBackground3', '#00000000', localize(636, 'Color of the active editor indentation guides (3).'));\nconst editorActiveIndentGuide4 = registerColor('editorIndentGuide.activeBackground4', '#00000000', localize(637, 'Color of the active editor indentation guides (4).'));\nconst editorActiveIndentGuide5 = registerColor('editorIndentGuide.activeBackground5', '#00000000', localize(638, 'Color of the active editor indentation guides (5).'));\nconst editorActiveIndentGuide6 = registerColor('editorIndentGuide.activeBackground6', '#00000000', localize(639, 'Color of the active editor indentation guides (6).'));\nconst deprecatedEditorActiveLineNumber = registerColor('editorActiveLineNumber.foreground', { dark: '#c6c6c6', light: '#0B216F', hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize(640, 'Color of editor active line number'), false, localize(641, 'Id is deprecated. Use \\'editorLineNumber.activeForeground\\' instead.'));\nregisterColor('editorLineNumber.activeForeground', deprecatedEditorActiveLineNumber, localize(642, 'Color of editor active line number'));\nconst editorDimmedLineNumber = registerColor('editorLineNumber.dimmedForeground', null, localize(643, 'Color of the final editor line when editor.renderFinalNewline is set to dimmed.'));\nconst editorRuler = registerColor('editorRuler.foreground', { dark: '#5A5A5A', light: Color.lightgrey, hcDark: Color.white, hcLight: '#292929' }, localize(644, 'Color of the editor rulers.'));\nregisterColor('editorCodeLens.foreground', { dark: '#999999', light: '#919191', hcDark: '#999999', hcLight: '#292929' }, localize(645, 'Foreground color of editor CodeLens'));\nregisterColor('editorBracketMatch.background', { dark: '#0064001a', light: '#0064001a', hcDark: '#0064001a', hcLight: '#0000' }, localize(646, 'Background color behind matching brackets'));\nregisterColor('editorBracketMatch.border', { dark: '#888', light: '#B9B9B9', hcDark: contrastBorder, hcLight: contrastBorder }, localize(647, 'Color for matching brackets boxes'));\nconst editorOverviewRulerBorder = registerColor('editorOverviewRuler.border', { dark: '#7f7f7f4d', light: '#7f7f7f4d', hcDark: '#7f7f7f4d', hcLight: '#666666' }, localize(648, 'Color of the overview ruler border.'));\nconst editorOverviewRulerBackground = registerColor('editorOverviewRuler.background', null, localize(649, 'Background color of the editor overview ruler.'));\nregisterColor('editorGutter.background', editorBackground, localize(650, 'Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.'));\nregisterColor('editorUnnecessaryCode.border', { dark: null, light: null, hcDark: Color.fromHex('#fff').transparent(0.8), hcLight: contrastBorder }, localize(651, 'Border color of unnecessary (unused) source code in the editor.'));\nconst editorUnnecessaryCodeOpacity = registerColor('editorUnnecessaryCode.opacity', { dark: Color.fromHex('#000a'), light: Color.fromHex('#0007'), hcDark: null, hcLight: null }, localize(652, 'Opacity of unnecessary (unused) source code in the editor. For example, \"#000000c0\" will render the code with 75% opacity. For high contrast themes, use the  \\'editorUnnecessaryCode.border\\' theme color to underline unnecessary code instead of fading it out.'));\nregisterColor('editorGhostText.border', { dark: null, light: null, hcDark: Color.fromHex('#fff').transparent(0.8), hcLight: Color.fromHex('#292929').transparent(0.8) }, localize(653, 'Border color of ghost text in the editor.'));\nconst ghostTextForeground = registerColor('editorGhostText.foreground', { dark: Color.fromHex('#ffffff56'), light: Color.fromHex('#0007'), hcDark: null, hcLight: null }, localize(654, 'Foreground color of the ghost text in the editor.'));\nregisterColor('editorGhostText.background', null, localize(655, 'Background color of the ghost text in the editor.'));\nconst rulerRangeDefault = new Color(new RGBA(0, 122, 204, 0.6));\nconst overviewRulerRangeHighlight = registerColor('editorOverviewRuler.rangeHighlightForeground', rulerRangeDefault, localize(656, 'Overview ruler marker color for range highlights. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst overviewRulerError = registerColor('editorOverviewRuler.errorForeground', { dark: new Color(new RGBA(255, 18, 18, 0.7)), light: new Color(new RGBA(255, 18, 18, 0.7)), hcDark: new Color(new RGBA(255, 50, 50, 1)), hcLight: '#B5200D' }, localize(657, 'Overview ruler marker color for errors.'));\nconst overviewRulerWarning = registerColor('editorOverviewRuler.warningForeground', { dark: editorWarningForeground, light: editorWarningForeground, hcDark: editorWarningBorder, hcLight: editorWarningBorder }, localize(658, 'Overview ruler marker color for warnings.'));\nconst overviewRulerInfo = registerColor('editorOverviewRuler.infoForeground', { dark: editorInfoForeground, light: editorInfoForeground, hcDark: editorInfoBorder, hcLight: editorInfoBorder }, localize(659, 'Overview ruler marker color for infos.'));\nconst editorBracketHighlightingForeground1 = registerColor('editorBracketHighlight.foreground1', { dark: '#FFD700', light: '#0431FAFF', hcDark: '#FFD700', hcLight: '#0431FAFF' }, localize(660, 'Foreground color of brackets (1). Requires enabling bracket pair colorization.'));\nconst editorBracketHighlightingForeground2 = registerColor('editorBracketHighlight.foreground2', { dark: '#DA70D6', light: '#319331FF', hcDark: '#DA70D6', hcLight: '#319331FF' }, localize(661, 'Foreground color of brackets (2). Requires enabling bracket pair colorization.'));\nconst editorBracketHighlightingForeground3 = registerColor('editorBracketHighlight.foreground3', { dark: '#179FFF', light: '#7B3814FF', hcDark: '#87CEFA', hcLight: '#7B3814FF' }, localize(662, 'Foreground color of brackets (3). Requires enabling bracket pair colorization.'));\nconst editorBracketHighlightingForeground4 = registerColor('editorBracketHighlight.foreground4', '#00000000', localize(663, 'Foreground color of brackets (4). Requires enabling bracket pair colorization.'));\nconst editorBracketHighlightingForeground5 = registerColor('editorBracketHighlight.foreground5', '#00000000', localize(664, 'Foreground color of brackets (5). Requires enabling bracket pair colorization.'));\nconst editorBracketHighlightingForeground6 = registerColor('editorBracketHighlight.foreground6', '#00000000', localize(665, 'Foreground color of brackets (6). Requires enabling bracket pair colorization.'));\nconst editorBracketHighlightingUnexpectedBracketForeground = registerColor('editorBracketHighlight.unexpectedBracket.foreground', { dark: new Color(new RGBA(255, 18, 18, 0.8)), light: new Color(new RGBA(255, 18, 18, 0.8)), hcDark: new Color(new RGBA(255, 50, 50, 1)), hcLight: '#B5200D' }, localize(666, 'Foreground color of unexpected brackets.'));\nconst editorBracketPairGuideBackground1 = registerColor('editorBracketPairGuide.background1', '#00000000', localize(667, 'Background color of inactive bracket pair guides (1). Requires enabling bracket pair guides.'));\nconst editorBracketPairGuideBackground2 = registerColor('editorBracketPairGuide.background2', '#00000000', localize(668, 'Background color of inactive bracket pair guides (2). Requires enabling bracket pair guides.'));\nconst editorBracketPairGuideBackground3 = registerColor('editorBracketPairGuide.background3', '#00000000', localize(669, 'Background color of inactive bracket pair guides (3). Requires enabling bracket pair guides.'));\nconst editorBracketPairGuideBackground4 = registerColor('editorBracketPairGuide.background4', '#00000000', localize(670, 'Background color of inactive bracket pair guides (4). Requires enabling bracket pair guides.'));\nconst editorBracketPairGuideBackground5 = registerColor('editorBracketPairGuide.background5', '#00000000', localize(671, 'Background color of inactive bracket pair guides (5). Requires enabling bracket pair guides.'));\nconst editorBracketPairGuideBackground6 = registerColor('editorBracketPairGuide.background6', '#00000000', localize(672, 'Background color of inactive bracket pair guides (6). Requires enabling bracket pair guides.'));\nconst editorBracketPairGuideActiveBackground1 = registerColor('editorBracketPairGuide.activeBackground1', '#00000000', localize(673, 'Background color of active bracket pair guides (1). Requires enabling bracket pair guides.'));\nconst editorBracketPairGuideActiveBackground2 = registerColor('editorBracketPairGuide.activeBackground2', '#00000000', localize(674, 'Background color of active bracket pair guides (2). Requires enabling bracket pair guides.'));\nconst editorBracketPairGuideActiveBackground3 = registerColor('editorBracketPairGuide.activeBackground3', '#00000000', localize(675, 'Background color of active bracket pair guides (3). Requires enabling bracket pair guides.'));\nconst editorBracketPairGuideActiveBackground4 = registerColor('editorBracketPairGuide.activeBackground4', '#00000000', localize(676, 'Background color of active bracket pair guides (4). Requires enabling bracket pair guides.'));\nconst editorBracketPairGuideActiveBackground5 = registerColor('editorBracketPairGuide.activeBackground5', '#00000000', localize(677, 'Background color of active bracket pair guides (5). Requires enabling bracket pair guides.'));\nconst editorBracketPairGuideActiveBackground6 = registerColor('editorBracketPairGuide.activeBackground6', '#00000000', localize(678, 'Background color of active bracket pair guides (6). Requires enabling bracket pair guides.'));\nregisterColor('editorUnicodeHighlight.border', editorWarningForeground, localize(679, 'Border color used to highlight unicode characters.'));\nregisterColor('editorUnicodeHighlight.background', editorWarningBackground, localize(680, 'Background color used to highlight unicode characters.'));\n// contains all color rules that used to defined in editor/browser/widget/editor.css\nregisterThemingParticipant((theme, collector) => {\n    const background = theme.getColor(editorBackground);\n    const lineHighlight = theme.getColor(editorLineHighlight);\n    const imeBackground = (lineHighlight && !lineHighlight.isTransparent() ? lineHighlight : background);\n    if (imeBackground) {\n        collector.addRule(`.monaco-editor .inputarea.ime-input { background-color: ${imeBackground}; }`);\n    }\n});\n\nexport { deprecatedEditorActiveIndentGuides, deprecatedEditorIndentGuides, editorActiveIndentGuide1, editorActiveIndentGuide2, editorActiveIndentGuide3, editorActiveIndentGuide4, editorActiveIndentGuide5, editorActiveIndentGuide6, editorBracketHighlightingForeground1, editorBracketHighlightingForeground2, editorBracketHighlightingForeground3, editorBracketHighlightingForeground4, editorBracketHighlightingForeground5, editorBracketHighlightingForeground6, editorBracketHighlightingUnexpectedBracketForeground, editorBracketPairGuideActiveBackground1, editorBracketPairGuideActiveBackground2, editorBracketPairGuideActiveBackground3, editorBracketPairGuideActiveBackground4, editorBracketPairGuideActiveBackground5, editorBracketPairGuideActiveBackground6, editorBracketPairGuideBackground1, editorBracketPairGuideBackground2, editorBracketPairGuideBackground3, editorBracketPairGuideBackground4, editorBracketPairGuideBackground5, editorBracketPairGuideBackground6, editorCursorBackground, editorCursorForeground, editorDimmedLineNumber, editorIndentGuide1, editorIndentGuide2, editorIndentGuide3, editorIndentGuide4, editorIndentGuide5, editorIndentGuide6, editorLineHighlight, editorLineHighlightBorder, editorLineNumbers, editorMultiCursorPrimaryBackground, editorMultiCursorPrimaryForeground, editorMultiCursorSecondaryBackground, editorMultiCursorSecondaryForeground, editorOverviewRulerBackground, editorOverviewRulerBorder, editorRuler, editorUnnecessaryCodeOpacity, editorWhitespaces, ghostTextForeground, overviewRulerError, overviewRulerInfo, overviewRulerRangeHighlight, overviewRulerWarning };\n","import './currentLineHighlight.css';\nimport { DynamicViewOverlay } from '../../view/dynamicViewOverlay.js';\nimport { editorLineHighlight, editorLineHighlightBorder } from '../../../common/core/editorColorRegistry.js';\nimport { equals } from '../../../../base/common/arrays.js';\nimport { registerThemingParticipant } from '../../../../platform/theme/common/themeService.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { isHighContrast } from '../../../../platform/theme/common/theme.js';\nimport { Position } from '../../../common/core/position.js';\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 *--------------------------------------------------------------------------------------------*/\nclass AbstractLineHighlightOverlay extends DynamicViewOverlay {\n    constructor(context) {\n        super();\n        this._context = context;\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._renderLineHighlight = options.get(110 /* EditorOption.renderLineHighlight */);\n        this._renderLineHighlightOnlyWhenFocus = options.get(111 /* EditorOption.renderLineHighlightOnlyWhenFocus */);\n        this._wordWrap = layoutInfo.isViewportWrapping;\n        this._contentLeft = layoutInfo.contentLeft;\n        this._contentWidth = layoutInfo.contentWidth;\n        this._selectionIsEmpty = true;\n        this._focused = false;\n        this._cursorLineNumbers = [1];\n        this._selections = [new Selection(1, 1, 1, 1)];\n        this._renderData = null;\n        this._context.addEventHandler(this);\n    }\n    dispose() {\n        this._context.removeEventHandler(this);\n        super.dispose();\n    }\n    _readFromSelections() {\n        let hasChanged = false;\n        const lineNumbers = new Set();\n        for (const selection of this._selections) {\n            lineNumbers.add(selection.positionLineNumber);\n        }\n        const cursorsLineNumbers = Array.from(lineNumbers);\n        cursorsLineNumbers.sort((a, b) => a - b);\n        if (!equals(this._cursorLineNumbers, cursorsLineNumbers)) {\n            this._cursorLineNumbers = cursorsLineNumbers;\n            hasChanged = true;\n        }\n        const selectionIsEmpty = this._selections.every(s => s.isEmpty());\n        if (this._selectionIsEmpty !== selectionIsEmpty) {\n            this._selectionIsEmpty = selectionIsEmpty;\n            hasChanged = true;\n        }\n        return hasChanged;\n    }\n    // --- begin event handlers\n    onThemeChanged(e) {\n        return this._readFromSelections();\n    }\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._renderLineHighlight = options.get(110 /* EditorOption.renderLineHighlight */);\n        this._renderLineHighlightOnlyWhenFocus = options.get(111 /* EditorOption.renderLineHighlightOnlyWhenFocus */);\n        this._wordWrap = layoutInfo.isViewportWrapping;\n        this._contentLeft = layoutInfo.contentLeft;\n        this._contentWidth = layoutInfo.contentWidth;\n        return true;\n    }\n    onCursorStateChanged(e) {\n        this._selections = e.selections;\n        return this._readFromSelections();\n    }\n    onFlushed(e) {\n        return true;\n    }\n    onLinesDeleted(e) {\n        return true;\n    }\n    onLinesInserted(e) {\n        return true;\n    }\n    onScrollChanged(e) {\n        return e.scrollWidthChanged || e.scrollTopChanged;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    onFocusChanged(e) {\n        if (!this._renderLineHighlightOnlyWhenFocus) {\n            return false;\n        }\n        this._focused = e.isFocused;\n        return true;\n    }\n    // --- end event handlers\n    prepareRender(ctx) {\n        if (!this._shouldRenderThis()) {\n            this._renderData = null;\n            return;\n        }\n        const visibleStartLineNumber = ctx.visibleRange.startLineNumber;\n        const visibleEndLineNumber = ctx.visibleRange.endLineNumber;\n        // initialize renderData\n        const renderData = [];\n        for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {\n            const lineIndex = lineNumber - visibleStartLineNumber;\n            renderData[lineIndex] = '';\n        }\n        if (this._wordWrap) {\n            // do a first pass to render wrapped lines\n            const renderedLineWrapped = this._renderOne(ctx, false);\n            for (const cursorLineNumber of this._cursorLineNumbers) {\n                const coordinatesConverter = this._context.viewModel.coordinatesConverter;\n                const modelLineNumber = coordinatesConverter.convertViewPositionToModelPosition(new Position(cursorLineNumber, 1)).lineNumber;\n                const firstViewLineNumber = coordinatesConverter.convertModelPositionToViewPosition(new Position(modelLineNumber, 1)).lineNumber;\n                const lastViewLineNumber = coordinatesConverter.convertModelPositionToViewPosition(new Position(modelLineNumber, this._context.viewModel.model.getLineMaxColumn(modelLineNumber))).lineNumber;\n                const firstLine = Math.max(firstViewLineNumber, visibleStartLineNumber);\n                const lastLine = Math.min(lastViewLineNumber, visibleEndLineNumber);\n                for (let lineNumber = firstLine; lineNumber <= lastLine; lineNumber++) {\n                    const lineIndex = lineNumber - visibleStartLineNumber;\n                    renderData[lineIndex] = renderedLineWrapped;\n                }\n            }\n        }\n        // do a second pass to render exact lines\n        const renderedLineExact = this._renderOne(ctx, true);\n        for (const cursorLineNumber of this._cursorLineNumbers) {\n            if (cursorLineNumber < visibleStartLineNumber || cursorLineNumber > visibleEndLineNumber) {\n                continue;\n            }\n            const lineIndex = cursorLineNumber - visibleStartLineNumber;\n            renderData[lineIndex] = renderedLineExact;\n        }\n        this._renderData = renderData;\n    }\n    render(startLineNumber, lineNumber) {\n        if (!this._renderData) {\n            return '';\n        }\n        const lineIndex = lineNumber - startLineNumber;\n        if (lineIndex >= this._renderData.length) {\n            return '';\n        }\n        return this._renderData[lineIndex];\n    }\n    _shouldRenderInMargin() {\n        return ((this._renderLineHighlight === 'gutter' || this._renderLineHighlight === 'all')\n            && (!this._renderLineHighlightOnlyWhenFocus || this._focused));\n    }\n    _shouldRenderInContent() {\n        return ((this._renderLineHighlight === 'line' || this._renderLineHighlight === 'all')\n            && this._selectionIsEmpty\n            && (!this._renderLineHighlightOnlyWhenFocus || this._focused));\n    }\n}\n/**\n * Emphasizes the current line by drawing a border around it.\n */\nclass CurrentLineHighlightOverlay extends AbstractLineHighlightOverlay {\n    _renderOne(ctx, exact) {\n        const className = 'current-line' + (this._shouldRenderInMargin() ? ' current-line-both' : '') + (exact ? ' current-line-exact' : '');\n        return `<div class=\"${className}\" style=\"width:${Math.max(ctx.scrollWidth, this._contentWidth)}px;\"></div>`;\n    }\n    _shouldRenderThis() {\n        return this._shouldRenderInContent();\n    }\n    _shouldRenderOther() {\n        return this._shouldRenderInMargin();\n    }\n}\n/**\n * Emphasizes the current line margin/gutter by drawing a border around it.\n */\nclass CurrentLineMarginHighlightOverlay extends AbstractLineHighlightOverlay {\n    _renderOne(ctx, exact) {\n        const className = 'current-line' + (this._shouldRenderInMargin() ? ' current-line-margin' : '') + (this._shouldRenderOther() ? ' current-line-margin-both' : '') + (this._shouldRenderInMargin() && exact ? ' current-line-exact-margin' : '');\n        return `<div class=\"${className}\" style=\"width:${this._contentLeft}px\"></div>`;\n    }\n    _shouldRenderThis() {\n        return true;\n    }\n    _shouldRenderOther() {\n        return this._shouldRenderInContent();\n    }\n}\nregisterThemingParticipant((theme, collector) => {\n    const lineHighlight = theme.getColor(editorLineHighlight);\n    if (lineHighlight) {\n        collector.addRule(`.monaco-editor .view-overlays .current-line { background-color: ${lineHighlight}; }`);\n        collector.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { background-color: ${lineHighlight}; border: none; }`);\n    }\n    if (!lineHighlight || lineHighlight.isTransparent() || theme.defines(editorLineHighlightBorder)) {\n        const lineHighlightBorder = theme.getColor(editorLineHighlightBorder);\n        if (lineHighlightBorder) {\n            collector.addRule(`.monaco-editor .view-overlays .current-line-exact { border: 2px solid ${lineHighlightBorder}; }`);\n            collector.addRule(`.monaco-editor .margin-view-overlays .current-line-exact-margin { border: 2px solid ${lineHighlightBorder}; }`);\n            if (isHighContrast(theme.type)) {\n                collector.addRule(`.monaco-editor .view-overlays .current-line-exact { border-width: 1px; }`);\n                collector.addRule(`.monaco-editor .margin-view-overlays .current-line-exact-margin { border-width: 1px; }`);\n            }\n        }\n    }\n});\n\nexport { AbstractLineHighlightOverlay, CurrentLineHighlightOverlay, CurrentLineMarginHighlightOverlay };\n","import './decorations.css';\nimport { DynamicViewOverlay } from '../../view/dynamicViewOverlay.js';\nimport { HorizontalRange } from '../../view/renderingContext.js';\nimport { Range } from '../../../common/core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DecorationsOverlay extends DynamicViewOverlay {\n    constructor(context) {\n        super();\n        this._context = context;\n        const options = this._context.configuration.options;\n        this._typicalHalfwidthCharacterWidth = options.get(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;\n        this._renderResult = null;\n        this._context.addEventHandler(this);\n    }\n    dispose() {\n        this._context.removeEventHandler(this);\n        this._renderResult = null;\n        super.dispose();\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        this._typicalHalfwidthCharacterWidth = options.get(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;\n        return true;\n    }\n    onDecorationsChanged(e) {\n        return true;\n    }\n    onFlushed(e) {\n        return true;\n    }\n    onLinesChanged(e) {\n        return true;\n    }\n    onLinesDeleted(e) {\n        return true;\n    }\n    onLinesInserted(e) {\n        return true;\n    }\n    onScrollChanged(e) {\n        return e.scrollTopChanged || e.scrollWidthChanged;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    // --- end event handlers\n    prepareRender(ctx) {\n        const _decorations = ctx.getDecorationsInViewport();\n        // Keep only decorations with `className`\n        let decorations = [];\n        let decorationsLen = 0;\n        for (let i = 0, len = _decorations.length; i < len; i++) {\n            const d = _decorations[i];\n            if (d.options.className) {\n                decorations[decorationsLen++] = d;\n            }\n        }\n        // Sort decorations for consistent render output\n        decorations = decorations.sort((a, b) => {\n            if (a.options.zIndex < b.options.zIndex) {\n                return -1;\n            }\n            if (a.options.zIndex > b.options.zIndex) {\n                return 1;\n            }\n            const aClassName = a.options.className;\n            const bClassName = b.options.className;\n            if (aClassName < bClassName) {\n                return -1;\n            }\n            if (aClassName > bClassName) {\n                return 1;\n            }\n            return Range.compareRangesUsingStarts(a.range, b.range);\n        });\n        const visibleStartLineNumber = ctx.visibleRange.startLineNumber;\n        const visibleEndLineNumber = ctx.visibleRange.endLineNumber;\n        const output = [];\n        for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {\n            const lineIndex = lineNumber - visibleStartLineNumber;\n            output[lineIndex] = '';\n        }\n        // Render first whole line decorations and then regular decorations\n        this._renderWholeLineDecorations(ctx, decorations, output);\n        this._renderNormalDecorations(ctx, decorations, output);\n        this._renderResult = output;\n    }\n    _renderWholeLineDecorations(ctx, decorations, output) {\n        const visibleStartLineNumber = ctx.visibleRange.startLineNumber;\n        const visibleEndLineNumber = ctx.visibleRange.endLineNumber;\n        for (let i = 0, lenI = decorations.length; i < lenI; i++) {\n            const d = decorations[i];\n            if (!d.options.isWholeLine) {\n                continue;\n            }\n            const decorationOutput = ('<div class=\"cdr '\n                + d.options.className\n                + '\" style=\"left:0;width:100%;\"></div>');\n            const startLineNumber = Math.max(d.range.startLineNumber, visibleStartLineNumber);\n            const endLineNumber = Math.min(d.range.endLineNumber, visibleEndLineNumber);\n            for (let j = startLineNumber; j <= endLineNumber; j++) {\n                const lineIndex = j - visibleStartLineNumber;\n                output[lineIndex] += decorationOutput;\n            }\n        }\n    }\n    _renderNormalDecorations(ctx, decorations, output) {\n        const visibleStartLineNumber = ctx.visibleRange.startLineNumber;\n        let prevClassName = null;\n        let prevShowIfCollapsed = false;\n        let prevRange = null;\n        let prevShouldFillLineOnLineBreak = false;\n        for (let i = 0, lenI = decorations.length; i < lenI; i++) {\n            const d = decorations[i];\n            if (d.options.isWholeLine) {\n                continue;\n            }\n            const className = d.options.className;\n            const showIfCollapsed = Boolean(d.options.showIfCollapsed);\n            let range = d.range;\n            if (showIfCollapsed && range.endColumn === 1 && range.endLineNumber !== range.startLineNumber) {\n                range = new Range(range.startLineNumber, range.startColumn, range.endLineNumber - 1, this._context.viewModel.getLineMaxColumn(range.endLineNumber - 1));\n            }\n            if (prevClassName === className && prevShowIfCollapsed === showIfCollapsed && Range.areIntersectingOrTouching(prevRange, range)) {\n                // merge into previous decoration\n                prevRange = Range.plusRange(prevRange, range);\n                continue;\n            }\n            // flush previous decoration\n            if (prevClassName !== null) {\n                this._renderNormalDecoration(ctx, prevRange, prevClassName, prevShouldFillLineOnLineBreak, prevShowIfCollapsed, visibleStartLineNumber, output);\n            }\n            prevClassName = className;\n            prevShowIfCollapsed = showIfCollapsed;\n            prevRange = range;\n            prevShouldFillLineOnLineBreak = d.options.shouldFillLineOnLineBreak ?? false;\n        }\n        if (prevClassName !== null) {\n            this._renderNormalDecoration(ctx, prevRange, prevClassName, prevShouldFillLineOnLineBreak, prevShowIfCollapsed, visibleStartLineNumber, output);\n        }\n    }\n    _renderNormalDecoration(ctx, range, className, shouldFillLineOnLineBreak, showIfCollapsed, visibleStartLineNumber, output) {\n        const linesVisibleRanges = ctx.linesVisibleRangesForRange(range, /*TODO@Alex*/ className === 'findMatch');\n        if (!linesVisibleRanges) {\n            return;\n        }\n        for (let j = 0, lenJ = linesVisibleRanges.length; j < lenJ; j++) {\n            const lineVisibleRanges = linesVisibleRanges[j];\n            if (lineVisibleRanges.outsideRenderedLine) {\n                continue;\n            }\n            const lineIndex = lineVisibleRanges.lineNumber - visibleStartLineNumber;\n            if (showIfCollapsed && lineVisibleRanges.ranges.length === 1) {\n                const singleVisibleRange = lineVisibleRanges.ranges[0];\n                if (singleVisibleRange.width < this._typicalHalfwidthCharacterWidth) {\n                    // collapsed/very small range case => make the decoration visible by expanding its width\n                    // expand its size on both sides (both to the left and to the right, keeping it centered)\n                    const center = Math.round(singleVisibleRange.left + singleVisibleRange.width / 2);\n                    const left = Math.max(0, Math.round(center - this._typicalHalfwidthCharacterWidth / 2));\n                    lineVisibleRanges.ranges[0] = new HorizontalRange(left, this._typicalHalfwidthCharacterWidth);\n                }\n            }\n            for (let k = 0, lenK = lineVisibleRanges.ranges.length; k < lenK; k++) {\n                const expandToLeft = shouldFillLineOnLineBreak && lineVisibleRanges.continuesOnNextLine && lenK === 1;\n                const visibleRange = lineVisibleRanges.ranges[k];\n                const decorationOutput = ('<div class=\"cdr '\n                    + className\n                    + '\" style=\"left:'\n                    + String(visibleRange.left)\n                    + 'px;width:'\n                    + (expandToLeft ?\n                        '100%;' :\n                        (String(visibleRange.width) + 'px;'))\n                    + '\"></div>');\n                output[lineIndex] += decorationOutput;\n            }\n        }\n    }\n    render(startLineNumber, lineNumber) {\n        if (!this._renderResult) {\n            return '';\n        }\n        const lineIndex = lineNumber - startLineNumber;\n        if (lineIndex < 0 || lineIndex >= this._renderResult.length) {\n            return '';\n        }\n        return this._renderResult[lineIndex];\n    }\n}\n\nexport { DecorationsOverlay };\n","import { addDisposableListener } from '../../../../base/browser/dom.js';\nimport { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport { SmoothScrollableElement } from '../../../../base/browser/ui/scrollbar/scrollableElement.js';\nimport { ViewPart, PartFingerprints } from '../../view/viewPart.js';\nimport { getThemeTypeSelector } from '../../../../platform/theme/common/themeService.js';\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/**\n * The editor scrollbar built on VS Code's scrollable element that sits beside\n * the minimap.\n */\nclass EditorScrollbar extends ViewPart {\n    constructor(context, linesContent, viewDomNode, overflowGuardDomNode) {\n        super(context);\n        const options = this._context.configuration.options;\n        const scrollbar = options.get(117 /* EditorOption.scrollbar */);\n        const mouseWheelScrollSensitivity = options.get(83 /* EditorOption.mouseWheelScrollSensitivity */);\n        const fastScrollSensitivity = options.get(49 /* EditorOption.fastScrollSensitivity */);\n        const scrollPredominantAxis = options.get(120 /* EditorOption.scrollPredominantAxis */);\n        const inertialScroll = options.get(158 /* EditorOption.inertialScroll */);\n        const scrollbarOptions = {\n            listenOnDomNode: viewDomNode.domNode,\n            className: 'editor-scrollable' + ' ' + getThemeTypeSelector(context.theme.type),\n            useShadows: false,\n            lazyRender: true,\n            vertical: scrollbar.vertical,\n            horizontal: scrollbar.horizontal,\n            verticalHasArrows: scrollbar.verticalHasArrows,\n            horizontalHasArrows: scrollbar.horizontalHasArrows,\n            verticalScrollbarSize: scrollbar.verticalScrollbarSize,\n            verticalSliderSize: scrollbar.verticalSliderSize,\n            horizontalScrollbarSize: scrollbar.horizontalScrollbarSize,\n            horizontalSliderSize: scrollbar.horizontalSliderSize,\n            handleMouseWheel: scrollbar.handleMouseWheel,\n            alwaysConsumeMouseWheel: scrollbar.alwaysConsumeMouseWheel,\n            arrowSize: scrollbar.arrowSize,\n            mouseWheelScrollSensitivity: mouseWheelScrollSensitivity,\n            fastScrollSensitivity: fastScrollSensitivity,\n            scrollPredominantAxis: scrollPredominantAxis,\n            scrollByPage: scrollbar.scrollByPage,\n            inertialScroll: inertialScroll,\n        };\n        this.scrollbar = this._register(new SmoothScrollableElement(linesContent.domNode, scrollbarOptions, this._context.viewLayout.getScrollable()));\n        PartFingerprints.write(this.scrollbar.getDomNode(), 6 /* PartFingerprint.ScrollableElement */);\n        this.scrollbarDomNode = createFastDomNode(this.scrollbar.getDomNode());\n        this.scrollbarDomNode.setPosition('absolute');\n        this._setLayout();\n        // When having a zone widget that calls .focus() on one of its dom elements,\n        // the browser will try desperately to reveal that dom node, unexpectedly\n        // changing the .scrollTop of this.linesContent\n        const onBrowserDesperateReveal = (domNode, lookAtScrollTop, lookAtScrollLeft) => {\n            const newScrollPosition = {};\n            {\n                const deltaTop = domNode.scrollTop;\n                if (deltaTop) {\n                    newScrollPosition.scrollTop = this._context.viewLayout.getCurrentScrollTop() + deltaTop;\n                    domNode.scrollTop = 0;\n                }\n            }\n            if (lookAtScrollLeft) {\n                const deltaLeft = domNode.scrollLeft;\n                if (deltaLeft) {\n                    newScrollPosition.scrollLeft = this._context.viewLayout.getCurrentScrollLeft() + deltaLeft;\n                    domNode.scrollLeft = 0;\n                }\n            }\n            this._context.viewModel.viewLayout.setScrollPosition(newScrollPosition, 1 /* ScrollType.Immediate */);\n        };\n        // I've seen this happen both on the view dom node & on the lines content dom node.\n        this._register(addDisposableListener(viewDomNode.domNode, 'scroll', (e) => onBrowserDesperateReveal(viewDomNode.domNode, true, true)));\n        this._register(addDisposableListener(linesContent.domNode, 'scroll', (e) => onBrowserDesperateReveal(linesContent.domNode, true, false)));\n        this._register(addDisposableListener(overflowGuardDomNode.domNode, 'scroll', (e) => onBrowserDesperateReveal(overflowGuardDomNode.domNode, true, false)));\n        this._register(addDisposableListener(this.scrollbarDomNode.domNode, 'scroll', (e) => onBrowserDesperateReveal(this.scrollbarDomNode.domNode, true, false)));\n    }\n    dispose() {\n        super.dispose();\n    }\n    _setLayout() {\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this.scrollbarDomNode.setLeft(layoutInfo.contentLeft);\n        const minimap = options.get(81 /* EditorOption.minimap */);\n        const side = minimap.side;\n        if (side === 'right') {\n            this.scrollbarDomNode.setWidth(layoutInfo.contentWidth + layoutInfo.minimap.minimapWidth);\n        }\n        else {\n            this.scrollbarDomNode.setWidth(layoutInfo.contentWidth);\n        }\n        this.scrollbarDomNode.setHeight(layoutInfo.height);\n    }\n    getOverviewRulerLayoutInfo() {\n        return this.scrollbar.getOverviewRulerLayoutInfo();\n    }\n    getDomNode() {\n        return this.scrollbarDomNode;\n    }\n    delegateVerticalScrollbarPointerDown(browserEvent) {\n        this.scrollbar.delegateVerticalScrollbarPointerDown(browserEvent);\n    }\n    delegateScrollFromMouseWheelEvent(browserEvent) {\n        this.scrollbar.delegateScrollFromMouseWheelEvent(browserEvent);\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        if (e.hasChanged(117 /* EditorOption.scrollbar */)\n            || e.hasChanged(83 /* EditorOption.mouseWheelScrollSensitivity */)\n            || e.hasChanged(49 /* EditorOption.fastScrollSensitivity */)) {\n            const options = this._context.configuration.options;\n            const scrollbar = options.get(117 /* EditorOption.scrollbar */);\n            const mouseWheelScrollSensitivity = options.get(83 /* EditorOption.mouseWheelScrollSensitivity */);\n            const fastScrollSensitivity = options.get(49 /* EditorOption.fastScrollSensitivity */);\n            const scrollPredominantAxis = options.get(120 /* EditorOption.scrollPredominantAxis */);\n            const newOpts = {\n                vertical: scrollbar.vertical,\n                horizontal: scrollbar.horizontal,\n                verticalScrollbarSize: scrollbar.verticalScrollbarSize,\n                horizontalScrollbarSize: scrollbar.horizontalScrollbarSize,\n                scrollByPage: scrollbar.scrollByPage,\n                handleMouseWheel: scrollbar.handleMouseWheel,\n                mouseWheelScrollSensitivity: mouseWheelScrollSensitivity,\n                fastScrollSensitivity: fastScrollSensitivity,\n                scrollPredominantAxis: scrollPredominantAxis\n            };\n            this.scrollbar.updateOptions(newOpts);\n        }\n        if (e.hasChanged(165 /* EditorOption.layoutInfo */)) {\n            this._setLayout();\n        }\n        return true;\n    }\n    onScrollChanged(e) {\n        return true;\n    }\n    onThemeChanged(e) {\n        this.scrollbar.updateClassName('editor-scrollable' + ' ' + getThemeTypeSelector(this._context.theme.type));\n        return true;\n    }\n    // --- end event handlers\n    prepareRender(ctx) {\n        // Nothing to do\n    }\n    render(ctx) {\n        this.scrollbar.renderNow();\n    }\n}\n\nexport { EditorScrollbar };\n","import { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport { ArrayQueue } from '../../../../base/common/arrays.js';\nimport './glyphMargin.css';\nimport { DynamicViewOverlay } from '../../view/dynamicViewOverlay.js';\nimport { ViewPart } from '../../view/viewPart.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { GlyphMarginLane } from '../../../common/model.js';\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/**\n * Represents a decoration that should be shown along the lines from `startLineNumber` to `endLineNumber`.\n * This can end up producing multiple `LineDecorationToRender`.\n */\nclass DecorationToRender {\n    constructor(startLineNumber, endLineNumber, className, tooltip, zIndex) {\n        this.startLineNumber = startLineNumber;\n        this.endLineNumber = endLineNumber;\n        this.className = className;\n        this.tooltip = tooltip;\n        this._decorationToRenderBrand = undefined;\n        this.zIndex = zIndex ?? 0;\n    }\n}\n/**\n * A decoration that should be shown along a line.\n */\nclass LineDecorationToRender {\n    constructor(className, zIndex, tooltip) {\n        this.className = className;\n        this.zIndex = zIndex;\n        this.tooltip = tooltip;\n    }\n}\n/**\n * Decorations to render on a visible line.\n */\nclass VisibleLineDecorationsToRender {\n    constructor() {\n        this.decorations = [];\n    }\n    add(decoration) {\n        this.decorations.push(decoration);\n    }\n    getDecorations() {\n        return this.decorations;\n    }\n}\nclass DedupOverlay extends DynamicViewOverlay {\n    /**\n     * Returns an array with an element for each visible line number.\n     */\n    _render(visibleStartLineNumber, visibleEndLineNumber, decorations) {\n        const output = [];\n        for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {\n            const lineIndex = lineNumber - visibleStartLineNumber;\n            output[lineIndex] = new VisibleLineDecorationsToRender();\n        }\n        if (decorations.length === 0) {\n            return output;\n        }\n        // Sort decorations by className, then by startLineNumber and then by endLineNumber\n        decorations.sort((a, b) => {\n            if (a.className === b.className) {\n                if (a.startLineNumber === b.startLineNumber) {\n                    return a.endLineNumber - b.endLineNumber;\n                }\n                return a.startLineNumber - b.startLineNumber;\n            }\n            return (a.className < b.className ? -1 : 1);\n        });\n        let prevClassName = null;\n        let prevEndLineIndex = 0;\n        for (let i = 0, len = decorations.length; i < len; i++) {\n            const d = decorations[i];\n            const className = d.className;\n            const zIndex = d.zIndex;\n            let startLineIndex = Math.max(d.startLineNumber, visibleStartLineNumber) - visibleStartLineNumber;\n            const endLineIndex = Math.min(d.endLineNumber, visibleEndLineNumber) - visibleStartLineNumber;\n            if (prevClassName === className) {\n                // Here we avoid rendering the same className multiple times on the same line\n                startLineIndex = Math.max(prevEndLineIndex + 1, startLineIndex);\n                prevEndLineIndex = Math.max(prevEndLineIndex, endLineIndex);\n            }\n            else {\n                prevClassName = className;\n                prevEndLineIndex = endLineIndex;\n            }\n            for (let i = startLineIndex; i <= prevEndLineIndex; i++) {\n                output[i].add(new LineDecorationToRender(className, zIndex, d.tooltip));\n            }\n        }\n        return output;\n    }\n}\nclass GlyphMarginWidgets extends ViewPart {\n    constructor(context) {\n        super(context);\n        this._widgets = {};\n        this._context = context;\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this.domNode = createFastDomNode(document.createElement('div'));\n        this.domNode.setClassName('glyph-margin-widgets');\n        this.domNode.setPosition('absolute');\n        this.domNode.setTop(0);\n        this._lineHeight = options.get(75 /* EditorOption.lineHeight */);\n        this._glyphMargin = options.get(66 /* EditorOption.glyphMargin */);\n        this._glyphMarginLeft = layoutInfo.glyphMarginLeft;\n        this._glyphMarginWidth = layoutInfo.glyphMarginWidth;\n        this._glyphMarginDecorationLaneCount = layoutInfo.glyphMarginDecorationLaneCount;\n        this._managedDomNodes = [];\n        this._decorationGlyphsToRender = [];\n    }\n    dispose() {\n        this._managedDomNodes = [];\n        this._decorationGlyphsToRender = [];\n        this._widgets = {};\n        super.dispose();\n    }\n    getWidgets() {\n        return Object.values(this._widgets);\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._lineHeight = options.get(75 /* EditorOption.lineHeight */);\n        this._glyphMargin = options.get(66 /* EditorOption.glyphMargin */);\n        this._glyphMarginLeft = layoutInfo.glyphMarginLeft;\n        this._glyphMarginWidth = layoutInfo.glyphMarginWidth;\n        this._glyphMarginDecorationLaneCount = layoutInfo.glyphMarginDecorationLaneCount;\n        return true;\n    }\n    onDecorationsChanged(e) {\n        return true;\n    }\n    onFlushed(e) {\n        return true;\n    }\n    onLinesChanged(e) {\n        return true;\n    }\n    onLinesDeleted(e) {\n        return true;\n    }\n    onLinesInserted(e) {\n        return true;\n    }\n    onScrollChanged(e) {\n        return e.scrollTopChanged;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    // --- end event handlers\n    // --- begin widget management\n    addWidget(widget) {\n        const domNode = createFastDomNode(widget.getDomNode());\n        this._widgets[widget.getId()] = {\n            widget: widget,\n            preference: widget.getPosition(),\n            domNode: domNode,\n            renderInfo: null\n        };\n        domNode.setPosition('absolute');\n        domNode.setDisplay('none');\n        domNode.setAttribute('widgetId', widget.getId());\n        this.domNode.appendChild(domNode);\n        this.setShouldRender();\n    }\n    setWidgetPosition(widget, preference) {\n        const myWidget = this._widgets[widget.getId()];\n        if (myWidget.preference.lane === preference.lane\n            && myWidget.preference.zIndex === preference.zIndex\n            && Range.equalsRange(myWidget.preference.range, preference.range)) {\n            return false;\n        }\n        myWidget.preference = preference;\n        this.setShouldRender();\n        return true;\n    }\n    removeWidget(widget) {\n        const widgetId = widget.getId();\n        if (this._widgets[widgetId]) {\n            const widgetData = this._widgets[widgetId];\n            const domNode = widgetData.domNode.domNode;\n            delete this._widgets[widgetId];\n            domNode.remove();\n            this.setShouldRender();\n        }\n    }\n    // --- end widget management\n    _collectDecorationBasedGlyphRenderRequest(ctx, requests) {\n        const visibleStartLineNumber = ctx.visibleRange.startLineNumber;\n        const visibleEndLineNumber = ctx.visibleRange.endLineNumber;\n        const decorations = ctx.getDecorationsInViewport();\n        for (const d of decorations) {\n            const glyphMarginClassName = d.options.glyphMarginClassName;\n            if (!glyphMarginClassName) {\n                continue;\n            }\n            const startLineNumber = Math.max(d.range.startLineNumber, visibleStartLineNumber);\n            const endLineNumber = Math.min(d.range.endLineNumber, visibleEndLineNumber);\n            const lane = d.options.glyphMargin?.position ?? GlyphMarginLane.Center;\n            const zIndex = d.options.zIndex ?? 0;\n            for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n                const modelPosition = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(lineNumber, 0));\n                const laneIndex = this._context.viewModel.glyphLanes.getLanesAtLine(modelPosition.lineNumber).indexOf(lane);\n                requests.push(new DecorationBasedGlyphRenderRequest(lineNumber, laneIndex, zIndex, glyphMarginClassName));\n            }\n        }\n    }\n    _collectWidgetBasedGlyphRenderRequest(ctx, requests) {\n        const visibleStartLineNumber = ctx.visibleRange.startLineNumber;\n        const visibleEndLineNumber = ctx.visibleRange.endLineNumber;\n        for (const widget of Object.values(this._widgets)) {\n            const range = widget.preference.range;\n            const { startLineNumber, endLineNumber } = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(Range.lift(range));\n            if (!startLineNumber || !endLineNumber || endLineNumber < visibleStartLineNumber || startLineNumber > visibleEndLineNumber) {\n                // The widget is not in the viewport\n                continue;\n            }\n            // The widget is in the viewport, find a good line for it\n            const widgetLineNumber = Math.max(startLineNumber, visibleStartLineNumber);\n            const modelPosition = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(widgetLineNumber, 0));\n            const laneIndex = this._context.viewModel.glyphLanes.getLanesAtLine(modelPosition.lineNumber).indexOf(widget.preference.lane);\n            requests.push(new WidgetBasedGlyphRenderRequest(widgetLineNumber, laneIndex, widget.preference.zIndex, widget));\n        }\n    }\n    _collectSortedGlyphRenderRequests(ctx) {\n        const requests = [];\n        this._collectDecorationBasedGlyphRenderRequest(ctx, requests);\n        this._collectWidgetBasedGlyphRenderRequest(ctx, requests);\n        // sort requests by lineNumber ASC, lane  ASC, zIndex DESC, type DESC (widgets first), className ASC\n        // don't change this sort unless you understand `prepareRender` below.\n        requests.sort((a, b) => {\n            if (a.lineNumber === b.lineNumber) {\n                if (a.laneIndex === b.laneIndex) {\n                    if (a.zIndex === b.zIndex) {\n                        if (b.type === a.type) {\n                            if (a.type === 0 /* GlyphRenderRequestType.Decoration */ && b.type === 0 /* GlyphRenderRequestType.Decoration */) {\n                                return (a.className < b.className ? -1 : 1);\n                            }\n                            return 0;\n                        }\n                        return b.type - a.type;\n                    }\n                    return b.zIndex - a.zIndex;\n                }\n                return a.laneIndex - b.laneIndex;\n            }\n            return a.lineNumber - b.lineNumber;\n        });\n        return requests;\n    }\n    /**\n     * Will store render information in each widget's renderInfo and in `_decorationGlyphsToRender`.\n     */\n    prepareRender(ctx) {\n        if (!this._glyphMargin) {\n            this._decorationGlyphsToRender = [];\n            return;\n        }\n        for (const widget of Object.values(this._widgets)) {\n            widget.renderInfo = null;\n        }\n        const requests = new ArrayQueue(this._collectSortedGlyphRenderRequests(ctx));\n        const decorationGlyphsToRender = [];\n        while (requests.length > 0) {\n            const first = requests.peek();\n            if (!first) {\n                // not possible\n                break;\n            }\n            // Requests are sorted by lineNumber and lane, so we read all requests for this particular location\n            const requestsAtLocation = requests.takeWhile((el) => el.lineNumber === first.lineNumber && el.laneIndex === first.laneIndex);\n            if (!requestsAtLocation || requestsAtLocation.length === 0) {\n                // not possible\n                break;\n            }\n            const winner = requestsAtLocation[0];\n            if (winner.type === 0 /* GlyphRenderRequestType.Decoration */) {\n                // combine all decorations with the same z-index\n                const classNames = [];\n                // requests are sorted by zIndex, type, and className so we can dedup className by looking at the previous one\n                for (const request of requestsAtLocation) {\n                    if (request.zIndex !== winner.zIndex || request.type !== winner.type) {\n                        break;\n                    }\n                    if (classNames.length === 0 || classNames[classNames.length - 1] !== request.className) {\n                        classNames.push(request.className);\n                    }\n                }\n                decorationGlyphsToRender.push(winner.accept(classNames.join(' '))); // TODO@joyceerhl Implement overflow for remaining decorations\n            }\n            else {\n                // widgets cannot be combined\n                winner.widget.renderInfo = {\n                    lineNumber: winner.lineNumber,\n                    laneIndex: winner.laneIndex,\n                };\n            }\n        }\n        this._decorationGlyphsToRender = decorationGlyphsToRender;\n    }\n    render(ctx) {\n        if (!this._glyphMargin) {\n            for (const widget of Object.values(this._widgets)) {\n                widget.domNode.setDisplay('none');\n            }\n            while (this._managedDomNodes.length > 0) {\n                const domNode = this._managedDomNodes.pop();\n                domNode?.domNode.remove();\n            }\n            return;\n        }\n        const width = (Math.round(this._glyphMarginWidth / this._glyphMarginDecorationLaneCount));\n        // Render widgets\n        for (const widget of Object.values(this._widgets)) {\n            if (!widget.renderInfo) {\n                // this widget is not visible\n                widget.domNode.setDisplay('none');\n            }\n            else {\n                const top = ctx.viewportData.relativeVerticalOffset[widget.renderInfo.lineNumber - ctx.viewportData.startLineNumber];\n                const left = this._glyphMarginLeft + widget.renderInfo.laneIndex * this._lineHeight;\n                widget.domNode.setDisplay('block');\n                widget.domNode.setTop(top);\n                widget.domNode.setLeft(left);\n                widget.domNode.setWidth(width);\n                widget.domNode.setHeight(this._lineHeight);\n            }\n        }\n        // Render decorations, reusing previous dom nodes as possible\n        for (let i = 0; i < this._decorationGlyphsToRender.length; i++) {\n            const dec = this._decorationGlyphsToRender[i];\n            const decLineNumber = dec.lineNumber;\n            const top = ctx.viewportData.relativeVerticalOffset[decLineNumber - ctx.viewportData.startLineNumber];\n            const left = this._glyphMarginLeft + dec.laneIndex * this._lineHeight;\n            let domNode;\n            if (i < this._managedDomNodes.length) {\n                domNode = this._managedDomNodes[i];\n            }\n            else {\n                domNode = createFastDomNode(document.createElement('div'));\n                this._managedDomNodes.push(domNode);\n                this.domNode.appendChild(domNode);\n            }\n            const lineHeight = this._context.viewLayout.getLineHeightForLineNumber(decLineNumber);\n            domNode.setClassName(`cgmr codicon ` + dec.combinedClassName);\n            domNode.setPosition(`absolute`);\n            domNode.setTop(top);\n            domNode.setLeft(left);\n            domNode.setWidth(width);\n            domNode.setHeight(lineHeight);\n        }\n        // remove extra dom nodes\n        while (this._managedDomNodes.length > this._decorationGlyphsToRender.length) {\n            const domNode = this._managedDomNodes.pop();\n            domNode?.domNode.remove();\n        }\n    }\n}\n/**\n * A request to render a decoration in the glyph margin at a certain location.\n */\nclass DecorationBasedGlyphRenderRequest {\n    constructor(lineNumber, laneIndex, zIndex, className) {\n        this.lineNumber = lineNumber;\n        this.laneIndex = laneIndex;\n        this.zIndex = zIndex;\n        this.className = className;\n        this.type = 0 /* GlyphRenderRequestType.Decoration */;\n    }\n    accept(combinedClassName) {\n        return new DecorationBasedGlyph(this.lineNumber, this.laneIndex, combinedClassName);\n    }\n}\n/**\n * A request to render a widget in the glyph margin at a certain location.\n */\nclass WidgetBasedGlyphRenderRequest {\n    constructor(lineNumber, laneIndex, zIndex, widget) {\n        this.lineNumber = lineNumber;\n        this.laneIndex = laneIndex;\n        this.zIndex = zIndex;\n        this.widget = widget;\n        this.type = 1 /* GlyphRenderRequestType.Widget */;\n    }\n}\nclass DecorationBasedGlyph {\n    constructor(lineNumber, laneIndex, combinedClassName) {\n        this.lineNumber = lineNumber;\n        this.laneIndex = laneIndex;\n        this.combinedClassName = combinedClassName;\n    }\n}\n\nexport { DecorationToRender, DedupOverlay, GlyphMarginWidgets, LineDecorationToRender, VisibleLineDecorationsToRender };\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 *--------------------------------------------------------------------------------------------*/\nfunction findLast(array, predicate, fromIndex = array.length - 1) {\n    const idx = findLastIdx(array, predicate, fromIndex);\n    if (idx === -1) {\n        return undefined;\n    }\n    return array[idx];\n}\nfunction findLastIdx(array, predicate, fromIndex = array.length - 1) {\n    for (let i = fromIndex; i >= 0; i--) {\n        const element = array[i];\n        if (predicate(element, i)) {\n            return i;\n        }\n    }\n    return -1;\n}\n/**\n * Finds the last item where predicate is true using binary search.\n * `predicate` must be monotonous, i.e. `arr.map(predicate)` must be like `[true, ..., true, false, ..., false]`!\n *\n * @returns `undefined` if no item matches, otherwise the last item that matches the predicate.\n */\nfunction findLastMonotonous(array, predicate) {\n    const idx = findLastIdxMonotonous(array, predicate);\n    return idx === -1 ? undefined : array[idx];\n}\n/**\n * Finds the last item where predicate is true using binary search.\n * `predicate` must be monotonous, i.e. `arr.map(predicate)` must be like `[true, ..., true, false, ..., false]`!\n *\n * @returns `startIdx - 1` if predicate is false for all items, otherwise the index of the last item that matches the predicate.\n */\nfunction findLastIdxMonotonous(array, predicate, startIdx = 0, endIdxEx = array.length) {\n    let i = startIdx;\n    let j = endIdxEx;\n    while (i < j) {\n        const k = Math.floor((i + j) / 2);\n        if (predicate(array[k])) {\n            i = k + 1;\n        }\n        else {\n            j = k;\n        }\n    }\n    return i - 1;\n}\n/**\n * Finds the first item where predicate is true using binary search.\n * `predicate` must be monotonous, i.e. `arr.map(predicate)` must be like `[false, ..., false, true, ..., true]`!\n *\n * @returns `undefined` if no item matches, otherwise the first item that matches the predicate.\n */\nfunction findFirstMonotonous(array, predicate) {\n    const idx = findFirstIdxMonotonousOrArrLen(array, predicate);\n    return idx === array.length ? undefined : array[idx];\n}\n/**\n * Finds the first item where predicate is true using binary search.\n * `predicate` must be monotonous, i.e. `arr.map(predicate)` must be like `[false, ..., false, true, ..., true]`!\n *\n * @returns `endIdxEx` if predicate is false for all items, otherwise the index of the first item that matches the predicate.\n */\nfunction findFirstIdxMonotonousOrArrLen(array, predicate, startIdx = 0, endIdxEx = array.length) {\n    let i = startIdx;\n    let j = endIdxEx;\n    while (i < j) {\n        const k = Math.floor((i + j) / 2);\n        if (predicate(array[k])) {\n            j = k;\n        }\n        else {\n            i = k + 1;\n        }\n    }\n    return i;\n}\n/**\n * Use this when\n * * You have a sorted array\n * * You query this array with a monotonous predicate to find the last item that has a certain property.\n * * You query this array multiple times with monotonous predicates that get weaker and weaker.\n */\nclass MonotonousArray {\n    static { this.assertInvariants = false; }\n    constructor(_array) {\n        this._array = _array;\n        this._findLastMonotonousLastIdx = 0;\n    }\n    /**\n     * The predicate must be monotonous, i.e. `arr.map(predicate)` must be like `[true, ..., true, false, ..., false]`!\n     * For subsequent calls, current predicate must be weaker than (or equal to) the previous predicate, i.e. more entries must be `true`.\n     */\n    findLastMonotonous(predicate) {\n        if (MonotonousArray.assertInvariants) {\n            if (this._prevFindLastPredicate) {\n                for (const item of this._array) {\n                    if (this._prevFindLastPredicate(item) && !predicate(item)) {\n                        throw new Error('MonotonousArray: current predicate must be weaker than (or equal to) the previous predicate.');\n                    }\n                }\n            }\n            this._prevFindLastPredicate = predicate;\n        }\n        const idx = findLastIdxMonotonous(this._array, predicate, this._findLastMonotonousLastIdx);\n        this._findLastMonotonousLastIdx = idx + 1;\n        return idx === -1 ? undefined : this._array[idx];\n    }\n}\n/**\n * Returns the first item that is equal to or greater than every other item.\n*/\nfunction findFirstMax(array, comparator) {\n    if (array.length === 0) {\n        return undefined;\n    }\n    let max = array[0];\n    for (let i = 1; i < array.length; i++) {\n        const item = array[i];\n        if (comparator(item, max) > 0) {\n            max = item;\n        }\n    }\n    return max;\n}\n/**\n * Returns the last item that is equal to or greater than every other item.\n*/\nfunction findLastMax(array, comparator) {\n    if (array.length === 0) {\n        return undefined;\n    }\n    let max = array[0];\n    for (let i = 1; i < array.length; i++) {\n        const item = array[i];\n        if (comparator(item, max) >= 0) {\n            max = item;\n        }\n    }\n    return max;\n}\n/**\n * Returns the first item that is equal to or less than every other item.\n*/\nfunction findFirstMin(array, comparator) {\n    return findFirstMax(array, (a, b) => -comparator(a, b));\n}\nfunction findMaxIdx(array, comparator) {\n    if (array.length === 0) {\n        return -1;\n    }\n    let maxIdx = 0;\n    for (let i = 1; i < array.length; i++) {\n        const item = array[i];\n        if (comparator(item, array[maxIdx]) > 0) {\n            maxIdx = i;\n        }\n    }\n    return maxIdx;\n}\n/**\n * Returns the first mapped value of the array which is not undefined.\n */\nfunction mapFindFirst(items, mapFn) {\n    for (const value of items) {\n        const mapped = mapFn(value);\n        if (mapped !== undefined) {\n            return mapped;\n        }\n    }\n    return undefined;\n}\n\nexport { MonotonousArray, findFirstIdxMonotonousOrArrLen, findFirstMax, findFirstMin, findFirstMonotonous, findLast, findLastIdx, findLastIdxMonotonous, findLastMax, findLastMonotonous, findMaxIdx, mapFindFirst };\n","import { Disposable } from '../../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass TextModelPart extends Disposable {\n    constructor() {\n        super(...arguments);\n        this._isDisposed = false;\n    }\n    dispose() {\n        super.dispose();\n        this._isDisposed = true;\n    }\n    assertNotDisposed() {\n        if (this._isDisposed) {\n            throw new Error('TextModelPart is disposed!');\n        }\n    }\n}\n\nexport { TextModelPart };\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/**\n * Returns:\n *  - -1 => the line consists of whitespace\n *  - otherwise => the indent level is returned value\n */\nfunction computeIndentLevel(line, tabSize) {\n    let indent = 0;\n    let i = 0;\n    const len = line.length;\n    while (i < len) {\n        const chCode = line.charCodeAt(i);\n        if (chCode === 32 /* CharCode.Space */) {\n            indent++;\n        }\n        else if (chCode === 9 /* CharCode.Tab */) {\n            indent = indent - indent % tabSize + tabSize;\n        }\n        else {\n            break;\n        }\n        i++;\n    }\n    if (i === len) {\n        return -1; // line only consists of whitespace\n    }\n    return indent;\n}\n\nexport { computeIndentLevel };\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 *--------------------------------------------------------------------------------------------*/\nvar HorizontalGuidesState;\n(function (HorizontalGuidesState) {\n    HorizontalGuidesState[HorizontalGuidesState[\"Disabled\"] = 0] = \"Disabled\";\n    HorizontalGuidesState[HorizontalGuidesState[\"EnabledForActive\"] = 1] = \"EnabledForActive\";\n    HorizontalGuidesState[HorizontalGuidesState[\"Enabled\"] = 2] = \"Enabled\";\n})(HorizontalGuidesState || (HorizontalGuidesState = {}));\nclass IndentGuide {\n    constructor(visibleColumn, column, className, \n    /**\n     * If set, this indent guide is a horizontal guide (no vertical part).\n     * It starts at visibleColumn and continues until endColumn.\n    */\n    horizontalLine, \n    /**\n     * If set (!= -1), only show this guide for wrapped lines that don't contain this model column, but are after it.\n    */\n    forWrappedLinesAfterColumn, forWrappedLinesBeforeOrAtColumn) {\n        this.visibleColumn = visibleColumn;\n        this.column = column;\n        this.className = className;\n        this.horizontalLine = horizontalLine;\n        this.forWrappedLinesAfterColumn = forWrappedLinesAfterColumn;\n        this.forWrappedLinesBeforeOrAtColumn = forWrappedLinesBeforeOrAtColumn;\n        if ((visibleColumn !== -1) === (column !== -1)) {\n            throw new Error();\n        }\n    }\n}\nclass IndentGuideHorizontalLine {\n    constructor(top, endColumn) {\n        this.top = top;\n        this.endColumn = endColumn;\n    }\n}\n\nexport { HorizontalGuidesState, IndentGuide, IndentGuideHorizontalLine };\n","import { findLast } from '../../../base/common/arraysFind.js';\nimport { firstNonWhitespaceIndex } from '../../../base/common/strings.js';\nimport { CursorColumns } from '../core/cursorColumns.js';\nimport { Range } from '../core/range.js';\nimport { TextModelPart } from './textModelPart.js';\nimport { computeIndentLevel } from './utils.js';\nimport { HorizontalGuidesState, IndentGuide, IndentGuideHorizontalLine } from '../textModelGuides.js';\nimport { BugIndicatingError } from '../../../base/common/errors.js';\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 *--------------------------------------------------------------------------------------------*/\nclass GuidesTextModelPart extends TextModelPart {\n    constructor(textModel, languageConfigurationService) {\n        super();\n        this.textModel = textModel;\n        this.languageConfigurationService = languageConfigurationService;\n    }\n    getLanguageConfiguration(languageId) {\n        return this.languageConfigurationService.getLanguageConfiguration(languageId);\n    }\n    _computeIndentLevel(lineIndex) {\n        return computeIndentLevel(this.textModel.getLineContent(lineIndex + 1), this.textModel.getOptions().tabSize);\n    }\n    getActiveIndentGuide(lineNumber, minLineNumber, maxLineNumber) {\n        this.assertNotDisposed();\n        const lineCount = this.textModel.getLineCount();\n        if (lineNumber < 1 || lineNumber > lineCount) {\n            throw new BugIndicatingError('Illegal value for lineNumber');\n        }\n        const foldingRules = this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules;\n        const offSide = Boolean(foldingRules && foldingRules.offSide);\n        let up_aboveContentLineIndex = -2; /* -2 is a marker for not having computed it */\n        let up_aboveContentLineIndent = -1;\n        let up_belowContentLineIndex = -2; /* -2 is a marker for not having computed it */\n        let up_belowContentLineIndent = -1;\n        const up_resolveIndents = (lineNumber) => {\n            if (up_aboveContentLineIndex !== -1 &&\n                (up_aboveContentLineIndex === -2 ||\n                    up_aboveContentLineIndex > lineNumber - 1)) {\n                up_aboveContentLineIndex = -1;\n                up_aboveContentLineIndent = -1;\n                // must find previous line with content\n                for (let lineIndex = lineNumber - 2; lineIndex >= 0; lineIndex--) {\n                    const indent = this._computeIndentLevel(lineIndex);\n                    if (indent >= 0) {\n                        up_aboveContentLineIndex = lineIndex;\n                        up_aboveContentLineIndent = indent;\n                        break;\n                    }\n                }\n            }\n            if (up_belowContentLineIndex === -2) {\n                up_belowContentLineIndex = -1;\n                up_belowContentLineIndent = -1;\n                // must find next line with content\n                for (let lineIndex = lineNumber; lineIndex < lineCount; lineIndex++) {\n                    const indent = this._computeIndentLevel(lineIndex);\n                    if (indent >= 0) {\n                        up_belowContentLineIndex = lineIndex;\n                        up_belowContentLineIndent = indent;\n                        break;\n                    }\n                }\n            }\n        };\n        let down_aboveContentLineIndex = -2; /* -2 is a marker for not having computed it */\n        let down_aboveContentLineIndent = -1;\n        let down_belowContentLineIndex = -2; /* -2 is a marker for not having computed it */\n        let down_belowContentLineIndent = -1;\n        const down_resolveIndents = (lineNumber) => {\n            if (down_aboveContentLineIndex === -2) {\n                down_aboveContentLineIndex = -1;\n                down_aboveContentLineIndent = -1;\n                // must find previous line with content\n                for (let lineIndex = lineNumber - 2; lineIndex >= 0; lineIndex--) {\n                    const indent = this._computeIndentLevel(lineIndex);\n                    if (indent >= 0) {\n                        down_aboveContentLineIndex = lineIndex;\n                        down_aboveContentLineIndent = indent;\n                        break;\n                    }\n                }\n            }\n            if (down_belowContentLineIndex !== -1 &&\n                (down_belowContentLineIndex === -2 ||\n                    down_belowContentLineIndex < lineNumber - 1)) {\n                down_belowContentLineIndex = -1;\n                down_belowContentLineIndent = -1;\n                // must find next line with content\n                for (let lineIndex = lineNumber; lineIndex < lineCount; lineIndex++) {\n                    const indent = this._computeIndentLevel(lineIndex);\n                    if (indent >= 0) {\n                        down_belowContentLineIndex = lineIndex;\n                        down_belowContentLineIndent = indent;\n                        break;\n                    }\n                }\n            }\n        };\n        let startLineNumber = 0;\n        let goUp = true;\n        let endLineNumber = 0;\n        let goDown = true;\n        let indent = 0;\n        let initialIndent = 0;\n        for (let distance = 0; goUp || goDown; distance++) {\n            const upLineNumber = lineNumber - distance;\n            const downLineNumber = lineNumber + distance;\n            if (distance > 1 && (upLineNumber < 1 || upLineNumber < minLineNumber)) {\n                goUp = false;\n            }\n            if (distance > 1 &&\n                (downLineNumber > lineCount || downLineNumber > maxLineNumber)) {\n                goDown = false;\n            }\n            if (distance > 50000) {\n                // stop processing\n                goUp = false;\n                goDown = false;\n            }\n            let upLineIndentLevel = -1;\n            if (goUp && upLineNumber >= 1) {\n                // compute indent level going up\n                const currentIndent = this._computeIndentLevel(upLineNumber - 1);\n                if (currentIndent >= 0) {\n                    // This line has content (besides whitespace)\n                    // Use the line's indent\n                    up_belowContentLineIndex = upLineNumber - 1;\n                    up_belowContentLineIndent = currentIndent;\n                    upLineIndentLevel = Math.ceil(currentIndent / this.textModel.getOptions().indentSize);\n                }\n                else {\n                    up_resolveIndents(upLineNumber);\n                    upLineIndentLevel = this._getIndentLevelForWhitespaceLine(offSide, up_aboveContentLineIndent, up_belowContentLineIndent);\n                }\n            }\n            let downLineIndentLevel = -1;\n            if (goDown && downLineNumber <= lineCount) {\n                // compute indent level going down\n                const currentIndent = this._computeIndentLevel(downLineNumber - 1);\n                if (currentIndent >= 0) {\n                    // This line has content (besides whitespace)\n                    // Use the line's indent\n                    down_aboveContentLineIndex = downLineNumber - 1;\n                    down_aboveContentLineIndent = currentIndent;\n                    downLineIndentLevel = Math.ceil(currentIndent / this.textModel.getOptions().indentSize);\n                }\n                else {\n                    down_resolveIndents(downLineNumber);\n                    downLineIndentLevel = this._getIndentLevelForWhitespaceLine(offSide, down_aboveContentLineIndent, down_belowContentLineIndent);\n                }\n            }\n            if (distance === 0) {\n                initialIndent = upLineIndentLevel;\n                continue;\n            }\n            if (distance === 1) {\n                if (downLineNumber <= lineCount &&\n                    downLineIndentLevel >= 0 &&\n                    initialIndent + 1 === downLineIndentLevel) {\n                    // This is the beginning of a scope, we have special handling here, since we want the\n                    // child scope indent to be active, not the parent scope\n                    goUp = false;\n                    startLineNumber = downLineNumber;\n                    endLineNumber = downLineNumber;\n                    indent = downLineIndentLevel;\n                    continue;\n                }\n                if (upLineNumber >= 1 &&\n                    upLineIndentLevel >= 0 &&\n                    upLineIndentLevel - 1 === initialIndent) {\n                    // This is the end of a scope, just like above\n                    goDown = false;\n                    startLineNumber = upLineNumber;\n                    endLineNumber = upLineNumber;\n                    indent = upLineIndentLevel;\n                    continue;\n                }\n                startLineNumber = lineNumber;\n                endLineNumber = lineNumber;\n                indent = initialIndent;\n                if (indent === 0) {\n                    // No need to continue\n                    return { startLineNumber, endLineNumber, indent };\n                }\n            }\n            if (goUp) {\n                if (upLineIndentLevel >= indent) {\n                    startLineNumber = upLineNumber;\n                }\n                else {\n                    goUp = false;\n                }\n            }\n            if (goDown) {\n                if (downLineIndentLevel >= indent) {\n                    endLineNumber = downLineNumber;\n                }\n                else {\n                    goDown = false;\n                }\n            }\n        }\n        return { startLineNumber, endLineNumber, indent };\n    }\n    getLinesBracketGuides(startLineNumber, endLineNumber, activePosition, options) {\n        const result = [];\n        for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n            result.push([]);\n        }\n        // If requested, this could be made configurable.\n        const includeSingleLinePairs = true;\n        const bracketPairs = this.textModel.bracketPairs.getBracketPairsInRangeWithMinIndentation(new Range(startLineNumber, 1, endLineNumber, this.textModel.getLineMaxColumn(endLineNumber))).toArray();\n        let activeBracketPairRange = undefined;\n        if (activePosition && bracketPairs.length > 0) {\n            const bracketsContainingActivePosition = (startLineNumber <= activePosition.lineNumber &&\n                activePosition.lineNumber <= endLineNumber\n                // We don't need to query the brackets again if the cursor is in the viewport\n                ? bracketPairs\n                : this.textModel.bracketPairs.getBracketPairsInRange(Range.fromPositions(activePosition)).toArray()).filter((bp) => Range.strictContainsPosition(bp.range, activePosition));\n            activeBracketPairRange = findLast(bracketsContainingActivePosition, (i) => includeSingleLinePairs)?.range;\n        }\n        const independentColorPoolPerBracketType = this.textModel.getOptions().bracketPairColorizationOptions.independentColorPoolPerBracketType;\n        const colorProvider = new BracketPairGuidesClassNames();\n        for (const pair of bracketPairs) {\n            /*\n\n\n                    {\n                    |\n                    }\n\n                    {\n                    |\n                    ----}\n\n                ____{\n                |test\n                ----}\n\n                renderHorizontalEndLineAtTheBottom:\n                    {\n                    |\n                    |x}\n                    --\n                renderHorizontalEndLineAtTheBottom:\n                ____{\n                |test\n                | x }\n                ----\n            */\n            if (!pair.closingBracketRange) {\n                continue;\n            }\n            const isActive = activeBracketPairRange && pair.range.equalsRange(activeBracketPairRange);\n            if (!isActive && !options.includeInactive) {\n                continue;\n            }\n            const className = colorProvider.getInlineClassName(pair.nestingLevel, pair.nestingLevelOfEqualBracketType, independentColorPoolPerBracketType) +\n                (options.highlightActive && isActive\n                    ? ' ' + colorProvider.activeClassName\n                    : '');\n            const start = pair.openingBracketRange.getStartPosition();\n            const end = pair.closingBracketRange.getStartPosition();\n            const horizontalGuides = options.horizontalGuides === HorizontalGuidesState.Enabled || (options.horizontalGuides === HorizontalGuidesState.EnabledForActive && isActive);\n            if (pair.range.startLineNumber === pair.range.endLineNumber) {\n                if (horizontalGuides) {\n                    result[pair.range.startLineNumber - startLineNumber].push(new IndentGuide(-1, pair.openingBracketRange.getEndPosition().column, className, new IndentGuideHorizontalLine(false, end.column), -1, -1));\n                }\n                continue;\n            }\n            const endVisibleColumn = this.getVisibleColumnFromPosition(end);\n            const startVisibleColumn = this.getVisibleColumnFromPosition(pair.openingBracketRange.getStartPosition());\n            const guideVisibleColumn = Math.min(startVisibleColumn, endVisibleColumn, pair.minVisibleColumnIndentation + 1);\n            let renderHorizontalEndLineAtTheBottom = false;\n            const firstNonWsIndex = firstNonWhitespaceIndex(this.textModel.getLineContent(pair.closingBracketRange.startLineNumber));\n            const hasTextBeforeClosingBracket = firstNonWsIndex < pair.closingBracketRange.startColumn - 1;\n            if (hasTextBeforeClosingBracket) {\n                renderHorizontalEndLineAtTheBottom = true;\n            }\n            const visibleGuideStartLineNumber = Math.max(start.lineNumber, startLineNumber);\n            const visibleGuideEndLineNumber = Math.min(end.lineNumber, endLineNumber);\n            const offset = renderHorizontalEndLineAtTheBottom ? 1 : 0;\n            for (let l = visibleGuideStartLineNumber; l < visibleGuideEndLineNumber + offset; l++) {\n                result[l - startLineNumber].push(new IndentGuide(guideVisibleColumn, -1, className, null, l === start.lineNumber ? start.column : -1, l === end.lineNumber ? end.column : -1));\n            }\n            if (horizontalGuides) {\n                if (start.lineNumber >= startLineNumber && startVisibleColumn > guideVisibleColumn) {\n                    result[start.lineNumber - startLineNumber].push(new IndentGuide(guideVisibleColumn, -1, className, new IndentGuideHorizontalLine(false, start.column), -1, -1));\n                }\n                if (end.lineNumber <= endLineNumber && endVisibleColumn > guideVisibleColumn) {\n                    result[end.lineNumber - startLineNumber].push(new IndentGuide(guideVisibleColumn, -1, className, new IndentGuideHorizontalLine(!renderHorizontalEndLineAtTheBottom, end.column), -1, -1));\n                }\n            }\n        }\n        for (const guides of result) {\n            guides.sort((a, b) => a.visibleColumn - b.visibleColumn);\n        }\n        return result;\n    }\n    getVisibleColumnFromPosition(position) {\n        return (CursorColumns.visibleColumnFromColumn(this.textModel.getLineContent(position.lineNumber), position.column, this.textModel.getOptions().tabSize) + 1);\n    }\n    getLinesIndentGuides(startLineNumber, endLineNumber) {\n        this.assertNotDisposed();\n        const lineCount = this.textModel.getLineCount();\n        if (startLineNumber < 1 || startLineNumber > lineCount) {\n            throw new Error('Illegal value for startLineNumber');\n        }\n        if (endLineNumber < 1 || endLineNumber > lineCount) {\n            throw new Error('Illegal value for endLineNumber');\n        }\n        const options = this.textModel.getOptions();\n        const foldingRules = this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules;\n        const offSide = Boolean(foldingRules && foldingRules.offSide);\n        const result = new Array(endLineNumber - startLineNumber + 1);\n        let aboveContentLineIndex = -2; /* -2 is a marker for not having computed it */\n        let aboveContentLineIndent = -1;\n        let belowContentLineIndex = -2; /* -2 is a marker for not having computed it */\n        let belowContentLineIndent = -1;\n        for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n            const resultIndex = lineNumber - startLineNumber;\n            const currentIndent = this._computeIndentLevel(lineNumber - 1);\n            if (currentIndent >= 0) {\n                // This line has content (besides whitespace)\n                // Use the line's indent\n                aboveContentLineIndex = lineNumber - 1;\n                aboveContentLineIndent = currentIndent;\n                result[resultIndex] = Math.ceil(currentIndent / options.indentSize);\n                continue;\n            }\n            if (aboveContentLineIndex === -2) {\n                aboveContentLineIndex = -1;\n                aboveContentLineIndent = -1;\n                // must find previous line with content\n                for (let lineIndex = lineNumber - 2; lineIndex >= 0; lineIndex--) {\n                    const indent = this._computeIndentLevel(lineIndex);\n                    if (indent >= 0) {\n                        aboveContentLineIndex = lineIndex;\n                        aboveContentLineIndent = indent;\n                        break;\n                    }\n                }\n            }\n            if (belowContentLineIndex !== -1 &&\n                (belowContentLineIndex === -2 || belowContentLineIndex < lineNumber - 1)) {\n                belowContentLineIndex = -1;\n                belowContentLineIndent = -1;\n                // must find next line with content\n                for (let lineIndex = lineNumber; lineIndex < lineCount; lineIndex++) {\n                    const indent = this._computeIndentLevel(lineIndex);\n                    if (indent >= 0) {\n                        belowContentLineIndex = lineIndex;\n                        belowContentLineIndent = indent;\n                        break;\n                    }\n                }\n            }\n            result[resultIndex] = this._getIndentLevelForWhitespaceLine(offSide, aboveContentLineIndent, belowContentLineIndent);\n        }\n        return result;\n    }\n    _getIndentLevelForWhitespaceLine(offSide, aboveContentLineIndent, belowContentLineIndent) {\n        const options = this.textModel.getOptions();\n        if (aboveContentLineIndent === -1 || belowContentLineIndent === -1) {\n            // At the top or bottom of the file\n            return 0;\n        }\n        else if (aboveContentLineIndent < belowContentLineIndent) {\n            // we are inside the region above\n            return 1 + Math.floor(aboveContentLineIndent / options.indentSize);\n        }\n        else if (aboveContentLineIndent === belowContentLineIndent) {\n            // we are in between two regions\n            return Math.ceil(belowContentLineIndent / options.indentSize);\n        }\n        else {\n            if (offSide) {\n                // same level as region below\n                return Math.ceil(belowContentLineIndent / options.indentSize);\n            }\n            else {\n                // we are inside the region that ends below\n                return 1 + Math.floor(belowContentLineIndent / options.indentSize);\n            }\n        }\n    }\n}\nclass BracketPairGuidesClassNames {\n    constructor() {\n        this.activeClassName = 'indent-active';\n    }\n    getInlineClassName(nestingLevel, nestingLevelOfEqualBracketType, independentColorPoolPerBracketType) {\n        return this.getInlineClassNameOfLevel(independentColorPoolPerBracketType ? nestingLevelOfEqualBracketType : nestingLevel);\n    }\n    getInlineClassNameOfLevel(level) {\n        // To support a dynamic amount of colors up to 6 colors,\n        // we use a number that is a lcm of all numbers from 1 to 6.\n        return `bracket-indent-guide lvl-${level % 30}`;\n    }\n}\n\nexport { BracketPairGuidesClassNames, GuidesTextModelPart };\n","import './indentGuides.css';\nimport { DynamicViewOverlay } from '../../view/dynamicViewOverlay.js';\nimport { editorBracketPairGuideActiveBackground1, editorBracketPairGuideBackground1, editorBracketHighlightingForeground1, editorBracketPairGuideActiveBackground2, editorBracketPairGuideBackground2, editorBracketHighlightingForeground2, editorBracketPairGuideActiveBackground3, editorBracketPairGuideBackground3, editorBracketHighlightingForeground3, editorBracketPairGuideActiveBackground4, editorBracketPairGuideBackground4, editorBracketHighlightingForeground4, editorBracketPairGuideActiveBackground5, editorBracketPairGuideBackground5, editorBracketHighlightingForeground5, editorBracketPairGuideActiveBackground6, editorBracketPairGuideBackground6, editorBracketHighlightingForeground6, editorActiveIndentGuide1, editorIndentGuide1, editorActiveIndentGuide2, editorIndentGuide2, editorActiveIndentGuide3, editorIndentGuide3, editorActiveIndentGuide4, editorIndentGuide4, editorActiveIndentGuide5, editorIndentGuide5, editorActiveIndentGuide6, editorIndentGuide6 } from '../../../common/core/editorColorRegistry.js';\nimport { registerThemingParticipant } from '../../../../platform/theme/common/themeService.js';\nimport { Position } from '../../../common/core/position.js';\nimport { ArrayQueue } from '../../../../base/common/arrays.js';\nimport { isDefined } from '../../../../base/common/types.js';\nimport { BracketPairGuidesClassNames } from '../../../common/model/guidesTextModelPart.js';\nimport { HorizontalGuidesState, IndentGuide } from '../../../common/textModelGuides.js';\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/**\n * Indent guides are vertical lines that help identify the indentation level of\n * the code.\n */\nclass IndentGuidesOverlay extends DynamicViewOverlay {\n    constructor(context) {\n        super();\n        this._context = context;\n        this._primaryPosition = null;\n        const options = this._context.configuration.options;\n        const wrappingInfo = options.get(166 /* EditorOption.wrappingInfo */);\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        this._spaceWidth = fontInfo.spaceWidth;\n        this._maxIndentLeft = wrappingInfo.wrappingColumn === -1 ? -1 : (wrappingInfo.wrappingColumn * fontInfo.typicalHalfwidthCharacterWidth);\n        this._bracketPairGuideOptions = options.get(22 /* EditorOption.guides */);\n        this._renderResult = null;\n        this._context.addEventHandler(this);\n    }\n    dispose() {\n        this._context.removeEventHandler(this);\n        this._renderResult = null;\n        super.dispose();\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        const wrappingInfo = options.get(166 /* EditorOption.wrappingInfo */);\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        this._spaceWidth = fontInfo.spaceWidth;\n        this._maxIndentLeft = wrappingInfo.wrappingColumn === -1 ? -1 : (wrappingInfo.wrappingColumn * fontInfo.typicalHalfwidthCharacterWidth);\n        this._bracketPairGuideOptions = options.get(22 /* EditorOption.guides */);\n        return true;\n    }\n    onCursorStateChanged(e) {\n        const selection = e.selections[0];\n        const newPosition = selection.getPosition();\n        if (!this._primaryPosition?.equals(newPosition)) {\n            this._primaryPosition = newPosition;\n            return true;\n        }\n        return false;\n    }\n    onDecorationsChanged(e) {\n        // true for inline decorations\n        return true;\n    }\n    onFlushed(e) {\n        return true;\n    }\n    onLinesChanged(e) {\n        return true;\n    }\n    onLinesDeleted(e) {\n        return true;\n    }\n    onLinesInserted(e) {\n        return true;\n    }\n    onScrollChanged(e) {\n        return e.scrollTopChanged; // || e.scrollWidthChanged;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    onLanguageConfigurationChanged(e) {\n        return true;\n    }\n    // --- end event handlers\n    prepareRender(ctx) {\n        if (!this._bracketPairGuideOptions.indentation && this._bracketPairGuideOptions.bracketPairs === false) {\n            this._renderResult = null;\n            return;\n        }\n        const visibleStartLineNumber = ctx.visibleRange.startLineNumber;\n        const visibleEndLineNumber = ctx.visibleRange.endLineNumber;\n        const scrollWidth = ctx.scrollWidth;\n        const activeCursorPosition = this._primaryPosition;\n        const indents = this.getGuidesByLine(visibleStartLineNumber, Math.min(visibleEndLineNumber + 1, this._context.viewModel.getLineCount()), activeCursorPosition);\n        const output = [];\n        for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {\n            const lineIndex = lineNumber - visibleStartLineNumber;\n            const indent = indents[lineIndex];\n            let result = '';\n            const leftOffset = ctx.visibleRangeForPosition(new Position(lineNumber, 1))?.left ?? 0;\n            for (const guide of indent) {\n                const left = guide.column === -1\n                    ? leftOffset + (guide.visibleColumn - 1) * this._spaceWidth\n                    : ctx.visibleRangeForPosition(new Position(lineNumber, guide.column)).left;\n                if (left > scrollWidth || (this._maxIndentLeft > 0 && left > this._maxIndentLeft)) {\n                    break;\n                }\n                const className = guide.horizontalLine ? (guide.horizontalLine.top ? 'horizontal-top' : 'horizontal-bottom') : 'vertical';\n                const width = guide.horizontalLine\n                    ? (ctx.visibleRangeForPosition(new Position(lineNumber, guide.horizontalLine.endColumn))?.left ?? (left + this._spaceWidth)) - left\n                    : this._spaceWidth;\n                result += `<div class=\"core-guide ${guide.className} ${className}\" style=\"left:${left}px;width:${width}px\"></div>`;\n            }\n            output[lineIndex] = result;\n        }\n        this._renderResult = output;\n    }\n    getGuidesByLine(visibleStartLineNumber, visibleEndLineNumber, activeCursorPosition) {\n        const bracketGuides = this._bracketPairGuideOptions.bracketPairs !== false\n            ? this._context.viewModel.getBracketGuidesInRangeByLine(visibleStartLineNumber, visibleEndLineNumber, activeCursorPosition, {\n                highlightActive: this._bracketPairGuideOptions.highlightActiveBracketPair,\n                horizontalGuides: this._bracketPairGuideOptions.bracketPairsHorizontal === true\n                    ? HorizontalGuidesState.Enabled\n                    : this._bracketPairGuideOptions.bracketPairsHorizontal === 'active'\n                        ? HorizontalGuidesState.EnabledForActive\n                        : HorizontalGuidesState.Disabled,\n                includeInactive: this._bracketPairGuideOptions.bracketPairs === true,\n            })\n            : null;\n        const indentGuides = this._bracketPairGuideOptions.indentation\n            ? this._context.viewModel.getLinesIndentGuides(visibleStartLineNumber, visibleEndLineNumber)\n            : null;\n        let activeIndentStartLineNumber = 0;\n        let activeIndentEndLineNumber = 0;\n        let activeIndentLevel = 0;\n        if (this._bracketPairGuideOptions.highlightActiveIndentation !== false && activeCursorPosition) {\n            const activeIndentInfo = this._context.viewModel.getActiveIndentGuide(activeCursorPosition.lineNumber, visibleStartLineNumber, visibleEndLineNumber);\n            activeIndentStartLineNumber = activeIndentInfo.startLineNumber;\n            activeIndentEndLineNumber = activeIndentInfo.endLineNumber;\n            activeIndentLevel = activeIndentInfo.indent;\n        }\n        const { indentSize } = this._context.viewModel.model.getOptions();\n        const result = [];\n        for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {\n            const lineGuides = new Array();\n            result.push(lineGuides);\n            const bracketGuidesInLine = bracketGuides ? bracketGuides[lineNumber - visibleStartLineNumber] : [];\n            const bracketGuidesInLineQueue = new ArrayQueue(bracketGuidesInLine);\n            const indentGuidesInLine = indentGuides ? indentGuides[lineNumber - visibleStartLineNumber] : 0;\n            for (let indentLvl = 1; indentLvl <= indentGuidesInLine; indentLvl++) {\n                const indentGuide = (indentLvl - 1) * indentSize + 1;\n                const isActive = \n                // Disable active indent guide if there are bracket guides.\n                (this._bracketPairGuideOptions.highlightActiveIndentation === 'always' || bracketGuidesInLine.length === 0) &&\n                    activeIndentStartLineNumber <= lineNumber &&\n                    lineNumber <= activeIndentEndLineNumber &&\n                    indentLvl === activeIndentLevel;\n                lineGuides.push(...bracketGuidesInLineQueue.takeWhile(g => g.visibleColumn < indentGuide) || []);\n                const peeked = bracketGuidesInLineQueue.peek();\n                if (!peeked || peeked.visibleColumn !== indentGuide || peeked.horizontalLine) {\n                    lineGuides.push(new IndentGuide(indentGuide, -1, `core-guide-indent lvl-${(indentLvl - 1) % 30}` + (isActive ? ' indent-active' : ''), null, -1, -1));\n                }\n            }\n            lineGuides.push(...bracketGuidesInLineQueue.takeWhile(g => true) || []);\n        }\n        return result;\n    }\n    render(startLineNumber, lineNumber) {\n        if (!this._renderResult) {\n            return '';\n        }\n        const lineIndex = lineNumber - startLineNumber;\n        if (lineIndex < 0 || lineIndex >= this._renderResult.length) {\n            return '';\n        }\n        return this._renderResult[lineIndex];\n    }\n}\nfunction transparentToUndefined(color) {\n    if (color && color.isTransparent()) {\n        return undefined;\n    }\n    return color;\n}\nregisterThemingParticipant((theme, collector) => {\n    const colors = [\n        { bracketColor: editorBracketHighlightingForeground1, guideColor: editorBracketPairGuideBackground1, guideColorActive: editorBracketPairGuideActiveBackground1 },\n        { bracketColor: editorBracketHighlightingForeground2, guideColor: editorBracketPairGuideBackground2, guideColorActive: editorBracketPairGuideActiveBackground2 },\n        { bracketColor: editorBracketHighlightingForeground3, guideColor: editorBracketPairGuideBackground3, guideColorActive: editorBracketPairGuideActiveBackground3 },\n        { bracketColor: editorBracketHighlightingForeground4, guideColor: editorBracketPairGuideBackground4, guideColorActive: editorBracketPairGuideActiveBackground4 },\n        { bracketColor: editorBracketHighlightingForeground5, guideColor: editorBracketPairGuideBackground5, guideColorActive: editorBracketPairGuideActiveBackground5 },\n        { bracketColor: editorBracketHighlightingForeground6, guideColor: editorBracketPairGuideBackground6, guideColorActive: editorBracketPairGuideActiveBackground6 }\n    ];\n    const colorProvider = new BracketPairGuidesClassNames();\n    const indentColors = [\n        { indentColor: editorIndentGuide1, indentColorActive: editorActiveIndentGuide1 },\n        { indentColor: editorIndentGuide2, indentColorActive: editorActiveIndentGuide2 },\n        { indentColor: editorIndentGuide3, indentColorActive: editorActiveIndentGuide3 },\n        { indentColor: editorIndentGuide4, indentColorActive: editorActiveIndentGuide4 },\n        { indentColor: editorIndentGuide5, indentColorActive: editorActiveIndentGuide5 },\n        { indentColor: editorIndentGuide6, indentColorActive: editorActiveIndentGuide6 },\n    ];\n    const colorValues = colors\n        .map(c => {\n        const bracketColor = theme.getColor(c.bracketColor);\n        const guideColor = theme.getColor(c.guideColor);\n        const guideColorActive = theme.getColor(c.guideColorActive);\n        const effectiveGuideColor = transparentToUndefined(transparentToUndefined(guideColor) ?? bracketColor?.transparent(0.3));\n        const effectiveGuideColorActive = transparentToUndefined(transparentToUndefined(guideColorActive) ?? bracketColor);\n        if (!effectiveGuideColor || !effectiveGuideColorActive) {\n            return undefined;\n        }\n        return {\n            guideColor: effectiveGuideColor,\n            guideColorActive: effectiveGuideColorActive,\n        };\n    })\n        .filter(isDefined);\n    const indentColorValues = indentColors\n        .map(c => {\n        const indentColor = theme.getColor(c.indentColor);\n        const indentColorActive = theme.getColor(c.indentColorActive);\n        const effectiveIndentColor = transparentToUndefined(indentColor);\n        const effectiveIndentColorActive = transparentToUndefined(indentColorActive);\n        if (!effectiveIndentColor || !effectiveIndentColorActive) {\n            return undefined;\n        }\n        return {\n            indentColor: effectiveIndentColor,\n            indentColorActive: effectiveIndentColorActive,\n        };\n    })\n        .filter(isDefined);\n    if (colorValues.length > 0) {\n        for (let level = 0; level < 30; level++) {\n            const colors = colorValues[level % colorValues.length];\n            collector.addRule(`.monaco-editor .${colorProvider.getInlineClassNameOfLevel(level).replace(/ /g, '.')} { --guide-color: ${colors.guideColor}; --guide-color-active: ${colors.guideColorActive}; }`);\n        }\n        collector.addRule(`.monaco-editor .vertical { box-shadow: 1px 0 0 0 var(--guide-color) inset; }`);\n        collector.addRule(`.monaco-editor .horizontal-top { border-top: 1px solid var(--guide-color); }`);\n        collector.addRule(`.monaco-editor .horizontal-bottom { border-bottom: 1px solid var(--guide-color); }`);\n        collector.addRule(`.monaco-editor .vertical.${colorProvider.activeClassName} { box-shadow: 1px 0 0 0 var(--guide-color-active) inset; }`);\n        collector.addRule(`.monaco-editor .horizontal-top.${colorProvider.activeClassName} { border-top: 1px solid var(--guide-color-active); }`);\n        collector.addRule(`.monaco-editor .horizontal-bottom.${colorProvider.activeClassName} { border-bottom: 1px solid var(--guide-color-active); }`);\n    }\n    if (indentColorValues.length > 0) {\n        for (let level = 0; level < 30; level++) {\n            const colors = indentColorValues[level % indentColorValues.length];\n            collector.addRule(`.monaco-editor .lines-content .core-guide-indent.lvl-${level} { --indent-color: ${colors.indentColor}; --indent-color-active: ${colors.indentColorActive}; }`);\n        }\n        collector.addRule(`.monaco-editor .lines-content .core-guide-indent { box-shadow: 1px 0 0 0 var(--indent-color) inset; }`);\n        collector.addRule(`.monaco-editor .lines-content .core-guide-indent.indent-active { box-shadow: 1px 0 0 0 var(--indent-color-active) inset; }`);\n    }\n});\n\nexport { IndentGuidesOverlay };\n","import './lineNumbers.css';\nimport { isLinux } from '../../../../base/common/platform.js';\nimport { DynamicViewOverlay } from '../../view/dynamicViewOverlay.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { registerThemingParticipant } from '../../../../platform/theme/common/themeService.js';\nimport { editorLineNumbers, editorDimmedLineNumber } from '../../../common/core/editorColorRegistry.js';\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/**\n * Renders line numbers to the left of the main view lines content.\n */\nclass LineNumbersOverlay extends DynamicViewOverlay {\n    static { this.CLASS_NAME = 'line-numbers'; }\n    constructor(context) {\n        super();\n        this._context = context;\n        this._readConfig();\n        this._lastCursorModelPosition = new Position(1, 1);\n        this._renderResult = null;\n        this._activeModelLineNumber = 1;\n        this._context.addEventHandler(this);\n    }\n    _readConfig() {\n        const options = this._context.configuration.options;\n        this._lineHeight = options.get(75 /* EditorOption.lineHeight */);\n        const lineNumbers = options.get(76 /* EditorOption.lineNumbers */);\n        this._renderLineNumbers = lineNumbers.renderType;\n        this._renderCustomLineNumbers = lineNumbers.renderFn;\n        this._renderFinalNewline = options.get(109 /* EditorOption.renderFinalNewline */);\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._lineNumbersLeft = layoutInfo.lineNumbersLeft;\n        this._lineNumbersWidth = layoutInfo.lineNumbersWidth;\n    }\n    dispose() {\n        this._context.removeEventHandler(this);\n        this._renderResult = null;\n        super.dispose();\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        this._readConfig();\n        return true;\n    }\n    onCursorStateChanged(e) {\n        const primaryViewPosition = e.selections[0].getPosition();\n        this._lastCursorModelPosition = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(primaryViewPosition);\n        let shouldRender = false;\n        if (this._activeModelLineNumber !== this._lastCursorModelPosition.lineNumber) {\n            this._activeModelLineNumber = this._lastCursorModelPosition.lineNumber;\n            shouldRender = true;\n        }\n        if (this._renderLineNumbers === 2 /* RenderLineNumbersType.Relative */ || this._renderLineNumbers === 3 /* RenderLineNumbersType.Interval */) {\n            shouldRender = true;\n        }\n        return shouldRender;\n    }\n    onFlushed(e) {\n        return true;\n    }\n    onLinesChanged(e) {\n        return true;\n    }\n    onLinesDeleted(e) {\n        return true;\n    }\n    onLinesInserted(e) {\n        return true;\n    }\n    onScrollChanged(e) {\n        return e.scrollTopChanged;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    onDecorationsChanged(e) {\n        return e.affectsLineNumber;\n    }\n    // --- end event handlers\n    _getLineRenderLineNumber(viewLineNumber) {\n        const modelPosition = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(viewLineNumber, 1));\n        if (modelPosition.column !== 1) {\n            return '';\n        }\n        const modelLineNumber = modelPosition.lineNumber;\n        if (this._renderCustomLineNumbers) {\n            return this._renderCustomLineNumbers(modelLineNumber);\n        }\n        if (this._renderLineNumbers === 2 /* RenderLineNumbersType.Relative */) {\n            const diff = Math.abs(this._lastCursorModelPosition.lineNumber - modelLineNumber);\n            if (diff === 0) {\n                return '<span class=\"relative-current-line-number\">' + modelLineNumber + '</span>';\n            }\n            return String(diff);\n        }\n        if (this._renderLineNumbers === 3 /* RenderLineNumbersType.Interval */) {\n            if (this._lastCursorModelPosition.lineNumber === modelLineNumber) {\n                return String(modelLineNumber);\n            }\n            if (modelLineNumber % 10 === 0) {\n                return String(modelLineNumber);\n            }\n            const finalLineNumber = this._context.viewModel.getLineCount();\n            if (modelLineNumber === finalLineNumber) {\n                return String(modelLineNumber);\n            }\n            return '';\n        }\n        return String(modelLineNumber);\n    }\n    prepareRender(ctx) {\n        if (this._renderLineNumbers === 0 /* RenderLineNumbersType.Off */) {\n            this._renderResult = null;\n            return;\n        }\n        const lineHeightClassName = (isLinux ? (this._lineHeight % 2 === 0 ? ' lh-even' : ' lh-odd') : '');\n        const visibleStartLineNumber = ctx.visibleRange.startLineNumber;\n        const visibleEndLineNumber = ctx.visibleRange.endLineNumber;\n        const lineNoDecorations = this._context.viewModel.getDecorationsInViewport(ctx.visibleRange).filter(d => !!d.options.lineNumberClassName);\n        lineNoDecorations.sort((a, b) => Range.compareRangesUsingEnds(a.range, b.range));\n        let decorationStartIndex = 0;\n        const lineCount = this._context.viewModel.getLineCount();\n        const output = [];\n        for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {\n            const lineIndex = lineNumber - visibleStartLineNumber;\n            const modelLineNumber = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(lineNumber, 1)).lineNumber;\n            let renderLineNumber = this._getLineRenderLineNumber(lineNumber);\n            let extraClassNames = '';\n            // skip decorations whose end positions we've already passed\n            while (decorationStartIndex < lineNoDecorations.length && lineNoDecorations[decorationStartIndex].range.endLineNumber < lineNumber) {\n                decorationStartIndex++;\n            }\n            for (let i = decorationStartIndex; i < lineNoDecorations.length; i++) {\n                const { range, options } = lineNoDecorations[i];\n                if (range.startLineNumber <= lineNumber) {\n                    extraClassNames += ' ' + options.lineNumberClassName;\n                }\n            }\n            if (!renderLineNumber && !extraClassNames) {\n                output[lineIndex] = '';\n                continue;\n            }\n            if (lineNumber === lineCount && this._context.viewModel.getLineLength(lineNumber) === 0) {\n                // this is the last line\n                if (this._renderFinalNewline === 'off') {\n                    renderLineNumber = '';\n                }\n                if (this._renderFinalNewline === 'dimmed') {\n                    extraClassNames += ' dimmed-line-number';\n                }\n            }\n            if (modelLineNumber === this._activeModelLineNumber) {\n                extraClassNames += ' active-line-number';\n            }\n            output[lineIndex] = (`<div class=\"${LineNumbersOverlay.CLASS_NAME}${lineHeightClassName}${extraClassNames}\" style=\"left:${this._lineNumbersLeft}px;width:${this._lineNumbersWidth}px;\">${renderLineNumber}</div>`);\n        }\n        this._renderResult = output;\n    }\n    render(startLineNumber, lineNumber) {\n        if (!this._renderResult) {\n            return '';\n        }\n        const lineIndex = lineNumber - startLineNumber;\n        if (lineIndex < 0 || lineIndex >= this._renderResult.length) {\n            return '';\n        }\n        return this._renderResult[lineIndex];\n    }\n}\nregisterThemingParticipant((theme, collector) => {\n    const editorLineNumbersColor = theme.getColor(editorLineNumbers);\n    const editorDimmedLineNumberColor = theme.getColor(editorDimmedLineNumber);\n    if (editorDimmedLineNumberColor) {\n        collector.addRule(`.monaco-editor .line-numbers.dimmed-line-number { color: ${editorDimmedLineNumberColor}; }`);\n    }\n    else if (editorLineNumbersColor) {\n        collector.addRule(`.monaco-editor .line-numbers.dimmed-line-number { color: ${editorLineNumbersColor.transparent(0.4)}; }`);\n    }\n});\n\nexport { LineNumbersOverlay };\n","import './mouseCursor.css';\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 *--------------------------------------------------------------------------------------------*/\nconst MOUSE_CURSOR_TEXT_CSS_CLASS_NAME = `monaco-mouse-cursor-text`;\n\nexport { MOUSE_CURSOR_TEXT_CSS_CLASS_NAME };\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 *--------------------------------------------------------------------------------------------*/\nclass DomReadingContext {\n    get didDomLayout() {\n        return this._didDomLayout;\n    }\n    readClientRect() {\n        if (!this._clientRectRead) {\n            this._clientRectRead = true;\n            const rect = this._domNode.getBoundingClientRect();\n            this.markDidDomLayout();\n            this._clientRectDeltaLeft = rect.left;\n            this._clientRectScale = rect.width / this._domNode.offsetWidth;\n        }\n    }\n    get clientRectDeltaLeft() {\n        if (!this._clientRectRead) {\n            this.readClientRect();\n        }\n        return this._clientRectDeltaLeft;\n    }\n    get clientRectScale() {\n        if (!this._clientRectRead) {\n            this.readClientRect();\n        }\n        return this._clientRectScale;\n    }\n    constructor(_domNode, endNode) {\n        this._domNode = _domNode;\n        this.endNode = endNode;\n        this._didDomLayout = false;\n        this._clientRectDeltaLeft = 0;\n        this._clientRectScale = 1;\n        this._clientRectRead = false;\n    }\n    markDidDomLayout() {\n        this._didDomLayout = true;\n    }\n}\n\nexport { DomReadingContext };\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 *--------------------------------------------------------------------------------------------*/\nclass ViewLineOptions {\n    constructor(config, themeType) {\n        this.themeType = themeType;\n        const options = config.options;\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        this.renderWhitespace = options.get(113 /* EditorOption.renderWhitespace */);\n        this.experimentalWhitespaceRendering = options.get(47 /* EditorOption.experimentalWhitespaceRendering */);\n        this.renderControlCharacters = options.get(108 /* EditorOption.renderControlCharacters */);\n        this.spaceWidth = fontInfo.spaceWidth;\n        this.middotWidth = fontInfo.middotWidth;\n        this.wsmiddotWidth = fontInfo.wsmiddotWidth;\n        this.useMonospaceOptimizations = (fontInfo.isMonospace\n            && !options.get(40 /* EditorOption.disableMonospaceOptimizations */));\n        this.canUseHalfwidthRightwardsArrow = fontInfo.canUseHalfwidthRightwardsArrow;\n        this.lineHeight = options.get(75 /* EditorOption.lineHeight */);\n        this.stopRenderingLineAfter = options.get(133 /* EditorOption.stopRenderingLineAfter */);\n        this.fontLigatures = options.get(60 /* EditorOption.fontLigatures */);\n        this.verticalScrollbarSize = options.get(117 /* EditorOption.scrollbar */).verticalScrollbarSize;\n        this.useGpu = options.get(46 /* EditorOption.experimentalGpuAcceleration */) === 'on';\n    }\n    equals(other) {\n        return (this.themeType === other.themeType\n            && this.renderWhitespace === other.renderWhitespace\n            && this.experimentalWhitespaceRendering === other.experimentalWhitespaceRendering\n            && this.renderControlCharacters === other.renderControlCharacters\n            && this.spaceWidth === other.spaceWidth\n            && this.middotWidth === other.middotWidth\n            && this.wsmiddotWidth === other.wsmiddotWidth\n            && this.useMonospaceOptimizations === other.useMonospaceOptimizations\n            && this.canUseHalfwidthRightwardsArrow === other.canUseHalfwidthRightwardsArrow\n            && this.lineHeight === other.lineHeight\n            && this.stopRenderingLineAfter === other.stopRenderingLineAfter\n            && this.fontLigatures === other.fontLigatures\n            && this.verticalScrollbarSize === other.verticalScrollbarSize\n            && this.useGpu === other.useGpu);\n    }\n}\n\nexport { ViewLineOptions };\n","import { MOUSE_CURSOR_TEXT_CSS_CLASS_NAME } from '../../../../base/browser/ui/mouseCursor/mouseCursor.js';\nimport { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { isLinux } from '../../../../base/common/platform.js';\nimport './viewLines.css';\nimport { applyFontInfo } from '../../config/domFontInfo.js';\nimport { LineVisibleRanges, HorizontalRange, HorizontalPosition } from '../../view/renderingContext.js';\nimport { VisibleLinesCollection } from '../../view/viewLayer.js';\nimport { ViewPart, PartFingerprints } from '../../view/viewPart.js';\nimport { DomReadingContext } from './domReadingContext.js';\nimport { ViewLine } from './viewLine.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { ViewLineOptions } from './viewLineOptions.js';\nimport { TextDirection } from '../../../common/model.js';\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 *--------------------------------------------------------------------------------------------*/\nclass LastRenderedData {\n    constructor() {\n        this._currentVisibleRange = new Range(1, 1, 1, 1);\n    }\n    getCurrentVisibleRange() {\n        return this._currentVisibleRange;\n    }\n    setCurrentVisibleRange(currentVisibleRange) {\n        this._currentVisibleRange = currentVisibleRange;\n    }\n}\nclass HorizontalRevealRangeRequest {\n    constructor(minimalReveal, lineNumber, startColumn, endColumn, startScrollTop, stopScrollTop, scrollType) {\n        this.minimalReveal = minimalReveal;\n        this.lineNumber = lineNumber;\n        this.startColumn = startColumn;\n        this.endColumn = endColumn;\n        this.startScrollTop = startScrollTop;\n        this.stopScrollTop = stopScrollTop;\n        this.scrollType = scrollType;\n        this.type = 'range';\n        this.minLineNumber = lineNumber;\n        this.maxLineNumber = lineNumber;\n    }\n}\nclass HorizontalRevealSelectionsRequest {\n    constructor(minimalReveal, selections, startScrollTop, stopScrollTop, scrollType) {\n        this.minimalReveal = minimalReveal;\n        this.selections = selections;\n        this.startScrollTop = startScrollTop;\n        this.stopScrollTop = stopScrollTop;\n        this.scrollType = scrollType;\n        this.type = 'selections';\n        let minLineNumber = selections[0].startLineNumber;\n        let maxLineNumber = selections[0].endLineNumber;\n        for (let i = 1, len = selections.length; i < len; i++) {\n            const selection = selections[i];\n            minLineNumber = Math.min(minLineNumber, selection.startLineNumber);\n            maxLineNumber = Math.max(maxLineNumber, selection.endLineNumber);\n        }\n        this.minLineNumber = minLineNumber;\n        this.maxLineNumber = maxLineNumber;\n    }\n}\n/**\n * The view lines part is responsible for rendering the actual content of a\n * file.\n */\nclass ViewLines extends ViewPart {\n    /**\n     * Adds this amount of pixels to the right of lines (no-one wants to type near the edge of the viewport)\n     */\n    static { this.HORIZONTAL_EXTRA_PX = 30; }\n    constructor(context, viewGpuContext, linesContent) {\n        super(context);\n        const conf = this._context.configuration;\n        const options = this._context.configuration.options;\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        const wrappingInfo = options.get(166 /* EditorOption.wrappingInfo */);\n        this._lineHeight = options.get(75 /* EditorOption.lineHeight */);\n        this._typicalHalfwidthCharacterWidth = fontInfo.typicalHalfwidthCharacterWidth;\n        this._isViewportWrapping = wrappingInfo.isViewportWrapping;\n        this._revealHorizontalRightPadding = options.get(114 /* EditorOption.revealHorizontalRightPadding */);\n        this._cursorSurroundingLines = options.get(35 /* EditorOption.cursorSurroundingLines */);\n        this._cursorSurroundingLinesStyle = options.get(36 /* EditorOption.cursorSurroundingLinesStyle */);\n        this._canUseLayerHinting = !options.get(39 /* EditorOption.disableLayerHinting */);\n        this._viewLineOptions = new ViewLineOptions(conf, this._context.theme.type);\n        this._linesContent = linesContent;\n        this._textRangeRestingSpot = document.createElement('div');\n        this._visibleLines = new VisibleLinesCollection(this._context, {\n            createLine: () => new ViewLine(viewGpuContext, this._viewLineOptions),\n        });\n        this.domNode = this._visibleLines.domNode;\n        PartFingerprints.write(this.domNode, 8 /* PartFingerprint.ViewLines */);\n        this.domNode.setClassName(`view-lines ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`);\n        applyFontInfo(this.domNode, fontInfo);\n        // --- width & height\n        this._maxLineWidth = 0;\n        this._asyncUpdateLineWidths = new RunOnceScheduler(() => {\n            this._updateLineWidthsSlow();\n        }, 200);\n        this._asyncCheckMonospaceFontAssumptions = new RunOnceScheduler(() => {\n            this._checkMonospaceFontAssumptions();\n        }, 2000);\n        this._lastRenderedData = new LastRenderedData();\n        this._horizontalRevealRequest = null;\n        // sticky scroll widget\n        this._stickyScrollEnabled = options.get(131 /* EditorOption.stickyScroll */).enabled;\n        this._maxNumberStickyLines = options.get(131 /* EditorOption.stickyScroll */).maxLineCount;\n    }\n    dispose() {\n        this._asyncUpdateLineWidths.dispose();\n        this._asyncCheckMonospaceFontAssumptions.dispose();\n        super.dispose();\n    }\n    getDomNode() {\n        return this.domNode;\n    }\n    // ---- begin view event handlers\n    onConfigurationChanged(e) {\n        this._visibleLines.onConfigurationChanged(e);\n        if (e.hasChanged(166 /* EditorOption.wrappingInfo */)) {\n            this._maxLineWidth = 0;\n        }\n        const options = this._context.configuration.options;\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        const wrappingInfo = options.get(166 /* EditorOption.wrappingInfo */);\n        this._lineHeight = options.get(75 /* EditorOption.lineHeight */);\n        this._typicalHalfwidthCharacterWidth = fontInfo.typicalHalfwidthCharacterWidth;\n        this._isViewportWrapping = wrappingInfo.isViewportWrapping;\n        this._revealHorizontalRightPadding = options.get(114 /* EditorOption.revealHorizontalRightPadding */);\n        this._cursorSurroundingLines = options.get(35 /* EditorOption.cursorSurroundingLines */);\n        this._cursorSurroundingLinesStyle = options.get(36 /* EditorOption.cursorSurroundingLinesStyle */);\n        this._canUseLayerHinting = !options.get(39 /* EditorOption.disableLayerHinting */);\n        // sticky scroll\n        this._stickyScrollEnabled = options.get(131 /* EditorOption.stickyScroll */).enabled;\n        this._maxNumberStickyLines = options.get(131 /* EditorOption.stickyScroll */).maxLineCount;\n        applyFontInfo(this.domNode, fontInfo);\n        this._onOptionsMaybeChanged();\n        if (e.hasChanged(165 /* EditorOption.layoutInfo */)) {\n            this._maxLineWidth = 0;\n        }\n        return true;\n    }\n    _onOptionsMaybeChanged() {\n        const conf = this._context.configuration;\n        const newViewLineOptions = new ViewLineOptions(conf, this._context.theme.type);\n        if (!this._viewLineOptions.equals(newViewLineOptions)) {\n            this._viewLineOptions = newViewLineOptions;\n            const startLineNumber = this._visibleLines.getStartLineNumber();\n            const endLineNumber = this._visibleLines.getEndLineNumber();\n            for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n                const line = this._visibleLines.getVisibleLine(lineNumber);\n                line.onOptionsChanged(this._viewLineOptions);\n            }\n            return true;\n        }\n        return false;\n    }\n    onCursorStateChanged(e) {\n        const rendStartLineNumber = this._visibleLines.getStartLineNumber();\n        const rendEndLineNumber = this._visibleLines.getEndLineNumber();\n        let r = false;\n        for (let lineNumber = rendStartLineNumber; lineNumber <= rendEndLineNumber; lineNumber++) {\n            r = this._visibleLines.getVisibleLine(lineNumber).onSelectionChanged() || r;\n        }\n        return r;\n    }\n    onDecorationsChanged(e) {\n        {\n            const rendStartLineNumber = this._visibleLines.getStartLineNumber();\n            const rendEndLineNumber = this._visibleLines.getEndLineNumber();\n            for (let lineNumber = rendStartLineNumber; lineNumber <= rendEndLineNumber; lineNumber++) {\n                this._visibleLines.getVisibleLine(lineNumber).onDecorationsChanged();\n            }\n        }\n        return true;\n    }\n    onFlushed(e) {\n        const shouldRender = this._visibleLines.onFlushed(e, this._viewLineOptions.useGpu);\n        this._maxLineWidth = 0;\n        return shouldRender;\n    }\n    onLinesChanged(e) {\n        return this._visibleLines.onLinesChanged(e);\n    }\n    onLinesDeleted(e) {\n        return this._visibleLines.onLinesDeleted(e);\n    }\n    onLinesInserted(e) {\n        return this._visibleLines.onLinesInserted(e);\n    }\n    onRevealRangeRequest(e) {\n        // Using the future viewport here in order to handle multiple\n        // incoming reveal range requests that might all desire to be animated\n        const desiredScrollTop = this._computeScrollTopToRevealRange(this._context.viewLayout.getFutureViewport(), e.source, e.minimalReveal, e.range, e.selections, e.verticalType);\n        if (desiredScrollTop === -1) {\n            // marker to abort the reveal range request\n            return false;\n        }\n        // validate the new desired scroll top\n        let newScrollPosition = this._context.viewLayout.validateScrollPosition({ scrollTop: desiredScrollTop });\n        if (e.revealHorizontal) {\n            if (e.range && e.range.startLineNumber !== e.range.endLineNumber) {\n                // Two or more lines? => scroll to base (That's how you see most of the two lines)\n                newScrollPosition = {\n                    scrollTop: newScrollPosition.scrollTop,\n                    scrollLeft: 0\n                };\n            }\n            else if (e.range) {\n                // We don't necessarily know the horizontal offset of this range since the line might not be in the view...\n                this._horizontalRevealRequest = new HorizontalRevealRangeRequest(e.minimalReveal, e.range.startLineNumber, e.range.startColumn, e.range.endColumn, this._context.viewLayout.getCurrentScrollTop(), newScrollPosition.scrollTop, e.scrollType);\n            }\n            else if (e.selections && e.selections.length > 0) {\n                this._horizontalRevealRequest = new HorizontalRevealSelectionsRequest(e.minimalReveal, e.selections, this._context.viewLayout.getCurrentScrollTop(), newScrollPosition.scrollTop, e.scrollType);\n            }\n        }\n        else {\n            this._horizontalRevealRequest = null;\n        }\n        const scrollTopDelta = Math.abs(this._context.viewLayout.getCurrentScrollTop() - newScrollPosition.scrollTop);\n        const scrollType = (scrollTopDelta <= this._lineHeight ? 1 /* ScrollType.Immediate */ : e.scrollType);\n        this._context.viewModel.viewLayout.setScrollPosition(newScrollPosition, scrollType);\n        return true;\n    }\n    onScrollChanged(e) {\n        if (this._horizontalRevealRequest && e.scrollLeftChanged) {\n            // cancel any outstanding horizontal reveal request if someone else scrolls horizontally.\n            this._horizontalRevealRequest = null;\n        }\n        if (this._horizontalRevealRequest && e.scrollTopChanged) {\n            const min = Math.min(this._horizontalRevealRequest.startScrollTop, this._horizontalRevealRequest.stopScrollTop);\n            const max = Math.max(this._horizontalRevealRequest.startScrollTop, this._horizontalRevealRequest.stopScrollTop);\n            if (e.scrollTop < min || e.scrollTop > max) {\n                // cancel any outstanding horizontal reveal request if someone else scrolls vertically.\n                this._horizontalRevealRequest = null;\n            }\n        }\n        this.domNode.setWidth(e.scrollWidth);\n        return this._visibleLines.onScrollChanged(e) || true;\n    }\n    onTokensChanged(e) {\n        return this._visibleLines.onTokensChanged(e);\n    }\n    onZonesChanged(e) {\n        this._context.viewModel.viewLayout.setMaxLineWidth(this._maxLineWidth);\n        return this._visibleLines.onZonesChanged(e);\n    }\n    onThemeChanged(e) {\n        return this._onOptionsMaybeChanged();\n    }\n    // ---- end view event handlers\n    // ----------- HELPERS FOR OTHERS\n    getPositionFromDOMInfo(spanNode, offset) {\n        const viewLineDomNode = this._getViewLineDomNode(spanNode);\n        if (viewLineDomNode === null) {\n            // Couldn't find view line node\n            return null;\n        }\n        const lineNumber = this._getLineNumberFor(viewLineDomNode);\n        if (lineNumber === -1) {\n            // Couldn't find view line node\n            return null;\n        }\n        if (lineNumber < 1 || lineNumber > this._context.viewModel.getLineCount()) {\n            // lineNumber is outside range\n            return null;\n        }\n        if (this._context.viewModel.getLineMaxColumn(lineNumber) === 1) {\n            // Line is empty\n            return new Position(lineNumber, 1);\n        }\n        const rendStartLineNumber = this._visibleLines.getStartLineNumber();\n        const rendEndLineNumber = this._visibleLines.getEndLineNumber();\n        if (lineNumber < rendStartLineNumber || lineNumber > rendEndLineNumber) {\n            // Couldn't find line\n            return null;\n        }\n        let column = this._visibleLines.getVisibleLine(lineNumber).getColumnOfNodeOffset(spanNode, offset);\n        const minColumn = this._context.viewModel.getLineMinColumn(lineNumber);\n        if (column < minColumn) {\n            column = minColumn;\n        }\n        return new Position(lineNumber, column);\n    }\n    _getViewLineDomNode(node) {\n        while (node && node.nodeType === 1) {\n            if (node.className === ViewLine.CLASS_NAME) {\n                return node;\n            }\n            node = node.parentElement;\n        }\n        return null;\n    }\n    /**\n     * @returns the line number of this view line dom node.\n     */\n    _getLineNumberFor(domNode) {\n        const startLineNumber = this._visibleLines.getStartLineNumber();\n        const endLineNumber = this._visibleLines.getEndLineNumber();\n        for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n            const line = this._visibleLines.getVisibleLine(lineNumber);\n            if (domNode === line.getDomNode()) {\n                return lineNumber;\n            }\n        }\n        return -1;\n    }\n    getLineWidth(lineNumber) {\n        const rendStartLineNumber = this._visibleLines.getStartLineNumber();\n        const rendEndLineNumber = this._visibleLines.getEndLineNumber();\n        if (lineNumber < rendStartLineNumber || lineNumber > rendEndLineNumber) {\n            // Couldn't find line\n            return -1;\n        }\n        const context = new DomReadingContext(this.domNode.domNode, this._textRangeRestingSpot);\n        const result = this._visibleLines.getVisibleLine(lineNumber).getWidth(context);\n        this._updateLineWidthsSlowIfDomDidLayout(context);\n        return result;\n    }\n    linesVisibleRangesForRange(_range, includeNewLines) {\n        if (this.shouldRender()) {\n            // Cannot read from the DOM because it is dirty\n            // i.e. the model & the dom are out of sync, so I'd be reading something stale\n            return null;\n        }\n        const originalEndLineNumber = _range.endLineNumber;\n        const range = Range.intersectRanges(_range, this._lastRenderedData.getCurrentVisibleRange());\n        if (!range) {\n            return null;\n        }\n        const visibleRanges = [];\n        let visibleRangesLen = 0;\n        const domReadingContext = new DomReadingContext(this.domNode.domNode, this._textRangeRestingSpot);\n        let nextLineModelLineNumber = 0;\n        if (includeNewLines) {\n            nextLineModelLineNumber = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(range.startLineNumber, 1)).lineNumber;\n        }\n        const rendStartLineNumber = this._visibleLines.getStartLineNumber();\n        const rendEndLineNumber = this._visibleLines.getEndLineNumber();\n        for (let lineNumber = range.startLineNumber; lineNumber <= range.endLineNumber; lineNumber++) {\n            if (lineNumber < rendStartLineNumber || lineNumber > rendEndLineNumber) {\n                continue;\n            }\n            const startColumn = lineNumber === range.startLineNumber ? range.startColumn : 1;\n            const continuesInNextLine = lineNumber !== originalEndLineNumber;\n            const endColumn = continuesInNextLine ? this._context.viewModel.getLineMaxColumn(lineNumber) : range.endColumn;\n            const visibleLine = this._visibleLines.getVisibleLine(lineNumber);\n            const visibleRangesForLine = visibleLine.getVisibleRangesForRange(lineNumber, startColumn, endColumn, domReadingContext);\n            if (!visibleRangesForLine) {\n                continue;\n            }\n            if (includeNewLines && lineNumber < originalEndLineNumber) {\n                const currentLineModelLineNumber = nextLineModelLineNumber;\n                nextLineModelLineNumber = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(lineNumber + 1, 1)).lineNumber;\n                if (currentLineModelLineNumber !== nextLineModelLineNumber) {\n                    const floatHorizontalRange = visibleRangesForLine.ranges[visibleRangesForLine.ranges.length - 1];\n                    floatHorizontalRange.width += this._typicalHalfwidthCharacterWidth;\n                    if (this._context.viewModel.getTextDirection(currentLineModelLineNumber) === TextDirection.RTL) {\n                        floatHorizontalRange.left -= this._typicalHalfwidthCharacterWidth;\n                    }\n                }\n            }\n            visibleRanges[visibleRangesLen++] = new LineVisibleRanges(visibleRangesForLine.outsideRenderedLine, lineNumber, HorizontalRange.from(visibleRangesForLine.ranges), continuesInNextLine);\n        }\n        this._updateLineWidthsSlowIfDomDidLayout(domReadingContext);\n        if (visibleRangesLen === 0) {\n            return null;\n        }\n        return visibleRanges;\n    }\n    _visibleRangesForLineRange(lineNumber, startColumn, endColumn) {\n        if (this.shouldRender()) {\n            // Cannot read from the DOM because it is dirty\n            // i.e. the model & the dom are out of sync, so I'd be reading something stale\n            return null;\n        }\n        if (lineNumber < this._visibleLines.getStartLineNumber() || lineNumber > this._visibleLines.getEndLineNumber()) {\n            return null;\n        }\n        const domReadingContext = new DomReadingContext(this.domNode.domNode, this._textRangeRestingSpot);\n        const result = this._visibleLines.getVisibleLine(lineNumber).getVisibleRangesForRange(lineNumber, startColumn, endColumn, domReadingContext);\n        this._updateLineWidthsSlowIfDomDidLayout(domReadingContext);\n        return result;\n    }\n    _lineIsRenderedRTL(lineNumber) {\n        if (lineNumber < this._visibleLines.getStartLineNumber() || lineNumber > this._visibleLines.getEndLineNumber()) {\n            return false;\n        }\n        const visibleLine = this._visibleLines.getVisibleLine(lineNumber);\n        return visibleLine.isRenderedRTL();\n    }\n    visibleRangeForPosition(position) {\n        const visibleRanges = this._visibleRangesForLineRange(position.lineNumber, position.column, position.column);\n        if (!visibleRanges) {\n            return null;\n        }\n        return new HorizontalPosition(visibleRanges.outsideRenderedLine, visibleRanges.ranges[0].left);\n    }\n    /**\n     * Updates the max line width if it is fast to compute.\n     * Returns true if all lines were taken into account.\n     * Returns false if some lines need to be reevaluated (in a slow fashion).\n     */\n    _updateLineWidthsFast() {\n        return this._updateLineWidths(true);\n    }\n    _updateLineWidthsSlow() {\n        this._updateLineWidths(false);\n    }\n    /**\n     * Update the line widths using DOM layout information after someone else\n     * has caused a synchronous layout.\n     */\n    _updateLineWidthsSlowIfDomDidLayout(domReadingContext) {\n        if (!domReadingContext.didDomLayout) {\n            // only proceed if we just did a layout\n            return;\n        }\n        if (this._asyncUpdateLineWidths.isScheduled()) {\n            // reading widths is not scheduled => widths are up-to-date\n            return;\n        }\n        this._asyncUpdateLineWidths.cancel();\n        this._updateLineWidthsSlow();\n    }\n    _updateLineWidths(fast) {\n        const rendStartLineNumber = this._visibleLines.getStartLineNumber();\n        const rendEndLineNumber = this._visibleLines.getEndLineNumber();\n        let localMaxLineWidth = 1;\n        let allWidthsComputed = true;\n        for (let lineNumber = rendStartLineNumber; lineNumber <= rendEndLineNumber; lineNumber++) {\n            const visibleLine = this._visibleLines.getVisibleLine(lineNumber);\n            if (fast && !visibleLine.getWidthIsFast()) {\n                // Cannot compute width in a fast way for this line\n                allWidthsComputed = false;\n                continue;\n            }\n            localMaxLineWidth = Math.max(localMaxLineWidth, visibleLine.getWidth(null));\n        }\n        if (allWidthsComputed && rendStartLineNumber === 1 && rendEndLineNumber === this._context.viewModel.getLineCount()) {\n            // we know the max line width for all the lines\n            this._maxLineWidth = 0;\n        }\n        this._ensureMaxLineWidth(localMaxLineWidth);\n        return allWidthsComputed;\n    }\n    _checkMonospaceFontAssumptions() {\n        // Problems with monospace assumptions are more apparent for longer lines,\n        // as small rounding errors start to sum up, so we will select the longest\n        // line for a closer inspection\n        let longestLineNumber = -1;\n        let longestWidth = -1;\n        const rendStartLineNumber = this._visibleLines.getStartLineNumber();\n        const rendEndLineNumber = this._visibleLines.getEndLineNumber();\n        for (let lineNumber = rendStartLineNumber; lineNumber <= rendEndLineNumber; lineNumber++) {\n            const visibleLine = this._visibleLines.getVisibleLine(lineNumber);\n            if (visibleLine.needsMonospaceFontCheck()) {\n                const lineWidth = visibleLine.getWidth(null);\n                if (lineWidth > longestWidth) {\n                    longestWidth = lineWidth;\n                    longestLineNumber = lineNumber;\n                }\n            }\n        }\n        if (longestLineNumber === -1) {\n            return;\n        }\n        if (!this._visibleLines.getVisibleLine(longestLineNumber).monospaceAssumptionsAreValid()) {\n            for (let lineNumber = rendStartLineNumber; lineNumber <= rendEndLineNumber; lineNumber++) {\n                const visibleLine = this._visibleLines.getVisibleLine(lineNumber);\n                visibleLine.onMonospaceAssumptionsInvalidated();\n            }\n        }\n    }\n    prepareRender() {\n        throw new Error('Not supported');\n    }\n    render() {\n        throw new Error('Not supported');\n    }\n    renderText(viewportData) {\n        // (1) render lines - ensures lines are in the DOM\n        this._visibleLines.renderLines(viewportData);\n        this._lastRenderedData.setCurrentVisibleRange(viewportData.visibleRange);\n        this.domNode.setWidth(this._context.viewLayout.getScrollWidth());\n        this.domNode.setHeight(Math.min(this._context.viewLayout.getScrollHeight(), 1000000));\n        // (2) compute horizontal scroll position:\n        //  - this must happen after the lines are in the DOM since it might need a line that rendered just now\n        //  - it might change `scrollWidth` and `scrollLeft`\n        if (this._horizontalRevealRequest) {\n            const horizontalRevealRequest = this._horizontalRevealRequest;\n            // Check that we have the line that contains the horizontal range in the viewport\n            if (viewportData.startLineNumber <= horizontalRevealRequest.minLineNumber && horizontalRevealRequest.maxLineNumber <= viewportData.endLineNumber) {\n                this._horizontalRevealRequest = null;\n                // allow `visibleRangesForRange2` to work\n                this.onDidRender();\n                // compute new scroll position\n                const newScrollLeft = this._computeScrollLeftToReveal(horizontalRevealRequest);\n                if (newScrollLeft) {\n                    if (!this._isViewportWrapping && !newScrollLeft.hasRTL) {\n                        // ensure `scrollWidth` is large enough\n                        this._ensureMaxLineWidth(newScrollLeft.maxHorizontalOffset);\n                    }\n                    // set `scrollLeft`\n                    this._context.viewModel.viewLayout.setScrollPosition({\n                        scrollLeft: newScrollLeft.scrollLeft\n                    }, horizontalRevealRequest.scrollType);\n                }\n            }\n        }\n        // Update max line width (not so important, it is just so the horizontal scrollbar doesn't get too small)\n        if (!this._updateLineWidthsFast()) {\n            // Computing the width of some lines would be slow => delay it\n            this._asyncUpdateLineWidths.schedule();\n        }\n        else {\n            this._asyncUpdateLineWidths.cancel();\n        }\n        if (isLinux && !this._asyncCheckMonospaceFontAssumptions.isScheduled()) {\n            const rendStartLineNumber = this._visibleLines.getStartLineNumber();\n            const rendEndLineNumber = this._visibleLines.getEndLineNumber();\n            for (let lineNumber = rendStartLineNumber; lineNumber <= rendEndLineNumber; lineNumber++) {\n                const visibleLine = this._visibleLines.getVisibleLine(lineNumber);\n                if (visibleLine.needsMonospaceFontCheck()) {\n                    this._asyncCheckMonospaceFontAssumptions.schedule();\n                    break;\n                }\n            }\n        }\n        // (3) handle scrolling\n        this._linesContent.setLayerHinting(this._canUseLayerHinting);\n        this._linesContent.setContain('strict');\n        const adjustedScrollTop = this._context.viewLayout.getCurrentScrollTop() - viewportData.bigNumbersDelta;\n        this._linesContent.setTop(-adjustedScrollTop);\n        this._linesContent.setLeft(-this._context.viewLayout.getCurrentScrollLeft());\n    }\n    // --- width\n    _ensureMaxLineWidth(lineWidth) {\n        const iLineWidth = Math.ceil(lineWidth);\n        if (this._maxLineWidth < iLineWidth) {\n            this._maxLineWidth = iLineWidth;\n            this._context.viewModel.viewLayout.setMaxLineWidth(this._maxLineWidth);\n        }\n    }\n    _computeScrollTopToRevealRange(viewport, source, minimalReveal, range, selections, verticalType) {\n        const viewportStartY = viewport.top;\n        const viewportHeight = viewport.height;\n        const viewportEndY = viewportStartY + viewportHeight;\n        let boxIsSingleRange;\n        let boxStartY;\n        let boxEndY;\n        if (selections && selections.length > 0) {\n            let minLineNumber = selections[0].startLineNumber;\n            let maxLineNumber = selections[0].endLineNumber;\n            for (let i = 1, len = selections.length; i < len; i++) {\n                const selection = selections[i];\n                minLineNumber = Math.min(minLineNumber, selection.startLineNumber);\n                maxLineNumber = Math.max(maxLineNumber, selection.endLineNumber);\n            }\n            boxIsSingleRange = false;\n            boxStartY = this._context.viewLayout.getVerticalOffsetForLineNumber(minLineNumber);\n            boxEndY = this._context.viewLayout.getVerticalOffsetForLineNumber(maxLineNumber) + this._lineHeight;\n        }\n        else if (range) {\n            boxIsSingleRange = true;\n            boxStartY = this._context.viewLayout.getVerticalOffsetForLineNumber(range.startLineNumber);\n            boxEndY = this._context.viewLayout.getVerticalOffsetForLineNumber(range.endLineNumber) + this._lineHeight;\n        }\n        else {\n            return -1;\n        }\n        const shouldIgnoreScrollOff = (source === 'mouse' || minimalReveal) && this._cursorSurroundingLinesStyle === 'default';\n        let paddingTop = 0;\n        let paddingBottom = 0;\n        if (!shouldIgnoreScrollOff) {\n            const maxLinesInViewport = (viewportHeight / this._lineHeight);\n            const surroundingLines = Math.max(this._cursorSurroundingLines, this._stickyScrollEnabled ? this._maxNumberStickyLines : 0);\n            const context = Math.min(maxLinesInViewport / 2, surroundingLines);\n            paddingTop = context * this._lineHeight;\n            paddingBottom = Math.max(0, (context - 1)) * this._lineHeight;\n        }\n        else {\n            if (!minimalReveal) {\n                // Reveal one more line above (this case is hit when dragging)\n                paddingTop = this._lineHeight;\n            }\n        }\n        if (!minimalReveal) {\n            if (verticalType === 0 /* viewEvents.VerticalRevealType.Simple */ || verticalType === 4 /* viewEvents.VerticalRevealType.Bottom */) {\n                // Reveal one line more when the last line would be covered by the scrollbar - arrow down case or revealing a line explicitly at bottom\n                paddingBottom += this._lineHeight;\n            }\n        }\n        boxStartY -= paddingTop;\n        boxEndY += paddingBottom;\n        let newScrollTop;\n        if (boxEndY - boxStartY > viewportHeight) {\n            // the box is larger than the viewport ... scroll to its top\n            if (!boxIsSingleRange) {\n                // do not reveal multiple cursors if there are more than fit the viewport\n                return -1;\n            }\n            newScrollTop = boxStartY;\n        }\n        else if (verticalType === 5 /* viewEvents.VerticalRevealType.NearTop */ || verticalType === 6 /* viewEvents.VerticalRevealType.NearTopIfOutsideViewport */) {\n            if (verticalType === 6 /* viewEvents.VerticalRevealType.NearTopIfOutsideViewport */ && viewportStartY <= boxStartY && boxEndY <= viewportEndY) {\n                // Box is already in the viewport... do nothing\n                newScrollTop = viewportStartY;\n            }\n            else {\n                // We want a gap that is 20% of the viewport, but with a minimum of 5 lines\n                const desiredGapAbove = Math.max(5 * this._lineHeight, viewportHeight * 0.2);\n                // Try to scroll just above the box with the desired gap\n                const desiredScrollTop = boxStartY - desiredGapAbove;\n                // But ensure that the box is not pushed out of viewport\n                const minScrollTop = boxEndY - viewportHeight;\n                newScrollTop = Math.max(minScrollTop, desiredScrollTop);\n            }\n        }\n        else if (verticalType === 1 /* viewEvents.VerticalRevealType.Center */ || verticalType === 2 /* viewEvents.VerticalRevealType.CenterIfOutsideViewport */) {\n            if (verticalType === 2 /* viewEvents.VerticalRevealType.CenterIfOutsideViewport */ && viewportStartY <= boxStartY && boxEndY <= viewportEndY) {\n                // Box is already in the viewport... do nothing\n                newScrollTop = viewportStartY;\n            }\n            else {\n                // Box is outside the viewport... center it\n                const boxMiddleY = (boxStartY + boxEndY) / 2;\n                newScrollTop = Math.max(0, boxMiddleY - viewportHeight / 2);\n            }\n        }\n        else {\n            newScrollTop = this._computeMinimumScrolling(viewportStartY, viewportEndY, boxStartY, boxEndY, verticalType === 3 /* viewEvents.VerticalRevealType.Top */, verticalType === 4 /* viewEvents.VerticalRevealType.Bottom */);\n        }\n        return newScrollTop;\n    }\n    _computeScrollLeftToReveal(horizontalRevealRequest) {\n        const viewport = this._context.viewLayout.getCurrentViewport();\n        const layoutInfo = this._context.configuration.options.get(165 /* EditorOption.layoutInfo */);\n        const viewportStartX = viewport.left;\n        const viewportEndX = viewportStartX + viewport.width - layoutInfo.verticalScrollbarWidth;\n        let boxStartX = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n        let boxEndX = 0;\n        let hasRTL = false;\n        if (horizontalRevealRequest.type === 'range') {\n            hasRTL = this._lineIsRenderedRTL(horizontalRevealRequest.lineNumber);\n            const visibleRanges = this._visibleRangesForLineRange(horizontalRevealRequest.lineNumber, horizontalRevealRequest.startColumn, horizontalRevealRequest.endColumn);\n            if (!visibleRanges) {\n                return null;\n            }\n            for (const visibleRange of visibleRanges.ranges) {\n                boxStartX = Math.min(boxStartX, Math.round(visibleRange.left));\n                boxEndX = Math.max(boxEndX, Math.round(visibleRange.left + visibleRange.width));\n            }\n        }\n        else {\n            for (const selection of horizontalRevealRequest.selections) {\n                if (selection.startLineNumber !== selection.endLineNumber) {\n                    return null;\n                }\n                const visibleRanges = this._visibleRangesForLineRange(selection.startLineNumber, selection.startColumn, selection.endColumn);\n                hasRTL ||= this._lineIsRenderedRTL(selection.startLineNumber);\n                if (!visibleRanges) {\n                    return null;\n                }\n                for (const visibleRange of visibleRanges.ranges) {\n                    boxStartX = Math.min(boxStartX, Math.round(visibleRange.left));\n                    boxEndX = Math.max(boxEndX, Math.round(visibleRange.left + visibleRange.width));\n                }\n            }\n        }\n        if (!horizontalRevealRequest.minimalReveal) {\n            boxStartX = Math.max(0, boxStartX - ViewLines.HORIZONTAL_EXTRA_PX);\n            boxEndX += this._revealHorizontalRightPadding;\n        }\n        if (horizontalRevealRequest.type === 'selections' && boxEndX - boxStartX > viewport.width) {\n            return null;\n        }\n        const newScrollLeft = this._computeMinimumScrolling(viewportStartX, viewportEndX, boxStartX, boxEndX);\n        return {\n            scrollLeft: newScrollLeft,\n            maxHorizontalOffset: boxEndX,\n            hasRTL\n        };\n    }\n    _computeMinimumScrolling(viewportStart, viewportEnd, boxStart, boxEnd, revealAtStart, revealAtEnd) {\n        viewportStart = viewportStart | 0;\n        viewportEnd = viewportEnd | 0;\n        boxStart = boxStart | 0;\n        boxEnd = boxEnd | 0;\n        revealAtStart = !!revealAtStart;\n        revealAtEnd = !!revealAtEnd;\n        const viewportLength = viewportEnd - viewportStart;\n        const boxLength = boxEnd - boxStart;\n        if (boxLength < viewportLength) {\n            // The box would fit in the viewport\n            if (revealAtStart) {\n                return boxStart;\n            }\n            if (revealAtEnd) {\n                return Math.max(0, boxEnd - viewportLength);\n            }\n            if (boxStart < viewportStart) {\n                // The box is above the viewport\n                return boxStart;\n            }\n            else if (boxEnd > viewportEnd) {\n                // The box is below the viewport\n                return Math.max(0, boxEnd - viewportLength);\n            }\n        }\n        else {\n            // The box would not fit in the viewport\n            // Reveal the beginning of the box\n            return boxStart;\n        }\n        return viewportStart;\n    }\n}\n\nexport { ViewLines };\n","import './linesDecorations.css';\nimport { DedupOverlay, DecorationToRender } from '../glyphMargin/glyphMargin.js';\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 *--------------------------------------------------------------------------------------------*/\nclass LinesDecorationsOverlay extends DedupOverlay {\n    constructor(context) {\n        super();\n        this._context = context;\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._decorationsLeft = layoutInfo.decorationsLeft;\n        this._decorationsWidth = layoutInfo.decorationsWidth;\n        this._renderResult = null;\n        this._context.addEventHandler(this);\n    }\n    dispose() {\n        this._context.removeEventHandler(this);\n        this._renderResult = null;\n        super.dispose();\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._decorationsLeft = layoutInfo.decorationsLeft;\n        this._decorationsWidth = layoutInfo.decorationsWidth;\n        return true;\n    }\n    onDecorationsChanged(e) {\n        return true;\n    }\n    onFlushed(e) {\n        return true;\n    }\n    onLinesChanged(e) {\n        return true;\n    }\n    onLinesDeleted(e) {\n        return true;\n    }\n    onLinesInserted(e) {\n        return true;\n    }\n    onScrollChanged(e) {\n        return e.scrollTopChanged;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    // --- end event handlers\n    _getDecorations(ctx) {\n        const decorations = ctx.getDecorationsInViewport();\n        const r = [];\n        let rLen = 0;\n        for (let i = 0, len = decorations.length; i < len; i++) {\n            const d = decorations[i];\n            const linesDecorationsClassName = d.options.linesDecorationsClassName;\n            const zIndex = d.options.zIndex;\n            if (linesDecorationsClassName) {\n                r[rLen++] = new DecorationToRender(d.range.startLineNumber, d.range.endLineNumber, linesDecorationsClassName, d.options.linesDecorationsTooltip ?? null, zIndex);\n            }\n            const firstLineDecorationClassName = d.options.firstLineDecorationClassName;\n            if (firstLineDecorationClassName) {\n                r[rLen++] = new DecorationToRender(d.range.startLineNumber, d.range.startLineNumber, firstLineDecorationClassName, d.options.linesDecorationsTooltip ?? null, zIndex);\n            }\n        }\n        return r;\n    }\n    prepareRender(ctx) {\n        const visibleStartLineNumber = ctx.visibleRange.startLineNumber;\n        const visibleEndLineNumber = ctx.visibleRange.endLineNumber;\n        const toRender = this._render(visibleStartLineNumber, visibleEndLineNumber, this._getDecorations(ctx));\n        const left = this._decorationsLeft.toString();\n        const width = this._decorationsWidth.toString();\n        const common = '\" style=\"left:' + left + 'px;width:' + width + 'px;\"></div>';\n        const output = [];\n        for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {\n            const lineIndex = lineNumber - visibleStartLineNumber;\n            const decorations = toRender[lineIndex].getDecorations();\n            let lineOutput = '';\n            for (const decoration of decorations) {\n                let addition = '<div class=\"cldr ' + decoration.className;\n                if (decoration.tooltip !== null) {\n                    addition += '\" title=\"' + decoration.tooltip; // The tooltip is already escaped.\n                }\n                addition += common;\n                lineOutput += addition;\n            }\n            output[lineIndex] = lineOutput;\n        }\n        this._renderResult = output;\n    }\n    render(startLineNumber, lineNumber) {\n        if (!this._renderResult) {\n            return '';\n        }\n        return this._renderResult[lineNumber - startLineNumber];\n    }\n}\n\nexport { LinesDecorationsOverlay };\n","import './margin.css';\nimport { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport { ViewPart } from '../../view/viewPart.js';\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/**\n * Margin is a vertical strip located on the left of the editor's content area.\n * It is used for various features such as line numbers, folding markers, and\n * decorations that provide additional information about the lines of code.\n */\nclass Margin extends ViewPart {\n    static { this.CLASS_NAME = 'glyph-margin'; }\n    static { this.OUTER_CLASS_NAME = 'margin'; }\n    constructor(context) {\n        super(context);\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._canUseLayerHinting = !options.get(39 /* EditorOption.disableLayerHinting */);\n        this._contentLeft = layoutInfo.contentLeft;\n        this._glyphMarginLeft = layoutInfo.glyphMarginLeft;\n        this._glyphMarginWidth = layoutInfo.glyphMarginWidth;\n        this._domNode = createFastDomNode(document.createElement('div'));\n        this._domNode.setClassName(Margin.OUTER_CLASS_NAME);\n        this._domNode.setPosition('absolute');\n        this._domNode.setAttribute('role', 'presentation');\n        this._domNode.setAttribute('aria-hidden', 'true');\n        this._glyphMarginBackgroundDomNode = createFastDomNode(document.createElement('div'));\n        this._glyphMarginBackgroundDomNode.setClassName(Margin.CLASS_NAME);\n        this._domNode.appendChild(this._glyphMarginBackgroundDomNode);\n    }\n    dispose() {\n        super.dispose();\n    }\n    getDomNode() {\n        return this._domNode;\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._canUseLayerHinting = !options.get(39 /* EditorOption.disableLayerHinting */);\n        this._contentLeft = layoutInfo.contentLeft;\n        this._glyphMarginLeft = layoutInfo.glyphMarginLeft;\n        this._glyphMarginWidth = layoutInfo.glyphMarginWidth;\n        return true;\n    }\n    onScrollChanged(e) {\n        return super.onScrollChanged(e) || e.scrollTopChanged;\n    }\n    // --- end event handlers\n    prepareRender(ctx) {\n        // Nothing to read\n    }\n    render(ctx) {\n        this._domNode.setLayerHinting(this._canUseLayerHinting);\n        this._domNode.setContain('strict');\n        const adjustedScrollTop = ctx.scrollTop - ctx.bigNumbersDelta;\n        this._domNode.setTop(-adjustedScrollTop);\n        const height = Math.min(ctx.scrollHeight, 1000000);\n        this._domNode.setHeight(height);\n        this._domNode.setWidth(this._contentLeft);\n        this._glyphMarginBackgroundDomNode.setLeft(this._glyphMarginLeft);\n        this._glyphMarginBackgroundDomNode.setWidth(this._glyphMarginWidth);\n        this._glyphMarginBackgroundDomNode.setHeight(height);\n    }\n}\n\nexport { Margin };\n","import './marginDecorations.css';\nimport { DedupOverlay, DecorationToRender } from '../glyphMargin/glyphMargin.js';\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 *--------------------------------------------------------------------------------------------*/\nclass MarginViewLineDecorationsOverlay extends DedupOverlay {\n    constructor(context) {\n        super();\n        this._context = context;\n        this._renderResult = null;\n        this._context.addEventHandler(this);\n    }\n    dispose() {\n        this._context.removeEventHandler(this);\n        this._renderResult = null;\n        super.dispose();\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        return true;\n    }\n    onDecorationsChanged(e) {\n        return true;\n    }\n    onFlushed(e) {\n        return true;\n    }\n    onLinesChanged(e) {\n        return true;\n    }\n    onLinesDeleted(e) {\n        return true;\n    }\n    onLinesInserted(e) {\n        return true;\n    }\n    onScrollChanged(e) {\n        return e.scrollTopChanged;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    // --- end event handlers\n    _getDecorations(ctx) {\n        const decorations = ctx.getDecorationsInViewport();\n        const r = [];\n        let rLen = 0;\n        for (let i = 0, len = decorations.length; i < len; i++) {\n            const d = decorations[i];\n            const marginClassName = d.options.marginClassName;\n            const zIndex = d.options.zIndex;\n            if (marginClassName) {\n                r[rLen++] = new DecorationToRender(d.range.startLineNumber, d.range.endLineNumber, marginClassName, null, zIndex);\n            }\n        }\n        return r;\n    }\n    prepareRender(ctx) {\n        const visibleStartLineNumber = ctx.visibleRange.startLineNumber;\n        const visibleEndLineNumber = ctx.visibleRange.endLineNumber;\n        const toRender = this._render(visibleStartLineNumber, visibleEndLineNumber, this._getDecorations(ctx));\n        const output = [];\n        for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {\n            const lineIndex = lineNumber - visibleStartLineNumber;\n            const decorations = toRender[lineIndex].getDecorations();\n            let lineOutput = '';\n            for (const decoration of decorations) {\n                lineOutput += '<div class=\"cmdr ' + decoration.className + '\" style=\"\"></div>';\n            }\n            output[lineIndex] = lineOutput;\n        }\n        this._renderResult = output;\n    }\n    render(startLineNumber, lineNumber) {\n        if (!this._renderResult) {\n            return '';\n        }\n        return this._renderResult[lineNumber - startLineNumber];\n    }\n}\n\nexport { MarginViewLineDecorationsOverlay };\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/**\n * A very VM friendly rgba datastructure.\n * Please don't touch unless you take a look at the IR.\n */\nclass RGBA8 {\n    static { this.Empty = new RGBA8(0, 0, 0, 0); }\n    constructor(r, g, b, a) {\n        this._rgba8Brand = undefined;\n        this.r = RGBA8._clamp(r);\n        this.g = RGBA8._clamp(g);\n        this.b = RGBA8._clamp(b);\n        this.a = RGBA8._clamp(a);\n    }\n    equals(other) {\n        return (this.r === other.r\n            && this.g === other.g\n            && this.b === other.b\n            && this.a === other.a);\n    }\n    static _clamp(c) {\n        if (c < 0) {\n            return 0;\n        }\n        if (c > 255) {\n            return 255;\n        }\n        return c | 0;\n    }\n}\n\nexport { RGBA8 };\n","import { Emitter } from '../../base/common/event.js';\nimport { toDisposable, Disposable } from '../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass TokenizationRegistry {\n    constructor() {\n        this._tokenizationSupports = new Map();\n        this._factories = new Map();\n        this._onDidChange = new Emitter();\n        this.onDidChange = this._onDidChange.event;\n        this._colorMap = null;\n    }\n    handleChange(languageIds) {\n        this._onDidChange.fire({\n            changedLanguages: languageIds,\n            changedColorMap: false\n        });\n    }\n    register(languageId, support) {\n        this._tokenizationSupports.set(languageId, support);\n        this.handleChange([languageId]);\n        return toDisposable(() => {\n            if (this._tokenizationSupports.get(languageId) !== support) {\n                return;\n            }\n            this._tokenizationSupports.delete(languageId);\n            this.handleChange([languageId]);\n        });\n    }\n    get(languageId) {\n        return this._tokenizationSupports.get(languageId) || null;\n    }\n    registerFactory(languageId, factory) {\n        this._factories.get(languageId)?.dispose();\n        const myData = new TokenizationSupportFactoryData(this, languageId, factory);\n        this._factories.set(languageId, myData);\n        return toDisposable(() => {\n            const v = this._factories.get(languageId);\n            if (!v || v !== myData) {\n                return;\n            }\n            this._factories.delete(languageId);\n            v.dispose();\n        });\n    }\n    async getOrCreate(languageId) {\n        // check first if the support is already set\n        const tokenizationSupport = this.get(languageId);\n        if (tokenizationSupport) {\n            return tokenizationSupport;\n        }\n        const factory = this._factories.get(languageId);\n        if (!factory || factory.isResolved) {\n            // no factory or factory.resolve already finished\n            return null;\n        }\n        await factory.resolve();\n        return this.get(languageId);\n    }\n    isResolved(languageId) {\n        const tokenizationSupport = this.get(languageId);\n        if (tokenizationSupport) {\n            return true;\n        }\n        const factory = this._factories.get(languageId);\n        if (!factory || factory.isResolved) {\n            return true;\n        }\n        return false;\n    }\n    setColorMap(colorMap) {\n        this._colorMap = colorMap;\n        this._onDidChange.fire({\n            changedLanguages: Array.from(this._tokenizationSupports.keys()),\n            changedColorMap: true\n        });\n    }\n    getColorMap() {\n        return this._colorMap;\n    }\n    getDefaultBackground() {\n        if (this._colorMap && this._colorMap.length > 2 /* ColorId.DefaultBackground */) {\n            return this._colorMap[2 /* ColorId.DefaultBackground */];\n        }\n        return null;\n    }\n}\nclass TokenizationSupportFactoryData extends Disposable {\n    get isResolved() {\n        return this._isResolved;\n    }\n    constructor(_registry, _languageId, _factory) {\n        super();\n        this._registry = _registry;\n        this._languageId = _languageId;\n        this._factory = _factory;\n        this._isDisposed = false;\n        this._resolvePromise = null;\n        this._isResolved = false;\n    }\n    dispose() {\n        this._isDisposed = true;\n        super.dispose();\n    }\n    async resolve() {\n        if (!this._resolvePromise) {\n            this._resolvePromise = this._create();\n        }\n        return this._resolvePromise;\n    }\n    async _create() {\n        const value = await this._factory.tokenizationSupport;\n        this._isResolved = true;\n        if (value && !this._isDisposed) {\n            this._register(this._registry.register(this._languageId, value));\n        }\n    }\n}\n\nexport { TokenizationRegistry };\n","import { Codicon } from '../../base/common/codicons.js';\nimport { URI } from '../../base/common/uri.js';\nimport { Range } from './core/range.js';\nimport { TokenizationRegistry as TokenizationRegistry$1 } from './tokenizationRegistry.js';\nimport { localize } from '../../nls.js';\n\nclass Token {\n    constructor(offset, type, language) {\n        this.offset = offset;\n        this.type = type;\n        this.language = language;\n        this._tokenBrand = undefined;\n    }\n    toString() {\n        return '(' + this.offset + ', ' + this.type + ')';\n    }\n}\n/**\n * @internal\n */\nclass TokenizationResult {\n    constructor(tokens, endState) {\n        this.tokens = tokens;\n        this.endState = endState;\n        this._tokenizationResultBrand = undefined;\n    }\n}\n/**\n * @internal\n */\nclass EncodedTokenizationResult {\n    constructor(\n    /**\n     * The tokens in binary format. Each token occupies two array indices. For token i:\n     *  - at offset 2*i => startIndex\n     *  - at offset 2*i + 1 => metadata\n     *\n     */\n    tokens, endState) {\n        this.tokens = tokens;\n        this.endState = endState;\n        this._encodedTokenizationResultBrand = undefined;\n    }\n}\nvar HoverVerbosityAction;\n(function (HoverVerbosityAction) {\n    /**\n     * Increase the verbosity of the hover\n     */\n    HoverVerbosityAction[HoverVerbosityAction[\"Increase\"] = 0] = \"Increase\";\n    /**\n     * Decrease the verbosity of the hover\n     */\n    HoverVerbosityAction[HoverVerbosityAction[\"Decrease\"] = 1] = \"Decrease\";\n})(HoverVerbosityAction || (HoverVerbosityAction = {}));\n/**\n * @internal\n */\nvar CompletionItemKinds;\n(function (CompletionItemKinds) {\n    const byKind = new Map();\n    byKind.set(0 /* CompletionItemKind.Method */, Codicon.symbolMethod);\n    byKind.set(1 /* CompletionItemKind.Function */, Codicon.symbolFunction);\n    byKind.set(2 /* CompletionItemKind.Constructor */, Codicon.symbolConstructor);\n    byKind.set(3 /* CompletionItemKind.Field */, Codicon.symbolField);\n    byKind.set(4 /* CompletionItemKind.Variable */, Codicon.symbolVariable);\n    byKind.set(5 /* CompletionItemKind.Class */, Codicon.symbolClass);\n    byKind.set(6 /* CompletionItemKind.Struct */, Codicon.symbolStruct);\n    byKind.set(7 /* CompletionItemKind.Interface */, Codicon.symbolInterface);\n    byKind.set(8 /* CompletionItemKind.Module */, Codicon.symbolModule);\n    byKind.set(9 /* CompletionItemKind.Property */, Codicon.symbolProperty);\n    byKind.set(10 /* CompletionItemKind.Event */, Codicon.symbolEvent);\n    byKind.set(11 /* CompletionItemKind.Operator */, Codicon.symbolOperator);\n    byKind.set(12 /* CompletionItemKind.Unit */, Codicon.symbolUnit);\n    byKind.set(13 /* CompletionItemKind.Value */, Codicon.symbolValue);\n    byKind.set(15 /* CompletionItemKind.Enum */, Codicon.symbolEnum);\n    byKind.set(14 /* CompletionItemKind.Constant */, Codicon.symbolConstant);\n    byKind.set(15 /* CompletionItemKind.Enum */, Codicon.symbolEnum);\n    byKind.set(16 /* CompletionItemKind.EnumMember */, Codicon.symbolEnumMember);\n    byKind.set(17 /* CompletionItemKind.Keyword */, Codicon.symbolKeyword);\n    byKind.set(28 /* CompletionItemKind.Snippet */, Codicon.symbolSnippet);\n    byKind.set(18 /* CompletionItemKind.Text */, Codicon.symbolText);\n    byKind.set(19 /* CompletionItemKind.Color */, Codicon.symbolColor);\n    byKind.set(20 /* CompletionItemKind.File */, Codicon.symbolFile);\n    byKind.set(21 /* CompletionItemKind.Reference */, Codicon.symbolReference);\n    byKind.set(22 /* CompletionItemKind.Customcolor */, Codicon.symbolCustomColor);\n    byKind.set(23 /* CompletionItemKind.Folder */, Codicon.symbolFolder);\n    byKind.set(24 /* CompletionItemKind.TypeParameter */, Codicon.symbolTypeParameter);\n    byKind.set(25 /* CompletionItemKind.User */, Codicon.account);\n    byKind.set(26 /* CompletionItemKind.Issue */, Codicon.issues);\n    byKind.set(27 /* CompletionItemKind.Tool */, Codicon.tools);\n    /**\n     * @internal\n     */\n    function toIcon(kind) {\n        let codicon = byKind.get(kind);\n        if (!codicon) {\n            console.info('No codicon found for CompletionItemKind ' + kind);\n            codicon = Codicon.symbolProperty;\n        }\n        return codicon;\n    }\n    CompletionItemKinds.toIcon = toIcon;\n    /**\n     * @internal\n     */\n    function toLabel(kind) {\n        switch (kind) {\n            case 0 /* CompletionItemKind.Method */: return localize(728, 'Method');\n            case 1 /* CompletionItemKind.Function */: return localize(729, 'Function');\n            case 2 /* CompletionItemKind.Constructor */: return localize(730, 'Constructor');\n            case 3 /* CompletionItemKind.Field */: return localize(731, 'Field');\n            case 4 /* CompletionItemKind.Variable */: return localize(732, 'Variable');\n            case 5 /* CompletionItemKind.Class */: return localize(733, 'Class');\n            case 6 /* CompletionItemKind.Struct */: return localize(734, 'Struct');\n            case 7 /* CompletionItemKind.Interface */: return localize(735, 'Interface');\n            case 8 /* CompletionItemKind.Module */: return localize(736, 'Module');\n            case 9 /* CompletionItemKind.Property */: return localize(737, 'Property');\n            case 10 /* CompletionItemKind.Event */: return localize(738, 'Event');\n            case 11 /* CompletionItemKind.Operator */: return localize(739, 'Operator');\n            case 12 /* CompletionItemKind.Unit */: return localize(740, 'Unit');\n            case 13 /* CompletionItemKind.Value */: return localize(741, 'Value');\n            case 14 /* CompletionItemKind.Constant */: return localize(742, 'Constant');\n            case 15 /* CompletionItemKind.Enum */: return localize(743, 'Enum');\n            case 16 /* CompletionItemKind.EnumMember */: return localize(744, 'Enum Member');\n            case 17 /* CompletionItemKind.Keyword */: return localize(745, 'Keyword');\n            case 18 /* CompletionItemKind.Text */: return localize(746, 'Text');\n            case 19 /* CompletionItemKind.Color */: return localize(747, 'Color');\n            case 20 /* CompletionItemKind.File */: return localize(748, 'File');\n            case 21 /* CompletionItemKind.Reference */: return localize(749, 'Reference');\n            case 22 /* CompletionItemKind.Customcolor */: return localize(750, 'Custom Color');\n            case 23 /* CompletionItemKind.Folder */: return localize(751, 'Folder');\n            case 24 /* CompletionItemKind.TypeParameter */: return localize(752, 'Type Parameter');\n            case 25 /* CompletionItemKind.User */: return localize(753, 'User');\n            case 26 /* CompletionItemKind.Issue */: return localize(754, 'Issue');\n            case 27 /* CompletionItemKind.Tool */: return localize(755, 'Tool');\n            case 28 /* CompletionItemKind.Snippet */: return localize(756, 'Snippet');\n            default: return '';\n        }\n    }\n    CompletionItemKinds.toLabel = toLabel;\n    const data = new Map();\n    data.set('method', 0 /* CompletionItemKind.Method */);\n    data.set('function', 1 /* CompletionItemKind.Function */);\n    data.set('constructor', 2 /* CompletionItemKind.Constructor */);\n    data.set('field', 3 /* CompletionItemKind.Field */);\n    data.set('variable', 4 /* CompletionItemKind.Variable */);\n    data.set('class', 5 /* CompletionItemKind.Class */);\n    data.set('struct', 6 /* CompletionItemKind.Struct */);\n    data.set('interface', 7 /* CompletionItemKind.Interface */);\n    data.set('module', 8 /* CompletionItemKind.Module */);\n    data.set('property', 9 /* CompletionItemKind.Property */);\n    data.set('event', 10 /* CompletionItemKind.Event */);\n    data.set('operator', 11 /* CompletionItemKind.Operator */);\n    data.set('unit', 12 /* CompletionItemKind.Unit */);\n    data.set('value', 13 /* CompletionItemKind.Value */);\n    data.set('constant', 14 /* CompletionItemKind.Constant */);\n    data.set('enum', 15 /* CompletionItemKind.Enum */);\n    data.set('enum-member', 16 /* CompletionItemKind.EnumMember */);\n    data.set('enumMember', 16 /* CompletionItemKind.EnumMember */);\n    data.set('keyword', 17 /* CompletionItemKind.Keyword */);\n    data.set('snippet', 28 /* CompletionItemKind.Snippet */);\n    data.set('text', 18 /* CompletionItemKind.Text */);\n    data.set('color', 19 /* CompletionItemKind.Color */);\n    data.set('file', 20 /* CompletionItemKind.File */);\n    data.set('reference', 21 /* CompletionItemKind.Reference */);\n    data.set('customcolor', 22 /* CompletionItemKind.Customcolor */);\n    data.set('folder', 23 /* CompletionItemKind.Folder */);\n    data.set('type-parameter', 24 /* CompletionItemKind.TypeParameter */);\n    data.set('typeParameter', 24 /* CompletionItemKind.TypeParameter */);\n    data.set('account', 25 /* CompletionItemKind.User */);\n    data.set('issue', 26 /* CompletionItemKind.Issue */);\n    data.set('tool', 27 /* CompletionItemKind.Tool */);\n    /**\n     * @internal\n     */\n    function fromString(value, strict) {\n        let res = data.get(value);\n        if (typeof res === 'undefined' && !strict) {\n            res = 9 /* CompletionItemKind.Property */;\n        }\n        return res;\n    }\n    CompletionItemKinds.fromString = fromString;\n})(CompletionItemKinds || (CompletionItemKinds = {}));\n/**\n * How an {@link InlineCompletionsProvider inline completion provider} was triggered.\n */\nvar InlineCompletionTriggerKind;\n(function (InlineCompletionTriggerKind) {\n    /**\n     * Completion was triggered automatically while editing.\n     * It is sufficient to return a single completion item in this case.\n     */\n    InlineCompletionTriggerKind[InlineCompletionTriggerKind[\"Automatic\"] = 0] = \"Automatic\";\n    /**\n     * Completion was triggered explicitly by a user gesture.\n     * Return multiple completion items to enable cycling through them.\n     */\n    InlineCompletionTriggerKind[InlineCompletionTriggerKind[\"Explicit\"] = 1] = \"Explicit\";\n})(InlineCompletionTriggerKind || (InlineCompletionTriggerKind = {}));\nclass SelectedSuggestionInfo {\n    constructor(range, text, completionKind, isSnippetText) {\n        this.range = range;\n        this.text = text;\n        this.completionKind = completionKind;\n        this.isSnippetText = isSnippetText;\n    }\n    equals(other) {\n        return Range.lift(this.range).equalsRange(other.range)\n            && this.text === other.text\n            && this.completionKind === other.completionKind\n            && this.isSnippetText === other.isSnippetText;\n    }\n}\nvar InlineCompletionHintStyle;\n(function (InlineCompletionHintStyle) {\n    InlineCompletionHintStyle[InlineCompletionHintStyle[\"Code\"] = 1] = \"Code\";\n    InlineCompletionHintStyle[InlineCompletionHintStyle[\"Label\"] = 2] = \"Label\";\n})(InlineCompletionHintStyle || (InlineCompletionHintStyle = {}));\n/** @internal */\nclass ProviderId {\n    static fromExtensionId(extensionId) {\n        return new ProviderId(extensionId, undefined, undefined);\n    }\n    constructor(extensionId, extensionVersion, providerId) {\n        this.extensionId = extensionId;\n        this.extensionVersion = extensionVersion;\n        this.providerId = providerId;\n    }\n    toString() {\n        let result = '';\n        if (this.extensionId) {\n            result += this.extensionId;\n        }\n        if (this.extensionVersion) {\n            result += `@${this.extensionVersion}`;\n        }\n        if (this.providerId) {\n            result += `:${this.providerId}`;\n        }\n        if (result.length === 0) {\n            result = 'unknown';\n        }\n        return result;\n    }\n    toStringWithoutVersion() {\n        let result = '';\n        if (this.extensionId) {\n            result += this.extensionId;\n        }\n        if (this.providerId) {\n            result += `:${this.providerId}`;\n        }\n        return result;\n    }\n}\nvar InlineCompletionEndOfLifeReasonKind;\n(function (InlineCompletionEndOfLifeReasonKind) {\n    InlineCompletionEndOfLifeReasonKind[InlineCompletionEndOfLifeReasonKind[\"Accepted\"] = 0] = \"Accepted\";\n    InlineCompletionEndOfLifeReasonKind[InlineCompletionEndOfLifeReasonKind[\"Rejected\"] = 1] = \"Rejected\";\n    InlineCompletionEndOfLifeReasonKind[InlineCompletionEndOfLifeReasonKind[\"Ignored\"] = 2] = \"Ignored\";\n})(InlineCompletionEndOfLifeReasonKind || (InlineCompletionEndOfLifeReasonKind = {}));\n/**\n * @internal\n */\nvar DocumentPasteTriggerKind;\n(function (DocumentPasteTriggerKind) {\n    DocumentPasteTriggerKind[DocumentPasteTriggerKind[\"Automatic\"] = 0] = \"Automatic\";\n    DocumentPasteTriggerKind[DocumentPasteTriggerKind[\"PasteAs\"] = 1] = \"PasteAs\";\n})(DocumentPasteTriggerKind || (DocumentPasteTriggerKind = {}));\nvar SignatureHelpTriggerKind;\n(function (SignatureHelpTriggerKind) {\n    SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"Invoke\"] = 1] = \"Invoke\";\n    SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"TriggerCharacter\"] = 2] = \"TriggerCharacter\";\n    SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"ContentChange\"] = 3] = \"ContentChange\";\n})(SignatureHelpTriggerKind || (SignatureHelpTriggerKind = {}));\n/**\n * A document highlight kind.\n */\nvar DocumentHighlightKind;\n(function (DocumentHighlightKind) {\n    /**\n     * A textual occurrence.\n     */\n    DocumentHighlightKind[DocumentHighlightKind[\"Text\"] = 0] = \"Text\";\n    /**\n     * Read-access of a symbol, like reading a variable.\n     */\n    DocumentHighlightKind[DocumentHighlightKind[\"Read\"] = 1] = \"Read\";\n    /**\n     * Write-access of a symbol, like writing to a variable.\n     */\n    DocumentHighlightKind[DocumentHighlightKind[\"Write\"] = 2] = \"Write\";\n})(DocumentHighlightKind || (DocumentHighlightKind = {}));\n/**\n * @internal\n */\nfunction isLocationLink(thing) {\n    return !!thing\n        && URI.isUri(thing.uri)\n        && Range.isIRange(thing.range)\n        && (Range.isIRange(thing.originSelectionRange) || Range.isIRange(thing.targetSelectionRange));\n}\n/**\n * @internal\n */\nconst symbolKindNames = {\n    [17 /* SymbolKind.Array */]: localize(757, \"array\"),\n    [16 /* SymbolKind.Boolean */]: localize(758, \"boolean\"),\n    [4 /* SymbolKind.Class */]: localize(759, \"class\"),\n    [13 /* SymbolKind.Constant */]: localize(760, \"constant\"),\n    [8 /* SymbolKind.Constructor */]: localize(761, \"constructor\"),\n    [9 /* SymbolKind.Enum */]: localize(762, \"enumeration\"),\n    [21 /* SymbolKind.EnumMember */]: localize(763, \"enumeration member\"),\n    [23 /* SymbolKind.Event */]: localize(764, \"event\"),\n    [7 /* SymbolKind.Field */]: localize(765, \"field\"),\n    [0 /* SymbolKind.File */]: localize(766, \"file\"),\n    [11 /* SymbolKind.Function */]: localize(767, \"function\"),\n    [10 /* SymbolKind.Interface */]: localize(768, \"interface\"),\n    [19 /* SymbolKind.Key */]: localize(769, \"key\"),\n    [5 /* SymbolKind.Method */]: localize(770, \"method\"),\n    [1 /* SymbolKind.Module */]: localize(771, \"module\"),\n    [2 /* SymbolKind.Namespace */]: localize(772, \"namespace\"),\n    [20 /* SymbolKind.Null */]: localize(773, \"null\"),\n    [15 /* SymbolKind.Number */]: localize(774, \"number\"),\n    [18 /* SymbolKind.Object */]: localize(775, \"object\"),\n    [24 /* SymbolKind.Operator */]: localize(776, \"operator\"),\n    [3 /* SymbolKind.Package */]: localize(777, \"package\"),\n    [6 /* SymbolKind.Property */]: localize(778, \"property\"),\n    [14 /* SymbolKind.String */]: localize(779, \"string\"),\n    [22 /* SymbolKind.Struct */]: localize(780, \"struct\"),\n    [25 /* SymbolKind.TypeParameter */]: localize(781, \"type parameter\"),\n    [12 /* SymbolKind.Variable */]: localize(782, \"variable\"),\n};\n/**\n * @internal\n */\nfunction getAriaLabelForSymbol(symbolName, kind) {\n    return localize(783, '{0} ({1})', symbolName, symbolKindNames[kind]);\n}\n/**\n * @internal\n */\nvar SymbolKinds;\n(function (SymbolKinds) {\n    const byKind = new Map();\n    byKind.set(0 /* SymbolKind.File */, Codicon.symbolFile);\n    byKind.set(1 /* SymbolKind.Module */, Codicon.symbolModule);\n    byKind.set(2 /* SymbolKind.Namespace */, Codicon.symbolNamespace);\n    byKind.set(3 /* SymbolKind.Package */, Codicon.symbolPackage);\n    byKind.set(4 /* SymbolKind.Class */, Codicon.symbolClass);\n    byKind.set(5 /* SymbolKind.Method */, Codicon.symbolMethod);\n    byKind.set(6 /* SymbolKind.Property */, Codicon.symbolProperty);\n    byKind.set(7 /* SymbolKind.Field */, Codicon.symbolField);\n    byKind.set(8 /* SymbolKind.Constructor */, Codicon.symbolConstructor);\n    byKind.set(9 /* SymbolKind.Enum */, Codicon.symbolEnum);\n    byKind.set(10 /* SymbolKind.Interface */, Codicon.symbolInterface);\n    byKind.set(11 /* SymbolKind.Function */, Codicon.symbolFunction);\n    byKind.set(12 /* SymbolKind.Variable */, Codicon.symbolVariable);\n    byKind.set(13 /* SymbolKind.Constant */, Codicon.symbolConstant);\n    byKind.set(14 /* SymbolKind.String */, Codicon.symbolString);\n    byKind.set(15 /* SymbolKind.Number */, Codicon.symbolNumber);\n    byKind.set(16 /* SymbolKind.Boolean */, Codicon.symbolBoolean);\n    byKind.set(17 /* SymbolKind.Array */, Codicon.symbolArray);\n    byKind.set(18 /* SymbolKind.Object */, Codicon.symbolObject);\n    byKind.set(19 /* SymbolKind.Key */, Codicon.symbolKey);\n    byKind.set(20 /* SymbolKind.Null */, Codicon.symbolNull);\n    byKind.set(21 /* SymbolKind.EnumMember */, Codicon.symbolEnumMember);\n    byKind.set(22 /* SymbolKind.Struct */, Codicon.symbolStruct);\n    byKind.set(23 /* SymbolKind.Event */, Codicon.symbolEvent);\n    byKind.set(24 /* SymbolKind.Operator */, Codicon.symbolOperator);\n    byKind.set(25 /* SymbolKind.TypeParameter */, Codicon.symbolTypeParameter);\n    /**\n     * @internal\n     */\n    function toIcon(kind) {\n        let icon = byKind.get(kind);\n        if (!icon) {\n            console.info('No codicon found for SymbolKind ' + kind);\n            icon = Codicon.symbolProperty;\n        }\n        return icon;\n    }\n    SymbolKinds.toIcon = toIcon;\n    const byCompletionKind = new Map();\n    byCompletionKind.set(0 /* SymbolKind.File */, 20 /* CompletionItemKind.File */);\n    byCompletionKind.set(1 /* SymbolKind.Module */, 8 /* CompletionItemKind.Module */);\n    byCompletionKind.set(2 /* SymbolKind.Namespace */, 8 /* CompletionItemKind.Module */);\n    byCompletionKind.set(3 /* SymbolKind.Package */, 8 /* CompletionItemKind.Module */);\n    byCompletionKind.set(4 /* SymbolKind.Class */, 5 /* CompletionItemKind.Class */);\n    byCompletionKind.set(5 /* SymbolKind.Method */, 0 /* CompletionItemKind.Method */);\n    byCompletionKind.set(6 /* SymbolKind.Property */, 9 /* CompletionItemKind.Property */);\n    byCompletionKind.set(7 /* SymbolKind.Field */, 3 /* CompletionItemKind.Field */);\n    byCompletionKind.set(8 /* SymbolKind.Constructor */, 2 /* CompletionItemKind.Constructor */);\n    byCompletionKind.set(9 /* SymbolKind.Enum */, 15 /* CompletionItemKind.Enum */);\n    byCompletionKind.set(10 /* SymbolKind.Interface */, 7 /* CompletionItemKind.Interface */);\n    byCompletionKind.set(11 /* SymbolKind.Function */, 1 /* CompletionItemKind.Function */);\n    byCompletionKind.set(12 /* SymbolKind.Variable */, 4 /* CompletionItemKind.Variable */);\n    byCompletionKind.set(13 /* SymbolKind.Constant */, 14 /* CompletionItemKind.Constant */);\n    byCompletionKind.set(14 /* SymbolKind.String */, 18 /* CompletionItemKind.Text */);\n    byCompletionKind.set(15 /* SymbolKind.Number */, 13 /* CompletionItemKind.Value */);\n    byCompletionKind.set(16 /* SymbolKind.Boolean */, 13 /* CompletionItemKind.Value */);\n    byCompletionKind.set(17 /* SymbolKind.Array */, 13 /* CompletionItemKind.Value */);\n    byCompletionKind.set(18 /* SymbolKind.Object */, 13 /* CompletionItemKind.Value */);\n    byCompletionKind.set(19 /* SymbolKind.Key */, 17 /* CompletionItemKind.Keyword */);\n    byCompletionKind.set(20 /* SymbolKind.Null */, 13 /* CompletionItemKind.Value */);\n    byCompletionKind.set(21 /* SymbolKind.EnumMember */, 16 /* CompletionItemKind.EnumMember */);\n    byCompletionKind.set(22 /* SymbolKind.Struct */, 6 /* CompletionItemKind.Struct */);\n    byCompletionKind.set(23 /* SymbolKind.Event */, 10 /* CompletionItemKind.Event */);\n    byCompletionKind.set(24 /* SymbolKind.Operator */, 11 /* CompletionItemKind.Operator */);\n    byCompletionKind.set(25 /* SymbolKind.TypeParameter */, 24 /* CompletionItemKind.TypeParameter */);\n    /**\n     * @internal\n     */\n    function toCompletionKind(kind) {\n        let completionKind = byCompletionKind.get(kind);\n        if (completionKind === undefined) {\n            console.info('No completion kind found for SymbolKind ' + kind);\n            completionKind = 20 /* CompletionItemKind.File */;\n        }\n        return completionKind;\n    }\n    SymbolKinds.toCompletionKind = toCompletionKind;\n})(SymbolKinds || (SymbolKinds = {}));\nclass FoldingRangeKind {\n    /**\n     * Kind for folding range representing a comment. The value of the kind is 'comment'.\n     */\n    static { this.Comment = new FoldingRangeKind('comment'); }\n    /**\n     * Kind for folding range representing a import. The value of the kind is 'imports'.\n     */\n    static { this.Imports = new FoldingRangeKind('imports'); }\n    /**\n     * Kind for folding range representing regions (for example marked by `#region`, `#endregion`).\n     * The value of the kind is 'region'.\n     */\n    static { this.Region = new FoldingRangeKind('region'); }\n    /**\n     * Returns a {@link FoldingRangeKind} for the given value.\n     *\n     * @param value of the kind.\n     */\n    static fromValue(value) {\n        switch (value) {\n            case 'comment': return FoldingRangeKind.Comment;\n            case 'imports': return FoldingRangeKind.Imports;\n            case 'region': return FoldingRangeKind.Region;\n        }\n        return new FoldingRangeKind(value);\n    }\n    /**\n     * Creates a new {@link FoldingRangeKind}.\n     *\n     * @param value of the kind.\n     */\n    constructor(value) {\n        this.value = value;\n    }\n}\nvar NewSymbolNameTag;\n(function (NewSymbolNameTag) {\n    NewSymbolNameTag[NewSymbolNameTag[\"AIGenerated\"] = 1] = \"AIGenerated\";\n})(NewSymbolNameTag || (NewSymbolNameTag = {}));\nvar NewSymbolNameTriggerKind;\n(function (NewSymbolNameTriggerKind) {\n    NewSymbolNameTriggerKind[NewSymbolNameTriggerKind[\"Invoke\"] = 0] = \"Invoke\";\n    NewSymbolNameTriggerKind[NewSymbolNameTriggerKind[\"Automatic\"] = 1] = \"Automatic\";\n})(NewSymbolNameTriggerKind || (NewSymbolNameTriggerKind = {}));\n/**\n * @internal\n */\nvar Command;\n(function (Command) {\n    /**\n     * @internal\n     */\n    function is(obj) {\n        if (!obj || typeof obj !== 'object') {\n            return false;\n        }\n        return typeof obj.id === 'string' &&\n            typeof obj.title === 'string';\n    }\n    Command.is = is;\n})(Command || (Command = {}));\nvar InlayHintKind;\n(function (InlayHintKind) {\n    InlayHintKind[InlayHintKind[\"Type\"] = 1] = \"Type\";\n    InlayHintKind[InlayHintKind[\"Parameter\"] = 2] = \"Parameter\";\n})(InlayHintKind || (InlayHintKind = {}));\n/**\n * @internal\n */\nclass LazyTokenizationSupport {\n    constructor(createSupport) {\n        this.createSupport = createSupport;\n        this._tokenizationSupport = null;\n    }\n    dispose() {\n        if (this._tokenizationSupport) {\n            this._tokenizationSupport.then((support) => {\n                if (support) {\n                    support.dispose();\n                }\n            });\n        }\n    }\n    get tokenizationSupport() {\n        if (!this._tokenizationSupport) {\n            this._tokenizationSupport = this.createSupport();\n        }\n        return this._tokenizationSupport;\n    }\n}\n/**\n * @internal\n */\nconst TokenizationRegistry = new TokenizationRegistry$1();\n\nexport { Command, CompletionItemKinds, DocumentHighlightKind, DocumentPasteTriggerKind, EncodedTokenizationResult, FoldingRangeKind, HoverVerbosityAction, InlayHintKind, InlineCompletionEndOfLifeReasonKind, InlineCompletionHintStyle, InlineCompletionTriggerKind, LazyTokenizationSupport, NewSymbolNameTag, NewSymbolNameTriggerKind, ProviderId, SelectedSuggestionInfo, SignatureHelpTriggerKind, SymbolKinds, Token, TokenizationRegistry, TokenizationResult, getAriaLabelForSymbol, isLocationLink, symbolKindNames };\n","import { Emitter } from '../../../base/common/event.js';\nimport { Disposable, markAsSingleton } from '../../../base/common/lifecycle.js';\nimport { RGBA8 } from '../core/misc/rgba.js';\nimport { TokenizationRegistry } from '../languages.js';\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 *--------------------------------------------------------------------------------------------*/\nclass MinimapTokensColorTracker extends Disposable {\n    static { this._INSTANCE = null; }\n    static getInstance() {\n        if (!this._INSTANCE) {\n            this._INSTANCE = markAsSingleton(new MinimapTokensColorTracker());\n        }\n        return this._INSTANCE;\n    }\n    constructor() {\n        super();\n        this._onDidChange = new Emitter();\n        this.onDidChange = this._onDidChange.event;\n        this._updateColorMap();\n        this._register(TokenizationRegistry.onDidChange(e => {\n            if (e.changedColorMap) {\n                this._updateColorMap();\n            }\n        }));\n    }\n    _updateColorMap() {\n        const colorMap = TokenizationRegistry.getColorMap();\n        if (!colorMap) {\n            this._colors = [RGBA8.Empty];\n            this._backgroundIsLight = true;\n            return;\n        }\n        this._colors = [RGBA8.Empty];\n        for (let colorId = 1; colorId < colorMap.length; colorId++) {\n            const source = colorMap[colorId].rgba;\n            // Use a VM friendly data-type\n            this._colors[colorId] = new RGBA8(source.r, source.g, source.b, Math.round(source.a * 255));\n        }\n        const backgroundLuminosity = colorMap[2 /* ColorId.DefaultBackground */].getRelativeLuminance();\n        this._backgroundIsLight = backgroundLuminosity >= 0.5;\n        this._onDidChange.fire(undefined);\n    }\n    getColor(colorId) {\n        if (colorId < 1 || colorId >= this._colors.length) {\n            // background color (basically invisible)\n            colorId = 2 /* ColorId.DefaultBackground */;\n        }\n        return this._colors[colorId];\n    }\n    backgroundIsLight() {\n        return this._backgroundIsLight;\n    }\n}\n\nexport { MinimapTokensColorTracker };\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 *--------------------------------------------------------------------------------------------*/\nconst allCharCodes = (() => {\n    const v = [];\n    for (let i = 32 /* Constants.START_CH_CODE */; i <= 126 /* Constants.END_CH_CODE */; i++) {\n        v.push(i);\n    }\n    v.push(65533 /* Constants.UNKNOWN_CODE */);\n    return v;\n})();\nconst getCharIndex = (chCode, fontScale) => {\n    chCode -= 32 /* Constants.START_CH_CODE */;\n    if (chCode < 0 || chCode > 96 /* Constants.CHAR_COUNT */) {\n        if (fontScale <= 2) {\n            // for smaller scales, we can get away with using any ASCII character...\n            return (chCode + 96 /* Constants.CHAR_COUNT */) % 96 /* Constants.CHAR_COUNT */;\n        }\n        return 96 /* Constants.CHAR_COUNT */ - 1; // unknown symbol\n    }\n    return chCode;\n};\n\nexport { allCharCodes, getCharIndex };\n","import { getCharIndex } from './minimapCharSheet.js';\nimport { toUint8 } from '../../../../base/common/uint.js';\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 *--------------------------------------------------------------------------------------------*/\nclass MinimapCharRenderer {\n    constructor(charData, scale) {\n        this.scale = scale;\n        this._minimapCharRendererBrand = undefined;\n        this.charDataNormal = MinimapCharRenderer.soften(charData, 12 / 15);\n        this.charDataLight = MinimapCharRenderer.soften(charData, 50 / 60);\n    }\n    static soften(input, ratio) {\n        const result = new Uint8ClampedArray(input.length);\n        for (let i = 0, len = input.length; i < len; i++) {\n            result[i] = toUint8(input[i] * ratio);\n        }\n        return result;\n    }\n    renderChar(target, dx, dy, chCode, color, foregroundAlpha, backgroundColor, backgroundAlpha, fontScale, useLighterFont, force1pxHeight) {\n        const charWidth = 1 /* Constants.BASE_CHAR_WIDTH */ * this.scale;\n        const charHeight = 2 /* Constants.BASE_CHAR_HEIGHT */ * this.scale;\n        const renderHeight = (force1pxHeight ? 1 : charHeight);\n        if (dx + charWidth > target.width || dy + renderHeight > target.height) {\n            console.warn('bad render request outside image data');\n            return;\n        }\n        const charData = useLighterFont ? this.charDataLight : this.charDataNormal;\n        const charIndex = getCharIndex(chCode, fontScale);\n        const destWidth = target.width * 4 /* Constants.RGBA_CHANNELS_CNT */;\n        const backgroundR = backgroundColor.r;\n        const backgroundG = backgroundColor.g;\n        const backgroundB = backgroundColor.b;\n        const deltaR = color.r - backgroundR;\n        const deltaG = color.g - backgroundG;\n        const deltaB = color.b - backgroundB;\n        const destAlpha = Math.max(foregroundAlpha, backgroundAlpha);\n        const dest = target.data;\n        let sourceOffset = charIndex * charWidth * charHeight;\n        let row = dy * destWidth + dx * 4 /* Constants.RGBA_CHANNELS_CNT */;\n        for (let y = 0; y < renderHeight; y++) {\n            let column = row;\n            for (let x = 0; x < charWidth; x++) {\n                const c = (charData[sourceOffset++] / 255) * (foregroundAlpha / 255);\n                dest[column++] = backgroundR + deltaR * c;\n                dest[column++] = backgroundG + deltaG * c;\n                dest[column++] = backgroundB + deltaB * c;\n                dest[column++] = destAlpha;\n            }\n            row += destWidth;\n        }\n    }\n    blockRenderChar(target, dx, dy, color, foregroundAlpha, backgroundColor, backgroundAlpha, force1pxHeight) {\n        const charWidth = 1 /* Constants.BASE_CHAR_WIDTH */ * this.scale;\n        const charHeight = 2 /* Constants.BASE_CHAR_HEIGHT */ * this.scale;\n        const renderHeight = (force1pxHeight ? 1 : charHeight);\n        if (dx + charWidth > target.width || dy + renderHeight > target.height) {\n            console.warn('bad render request outside image data');\n            return;\n        }\n        const destWidth = target.width * 4 /* Constants.RGBA_CHANNELS_CNT */;\n        const c = 0.5 * (foregroundAlpha / 255);\n        const backgroundR = backgroundColor.r;\n        const backgroundG = backgroundColor.g;\n        const backgroundB = backgroundColor.b;\n        const deltaR = color.r - backgroundR;\n        const deltaG = color.g - backgroundG;\n        const deltaB = color.b - backgroundB;\n        const colorR = backgroundR + deltaR * c;\n        const colorG = backgroundG + deltaG * c;\n        const colorB = backgroundB + deltaB * c;\n        const destAlpha = Math.max(foregroundAlpha, backgroundAlpha);\n        const dest = target.data;\n        let row = dy * destWidth + dx * 4 /* Constants.RGBA_CHANNELS_CNT */;\n        for (let y = 0; y < renderHeight; y++) {\n            let column = row;\n            for (let x = 0; x < charWidth; x++) {\n                dest[column++] = colorR;\n                dest[column++] = colorG;\n                dest[column++] = colorB;\n                dest[column++] = destAlpha;\n            }\n            row += destWidth;\n        }\n    }\n}\n\nexport { MinimapCharRenderer };\n","import { createSingleCallFunction } from '../../../../base/common/functional.js';\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 *--------------------------------------------------------------------------------------------*/\nconst charTable = {\n    '0': 0,\n    '1': 1,\n    '2': 2,\n    '3': 3,\n    '4': 4,\n    '5': 5,\n    '6': 6,\n    '7': 7,\n    '8': 8,\n    '9': 9,\n    A: 10,\n    B: 11,\n    C: 12,\n    D: 13,\n    E: 14,\n    F: 15\n};\nconst decodeData = (str) => {\n    const output = new Uint8ClampedArray(str.length / 2);\n    for (let i = 0; i < str.length; i += 2) {\n        output[i >> 1] = (charTable[str[i]] << 4) | (charTable[str[i + 1]] & 0xF);\n    }\n    return output;\n};\n/*\nconst encodeData = (data: Uint8ClampedArray, length: string) => {\n    const chars = '0123456789ABCDEF';\n    let output = '';\n    for (let i = 0; i < data.length; i++) {\n        output += chars[data[i] >> 4] + chars[data[i] & 0xf];\n    }\n    return output;\n};\n*/\n/**\n * Map of minimap scales to prebaked sample data at those scales. We don't\n * sample much larger data, because then font family becomes visible, which\n * is use-configurable.\n */\nconst prebakedMiniMaps = {\n    1: createSingleCallFunction(() => decodeData('0000511D6300CF609C709645A78432005642574171487021003C451900274D35D762755E8B629C5BA856AF57BA649530C167D1512A272A3F6038604460398526BCA2A968DB6F8957C768BE5FBE2FB467CF5D8D5B795DC7625B5DFF50DE64C466DB2FC47CD860A65E9A2EB96CB54CE06DA763AB2EA26860524D3763536601005116008177A8705E53AB738E6A982F88BAA35B5F5B626D9C636B449B737E5B7B678598869A662F6B5B8542706C704C80736A607578685B70594A49715A4522E792')),\n    2: createSingleCallFunction(() => decodeData('000000000000000055394F383D2800008B8B1F210002000081B1CBCBCC820000847AAF6B9AAF2119BE08B8881AD60000A44FD07DCCF107015338130C00000000385972265F390B406E2437634B4B48031B12B8A0847000001E15B29A402F0000000000004B33460B00007A752C2A0000000000004D3900000084394B82013400ABA5CFC7AD9C0302A45A3E5A98AB000089A43382D97900008BA54AA087A70A0248A6A7AE6DBE0000BF6F94987EA40A01A06DCFA7A7A9030496C32F77891D0000A99FB1A0AFA80603B29AB9CA75930D010C0948354D3900000C0948354F37460D0028BE673D8400000000AF9D7B6E00002B007AA8933400007AA642675C2700007984CFB9C3985B768772A8A6B7B20000CAAECAAFC4B700009F94A6009F840009D09F9BA4CA9C0000CC8FC76DC87F0000C991C472A2000000A894A48CA7B501079BA2C9C69BA20000B19A5D3FA89000005CA6009DA2960901B0A7F0669FB200009D009E00B7890000DAD0F5D092820000D294D4C48BD10000B5A7A4A3B1A50402CAB6CBA6A2000000B5A7A4A3B1A8044FCDADD19D9CB00000B7778F7B8AAE0803C9AB5D3F5D3F00009EA09EA0BAB006039EA0989A8C7900009B9EF4D6B7C00000A9A7816CACA80000ABAC84705D3F000096DA635CDC8C00006F486F266F263D4784006124097B00374F6D2D6D2D6D4A3A95872322000000030000000000008D8939130000000000002E22A5C9CBC70600AB25C0B5C9B400061A2DB04CA67001082AA6BEBEBFC606002321DACBC19E03087AA08B6768380000282FBAC0B8CA7A88AD25BBA5A29900004C396C5894A6000040485A6E356E9442A32CD17EADA70000B4237923628600003E2DE9C1D7B500002F25BBA5A2990000231DB6AFB4A804023025C0B5CAB588062B2CBDBEC0C706882435A75CA20000002326BD6A82A908048B4B9A5A668000002423A09CB4BB060025259C9D8A7900001C1FCAB2C7C700002A2A9387ABA200002626A4A47D6E9D14333163A0C87500004B6F9C2D643A257049364936493647358A34438355497F1A0000A24C1D590000D38DFFBDD4CD3126'))\n};\n\nexport { prebakedMiniMaps };\n","import { MinimapCharRenderer } from './minimapCharRenderer.js';\nimport { allCharCodes } from './minimapCharSheet.js';\nimport { prebakedMiniMaps } from './minimapPreBaked.js';\nimport { toUint8 } from '../../../../base/common/uint.js';\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/**\n * Creates character renderers. It takes a 'scale' that determines how large\n * characters should be drawn. Using this, it draws data into a canvas and\n * then downsamples the characters as necessary for the current display.\n * This makes rendering more efficient, rather than drawing a full (tiny)\n * font, or downsampling in real-time.\n */\nclass MinimapCharRendererFactory {\n    /**\n     * Creates a new character renderer factory with the given scale.\n     */\n    static create(scale, fontFamily) {\n        // renderers are immutable. By default we'll 'create' a new minimap\n        // character renderer whenever we switch editors, no need to do extra work.\n        if (this.lastCreated && scale === this.lastCreated.scale && fontFamily === this.lastFontFamily) {\n            return this.lastCreated;\n        }\n        let factory;\n        if (prebakedMiniMaps[scale]) {\n            factory = new MinimapCharRenderer(prebakedMiniMaps[scale](), scale);\n        }\n        else {\n            factory = MinimapCharRendererFactory.createFromSampleData(MinimapCharRendererFactory.createSampleData(fontFamily).data, scale);\n        }\n        this.lastFontFamily = fontFamily;\n        this.lastCreated = factory;\n        return factory;\n    }\n    /**\n     * Creates the font sample data, writing to a canvas.\n     */\n    static createSampleData(fontFamily) {\n        const canvas = document.createElement('canvas');\n        const ctx = canvas.getContext('2d');\n        canvas.style.height = `${16 /* Constants.SAMPLED_CHAR_HEIGHT */}px`;\n        canvas.height = 16 /* Constants.SAMPLED_CHAR_HEIGHT */;\n        canvas.width = 96 /* Constants.CHAR_COUNT */ * 10 /* Constants.SAMPLED_CHAR_WIDTH */;\n        canvas.style.width = 96 /* Constants.CHAR_COUNT */ * 10 /* Constants.SAMPLED_CHAR_WIDTH */ + 'px';\n        ctx.fillStyle = '#ffffff';\n        ctx.font = `bold ${16 /* Constants.SAMPLED_CHAR_HEIGHT */}px ${fontFamily}`;\n        ctx.textBaseline = 'middle';\n        let x = 0;\n        for (const code of allCharCodes) {\n            ctx.fillText(String.fromCharCode(code), x, 16 /* Constants.SAMPLED_CHAR_HEIGHT */ / 2);\n            x += 10 /* Constants.SAMPLED_CHAR_WIDTH */;\n        }\n        return ctx.getImageData(0, 0, 96 /* Constants.CHAR_COUNT */ * 10 /* Constants.SAMPLED_CHAR_WIDTH */, 16 /* Constants.SAMPLED_CHAR_HEIGHT */);\n    }\n    /**\n     * Creates a character renderer from the canvas sample data.\n     */\n    static createFromSampleData(source, scale) {\n        const expectedLength = 16 /* Constants.SAMPLED_CHAR_HEIGHT */ * 10 /* Constants.SAMPLED_CHAR_WIDTH */ * 4 /* Constants.RGBA_CHANNELS_CNT */ * 96 /* Constants.CHAR_COUNT */;\n        if (source.length !== expectedLength) {\n            throw new Error('Unexpected source in MinimapCharRenderer');\n        }\n        const charData = MinimapCharRendererFactory._downsample(source, scale);\n        return new MinimapCharRenderer(charData, scale);\n    }\n    static _downsampleChar(source, sourceOffset, dest, destOffset, scale) {\n        const width = 1 /* Constants.BASE_CHAR_WIDTH */ * scale;\n        const height = 2 /* Constants.BASE_CHAR_HEIGHT */ * scale;\n        let targetIndex = destOffset;\n        let brightest = 0;\n        // This is essentially an ad-hoc rescaling algorithm. Standard approaches\n        // like bicubic interpolation are awesome for scaling between image sizes,\n        // but don't work so well when scaling to very small pixel values, we end\n        // up with blurry, indistinct forms.\n        //\n        // The approach taken here is simply mapping each source pixel to the target\n        // pixels, and taking the weighted values for all pixels in each, and then\n        // averaging them out. Finally we apply an intensity boost in _downsample,\n        // since when scaling to the smallest pixel sizes there's more black space\n        // which causes characters to be much less distinct.\n        for (let y = 0; y < height; y++) {\n            // 1. For this destination pixel, get the source pixels we're sampling\n            // from (x1, y1) to the next pixel (x2, y2)\n            const sourceY1 = (y / height) * 16 /* Constants.SAMPLED_CHAR_HEIGHT */;\n            const sourceY2 = ((y + 1) / height) * 16 /* Constants.SAMPLED_CHAR_HEIGHT */;\n            for (let x = 0; x < width; x++) {\n                const sourceX1 = (x / width) * 10 /* Constants.SAMPLED_CHAR_WIDTH */;\n                const sourceX2 = ((x + 1) / width) * 10 /* Constants.SAMPLED_CHAR_WIDTH */;\n                // 2. Sample all of them, summing them up and weighting them. Similar\n                // to bilinear interpolation.\n                let value = 0;\n                let samples = 0;\n                for (let sy = sourceY1; sy < sourceY2; sy++) {\n                    const sourceRow = sourceOffset + Math.floor(sy) * 3840 /* Constants.RGBA_SAMPLED_ROW_WIDTH */;\n                    const yBalance = 1 - (sy - Math.floor(sy));\n                    for (let sx = sourceX1; sx < sourceX2; sx++) {\n                        const xBalance = 1 - (sx - Math.floor(sx));\n                        const sourceIndex = sourceRow + Math.floor(sx) * 4 /* Constants.RGBA_CHANNELS_CNT */;\n                        const weight = xBalance * yBalance;\n                        samples += weight;\n                        value += ((source[sourceIndex] * source[sourceIndex + 3]) / 255) * weight;\n                    }\n                }\n                const final = value / samples;\n                brightest = Math.max(brightest, final);\n                dest[targetIndex++] = toUint8(final);\n            }\n        }\n        return brightest;\n    }\n    static _downsample(data, scale) {\n        const pixelsPerCharacter = 2 /* Constants.BASE_CHAR_HEIGHT */ * scale * 1 /* Constants.BASE_CHAR_WIDTH */ * scale;\n        const resultLen = pixelsPerCharacter * 96 /* Constants.CHAR_COUNT */;\n        const result = new Uint8ClampedArray(resultLen);\n        let resultOffset = 0;\n        let sourceOffset = 0;\n        let brightest = 0;\n        for (let charIndex = 0; charIndex < 96 /* Constants.CHAR_COUNT */; charIndex++) {\n            brightest = Math.max(brightest, this._downsampleChar(data, sourceOffset, result, resultOffset, scale));\n            resultOffset += pixelsPerCharacter;\n            sourceOffset += 10 /* Constants.SAMPLED_CHAR_WIDTH */ * 4 /* Constants.RGBA_CHANNELS_CNT */;\n        }\n        if (brightest > 0) {\n            const adjust = 255 / brightest;\n            for (let i = 0; i < resultLen; i++) {\n                result[i] *= adjust;\n            }\n        }\n        return result;\n    }\n}\n\nexport { MinimapCharRendererFactory };\n","import { isWindows, isMacintosh } from '../common/platform.js';\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/**\n * The best font-family to be used in CSS based on the platform:\n * - Windows: Segoe preferred, fallback to sans-serif\n * - macOS: standard system font, fallback to sans-serif\n * - Linux: standard system font preferred, fallback to Ubuntu fonts\n *\n * Note: this currently does not adjust for different locales.\n */\nconst DEFAULT_FONT_FAMILY = isWindows ? '\"Segoe WPC\", \"Segoe UI\", sans-serif' : isMacintosh ? '-apple-system, BlinkMacSystemFont, sans-serif' : 'system-ui, \"Ubuntu\", \"Droid Sans\", sans-serif';\n\nexport { DEFAULT_FONT_FAMILY };\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 *--------------------------------------------------------------------------------------------*/\nclass ViewModelDecoration {\n    constructor(range, options) {\n        this._viewModelDecorationBrand = undefined;\n        this.range = range;\n        this.options = options;\n    }\n}\nfunction isModelDecorationVisible(model, decoration) {\n    if (decoration.options.hideInCommentTokens && isModelDecorationInComment(model, decoration)) {\n        return false;\n    }\n    if (decoration.options.hideInStringTokens && isModelDecorationInString(model, decoration)) {\n        return false;\n    }\n    return true;\n}\nfunction isModelDecorationInComment(model, decoration) {\n    return testTokensInRange(model, decoration.range, (tokenType) => tokenType === 1 /* StandardTokenType.Comment */);\n}\nfunction isModelDecorationInString(model, decoration) {\n    return testTokensInRange(model, decoration.range, (tokenType) => tokenType === 2 /* StandardTokenType.String */);\n}\n/**\n * Calls the callback for every token that intersects the range.\n * If the callback returns `false`, iteration stops and `false` is returned.\n * Otherwise, `true` is returned.\n */\nfunction testTokensInRange(model, range, callback) {\n    for (let lineNumber = range.startLineNumber; lineNumber <= range.endLineNumber; lineNumber++) {\n        const lineTokens = model.tokenization.getLineTokens(lineNumber);\n        const isFirstLine = lineNumber === range.startLineNumber;\n        const isEndLine = lineNumber === range.endLineNumber;\n        let tokenIdx = isFirstLine ? lineTokens.findTokenIndexAtOffset(range.startColumn - 1) : 0;\n        while (tokenIdx < lineTokens.getCount()) {\n            if (isEndLine) {\n                const startOffset = lineTokens.getStartOffset(tokenIdx);\n                if (startOffset > range.endColumn - 1) {\n                    break;\n                }\n            }\n            const callbackResult = callback(lineTokens.getStandardTokenType(tokenIdx));\n            if (!callbackResult) {\n                return false;\n            }\n            tokenIdx++;\n        }\n    }\n    return true;\n}\n\nexport { ViewModelDecoration, isModelDecorationInComment, isModelDecorationInString, isModelDecorationVisible };\n","import './minimap.css';\nimport { addStandardDisposableListener, addDisposableListener, getDomNodePagePosition, EventType as EventType$1 } from '../../../../base/browser/dom.js';\nimport { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport { GlobalPointerMoveMonitor } from '../../../../base/browser/globalPointerMoveMonitor.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { isWindows } from '../../../../base/common/platform.js';\nimport { isFullWidthCharacter } from '../../../../base/common/strings.js';\nimport { RenderedLinesCollection } from '../../view/viewLayer.js';\nimport { ViewPart, PartFingerprints } from '../../view/viewPart.js';\nimport { EditorLayoutInfoComputer, MINIMAP_GUTTER_WIDTH } from '../../../common/config/editorOptions.js';\nimport { Range } from '../../../common/core/range.js';\nimport { RGBA8 } from '../../../common/core/misc/rgba.js';\nimport { MinimapTokensColorTracker } from '../../../common/viewModel/minimapTokensColorTracker.js';\nimport '../../../../platform/theme/common/colorUtils.js';\nimport '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorForeground } from '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport { minimapBackground, minimapForegroundOpacity, minimapSelection } from '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { Gesture, EventType } from '../../../../base/browser/touch.js';\nimport { MinimapCharRendererFactory } from './minimapCharRendererFactory.js';\nimport { createSingleCallFunction } from '../../../../base/common/functional.js';\nimport { LRUCache } from '../../../../base/common/map.js';\nimport { DEFAULT_FONT_FAMILY } from '../../../../base/browser/fonts.js';\nimport { ViewModelDecoration } from '../../../common/viewModel/viewModelDecoration.js';\nimport { RunOnceScheduler } from '../../../../base/common/async.js';\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/**\n * The orthogonal distance to the slider at which dragging \"resets\". This implements \"snapping\"\n */\nconst POINTER_DRAG_RESET_DISTANCE = 140;\nconst GUTTER_DECORATION_WIDTH = 2;\nclass MinimapOptions {\n    constructor(configuration, theme, tokensColorTracker) {\n        const options = configuration.options;\n        const pixelRatio = options.get(163 /* EditorOption.pixelRatio */);\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        const minimapLayout = layoutInfo.minimap;\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        const minimapOpts = options.get(81 /* EditorOption.minimap */);\n        this.renderMinimap = minimapLayout.renderMinimap;\n        this.size = minimapOpts.size;\n        this.minimapHeightIsEditorHeight = minimapLayout.minimapHeightIsEditorHeight;\n        this.scrollBeyondLastLine = options.get(119 /* EditorOption.scrollBeyondLastLine */);\n        this.paddingTop = options.get(96 /* EditorOption.padding */).top;\n        this.paddingBottom = options.get(96 /* EditorOption.padding */).bottom;\n        this.showSlider = minimapOpts.showSlider;\n        this.autohide = minimapOpts.autohide;\n        this.pixelRatio = pixelRatio;\n        this.typicalHalfwidthCharacterWidth = fontInfo.typicalHalfwidthCharacterWidth;\n        this.lineHeight = options.get(75 /* EditorOption.lineHeight */);\n        this.minimapLeft = minimapLayout.minimapLeft;\n        this.minimapWidth = minimapLayout.minimapWidth;\n        this.minimapHeight = layoutInfo.height;\n        this.canvasInnerWidth = minimapLayout.minimapCanvasInnerWidth;\n        this.canvasInnerHeight = minimapLayout.minimapCanvasInnerHeight;\n        this.canvasOuterWidth = minimapLayout.minimapCanvasOuterWidth;\n        this.canvasOuterHeight = minimapLayout.minimapCanvasOuterHeight;\n        this.isSampling = minimapLayout.minimapIsSampling;\n        this.editorHeight = layoutInfo.height;\n        this.fontScale = minimapLayout.minimapScale;\n        this.minimapLineHeight = minimapLayout.minimapLineHeight;\n        this.minimapCharWidth = 1 /* Constants.BASE_CHAR_WIDTH */ * this.fontScale;\n        this.sectionHeaderFontFamily = DEFAULT_FONT_FAMILY;\n        this.sectionHeaderFontSize = minimapOpts.sectionHeaderFontSize * pixelRatio;\n        this.sectionHeaderLetterSpacing = minimapOpts.sectionHeaderLetterSpacing; // intentionally not multiplying by pixelRatio\n        this.sectionHeaderFontColor = MinimapOptions._getSectionHeaderColor(theme, tokensColorTracker.getColor(1 /* ColorId.DefaultForeground */));\n        this.charRenderer = createSingleCallFunction(() => MinimapCharRendererFactory.create(this.fontScale, fontInfo.fontFamily));\n        this.defaultBackgroundColor = tokensColorTracker.getColor(2 /* ColorId.DefaultBackground */);\n        this.backgroundColor = MinimapOptions._getMinimapBackground(theme, this.defaultBackgroundColor);\n        this.foregroundAlpha = MinimapOptions._getMinimapForegroundOpacity(theme);\n    }\n    static _getMinimapBackground(theme, defaultBackgroundColor) {\n        const themeColor = theme.getColor(minimapBackground);\n        if (themeColor) {\n            return new RGBA8(themeColor.rgba.r, themeColor.rgba.g, themeColor.rgba.b, Math.round(255 * themeColor.rgba.a));\n        }\n        return defaultBackgroundColor;\n    }\n    static _getMinimapForegroundOpacity(theme) {\n        const themeColor = theme.getColor(minimapForegroundOpacity);\n        if (themeColor) {\n            return RGBA8._clamp(Math.round(255 * themeColor.rgba.a));\n        }\n        return 255;\n    }\n    static _getSectionHeaderColor(theme, defaultForegroundColor) {\n        const themeColor = theme.getColor(editorForeground);\n        if (themeColor) {\n            return new RGBA8(themeColor.rgba.r, themeColor.rgba.g, themeColor.rgba.b, Math.round(255 * themeColor.rgba.a));\n        }\n        return defaultForegroundColor;\n    }\n    equals(other) {\n        return (this.renderMinimap === other.renderMinimap\n            && this.size === other.size\n            && this.minimapHeightIsEditorHeight === other.minimapHeightIsEditorHeight\n            && this.scrollBeyondLastLine === other.scrollBeyondLastLine\n            && this.paddingTop === other.paddingTop\n            && this.paddingBottom === other.paddingBottom\n            && this.showSlider === other.showSlider\n            && this.autohide === other.autohide\n            && this.pixelRatio === other.pixelRatio\n            && this.typicalHalfwidthCharacterWidth === other.typicalHalfwidthCharacterWidth\n            && this.lineHeight === other.lineHeight\n            && this.minimapLeft === other.minimapLeft\n            && this.minimapWidth === other.minimapWidth\n            && this.minimapHeight === other.minimapHeight\n            && this.canvasInnerWidth === other.canvasInnerWidth\n            && this.canvasInnerHeight === other.canvasInnerHeight\n            && this.canvasOuterWidth === other.canvasOuterWidth\n            && this.canvasOuterHeight === other.canvasOuterHeight\n            && this.isSampling === other.isSampling\n            && this.editorHeight === other.editorHeight\n            && this.fontScale === other.fontScale\n            && this.minimapLineHeight === other.minimapLineHeight\n            && this.minimapCharWidth === other.minimapCharWidth\n            && this.sectionHeaderFontSize === other.sectionHeaderFontSize\n            && this.sectionHeaderLetterSpacing === other.sectionHeaderLetterSpacing\n            && this.defaultBackgroundColor && this.defaultBackgroundColor.equals(other.defaultBackgroundColor)\n            && this.backgroundColor && this.backgroundColor.equals(other.backgroundColor)\n            && this.foregroundAlpha === other.foregroundAlpha);\n    }\n}\nclass MinimapLayout {\n    constructor(\n    /**\n     * The given editor scrollTop (input).\n     */\n    scrollTop, \n    /**\n     * The given editor scrollHeight (input).\n     */\n    scrollHeight, sliderNeeded, _computedSliderRatio, \n    /**\n     * slider dom node top (in CSS px)\n     */\n    sliderTop, \n    /**\n     * slider dom node height (in CSS px)\n     */\n    sliderHeight, \n    /**\n     * empty lines to reserve at the top of the minimap.\n     */\n    topPaddingLineCount, \n    /**\n     * minimap render start line number.\n     */\n    startLineNumber, \n    /**\n     * minimap render end line number.\n     */\n    endLineNumber) {\n        this.scrollTop = scrollTop;\n        this.scrollHeight = scrollHeight;\n        this.sliderNeeded = sliderNeeded;\n        this._computedSliderRatio = _computedSliderRatio;\n        this.sliderTop = sliderTop;\n        this.sliderHeight = sliderHeight;\n        this.topPaddingLineCount = topPaddingLineCount;\n        this.startLineNumber = startLineNumber;\n        this.endLineNumber = endLineNumber;\n    }\n    /**\n     * Compute a desired `scrollPosition` such that the slider moves by `delta`.\n     */\n    getDesiredScrollTopFromDelta(delta) {\n        return Math.round(this.scrollTop + delta / this._computedSliderRatio);\n    }\n    getDesiredScrollTopFromTouchLocation(pageY) {\n        return Math.round((pageY - this.sliderHeight / 2) / this._computedSliderRatio);\n    }\n    /**\n     * Intersect a line range with `this.startLineNumber` and `this.endLineNumber`.\n     */\n    intersectWithViewport(range) {\n        const startLineNumber = Math.max(this.startLineNumber, range.startLineNumber);\n        const endLineNumber = Math.min(this.endLineNumber, range.endLineNumber);\n        if (startLineNumber > endLineNumber) {\n            // entirely outside minimap's viewport\n            return null;\n        }\n        return [startLineNumber, endLineNumber];\n    }\n    /**\n     * Get the inner minimap y coordinate for a line number.\n     */\n    getYForLineNumber(lineNumber, minimapLineHeight) {\n        return +(lineNumber - this.startLineNumber + this.topPaddingLineCount) * minimapLineHeight;\n    }\n    static create(options, viewportStartLineNumber, viewportEndLineNumber, viewportStartLineNumberVerticalOffset, viewportHeight, viewportContainsWhitespaceGaps, lineCount, realLineCount, scrollTop, scrollHeight, previousLayout) {\n        const pixelRatio = options.pixelRatio;\n        const minimapLineHeight = options.minimapLineHeight;\n        const minimapLinesFitting = Math.floor(options.canvasInnerHeight / minimapLineHeight);\n        const lineHeight = options.lineHeight;\n        if (options.minimapHeightIsEditorHeight) {\n            let logicalScrollHeight = (realLineCount * options.lineHeight\n                + options.paddingTop\n                + options.paddingBottom);\n            if (options.scrollBeyondLastLine) {\n                logicalScrollHeight += Math.max(0, viewportHeight - options.lineHeight - options.paddingBottom);\n            }\n            const sliderHeight = Math.max(1, Math.floor(viewportHeight * viewportHeight / logicalScrollHeight));\n            const maxMinimapSliderTop = Math.max(0, options.minimapHeight - sliderHeight);\n            // The slider can move from 0 to `maxMinimapSliderTop`\n            // in the same way `scrollTop` can move from 0 to `scrollHeight` - `viewportHeight`.\n            const computedSliderRatio = (maxMinimapSliderTop) / (scrollHeight - viewportHeight);\n            const sliderTop = (scrollTop * computedSliderRatio);\n            const sliderNeeded = (maxMinimapSliderTop > 0);\n            const maxLinesFitting = Math.floor(options.canvasInnerHeight / options.minimapLineHeight);\n            const topPaddingLineCount = Math.floor(options.paddingTop / options.lineHeight);\n            return new MinimapLayout(scrollTop, scrollHeight, sliderNeeded, computedSliderRatio, sliderTop, sliderHeight, topPaddingLineCount, 1, Math.min(lineCount, maxLinesFitting));\n        }\n        // The visible line count in a viewport can change due to a number of reasons:\n        //  a) with the same viewport width, different scroll positions can result in partial lines being visible:\n        //    e.g. for a line height of 20, and a viewport height of 600\n        //          * scrollTop = 0  => visible lines are [1, 30]\n        //          * scrollTop = 10 => visible lines are [1, 31] (with lines 1 and 31 partially visible)\n        //          * scrollTop = 20 => visible lines are [2, 31]\n        //  b) whitespace gaps might make their way in the viewport (which results in a decrease in the visible line count)\n        //  c) we could be in the scroll beyond last line case (which also results in a decrease in the visible line count, down to possibly only one line being visible)\n        // We must first establish a desirable slider height.\n        let sliderHeight;\n        if (viewportContainsWhitespaceGaps && viewportEndLineNumber !== lineCount) {\n            // case b) from above: there are whitespace gaps in the viewport.\n            // In this case, the height of the slider directly reflects the visible line count.\n            const viewportLineCount = viewportEndLineNumber - viewportStartLineNumber + 1;\n            sliderHeight = Math.floor(viewportLineCount * minimapLineHeight / pixelRatio);\n        }\n        else {\n            // The slider has a stable height\n            const expectedViewportLineCount = viewportHeight / lineHeight;\n            sliderHeight = Math.floor(expectedViewportLineCount * minimapLineHeight / pixelRatio);\n        }\n        const extraLinesAtTheTop = Math.floor(options.paddingTop / lineHeight);\n        let extraLinesAtTheBottom = Math.floor(options.paddingBottom / lineHeight);\n        if (options.scrollBeyondLastLine) {\n            const expectedViewportLineCount = viewportHeight / lineHeight;\n            extraLinesAtTheBottom = Math.max(extraLinesAtTheBottom, expectedViewportLineCount - 1);\n        }\n        let maxMinimapSliderTop;\n        if (extraLinesAtTheBottom > 0) {\n            const expectedViewportLineCount = viewportHeight / lineHeight;\n            // The minimap slider, when dragged all the way down, will contain the last line at its top\n            maxMinimapSliderTop = (extraLinesAtTheTop + lineCount + extraLinesAtTheBottom - expectedViewportLineCount - 1) * minimapLineHeight / pixelRatio;\n        }\n        else {\n            // The minimap slider, when dragged all the way down, will contain the last line at its bottom\n            maxMinimapSliderTop = Math.max(0, (extraLinesAtTheTop + lineCount) * minimapLineHeight / pixelRatio - sliderHeight);\n        }\n        maxMinimapSliderTop = Math.min(options.minimapHeight - sliderHeight, maxMinimapSliderTop);\n        // The slider can move from 0 to `maxMinimapSliderTop`\n        // in the same way `scrollTop` can move from 0 to `scrollHeight` - `viewportHeight`.\n        const computedSliderRatio = (maxMinimapSliderTop) / (scrollHeight - viewportHeight);\n        const sliderTop = (scrollTop * computedSliderRatio);\n        if (minimapLinesFitting >= extraLinesAtTheTop + lineCount + extraLinesAtTheBottom) {\n            // All lines fit in the minimap\n            const sliderNeeded = (maxMinimapSliderTop > 0);\n            return new MinimapLayout(scrollTop, scrollHeight, sliderNeeded, computedSliderRatio, sliderTop, sliderHeight, extraLinesAtTheTop, 1, lineCount);\n        }\n        else {\n            let consideringStartLineNumber;\n            if (viewportStartLineNumber > 1) {\n                consideringStartLineNumber = viewportStartLineNumber + extraLinesAtTheTop;\n            }\n            else {\n                consideringStartLineNumber = Math.max(1, scrollTop / lineHeight);\n            }\n            let topPaddingLineCount;\n            let startLineNumber = Math.max(1, Math.floor(consideringStartLineNumber - sliderTop * pixelRatio / minimapLineHeight));\n            if (startLineNumber < extraLinesAtTheTop) {\n                topPaddingLineCount = extraLinesAtTheTop - startLineNumber + 1;\n                startLineNumber = 1;\n            }\n            else {\n                topPaddingLineCount = 0;\n                startLineNumber = Math.max(1, startLineNumber - extraLinesAtTheTop);\n            }\n            // Avoid flickering caused by a partial viewport start line\n            // by being consistent w.r.t. the previous layout decision\n            if (previousLayout && previousLayout.scrollHeight === scrollHeight) {\n                if (previousLayout.scrollTop > scrollTop) {\n                    // Scrolling up => never increase `startLineNumber`\n                    startLineNumber = Math.min(startLineNumber, previousLayout.startLineNumber);\n                    topPaddingLineCount = Math.max(topPaddingLineCount, previousLayout.topPaddingLineCount);\n                }\n                if (previousLayout.scrollTop < scrollTop) {\n                    // Scrolling down => never decrease `startLineNumber`\n                    startLineNumber = Math.max(startLineNumber, previousLayout.startLineNumber);\n                    topPaddingLineCount = Math.min(topPaddingLineCount, previousLayout.topPaddingLineCount);\n                }\n            }\n            const endLineNumber = Math.min(lineCount, startLineNumber - topPaddingLineCount + minimapLinesFitting - 1);\n            const partialLine = (scrollTop - viewportStartLineNumberVerticalOffset) / lineHeight;\n            let sliderTopAligned;\n            if (scrollTop >= options.paddingTop) {\n                sliderTopAligned = (viewportStartLineNumber - startLineNumber + topPaddingLineCount + partialLine) * minimapLineHeight / pixelRatio;\n            }\n            else {\n                sliderTopAligned = (scrollTop / options.paddingTop) * (topPaddingLineCount + partialLine) * minimapLineHeight / pixelRatio;\n            }\n            return new MinimapLayout(scrollTop, scrollHeight, true, computedSliderRatio, sliderTopAligned, sliderHeight, topPaddingLineCount, startLineNumber, endLineNumber);\n        }\n    }\n}\nclass MinimapLine {\n    static { this.INVALID = new MinimapLine(-1); }\n    constructor(dy) {\n        this.dy = dy;\n    }\n    onContentChanged() {\n        this.dy = -1;\n    }\n    onTokensChanged() {\n        this.dy = -1;\n    }\n}\nclass RenderData {\n    constructor(renderedLayout, imageData, lines) {\n        this.renderedLayout = renderedLayout;\n        this._imageData = imageData;\n        this._renderedLines = new RenderedLinesCollection({\n            createLine: () => MinimapLine.INVALID\n        });\n        this._renderedLines._set(renderedLayout.startLineNumber, lines);\n    }\n    /**\n     * Check if the current RenderData matches accurately the new desired layout and no painting is needed.\n     */\n    linesEquals(layout) {\n        if (!this.scrollEquals(layout)) {\n            return false;\n        }\n        const tmp = this._renderedLines._get();\n        const lines = tmp.lines;\n        for (let i = 0, len = lines.length; i < len; i++) {\n            if (lines[i].dy === -1) {\n                // This line is invalid\n                return false;\n            }\n        }\n        return true;\n    }\n    /**\n     * Check if the current RenderData matches the new layout's scroll position\n     */\n    scrollEquals(layout) {\n        return this.renderedLayout.startLineNumber === layout.startLineNumber\n            && this.renderedLayout.endLineNumber === layout.endLineNumber;\n    }\n    _get() {\n        const tmp = this._renderedLines._get();\n        return {\n            imageData: this._imageData,\n            rendLineNumberStart: tmp.rendLineNumberStart,\n            lines: tmp.lines\n        };\n    }\n    onLinesChanged(changeFromLineNumber, changeCount) {\n        return this._renderedLines.onLinesChanged(changeFromLineNumber, changeCount);\n    }\n    onLinesDeleted(deleteFromLineNumber, deleteToLineNumber) {\n        this._renderedLines.onLinesDeleted(deleteFromLineNumber, deleteToLineNumber);\n    }\n    onLinesInserted(insertFromLineNumber, insertToLineNumber) {\n        this._renderedLines.onLinesInserted(insertFromLineNumber, insertToLineNumber);\n    }\n    onTokensChanged(ranges) {\n        return this._renderedLines.onTokensChanged(ranges);\n    }\n}\n/**\n * Some sort of double buffering.\n *\n * Keeps two buffers around that will be rotated for painting.\n * Always gives a buffer that is filled with the background color.\n */\nclass MinimapBuffers {\n    constructor(ctx, WIDTH, HEIGHT, background) {\n        this._backgroundFillData = MinimapBuffers._createBackgroundFillData(WIDTH, HEIGHT, background);\n        this._buffers = [\n            ctx.createImageData(WIDTH, HEIGHT),\n            ctx.createImageData(WIDTH, HEIGHT)\n        ];\n        this._lastUsedBuffer = 0;\n    }\n    getBuffer() {\n        // rotate buffers\n        this._lastUsedBuffer = 1 - this._lastUsedBuffer;\n        const result = this._buffers[this._lastUsedBuffer];\n        // fill with background color\n        result.data.set(this._backgroundFillData);\n        return result;\n    }\n    static _createBackgroundFillData(WIDTH, HEIGHT, background) {\n        const backgroundR = background.r;\n        const backgroundG = background.g;\n        const backgroundB = background.b;\n        const backgroundA = background.a;\n        const result = new Uint8ClampedArray(WIDTH * HEIGHT * 4);\n        let offset = 0;\n        for (let i = 0; i < HEIGHT; i++) {\n            for (let j = 0; j < WIDTH; j++) {\n                result[offset] = backgroundR;\n                result[offset + 1] = backgroundG;\n                result[offset + 2] = backgroundB;\n                result[offset + 3] = backgroundA;\n                offset += 4;\n            }\n        }\n        return result;\n    }\n}\nclass MinimapSamplingState {\n    static compute(options, viewLineCount, oldSamplingState) {\n        if (options.renderMinimap === 0 /* RenderMinimap.None */ || !options.isSampling) {\n            return [null, []];\n        }\n        // ratio is intentionally not part of the layout to avoid the layout changing all the time\n        // so we need to recompute it again...\n        const { minimapLineCount } = EditorLayoutInfoComputer.computeContainedMinimapLineCount({\n            viewLineCount: viewLineCount,\n            scrollBeyondLastLine: options.scrollBeyondLastLine,\n            paddingTop: options.paddingTop,\n            paddingBottom: options.paddingBottom,\n            height: options.editorHeight,\n            lineHeight: options.lineHeight,\n            pixelRatio: options.pixelRatio\n        });\n        const ratio = viewLineCount / minimapLineCount;\n        const halfRatio = ratio / 2;\n        if (!oldSamplingState || oldSamplingState.minimapLines.length === 0) {\n            const result = [];\n            result[0] = 1;\n            if (minimapLineCount > 1) {\n                for (let i = 0, lastIndex = minimapLineCount - 1; i < lastIndex; i++) {\n                    result[i] = Math.round(i * ratio + halfRatio);\n                }\n                result[minimapLineCount - 1] = viewLineCount;\n            }\n            return [new MinimapSamplingState(ratio, result), []];\n        }\n        const oldMinimapLines = oldSamplingState.minimapLines;\n        const oldLength = oldMinimapLines.length;\n        const result = [];\n        let oldIndex = 0;\n        let oldDeltaLineCount = 0;\n        let minViewLineNumber = 1;\n        const MAX_EVENT_COUNT = 10; // generate at most 10 events, if there are more than 10 changes, just flush all previous data\n        let events = [];\n        let lastEvent = null;\n        for (let i = 0; i < minimapLineCount; i++) {\n            const fromViewLineNumber = Math.max(minViewLineNumber, Math.round(i * ratio));\n            const toViewLineNumber = Math.max(fromViewLineNumber, Math.round((i + 1) * ratio));\n            while (oldIndex < oldLength && oldMinimapLines[oldIndex] < fromViewLineNumber) {\n                if (events.length < MAX_EVENT_COUNT) {\n                    const oldMinimapLineNumber = oldIndex + 1 + oldDeltaLineCount;\n                    if (lastEvent && lastEvent.type === 'deleted' && lastEvent._oldIndex === oldIndex - 1) {\n                        lastEvent.deleteToLineNumber++;\n                    }\n                    else {\n                        lastEvent = { type: 'deleted', _oldIndex: oldIndex, deleteFromLineNumber: oldMinimapLineNumber, deleteToLineNumber: oldMinimapLineNumber };\n                        events.push(lastEvent);\n                    }\n                    oldDeltaLineCount--;\n                }\n                oldIndex++;\n            }\n            let selectedViewLineNumber;\n            if (oldIndex < oldLength && oldMinimapLines[oldIndex] <= toViewLineNumber) {\n                // reuse the old sampled line\n                selectedViewLineNumber = oldMinimapLines[oldIndex];\n                oldIndex++;\n            }\n            else {\n                if (i === 0) {\n                    selectedViewLineNumber = 1;\n                }\n                else if (i + 1 === minimapLineCount) {\n                    selectedViewLineNumber = viewLineCount;\n                }\n                else {\n                    selectedViewLineNumber = Math.round(i * ratio + halfRatio);\n                }\n                if (events.length < MAX_EVENT_COUNT) {\n                    const oldMinimapLineNumber = oldIndex + 1 + oldDeltaLineCount;\n                    if (lastEvent && lastEvent.type === 'inserted' && lastEvent._i === i - 1) {\n                        lastEvent.insertToLineNumber++;\n                    }\n                    else {\n                        lastEvent = { type: 'inserted', _i: i, insertFromLineNumber: oldMinimapLineNumber, insertToLineNumber: oldMinimapLineNumber };\n                        events.push(lastEvent);\n                    }\n                    oldDeltaLineCount++;\n                }\n            }\n            result[i] = selectedViewLineNumber;\n            minViewLineNumber = selectedViewLineNumber;\n        }\n        if (events.length < MAX_EVENT_COUNT) {\n            while (oldIndex < oldLength) {\n                const oldMinimapLineNumber = oldIndex + 1 + oldDeltaLineCount;\n                if (lastEvent && lastEvent.type === 'deleted' && lastEvent._oldIndex === oldIndex - 1) {\n                    lastEvent.deleteToLineNumber++;\n                }\n                else {\n                    lastEvent = { type: 'deleted', _oldIndex: oldIndex, deleteFromLineNumber: oldMinimapLineNumber, deleteToLineNumber: oldMinimapLineNumber };\n                    events.push(lastEvent);\n                }\n                oldDeltaLineCount--;\n                oldIndex++;\n            }\n        }\n        else {\n            // too many events, just give up\n            events = [{ type: 'flush' }];\n        }\n        return [new MinimapSamplingState(ratio, result), events];\n    }\n    constructor(samplingRatio, minimapLines // a map of 0-based minimap line indexes to 1-based view line numbers\n    ) {\n        this.samplingRatio = samplingRatio;\n        this.minimapLines = minimapLines;\n    }\n    modelLineToMinimapLine(lineNumber) {\n        return Math.min(this.minimapLines.length, Math.max(1, Math.round(lineNumber / this.samplingRatio)));\n    }\n    /**\n     * Will return null if the model line ranges are not intersecting with a sampled model line.\n     */\n    modelLineRangeToMinimapLineRange(fromLineNumber, toLineNumber) {\n        let fromLineIndex = this.modelLineToMinimapLine(fromLineNumber) - 1;\n        while (fromLineIndex > 0 && this.minimapLines[fromLineIndex - 1] >= fromLineNumber) {\n            fromLineIndex--;\n        }\n        let toLineIndex = this.modelLineToMinimapLine(toLineNumber) - 1;\n        while (toLineIndex + 1 < this.minimapLines.length && this.minimapLines[toLineIndex + 1] <= toLineNumber) {\n            toLineIndex++;\n        }\n        if (fromLineIndex === toLineIndex) {\n            const sampledLineNumber = this.minimapLines[fromLineIndex];\n            if (sampledLineNumber < fromLineNumber || sampledLineNumber > toLineNumber) {\n                // This line is not part of the sampled lines ==> nothing to do\n                return null;\n            }\n        }\n        return [fromLineIndex + 1, toLineIndex + 1];\n    }\n    /**\n     * Will always return a range, even if it is not intersecting with a sampled model line.\n     */\n    decorationLineRangeToMinimapLineRange(startLineNumber, endLineNumber) {\n        let minimapLineStart = this.modelLineToMinimapLine(startLineNumber);\n        let minimapLineEnd = this.modelLineToMinimapLine(endLineNumber);\n        if (startLineNumber !== endLineNumber && minimapLineEnd === minimapLineStart) {\n            if (minimapLineEnd === this.minimapLines.length) {\n                if (minimapLineStart > 1) {\n                    minimapLineStart--;\n                }\n            }\n            else {\n                minimapLineEnd++;\n            }\n        }\n        return [minimapLineStart, minimapLineEnd];\n    }\n    onLinesDeleted(e) {\n        // have the mapping be sticky\n        const deletedLineCount = e.toLineNumber - e.fromLineNumber + 1;\n        let changeStartIndex = this.minimapLines.length;\n        let changeEndIndex = 0;\n        for (let i = this.minimapLines.length - 1; i >= 0; i--) {\n            if (this.minimapLines[i] < e.fromLineNumber) {\n                break;\n            }\n            if (this.minimapLines[i] <= e.toLineNumber) {\n                // this line got deleted => move to previous available\n                this.minimapLines[i] = Math.max(1, e.fromLineNumber - 1);\n                changeStartIndex = Math.min(changeStartIndex, i);\n                changeEndIndex = Math.max(changeEndIndex, i);\n            }\n            else {\n                this.minimapLines[i] -= deletedLineCount;\n            }\n        }\n        return [changeStartIndex, changeEndIndex];\n    }\n    onLinesInserted(e) {\n        // have the mapping be sticky\n        const insertedLineCount = e.toLineNumber - e.fromLineNumber + 1;\n        for (let i = this.minimapLines.length - 1; i >= 0; i--) {\n            if (this.minimapLines[i] < e.fromLineNumber) {\n                break;\n            }\n            this.minimapLines[i] += insertedLineCount;\n        }\n    }\n}\n/**\n * The minimap appears beside the editor scroll bar and visualizes a zoomed out\n * view of the file.\n */\nclass Minimap extends ViewPart {\n    constructor(context) {\n        super(context);\n        this._sectionHeaderCache = new LRUCache(10, 1.5);\n        this.tokensColorTracker = MinimapTokensColorTracker.getInstance();\n        this._selections = [];\n        this._minimapSelections = null;\n        this.options = new MinimapOptions(this._context.configuration, this._context.theme, this.tokensColorTracker);\n        const [samplingState,] = MinimapSamplingState.compute(this.options, this._context.viewModel.getLineCount(), null);\n        this._samplingState = samplingState;\n        this._shouldCheckSampling = false;\n        this._actual = new InnerMinimap(context.theme, this);\n    }\n    dispose() {\n        this._actual.dispose();\n        super.dispose();\n    }\n    getDomNode() {\n        return this._actual.getDomNode();\n    }\n    _onOptionsMaybeChanged() {\n        const opts = new MinimapOptions(this._context.configuration, this._context.theme, this.tokensColorTracker);\n        if (this.options.equals(opts)) {\n            return false;\n        }\n        this.options = opts;\n        this._recreateLineSampling();\n        this._actual.onDidChangeOptions();\n        return true;\n    }\n    // ---- begin view event handlers\n    onConfigurationChanged(e) {\n        return this._onOptionsMaybeChanged();\n    }\n    onCursorStateChanged(e) {\n        this._selections = e.selections;\n        this._minimapSelections = null;\n        return this._actual.onSelectionChanged();\n    }\n    onDecorationsChanged(e) {\n        if (e.affectsMinimap) {\n            return this._actual.onDecorationsChanged();\n        }\n        return false;\n    }\n    onFlushed(e) {\n        if (this._samplingState) {\n            this._shouldCheckSampling = true;\n        }\n        return this._actual.onFlushed();\n    }\n    onLinesChanged(e) {\n        if (this._samplingState) {\n            const minimapLineRange = this._samplingState.modelLineRangeToMinimapLineRange(e.fromLineNumber, e.fromLineNumber + e.count - 1);\n            if (minimapLineRange) {\n                return this._actual.onLinesChanged(minimapLineRange[0], minimapLineRange[1] - minimapLineRange[0] + 1);\n            }\n            else {\n                return false;\n            }\n        }\n        else {\n            return this._actual.onLinesChanged(e.fromLineNumber, e.count);\n        }\n    }\n    onLinesDeleted(e) {\n        if (this._samplingState) {\n            const [changeStartIndex, changeEndIndex] = this._samplingState.onLinesDeleted(e);\n            if (changeStartIndex <= changeEndIndex) {\n                this._actual.onLinesChanged(changeStartIndex + 1, changeEndIndex - changeStartIndex + 1);\n            }\n            this._shouldCheckSampling = true;\n            return true;\n        }\n        else {\n            return this._actual.onLinesDeleted(e.fromLineNumber, e.toLineNumber);\n        }\n    }\n    onLinesInserted(e) {\n        if (this._samplingState) {\n            this._samplingState.onLinesInserted(e);\n            this._shouldCheckSampling = true;\n            return true;\n        }\n        else {\n            return this._actual.onLinesInserted(e.fromLineNumber, e.toLineNumber);\n        }\n    }\n    onScrollChanged(e) {\n        return this._actual.onScrollChanged(e);\n    }\n    onThemeChanged(e) {\n        this._actual.onThemeChanged();\n        this._onOptionsMaybeChanged();\n        return true;\n    }\n    onTokensChanged(e) {\n        if (this._samplingState) {\n            const ranges = [];\n            for (const range of e.ranges) {\n                const minimapLineRange = this._samplingState.modelLineRangeToMinimapLineRange(range.fromLineNumber, range.toLineNumber);\n                if (minimapLineRange) {\n                    ranges.push({ fromLineNumber: minimapLineRange[0], toLineNumber: minimapLineRange[1] });\n                }\n            }\n            if (ranges.length) {\n                return this._actual.onTokensChanged(ranges);\n            }\n            else {\n                return false;\n            }\n        }\n        else {\n            return this._actual.onTokensChanged(e.ranges);\n        }\n    }\n    onTokensColorsChanged(e) {\n        this._onOptionsMaybeChanged();\n        return this._actual.onTokensColorsChanged();\n    }\n    onZonesChanged(e) {\n        return this._actual.onZonesChanged();\n    }\n    // --- end event handlers\n    prepareRender(ctx) {\n        if (this._shouldCheckSampling) {\n            this._shouldCheckSampling = false;\n            this._recreateLineSampling();\n        }\n    }\n    render(ctx) {\n        let viewportStartLineNumber = ctx.visibleRange.startLineNumber;\n        let viewportEndLineNumber = ctx.visibleRange.endLineNumber;\n        if (this._samplingState) {\n            viewportStartLineNumber = this._samplingState.modelLineToMinimapLine(viewportStartLineNumber);\n            viewportEndLineNumber = this._samplingState.modelLineToMinimapLine(viewportEndLineNumber);\n        }\n        const minimapCtx = {\n            viewportContainsWhitespaceGaps: (ctx.viewportData.whitespaceViewportData.length > 0),\n            scrollWidth: ctx.scrollWidth,\n            scrollHeight: ctx.scrollHeight,\n            viewportStartLineNumber: viewportStartLineNumber,\n            viewportEndLineNumber: viewportEndLineNumber,\n            viewportStartLineNumberVerticalOffset: ctx.getVerticalOffsetForLineNumber(viewportStartLineNumber),\n            scrollTop: ctx.scrollTop,\n            scrollLeft: ctx.scrollLeft,\n            viewportWidth: ctx.viewportWidth,\n            viewportHeight: ctx.viewportHeight,\n        };\n        this._actual.render(minimapCtx);\n    }\n    //#region IMinimapModel\n    _recreateLineSampling() {\n        this._minimapSelections = null;\n        const wasSampling = Boolean(this._samplingState);\n        const [samplingState, events] = MinimapSamplingState.compute(this.options, this._context.viewModel.getLineCount(), this._samplingState);\n        this._samplingState = samplingState;\n        if (wasSampling && this._samplingState) {\n            // was sampling, is sampling\n            for (const event of events) {\n                switch (event.type) {\n                    case 'deleted':\n                        this._actual.onLinesDeleted(event.deleteFromLineNumber, event.deleteToLineNumber);\n                        break;\n                    case 'inserted':\n                        this._actual.onLinesInserted(event.insertFromLineNumber, event.insertToLineNumber);\n                        break;\n                    case 'flush':\n                        this._actual.onFlushed();\n                        break;\n                }\n            }\n        }\n    }\n    getLineCount() {\n        if (this._samplingState) {\n            return this._samplingState.minimapLines.length;\n        }\n        return this._context.viewModel.getLineCount();\n    }\n    getRealLineCount() {\n        return this._context.viewModel.getLineCount();\n    }\n    getLineContent(lineNumber) {\n        if (this._samplingState) {\n            return this._context.viewModel.getLineContent(this._samplingState.minimapLines[lineNumber - 1]);\n        }\n        return this._context.viewModel.getLineContent(lineNumber);\n    }\n    getLineMaxColumn(lineNumber) {\n        if (this._samplingState) {\n            return this._context.viewModel.getLineMaxColumn(this._samplingState.minimapLines[lineNumber - 1]);\n        }\n        return this._context.viewModel.getLineMaxColumn(lineNumber);\n    }\n    getMinimapLinesRenderingData(startLineNumber, endLineNumber, needed) {\n        if (this._samplingState) {\n            const result = [];\n            for (let lineIndex = 0, lineCount = endLineNumber - startLineNumber + 1; lineIndex < lineCount; lineIndex++) {\n                if (needed[lineIndex]) {\n                    result[lineIndex] = this._context.viewModel.getViewLineData(this._samplingState.minimapLines[startLineNumber + lineIndex - 1]);\n                }\n                else {\n                    result[lineIndex] = null;\n                }\n            }\n            return result;\n        }\n        return this._context.viewModel.getMinimapLinesRenderingData(startLineNumber, endLineNumber, needed).data;\n    }\n    getSelections() {\n        if (this._minimapSelections === null) {\n            if (this._samplingState) {\n                this._minimapSelections = [];\n                for (const selection of this._selections) {\n                    const [minimapLineStart, minimapLineEnd] = this._samplingState.decorationLineRangeToMinimapLineRange(selection.startLineNumber, selection.endLineNumber);\n                    this._minimapSelections.push(new Selection(minimapLineStart, selection.startColumn, minimapLineEnd, selection.endColumn));\n                }\n            }\n            else {\n                this._minimapSelections = this._selections;\n            }\n        }\n        return this._minimapSelections;\n    }\n    getMinimapDecorationsInViewport(startLineNumber, endLineNumber) {\n        return this._getMinimapDecorationsInViewport(startLineNumber, endLineNumber)\n            .filter(decoration => !decoration.options.minimap?.sectionHeaderStyle);\n    }\n    getSectionHeaderDecorationsInViewport(startLineNumber, endLineNumber) {\n        const headerHeightInMinimapLines = this.options.sectionHeaderFontSize / this.options.minimapLineHeight;\n        startLineNumber = Math.floor(Math.max(1, startLineNumber - headerHeightInMinimapLines));\n        return this._getMinimapDecorationsInViewport(startLineNumber, endLineNumber)\n            .filter(decoration => !!decoration.options.minimap?.sectionHeaderStyle);\n    }\n    _getMinimapDecorationsInViewport(startLineNumber, endLineNumber) {\n        let visibleRange;\n        if (this._samplingState) {\n            const modelStartLineNumber = this._samplingState.minimapLines[startLineNumber - 1];\n            const modelEndLineNumber = this._samplingState.minimapLines[endLineNumber - 1];\n            visibleRange = new Range(modelStartLineNumber, 1, modelEndLineNumber, this._context.viewModel.getLineMaxColumn(modelEndLineNumber));\n        }\n        else {\n            visibleRange = new Range(startLineNumber, 1, endLineNumber, this._context.viewModel.getLineMaxColumn(endLineNumber));\n        }\n        const decorations = this._context.viewModel.getMinimapDecorationsInRange(visibleRange);\n        if (this._samplingState) {\n            const result = [];\n            for (const decoration of decorations) {\n                if (!decoration.options.minimap) {\n                    continue;\n                }\n                const range = decoration.range;\n                const minimapStartLineNumber = this._samplingState.modelLineToMinimapLine(range.startLineNumber);\n                const minimapEndLineNumber = this._samplingState.modelLineToMinimapLine(range.endLineNumber);\n                result.push(new ViewModelDecoration(new Range(minimapStartLineNumber, range.startColumn, minimapEndLineNumber, range.endColumn), decoration.options));\n            }\n            return result;\n        }\n        return decorations;\n    }\n    getSectionHeaderText(decoration, fitWidth) {\n        const headerText = decoration.options.minimap?.sectionHeaderText;\n        if (!headerText) {\n            return null;\n        }\n        const cachedText = this._sectionHeaderCache.get(headerText);\n        if (cachedText) {\n            return cachedText;\n        }\n        const fittedText = fitWidth(headerText);\n        this._sectionHeaderCache.set(headerText, fittedText);\n        return fittedText;\n    }\n    getOptions() {\n        return this._context.viewModel.model.getOptions();\n    }\n    revealLineNumber(lineNumber) {\n        if (this._samplingState) {\n            lineNumber = this._samplingState.minimapLines[lineNumber - 1];\n        }\n        this._context.viewModel.revealRange('mouse', false, new Range(lineNumber, 1, lineNumber, 1), 1 /* viewEvents.VerticalRevealType.Center */, 0 /* ScrollType.Smooth */);\n    }\n    setScrollTop(scrollTop) {\n        this._context.viewModel.viewLayout.setScrollPosition({\n            scrollTop: scrollTop\n        }, 1 /* ScrollType.Immediate */);\n    }\n}\nclass InnerMinimap extends Disposable {\n    constructor(theme, model) {\n        super();\n        this._renderDecorations = false;\n        this._gestureInProgress = false;\n        this._isMouseOverMinimap = false;\n        this._theme = theme;\n        this._model = model;\n        this._lastRenderData = null;\n        this._buffers = null;\n        this._selectionColor = this._theme.getColor(minimapSelection);\n        this._domNode = createFastDomNode(document.createElement('div'));\n        PartFingerprints.write(this._domNode, 9 /* PartFingerprint.Minimap */);\n        this._domNode.setClassName(this._getMinimapDomNodeClassName());\n        this._domNode.setPosition('absolute');\n        this._domNode.setAttribute('role', 'presentation');\n        this._domNode.setAttribute('aria-hidden', 'true');\n        this._shadow = createFastDomNode(document.createElement('div'));\n        this._shadow.setClassName('minimap-shadow-hidden');\n        this._domNode.appendChild(this._shadow);\n        this._canvas = createFastDomNode(document.createElement('canvas'));\n        this._canvas.setPosition('absolute');\n        this._canvas.setLeft(0);\n        this._domNode.appendChild(this._canvas);\n        this._decorationsCanvas = createFastDomNode(document.createElement('canvas'));\n        this._decorationsCanvas.setPosition('absolute');\n        this._decorationsCanvas.setClassName('minimap-decorations-layer');\n        this._decorationsCanvas.setLeft(0);\n        this._domNode.appendChild(this._decorationsCanvas);\n        this._slider = createFastDomNode(document.createElement('div'));\n        this._slider.setPosition('absolute');\n        this._slider.setClassName('minimap-slider');\n        this._slider.setLayerHinting(true);\n        this._slider.setContain('strict');\n        this._domNode.appendChild(this._slider);\n        this._sliderHorizontal = createFastDomNode(document.createElement('div'));\n        this._sliderHorizontal.setPosition('absolute');\n        this._sliderHorizontal.setClassName('minimap-slider-horizontal');\n        this._slider.appendChild(this._sliderHorizontal);\n        this._applyLayout();\n        this._hideDelayedScheduler = this._register(new RunOnceScheduler(() => this._hideImmediatelyIfMouseIsOutside(), 500));\n        this._register(addStandardDisposableListener(this._domNode.domNode, EventType$1.MOUSE_OVER, () => {\n            this._isMouseOverMinimap = true;\n        }));\n        this._register(addStandardDisposableListener(this._domNode.domNode, EventType$1.MOUSE_LEAVE, () => {\n            this._isMouseOverMinimap = false;\n        }));\n        this._pointerDownListener = addStandardDisposableListener(this._domNode.domNode, EventType$1.POINTER_DOWN, (e) => {\n            e.preventDefault();\n            const isMouse = (e.pointerType === 'mouse');\n            const isLeftClick = (e.button === 0);\n            const renderMinimap = this._model.options.renderMinimap;\n            if (renderMinimap === 0 /* RenderMinimap.None */) {\n                return;\n            }\n            if (!this._lastRenderData) {\n                return;\n            }\n            if (this._model.options.size !== 'proportional') {\n                if (isLeftClick && this._lastRenderData) {\n                    // pretend the click occurred in the center of the slider\n                    const position = getDomNodePagePosition(this._slider.domNode);\n                    const initialPosY = position.top + position.height / 2;\n                    this._startSliderDragging(e, initialPosY, this._lastRenderData.renderedLayout);\n                }\n                return;\n            }\n            if (isLeftClick || !isMouse) {\n                const minimapLineHeight = this._model.options.minimapLineHeight;\n                const internalOffsetY = (this._model.options.canvasInnerHeight / this._model.options.canvasOuterHeight) * e.offsetY;\n                const lineIndex = Math.floor(internalOffsetY / minimapLineHeight);\n                let lineNumber = lineIndex + this._lastRenderData.renderedLayout.startLineNumber - this._lastRenderData.renderedLayout.topPaddingLineCount;\n                lineNumber = Math.min(lineNumber, this._model.getLineCount());\n                this._model.revealLineNumber(lineNumber);\n            }\n        });\n        this._sliderPointerMoveMonitor = new GlobalPointerMoveMonitor();\n        this._sliderPointerDownListener = addStandardDisposableListener(this._slider.domNode, EventType$1.POINTER_DOWN, (e) => {\n            e.preventDefault();\n            e.stopPropagation();\n            if (e.button === 0 && this._lastRenderData) {\n                this._startSliderDragging(e, e.pageY, this._lastRenderData.renderedLayout);\n            }\n        });\n        this._gestureDisposable = Gesture.addTarget(this._domNode.domNode);\n        this._sliderTouchStartListener = addDisposableListener(this._domNode.domNode, EventType.Start, (e) => {\n            e.preventDefault();\n            e.stopPropagation();\n            if (this._lastRenderData) {\n                this._slider.toggleClassName('active', true);\n                this._gestureInProgress = true;\n                this.scrollDueToTouchEvent(e);\n            }\n        }, { passive: false });\n        this._sliderTouchMoveListener = addDisposableListener(this._domNode.domNode, EventType.Change, (e) => {\n            e.preventDefault();\n            e.stopPropagation();\n            if (this._lastRenderData && this._gestureInProgress) {\n                this.scrollDueToTouchEvent(e);\n            }\n        }, { passive: false });\n        this._sliderTouchEndListener = addStandardDisposableListener(this._domNode.domNode, EventType.End, (e) => {\n            e.preventDefault();\n            e.stopPropagation();\n            this._gestureInProgress = false;\n            this._slider.toggleClassName('active', false);\n        });\n    }\n    _hideSoon() {\n        this._hideDelayedScheduler.cancel();\n        this._hideDelayedScheduler.schedule();\n    }\n    _hideImmediatelyIfMouseIsOutside() {\n        if (this._isMouseOverMinimap) {\n            this._hideSoon();\n            return;\n        }\n        this._domNode.toggleClassName('active', false);\n    }\n    _startSliderDragging(e, initialPosY, initialSliderState) {\n        if (!e.target || !(e.target instanceof Element)) {\n            return;\n        }\n        const initialPosX = e.pageX;\n        this._slider.toggleClassName('active', true);\n        const handlePointerMove = (posy, posx) => {\n            const minimapPosition = getDomNodePagePosition(this._domNode.domNode);\n            const pointerOrthogonalDelta = Math.min(Math.abs(posx - initialPosX), Math.abs(posx - minimapPosition.left), Math.abs(posx - minimapPosition.left - minimapPosition.width));\n            if (isWindows && pointerOrthogonalDelta > POINTER_DRAG_RESET_DISTANCE) {\n                // The pointer has wondered away from the scrollbar => reset dragging\n                this._model.setScrollTop(initialSliderState.scrollTop);\n                return;\n            }\n            const pointerDelta = posy - initialPosY;\n            this._model.setScrollTop(initialSliderState.getDesiredScrollTopFromDelta(pointerDelta));\n        };\n        if (e.pageY !== initialPosY) {\n            handlePointerMove(e.pageY, initialPosX);\n        }\n        this._sliderPointerMoveMonitor.startMonitoring(e.target, e.pointerId, e.buttons, pointerMoveData => handlePointerMove(pointerMoveData.pageY, pointerMoveData.pageX), () => {\n            this._slider.toggleClassName('active', false);\n        });\n    }\n    scrollDueToTouchEvent(touch) {\n        const startY = this._domNode.domNode.getBoundingClientRect().top;\n        const scrollTop = this._lastRenderData.renderedLayout.getDesiredScrollTopFromTouchLocation(touch.pageY - startY);\n        this._model.setScrollTop(scrollTop);\n    }\n    dispose() {\n        this._pointerDownListener.dispose();\n        this._sliderPointerMoveMonitor.dispose();\n        this._sliderPointerDownListener.dispose();\n        this._gestureDisposable.dispose();\n        this._sliderTouchStartListener.dispose();\n        this._sliderTouchMoveListener.dispose();\n        this._sliderTouchEndListener.dispose();\n        super.dispose();\n    }\n    _getMinimapDomNodeClassName() {\n        const class_ = ['minimap'];\n        if (this._model.options.showSlider === 'always') {\n            class_.push('slider-always');\n        }\n        else {\n            class_.push('slider-mouseover');\n        }\n        if (this._model.options.autohide === 'mouseover') {\n            class_.push('minimap-autohide-mouseover');\n        }\n        else if (this._model.options.autohide === 'scroll') {\n            class_.push('minimap-autohide-scroll');\n        }\n        return class_.join(' ');\n    }\n    getDomNode() {\n        return this._domNode;\n    }\n    _applyLayout() {\n        this._domNode.setLeft(this._model.options.minimapLeft);\n        this._domNode.setWidth(this._model.options.minimapWidth);\n        this._domNode.setHeight(this._model.options.minimapHeight);\n        this._shadow.setHeight(this._model.options.minimapHeight);\n        this._canvas.setWidth(this._model.options.canvasOuterWidth);\n        this._canvas.setHeight(this._model.options.canvasOuterHeight);\n        this._canvas.domNode.width = this._model.options.canvasInnerWidth;\n        this._canvas.domNode.height = this._model.options.canvasInnerHeight;\n        this._decorationsCanvas.setWidth(this._model.options.canvasOuterWidth);\n        this._decorationsCanvas.setHeight(this._model.options.canvasOuterHeight);\n        this._decorationsCanvas.domNode.width = this._model.options.canvasInnerWidth;\n        this._decorationsCanvas.domNode.height = this._model.options.canvasInnerHeight;\n        this._slider.setWidth(this._model.options.minimapWidth);\n    }\n    _getBuffer() {\n        if (!this._buffers) {\n            if (this._model.options.canvasInnerWidth > 0 && this._model.options.canvasInnerHeight > 0) {\n                this._buffers = new MinimapBuffers(this._canvas.domNode.getContext('2d'), this._model.options.canvasInnerWidth, this._model.options.canvasInnerHeight, this._model.options.backgroundColor);\n            }\n        }\n        return this._buffers ? this._buffers.getBuffer() : null;\n    }\n    // ---- begin view event handlers\n    onDidChangeOptions() {\n        this._lastRenderData = null;\n        this._buffers = null;\n        this._applyLayout();\n        this._domNode.setClassName(this._getMinimapDomNodeClassName());\n    }\n    onSelectionChanged() {\n        this._renderDecorations = true;\n        return true;\n    }\n    onDecorationsChanged() {\n        this._renderDecorations = true;\n        return true;\n    }\n    onFlushed() {\n        this._lastRenderData = null;\n        return true;\n    }\n    onLinesChanged(changeFromLineNumber, changeCount) {\n        if (this._lastRenderData) {\n            return this._lastRenderData.onLinesChanged(changeFromLineNumber, changeCount);\n        }\n        return false;\n    }\n    onLinesDeleted(deleteFromLineNumber, deleteToLineNumber) {\n        this._lastRenderData?.onLinesDeleted(deleteFromLineNumber, deleteToLineNumber);\n        return true;\n    }\n    onLinesInserted(insertFromLineNumber, insertToLineNumber) {\n        this._lastRenderData?.onLinesInserted(insertFromLineNumber, insertToLineNumber);\n        return true;\n    }\n    onScrollChanged(e) {\n        if (this._model.options.autohide === 'scroll' && (e.scrollTopChanged || e.scrollHeightChanged)) {\n            this._domNode.toggleClassName('active', true);\n            this._hideSoon();\n        }\n        this._renderDecorations = true;\n        return true;\n    }\n    onThemeChanged() {\n        this._selectionColor = this._theme.getColor(minimapSelection);\n        this._renderDecorations = true;\n        return true;\n    }\n    onTokensChanged(ranges) {\n        if (this._lastRenderData) {\n            return this._lastRenderData.onTokensChanged(ranges);\n        }\n        return false;\n    }\n    onTokensColorsChanged() {\n        this._lastRenderData = null;\n        this._buffers = null;\n        return true;\n    }\n    onZonesChanged() {\n        this._lastRenderData = null;\n        return true;\n    }\n    // --- end event handlers\n    render(renderingCtx) {\n        const renderMinimap = this._model.options.renderMinimap;\n        if (renderMinimap === 0 /* RenderMinimap.None */) {\n            this._shadow.setClassName('minimap-shadow-hidden');\n            this._sliderHorizontal.setWidth(0);\n            this._sliderHorizontal.setHeight(0);\n            return;\n        }\n        if (renderingCtx.scrollLeft + renderingCtx.viewportWidth >= renderingCtx.scrollWidth) {\n            this._shadow.setClassName('minimap-shadow-hidden');\n        }\n        else {\n            this._shadow.setClassName('minimap-shadow-visible');\n        }\n        const layout = MinimapLayout.create(this._model.options, renderingCtx.viewportStartLineNumber, renderingCtx.viewportEndLineNumber, renderingCtx.viewportStartLineNumberVerticalOffset, renderingCtx.viewportHeight, renderingCtx.viewportContainsWhitespaceGaps, this._model.getLineCount(), this._model.getRealLineCount(), renderingCtx.scrollTop, renderingCtx.scrollHeight, this._lastRenderData ? this._lastRenderData.renderedLayout : null);\n        this._slider.setDisplay(layout.sliderNeeded ? 'block' : 'none');\n        this._slider.setTop(layout.sliderTop);\n        this._slider.setHeight(layout.sliderHeight);\n        // Compute horizontal slider coordinates\n        this._sliderHorizontal.setLeft(0);\n        this._sliderHorizontal.setWidth(this._model.options.minimapWidth);\n        this._sliderHorizontal.setTop(0);\n        this._sliderHorizontal.setHeight(layout.sliderHeight);\n        this.renderDecorations(layout);\n        this._lastRenderData = this.renderLines(layout);\n    }\n    renderDecorations(layout) {\n        if (this._renderDecorations) {\n            this._renderDecorations = false;\n            const selections = this._model.getSelections();\n            selections.sort(Range.compareRangesUsingStarts);\n            const decorations = this._model.getMinimapDecorationsInViewport(layout.startLineNumber, layout.endLineNumber);\n            decorations.sort((a, b) => (a.options.zIndex || 0) - (b.options.zIndex || 0));\n            const { canvasInnerWidth, canvasInnerHeight } = this._model.options;\n            const minimapLineHeight = this._model.options.minimapLineHeight;\n            const minimapCharWidth = this._model.options.minimapCharWidth;\n            const tabSize = this._model.getOptions().tabSize;\n            const canvasContext = this._decorationsCanvas.domNode.getContext('2d');\n            canvasContext.clearRect(0, 0, canvasInnerWidth, canvasInnerHeight);\n            // We first need to render line highlights and then render decorations on top of those.\n            // But we need to pick a single color for each line, and use that as a line highlight.\n            // This needs to be the color of the decoration with the highest `zIndex`, but priority\n            // is given to the selection.\n            const highlightedLines = new ContiguousLineMap(layout.startLineNumber, layout.endLineNumber, false);\n            this._renderSelectionLineHighlights(canvasContext, selections, highlightedLines, layout, minimapLineHeight);\n            this._renderDecorationsLineHighlights(canvasContext, decorations, highlightedLines, layout, minimapLineHeight);\n            const lineOffsetMap = new ContiguousLineMap(layout.startLineNumber, layout.endLineNumber, null);\n            this._renderSelectionsHighlights(canvasContext, selections, lineOffsetMap, layout, minimapLineHeight, tabSize, minimapCharWidth, canvasInnerWidth);\n            this._renderDecorationsHighlights(canvasContext, decorations, lineOffsetMap, layout, minimapLineHeight, tabSize, minimapCharWidth, canvasInnerWidth);\n            this._renderSectionHeaders(layout);\n        }\n    }\n    _renderSelectionLineHighlights(canvasContext, selections, highlightedLines, layout, minimapLineHeight) {\n        if (!this._selectionColor || this._selectionColor.isTransparent()) {\n            return;\n        }\n        canvasContext.fillStyle = this._selectionColor.transparent(0.5).toString();\n        let y1 = 0;\n        let y2 = 0;\n        for (const selection of selections) {\n            const intersection = layout.intersectWithViewport(selection);\n            if (!intersection) {\n                // entirely outside minimap's viewport\n                continue;\n            }\n            const [startLineNumber, endLineNumber] = intersection;\n            for (let line = startLineNumber; line <= endLineNumber; line++) {\n                highlightedLines.set(line, true);\n            }\n            const yy1 = layout.getYForLineNumber(startLineNumber, minimapLineHeight);\n            const yy2 = layout.getYForLineNumber(endLineNumber, minimapLineHeight);\n            if (y2 >= yy1) {\n                // merge into previous\n                y2 = yy2;\n            }\n            else {\n                if (y2 > y1) {\n                    // flush\n                    canvasContext.fillRect(MINIMAP_GUTTER_WIDTH, y1, canvasContext.canvas.width, y2 - y1);\n                }\n                y1 = yy1;\n                y2 = yy2;\n            }\n        }\n        if (y2 > y1) {\n            // flush\n            canvasContext.fillRect(MINIMAP_GUTTER_WIDTH, y1, canvasContext.canvas.width, y2 - y1);\n        }\n    }\n    _renderDecorationsLineHighlights(canvasContext, decorations, highlightedLines, layout, minimapLineHeight) {\n        const highlightColors = new Map();\n        // Loop backwards to hit first decorations with higher `zIndex`\n        for (let i = decorations.length - 1; i >= 0; i--) {\n            const decoration = decorations[i];\n            const minimapOptions = decoration.options.minimap;\n            if (!minimapOptions || minimapOptions.position !== 1 /* MinimapPosition.Inline */) {\n                continue;\n            }\n            const intersection = layout.intersectWithViewport(decoration.range);\n            if (!intersection) {\n                // entirely outside minimap's viewport\n                continue;\n            }\n            const [startLineNumber, endLineNumber] = intersection;\n            const decorationColor = minimapOptions.getColor(this._theme.value);\n            if (!decorationColor || decorationColor.isTransparent()) {\n                continue;\n            }\n            let highlightColor = highlightColors.get(decorationColor.toString());\n            if (!highlightColor) {\n                highlightColor = decorationColor.transparent(0.5).toString();\n                highlightColors.set(decorationColor.toString(), highlightColor);\n            }\n            canvasContext.fillStyle = highlightColor;\n            for (let line = startLineNumber; line <= endLineNumber; line++) {\n                if (highlightedLines.has(line)) {\n                    continue;\n                }\n                highlightedLines.set(line, true);\n                const y = layout.getYForLineNumber(startLineNumber, minimapLineHeight);\n                canvasContext.fillRect(MINIMAP_GUTTER_WIDTH, y, canvasContext.canvas.width, minimapLineHeight);\n            }\n        }\n    }\n    _renderSelectionsHighlights(canvasContext, selections, lineOffsetMap, layout, lineHeight, tabSize, characterWidth, canvasInnerWidth) {\n        if (!this._selectionColor || this._selectionColor.isTransparent()) {\n            return;\n        }\n        for (const selection of selections) {\n            const intersection = layout.intersectWithViewport(selection);\n            if (!intersection) {\n                // entirely outside minimap's viewport\n                continue;\n            }\n            const [startLineNumber, endLineNumber] = intersection;\n            for (let line = startLineNumber; line <= endLineNumber; line++) {\n                this.renderDecorationOnLine(canvasContext, lineOffsetMap, selection, this._selectionColor, layout, line, lineHeight, lineHeight, tabSize, characterWidth, canvasInnerWidth);\n            }\n        }\n    }\n    _renderDecorationsHighlights(canvasContext, decorations, lineOffsetMap, layout, minimapLineHeight, tabSize, characterWidth, canvasInnerWidth) {\n        // Loop forwards to hit first decorations with lower `zIndex`\n        for (const decoration of decorations) {\n            const minimapOptions = decoration.options.minimap;\n            if (!minimapOptions) {\n                continue;\n            }\n            const intersection = layout.intersectWithViewport(decoration.range);\n            if (!intersection) {\n                // entirely outside minimap's viewport\n                continue;\n            }\n            const [startLineNumber, endLineNumber] = intersection;\n            const decorationColor = minimapOptions.getColor(this._theme.value);\n            if (!decorationColor || decorationColor.isTransparent()) {\n                continue;\n            }\n            for (let line = startLineNumber; line <= endLineNumber; line++) {\n                switch (minimapOptions.position) {\n                    case 1 /* MinimapPosition.Inline */:\n                        this.renderDecorationOnLine(canvasContext, lineOffsetMap, decoration.range, decorationColor, layout, line, minimapLineHeight, minimapLineHeight, tabSize, characterWidth, canvasInnerWidth);\n                        continue;\n                    case 2 /* MinimapPosition.Gutter */: {\n                        const y = layout.getYForLineNumber(line, minimapLineHeight);\n                        const x = 2;\n                        this.renderDecoration(canvasContext, decorationColor, x, y, GUTTER_DECORATION_WIDTH, minimapLineHeight);\n                        continue;\n                    }\n                }\n            }\n        }\n    }\n    renderDecorationOnLine(canvasContext, lineOffsetMap, decorationRange, decorationColor, layout, lineNumber, height, minimapLineHeight, tabSize, charWidth, canvasInnerWidth) {\n        const y = layout.getYForLineNumber(lineNumber, minimapLineHeight);\n        // Skip rendering the line if it's vertically outside our viewport\n        if (y + height < 0 || y > this._model.options.canvasInnerHeight) {\n            return;\n        }\n        const { startLineNumber, endLineNumber } = decorationRange;\n        const startColumn = (startLineNumber === lineNumber ? decorationRange.startColumn : 1);\n        const endColumn = (endLineNumber === lineNumber ? decorationRange.endColumn : this._model.getLineMaxColumn(lineNumber));\n        const x1 = this.getXOffsetForPosition(lineOffsetMap, lineNumber, startColumn, tabSize, charWidth, canvasInnerWidth);\n        const x2 = this.getXOffsetForPosition(lineOffsetMap, lineNumber, endColumn, tabSize, charWidth, canvasInnerWidth);\n        this.renderDecoration(canvasContext, decorationColor, x1, y, x2 - x1, height);\n    }\n    getXOffsetForPosition(lineOffsetMap, lineNumber, column, tabSize, charWidth, canvasInnerWidth) {\n        if (column === 1) {\n            return MINIMAP_GUTTER_WIDTH;\n        }\n        const minimumXOffset = (column - 1) * charWidth;\n        if (minimumXOffset >= canvasInnerWidth) {\n            // there is no need to look at actual characters,\n            // as this column is certainly after the minimap width\n            return canvasInnerWidth;\n        }\n        // Cache line offset data so that it is only read once per line\n        let lineIndexToXOffset = lineOffsetMap.get(lineNumber);\n        if (!lineIndexToXOffset) {\n            const lineData = this._model.getLineContent(lineNumber);\n            lineIndexToXOffset = [MINIMAP_GUTTER_WIDTH];\n            let prevx = MINIMAP_GUTTER_WIDTH;\n            for (let i = 1; i < lineData.length + 1; i++) {\n                const charCode = lineData.charCodeAt(i - 1);\n                const dx = charCode === 9 /* CharCode.Tab */\n                    ? tabSize * charWidth\n                    : isFullWidthCharacter(charCode)\n                        ? 2 * charWidth\n                        : charWidth;\n                const x = prevx + dx;\n                if (x >= canvasInnerWidth) {\n                    // no need to keep on going, as we've hit the canvas width\n                    lineIndexToXOffset[i] = canvasInnerWidth;\n                    break;\n                }\n                lineIndexToXOffset[i] = x;\n                prevx = x;\n            }\n            lineOffsetMap.set(lineNumber, lineIndexToXOffset);\n        }\n        if (column - 1 < lineIndexToXOffset.length) {\n            return lineIndexToXOffset[column - 1];\n        }\n        // goes over the canvas width\n        return canvasInnerWidth;\n    }\n    renderDecoration(canvasContext, decorationColor, x, y, width, height) {\n        canvasContext.fillStyle = decorationColor && decorationColor.toString() || '';\n        canvasContext.fillRect(x, y, width, height);\n    }\n    _renderSectionHeaders(layout) {\n        const minimapLineHeight = this._model.options.minimapLineHeight;\n        const sectionHeaderFontSize = this._model.options.sectionHeaderFontSize;\n        const sectionHeaderLetterSpacing = this._model.options.sectionHeaderLetterSpacing;\n        const backgroundFillHeight = sectionHeaderFontSize * 1.5;\n        const { canvasInnerWidth } = this._model.options;\n        const backgroundColor = this._model.options.backgroundColor;\n        const backgroundFill = `rgb(${backgroundColor.r} ${backgroundColor.g} ${backgroundColor.b} / .7)`;\n        const foregroundColor = this._model.options.sectionHeaderFontColor;\n        const foregroundFill = `rgb(${foregroundColor.r} ${foregroundColor.g} ${foregroundColor.b})`;\n        const separatorStroke = foregroundFill;\n        const canvasContext = this._decorationsCanvas.domNode.getContext('2d');\n        canvasContext.letterSpacing = sectionHeaderLetterSpacing + 'px';\n        canvasContext.font = '500 ' + sectionHeaderFontSize + 'px ' + this._model.options.sectionHeaderFontFamily;\n        canvasContext.strokeStyle = separatorStroke;\n        canvasContext.lineWidth = 0.4;\n        const decorations = this._model.getSectionHeaderDecorationsInViewport(layout.startLineNumber, layout.endLineNumber);\n        decorations.sort((a, b) => a.range.startLineNumber - b.range.startLineNumber);\n        const fitWidth = InnerMinimap._fitSectionHeader.bind(null, canvasContext, canvasInnerWidth - MINIMAP_GUTTER_WIDTH);\n        for (const decoration of decorations) {\n            const y = layout.getYForLineNumber(decoration.range.startLineNumber, minimapLineHeight) + sectionHeaderFontSize;\n            const backgroundFillY = y - sectionHeaderFontSize;\n            const separatorY = backgroundFillY + 2;\n            const headerText = this._model.getSectionHeaderText(decoration, fitWidth);\n            InnerMinimap._renderSectionLabel(canvasContext, headerText, decoration.options.minimap?.sectionHeaderStyle === 2 /* MinimapSectionHeaderStyle.Underlined */, backgroundFill, foregroundFill, canvasInnerWidth, backgroundFillY, backgroundFillHeight, y, separatorY);\n        }\n    }\n    static _fitSectionHeader(target, maxWidth, headerText) {\n        if (!headerText) {\n            return headerText;\n        }\n        const ellipsis = '…';\n        const width = target.measureText(headerText).width;\n        const ellipsisWidth = target.measureText(ellipsis).width;\n        if (width <= maxWidth || width <= ellipsisWidth) {\n            return headerText;\n        }\n        const len = headerText.length;\n        const averageCharWidth = width / headerText.length;\n        const maxCharCount = Math.floor((maxWidth - ellipsisWidth) / averageCharWidth) - 1;\n        // Find a halfway point that isn't after whitespace\n        let halfCharCount = Math.ceil(maxCharCount / 2);\n        while (halfCharCount > 0 && /\\s/.test(headerText[halfCharCount - 1])) {\n            --halfCharCount;\n        }\n        // Split with ellipsis\n        return headerText.substring(0, halfCharCount)\n            + ellipsis + headerText.substring(len - (maxCharCount - halfCharCount));\n    }\n    static _renderSectionLabel(target, headerText, hasSeparatorLine, backgroundFill, foregroundFill, minimapWidth, backgroundFillY, backgroundFillHeight, textY, separatorY) {\n        if (headerText) {\n            target.fillStyle = backgroundFill;\n            target.fillRect(0, backgroundFillY, minimapWidth, backgroundFillHeight);\n            target.fillStyle = foregroundFill;\n            target.fillText(headerText, MINIMAP_GUTTER_WIDTH, textY);\n        }\n        if (hasSeparatorLine) {\n            target.beginPath();\n            target.moveTo(0, separatorY);\n            target.lineTo(minimapWidth, separatorY);\n            target.closePath();\n            target.stroke();\n        }\n    }\n    renderLines(layout) {\n        const startLineNumber = layout.startLineNumber;\n        const endLineNumber = layout.endLineNumber;\n        const minimapLineHeight = this._model.options.minimapLineHeight;\n        // Check if nothing changed w.r.t. lines from last frame\n        if (this._lastRenderData && this._lastRenderData.linesEquals(layout)) {\n            const _lastData = this._lastRenderData._get();\n            // Nice!! Nothing changed from last frame\n            return new RenderData(layout, _lastData.imageData, _lastData.lines);\n        }\n        // Oh well!! We need to repaint some lines...\n        const imageData = this._getBuffer();\n        if (!imageData) {\n            // 0 width or 0 height canvas, nothing to do\n            return null;\n        }\n        // Render untouched lines by using last rendered data.\n        const [_dirtyY1, _dirtyY2, needed] = InnerMinimap._renderUntouchedLines(imageData, layout.topPaddingLineCount, startLineNumber, endLineNumber, minimapLineHeight, this._lastRenderData);\n        // Fetch rendering info from view model for rest of lines that need rendering.\n        const lineInfo = this._model.getMinimapLinesRenderingData(startLineNumber, endLineNumber, needed);\n        const tabSize = this._model.getOptions().tabSize;\n        const defaultBackground = this._model.options.defaultBackgroundColor;\n        const background = this._model.options.backgroundColor;\n        const foregroundAlpha = this._model.options.foregroundAlpha;\n        const tokensColorTracker = this._model.tokensColorTracker;\n        const useLighterFont = tokensColorTracker.backgroundIsLight();\n        const renderMinimap = this._model.options.renderMinimap;\n        const charRenderer = this._model.options.charRenderer();\n        const fontScale = this._model.options.fontScale;\n        const minimapCharWidth = this._model.options.minimapCharWidth;\n        const baseCharHeight = (renderMinimap === 1 /* RenderMinimap.Text */ ? 2 /* Constants.BASE_CHAR_HEIGHT */ : 2 /* Constants.BASE_CHAR_HEIGHT */ + 1);\n        const renderMinimapLineHeight = baseCharHeight * fontScale;\n        const innerLinePadding = (minimapLineHeight > renderMinimapLineHeight ? Math.floor((minimapLineHeight - renderMinimapLineHeight) / 2) : 0);\n        // Render the rest of lines\n        const backgroundA = background.a / 255;\n        const renderBackground = new RGBA8(Math.round((background.r - defaultBackground.r) * backgroundA + defaultBackground.r), Math.round((background.g - defaultBackground.g) * backgroundA + defaultBackground.g), Math.round((background.b - defaultBackground.b) * backgroundA + defaultBackground.b), 255);\n        let dy = layout.topPaddingLineCount * minimapLineHeight;\n        const renderedLines = [];\n        for (let lineIndex = 0, lineCount = endLineNumber - startLineNumber + 1; lineIndex < lineCount; lineIndex++) {\n            if (needed[lineIndex]) {\n                InnerMinimap._renderLine(imageData, renderBackground, background.a, useLighterFont, renderMinimap, minimapCharWidth, tokensColorTracker, foregroundAlpha, charRenderer, dy, innerLinePadding, tabSize, lineInfo[lineIndex], fontScale, minimapLineHeight);\n            }\n            renderedLines[lineIndex] = new MinimapLine(dy);\n            dy += minimapLineHeight;\n        }\n        const dirtyY1 = (_dirtyY1 === -1 ? 0 : _dirtyY1);\n        const dirtyY2 = (_dirtyY2 === -1 ? imageData.height : _dirtyY2);\n        const dirtyHeight = dirtyY2 - dirtyY1;\n        // Finally, paint to the canvas\n        const ctx = this._canvas.domNode.getContext('2d');\n        ctx.putImageData(imageData, 0, 0, 0, dirtyY1, imageData.width, dirtyHeight);\n        // Save rendered data for reuse on next frame if possible\n        return new RenderData(layout, imageData, renderedLines);\n    }\n    static _renderUntouchedLines(target, topPaddingLineCount, startLineNumber, endLineNumber, minimapLineHeight, lastRenderData) {\n        const needed = [];\n        if (!lastRenderData) {\n            for (let i = 0, len = endLineNumber - startLineNumber + 1; i < len; i++) {\n                needed[i] = true;\n            }\n            return [-1, -1, needed];\n        }\n        const _lastData = lastRenderData._get();\n        const lastTargetData = _lastData.imageData.data;\n        const lastStartLineNumber = _lastData.rendLineNumberStart;\n        const lastLines = _lastData.lines;\n        const lastLinesLength = lastLines.length;\n        const WIDTH = target.width;\n        const targetData = target.data;\n        const maxDestPixel = (endLineNumber - startLineNumber + 1) * minimapLineHeight * WIDTH * 4;\n        let dirtyPixel1 = -1; // the pixel offset up to which all the data is equal to the prev frame\n        let dirtyPixel2 = -1; // the pixel offset after which all the data is equal to the prev frame\n        let copySourceStart = -1;\n        let copySourceEnd = -1;\n        let copyDestStart = -1;\n        let copyDestEnd = -1;\n        let dest_dy = topPaddingLineCount * minimapLineHeight;\n        for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n            const lineIndex = lineNumber - startLineNumber;\n            const lastLineIndex = lineNumber - lastStartLineNumber;\n            const source_dy = (lastLineIndex >= 0 && lastLineIndex < lastLinesLength ? lastLines[lastLineIndex].dy : -1);\n            if (source_dy === -1) {\n                needed[lineIndex] = true;\n                dest_dy += minimapLineHeight;\n                continue;\n            }\n            const sourceStart = source_dy * WIDTH * 4;\n            const sourceEnd = (source_dy + minimapLineHeight) * WIDTH * 4;\n            const destStart = dest_dy * WIDTH * 4;\n            const destEnd = (dest_dy + minimapLineHeight) * WIDTH * 4;\n            if (copySourceEnd === sourceStart && copyDestEnd === destStart) {\n                // contiguous zone => extend copy request\n                copySourceEnd = sourceEnd;\n                copyDestEnd = destEnd;\n            }\n            else {\n                if (copySourceStart !== -1) {\n                    // flush existing copy request\n                    targetData.set(lastTargetData.subarray(copySourceStart, copySourceEnd), copyDestStart);\n                    if (dirtyPixel1 === -1 && copySourceStart === 0 && copySourceStart === copyDestStart) {\n                        dirtyPixel1 = copySourceEnd;\n                    }\n                    if (dirtyPixel2 === -1 && copySourceEnd === maxDestPixel && copySourceStart === copyDestStart) {\n                        dirtyPixel2 = copySourceStart;\n                    }\n                }\n                copySourceStart = sourceStart;\n                copySourceEnd = sourceEnd;\n                copyDestStart = destStart;\n                copyDestEnd = destEnd;\n            }\n            needed[lineIndex] = false;\n            dest_dy += minimapLineHeight;\n        }\n        if (copySourceStart !== -1) {\n            // flush existing copy request\n            targetData.set(lastTargetData.subarray(copySourceStart, copySourceEnd), copyDestStart);\n            if (dirtyPixel1 === -1 && copySourceStart === 0 && copySourceStart === copyDestStart) {\n                dirtyPixel1 = copySourceEnd;\n            }\n            if (dirtyPixel2 === -1 && copySourceEnd === maxDestPixel && copySourceStart === copyDestStart) {\n                dirtyPixel2 = copySourceStart;\n            }\n        }\n        const dirtyY1 = (dirtyPixel1 === -1 ? -1 : dirtyPixel1 / (WIDTH * 4));\n        const dirtyY2 = (dirtyPixel2 === -1 ? -1 : dirtyPixel2 / (WIDTH * 4));\n        return [dirtyY1, dirtyY2, needed];\n    }\n    static _renderLine(target, backgroundColor, backgroundAlpha, useLighterFont, renderMinimap, charWidth, colorTracker, foregroundAlpha, minimapCharRenderer, dy, innerLinePadding, tabSize, lineData, fontScale, minimapLineHeight) {\n        const content = lineData.content;\n        const tokens = lineData.tokens;\n        const maxDx = target.width - charWidth;\n        const force1pxHeight = (minimapLineHeight === 1);\n        let dx = MINIMAP_GUTTER_WIDTH;\n        let charIndex = 0;\n        let tabsCharDelta = 0;\n        for (let tokenIndex = 0, tokensLen = tokens.getCount(); tokenIndex < tokensLen; tokenIndex++) {\n            const tokenEndIndex = tokens.getEndOffset(tokenIndex);\n            const tokenColorId = tokens.getForeground(tokenIndex);\n            const tokenColor = colorTracker.getColor(tokenColorId);\n            for (; charIndex < tokenEndIndex; charIndex++) {\n                if (dx > maxDx) {\n                    // hit edge of minimap\n                    return;\n                }\n                const charCode = content.charCodeAt(charIndex);\n                if (charCode === 9 /* CharCode.Tab */) {\n                    const insertSpacesCount = tabSize - (charIndex + tabsCharDelta) % tabSize;\n                    tabsCharDelta += insertSpacesCount - 1;\n                    // No need to render anything since tab is invisible\n                    dx += insertSpacesCount * charWidth;\n                }\n                else if (charCode === 32 /* CharCode.Space */) {\n                    // No need to render anything since space is invisible\n                    dx += charWidth;\n                }\n                else {\n                    // Render twice for a full width character\n                    const count = isFullWidthCharacter(charCode) ? 2 : 1;\n                    for (let i = 0; i < count; i++) {\n                        if (renderMinimap === 2 /* RenderMinimap.Blocks */) {\n                            minimapCharRenderer.blockRenderChar(target, dx, dy + innerLinePadding, tokenColor, foregroundAlpha, backgroundColor, backgroundAlpha, force1pxHeight);\n                        }\n                        else { // RenderMinimap.Text\n                            minimapCharRenderer.renderChar(target, dx, dy + innerLinePadding, charCode, tokenColor, foregroundAlpha, backgroundColor, backgroundAlpha, fontScale, useLighterFont, force1pxHeight);\n                        }\n                        dx += charWidth;\n                        if (dx > maxDx) {\n                            // hit edge of minimap\n                            return;\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\nclass ContiguousLineMap {\n    constructor(startLineNumber, endLineNumber, defaultValue) {\n        this._startLineNumber = startLineNumber;\n        this._endLineNumber = endLineNumber;\n        this._defaultValue = defaultValue;\n        this._values = [];\n        for (let i = 0, count = this._endLineNumber - this._startLineNumber + 1; i < count; i++) {\n            this._values[i] = defaultValue;\n        }\n    }\n    has(lineNumber) {\n        return (this.get(lineNumber) !== this._defaultValue);\n    }\n    set(lineNumber, value) {\n        if (lineNumber < this._startLineNumber || lineNumber > this._endLineNumber) {\n            return;\n        }\n        this._values[lineNumber - this._startLineNumber] = value;\n    }\n    get(lineNumber) {\n        if (lineNumber < this._startLineNumber || lineNumber > this._endLineNumber) {\n            return this._defaultValue;\n        }\n        return this._values[lineNumber - this._startLineNumber];\n    }\n}\n\nexport { Minimap };\n","import './overlayWidgets.css';\nimport { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport { ViewPart, PartFingerprints } from '../../view/viewPart.js';\nimport { getDomNodePagePosition } from '../../../../base/browser/dom.js';\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/*\n * This view part for rendering the overlay widgets, which are\n * floating widgets positioned based on the editor's viewport,\n * such as the find widget.\n */\nclass ViewOverlayWidgets extends ViewPart {\n    constructor(context, viewDomNode) {\n        super(context);\n        this._viewDomNode = viewDomNode;\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._widgets = {};\n        this._verticalScrollbarWidth = layoutInfo.verticalScrollbarWidth;\n        this._minimapWidth = layoutInfo.minimap.minimapWidth;\n        this._horizontalScrollbarHeight = layoutInfo.horizontalScrollbarHeight;\n        this._editorHeight = layoutInfo.height;\n        this._editorWidth = layoutInfo.width;\n        this._viewDomNodeRect = { top: 0, left: 0, width: 0, height: 0 };\n        this._domNode = createFastDomNode(document.createElement('div'));\n        PartFingerprints.write(this._domNode, 4 /* PartFingerprint.OverlayWidgets */);\n        this._domNode.setClassName('overlayWidgets');\n        this.overflowingOverlayWidgetsDomNode = createFastDomNode(document.createElement('div'));\n        PartFingerprints.write(this.overflowingOverlayWidgetsDomNode, 5 /* PartFingerprint.OverflowingOverlayWidgets */);\n        this.overflowingOverlayWidgetsDomNode.setClassName('overflowingOverlayWidgets');\n    }\n    dispose() {\n        super.dispose();\n        this._widgets = {};\n    }\n    getDomNode() {\n        return this._domNode;\n    }\n    // ---- begin view event handlers\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._verticalScrollbarWidth = layoutInfo.verticalScrollbarWidth;\n        this._minimapWidth = layoutInfo.minimap.minimapWidth;\n        this._horizontalScrollbarHeight = layoutInfo.horizontalScrollbarHeight;\n        this._editorHeight = layoutInfo.height;\n        this._editorWidth = layoutInfo.width;\n        return true;\n    }\n    // ---- end view event handlers\n    _widgetCanOverflow(widget) {\n        const options = this._context.configuration.options;\n        const allowOverflow = options.get(4 /* EditorOption.allowOverflow */);\n        return (widget.allowEditorOverflow || false) && allowOverflow;\n    }\n    addWidget(widget) {\n        const domNode = createFastDomNode(widget.getDomNode());\n        this._widgets[widget.getId()] = {\n            widget: widget,\n            preference: null,\n            domNode: domNode\n        };\n        // This is sync because a widget wants to be in the dom\n        domNode.setPosition('absolute');\n        domNode.setAttribute('widgetId', widget.getId());\n        if (this._widgetCanOverflow(widget)) {\n            this.overflowingOverlayWidgetsDomNode.appendChild(domNode);\n        }\n        else {\n            this._domNode.appendChild(domNode);\n        }\n        this.setShouldRender();\n        this._updateMaxMinWidth();\n    }\n    setWidgetPosition(widget, position) {\n        const widgetData = this._widgets[widget.getId()];\n        const preference = position ? position.preference : null;\n        const stack = position?.stackOridinal;\n        if (widgetData.preference === preference && widgetData.stack === stack) {\n            this._updateMaxMinWidth();\n            return false;\n        }\n        widgetData.preference = preference;\n        widgetData.stack = stack;\n        this.setShouldRender();\n        this._updateMaxMinWidth();\n        return true;\n    }\n    removeWidget(widget) {\n        const widgetId = widget.getId();\n        if (this._widgets.hasOwnProperty(widgetId)) {\n            const widgetData = this._widgets[widgetId];\n            const domNode = widgetData.domNode.domNode;\n            delete this._widgets[widgetId];\n            domNode.remove();\n            this.setShouldRender();\n            this._updateMaxMinWidth();\n        }\n    }\n    _updateMaxMinWidth() {\n        let maxMinWidth = 0;\n        const keys = Object.keys(this._widgets);\n        for (let i = 0, len = keys.length; i < len; i++) {\n            const widgetId = keys[i];\n            const widget = this._widgets[widgetId];\n            const widgetMinWidthInPx = widget.widget.getMinContentWidthInPx?.();\n            if (typeof widgetMinWidthInPx !== 'undefined') {\n                maxMinWidth = Math.max(maxMinWidth, widgetMinWidthInPx);\n            }\n        }\n        this._context.viewLayout.setOverlayWidgetsMinWidth(maxMinWidth);\n    }\n    _renderWidget(widgetData, stackCoordinates) {\n        const domNode = widgetData.domNode;\n        if (widgetData.preference === null) {\n            domNode.setTop('');\n            return;\n        }\n        const maxRight = (2 * this._verticalScrollbarWidth) + this._minimapWidth;\n        if (widgetData.preference === 0 /* OverlayWidgetPositionPreference.TOP_RIGHT_CORNER */ || widgetData.preference === 1 /* OverlayWidgetPositionPreference.BOTTOM_RIGHT_CORNER */) {\n            if (widgetData.preference === 1 /* OverlayWidgetPositionPreference.BOTTOM_RIGHT_CORNER */) {\n                const widgetHeight = domNode.domNode.clientHeight;\n                domNode.setTop((this._editorHeight - widgetHeight - 2 * this._horizontalScrollbarHeight));\n            }\n            else {\n                domNode.setTop(0);\n            }\n            if (widgetData.stack !== undefined) {\n                domNode.setTop(stackCoordinates[widgetData.preference]);\n                stackCoordinates[widgetData.preference] += domNode.domNode.clientWidth;\n            }\n            else {\n                domNode.setRight(maxRight);\n            }\n        }\n        else if (widgetData.preference === 2 /* OverlayWidgetPositionPreference.TOP_CENTER */) {\n            domNode.domNode.style.right = '50%';\n            if (widgetData.stack !== undefined) {\n                domNode.setTop(stackCoordinates[2 /* OverlayWidgetPositionPreference.TOP_CENTER */]);\n                stackCoordinates[2 /* OverlayWidgetPositionPreference.TOP_CENTER */] += domNode.domNode.clientHeight;\n            }\n            else {\n                domNode.setTop(0);\n            }\n        }\n        else {\n            const { top, left } = widgetData.preference;\n            const fixedOverflowWidgets = this._context.configuration.options.get(51 /* EditorOption.fixedOverflowWidgets */);\n            if (fixedOverflowWidgets && this._widgetCanOverflow(widgetData.widget)) {\n                // top, left are computed relative to the editor and we need them relative to the page\n                const editorBoundingBox = this._viewDomNodeRect;\n                domNode.setTop(top + editorBoundingBox.top);\n                domNode.setLeft(left + editorBoundingBox.left);\n                domNode.setPosition('fixed');\n            }\n            else {\n                domNode.setTop(top);\n                domNode.setLeft(left);\n                domNode.setPosition('absolute');\n            }\n        }\n    }\n    prepareRender(ctx) {\n        this._viewDomNodeRect = getDomNodePagePosition(this._viewDomNode.domNode);\n    }\n    render(ctx) {\n        this._domNode.setWidth(this._editorWidth);\n        const keys = Object.keys(this._widgets);\n        const stackCoordinates = Array.from({ length: 2 /* OverlayWidgetPositionPreference.TOP_CENTER */ + 1 }, () => 0);\n        keys.sort((a, b) => (this._widgets[a].stack || 0) - (this._widgets[b].stack || 0));\n        for (let i = 0, len = keys.length; i < len; i++) {\n            const widgetId = keys[i];\n            this._renderWidget(this._widgets[widgetId], stackCoordinates);\n        }\n    }\n}\n\nexport { ViewOverlayWidgets };\n","import { equals } from '../../base/common/arrays.js';\nimport { isBasicASCII, containsRTL } from '../../base/common/strings.js';\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 *--------------------------------------------------------------------------------------------*/\nclass Viewport {\n    constructor(top, left, width, height) {\n        this._viewportBrand = undefined;\n        this.top = top | 0;\n        this.left = left | 0;\n        this.width = width | 0;\n        this.height = height | 0;\n    }\n}\nclass MinimapLinesRenderingData {\n    constructor(tabSize, data) {\n        this.tabSize = tabSize;\n        this.data = data;\n    }\n}\nclass ViewLineData {\n    constructor(content, continuesWithWrappedLine, minColumn, maxColumn, startVisibleColumn, tokens, inlineDecorations) {\n        this._viewLineDataBrand = undefined;\n        this.content = content;\n        this.continuesWithWrappedLine = continuesWithWrappedLine;\n        this.minColumn = minColumn;\n        this.maxColumn = maxColumn;\n        this.startVisibleColumn = startVisibleColumn;\n        this.tokens = tokens;\n        this.inlineDecorations = inlineDecorations;\n    }\n}\nclass ViewLineRenderingData {\n    constructor(minColumn, maxColumn, content, continuesWithWrappedLine, mightContainRTL, mightContainNonBasicASCII, tokens, inlineDecorations, tabSize, startVisibleColumn, textDirection, hasVariableFonts) {\n        this.minColumn = minColumn;\n        this.maxColumn = maxColumn;\n        this.content = content;\n        this.continuesWithWrappedLine = continuesWithWrappedLine;\n        this.isBasicASCII = ViewLineRenderingData.isBasicASCII(content, mightContainNonBasicASCII);\n        this.containsRTL = ViewLineRenderingData.containsRTL(content, this.isBasicASCII, mightContainRTL);\n        this.tokens = tokens;\n        this.inlineDecorations = inlineDecorations;\n        this.tabSize = tabSize;\n        this.startVisibleColumn = startVisibleColumn;\n        this.textDirection = textDirection;\n        this.hasVariableFonts = hasVariableFonts;\n    }\n    static isBasicASCII(lineContent, mightContainNonBasicASCII) {\n        if (mightContainNonBasicASCII) {\n            return isBasicASCII(lineContent);\n        }\n        return true;\n    }\n    static containsRTL(lineContent, isBasicASCII, mightContainRTL) {\n        if (!isBasicASCII && mightContainRTL) {\n            return containsRTL(lineContent);\n        }\n        return false;\n    }\n}\nclass OverviewRulerDecorationsGroup {\n    constructor(color, zIndex, \n    /**\n     * Decorations are encoded in a number array using the following scheme:\n     *  - 3*i = lane\n     *  - 3*i+1 = startLineNumber\n     *  - 3*i+2 = endLineNumber\n     */\n    data) {\n        this.color = color;\n        this.zIndex = zIndex;\n        this.data = data;\n    }\n    static compareByRenderingProps(a, b) {\n        if (a.zIndex === b.zIndex) {\n            if (a.color < b.color) {\n                return -1;\n            }\n            if (a.color > b.color) {\n                return 1;\n            }\n            return 0;\n        }\n        return a.zIndex - b.zIndex;\n    }\n    static equals(a, b) {\n        return (a.color === b.color\n            && a.zIndex === b.zIndex\n            && equals(a.data, b.data));\n    }\n    static equalsArr(a, b) {\n        return equals(a, b, OverviewRulerDecorationsGroup.equals);\n    }\n}\n\nexport { MinimapLinesRenderingData, OverviewRulerDecorationsGroup, ViewLineData, ViewLineRenderingData, Viewport };\n","import { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport { Color } from '../../../../base/common/color.js';\nimport { ViewPart } from '../../view/viewPart.js';\nimport { Position } from '../../../common/core/position.js';\nimport { TokenizationRegistry } from '../../../common/languages.js';\nimport { editorOverviewRulerBorder, editorCursorForeground, editorMultiCursorPrimaryForeground, editorMultiCursorSecondaryForeground, editorOverviewRulerBackground } from '../../../common/core/editorColorRegistry.js';\nimport { OverviewRulerDecorationsGroup } from '../../../common/viewModel.js';\nimport { equals } from '../../../../base/common/arrays.js';\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 *--------------------------------------------------------------------------------------------*/\nclass Settings {\n    constructor(config, theme) {\n        const options = config.options;\n        this.lineHeight = options.get(75 /* EditorOption.lineHeight */);\n        this.pixelRatio = options.get(163 /* EditorOption.pixelRatio */);\n        this.overviewRulerLanes = options.get(95 /* EditorOption.overviewRulerLanes */);\n        this.renderBorder = options.get(94 /* EditorOption.overviewRulerBorder */);\n        const borderColor = theme.getColor(editorOverviewRulerBorder);\n        this.borderColor = borderColor ? borderColor.toString() : null;\n        this.hideCursor = options.get(68 /* EditorOption.hideCursorInOverviewRuler */);\n        const cursorColorSingle = theme.getColor(editorCursorForeground);\n        this.cursorColorSingle = cursorColorSingle ? cursorColorSingle.transparent(0.7).toString() : null;\n        const cursorColorPrimary = theme.getColor(editorMultiCursorPrimaryForeground);\n        this.cursorColorPrimary = cursorColorPrimary ? cursorColorPrimary.transparent(0.7).toString() : null;\n        const cursorColorSecondary = theme.getColor(editorMultiCursorSecondaryForeground);\n        this.cursorColorSecondary = cursorColorSecondary ? cursorColorSecondary.transparent(0.7).toString() : null;\n        this.themeType = theme.type;\n        const minimapOpts = options.get(81 /* EditorOption.minimap */);\n        const minimapEnabled = minimapOpts.enabled;\n        const minimapSide = minimapOpts.side;\n        const themeColor = theme.getColor(editorOverviewRulerBackground);\n        const defaultBackground = TokenizationRegistry.getDefaultBackground();\n        if (themeColor) {\n            this.backgroundColor = themeColor;\n        }\n        else if (minimapEnabled && minimapSide === 'right') {\n            this.backgroundColor = defaultBackground;\n        }\n        else {\n            this.backgroundColor = null;\n        }\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        const position = layoutInfo.overviewRuler;\n        this.top = position.top;\n        this.right = position.right;\n        this.domWidth = position.width;\n        this.domHeight = position.height;\n        if (this.overviewRulerLanes === 0) {\n            // overview ruler is off\n            this.canvasWidth = 0;\n            this.canvasHeight = 0;\n        }\n        else {\n            this.canvasWidth = (this.domWidth * this.pixelRatio) | 0;\n            this.canvasHeight = (this.domHeight * this.pixelRatio) | 0;\n        }\n        const [x, w] = this._initLanes(1, this.canvasWidth, this.overviewRulerLanes);\n        this.x = x;\n        this.w = w;\n    }\n    _initLanes(canvasLeftOffset, canvasWidth, laneCount) {\n        const remainingWidth = canvasWidth - canvasLeftOffset;\n        if (laneCount >= 3) {\n            const leftWidth = Math.floor(remainingWidth / 3);\n            const rightWidth = Math.floor(remainingWidth / 3);\n            const centerWidth = remainingWidth - leftWidth - rightWidth;\n            const leftOffset = canvasLeftOffset;\n            const centerOffset = leftOffset + leftWidth;\n            const rightOffset = leftOffset + leftWidth + centerWidth;\n            return [\n                [\n                    0,\n                    leftOffset, // Left\n                    centerOffset, // Center\n                    leftOffset, // Left | Center\n                    rightOffset, // Right\n                    leftOffset, // Left | Right\n                    centerOffset, // Center | Right\n                    leftOffset, // Left | Center | Right\n                ], [\n                    0,\n                    leftWidth, // Left\n                    centerWidth, // Center\n                    leftWidth + centerWidth, // Left | Center\n                    rightWidth, // Right\n                    leftWidth + centerWidth + rightWidth, // Left | Right\n                    centerWidth + rightWidth, // Center | Right\n                    leftWidth + centerWidth + rightWidth, // Left | Center | Right\n                ]\n            ];\n        }\n        else if (laneCount === 2) {\n            const leftWidth = Math.floor(remainingWidth / 2);\n            const rightWidth = remainingWidth - leftWidth;\n            const leftOffset = canvasLeftOffset;\n            const rightOffset = leftOffset + leftWidth;\n            return [\n                [\n                    0,\n                    leftOffset, // Left\n                    leftOffset, // Center\n                    leftOffset, // Left | Center\n                    rightOffset, // Right\n                    leftOffset, // Left | Right\n                    leftOffset, // Center | Right\n                    leftOffset, // Left | Center | Right\n                ], [\n                    0,\n                    leftWidth, // Left\n                    leftWidth, // Center\n                    leftWidth, // Left | Center\n                    rightWidth, // Right\n                    leftWidth + rightWidth, // Left | Right\n                    leftWidth + rightWidth, // Center | Right\n                    leftWidth + rightWidth, // Left | Center | Right\n                ]\n            ];\n        }\n        else {\n            const offset = canvasLeftOffset;\n            const width = remainingWidth;\n            return [\n                [\n                    0,\n                    offset, // Left\n                    offset, // Center\n                    offset, // Left | Center\n                    offset, // Right\n                    offset, // Left | Right\n                    offset, // Center | Right\n                    offset, // Left | Center | Right\n                ], [\n                    0,\n                    width, // Left\n                    width, // Center\n                    width, // Left | Center\n                    width, // Right\n                    width, // Left | Right\n                    width, // Center | Right\n                    width, // Left | Center | Right\n                ]\n            ];\n        }\n    }\n    equals(other) {\n        return (this.lineHeight === other.lineHeight\n            && this.pixelRatio === other.pixelRatio\n            && this.overviewRulerLanes === other.overviewRulerLanes\n            && this.renderBorder === other.renderBorder\n            && this.borderColor === other.borderColor\n            && this.hideCursor === other.hideCursor\n            && this.cursorColorSingle === other.cursorColorSingle\n            && this.cursorColorPrimary === other.cursorColorPrimary\n            && this.cursorColorSecondary === other.cursorColorSecondary\n            && this.themeType === other.themeType\n            && Color.equals(this.backgroundColor, other.backgroundColor)\n            && this.top === other.top\n            && this.right === other.right\n            && this.domWidth === other.domWidth\n            && this.domHeight === other.domHeight\n            && this.canvasWidth === other.canvasWidth\n            && this.canvasHeight === other.canvasHeight);\n    }\n}\nclass DecorationsOverviewRuler extends ViewPart {\n    constructor(context) {\n        super(context);\n        this._actualShouldRender = 0 /* ShouldRenderValue.NotNeeded */;\n        this._renderedDecorations = [];\n        this._renderedCursorPositions = [];\n        this._domNode = createFastDomNode(document.createElement('canvas'));\n        this._domNode.setClassName('decorationsOverviewRuler');\n        this._domNode.setPosition('absolute');\n        this._domNode.setLayerHinting(true);\n        this._domNode.setContain('strict');\n        this._domNode.setAttribute('aria-hidden', 'true');\n        this._updateSettings(false);\n        this._tokensColorTrackerListener = TokenizationRegistry.onDidChange((e) => {\n            if (e.changedColorMap) {\n                this._updateSettings(true);\n            }\n        });\n        this._cursorPositions = [{ position: new Position(1, 1), color: this._settings.cursorColorSingle }];\n    }\n    dispose() {\n        super.dispose();\n        this._tokensColorTrackerListener.dispose();\n    }\n    _updateSettings(renderNow) {\n        const newSettings = new Settings(this._context.configuration, this._context.theme);\n        if (this._settings && this._settings.equals(newSettings)) {\n            // nothing to do\n            return false;\n        }\n        this._settings = newSettings;\n        this._domNode.setTop(this._settings.top);\n        this._domNode.setRight(this._settings.right);\n        this._domNode.setWidth(this._settings.domWidth);\n        this._domNode.setHeight(this._settings.domHeight);\n        this._domNode.domNode.width = this._settings.canvasWidth;\n        this._domNode.domNode.height = this._settings.canvasHeight;\n        if (renderNow) {\n            this._render();\n        }\n        return true;\n    }\n    // ---- begin view event handlers\n    _markRenderingIsNeeded() {\n        this._actualShouldRender = 2 /* ShouldRenderValue.Needed */;\n        return true;\n    }\n    _markRenderingIsMaybeNeeded() {\n        this._actualShouldRender = 1 /* ShouldRenderValue.Maybe */;\n        return true;\n    }\n    onConfigurationChanged(e) {\n        return this._updateSettings(false) ? this._markRenderingIsNeeded() : false;\n    }\n    onCursorStateChanged(e) {\n        this._cursorPositions = [];\n        for (let i = 0, len = e.selections.length; i < len; i++) {\n            let color = this._settings.cursorColorSingle;\n            if (len > 1) {\n                color = i === 0 ? this._settings.cursorColorPrimary : this._settings.cursorColorSecondary;\n            }\n            this._cursorPositions.push({ position: e.selections[i].getPosition(), color });\n        }\n        this._cursorPositions.sort((a, b) => Position.compare(a.position, b.position));\n        return this._markRenderingIsMaybeNeeded();\n    }\n    onDecorationsChanged(e) {\n        if (e.affectsOverviewRuler) {\n            return this._markRenderingIsMaybeNeeded();\n        }\n        return false;\n    }\n    onFlushed(e) {\n        return this._markRenderingIsNeeded();\n    }\n    onScrollChanged(e) {\n        return e.scrollHeightChanged ? this._markRenderingIsNeeded() : false;\n    }\n    onZonesChanged(e) {\n        return this._markRenderingIsNeeded();\n    }\n    onThemeChanged(e) {\n        return this._updateSettings(false) ? this._markRenderingIsNeeded() : false;\n    }\n    // ---- end view event handlers\n    getDomNode() {\n        return this._domNode.domNode;\n    }\n    prepareRender(ctx) {\n        // Nothing to read\n    }\n    render(editorCtx) {\n        this._render();\n        this._actualShouldRender = 0 /* ShouldRenderValue.NotNeeded */;\n    }\n    _render() {\n        const backgroundColor = this._settings.backgroundColor;\n        if (this._settings.overviewRulerLanes === 0) {\n            // overview ruler is off\n            this._domNode.setBackgroundColor(backgroundColor ? Color.Format.CSS.formatHexA(backgroundColor) : '');\n            this._domNode.setDisplay('none');\n            return;\n        }\n        const decorations = this._context.viewModel.getAllOverviewRulerDecorations(this._context.theme);\n        decorations.sort(OverviewRulerDecorationsGroup.compareByRenderingProps);\n        if (this._actualShouldRender === 1 /* ShouldRenderValue.Maybe */ && !OverviewRulerDecorationsGroup.equalsArr(this._renderedDecorations, decorations)) {\n            this._actualShouldRender = 2 /* ShouldRenderValue.Needed */;\n        }\n        if (this._actualShouldRender === 1 /* ShouldRenderValue.Maybe */ && !equals(this._renderedCursorPositions, this._cursorPositions, (a, b) => a.position.lineNumber === b.position.lineNumber && a.color === b.color)) {\n            this._actualShouldRender = 2 /* ShouldRenderValue.Needed */;\n        }\n        if (this._actualShouldRender === 1 /* ShouldRenderValue.Maybe */) {\n            // both decorations and cursor positions are unchanged, nothing to do\n            return;\n        }\n        this._renderedDecorations = decorations;\n        this._renderedCursorPositions = this._cursorPositions;\n        this._domNode.setDisplay('block');\n        const canvasWidth = this._settings.canvasWidth;\n        const canvasHeight = this._settings.canvasHeight;\n        const lineHeight = this._settings.lineHeight;\n        const viewLayout = this._context.viewLayout;\n        const outerHeight = this._context.viewLayout.getScrollHeight();\n        const heightRatio = canvasHeight / outerHeight;\n        const minDecorationHeight = (6 /* Constants.MIN_DECORATION_HEIGHT */ * this._settings.pixelRatio) | 0;\n        const halfMinDecorationHeight = (minDecorationHeight / 2) | 0;\n        const canvasCtx = this._domNode.domNode.getContext('2d');\n        if (backgroundColor) {\n            if (backgroundColor.isOpaque()) {\n                // We have a background color which is opaque, we can just paint the entire surface with it\n                canvasCtx.fillStyle = Color.Format.CSS.formatHexA(backgroundColor);\n                canvasCtx.fillRect(0, 0, canvasWidth, canvasHeight);\n            }\n            else {\n                // We have a background color which is transparent, we need to first clear the surface and\n                // then fill it\n                canvasCtx.clearRect(0, 0, canvasWidth, canvasHeight);\n                canvasCtx.fillStyle = Color.Format.CSS.formatHexA(backgroundColor);\n                canvasCtx.fillRect(0, 0, canvasWidth, canvasHeight);\n            }\n        }\n        else {\n            // We don't have a background color\n            canvasCtx.clearRect(0, 0, canvasWidth, canvasHeight);\n        }\n        const x = this._settings.x;\n        const w = this._settings.w;\n        for (const decorationGroup of decorations) {\n            const color = decorationGroup.color;\n            const decorationGroupData = decorationGroup.data;\n            canvasCtx.fillStyle = color;\n            let prevLane = 0;\n            let prevY1 = 0;\n            let prevY2 = 0;\n            for (let i = 0, len = decorationGroupData.length / 3; i < len; i++) {\n                const lane = decorationGroupData[3 * i];\n                const startLineNumber = decorationGroupData[3 * i + 1];\n                const endLineNumber = decorationGroupData[3 * i + 2];\n                let y1 = (viewLayout.getVerticalOffsetForLineNumber(startLineNumber) * heightRatio) | 0;\n                let y2 = ((viewLayout.getVerticalOffsetForLineNumber(endLineNumber) + lineHeight) * heightRatio) | 0;\n                const height = y2 - y1;\n                if (height < minDecorationHeight) {\n                    let yCenter = ((y1 + y2) / 2) | 0;\n                    if (yCenter < halfMinDecorationHeight) {\n                        yCenter = halfMinDecorationHeight;\n                    }\n                    else if (yCenter + halfMinDecorationHeight > canvasHeight) {\n                        yCenter = canvasHeight - halfMinDecorationHeight;\n                    }\n                    y1 = yCenter - halfMinDecorationHeight;\n                    y2 = yCenter + halfMinDecorationHeight;\n                }\n                if (y1 > prevY2 + 1 || lane !== prevLane) {\n                    // flush prev\n                    if (i !== 0) {\n                        canvasCtx.fillRect(x[prevLane], prevY1, w[prevLane], prevY2 - prevY1);\n                    }\n                    prevLane = lane;\n                    prevY1 = y1;\n                    prevY2 = y2;\n                }\n                else {\n                    // merge into prev\n                    if (y2 > prevY2) {\n                        prevY2 = y2;\n                    }\n                }\n            }\n            canvasCtx.fillRect(x[prevLane], prevY1, w[prevLane], prevY2 - prevY1);\n        }\n        // Draw cursors\n        if (!this._settings.hideCursor) {\n            const cursorHeight = (2 * this._settings.pixelRatio) | 0;\n            const halfCursorHeight = (cursorHeight / 2) | 0;\n            const cursorX = this._settings.x[7 /* OverviewRulerLane.Full */];\n            const cursorW = this._settings.w[7 /* OverviewRulerLane.Full */];\n            let prevY1 = -100;\n            let prevY2 = -100;\n            let prevColor = null;\n            for (let i = 0, len = this._cursorPositions.length; i < len; i++) {\n                const color = this._cursorPositions[i].color;\n                if (!color) {\n                    continue;\n                }\n                const cursor = this._cursorPositions[i].position;\n                let yCenter = (viewLayout.getVerticalOffsetForLineNumber(cursor.lineNumber) * heightRatio) | 0;\n                if (yCenter < halfCursorHeight) {\n                    yCenter = halfCursorHeight;\n                }\n                else if (yCenter + halfCursorHeight > canvasHeight) {\n                    yCenter = canvasHeight - halfCursorHeight;\n                }\n                const y1 = yCenter - halfCursorHeight;\n                const y2 = y1 + cursorHeight;\n                if (y1 > prevY2 + 1 || color !== prevColor) {\n                    // flush prev\n                    if (i !== 0 && prevColor) {\n                        canvasCtx.fillRect(cursorX, prevY1, cursorW, prevY2 - prevY1);\n                    }\n                    prevY1 = y1;\n                    prevY2 = y2;\n                }\n                else {\n                    // merge into prev\n                    if (y2 > prevY2) {\n                        prevY2 = y2;\n                    }\n                }\n                prevColor = color;\n                canvasCtx.fillStyle = color;\n            }\n            if (prevColor) {\n                canvasCtx.fillRect(cursorX, prevY1, cursorW, prevY2 - prevY1);\n            }\n        }\n        if (this._settings.renderBorder && this._settings.borderColor && this._settings.overviewRulerLanes > 0) {\n            canvasCtx.beginPath();\n            canvasCtx.lineWidth = 1;\n            canvasCtx.strokeStyle = this._settings.borderColor;\n            canvasCtx.moveTo(0, 0);\n            canvasCtx.lineTo(0, canvasHeight);\n            canvasCtx.moveTo(1, 0);\n            canvasCtx.lineTo(canvasWidth, 0);\n            canvasCtx.stroke();\n        }\n    }\n}\n\nexport { DecorationsOverviewRuler };\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 *--------------------------------------------------------------------------------------------*/\nclass ColorZone {\n    constructor(from, to, colorId) {\n        this._colorZoneBrand = undefined;\n        this.from = from | 0;\n        this.to = to | 0;\n        this.colorId = colorId | 0;\n    }\n    static compare(a, b) {\n        if (a.colorId === b.colorId) {\n            if (a.from === b.from) {\n                return a.to - b.to;\n            }\n            return a.from - b.from;\n        }\n        return a.colorId - b.colorId;\n    }\n}\n/**\n * A zone in the overview ruler\n */\nclass OverviewRulerZone {\n    constructor(startLineNumber, endLineNumber, heightInLines, color) {\n        this._overviewRulerZoneBrand = undefined;\n        this.startLineNumber = startLineNumber;\n        this.endLineNumber = endLineNumber;\n        this.heightInLines = heightInLines;\n        this.color = color;\n        this._colorZone = null;\n    }\n    static compare(a, b) {\n        if (a.color === b.color) {\n            if (a.startLineNumber === b.startLineNumber) {\n                if (a.heightInLines === b.heightInLines) {\n                    return a.endLineNumber - b.endLineNumber;\n                }\n                return a.heightInLines - b.heightInLines;\n            }\n            return a.startLineNumber - b.startLineNumber;\n        }\n        return a.color < b.color ? -1 : 1;\n    }\n    setColorZone(colorZone) {\n        this._colorZone = colorZone;\n    }\n    getColorZones() {\n        return this._colorZone;\n    }\n}\nclass OverviewZoneManager {\n    constructor(getVerticalOffsetForLine) {\n        this._getVerticalOffsetForLine = getVerticalOffsetForLine;\n        this._zones = [];\n        this._colorZonesInvalid = false;\n        this._lineHeight = 0;\n        this._domWidth = 0;\n        this._domHeight = 0;\n        this._outerHeight = 0;\n        this._pixelRatio = 1;\n        this._lastAssignedId = 0;\n        this._color2Id = Object.create(null);\n        this._id2Color = [];\n    }\n    getId2Color() {\n        return this._id2Color;\n    }\n    setZones(newZones) {\n        this._zones = newZones;\n        this._zones.sort(OverviewRulerZone.compare);\n    }\n    setLineHeight(lineHeight) {\n        if (this._lineHeight === lineHeight) {\n            return false;\n        }\n        this._lineHeight = lineHeight;\n        this._colorZonesInvalid = true;\n        return true;\n    }\n    setPixelRatio(pixelRatio) {\n        this._pixelRatio = pixelRatio;\n        this._colorZonesInvalid = true;\n    }\n    getDOMWidth() {\n        return this._domWidth;\n    }\n    getCanvasWidth() {\n        return this._domWidth * this._pixelRatio;\n    }\n    setDOMWidth(width) {\n        if (this._domWidth === width) {\n            return false;\n        }\n        this._domWidth = width;\n        this._colorZonesInvalid = true;\n        return true;\n    }\n    getDOMHeight() {\n        return this._domHeight;\n    }\n    getCanvasHeight() {\n        return this._domHeight * this._pixelRatio;\n    }\n    setDOMHeight(height) {\n        if (this._domHeight === height) {\n            return false;\n        }\n        this._domHeight = height;\n        this._colorZonesInvalid = true;\n        return true;\n    }\n    getOuterHeight() {\n        return this._outerHeight;\n    }\n    setOuterHeight(outerHeight) {\n        if (this._outerHeight === outerHeight) {\n            return false;\n        }\n        this._outerHeight = outerHeight;\n        this._colorZonesInvalid = true;\n        return true;\n    }\n    resolveColorZones() {\n        const colorZonesInvalid = this._colorZonesInvalid;\n        const lineHeight = Math.floor(this._lineHeight);\n        const totalHeight = Math.floor(this.getCanvasHeight());\n        const outerHeight = Math.floor(this._outerHeight);\n        const heightRatio = totalHeight / outerHeight;\n        const halfMinimumHeight = Math.floor(4 /* Constants.MINIMUM_HEIGHT */ * this._pixelRatio / 2);\n        const allColorZones = [];\n        for (let i = 0, len = this._zones.length; i < len; i++) {\n            const zone = this._zones[i];\n            if (!colorZonesInvalid) {\n                const colorZone = zone.getColorZones();\n                if (colorZone) {\n                    allColorZones.push(colorZone);\n                    continue;\n                }\n            }\n            const offset1 = this._getVerticalOffsetForLine(zone.startLineNumber);\n            const offset2 = (zone.heightInLines === 0\n                ? this._getVerticalOffsetForLine(zone.endLineNumber) + lineHeight\n                : offset1 + zone.heightInLines * lineHeight);\n            const y1 = Math.floor(heightRatio * offset1);\n            const y2 = Math.floor(heightRatio * offset2);\n            let ycenter = Math.floor((y1 + y2) / 2);\n            let halfHeight = (y2 - ycenter);\n            if (halfHeight < halfMinimumHeight) {\n                halfHeight = halfMinimumHeight;\n            }\n            if (ycenter - halfHeight < 0) {\n                ycenter = halfHeight;\n            }\n            if (ycenter + halfHeight > totalHeight) {\n                ycenter = totalHeight - halfHeight;\n            }\n            const color = zone.color;\n            let colorId = this._color2Id[color];\n            if (!colorId) {\n                colorId = (++this._lastAssignedId);\n                this._color2Id[color] = colorId;\n                this._id2Color[colorId] = color;\n            }\n            const colorZone = new ColorZone(ycenter - halfHeight, ycenter + halfHeight, colorId);\n            zone.setColorZone(colorZone);\n            allColorZones.push(colorZone);\n        }\n        this._colorZonesInvalid = false;\n        allColorZones.sort(ColorZone.compare);\n        return allColorZones;\n    }\n}\n\nexport { ColorZone, OverviewRulerZone, OverviewZoneManager };\n","import { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport { OverviewZoneManager } from '../../../common/viewModel/overviewZoneManager.js';\nimport { ViewEventHandler } from '../../../common/viewEventHandler.js';\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/**\n * The overview ruler appears underneath the editor scroll bar and shows things\n * like the cursor, various decorations, etc.\n */\nclass OverviewRuler extends ViewEventHandler {\n    constructor(context, cssClassName) {\n        super();\n        this._context = context;\n        const options = this._context.configuration.options;\n        this._domNode = createFastDomNode(document.createElement('canvas'));\n        this._domNode.setClassName(cssClassName);\n        this._domNode.setPosition('absolute');\n        this._domNode.setLayerHinting(true);\n        this._domNode.setContain('strict');\n        this._zoneManager = new OverviewZoneManager((lineNumber) => this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber));\n        this._zoneManager.setDOMWidth(0);\n        this._zoneManager.setDOMHeight(0);\n        this._zoneManager.setOuterHeight(this._context.viewLayout.getScrollHeight());\n        this._zoneManager.setLineHeight(options.get(75 /* EditorOption.lineHeight */));\n        this._zoneManager.setPixelRatio(options.get(163 /* EditorOption.pixelRatio */));\n        this._context.addEventHandler(this);\n    }\n    dispose() {\n        this._context.removeEventHandler(this);\n        super.dispose();\n    }\n    // ---- begin view event handlers\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        if (e.hasChanged(75 /* EditorOption.lineHeight */)) {\n            this._zoneManager.setLineHeight(options.get(75 /* EditorOption.lineHeight */));\n            this._render();\n        }\n        if (e.hasChanged(163 /* EditorOption.pixelRatio */)) {\n            this._zoneManager.setPixelRatio(options.get(163 /* EditorOption.pixelRatio */));\n            this._domNode.setWidth(this._zoneManager.getDOMWidth());\n            this._domNode.setHeight(this._zoneManager.getDOMHeight());\n            this._domNode.domNode.width = this._zoneManager.getCanvasWidth();\n            this._domNode.domNode.height = this._zoneManager.getCanvasHeight();\n            this._render();\n        }\n        return true;\n    }\n    onFlushed(e) {\n        this._render();\n        return true;\n    }\n    onScrollChanged(e) {\n        if (e.scrollHeightChanged) {\n            this._zoneManager.setOuterHeight(e.scrollHeight);\n            this._render();\n        }\n        return true;\n    }\n    onZonesChanged(e) {\n        this._render();\n        return true;\n    }\n    // ---- end view event handlers\n    getDomNode() {\n        return this._domNode.domNode;\n    }\n    setLayout(position) {\n        this._domNode.setTop(position.top);\n        this._domNode.setRight(position.right);\n        let hasChanged = false;\n        hasChanged = this._zoneManager.setDOMWidth(position.width) || hasChanged;\n        hasChanged = this._zoneManager.setDOMHeight(position.height) || hasChanged;\n        if (hasChanged) {\n            this._domNode.setWidth(this._zoneManager.getDOMWidth());\n            this._domNode.setHeight(this._zoneManager.getDOMHeight());\n            this._domNode.domNode.width = this._zoneManager.getCanvasWidth();\n            this._domNode.domNode.height = this._zoneManager.getCanvasHeight();\n            this._render();\n        }\n    }\n    setZones(zones) {\n        this._zoneManager.setZones(zones);\n        this._render();\n    }\n    _render() {\n        if (this._zoneManager.getOuterHeight() === 0) {\n            return false;\n        }\n        const width = this._zoneManager.getCanvasWidth();\n        const height = this._zoneManager.getCanvasHeight();\n        const colorZones = this._zoneManager.resolveColorZones();\n        const id2Color = this._zoneManager.getId2Color();\n        const ctx = this._domNode.domNode.getContext('2d');\n        ctx.clearRect(0, 0, width, height);\n        if (colorZones.length > 0) {\n            this._renderOneLane(ctx, colorZones, id2Color, width);\n        }\n        return true;\n    }\n    _renderOneLane(ctx, colorZones, id2Color, width) {\n        let currentColorId = 0;\n        let currentFrom = 0;\n        let currentTo = 0;\n        for (const zone of colorZones) {\n            const zoneColorId = zone.colorId;\n            const zoneFrom = zone.from;\n            const zoneTo = zone.to;\n            if (zoneColorId !== currentColorId) {\n                ctx.fillRect(0, currentFrom, width, currentTo - currentFrom);\n                currentColorId = zoneColorId;\n                ctx.fillStyle = id2Color[currentColorId];\n                currentFrom = zoneFrom;\n                currentTo = zoneTo;\n            }\n            else {\n                if (currentTo >= zoneFrom) {\n                    currentTo = Math.max(currentTo, zoneTo);\n                }\n                else {\n                    ctx.fillRect(0, currentFrom, width, currentTo - currentFrom);\n                    currentFrom = zoneFrom;\n                    currentTo = zoneTo;\n                }\n            }\n        }\n        ctx.fillRect(0, currentFrom, width, currentTo - currentFrom);\n    }\n}\n\nexport { OverviewRuler };\n","import './rulers.css';\nimport { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport { ViewPart } from '../../view/viewPart.js';\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/**\n * Rulers are vertical lines that appear at certain columns in the editor. There can be >= 0 rulers\n * at a time.\n */\nclass Rulers extends ViewPart {\n    constructor(context) {\n        super(context);\n        this.domNode = createFastDomNode(document.createElement('div'));\n        this.domNode.setAttribute('role', 'presentation');\n        this.domNode.setAttribute('aria-hidden', 'true');\n        this.domNode.setClassName('view-rulers');\n        this._renderedRulers = [];\n        const options = this._context.configuration.options;\n        this._rulers = options.get(116 /* EditorOption.rulers */);\n        this._typicalHalfwidthCharacterWidth = options.get(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;\n    }\n    dispose() {\n        super.dispose();\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        this._rulers = options.get(116 /* EditorOption.rulers */);\n        this._typicalHalfwidthCharacterWidth = options.get(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;\n        return true;\n    }\n    onScrollChanged(e) {\n        return e.scrollHeightChanged;\n    }\n    // --- end event handlers\n    prepareRender(ctx) {\n        // Nothing to read\n    }\n    _ensureRulersCount() {\n        const currentCount = this._renderedRulers.length;\n        const desiredCount = this._rulers.length;\n        if (currentCount === desiredCount) {\n            // Nothing to do\n            return;\n        }\n        if (currentCount < desiredCount) {\n            const { tabSize } = this._context.viewModel.model.getOptions();\n            const rulerWidth = tabSize;\n            let addCount = desiredCount - currentCount;\n            while (addCount > 0) {\n                const node = createFastDomNode(document.createElement('div'));\n                node.setClassName('view-ruler');\n                node.setWidth(rulerWidth);\n                this.domNode.appendChild(node);\n                this._renderedRulers.push(node);\n                addCount--;\n            }\n            return;\n        }\n        let removeCount = currentCount - desiredCount;\n        while (removeCount > 0) {\n            const node = this._renderedRulers.pop();\n            this.domNode.removeChild(node);\n            removeCount--;\n        }\n    }\n    render(ctx) {\n        this._ensureRulersCount();\n        for (let i = 0, len = this._rulers.length; i < len; i++) {\n            const node = this._renderedRulers[i];\n            const ruler = this._rulers[i];\n            node.setBoxShadow(ruler.color ? `1px 0 0 0 ${ruler.color} inset` : ``);\n            node.setHeight(Math.min(ctx.scrollHeight, 1000000));\n            node.setLeft(ruler.column * this._typicalHalfwidthCharacterWidth);\n        }\n    }\n}\n\nexport { Rulers };\n","import './scrollDecoration.css';\nimport { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport { ViewPart } from '../../view/viewPart.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ScrollDecorationViewPart extends ViewPart {\n    constructor(context) {\n        super(context);\n        this._scrollTop = 0;\n        this._width = 0;\n        this._updateWidth();\n        this._shouldShow = false;\n        const options = this._context.configuration.options;\n        const scrollbar = options.get(117 /* EditorOption.scrollbar */);\n        this._useShadows = scrollbar.useShadows;\n        this._domNode = createFastDomNode(document.createElement('div'));\n        this._domNode.setAttribute('role', 'presentation');\n        this._domNode.setAttribute('aria-hidden', 'true');\n    }\n    dispose() {\n        super.dispose();\n    }\n    _updateShouldShow() {\n        const newShouldShow = (this._useShadows && this._scrollTop > 0);\n        if (this._shouldShow !== newShouldShow) {\n            this._shouldShow = newShouldShow;\n            return true;\n        }\n        return false;\n    }\n    getDomNode() {\n        return this._domNode;\n    }\n    _updateWidth() {\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        if (layoutInfo.minimap.renderMinimap === 0 || (layoutInfo.minimap.minimapWidth > 0 && layoutInfo.minimap.minimapLeft === 0)) {\n            this._width = layoutInfo.width;\n        }\n        else {\n            this._width = layoutInfo.width - layoutInfo.verticalScrollbarWidth;\n        }\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        const scrollbar = options.get(117 /* EditorOption.scrollbar */);\n        this._useShadows = scrollbar.useShadows;\n        this._updateWidth();\n        this._updateShouldShow();\n        return true;\n    }\n    onScrollChanged(e) {\n        this._scrollTop = e.scrollTop;\n        return this._updateShouldShow();\n    }\n    // --- end event handlers\n    prepareRender(ctx) {\n        // Nothing to read\n    }\n    render(ctx) {\n        this._domNode.setWidth(this._width);\n        this._domNode.setClassName(this._shouldShow ? 'scroll-decoration' : '');\n    }\n}\n\nexport { ScrollDecorationViewPart };\n","import './selections.css';\nimport { DynamicViewOverlay } from '../../view/dynamicViewOverlay.js';\nimport '../../../../platform/theme/common/colorUtils.js';\nimport '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorSelectionForeground } from '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { registerThemingParticipant } from '../../../../platform/theme/common/themeService.js';\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 *--------------------------------------------------------------------------------------------*/\nclass HorizontalRangeWithStyle {\n    constructor(other) {\n        this.left = other.left;\n        this.width = other.width;\n        this.startStyle = null;\n        this.endStyle = null;\n    }\n}\nclass LineVisibleRangesWithStyle {\n    constructor(lineNumber, ranges) {\n        this.lineNumber = lineNumber;\n        this.ranges = ranges;\n    }\n}\nfunction toStyledRange(item) {\n    return new HorizontalRangeWithStyle(item);\n}\nfunction toStyled(item) {\n    return new LineVisibleRangesWithStyle(item.lineNumber, item.ranges.map(toStyledRange));\n}\n/**\n * This view part displays selected text to the user. Every line has its own selection overlay.\n */\nclass SelectionsOverlay extends DynamicViewOverlay {\n    static { this.SELECTION_CLASS_NAME = 'selected-text'; }\n    static { this.SELECTION_TOP_LEFT = 'top-left-radius'; }\n    static { this.SELECTION_BOTTOM_LEFT = 'bottom-left-radius'; }\n    static { this.SELECTION_TOP_RIGHT = 'top-right-radius'; }\n    static { this.SELECTION_BOTTOM_RIGHT = 'bottom-right-radius'; }\n    static { this.EDITOR_BACKGROUND_CLASS_NAME = 'monaco-editor-background'; }\n    static { this.ROUNDED_PIECE_WIDTH = 10; }\n    constructor(context) {\n        super();\n        this._previousFrameVisibleRangesWithStyle = [];\n        this._context = context;\n        const options = this._context.configuration.options;\n        this._roundedSelection = options.get(115 /* EditorOption.roundedSelection */);\n        this._typicalHalfwidthCharacterWidth = options.get(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;\n        this._selections = [];\n        this._renderResult = null;\n        this._context.addEventHandler(this);\n    }\n    dispose() {\n        this._context.removeEventHandler(this);\n        this._renderResult = null;\n        super.dispose();\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        this._roundedSelection = options.get(115 /* EditorOption.roundedSelection */);\n        this._typicalHalfwidthCharacterWidth = options.get(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;\n        return true;\n    }\n    onCursorStateChanged(e) {\n        this._selections = e.selections.slice(0);\n        return true;\n    }\n    onDecorationsChanged(e) {\n        // true for inline decorations that can end up relayouting text\n        return true; //e.inlineDecorationsChanged;\n    }\n    onFlushed(e) {\n        return true;\n    }\n    onLinesChanged(e) {\n        return true;\n    }\n    onLinesDeleted(e) {\n        return true;\n    }\n    onLinesInserted(e) {\n        return true;\n    }\n    onScrollChanged(e) {\n        return e.scrollTopChanged;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    // --- end event handlers\n    _visibleRangesHaveGaps(linesVisibleRanges) {\n        for (let i = 0, len = linesVisibleRanges.length; i < len; i++) {\n            const lineVisibleRanges = linesVisibleRanges[i];\n            if (lineVisibleRanges.ranges.length > 1) {\n                // There are two ranges on the same line\n                return true;\n            }\n        }\n        return false;\n    }\n    _enrichVisibleRangesWithStyle(viewport, linesVisibleRanges, previousFrame) {\n        const epsilon = this._typicalHalfwidthCharacterWidth / 4;\n        let previousFrameTop = null;\n        let previousFrameBottom = null;\n        if (previousFrame && previousFrame.length > 0 && linesVisibleRanges.length > 0) {\n            const topLineNumber = linesVisibleRanges[0].lineNumber;\n            if (topLineNumber === viewport.startLineNumber) {\n                for (let i = 0; !previousFrameTop && i < previousFrame.length; i++) {\n                    if (previousFrame[i].lineNumber === topLineNumber) {\n                        previousFrameTop = previousFrame[i].ranges[0];\n                    }\n                }\n            }\n            const bottomLineNumber = linesVisibleRanges[linesVisibleRanges.length - 1].lineNumber;\n            if (bottomLineNumber === viewport.endLineNumber) {\n                for (let i = previousFrame.length - 1; !previousFrameBottom && i >= 0; i--) {\n                    if (previousFrame[i].lineNumber === bottomLineNumber) {\n                        previousFrameBottom = previousFrame[i].ranges[0];\n                    }\n                }\n            }\n            if (previousFrameTop && !previousFrameTop.startStyle) {\n                previousFrameTop = null;\n            }\n            if (previousFrameBottom && !previousFrameBottom.startStyle) {\n                previousFrameBottom = null;\n            }\n        }\n        for (let i = 0, len = linesVisibleRanges.length; i < len; i++) {\n            // We know for a fact that there is precisely one range on each line\n            const curLineRange = linesVisibleRanges[i].ranges[0];\n            const curLeft = curLineRange.left;\n            const curRight = curLineRange.left + curLineRange.width;\n            const startStyle = {\n                top: 0 /* CornerStyle.EXTERN */,\n                bottom: 0 /* CornerStyle.EXTERN */\n            };\n            const endStyle = {\n                top: 0 /* CornerStyle.EXTERN */,\n                bottom: 0 /* CornerStyle.EXTERN */\n            };\n            if (i > 0) {\n                // Look above\n                const prevLeft = linesVisibleRanges[i - 1].ranges[0].left;\n                const prevRight = linesVisibleRanges[i - 1].ranges[0].left + linesVisibleRanges[i - 1].ranges[0].width;\n                if (abs(curLeft - prevLeft) < epsilon) {\n                    startStyle.top = 2 /* CornerStyle.FLAT */;\n                }\n                else if (curLeft > prevLeft) {\n                    startStyle.top = 1 /* CornerStyle.INTERN */;\n                }\n                if (abs(curRight - prevRight) < epsilon) {\n                    endStyle.top = 2 /* CornerStyle.FLAT */;\n                }\n                else if (prevLeft < curRight && curRight < prevRight) {\n                    endStyle.top = 1 /* CornerStyle.INTERN */;\n                }\n            }\n            else if (previousFrameTop) {\n                // Accept some hiccups near the viewport edges to save on repaints\n                startStyle.top = previousFrameTop.startStyle.top;\n                endStyle.top = previousFrameTop.endStyle.top;\n            }\n            if (i + 1 < len) {\n                // Look below\n                const nextLeft = linesVisibleRanges[i + 1].ranges[0].left;\n                const nextRight = linesVisibleRanges[i + 1].ranges[0].left + linesVisibleRanges[i + 1].ranges[0].width;\n                if (abs(curLeft - nextLeft) < epsilon) {\n                    startStyle.bottom = 2 /* CornerStyle.FLAT */;\n                }\n                else if (nextLeft < curLeft && curLeft < nextRight) {\n                    startStyle.bottom = 1 /* CornerStyle.INTERN */;\n                }\n                if (abs(curRight - nextRight) < epsilon) {\n                    endStyle.bottom = 2 /* CornerStyle.FLAT */;\n                }\n                else if (curRight < nextRight) {\n                    endStyle.bottom = 1 /* CornerStyle.INTERN */;\n                }\n            }\n            else if (previousFrameBottom) {\n                // Accept some hiccups near the viewport edges to save on repaints\n                startStyle.bottom = previousFrameBottom.startStyle.bottom;\n                endStyle.bottom = previousFrameBottom.endStyle.bottom;\n            }\n            curLineRange.startStyle = startStyle;\n            curLineRange.endStyle = endStyle;\n        }\n    }\n    _getVisibleRangesWithStyle(selection, ctx, previousFrame) {\n        const _linesVisibleRanges = ctx.linesVisibleRangesForRange(selection, true) || [];\n        const linesVisibleRanges = _linesVisibleRanges.map(toStyled);\n        const visibleRangesHaveGaps = this._visibleRangesHaveGaps(linesVisibleRanges);\n        if (!visibleRangesHaveGaps && this._roundedSelection) {\n            this._enrichVisibleRangesWithStyle(ctx.visibleRange, linesVisibleRanges, previousFrame);\n        }\n        // The visible ranges are sorted TOP-BOTTOM and LEFT-RIGHT\n        return linesVisibleRanges;\n    }\n    _createSelectionPiece(top, bottom, className, left, width) {\n        return ('<div class=\"cslr '\n            + className\n            + '\" style=\"'\n            + 'top:' + top.toString() + 'px;'\n            + 'bottom:' + bottom.toString() + 'px;'\n            + 'left:' + left.toString() + 'px;'\n            + 'width:' + width.toString() + 'px;'\n            + '\"></div>');\n    }\n    _actualRenderOneSelection(output2, visibleStartLineNumber, hasMultipleSelections, visibleRanges) {\n        if (visibleRanges.length === 0) {\n            return;\n        }\n        const visibleRangesHaveStyle = !!visibleRanges[0].ranges[0].startStyle;\n        const firstLineNumber = visibleRanges[0].lineNumber;\n        const lastLineNumber = visibleRanges[visibleRanges.length - 1].lineNumber;\n        for (let i = 0, len = visibleRanges.length; i < len; i++) {\n            const lineVisibleRanges = visibleRanges[i];\n            const lineNumber = lineVisibleRanges.lineNumber;\n            const lineIndex = lineNumber - visibleStartLineNumber;\n            const top = hasMultipleSelections ? (lineNumber === firstLineNumber ? 1 : 0) : 0;\n            const bottom = hasMultipleSelections ? (lineNumber !== firstLineNumber && lineNumber === lastLineNumber ? 1 : 0) : 0;\n            let innerCornerOutput = '';\n            let restOfSelectionOutput = '';\n            for (let j = 0, lenJ = lineVisibleRanges.ranges.length; j < lenJ; j++) {\n                const visibleRange = lineVisibleRanges.ranges[j];\n                if (visibleRangesHaveStyle) {\n                    const startStyle = visibleRange.startStyle;\n                    const endStyle = visibleRange.endStyle;\n                    if (startStyle.top === 1 /* CornerStyle.INTERN */ || startStyle.bottom === 1 /* CornerStyle.INTERN */) {\n                        // Reverse rounded corner to the left\n                        // First comes the selection (blue layer)\n                        innerCornerOutput += this._createSelectionPiece(top, bottom, SelectionsOverlay.SELECTION_CLASS_NAME, visibleRange.left - SelectionsOverlay.ROUNDED_PIECE_WIDTH, SelectionsOverlay.ROUNDED_PIECE_WIDTH);\n                        // Second comes the background (white layer) with inverse border radius\n                        let className = SelectionsOverlay.EDITOR_BACKGROUND_CLASS_NAME;\n                        if (startStyle.top === 1 /* CornerStyle.INTERN */) {\n                            className += ' ' + SelectionsOverlay.SELECTION_TOP_RIGHT;\n                        }\n                        if (startStyle.bottom === 1 /* CornerStyle.INTERN */) {\n                            className += ' ' + SelectionsOverlay.SELECTION_BOTTOM_RIGHT;\n                        }\n                        innerCornerOutput += this._createSelectionPiece(top, bottom, className, visibleRange.left - SelectionsOverlay.ROUNDED_PIECE_WIDTH, SelectionsOverlay.ROUNDED_PIECE_WIDTH);\n                    }\n                    if (endStyle.top === 1 /* CornerStyle.INTERN */ || endStyle.bottom === 1 /* CornerStyle.INTERN */) {\n                        // Reverse rounded corner to the right\n                        // First comes the selection (blue layer)\n                        innerCornerOutput += this._createSelectionPiece(top, bottom, SelectionsOverlay.SELECTION_CLASS_NAME, visibleRange.left + visibleRange.width, SelectionsOverlay.ROUNDED_PIECE_WIDTH);\n                        // Second comes the background (white layer) with inverse border radius\n                        let className = SelectionsOverlay.EDITOR_BACKGROUND_CLASS_NAME;\n                        if (endStyle.top === 1 /* CornerStyle.INTERN */) {\n                            className += ' ' + SelectionsOverlay.SELECTION_TOP_LEFT;\n                        }\n                        if (endStyle.bottom === 1 /* CornerStyle.INTERN */) {\n                            className += ' ' + SelectionsOverlay.SELECTION_BOTTOM_LEFT;\n                        }\n                        innerCornerOutput += this._createSelectionPiece(top, bottom, className, visibleRange.left + visibleRange.width, SelectionsOverlay.ROUNDED_PIECE_WIDTH);\n                    }\n                }\n                let className = SelectionsOverlay.SELECTION_CLASS_NAME;\n                if (visibleRangesHaveStyle) {\n                    const startStyle = visibleRange.startStyle;\n                    const endStyle = visibleRange.endStyle;\n                    if (startStyle.top === 0 /* CornerStyle.EXTERN */) {\n                        className += ' ' + SelectionsOverlay.SELECTION_TOP_LEFT;\n                    }\n                    if (startStyle.bottom === 0 /* CornerStyle.EXTERN */) {\n                        className += ' ' + SelectionsOverlay.SELECTION_BOTTOM_LEFT;\n                    }\n                    if (endStyle.top === 0 /* CornerStyle.EXTERN */) {\n                        className += ' ' + SelectionsOverlay.SELECTION_TOP_RIGHT;\n                    }\n                    if (endStyle.bottom === 0 /* CornerStyle.EXTERN */) {\n                        className += ' ' + SelectionsOverlay.SELECTION_BOTTOM_RIGHT;\n                    }\n                }\n                restOfSelectionOutput += this._createSelectionPiece(top, bottom, className, visibleRange.left, visibleRange.width);\n            }\n            output2[lineIndex][0] += innerCornerOutput;\n            output2[lineIndex][1] += restOfSelectionOutput;\n        }\n    }\n    prepareRender(ctx) {\n        // Build HTML for inner corners separate from HTML for the rest of selections,\n        // as the inner corner HTML can interfere with that of other selections.\n        // In final render, make sure to place the inner corner HTML before the rest of selection HTML. See issue #77777.\n        const output = [];\n        const visibleStartLineNumber = ctx.visibleRange.startLineNumber;\n        const visibleEndLineNumber = ctx.visibleRange.endLineNumber;\n        for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {\n            const lineIndex = lineNumber - visibleStartLineNumber;\n            output[lineIndex] = ['', ''];\n        }\n        const thisFrameVisibleRangesWithStyle = [];\n        for (let i = 0, len = this._selections.length; i < len; i++) {\n            const selection = this._selections[i];\n            if (selection.isEmpty()) {\n                thisFrameVisibleRangesWithStyle[i] = null;\n                continue;\n            }\n            const visibleRangesWithStyle = this._getVisibleRangesWithStyle(selection, ctx, this._previousFrameVisibleRangesWithStyle[i]);\n            thisFrameVisibleRangesWithStyle[i] = visibleRangesWithStyle;\n            this._actualRenderOneSelection(output, visibleStartLineNumber, this._selections.length > 1, visibleRangesWithStyle);\n        }\n        this._previousFrameVisibleRangesWithStyle = thisFrameVisibleRangesWithStyle;\n        this._renderResult = output.map(([internalCorners, restOfSelection]) => internalCorners + restOfSelection);\n    }\n    render(startLineNumber, lineNumber) {\n        if (!this._renderResult) {\n            return '';\n        }\n        const lineIndex = lineNumber - startLineNumber;\n        if (lineIndex < 0 || lineIndex >= this._renderResult.length) {\n            return '';\n        }\n        return this._renderResult[lineIndex];\n    }\n}\nregisterThemingParticipant((theme, collector) => {\n    const editorSelectionForegroundColor = theme.getColor(editorSelectionForeground);\n    if (editorSelectionForegroundColor && !editorSelectionForegroundColor.isTransparent()) {\n        collector.addRule(`.monaco-editor .view-line span.inline-selected-text { color: ${editorSelectionForegroundColor}; }`);\n    }\n});\nfunction abs(n) {\n    return n < 0 ? -n : n;\n}\n\nexport { SelectionsOverlay };\n","import { getWindow, computeScreenAwareSize } from '../../../../base/browser/dom.js';\nimport { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport { getCharContainingOffset } from '../../../../base/common/strings.js';\nimport { applyFontInfo } from '../../config/domFontInfo.js';\nimport { TextEditorCursorStyle } from '../../../common/config/editorOptions.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { MOUSE_CURSOR_TEXT_CSS_CLASS_NAME } from '../../../../base/browser/ui/mouseCursor/mouseCursor.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ViewCursorRenderData {\n    constructor(top, left, paddingLeft, width, height, textContent, textContentClassName) {\n        this.top = top;\n        this.left = left;\n        this.paddingLeft = paddingLeft;\n        this.width = width;\n        this.height = height;\n        this.textContent = textContent;\n        this.textContentClassName = textContentClassName;\n    }\n}\nvar CursorPlurality;\n(function (CursorPlurality) {\n    CursorPlurality[CursorPlurality[\"Single\"] = 0] = \"Single\";\n    CursorPlurality[CursorPlurality[\"MultiPrimary\"] = 1] = \"MultiPrimary\";\n    CursorPlurality[CursorPlurality[\"MultiSecondary\"] = 2] = \"MultiSecondary\";\n})(CursorPlurality || (CursorPlurality = {}));\nclass ViewCursor {\n    constructor(context, plurality) {\n        this._context = context;\n        const options = this._context.configuration.options;\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        this._cursorStyle = options.get(161 /* EditorOption.effectiveCursorStyle */);\n        this._typicalHalfwidthCharacterWidth = fontInfo.typicalHalfwidthCharacterWidth;\n        this._lineCursorWidth = Math.min(options.get(37 /* EditorOption.cursorWidth */), this._typicalHalfwidthCharacterWidth);\n        this._lineCursorHeight = options.get(38 /* EditorOption.cursorHeight */);\n        this._isVisible = true;\n        // Create the dom node\n        this._domNode = createFastDomNode(document.createElement('div'));\n        this._domNode.setClassName(`cursor ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`);\n        this._domNode.setHeight(this._context.viewLayout.getLineHeightForLineNumber(1));\n        this._domNode.setTop(0);\n        this._domNode.setLeft(0);\n        applyFontInfo(this._domNode, fontInfo);\n        this._domNode.setDisplay('none');\n        this._position = new Position(1, 1);\n        this._pluralityClass = '';\n        this.setPlurality(plurality);\n        this._lastRenderedContent = '';\n        this._renderData = null;\n    }\n    getDomNode() {\n        return this._domNode;\n    }\n    getPosition() {\n        return this._position;\n    }\n    setPlurality(plurality) {\n        switch (plurality) {\n            default:\n            case CursorPlurality.Single:\n                this._pluralityClass = '';\n                break;\n            case CursorPlurality.MultiPrimary:\n                this._pluralityClass = 'cursor-primary';\n                break;\n            case CursorPlurality.MultiSecondary:\n                this._pluralityClass = 'cursor-secondary';\n                break;\n        }\n    }\n    show() {\n        if (!this._isVisible) {\n            this._domNode.setVisibility('inherit');\n            this._isVisible = true;\n        }\n    }\n    hide() {\n        if (this._isVisible) {\n            this._domNode.setVisibility('hidden');\n            this._isVisible = false;\n        }\n    }\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        this._cursorStyle = options.get(161 /* EditorOption.effectiveCursorStyle */);\n        this._typicalHalfwidthCharacterWidth = fontInfo.typicalHalfwidthCharacterWidth;\n        this._lineCursorWidth = Math.min(options.get(37 /* EditorOption.cursorWidth */), this._typicalHalfwidthCharacterWidth);\n        this._lineCursorHeight = options.get(38 /* EditorOption.cursorHeight */);\n        applyFontInfo(this._domNode, fontInfo);\n        return true;\n    }\n    onCursorPositionChanged(position, pauseAnimation) {\n        if (pauseAnimation) {\n            this._domNode.domNode.style.transitionProperty = 'none';\n        }\n        else {\n            this._domNode.domNode.style.transitionProperty = '';\n        }\n        this._position = position;\n        return true;\n    }\n    /**\n     * If `this._position` is inside a grapheme, returns the position where the grapheme starts.\n     * Also returns the next grapheme.\n     */\n    _getGraphemeAwarePosition() {\n        const { lineNumber, column } = this._position;\n        const lineContent = this._context.viewModel.getLineContent(lineNumber);\n        const [startOffset, endOffset] = getCharContainingOffset(lineContent, column - 1);\n        return [new Position(lineNumber, startOffset + 1), lineContent.substring(startOffset, endOffset)];\n    }\n    _prepareRender(ctx) {\n        let textContent = '';\n        let textContentClassName = '';\n        const [position, nextGrapheme] = this._getGraphemeAwarePosition();\n        const lineHeight = this._context.viewLayout.getLineHeightForLineNumber(position.lineNumber);\n        const lineCursorHeight = (this._lineCursorHeight === 0\n            ? lineHeight // 0 indicates that the cursor should take the full line height\n            : Math.min(lineHeight, this._lineCursorHeight));\n        const lineHeightAdjustment = (lineHeight - lineCursorHeight) / 2;\n        if (this._cursorStyle === TextEditorCursorStyle.Line || this._cursorStyle === TextEditorCursorStyle.LineThin) {\n            const visibleRange = ctx.visibleRangeForPosition(position);\n            if (!visibleRange || visibleRange.outsideRenderedLine) {\n                // Outside viewport\n                return null;\n            }\n            const window = getWindow(this._domNode.domNode);\n            let width;\n            if (this._cursorStyle === TextEditorCursorStyle.Line) {\n                width = computeScreenAwareSize(window, this._lineCursorWidth > 0 ? this._lineCursorWidth : 2);\n                if (width > 2) {\n                    textContent = nextGrapheme;\n                    textContentClassName = this._getTokenClassName(position);\n                }\n            }\n            else {\n                width = computeScreenAwareSize(window, 1);\n            }\n            let left = visibleRange.left;\n            let paddingLeft = 0;\n            if (width >= 2 && left >= 1) {\n                // shift the cursor a bit between the characters\n                paddingLeft = 1;\n                left -= paddingLeft;\n            }\n            const top = ctx.getVerticalOffsetForLineNumber(position.lineNumber) - ctx.bigNumbersDelta + lineHeightAdjustment;\n            return new ViewCursorRenderData(top, left, paddingLeft, width, lineCursorHeight, textContent, textContentClassName);\n        }\n        const visibleRangeForCharacter = ctx.linesVisibleRangesForRange(new Range(position.lineNumber, position.column, position.lineNumber, position.column + nextGrapheme.length), false);\n        if (!visibleRangeForCharacter || visibleRangeForCharacter.length === 0) {\n            // Outside viewport\n            return null;\n        }\n        const firstVisibleRangeForCharacter = visibleRangeForCharacter[0];\n        if (firstVisibleRangeForCharacter.outsideRenderedLine || firstVisibleRangeForCharacter.ranges.length === 0) {\n            // Outside viewport\n            return null;\n        }\n        const range = firstVisibleRangeForCharacter.ranges[0];\n        const width = (nextGrapheme === '\\t'\n            ? this._typicalHalfwidthCharacterWidth\n            : (range.width < 1\n                ? this._typicalHalfwidthCharacterWidth\n                : range.width));\n        if (this._cursorStyle === TextEditorCursorStyle.Block) {\n            textContent = nextGrapheme;\n            textContentClassName = this._getTokenClassName(position);\n        }\n        let top = ctx.getVerticalOffsetForLineNumber(position.lineNumber) - ctx.bigNumbersDelta;\n        let height = lineHeight;\n        // Underline might interfere with clicking\n        if (this._cursorStyle === TextEditorCursorStyle.Underline || this._cursorStyle === TextEditorCursorStyle.UnderlineThin) {\n            top += lineHeight - 2;\n            height = 2;\n        }\n        return new ViewCursorRenderData(top, range.left, 0, width, height, textContent, textContentClassName);\n    }\n    _getTokenClassName(position) {\n        const lineData = this._context.viewModel.getViewLineData(position.lineNumber);\n        const tokenIndex = lineData.tokens.findTokenIndexAtOffset(position.column - 1);\n        return lineData.tokens.getClassName(tokenIndex);\n    }\n    prepareRender(ctx) {\n        this._renderData = this._prepareRender(ctx);\n    }\n    render(ctx) {\n        if (!this._renderData) {\n            this._domNode.setDisplay('none');\n            return null;\n        }\n        if (this._lastRenderedContent !== this._renderData.textContent) {\n            this._lastRenderedContent = this._renderData.textContent;\n            this._domNode.domNode.textContent = this._lastRenderedContent;\n        }\n        this._domNode.setClassName(`cursor ${this._pluralityClass} ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME} ${this._renderData.textContentClassName}`);\n        this._domNode.setDisplay('block');\n        this._domNode.setTop(this._renderData.top);\n        this._domNode.setLeft(this._renderData.left);\n        this._domNode.setPaddingLeft(this._renderData.paddingLeft);\n        this._domNode.setWidth(this._renderData.width);\n        this._domNode.setLineHeight(this._renderData.height);\n        this._domNode.setHeight(this._renderData.height);\n        return {\n            domNode: this._domNode.domNode,\n            position: this._position,\n            contentLeft: this._renderData.left,\n            height: this._renderData.height,\n            width: 2\n        };\n    }\n}\n\nexport { CursorPlurality, ViewCursor };\n","import './viewCursors.css';\nimport { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport { TimeoutTimer } from '../../../../base/common/async.js';\nimport { ViewPart } from '../../view/viewPart.js';\nimport { ViewCursor, CursorPlurality } from './viewCursor.js';\nimport { TextEditorCursorStyle } from '../../../common/config/editorOptions.js';\nimport { editorCursorBackground, editorCursorForeground, editorMultiCursorPrimaryBackground, editorMultiCursorPrimaryForeground, editorMultiCursorSecondaryBackground, editorMultiCursorSecondaryForeground } from '../../../common/core/editorColorRegistry.js';\nimport { registerThemingParticipant } from '../../../../platform/theme/common/themeService.js';\nimport { isHighContrast } from '../../../../platform/theme/common/theme.js';\nimport { WindowIntervalTimer, getWindow } from '../../../../base/browser/dom.js';\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/**\n * View cursors is a view part responsible for rendering the primary cursor and\n * any secondary cursors that are currently active.\n */\nclass ViewCursors extends ViewPart {\n    static { this.BLINK_INTERVAL = 500; }\n    constructor(context) {\n        super(context);\n        const options = this._context.configuration.options;\n        this._readOnly = options.get(104 /* EditorOption.readOnly */);\n        this._cursorBlinking = options.get(32 /* EditorOption.cursorBlinking */);\n        this._cursorStyle = options.get(161 /* EditorOption.effectiveCursorStyle */);\n        this._cursorSmoothCaretAnimation = options.get(33 /* EditorOption.cursorSmoothCaretAnimation */);\n        this._editContextEnabled = options.get(170 /* EditorOption.effectiveEditContext */);\n        this._selectionIsEmpty = true;\n        this._isComposingInput = false;\n        this._isVisible = false;\n        this._primaryCursor = new ViewCursor(this._context, CursorPlurality.Single);\n        this._secondaryCursors = [];\n        this._renderData = [];\n        this._domNode = createFastDomNode(document.createElement('div'));\n        this._domNode.setAttribute('role', 'presentation');\n        this._domNode.setAttribute('aria-hidden', 'true');\n        this._updateDomClassName();\n        this._domNode.appendChild(this._primaryCursor.getDomNode());\n        this._startCursorBlinkAnimation = new TimeoutTimer();\n        this._cursorFlatBlinkInterval = new WindowIntervalTimer();\n        this._blinkingEnabled = false;\n        this._editorHasFocus = false;\n        this._updateBlinking();\n    }\n    dispose() {\n        super.dispose();\n        this._startCursorBlinkAnimation.dispose();\n        this._cursorFlatBlinkInterval.dispose();\n    }\n    getDomNode() {\n        return this._domNode;\n    }\n    // --- begin event handlers\n    onCompositionStart(e) {\n        this._isComposingInput = true;\n        this._updateBlinking();\n        return true;\n    }\n    onCompositionEnd(e) {\n        this._isComposingInput = false;\n        this._updateBlinking();\n        return true;\n    }\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        this._readOnly = options.get(104 /* EditorOption.readOnly */);\n        this._cursorBlinking = options.get(32 /* EditorOption.cursorBlinking */);\n        this._cursorStyle = options.get(161 /* EditorOption.effectiveCursorStyle */);\n        this._cursorSmoothCaretAnimation = options.get(33 /* EditorOption.cursorSmoothCaretAnimation */);\n        this._editContextEnabled = options.get(170 /* EditorOption.effectiveEditContext */);\n        this._updateBlinking();\n        this._updateDomClassName();\n        this._primaryCursor.onConfigurationChanged(e);\n        for (let i = 0, len = this._secondaryCursors.length; i < len; i++) {\n            this._secondaryCursors[i].onConfigurationChanged(e);\n        }\n        return true;\n    }\n    _onCursorPositionChanged(position, secondaryPositions, reason) {\n        const pauseAnimation = (this._secondaryCursors.length !== secondaryPositions.length\n            || (this._cursorSmoothCaretAnimation === 'explicit' && reason !== 3 /* CursorChangeReason.Explicit */));\n        this._primaryCursor.setPlurality(secondaryPositions.length ? CursorPlurality.MultiPrimary : CursorPlurality.Single);\n        this._primaryCursor.onCursorPositionChanged(position, pauseAnimation);\n        this._updateBlinking();\n        if (this._secondaryCursors.length < secondaryPositions.length) {\n            // Create new cursors\n            const addCnt = secondaryPositions.length - this._secondaryCursors.length;\n            for (let i = 0; i < addCnt; i++) {\n                const newCursor = new ViewCursor(this._context, CursorPlurality.MultiSecondary);\n                this._domNode.domNode.insertBefore(newCursor.getDomNode().domNode, this._primaryCursor.getDomNode().domNode.nextSibling);\n                this._secondaryCursors.push(newCursor);\n            }\n        }\n        else if (this._secondaryCursors.length > secondaryPositions.length) {\n            // Remove some cursors\n            const removeCnt = this._secondaryCursors.length - secondaryPositions.length;\n            for (let i = 0; i < removeCnt; i++) {\n                this._domNode.removeChild(this._secondaryCursors[0].getDomNode());\n                this._secondaryCursors.splice(0, 1);\n            }\n        }\n        for (let i = 0; i < secondaryPositions.length; i++) {\n            this._secondaryCursors[i].onCursorPositionChanged(secondaryPositions[i], pauseAnimation);\n        }\n    }\n    onCursorStateChanged(e) {\n        const positions = [];\n        for (let i = 0, len = e.selections.length; i < len; i++) {\n            positions[i] = e.selections[i].getPosition();\n        }\n        this._onCursorPositionChanged(positions[0], positions.slice(1), e.reason);\n        const selectionIsEmpty = e.selections[0].isEmpty();\n        if (this._selectionIsEmpty !== selectionIsEmpty) {\n            this._selectionIsEmpty = selectionIsEmpty;\n            this._updateDomClassName();\n        }\n        return true;\n    }\n    onDecorationsChanged(e) {\n        // true for inline decorations that can end up relayouting text\n        return true;\n    }\n    onFlushed(e) {\n        return true;\n    }\n    onFocusChanged(e) {\n        this._editorHasFocus = e.isFocused;\n        this._updateBlinking();\n        return false;\n    }\n    onLinesChanged(e) {\n        return true;\n    }\n    onLinesDeleted(e) {\n        return true;\n    }\n    onLinesInserted(e) {\n        return true;\n    }\n    onScrollChanged(e) {\n        return true;\n    }\n    onTokensChanged(e) {\n        const shouldRender = (position) => {\n            for (let i = 0, len = e.ranges.length; i < len; i++) {\n                if (e.ranges[i].fromLineNumber <= position.lineNumber && position.lineNumber <= e.ranges[i].toLineNumber) {\n                    return true;\n                }\n            }\n            return false;\n        };\n        if (shouldRender(this._primaryCursor.getPosition())) {\n            return true;\n        }\n        for (const secondaryCursor of this._secondaryCursors) {\n            if (shouldRender(secondaryCursor.getPosition())) {\n                return true;\n            }\n        }\n        return false;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    // --- end event handlers\n    // ---- blinking logic\n    _getCursorBlinking() {\n        // TODO: Remove the following if statement when experimental edit context is made default sole implementation\n        if (this._isComposingInput && !this._editContextEnabled) {\n            // avoid double cursors\n            return 0 /* TextEditorCursorBlinkingStyle.Hidden */;\n        }\n        if (!this._editorHasFocus) {\n            return 0 /* TextEditorCursorBlinkingStyle.Hidden */;\n        }\n        if (this._readOnly) {\n            return 5 /* TextEditorCursorBlinkingStyle.Solid */;\n        }\n        return this._cursorBlinking;\n    }\n    _updateBlinking() {\n        this._startCursorBlinkAnimation.cancel();\n        this._cursorFlatBlinkInterval.cancel();\n        const blinkingStyle = this._getCursorBlinking();\n        // hidden and solid are special as they involve no animations\n        const isHidden = (blinkingStyle === 0 /* TextEditorCursorBlinkingStyle.Hidden */);\n        const isSolid = (blinkingStyle === 5 /* TextEditorCursorBlinkingStyle.Solid */);\n        if (isHidden) {\n            this._hide();\n        }\n        else {\n            this._show();\n        }\n        this._blinkingEnabled = false;\n        this._updateDomClassName();\n        if (!isHidden && !isSolid) {\n            if (blinkingStyle === 1 /* TextEditorCursorBlinkingStyle.Blink */) {\n                // flat blinking is handled by JavaScript to save battery life due to Chromium step timing issue https://bugs.chromium.org/p/chromium/issues/detail?id=361587\n                this._cursorFlatBlinkInterval.cancelAndSet(() => {\n                    if (this._isVisible) {\n                        this._hide();\n                    }\n                    else {\n                        this._show();\n                    }\n                }, ViewCursors.BLINK_INTERVAL, getWindow(this._domNode.domNode));\n            }\n            else {\n                this._startCursorBlinkAnimation.setIfNotSet(() => {\n                    this._blinkingEnabled = true;\n                    this._updateDomClassName();\n                }, ViewCursors.BLINK_INTERVAL);\n            }\n        }\n    }\n    // --- end blinking logic\n    _updateDomClassName() {\n        this._domNode.setClassName(this._getClassName());\n    }\n    _getClassName() {\n        let result = 'cursors-layer';\n        if (!this._selectionIsEmpty) {\n            result += ' has-selection';\n        }\n        switch (this._cursorStyle) {\n            case TextEditorCursorStyle.Line:\n                result += ' cursor-line-style';\n                break;\n            case TextEditorCursorStyle.Block:\n                result += ' cursor-block-style';\n                break;\n            case TextEditorCursorStyle.Underline:\n                result += ' cursor-underline-style';\n                break;\n            case TextEditorCursorStyle.LineThin:\n                result += ' cursor-line-thin-style';\n                break;\n            case TextEditorCursorStyle.BlockOutline:\n                result += ' cursor-block-outline-style';\n                break;\n            case TextEditorCursorStyle.UnderlineThin:\n                result += ' cursor-underline-thin-style';\n                break;\n            default:\n                result += ' cursor-line-style';\n        }\n        if (this._blinkingEnabled) {\n            switch (this._getCursorBlinking()) {\n                case 1 /* TextEditorCursorBlinkingStyle.Blink */:\n                    result += ' cursor-blink';\n                    break;\n                case 2 /* TextEditorCursorBlinkingStyle.Smooth */:\n                    result += ' cursor-smooth';\n                    break;\n                case 3 /* TextEditorCursorBlinkingStyle.Phase */:\n                    result += ' cursor-phase';\n                    break;\n                case 4 /* TextEditorCursorBlinkingStyle.Expand */:\n                    result += ' cursor-expand';\n                    break;\n                case 5 /* TextEditorCursorBlinkingStyle.Solid */:\n                    result += ' cursor-solid';\n                    break;\n                default:\n                    result += ' cursor-solid';\n            }\n        }\n        else {\n            result += ' cursor-solid';\n        }\n        if (this._cursorSmoothCaretAnimation === 'on' || this._cursorSmoothCaretAnimation === 'explicit') {\n            result += ' cursor-smooth-caret-animation';\n        }\n        return result;\n    }\n    _show() {\n        this._primaryCursor.show();\n        for (let i = 0, len = this._secondaryCursors.length; i < len; i++) {\n            this._secondaryCursors[i].show();\n        }\n        this._isVisible = true;\n    }\n    _hide() {\n        this._primaryCursor.hide();\n        for (let i = 0, len = this._secondaryCursors.length; i < len; i++) {\n            this._secondaryCursors[i].hide();\n        }\n        this._isVisible = false;\n    }\n    // ---- IViewPart implementation\n    prepareRender(ctx) {\n        this._primaryCursor.prepareRender(ctx);\n        for (let i = 0, len = this._secondaryCursors.length; i < len; i++) {\n            this._secondaryCursors[i].prepareRender(ctx);\n        }\n    }\n    render(ctx) {\n        const renderData = [];\n        let renderDataLen = 0;\n        const primaryRenderData = this._primaryCursor.render(ctx);\n        if (primaryRenderData) {\n            renderData[renderDataLen++] = primaryRenderData;\n        }\n        for (let i = 0, len = this._secondaryCursors.length; i < len; i++) {\n            const secondaryRenderData = this._secondaryCursors[i].render(ctx);\n            if (secondaryRenderData) {\n                renderData[renderDataLen++] = secondaryRenderData;\n            }\n        }\n        this._renderData = renderData;\n    }\n    getLastRenderData() {\n        return this._renderData;\n    }\n}\nregisterThemingParticipant((theme, collector) => {\n    const cursorThemes = [\n        { class: '.cursor', foreground: editorCursorForeground, background: editorCursorBackground },\n        { class: '.cursor-primary', foreground: editorMultiCursorPrimaryForeground, background: editorMultiCursorPrimaryBackground },\n        { class: '.cursor-secondary', foreground: editorMultiCursorSecondaryForeground, background: editorMultiCursorSecondaryBackground },\n    ];\n    for (const cursorTheme of cursorThemes) {\n        const caret = theme.getColor(cursorTheme.foreground);\n        if (caret) {\n            let caretBackground = theme.getColor(cursorTheme.background);\n            if (!caretBackground) {\n                caretBackground = caret.opposite();\n            }\n            collector.addRule(`.monaco-editor .cursors-layer ${cursorTheme.class} { background-color: ${caret}; border-color: ${caret}; color: ${caretBackground}; }`);\n            if (isHighContrast(theme.type)) {\n                collector.addRule(`.monaco-editor .cursors-layer.has-selection ${cursorTheme.class} { border-left: 1px solid ${caretBackground}; border-right: 1px solid ${caretBackground}; }`);\n            }\n        }\n    }\n});\n\nexport { ViewCursors };\n","import { createFastDomNode } from '../../../../base/browser/fastDomNode.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { ViewPart } from '../../view/viewPart.js';\nimport { Position } from '../../../common/core/position.js';\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 *--------------------------------------------------------------------------------------------*/\nconst invalidFunc = () => { throw new Error(`Invalid change accessor`); };\n/**\n * A view zone is a rectangle that is a section that is inserted into the editor\n * lines that can be used for various purposes such as showing a diffs, peeking\n * an implementation, etc.\n */\nclass ViewZones extends ViewPart {\n    constructor(context) {\n        super(context);\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._lineHeight = options.get(75 /* EditorOption.lineHeight */);\n        this._contentWidth = layoutInfo.contentWidth;\n        this._contentLeft = layoutInfo.contentLeft;\n        this.domNode = createFastDomNode(document.createElement('div'));\n        this.domNode.setClassName('view-zones');\n        this.domNode.setPosition('absolute');\n        this.domNode.setAttribute('role', 'presentation');\n        this.domNode.setAttribute('aria-hidden', 'true');\n        this.marginDomNode = createFastDomNode(document.createElement('div'));\n        this.marginDomNode.setClassName('margin-view-zones');\n        this.marginDomNode.setPosition('absolute');\n        this.marginDomNode.setAttribute('role', 'presentation');\n        this.marginDomNode.setAttribute('aria-hidden', 'true');\n        this._zones = {};\n    }\n    dispose() {\n        super.dispose();\n        this._zones = {};\n    }\n    // ---- begin view event handlers\n    _recomputeWhitespacesProps() {\n        const whitespaces = this._context.viewLayout.getWhitespaces();\n        const oldWhitespaces = new Map();\n        for (const whitespace of whitespaces) {\n            oldWhitespaces.set(whitespace.id, whitespace);\n        }\n        let hadAChange = false;\n        this._context.viewModel.changeWhitespace((whitespaceAccessor) => {\n            const keys = Object.keys(this._zones);\n            for (let i = 0, len = keys.length; i < len; i++) {\n                const id = keys[i];\n                const zone = this._zones[id];\n                const props = this._computeWhitespaceProps(zone.delegate);\n                zone.isInHiddenArea = props.isInHiddenArea;\n                const oldWhitespace = oldWhitespaces.get(id);\n                if (oldWhitespace && (oldWhitespace.afterLineNumber !== props.afterViewLineNumber || oldWhitespace.height !== props.heightInPx)) {\n                    whitespaceAccessor.changeOneWhitespace(id, props.afterViewLineNumber, props.heightInPx);\n                    this._safeCallOnComputedHeight(zone.delegate, props.heightInPx);\n                    hadAChange = true;\n                }\n            }\n        });\n        return hadAChange;\n    }\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._lineHeight = options.get(75 /* EditorOption.lineHeight */);\n        this._contentWidth = layoutInfo.contentWidth;\n        this._contentLeft = layoutInfo.contentLeft;\n        if (e.hasChanged(75 /* EditorOption.lineHeight */)) {\n            this._recomputeWhitespacesProps();\n        }\n        return true;\n    }\n    onLineMappingChanged(e) {\n        return this._recomputeWhitespacesProps();\n    }\n    onLinesDeleted(e) {\n        return true;\n    }\n    onScrollChanged(e) {\n        return e.scrollTopChanged || e.scrollWidthChanged;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    onLinesInserted(e) {\n        return true;\n    }\n    // ---- end view event handlers\n    _getZoneOrdinal(zone) {\n        return zone.ordinal ?? zone.afterColumn ?? 10000;\n    }\n    _computeWhitespaceProps(zone) {\n        if (zone.afterLineNumber === 0) {\n            return {\n                isInHiddenArea: false,\n                afterViewLineNumber: 0,\n                heightInPx: this._heightInPixels(zone),\n                minWidthInPx: this._minWidthInPixels(zone)\n            };\n        }\n        let zoneAfterModelPosition;\n        if (typeof zone.afterColumn !== 'undefined') {\n            zoneAfterModelPosition = this._context.viewModel.model.validatePosition({\n                lineNumber: zone.afterLineNumber,\n                column: zone.afterColumn\n            });\n        }\n        else {\n            const validAfterLineNumber = this._context.viewModel.model.validatePosition({\n                lineNumber: zone.afterLineNumber,\n                column: 1\n            }).lineNumber;\n            zoneAfterModelPosition = new Position(validAfterLineNumber, this._context.viewModel.model.getLineMaxColumn(validAfterLineNumber));\n        }\n        let zoneBeforeModelPosition;\n        if (zoneAfterModelPosition.column === this._context.viewModel.model.getLineMaxColumn(zoneAfterModelPosition.lineNumber)) {\n            zoneBeforeModelPosition = this._context.viewModel.model.validatePosition({\n                lineNumber: zoneAfterModelPosition.lineNumber + 1,\n                column: 1\n            });\n        }\n        else {\n            zoneBeforeModelPosition = this._context.viewModel.model.validatePosition({\n                lineNumber: zoneAfterModelPosition.lineNumber,\n                column: zoneAfterModelPosition.column + 1\n            });\n        }\n        const viewPosition = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(zoneAfterModelPosition, zone.afterColumnAffinity, true);\n        const isVisible = zone.showInHiddenAreas || this._context.viewModel.coordinatesConverter.modelPositionIsVisible(zoneBeforeModelPosition);\n        return {\n            isInHiddenArea: !isVisible,\n            afterViewLineNumber: viewPosition.lineNumber,\n            heightInPx: (isVisible ? this._heightInPixels(zone) : 0),\n            minWidthInPx: this._minWidthInPixels(zone)\n        };\n    }\n    changeViewZones(callback) {\n        let zonesHaveChanged = false;\n        this._context.viewModel.changeWhitespace((whitespaceAccessor) => {\n            const changeAccessor = {\n                addZone: (zone) => {\n                    zonesHaveChanged = true;\n                    return this._addZone(whitespaceAccessor, zone);\n                },\n                removeZone: (id) => {\n                    if (!id) {\n                        return;\n                    }\n                    zonesHaveChanged = this._removeZone(whitespaceAccessor, id) || zonesHaveChanged;\n                },\n                layoutZone: (id) => {\n                    if (!id) {\n                        return;\n                    }\n                    zonesHaveChanged = this._layoutZone(whitespaceAccessor, id) || zonesHaveChanged;\n                }\n            };\n            safeInvoke1Arg(callback, changeAccessor);\n            // Invalidate changeAccessor\n            changeAccessor.addZone = invalidFunc;\n            changeAccessor.removeZone = invalidFunc;\n            changeAccessor.layoutZone = invalidFunc;\n        });\n        return zonesHaveChanged;\n    }\n    _addZone(whitespaceAccessor, zone) {\n        const props = this._computeWhitespaceProps(zone);\n        const whitespaceId = whitespaceAccessor.insertWhitespace(props.afterViewLineNumber, this._getZoneOrdinal(zone), props.heightInPx, props.minWidthInPx);\n        const myZone = {\n            whitespaceId: whitespaceId,\n            delegate: zone,\n            isInHiddenArea: props.isInHiddenArea,\n            isVisible: false,\n            domNode: createFastDomNode(zone.domNode),\n            marginDomNode: zone.marginDomNode ? createFastDomNode(zone.marginDomNode) : null\n        };\n        this._safeCallOnComputedHeight(myZone.delegate, props.heightInPx);\n        myZone.domNode.setPosition('absolute');\n        myZone.domNode.domNode.style.width = '100%';\n        myZone.domNode.setDisplay('none');\n        myZone.domNode.setAttribute('monaco-view-zone', myZone.whitespaceId);\n        this.domNode.appendChild(myZone.domNode);\n        if (myZone.marginDomNode) {\n            myZone.marginDomNode.setPosition('absolute');\n            myZone.marginDomNode.domNode.style.width = '100%';\n            myZone.marginDomNode.setDisplay('none');\n            myZone.marginDomNode.setAttribute('monaco-view-zone', myZone.whitespaceId);\n            this.marginDomNode.appendChild(myZone.marginDomNode);\n        }\n        this._zones[myZone.whitespaceId] = myZone;\n        this.setShouldRender();\n        return myZone.whitespaceId;\n    }\n    _removeZone(whitespaceAccessor, id) {\n        if (this._zones.hasOwnProperty(id)) {\n            const zone = this._zones[id];\n            delete this._zones[id];\n            whitespaceAccessor.removeWhitespace(zone.whitespaceId);\n            zone.domNode.removeAttribute('monaco-visible-view-zone');\n            zone.domNode.removeAttribute('monaco-view-zone');\n            zone.domNode.domNode.remove();\n            if (zone.marginDomNode) {\n                zone.marginDomNode.removeAttribute('monaco-visible-view-zone');\n                zone.marginDomNode.removeAttribute('monaco-view-zone');\n                zone.marginDomNode.domNode.remove();\n            }\n            this.setShouldRender();\n            return true;\n        }\n        return false;\n    }\n    _layoutZone(whitespaceAccessor, id) {\n        if (this._zones.hasOwnProperty(id)) {\n            const zone = this._zones[id];\n            const props = this._computeWhitespaceProps(zone.delegate);\n            zone.isInHiddenArea = props.isInHiddenArea;\n            // const newOrdinal = this._getZoneOrdinal(zone.delegate);\n            whitespaceAccessor.changeOneWhitespace(zone.whitespaceId, props.afterViewLineNumber, props.heightInPx);\n            // TODO@Alex: change `newOrdinal` too\n            this._safeCallOnComputedHeight(zone.delegate, props.heightInPx);\n            this.setShouldRender();\n            return true;\n        }\n        return false;\n    }\n    shouldSuppressMouseDownOnViewZone(id) {\n        if (this._zones.hasOwnProperty(id)) {\n            const zone = this._zones[id];\n            return Boolean(zone.delegate.suppressMouseDown);\n        }\n        return false;\n    }\n    _heightInPixels(zone) {\n        if (typeof zone.heightInPx === 'number') {\n            return zone.heightInPx;\n        }\n        if (typeof zone.heightInLines === 'number') {\n            return this._lineHeight * zone.heightInLines;\n        }\n        return this._lineHeight;\n    }\n    _minWidthInPixels(zone) {\n        if (typeof zone.minWidthInPx === 'number') {\n            return zone.minWidthInPx;\n        }\n        return 0;\n    }\n    _safeCallOnComputedHeight(zone, height) {\n        if (typeof zone.onComputedHeight === 'function') {\n            try {\n                zone.onComputedHeight(height);\n            }\n            catch (e) {\n                onUnexpectedError(e);\n            }\n        }\n    }\n    _safeCallOnDomNodeTop(zone, top) {\n        if (typeof zone.onDomNodeTop === 'function') {\n            try {\n                zone.onDomNodeTop(top);\n            }\n            catch (e) {\n                onUnexpectedError(e);\n            }\n        }\n    }\n    prepareRender(ctx) {\n        // Nothing to read\n    }\n    render(ctx) {\n        const visibleWhitespaces = ctx.viewportData.whitespaceViewportData;\n        const visibleZones = {};\n        let hasVisibleZone = false;\n        for (const visibleWhitespace of visibleWhitespaces) {\n            if (this._zones[visibleWhitespace.id].isInHiddenArea) {\n                continue;\n            }\n            visibleZones[visibleWhitespace.id] = visibleWhitespace;\n            hasVisibleZone = true;\n        }\n        const keys = Object.keys(this._zones);\n        for (let i = 0, len = keys.length; i < len; i++) {\n            const id = keys[i];\n            const zone = this._zones[id];\n            let newTop = 0;\n            let newHeight = 0;\n            let newDisplay = 'none';\n            if (visibleZones.hasOwnProperty(id)) {\n                newTop = visibleZones[id].verticalOffset - ctx.bigNumbersDelta;\n                newHeight = visibleZones[id].height;\n                newDisplay = 'block';\n                // zone is visible\n                if (!zone.isVisible) {\n                    zone.domNode.setAttribute('monaco-visible-view-zone', 'true');\n                    zone.isVisible = true;\n                }\n                this._safeCallOnDomNodeTop(zone.delegate, ctx.getScrolledTopFromAbsoluteTop(visibleZones[id].verticalOffset));\n            }\n            else {\n                if (zone.isVisible) {\n                    zone.domNode.removeAttribute('monaco-visible-view-zone');\n                    zone.isVisible = false;\n                }\n                this._safeCallOnDomNodeTop(zone.delegate, ctx.getScrolledTopFromAbsoluteTop(-1e6));\n            }\n            zone.domNode.setTop(newTop);\n            zone.domNode.setHeight(newHeight);\n            zone.domNode.setDisplay(newDisplay);\n            if (zone.marginDomNode) {\n                zone.marginDomNode.setTop(newTop);\n                zone.marginDomNode.setHeight(newHeight);\n                zone.marginDomNode.setDisplay(newDisplay);\n            }\n        }\n        if (hasVisibleZone) {\n            this.domNode.setWidth(Math.max(ctx.scrollWidth, this._contentWidth));\n            this.marginDomNode.setWidth(this._contentLeft);\n        }\n    }\n}\nfunction safeInvoke1Arg(func, arg1) {\n    try {\n        return func(arg1);\n    }\n    catch (e) {\n        onUnexpectedError(e);\n        return undefined;\n    }\n}\n\nexport { ViewZones };\n","import './whitespace.css';\nimport { DynamicViewOverlay } from '../../view/dynamicViewOverlay.js';\nimport { firstNonWhitespaceIndex, lastNonWhitespaceIndex } from '../../../../base/common/strings.js';\nimport { Position } from '../../../common/core/position.js';\nimport { editorWhitespaces } from '../../../common/core/editorColorRegistry.js';\nimport { OffsetRange } from '../../../common/core/ranges/offsetRange.js';\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/**\n * The whitespace overlay will visual certain whitespace depending on the\n * current editor configuration (boundary, selection, etc.).\n */\nclass WhitespaceOverlay extends DynamicViewOverlay {\n    constructor(context) {\n        super();\n        this._context = context;\n        this._options = new WhitespaceOptions(this._context.configuration);\n        this._selection = [];\n        this._renderResult = null;\n        this._context.addEventHandler(this);\n    }\n    dispose() {\n        this._context.removeEventHandler(this);\n        this._renderResult = null;\n        super.dispose();\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        const newOptions = new WhitespaceOptions(this._context.configuration);\n        if (this._options.equals(newOptions)) {\n            return e.hasChanged(165 /* EditorOption.layoutInfo */);\n        }\n        this._options = newOptions;\n        return true;\n    }\n    onCursorStateChanged(e) {\n        this._selection = e.selections;\n        if (this._options.renderWhitespace === 'selection') {\n            return true;\n        }\n        return false;\n    }\n    onDecorationsChanged(e) {\n        return true;\n    }\n    onFlushed(e) {\n        return true;\n    }\n    onLinesChanged(e) {\n        return true;\n    }\n    onLinesDeleted(e) {\n        return true;\n    }\n    onLinesInserted(e) {\n        return true;\n    }\n    onScrollChanged(e) {\n        return e.scrollTopChanged;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    // --- end event handlers\n    prepareRender(ctx) {\n        if (this._options.renderWhitespace === 'none') {\n            this._renderResult = null;\n            return;\n        }\n        const startLineNumber = ctx.visibleRange.startLineNumber;\n        const endLineNumber = ctx.visibleRange.endLineNumber;\n        const lineCount = endLineNumber - startLineNumber + 1;\n        const needed = new Array(lineCount);\n        for (let i = 0; i < lineCount; i++) {\n            needed[i] = true;\n        }\n        this._renderResult = [];\n        for (let lineNumber = ctx.viewportData.startLineNumber; lineNumber <= ctx.viewportData.endLineNumber; lineNumber++) {\n            const lineIndex = lineNumber - ctx.viewportData.startLineNumber;\n            const lineData = this._context.viewModel.getViewLineRenderingData(lineNumber);\n            let selectionsOnLine = null;\n            if (this._options.renderWhitespace === 'selection') {\n                const selections = this._selection;\n                for (const selection of selections) {\n                    if (selection.endLineNumber < lineNumber || selection.startLineNumber > lineNumber) {\n                        // Selection does not intersect line\n                        continue;\n                    }\n                    const startColumn = (selection.startLineNumber === lineNumber ? selection.startColumn : lineData.minColumn);\n                    const endColumn = (selection.endLineNumber === lineNumber ? selection.endColumn : lineData.maxColumn);\n                    if (startColumn < endColumn) {\n                        if (!selectionsOnLine) {\n                            selectionsOnLine = [];\n                        }\n                        selectionsOnLine.push(new OffsetRange(startColumn - 1, endColumn - 1));\n                    }\n                }\n            }\n            this._renderResult[lineIndex] = this._applyRenderWhitespace(ctx, lineNumber, selectionsOnLine, lineData);\n        }\n    }\n    _applyRenderWhitespace(ctx, lineNumber, selections, lineData) {\n        if (lineData.hasVariableFonts) {\n            return '';\n        }\n        if (this._options.renderWhitespace === 'selection' && !selections) {\n            return '';\n        }\n        if (this._options.renderWhitespace === 'trailing' && lineData.continuesWithWrappedLine) {\n            return '';\n        }\n        const color = this._context.theme.getColor(editorWhitespaces);\n        const USE_SVG = this._options.renderWithSVG;\n        const lineContent = lineData.content;\n        const len = (this._options.stopRenderingLineAfter === -1 ? lineContent.length : Math.min(this._options.stopRenderingLineAfter, lineContent.length));\n        const continuesWithWrappedLine = lineData.continuesWithWrappedLine;\n        const fauxIndentLength = lineData.minColumn - 1;\n        const onlyBoundary = (this._options.renderWhitespace === 'boundary');\n        const onlyTrailing = (this._options.renderWhitespace === 'trailing');\n        const lineHeight = ctx.getLineHeightForLineNumber(lineNumber);\n        const middotWidth = this._options.middotWidth;\n        const wsmiddotWidth = this._options.wsmiddotWidth;\n        const spaceWidth = this._options.spaceWidth;\n        const wsmiddotDiff = Math.abs(wsmiddotWidth - spaceWidth);\n        const middotDiff = Math.abs(middotWidth - spaceWidth);\n        // U+2E31 - WORD SEPARATOR MIDDLE DOT\n        // U+00B7 - MIDDLE DOT\n        const renderSpaceCharCode = (wsmiddotDiff < middotDiff ? 0x2E31 : 0xB7);\n        const canUseHalfwidthRightwardsArrow = this._options.canUseHalfwidthRightwardsArrow;\n        let result = '';\n        let lineIsEmptyOrWhitespace = false;\n        let firstNonWhitespaceIndex$1 = firstNonWhitespaceIndex(lineContent);\n        let lastNonWhitespaceIndex$1;\n        if (firstNonWhitespaceIndex$1 === -1) {\n            lineIsEmptyOrWhitespace = true;\n            firstNonWhitespaceIndex$1 = len;\n            lastNonWhitespaceIndex$1 = len;\n        }\n        else {\n            lastNonWhitespaceIndex$1 = lastNonWhitespaceIndex(lineContent);\n        }\n        let currentSelectionIndex = 0;\n        let currentSelection = selections && selections[currentSelectionIndex];\n        let maxLeft = 0;\n        for (let charIndex = fauxIndentLength; charIndex < len; charIndex++) {\n            const chCode = lineContent.charCodeAt(charIndex);\n            if (currentSelection && currentSelection.endExclusive <= charIndex) {\n                currentSelectionIndex++;\n                currentSelection = selections && selections[currentSelectionIndex];\n            }\n            if (chCode !== 9 /* CharCode.Tab */ && chCode !== 32 /* CharCode.Space */) {\n                continue;\n            }\n            if (onlyTrailing && !lineIsEmptyOrWhitespace && charIndex <= lastNonWhitespaceIndex$1) {\n                // If rendering only trailing whitespace, check that the charIndex points to trailing whitespace.\n                continue;\n            }\n            if (onlyBoundary && charIndex >= firstNonWhitespaceIndex$1 && charIndex <= lastNonWhitespaceIndex$1 && chCode === 32 /* CharCode.Space */) {\n                // rendering only boundary whitespace\n                const prevChCode = (charIndex - 1 >= 0 ? lineContent.charCodeAt(charIndex - 1) : 0 /* CharCode.Null */);\n                const nextChCode = (charIndex + 1 < len ? lineContent.charCodeAt(charIndex + 1) : 0 /* CharCode.Null */);\n                if (prevChCode !== 32 /* CharCode.Space */ && nextChCode !== 32 /* CharCode.Space */) {\n                    continue;\n                }\n            }\n            if (onlyBoundary && continuesWithWrappedLine && charIndex === len - 1) {\n                const prevCharCode = (charIndex - 1 >= 0 ? lineContent.charCodeAt(charIndex - 1) : 0 /* CharCode.Null */);\n                const isSingleTrailingSpace = (chCode === 32 /* CharCode.Space */ && (prevCharCode !== 32 /* CharCode.Space */ && prevCharCode !== 9 /* CharCode.Tab */));\n                if (isSingleTrailingSpace) {\n                    continue;\n                }\n            }\n            if (selections && !(currentSelection && currentSelection.start <= charIndex && charIndex < currentSelection.endExclusive)) {\n                // If rendering whitespace on selection, check that the charIndex falls within a selection\n                continue;\n            }\n            const visibleRange = ctx.visibleRangeForPosition(new Position(lineNumber, charIndex + 1));\n            if (!visibleRange) {\n                continue;\n            }\n            if (USE_SVG) {\n                maxLeft = Math.max(maxLeft, visibleRange.left);\n                if (chCode === 9 /* CharCode.Tab */) {\n                    result += this._renderArrow(lineHeight, spaceWidth, visibleRange.left);\n                }\n                else {\n                    result += `<circle cx=\"${(visibleRange.left + spaceWidth / 2).toFixed(2)}\" cy=\"${(lineHeight / 2).toFixed(2)}\" r=\"${(spaceWidth / 7).toFixed(2)}\" />`;\n                }\n            }\n            else {\n                if (chCode === 9 /* CharCode.Tab */) {\n                    result += `<div class=\"mwh\" style=\"left:${visibleRange.left}px;height:${lineHeight}px;\">${canUseHalfwidthRightwardsArrow ? String.fromCharCode(0xFFEB) : String.fromCharCode(0x2192)}</div>`;\n                }\n                else {\n                    result += `<div class=\"mwh\" style=\"left:${visibleRange.left}px;height:${lineHeight}px;\">${String.fromCharCode(renderSpaceCharCode)}</div>`;\n                }\n            }\n        }\n        if (USE_SVG) {\n            maxLeft = Math.round(maxLeft + spaceWidth);\n            return (`<svg style=\"bottom:0;position:absolute;width:${maxLeft}px;height:${lineHeight}px\" viewBox=\"0 0 ${maxLeft} ${lineHeight}\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"${color}\">`\n                + result\n                + `</svg>`);\n        }\n        return result;\n    }\n    _renderArrow(lineHeight, spaceWidth, left) {\n        const strokeWidth = spaceWidth / 7;\n        const width = spaceWidth;\n        const dy = lineHeight / 2;\n        const dx = left;\n        const p1 = { x: 0, y: strokeWidth / 2 };\n        const p2 = { x: 100 / 125 * width, y: p1.y };\n        const p3 = { x: p2.x - 0.2 * p2.x, y: p2.y + 0.2 * p2.x };\n        const p4 = { x: p3.x + 0.1 * p2.x, y: p3.y + 0.1 * p2.x };\n        const p5 = { x: p4.x + 0.35 * p2.x, y: p4.y - 0.35 * p2.x };\n        const p6 = { x: p5.x, y: -p5.y };\n        const p7 = { x: p4.x, y: -p4.y };\n        const p8 = { x: p3.x, y: -p3.y };\n        const p9 = { x: p2.x, y: -p2.y };\n        const p10 = { x: p1.x, y: -p1.y };\n        const p = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10];\n        const parts = p.map((p) => `${(dx + p.x).toFixed(2)} ${(dy + p.y).toFixed(2)}`).join(' L ');\n        return `<path d=\"M ${parts}\" />`;\n    }\n    render(startLineNumber, lineNumber) {\n        if (!this._renderResult) {\n            return '';\n        }\n        const lineIndex = lineNumber - startLineNumber;\n        if (lineIndex < 0 || lineIndex >= this._renderResult.length) {\n            return '';\n        }\n        return this._renderResult[lineIndex];\n    }\n}\nclass WhitespaceOptions {\n    constructor(config) {\n        const options = config.options;\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        const experimentalWhitespaceRendering = options.get(47 /* EditorOption.experimentalWhitespaceRendering */);\n        if (experimentalWhitespaceRendering === 'off') {\n            // whitespace is rendered in the view line\n            this.renderWhitespace = 'none';\n            this.renderWithSVG = false;\n        }\n        else if (experimentalWhitespaceRendering === 'svg') {\n            this.renderWhitespace = options.get(113 /* EditorOption.renderWhitespace */);\n            this.renderWithSVG = true;\n        }\n        else {\n            this.renderWhitespace = options.get(113 /* EditorOption.renderWhitespace */);\n            this.renderWithSVG = false;\n        }\n        this.spaceWidth = fontInfo.spaceWidth;\n        this.middotWidth = fontInfo.middotWidth;\n        this.wsmiddotWidth = fontInfo.wsmiddotWidth;\n        this.canUseHalfwidthRightwardsArrow = fontInfo.canUseHalfwidthRightwardsArrow;\n        this.lineHeight = options.get(75 /* EditorOption.lineHeight */);\n        this.stopRenderingLineAfter = options.get(133 /* EditorOption.stopRenderingLineAfter */);\n    }\n    equals(other) {\n        return (this.renderWhitespace === other.renderWhitespace\n            && this.renderWithSVG === other.renderWithSVG\n            && this.spaceWidth === other.spaceWidth\n            && this.middotWidth === other.middotWidth\n            && this.wsmiddotWidth === other.wsmiddotWidth\n            && this.canUseHalfwidthRightwardsArrow === other.canUseHalfwidthRightwardsArrow\n            && this.lineHeight === other.lineHeight\n            && this.stopRenderingLineAfter === other.stopRenderingLineAfter);\n    }\n}\n\nexport { WhitespaceOverlay };\n","import { Range } from '../core/range.js';\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/**\n * Contains all data needed to render at a specific viewport.\n */\nclass ViewportData {\n    constructor(selections, partialData, whitespaceViewportData, model) {\n        this.selections = selections;\n        this.startLineNumber = partialData.startLineNumber | 0;\n        this.endLineNumber = partialData.endLineNumber | 0;\n        this.relativeVerticalOffset = partialData.relativeVerticalOffset;\n        this.bigNumbersDelta = partialData.bigNumbersDelta | 0;\n        this.lineHeight = partialData.lineHeight | 0;\n        this.whitespaceViewportData = whitespaceViewportData;\n        this._model = model;\n        this.visibleRange = new Range(partialData.startLineNumber, this._model.getLineMinColumn(partialData.startLineNumber), partialData.endLineNumber, this._model.getLineMaxColumn(partialData.endLineNumber));\n    }\n    getViewLineRenderingData(lineNumber) {\n        return this._model.getViewportViewLineRenderingData(this.visibleRange, lineNumber);\n    }\n    getDecorationsInViewport() {\n        return this._model.getDecorationsInViewport(this.visibleRange);\n    }\n}\n\nexport { ViewportData };\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 *--------------------------------------------------------------------------------------------*/\nclass EditorTheme {\n    get type() {\n        return this._theme.type;\n    }\n    get value() {\n        return this._theme;\n    }\n    constructor(theme) {\n        this._theme = theme;\n    }\n    update(theme) {\n        this._theme = theme;\n    }\n    getColor(color) {\n        return this._theme.getColor(color);\n    }\n}\n\nexport { EditorTheme };\n","import { EditorTheme } from '../editorTheme.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ViewContext {\n    constructor(configuration, theme, model) {\n        this.configuration = configuration;\n        this.theme = new EditorTheme(theme);\n        this.viewModel = model;\n        this.viewLayout = model.viewLayout;\n    }\n    addEventHandler(eventHandler) {\n        this.viewModel.addViewEventHandler(eventHandler);\n    }\n    removeEventHandler(eventHandler) {\n        this.viewModel.removeViewEventHandler(eventHandler);\n    }\n}\n\nexport { ViewContext };\n","import { BugIndicatingError } from '../../../base/common/errors.js';\nimport { toDisposable } from '../../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nconst quadVertices = new Float32Array([\n    1, 0,\n    1, 1,\n    0, 1,\n    0, 0,\n    0, 1,\n    1, 0,\n]);\nfunction ensureNonNullable(value) {\n    if (!value) {\n        throw new Error(`Value \"${value}\" cannot be null`);\n    }\n    return value;\n}\n// TODO: Move capabilities into ElementSizeObserver?\nfunction observeDevicePixelDimensions(element, parentWindow, callback) {\n    // Observe any resizes to the element and extract the actual pixel size of the element if the\n    // devicePixelContentBoxSize API is supported. This allows correcting rounding errors when\n    // converting between CSS pixels and device pixels which causes blurry rendering when device\n    // pixel ratio is not a round number.\n    let observer = new parentWindow.ResizeObserver((entries) => {\n        const entry = entries.find((entry) => entry.target === element);\n        if (!entry) {\n            return;\n        }\n        // Disconnect if devicePixelContentBoxSize isn't supported by the browser\n        if (!('devicePixelContentBoxSize' in entry)) {\n            observer?.disconnect();\n            observer = undefined;\n            return;\n        }\n        // Fire the callback, ignore events where the dimensions are 0x0 as the canvas is likely hidden\n        const width = entry.devicePixelContentBoxSize[0].inlineSize;\n        const height = entry.devicePixelContentBoxSize[0].blockSize;\n        if (width > 0 && height > 0) {\n            callback(width, height);\n        }\n    });\n    try {\n        // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n        observer.observe(element, { box: ['device-pixel-content-box'] });\n    }\n    catch {\n        observer.disconnect();\n        observer = undefined;\n        throw new BugIndicatingError('Could not observe device pixel dimensions');\n    }\n    return toDisposable(() => observer?.disconnect());\n}\n\nexport { ensureNonNullable, observeDevicePixelDimensions, quadVertices };\n","import { memoize } from '../../../../base/common/decorators.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { isMacintosh } from '../../../../base/common/platform.js';\nimport { StringBuilder } from '../../../common/core/stringBuilder.js';\nimport { TokenMetadata } from '../../../common/encodedTokenAttributes.js';\nimport { ensureNonNullable } from '../gpuUtils.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nlet nextId = 0;\nclass GlyphRasterizer extends Disposable {\n    get cacheKey() {\n        return `${this.fontFamily}_${this.fontSize}px`;\n    }\n    constructor(fontSize, fontFamily, devicePixelRatio, _decorationStyleCache) {\n        super();\n        this.fontSize = fontSize;\n        this.fontFamily = fontFamily;\n        this.devicePixelRatio = devicePixelRatio;\n        this._decorationStyleCache = _decorationStyleCache;\n        this.id = nextId++;\n        this._workGlyph = {\n            source: null,\n            boundingBox: {\n                left: 0,\n                bottom: 0,\n                right: 0,\n                top: 0,\n            },\n            originOffset: {\n                x: 0,\n                y: 0,\n            },\n            fontBoundingBoxAscent: 0,\n            fontBoundingBoxDescent: 0,\n        };\n        this._workGlyphConfig = { chars: undefined, tokenMetadata: 0, decorationStyleSetId: 0 };\n        // TODO: Support workbench.fontAliasing correctly\n        this._antiAliasing = isMacintosh ? 'greyscale' : 'subpixel';\n        const devicePixelFontSize = Math.ceil(this.fontSize * devicePixelRatio);\n        this._canvas = new OffscreenCanvas(devicePixelFontSize * 3, devicePixelFontSize * 3);\n        this._ctx = ensureNonNullable(this._canvas.getContext('2d', {\n            willReadFrequently: true,\n            alpha: this._antiAliasing === 'greyscale',\n        }));\n        this._ctx.textBaseline = 'top';\n        this._ctx.fillStyle = '#FFFFFF';\n        this._ctx.font = `${devicePixelFontSize}px ${this.fontFamily}`;\n        this._textMetrics = this._ctx.measureText('A');\n    }\n    /**\n     * Rasterizes a glyph. Note that the returned object is reused across different glyphs and\n     * therefore is only safe for synchronous access.\n     */\n    rasterizeGlyph(chars, tokenMetadata, decorationStyleSetId, colorMap) {\n        if (chars === '') {\n            return {\n                source: this._canvas,\n                boundingBox: { top: 0, left: 0, bottom: -1, right: -1 },\n                originOffset: { x: 0, y: 0 },\n                fontBoundingBoxAscent: 0,\n                fontBoundingBoxDescent: 0,\n            };\n        }\n        // Check if the last glyph matches the config, reuse if so. This helps avoid unnecessary\n        // work when the rasterizer is called multiple times like when the glyph doesn't fit into a\n        // page.\n        if (this._workGlyphConfig.chars === chars && this._workGlyphConfig.tokenMetadata === tokenMetadata && this._workGlyphConfig.decorationStyleSetId === decorationStyleSetId) {\n            return this._workGlyph;\n        }\n        this._workGlyphConfig.chars = chars;\n        this._workGlyphConfig.tokenMetadata = tokenMetadata;\n        this._workGlyphConfig.decorationStyleSetId = decorationStyleSetId;\n        return this._rasterizeGlyph(chars, tokenMetadata, decorationStyleSetId, colorMap);\n    }\n    _rasterizeGlyph(chars, tokenMetadata, decorationStyleSetId, colorMap) {\n        const devicePixelFontSize = Math.ceil(this.fontSize * this.devicePixelRatio);\n        const canvasDim = devicePixelFontSize * 3;\n        if (this._canvas.width !== canvasDim) {\n            this._canvas.width = canvasDim;\n            this._canvas.height = canvasDim;\n        }\n        this._ctx.save();\n        // The sub-pixel x offset is the fractional part of the x pixel coordinate of the cell, this\n        // is used to improve the spacing between rendered characters.\n        const xSubPixelXOffset = (tokenMetadata & 0b1111) / 10;\n        const bgId = TokenMetadata.getBackground(tokenMetadata);\n        const bg = colorMap[bgId];\n        const decorationStyleSet = this._decorationStyleCache.getStyleSet(decorationStyleSetId);\n        // When SPAA is used, the background color must be present to get the right glyph\n        if (this._antiAliasing === 'subpixel') {\n            this._ctx.fillStyle = bg;\n            this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n        }\n        else {\n            this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n        }\n        const fontSb = new StringBuilder(200);\n        const fontStyle = TokenMetadata.getFontStyle(tokenMetadata);\n        if (fontStyle & 1 /* FontStyle.Italic */) {\n            fontSb.appendString('italic ');\n        }\n        if (decorationStyleSet?.bold !== undefined) {\n            if (decorationStyleSet.bold) {\n                fontSb.appendString('bold ');\n            }\n        }\n        else if (fontStyle & 2 /* FontStyle.Bold */) {\n            fontSb.appendString('bold ');\n        }\n        fontSb.appendString(`${devicePixelFontSize}px ${this.fontFamily}`);\n        this._ctx.font = fontSb.build();\n        // TODO: Support FontStyle.Strikethrough and FontStyle.Underline text decorations, these\n        //       need to be drawn manually to the canvas. See xterm.js for \"dodging\" the text for\n        //       underlines.\n        const originX = devicePixelFontSize;\n        const originY = devicePixelFontSize;\n        if (decorationStyleSet?.color !== undefined) {\n            this._ctx.fillStyle = `#${decorationStyleSet.color.toString(16).padStart(8, '0')}`;\n        }\n        else {\n            this._ctx.fillStyle = colorMap[TokenMetadata.getForeground(tokenMetadata)];\n        }\n        this._ctx.textBaseline = 'top';\n        if (decorationStyleSet?.opacity !== undefined) {\n            this._ctx.globalAlpha = decorationStyleSet.opacity;\n        }\n        this._ctx.fillText(chars, originX + xSubPixelXOffset, originY);\n        this._ctx.restore();\n        const imageData = this._ctx.getImageData(0, 0, this._canvas.width, this._canvas.height);\n        if (this._antiAliasing === 'subpixel') {\n            const bgR = parseInt(bg.substring(1, 3), 16);\n            const bgG = parseInt(bg.substring(3, 5), 16);\n            const bgB = parseInt(bg.substring(5, 7), 16);\n            this._clearColor(imageData, bgR, bgG, bgB);\n            this._ctx.putImageData(imageData, 0, 0);\n        }\n        this._findGlyphBoundingBox(imageData, this._workGlyph.boundingBox);\n        // const offset = {\n        // \tx: textMetrics.actualBoundingBoxLeft,\n        // \ty: textMetrics.actualBoundingBoxAscent\n        // };\n        // const size = {\n        // \tw: textMetrics.actualBoundingBoxRight + textMetrics.actualBoundingBoxLeft,\n        // \ty: textMetrics.actualBoundingBoxDescent + textMetrics.actualBoundingBoxAscent,\n        // \twInt: Math.ceil(textMetrics.actualBoundingBoxRight + textMetrics.actualBoundingBoxLeft),\n        // \tyInt: Math.ceil(textMetrics.actualBoundingBoxDescent + textMetrics.actualBoundingBoxAscent),\n        // };\n        // console.log(`${chars}_${fg}`, textMetrics, boundingBox, originX, originY, { width: boundingBox.right - boundingBox.left, height: boundingBox.bottom - boundingBox.top });\n        this._workGlyph.source = this._canvas;\n        this._workGlyph.originOffset.x = this._workGlyph.boundingBox.left - originX;\n        this._workGlyph.originOffset.y = this._workGlyph.boundingBox.top - originY;\n        this._workGlyph.fontBoundingBoxAscent = this._textMetrics.fontBoundingBoxAscent;\n        this._workGlyph.fontBoundingBoxDescent = this._textMetrics.fontBoundingBoxDescent;\n        // const result2: IRasterizedGlyph = {\n        // \tsource: this._canvas,\n        // \tboundingBox: {\n        // \t\tleft: Math.floor(originX - textMetrics.actualBoundingBoxLeft),\n        // \t\tright: Math.ceil(originX + textMetrics.actualBoundingBoxRight),\n        // \t\ttop: Math.floor(originY - textMetrics.actualBoundingBoxAscent),\n        // \t\tbottom: Math.ceil(originY + textMetrics.actualBoundingBoxDescent),\n        // \t},\n        // \toriginOffset: {\n        // \t\tx: Math.floor(boundingBox.left - originX),\n        // \t\ty: Math.floor(boundingBox.top - originY)\n        // \t}\n        // };\n        // TODO: Verify result 1 and 2 are the same\n        // if (result2.boundingBox.left > result.boundingBox.left) {\n        // \tdebugger;\n        // }\n        // if (result2.boundingBox.top > result.boundingBox.top) {\n        // \tdebugger;\n        // }\n        // if (result2.boundingBox.right < result.boundingBox.right) {\n        // \tdebugger;\n        // }\n        // if (result2.boundingBox.bottom < result.boundingBox.bottom) {\n        // \tdebugger;\n        // }\n        // if (JSON.stringify(result2.originOffset) !== JSON.stringify(result.originOffset)) {\n        // \tdebugger;\n        // }\n        return this._workGlyph;\n    }\n    _clearColor(imageData, r, g, b) {\n        for (let offset = 0; offset < imageData.data.length; offset += 4) {\n            // Check exact match\n            if (imageData.data[offset] === r &&\n                imageData.data[offset + 1] === g &&\n                imageData.data[offset + 2] === b) {\n                imageData.data[offset + 3] = 0;\n            }\n        }\n    }\n    // TODO: Does this even need to happen when measure text is used?\n    _findGlyphBoundingBox(imageData, outBoundingBox) {\n        const height = this._canvas.height;\n        const width = this._canvas.width;\n        let found = false;\n        for (let y = 0; y < height; y++) {\n            for (let x = 0; x < width; x++) {\n                const alphaOffset = y * width * 4 + x * 4 + 3;\n                if (imageData.data[alphaOffset] !== 0) {\n                    outBoundingBox.top = y;\n                    found = true;\n                    break;\n                }\n            }\n            if (found) {\n                break;\n            }\n        }\n        outBoundingBox.left = 0;\n        found = false;\n        for (let x = 0; x < width; x++) {\n            for (let y = 0; y < height; y++) {\n                const alphaOffset = y * width * 4 + x * 4 + 3;\n                if (imageData.data[alphaOffset] !== 0) {\n                    outBoundingBox.left = x;\n                    found = true;\n                    break;\n                }\n            }\n            if (found) {\n                break;\n            }\n        }\n        outBoundingBox.right = width;\n        found = false;\n        for (let x = width - 1; x >= outBoundingBox.left; x--) {\n            for (let y = 0; y < height; y++) {\n                const alphaOffset = y * width * 4 + x * 4 + 3;\n                if (imageData.data[alphaOffset] !== 0) {\n                    outBoundingBox.right = x;\n                    found = true;\n                    break;\n                }\n            }\n            if (found) {\n                break;\n            }\n        }\n        outBoundingBox.bottom = outBoundingBox.top;\n        found = false;\n        for (let y = height - 1; y >= 0; y--) {\n            for (let x = 0; x < width; x++) {\n                const alphaOffset = y * width * 4 + x * 4 + 3;\n                if (imageData.data[alphaOffset] !== 0) {\n                    outBoundingBox.bottom = y;\n                    found = true;\n                    break;\n                }\n            }\n            if (found) {\n                break;\n            }\n        }\n    }\n    getTextMetrics(text) {\n        return this._ctx.measureText(text);\n    }\n}\n__decorate([\n    memoize\n], GlyphRasterizer.prototype, \"cacheKey\", null);\n\nexport { GlyphRasterizer };\n","import { getActiveWindow } from '../../../base/browser/dom.js';\nimport { Disposable, toDisposable } from '../../../base/common/lifecycle.js';\nimport { ILogService } from '../../../platform/log/common/log.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet TaskQueue = class TaskQueue extends Disposable {\n    constructor(_logService) {\n        super();\n        this._logService = _logService;\n        this._tasks = [];\n        this._i = 0;\n        this._register(toDisposable(() => this.clear()));\n    }\n    enqueue(task) {\n        this._tasks.push(task);\n        this._start();\n    }\n    clear() {\n        if (this._idleCallback) {\n            this._cancelCallback(this._idleCallback);\n            this._idleCallback = undefined;\n        }\n        this._i = 0;\n        this._tasks.length = 0;\n    }\n    _start() {\n        if (!this._idleCallback) {\n            this._idleCallback = this._requestCallback(this._process.bind(this));\n        }\n    }\n    _process(deadline) {\n        this._idleCallback = undefined;\n        let taskDuration = 0;\n        let longestTask = 0;\n        let lastDeadlineRemaining = deadline.timeRemaining();\n        let deadlineRemaining = 0;\n        while (this._i < this._tasks.length) {\n            taskDuration = Date.now();\n            if (!this._tasks[this._i]()) {\n                this._i++;\n            }\n            // other than performance.now, Date.now might not be stable (changes on wall clock changes),\n            // this is not an issue here as a clock change during a short running task is very unlikely\n            // in case it still happened and leads to negative duration, simply assume 1 msec\n            taskDuration = Math.max(1, Date.now() - taskDuration);\n            longestTask = Math.max(taskDuration, longestTask);\n            // Guess the following task will take a similar time to the longest task in this batch, allow\n            // additional room to try avoid exceeding the deadline\n            deadlineRemaining = deadline.timeRemaining();\n            if (longestTask * 1.5 > deadlineRemaining) {\n                // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n                // task should be split into sub-tasks to ensure the UI remains responsive.\n                if (lastDeadlineRemaining - taskDuration < -20) {\n                    this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n                }\n                this._start();\n                return;\n            }\n            lastDeadlineRemaining = deadlineRemaining;\n        }\n        this.clear();\n    }\n};\nTaskQueue = __decorate([\n    __param(0, ILogService)\n], TaskQueue);\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nclass PriorityTaskQueue extends TaskQueue {\n    _requestCallback(callback) {\n        return getActiveWindow().setTimeout(() => callback(this._createDeadline(16)));\n    }\n    _cancelCallback(identifier) {\n        getActiveWindow().clearTimeout(identifier);\n    }\n    _createDeadline(duration) {\n        const end = Date.now() + duration;\n        return {\n            timeRemaining: () => Math.max(0, end - Date.now())\n        };\n    }\n}\nclass IdleTaskQueueInternal extends TaskQueue {\n    _requestCallback(callback) {\n        return getActiveWindow().requestIdleCallback(callback);\n    }\n    _cancelCallback(identifier) {\n        getActiveWindow().cancelIdleCallback(identifier);\n    }\n}\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\nconst IdleTaskQueue = ('requestIdleCallback' in getActiveWindow()) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\nexport { IdleTaskQueue, PriorityTaskQueue };\n","import { BugIndicatingError } from '../../../../base/common/errors.js';\nimport { ensureNonNullable } from '../gpuUtils.js';\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/**\n * The shelf allocator is a simple allocator that places glyphs in rows, starting a new row when the\n * current row is full. Due to its simplicity, it can waste space but it is very fast.\n */\nclass TextureAtlasShelfAllocator {\n    constructor(_canvas, _textureIndex) {\n        this._canvas = _canvas;\n        this._textureIndex = _textureIndex;\n        this._currentRow = {\n            x: 0,\n            y: 0,\n            h: 0\n        };\n        /** A set of all glyphs allocated, this is only tracked to enable debug related functionality */\n        this._allocatedGlyphs = new Set();\n        this._nextIndex = 0;\n        this._ctx = ensureNonNullable(this._canvas.getContext('2d', {\n            willReadFrequently: true\n        }));\n    }\n    allocate(rasterizedGlyph) {\n        // The glyph does not fit into the atlas page\n        const glyphWidth = rasterizedGlyph.boundingBox.right - rasterizedGlyph.boundingBox.left + 1;\n        const glyphHeight = rasterizedGlyph.boundingBox.bottom - rasterizedGlyph.boundingBox.top + 1;\n        if (glyphWidth > this._canvas.width || glyphHeight > this._canvas.height) {\n            throw new BugIndicatingError('Glyph is too large for the atlas page');\n        }\n        // Finalize and increment row if it doesn't fix horizontally\n        if (rasterizedGlyph.boundingBox.right - rasterizedGlyph.boundingBox.left + 1 > this._canvas.width - this._currentRow.x) {\n            this._currentRow.x = 0;\n            this._currentRow.y += this._currentRow.h;\n            this._currentRow.h = 1;\n        }\n        // Return undefined if there isn't any room left\n        if (this._currentRow.y + rasterizedGlyph.boundingBox.bottom - rasterizedGlyph.boundingBox.top + 1 > this._canvas.height) {\n            return undefined;\n        }\n        // Draw glyph\n        this._ctx.drawImage(rasterizedGlyph.source, \n        // source\n        rasterizedGlyph.boundingBox.left, rasterizedGlyph.boundingBox.top, glyphWidth, glyphHeight, \n        // destination\n        this._currentRow.x, this._currentRow.y, glyphWidth, glyphHeight);\n        // Create glyph object\n        const glyph = {\n            pageIndex: this._textureIndex,\n            glyphIndex: this._nextIndex++,\n            x: this._currentRow.x,\n            y: this._currentRow.y,\n            w: glyphWidth,\n            h: glyphHeight,\n            originOffsetX: rasterizedGlyph.originOffset.x,\n            originOffsetY: rasterizedGlyph.originOffset.y,\n            fontBoundingBoxAscent: rasterizedGlyph.fontBoundingBoxAscent,\n            fontBoundingBoxDescent: rasterizedGlyph.fontBoundingBoxDescent,\n        };\n        // Shift current row\n        this._currentRow.x += glyphWidth;\n        this._currentRow.h = Math.max(this._currentRow.h, glyphHeight);\n        // Set the glyph\n        this._allocatedGlyphs.add(glyph);\n        return glyph;\n    }\n    getUsagePreview() {\n        const w = this._canvas.width;\n        const h = this._canvas.height;\n        const canvas = new OffscreenCanvas(w, h);\n        const ctx = ensureNonNullable(canvas.getContext('2d'));\n        ctx.fillStyle = \"#808080\" /* UsagePreviewColors.Unused */;\n        ctx.fillRect(0, 0, w, h);\n        const rowHeight = new Map(); // y -> h\n        const rowWidth = new Map(); // y -> w\n        for (const g of this._allocatedGlyphs) {\n            rowHeight.set(g.y, Math.max(rowHeight.get(g.y) ?? 0, g.h));\n            rowWidth.set(g.y, Math.max(rowWidth.get(g.y) ?? 0, g.x + g.w));\n        }\n        for (const g of this._allocatedGlyphs) {\n            ctx.fillStyle = \"#4040FF\" /* UsagePreviewColors.Used */;\n            ctx.fillRect(g.x, g.y, g.w, g.h);\n            ctx.fillStyle = \"#FF0000\" /* UsagePreviewColors.Wasted */;\n            ctx.fillRect(g.x, g.y + g.h, g.w, rowHeight.get(g.y) - g.h);\n        }\n        for (const [rowY, rowW] of rowWidth.entries()) {\n            if (rowY !== this._currentRow.y) {\n                ctx.fillStyle = \"#FF0000\" /* UsagePreviewColors.Wasted */;\n                ctx.fillRect(rowW, rowY, w - rowW, rowHeight.get(rowY));\n            }\n        }\n        return canvas.convertToBlob();\n    }\n    getStats() {\n        const w = this._canvas.width;\n        const h = this._canvas.height;\n        let usedPixels = 0;\n        let wastedPixels = 0;\n        const totalPixels = w * h;\n        const rowHeight = new Map(); // y -> h\n        const rowWidth = new Map(); // y -> w\n        for (const g of this._allocatedGlyphs) {\n            rowHeight.set(g.y, Math.max(rowHeight.get(g.y) ?? 0, g.h));\n            rowWidth.set(g.y, Math.max(rowWidth.get(g.y) ?? 0, g.x + g.w));\n        }\n        for (const g of this._allocatedGlyphs) {\n            usedPixels += g.w * g.h;\n            wastedPixels += g.w * (rowHeight.get(g.y) - g.h);\n        }\n        for (const [rowY, rowW] of rowWidth.entries()) {\n            if (rowY !== this._currentRow.y) {\n                wastedPixels += (w - rowW) * rowHeight.get(rowY);\n            }\n        }\n        return [\n            `page${this._textureIndex}:`,\n            `     Total: ${totalPixels} (${w}x${h})`,\n            `      Used: ${usedPixels} (${((usedPixels / totalPixels) * 100).toPrecision(2)}%)`,\n            `    Wasted: ${wastedPixels} (${((wastedPixels / totalPixels) * 100).toPrecision(2)}%)`,\n            `Efficiency: ${((usedPixels / (usedPixels + wastedPixels)) * 100).toPrecision(2)}%`,\n        ].join('\\n');\n    }\n}\n\nexport { TextureAtlasShelfAllocator };\n","import { getActiveWindow } from '../../../../base/browser/dom.js';\nimport { BugIndicatingError } from '../../../../base/common/errors.js';\nimport { NKeyMap } from '../../../../base/common/map.js';\nimport { ensureNonNullable } from '../gpuUtils.js';\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/**\n * The slab allocator is a more complex allocator that places glyphs in square slabs of a fixed\n * size. Slabs are defined by a small range of glyphs sizes they can house, this places like-sized\n * glyphs in the same slab which reduces wasted space.\n *\n * Slabs also may contain \"unused\" regions on the left and bottom depending on the size of the\n * glyphs they include. This space is used to place very thin or short glyphs, which would otherwise\n * waste a lot of space in their own slab.\n */\nclass TextureAtlasSlabAllocator {\n    constructor(_canvas, _textureIndex, options) {\n        this._canvas = _canvas;\n        this._textureIndex = _textureIndex;\n        this._slabs = [];\n        this._activeSlabsByDims = new NKeyMap();\n        this._unusedRects = [];\n        this._openRegionsByHeight = new Map();\n        this._openRegionsByWidth = new Map();\n        /** A set of all glyphs allocated, this is only tracked to enable debug related functionality */\n        this._allocatedGlyphs = new Set();\n        this._nextIndex = 0;\n        this._ctx = ensureNonNullable(this._canvas.getContext('2d', {\n            willReadFrequently: true\n        }));\n        this._slabW = Math.min(options?.slabW ?? (64 << Math.max(Math.floor(getActiveWindow().devicePixelRatio) - 1, 0)), this._canvas.width);\n        this._slabH = Math.min(options?.slabH ?? this._slabW, this._canvas.height);\n        this._slabsPerRow = Math.floor(this._canvas.width / this._slabW);\n        this._slabsPerColumn = Math.floor(this._canvas.height / this._slabH);\n    }\n    allocate(rasterizedGlyph) {\n        // Find ideal slab, creating it if there is none suitable\n        const glyphWidth = rasterizedGlyph.boundingBox.right - rasterizedGlyph.boundingBox.left + 1;\n        const glyphHeight = rasterizedGlyph.boundingBox.bottom - rasterizedGlyph.boundingBox.top + 1;\n        // The glyph does not fit into the atlas page, glyphs should never be this large in practice\n        if (glyphWidth > this._canvas.width || glyphHeight > this._canvas.height) {\n            throw new BugIndicatingError('Glyph is too large for the atlas page');\n        }\n        // The glyph does not fit into a slab\n        if (glyphWidth > this._slabW || glyphHeight > this._slabH) {\n            // Only if this is the allocator's first glyph, resize the slab size to fit the glyph.\n            if (this._allocatedGlyphs.size > 0) {\n                return undefined;\n            }\n            // Find the largest power of 2 devisor that the glyph fits into, this ensure there is no\n            // wasted space outside the allocated slabs.\n            let sizeCandidate = this._canvas.width;\n            while (glyphWidth < sizeCandidate / 2 && glyphHeight < sizeCandidate / 2) {\n                sizeCandidate /= 2;\n            }\n            this._slabW = sizeCandidate;\n            this._slabH = sizeCandidate;\n            this._slabsPerRow = Math.floor(this._canvas.width / this._slabW);\n            this._slabsPerColumn = Math.floor(this._canvas.height / this._slabH);\n        }\n        // const dpr = getActiveWindow().devicePixelRatio;\n        // TODO: Include font size as well as DPR in nearestXPixels calculation\n        // Round slab glyph dimensions to the nearest x pixels, where x scaled with device pixel ratio\n        // const nearestXPixels = Math.max(1, Math.floor(dpr / 0.5));\n        // const nearestXPixels = Math.max(1, Math.floor(dpr));\n        const desiredSlabSize = {\n            // Nearest square number\n            // TODO: This can probably be optimized\n            // w: 1 << Math.ceil(Math.sqrt(glyphWidth)),\n            // h: 1 << Math.ceil(Math.sqrt(glyphHeight)),\n            // Nearest x px\n            // w: Math.ceil(glyphWidth / nearestXPixels) * nearestXPixels,\n            // h: Math.ceil(glyphHeight / nearestXPixels) * nearestXPixels,\n            // Round odd numbers up\n            // w: glyphWidth % 0 === 1 ? glyphWidth + 1 : glyphWidth,\n            // h: glyphHeight % 0 === 1 ? glyphHeight + 1 : glyphHeight,\n            // Exact number only\n            w: glyphWidth,\n            h: glyphHeight,\n        };\n        // Get any existing slab\n        let slab = this._activeSlabsByDims.get(desiredSlabSize.w, desiredSlabSize.h);\n        // Check if the slab is full\n        if (slab) {\n            const glyphsPerSlab = Math.floor(this._slabW / slab.entryW) * Math.floor(this._slabH / slab.entryH);\n            if (slab.count >= glyphsPerSlab) {\n                slab = undefined;\n            }\n        }\n        let dx;\n        let dy;\n        // Search for suitable space in unused rectangles\n        if (!slab) {\n            // Only check availability for the smallest side\n            if (glyphWidth < glyphHeight) {\n                const openRegions = this._openRegionsByWidth.get(glyphWidth);\n                if (openRegions?.length) {\n                    // TODO: Don't search everything?\n                    // Search from the end so we can typically pop it off the stack\n                    for (let i = openRegions.length - 1; i >= 0; i--) {\n                        const r = openRegions[i];\n                        if (r.w >= glyphWidth && r.h >= glyphHeight) {\n                            dx = r.x;\n                            dy = r.y;\n                            if (glyphWidth < r.w) {\n                                this._unusedRects.push({\n                                    x: r.x + glyphWidth,\n                                    y: r.y,\n                                    w: r.w - glyphWidth,\n                                    h: glyphHeight\n                                });\n                            }\n                            r.y += glyphHeight;\n                            r.h -= glyphHeight;\n                            if (r.h === 0) {\n                                if (i === openRegions.length - 1) {\n                                    openRegions.pop();\n                                }\n                                else {\n                                    this._unusedRects.splice(i, 1);\n                                }\n                            }\n                            break;\n                        }\n                    }\n                }\n            }\n            else {\n                const openRegions = this._openRegionsByHeight.get(glyphHeight);\n                if (openRegions?.length) {\n                    // TODO: Don't search everything?\n                    // Search from the end so we can typically pop it off the stack\n                    for (let i = openRegions.length - 1; i >= 0; i--) {\n                        const r = openRegions[i];\n                        if (r.w >= glyphWidth && r.h >= glyphHeight) {\n                            dx = r.x;\n                            dy = r.y;\n                            if (glyphHeight < r.h) {\n                                this._unusedRects.push({\n                                    x: r.x,\n                                    y: r.y + glyphHeight,\n                                    w: glyphWidth,\n                                    h: r.h - glyphHeight\n                                });\n                            }\n                            r.x += glyphWidth;\n                            r.w -= glyphWidth;\n                            if (r.h === 0) {\n                                if (i === openRegions.length - 1) {\n                                    openRegions.pop();\n                                }\n                                else {\n                                    this._unusedRects.splice(i, 1);\n                                }\n                            }\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n        // Create a new slab\n        if (dx === undefined || dy === undefined) {\n            if (!slab) {\n                if (this._slabs.length >= this._slabsPerRow * this._slabsPerColumn) {\n                    return undefined;\n                }\n                slab = {\n                    x: Math.floor(this._slabs.length % this._slabsPerRow) * this._slabW,\n                    y: Math.floor(this._slabs.length / this._slabsPerRow) * this._slabH,\n                    entryW: desiredSlabSize.w,\n                    entryH: desiredSlabSize.h,\n                    count: 0\n                };\n                // Track unused regions to use for small glyphs\n                // +-------------+----+\n                // |             |    |\n                // |             |    | <- Unused W region\n                // |             |    |\n                // |-------------+----+\n                // |                  | <- Unused H region\n                // +------------------+\n                const unusedW = this._slabW % slab.entryW;\n                const unusedH = this._slabH % slab.entryH;\n                if (unusedW) {\n                    addEntryToMapArray(this._openRegionsByWidth, unusedW, {\n                        x: slab.x + this._slabW - unusedW,\n                        w: unusedW,\n                        y: slab.y,\n                        h: this._slabH - (unusedH ?? 0)\n                    });\n                }\n                if (unusedH) {\n                    addEntryToMapArray(this._openRegionsByHeight, unusedH, {\n                        x: slab.x,\n                        w: this._slabW,\n                        y: slab.y + this._slabH - unusedH,\n                        h: unusedH\n                    });\n                }\n                this._slabs.push(slab);\n                this._activeSlabsByDims.set(slab, desiredSlabSize.w, desiredSlabSize.h);\n            }\n            const glyphsPerRow = Math.floor(this._slabW / slab.entryW);\n            dx = slab.x + Math.floor(slab.count % glyphsPerRow) * slab.entryW;\n            dy = slab.y + Math.floor(slab.count / glyphsPerRow) * slab.entryH;\n            // Shift current row\n            slab.count++;\n        }\n        // Draw glyph\n        this._ctx.drawImage(rasterizedGlyph.source, \n        // source\n        rasterizedGlyph.boundingBox.left, rasterizedGlyph.boundingBox.top, glyphWidth, glyphHeight, \n        // destination\n        dx, dy, glyphWidth, glyphHeight);\n        // Create glyph object\n        const glyph = {\n            pageIndex: this._textureIndex,\n            glyphIndex: this._nextIndex++,\n            x: dx,\n            y: dy,\n            w: glyphWidth,\n            h: glyphHeight,\n            originOffsetX: rasterizedGlyph.originOffset.x,\n            originOffsetY: rasterizedGlyph.originOffset.y,\n            fontBoundingBoxAscent: rasterizedGlyph.fontBoundingBoxAscent,\n            fontBoundingBoxDescent: rasterizedGlyph.fontBoundingBoxDescent,\n        };\n        // Set the glyph\n        this._allocatedGlyphs.add(glyph);\n        return glyph;\n    }\n    getUsagePreview() {\n        const w = this._canvas.width;\n        const h = this._canvas.height;\n        const canvas = new OffscreenCanvas(w, h);\n        const ctx = ensureNonNullable(canvas.getContext('2d'));\n        ctx.fillStyle = \"#808080\" /* UsagePreviewColors.Unused */;\n        ctx.fillRect(0, 0, w, h);\n        let slabEntryPixels = 0;\n        let usedPixels = 0;\n        let restrictedPixels = 0;\n        const slabW = 64 << (Math.floor(getActiveWindow().devicePixelRatio) - 1);\n        const slabH = slabW;\n        // Draw wasted underneath glyphs first\n        for (const slab of this._slabs) {\n            let x = 0;\n            let y = 0;\n            for (let i = 0; i < slab.count; i++) {\n                if (x + slab.entryW > slabW) {\n                    x = 0;\n                    y += slab.entryH;\n                }\n                ctx.fillStyle = \"#FF0000\" /* UsagePreviewColors.Wasted */;\n                ctx.fillRect(slab.x + x, slab.y + y, slab.entryW, slab.entryH);\n                slabEntryPixels += slab.entryW * slab.entryH;\n                x += slab.entryW;\n            }\n            const entriesPerRow = Math.floor(slabW / slab.entryW);\n            const entriesPerCol = Math.floor(slabH / slab.entryH);\n            slab.entryW * entriesPerRow * slab.entryH * entriesPerCol;\n        }\n        // Draw glyphs\n        for (const g of this._allocatedGlyphs) {\n            usedPixels += g.w * g.h;\n            ctx.fillStyle = \"#4040FF\" /* UsagePreviewColors.Used */;\n            ctx.fillRect(g.x, g.y, g.w, g.h);\n        }\n        // Draw unused space on side\n        const unusedRegions = Array.from(this._openRegionsByWidth.values()).flat().concat(Array.from(this._openRegionsByHeight.values()).flat());\n        for (const r of unusedRegions) {\n            ctx.fillStyle = \"#FF000088\" /* UsagePreviewColors.Restricted */;\n            ctx.fillRect(r.x, r.y, r.w, r.h);\n            restrictedPixels += r.w * r.h;\n        }\n        // Overlay actual glyphs on top\n        ctx.globalAlpha = 0.5;\n        ctx.drawImage(this._canvas, 0, 0);\n        ctx.globalAlpha = 1;\n        return canvas.convertToBlob();\n    }\n    getStats() {\n        const w = this._canvas.width;\n        const h = this._canvas.height;\n        let slabEntryPixels = 0;\n        let usedPixels = 0;\n        let slabEdgePixels = 0;\n        let wastedPixels = 0;\n        let restrictedPixels = 0;\n        const totalPixels = w * h;\n        const slabW = 64 << (Math.floor(getActiveWindow().devicePixelRatio) - 1);\n        const slabH = slabW;\n        // Draw wasted underneath glyphs first\n        for (const slab of this._slabs) {\n            let x = 0;\n            let y = 0;\n            for (let i = 0; i < slab.count; i++) {\n                if (x + slab.entryW > slabW) {\n                    x = 0;\n                    y += slab.entryH;\n                }\n                slabEntryPixels += slab.entryW * slab.entryH;\n                x += slab.entryW;\n            }\n            const entriesPerRow = Math.floor(slabW / slab.entryW);\n            const entriesPerCol = Math.floor(slabH / slab.entryH);\n            const thisSlabPixels = slab.entryW * entriesPerRow * slab.entryH * entriesPerCol;\n            slabEdgePixels += (slabW * slabH) - thisSlabPixels;\n        }\n        // Draw glyphs\n        for (const g of this._allocatedGlyphs) {\n            usedPixels += g.w * g.h;\n        }\n        // Draw unused space on side\n        const unusedRegions = Array.from(this._openRegionsByWidth.values()).flat().concat(Array.from(this._openRegionsByHeight.values()).flat());\n        for (const r of unusedRegions) {\n            restrictedPixels += r.w * r.h;\n        }\n        const edgeUsedPixels = slabEdgePixels - restrictedPixels;\n        wastedPixels = slabEntryPixels - (usedPixels - edgeUsedPixels);\n        // usedPixels += slabEdgePixels - restrictedPixels;\n        const efficiency = usedPixels / (usedPixels + wastedPixels + restrictedPixels);\n        return [\n            `page[${this._textureIndex}]:`,\n            `     Total: ${totalPixels}px (${w}x${h})`,\n            `      Used: ${usedPixels}px (${((usedPixels / totalPixels) * 100).toFixed(2)}%)`,\n            `    Wasted: ${wastedPixels}px (${((wastedPixels / totalPixels) * 100).toFixed(2)}%)`,\n            `Restricted: ${restrictedPixels}px (${((restrictedPixels / totalPixels) * 100).toFixed(2)}%) (hard to allocate)`,\n            `Efficiency: ${efficiency === 1 ? '100' : (efficiency * 100).toFixed(2)}%`,\n            `     Slabs: ${this._slabs.length} of ${Math.floor(this._canvas.width / slabW) * Math.floor(this._canvas.height / slabH)}`\n        ].join('\\n');\n    }\n}\nfunction addEntryToMapArray(map, key, entry) {\n    let list = map.get(key);\n    if (!list) {\n        list = [];\n        map.set(key, list);\n    }\n    list.push(entry);\n}\n\nexport { TextureAtlasSlabAllocator };\n","import { Disposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { NKeyMap } from '../../../../base/common/map.js';\nimport { LogLevel, ILogService } from '../../../../platform/log/common/log.js';\nimport { IThemeService } from '../../../../platform/theme/common/themeService.js';\nimport { TextureAtlasShelfAllocator } from './textureAtlasShelfAllocator.js';\nimport { TextureAtlasSlabAllocator } from './textureAtlasSlabAllocator.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar TextureAtlasPage_1;\nlet TextureAtlasPage = class TextureAtlasPage extends Disposable {\n    static { TextureAtlasPage_1 = this; }\n    get version() { return this._version; }\n    /**\n     * The maximum number of glyphs that can be drawn to the page. This is currently a hard static\n     * cap that must not be reached as it will cause the GPU buffer to overflow.\n     */\n    static { this.maximumGlyphCount = 5_000; }\n    get usedArea() { return this._usedArea; }\n    get source() { return this._canvas; }\n    get glyphs() {\n        return this._glyphInOrderSet.values();\n    }\n    constructor(textureIndex, pageSize, allocatorType, _logService, themeService) {\n        super();\n        this._logService = _logService;\n        this._version = 0;\n        this._usedArea = { left: 0, top: 0, right: 0, bottom: 0 };\n        this._glyphMap = new NKeyMap();\n        this._glyphInOrderSet = new Set();\n        this._canvas = new OffscreenCanvas(pageSize, pageSize);\n        this._colorMap = themeService.getColorTheme().tokenColorMap;\n        switch (allocatorType) {\n            case 'shelf':\n                this._allocator = new TextureAtlasShelfAllocator(this._canvas, textureIndex);\n                break;\n            case 'slab':\n                this._allocator = new TextureAtlasSlabAllocator(this._canvas, textureIndex);\n                break;\n            default:\n                this._allocator = allocatorType(this._canvas, textureIndex);\n                break;\n        }\n        // Reduce impact of a memory leak if this object is not released\n        this._register(toDisposable(() => {\n            this._canvas.width = 1;\n            this._canvas.height = 1;\n        }));\n    }\n    getGlyph(rasterizer, chars, tokenMetadata, decorationStyleSetId) {\n        // IMPORTANT: There are intentionally no intermediate variables here to aid in runtime\n        // optimization as it's a very hot function\n        return this._glyphMap.get(chars, tokenMetadata, decorationStyleSetId, rasterizer.cacheKey) ?? this._createGlyph(rasterizer, chars, tokenMetadata, decorationStyleSetId);\n    }\n    _createGlyph(rasterizer, chars, tokenMetadata, decorationStyleSetId) {\n        // Ensure the glyph can fit on the page\n        if (this._glyphInOrderSet.size >= TextureAtlasPage_1.maximumGlyphCount) {\n            return undefined;\n        }\n        // Rasterize and allocate the glyph\n        const rasterizedGlyph = rasterizer.rasterizeGlyph(chars, tokenMetadata, decorationStyleSetId, this._colorMap);\n        const glyph = this._allocator.allocate(rasterizedGlyph);\n        // Ensure the glyph was allocated\n        if (glyph === undefined) {\n            // TODO: undefined here can mean the glyph was too large for a slab on the page, this\n            // can lead to big problems if we don't handle it properly https://github.com/microsoft/vscode/issues/232984\n            return undefined;\n        }\n        // Save the glyph\n        this._glyphMap.set(glyph, chars, tokenMetadata, decorationStyleSetId, rasterizer.cacheKey);\n        this._glyphInOrderSet.add(glyph);\n        // Update page version and it's tracked used area\n        this._version++;\n        this._usedArea.right = Math.max(this._usedArea.right, glyph.x + glyph.w - 1);\n        this._usedArea.bottom = Math.max(this._usedArea.bottom, glyph.y + glyph.h - 1);\n        if (this._logService.getLevel() === LogLevel.Trace) {\n            this._logService.trace('New glyph', {\n                chars,\n                tokenMetadata,\n                decorationStyleSetId,\n                rasterizedGlyph,\n                glyph\n            });\n        }\n        return glyph;\n    }\n    getUsagePreview() {\n        return this._allocator.getUsagePreview();\n    }\n    getStats() {\n        return this._allocator.getStats();\n    }\n};\nTextureAtlasPage = TextureAtlasPage_1 = __decorate([\n    __param(3, ILogService),\n    __param(4, IThemeService)\n], TextureAtlasPage);\n\nexport { TextureAtlasPage };\n","import { getActiveWindow } from '../../../../base/browser/dom.js';\nimport { BugIndicatingError } from '../../../../base/common/errors.js';\nimport { Emitter, Event } from '../../../../base/common/event.js';\nimport { Disposable, MutableDisposable, toDisposable, dispose } from '../../../../base/common/lifecycle.js';\nimport { NKeyMap } from '../../../../base/common/map.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IThemeService } from '../../../../platform/theme/common/themeService.js';\nimport { GlyphRasterizer } from '../raster/glyphRasterizer.js';\nimport { IdleTaskQueue } from '../taskQueue.js';\nimport { TextureAtlasPage } from './textureAtlasPage.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar TextureAtlas_1;\nlet TextureAtlas = class TextureAtlas extends Disposable {\n    static { TextureAtlas_1 = this; }\n    /**\n     * The maximum number of texture atlas pages. This is currently a hard static cap that must not\n     * be reached.\n     */\n    static { this.maximumPageCount = 16; }\n    get pages() { return this._pages; }\n    constructor(\n    /** The maximum texture size supported by the GPU. */\n    _maxTextureSize, options, _decorationStyleCache, _themeService, _instantiationService) {\n        super();\n        this._maxTextureSize = _maxTextureSize;\n        this._decorationStyleCache = _decorationStyleCache;\n        this._themeService = _themeService;\n        this._instantiationService = _instantiationService;\n        this._warmUpTask = this._register(new MutableDisposable());\n        this._warmedUpRasterizers = new Set();\n        /**\n         * The main texture atlas pages which are both larger textures and more efficiently packed\n         * relative to the scratch page. The idea is the main pages are drawn to and uploaded to the GPU\n         * much less frequently so as to not drop frames.\n         */\n        this._pages = [];\n        /**\n         * A maps of glyph keys to the page to start searching for the glyph. This is set before\n         * searching to have as little runtime overhead (branching, intermediate variables) as possible,\n         * so it is not guaranteed to be the actual page the glyph is on. But it is guaranteed that all\n         * pages with a lower index do not contain the glyph.\n         */\n        this._glyphPageIndex = new NKeyMap();\n        this._onDidDeleteGlyphs = this._register(new Emitter());\n        this.onDidDeleteGlyphs = this._onDidDeleteGlyphs.event;\n        this._allocatorType = options?.allocatorType ?? 'slab';\n        this._register(Event.runAndSubscribe(this._themeService.onDidColorThemeChange, () => {\n            if (this._colorMap) {\n                this.clear();\n            }\n            this._colorMap = this._themeService.getColorTheme().tokenColorMap;\n        }));\n        const dprFactor = Math.max(1, Math.floor(getActiveWindow().devicePixelRatio));\n        this.pageSize = Math.min(1024 * dprFactor, this._maxTextureSize);\n        this._initFirstPage();\n        this._register(toDisposable(() => dispose(this._pages)));\n    }\n    _initFirstPage() {\n        const firstPage = this._instantiationService.createInstance(TextureAtlasPage, 0, this.pageSize, this._allocatorType);\n        this._pages.push(firstPage);\n        // IMPORTANT: The first glyph on the first page must be an empty glyph such that zeroed out\n        // cells end up rendering nothing\n        // TODO: This currently means the first slab is for 0x0 glyphs and is wasted\n        const nullRasterizer = new GlyphRasterizer(1, '', 1, this._decorationStyleCache);\n        firstPage.getGlyph(nullRasterizer, '', 0, 0);\n        nullRasterizer.dispose();\n    }\n    clear() {\n        // Clear all pages\n        for (const page of this._pages) {\n            page.dispose();\n        }\n        this._pages.length = 0;\n        this._glyphPageIndex.clear();\n        this._warmedUpRasterizers.clear();\n        this._warmUpTask.clear();\n        // Recreate first\n        this._initFirstPage();\n        // Tell listeners\n        this._onDidDeleteGlyphs.fire();\n    }\n    getGlyph(rasterizer, chars, tokenMetadata, decorationStyleSetId, x) {\n        // TODO: Encode font size and family into key\n        // Ignore metadata that doesn't affect the glyph\n        tokenMetadata &= -2048;\n        // Add x offset for sub-pixel rendering to the unused portion or tokenMetadata. This\n        // converts the decimal part of the x to a range from 0 to 9, where 0 = 0.0px x offset,\n        // 9 = 0.9px x offset\n        tokenMetadata |= Math.floor((x % 1) * 10);\n        // Warm up common glyphs\n        if (!this._warmedUpRasterizers.has(rasterizer.id)) {\n            this._warmUpAtlas(rasterizer);\n            this._warmedUpRasterizers.add(rasterizer.id);\n        }\n        // Try get the glyph, overflowing to a new page if necessary\n        return this._tryGetGlyph(this._glyphPageIndex.get(chars, tokenMetadata, decorationStyleSetId, rasterizer.cacheKey) ?? 0, rasterizer, chars, tokenMetadata, decorationStyleSetId);\n    }\n    _tryGetGlyph(pageIndex, rasterizer, chars, tokenMetadata, decorationStyleSetId) {\n        this._glyphPageIndex.set(pageIndex, chars, tokenMetadata, decorationStyleSetId, rasterizer.cacheKey);\n        return (this._pages[pageIndex].getGlyph(rasterizer, chars, tokenMetadata, decorationStyleSetId)\n            ?? (pageIndex + 1 < this._pages.length\n                ? this._tryGetGlyph(pageIndex + 1, rasterizer, chars, tokenMetadata, decorationStyleSetId)\n                : undefined)\n            ?? this._getGlyphFromNewPage(rasterizer, chars, tokenMetadata, decorationStyleSetId));\n    }\n    _getGlyphFromNewPage(rasterizer, chars, tokenMetadata, decorationStyleSetId) {\n        if (this._pages.length >= TextureAtlas_1.maximumPageCount) {\n            throw new Error(`Attempt to create a texture atlas page past the limit ${TextureAtlas_1.maximumPageCount}`);\n        }\n        this._pages.push(this._instantiationService.createInstance(TextureAtlasPage, this._pages.length, this.pageSize, this._allocatorType));\n        this._glyphPageIndex.set(this._pages.length - 1, chars, tokenMetadata, decorationStyleSetId, rasterizer.cacheKey);\n        return this._pages[this._pages.length - 1].getGlyph(rasterizer, chars, tokenMetadata, decorationStyleSetId);\n    }\n    getStats() {\n        return this._pages.map(e => e.getStats());\n    }\n    /**\n     * Warms up the atlas by rasterizing all printable ASCII characters for each token color. This\n     * is distrubuted over multiple idle callbacks to avoid blocking the main thread.\n     */\n    _warmUpAtlas(rasterizer) {\n        const colorMap = this._colorMap;\n        if (!colorMap) {\n            throw new BugIndicatingError('Cannot warm atlas without color map');\n        }\n        this._warmUpTask.value?.clear();\n        const taskQueue = this._warmUpTask.value = this._instantiationService.createInstance(IdleTaskQueue);\n        // Warm up using roughly the larger glyphs first to help optimize atlas allocation\n        // A-Z\n        for (let code = 65 /* CharCode.A */; code <= 90 /* CharCode.Z */; code++) {\n            for (const fgColor of colorMap.keys()) {\n                taskQueue.enqueue(() => {\n                    for (let x = 0; x < 1; x += 0.1) {\n                        this.getGlyph(rasterizer, String.fromCharCode(code), (fgColor << 15 /* MetadataConsts.FOREGROUND_OFFSET */) & 16744448 /* MetadataConsts.FOREGROUND_MASK */, 0, x);\n                    }\n                });\n            }\n        }\n        // a-z\n        for (let code = 97 /* CharCode.a */; code <= 122 /* CharCode.z */; code++) {\n            for (const fgColor of colorMap.keys()) {\n                taskQueue.enqueue(() => {\n                    for (let x = 0; x < 1; x += 0.1) {\n                        this.getGlyph(rasterizer, String.fromCharCode(code), (fgColor << 15 /* MetadataConsts.FOREGROUND_OFFSET */) & 16744448 /* MetadataConsts.FOREGROUND_MASK */, 0, x);\n                    }\n                });\n            }\n        }\n        // Remaining ascii\n        for (let code = 33 /* CharCode.ExclamationMark */; code <= 126 /* CharCode.Tilde */; code++) {\n            for (const fgColor of colorMap.keys()) {\n                taskQueue.enqueue(() => {\n                    for (let x = 0; x < 1; x += 0.1) {\n                        this.getGlyph(rasterizer, String.fromCharCode(code), (fgColor << 15 /* MetadataConsts.FOREGROUND_OFFSET */) & 16744448 /* MetadataConsts.FOREGROUND_MASK */, 0, x);\n                    }\n                });\n            }\n        }\n    }\n};\nTextureAtlas = TextureAtlas_1 = __decorate([\n    __param(3, IThemeService),\n    __param(4, IInstantiationService)\n], TextureAtlas);\n\nexport { TextureAtlas };\n","import { equalsIgnoreCase } from './strings.js';\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 *--------------------------------------------------------------------------------------------*/\nvar Severity;\n(function (Severity) {\n    Severity[Severity[\"Ignore\"] = 0] = \"Ignore\";\n    Severity[Severity[\"Info\"] = 1] = \"Info\";\n    Severity[Severity[\"Warning\"] = 2] = \"Warning\";\n    Severity[Severity[\"Error\"] = 3] = \"Error\";\n})(Severity || (Severity = {}));\n(function (Severity) {\n    const _error = 'error';\n    const _warning = 'warning';\n    const _warn = 'warn';\n    const _info = 'info';\n    const _ignore = 'ignore';\n    /**\n     * Parses 'error', 'warning', 'warn', 'info' in call casings\n     * and falls back to ignore.\n     */\n    function fromValue(value) {\n        if (!value) {\n            return Severity.Ignore;\n        }\n        if (equalsIgnoreCase(_error, value)) {\n            return Severity.Error;\n        }\n        if (equalsIgnoreCase(_warning, value) || equalsIgnoreCase(_warn, value)) {\n            return Severity.Warning;\n        }\n        if (equalsIgnoreCase(_info, value)) {\n            return Severity.Info;\n        }\n        return Severity.Ignore;\n    }\n    Severity.fromValue = fromValue;\n    function toString(severity) {\n        switch (severity) {\n            case Severity.Error: return _error;\n            case Severity.Warning: return _warning;\n            case Severity.Info: return _info;\n            default: return _ignore;\n        }\n    }\n    Severity.toString = toString;\n})(Severity || (Severity = {}));\nvar Severity$1 = Severity;\n\nexport { Severity$1 as default };\n","import Severity$1 from '../../../base/common/severity.js';\nimport { createDecorator } from '../../instantiation/common/instantiation.js';\n\nvar Severity = Severity$1;\nconst INotificationService = createDecorator('notificationService');\nclass NoOpNotification {\n}\n\nexport { INotificationService, NoOpNotification, Severity };\n","import { isFunction } from '../../../base/common/types.js';\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 *--------------------------------------------------------------------------------------------*/\nvar GPULifecycle;\n(function (GPULifecycle) {\n    async function requestDevice(fallback) {\n        try {\n            if (!navigator.gpu) {\n                throw new Error('This browser does not support WebGPU');\n            }\n            const adapter = (await navigator.gpu.requestAdapter());\n            if (!adapter) {\n                throw new Error('This browser supports WebGPU but it appears to be disabled');\n            }\n            return wrapDestroyableInDisposable(await adapter.requestDevice());\n        }\n        catch (e) {\n            if (fallback) {\n                fallback(e.message);\n            }\n            throw e;\n        }\n    }\n    GPULifecycle.requestDevice = requestDevice;\n    function createBuffer(device, descriptor, initialValues) {\n        const buffer = device.createBuffer(descriptor);\n        if (initialValues) {\n            device.queue.writeBuffer(buffer, 0, (isFunction(initialValues) ? initialValues() : initialValues));\n        }\n        return wrapDestroyableInDisposable(buffer);\n    }\n    GPULifecycle.createBuffer = createBuffer;\n    function createTexture(device, descriptor) {\n        return wrapDestroyableInDisposable(device.createTexture(descriptor));\n    }\n    GPULifecycle.createTexture = createTexture;\n})(GPULifecycle || (GPULifecycle = {}));\nfunction wrapDestroyableInDisposable(value) {\n    return {\n        object: value,\n        dispose: () => value.destroy()\n    };\n}\n\nexport { GPULifecycle };\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/**\n * A simple tracker for dirty regions in a buffer.\n */\nclass BufferDirtyTracker {\n    get dataOffset() {\n        return this._startIndex;\n    }\n    get dirtySize() {\n        if (this._startIndex === undefined || this._endIndex === undefined) {\n            return undefined;\n        }\n        return this._endIndex - this._startIndex + 1;\n    }\n    get isDirty() { return this._startIndex !== undefined; }\n    /**\n     * Flag the index(es) as modified. Returns the index flagged.\n     * @param index An index to flag.\n     * @param length An optional length to flag. Defaults to 1.\n     */\n    flag(index, length = 1) {\n        this._flag(index);\n        if (length > 1) {\n            this._flag(index + length - 1);\n        }\n        return index;\n    }\n    _flag(index) {\n        if (this._startIndex === undefined || index < this._startIndex) {\n            this._startIndex = index;\n        }\n        if (this._endIndex === undefined || index > this._endIndex) {\n            this._endIndex = index;\n        }\n    }\n    clear() {\n        this._startIndex = undefined;\n        this._endIndex = undefined;\n    }\n}\n\nexport { BufferDirtyTracker };\n","import { Emitter, Event } from '../../../base/common/event.js';\nimport { Disposable, toDisposable, dispose } from '../../../base/common/lifecycle.js';\nimport { LinkedList } from '../../../base/common/linkedList.js';\nimport { BufferDirtyTracker } from './bufferDirtyTracker.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction createObjectCollectionBuffer(propertySpecs, capacity) {\n    return new ObjectCollectionBuffer(propertySpecs, capacity);\n}\nclass ObjectCollectionBuffer extends Disposable {\n    get entryCount() {\n        return this._entries.size;\n    }\n    get dirtyTracker() { return this._dirtyTracker; }\n    constructor(propertySpecs, capacity) {\n        super();\n        this.propertySpecs = propertySpecs;\n        this.capacity = capacity;\n        this._dirtyTracker = new BufferDirtyTracker();\n        this._propertySpecsMap = new Map();\n        this._entries = new LinkedList();\n        this._onDidChange = this._register(new Emitter());\n        this._onDidChangeBuffer = this._register(new Emitter());\n        this.onDidChangeBuffer = this._onDidChangeBuffer.event;\n        this.view = new Float32Array(capacity * propertySpecs.length);\n        this.buffer = this.view.buffer;\n        this._entrySize = propertySpecs.length;\n        for (let i = 0; i < propertySpecs.length; i++) {\n            const spec = {\n                offset: i,\n                ...propertySpecs[i]\n            };\n            this._propertySpecsMap.set(spec.name, spec);\n        }\n        this._register(toDisposable(() => dispose(this._entries)));\n    }\n    createEntry(data) {\n        if (this._entries.size === this.capacity) {\n            this._expandBuffer();\n            this._onDidChangeBuffer.fire();\n        }\n        const value = new ObjectCollectionBufferEntry(this.view, this._propertySpecsMap, this._dirtyTracker, this._entries.size, data);\n        const removeFromEntries = this._entries.push(value);\n        const listeners = [];\n        listeners.push(Event.forward(value.onDidChange, this._onDidChange));\n        listeners.push(value.onWillDispose(() => {\n            const deletedEntryIndex = value.i;\n            removeFromEntries();\n            // Shift all entries after the deleted entry to the left\n            this.view.set(this.view.subarray(deletedEntryIndex * this._entrySize + 2, this._entries.size * this._entrySize + 2), deletedEntryIndex * this._entrySize);\n            // Update entries to reflect the new i\n            for (const entry of this._entries) {\n                if (entry.i > deletedEntryIndex) {\n                    entry.i--;\n                }\n            }\n            this._dirtyTracker.flag(deletedEntryIndex, (this._entries.size - deletedEntryIndex) * this._entrySize);\n            dispose(listeners);\n        }));\n        return value;\n    }\n    _expandBuffer() {\n        this.capacity *= 2;\n        const newView = new Float32Array(this.capacity * this._entrySize);\n        newView.set(this.view);\n        this.view = newView;\n        this.buffer = this.view.buffer;\n    }\n}\nclass ObjectCollectionBufferEntry extends Disposable {\n    constructor(_view, _propertySpecsMap, _dirtyTracker, i, data) {\n        super();\n        this._view = _view;\n        this._propertySpecsMap = _propertySpecsMap;\n        this._dirtyTracker = _dirtyTracker;\n        this.i = i;\n        this._onDidChange = this._register(new Emitter());\n        this.onDidChange = this._onDidChange.event;\n        this._onWillDispose = this._register(new Emitter());\n        this.onWillDispose = this._onWillDispose.event;\n        for (const propertySpec of this._propertySpecsMap.values()) {\n            this._view[this.i * this._propertySpecsMap.size + propertySpec.offset] = data[propertySpec.name];\n        }\n        this._dirtyTracker.flag(this.i * this._propertySpecsMap.size, this._propertySpecsMap.size);\n    }\n    dispose() {\n        this._onWillDispose.fire();\n        super.dispose();\n    }\n    setRaw(data) {\n        if (data.length !== this._propertySpecsMap.size) {\n            throw new Error(`Data length ${data.length} does not match the number of properties in the collection (${this._propertySpecsMap.size})`);\n        }\n        this._view.set(data, this.i * this._propertySpecsMap.size);\n        this._dirtyTracker.flag(this.i * this._propertySpecsMap.size, this._propertySpecsMap.size);\n    }\n}\n\nexport { createObjectCollectionBuffer };\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 *--------------------------------------------------------------------------------------------*/\nconst rectangleRendererWgsl = /*wgsl*/ `\n\nstruct Vertex {\n\t@location(0) position: vec2f,\n};\n\nstruct LayoutInfo {\n\tcanvasDims: vec2f,\n\tviewportOffset: vec2f,\n\tviewportDims: vec2f,\n}\n\nstruct ScrollOffset {\n\toffset: vec2f,\n}\n\nstruct Shape {\n\tposition: vec2f,\n\tsize: vec2f,\n\tcolor: vec4f,\n};\n\nstruct VSOutput {\n\t@builtin(position) position: vec4f,\n\t@location(1)       color:    vec4f,\n};\n\n// Uniforms\n@group(0) @binding(${1 /* RectangleRendererBindingId.LayoutInfoUniform */}) var<uniform>       layoutInfo:      LayoutInfo;\n\n// Storage buffers\n@group(0) @binding(${0 /* RectangleRendererBindingId.Shapes */})            var<storage, read> shapes:          array<Shape>;\n@group(0) @binding(${2 /* RectangleRendererBindingId.ScrollOffset */})      var<uniform>       scrollOffset:    ScrollOffset;\n\n@vertex fn vs(\n\tvert: Vertex,\n\t@builtin(instance_index) instanceIndex: u32,\n\t@builtin(vertex_index) vertexIndex : u32\n) -> VSOutput {\n\tlet shape = shapes[instanceIndex];\n\n\tvar vsOut: VSOutput;\n\tvsOut.position = vec4f(\n\t\t(\n\t\t\t// Top left corner\n\t\t\tvec2f(-1,  1) +\n\t\t\t// Convert pixel position to clipspace\n\t\t\tvec2f( 2, -2) / layoutInfo.canvasDims *\n\t\t\t// Shape position and size\n\t\t\t(layoutInfo.viewportOffset - scrollOffset.offset + shape.position + vert.position * shape.size)\n\t\t),\n\t\t0.0,\n\t\t1.0\n\t);\n\tvsOut.color = shape.color;\n\treturn vsOut;\n}\n\n@fragment fn fs(vsOut: VSOutput) -> @location(0) vec4f {\n\treturn vsOut.color;\n}\n`;\n\nexport { rectangleRendererWgsl };\n","import { getActiveWindow } from '../../../base/browser/dom.js';\nimport { Event } from '../../../base/common/event.js';\nimport { MutableDisposable } from '../../../base/common/lifecycle.js';\nimport { ViewEventHandler } from '../../common/viewEventHandler.js';\nimport { GPULifecycle } from './gpuDisposable.js';\nimport { observeDevicePixelDimensions, quadVertices } from './gpuUtils.js';\nimport { createObjectCollectionBuffer } from './objectCollectionBuffer.js';\nimport { rectangleRendererWgsl } from './rectangleRenderer.wgsl.js';\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 *--------------------------------------------------------------------------------------------*/\nclass RectangleRenderer extends ViewEventHandler {\n    constructor(_context, _contentLeft, _devicePixelRatio, _canvas, _ctx, device) {\n        super();\n        this._context = _context;\n        this._contentLeft = _contentLeft;\n        this._devicePixelRatio = _devicePixelRatio;\n        this._canvas = _canvas;\n        this._ctx = _ctx;\n        this._shapeBindBuffer = this._register(new MutableDisposable());\n        this._initialized = false;\n        this._shapeCollection = this._register(createObjectCollectionBuffer([\n            { name: 'x' },\n            { name: 'y' },\n            { name: 'width' },\n            { name: 'height' },\n            { name: 'red' },\n            { name: 'green' },\n            { name: 'blue' },\n            { name: 'alpha' },\n        ], 32));\n        this._context.addEventHandler(this);\n        this._initWebgpu(device);\n    }\n    async _initWebgpu(device) {\n        // #region General\n        this._device = await device;\n        if (this._store.isDisposed) {\n            return;\n        }\n        const presentationFormat = navigator.gpu.getPreferredCanvasFormat();\n        this._ctx.configure({\n            device: this._device,\n            format: presentationFormat,\n            alphaMode: 'premultiplied',\n        });\n        this._renderPassColorAttachment = {\n            view: null, // Will be filled at render time\n            loadOp: 'load',\n            storeOp: 'store',\n        };\n        this._renderPassDescriptor = {\n            label: 'Monaco rectangle renderer render pass',\n            colorAttachments: [this._renderPassColorAttachment],\n        };\n        // #endregion General\n        // #region Uniforms\n        let layoutInfoUniformBuffer;\n        {\n            const bufferValues = new Float32Array(6 /* Info.FloatsPerEntry */);\n            const updateBufferValues = (canvasDevicePixelWidth = this._canvas.width, canvasDevicePixelHeight = this._canvas.height) => {\n                bufferValues[0 /* Info.Offset_CanvasWidth____ */] = canvasDevicePixelWidth;\n                bufferValues[1 /* Info.Offset_CanvasHeight___ */] = canvasDevicePixelHeight;\n                bufferValues[2 /* Info.Offset_ViewportOffsetX */] = Math.ceil(this._context.configuration.options.get(165 /* EditorOption.layoutInfo */).contentLeft * getActiveWindow().devicePixelRatio);\n                bufferValues[3 /* Info.Offset_ViewportOffsetY */] = 0;\n                bufferValues[4 /* Info.Offset_ViewportWidth__ */] = bufferValues[0 /* Info.Offset_CanvasWidth____ */] - bufferValues[2 /* Info.Offset_ViewportOffsetX */];\n                bufferValues[5 /* Info.Offset_ViewportHeight_ */] = bufferValues[1 /* Info.Offset_CanvasHeight___ */] - bufferValues[3 /* Info.Offset_ViewportOffsetY */];\n                return bufferValues;\n            };\n            layoutInfoUniformBuffer = this._register(GPULifecycle.createBuffer(this._device, {\n                label: 'Monaco rectangle renderer uniform buffer',\n                size: 24 /* Info.BytesPerEntry */,\n                usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n            }, () => updateBufferValues())).object;\n            this._register(observeDevicePixelDimensions(this._canvas, getActiveWindow(), (w, h) => {\n                this._device.queue.writeBuffer(layoutInfoUniformBuffer, 0, updateBufferValues(w, h));\n            }));\n        }\n        const scrollOffsetBufferSize = 2;\n        this._scrollOffsetBindBuffer = this._register(GPULifecycle.createBuffer(this._device, {\n            label: 'Monaco rectangle renderer scroll offset buffer',\n            size: scrollOffsetBufferSize * Float32Array.BYTES_PER_ELEMENT,\n            usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n        })).object;\n        this._scrollOffsetValueBuffer = new Float32Array(scrollOffsetBufferSize);\n        // #endregion Uniforms\n        // #region Storage buffers\n        const createShapeBindBuffer = () => {\n            return GPULifecycle.createBuffer(this._device, {\n                label: 'Monaco rectangle renderer shape buffer',\n                size: this._shapeCollection.buffer.byteLength,\n                usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n            });\n        };\n        this._shapeBindBuffer.value = createShapeBindBuffer();\n        this._register(Event.runAndSubscribe(this._shapeCollection.onDidChangeBuffer, () => {\n            this._shapeBindBuffer.value = createShapeBindBuffer();\n            if (this._pipeline) {\n                this._updateBindGroup(this._pipeline, layoutInfoUniformBuffer);\n            }\n        }));\n        // #endregion Storage buffers\n        // #region Vertex buffer\n        this._vertexBuffer = this._register(GPULifecycle.createBuffer(this._device, {\n            label: 'Monaco rectangle renderer vertex buffer',\n            size: quadVertices.byteLength,\n            usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n        }, quadVertices)).object;\n        // #endregion Vertex buffer\n        // #region Shader module\n        const module = this._device.createShaderModule({\n            label: 'Monaco rectangle renderer shader module',\n            code: rectangleRendererWgsl,\n        });\n        // #endregion Shader module\n        // #region Pipeline\n        this._pipeline = this._device.createRenderPipeline({\n            label: 'Monaco rectangle renderer render pipeline',\n            layout: 'auto',\n            vertex: {\n                module,\n                buffers: [\n                    {\n                        arrayStride: 2 * Float32Array.BYTES_PER_ELEMENT, // 2 floats, 4 bytes each\n                        attributes: [\n                            { shaderLocation: 0, offset: 0, format: 'float32x2' }, // position\n                        ],\n                    }\n                ]\n            },\n            fragment: {\n                module,\n                targets: [\n                    {\n                        format: presentationFormat,\n                        blend: {\n                            color: {\n                                srcFactor: 'src-alpha',\n                                dstFactor: 'one-minus-src-alpha'\n                            },\n                            alpha: {\n                                srcFactor: 'src-alpha',\n                                dstFactor: 'one-minus-src-alpha'\n                            },\n                        },\n                    }\n                ],\n            },\n        });\n        // #endregion Pipeline\n        // #region Bind group\n        this._updateBindGroup(this._pipeline, layoutInfoUniformBuffer);\n        // endregion Bind group\n        this._initialized = true;\n    }\n    _updateBindGroup(pipeline, layoutInfoUniformBuffer) {\n        this._bindGroup = this._device.createBindGroup({\n            label: 'Monaco rectangle renderer bind group',\n            layout: pipeline.getBindGroupLayout(0),\n            entries: [\n                { binding: 0 /* RectangleRendererBindingId.Shapes */, resource: { buffer: this._shapeBindBuffer.value.object } },\n                { binding: 1 /* RectangleRendererBindingId.LayoutInfoUniform */, resource: { buffer: layoutInfoUniformBuffer } },\n                { binding: 2 /* RectangleRendererBindingId.ScrollOffset */, resource: { buffer: this._scrollOffsetBindBuffer } },\n            ],\n        });\n    }\n    register(x, y, width, height, red, green, blue, alpha) {\n        return this._shapeCollection.createEntry({ x, y, width, height, red, green, blue, alpha });\n    }\n    // #region Event handlers\n    onScrollChanged(e) {\n        if (this._device) {\n            const dpr = getActiveWindow().devicePixelRatio;\n            this._scrollOffsetValueBuffer[0] = this._context.viewLayout.getCurrentScrollLeft() * dpr;\n            this._scrollOffsetValueBuffer[1] = this._context.viewLayout.getCurrentScrollTop() * dpr;\n            this._device.queue.writeBuffer(this._scrollOffsetBindBuffer, 0, this._scrollOffsetValueBuffer);\n        }\n        return true;\n    }\n    // #endregion\n    _update() {\n        if (!this._device) {\n            return;\n        }\n        const shapes = this._shapeCollection;\n        if (shapes.dirtyTracker.isDirty) {\n            this._device.queue.writeBuffer(this._shapeBindBuffer.value.object, 0, shapes.buffer, shapes.dirtyTracker.dataOffset, shapes.dirtyTracker.dirtySize * shapes.view.BYTES_PER_ELEMENT);\n            shapes.dirtyTracker.clear();\n        }\n    }\n    draw(viewportData) {\n        if (!this._initialized) {\n            return;\n        }\n        this._update();\n        const encoder = this._device.createCommandEncoder({ label: 'Monaco rectangle renderer command encoder' });\n        this._renderPassColorAttachment.view = this._ctx.getCurrentTexture().createView();\n        const pass = encoder.beginRenderPass(this._renderPassDescriptor);\n        pass.setPipeline(this._pipeline);\n        pass.setVertexBuffer(0, this._vertexBuffer);\n        pass.setBindGroup(0, this._bindGroup);\n        // Only draw the content area\n        const contentLeft = Math.ceil(this._contentLeft.get() * this._devicePixelRatio.get());\n        pass.setScissorRect(contentLeft, 0, this._canvas.width - contentLeft, this._canvas.height);\n        pass.draw(quadVertices.length / 2, this._shapeCollection.entryCount);\n        pass.end();\n        const commandBuffer = encoder.finish();\n        this._device.queue.submit([commandBuffer]);\n    }\n}\n\nexport { RectangleRenderer };\n","import { $, getActiveDocument } from '../../../../base/browser/dom.js';\nimport { Disposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport './media/decorationCssRuleExtractor.css';\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/**\n * Extracts CSS rules that would be applied to certain decoration classes.\n */\nclass DecorationCssRuleExtractor extends Disposable {\n    constructor() {\n        super();\n        this._ruleCache = new Map();\n        this._container = $('div.monaco-decoration-css-rule-extractor');\n        this._dummyElement = $('span');\n        this._container.appendChild(this._dummyElement);\n        this._register(toDisposable(() => this._container.remove()));\n    }\n    getStyleRules(canvas, decorationClassName) {\n        // Check cache\n        const existing = this._ruleCache.get(decorationClassName);\n        if (existing) {\n            return existing;\n        }\n        // Set up DOM\n        this._dummyElement.className = decorationClassName;\n        canvas.appendChild(this._container);\n        // Get rules\n        const rules = this._getStyleRules(decorationClassName);\n        this._ruleCache.set(decorationClassName, rules);\n        // Tear down DOM\n        canvas.removeChild(this._container);\n        return rules;\n    }\n    _getStyleRules(className) {\n        // Iterate through all stylesheets and imported stylesheets to find matching rules\n        const rules = [];\n        const doc = getActiveDocument();\n        const stylesheets = [...doc.styleSheets];\n        for (let i = 0; i < stylesheets.length; i++) {\n            const stylesheet = stylesheets[i];\n            for (const rule of stylesheet.cssRules) {\n                if (rule instanceof CSSImportRule) {\n                    if (rule.styleSheet) {\n                        stylesheets.push(rule.styleSheet);\n                    }\n                }\n                else if (rule instanceof CSSStyleRule) {\n                    // Note that originally `.matches(rule.selectorText)` was used but this would\n                    // not pick up pseudo-classes which are important to determine support of the\n                    // returned styles.\n                    //\n                    // Since a selector could contain a class name lookup that is simple a prefix of\n                    // the class name we are looking for, we need to also check the character after\n                    // it.\n                    const searchTerm = `.${className}`;\n                    const index = rule.selectorText.indexOf(searchTerm);\n                    if (index !== -1) {\n                        const endOfResult = index + searchTerm.length;\n                        if (rule.selectorText.length === endOfResult || rule.selectorText.substring(endOfResult, endOfResult + 1).match(/[ :]/)) {\n                            rules.push(rule);\n                        }\n                    }\n                }\n            }\n        }\n        return rules;\n    }\n}\n\nexport { DecorationCssRuleExtractor };\n","import { NKeyMap } from '../../../../base/common/map.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DecorationStyleCache {\n    constructor() {\n        this._nextId = 1;\n        this._cacheById = new Map();\n        this._cacheByStyle = new NKeyMap();\n    }\n    getOrCreateEntry(color, bold, opacity) {\n        if (color === undefined && bold === undefined && opacity === undefined) {\n            return 0;\n        }\n        const result = this._cacheByStyle.get(color ?? 0, bold ? 1 : 0, opacity === undefined ? '' : opacity.toFixed(2));\n        if (result) {\n            return result.id;\n        }\n        const id = this._nextId++;\n        const entry = {\n            id,\n            color,\n            bold,\n            opacity,\n        };\n        this._cacheById.set(id, entry);\n        this._cacheByStyle.set(entry, color ?? 0, bold ? 1 : 0, opacity === undefined ? '' : opacity.toFixed(2));\n        return id;\n    }\n    getStyleSet(id) {\n        if (id === 0) {\n            return undefined;\n        }\n        return this._cacheById.get(id);\n    }\n}\n\nexport { DecorationStyleCache };\n","import { cancelOnDispose } from '../../cancellation.js';\nimport '../../arrays.js';\nimport '../../event.js';\nimport { DisposableStore } from '../../lifecycle.js';\nimport { autorunWithStoreHandleChanges } from '../reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction runOnChange(observable, cb) {\n    let _previousValue;\n    let _firstRun = true;\n    return autorunWithStoreHandleChanges({\n        changeTracker: {\n            createChangeSummary: () => ({ deltas: [], didChange: false }),\n            handleChange: (context, changeSummary) => {\n                if (context.didChange(observable)) {\n                    const e = context.change;\n                    if (e !== undefined) {\n                        changeSummary.deltas.push(e);\n                    }\n                    changeSummary.didChange = true;\n                }\n                return true;\n            },\n        }\n    }, (reader, changeSummary) => {\n        const value = observable.read(reader);\n        const previousValue = _previousValue;\n        if (changeSummary.didChange) {\n            _previousValue = value;\n            // didChange can never be true on the first autorun, so we know previousValue is defined\n            cb(value, previousValue, changeSummary.deltas);\n        }\n        if (_firstRun) {\n            _firstRun = false;\n            _previousValue = value;\n        }\n    });\n}\nfunction runOnChangeWithStore(observable, cb) {\n    const store = new DisposableStore();\n    const disposable = runOnChange(observable, (value, previousValue, deltas) => {\n        store.clear();\n        cb(value, previousValue, deltas, store);\n    });\n    return {\n        dispose() {\n            disposable.dispose();\n            store.dispose();\n        }\n    };\n}\nfunction runOnChangeWithCancellationToken(observable, cb) {\n    return runOnChangeWithStore(observable, (value, previousValue, deltas, store) => {\n        cb(value, previousValue, deltas, cancelOnDispose(store));\n    });\n}\n\nexport { runOnChange, runOnChangeWithCancellationToken, runOnChangeWithStore };\n","import { localize } from '../../../nls.js';\nimport { getActiveWindow, addDisposableListener } from '../../../base/browser/dom.js';\nimport { createFastDomNode } from '../../../base/browser/fastDomNode.js';\nimport { BugIndicatingError } from '../../../base/common/errors.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport '../../../base/common/observableInternal/index.js';\nimport { IInstantiationService } from '../../../platform/instantiation/common/instantiation.js';\nimport { TextureAtlas } from './atlas/textureAtlas.js';\nimport { IConfigurationService } from '../../../platform/configuration/common/configuration.js';\nimport { Severity, INotificationService } from '../../../platform/notification/common/notification.js';\nimport { GPULifecycle } from './gpuDisposable.js';\nimport { ensureNonNullable, observeDevicePixelDimensions } from './gpuUtils.js';\nimport { RectangleRenderer } from './rectangleRenderer.js';\nimport { DecorationCssRuleExtractor } from './css/decorationCssRuleExtractor.js';\nimport { Event } from '../../../base/common/event.js';\nimport { DecorationStyleCache } from './css/decorationStyleCache.js';\nimport { runOnChange } from '../../../base/common/observableInternal/utils/runOnChange.js';\nimport { observableValue } from '../../../base/common/observableInternal/observables/observableValue.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ViewGpuContext_1;\nlet ViewGpuContext = class ViewGpuContext extends Disposable {\n    static { ViewGpuContext_1 = this; }\n    static { this._decorationCssRuleExtractor = new DecorationCssRuleExtractor(); }\n    static get decorationCssRuleExtractor() {\n        return ViewGpuContext_1._decorationCssRuleExtractor;\n    }\n    static { this._decorationStyleCache = new DecorationStyleCache(); }\n    static get decorationStyleCache() {\n        return ViewGpuContext_1._decorationStyleCache;\n    }\n    /**\n     * The shared texture atlas to use across all views.\n     *\n     * @throws if called before the GPU device is resolved\n     */\n    static get atlas() {\n        if (!ViewGpuContext_1._atlas) {\n            throw new BugIndicatingError('Cannot call ViewGpuContext.textureAtlas before device is resolved');\n        }\n        return ViewGpuContext_1._atlas;\n    }\n    /**\n     * The shared texture atlas to use across all views. This is a convenience alias for\n     * {@link ViewGpuContext.atlas}.\n     *\n     * @throws if called before the GPU device is resolved\n     */\n    get atlas() {\n        return ViewGpuContext_1.atlas;\n    }\n    constructor(context, _instantiationService, _notificationService, configurationService) {\n        super();\n        this._instantiationService = _instantiationService;\n        this._notificationService = _notificationService;\n        this.configurationService = configurationService;\n        /**\n         * The hard cap for line columns rendered by the GPU renderer.\n         */\n        this.maxGpuCols = 2000;\n        this.canvas = createFastDomNode(document.createElement('canvas'));\n        this.canvas.setClassName('editorCanvas');\n        // Adjust the canvas size to avoid drawing under the scroll bar\n        this._register(Event.runAndSubscribe(configurationService.onDidChangeConfiguration, e => {\n            if (!e || e.affectsConfiguration('editor.scrollbar.verticalScrollbarSize')) {\n                const verticalScrollbarSize = configurationService.getValue('editor').scrollbar?.verticalScrollbarSize ?? 14;\n                this.canvas.domNode.style.boxSizing = 'border-box';\n                this.canvas.domNode.style.paddingRight = `${verticalScrollbarSize}px`;\n            }\n        }));\n        this.ctx = ensureNonNullable(this.canvas.domNode.getContext('webgpu'));\n        // Request the GPU device, we only want to do this a single time per window as it's async\n        // and can delay the initial render.\n        if (!ViewGpuContext_1.device) {\n            ViewGpuContext_1.device = GPULifecycle.requestDevice((message) => {\n                const choices = [{\n                        label: localize(78, \"Use DOM-based rendering\"),\n                        run: () => this.configurationService.updateValue('editor.experimentalGpuAcceleration', 'off'),\n                    }];\n                this._notificationService.prompt(Severity.Warning, message, choices);\n            }).then(ref => {\n                ViewGpuContext_1.deviceSync = ref.object;\n                if (!ViewGpuContext_1._atlas) {\n                    ViewGpuContext_1._atlas = this._instantiationService.createInstance(TextureAtlas, ref.object.limits.maxTextureDimension2D, undefined, ViewGpuContext_1.decorationStyleCache);\n                }\n                return ref.object;\n            });\n        }\n        const dprObs = observableValue(this, getActiveWindow().devicePixelRatio);\n        this._register(addDisposableListener(getActiveWindow(), 'resize', () => {\n            dprObs.set(getActiveWindow().devicePixelRatio, undefined);\n        }));\n        this.devicePixelRatio = dprObs;\n        this._register(runOnChange(this.devicePixelRatio, () => ViewGpuContext_1.atlas?.clear()));\n        const canvasDevicePixelDimensions = observableValue(this, { width: this.canvas.domNode.width, height: this.canvas.domNode.height });\n        this._register(observeDevicePixelDimensions(this.canvas.domNode, getActiveWindow(), (width, height) => {\n            this.canvas.domNode.width = width;\n            this.canvas.domNode.height = height;\n            canvasDevicePixelDimensions.set({ width, height }, undefined);\n        }));\n        this.canvasDevicePixelDimensions = canvasDevicePixelDimensions;\n        const contentLeft = observableValue(this, 0);\n        this._register(this.configurationService.onDidChangeConfiguration(e => {\n            contentLeft.set(context.configuration.options.get(165 /* EditorOption.layoutInfo */).contentLeft, undefined);\n        }));\n        this.contentLeft = contentLeft;\n        this.rectangleRenderer = this._instantiationService.createInstance(RectangleRenderer, context, this.contentLeft, this.devicePixelRatio, this.canvas.domNode, this.ctx, ViewGpuContext_1.device);\n    }\n    /**\n     * This method determines which lines can be and are allowed to be rendered using the GPU\n     * renderer. Eventually this should trend all lines, except maybe exceptional cases like\n     * decorations that use class names.\n     */\n    canRender(options, viewportData, lineNumber) {\n        const data = viewportData.getViewLineRenderingData(lineNumber);\n        // Check if the line has simple attributes that aren't supported\n        if (data.containsRTL ||\n            data.maxColumn > this.maxGpuCols) {\n            return false;\n        }\n        // Check if all inline decorations are supported\n        if (data.inlineDecorations.length > 0) {\n            let supported = true;\n            for (const decoration of data.inlineDecorations) {\n                if (decoration.type !== 0 /* InlineDecorationType.Regular */) {\n                    supported = false;\n                    break;\n                }\n                const styleRules = ViewGpuContext_1._decorationCssRuleExtractor.getStyleRules(this.canvas.domNode, decoration.inlineClassName);\n                supported &&= styleRules.every(rule => {\n                    // Pseudo classes aren't supported currently\n                    if (rule.selectorText.includes(':')) {\n                        return false;\n                    }\n                    for (const r of rule.style) {\n                        if (!supportsCssRule(r, rule.style)) {\n                            return false;\n                        }\n                    }\n                    return true;\n                });\n                if (!supported) {\n                    break;\n                }\n            }\n            return supported;\n        }\n        return true;\n    }\n    /**\n     * Like {@link canRender} but returns detailed information about why the line cannot be rendered.\n     */\n    canRenderDetailed(options, viewportData, lineNumber) {\n        const data = viewportData.getViewLineRenderingData(lineNumber);\n        const reasons = [];\n        if (data.containsRTL) {\n            reasons.push('containsRTL');\n        }\n        if (data.maxColumn > this.maxGpuCols) {\n            reasons.push('maxColumn > maxGpuCols');\n        }\n        if (data.inlineDecorations.length > 0) {\n            let supported = true;\n            const problemTypes = [];\n            const problemSelectors = [];\n            const problemRules = [];\n            for (const decoration of data.inlineDecorations) {\n                if (decoration.type !== 0 /* InlineDecorationType.Regular */) {\n                    problemTypes.push(decoration.type);\n                    supported = false;\n                    continue;\n                }\n                const styleRules = ViewGpuContext_1._decorationCssRuleExtractor.getStyleRules(this.canvas.domNode, decoration.inlineClassName);\n                supported &&= styleRules.every(rule => {\n                    // Pseudo classes aren't supported currently\n                    if (rule.selectorText.includes(':')) {\n                        problemSelectors.push(rule.selectorText);\n                        return false;\n                    }\n                    for (const r of rule.style) {\n                        if (!supportsCssRule(r, rule.style)) {\n                            // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n                            problemRules.push(`${r}: ${rule.style[r]}`);\n                            return false;\n                        }\n                    }\n                    return true;\n                });\n                if (!supported) {\n                    continue;\n                }\n            }\n            if (problemTypes.length > 0) {\n                reasons.push(`inlineDecorations with unsupported types (${problemTypes.map(e => `\\`${e}\\``).join(', ')})`);\n            }\n            if (problemRules.length > 0) {\n                reasons.push(`inlineDecorations with unsupported CSS rules (${problemRules.map(e => `\\`${e}\\``).join(', ')})`);\n            }\n            if (problemSelectors.length > 0) {\n                reasons.push(`inlineDecorations with unsupported CSS selectors (${problemSelectors.map(e => `\\`${e}\\``).join(', ')})`);\n            }\n        }\n        return reasons;\n    }\n};\nViewGpuContext = ViewGpuContext_1 = __decorate([\n    __param(1, IInstantiationService),\n    __param(2, INotificationService),\n    __param(3, IConfigurationService)\n], ViewGpuContext);\n/**\n * A list of supported decoration CSS rules that can be used in the GPU renderer.\n */\nconst gpuSupportedDecorationCssRules = [\n    'color',\n    'font-weight',\n    'opacity',\n];\nfunction supportsCssRule(rule, style) {\n    if (!gpuSupportedDecorationCssRules.includes(rule)) {\n        return false;\n    }\n    // Check for values that aren't supported\n    switch (rule) {\n        default: return true;\n    }\n}\n\nexport { ViewGpuContext };\n","import { safeIntl } from '../../../base/common/date.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction createContentSegmenter(lineData, options) {\n    if (lineData.isBasicASCII && options.useMonospaceOptimizations) {\n        return new AsciiContentSegmenter(lineData);\n    }\n    return new GraphemeContentSegmenter(lineData);\n}\nclass AsciiContentSegmenter {\n    constructor(lineData) {\n        this._content = lineData.content;\n    }\n    getSegmentAtIndex(index) {\n        return this._content[index];\n    }\n}\n/**\n * This is a more modern version of {@link GraphemeIterator}, relying on browser APIs instead of a\n * manual table approach.\n */\nclass GraphemeContentSegmenter {\n    constructor(lineData) {\n        this._segments = [];\n        const content = lineData.content;\n        const segmenter = safeIntl.Segmenter(undefined, { granularity: 'grapheme' }).value;\n        const segmentedContent = Array.from(segmenter.segment(content));\n        let segmenterIndex = 0;\n        for (let x = 0; x < content.length; x++) {\n            const segment = segmentedContent[segmenterIndex];\n            // No more segments in the string (eg. an emoji is the last segment)\n            if (!segment) {\n                break;\n            }\n            // The segment isn't renderable (eg. the tail end of an emoji)\n            if (segment.index !== x) {\n                this._segments.push(undefined);\n                continue;\n            }\n            segmenterIndex++;\n            this._segments.push(segment);\n        }\n    }\n    getSegmentAtIndex(index) {\n        return this._segments[index]?.segment;\n    }\n}\n\nexport { createContentSegmenter };\n","import { ViewEventHandler } from '../../../common/viewEventHandler.js';\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 *--------------------------------------------------------------------------------------------*/\nclass BaseRenderStrategy extends ViewEventHandler {\n    get glyphRasterizer() { return this._glyphRasterizer.value; }\n    constructor(_context, _viewGpuContext, _device, _glyphRasterizer) {\n        super();\n        this._context = _context;\n        this._viewGpuContext = _viewGpuContext;\n        this._device = _device;\n        this._glyphRasterizer = _glyphRasterizer;\n        this._context.addEventHandler(this);\n    }\n}\n\nexport { BaseRenderStrategy };\n","import { TextureAtlas } from '../atlas/textureAtlas.js';\nimport { TextureAtlasPage } from '../atlas/textureAtlasPage.js';\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 *--------------------------------------------------------------------------------------------*/\nconst fullFileRenderStrategyWgsl = /*wgsl*/ `\nstruct GlyphInfo {\n\tposition: vec2f,\n\tsize: vec2f,\n\torigin: vec2f,\n};\n\nstruct Vertex {\n\t@location(0) position: vec2f,\n};\n\nstruct Cell {\n\tposition: vec2f,\n\tunused1: vec2f,\n\tglyphIndex: f32,\n\ttextureIndex: f32\n};\n\nstruct LayoutInfo {\n\tcanvasDims: vec2f,\n\tviewportOffset: vec2f,\n\tviewportDims: vec2f,\n}\n\nstruct ScrollOffset {\n\toffset: vec2f\n}\n\nstruct VSOutput {\n\t@builtin(position) position:   vec4f,\n\t@location(1)       layerIndex: f32,\n\t@location(0)       texcoord:   vec2f,\n};\n\n// Uniforms\n@group(0) @binding(${4 /* BindingId.LayoutInfoUniform */})       var<uniform>       layoutInfo:      LayoutInfo;\n@group(0) @binding(${5 /* BindingId.AtlasDimensionsUniform */})  var<uniform>       atlasDims:       vec2f;\n@group(0) @binding(${6 /* BindingId.ScrollOffset */})            var<uniform>       scrollOffset:    ScrollOffset;\n\n// Storage buffers\n@group(0) @binding(${0 /* BindingId.GlyphInfo */})               var<storage, read> glyphInfo:       array<array<GlyphInfo, ${TextureAtlasPage.maximumGlyphCount}>, ${TextureAtlas.maximumPageCount}>;\n@group(0) @binding(${1 /* BindingId.Cells */})                   var<storage, read> cells:           array<Cell>;\n\n@vertex fn vs(\n\tvert: Vertex,\n\t@builtin(instance_index) instanceIndex: u32,\n\t@builtin(vertex_index) vertexIndex : u32\n) -> VSOutput {\n\tlet cell = cells[instanceIndex];\n\tvar glyph = glyphInfo[u32(cell.textureIndex)][u32(cell.glyphIndex)];\n\n\tvar vsOut: VSOutput;\n\t// Multiple vert.position by 2,-2 to get it into clipspace which ranged from -1 to 1\n\tvsOut.position = vec4f(\n\t\t// Make everything relative to top left instead of center\n\t\tvec2f(-1, 1) +\n\t\t((vert.position * vec2f(2, -2)) / layoutInfo.canvasDims) * glyph.size +\n\t\t((cell.position * vec2f(2, -2)) / layoutInfo.canvasDims) +\n\t\t((glyph.origin * vec2f(2, -2)) / layoutInfo.canvasDims) +\n\t\t(((layoutInfo.viewportOffset - scrollOffset.offset * vec2(1, -1)) * 2) / layoutInfo.canvasDims),\n\t\t0.0,\n\t\t1.0\n\t);\n\n\tvsOut.layerIndex = cell.textureIndex;\n\t// Textures are flipped from natural direction on the y-axis, so flip it back\n\tvsOut.texcoord = vert.position;\n\tvsOut.texcoord = (\n\t\t// Glyph offset (0-1)\n\t\t(glyph.position / atlasDims) +\n\t\t// Glyph coordinate (0-1)\n\t\t(vsOut.texcoord * (glyph.size / atlasDims))\n\t);\n\n\treturn vsOut;\n}\n\n@group(0) @binding(${2 /* BindingId.TextureSampler */}) var ourSampler: sampler;\n@group(0) @binding(${3 /* BindingId.Texture */})        var ourTexture: texture_2d_array<f32>;\n\n@fragment fn fs(vsOut: VSOutput) -> @location(0) vec4f {\n\treturn textureSample(ourTexture, ourSampler, vsOut.texcoord, u32(vsOut.layerIndex));\n}\n`;\n\nexport { fullFileRenderStrategyWgsl };\n","import { getActiveWindow } from '../../../../base/browser/dom.js';\nimport { Color } from '../../../../base/common/color.js';\nimport { BugIndicatingError } from '../../../../base/common/errors.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { CursorColumns } from '../../../common/core/cursorColumns.js';\nimport { createContentSegmenter } from '../contentSegmenter.js';\nimport { GPULifecycle } from '../gpuDisposable.js';\nimport { quadVertices } from '../gpuUtils.js';\nimport { ViewGpuContext } from '../viewGpuContext.js';\nimport { BaseRenderStrategy } from './baseRenderStrategy.js';\nimport { fullFileRenderStrategyWgsl } from './fullFileRenderStrategy.wgsl.js';\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/**\n * A render strategy that uploads the content of the entire viewport every frame.\n */\nclass ViewportRenderStrategy extends BaseRenderStrategy {\n    /**\n     * The hard cap for line columns that can be rendered by the GPU renderer.\n     */\n    static { this.maxSupportedColumns = 2000; }\n    get bindGroupEntries() {\n        return [\n            { binding: 1 /* BindingId.Cells */, resource: { buffer: this._cellBindBuffer } },\n            { binding: 6 /* BindingId.ScrollOffset */, resource: { buffer: this._scrollOffsetBindBuffer } }\n        ];\n    }\n    constructor(context, viewGpuContext, device, glyphRasterizer) {\n        super(context, viewGpuContext, device, glyphRasterizer);\n        this.type = 'viewport';\n        this.wgsl = fullFileRenderStrategyWgsl;\n        this._cellBindBufferLineCapacity = 63 /* Constants.CellBindBufferInitialCapacity */;\n        this._activeDoubleBufferIndex = 0;\n        this._visibleObjectCount = 0;\n        this._scrollInitialized = false;\n        this._onDidChangeBindGroupEntries = this._register(new Emitter());\n        this.onDidChangeBindGroupEntries = this._onDidChangeBindGroupEntries.event;\n        this._rebuildCellBuffer(this._cellBindBufferLineCapacity);\n        const scrollOffsetBufferSize = 2;\n        this._scrollOffsetBindBuffer = this._register(GPULifecycle.createBuffer(this._device, {\n            label: 'Monaco scroll offset buffer',\n            size: scrollOffsetBufferSize * Float32Array.BYTES_PER_ELEMENT,\n            usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n        })).object;\n        this._scrollOffsetValueBuffer = new Float32Array(scrollOffsetBufferSize);\n    }\n    _rebuildCellBuffer(lineCount) {\n        this._cellBindBuffer?.destroy();\n        // Increase in chunks so resizing a window by hand doesn't keep allocating and throwing away\n        const lineCountWithIncrement = (Math.floor(lineCount / 32 /* Constants.CellBindBufferCapacityIncrement */) + 1) * 32 /* Constants.CellBindBufferCapacityIncrement */;\n        const bufferSize = lineCountWithIncrement * ViewportRenderStrategy.maxSupportedColumns * 6 /* Constants.IndicesPerCell */ * Float32Array.BYTES_PER_ELEMENT;\n        this._cellBindBuffer = this._register(GPULifecycle.createBuffer(this._device, {\n            label: 'Monaco full file cell buffer',\n            size: bufferSize,\n            usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n        })).object;\n        this._cellValueBuffers = [\n            new ArrayBuffer(bufferSize),\n            new ArrayBuffer(bufferSize),\n        ];\n        this._cellBindBufferLineCapacity = lineCountWithIncrement;\n        this._onDidChangeBindGroupEntries.fire();\n    }\n    // #region Event handlers\n    // The primary job of these handlers is to:\n    // 1. Invalidate the up to date line cache, which will cause the line to be re-rendered when\n    //    it's _within the viewport_.\n    // 2. Pass relevant events on to the render function so it can force certain line ranges to be\n    //    re-rendered even if they're not in the viewport. For example when a view zone is added,\n    //    there are lines that used to be visible but are no longer, so those ranges must be\n    //    cleared and uploaded to the GPU.\n    onConfigurationChanged(e) {\n        return true;\n    }\n    onDecorationsChanged(e) {\n        return true;\n    }\n    onTokensChanged(e) {\n        return true;\n    }\n    onLinesDeleted(e) {\n        return true;\n    }\n    onLinesInserted(e) {\n        return true;\n    }\n    onLinesChanged(e) {\n        return true;\n    }\n    onScrollChanged(e) {\n        const dpr = getActiveWindow().devicePixelRatio;\n        this._scrollOffsetValueBuffer[0] = (e?.scrollLeft ?? this._context.viewLayout.getCurrentScrollLeft()) * dpr;\n        this._scrollOffsetValueBuffer[1] = (e?.scrollTop ?? this._context.viewLayout.getCurrentScrollTop()) * dpr;\n        this._device.queue.writeBuffer(this._scrollOffsetBindBuffer, 0, this._scrollOffsetValueBuffer);\n        return true;\n    }\n    onThemeChanged(e) {\n        return true;\n    }\n    onLineMappingChanged(e) {\n        return true;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    // #endregion\n    reset() {\n        for (const bufferIndex of [0, 1]) {\n            // Zero out buffer and upload to GPU to prevent stale rows from rendering\n            const buffer = new Float32Array(this._cellValueBuffers[bufferIndex]);\n            buffer.fill(0, 0, buffer.length);\n            this._device.queue.writeBuffer(this._cellBindBuffer, 0, buffer.buffer, 0, buffer.byteLength);\n        }\n    }\n    update(viewportData, viewLineOptions) {\n        // IMPORTANT: This is a hot function. Variables are pre-allocated and shared within the\n        // loop. This is done so we don't need to trust the JIT compiler to do this optimization to\n        // avoid potential additional blocking time in garbage collector which is a common cause of\n        // dropped frames.\n        let chars = '';\n        let segment;\n        let charWidth = 0;\n        let y = 0;\n        let x = 0;\n        let absoluteOffsetX = 0;\n        let absoluteOffsetY = 0;\n        let tabXOffset = 0;\n        let glyph;\n        let cellIndex = 0;\n        let tokenStartIndex = 0;\n        let tokenEndIndex = 0;\n        let tokenMetadata = 0;\n        let decorationStyleSetBold;\n        let decorationStyleSetColor;\n        let decorationStyleSetOpacity;\n        let lineData;\n        let decoration;\n        let fillStartIndex = 0;\n        let fillEndIndex = 0;\n        let tokens;\n        const dpr = getActiveWindow().devicePixelRatio;\n        let contentSegmenter;\n        if (!this._scrollInitialized) {\n            this.onScrollChanged();\n            this._scrollInitialized = true;\n        }\n        // Zero out cell buffer or rebuild if needed\n        if (this._cellBindBufferLineCapacity < viewportData.endLineNumber - viewportData.startLineNumber + 1) {\n            this._rebuildCellBuffer(viewportData.endLineNumber - viewportData.startLineNumber + 1);\n        }\n        const cellBuffer = new Float32Array(this._cellValueBuffers[this._activeDoubleBufferIndex]);\n        cellBuffer.fill(0);\n        const lineIndexCount = ViewportRenderStrategy.maxSupportedColumns * 6 /* Constants.IndicesPerCell */;\n        for (y = viewportData.startLineNumber; y <= viewportData.endLineNumber; y++) {\n            // Only attempt to render lines that the GPU renderer can handle\n            if (!this._viewGpuContext.canRender(viewLineOptions, viewportData, y)) {\n                continue;\n            }\n            lineData = viewportData.getViewLineRenderingData(y);\n            tabXOffset = 0;\n            contentSegmenter = createContentSegmenter(lineData, viewLineOptions);\n            charWidth = viewLineOptions.spaceWidth * dpr;\n            absoluteOffsetX = 0;\n            tokens = lineData.tokens;\n            tokenStartIndex = lineData.minColumn - 1;\n            tokenEndIndex = 0;\n            for (let tokenIndex = 0, tokensLen = tokens.getCount(); tokenIndex < tokensLen; tokenIndex++) {\n                tokenEndIndex = tokens.getEndOffset(tokenIndex);\n                if (tokenEndIndex <= tokenStartIndex) {\n                    // The faux indent part of the line should have no token type\n                    continue;\n                }\n                tokenMetadata = tokens.getMetadata(tokenIndex);\n                for (x = tokenStartIndex; x < tokenEndIndex; x++) {\n                    // Only render lines that do not exceed maximum columns\n                    if (x > ViewportRenderStrategy.maxSupportedColumns) {\n                        break;\n                    }\n                    segment = contentSegmenter.getSegmentAtIndex(x);\n                    if (segment === undefined) {\n                        continue;\n                    }\n                    chars = segment;\n                    if (!(lineData.isBasicASCII && viewLineOptions.useMonospaceOptimizations)) {\n                        charWidth = this.glyphRasterizer.getTextMetrics(chars).width;\n                    }\n                    decorationStyleSetColor = undefined;\n                    decorationStyleSetBold = undefined;\n                    decorationStyleSetOpacity = undefined;\n                    // Apply supported inline decoration styles to the cell metadata\n                    for (decoration of lineData.inlineDecorations) {\n                        // This is Range.strictContainsPosition except it works at the cell level,\n                        // it's also inlined to avoid overhead.\n                        if ((y < decoration.range.startLineNumber || y > decoration.range.endLineNumber) ||\n                            (y === decoration.range.startLineNumber && x < decoration.range.startColumn - 1) ||\n                            (y === decoration.range.endLineNumber && x >= decoration.range.endColumn - 1)) {\n                            continue;\n                        }\n                        const rules = ViewGpuContext.decorationCssRuleExtractor.getStyleRules(this._viewGpuContext.canvas.domNode, decoration.inlineClassName);\n                        for (const rule of rules) {\n                            for (const r of rule.style) {\n                                const value = rule.styleMap.get(r)?.toString() ?? '';\n                                switch (r) {\n                                    case 'color': {\n                                        // TODO: This parsing and error handling should move into canRender so fallback\n                                        //       to DOM works\n                                        const parsedColor = Color.Format.CSS.parse(value);\n                                        if (!parsedColor) {\n                                            throw new BugIndicatingError('Invalid color format ' + value);\n                                        }\n                                        decorationStyleSetColor = parsedColor.toNumber32Bit();\n                                        break;\n                                    }\n                                    case 'font-weight': {\n                                        const parsedValue = parseCssFontWeight(value);\n                                        if (parsedValue >= 400) {\n                                            decorationStyleSetBold = true;\n                                            // TODO: Set bold (https://github.com/microsoft/vscode/issues/237584)\n                                        }\n                                        else {\n                                            decorationStyleSetBold = false;\n                                            // TODO: Set normal (https://github.com/microsoft/vscode/issues/237584)\n                                        }\n                                        break;\n                                    }\n                                    case 'opacity': {\n                                        const parsedValue = parseCssOpacity(value);\n                                        decorationStyleSetOpacity = parsedValue;\n                                        break;\n                                    }\n                                    default: throw new BugIndicatingError('Unexpected inline decoration style');\n                                }\n                            }\n                        }\n                    }\n                    if (chars === ' ' || chars === '\\t') {\n                        // Zero out glyph to ensure it doesn't get rendered\n                        cellIndex = ((y - 1) * ViewportRenderStrategy.maxSupportedColumns + x) * 6 /* Constants.IndicesPerCell */;\n                        cellBuffer.fill(0, cellIndex, cellIndex + 6 /* CellBufferInfo.FloatsPerEntry */);\n                        // Adjust xOffset for tab stops\n                        if (chars === '\\t') {\n                            // Find the pixel offset between the current position and the next tab stop\n                            const offsetBefore = x + tabXOffset;\n                            tabXOffset = CursorColumns.nextRenderTabStop(x + tabXOffset, lineData.tabSize);\n                            absoluteOffsetX += charWidth * (tabXOffset - offsetBefore);\n                            // Convert back to offset excluding x and the current character\n                            tabXOffset -= x + 1;\n                        }\n                        else {\n                            absoluteOffsetX += charWidth;\n                        }\n                        continue;\n                    }\n                    const decorationStyleSetId = ViewGpuContext.decorationStyleCache.getOrCreateEntry(decorationStyleSetColor, decorationStyleSetBold, decorationStyleSetOpacity);\n                    glyph = this._viewGpuContext.atlas.getGlyph(this.glyphRasterizer, chars, tokenMetadata, decorationStyleSetId, absoluteOffsetX);\n                    absoluteOffsetY = Math.round(\n                    // Top of layout box (includes line height)\n                    viewportData.relativeVerticalOffset[y - viewportData.startLineNumber] * dpr +\n                        // Delta from top of layout box (includes line height) to top of the inline box (no line height)\n                        Math.floor((viewportData.lineHeight * dpr - (glyph.fontBoundingBoxAscent + glyph.fontBoundingBoxDescent)) / 2) +\n                        // Delta from top of inline box (no line height) to top of glyph origin. If the glyph was drawn\n                        // with a top baseline for example, this ends up drawing the glyph correctly using the alphabetical\n                        // baseline.\n                        glyph.fontBoundingBoxAscent);\n                    cellIndex = ((y - viewportData.startLineNumber) * ViewportRenderStrategy.maxSupportedColumns + x) * 6 /* Constants.IndicesPerCell */;\n                    cellBuffer[cellIndex + 0 /* CellBufferInfo.Offset_X */] = Math.floor(absoluteOffsetX);\n                    cellBuffer[cellIndex + 1 /* CellBufferInfo.Offset_Y */] = absoluteOffsetY;\n                    cellBuffer[cellIndex + 4 /* CellBufferInfo.GlyphIndex */] = glyph.glyphIndex;\n                    cellBuffer[cellIndex + 5 /* CellBufferInfo.TextureIndex */] = glyph.pageIndex;\n                    // Adjust the x pixel offset for the next character\n                    absoluteOffsetX += charWidth;\n                }\n                tokenStartIndex = tokenEndIndex;\n            }\n            // Clear to end of line\n            fillStartIndex = ((y - viewportData.startLineNumber) * ViewportRenderStrategy.maxSupportedColumns + tokenEndIndex) * 6 /* Constants.IndicesPerCell */;\n            fillEndIndex = ((y - viewportData.startLineNumber) * ViewportRenderStrategy.maxSupportedColumns) * 6 /* Constants.IndicesPerCell */;\n            cellBuffer.fill(0, fillStartIndex, fillEndIndex);\n        }\n        const visibleObjectCount = (viewportData.endLineNumber - viewportData.startLineNumber + 1) * lineIndexCount;\n        // This render strategy always uploads the whole viewport\n        this._device.queue.writeBuffer(this._cellBindBuffer, 0, cellBuffer.buffer, 0, (viewportData.endLineNumber - viewportData.startLineNumber) * lineIndexCount * Float32Array.BYTES_PER_ELEMENT);\n        this._activeDoubleBufferIndex = this._activeDoubleBufferIndex ? 0 : 1;\n        this._visibleObjectCount = visibleObjectCount;\n        return visibleObjectCount;\n    }\n    draw(pass, viewportData) {\n        if (this._visibleObjectCount <= 0) {\n            throw new BugIndicatingError('Attempt to draw 0 objects');\n        }\n        pass.draw(quadVertices.length / 2, this._visibleObjectCount);\n    }\n}\nfunction parseCssFontWeight(value) {\n    switch (value) {\n        case 'lighter':\n        case 'normal': return 400;\n        case 'bolder':\n        case 'bold': return 700;\n    }\n    return parseInt(value);\n}\nfunction parseCssOpacity(value) {\n    if (value.endsWith('%')) {\n        return parseFloat(value.substring(0, value.length - 1)) / 100;\n    }\n    if (value.match(/^\\d+(?:\\.\\d*)/)) {\n        return parseFloat(value);\n    }\n    return 1;\n}\n\nexport { ViewportRenderStrategy };\n","import { getActiveWindow } from '../../../../base/browser/dom.js';\nimport { Color } from '../../../../base/common/color.js';\nimport { BugIndicatingError } from '../../../../base/common/errors.js';\nimport { CursorColumns } from '../../../common/core/cursorColumns.js';\nimport { createContentSegmenter } from '../contentSegmenter.js';\nimport { fullFileRenderStrategyWgsl } from './fullFileRenderStrategy.wgsl.js';\nimport { GPULifecycle } from '../gpuDisposable.js';\nimport { quadVertices } from '../gpuUtils.js';\nimport { ViewGpuContext } from '../viewGpuContext.js';\nimport { BaseRenderStrategy } from './baseRenderStrategy.js';\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/**\n * A render strategy that tracks a large buffer, uploading only dirty lines as they change and\n * leveraging heavy caching. This is the most performant strategy but has limitations around long\n * lines and too many lines.\n */\nclass FullFileRenderStrategy extends BaseRenderStrategy {\n    /**\n     * The hard cap for line count that can be rendered by the GPU renderer.\n     */\n    static { this.maxSupportedLines = 3000; }\n    /**\n     * The hard cap for line columns that can be rendered by the GPU renderer.\n     */\n    static { this.maxSupportedColumns = 200; }\n    get bindGroupEntries() {\n        return [\n            { binding: 1 /* BindingId.Cells */, resource: { buffer: this._cellBindBuffer } },\n            { binding: 6 /* BindingId.ScrollOffset */, resource: { buffer: this._scrollOffsetBindBuffer } }\n        ];\n    }\n    constructor(context, viewGpuContext, device, glyphRasterizer) {\n        super(context, viewGpuContext, device, glyphRasterizer);\n        this.type = 'fullfile';\n        this.wgsl = fullFileRenderStrategyWgsl;\n        this._activeDoubleBufferIndex = 0;\n        this._upToDateLines = [new Set(), new Set()];\n        this._visibleObjectCount = 0;\n        this._finalRenderedLine = 0;\n        this._scrollInitialized = false;\n        this._queuedBufferUpdates = [[], []];\n        const bufferSize = FullFileRenderStrategy.maxSupportedLines * FullFileRenderStrategy.maxSupportedColumns * 6 /* Constants.IndicesPerCell */ * Float32Array.BYTES_PER_ELEMENT;\n        this._cellBindBuffer = this._register(GPULifecycle.createBuffer(this._device, {\n            label: 'Monaco full file cell buffer',\n            size: bufferSize,\n            usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n        })).object;\n        this._cellValueBuffers = [\n            new ArrayBuffer(bufferSize),\n            new ArrayBuffer(bufferSize),\n        ];\n        const scrollOffsetBufferSize = 2;\n        this._scrollOffsetBindBuffer = this._register(GPULifecycle.createBuffer(this._device, {\n            label: 'Monaco scroll offset buffer',\n            size: scrollOffsetBufferSize * Float32Array.BYTES_PER_ELEMENT,\n            usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n        })).object;\n        this._scrollOffsetValueBuffer = new Float32Array(scrollOffsetBufferSize);\n    }\n    // #region Event handlers\n    // The primary job of these handlers is to:\n    // 1. Invalidate the up to date line cache, which will cause the line to be re-rendered when\n    //    it's _within the viewport_.\n    // 2. Pass relevant events on to the render function so it can force certain line ranges to be\n    //    re-rendered even if they're not in the viewport. For example when a view zone is added,\n    //    there are lines that used to be visible but are no longer, so those ranges must be\n    //    cleared and uploaded to the GPU.\n    onConfigurationChanged(e) {\n        this._invalidateAllLines();\n        this._queueBufferUpdate(e);\n        return true;\n    }\n    onDecorationsChanged(e) {\n        this._invalidateAllLines();\n        return true;\n    }\n    onTokensChanged(e) {\n        // TODO: This currently fires for the entire viewport whenever scrolling stops\n        //       https://github.com/microsoft/vscode/issues/233942\n        for (const range of e.ranges) {\n            this._invalidateLineRange(range.fromLineNumber, range.toLineNumber);\n        }\n        return true;\n    }\n    onLinesDeleted(e) {\n        // TODO: This currently invalidates everything after the deleted line, it could shift the\n        //       line data up to retain some up to date lines\n        // TODO: This does not invalidate lines that are no longer in the file\n        this._invalidateLinesFrom(e.fromLineNumber);\n        this._queueBufferUpdate(e);\n        return true;\n    }\n    onLinesInserted(e) {\n        // TODO: This currently invalidates everything after the deleted line, it could shift the\n        //       line data up to retain some up to date lines\n        this._invalidateLinesFrom(e.fromLineNumber);\n        return true;\n    }\n    onLinesChanged(e) {\n        this._invalidateLineRange(e.fromLineNumber, e.fromLineNumber + e.count);\n        return true;\n    }\n    onScrollChanged(e) {\n        const dpr = getActiveWindow().devicePixelRatio;\n        this._scrollOffsetValueBuffer[0] = (e?.scrollLeft ?? this._context.viewLayout.getCurrentScrollLeft()) * dpr;\n        this._scrollOffsetValueBuffer[1] = (e?.scrollTop ?? this._context.viewLayout.getCurrentScrollTop()) * dpr;\n        this._device.queue.writeBuffer(this._scrollOffsetBindBuffer, 0, this._scrollOffsetValueBuffer);\n        return true;\n    }\n    onThemeChanged(e) {\n        this._invalidateAllLines();\n        return true;\n    }\n    onLineMappingChanged(e) {\n        this._invalidateAllLines();\n        this._queueBufferUpdate(e);\n        return true;\n    }\n    onZonesChanged(e) {\n        this._invalidateAllLines();\n        this._queueBufferUpdate(e);\n        return true;\n    }\n    // #endregion\n    _invalidateAllLines() {\n        this._upToDateLines[0].clear();\n        this._upToDateLines[1].clear();\n    }\n    _invalidateLinesFrom(lineNumber) {\n        for (const i of [0, 1]) {\n            const upToDateLines = this._upToDateLines[i];\n            for (const upToDateLine of upToDateLines) {\n                if (upToDateLine >= lineNumber) {\n                    upToDateLines.delete(upToDateLine);\n                }\n            }\n        }\n    }\n    _invalidateLineRange(fromLineNumber, toLineNumber) {\n        for (let i = fromLineNumber; i <= toLineNumber; i++) {\n            this._upToDateLines[0].delete(i);\n            this._upToDateLines[1].delete(i);\n        }\n    }\n    reset() {\n        this._invalidateAllLines();\n        for (const bufferIndex of [0, 1]) {\n            // Zero out buffer and upload to GPU to prevent stale rows from rendering\n            const buffer = new Float32Array(this._cellValueBuffers[bufferIndex]);\n            buffer.fill(0, 0, buffer.length);\n            this._device.queue.writeBuffer(this._cellBindBuffer, 0, buffer.buffer, 0, buffer.byteLength);\n        }\n        this._finalRenderedLine = 0;\n    }\n    update(viewportData, viewLineOptions) {\n        // IMPORTANT: This is a hot function. Variables are pre-allocated and shared within the\n        // loop. This is done so we don't need to trust the JIT compiler to do this optimization to\n        // avoid potential additional blocking time in garbage collector which is a common cause of\n        // dropped frames.\n        let chars = '';\n        let segment;\n        let charWidth = 0;\n        let y = 0;\n        let x = 0;\n        let absoluteOffsetX = 0;\n        let absoluteOffsetY = 0;\n        let tabXOffset = 0;\n        let glyph;\n        let cellIndex = 0;\n        let tokenStartIndex = 0;\n        let tokenEndIndex = 0;\n        let tokenMetadata = 0;\n        let decorationStyleSetBold;\n        let decorationStyleSetColor;\n        let decorationStyleSetOpacity;\n        let lineData;\n        let decoration;\n        let fillStartIndex = 0;\n        let fillEndIndex = 0;\n        let tokens;\n        const dpr = getActiveWindow().devicePixelRatio;\n        let contentSegmenter;\n        if (!this._scrollInitialized) {\n            this.onScrollChanged();\n            this._scrollInitialized = true;\n        }\n        // Update cell data\n        const cellBuffer = new Float32Array(this._cellValueBuffers[this._activeDoubleBufferIndex]);\n        const lineIndexCount = FullFileRenderStrategy.maxSupportedColumns * 6 /* Constants.IndicesPerCell */;\n        const upToDateLines = this._upToDateLines[this._activeDoubleBufferIndex];\n        let dirtyLineStart = 3000;\n        let dirtyLineEnd = 0;\n        // Handle any queued buffer updates\n        const queuedBufferUpdates = this._queuedBufferUpdates[this._activeDoubleBufferIndex];\n        while (queuedBufferUpdates.length) {\n            const e = queuedBufferUpdates.shift();\n            switch (e.type) {\n                // TODO: Refine these cases so we're not throwing away everything\n                case 2 /* ViewEventType.ViewConfigurationChanged */:\n                case 8 /* ViewEventType.ViewLineMappingChanged */:\n                case 17 /* ViewEventType.ViewZonesChanged */: {\n                    cellBuffer.fill(0);\n                    dirtyLineStart = 1;\n                    dirtyLineEnd = Math.max(dirtyLineEnd, this._finalRenderedLine);\n                    this._finalRenderedLine = 0;\n                    break;\n                }\n                case 10 /* ViewEventType.ViewLinesDeleted */: {\n                    // Shift content below deleted line up\n                    const deletedLineContentStartIndex = (e.fromLineNumber - 1) * FullFileRenderStrategy.maxSupportedColumns * 6 /* Constants.IndicesPerCell */;\n                    const deletedLineContentEndIndex = (e.toLineNumber) * FullFileRenderStrategy.maxSupportedColumns * 6 /* Constants.IndicesPerCell */;\n                    const nullContentStartIndex = (this._finalRenderedLine - (e.toLineNumber - e.fromLineNumber + 1)) * FullFileRenderStrategy.maxSupportedColumns * 6 /* Constants.IndicesPerCell */;\n                    cellBuffer.set(cellBuffer.subarray(deletedLineContentEndIndex), deletedLineContentStartIndex);\n                    // Zero out content on lines that are no longer valid\n                    cellBuffer.fill(0, nullContentStartIndex);\n                    // Update dirty lines and final rendered line\n                    dirtyLineStart = Math.min(dirtyLineStart, e.fromLineNumber);\n                    dirtyLineEnd = Math.max(dirtyLineEnd, this._finalRenderedLine);\n                    this._finalRenderedLine -= e.toLineNumber - e.fromLineNumber + 1;\n                    break;\n                }\n            }\n        }\n        for (y = viewportData.startLineNumber; y <= viewportData.endLineNumber; y++) {\n            // Only attempt to render lines that the GPU renderer can handle\n            if (!this._viewGpuContext.canRender(viewLineOptions, viewportData, y)) {\n                fillStartIndex = ((y - 1) * FullFileRenderStrategy.maxSupportedColumns) * 6 /* Constants.IndicesPerCell */;\n                fillEndIndex = (y * FullFileRenderStrategy.maxSupportedColumns) * 6 /* Constants.IndicesPerCell */;\n                cellBuffer.fill(0, fillStartIndex, fillEndIndex);\n                dirtyLineStart = Math.min(dirtyLineStart, y);\n                dirtyLineEnd = Math.max(dirtyLineEnd, y);\n                continue;\n            }\n            // Skip updating the line if it's already up to date\n            if (upToDateLines.has(y)) {\n                continue;\n            }\n            dirtyLineStart = Math.min(dirtyLineStart, y);\n            dirtyLineEnd = Math.max(dirtyLineEnd, y);\n            lineData = viewportData.getViewLineRenderingData(y);\n            tabXOffset = 0;\n            contentSegmenter = createContentSegmenter(lineData, viewLineOptions);\n            charWidth = viewLineOptions.spaceWidth * dpr;\n            absoluteOffsetX = 0;\n            tokens = lineData.tokens;\n            tokenStartIndex = lineData.minColumn - 1;\n            tokenEndIndex = 0;\n            for (let tokenIndex = 0, tokensLen = tokens.getCount(); tokenIndex < tokensLen; tokenIndex++) {\n                tokenEndIndex = tokens.getEndOffset(tokenIndex);\n                if (tokenEndIndex <= tokenStartIndex) {\n                    // The faux indent part of the line should have no token type\n                    continue;\n                }\n                tokenMetadata = tokens.getMetadata(tokenIndex);\n                for (x = tokenStartIndex; x < tokenEndIndex; x++) {\n                    // Only render lines that do not exceed maximum columns\n                    if (x > FullFileRenderStrategy.maxSupportedColumns) {\n                        break;\n                    }\n                    segment = contentSegmenter.getSegmentAtIndex(x);\n                    if (segment === undefined) {\n                        continue;\n                    }\n                    chars = segment;\n                    if (!(lineData.isBasicASCII && viewLineOptions.useMonospaceOptimizations)) {\n                        charWidth = this.glyphRasterizer.getTextMetrics(chars).width;\n                    }\n                    decorationStyleSetColor = undefined;\n                    decorationStyleSetBold = undefined;\n                    decorationStyleSetOpacity = undefined;\n                    // Apply supported inline decoration styles to the cell metadata\n                    for (decoration of lineData.inlineDecorations) {\n                        // This is Range.strictContainsPosition except it works at the cell level,\n                        // it's also inlined to avoid overhead.\n                        if ((y < decoration.range.startLineNumber || y > decoration.range.endLineNumber) ||\n                            (y === decoration.range.startLineNumber && x < decoration.range.startColumn - 1) ||\n                            (y === decoration.range.endLineNumber && x >= decoration.range.endColumn - 1)) {\n                            continue;\n                        }\n                        const rules = ViewGpuContext.decorationCssRuleExtractor.getStyleRules(this._viewGpuContext.canvas.domNode, decoration.inlineClassName);\n                        for (const rule of rules) {\n                            for (const r of rule.style) {\n                                const value = rule.styleMap.get(r)?.toString() ?? '';\n                                switch (r) {\n                                    case 'color': {\n                                        // TODO: This parsing and error handling should move into canRender so fallback\n                                        //       to DOM works\n                                        const parsedColor = Color.Format.CSS.parse(value);\n                                        if (!parsedColor) {\n                                            throw new BugIndicatingError('Invalid color format ' + value);\n                                        }\n                                        decorationStyleSetColor = parsedColor.toNumber32Bit();\n                                        break;\n                                    }\n                                    case 'font-weight': {\n                                        const parsedValue = parseCssFontWeight(value);\n                                        if (parsedValue >= 400) {\n                                            decorationStyleSetBold = true;\n                                            // TODO: Set bold (https://github.com/microsoft/vscode/issues/237584)\n                                        }\n                                        else {\n                                            decorationStyleSetBold = false;\n                                            // TODO: Set normal (https://github.com/microsoft/vscode/issues/237584)\n                                        }\n                                        break;\n                                    }\n                                    case 'opacity': {\n                                        const parsedValue = parseCssOpacity(value);\n                                        decorationStyleSetOpacity = parsedValue;\n                                        break;\n                                    }\n                                    default: throw new BugIndicatingError('Unexpected inline decoration style');\n                                }\n                            }\n                        }\n                    }\n                    if (chars === ' ' || chars === '\\t') {\n                        // Zero out glyph to ensure it doesn't get rendered\n                        cellIndex = ((y - 1) * FullFileRenderStrategy.maxSupportedColumns + x) * 6 /* Constants.IndicesPerCell */;\n                        cellBuffer.fill(0, cellIndex, cellIndex + 6 /* CellBufferInfo.FloatsPerEntry */);\n                        // Adjust xOffset for tab stops\n                        if (chars === '\\t') {\n                            // Find the pixel offset between the current position and the next tab stop\n                            const offsetBefore = x + tabXOffset;\n                            tabXOffset = CursorColumns.nextRenderTabStop(x + tabXOffset, lineData.tabSize);\n                            absoluteOffsetX += charWidth * (tabXOffset - offsetBefore);\n                            // Convert back to offset excluding x and the current character\n                            tabXOffset -= x + 1;\n                        }\n                        else {\n                            absoluteOffsetX += charWidth;\n                        }\n                        continue;\n                    }\n                    const decorationStyleSetId = ViewGpuContext.decorationStyleCache.getOrCreateEntry(decorationStyleSetColor, decorationStyleSetBold, decorationStyleSetOpacity);\n                    glyph = this._viewGpuContext.atlas.getGlyph(this.glyphRasterizer, chars, tokenMetadata, decorationStyleSetId, absoluteOffsetX);\n                    absoluteOffsetY = Math.round(\n                    // Top of layout box (includes line height)\n                    viewportData.relativeVerticalOffset[y - viewportData.startLineNumber] * dpr +\n                        // Delta from top of layout box (includes line height) to top of the inline box (no line height)\n                        Math.floor((viewportData.lineHeight * dpr - (glyph.fontBoundingBoxAscent + glyph.fontBoundingBoxDescent)) / 2) +\n                        // Delta from top of inline box (no line height) to top of glyph origin. If the glyph was drawn\n                        // with a top baseline for example, this ends up drawing the glyph correctly using the alphabetical\n                        // baseline.\n                        glyph.fontBoundingBoxAscent);\n                    cellIndex = ((y - 1) * FullFileRenderStrategy.maxSupportedColumns + x) * 6 /* Constants.IndicesPerCell */;\n                    cellBuffer[cellIndex + 0 /* CellBufferInfo.Offset_X */] = Math.floor(absoluteOffsetX);\n                    cellBuffer[cellIndex + 1 /* CellBufferInfo.Offset_Y */] = absoluteOffsetY;\n                    cellBuffer[cellIndex + 4 /* CellBufferInfo.GlyphIndex */] = glyph.glyphIndex;\n                    cellBuffer[cellIndex + 5 /* CellBufferInfo.TextureIndex */] = glyph.pageIndex;\n                    // Adjust the x pixel offset for the next character\n                    absoluteOffsetX += charWidth;\n                }\n                tokenStartIndex = tokenEndIndex;\n            }\n            // Clear to end of line\n            fillStartIndex = ((y - 1) * FullFileRenderStrategy.maxSupportedColumns + tokenEndIndex) * 6 /* Constants.IndicesPerCell */;\n            fillEndIndex = (y * FullFileRenderStrategy.maxSupportedColumns) * 6 /* Constants.IndicesPerCell */;\n            cellBuffer.fill(0, fillStartIndex, fillEndIndex);\n            upToDateLines.add(y);\n        }\n        const visibleObjectCount = (viewportData.endLineNumber - viewportData.startLineNumber + 1) * lineIndexCount;\n        // Only write when there is changed data\n        dirtyLineStart = Math.min(dirtyLineStart, FullFileRenderStrategy.maxSupportedLines);\n        dirtyLineEnd = Math.min(dirtyLineEnd, FullFileRenderStrategy.maxSupportedLines);\n        if (dirtyLineStart <= dirtyLineEnd) {\n            // Write buffer and swap it out to unblock writes\n            this._device.queue.writeBuffer(this._cellBindBuffer, (dirtyLineStart - 1) * lineIndexCount * Float32Array.BYTES_PER_ELEMENT, cellBuffer.buffer, (dirtyLineStart - 1) * lineIndexCount * Float32Array.BYTES_PER_ELEMENT, (dirtyLineEnd - dirtyLineStart + 1) * lineIndexCount * Float32Array.BYTES_PER_ELEMENT);\n        }\n        this._finalRenderedLine = Math.max(this._finalRenderedLine, dirtyLineEnd);\n        this._activeDoubleBufferIndex = this._activeDoubleBufferIndex ? 0 : 1;\n        this._visibleObjectCount = visibleObjectCount;\n        return visibleObjectCount;\n    }\n    draw(pass, viewportData) {\n        if (this._visibleObjectCount <= 0) {\n            throw new BugIndicatingError('Attempt to draw 0 objects');\n        }\n        pass.draw(quadVertices.length / 2, this._visibleObjectCount, undefined, (viewportData.startLineNumber - 1) * FullFileRenderStrategy.maxSupportedColumns);\n    }\n    /**\n     * Queue updates that need to happen on the active buffer, not just the cache. This will be\n     * deferred to when the actual cell buffer is changed since the active buffer could be locked by\n     * the GPU which would block the main thread.\n     */\n    _queueBufferUpdate(e) {\n        this._queuedBufferUpdates[0].push(e);\n        this._queuedBufferUpdates[1].push(e);\n    }\n}\nfunction parseCssFontWeight(value) {\n    switch (value) {\n        case 'lighter':\n        case 'normal': return 400;\n        case 'bolder':\n        case 'bold': return 700;\n    }\n    return parseInt(value);\n}\nfunction parseCssOpacity(value) {\n    if (value.endsWith('%')) {\n        return parseFloat(value.substring(0, value.length - 1)) / 100;\n    }\n    if (value.match(/^\\d+(?:\\.\\d*)/)) {\n        return parseFloat(value);\n    }\n    return 1;\n}\n\nexport { FullFileRenderStrategy };\n","import { getActiveWindow } from '../../../../base/browser/dom.js';\nimport { BugIndicatingError } from '../../../../base/common/errors.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { ILogService } from '../../../../platform/log/common/log.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { TextureAtlasPage } from '../../gpu/atlas/textureAtlasPage.js';\nimport { GPULifecycle } from '../../gpu/gpuDisposable.js';\nimport { quadVertices } from '../../gpu/gpuUtils.js';\nimport { ViewGpuContext } from '../../gpu/viewGpuContext.js';\nimport { LineVisibleRanges, HorizontalRange, VisibleRanges, FloatHorizontalRange, HorizontalPosition } from '../../view/renderingContext.js';\nimport { ViewPart } from '../../view/viewPart.js';\nimport { ViewLineOptions } from '../viewLines/viewLineOptions.js';\nimport { CursorColumns } from '../../../common/core/cursorColumns.js';\nimport { TextureAtlas } from '../../gpu/atlas/textureAtlas.js';\nimport { createContentSegmenter } from '../../gpu/contentSegmenter.js';\nimport { ViewportRenderStrategy } from '../../gpu/renderStrategy/viewportRenderStrategy.js';\nimport { FullFileRenderStrategy } from '../../gpu/renderStrategy/fullFileRenderStrategy.js';\nimport { MutableDisposable } from '../../../../base/common/lifecycle.js';\nimport { GlyphRasterizer } from '../../gpu/raster/glyphRasterizer.js';\nimport { autorun } from '../../../../base/common/observableInternal/reactions/autorun.js';\nimport { runOnChange } from '../../../../base/common/observableInternal/utils/runOnChange.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/**\n * The GPU implementation of the ViewLines part.\n */\nlet ViewLinesGpu = class ViewLinesGpu extends ViewPart {\n    constructor(context, _viewGpuContext, _instantiationService, _logService) {\n        super(context);\n        this._viewGpuContext = _viewGpuContext;\n        this._instantiationService = _instantiationService;\n        this._logService = _logService;\n        this._atlasGpuTextureVersions = [];\n        this._initialized = false;\n        this._glyphRasterizer = this._register(new MutableDisposable());\n        this._renderStrategy = this._register(new MutableDisposable());\n        this.canvas = this._viewGpuContext.canvas.domNode;\n        // Re-render the following frame after canvas device pixel dimensions change, provided a\n        // new render does not occur.\n        this._register(autorun(reader => {\n            this._viewGpuContext.canvasDevicePixelDimensions.read(reader);\n            const lastViewportData = this._lastViewportData;\n            if (lastViewportData) {\n                setTimeout(() => {\n                    if (lastViewportData === this._lastViewportData) {\n                        this.renderText(lastViewportData);\n                    }\n                });\n            }\n        }));\n        this.initWebgpu();\n    }\n    async initWebgpu() {\n        // #region General\n        this._device = ViewGpuContext.deviceSync || await ViewGpuContext.device;\n        if (this._store.isDisposed) {\n            return;\n        }\n        const atlas = ViewGpuContext.atlas;\n        // Rerender when the texture atlas deletes glyphs\n        this._register(atlas.onDidDeleteGlyphs(() => {\n            this._atlasGpuTextureVersions.length = 0;\n            this._atlasGpuTextureVersions[0] = 0;\n            this._atlasGpuTextureVersions[1] = 0;\n            this._renderStrategy.value.reset();\n        }));\n        const presentationFormat = navigator.gpu.getPreferredCanvasFormat();\n        this._viewGpuContext.ctx.configure({\n            device: this._device,\n            format: presentationFormat,\n            alphaMode: 'premultiplied',\n        });\n        this._renderPassColorAttachment = {\n            view: null, // Will be filled at render time\n            loadOp: 'load',\n            storeOp: 'store',\n        };\n        this._renderPassDescriptor = {\n            label: 'Monaco render pass',\n            colorAttachments: [this._renderPassColorAttachment],\n        };\n        // #endregion General\n        // #region Uniforms\n        let layoutInfoUniformBuffer;\n        {\n            const bufferValues = new Float32Array(6 /* Info.FloatsPerEntry */);\n            const updateBufferValues = (canvasDevicePixelWidth = this.canvas.width, canvasDevicePixelHeight = this.canvas.height) => {\n                bufferValues[0 /* Info.Offset_CanvasWidth____ */] = canvasDevicePixelWidth;\n                bufferValues[1 /* Info.Offset_CanvasHeight___ */] = canvasDevicePixelHeight;\n                bufferValues[2 /* Info.Offset_ViewportOffsetX */] = Math.ceil(this._context.configuration.options.get(165 /* EditorOption.layoutInfo */).contentLeft * getActiveWindow().devicePixelRatio);\n                bufferValues[3 /* Info.Offset_ViewportOffsetY */] = 0;\n                bufferValues[4 /* Info.Offset_ViewportWidth__ */] = bufferValues[0 /* Info.Offset_CanvasWidth____ */] - bufferValues[2 /* Info.Offset_ViewportOffsetX */];\n                bufferValues[5 /* Info.Offset_ViewportHeight_ */] = bufferValues[1 /* Info.Offset_CanvasHeight___ */] - bufferValues[3 /* Info.Offset_ViewportOffsetY */];\n                return bufferValues;\n            };\n            layoutInfoUniformBuffer = this._register(GPULifecycle.createBuffer(this._device, {\n                label: 'Monaco uniform buffer',\n                size: 24 /* Info.BytesPerEntry */,\n                usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n            }, () => updateBufferValues())).object;\n            this._register(runOnChange(this._viewGpuContext.canvasDevicePixelDimensions, ({ width, height }) => {\n                this._device.queue.writeBuffer(layoutInfoUniformBuffer, 0, updateBufferValues(width, height));\n            }));\n            this._register(runOnChange(this._viewGpuContext.contentLeft, () => {\n                this._device.queue.writeBuffer(layoutInfoUniformBuffer, 0, updateBufferValues());\n            }));\n        }\n        let atlasInfoUniformBuffer;\n        {\n            atlasInfoUniformBuffer = this._register(GPULifecycle.createBuffer(this._device, {\n                label: 'Monaco atlas info uniform buffer',\n                size: 8 /* Info.BytesPerEntry */,\n                usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n            }, () => {\n                const values = new Float32Array(2 /* Info.FloatsPerEntry */);\n                values[0 /* Info.Offset_Width_ */] = atlas.pageSize;\n                values[1 /* Info.Offset_Height */] = atlas.pageSize;\n                return values;\n            })).object;\n        }\n        // #endregion Uniforms\n        // #region Storage buffers\n        const fontFamily = this._context.configuration.options.get(58 /* EditorOption.fontFamily */);\n        const fontSize = this._context.configuration.options.get(61 /* EditorOption.fontSize */);\n        this._glyphRasterizer.value = this._register(new GlyphRasterizer(fontSize, fontFamily, this._viewGpuContext.devicePixelRatio.get(), ViewGpuContext.decorationStyleCache));\n        this._register(runOnChange(this._viewGpuContext.devicePixelRatio, () => {\n            this._refreshGlyphRasterizer();\n        }));\n        this._renderStrategy.value = this._instantiationService.createInstance(FullFileRenderStrategy, this._context, this._viewGpuContext, this._device, this._glyphRasterizer);\n        // this._renderStrategy.value = this._instantiationService.createInstance(ViewportRenderStrategy, this._context, this._viewGpuContext, this._device);\n        this._glyphStorageBuffer = this._register(GPULifecycle.createBuffer(this._device, {\n            label: 'Monaco glyph storage buffer',\n            size: TextureAtlas.maximumPageCount * (TextureAtlasPage.maximumGlyphCount * 24 /* GlyphStorageBufferInfo.BytesPerEntry */),\n            usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n        })).object;\n        this._atlasGpuTextureVersions[0] = 0;\n        this._atlasGpuTextureVersions[1] = 0;\n        this._atlasGpuTexture = this._register(GPULifecycle.createTexture(this._device, {\n            label: 'Monaco atlas texture',\n            format: 'rgba8unorm',\n            size: { width: atlas.pageSize, height: atlas.pageSize, depthOrArrayLayers: TextureAtlas.maximumPageCount },\n            dimension: '2d',\n            usage: GPUTextureUsage.TEXTURE_BINDING |\n                GPUTextureUsage.COPY_DST |\n                GPUTextureUsage.RENDER_ATTACHMENT,\n        })).object;\n        this._updateAtlasStorageBufferAndTexture();\n        // #endregion Storage buffers\n        // #region Vertex buffer\n        this._vertexBuffer = this._register(GPULifecycle.createBuffer(this._device, {\n            label: 'Monaco vertex buffer',\n            size: quadVertices.byteLength,\n            usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n        }, quadVertices)).object;\n        // #endregion Vertex buffer\n        // #region Shader module\n        const module = this._device.createShaderModule({\n            label: 'Monaco shader module',\n            code: this._renderStrategy.value.wgsl,\n        });\n        // #endregion Shader module\n        // #region Pipeline\n        this._pipeline = this._device.createRenderPipeline({\n            label: 'Monaco render pipeline',\n            layout: 'auto',\n            vertex: {\n                module,\n                buffers: [\n                    {\n                        arrayStride: 2 * Float32Array.BYTES_PER_ELEMENT, // 2 floats, 4 bytes each\n                        attributes: [\n                            { shaderLocation: 0, offset: 0, format: 'float32x2' }, // position\n                        ],\n                    }\n                ]\n            },\n            fragment: {\n                module,\n                targets: [\n                    {\n                        format: presentationFormat,\n                        blend: {\n                            color: {\n                                srcFactor: 'src-alpha',\n                                dstFactor: 'one-minus-src-alpha'\n                            },\n                            alpha: {\n                                srcFactor: 'src-alpha',\n                                dstFactor: 'one-minus-src-alpha'\n                            },\n                        },\n                    }\n                ],\n            },\n        });\n        // #endregion Pipeline\n        // #region Bind group\n        this._rebuildBindGroup = () => {\n            this._bindGroup = this._device.createBindGroup({\n                label: 'Monaco bind group',\n                layout: this._pipeline.getBindGroupLayout(0),\n                entries: [\n                    // TODO: Pass in generically as array?\n                    { binding: 0 /* BindingId.GlyphInfo */, resource: { buffer: this._glyphStorageBuffer } },\n                    {\n                        binding: 2 /* BindingId.TextureSampler */, resource: this._device.createSampler({\n                            label: 'Monaco atlas sampler',\n                            magFilter: 'nearest',\n                            minFilter: 'nearest',\n                        })\n                    },\n                    { binding: 3 /* BindingId.Texture */, resource: this._atlasGpuTexture.createView() },\n                    { binding: 4 /* BindingId.LayoutInfoUniform */, resource: { buffer: layoutInfoUniformBuffer } },\n                    { binding: 5 /* BindingId.AtlasDimensionsUniform */, resource: { buffer: atlasInfoUniformBuffer } },\n                    ...this._renderStrategy.value.bindGroupEntries\n                ],\n            });\n        };\n        this._rebuildBindGroup();\n        // endregion Bind group\n        this._initialized = true;\n        // Render the initial viewport immediately after initialization\n        if (this._initViewportData) {\n            // HACK: Rendering multiple times in the same frame like this isn't ideal, but there\n            //       isn't an easy way to merge viewport data\n            for (const viewportData of this._initViewportData) {\n                this.renderText(viewportData);\n            }\n            this._initViewportData = undefined;\n        }\n    }\n    _refreshRenderStrategy(viewportData) {\n        if (this._renderStrategy.value?.type === 'viewport') {\n            return;\n        }\n        if (viewportData.endLineNumber < FullFileRenderStrategy.maxSupportedLines && this._viewportMaxColumn(viewportData) < FullFileRenderStrategy.maxSupportedColumns) {\n            return;\n        }\n        this._logService.trace(`File is larger than ${FullFileRenderStrategy.maxSupportedLines} lines or ${FullFileRenderStrategy.maxSupportedColumns} columns, switching to viewport render strategy`);\n        const viewportRenderStrategy = this._instantiationService.createInstance(ViewportRenderStrategy, this._context, this._viewGpuContext, this._device, this._glyphRasterizer);\n        this._renderStrategy.value = viewportRenderStrategy;\n        this._register(viewportRenderStrategy.onDidChangeBindGroupEntries(() => this._rebuildBindGroup?.()));\n        this._rebuildBindGroup?.();\n    }\n    _viewportMaxColumn(viewportData) {\n        let maxColumn = 0;\n        let lineData;\n        for (let i = viewportData.startLineNumber; i <= viewportData.endLineNumber; i++) {\n            lineData = viewportData.getViewLineRenderingData(i);\n            maxColumn = Math.max(maxColumn, lineData.maxColumn);\n        }\n        return maxColumn;\n    }\n    _updateAtlasStorageBufferAndTexture() {\n        for (const [layerIndex, page] of ViewGpuContext.atlas.pages.entries()) {\n            if (layerIndex >= TextureAtlas.maximumPageCount) {\n                console.log(`Attempt to upload atlas page [${layerIndex}], only ${TextureAtlas.maximumPageCount} are supported currently`);\n                continue;\n            }\n            // Skip the update if it's already the latest version\n            if (page.version === this._atlasGpuTextureVersions[layerIndex]) {\n                continue;\n            }\n            this._logService.trace('Updating atlas page[', layerIndex, '] from version ', this._atlasGpuTextureVersions[layerIndex], ' to version ', page.version);\n            const entryCount = 6 /* GlyphStorageBufferInfo.FloatsPerEntry */ * TextureAtlasPage.maximumGlyphCount;\n            const values = new Float32Array(entryCount);\n            let entryOffset = 0;\n            for (const glyph of page.glyphs) {\n                values[entryOffset + 0 /* GlyphStorageBufferInfo.Offset_TexturePosition */] = glyph.x;\n                values[entryOffset + 0 /* GlyphStorageBufferInfo.Offset_TexturePosition */ + 1] = glyph.y;\n                values[entryOffset + 2 /* GlyphStorageBufferInfo.Offset_TextureSize */] = glyph.w;\n                values[entryOffset + 2 /* GlyphStorageBufferInfo.Offset_TextureSize */ + 1] = glyph.h;\n                values[entryOffset + 4 /* GlyphStorageBufferInfo.Offset_OriginPosition */] = glyph.originOffsetX;\n                values[entryOffset + 4 /* GlyphStorageBufferInfo.Offset_OriginPosition */ + 1] = glyph.originOffsetY;\n                entryOffset += 6 /* GlyphStorageBufferInfo.FloatsPerEntry */;\n            }\n            if (entryOffset / 6 /* GlyphStorageBufferInfo.FloatsPerEntry */ > TextureAtlasPage.maximumGlyphCount) {\n                throw new Error(`Attempting to write more glyphs (${entryOffset / 6 /* GlyphStorageBufferInfo.FloatsPerEntry */}) than the GPUBuffer can hold (${TextureAtlasPage.maximumGlyphCount})`);\n            }\n            this._device.queue.writeBuffer(this._glyphStorageBuffer, layerIndex * 6 /* GlyphStorageBufferInfo.FloatsPerEntry */ * TextureAtlasPage.maximumGlyphCount * Float32Array.BYTES_PER_ELEMENT, values, 0, 6 /* GlyphStorageBufferInfo.FloatsPerEntry */ * TextureAtlasPage.maximumGlyphCount);\n            if (page.usedArea.right - page.usedArea.left > 0 && page.usedArea.bottom - page.usedArea.top > 0) {\n                this._device.queue.copyExternalImageToTexture({ source: page.source }, {\n                    texture: this._atlasGpuTexture,\n                    origin: {\n                        x: page.usedArea.left,\n                        y: page.usedArea.top,\n                        z: layerIndex\n                    }\n                }, {\n                    width: page.usedArea.right - page.usedArea.left + 1,\n                    height: page.usedArea.bottom - page.usedArea.top + 1\n                });\n            }\n            this._atlasGpuTextureVersions[layerIndex] = page.version;\n        }\n    }\n    prepareRender(ctx) {\n        throw new BugIndicatingError('Should not be called');\n    }\n    render(ctx) {\n        throw new BugIndicatingError('Should not be called');\n    }\n    // #region Event handlers\n    // Since ViewLinesGpu currently coordinates rendering to the canvas, it must listen to all\n    // changed events that any GPU part listens to. This is because any drawing to the canvas will\n    // clear it for that frame, so all parts must be rendered every time.\n    //\n    // Additionally, since this is intrinsically linked to ViewLines, it must also listen to events\n    // from that side. Luckily rendering is cheap, it's only when uploaded data changes does it\n    // start to cost.\n    onConfigurationChanged(e) {\n        this._refreshGlyphRasterizer();\n        return true;\n    }\n    onCursorStateChanged(e) { return true; }\n    onDecorationsChanged(e) { return true; }\n    onFlushed(e) { return true; }\n    onLinesChanged(e) { return true; }\n    onLinesDeleted(e) { return true; }\n    onLinesInserted(e) { return true; }\n    onLineMappingChanged(e) { return true; }\n    onRevealRangeRequest(e) { return true; }\n    onScrollChanged(e) { return true; }\n    onThemeChanged(e) { return true; }\n    onZonesChanged(e) { return true; }\n    // #endregion\n    _refreshGlyphRasterizer() {\n        const glyphRasterizer = this._glyphRasterizer.value;\n        if (!glyphRasterizer) {\n            return;\n        }\n        const fontFamily = this._context.configuration.options.get(58 /* EditorOption.fontFamily */);\n        const fontSize = this._context.configuration.options.get(61 /* EditorOption.fontSize */);\n        const devicePixelRatio = this._viewGpuContext.devicePixelRatio.get();\n        if (glyphRasterizer.fontFamily !== fontFamily ||\n            glyphRasterizer.fontSize !== fontSize ||\n            glyphRasterizer.devicePixelRatio !== devicePixelRatio) {\n            this._glyphRasterizer.value = new GlyphRasterizer(fontSize, fontFamily, devicePixelRatio, ViewGpuContext.decorationStyleCache);\n        }\n    }\n    renderText(viewportData) {\n        if (this._initialized) {\n            this._refreshRenderStrategy(viewportData);\n            return this._renderText(viewportData);\n        }\n        else {\n            this._initViewportData = this._initViewportData ?? [];\n            this._initViewportData.push(viewportData);\n        }\n    }\n    _renderText(viewportData) {\n        this._viewGpuContext.rectangleRenderer.draw(viewportData);\n        const options = new ViewLineOptions(this._context.configuration, this._context.theme.type);\n        this._renderStrategy.value.update(viewportData, options);\n        this._updateAtlasStorageBufferAndTexture();\n        const encoder = this._device.createCommandEncoder({ label: 'Monaco command encoder' });\n        this._renderPassColorAttachment.view = this._viewGpuContext.ctx.getCurrentTexture().createView({ label: 'Monaco canvas texture view' });\n        const pass = encoder.beginRenderPass(this._renderPassDescriptor);\n        pass.setPipeline(this._pipeline);\n        pass.setVertexBuffer(0, this._vertexBuffer);\n        // Only draw the content area\n        const contentLeft = Math.ceil(this._viewGpuContext.contentLeft.get() * this._viewGpuContext.devicePixelRatio.get());\n        pass.setScissorRect(contentLeft, 0, this.canvas.width - contentLeft, this.canvas.height);\n        pass.setBindGroup(0, this._bindGroup);\n        this._renderStrategy.value.draw(pass, viewportData);\n        pass.end();\n        const commandBuffer = encoder.finish();\n        this._device.queue.submit([commandBuffer]);\n        this._lastViewportData = viewportData;\n        this._lastViewLineOptions = options;\n    }\n    linesVisibleRangesForRange(_range, includeNewLines) {\n        if (!this._lastViewportData) {\n            return null;\n        }\n        const originalEndLineNumber = _range.endLineNumber;\n        const range = Range.intersectRanges(_range, this._lastViewportData.visibleRange);\n        if (!range) {\n            return null;\n        }\n        const rendStartLineNumber = this._lastViewportData.startLineNumber;\n        const rendEndLineNumber = this._lastViewportData.endLineNumber;\n        const viewportData = this._lastViewportData;\n        const viewLineOptions = this._lastViewLineOptions;\n        if (!viewportData || !viewLineOptions) {\n            return null;\n        }\n        const visibleRanges = [];\n        let nextLineModelLineNumber = 0;\n        if (includeNewLines) {\n            nextLineModelLineNumber = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(range.startLineNumber, 1)).lineNumber;\n        }\n        for (let lineNumber = range.startLineNumber; lineNumber <= range.endLineNumber; lineNumber++) {\n            if (lineNumber < rendStartLineNumber || lineNumber > rendEndLineNumber) {\n                continue;\n            }\n            const startColumn = lineNumber === range.startLineNumber ? range.startColumn : 1;\n            const continuesInNextLine = lineNumber !== originalEndLineNumber;\n            const endColumn = continuesInNextLine ? this._context.viewModel.getLineMaxColumn(lineNumber) : range.endColumn;\n            const visibleRangesForLine = this._visibleRangesForLineRange(lineNumber, startColumn, endColumn);\n            if (!visibleRangesForLine) {\n                continue;\n            }\n            if (includeNewLines && lineNumber < originalEndLineNumber) {\n                const currentLineModelLineNumber = nextLineModelLineNumber;\n                nextLineModelLineNumber = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(lineNumber + 1, 1)).lineNumber;\n                if (currentLineModelLineNumber !== nextLineModelLineNumber) {\n                    visibleRangesForLine.ranges[visibleRangesForLine.ranges.length - 1].width += viewLineOptions.spaceWidth;\n                }\n            }\n            visibleRanges.push(new LineVisibleRanges(visibleRangesForLine.outsideRenderedLine, lineNumber, HorizontalRange.from(visibleRangesForLine.ranges), continuesInNextLine));\n        }\n        if (visibleRanges.length === 0) {\n            return null;\n        }\n        return visibleRanges;\n    }\n    _visibleRangesForLineRange(lineNumber, startColumn, endColumn) {\n        if (this.shouldRender()) {\n            // Cannot read from the DOM because it is dirty\n            // i.e. the model & the dom are out of sync, so I'd be reading something stale\n            return null;\n        }\n        const viewportData = this._lastViewportData;\n        const viewLineOptions = this._lastViewLineOptions;\n        if (!viewportData || !viewLineOptions || lineNumber < viewportData.startLineNumber || lineNumber > viewportData.endLineNumber) {\n            return null;\n        }\n        // Resolve tab widths for this line\n        const lineData = viewportData.getViewLineRenderingData(lineNumber);\n        const content = lineData.content;\n        let contentSegmenter;\n        if (!(lineData.isBasicASCII && viewLineOptions.useMonospaceOptimizations)) {\n            contentSegmenter = createContentSegmenter(lineData, viewLineOptions);\n        }\n        let chars = '';\n        let resolvedStartColumn = 0;\n        let resolvedStartCssPixelOffset = 0;\n        for (let x = 0; x < startColumn - 1; x++) {\n            if (lineData.isBasicASCII && viewLineOptions.useMonospaceOptimizations) {\n                chars = content.charAt(x);\n            }\n            else {\n                chars = contentSegmenter.getSegmentAtIndex(x);\n                if (chars === undefined) {\n                    continue;\n                }\n                resolvedStartCssPixelOffset += (this._renderStrategy.value.glyphRasterizer.getTextMetrics(chars).width / getActiveWindow().devicePixelRatio) - viewLineOptions.spaceWidth;\n            }\n            if (chars === '\\t') {\n                resolvedStartColumn = CursorColumns.nextRenderTabStop(resolvedStartColumn, lineData.tabSize);\n            }\n            else {\n                resolvedStartColumn++;\n            }\n        }\n        let resolvedEndColumn = resolvedStartColumn;\n        let resolvedEndCssPixelOffset = 0;\n        for (let x = startColumn - 1; x < endColumn - 1; x++) {\n            if (lineData.isBasicASCII && viewLineOptions.useMonospaceOptimizations) {\n                chars = content.charAt(x);\n            }\n            else {\n                chars = contentSegmenter.getSegmentAtIndex(x);\n                if (chars === undefined) {\n                    continue;\n                }\n                resolvedEndCssPixelOffset += (this._renderStrategy.value.glyphRasterizer.getTextMetrics(chars).width / getActiveWindow().devicePixelRatio) - viewLineOptions.spaceWidth;\n            }\n            if (chars === '\\t') {\n                resolvedEndColumn = CursorColumns.nextRenderTabStop(resolvedEndColumn, lineData.tabSize);\n            }\n            else {\n                resolvedEndColumn++;\n            }\n        }\n        // Visible horizontal range in _scaled_ pixels\n        const result = new VisibleRanges(false, [new FloatHorizontalRange(resolvedStartColumn * viewLineOptions.spaceWidth + resolvedStartCssPixelOffset, (resolvedEndColumn - resolvedStartColumn) * viewLineOptions.spaceWidth + resolvedEndCssPixelOffset)\n        ]);\n        return result;\n    }\n    visibleRangeForPosition(position) {\n        const visibleRanges = this._visibleRangesForLineRange(position.lineNumber, position.column, position.column);\n        if (!visibleRanges) {\n            return null;\n        }\n        return new HorizontalPosition(visibleRanges.outsideRenderedLine, visibleRanges.ranges[0].left);\n    }\n    getLineWidth(lineNumber) {\n        if (!this._lastViewportData || !this._lastViewLineOptions) {\n            return undefined;\n        }\n        if (!this._viewGpuContext.canRender(this._lastViewLineOptions, this._lastViewportData, lineNumber)) {\n            return undefined;\n        }\n        const lineData = this._lastViewportData.getViewLineRenderingData(lineNumber);\n        const lineRange = this._visibleRangesForLineRange(lineNumber, 1, lineData.maxColumn);\n        const lastRange = lineRange?.ranges.at(-1);\n        if (lastRange) {\n            return lastRange.width;\n        }\n        return undefined;\n    }\n    getPositionAtCoordinate(lineNumber, mouseContentHorizontalOffset) {\n        if (!this._lastViewportData || !this._lastViewLineOptions) {\n            return undefined;\n        }\n        if (!this._viewGpuContext.canRender(this._lastViewLineOptions, this._lastViewportData, lineNumber)) {\n            return undefined;\n        }\n        const lineData = this._lastViewportData.getViewLineRenderingData(lineNumber);\n        const content = lineData.content;\n        const dpr = getActiveWindow().devicePixelRatio;\n        const mouseContentHorizontalOffsetDevicePixels = mouseContentHorizontalOffset * dpr;\n        const spaceWidthDevicePixels = this._lastViewLineOptions.spaceWidth * dpr;\n        const contentSegmenter = createContentSegmenter(lineData, this._lastViewLineOptions);\n        let widthSoFar = 0;\n        let charWidth = 0;\n        let tabXOffset = 0;\n        let column = 0;\n        for (let x = 0; x < content.length; x++) {\n            const chars = contentSegmenter.getSegmentAtIndex(x);\n            // Part of an earlier segment\n            if (chars === undefined) {\n                column++;\n                continue;\n            }\n            // Get the width of the character\n            if (chars === '\\t') {\n                // Find the pixel offset between the current position and the next tab stop\n                const offsetBefore = x + tabXOffset;\n                tabXOffset = CursorColumns.nextRenderTabStop(x + tabXOffset, lineData.tabSize);\n                charWidth = spaceWidthDevicePixels * (tabXOffset - offsetBefore);\n                // Convert back to offset excluding x and the current character\n                tabXOffset -= x + 1;\n            }\n            else if (lineData.isBasicASCII && this._lastViewLineOptions.useMonospaceOptimizations) {\n                charWidth = spaceWidthDevicePixels;\n            }\n            else {\n                charWidth = this._renderStrategy.value.glyphRasterizer.getTextMetrics(chars).width;\n            }\n            if (mouseContentHorizontalOffsetDevicePixels < widthSoFar + charWidth / 2) {\n                break;\n            }\n            widthSoFar += charWidth;\n            column++;\n        }\n        return new Position(lineNumber, column + 1);\n    }\n};\nViewLinesGpu = __decorate([\n    __param(2, IInstantiationService),\n    __param(3, ILogService)\n], ViewLinesGpu);\n\nexport { ViewLinesGpu };\n","import { Emitter } from './event.js';\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 *--------------------------------------------------------------------------------------------*/\nclass IMEImpl {\n    constructor() {\n        this._onDidChange = new Emitter();\n        this.onDidChange = this._onDidChange.event;\n        this._enabled = true;\n    }\n    get enabled() {\n        return this._enabled;\n    }\n    /**\n     * Enable IME\n     */\n    enable() {\n        this._enabled = true;\n        this._onDidChange.fire();\n    }\n    /**\n     * Disable IME\n     */\n    disable() {\n        this._enabled = false;\n        this._onDidChange.fire();\n    }\n}\nconst IME = new IMEImpl();\n\nexport { IME, IMEImpl };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IKeybindingService = createDecorator('keybindingService');\n\nexport { IKeybindingService };\n","import { ViewPart } from '../../view/viewPart.js';\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 *--------------------------------------------------------------------------------------------*/\nclass AbstractEditContext extends ViewPart {\n}\n\nexport { AbstractEditContext };\n","import { Range } from '../../../common/core/range.js';\nimport { localize } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nclass SimplePagedScreenReaderStrategy {\n    _getPageOfLine(lineNumber, linesPerPage) {\n        return Math.floor((lineNumber - 1) / linesPerPage);\n    }\n    _getRangeForPage(page, linesPerPage) {\n        const offset = page * linesPerPage;\n        const startLineNumber = offset + 1;\n        const endLineNumber = offset + linesPerPage;\n        return new Range(startLineNumber, 1, endLineNumber + 1, 1);\n    }\n    fromEditorSelection(model, selection, linesPerPage, trimLongText) {\n        // Chromium handles very poorly text even of a few thousand chars\n        // Cut text to avoid stalling the entire UI\n        const LIMIT_CHARS = 500;\n        const selectionStartPage = this._getPageOfLine(selection.startLineNumber, linesPerPage);\n        const selectionStartPageRange = this._getRangeForPage(selectionStartPage, linesPerPage);\n        const selectionEndPage = this._getPageOfLine(selection.endLineNumber, linesPerPage);\n        const selectionEndPageRange = this._getRangeForPage(selectionEndPage, linesPerPage);\n        let pretextRange = selectionStartPageRange.intersectRanges(new Range(1, 1, selection.startLineNumber, selection.startColumn));\n        if (trimLongText && model.getValueLengthInRange(pretextRange, 1 /* EndOfLinePreference.LF */) > LIMIT_CHARS) {\n            const pretextStart = model.modifyPosition(pretextRange.getEndPosition(), -LIMIT_CHARS);\n            pretextRange = Range.fromPositions(pretextStart, pretextRange.getEndPosition());\n        }\n        const pretext = model.getValueInRange(pretextRange, 1 /* EndOfLinePreference.LF */);\n        const lastLine = model.getLineCount();\n        const lastLineMaxColumn = model.getLineMaxColumn(lastLine);\n        let posttextRange = selectionEndPageRange.intersectRanges(new Range(selection.endLineNumber, selection.endColumn, lastLine, lastLineMaxColumn));\n        if (trimLongText && model.getValueLengthInRange(posttextRange, 1 /* EndOfLinePreference.LF */) > LIMIT_CHARS) {\n            const posttextEnd = model.modifyPosition(posttextRange.getStartPosition(), LIMIT_CHARS);\n            posttextRange = Range.fromPositions(posttextRange.getStartPosition(), posttextEnd);\n        }\n        const posttext = model.getValueInRange(posttextRange, 1 /* EndOfLinePreference.LF */);\n        let text;\n        if (selectionStartPage === selectionEndPage || selectionStartPage + 1 === selectionEndPage) {\n            // take full selection\n            text = model.getValueInRange(selection, 1 /* EndOfLinePreference.LF */);\n        }\n        else {\n            const selectionRange1 = selectionStartPageRange.intersectRanges(selection);\n            const selectionRange2 = selectionEndPageRange.intersectRanges(selection);\n            text = (model.getValueInRange(selectionRange1, 1 /* EndOfLinePreference.LF */)\n                + String.fromCharCode(8230)\n                + model.getValueInRange(selectionRange2, 1 /* EndOfLinePreference.LF */));\n        }\n        if (trimLongText && text.length > 2 * LIMIT_CHARS) {\n            text = text.substring(0, LIMIT_CHARS) + String.fromCharCode(8230) + text.substring(text.length - LIMIT_CHARS, text.length);\n        }\n        let selectionStart;\n        let selectionEnd;\n        if (selection.getDirection() === 0 /* SelectionDirection.LTR */) {\n            selectionStart = pretext.length;\n            selectionEnd = pretext.length + text.length;\n        }\n        else {\n            selectionEnd = pretext.length;\n            selectionStart = pretext.length + text.length;\n        }\n        return {\n            value: pretext + text + posttext,\n            selection: selection,\n            selectionStart,\n            selectionEnd,\n            startPositionWithinEditor: pretextRange.getStartPosition(),\n            newlineCountBeforeSelection: pretextRange.endLineNumber - pretextRange.startLineNumber,\n        };\n    }\n}\nfunction ariaLabelForScreenReaderContent(options, keybindingService) {\n    const accessibilitySupport = options.get(2 /* EditorOption.accessibilitySupport */);\n    if (accessibilitySupport === 1 /* AccessibilitySupport.Disabled */) {\n        const toggleKeybindingLabel = keybindingService.lookupKeybinding('editor.action.toggleScreenReaderAccessibilityMode')?.getAriaLabel();\n        const runCommandKeybindingLabel = keybindingService.lookupKeybinding('workbench.action.showCommands')?.getAriaLabel();\n        const keybindingEditorKeybindingLabel = keybindingService.lookupKeybinding('workbench.action.openGlobalKeybindings')?.getAriaLabel();\n        const editorNotAccessibleMessage = localize(61, \"The editor is not accessible at this time.\");\n        if (toggleKeybindingLabel) {\n            return localize(62, \"{0} To enable screen reader optimized mode, use {1}\", editorNotAccessibleMessage, toggleKeybindingLabel);\n        }\n        else if (runCommandKeybindingLabel) {\n            return localize(63, \"{0} To enable screen reader optimized mode, open the quick pick with {1} and run the command Toggle Screen Reader Accessibility Mode, which is currently not triggerable via keyboard.\", editorNotAccessibleMessage, runCommandKeybindingLabel);\n        }\n        else if (keybindingEditorKeybindingLabel) {\n            return localize(64, \"{0} Please assign a keybinding for the command Toggle Screen Reader Accessibility Mode by accessing the keybindings editor with {1} and run it.\", editorNotAccessibleMessage, keybindingEditorKeybindingLabel);\n        }\n        else {\n            // SOS\n            return editorNotAccessibleMessage;\n        }\n    }\n    return options.get(8 /* EditorOption.ariaLabel */);\n}\nfunction newlinecount(text) {\n    let result = 0;\n    let startIndex = -1;\n    do {\n        startIndex = text.indexOf('\\n', startIndex + 1);\n        if (startIndex === -1) {\n            break;\n        }\n        result++;\n    } while (true);\n    return result;\n}\n\nexport { SimplePagedScreenReaderStrategy, ariaLabelForScreenReaderContent, newlinecount };\n","import './textAreaEditContext.css';\nimport { localize } from '../../../../../nls.js';\nimport { isSafari, isFirefox, isChrome, isAndroid } from '../../../../../base/browser/browser.js';\nimport { createFastDomNode } from '../../../../../base/browser/fastDomNode.js';\nimport { OS, isMacintosh } from '../../../../../base/common/platform.js';\nimport { isHighSurrogate } from '../../../../../base/common/strings.js';\nimport { applyFontInfo } from '../../../config/domFontInfo.js';\nimport { PartFingerprints } from '../../../view/viewPart.js';\nimport { LineNumbersOverlay } from '../../../viewParts/lineNumbers/lineNumbers.js';\nimport { Margin } from '../../../viewParts/margin/margin.js';\nimport { EditorOptions } from '../../../../common/config/editorOptions.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { Selection } from '../../../../common/core/selection.js';\nimport { MOUSE_CURSOR_TEXT_CSS_CLASS_NAME } from '../../../../../base/browser/ui/mouseCursor/mouseCursor.js';\nimport { TokenizationRegistry } from '../../../../common/languages.js';\nimport { Color } from '../../../../../base/common/color.js';\nimport { IME } from '../../../../../base/common/ime.js';\nimport { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { AbstractEditContext } from '../editContext.js';\nimport { TextAreaWrapper, TextAreaInput } from './textAreaEditContextInput.js';\nimport { ariaLabelForScreenReaderContent, newlinecount, SimplePagedScreenReaderStrategy } from '../screenReaderUtils.js';\nimport { getDataToCopy } from '../clipboardUtils.js';\nimport { TextAreaState } from './textAreaEditContextState.js';\nimport { getMapForWordSeparators } from '../../../../common/core/wordCharacterClassifier.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass VisibleTextAreaData {\n    constructor(_context, modelLineNumber, distanceToModelLineStart, widthOfHiddenLineTextBefore, distanceToModelLineEnd) {\n        this._context = _context;\n        this.modelLineNumber = modelLineNumber;\n        this.distanceToModelLineStart = distanceToModelLineStart;\n        this.widthOfHiddenLineTextBefore = widthOfHiddenLineTextBefore;\n        this.distanceToModelLineEnd = distanceToModelLineEnd;\n        this._visibleTextAreaBrand = undefined;\n        this.startPosition = null;\n        this.endPosition = null;\n        this.visibleTextareaStart = null;\n        this.visibleTextareaEnd = null;\n        /**\n         * When doing composition, the currently composed text might be split up into\n         * multiple tokens, then merged again into a single token, etc. Here we attempt\n         * to keep the presentation of the <textarea> stable by using the previous used\n         * style if multiple tokens come into play. This avoids flickering.\n         */\n        this._previousPresentation = null;\n    }\n    prepareRender(visibleRangeProvider) {\n        const startModelPosition = new Position(this.modelLineNumber, this.distanceToModelLineStart + 1);\n        const endModelPosition = new Position(this.modelLineNumber, this._context.viewModel.model.getLineMaxColumn(this.modelLineNumber) - this.distanceToModelLineEnd);\n        this.startPosition = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(startModelPosition);\n        this.endPosition = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(endModelPosition);\n        if (this.startPosition.lineNumber === this.endPosition.lineNumber) {\n            this.visibleTextareaStart = visibleRangeProvider.visibleRangeForPosition(this.startPosition);\n            this.visibleTextareaEnd = visibleRangeProvider.visibleRangeForPosition(this.endPosition);\n        }\n        else {\n            // TODO: what if the view positions are not on the same line?\n            this.visibleTextareaStart = null;\n            this.visibleTextareaEnd = null;\n        }\n    }\n    definePresentation(tokenPresentation) {\n        if (!this._previousPresentation) {\n            // To avoid flickering, once set, always reuse a presentation throughout the entire IME session\n            if (tokenPresentation) {\n                this._previousPresentation = tokenPresentation;\n            }\n            else {\n                this._previousPresentation = {\n                    foreground: 1 /* ColorId.DefaultForeground */,\n                    italic: false,\n                    bold: false,\n                    underline: false,\n                    strikethrough: false,\n                };\n            }\n        }\n        return this._previousPresentation;\n    }\n}\nconst canUseZeroSizeTextarea = (isFirefox);\nlet TextAreaEditContext = class TextAreaEditContext extends AbstractEditContext {\n    constructor(context, overflowGuardContainer, viewController, visibleRangeProvider, _keybindingService, _instantiationService) {\n        super(context);\n        this._keybindingService = _keybindingService;\n        this._instantiationService = _instantiationService;\n        this._primaryCursorPosition = new Position(1, 1);\n        this._primaryCursorVisibleRange = null;\n        this._viewController = viewController;\n        this._visibleRangeProvider = visibleRangeProvider;\n        this._scrollLeft = 0;\n        this._scrollTop = 0;\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._setAccessibilityOptions(options);\n        this._contentLeft = layoutInfo.contentLeft;\n        this._contentWidth = layoutInfo.contentWidth;\n        this._contentHeight = layoutInfo.height;\n        this._fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        this._emptySelectionClipboard = options.get(45 /* EditorOption.emptySelectionClipboard */);\n        this._copyWithSyntaxHighlighting = options.get(31 /* EditorOption.copyWithSyntaxHighlighting */);\n        this._visibleTextArea = null;\n        this._selections = [new Selection(1, 1, 1, 1)];\n        this._modelSelections = [new Selection(1, 1, 1, 1)];\n        this._lastRenderPosition = null;\n        // Text Area (The focus will always be in the textarea when the cursor is blinking)\n        this.textArea = createFastDomNode(document.createElement('textarea'));\n        PartFingerprints.write(this.textArea, 7 /* PartFingerprint.TextArea */);\n        this.textArea.setClassName(`inputarea ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`);\n        this.textArea.setAttribute('wrap', this._textAreaWrapping && !this._visibleTextArea ? 'on' : 'off');\n        const { tabSize } = this._context.viewModel.model.getOptions();\n        this.textArea.domNode.style.tabSize = `${tabSize * this._fontInfo.spaceWidth}px`;\n        this.textArea.setAttribute('autocorrect', 'off');\n        this.textArea.setAttribute('autocapitalize', 'off');\n        this.textArea.setAttribute('autocomplete', 'off');\n        this.textArea.setAttribute('spellcheck', 'false');\n        this.textArea.setAttribute('aria-label', ariaLabelForScreenReaderContent(options, this._keybindingService));\n        this.textArea.setAttribute('aria-required', options.get(9 /* EditorOption.ariaRequired */) ? 'true' : 'false');\n        this.textArea.setAttribute('tabindex', String(options.get(140 /* EditorOption.tabIndex */)));\n        this.textArea.setAttribute('role', 'textbox');\n        this.textArea.setAttribute('aria-roledescription', localize(65, \"editor\"));\n        this.textArea.setAttribute('aria-multiline', 'true');\n        this.textArea.setAttribute('aria-autocomplete', options.get(104 /* EditorOption.readOnly */) ? 'none' : 'both');\n        this._ensureReadOnlyAttribute();\n        this.textAreaCover = createFastDomNode(document.createElement('div'));\n        this.textAreaCover.setPosition('absolute');\n        overflowGuardContainer.appendChild(this.textArea);\n        overflowGuardContainer.appendChild(this.textAreaCover);\n        const simplePagedScreenReaderStrategy = new SimplePagedScreenReaderStrategy();\n        const textAreaInputHost = {\n            getDataToCopy: () => {\n                return getDataToCopy(this._context.viewModel, this._modelSelections, this._emptySelectionClipboard, this._copyWithSyntaxHighlighting);\n            },\n            getScreenReaderContent: () => {\n                if (this._accessibilitySupport === 1 /* AccessibilitySupport.Disabled */) {\n                    // We know for a fact that a screen reader is not attached\n                    // On OSX, we write the character before the cursor to allow for \"long-press\" composition\n                    // Also on OSX, we write the word before the cursor to allow for the Accessibility Keyboard to give good hints\n                    const selection = this._selections[0];\n                    if (isMacintosh && selection.isEmpty()) {\n                        const position = selection.getStartPosition();\n                        let textBefore = this._getWordBeforePosition(position);\n                        if (textBefore.length === 0) {\n                            textBefore = this._getCharacterBeforePosition(position);\n                        }\n                        if (textBefore.length > 0) {\n                            return new TextAreaState(textBefore, textBefore.length, textBefore.length, Range.fromPositions(position), 0);\n                        }\n                    }\n                    // on macOS, write current selection into textarea will allow system text services pick selected text,\n                    // but we still want to limit the amount of text given Chromium handles very poorly text even of a few\n                    // thousand chars\n                    // (https://github.com/microsoft/vscode/issues/27799)\n                    const LIMIT_CHARS = 500;\n                    if (isMacintosh && !selection.isEmpty() && this._context.viewModel.getValueLengthInRange(selection, 0 /* EndOfLinePreference.TextDefined */) < LIMIT_CHARS) {\n                        const text = this._context.viewModel.getValueInRange(selection, 0 /* EndOfLinePreference.TextDefined */);\n                        return new TextAreaState(text, 0, text.length, selection, 0);\n                    }\n                    // on Safari, document.execCommand('cut') and document.execCommand('copy') will just not work\n                    // if the textarea has no content selected. So if there is an editor selection, ensure something\n                    // is selected in the textarea.\n                    if (isSafari && !selection.isEmpty()) {\n                        const placeholderText = 'vscode-placeholder';\n                        return new TextAreaState(placeholderText, 0, placeholderText.length, null, undefined);\n                    }\n                    return TextAreaState.EMPTY;\n                }\n                if (isAndroid) {\n                    // when tapping in the editor on a word, Android enters composition mode.\n                    // in the `compositionstart` event we cannot clear the textarea, because\n                    // it then forgets to ever send a `compositionend`.\n                    // we therefore only write the current word in the textarea\n                    const selection = this._selections[0];\n                    if (selection.isEmpty()) {\n                        const position = selection.getStartPosition();\n                        const [wordAtPosition, positionOffsetInWord] = this._getAndroidWordAtPosition(position);\n                        if (wordAtPosition.length > 0) {\n                            return new TextAreaState(wordAtPosition, positionOffsetInWord, positionOffsetInWord, Range.fromPositions(position), 0);\n                        }\n                    }\n                    return TextAreaState.EMPTY;\n                }\n                const screenReaderContentState = simplePagedScreenReaderStrategy.fromEditorSelection(this._context.viewModel, this._selections[0], this._accessibilityPageSize, this._accessibilitySupport === 0 /* AccessibilitySupport.Unknown */);\n                return TextAreaState.fromScreenReaderContentState(screenReaderContentState);\n            },\n            deduceModelPosition: (viewAnchorPosition, deltaOffset, lineFeedCnt) => {\n                return this._context.viewModel.deduceModelPositionRelativeToViewPosition(viewAnchorPosition, deltaOffset, lineFeedCnt);\n            }\n        };\n        const textAreaWrapper = this._register(new TextAreaWrapper(this.textArea.domNode));\n        this._textAreaInput = this._register(this._instantiationService.createInstance(TextAreaInput, textAreaInputHost, textAreaWrapper, OS, {\n            isAndroid: isAndroid,\n            isChrome: isChrome,\n            isFirefox: isFirefox,\n            isSafari: isSafari,\n        }));\n        this._register(this._textAreaInput.onKeyDown((e) => {\n            this._viewController.emitKeyDown(e);\n        }));\n        this._register(this._textAreaInput.onKeyUp((e) => {\n            this._viewController.emitKeyUp(e);\n        }));\n        this._register(this._textAreaInput.onPaste((e) => {\n            let pasteOnNewLine = false;\n            let multicursorText = null;\n            let mode = null;\n            if (e.metadata) {\n                pasteOnNewLine = (this._emptySelectionClipboard && !!e.metadata.isFromEmptySelection);\n                multicursorText = (typeof e.metadata.multicursorText !== 'undefined' ? e.metadata.multicursorText : null);\n                mode = e.metadata.mode;\n            }\n            this._viewController.paste(e.text, pasteOnNewLine, multicursorText, mode);\n        }));\n        this._register(this._textAreaInput.onCut(() => {\n            this._viewController.cut();\n        }));\n        this._register(this._textAreaInput.onType((e) => {\n            if (e.replacePrevCharCnt || e.replaceNextCharCnt || e.positionDelta) {\n                this._viewController.compositionType(e.text, e.replacePrevCharCnt, e.replaceNextCharCnt, e.positionDelta);\n            }\n            else {\n                this._viewController.type(e.text);\n            }\n        }));\n        this._register(this._textAreaInput.onSelectionChangeRequest((modelSelection) => {\n            this._viewController.setSelection(modelSelection);\n        }));\n        this._register(this._textAreaInput.onCompositionStart((e) => {\n            // The textarea might contain some content when composition starts.\n            //\n            // When we make the textarea visible, it always has a height of 1 line,\n            // so we don't need to worry too much about content on lines above or below\n            // the selection.\n            //\n            // However, the text on the current line needs to be made visible because\n            // some IME methods allow to move to other glyphs on the current line\n            // (by pressing arrow keys).\n            //\n            // (1) The textarea might contain only some parts of the current line,\n            // like the word before the selection. Also, the content inside the textarea\n            // can grow or shrink as composition occurs. We therefore anchor the textarea\n            // in terms of distance to a certain line start and line end.\n            //\n            // (2) Also, we should not make \\t characters visible, because their rendering\n            // inside the <textarea> will not align nicely with our rendering. We therefore\n            // will hide (if necessary) some of the leading text on the current line.\n            const ta = this.textArea.domNode;\n            const modelSelection = this._modelSelections[0];\n            const { distanceToModelLineStart, widthOfHiddenTextBefore } = (() => {\n                // Find the text that is on the current line before the selection\n                const textBeforeSelection = ta.value.substring(0, Math.min(ta.selectionStart, ta.selectionEnd));\n                const lineFeedOffset1 = textBeforeSelection.lastIndexOf('\\n');\n                const lineTextBeforeSelection = textBeforeSelection.substring(lineFeedOffset1 + 1);\n                // We now search to see if we should hide some part of it (if it contains \\t)\n                const tabOffset1 = lineTextBeforeSelection.lastIndexOf('\\t');\n                const desiredVisibleBeforeCharCount = lineTextBeforeSelection.length - tabOffset1 - 1;\n                const startModelPosition = modelSelection.getStartPosition();\n                const visibleBeforeCharCount = Math.min(startModelPosition.column - 1, desiredVisibleBeforeCharCount);\n                const distanceToModelLineStart = startModelPosition.column - 1 - visibleBeforeCharCount;\n                const hiddenLineTextBefore = lineTextBeforeSelection.substring(0, lineTextBeforeSelection.length - visibleBeforeCharCount);\n                const { tabSize } = this._context.viewModel.model.getOptions();\n                const widthOfHiddenTextBefore = measureText(this.textArea.domNode.ownerDocument, hiddenLineTextBefore, this._fontInfo, tabSize);\n                return { distanceToModelLineStart, widthOfHiddenTextBefore };\n            })();\n            const { distanceToModelLineEnd } = (() => {\n                // Find the text that is on the current line after the selection\n                const textAfterSelection = ta.value.substring(Math.max(ta.selectionStart, ta.selectionEnd));\n                const lineFeedOffset2 = textAfterSelection.indexOf('\\n');\n                const lineTextAfterSelection = lineFeedOffset2 === -1 ? textAfterSelection : textAfterSelection.substring(0, lineFeedOffset2);\n                const tabOffset2 = lineTextAfterSelection.indexOf('\\t');\n                const desiredVisibleAfterCharCount = (tabOffset2 === -1 ? lineTextAfterSelection.length : lineTextAfterSelection.length - tabOffset2 - 1);\n                const endModelPosition = modelSelection.getEndPosition();\n                const visibleAfterCharCount = Math.min(this._context.viewModel.model.getLineMaxColumn(endModelPosition.lineNumber) - endModelPosition.column, desiredVisibleAfterCharCount);\n                const distanceToModelLineEnd = this._context.viewModel.model.getLineMaxColumn(endModelPosition.lineNumber) - endModelPosition.column - visibleAfterCharCount;\n                return { distanceToModelLineEnd };\n            })();\n            // Scroll to reveal the location in the editor where composition occurs\n            this._context.viewModel.revealRange('keyboard', true, Range.fromPositions(this._selections[0].getStartPosition()), 0 /* viewEvents.VerticalRevealType.Simple */, 1 /* ScrollType.Immediate */);\n            this._visibleTextArea = new VisibleTextAreaData(this._context, modelSelection.startLineNumber, distanceToModelLineStart, widthOfHiddenTextBefore, distanceToModelLineEnd);\n            // We turn off wrapping if the <textarea> becomes visible for composition\n            this.textArea.setAttribute('wrap', this._textAreaWrapping && !this._visibleTextArea ? 'on' : 'off');\n            this._visibleTextArea.prepareRender(this._visibleRangeProvider);\n            this._render();\n            // Show the textarea\n            this.textArea.setClassName(`inputarea ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME} ime-input`);\n            this._viewController.compositionStart();\n            this._context.viewModel.onCompositionStart();\n        }));\n        this._register(this._textAreaInput.onCompositionUpdate((e) => {\n            if (!this._visibleTextArea) {\n                return;\n            }\n            this._visibleTextArea.prepareRender(this._visibleRangeProvider);\n            this._render();\n        }));\n        this._register(this._textAreaInput.onCompositionEnd(() => {\n            this._visibleTextArea = null;\n            // We turn on wrapping as necessary if the <textarea> hides after composition\n            this.textArea.setAttribute('wrap', this._textAreaWrapping && !this._visibleTextArea ? 'on' : 'off');\n            this._render();\n            this.textArea.setClassName(`inputarea ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`);\n            this._viewController.compositionEnd();\n            this._context.viewModel.onCompositionEnd();\n        }));\n        this._register(this._textAreaInput.onFocus(() => {\n            this._context.viewModel.setHasFocus(true);\n        }));\n        this._register(this._textAreaInput.onBlur(() => {\n            this._context.viewModel.setHasFocus(false);\n        }));\n        this._register(IME.onDidChange(() => {\n            this._ensureReadOnlyAttribute();\n        }));\n    }\n    get domNode() {\n        return this.textArea;\n    }\n    writeScreenReaderContent(reason) {\n        this._textAreaInput.writeNativeTextAreaContent(reason);\n    }\n    dispose() {\n        super.dispose();\n        this.textArea.domNode.remove();\n        this.textAreaCover.domNode.remove();\n    }\n    _getAndroidWordAtPosition(position) {\n        const ANDROID_WORD_SEPARATORS = '`~!@#$%^&*()-=+[{]}\\\\|;:\",.<>/?';\n        const lineContent = this._context.viewModel.getLineContent(position.lineNumber);\n        const wordSeparators = getMapForWordSeparators(ANDROID_WORD_SEPARATORS, []);\n        let goingLeft = true;\n        let startColumn = position.column;\n        let goingRight = true;\n        let endColumn = position.column;\n        let distance = 0;\n        while (distance < 50 && (goingLeft || goingRight)) {\n            if (goingLeft && startColumn <= 1) {\n                goingLeft = false;\n            }\n            if (goingLeft) {\n                const charCode = lineContent.charCodeAt(startColumn - 2);\n                const charClass = wordSeparators.get(charCode);\n                if (charClass !== 0 /* WordCharacterClass.Regular */) {\n                    goingLeft = false;\n                }\n                else {\n                    startColumn--;\n                }\n            }\n            if (goingRight && endColumn > lineContent.length) {\n                goingRight = false;\n            }\n            if (goingRight) {\n                const charCode = lineContent.charCodeAt(endColumn - 1);\n                const charClass = wordSeparators.get(charCode);\n                if (charClass !== 0 /* WordCharacterClass.Regular */) {\n                    goingRight = false;\n                }\n                else {\n                    endColumn++;\n                }\n            }\n            distance++;\n        }\n        return [lineContent.substring(startColumn - 1, endColumn - 1), position.column - startColumn];\n    }\n    _getWordBeforePosition(position) {\n        const lineContent = this._context.viewModel.getLineContent(position.lineNumber);\n        const wordSeparators = getMapForWordSeparators(this._context.configuration.options.get(148 /* EditorOption.wordSeparators */), []);\n        let column = position.column;\n        let distance = 0;\n        while (column > 1) {\n            const charCode = lineContent.charCodeAt(column - 2);\n            const charClass = wordSeparators.get(charCode);\n            if (charClass !== 0 /* WordCharacterClass.Regular */ || distance > 50) {\n                return lineContent.substring(column - 1, position.column - 1);\n            }\n            distance++;\n            column--;\n        }\n        return lineContent.substring(0, position.column - 1);\n    }\n    _getCharacterBeforePosition(position) {\n        if (position.column > 1) {\n            const lineContent = this._context.viewModel.getLineContent(position.lineNumber);\n            const charBefore = lineContent.charAt(position.column - 2);\n            if (!isHighSurrogate(charBefore.charCodeAt(0))) {\n                return charBefore;\n            }\n        }\n        return '';\n    }\n    _setAccessibilityOptions(options) {\n        this._accessibilitySupport = options.get(2 /* EditorOption.accessibilitySupport */);\n        const accessibilityPageSize = options.get(3 /* EditorOption.accessibilityPageSize */);\n        if (this._accessibilitySupport === 2 /* AccessibilitySupport.Enabled */ && accessibilityPageSize === EditorOptions.accessibilityPageSize.defaultValue) {\n            // If a screen reader is attached and the default value is not set we should automatically increase the page size to 500 for a better experience\n            this._accessibilityPageSize = 500;\n        }\n        else {\n            this._accessibilityPageSize = accessibilityPageSize;\n        }\n        // When wrapping is enabled and a screen reader might be attached,\n        // we will size the textarea to match the width used for wrapping points computation (see `domLineBreaksComputer.ts`).\n        // This is because screen readers will read the text in the textarea and we'd like that the\n        // wrapping points in the textarea match the wrapping points in the editor.\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        const wrappingColumn = layoutInfo.wrappingColumn;\n        if (wrappingColumn !== -1 && this._accessibilitySupport !== 1 /* AccessibilitySupport.Disabled */) {\n            const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n            this._textAreaWrapping = true;\n            this._textAreaWidth = Math.round(wrappingColumn * fontInfo.typicalHalfwidthCharacterWidth);\n        }\n        else {\n            this._textAreaWrapping = false;\n            this._textAreaWidth = (canUseZeroSizeTextarea ? 0 : 1);\n        }\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this._setAccessibilityOptions(options);\n        this._contentLeft = layoutInfo.contentLeft;\n        this._contentWidth = layoutInfo.contentWidth;\n        this._contentHeight = layoutInfo.height;\n        this._fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        this._emptySelectionClipboard = options.get(45 /* EditorOption.emptySelectionClipboard */);\n        this._copyWithSyntaxHighlighting = options.get(31 /* EditorOption.copyWithSyntaxHighlighting */);\n        this.textArea.setAttribute('wrap', this._textAreaWrapping && !this._visibleTextArea ? 'on' : 'off');\n        const { tabSize } = this._context.viewModel.model.getOptions();\n        this.textArea.domNode.style.tabSize = `${tabSize * this._fontInfo.spaceWidth}px`;\n        this.textArea.setAttribute('aria-label', ariaLabelForScreenReaderContent(options, this._keybindingService));\n        this.textArea.setAttribute('aria-required', options.get(9 /* EditorOption.ariaRequired */) ? 'true' : 'false');\n        this.textArea.setAttribute('tabindex', String(options.get(140 /* EditorOption.tabIndex */)));\n        if (e.hasChanged(41 /* EditorOption.domReadOnly */) || e.hasChanged(104 /* EditorOption.readOnly */)) {\n            this._ensureReadOnlyAttribute();\n        }\n        if (e.hasChanged(2 /* EditorOption.accessibilitySupport */)) {\n            this._textAreaInput.writeNativeTextAreaContent('strategy changed');\n        }\n        return true;\n    }\n    onCursorStateChanged(e) {\n        this._selections = e.selections.slice(0);\n        this._modelSelections = e.modelSelections.slice(0);\n        // We must update the <textarea> synchronously, otherwise long press IME on macos breaks.\n        // See https://github.com/microsoft/vscode/issues/165821\n        this._textAreaInput.writeNativeTextAreaContent('selection changed');\n        return true;\n    }\n    onDecorationsChanged(e) {\n        // true for inline decorations that can end up relayouting text\n        return true;\n    }\n    onFlushed(e) {\n        return true;\n    }\n    onLinesChanged(e) {\n        return true;\n    }\n    onLinesDeleted(e) {\n        return true;\n    }\n    onLinesInserted(e) {\n        return true;\n    }\n    onScrollChanged(e) {\n        this._scrollLeft = e.scrollLeft;\n        this._scrollTop = e.scrollTop;\n        return true;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    // --- end event handlers\n    // --- begin view API\n    isFocused() {\n        return this._textAreaInput.isFocused();\n    }\n    focus() {\n        this._textAreaInput.focusTextArea();\n    }\n    refreshFocusState() {\n        this._textAreaInput.refreshFocusState();\n    }\n    getLastRenderData() {\n        return this._lastRenderPosition;\n    }\n    setAriaOptions(options) {\n        if (options.activeDescendant) {\n            this.textArea.setAttribute('aria-haspopup', 'true');\n            this.textArea.setAttribute('aria-autocomplete', 'list');\n            this.textArea.setAttribute('aria-activedescendant', options.activeDescendant);\n        }\n        else {\n            this.textArea.setAttribute('aria-haspopup', 'false');\n            this.textArea.setAttribute('aria-autocomplete', 'both');\n            this.textArea.removeAttribute('aria-activedescendant');\n        }\n        if (options.role) {\n            this.textArea.setAttribute('role', options.role);\n        }\n    }\n    // --- end view API\n    _ensureReadOnlyAttribute() {\n        const options = this._context.configuration.options;\n        // When someone requests to disable IME, we set the \"readonly\" attribute on the <textarea>.\n        // This will prevent composition.\n        const useReadOnly = !IME.enabled || (options.get(41 /* EditorOption.domReadOnly */) && options.get(104 /* EditorOption.readOnly */));\n        if (useReadOnly) {\n            this.textArea.setAttribute('readonly', 'true');\n        }\n        else {\n            this.textArea.removeAttribute('readonly');\n        }\n    }\n    prepareRender(ctx) {\n        this._primaryCursorPosition = new Position(this._selections[0].positionLineNumber, this._selections[0].positionColumn);\n        this._primaryCursorVisibleRange = ctx.visibleRangeForPosition(this._primaryCursorPosition);\n        this._visibleTextArea?.prepareRender(ctx);\n    }\n    render(ctx) {\n        this._textAreaInput.writeNativeTextAreaContent('render');\n        this._render();\n    }\n    _render() {\n        if (this._visibleTextArea) {\n            // The text area is visible for composition reasons\n            const visibleStart = this._visibleTextArea.visibleTextareaStart;\n            const visibleEnd = this._visibleTextArea.visibleTextareaEnd;\n            const startPosition = this._visibleTextArea.startPosition;\n            const endPosition = this._visibleTextArea.endPosition;\n            if (startPosition && endPosition && visibleStart && visibleEnd && visibleEnd.left >= this._scrollLeft && visibleStart.left <= this._scrollLeft + this._contentWidth) {\n                const top = (this._context.viewLayout.getVerticalOffsetForLineNumber(this._primaryCursorPosition.lineNumber) - this._scrollTop);\n                const lineCount = newlinecount(this.textArea.domNode.value.substr(0, this.textArea.domNode.selectionStart));\n                let scrollLeft = this._visibleTextArea.widthOfHiddenLineTextBefore;\n                let left = (this._contentLeft + visibleStart.left - this._scrollLeft);\n                // See https://github.com/microsoft/vscode/issues/141725#issuecomment-1050670841\n                // Here we are adding +1 to avoid flickering that might be caused by having a width that is too small.\n                // This could be caused by rounding errors that might only show up with certain font families.\n                // In other words, a pixel might be lost when doing something like\n                //      `Math.round(end) - Math.round(start)`\n                // vs\n                //      `Math.round(end - start)`\n                let width = visibleEnd.left - visibleStart.left + 1;\n                if (left < this._contentLeft) {\n                    // the textarea would be rendered on top of the margin,\n                    // so reduce its width. We use the same technique as\n                    // for hiding text before\n                    const delta = (this._contentLeft - left);\n                    left += delta;\n                    scrollLeft += delta;\n                    width -= delta;\n                }\n                if (width > this._contentWidth) {\n                    // the textarea would be wider than the content width,\n                    // so reduce its width.\n                    width = this._contentWidth;\n                }\n                // Try to render the textarea with the color/font style to match the text under it\n                const lineHeight = this._context.viewLayout.getLineHeightForLineNumber(startPosition.lineNumber);\n                const fontSize = this._context.viewModel.getFontSizeAtPosition(this._primaryCursorPosition);\n                const viewLineData = this._context.viewModel.getViewLineData(startPosition.lineNumber);\n                const startTokenIndex = viewLineData.tokens.findTokenIndexAtOffset(startPosition.column - 1);\n                const endTokenIndex = viewLineData.tokens.findTokenIndexAtOffset(endPosition.column - 1);\n                const textareaSpansSingleToken = (startTokenIndex === endTokenIndex);\n                const presentation = this._visibleTextArea.definePresentation((textareaSpansSingleToken ? viewLineData.tokens.getPresentation(startTokenIndex) : null));\n                this.textArea.domNode.scrollTop = lineCount * lineHeight;\n                this.textArea.domNode.scrollLeft = scrollLeft;\n                this._doRender({\n                    lastRenderPosition: null,\n                    top: top,\n                    left: left,\n                    width: width,\n                    height: lineHeight,\n                    useCover: false,\n                    color: (TokenizationRegistry.getColorMap() || [])[presentation.foreground],\n                    italic: presentation.italic,\n                    bold: presentation.bold,\n                    underline: presentation.underline,\n                    strikethrough: presentation.strikethrough,\n                    fontSize\n                });\n            }\n            return;\n        }\n        if (!this._primaryCursorVisibleRange) {\n            // The primary cursor is outside the viewport => place textarea to the top left\n            this._renderAtTopLeft();\n            return;\n        }\n        const left = this._contentLeft + this._primaryCursorVisibleRange.left - this._scrollLeft;\n        if (left < this._contentLeft || left > this._contentLeft + this._contentWidth) {\n            // cursor is outside the viewport\n            this._renderAtTopLeft();\n            return;\n        }\n        const top = this._context.viewLayout.getVerticalOffsetForLineNumber(this._selections[0].positionLineNumber) - this._scrollTop;\n        if (top < 0 || top > this._contentHeight) {\n            // cursor is outside the viewport\n            this._renderAtTopLeft();\n            return;\n        }\n        // The primary cursor is in the viewport (at least vertically) => place textarea on the cursor\n        if (isMacintosh || this._accessibilitySupport === 2 /* AccessibilitySupport.Enabled */) {\n            // For the popup emoji input, we will make the text area as high as the line height\n            // We will also make the fontSize and lineHeight the correct dimensions to help with the placement of these pickers\n            const lineNumber = this._primaryCursorPosition.lineNumber;\n            const lineHeight = this._context.viewLayout.getLineHeightForLineNumber(lineNumber);\n            this._doRender({\n                lastRenderPosition: this._primaryCursorPosition,\n                top,\n                left: this._textAreaWrapping ? this._contentLeft : left,\n                width: this._textAreaWidth,\n                height: lineHeight,\n                useCover: false\n            });\n            // In case the textarea contains a word, we're going to try to align the textarea's cursor\n            // with our cursor by scrolling the textarea as much as possible\n            this.textArea.domNode.scrollLeft = this._primaryCursorVisibleRange.left;\n            const lineCount = this._textAreaInput.textAreaState.newlineCountBeforeSelection ?? newlinecount(this.textArea.domNode.value.substring(0, this.textArea.domNode.selectionStart));\n            this.textArea.domNode.scrollTop = lineCount * lineHeight;\n            return;\n        }\n        this._doRender({\n            lastRenderPosition: this._primaryCursorPosition,\n            top: top,\n            left: this._textAreaWrapping ? this._contentLeft : left,\n            width: this._textAreaWidth,\n            height: (canUseZeroSizeTextarea ? 0 : 1),\n            useCover: false\n        });\n    }\n    _renderAtTopLeft() {\n        // (in WebKit the textarea is 1px by 1px because it cannot handle input to a 0x0 textarea)\n        // specifically, when doing Korean IME, setting the textarea to 0x0 breaks IME badly.\n        this._doRender({\n            lastRenderPosition: null,\n            top: 0,\n            left: 0,\n            width: this._textAreaWidth,\n            height: (canUseZeroSizeTextarea ? 0 : 1),\n            useCover: true\n        });\n    }\n    _doRender(renderData) {\n        this._lastRenderPosition = renderData.lastRenderPosition;\n        const ta = this.textArea;\n        const tac = this.textAreaCover;\n        applyFontInfo(ta, this._fontInfo);\n        ta.setTop(renderData.top);\n        ta.setLeft(renderData.left);\n        ta.setWidth(renderData.width);\n        ta.setHeight(renderData.height);\n        ta.setLineHeight(renderData.height);\n        ta.setFontSize(renderData.fontSize ?? this._fontInfo.fontSize);\n        ta.setColor(renderData.color ? Color.Format.CSS.formatHex(renderData.color) : '');\n        ta.setFontStyle(renderData.italic ? 'italic' : '');\n        if (renderData.bold) {\n            // fontWeight is also set by `applyFontInfo`, so only overwrite it if necessary\n            ta.setFontWeight('bold');\n        }\n        ta.setTextDecoration(`${renderData.underline ? ' underline' : ''}${renderData.strikethrough ? ' line-through' : ''}`);\n        tac.setTop(renderData.useCover ? renderData.top : 0);\n        tac.setLeft(renderData.useCover ? renderData.left : 0);\n        tac.setWidth(renderData.useCover ? renderData.width : 0);\n        tac.setHeight(renderData.useCover ? renderData.height : 0);\n        const options = this._context.configuration.options;\n        if (options.get(66 /* EditorOption.glyphMargin */)) {\n            tac.setClassName('monaco-editor-background textAreaCover ' + Margin.OUTER_CLASS_NAME);\n        }\n        else {\n            if (options.get(76 /* EditorOption.lineNumbers */).renderType !== 0 /* RenderLineNumbersType.Off */) {\n                tac.setClassName('monaco-editor-background textAreaCover ' + LineNumbersOverlay.CLASS_NAME);\n            }\n            else {\n                tac.setClassName('monaco-editor-background textAreaCover');\n            }\n        }\n    }\n};\nTextAreaEditContext = __decorate([\n    __param(4, IKeybindingService),\n    __param(5, IInstantiationService)\n], TextAreaEditContext);\nfunction measureText(targetDocument, text, fontInfo, tabSize) {\n    if (text.length === 0) {\n        return 0;\n    }\n    const container = targetDocument.createElement('div');\n    container.style.position = 'absolute';\n    container.style.top = '-50000px';\n    container.style.width = '50000px';\n    const regularDomNode = targetDocument.createElement('span');\n    applyFontInfo(regularDomNode, fontInfo);\n    regularDomNode.style.whiteSpace = 'pre'; // just like the textarea\n    regularDomNode.style.tabSize = `${tabSize * fontInfo.spaceWidth}px`; // just like the textarea\n    regularDomNode.append(text);\n    container.appendChild(regularDomNode);\n    targetDocument.body.appendChild(container);\n    const res = regularDomNode.offsetWidth;\n    container.remove();\n    return res;\n}\n\nexport { TextAreaEditContext };\n","import { addDisposableListener, getShadowRoot, getActiveElement } from '../../../../../base/browser/dom.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport { ILogService } from '../../../../../platform/log/common/log.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet FocusTracker = class FocusTracker extends Disposable {\n    constructor(_logService, _domNode, _onFocusChange) {\n        super();\n        this._domNode = _domNode;\n        this._onFocusChange = _onFocusChange;\n        this._isFocused = false;\n        this._isPaused = false;\n        this._register(addDisposableListener(this._domNode, 'focus', () => {\n            _logService.trace('NativeEditContext.focus');\n            if (this._isPaused) {\n                return;\n            }\n            // Here we don't trust the browser and instead we check\n            // that the active element is the one we are tracking\n            // (this happens when cmd+tab is used to switch apps)\n            this.refreshFocusState();\n        }));\n        this._register(addDisposableListener(this._domNode, 'blur', () => {\n            _logService.trace('NativeEditContext.blur');\n            if (this._isPaused) {\n                return;\n            }\n            this._handleFocusedChanged(false);\n        }));\n    }\n    pause() {\n        this._isPaused = true;\n    }\n    resume() {\n        this._isPaused = false;\n        this.refreshFocusState();\n    }\n    _handleFocusedChanged(focused) {\n        if (this._isFocused === focused) {\n            return;\n        }\n        this._isFocused = focused;\n        this._onFocusChange(this._isFocused);\n    }\n    focus() {\n        this._domNode.focus();\n        this.refreshFocusState();\n    }\n    refreshFocusState() {\n        const shadowRoot = getShadowRoot(this._domNode);\n        const activeElement = shadowRoot ? shadowRoot.activeElement : getActiveElement();\n        const focused = this._domNode === activeElement;\n        this._handleFocusedChanged(focused);\n    }\n    get isFocused() {\n        return this._isFocused;\n    }\n};\nFocusTracker = __decorate([\n    __param(0, ILogService)\n], FocusTracker);\nfunction editContextAddDisposableListener(target, type, listener, options) {\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    target.addEventListener(type, listener, options);\n    return {\n        dispose() {\n            // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n            target.removeEventListener(type, listener);\n        }\n    };\n}\n\nexport { FocusTracker, editContextAddDisposableListener };\n","import { getActiveWindow, addDisposableListener, isHTMLElement } from '../../../../../base/browser/dom.js';\nimport { createTrustedTypesPolicy } from '../../../../../base/browser/trustedTypes.js';\nimport { IAccessibilityService } from '../../../../../platform/accessibility/common/accessibility.js';\nimport { EditorFontLigatures } from '../../../../common/config/editorOptions.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { Selection } from '../../../../common/core/selection.js';\nimport { StringBuilder } from '../../../../common/core/stringBuilder.js';\nimport { LineDecoration } from '../../../../common/viewLayout/lineDecorations.js';\nimport { RenderLineInput, renderViewLine } from '../../../../common/viewLayout/viewLineRenderer.js';\nimport { Disposable, MutableDisposable } from '../../../../../base/common/lifecycle.js';\nimport { IME } from '../../../../../base/common/ime.js';\nimport { getColumnOfNodeOffset } from '../../../viewParts/viewLines/viewLine.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst ttPolicy = createTrustedTypesPolicy('richScreenReaderContent', { createHTML: value => value });\nconst LINE_NUMBER_ATTRIBUTE = 'data-line-number';\nlet RichScreenReaderContent = class RichScreenReaderContent extends Disposable {\n    constructor(_domNode, _context, _viewController, _accessibilityService) {\n        super();\n        this._domNode = _domNode;\n        this._context = _context;\n        this._viewController = _viewController;\n        this._accessibilityService = _accessibilityService;\n        this._selectionChangeListener = this._register(new MutableDisposable());\n        this._accessibilityPageSize = 1;\n        this._ignoreSelectionChangeTime = 0;\n        this._state = RichScreenReaderState.NULL;\n        this._strategy = new RichPagedScreenReaderStrategy();\n        this._renderedLines = new Map();\n        this._renderedSelection = new Selection(1, 1, 1, 1);\n        this.onConfigurationChanged(this._context.configuration.options);\n    }\n    updateScreenReaderContent(primarySelection) {\n        const focusedElement = getActiveWindow().document.activeElement;\n        if (!focusedElement || focusedElement !== this._domNode.domNode) {\n            return;\n        }\n        const isScreenReaderOptimized = this._accessibilityService.isScreenReaderOptimized();\n        if (isScreenReaderOptimized) {\n            const state = this._getScreenReaderContentLineIntervals(primarySelection);\n            if (!this._state.equals(state)) {\n                this._state = state;\n                this._renderedLines = this._renderScreenReaderContent(state);\n            }\n            if (!this._renderedSelection.equalsSelection(primarySelection)) {\n                this._renderedSelection = primarySelection;\n                this._setSelectionOnScreenReaderContent(this._context, this._renderedLines, primarySelection);\n            }\n        }\n        else {\n            this._state = RichScreenReaderState.NULL;\n            this._setIgnoreSelectionChangeTime('setValue');\n            this._domNode.domNode.textContent = '';\n        }\n    }\n    updateScrollTop(primarySelection) {\n        const intervals = this._state.intervals;\n        if (!intervals.length) {\n            return;\n        }\n        const viewLayout = this._context.viewModel.viewLayout;\n        const stateStartLineNumber = intervals[0].startLine;\n        const verticalOffsetOfStateStartLineNumber = viewLayout.getVerticalOffsetForLineNumber(stateStartLineNumber);\n        const verticalOffsetOfPositionLineNumber = viewLayout.getVerticalOffsetForLineNumber(primarySelection.positionLineNumber);\n        this._domNode.domNode.scrollTop = verticalOffsetOfPositionLineNumber - verticalOffsetOfStateStartLineNumber;\n    }\n    onFocusChange(newFocusValue) {\n        if (newFocusValue) {\n            this._selectionChangeListener.value = this._setSelectionChangeListener();\n        }\n        else {\n            this._selectionChangeListener.value = undefined;\n        }\n    }\n    onConfigurationChanged(options) {\n        this._accessibilityPageSize = options.get(3 /* EditorOption.accessibilityPageSize */);\n    }\n    onWillCut() {\n        this._setIgnoreSelectionChangeTime('onCut');\n    }\n    onWillPaste() {\n        this._setIgnoreSelectionChangeTime('onWillPaste');\n    }\n    // --- private methods\n    _setIgnoreSelectionChangeTime(reason) {\n        this._ignoreSelectionChangeTime = Date.now();\n    }\n    _setSelectionChangeListener() {\n        // See https://github.com/microsoft/vscode/issues/27216 and https://github.com/microsoft/vscode/issues/98256\n        // When using a Braille display or NVDA for example, it is possible for users to reposition the\n        // system caret. This is reflected in Chrome as a `selectionchange` event and needs to be reflected within the editor.\n        // `selectionchange` events often come multiple times for a single logical change\n        // so throttle multiple `selectionchange` events that burst in a short period of time.\n        let previousSelectionChangeEventTime = 0;\n        return addDisposableListener(this._domNode.domNode.ownerDocument, 'selectionchange', () => {\n            const activeElement = getActiveWindow().document.activeElement;\n            const isFocused = activeElement === this._domNode.domNode;\n            if (!isFocused) {\n                return;\n            }\n            const isScreenReaderOptimized = this._accessibilityService.isScreenReaderOptimized();\n            if (!isScreenReaderOptimized || !IME.enabled) {\n                return;\n            }\n            const now = Date.now();\n            const delta1 = now - previousSelectionChangeEventTime;\n            previousSelectionChangeEventTime = now;\n            if (delta1 < 5) {\n                // received another `selectionchange` event within 5ms of the previous `selectionchange` event\n                // => ignore it\n                return;\n            }\n            const delta2 = now - this._ignoreSelectionChangeTime;\n            this._ignoreSelectionChangeTime = 0;\n            if (delta2 < 100) {\n                // received a `selectionchange` event within 100ms since we touched the hidden div\n                // => ignore it, since we caused it\n                return;\n            }\n            const selection = this._getEditorSelectionFromDomRange();\n            if (!selection) {\n                return;\n            }\n            this._viewController.setSelection(selection);\n        });\n    }\n    _renderScreenReaderContent(state) {\n        const nodes = [];\n        const renderedLines = new Map();\n        for (const interval of state.intervals) {\n            for (let lineNumber = interval.startLine; lineNumber <= interval.endLine; lineNumber++) {\n                const renderedLine = this._renderLine(lineNumber);\n                renderedLines.set(lineNumber, renderedLine);\n                nodes.push(renderedLine.domNode);\n            }\n        }\n        this._setIgnoreSelectionChangeTime('setValue');\n        this._domNode.domNode.replaceChildren(...nodes);\n        return renderedLines;\n    }\n    _renderLine(viewLineNumber) {\n        const viewModel = this._context.viewModel;\n        const positionLineData = viewModel.getViewLineRenderingData(viewLineNumber);\n        const options = this._context.configuration.options;\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        const stopRenderingLineAfter = options.get(133 /* EditorOption.stopRenderingLineAfter */);\n        const renderControlCharacters = options.get(108 /* EditorOption.renderControlCharacters */);\n        const fontLigatures = options.get(60 /* EditorOption.fontLigatures */);\n        const disableMonospaceOptimizations = options.get(40 /* EditorOption.disableMonospaceOptimizations */);\n        const lineDecorations = LineDecoration.filter(positionLineData.inlineDecorations, viewLineNumber, positionLineData.minColumn, positionLineData.maxColumn);\n        const useMonospaceOptimizations = fontInfo.isMonospace && !disableMonospaceOptimizations;\n        const useFontLigatures = fontLigatures !== EditorFontLigatures.OFF;\n        let renderWhitespace;\n        const experimentalWhitespaceRendering = options.get(47 /* EditorOption.experimentalWhitespaceRendering */);\n        if (experimentalWhitespaceRendering === 'off') {\n            renderWhitespace = options.get(113 /* EditorOption.renderWhitespace */);\n        }\n        else {\n            renderWhitespace = 'none';\n        }\n        const renderLineInput = new RenderLineInput(useMonospaceOptimizations, fontInfo.canUseHalfwidthRightwardsArrow, positionLineData.content, positionLineData.continuesWithWrappedLine, positionLineData.isBasicASCII, positionLineData.containsRTL, positionLineData.minColumn - 1, positionLineData.tokens, lineDecorations, positionLineData.tabSize, positionLineData.startVisibleColumn, fontInfo.spaceWidth, fontInfo.middotWidth, fontInfo.wsmiddotWidth, stopRenderingLineAfter, renderWhitespace, renderControlCharacters, useFontLigatures, null, null, 0, true);\n        const htmlBuilder = new StringBuilder(10000);\n        const renderOutput = renderViewLine(renderLineInput, htmlBuilder);\n        const html = htmlBuilder.build();\n        const trustedhtml = ttPolicy?.createHTML(html) ?? html;\n        const lineHeight = viewModel.viewLayout.getLineHeightForLineNumber(viewLineNumber) + 'px';\n        const domNode = document.createElement('div');\n        domNode.innerHTML = trustedhtml;\n        domNode.style.lineHeight = lineHeight;\n        domNode.style.height = lineHeight;\n        domNode.setAttribute(LINE_NUMBER_ATTRIBUTE, viewLineNumber.toString());\n        return new RichRenderedScreenReaderLine(domNode, renderOutput.characterMapping);\n    }\n    _setSelectionOnScreenReaderContent(context, renderedLines, viewSelection) {\n        const activeDocument = getActiveWindow().document;\n        const activeDocumentSelection = activeDocument.getSelection();\n        if (!activeDocumentSelection) {\n            return;\n        }\n        const startLineNumber = viewSelection.startLineNumber;\n        const endLineNumber = viewSelection.endLineNumber;\n        const startRenderedLine = renderedLines.get(startLineNumber);\n        const endRenderedLine = renderedLines.get(endLineNumber);\n        if (!startRenderedLine || !endRenderedLine) {\n            return;\n        }\n        const viewModel = context.viewModel;\n        const model = viewModel.model;\n        const coordinatesConverter = viewModel.coordinatesConverter;\n        const startRange = new Range(startLineNumber, 1, startLineNumber, viewSelection.selectionStartColumn);\n        const modelStartRange = coordinatesConverter.convertViewRangeToModelRange(startRange);\n        const characterCountForStart = model.getCharacterCountInRange(modelStartRange);\n        const endRange = new Range(endLineNumber, 1, endLineNumber, viewSelection.positionColumn);\n        const modelEndRange = coordinatesConverter.convertViewRangeToModelRange(endRange);\n        const characterCountForEnd = model.getCharacterCountInRange(modelEndRange);\n        const startDomPosition = startRenderedLine.characterMapping.getDomPosition(characterCountForStart);\n        const endDomPosition = endRenderedLine.characterMapping.getDomPosition(characterCountForEnd);\n        const startDomNode = startRenderedLine.domNode.firstChild;\n        const endDomNode = endRenderedLine.domNode.firstChild;\n        const startChildren = startDomNode.childNodes;\n        const endChildren = endDomNode.childNodes;\n        const startNode = startChildren.item(startDomPosition.partIndex);\n        const endNode = endChildren.item(endDomPosition.partIndex);\n        if (!startNode.firstChild || !endNode.firstChild) {\n            return;\n        }\n        this._setIgnoreSelectionChangeTime('setRange');\n        activeDocumentSelection.setBaseAndExtent(startNode.firstChild, viewSelection.startColumn === 1 ? 0 : startDomPosition.charIndex + 1, endNode.firstChild, viewSelection.endColumn === 1 ? 0 : endDomPosition.charIndex + 1);\n    }\n    _getScreenReaderContentLineIntervals(primarySelection) {\n        return this._strategy.fromEditorSelection(this._context.viewModel, primarySelection, this._accessibilityPageSize);\n    }\n    _getEditorSelectionFromDomRange() {\n        if (!this._renderedLines) {\n            return;\n        }\n        const selection = getActiveWindow().document.getSelection();\n        if (!selection) {\n            return;\n        }\n        const rangeCount = selection.rangeCount;\n        if (rangeCount === 0) {\n            return;\n        }\n        const range = selection.getRangeAt(0);\n        const startContainer = range.startContainer;\n        const endContainer = range.endContainer;\n        const startSpanElement = startContainer.parentElement;\n        const endSpanElement = endContainer.parentElement;\n        if (!startSpanElement || !isHTMLElement(startSpanElement) || !endSpanElement || !isHTMLElement(endSpanElement)) {\n            return;\n        }\n        const startLineDomNode = startSpanElement.parentElement?.parentElement;\n        const endLineDomNode = endSpanElement.parentElement?.parentElement;\n        if (!startLineDomNode || !endLineDomNode) {\n            return;\n        }\n        const startLineNumberAttribute = startLineDomNode.getAttribute(LINE_NUMBER_ATTRIBUTE);\n        const endLineNumberAttribute = endLineDomNode.getAttribute(LINE_NUMBER_ATTRIBUTE);\n        if (!startLineNumberAttribute || !endLineNumberAttribute) {\n            return;\n        }\n        const startLineNumber = parseInt(startLineNumberAttribute);\n        const endLineNumber = parseInt(endLineNumberAttribute);\n        const startMapping = this._renderedLines.get(startLineNumber)?.characterMapping;\n        const endMapping = this._renderedLines.get(endLineNumber)?.characterMapping;\n        if (!startMapping || !endMapping) {\n            return;\n        }\n        const startColumn = getColumnOfNodeOffset(startMapping, startSpanElement, range.startOffset);\n        const endColumn = getColumnOfNodeOffset(endMapping, endSpanElement, range.endOffset);\n        if (selection.direction === 'forward') {\n            return new Selection(startLineNumber, startColumn, endLineNumber, endColumn);\n        }\n        else {\n            return new Selection(endLineNumber, endColumn, startLineNumber, startColumn);\n        }\n    }\n};\nRichScreenReaderContent = __decorate([\n    __param(3, IAccessibilityService)\n], RichScreenReaderContent);\nclass RichRenderedScreenReaderLine {\n    constructor(domNode, characterMapping) {\n        this.domNode = domNode;\n        this.characterMapping = characterMapping;\n    }\n}\nclass LineInterval {\n    constructor(startLine, endLine) {\n        this.startLine = startLine;\n        this.endLine = endLine;\n    }\n}\nclass RichScreenReaderState {\n    constructor(model, intervals) {\n        this.intervals = intervals;\n        let value = '';\n        for (const interval of intervals) {\n            for (let lineNumber = interval.startLine; lineNumber <= interval.endLine; lineNumber++) {\n                value += model.getLineContent(lineNumber) + '\\n';\n            }\n        }\n        this.value = value;\n    }\n    equals(other) {\n        return this.value === other.value;\n    }\n    static get NULL() {\n        const nullModel = {\n            getLineContent: () => '',\n            getLineCount: () => 1,\n            getLineMaxColumn: () => 1,\n            getValueInRange: () => '',\n            getValueLengthInRange: () => 0,\n            modifyPosition: (position, offset) => position\n        };\n        return new RichScreenReaderState(nullModel, []);\n    }\n}\nclass RichPagedScreenReaderStrategy {\n    constructor() { }\n    _getPageOfLine(lineNumber, linesPerPage) {\n        return Math.floor((lineNumber - 1) / linesPerPage);\n    }\n    _getRangeForPage(context, page, linesPerPage) {\n        const offset = page * linesPerPage;\n        const startLineNumber = offset + 1;\n        const endLineNumber = Math.min(offset + linesPerPage, context.getLineCount());\n        return new LineInterval(startLineNumber, endLineNumber);\n    }\n    fromEditorSelection(context, viewSelection, linesPerPage) {\n        const selectionStartPage = this._getPageOfLine(viewSelection.startLineNumber, linesPerPage);\n        const selectionStartPageRange = this._getRangeForPage(context, selectionStartPage, linesPerPage);\n        const selectionEndPage = this._getPageOfLine(viewSelection.endLineNumber, linesPerPage);\n        const selectionEndPageRange = this._getRangeForPage(context, selectionEndPage, linesPerPage);\n        const lineIntervals = [{ startLine: selectionStartPageRange.startLine, endLine: selectionStartPageRange.endLine }];\n        if (selectionStartPage + 1 < selectionEndPage) {\n            lineIntervals.push({ startLine: selectionEndPageRange.startLine, endLine: selectionEndPageRange.endLine });\n        }\n        return new RichScreenReaderState(context, lineIntervals);\n    }\n}\n\nexport { RichScreenReaderContent };\n","import { BugIndicatingError } from '../../../../base/common/errors.js';\nimport { OffsetRange } from '../ranges/offsetRange.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nclass BaseEdit {\n    constructor(replacements) {\n        this.replacements = replacements;\n        let lastEndEx = -1;\n        for (const replacement of replacements) {\n            if (!(replacement.replaceRange.start >= lastEndEx)) {\n                throw new BugIndicatingError(`Edits must be disjoint and sorted. Found ${replacement} after ${lastEndEx}`);\n            }\n            lastEndEx = replacement.replaceRange.endExclusive;\n        }\n    }\n    toString() {\n        const edits = this.replacements.map(e => e.toString()).join(', ');\n        return `[${edits}]`;\n    }\n    /**\n     * Normalizes the edit by removing empty replacements and joining touching replacements (if the replacements allow joining).\n     * Two edits have an equal normalized edit if and only if they have the same effect on any input.\n     *\n     * ![](https://raw.githubusercontent.com/microsoft/vscode/refs/heads/main/src/vs/editor/common/core/edits/docs/BaseEdit_normalize.drawio.png)\n     *\n     * Invariant:\n     * ```\n     * (forall base: TEdit.apply(base).equals(other.apply(base))) <-> this.normalize().equals(other.normalize())\n     * ```\n     * and\n     * ```\n     * forall base: TEdit.apply(base).equals(this.normalize().apply(base))\n     * ```\n     *\n     */\n    normalize() {\n        const newReplacements = [];\n        let lastReplacement;\n        for (const r of this.replacements) {\n            if (r.getNewLength() === 0 && r.replaceRange.length === 0) {\n                continue;\n            }\n            if (lastReplacement && lastReplacement.replaceRange.endExclusive === r.replaceRange.start) {\n                const joined = lastReplacement.tryJoinTouching(r);\n                if (joined) {\n                    lastReplacement = joined;\n                    continue;\n                }\n            }\n            if (lastReplacement) {\n                newReplacements.push(lastReplacement);\n            }\n            lastReplacement = r;\n        }\n        if (lastReplacement) {\n            newReplacements.push(lastReplacement);\n        }\n        return this._createNew(newReplacements);\n    }\n    /**\n     * Combines two edits into one with the same effect.\n     *\n     * ![](https://raw.githubusercontent.com/microsoft/vscode/refs/heads/main/src/vs/editor/common/core/edits/docs/BaseEdit_compose.drawio.png)\n     *\n     * Invariant:\n     * ```\n     * other.apply(this.apply(s0)) = this.compose(other).apply(s0)\n     * ```\n     */\n    compose(other) {\n        const edits1 = this.normalize();\n        const edits2 = other.normalize();\n        if (edits1.isEmpty()) {\n            return edits2;\n        }\n        if (edits2.isEmpty()) {\n            return edits1;\n        }\n        const edit1Queue = [...edits1.replacements];\n        const result = [];\n        let edit1ToEdit2 = 0;\n        for (const r2 of edits2.replacements) {\n            // Copy over edit1 unmodified until it touches edit2.\n            while (true) {\n                const r1 = edit1Queue[0];\n                if (!r1 || r1.replaceRange.start + edit1ToEdit2 + r1.getNewLength() >= r2.replaceRange.start) {\n                    break;\n                }\n                edit1Queue.shift();\n                result.push(r1);\n                edit1ToEdit2 += r1.getNewLength() - r1.replaceRange.length;\n            }\n            const firstEdit1ToEdit2 = edit1ToEdit2;\n            let firstIntersecting; // or touching\n            let lastIntersecting; // or touching\n            while (true) {\n                const r1 = edit1Queue[0];\n                if (!r1 || r1.replaceRange.start + edit1ToEdit2 > r2.replaceRange.endExclusive) {\n                    break;\n                }\n                // else we intersect, because the new end of edit1 is after or equal to our start\n                if (!firstIntersecting) {\n                    firstIntersecting = r1;\n                }\n                lastIntersecting = r1;\n                edit1Queue.shift();\n                edit1ToEdit2 += r1.getNewLength() - r1.replaceRange.length;\n            }\n            if (!firstIntersecting) {\n                result.push(r2.delta(-edit1ToEdit2));\n            }\n            else {\n                const newReplaceRangeStart = Math.min(firstIntersecting.replaceRange.start, r2.replaceRange.start - firstEdit1ToEdit2);\n                const prefixLength = r2.replaceRange.start - (firstIntersecting.replaceRange.start + firstEdit1ToEdit2);\n                if (prefixLength > 0) {\n                    const prefix = firstIntersecting.slice(OffsetRange.emptyAt(newReplaceRangeStart), new OffsetRange(0, prefixLength));\n                    result.push(prefix);\n                }\n                if (!lastIntersecting) {\n                    throw new BugIndicatingError(`Invariant violation: lastIntersecting is undefined`);\n                }\n                const suffixLength = (lastIntersecting.replaceRange.endExclusive + edit1ToEdit2) - r2.replaceRange.endExclusive;\n                if (suffixLength > 0) {\n                    const e = lastIntersecting.slice(OffsetRange.ofStartAndLength(lastIntersecting.replaceRange.endExclusive, 0), new OffsetRange(lastIntersecting.getNewLength() - suffixLength, lastIntersecting.getNewLength()));\n                    edit1Queue.unshift(e);\n                    edit1ToEdit2 -= e.getNewLength() - e.replaceRange.length;\n                }\n                const newReplaceRange = new OffsetRange(newReplaceRangeStart, r2.replaceRange.endExclusive - edit1ToEdit2);\n                const middle = r2.slice(newReplaceRange, new OffsetRange(0, r2.getNewLength()));\n                result.push(middle);\n            }\n        }\n        while (true) {\n            const item = edit1Queue.shift();\n            if (!item) {\n                break;\n            }\n            result.push(item);\n        }\n        return this._createNew(result).normalize();\n    }\n    /**\n     * Returns the range of each replacement in the applied value.\n    */\n    getNewRanges() {\n        const ranges = [];\n        let offset = 0;\n        for (const e of this.replacements) {\n            ranges.push(OffsetRange.ofStartAndLength(e.replaceRange.start + offset, e.getNewLength()));\n            offset += e.getLengthDelta();\n        }\n        return ranges;\n    }\n    isEmpty() {\n        return this.replacements.length === 0;\n    }\n}\nclass BaseReplacement {\n    constructor(\n    /**\n     * The range to be replaced.\n    */\n    replaceRange) {\n        this.replaceRange = replaceRange;\n    }\n    delta(offset) {\n        return this.slice(this.replaceRange.delta(offset), new OffsetRange(0, this.getNewLength()));\n    }\n    getLengthDelta() {\n        return this.getNewLength() - this.replaceRange.length;\n    }\n    toString() {\n        return `{ ${this.replaceRange.toString()} -> ${this.getNewLength()} }`;\n    }\n    get isEmpty() {\n        return this.getNewLength() === 0 && this.replaceRange.length === 0;\n    }\n    getRangeAfterReplace() {\n        return new OffsetRange(this.replaceRange.start, this.replaceRange.start + this.getNewLength());\n    }\n}\n\nexport { BaseEdit, BaseReplacement };\n","import { commonPrefixLength, commonSuffixLength } from '../../../../base/common/strings.js';\nimport { OffsetRange } from '../ranges/offsetRange.js';\nimport { BaseEdit, BaseReplacement } from './edit.js';\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// eslint-disable-next-line @typescript-eslint/no-explicit-any\nclass BaseStringEdit extends BaseEdit {\n    apply(base) {\n        const resultText = [];\n        let pos = 0;\n        for (const edit of this.replacements) {\n            resultText.push(base.substring(pos, edit.replaceRange.start));\n            resultText.push(edit.newText);\n            pos = edit.replaceRange.endExclusive;\n        }\n        resultText.push(base.substring(pos));\n        return resultText.join('');\n    }\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nclass BaseStringReplacement extends BaseReplacement {\n    constructor(range, newText) {\n        super(range);\n        this.newText = newText;\n    }\n    getNewLength() { return this.newText.length; }\n    toString() {\n        return `${this.replaceRange} -> ${JSON.stringify(this.newText)}`;\n    }\n    replace(str) {\n        return str.substring(0, this.replaceRange.start) + this.newText + str.substring(this.replaceRange.endExclusive);\n    }\n    removeCommonSuffixPrefix(originalText) {\n        const oldText = originalText.substring(this.replaceRange.start, this.replaceRange.endExclusive);\n        const prefixLen = commonPrefixLength(oldText, this.newText);\n        const suffixLen = Math.min(oldText.length - prefixLen, this.newText.length - prefixLen, commonSuffixLength(oldText, this.newText));\n        const replaceRange = new OffsetRange(this.replaceRange.start + prefixLen, this.replaceRange.endExclusive - suffixLen);\n        const newText = this.newText.substring(prefixLen, this.newText.length - suffixLen);\n        return new StringReplacement(replaceRange, newText);\n    }\n    removeCommonSuffixAndPrefix(source) {\n        return this.removeCommonSuffix(source).removeCommonPrefix(source);\n    }\n    removeCommonPrefix(source) {\n        const oldText = this.replaceRange.substring(source);\n        const prefixLen = commonPrefixLength(oldText, this.newText);\n        if (prefixLen === 0) {\n            return this;\n        }\n        return this.slice(this.replaceRange.deltaStart(prefixLen), new OffsetRange(prefixLen, this.newText.length));\n    }\n    removeCommonSuffix(source) {\n        const oldText = this.replaceRange.substring(source);\n        const suffixLen = commonSuffixLength(oldText, this.newText);\n        if (suffixLen === 0) {\n            return this;\n        }\n        return this.slice(this.replaceRange.deltaEnd(-suffixLen), new OffsetRange(0, this.newText.length - suffixLen));\n    }\n    toJson() {\n        return ({\n            txt: this.newText,\n            pos: this.replaceRange.start,\n            len: this.replaceRange.length,\n        });\n    }\n}\n/**\n * Represents a set of replacements to a string.\n * All these replacements are applied at once.\n*/\nclass StringEdit extends BaseStringEdit {\n    static { this.empty = new StringEdit([]); }\n    static compose(edits) {\n        if (edits.length === 0) {\n            return StringEdit.empty;\n        }\n        let result = edits[0];\n        for (let i = 1; i < edits.length; i++) {\n            result = result.compose(edits[i]);\n        }\n        return result;\n    }\n    constructor(replacements) {\n        super(replacements);\n    }\n    _createNew(replacements) {\n        return new StringEdit(replacements);\n    }\n}\nclass StringReplacement extends BaseStringReplacement {\n    static insert(offset, text) {\n        return new StringReplacement(OffsetRange.emptyAt(offset), text);\n    }\n    static replace(range, text) {\n        return new StringReplacement(range, text);\n    }\n    equals(other) {\n        return this.replaceRange.equals(other.replaceRange) && this.newText === other.newText;\n    }\n    tryJoinTouching(other) {\n        return new StringReplacement(this.replaceRange.joinRightTouching(other.replaceRange), this.newText + other.newText);\n    }\n    slice(range, rangeInReplacement) {\n        return new StringReplacement(range, rangeInReplacement ? rangeInReplacement.substring(this.newText) : this.newText);\n    }\n}\nfunction applyEditsToRanges(sortedRanges, edit) {\n    sortedRanges = sortedRanges.slice();\n    // treat edits as deletion of the replace range and then as insertion that extends the first range\n    const result = [];\n    let offset = 0;\n    for (const e of edit.replacements) {\n        while (true) {\n            // ranges before the current edit\n            const r = sortedRanges[0];\n            if (!r || r.endExclusive >= e.replaceRange.start) {\n                break;\n            }\n            sortedRanges.shift();\n            result.push(r.delta(offset));\n        }\n        const intersecting = [];\n        while (true) {\n            const r = sortedRanges[0];\n            if (!r || !r.intersectsOrTouches(e.replaceRange)) {\n                break;\n            }\n            sortedRanges.shift();\n            intersecting.push(r);\n        }\n        for (let i = intersecting.length - 1; i >= 0; i--) {\n            let r = intersecting[i];\n            const overlap = r.intersect(e.replaceRange).length;\n            r = r.deltaEnd(-overlap + (i === 0 ? e.newText.length : 0));\n            const rangeAheadOfReplaceRange = r.start - e.replaceRange.start;\n            if (rangeAheadOfReplaceRange > 0) {\n                r = r.delta(-rangeAheadOfReplaceRange);\n            }\n            if (i !== 0) {\n                r = r.delta(e.newText.length);\n            }\n            // We already took our offset into account.\n            // Because we add r back to the queue (which then adds offset again),\n            // we have to remove it here.\n            r = r.delta(-(e.newText.length - e.replaceRange.length));\n            sortedRanges.unshift(r);\n        }\n        offset += e.newText.length - e.replaceRange.length;\n    }\n    while (true) {\n        const r = sortedRanges[0];\n        if (!r) {\n            break;\n        }\n        sortedRanges.shift();\n        result.push(r.delta(offset));\n    }\n    return result;\n}\n\nexport { BaseStringEdit, BaseStringReplacement, StringEdit, StringReplacement, applyEditsToRanges };\n","import { BugIndicatingError } from '../../../../base/common/errors.js';\nimport { OffsetRange } from './offsetRange.js';\nimport { Range } from '../range.js';\nimport { findFirstIdxMonotonousOrArrLen, findLastIdxMonotonous, findLastMonotonous } from '../../../../base/common/arraysFind.js';\nimport { compareBy, numberComparator } from '../../../../base/common/arrays.js';\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/**\n * A range of lines (1-based).\n */\nclass LineRange {\n    static ofLength(startLineNumber, length) {\n        return new LineRange(startLineNumber, startLineNumber + length);\n    }\n    static fromRange(range) {\n        return new LineRange(range.startLineNumber, range.endLineNumber);\n    }\n    static fromRangeInclusive(range) {\n        return new LineRange(range.startLineNumber, range.endLineNumber + 1);\n    }\n    static { this.compareByStart = compareBy(l => l.startLineNumber, numberComparator); }\n    /**\n     * @param lineRanges An array of arrays of of sorted line ranges.\n     */\n    static joinMany(lineRanges) {\n        if (lineRanges.length === 0) {\n            return [];\n        }\n        let result = new LineRangeSet(lineRanges[0].slice());\n        for (let i = 1; i < lineRanges.length; i++) {\n            result = result.getUnion(new LineRangeSet(lineRanges[i].slice()));\n        }\n        return result.ranges;\n    }\n    static join(lineRanges) {\n        if (lineRanges.length === 0) {\n            throw new BugIndicatingError('lineRanges cannot be empty');\n        }\n        let startLineNumber = lineRanges[0].startLineNumber;\n        let endLineNumberExclusive = lineRanges[0].endLineNumberExclusive;\n        for (let i = 1; i < lineRanges.length; i++) {\n            startLineNumber = Math.min(startLineNumber, lineRanges[i].startLineNumber);\n            endLineNumberExclusive = Math.max(endLineNumberExclusive, lineRanges[i].endLineNumberExclusive);\n        }\n        return new LineRange(startLineNumber, endLineNumberExclusive);\n    }\n    /**\n     * @internal\n     */\n    static deserialize(lineRange) {\n        return new LineRange(lineRange[0], lineRange[1]);\n    }\n    constructor(startLineNumber, endLineNumberExclusive) {\n        if (startLineNumber > endLineNumberExclusive) {\n            throw new BugIndicatingError(`startLineNumber ${startLineNumber} cannot be after endLineNumberExclusive ${endLineNumberExclusive}`);\n        }\n        this.startLineNumber = startLineNumber;\n        this.endLineNumberExclusive = endLineNumberExclusive;\n    }\n    /**\n     * Indicates if this line range contains the given line number.\n     */\n    contains(lineNumber) {\n        return this.startLineNumber <= lineNumber && lineNumber < this.endLineNumberExclusive;\n    }\n    /**\n     * Indicates if this line range is empty.\n     */\n    get isEmpty() {\n        return this.startLineNumber === this.endLineNumberExclusive;\n    }\n    /**\n     * Moves this line range by the given offset of line numbers.\n     */\n    delta(offset) {\n        return new LineRange(this.startLineNumber + offset, this.endLineNumberExclusive + offset);\n    }\n    deltaLength(offset) {\n        return new LineRange(this.startLineNumber, this.endLineNumberExclusive + offset);\n    }\n    /**\n     * The number of lines this line range spans.\n     */\n    get length() {\n        return this.endLineNumberExclusive - this.startLineNumber;\n    }\n    /**\n     * Creates a line range that combines this and the given line range.\n     */\n    join(other) {\n        return new LineRange(Math.min(this.startLineNumber, other.startLineNumber), Math.max(this.endLineNumberExclusive, other.endLineNumberExclusive));\n    }\n    toString() {\n        return `[${this.startLineNumber},${this.endLineNumberExclusive})`;\n    }\n    /**\n     * The resulting range is empty if the ranges do not intersect, but touch.\n     * If the ranges don't even touch, the result is undefined.\n     */\n    intersect(other) {\n        const startLineNumber = Math.max(this.startLineNumber, other.startLineNumber);\n        const endLineNumberExclusive = Math.min(this.endLineNumberExclusive, other.endLineNumberExclusive);\n        if (startLineNumber <= endLineNumberExclusive) {\n            return new LineRange(startLineNumber, endLineNumberExclusive);\n        }\n        return undefined;\n    }\n    intersectsStrict(other) {\n        return this.startLineNumber < other.endLineNumberExclusive && other.startLineNumber < this.endLineNumberExclusive;\n    }\n    intersectsOrTouches(other) {\n        return this.startLineNumber <= other.endLineNumberExclusive && other.startLineNumber <= this.endLineNumberExclusive;\n    }\n    equals(b) {\n        return this.startLineNumber === b.startLineNumber && this.endLineNumberExclusive === b.endLineNumberExclusive;\n    }\n    toInclusiveRange() {\n        if (this.isEmpty) {\n            return null;\n        }\n        return new Range(this.startLineNumber, 1, this.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER);\n    }\n    /**\n     * @deprecated Using this function is discouraged because it might lead to bugs: The end position is not guaranteed to be a valid position!\n    */\n    toExclusiveRange() {\n        return new Range(this.startLineNumber, 1, this.endLineNumberExclusive, 1);\n    }\n    mapToLineArray(f) {\n        const result = [];\n        for (let lineNumber = this.startLineNumber; lineNumber < this.endLineNumberExclusive; lineNumber++) {\n            result.push(f(lineNumber));\n        }\n        return result;\n    }\n    forEach(f) {\n        for (let lineNumber = this.startLineNumber; lineNumber < this.endLineNumberExclusive; lineNumber++) {\n            f(lineNumber);\n        }\n    }\n    /**\n     * @internal\n     */\n    serialize() {\n        return [this.startLineNumber, this.endLineNumberExclusive];\n    }\n    /**\n     * Converts this 1-based line range to a 0-based offset range (subtracts 1!).\n     * @internal\n     */\n    toOffsetRange() {\n        return new OffsetRange(this.startLineNumber - 1, this.endLineNumberExclusive - 1);\n    }\n    addMargin(marginTop, marginBottom) {\n        return new LineRange(this.startLineNumber - marginTop, this.endLineNumberExclusive + marginBottom);\n    }\n}\nclass LineRangeSet {\n    constructor(\n    /**\n     * Sorted by start line number.\n     * No two line ranges are touching or intersecting.\n     */\n    _normalizedRanges = []) {\n        this._normalizedRanges = _normalizedRanges;\n    }\n    get ranges() {\n        return this._normalizedRanges;\n    }\n    addRange(range) {\n        if (range.length === 0) {\n            return;\n        }\n        // Idea: Find joinRange such that:\n        // replaceRange = _normalizedRanges.replaceRange(joinRange, range.joinAll(joinRange.map(idx => this._normalizedRanges[idx])))\n        // idx of first element that touches range or that is after range\n        const joinRangeStartIdx = findFirstIdxMonotonousOrArrLen(this._normalizedRanges, r => r.endLineNumberExclusive >= range.startLineNumber);\n        // idx of element after { last element that touches range or that is before range }\n        const joinRangeEndIdxExclusive = findLastIdxMonotonous(this._normalizedRanges, r => r.startLineNumber <= range.endLineNumberExclusive) + 1;\n        if (joinRangeStartIdx === joinRangeEndIdxExclusive) {\n            // If there is no element that touches range, then joinRangeStartIdx === joinRangeEndIdxExclusive and that value is the index of the element after range\n            this._normalizedRanges.splice(joinRangeStartIdx, 0, range);\n        }\n        else if (joinRangeStartIdx === joinRangeEndIdxExclusive - 1) {\n            // Else, there is an element that touches range and in this case it is both the first and last element. Thus we can replace it\n            const joinRange = this._normalizedRanges[joinRangeStartIdx];\n            this._normalizedRanges[joinRangeStartIdx] = joinRange.join(range);\n        }\n        else {\n            // First and last element are different - we need to replace the entire range\n            const joinRange = this._normalizedRanges[joinRangeStartIdx].join(this._normalizedRanges[joinRangeEndIdxExclusive - 1]).join(range);\n            this._normalizedRanges.splice(joinRangeStartIdx, joinRangeEndIdxExclusive - joinRangeStartIdx, joinRange);\n        }\n    }\n    contains(lineNumber) {\n        const rangeThatStartsBeforeEnd = findLastMonotonous(this._normalizedRanges, r => r.startLineNumber <= lineNumber);\n        return !!rangeThatStartsBeforeEnd && rangeThatStartsBeforeEnd.endLineNumberExclusive > lineNumber;\n    }\n    intersects(range) {\n        const rangeThatStartsBeforeEnd = findLastMonotonous(this._normalizedRanges, r => r.startLineNumber < range.endLineNumberExclusive);\n        return !!rangeThatStartsBeforeEnd && rangeThatStartsBeforeEnd.endLineNumberExclusive > range.startLineNumber;\n    }\n    getUnion(other) {\n        if (this._normalizedRanges.length === 0) {\n            return other;\n        }\n        if (other._normalizedRanges.length === 0) {\n            return this;\n        }\n        const result = [];\n        let i1 = 0;\n        let i2 = 0;\n        let current = null;\n        while (i1 < this._normalizedRanges.length || i2 < other._normalizedRanges.length) {\n            let next = null;\n            if (i1 < this._normalizedRanges.length && i2 < other._normalizedRanges.length) {\n                const lineRange1 = this._normalizedRanges[i1];\n                const lineRange2 = other._normalizedRanges[i2];\n                if (lineRange1.startLineNumber < lineRange2.startLineNumber) {\n                    next = lineRange1;\n                    i1++;\n                }\n                else {\n                    next = lineRange2;\n                    i2++;\n                }\n            }\n            else if (i1 < this._normalizedRanges.length) {\n                next = this._normalizedRanges[i1];\n                i1++;\n            }\n            else {\n                next = other._normalizedRanges[i2];\n                i2++;\n            }\n            if (current === null) {\n                current = next;\n            }\n            else {\n                if (current.endLineNumberExclusive >= next.startLineNumber) {\n                    // merge\n                    current = new LineRange(current.startLineNumber, Math.max(current.endLineNumberExclusive, next.endLineNumberExclusive));\n                }\n                else {\n                    // push\n                    result.push(current);\n                    current = next;\n                }\n            }\n        }\n        if (current !== null) {\n            result.push(current);\n        }\n        return new LineRangeSet(result);\n    }\n    /**\n     * Subtracts all ranges in this set from `range` and returns the result.\n     */\n    subtractFrom(range) {\n        // idx of first element that touches range or that is after range\n        const joinRangeStartIdx = findFirstIdxMonotonousOrArrLen(this._normalizedRanges, r => r.endLineNumberExclusive >= range.startLineNumber);\n        // idx of element after { last element that touches range or that is before range }\n        const joinRangeEndIdxExclusive = findLastIdxMonotonous(this._normalizedRanges, r => r.startLineNumber <= range.endLineNumberExclusive) + 1;\n        if (joinRangeStartIdx === joinRangeEndIdxExclusive) {\n            return new LineRangeSet([range]);\n        }\n        const result = [];\n        let startLineNumber = range.startLineNumber;\n        for (let i = joinRangeStartIdx; i < joinRangeEndIdxExclusive; i++) {\n            const r = this._normalizedRanges[i];\n            if (r.startLineNumber > startLineNumber) {\n                result.push(new LineRange(startLineNumber, r.startLineNumber));\n            }\n            startLineNumber = r.endLineNumberExclusive;\n        }\n        if (startLineNumber < range.endLineNumberExclusive) {\n            result.push(new LineRange(startLineNumber, range.endLineNumberExclusive));\n        }\n        return new LineRangeSet(result);\n    }\n    toString() {\n        return this._normalizedRanges.map(r => r.toString()).join(', ');\n    }\n    getIntersection(other) {\n        const result = [];\n        let i1 = 0;\n        let i2 = 0;\n        while (i1 < this._normalizedRanges.length && i2 < other._normalizedRanges.length) {\n            const r1 = this._normalizedRanges[i1];\n            const r2 = other._normalizedRanges[i2];\n            const i = r1.intersect(r2);\n            if (i && !i.isEmpty) {\n                result.push(i);\n            }\n            if (r1.endLineNumberExclusive < r2.endLineNumberExclusive) {\n                i1++;\n            }\n            else {\n                i2++;\n            }\n        }\n        return new LineRangeSet(result);\n    }\n    getWithDelta(value) {\n        return new LineRangeSet(this._normalizedRanges.map(r => r.delta(value)));\n    }\n}\n\nexport { LineRange, LineRangeSet };\n","import { LineRange } from '../ranges/lineRange.js';\nimport { Position } from '../position.js';\nimport { Range } from '../range.js';\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/**\n * Represents a non-negative length of text in terms of line and column count.\n*/\nclass TextLength {\n    static { this.zero = new TextLength(0, 0); }\n    static betweenPositions(position1, position2) {\n        if (position1.lineNumber === position2.lineNumber) {\n            return new TextLength(0, position2.column - position1.column);\n        }\n        else {\n            return new TextLength(position2.lineNumber - position1.lineNumber, position2.column - 1);\n        }\n    }\n    static fromPosition(pos) {\n        return new TextLength(pos.lineNumber - 1, pos.column - 1);\n    }\n    static ofRange(range) {\n        return TextLength.betweenPositions(range.getStartPosition(), range.getEndPosition());\n    }\n    static ofText(text) {\n        let line = 0;\n        let column = 0;\n        for (const c of text) {\n            if (c === '\\n') {\n                line++;\n                column = 0;\n            }\n            else {\n                column++;\n            }\n        }\n        return new TextLength(line, column);\n    }\n    constructor(lineCount, columnCount) {\n        this.lineCount = lineCount;\n        this.columnCount = columnCount;\n    }\n    isGreaterThanOrEqualTo(other) {\n        if (this.lineCount !== other.lineCount) {\n            return this.lineCount > other.lineCount;\n        }\n        return this.columnCount >= other.columnCount;\n    }\n    add(other) {\n        if (other.lineCount === 0) {\n            return new TextLength(this.lineCount, this.columnCount + other.columnCount);\n        }\n        else {\n            return new TextLength(this.lineCount + other.lineCount, other.columnCount);\n        }\n    }\n    createRange(startPosition) {\n        if (this.lineCount === 0) {\n            return new Range(startPosition.lineNumber, startPosition.column, startPosition.lineNumber, startPosition.column + this.columnCount);\n        }\n        else {\n            return new Range(startPosition.lineNumber, startPosition.column, startPosition.lineNumber + this.lineCount, this.columnCount + 1);\n        }\n    }\n    toRange() {\n        return new Range(1, 1, this.lineCount + 1, this.columnCount + 1);\n    }\n    toLineRange() {\n        return LineRange.ofLength(1, this.lineCount + 1);\n    }\n    addToPosition(position) {\n        if (this.lineCount === 0) {\n            return new Position(position.lineNumber, position.column + this.columnCount);\n        }\n        else {\n            return new Position(position.lineNumber + this.lineCount, this.columnCount + 1);\n        }\n    }\n    toString() {\n        return `${this.lineCount},${this.columnCount}`;\n    }\n}\n\nexport { TextLength };\n","import { findLastIdxMonotonous } from '../../../../base/common/arraysFind.js';\nimport { OffsetRange } from '../ranges/offsetRange.js';\nimport { Position } from '../position.js';\nimport { Range } from '../range.js';\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 *--------------------------------------------------------------------------------------------*/\nclass PositionOffsetTransformerBase {\n    getOffsetRange(range) {\n        return new OffsetRange(this.getOffset(range.getStartPosition()), this.getOffset(range.getEndPosition()));\n    }\n    getRange(offsetRange) {\n        return Range.fromPositions(this.getPosition(offsetRange.start), this.getPosition(offsetRange.endExclusive));\n    }\n    getStringReplacement(edit) {\n        return new Deps.deps.StringReplacement(this.getOffsetRange(edit.range), edit.text);\n    }\n    getTextReplacement(edit) {\n        return new Deps.deps.TextReplacement(this.getRange(edit.replaceRange), edit.newText);\n    }\n    getTextEdit(edit) {\n        const edits = edit.replacements.map(e => this.getTextReplacement(e));\n        return new Deps.deps.TextEdit(edits);\n    }\n}\nclass Deps {\n    static { this._deps = undefined; }\n    static get deps() {\n        if (!this._deps) {\n            throw new Error('Dependencies not set. Call _setDependencies first.');\n        }\n        return this._deps;\n    }\n}\n/** This is to break circular module dependencies. */\nfunction _setPositionOffsetTransformerDependencies(deps) {\n    Deps._deps = deps;\n}\nclass PositionOffsetTransformer extends PositionOffsetTransformerBase {\n    constructor(text) {\n        super();\n        this.text = text;\n        this.lineStartOffsetByLineIdx = [];\n        this.lineEndOffsetByLineIdx = [];\n        this.lineStartOffsetByLineIdx.push(0);\n        for (let i = 0; i < text.length; i++) {\n            if (text.charAt(i) === '\\n') {\n                this.lineStartOffsetByLineIdx.push(i + 1);\n                if (i > 0 && text.charAt(i - 1) === '\\r') {\n                    this.lineEndOffsetByLineIdx.push(i - 1);\n                }\n                else {\n                    this.lineEndOffsetByLineIdx.push(i);\n                }\n            }\n        }\n        this.lineEndOffsetByLineIdx.push(text.length);\n    }\n    getOffset(position) {\n        const valPos = this._validatePosition(position);\n        return this.lineStartOffsetByLineIdx[valPos.lineNumber - 1] + valPos.column - 1;\n    }\n    _validatePosition(position) {\n        if (position.lineNumber < 1) {\n            return new Position(1, 1);\n        }\n        const lineCount = this.textLength.lineCount + 1;\n        if (position.lineNumber > lineCount) {\n            const lineLength = this.getLineLength(lineCount);\n            return new Position(lineCount, lineLength + 1);\n        }\n        if (position.column < 1) {\n            return new Position(position.lineNumber, 1);\n        }\n        const lineLength = this.getLineLength(position.lineNumber);\n        if (position.column - 1 > lineLength) {\n            return new Position(position.lineNumber, lineLength + 1);\n        }\n        return position;\n    }\n    getPosition(offset) {\n        const idx = findLastIdxMonotonous(this.lineStartOffsetByLineIdx, i => i <= offset);\n        const lineNumber = idx + 1;\n        const column = offset - this.lineStartOffsetByLineIdx[idx] + 1;\n        return new Position(lineNumber, column);\n    }\n    get textLength() {\n        const lineIdx = this.lineStartOffsetByLineIdx.length - 1;\n        return new Deps.deps.TextLength(lineIdx, this.text.length - this.lineStartOffsetByLineIdx[lineIdx]);\n    }\n    getLineLength(lineNumber) {\n        return this.lineEndOffsetByLineIdx[lineNumber - 1] - this.lineStartOffsetByLineIdx[lineNumber - 1];\n    }\n}\n\nexport { PositionOffsetTransformer, PositionOffsetTransformerBase, _setPositionOffsetTransformerDependencies };\n","import { assert } from '../../../../base/common/assert.js';\nimport { Position } from '../position.js';\nimport { Range } from '../range.js';\nimport { TextLength } from './textLength.js';\nimport { PositionOffsetTransformer } from './positionToOffsetImpl.js';\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 *--------------------------------------------------------------------------------------------*/\nclass AbstractText {\n    constructor() {\n        this._transformer = undefined;\n    }\n    get endPositionExclusive() {\n        return this.length.addToPosition(new Position(1, 1));\n    }\n    get lineRange() {\n        return this.length.toLineRange();\n    }\n    getValue() {\n        return this.getValueOfRange(this.length.toRange());\n    }\n    getValueOfOffsetRange(range) {\n        return this.getValueOfRange(this.getTransformer().getRange(range));\n    }\n    getLineLength(lineNumber) {\n        return this.getValueOfRange(new Range(lineNumber, 1, lineNumber, Number.MAX_SAFE_INTEGER)).length;\n    }\n    getTransformer() {\n        if (!this._transformer) {\n            this._transformer = new PositionOffsetTransformer(this.getValue());\n        }\n        return this._transformer;\n    }\n    getLineAt(lineNumber) {\n        return this.getValueOfRange(new Range(lineNumber, 1, lineNumber, Number.MAX_SAFE_INTEGER));\n    }\n}\nclass LineBasedText extends AbstractText {\n    constructor(_getLineContent, _lineCount) {\n        assert(_lineCount >= 1);\n        super();\n        this._getLineContent = _getLineContent;\n        this._lineCount = _lineCount;\n    }\n    getValueOfRange(range) {\n        if (range.startLineNumber === range.endLineNumber) {\n            return this._getLineContent(range.startLineNumber).substring(range.startColumn - 1, range.endColumn - 1);\n        }\n        let result = this._getLineContent(range.startLineNumber).substring(range.startColumn - 1);\n        for (let i = range.startLineNumber + 1; i < range.endLineNumber; i++) {\n            result += '\\n' + this._getLineContent(i);\n        }\n        result += '\\n' + this._getLineContent(range.endLineNumber).substring(0, range.endColumn - 1);\n        return result;\n    }\n    getLineLength(lineNumber) {\n        return this._getLineContent(lineNumber).length;\n    }\n    get length() {\n        const lastLine = this._getLineContent(this._lineCount);\n        return new TextLength(this._lineCount - 1, lastLine.length);\n    }\n}\nclass ArrayText extends LineBasedText {\n    constructor(lines) {\n        super(lineNumber => lines[lineNumber - 1], lines.length);\n    }\n}\nclass StringText extends AbstractText {\n    constructor(value) {\n        super();\n        this.value = value;\n        this._t = new PositionOffsetTransformer(this.value);\n    }\n    getValueOfRange(range) {\n        return this._t.getOffsetRange(range).substring(this.value);\n    }\n    get length() {\n        return this._t.textLength;\n    }\n    // Override the getTransformer method to return the cached transformer\n    getTransformer() {\n        return this._t;\n    }\n}\n\nexport { AbstractText, ArrayText, LineBasedText, StringText };\n","import { compareBy } from '../../../../base/common/arrays.js';\nimport { assertFn, checkAdjacentItems } from '../../../../base/common/assert.js';\nimport { BugIndicatingError } from '../../../../base/common/errors.js';\nimport { commonPrefixLength, commonSuffixLength } from '../../../../base/common/strings.js';\nimport { Position } from '../position.js';\nimport { Range } from '../range.js';\nimport { TextLength } from '../text/textLength.js';\nimport { StringText } from '../text/abstractText.js';\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 *--------------------------------------------------------------------------------------------*/\nclass TextEdit {\n    static fromStringEdit(edit, initialState) {\n        const edits = edit.replacements.map(e => TextReplacement.fromStringReplacement(e, initialState));\n        return new TextEdit(edits);\n    }\n    static fromParallelReplacementsUnsorted(replacements) {\n        const r = replacements.slice().sort(compareBy(i => i.range, Range.compareRangesUsingStarts));\n        return new TextEdit(r);\n    }\n    constructor(replacements) {\n        this.replacements = replacements;\n        assertFn(() => checkAdjacentItems(replacements, (a, b) => a.range.getEndPosition().isBeforeOrEqual(b.range.getStartPosition())));\n    }\n    mapPosition(position) {\n        let lineDelta = 0;\n        let curLine = 0;\n        let columnDeltaInCurLine = 0;\n        for (const replacement of this.replacements) {\n            const start = replacement.range.getStartPosition();\n            if (position.isBeforeOrEqual(start)) {\n                break;\n            }\n            const end = replacement.range.getEndPosition();\n            const len = TextLength.ofText(replacement.text);\n            if (position.isBefore(end)) {\n                const startPos = new Position(start.lineNumber + lineDelta, start.column + (start.lineNumber + lineDelta === curLine ? columnDeltaInCurLine : 0));\n                const endPos = len.addToPosition(startPos);\n                return rangeFromPositions(startPos, endPos);\n            }\n            if (start.lineNumber + lineDelta !== curLine) {\n                columnDeltaInCurLine = 0;\n            }\n            lineDelta += len.lineCount - (replacement.range.endLineNumber - replacement.range.startLineNumber);\n            if (len.lineCount === 0) {\n                if (end.lineNumber !== start.lineNumber) {\n                    columnDeltaInCurLine += len.columnCount - (end.column - 1);\n                }\n                else {\n                    columnDeltaInCurLine += len.columnCount - (end.column - start.column);\n                }\n            }\n            else {\n                columnDeltaInCurLine = len.columnCount;\n            }\n            curLine = end.lineNumber + lineDelta;\n        }\n        return new Position(position.lineNumber + lineDelta, position.column + (position.lineNumber + lineDelta === curLine ? columnDeltaInCurLine : 0));\n    }\n    mapRange(range) {\n        function getStart(p) {\n            return p instanceof Position ? p : p.getStartPosition();\n        }\n        function getEnd(p) {\n            return p instanceof Position ? p : p.getEndPosition();\n        }\n        const start = getStart(this.mapPosition(range.getStartPosition()));\n        const end = getEnd(this.mapPosition(range.getEndPosition()));\n        return rangeFromPositions(start, end);\n    }\n    apply(text) {\n        let result = '';\n        let lastEditEnd = new Position(1, 1);\n        for (const replacement of this.replacements) {\n            const editRange = replacement.range;\n            const editStart = editRange.getStartPosition();\n            const editEnd = editRange.getEndPosition();\n            const r = rangeFromPositions(lastEditEnd, editStart);\n            if (!r.isEmpty()) {\n                result += text.getValueOfRange(r);\n            }\n            result += replacement.text;\n            lastEditEnd = editEnd;\n        }\n        const r = rangeFromPositions(lastEditEnd, text.endPositionExclusive);\n        if (!r.isEmpty()) {\n            result += text.getValueOfRange(r);\n        }\n        return result;\n    }\n    applyToString(str) {\n        const strText = new StringText(str);\n        return this.apply(strText);\n    }\n    getNewRanges() {\n        const newRanges = [];\n        let previousEditEndLineNumber = 0;\n        let lineOffset = 0;\n        let columnOffset = 0;\n        for (const replacement of this.replacements) {\n            const textLength = TextLength.ofText(replacement.text);\n            const newRangeStart = Position.lift({\n                lineNumber: replacement.range.startLineNumber + lineOffset,\n                column: replacement.range.startColumn + (replacement.range.startLineNumber === previousEditEndLineNumber ? columnOffset : 0)\n            });\n            const newRange = textLength.createRange(newRangeStart);\n            newRanges.push(newRange);\n            lineOffset = newRange.endLineNumber - replacement.range.endLineNumber;\n            columnOffset = newRange.endColumn - replacement.range.endColumn;\n            previousEditEndLineNumber = replacement.range.endLineNumber;\n        }\n        return newRanges;\n    }\n    toReplacement(text) {\n        if (this.replacements.length === 0) {\n            throw new BugIndicatingError();\n        }\n        if (this.replacements.length === 1) {\n            return this.replacements[0];\n        }\n        const startPos = this.replacements[0].range.getStartPosition();\n        const endPos = this.replacements[this.replacements.length - 1].range.getEndPosition();\n        let newText = '';\n        for (let i = 0; i < this.replacements.length; i++) {\n            const curEdit = this.replacements[i];\n            newText += curEdit.text;\n            if (i < this.replacements.length - 1) {\n                const nextEdit = this.replacements[i + 1];\n                const gapRange = Range.fromPositions(curEdit.range.getEndPosition(), nextEdit.range.getStartPosition());\n                const gapText = text.getValueOfRange(gapRange);\n                newText += gapText;\n            }\n        }\n        return new TextReplacement(Range.fromPositions(startPos, endPos), newText);\n    }\n    toString(text) {\n        if (text === undefined) {\n            return this.replacements.map(edit => edit.toString()).join('\\n');\n        }\n        if (typeof text === 'string') {\n            return this.toString(new StringText(text));\n        }\n        if (this.replacements.length === 0) {\n            return '';\n        }\n        return this.replacements.map(r => {\n            const maxLength = 10;\n            const originalText = text.getValueOfRange(r.range);\n            // Get text before the edit\n            const beforeRange = Range.fromPositions(new Position(Math.max(1, r.range.startLineNumber - 1), 1), r.range.getStartPosition());\n            let beforeText = text.getValueOfRange(beforeRange);\n            if (beforeText.length > maxLength) {\n                beforeText = '...' + beforeText.substring(beforeText.length - maxLength);\n            }\n            // Get text after the edit\n            const afterRange = Range.fromPositions(r.range.getEndPosition(), new Position(r.range.endLineNumber + 1, 1));\n            let afterText = text.getValueOfRange(afterRange);\n            if (afterText.length > maxLength) {\n                afterText = afterText.substring(0, maxLength) + '...';\n            }\n            // Format the replaced text\n            let replacedText = originalText;\n            if (replacedText.length > maxLength) {\n                const halfMax = Math.floor(maxLength / 2);\n                replacedText = replacedText.substring(0, halfMax) + '...' +\n                    replacedText.substring(replacedText.length - halfMax);\n            }\n            // Format the new text\n            let newText = r.text;\n            if (newText.length > maxLength) {\n                const halfMax = Math.floor(maxLength / 2);\n                newText = newText.substring(0, halfMax) + '...' +\n                    newText.substring(newText.length - halfMax);\n            }\n            if (replacedText.length === 0) {\n                // allow-any-unicode-next-line\n                return `${beforeText}❰${newText}❱${afterText}`;\n            }\n            // allow-any-unicode-next-line\n            return `${beforeText}❰${replacedText}↦${newText}❱${afterText}`;\n        }).join('\\n');\n    }\n}\nclass TextReplacement {\n    static joinReplacements(replacements, initialValue) {\n        if (replacements.length === 0) {\n            throw new BugIndicatingError();\n        }\n        if (replacements.length === 1) {\n            return replacements[0];\n        }\n        const startPos = replacements[0].range.getStartPosition();\n        const endPos = replacements[replacements.length - 1].range.getEndPosition();\n        let newText = '';\n        for (let i = 0; i < replacements.length; i++) {\n            const curEdit = replacements[i];\n            newText += curEdit.text;\n            if (i < replacements.length - 1) {\n                const nextEdit = replacements[i + 1];\n                const gapRange = Range.fromPositions(curEdit.range.getEndPosition(), nextEdit.range.getStartPosition());\n                const gapText = initialValue.getValueOfRange(gapRange);\n                newText += gapText;\n            }\n        }\n        return new TextReplacement(Range.fromPositions(startPos, endPos), newText);\n    }\n    static fromStringReplacement(replacement, initialState) {\n        return new TextReplacement(initialState.getTransformer().getRange(replacement.replaceRange), replacement.newText);\n    }\n    static delete(range) {\n        return new TextReplacement(range, '');\n    }\n    constructor(range, text) {\n        this.range = range;\n        this.text = text;\n    }\n    get isEmpty() {\n        return this.range.isEmpty() && this.text.length === 0;\n    }\n    static equals(first, second) {\n        return first.range.equalsRange(second.range) && first.text === second.text;\n    }\n    equals(other) {\n        return TextReplacement.equals(this, other);\n    }\n    removeCommonPrefixAndSuffix(text) {\n        const prefix = this.removeCommonPrefix(text);\n        const suffix = prefix.removeCommonSuffix(text);\n        return suffix;\n    }\n    removeCommonPrefix(text) {\n        const normalizedOriginalText = text.getValueOfRange(this.range).replaceAll('\\r\\n', '\\n');\n        const normalizedModifiedText = this.text.replaceAll('\\r\\n', '\\n');\n        const commonPrefixLen = commonPrefixLength(normalizedOriginalText, normalizedModifiedText);\n        const start = TextLength.ofText(normalizedOriginalText.substring(0, commonPrefixLen))\n            .addToPosition(this.range.getStartPosition());\n        const newText = normalizedModifiedText.substring(commonPrefixLen);\n        const range = Range.fromPositions(start, this.range.getEndPosition());\n        return new TextReplacement(range, newText);\n    }\n    removeCommonSuffix(text) {\n        const normalizedOriginalText = text.getValueOfRange(this.range).replaceAll('\\r\\n', '\\n');\n        const normalizedModifiedText = this.text.replaceAll('\\r\\n', '\\n');\n        const commonSuffixLen = commonSuffixLength(normalizedOriginalText, normalizedModifiedText);\n        const end = TextLength.ofText(normalizedOriginalText.substring(0, normalizedOriginalText.length - commonSuffixLen))\n            .addToPosition(this.range.getStartPosition());\n        const newText = normalizedModifiedText.substring(0, normalizedModifiedText.length - commonSuffixLen);\n        const range = Range.fromPositions(this.range.getStartPosition(), end);\n        return new TextReplacement(range, newText);\n    }\n    toString() {\n        const start = this.range.getStartPosition();\n        const end = this.range.getEndPosition();\n        return `(${start.lineNumber},${start.column} -> ${end.lineNumber},${end.column}): \"${this.text}\"`;\n    }\n}\nfunction rangeFromPositions(start, end) {\n    if (start.lineNumber === end.lineNumber && start.column === Number.MAX_SAFE_INTEGER) {\n        return Range.fromPositions(end, end);\n    }\n    else if (!start.isBeforeOrEqual(end)) {\n        throw new BugIndicatingError('start must be before end');\n    }\n    return new Range(start.lineNumber, start.column, end.lineNumber, end.column);\n}\n\nexport { TextEdit, TextReplacement };\n","import { StringReplacement, StringEdit } from '../edits/stringEdit.js';\nimport { TextEdit, TextReplacement } from '../edits/textEdit.js';\nimport { _setPositionOffsetTransformerDependencies } from './positionToOffsetImpl.js';\nexport { PositionOffsetTransformer, PositionOffsetTransformerBase } from './positionToOffsetImpl.js';\nimport { TextLength } from './textLength.js';\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_setPositionOffsetTransformerDependencies({\n    StringEdit: StringEdit,\n    StringReplacement: StringReplacement,\n    TextReplacement: TextReplacement,\n    TextEdit: TextEdit,\n    TextLength: TextLength,\n});\n","import { getActiveWindow, addDisposableListener } from '../../../../../base/browser/dom.js';\nimport { IAccessibilityService } from '../../../../../platform/accessibility/common/accessibility.js';\nimport { Selection } from '../../../../common/core/selection.js';\nimport { SimplePagedScreenReaderStrategy } from '../screenReaderUtils.js';\nimport '../../../../common/core/text/positionToOffset.js';\nimport { Disposable, MutableDisposable } from '../../../../../base/common/lifecycle.js';\nimport { IME } from '../../../../../base/common/ime.js';\nimport { PositionOffsetTransformer } from '../../../../common/core/text/positionToOffsetImpl.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet SimpleScreenReaderContent = class SimpleScreenReaderContent extends Disposable {\n    constructor(_domNode, _context, _viewController, _accessibilityService) {\n        super();\n        this._domNode = _domNode;\n        this._context = _context;\n        this._viewController = _viewController;\n        this._accessibilityService = _accessibilityService;\n        this._selectionChangeListener = this._register(new MutableDisposable());\n        this._accessibilityPageSize = 1;\n        this._ignoreSelectionChangeTime = 0;\n        this._strategy = new SimplePagedScreenReaderStrategy();\n        this.onConfigurationChanged(this._context.configuration.options);\n    }\n    updateScreenReaderContent(primarySelection) {\n        const domNode = this._domNode.domNode;\n        const focusedElement = getActiveWindow().document.activeElement;\n        if (!focusedElement || focusedElement !== domNode) {\n            return;\n        }\n        const isScreenReaderOptimized = this._accessibilityService.isScreenReaderOptimized();\n        if (isScreenReaderOptimized) {\n            this._state = this._getScreenReaderContentState(primarySelection);\n            if (domNode.textContent !== this._state.value) {\n                this._setIgnoreSelectionChangeTime('setValue');\n                domNode.textContent = this._state.value;\n            }\n            const selection = getActiveWindow().document.getSelection();\n            if (!selection) {\n                return;\n            }\n            const data = this._getScreenReaderRange(this._state.selectionStart, this._state.selectionEnd);\n            if (!data) {\n                return;\n            }\n            this._setIgnoreSelectionChangeTime('setRange');\n            selection.setBaseAndExtent(data.anchorNode, data.anchorOffset, data.focusNode, data.focusOffset);\n        }\n        else {\n            this._state = undefined;\n            this._setIgnoreSelectionChangeTime('setValue');\n            this._domNode.domNode.textContent = '';\n        }\n    }\n    updateScrollTop(primarySelection) {\n        if (!this._state) {\n            return;\n        }\n        const viewLayout = this._context.viewModel.viewLayout;\n        const stateStartLineNumber = this._state.startPositionWithinEditor.lineNumber;\n        const verticalOffsetOfStateStartLineNumber = viewLayout.getVerticalOffsetForLineNumber(stateStartLineNumber);\n        const verticalOffsetOfPositionLineNumber = viewLayout.getVerticalOffsetForLineNumber(primarySelection.positionLineNumber);\n        this._domNode.domNode.scrollTop = verticalOffsetOfPositionLineNumber - verticalOffsetOfStateStartLineNumber;\n    }\n    onFocusChange(newFocusValue) {\n        if (newFocusValue) {\n            this._selectionChangeListener.value = this._setSelectionChangeListener();\n        }\n        else {\n            this._selectionChangeListener.value = undefined;\n        }\n    }\n    onConfigurationChanged(options) {\n        this._accessibilityPageSize = options.get(3 /* EditorOption.accessibilityPageSize */);\n    }\n    onWillCut() {\n        this._setIgnoreSelectionChangeTime('onCut');\n    }\n    onWillPaste() {\n        this._setIgnoreSelectionChangeTime('onWillPaste');\n    }\n    // --- private methods\n    _setIgnoreSelectionChangeTime(reason) {\n        this._ignoreSelectionChangeTime = Date.now();\n    }\n    _setSelectionChangeListener() {\n        // See https://github.com/microsoft/vscode/issues/27216 and https://github.com/microsoft/vscode/issues/98256\n        // When using a Braille display or NVDA for example, it is possible for users to reposition the\n        // system caret. This is reflected in Chrome as a `selectionchange` event and needs to be reflected within the editor.\n        // `selectionchange` events often come multiple times for a single logical change\n        // so throttle multiple `selectionchange` events that burst in a short period of time.\n        let previousSelectionChangeEventTime = 0;\n        return addDisposableListener(this._domNode.domNode.ownerDocument, 'selectionchange', () => {\n            const isScreenReaderOptimized = this._accessibilityService.isScreenReaderOptimized();\n            if (!this._state || !isScreenReaderOptimized || !IME.enabled) {\n                return;\n            }\n            const activeElement = getActiveWindow().document.activeElement;\n            const isFocused = activeElement === this._domNode.domNode;\n            if (!isFocused) {\n                return;\n            }\n            const selection = getActiveWindow().document.getSelection();\n            if (!selection) {\n                return;\n            }\n            const rangeCount = selection.rangeCount;\n            if (rangeCount === 0) {\n                return;\n            }\n            const range = selection.getRangeAt(0);\n            const now = Date.now();\n            const delta1 = now - previousSelectionChangeEventTime;\n            previousSelectionChangeEventTime = now;\n            if (delta1 < 5) {\n                // received another `selectionchange` event within 5ms of the previous `selectionchange` event\n                // => ignore it\n                return;\n            }\n            const delta2 = now - this._ignoreSelectionChangeTime;\n            this._ignoreSelectionChangeTime = 0;\n            if (delta2 < 100) {\n                // received a `selectionchange` event within 100ms since we touched the hidden div\n                // => ignore it, since we caused it\n                return;\n            }\n            this._viewController.setSelection(this._getEditorSelectionFromDomRange(this._context, this._state, selection.direction, range));\n        });\n    }\n    _getScreenReaderContentState(primarySelection) {\n        const state = this._strategy.fromEditorSelection(this._context.viewModel, primarySelection, this._accessibilityPageSize, this._accessibilityService.getAccessibilitySupport() === 0 /* AccessibilitySupport.Unknown */);\n        const endPosition = this._context.viewModel.model.getPositionAt(Infinity);\n        let value = state.value;\n        if (endPosition.column === 1 && primarySelection.getEndPosition().equals(endPosition)) {\n            value += '\\n';\n        }\n        state.value = value;\n        return state;\n    }\n    _getScreenReaderRange(selectionOffsetStart, selectionOffsetEnd) {\n        const textContent = this._domNode.domNode.firstChild;\n        if (!textContent) {\n            return;\n        }\n        const range = new globalThis.Range();\n        range.setStart(textContent, selectionOffsetStart);\n        range.setEnd(textContent, selectionOffsetEnd);\n        return {\n            anchorNode: textContent,\n            anchorOffset: selectionOffsetStart,\n            focusNode: textContent,\n            focusOffset: selectionOffsetEnd\n        };\n    }\n    _getEditorSelectionFromDomRange(context, state, direction, range) {\n        const viewModel = context.viewModel;\n        const model = viewModel.model;\n        const coordinatesConverter = viewModel.coordinatesConverter;\n        const modelScreenReaderContentStartPositionWithinEditor = coordinatesConverter.convertViewPositionToModelPosition(state.startPositionWithinEditor);\n        const offsetOfStartOfScreenReaderContent = model.getOffsetAt(modelScreenReaderContentStartPositionWithinEditor);\n        let offsetOfSelectionStart = range.startOffset + offsetOfStartOfScreenReaderContent;\n        let offsetOfSelectionEnd = range.endOffset + offsetOfStartOfScreenReaderContent;\n        const modelUsesCRLF = model.getEndOfLineSequence() === 1 /* EndOfLineSequence.CRLF */;\n        if (modelUsesCRLF) {\n            const screenReaderContentText = state.value;\n            const offsetTransformer = new PositionOffsetTransformer(screenReaderContentText);\n            const positionOfStartWithinText = offsetTransformer.getPosition(range.startOffset);\n            const positionOfEndWithinText = offsetTransformer.getPosition(range.endOffset);\n            offsetOfSelectionStart += positionOfStartWithinText.lineNumber - 1;\n            offsetOfSelectionEnd += positionOfEndWithinText.lineNumber - 1;\n        }\n        const positionOfSelectionStart = model.getPositionAt(offsetOfSelectionStart);\n        const positionOfSelectionEnd = model.getPositionAt(offsetOfSelectionEnd);\n        const selectionStart = direction === 'forward' ? positionOfSelectionStart : positionOfSelectionEnd;\n        const selectionEnd = direction === 'forward' ? positionOfSelectionEnd : positionOfSelectionStart;\n        return Selection.fromPositions(selectionStart, selectionEnd);\n    }\n};\nSimpleScreenReaderContent = __decorate([\n    __param(3, IAccessibilityService)\n], SimpleScreenReaderContent);\n\nexport { SimpleScreenReaderContent };\n","import { Disposable, MutableDisposable } from '../../../../../base/common/lifecycle.js';\nimport { localize } from '../../../../../nls.js';\nimport { IAccessibilityService } from '../../../../../platform/accessibility/common/accessibility.js';\nimport { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';\nimport { Selection } from '../../../../common/core/selection.js';\nimport { applyFontInfo } from '../../../config/domFontInfo.js';\nimport { ariaLabelForScreenReaderContent } from '../screenReaderUtils.js';\nimport { RichScreenReaderContent } from './screenReaderContentRich.js';\nimport { SimpleScreenReaderContent } from './screenReaderContentSimple.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet ScreenReaderSupport = class ScreenReaderSupport extends Disposable {\n    constructor(_domNode, _context, _viewController, _keybindingService, _accessibilityService) {\n        super();\n        this._domNode = _domNode;\n        this._context = _context;\n        this._viewController = _viewController;\n        this._keybindingService = _keybindingService;\n        this._accessibilityService = _accessibilityService;\n        // Configuration values\n        this._contentLeft = 1;\n        this._contentWidth = 1;\n        this._contentHeight = 1;\n        this._divWidth = 1;\n        this._primarySelection = new Selection(1, 1, 1, 1);\n        this._primaryCursorVisibleRange = null;\n        this._state = this._register(new MutableDisposable());\n        this._instantiateScreenReaderContent();\n        this._updateConfigurationSettings();\n        this._updateDomAttributes();\n    }\n    onWillPaste() {\n        this._state.value?.onWillPaste();\n    }\n    onWillCut() {\n        this._state.value?.onWillCut();\n    }\n    handleFocusChange(newFocusValue) {\n        this._state.value?.onFocusChange(newFocusValue);\n        this.writeScreenReaderContent();\n    }\n    onConfigurationChanged(e) {\n        this._instantiateScreenReaderContent();\n        this._updateConfigurationSettings();\n        this._updateDomAttributes();\n        if (e.hasChanged(2 /* EditorOption.accessibilitySupport */)) {\n            this.writeScreenReaderContent();\n        }\n    }\n    _instantiateScreenReaderContent() {\n        const renderRichContent = this._context.configuration.options.get(107 /* EditorOption.renderRichScreenReaderContent */);\n        if (this._renderRichContent !== renderRichContent) {\n            this._renderRichContent = renderRichContent;\n            this._state.value = this._createScreenReaderContent(renderRichContent);\n        }\n    }\n    _createScreenReaderContent(renderRichContent) {\n        if (renderRichContent) {\n            return new RichScreenReaderContent(this._domNode, this._context, this._viewController, this._accessibilityService);\n        }\n        else {\n            return new SimpleScreenReaderContent(this._domNode, this._context, this._viewController, this._accessibilityService);\n        }\n    }\n    _updateConfigurationSettings() {\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        const wrappingColumn = layoutInfo.wrappingColumn;\n        this._contentLeft = layoutInfo.contentLeft;\n        this._contentWidth = layoutInfo.contentWidth;\n        this._contentHeight = layoutInfo.height;\n        this._fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        this._divWidth = Math.round(wrappingColumn * this._fontInfo.typicalHalfwidthCharacterWidth);\n        this._state.value?.onConfigurationChanged(options);\n    }\n    _updateDomAttributes() {\n        const options = this._context.configuration.options;\n        this._domNode.domNode.setAttribute('role', 'textbox');\n        this._domNode.domNode.setAttribute('aria-required', options.get(9 /* EditorOption.ariaRequired */) ? 'true' : 'false');\n        this._domNode.domNode.setAttribute('aria-multiline', 'true');\n        this._domNode.domNode.setAttribute('aria-autocomplete', options.get(104 /* EditorOption.readOnly */) ? 'none' : 'both');\n        this._domNode.domNode.setAttribute('aria-roledescription', localize(60, \"editor\"));\n        this._domNode.domNode.setAttribute('aria-label', ariaLabelForScreenReaderContent(options, this._keybindingService));\n        const tabSize = this._context.viewModel.model.getOptions().tabSize;\n        const spaceWidth = options.get(59 /* EditorOption.fontInfo */).spaceWidth;\n        this._domNode.domNode.style.tabSize = `${tabSize * spaceWidth}px`;\n        const wordWrapOverride2 = options.get(154 /* EditorOption.wordWrapOverride2 */);\n        const wordWrapOverride1 = (wordWrapOverride2 === 'inherit' ? options.get(153 /* EditorOption.wordWrapOverride1 */) : wordWrapOverride2);\n        const wordWrap = (wordWrapOverride1 === 'inherit' ? options.get(149 /* EditorOption.wordWrap */) : wordWrapOverride1);\n        this._domNode.domNode.style.textWrap = wordWrap === 'off' ? 'nowrap' : 'wrap';\n    }\n    onCursorStateChanged(e) {\n        this._primarySelection = e.selections[0] ?? new Selection(1, 1, 1, 1);\n    }\n    prepareRender(ctx) {\n        this.writeScreenReaderContent();\n        this._primaryCursorVisibleRange = ctx.visibleRangeForPosition(this._primarySelection.getPosition());\n    }\n    render(ctx) {\n        if (!this._primaryCursorVisibleRange) {\n            // The primary cursor is outside the viewport => place textarea to the top left\n            this._renderAtTopLeft();\n            return;\n        }\n        const editorScrollLeft = this._context.viewLayout.getCurrentScrollLeft();\n        const left = this._contentLeft + this._primaryCursorVisibleRange.left - editorScrollLeft;\n        if (left < this._contentLeft || left > this._contentLeft + this._contentWidth) {\n            // cursor is outside the viewport\n            this._renderAtTopLeft();\n            return;\n        }\n        const editorScrollTop = this._context.viewLayout.getCurrentScrollTop();\n        const positionLineNumber = this._primarySelection.positionLineNumber;\n        const top = this._context.viewLayout.getVerticalOffsetForLineNumber(positionLineNumber) - editorScrollTop;\n        if (top < 0 || top > this._contentHeight) {\n            // cursor is outside the viewport\n            this._renderAtTopLeft();\n            return;\n        }\n        // The <div> where we render the screen reader content does not support variable line heights,\n        // all the lines must have the same height. We use the line height of the cursor position as the\n        // line height for all lines.\n        const lineHeight = this._context.viewLayout.getLineHeightForLineNumber(positionLineNumber);\n        this._doRender(top, this._contentLeft, this._divWidth, lineHeight);\n        this._state.value?.updateScrollTop(this._primarySelection);\n    }\n    _renderAtTopLeft() {\n        this._doRender(0, 0, this._contentWidth, 1);\n    }\n    _doRender(top, left, width, height) {\n        // For correct alignment of the screen reader content, we need to apply the correct font\n        applyFontInfo(this._domNode, this._fontInfo);\n        this._domNode.setTop(top);\n        this._domNode.setLeft(left);\n        this._domNode.setWidth(width);\n        this._domNode.setHeight(height);\n        this._domNode.setLineHeight(height);\n    }\n    setAriaOptions(options) {\n        if (options.activeDescendant) {\n            this._domNode.setAttribute('aria-haspopup', 'true');\n            this._domNode.setAttribute('aria-autocomplete', 'list');\n            this._domNode.setAttribute('aria-activedescendant', options.activeDescendant);\n        }\n        else {\n            this._domNode.setAttribute('aria-haspopup', 'false');\n            this._domNode.setAttribute('aria-autocomplete', 'both');\n            this._domNode.removeAttribute('aria-activedescendant');\n        }\n        if (options.role) {\n            this._domNode.setAttribute('role', options.role);\n        }\n    }\n    writeScreenReaderContent() {\n        this._state.value?.updateScreenReaderContent(this._primarySelection);\n    }\n};\nScreenReaderSupport = __decorate([\n    __param(3, IKeybindingService),\n    __param(4, IAccessibilityService)\n], ScreenReaderSupport);\n\nexport { ScreenReaderSupport };\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 *--------------------------------------------------------------------------------------------*/\nvar EditContext;\n(function (EditContext) {\n    /**\n     * Create an edit context.\n     */\n    function create(window, options) {\n        return new window.EditContext(options);\n    }\n    EditContext.create = create;\n})(EditContext || (EditContext = {}));\n\nexport { EditContext };\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 *--------------------------------------------------------------------------------------------*/\nclass NativeEditContextRegistryImpl {\n    constructor() {\n        this._nativeEditContextMapping = new Map();\n    }\n    register(ownerID, nativeEditContext) {\n        this._nativeEditContextMapping.set(ownerID, nativeEditContext);\n        return {\n            dispose: () => {\n                this._nativeEditContextMapping.delete(ownerID);\n            }\n        };\n    }\n    get(ownerID) {\n        return this._nativeEditContextMapping.get(ownerID);\n    }\n}\nconst NativeEditContextRegistry = new NativeEditContextRegistryImpl();\n\nexport { NativeEditContextRegistry };\n","import './nativeEditContext.css';\nimport { isFirefox } from '../../../../../base/browser/browser.js';\nimport { getWindow, addDisposableListener, getActiveElement, getWindowId } from '../../../../../base/browser/dom.js';\nimport { FastDomNode } from '../../../../../base/browser/fastDomNode.js';\nimport { StandardKeyboardEvent } from '../../../../../base/browser/keyboardEvent.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { ClipboardEventUtils, InMemoryClipboardMetadataManager, getDataToCopy } from '../clipboardUtils.js';\nimport { AbstractEditContext } from '../editContext.js';\nimport { FocusTracker, editContextAddDisposableListener } from './nativeEditContextUtils.js';\nimport { ScreenReaderSupport } from './screenReaderSupport.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { Selection } from '../../../../common/core/selection.js';\nimport { Position } from '../../../../common/core/position.js';\nimport '../../../../common/core/text/positionToOffset.js';\nimport { EditContext } from './editContextFactory.js';\nimport { NativeEditContextRegistry } from './nativeEditContextRegistry.js';\nimport { isHighSurrogate, isLowSurrogate } from '../../../../../base/common/strings.js';\nimport { IME } from '../../../../../base/common/ime.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { ILogService, LogLevel } from '../../../../../platform/log/common/log.js';\nimport { generateUuid } from '../../../../../base/common/uuid.js';\nimport { PositionOffsetTransformer } from '../../../../common/core/text/positionToOffsetImpl.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n// Corresponds to classes in nativeEditContext.css\nvar CompositionClassName;\n(function (CompositionClassName) {\n    CompositionClassName[\"NONE\"] = \"edit-context-composition-none\";\n    CompositionClassName[\"SECONDARY\"] = \"edit-context-composition-secondary\";\n    CompositionClassName[\"PRIMARY\"] = \"edit-context-composition-primary\";\n})(CompositionClassName || (CompositionClassName = {}));\nlet NativeEditContext = class NativeEditContext extends AbstractEditContext {\n    constructor(ownerID, context, overflowGuardContainer, _viewController, _visibleRangeProvider, instantiationService, logService) {\n        super(context);\n        this._viewController = _viewController;\n        this._visibleRangeProvider = _visibleRangeProvider;\n        this.logService = logService;\n        this._previousEditContextSelection = new OffsetRange(0, 0);\n        this._editContextPrimarySelection = new Selection(1, 1, 1, 1);\n        this._decorations = [];\n        this._primarySelection = new Selection(1, 1, 1, 1);\n        this._targetWindowId = -1;\n        this._scrollTop = 0;\n        this._scrollLeft = 0;\n        this._linesVisibleRanges = null;\n        this.domNode = new FastDomNode(document.createElement('div'));\n        this.domNode.setClassName(`native-edit-context`);\n        this._imeTextArea = new FastDomNode(document.createElement('textarea'));\n        this._imeTextArea.setClassName(`ime-text-area`);\n        this._imeTextArea.setAttribute('readonly', 'true');\n        this._imeTextArea.setAttribute('tabindex', '-1');\n        this._imeTextArea.setAttribute('aria-hidden', 'true');\n        this.domNode.setAttribute('autocorrect', 'off');\n        this.domNode.setAttribute('autocapitalize', 'off');\n        this.domNode.setAttribute('autocomplete', 'off');\n        this.domNode.setAttribute('spellcheck', 'false');\n        this._updateDomAttributes();\n        overflowGuardContainer.appendChild(this.domNode);\n        overflowGuardContainer.appendChild(this._imeTextArea);\n        this._parent = overflowGuardContainer.domNode;\n        this._focusTracker = this._register(new FocusTracker(logService, this.domNode.domNode, (newFocusValue) => {\n            logService.trace('NativeEditContext#handleFocusChange : ', newFocusValue);\n            this._screenReaderSupport.handleFocusChange(newFocusValue);\n            this._context.viewModel.setHasFocus(newFocusValue);\n        }));\n        const window = getWindow(this.domNode.domNode);\n        this._editContext = EditContext.create(window);\n        this.setEditContextOnDomNode();\n        this._screenReaderSupport = this._register(instantiationService.createInstance(ScreenReaderSupport, this.domNode, context, this._viewController));\n        this._register(addDisposableListener(this.domNode.domNode, 'copy', (e) => {\n            this.logService.trace('NativeEditContext#copy');\n            this._ensureClipboardGetsEditorSelection(e);\n        }));\n        this._register(addDisposableListener(this.domNode.domNode, 'cut', (e) => {\n            this.logService.trace('NativeEditContext#cut');\n            // Pretend here we touched the text area, as the `cut` event will most likely\n            // result in a `selectionchange` event which we want to ignore\n            this._screenReaderSupport.onWillCut();\n            this._ensureClipboardGetsEditorSelection(e);\n            this.logService.trace('NativeEditContext#cut (before viewController.cut)');\n            this._viewController.cut();\n        }));\n        this._register(addDisposableListener(this.domNode.domNode, 'keyup', (e) => this._onKeyUp(e)));\n        this._register(addDisposableListener(this.domNode.domNode, 'keydown', async (e) => this._onKeyDown(e)));\n        this._register(addDisposableListener(this._imeTextArea.domNode, 'keyup', (e) => this._onKeyUp(e)));\n        this._register(addDisposableListener(this._imeTextArea.domNode, 'keydown', async (e) => this._onKeyDown(e)));\n        this._register(addDisposableListener(this.domNode.domNode, 'beforeinput', async (e) => {\n            if (e.inputType === 'insertParagraph' || e.inputType === 'insertLineBreak') {\n                this._onType(this._viewController, { text: '\\n', replacePrevCharCnt: 0, replaceNextCharCnt: 0, positionDelta: 0 });\n            }\n        }));\n        this._register(addDisposableListener(this.domNode.domNode, 'paste', (e) => {\n            this.logService.trace('NativeEditContext#paste');\n            e.preventDefault();\n            if (!e.clipboardData) {\n                return;\n            }\n            let [text, metadata] = ClipboardEventUtils.getTextData(e.clipboardData);\n            this.logService.trace('NativeEditContext#paste with id : ', metadata?.id, ' with text.length: ', text.length);\n            if (!text) {\n                return;\n            }\n            metadata = metadata || InMemoryClipboardMetadataManager.INSTANCE.get(text);\n            let pasteOnNewLine = false;\n            let multicursorText = null;\n            let mode = null;\n            if (metadata) {\n                const options = this._context.configuration.options;\n                const emptySelectionClipboard = options.get(45 /* EditorOption.emptySelectionClipboard */);\n                pasteOnNewLine = emptySelectionClipboard && !!metadata.isFromEmptySelection;\n                multicursorText = typeof metadata.multicursorText !== 'undefined' ? metadata.multicursorText : null;\n                mode = metadata.mode;\n            }\n            this.logService.trace('NativeEditContext#paste (before viewController.paste)');\n            this._viewController.paste(text, pasteOnNewLine, multicursorText, mode);\n        }));\n        // Edit context events\n        this._register(editContextAddDisposableListener(this._editContext, 'textformatupdate', (e) => this._handleTextFormatUpdate(e)));\n        this._register(editContextAddDisposableListener(this._editContext, 'characterboundsupdate', (e) => this._updateCharacterBounds(e)));\n        let highSurrogateCharacter;\n        this._register(editContextAddDisposableListener(this._editContext, 'textupdate', (e) => {\n            const text = e.text;\n            if (text.length === 1) {\n                const charCode = text.charCodeAt(0);\n                if (isHighSurrogate(charCode)) {\n                    highSurrogateCharacter = text;\n                    return;\n                }\n                if (isLowSurrogate(charCode) && highSurrogateCharacter) {\n                    const textUpdateEvent = {\n                        text: highSurrogateCharacter + text,\n                        selectionEnd: e.selectionEnd,\n                        selectionStart: e.selectionStart,\n                        updateRangeStart: e.updateRangeStart - 1,\n                        updateRangeEnd: e.updateRangeEnd - 1\n                    };\n                    highSurrogateCharacter = undefined;\n                    this._emitTypeEvent(this._viewController, textUpdateEvent);\n                    return;\n                }\n            }\n            this._emitTypeEvent(this._viewController, e);\n        }));\n        this._register(editContextAddDisposableListener(this._editContext, 'compositionstart', (e) => {\n            this._updateEditContext();\n            // Utlimately fires onDidCompositionStart() on the editor to notify for example suggest model of composition state\n            // Updates the composition state of the cursor controller which determines behavior of typing with interceptors\n            this._viewController.compositionStart();\n            // Emits ViewCompositionStartEvent which can be depended on by ViewEventHandlers\n            this._context.viewModel.onCompositionStart();\n        }));\n        this._register(editContextAddDisposableListener(this._editContext, 'compositionend', (e) => {\n            this._updateEditContext();\n            // Utlimately fires compositionEnd() on the editor to notify for example suggest model of composition state\n            // Updates the composition state of the cursor controller which determines behavior of typing with interceptors\n            this._viewController.compositionEnd();\n            // Emits ViewCompositionEndEvent which can be depended on by ViewEventHandlers\n            this._context.viewModel.onCompositionEnd();\n        }));\n        let reenableTracking = false;\n        this._register(IME.onDidChange(() => {\n            if (IME.enabled && reenableTracking) {\n                this._focusTracker.resume();\n                this.domNode.focus();\n                reenableTracking = false;\n            }\n            if (!IME.enabled && this.isFocused()) {\n                this._focusTracker.pause();\n                this._imeTextArea.focus();\n                reenableTracking = true;\n            }\n        }));\n        this._register(NativeEditContextRegistry.register(ownerID, this));\n    }\n    // --- Public methods ---\n    dispose() {\n        // Force blue the dom node so can write in pane with no native edit context after disposal\n        this.domNode.domNode.editContext = undefined;\n        this.domNode.domNode.blur();\n        this.domNode.domNode.remove();\n        this._imeTextArea.domNode.remove();\n        super.dispose();\n    }\n    setAriaOptions(options) {\n        this._screenReaderSupport.setAriaOptions(options);\n    }\n    /* Last rendered data needed for correct hit-testing and determining the mouse position.\n     * Without this, the selection will blink as incorrect mouse position is calculated */\n    getLastRenderData() {\n        return this._primarySelection.getPosition();\n    }\n    prepareRender(ctx) {\n        this._screenReaderSupport.prepareRender(ctx);\n        this._updateSelectionAndControlBoundsData(ctx);\n    }\n    onDidRender() {\n        this._updateSelectionAndControlBoundsAfterRender();\n    }\n    render(ctx) {\n        this._screenReaderSupport.render(ctx);\n    }\n    onCursorStateChanged(e) {\n        this._primarySelection = e.modelSelections[0] ?? new Selection(1, 1, 1, 1);\n        this._screenReaderSupport.onCursorStateChanged(e);\n        this._updateEditContext();\n        return true;\n    }\n    onConfigurationChanged(e) {\n        this._screenReaderSupport.onConfigurationChanged(e);\n        this._updateDomAttributes();\n        return true;\n    }\n    onDecorationsChanged(e) {\n        // true for inline decorations that can end up relayouting text\n        return true;\n    }\n    onFlushed(e) {\n        return true;\n    }\n    onLinesChanged(e) {\n        this._updateEditContextOnLineChange(e.fromLineNumber, e.fromLineNumber + e.count - 1);\n        return true;\n    }\n    onLinesDeleted(e) {\n        this._updateEditContextOnLineChange(e.fromLineNumber, e.toLineNumber);\n        return true;\n    }\n    onLinesInserted(e) {\n        this._updateEditContextOnLineChange(e.fromLineNumber, e.toLineNumber);\n        return true;\n    }\n    _updateEditContextOnLineChange(fromLineNumber, toLineNumber) {\n        if (this._editContextPrimarySelection.endLineNumber < fromLineNumber || this._editContextPrimarySelection.startLineNumber > toLineNumber) {\n            return;\n        }\n        this._updateEditContext();\n    }\n    onScrollChanged(e) {\n        this._scrollLeft = e.scrollLeft;\n        this._scrollTop = e.scrollTop;\n        return true;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    onWillPaste() {\n        this.logService.trace('NativeEditContext#onWillPaste');\n        this._onWillPaste();\n    }\n    _onWillPaste() {\n        this._screenReaderSupport.onWillPaste();\n    }\n    onWillCopy() {\n        this.logService.trace('NativeEditContext#onWillCopy');\n        this.logService.trace('NativeEditContext#isFocused : ', this.domNode.domNode === getActiveElement());\n    }\n    writeScreenReaderContent() {\n        this._screenReaderSupport.writeScreenReaderContent();\n    }\n    isFocused() {\n        return this._focusTracker.isFocused;\n    }\n    focus() {\n        this._focusTracker.focus();\n        // If the editor is off DOM, focus cannot be really set, so let's double check that we have managed to set the focus\n        this.refreshFocusState();\n    }\n    refreshFocusState() {\n        this._focusTracker.refreshFocusState();\n    }\n    // TODO: added as a workaround fix for https://github.com/microsoft/vscode/issues/229825\n    // When this issue will be fixed the following should be removed.\n    setEditContextOnDomNode() {\n        const targetWindow = getWindow(this.domNode.domNode);\n        const targetWindowId = getWindowId(targetWindow);\n        if (this._targetWindowId !== targetWindowId) {\n            this.domNode.domNode.editContext = this._editContext;\n            this._targetWindowId = targetWindowId;\n        }\n    }\n    // --- Private methods ---\n    _onKeyUp(e) {\n        this._viewController.emitKeyUp(new StandardKeyboardEvent(e));\n    }\n    _onKeyDown(e) {\n        const standardKeyboardEvent = new StandardKeyboardEvent(e);\n        // When the IME is visible, the keys, like arrow-left and arrow-right, should be used to navigate in the IME, and should not be propagated further\n        if (standardKeyboardEvent.keyCode === 114 /* KeyCode.KEY_IN_COMPOSITION */) {\n            standardKeyboardEvent.stopPropagation();\n        }\n        this._viewController.emitKeyDown(standardKeyboardEvent);\n    }\n    _updateDomAttributes() {\n        const options = this._context.configuration.options;\n        this.domNode.domNode.setAttribute('tabindex', String(options.get(140 /* EditorOption.tabIndex */)));\n    }\n    _updateEditContext() {\n        const editContextState = this._getNewEditContextState();\n        if (!editContextState) {\n            return;\n        }\n        this._editContext.updateText(0, Number.MAX_SAFE_INTEGER, editContextState.text ?? ' ');\n        this._editContext.updateSelection(editContextState.selectionStartOffset, editContextState.selectionEndOffset);\n        this._editContextPrimarySelection = editContextState.editContextPrimarySelection;\n        this._previousEditContextSelection = new OffsetRange(editContextState.selectionStartOffset, editContextState.selectionEndOffset);\n    }\n    _emitTypeEvent(viewController, e) {\n        if (!this._editContext) {\n            return;\n        }\n        const selectionEndOffset = this._previousEditContextSelection.endExclusive;\n        const selectionStartOffset = this._previousEditContextSelection.start;\n        this._previousEditContextSelection = new OffsetRange(e.selectionStart, e.selectionEnd);\n        let replaceNextCharCnt = 0;\n        let replacePrevCharCnt = 0;\n        if (e.updateRangeEnd > selectionEndOffset) {\n            replaceNextCharCnt = e.updateRangeEnd - selectionEndOffset;\n        }\n        if (e.updateRangeStart < selectionStartOffset) {\n            replacePrevCharCnt = selectionStartOffset - e.updateRangeStart;\n        }\n        let text = '';\n        if (selectionStartOffset < e.updateRangeStart) {\n            text += this._editContext.text.substring(selectionStartOffset, e.updateRangeStart);\n        }\n        text += e.text;\n        if (selectionEndOffset > e.updateRangeEnd) {\n            text += this._editContext.text.substring(e.updateRangeEnd, selectionEndOffset);\n        }\n        let positionDelta = 0;\n        if (e.selectionStart === e.selectionEnd && selectionStartOffset === selectionEndOffset) {\n            positionDelta = e.selectionStart - (e.updateRangeStart + e.text.length);\n        }\n        const typeInput = {\n            text,\n            replacePrevCharCnt,\n            replaceNextCharCnt,\n            positionDelta\n        };\n        this._onType(viewController, typeInput);\n    }\n    _onType(viewController, typeInput) {\n        if (typeInput.replacePrevCharCnt || typeInput.replaceNextCharCnt || typeInput.positionDelta) {\n            viewController.compositionType(typeInput.text, typeInput.replacePrevCharCnt, typeInput.replaceNextCharCnt, typeInput.positionDelta);\n        }\n        else {\n            viewController.type(typeInput.text);\n        }\n    }\n    _getNewEditContextState() {\n        const editContextPrimarySelection = this._primarySelection;\n        const model = this._context.viewModel.model;\n        if (!model.isValidRange(editContextPrimarySelection)) {\n            return;\n        }\n        const primarySelectionStartLine = editContextPrimarySelection.startLineNumber;\n        const primarySelectionEndLine = editContextPrimarySelection.endLineNumber;\n        const endColumnOfEndLineNumber = model.getLineMaxColumn(primarySelectionEndLine);\n        const rangeOfText = new Range(primarySelectionStartLine, 1, primarySelectionEndLine, endColumnOfEndLineNumber);\n        const text = model.getValueInRange(rangeOfText, 0 /* EndOfLinePreference.TextDefined */);\n        const selectionStartOffset = editContextPrimarySelection.startColumn - 1;\n        const selectionEndOffset = text.length + editContextPrimarySelection.endColumn - endColumnOfEndLineNumber;\n        return {\n            text,\n            selectionStartOffset,\n            selectionEndOffset,\n            editContextPrimarySelection\n        };\n    }\n    _editContextStartPosition() {\n        return new Position(this._editContextPrimarySelection.startLineNumber, 1);\n    }\n    _handleTextFormatUpdate(e) {\n        if (!this._editContext) {\n            return;\n        }\n        const formats = e.getTextFormats();\n        const editContextStartPosition = this._editContextStartPosition();\n        const decorations = [];\n        formats.forEach(f => {\n            const textModel = this._context.viewModel.model;\n            const offsetOfEditContextText = textModel.getOffsetAt(editContextStartPosition);\n            const startPositionOfDecoration = textModel.getPositionAt(offsetOfEditContextText + f.rangeStart);\n            const endPositionOfDecoration = textModel.getPositionAt(offsetOfEditContextText + f.rangeEnd);\n            const decorationRange = Range.fromPositions(startPositionOfDecoration, endPositionOfDecoration);\n            const thickness = f.underlineThickness.toLowerCase();\n            let decorationClassName = CompositionClassName.NONE;\n            switch (thickness) {\n                case 'thin':\n                    decorationClassName = CompositionClassName.SECONDARY;\n                    break;\n                case 'thick':\n                    decorationClassName = CompositionClassName.PRIMARY;\n                    break;\n            }\n            decorations.push({\n                range: decorationRange,\n                options: {\n                    description: 'textFormatDecoration',\n                    inlineClassName: decorationClassName,\n                }\n            });\n        });\n        this._decorations = this._context.viewModel.model.deltaDecorations(this._decorations, decorations);\n    }\n    _updateSelectionAndControlBoundsData(ctx) {\n        const viewSelection = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(this._primarySelection);\n        if (this._primarySelection.isEmpty()) {\n            const linesVisibleRanges = ctx.visibleRangeForPosition(viewSelection.getStartPosition());\n            this._linesVisibleRanges = linesVisibleRanges;\n        }\n        else {\n            this._linesVisibleRanges = null;\n        }\n    }\n    _updateSelectionAndControlBoundsAfterRender() {\n        const options = this._context.configuration.options;\n        const contentLeft = options.get(165 /* EditorOption.layoutInfo */).contentLeft;\n        const viewSelection = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(this._primarySelection);\n        const verticalOffsetStart = this._context.viewLayout.getVerticalOffsetForLineNumber(viewSelection.startLineNumber);\n        const verticalOffsetEnd = this._context.viewLayout.getVerticalOffsetAfterLineNumber(viewSelection.endLineNumber);\n        // Make sure this doesn't force an extra layout (i.e. don't call it before rendering finished)\n        const parentBounds = this._parent.getBoundingClientRect();\n        const top = parentBounds.top + verticalOffsetStart - this._scrollTop;\n        const height = verticalOffsetEnd - verticalOffsetStart;\n        let left = parentBounds.left + contentLeft - this._scrollLeft;\n        let width;\n        if (this._primarySelection.isEmpty()) {\n            if (this._linesVisibleRanges) {\n                left += this._linesVisibleRanges.left;\n            }\n            width = 0;\n        }\n        else {\n            width = parentBounds.width - contentLeft;\n        }\n        const selectionBounds = new DOMRect(left, top, width, height);\n        this._editContext.updateSelectionBounds(selectionBounds);\n        this._editContext.updateControlBounds(selectionBounds);\n    }\n    _updateCharacterBounds(e) {\n        const options = this._context.configuration.options;\n        const typicalHalfWidthCharacterWidth = options.get(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;\n        const contentLeft = options.get(165 /* EditorOption.layoutInfo */).contentLeft;\n        const parentBounds = this._parent.getBoundingClientRect();\n        const characterBounds = [];\n        const offsetTransformer = new PositionOffsetTransformer(this._editContext.text);\n        for (let offset = e.rangeStart; offset < e.rangeEnd; offset++) {\n            const editContextStartPosition = offsetTransformer.getPosition(offset);\n            const textStartLineOffsetWithinEditor = this._editContextPrimarySelection.startLineNumber - 1;\n            const characterStartPosition = new Position(textStartLineOffsetWithinEditor + editContextStartPosition.lineNumber, editContextStartPosition.column);\n            const characterEndPosition = characterStartPosition.delta(0, 1);\n            const characterModelRange = Range.fromPositions(characterStartPosition, characterEndPosition);\n            const characterViewRange = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(characterModelRange);\n            const characterLinesVisibleRanges = this._visibleRangeProvider.linesVisibleRangesForRange(characterViewRange, true) ?? [];\n            const lineNumber = characterViewRange.startLineNumber;\n            const characterVerticalOffset = this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber);\n            const top = parentBounds.top + characterVerticalOffset - this._scrollTop;\n            let left = 0;\n            let width = typicalHalfWidthCharacterWidth;\n            if (characterLinesVisibleRanges.length > 0) {\n                for (const visibleRange of characterLinesVisibleRanges[0].ranges) {\n                    left = visibleRange.left;\n                    width = visibleRange.width;\n                    break;\n                }\n            }\n            const lineHeight = this._context.viewLayout.getLineHeightForLineNumber(lineNumber);\n            characterBounds.push(new DOMRect(parentBounds.left + contentLeft + left - this._scrollLeft, top, width, lineHeight));\n        }\n        this._editContext.updateCharacterBounds(e.rangeStart, characterBounds);\n    }\n    _ensureClipboardGetsEditorSelection(e) {\n        const options = this._context.configuration.options;\n        const emptySelectionClipboard = options.get(45 /* EditorOption.emptySelectionClipboard */);\n        const copyWithSyntaxHighlighting = options.get(31 /* EditorOption.copyWithSyntaxHighlighting */);\n        const selections = this._context.viewModel.getCursorStates().map(cursorState => cursorState.modelState.selection);\n        const dataToCopy = getDataToCopy(this._context.viewModel, selections, emptySelectionClipboard, copyWithSyntaxHighlighting);\n        let id = undefined;\n        if (this.logService.getLevel() === LogLevel.Trace) {\n            id = generateUuid();\n        }\n        const storedMetadata = {\n            version: 1,\n            id,\n            isFromEmptySelection: dataToCopy.isFromEmptySelection,\n            multicursorText: dataToCopy.multicursorText,\n            mode: dataToCopy.mode\n        };\n        InMemoryClipboardMetadataManager.INSTANCE.set(\n        // When writing \"LINE\\r\\n\" to the clipboard and then pasting,\n        // Firefox pastes \"LINE\\n\", so let's work around this quirk\n        (isFirefox ? dataToCopy.text.replace(/\\r\\n/g, '\\n') : dataToCopy.text), storedMetadata);\n        e.preventDefault();\n        if (e.clipboardData) {\n            ClipboardEventUtils.setTextData(e.clipboardData, dataToCopy.text, dataToCopy.html, storedMetadata);\n        }\n        this.logService.trace('NativeEditContext#_ensureClipboardGetsEditorSelectios with id : ', id, ' with text.length: ', dataToCopy.text.length);\n    }\n};\nNativeEditContext = __decorate([\n    __param(5, IInstantiationService),\n    __param(6, ILogService)\n], NativeEditContext);\n\nexport { NativeEditContext };\n","import { ViewPart } from '../../view/viewPart.js';\nimport { Color } from '../../../../base/common/color.js';\nimport { editorRuler } from '../../../common/core/editorColorRegistry.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { autorun } from '../../../../base/common/observableInternal/reactions/autorun.js';\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/**\n * Rulers are vertical lines that appear at certain columns in the editor. There can be >= 0 rulers\n * at a time.\n */\nclass RulersGpu extends ViewPart {\n    constructor(context, _viewGpuContext) {\n        super(context);\n        this._viewGpuContext = _viewGpuContext;\n        this._gpuShapes = [];\n        this._register(autorun(reader => this._updateEntries(reader)));\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        this._updateEntries(undefined);\n        return true;\n    }\n    // --- end event handlers\n    prepareRender(ctx) {\n        // Nothing to read\n    }\n    render(ctx) {\n        // Rendering is handled by RectangleRenderer\n    }\n    _updateEntries(reader) {\n        const options = this._context.configuration.options;\n        const rulers = options.get(116 /* EditorOption.rulers */);\n        const typicalHalfwidthCharacterWidth = options.get(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;\n        const devicePixelRatio = this._viewGpuContext.devicePixelRatio.read(reader);\n        for (let i = 0, len = rulers.length; i < len; i++) {\n            const ruler = rulers[i];\n            const shape = this._gpuShapes[i];\n            const color = ruler.color ? Color.fromHex(ruler.color) : this._context.theme.getColor(editorRuler) ?? Color.white;\n            const rulerData = [\n                ruler.column * typicalHalfwidthCharacterWidth * devicePixelRatio,\n                0,\n                Math.max(1, Math.ceil(devicePixelRatio)),\n                Number.MAX_SAFE_INTEGER,\n                color.rgba.r / 255,\n                color.rgba.g / 255,\n                color.rgba.b / 255,\n                color.rgba.a,\n            ];\n            if (!shape) {\n                this._gpuShapes[i] = this._viewGpuContext.rectangleRenderer.register(...rulerData);\n            }\n            else {\n                shape.setRaw(rulerData);\n            }\n        }\n        while (this._gpuShapes.length > rulers.length) {\n            this._gpuShapes.splice(-1, 1)[0].dispose();\n        }\n    }\n}\n\nexport { RulersGpu };\n","import { DynamicViewOverlay } from '../../view/dynamicViewOverlay.js';\nimport { ViewLineOptions } from '../viewLines/viewLineOptions.js';\nimport './gpuMark.css';\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/**\n * A mark on lines to make identification of GPU-rendered lines vs DOM easier.\n */\nclass GpuMarkOverlay extends DynamicViewOverlay {\n    static { this.CLASS_NAME = 'gpu-mark'; }\n    constructor(context, _viewGpuContext) {\n        super();\n        this._viewGpuContext = _viewGpuContext;\n        this._context = context;\n        this._renderResult = null;\n        this._context.addEventHandler(this);\n    }\n    dispose() {\n        this._context.removeEventHandler(this);\n        this._renderResult = null;\n        super.dispose();\n    }\n    // --- begin event handlers\n    onConfigurationChanged(e) {\n        return true;\n    }\n    onCursorStateChanged(e) {\n        return true;\n    }\n    onFlushed(e) {\n        return true;\n    }\n    onLinesChanged(e) {\n        return true;\n    }\n    onLinesDeleted(e) {\n        return true;\n    }\n    onLinesInserted(e) {\n        return true;\n    }\n    onScrollChanged(e) {\n        return e.scrollTopChanged;\n    }\n    onZonesChanged(e) {\n        return true;\n    }\n    onDecorationsChanged(e) {\n        return true;\n    }\n    // --- end event handlers\n    prepareRender(ctx) {\n        const visibleStartLineNumber = ctx.visibleRange.startLineNumber;\n        const visibleEndLineNumber = ctx.visibleRange.endLineNumber;\n        const viewportData = ctx.viewportData;\n        const options = new ViewLineOptions(this._context.configuration, this._context.theme.type);\n        const output = [];\n        for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {\n            const lineIndex = lineNumber - visibleStartLineNumber;\n            const cannotRenderReasons = this._viewGpuContext.canRenderDetailed(options, viewportData, lineNumber);\n            output[lineIndex] = cannotRenderReasons.length ? `<div class=\"${GpuMarkOverlay.CLASS_NAME}\" title=\"Cannot render on GPU: ${cannotRenderReasons.join(', ')}\"></div>` : '';\n        }\n        this._renderResult = output;\n    }\n    render(startLineNumber, lineNumber) {\n        if (!this._renderResult) {\n            return '';\n        }\n        const lineIndex = lineNumber - startLineNumber;\n        if (lineIndex < 0 || lineIndex >= this._renderResult.length) {\n            return '';\n        }\n        return this._renderResult[lineIndex];\n    }\n}\n\nexport { GpuMarkOverlay };\n","import { runAtThisOrScheduleAtNextAnimationFrame, getWindow, trackFocus } from '../../base/browser/dom.js';\nimport { createFastDomNode } from '../../base/browser/fastDomNode.js';\nimport { inputLatency } from '../../base/browser/performance.js';\nimport { BugIndicatingError, onUnexpectedError } from '../../base/common/errors.js';\nimport { Disposable } from '../../base/common/lifecycle.js';\nimport { PointerHandlerLastRenderData } from './controller/mouseTarget.js';\nimport { PointerHandler } from './controller/pointerHandler.js';\nimport { RenderingContext } from './view/renderingContext.js';\nimport { ViewController } from './view/viewController.js';\nimport { ContentViewOverlays, MarginViewOverlays } from './view/viewOverlays.js';\nimport { PartFingerprints } from './view/viewPart.js';\nimport { ViewUserInputEvents } from './view/viewUserInputEvents.js';\nimport { BlockDecorations } from './viewParts/blockDecorations/blockDecorations.js';\nimport { ViewContentWidgets } from './viewParts/contentWidgets/contentWidgets.js';\nimport { CurrentLineHighlightOverlay, CurrentLineMarginHighlightOverlay } from './viewParts/currentLineHighlight/currentLineHighlight.js';\nimport { DecorationsOverlay } from './viewParts/decorations/decorations.js';\nimport { EditorScrollbar } from './viewParts/editorScrollbar/editorScrollbar.js';\nimport { GlyphMarginWidgets } from './viewParts/glyphMargin/glyphMargin.js';\nimport { IndentGuidesOverlay } from './viewParts/indentGuides/indentGuides.js';\nimport { LineNumbersOverlay } from './viewParts/lineNumbers/lineNumbers.js';\nimport { ViewLines } from './viewParts/viewLines/viewLines.js';\nimport { LinesDecorationsOverlay } from './viewParts/linesDecorations/linesDecorations.js';\nimport { Margin } from './viewParts/margin/margin.js';\nimport { MarginViewLineDecorationsOverlay } from './viewParts/marginDecorations/marginDecorations.js';\nimport { Minimap } from './viewParts/minimap/minimap.js';\nimport { ViewOverlayWidgets } from './viewParts/overlayWidgets/overlayWidgets.js';\nimport { DecorationsOverviewRuler } from './viewParts/overviewRuler/decorationsOverviewRuler.js';\nimport { OverviewRuler } from './viewParts/overviewRuler/overviewRuler.js';\nimport { Rulers } from './viewParts/rulers/rulers.js';\nimport { ScrollDecorationViewPart } from './viewParts/scrollDecoration/scrollDecoration.js';\nimport { SelectionsOverlay } from './viewParts/selections/selections.js';\nimport { ViewCursors } from './viewParts/viewCursors/viewCursors.js';\nimport { ViewZones } from './viewParts/viewZones/viewZones.js';\nimport { WhitespaceOverlay } from './viewParts/whitespace/whitespace.js';\nimport { Position } from '../common/core/position.js';\nimport { Range } from '../common/core/range.js';\nimport { Selection } from '../common/core/selection.js';\nimport { GlyphMarginLane } from '../common/model.js';\nimport { ViewEventHandler } from '../common/viewEventHandler.js';\nimport { ViewportData } from '../common/viewLayout/viewLinesViewportData.js';\nimport { ViewContext } from '../common/viewModel/viewContext.js';\nimport { IInstantiationService } from '../../platform/instantiation/common/instantiation.js';\nimport { getThemeTypeSelector } from '../../platform/theme/common/themeService.js';\nimport { ViewGpuContext } from './gpu/viewGpuContext.js';\nimport { ViewLinesGpu } from './viewParts/viewLinesGpu/viewLinesGpu.js';\nimport { TextAreaEditContext } from './controller/editContext/textArea/textAreaEditContext.js';\nimport { NativeEditContext } from './controller/editContext/native/nativeEditContext.js';\nimport { RulersGpu } from './viewParts/rulersGpu/rulersGpu.js';\nimport { GpuMarkOverlay } from './viewParts/gpuMark/gpuMark.js';\nimport { Emitter } from '../../base/common/event.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet View = class View extends ViewEventHandler {\n    constructor(editorContainer, ownerID, commandDelegate, configuration, colorTheme, model, userInputEvents, overflowWidgetsDomNode, _instantiationService) {\n        super();\n        this._instantiationService = _instantiationService;\n        // Actual mutable state\n        this._shouldRecomputeGlyphMarginLanes = false;\n        this._ownerID = ownerID;\n        this._widgetFocusTracker = this._register(new CodeEditorWidgetFocusTracker(editorContainer, overflowWidgetsDomNode));\n        this._register(this._widgetFocusTracker.onChange(() => {\n            this._context.viewModel.setHasWidgetFocus(this._widgetFocusTracker.hasFocus());\n        }));\n        this._selections = [new Selection(1, 1, 1, 1)];\n        this._renderAnimationFrame = null;\n        this._overflowGuardContainer = createFastDomNode(document.createElement('div'));\n        PartFingerprints.write(this._overflowGuardContainer, 3 /* PartFingerprint.OverflowGuard */);\n        this._overflowGuardContainer.setClassName('overflow-guard');\n        this._viewController = new ViewController(configuration, model, userInputEvents, commandDelegate);\n        // The view context is passed on to most classes (basically to reduce param. counts in ctors)\n        this._context = new ViewContext(configuration, colorTheme, model);\n        // Ensure the view is the first event handler in order to update the layout\n        this._context.addEventHandler(this);\n        this._viewParts = [];\n        // Keyboard handler\n        this._editContextEnabled = this._context.configuration.options.get(170 /* EditorOption.effectiveEditContext */);\n        this._accessibilitySupport = this._context.configuration.options.get(2 /* EditorOption.accessibilitySupport */);\n        this._editContext = this._instantiateEditContext();\n        this._viewParts.push(this._editContext);\n        // These two dom nodes must be constructed up front, since references are needed in the layout provider (scrolling & co.)\n        this._linesContent = createFastDomNode(document.createElement('div'));\n        this._linesContent.setClassName('lines-content' + ' monaco-editor-background');\n        this._linesContent.setPosition('absolute');\n        this.domNode = createFastDomNode(document.createElement('div'));\n        this.domNode.setClassName(this._getEditorClassName());\n        // Set role 'code' for better screen reader support https://github.com/microsoft/vscode/issues/93438\n        this.domNode.setAttribute('role', 'code');\n        if (this._context.configuration.options.get(46 /* EditorOption.experimentalGpuAcceleration */) === 'on') {\n            this._viewGpuContext = this._instantiationService.createInstance(ViewGpuContext, this._context);\n        }\n        this._scrollbar = new EditorScrollbar(this._context, this._linesContent, this.domNode, this._overflowGuardContainer);\n        this._viewParts.push(this._scrollbar);\n        // View Lines\n        this._viewLines = new ViewLines(this._context, this._viewGpuContext, this._linesContent);\n        if (this._viewGpuContext) {\n            this._viewLinesGpu = this._instantiationService.createInstance(ViewLinesGpu, this._context, this._viewGpuContext);\n        }\n        // View Zones\n        this._viewZones = new ViewZones(this._context);\n        this._viewParts.push(this._viewZones);\n        // Decorations overview ruler\n        const decorationsOverviewRuler = new DecorationsOverviewRuler(this._context);\n        this._viewParts.push(decorationsOverviewRuler);\n        const scrollDecoration = new ScrollDecorationViewPart(this._context);\n        this._viewParts.push(scrollDecoration);\n        const contentViewOverlays = new ContentViewOverlays(this._context);\n        this._viewParts.push(contentViewOverlays);\n        contentViewOverlays.addDynamicOverlay(new CurrentLineHighlightOverlay(this._context));\n        contentViewOverlays.addDynamicOverlay(new SelectionsOverlay(this._context));\n        contentViewOverlays.addDynamicOverlay(new IndentGuidesOverlay(this._context));\n        contentViewOverlays.addDynamicOverlay(new DecorationsOverlay(this._context));\n        contentViewOverlays.addDynamicOverlay(new WhitespaceOverlay(this._context));\n        const marginViewOverlays = new MarginViewOverlays(this._context);\n        this._viewParts.push(marginViewOverlays);\n        marginViewOverlays.addDynamicOverlay(new CurrentLineMarginHighlightOverlay(this._context));\n        marginViewOverlays.addDynamicOverlay(new MarginViewLineDecorationsOverlay(this._context));\n        marginViewOverlays.addDynamicOverlay(new LinesDecorationsOverlay(this._context));\n        marginViewOverlays.addDynamicOverlay(new LineNumbersOverlay(this._context));\n        if (this._viewGpuContext) {\n            marginViewOverlays.addDynamicOverlay(new GpuMarkOverlay(this._context, this._viewGpuContext));\n        }\n        // Glyph margin widgets\n        this._glyphMarginWidgets = new GlyphMarginWidgets(this._context);\n        this._viewParts.push(this._glyphMarginWidgets);\n        const margin = new Margin(this._context);\n        margin.getDomNode().appendChild(this._viewZones.marginDomNode);\n        margin.getDomNode().appendChild(marginViewOverlays.getDomNode());\n        margin.getDomNode().appendChild(this._glyphMarginWidgets.domNode);\n        this._viewParts.push(margin);\n        // Content widgets\n        this._contentWidgets = new ViewContentWidgets(this._context, this.domNode);\n        this._viewParts.push(this._contentWidgets);\n        this._viewCursors = new ViewCursors(this._context);\n        this._viewParts.push(this._viewCursors);\n        // Overlay widgets\n        this._overlayWidgets = new ViewOverlayWidgets(this._context, this.domNode);\n        this._viewParts.push(this._overlayWidgets);\n        const rulers = this._viewGpuContext\n            ? new RulersGpu(this._context, this._viewGpuContext)\n            : new Rulers(this._context);\n        this._viewParts.push(rulers);\n        const blockOutline = new BlockDecorations(this._context);\n        this._viewParts.push(blockOutline);\n        const minimap = new Minimap(this._context);\n        this._viewParts.push(minimap);\n        // -------------- Wire dom nodes up\n        if (decorationsOverviewRuler) {\n            const overviewRulerData = this._scrollbar.getOverviewRulerLayoutInfo();\n            overviewRulerData.parent.insertBefore(decorationsOverviewRuler.getDomNode(), overviewRulerData.insertBefore);\n        }\n        this._linesContent.appendChild(contentViewOverlays.getDomNode());\n        if ('domNode' in rulers) {\n            this._linesContent.appendChild(rulers.domNode);\n        }\n        this._linesContent.appendChild(this._viewZones.domNode);\n        this._linesContent.appendChild(this._viewLines.getDomNode());\n        this._linesContent.appendChild(this._contentWidgets.domNode);\n        this._linesContent.appendChild(this._viewCursors.getDomNode());\n        this._overflowGuardContainer.appendChild(margin.getDomNode());\n        this._overflowGuardContainer.appendChild(this._scrollbar.getDomNode());\n        if (this._viewGpuContext) {\n            this._overflowGuardContainer.appendChild(this._viewGpuContext.canvas);\n        }\n        this._overflowGuardContainer.appendChild(scrollDecoration.getDomNode());\n        this._overflowGuardContainer.appendChild(this._overlayWidgets.getDomNode());\n        this._overflowGuardContainer.appendChild(minimap.getDomNode());\n        this._overflowGuardContainer.appendChild(blockOutline.domNode);\n        this.domNode.appendChild(this._overflowGuardContainer);\n        if (overflowWidgetsDomNode) {\n            overflowWidgetsDomNode.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode.domNode);\n            overflowWidgetsDomNode.appendChild(this._overlayWidgets.overflowingOverlayWidgetsDomNode.domNode);\n        }\n        else {\n            this.domNode.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode);\n            this.domNode.appendChild(this._overlayWidgets.overflowingOverlayWidgetsDomNode);\n        }\n        this._applyLayout();\n        // Pointer handler\n        this._pointerHandler = this._register(new PointerHandler(this._context, this._viewController, this._createPointerHandlerHelper()));\n    }\n    _instantiateEditContext() {\n        const usingExperimentalEditContext = this._context.configuration.options.get(170 /* EditorOption.effectiveEditContext */);\n        if (usingExperimentalEditContext) {\n            return this._instantiationService.createInstance(NativeEditContext, this._ownerID, this._context, this._overflowGuardContainer, this._viewController, this._createTextAreaHandlerHelper());\n        }\n        else {\n            return this._instantiationService.createInstance(TextAreaEditContext, this._context, this._overflowGuardContainer, this._viewController, this._createTextAreaHandlerHelper());\n        }\n    }\n    _updateEditContext() {\n        const editContextEnabled = this._context.configuration.options.get(170 /* EditorOption.effectiveEditContext */);\n        const accessibilitySupport = this._context.configuration.options.get(2 /* EditorOption.accessibilitySupport */);\n        if (this._editContextEnabled === editContextEnabled && this._accessibilitySupport === accessibilitySupport) {\n            return;\n        }\n        this._editContextEnabled = editContextEnabled;\n        this._accessibilitySupport = accessibilitySupport;\n        const isEditContextFocused = this._editContext.isFocused();\n        const indexOfEditContext = this._viewParts.indexOf(this._editContext);\n        this._editContext.dispose();\n        this._editContext = this._instantiateEditContext();\n        if (isEditContextFocused) {\n            this._editContext.focus();\n        }\n        if (indexOfEditContext !== -1) {\n            this._viewParts.splice(indexOfEditContext, 1, this._editContext);\n        }\n    }\n    _computeGlyphMarginLanes() {\n        const model = this._context.viewModel.model;\n        const laneModel = this._context.viewModel.glyphLanes;\n        let glyphs = [];\n        let maxLineNumber = 0;\n        // Add all margin decorations\n        glyphs = glyphs.concat(model.getAllMarginDecorations().map((decoration) => {\n            const lane = decoration.options.glyphMargin?.position ?? GlyphMarginLane.Center;\n            maxLineNumber = Math.max(maxLineNumber, decoration.range.endLineNumber);\n            return { range: decoration.range, lane, persist: decoration.options.glyphMargin?.persistLane };\n        }));\n        // Add all glyph margin widgets\n        glyphs = glyphs.concat(this._glyphMarginWidgets.getWidgets().map((widget) => {\n            const range = model.validateRange(widget.preference.range);\n            maxLineNumber = Math.max(maxLineNumber, range.endLineNumber);\n            return { range, lane: widget.preference.lane };\n        }));\n        // Sorted by their start position\n        glyphs.sort((a, b) => Range.compareRangesUsingStarts(a.range, b.range));\n        laneModel.reset(maxLineNumber);\n        for (const glyph of glyphs) {\n            laneModel.push(glyph.lane, glyph.range, glyph.persist);\n        }\n        return laneModel;\n    }\n    _createPointerHandlerHelper() {\n        return {\n            viewDomNode: this.domNode.domNode,\n            linesContentDomNode: this._linesContent.domNode,\n            viewLinesDomNode: this._viewLines.getDomNode().domNode,\n            viewLinesGpu: this._viewLinesGpu,\n            focusTextArea: () => {\n                this.focus();\n            },\n            dispatchTextAreaEvent: (event) => {\n                this._editContext.domNode.domNode.dispatchEvent(event);\n            },\n            getLastRenderData: () => {\n                const lastViewCursorsRenderData = this._viewCursors.getLastRenderData() || [];\n                const lastTextareaPosition = this._editContext.getLastRenderData();\n                return new PointerHandlerLastRenderData(lastViewCursorsRenderData, lastTextareaPosition);\n            },\n            renderNow: () => {\n                this.render(true, false);\n            },\n            shouldSuppressMouseDownOnViewZone: (viewZoneId) => {\n                return this._viewZones.shouldSuppressMouseDownOnViewZone(viewZoneId);\n            },\n            shouldSuppressMouseDownOnWidget: (widgetId) => {\n                return this._contentWidgets.shouldSuppressMouseDownOnWidget(widgetId);\n            },\n            getPositionFromDOMInfo: (spanNode, offset) => {\n                this._flushAccumulatedAndRenderNow();\n                return this._viewLines.getPositionFromDOMInfo(spanNode, offset);\n            },\n            visibleRangeForPosition: (lineNumber, column) => {\n                this._flushAccumulatedAndRenderNow();\n                const position = new Position(lineNumber, column);\n                return this._viewLines.visibleRangeForPosition(position) ?? this._viewLinesGpu?.visibleRangeForPosition(position) ?? null;\n            },\n            getLineWidth: (lineNumber) => {\n                this._flushAccumulatedAndRenderNow();\n                if (this._viewLinesGpu) {\n                    const result = this._viewLinesGpu.getLineWidth(lineNumber);\n                    if (result !== undefined) {\n                        return result;\n                    }\n                }\n                return this._viewLines.getLineWidth(lineNumber);\n            }\n        };\n    }\n    _createTextAreaHandlerHelper() {\n        return {\n            visibleRangeForPosition: (position) => {\n                this._flushAccumulatedAndRenderNow();\n                return this._viewLines.visibleRangeForPosition(position);\n            },\n            linesVisibleRangesForRange: (range, includeNewLines) => {\n                this._flushAccumulatedAndRenderNow();\n                return this._viewLines.linesVisibleRangesForRange(range, includeNewLines);\n            }\n        };\n    }\n    _applyLayout() {\n        const options = this._context.configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        this.domNode.setWidth(layoutInfo.width);\n        this.domNode.setHeight(layoutInfo.height);\n        this._overflowGuardContainer.setWidth(layoutInfo.width);\n        this._overflowGuardContainer.setHeight(layoutInfo.height);\n        // https://stackoverflow.com/questions/38905916/content-in-google-chrome-larger-than-16777216-px-not-being-rendered\n        this._linesContent.setWidth(16777216);\n        this._linesContent.setHeight(16777216);\n    }\n    _getEditorClassName() {\n        const focused = this._editContext.isFocused() ? ' focused' : '';\n        return this._context.configuration.options.get(162 /* EditorOption.editorClassName */) + ' ' + getThemeTypeSelector(this._context.theme.type) + focused;\n    }\n    // --- begin event handlers\n    handleEvents(events) {\n        super.handleEvents(events);\n        this._scheduleRender();\n    }\n    onConfigurationChanged(e) {\n        this.domNode.setClassName(this._getEditorClassName());\n        this._updateEditContext();\n        this._applyLayout();\n        return false;\n    }\n    onCursorStateChanged(e) {\n        this._selections = e.selections;\n        return false;\n    }\n    onDecorationsChanged(e) {\n        if (e.affectsGlyphMargin) {\n            this._shouldRecomputeGlyphMarginLanes = true;\n        }\n        return false;\n    }\n    onFocusChanged(e) {\n        this.domNode.setClassName(this._getEditorClassName());\n        return false;\n    }\n    onThemeChanged(e) {\n        this._context.theme.update(e.theme);\n        this.domNode.setClassName(this._getEditorClassName());\n        return false;\n    }\n    // --- end event handlers\n    dispose() {\n        if (this._renderAnimationFrame !== null) {\n            this._renderAnimationFrame.dispose();\n            this._renderAnimationFrame = null;\n        }\n        this._contentWidgets.overflowingContentWidgetsDomNode.domNode.remove();\n        this._overlayWidgets.overflowingOverlayWidgetsDomNode.domNode.remove();\n        this._context.removeEventHandler(this);\n        this._viewGpuContext?.dispose();\n        this._viewLines.dispose();\n        this._viewLinesGpu?.dispose();\n        // Destroy view parts\n        for (const viewPart of this._viewParts) {\n            viewPart.dispose();\n        }\n        super.dispose();\n    }\n    _scheduleRender() {\n        if (this._store.isDisposed) {\n            throw new BugIndicatingError();\n        }\n        if (this._renderAnimationFrame === null) {\n            // TODO: workaround fix for https://github.com/microsoft/vscode/issues/229825\n            if (this._editContext instanceof NativeEditContext) {\n                this._editContext.setEditContextOnDomNode();\n            }\n            const rendering = this._createCoordinatedRendering();\n            this._renderAnimationFrame = EditorRenderingCoordinator.INSTANCE.scheduleCoordinatedRendering({\n                window: getWindow(this.domNode?.domNode),\n                prepareRenderText: () => {\n                    if (this._store.isDisposed) {\n                        throw new BugIndicatingError();\n                    }\n                    try {\n                        return rendering.prepareRenderText();\n                    }\n                    finally {\n                        this._renderAnimationFrame = null;\n                    }\n                },\n                renderText: () => {\n                    if (this._store.isDisposed) {\n                        throw new BugIndicatingError();\n                    }\n                    return rendering.renderText();\n                },\n                prepareRender: (viewParts, ctx) => {\n                    if (this._store.isDisposed) {\n                        throw new BugIndicatingError();\n                    }\n                    return rendering.prepareRender(viewParts, ctx);\n                },\n                render: (viewParts, ctx) => {\n                    if (this._store.isDisposed) {\n                        throw new BugIndicatingError();\n                    }\n                    return rendering.render(viewParts, ctx);\n                }\n            });\n        }\n    }\n    _flushAccumulatedAndRenderNow() {\n        const rendering = this._createCoordinatedRendering();\n        safeInvokeNoArg(() => rendering.prepareRenderText());\n        const data = safeInvokeNoArg(() => rendering.renderText());\n        if (data) {\n            const [viewParts, ctx] = data;\n            safeInvokeNoArg(() => rendering.prepareRender(viewParts, ctx));\n            safeInvokeNoArg(() => rendering.render(viewParts, ctx));\n        }\n    }\n    _getViewPartsToRender() {\n        const result = [];\n        let resultLen = 0;\n        for (const viewPart of this._viewParts) {\n            if (viewPart.shouldRender()) {\n                result[resultLen++] = viewPart;\n            }\n        }\n        return result;\n    }\n    _createCoordinatedRendering() {\n        return {\n            prepareRenderText: () => {\n                if (this._shouldRecomputeGlyphMarginLanes) {\n                    this._shouldRecomputeGlyphMarginLanes = false;\n                    const model = this._computeGlyphMarginLanes();\n                    this._context.configuration.setGlyphMarginDecorationLaneCount(model.requiredLanes);\n                }\n                inputLatency.onRenderStart();\n            },\n            renderText: () => {\n                if (!this.domNode.domNode.isConnected) {\n                    return null;\n                }\n                let viewPartsToRender = this._getViewPartsToRender();\n                if (!this._viewLines.shouldRender() && viewPartsToRender.length === 0) {\n                    // Nothing to render\n                    return null;\n                }\n                const partialViewportData = this._context.viewLayout.getLinesViewportData();\n                this._context.viewModel.setViewport(partialViewportData.startLineNumber, partialViewportData.endLineNumber, partialViewportData.centeredLineNumber);\n                const viewportData = new ViewportData(this._selections, partialViewportData, this._context.viewLayout.getWhitespaceViewportData(), this._context.viewModel);\n                if (this._contentWidgets.shouldRender()) {\n                    // Give the content widgets a chance to set their max width before a possible synchronous layout\n                    this._contentWidgets.onBeforeRender(viewportData);\n                }\n                if (this._viewLines.shouldRender()) {\n                    this._viewLines.renderText(viewportData);\n                    this._viewLines.onDidRender();\n                    // Rendering of viewLines might cause scroll events to occur, so collect view parts to render again\n                    viewPartsToRender = this._getViewPartsToRender();\n                }\n                if (this._viewLinesGpu?.shouldRender()) {\n                    this._viewLinesGpu.renderText(viewportData);\n                    this._viewLinesGpu.onDidRender();\n                }\n                return [viewPartsToRender, new RenderingContext(this._context.viewLayout, viewportData, this._viewLines, this._viewLinesGpu)];\n            },\n            prepareRender: (viewPartsToRender, ctx) => {\n                for (const viewPart of viewPartsToRender) {\n                    viewPart.prepareRender(ctx);\n                }\n            },\n            render: (viewPartsToRender, ctx) => {\n                for (const viewPart of viewPartsToRender) {\n                    viewPart.render(ctx);\n                    viewPart.onDidRender();\n                }\n            }\n        };\n    }\n    // --- BEGIN CodeEditor helpers\n    delegateVerticalScrollbarPointerDown(browserEvent) {\n        this._scrollbar.delegateVerticalScrollbarPointerDown(browserEvent);\n    }\n    delegateScrollFromMouseWheelEvent(browserEvent) {\n        this._scrollbar.delegateScrollFromMouseWheelEvent(browserEvent);\n    }\n    restoreState(scrollPosition) {\n        this._context.viewModel.viewLayout.setScrollPosition({\n            scrollTop: scrollPosition.scrollTop,\n            scrollLeft: scrollPosition.scrollLeft\n        }, 1 /* ScrollType.Immediate */);\n        this._context.viewModel.visibleLinesStabilized();\n    }\n    getOffsetForColumn(modelLineNumber, modelColumn) {\n        const modelPosition = this._context.viewModel.model.validatePosition({\n            lineNumber: modelLineNumber,\n            column: modelColumn\n        });\n        const viewPosition = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition);\n        this._flushAccumulatedAndRenderNow();\n        const visibleRange = this._viewLines.visibleRangeForPosition(new Position(viewPosition.lineNumber, viewPosition.column));\n        if (!visibleRange) {\n            return -1;\n        }\n        return visibleRange.left;\n    }\n    getTargetAtClientPoint(clientX, clientY) {\n        const mouseTarget = this._pointerHandler.getTargetAtClientPoint(clientX, clientY);\n        if (!mouseTarget) {\n            return null;\n        }\n        return ViewUserInputEvents.convertViewToModelMouseTarget(mouseTarget, this._context.viewModel.coordinatesConverter);\n    }\n    createOverviewRuler(cssClassName) {\n        return new OverviewRuler(this._context, cssClassName);\n    }\n    change(callback) {\n        this._viewZones.changeViewZones(callback);\n        this._scheduleRender();\n    }\n    render(now, everything) {\n        if (everything) {\n            // Force everything to render...\n            this._viewLines.forceShouldRender();\n            for (const viewPart of this._viewParts) {\n                viewPart.forceShouldRender();\n            }\n        }\n        if (now) {\n            this._flushAccumulatedAndRenderNow();\n        }\n        else {\n            this._scheduleRender();\n        }\n    }\n    writeScreenReaderContent(reason) {\n        this._editContext.writeScreenReaderContent(reason);\n    }\n    focus() {\n        this._editContext.focus();\n    }\n    isFocused() {\n        return this._editContext.isFocused();\n    }\n    isWidgetFocused() {\n        return this._widgetFocusTracker.hasFocus();\n    }\n    setAriaOptions(options) {\n        this._editContext.setAriaOptions(options);\n    }\n    addContentWidget(widgetData) {\n        this._contentWidgets.addWidget(widgetData.widget);\n        this.layoutContentWidget(widgetData);\n        this._scheduleRender();\n    }\n    layoutContentWidget(widgetData) {\n        this._contentWidgets.setWidgetPosition(widgetData.widget, widgetData.position?.position ?? null, widgetData.position?.secondaryPosition ?? null, widgetData.position?.preference ?? null, widgetData.position?.positionAffinity ?? null);\n        this._scheduleRender();\n    }\n    removeContentWidget(widgetData) {\n        this._contentWidgets.removeWidget(widgetData.widget);\n        this._scheduleRender();\n    }\n    addOverlayWidget(widgetData) {\n        this._overlayWidgets.addWidget(widgetData.widget);\n        this.layoutOverlayWidget(widgetData);\n        this._scheduleRender();\n    }\n    layoutOverlayWidget(widgetData) {\n        const shouldRender = this._overlayWidgets.setWidgetPosition(widgetData.widget, widgetData.position);\n        if (shouldRender) {\n            this._scheduleRender();\n        }\n    }\n    removeOverlayWidget(widgetData) {\n        this._overlayWidgets.removeWidget(widgetData.widget);\n        this._scheduleRender();\n    }\n    addGlyphMarginWidget(widgetData) {\n        this._glyphMarginWidgets.addWidget(widgetData.widget);\n        this._shouldRecomputeGlyphMarginLanes = true;\n        this._scheduleRender();\n    }\n    layoutGlyphMarginWidget(widgetData) {\n        const newPreference = widgetData.position;\n        const shouldRender = this._glyphMarginWidgets.setWidgetPosition(widgetData.widget, newPreference);\n        if (shouldRender) {\n            this._shouldRecomputeGlyphMarginLanes = true;\n            this._scheduleRender();\n        }\n    }\n    removeGlyphMarginWidget(widgetData) {\n        this._glyphMarginWidgets.removeWidget(widgetData.widget);\n        this._shouldRecomputeGlyphMarginLanes = true;\n        this._scheduleRender();\n    }\n};\nView = __decorate([\n    __param(8, IInstantiationService)\n], View);\nfunction safeInvokeNoArg(func) {\n    try {\n        return func();\n    }\n    catch (e) {\n        onUnexpectedError(e);\n        return null;\n    }\n}\nclass EditorRenderingCoordinator {\n    static { this.INSTANCE = new EditorRenderingCoordinator(); }\n    constructor() {\n        this._coordinatedRenderings = [];\n        this._animationFrameRunners = new Map();\n    }\n    scheduleCoordinatedRendering(rendering) {\n        this._coordinatedRenderings.push(rendering);\n        this._scheduleRender(rendering.window);\n        return {\n            dispose: () => {\n                const renderingIndex = this._coordinatedRenderings.indexOf(rendering);\n                if (renderingIndex === -1) {\n                    return;\n                }\n                this._coordinatedRenderings.splice(renderingIndex, 1);\n                if (this._coordinatedRenderings.length === 0) {\n                    // There are no more renderings to coordinate => cancel animation frames\n                    for (const [_, disposable] of this._animationFrameRunners) {\n                        disposable.dispose();\n                    }\n                    this._animationFrameRunners.clear();\n                }\n            }\n        };\n    }\n    _scheduleRender(window) {\n        if (!this._animationFrameRunners.has(window)) {\n            const runner = () => {\n                this._animationFrameRunners.delete(window);\n                this._onRenderScheduled();\n            };\n            this._animationFrameRunners.set(window, runAtThisOrScheduleAtNextAnimationFrame(window, runner, 100));\n        }\n    }\n    _onRenderScheduled() {\n        const coordinatedRenderings = this._coordinatedRenderings.slice(0);\n        this._coordinatedRenderings = [];\n        for (const rendering of coordinatedRenderings) {\n            safeInvokeNoArg(() => rendering.prepareRenderText());\n        }\n        const datas = [];\n        for (let i = 0, len = coordinatedRenderings.length; i < len; i++) {\n            const rendering = coordinatedRenderings[i];\n            datas[i] = safeInvokeNoArg(() => rendering.renderText());\n        }\n        for (let i = 0, len = coordinatedRenderings.length; i < len; i++) {\n            const rendering = coordinatedRenderings[i];\n            const data = datas[i];\n            if (!data) {\n                continue;\n            }\n            const [viewParts, ctx] = data;\n            safeInvokeNoArg(() => rendering.prepareRender(viewParts, ctx));\n        }\n        for (let i = 0, len = coordinatedRenderings.length; i < len; i++) {\n            const rendering = coordinatedRenderings[i];\n            const data = datas[i];\n            if (!data) {\n                continue;\n            }\n            const [viewParts, ctx] = data;\n            safeInvokeNoArg(() => rendering.render(viewParts, ctx));\n        }\n    }\n}\nclass CodeEditorWidgetFocusTracker extends Disposable {\n    constructor(domElement, overflowWidgetsDomNode) {\n        super();\n        this._onChange = this._register(new Emitter());\n        this.onChange = this._onChange.event;\n        this._hadFocus = undefined;\n        this._hasDomElementFocus = false;\n        this._domFocusTracker = this._register(trackFocus(domElement));\n        this._overflowWidgetsDomNodeHasFocus = false;\n        this._register(this._domFocusTracker.onDidFocus(() => {\n            this._hasDomElementFocus = true;\n            this._update();\n        }));\n        this._register(this._domFocusTracker.onDidBlur(() => {\n            this._hasDomElementFocus = false;\n            this._update();\n        }));\n        if (overflowWidgetsDomNode) {\n            this._overflowWidgetsDomNode = this._register(trackFocus(overflowWidgetsDomNode));\n            this._register(this._overflowWidgetsDomNode.onDidFocus(() => {\n                this._overflowWidgetsDomNodeHasFocus = true;\n                this._update();\n            }));\n            this._register(this._overflowWidgetsDomNode.onDidBlur(() => {\n                this._overflowWidgetsDomNodeHasFocus = false;\n                this._update();\n            }));\n        }\n    }\n    _update() {\n        const focused = this._hasDomElementFocus || this._overflowWidgetsDomNodeHasFocus;\n        if (this._hadFocus !== focused) {\n            this._hadFocus = focused;\n            this._onChange.fire(undefined);\n        }\n    }\n    hasFocus() {\n        return this._hadFocus ?? false;\n    }\n}\n\nexport { View };\n","import { assertNever } from '../../base/common/assert.js';\nimport { Position } from './core/position.js';\nimport { InjectedTextCursorStops } from './model.js';\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/**\n * *input*:\n * ```\n * xxxxxxxxxxxxxxxxxxxxxxxxxxx\n * ```\n *\n * -> Applying injections `[i...i]`, *inputWithInjections*:\n * ```\n * xxxxxx[iiiiiiiiii]xxxxxxxxxxxxxxxxx[ii]xxxx\n * ```\n *\n * -> breaking at offsets `|` in `xxxxxx[iiiiiii|iii]xxxxxxxxxxx|xxxxxx[ii]xxxx|`:\n * ```\n * xxxxxx[iiiiiii\n * iii]xxxxxxxxxxx\n * xxxxxx[ii]xxxx\n * ```\n *\n * -> applying wrappedTextIndentLength, *output*:\n * ```\n * xxxxxx[iiiiiii\n *    iii]xxxxxxxxxxx\n *    xxxxxx[ii]xxxx\n * ```\n */\nclass ModelLineProjectionData {\n    constructor(injectionOffsets, \n    /**\n     * `injectionOptions.length` must equal `injectionOffsets.length`\n     */\n    injectionOptions, \n    /**\n     * Refers to offsets after applying injections to the source.\n     * The last break offset indicates the length of the source after applying injections.\n     */\n    breakOffsets, \n    /**\n     * Refers to offsets after applying injections\n     */\n    breakOffsetsVisibleColumn, wrappedTextIndentLength) {\n        this.injectionOffsets = injectionOffsets;\n        this.injectionOptions = injectionOptions;\n        this.breakOffsets = breakOffsets;\n        this.breakOffsetsVisibleColumn = breakOffsetsVisibleColumn;\n        this.wrappedTextIndentLength = wrappedTextIndentLength;\n    }\n    getOutputLineCount() {\n        return this.breakOffsets.length;\n    }\n    getMinOutputOffset(outputLineIndex) {\n        if (outputLineIndex > 0) {\n            return this.wrappedTextIndentLength;\n        }\n        return 0;\n    }\n    getLineLength(outputLineIndex) {\n        // These offsets refer to model text with injected text.\n        const startOffset = outputLineIndex > 0 ? this.breakOffsets[outputLineIndex - 1] : 0;\n        const endOffset = this.breakOffsets[outputLineIndex];\n        let lineLength = endOffset - startOffset;\n        if (outputLineIndex > 0) {\n            lineLength += this.wrappedTextIndentLength;\n        }\n        return lineLength;\n    }\n    getMaxOutputOffset(outputLineIndex) {\n        return this.getLineLength(outputLineIndex);\n    }\n    translateToInputOffset(outputLineIndex, outputOffset) {\n        if (outputLineIndex > 0) {\n            outputOffset = Math.max(0, outputOffset - this.wrappedTextIndentLength);\n        }\n        const offsetInInputWithInjection = outputLineIndex === 0 ? outputOffset : this.breakOffsets[outputLineIndex - 1] + outputOffset;\n        let offsetInInput = offsetInInputWithInjection;\n        if (this.injectionOffsets !== null) {\n            for (let i = 0; i < this.injectionOffsets.length; i++) {\n                if (offsetInInput > this.injectionOffsets[i]) {\n                    if (offsetInInput < this.injectionOffsets[i] + this.injectionOptions[i].content.length) {\n                        // `inputOffset` is within injected text\n                        offsetInInput = this.injectionOffsets[i];\n                    }\n                    else {\n                        offsetInInput -= this.injectionOptions[i].content.length;\n                    }\n                }\n                else {\n                    break;\n                }\n            }\n        }\n        return offsetInInput;\n    }\n    translateToOutputPosition(inputOffset, affinity = 2 /* PositionAffinity.None */) {\n        let inputOffsetInInputWithInjection = inputOffset;\n        if (this.injectionOffsets !== null) {\n            for (let i = 0; i < this.injectionOffsets.length; i++) {\n                if (inputOffset < this.injectionOffsets[i]) {\n                    break;\n                }\n                if (affinity !== 1 /* PositionAffinity.Right */ && inputOffset === this.injectionOffsets[i]) {\n                    break;\n                }\n                inputOffsetInInputWithInjection += this.injectionOptions[i].content.length;\n            }\n        }\n        return this.offsetInInputWithInjectionsToOutputPosition(inputOffsetInInputWithInjection, affinity);\n    }\n    offsetInInputWithInjectionsToOutputPosition(offsetInInputWithInjections, affinity = 2 /* PositionAffinity.None */) {\n        let low = 0;\n        let high = this.breakOffsets.length - 1;\n        let mid = 0;\n        let midStart = 0;\n        while (low <= high) {\n            mid = low + ((high - low) / 2) | 0;\n            const midStop = this.breakOffsets[mid];\n            midStart = mid > 0 ? this.breakOffsets[mid - 1] : 0;\n            if (affinity === 0 /* PositionAffinity.Left */) {\n                if (offsetInInputWithInjections <= midStart) {\n                    high = mid - 1;\n                }\n                else if (offsetInInputWithInjections > midStop) {\n                    low = mid + 1;\n                }\n                else {\n                    break;\n                }\n            }\n            else {\n                if (offsetInInputWithInjections < midStart) {\n                    high = mid - 1;\n                }\n                else if (offsetInInputWithInjections >= midStop) {\n                    low = mid + 1;\n                }\n                else {\n                    break;\n                }\n            }\n        }\n        let outputOffset = offsetInInputWithInjections - midStart;\n        if (mid > 0) {\n            outputOffset += this.wrappedTextIndentLength;\n        }\n        return new OutputPosition(mid, outputOffset);\n    }\n    normalizeOutputPosition(outputLineIndex, outputOffset, affinity) {\n        if (this.injectionOffsets !== null) {\n            const offsetInInputWithInjections = this.outputPositionToOffsetInInputWithInjections(outputLineIndex, outputOffset);\n            const normalizedOffsetInUnwrappedLine = this.normalizeOffsetInInputWithInjectionsAroundInjections(offsetInInputWithInjections, affinity);\n            if (normalizedOffsetInUnwrappedLine !== offsetInInputWithInjections) {\n                // injected text caused a change\n                return this.offsetInInputWithInjectionsToOutputPosition(normalizedOffsetInUnwrappedLine, affinity);\n            }\n        }\n        if (affinity === 0 /* PositionAffinity.Left */) {\n            if (outputLineIndex > 0 && outputOffset === this.getMinOutputOffset(outputLineIndex)) {\n                return new OutputPosition(outputLineIndex - 1, this.getMaxOutputOffset(outputLineIndex - 1));\n            }\n        }\n        else if (affinity === 1 /* PositionAffinity.Right */) {\n            const maxOutputLineIndex = this.getOutputLineCount() - 1;\n            if (outputLineIndex < maxOutputLineIndex && outputOffset === this.getMaxOutputOffset(outputLineIndex)) {\n                return new OutputPosition(outputLineIndex + 1, this.getMinOutputOffset(outputLineIndex + 1));\n            }\n        }\n        return new OutputPosition(outputLineIndex, outputOffset);\n    }\n    outputPositionToOffsetInInputWithInjections(outputLineIndex, outputOffset) {\n        if (outputLineIndex > 0) {\n            outputOffset = Math.max(0, outputOffset - this.wrappedTextIndentLength);\n        }\n        const result = (outputLineIndex > 0 ? this.breakOffsets[outputLineIndex - 1] : 0) + outputOffset;\n        return result;\n    }\n    normalizeOffsetInInputWithInjectionsAroundInjections(offsetInInputWithInjections, affinity) {\n        const injectedText = this.getInjectedTextAtOffset(offsetInInputWithInjections);\n        if (!injectedText) {\n            return offsetInInputWithInjections;\n        }\n        if (affinity === 2 /* PositionAffinity.None */) {\n            if (offsetInInputWithInjections === injectedText.offsetInInputWithInjections + injectedText.length\n                && hasRightCursorStop(this.injectionOptions[injectedText.injectedTextIndex].cursorStops)) {\n                return injectedText.offsetInInputWithInjections + injectedText.length;\n            }\n            else {\n                let result = injectedText.offsetInInputWithInjections;\n                if (hasLeftCursorStop(this.injectionOptions[injectedText.injectedTextIndex].cursorStops)) {\n                    return result;\n                }\n                let index = injectedText.injectedTextIndex - 1;\n                while (index >= 0 && this.injectionOffsets[index] === this.injectionOffsets[injectedText.injectedTextIndex]) {\n                    if (hasRightCursorStop(this.injectionOptions[index].cursorStops)) {\n                        break;\n                    }\n                    result -= this.injectionOptions[index].content.length;\n                    if (hasLeftCursorStop(this.injectionOptions[index].cursorStops)) {\n                        break;\n                    }\n                    index--;\n                }\n                return result;\n            }\n        }\n        else if (affinity === 1 /* PositionAffinity.Right */ || affinity === 4 /* PositionAffinity.RightOfInjectedText */) {\n            let result = injectedText.offsetInInputWithInjections + injectedText.length;\n            let index = injectedText.injectedTextIndex;\n            // traverse all injected text that touch each other\n            while (index + 1 < this.injectionOffsets.length && this.injectionOffsets[index + 1] === this.injectionOffsets[index]) {\n                result += this.injectionOptions[index + 1].content.length;\n                index++;\n            }\n            return result;\n        }\n        else if (affinity === 0 /* PositionAffinity.Left */ || affinity === 3 /* PositionAffinity.LeftOfInjectedText */) {\n            // affinity is left\n            let result = injectedText.offsetInInputWithInjections;\n            let index = injectedText.injectedTextIndex;\n            // traverse all injected text that touch each other\n            while (index - 1 >= 0 && this.injectionOffsets[index - 1] === this.injectionOffsets[index]) {\n                result -= this.injectionOptions[index - 1].content.length;\n                index--;\n            }\n            return result;\n        }\n        assertNever();\n    }\n    getInjectedText(outputLineIndex, outputOffset) {\n        const offset = this.outputPositionToOffsetInInputWithInjections(outputLineIndex, outputOffset);\n        const injectedText = this.getInjectedTextAtOffset(offset);\n        if (!injectedText) {\n            return null;\n        }\n        return {\n            options: this.injectionOptions[injectedText.injectedTextIndex]\n        };\n    }\n    getInjectedTextAtOffset(offsetInInputWithInjections) {\n        const injectionOffsets = this.injectionOffsets;\n        const injectionOptions = this.injectionOptions;\n        if (injectionOffsets !== null) {\n            let totalInjectedTextLengthBefore = 0;\n            for (let i = 0; i < injectionOffsets.length; i++) {\n                const length = injectionOptions[i].content.length;\n                const injectedTextStartOffsetInInputWithInjections = injectionOffsets[i] + totalInjectedTextLengthBefore;\n                const injectedTextEndOffsetInInputWithInjections = injectionOffsets[i] + totalInjectedTextLengthBefore + length;\n                if (injectedTextStartOffsetInInputWithInjections > offsetInInputWithInjections) {\n                    // Injected text starts later.\n                    break; // All later injected texts have an even larger offset.\n                }\n                if (offsetInInputWithInjections <= injectedTextEndOffsetInInputWithInjections) {\n                    // Injected text ends after or with the given position (but also starts with or before it).\n                    return {\n                        injectedTextIndex: i,\n                        offsetInInputWithInjections: injectedTextStartOffsetInInputWithInjections,\n                        length\n                    };\n                }\n                totalInjectedTextLengthBefore += length;\n            }\n        }\n        return undefined;\n    }\n}\nfunction hasRightCursorStop(cursorStop) {\n    if (cursorStop === null || cursorStop === undefined) {\n        return true;\n    }\n    return cursorStop === InjectedTextCursorStops.Right || cursorStop === InjectedTextCursorStops.Both;\n}\nfunction hasLeftCursorStop(cursorStop) {\n    if (cursorStop === null || cursorStop === undefined) {\n        return true;\n    }\n    return cursorStop === InjectedTextCursorStops.Left || cursorStop === InjectedTextCursorStops.Both;\n}\nclass OutputPosition {\n    constructor(outputLineIndex, outputOffset) {\n        this.outputLineIndex = outputLineIndex;\n        this.outputOffset = outputOffset;\n    }\n    toString() {\n        return `${this.outputLineIndex}:${this.outputOffset}`;\n    }\n    toPosition(baseLineNumber) {\n        return new Position(baseLineNumber + this.outputLineIndex, this.outputOffset + 1);\n    }\n}\n\nexport { ModelLineProjectionData, OutputPosition };\n","/**\n * An event describing that a model has been reset to a new value.\n * @internal\n */\nclass ModelRawFlush {\n    constructor() {\n        this.changeType = 1 /* RawContentChangedType.Flush */;\n    }\n}\n/**\n * Represents text injected on a line\n * @internal\n */\nclass LineInjectedText {\n    static applyInjectedText(lineText, injectedTexts) {\n        if (!injectedTexts || injectedTexts.length === 0) {\n            return lineText;\n        }\n        let result = '';\n        let lastOriginalOffset = 0;\n        for (const injectedText of injectedTexts) {\n            result += lineText.substring(lastOriginalOffset, injectedText.column - 1);\n            lastOriginalOffset = injectedText.column - 1;\n            result += injectedText.options.content;\n        }\n        result += lineText.substring(lastOriginalOffset);\n        return result;\n    }\n    static fromDecorations(decorations) {\n        const result = [];\n        for (const decoration of decorations) {\n            if (decoration.options.before && decoration.options.before.content.length > 0) {\n                result.push(new LineInjectedText(decoration.ownerId, decoration.range.startLineNumber, decoration.range.startColumn, decoration.options.before, 0));\n            }\n            if (decoration.options.after && decoration.options.after.content.length > 0) {\n                result.push(new LineInjectedText(decoration.ownerId, decoration.range.endLineNumber, decoration.range.endColumn, decoration.options.after, 1));\n            }\n        }\n        result.sort((a, b) => {\n            if (a.lineNumber === b.lineNumber) {\n                if (a.column === b.column) {\n                    return a.order - b.order;\n                }\n                return a.column - b.column;\n            }\n            return a.lineNumber - b.lineNumber;\n        });\n        return result;\n    }\n    constructor(ownerId, lineNumber, column, options, order) {\n        this.ownerId = ownerId;\n        this.lineNumber = lineNumber;\n        this.column = column;\n        this.options = options;\n        this.order = order;\n    }\n}\n/**\n * An event describing that a line has changed in a model.\n * @internal\n */\nclass ModelRawLineChanged {\n    constructor(lineNumber, detail, injectedText) {\n        this.changeType = 2 /* RawContentChangedType.LineChanged */;\n        this.lineNumber = lineNumber;\n        this.detail = detail;\n        this.injectedText = injectedText;\n    }\n}\n/**\n * An event describing that a line height has changed in the model.\n * @internal\n */\nclass ModelLineHeightChanged {\n    constructor(ownerId, decorationId, lineNumber, lineHeight) {\n        this.ownerId = ownerId;\n        this.decorationId = decorationId;\n        this.lineNumber = lineNumber;\n        this.lineHeight = lineHeight;\n    }\n}\n/**\n * An event describing that a line height has changed in the model.\n * @internal\n */\nclass ModelFontChanged {\n    constructor(ownerId, lineNumber) {\n        this.ownerId = ownerId;\n        this.lineNumber = lineNumber;\n    }\n}\n/**\n * An event describing that line(s) have been deleted in a model.\n * @internal\n */\nclass ModelRawLinesDeleted {\n    constructor(fromLineNumber, toLineNumber) {\n        this.changeType = 3 /* RawContentChangedType.LinesDeleted */;\n        this.fromLineNumber = fromLineNumber;\n        this.toLineNumber = toLineNumber;\n    }\n}\n/**\n * An event describing that line(s) have been inserted in a model.\n * @internal\n */\nclass ModelRawLinesInserted {\n    constructor(fromLineNumber, toLineNumber, detail, injectedTexts) {\n        this.changeType = 4 /* RawContentChangedType.LinesInserted */;\n        this.injectedTexts = injectedTexts;\n        this.fromLineNumber = fromLineNumber;\n        this.toLineNumber = toLineNumber;\n        this.detail = detail;\n    }\n}\n/**\n * An event describing that a model has had its EOL changed.\n * @internal\n */\nclass ModelRawEOLChanged {\n    constructor() {\n        this.changeType = 5 /* RawContentChangedType.EOLChanged */;\n    }\n}\n/**\n * An event describing a change in the text of a model.\n * @internal\n */\nclass ModelRawContentChangedEvent {\n    constructor(changes, versionId, isUndoing, isRedoing) {\n        this.changes = changes;\n        this.versionId = versionId;\n        this.isUndoing = isUndoing;\n        this.isRedoing = isRedoing;\n        this.resultingSelection = null;\n    }\n    containsEvent(type) {\n        for (let i = 0, len = this.changes.length; i < len; i++) {\n            const change = this.changes[i];\n            if (change.changeType === type) {\n                return true;\n            }\n        }\n        return false;\n    }\n    static merge(a, b) {\n        const changes = [].concat(a.changes).concat(b.changes);\n        const versionId = b.versionId;\n        const isUndoing = (a.isUndoing || b.isUndoing);\n        const isRedoing = (a.isRedoing || b.isRedoing);\n        return new ModelRawContentChangedEvent(changes, versionId, isUndoing, isRedoing);\n    }\n}\n/**\n * An event describing a change in injected text.\n * @internal\n */\nclass ModelInjectedTextChangedEvent {\n    constructor(changes) {\n        this.changes = changes;\n    }\n}\n/**\n * An event describing a change of a line height.\n * @internal\n */\nclass ModelLineHeightChangedEvent {\n    constructor(changes) {\n        this.changes = changes;\n    }\n}\n/**\n * An event describing a change in fonts.\n * @internal\n */\nclass ModelFontChangedEvent {\n    constructor(changes) {\n        this.changes = changes;\n    }\n}\n/**\n * @internal\n */\nclass InternalModelContentChangeEvent {\n    constructor(rawContentChangedEvent, contentChangedEvent) {\n        this.rawContentChangedEvent = rawContentChangedEvent;\n        this.contentChangedEvent = contentChangedEvent;\n    }\n    merge(other) {\n        const rawContentChangedEvent = ModelRawContentChangedEvent.merge(this.rawContentChangedEvent, other.rawContentChangedEvent);\n        const contentChangedEvent = InternalModelContentChangeEvent._mergeChangeEvents(this.contentChangedEvent, other.contentChangedEvent);\n        return new InternalModelContentChangeEvent(rawContentChangedEvent, contentChangedEvent);\n    }\n    static _mergeChangeEvents(a, b) {\n        const changes = [].concat(a.changes).concat(b.changes);\n        const eol = b.eol;\n        const versionId = b.versionId;\n        const isUndoing = (a.isUndoing || b.isUndoing);\n        const isRedoing = (a.isRedoing || b.isRedoing);\n        const isFlush = (a.isFlush || b.isFlush);\n        const isEolChange = a.isEolChange && b.isEolChange; // both must be true to not confuse listeners who skip such edits\n        return {\n            changes: changes,\n            eol: eol,\n            isEolChange: isEolChange,\n            versionId: versionId,\n            isUndoing: isUndoing,\n            isRedoing: isRedoing,\n            isFlush: isFlush,\n            detailedReasons: a.detailedReasons.concat(b.detailedReasons),\n            detailedReasonsChangeLengths: a.detailedReasonsChangeLengths.concat(b.detailedReasonsChangeLengths),\n        };\n    }\n}\n\nexport { InternalModelContentChangeEvent, LineInjectedText, ModelFontChanged, ModelFontChangedEvent, ModelInjectedTextChangedEvent, ModelLineHeightChanged, ModelLineHeightChangedEvent, ModelRawContentChangedEvent, ModelRawEOLChanged, ModelRawFlush, ModelRawLineChanged, ModelRawLinesDeleted, ModelRawLinesInserted };\n","import { createTrustedTypesPolicy } from '../../../base/browser/trustedTypes.js';\nimport { firstNonWhitespaceIndex, isFullWidthCharacter } from '../../../base/common/strings.js';\nimport { assertReturnsDefined } from '../../../base/common/types.js';\nimport { applyFontInfo } from '../config/domFontInfo.js';\nimport { StringBuilder } from '../../common/core/stringBuilder.js';\nimport { ModelLineProjectionData } from '../../common/modelLineProjectionData.js';\nimport { LineInjectedText } from '../../common/textModelEvents.js';\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 *--------------------------------------------------------------------------------------------*/\nconst ttPolicy = createTrustedTypesPolicy('domLineBreaksComputer', { createHTML: value => value });\nclass DOMLineBreaksComputerFactory {\n    static create(targetWindow) {\n        return new DOMLineBreaksComputerFactory(new WeakRef(targetWindow));\n    }\n    constructor(targetWindow) {\n        this.targetWindow = targetWindow;\n    }\n    createLineBreaksComputer(fontInfo, tabSize, wrappingColumn, wrappingIndent, wordBreak, wrapOnEscapedLineFeeds) {\n        const requests = [];\n        const injectedTexts = [];\n        return {\n            addRequest: (lineText, injectedText, previousLineBreakData) => {\n                requests.push(lineText);\n                injectedTexts.push(injectedText);\n            },\n            finalize: () => {\n                return createLineBreaks(assertReturnsDefined(this.targetWindow.deref()), requests, fontInfo, tabSize, wrappingColumn, wrappingIndent, wordBreak, injectedTexts);\n            }\n        };\n    }\n}\nfunction createLineBreaks(targetWindow, requests, fontInfo, tabSize, firstLineBreakColumn, wrappingIndent, wordBreak, injectedTextsPerLine) {\n    function createEmptyLineBreakWithPossiblyInjectedText(requestIdx) {\n        const injectedTexts = injectedTextsPerLine[requestIdx];\n        if (injectedTexts) {\n            const lineText = LineInjectedText.applyInjectedText(requests[requestIdx], injectedTexts);\n            const injectionOptions = injectedTexts.map(t => t.options);\n            const injectionOffsets = injectedTexts.map(text => text.column - 1);\n            // creating a `LineBreakData` with an invalid `breakOffsetsVisibleColumn` is OK\n            // because `breakOffsetsVisibleColumn` will never be used because it contains injected text\n            return new ModelLineProjectionData(injectionOffsets, injectionOptions, [lineText.length], [], 0);\n        }\n        else {\n            return null;\n        }\n    }\n    if (firstLineBreakColumn === -1) {\n        const result = [];\n        for (let i = 0, len = requests.length; i < len; i++) {\n            result[i] = createEmptyLineBreakWithPossiblyInjectedText(i);\n        }\n        return result;\n    }\n    const overallWidth = Math.round(firstLineBreakColumn * fontInfo.typicalHalfwidthCharacterWidth);\n    const additionalIndent = (wrappingIndent === 3 /* WrappingIndent.DeepIndent */ ? 2 : wrappingIndent === 2 /* WrappingIndent.Indent */ ? 1 : 0);\n    const additionalIndentSize = Math.round(tabSize * additionalIndent);\n    const additionalIndentLength = Math.ceil(fontInfo.spaceWidth * additionalIndentSize);\n    const containerDomNode = document.createElement('div');\n    applyFontInfo(containerDomNode, fontInfo);\n    const sb = new StringBuilder(10000);\n    const firstNonWhitespaceIndices = [];\n    const wrappedTextIndentLengths = [];\n    const renderLineContents = [];\n    const allCharOffsets = [];\n    const allVisibleColumns = [];\n    for (let i = 0; i < requests.length; i++) {\n        const lineContent = LineInjectedText.applyInjectedText(requests[i], injectedTextsPerLine[i]);\n        let firstNonWhitespaceIndex$1 = 0;\n        let wrappedTextIndentLength = 0;\n        let width = overallWidth;\n        if (wrappingIndent !== 0 /* WrappingIndent.None */) {\n            firstNonWhitespaceIndex$1 = firstNonWhitespaceIndex(lineContent);\n            if (firstNonWhitespaceIndex$1 === -1) {\n                // all whitespace line\n                firstNonWhitespaceIndex$1 = 0;\n            }\n            else {\n                // Track existing indent\n                for (let i = 0; i < firstNonWhitespaceIndex$1; i++) {\n                    const charWidth = (lineContent.charCodeAt(i) === 9 /* CharCode.Tab */\n                        ? (tabSize - (wrappedTextIndentLength % tabSize))\n                        : 1);\n                    wrappedTextIndentLength += charWidth;\n                }\n                const indentWidth = Math.ceil(fontInfo.spaceWidth * wrappedTextIndentLength);\n                // Force sticking to beginning of line if no character would fit except for the indentation\n                if (indentWidth + fontInfo.typicalFullwidthCharacterWidth > overallWidth) {\n                    firstNonWhitespaceIndex$1 = 0;\n                    wrappedTextIndentLength = 0;\n                }\n                else {\n                    width = overallWidth - indentWidth;\n                }\n            }\n        }\n        const renderLineContent = lineContent.substr(firstNonWhitespaceIndex$1);\n        const tmp = renderLine(renderLineContent, wrappedTextIndentLength, tabSize, width, sb, additionalIndentLength);\n        firstNonWhitespaceIndices[i] = firstNonWhitespaceIndex$1;\n        wrappedTextIndentLengths[i] = wrappedTextIndentLength;\n        renderLineContents[i] = renderLineContent;\n        allCharOffsets[i] = tmp[0];\n        allVisibleColumns[i] = tmp[1];\n    }\n    const html = sb.build();\n    const trustedhtml = ttPolicy?.createHTML(html) ?? html;\n    containerDomNode.innerHTML = trustedhtml;\n    containerDomNode.style.position = 'absolute';\n    containerDomNode.style.top = '10000';\n    if (wordBreak === 'keepAll') {\n        // word-break: keep-all; overflow-wrap: anywhere\n        containerDomNode.style.wordBreak = 'keep-all';\n        containerDomNode.style.overflowWrap = 'anywhere';\n    }\n    else {\n        // overflow-wrap: break-word\n        containerDomNode.style.wordBreak = 'inherit';\n        containerDomNode.style.overflowWrap = 'break-word';\n    }\n    targetWindow.document.body.appendChild(containerDomNode);\n    const range = document.createRange();\n    const lineDomNodes = Array.prototype.slice.call(containerDomNode.children, 0);\n    const result = [];\n    for (let i = 0; i < requests.length; i++) {\n        const lineDomNode = lineDomNodes[i];\n        const breakOffsets = readLineBreaks(range, lineDomNode, renderLineContents[i], allCharOffsets[i]);\n        if (breakOffsets === null) {\n            result[i] = createEmptyLineBreakWithPossiblyInjectedText(i);\n            continue;\n        }\n        const firstNonWhitespaceIndex = firstNonWhitespaceIndices[i];\n        const wrappedTextIndentLength = wrappedTextIndentLengths[i] + additionalIndentSize;\n        const visibleColumns = allVisibleColumns[i];\n        const breakOffsetsVisibleColumn = [];\n        for (let j = 0, len = breakOffsets.length; j < len; j++) {\n            breakOffsetsVisibleColumn[j] = visibleColumns[breakOffsets[j]];\n        }\n        if (firstNonWhitespaceIndex !== 0) {\n            // All break offsets are relative to the renderLineContent, make them absolute again\n            for (let j = 0, len = breakOffsets.length; j < len; j++) {\n                breakOffsets[j] += firstNonWhitespaceIndex;\n            }\n        }\n        let injectionOptions;\n        let injectionOffsets;\n        const curInjectedTexts = injectedTextsPerLine[i];\n        if (curInjectedTexts) {\n            injectionOptions = curInjectedTexts.map(t => t.options);\n            injectionOffsets = curInjectedTexts.map(text => text.column - 1);\n        }\n        else {\n            injectionOptions = null;\n            injectionOffsets = null;\n        }\n        result[i] = new ModelLineProjectionData(injectionOffsets, injectionOptions, breakOffsets, breakOffsetsVisibleColumn, wrappedTextIndentLength);\n    }\n    containerDomNode.remove();\n    return result;\n}\nfunction renderLine(lineContent, initialVisibleColumn, tabSize, width, sb, wrappingIndentLength) {\n    if (wrappingIndentLength !== 0) {\n        const hangingOffset = String(wrappingIndentLength);\n        sb.appendString('<div style=\"text-indent: -');\n        sb.appendString(hangingOffset);\n        sb.appendString('px; padding-left: ');\n        sb.appendString(hangingOffset);\n        sb.appendString('px; box-sizing: border-box; width:');\n    }\n    else {\n        sb.appendString('<div style=\"width:');\n    }\n    sb.appendString(String(width));\n    sb.appendString('px;\">');\n    // if (containsRTL) {\n    // \tsb.appendASCIIString('\" dir=\"ltr');\n    // }\n    const len = lineContent.length;\n    let visibleColumn = initialVisibleColumn;\n    let charOffset = 0;\n    const charOffsets = [];\n    const visibleColumns = [];\n    let nextCharCode = (0 < len ? lineContent.charCodeAt(0) : 0 /* CharCode.Null */);\n    sb.appendString('<span>');\n    for (let charIndex = 0; charIndex < len; charIndex++) {\n        if (charIndex !== 0 && charIndex % 16384 /* Constants.SPAN_MODULO_LIMIT */ === 0) {\n            sb.appendString('</span><span>');\n        }\n        charOffsets[charIndex] = charOffset;\n        visibleColumns[charIndex] = visibleColumn;\n        const charCode = nextCharCode;\n        nextCharCode = (charIndex + 1 < len ? lineContent.charCodeAt(charIndex + 1) : 0 /* CharCode.Null */);\n        let producedCharacters = 1;\n        let charWidth = 1;\n        switch (charCode) {\n            case 9 /* CharCode.Tab */:\n                producedCharacters = (tabSize - (visibleColumn % tabSize));\n                charWidth = producedCharacters;\n                for (let space = 1; space <= producedCharacters; space++) {\n                    if (space < producedCharacters) {\n                        sb.appendCharCode(0xA0); // &nbsp;\n                    }\n                    else {\n                        sb.appendASCIICharCode(32 /* CharCode.Space */);\n                    }\n                }\n                break;\n            case 32 /* CharCode.Space */:\n                if (nextCharCode === 32 /* CharCode.Space */) {\n                    sb.appendCharCode(0xA0); // &nbsp;\n                }\n                else {\n                    sb.appendASCIICharCode(32 /* CharCode.Space */);\n                }\n                break;\n            case 60 /* CharCode.LessThan */:\n                sb.appendString('&lt;');\n                break;\n            case 62 /* CharCode.GreaterThan */:\n                sb.appendString('&gt;');\n                break;\n            case 38 /* CharCode.Ampersand */:\n                sb.appendString('&amp;');\n                break;\n            case 0 /* CharCode.Null */:\n                sb.appendString('&#00;');\n                break;\n            case 65279 /* CharCode.UTF8_BOM */:\n            case 8232 /* CharCode.LINE_SEPARATOR */:\n            case 8233 /* CharCode.PARAGRAPH_SEPARATOR */:\n            case 133 /* CharCode.NEXT_LINE */:\n                sb.appendCharCode(0xFFFD);\n                break;\n            default:\n                if (isFullWidthCharacter(charCode)) {\n                    charWidth++;\n                }\n                if (charCode < 32) {\n                    sb.appendCharCode(9216 + charCode);\n                }\n                else {\n                    sb.appendCharCode(charCode);\n                }\n        }\n        charOffset += producedCharacters;\n        visibleColumn += charWidth;\n    }\n    sb.appendString('</span>');\n    charOffsets[lineContent.length] = charOffset;\n    visibleColumns[lineContent.length] = visibleColumn;\n    sb.appendString('</div>');\n    return [charOffsets, visibleColumns];\n}\nfunction readLineBreaks(range, lineDomNode, lineContent, charOffsets) {\n    if (lineContent.length <= 1) {\n        return null;\n    }\n    const spans = Array.prototype.slice.call(lineDomNode.children, 0);\n    const breakOffsets = [];\n    try {\n        discoverBreaks(range, spans, charOffsets, 0, null, lineContent.length - 1, null, breakOffsets);\n    }\n    catch (err) {\n        console.log(err);\n        return null;\n    }\n    if (breakOffsets.length === 0) {\n        return null;\n    }\n    breakOffsets.push(lineContent.length);\n    return breakOffsets;\n}\nfunction discoverBreaks(range, spans, charOffsets, low, lowRects, high, highRects, result) {\n    if (low === high) {\n        return;\n    }\n    lowRects = lowRects || readClientRect(range, spans, charOffsets[low], charOffsets[low + 1]);\n    highRects = highRects || readClientRect(range, spans, charOffsets[high], charOffsets[high + 1]);\n    if (Math.abs(lowRects[0].top - highRects[0].top) <= 0.1) {\n        // same line\n        return;\n    }\n    // there is at least one line break between these two offsets\n    if (low + 1 === high) {\n        // the two characters are adjacent, so the line break must be exactly between them\n        result.push(high);\n        return;\n    }\n    const mid = low + ((high - low) / 2) | 0;\n    const midRects = readClientRect(range, spans, charOffsets[mid], charOffsets[mid + 1]);\n    discoverBreaks(range, spans, charOffsets, low, lowRects, mid, midRects, result);\n    discoverBreaks(range, spans, charOffsets, mid, midRects, high, highRects, result);\n}\nfunction readClientRect(range, spans, startOffset, endOffset) {\n    range.setStart(spans[(startOffset / 16384 /* Constants.SPAN_MODULO_LIMIT */) | 0].firstChild, startOffset % 16384 /* Constants.SPAN_MODULO_LIMIT */);\n    range.setEnd(spans[(endOffset / 16384 /* Constants.SPAN_MODULO_LIMIT */) | 0].firstChild, endOffset % 16384 /* Constants.SPAN_MODULO_LIMIT */);\n    return range.getClientRects();\n}\n\nexport { DOMLineBreaksComputerFactory };\n","import { runWhenWindowIdle, getWindow } from '../../../../base/browser/dom.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { Disposable, DisposableMap } from '../../../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CodeEditorContributions extends Disposable {\n    constructor() {\n        super();\n        this._editor = null;\n        this._instantiationService = null;\n        /**\n         * Contains all instantiated contributions.\n         */\n        this._instances = this._register(new DisposableMap());\n        /**\n         * Contains contributions which are not yet instantiated.\n         */\n        this._pending = new Map();\n        /**\n         * Tracks which instantiation kinds are still left in `_pending`.\n         */\n        this._finishedInstantiation = [];\n        this._finishedInstantiation[0 /* EditorContributionInstantiation.Eager */] = false;\n        this._finishedInstantiation[1 /* EditorContributionInstantiation.AfterFirstRender */] = false;\n        this._finishedInstantiation[2 /* EditorContributionInstantiation.BeforeFirstInteraction */] = false;\n        this._finishedInstantiation[3 /* EditorContributionInstantiation.Eventually */] = false;\n    }\n    initialize(editor, contributions, instantiationService) {\n        this._editor = editor;\n        this._instantiationService = instantiationService;\n        for (const desc of contributions) {\n            if (this._pending.has(desc.id)) {\n                onUnexpectedError(new Error(`Cannot have two contributions with the same id ${desc.id}`));\n                continue;\n            }\n            this._pending.set(desc.id, desc);\n        }\n        this._instantiateSome(0 /* EditorContributionInstantiation.Eager */);\n        // AfterFirstRender\n        // - these extensions will be instantiated at the latest 50ms after the first render.\n        // - but if there is idle time, we will instantiate them sooner.\n        this._register(runWhenWindowIdle(getWindow(this._editor.getDomNode()), () => {\n            this._instantiateSome(1 /* EditorContributionInstantiation.AfterFirstRender */);\n        }));\n        // BeforeFirstInteraction\n        // - these extensions will be instantiated at the latest before a mouse or a keyboard event.\n        // - but if there is idle time, we will instantiate them sooner.\n        this._register(runWhenWindowIdle(getWindow(this._editor.getDomNode()), () => {\n            this._instantiateSome(2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\n        }));\n        // Eventually\n        // - these extensions will only be instantiated when there is idle time.\n        // - since there is no guarantee that there will ever be idle time, we set a timeout of 5s here.\n        this._register(runWhenWindowIdle(getWindow(this._editor.getDomNode()), () => {\n            this._instantiateSome(3 /* EditorContributionInstantiation.Eventually */);\n        }, 5000));\n    }\n    saveViewState() {\n        const contributionsState = {};\n        for (const [id, contribution] of this._instances) {\n            if (typeof contribution.saveViewState === 'function') {\n                contributionsState[id] = contribution.saveViewState();\n            }\n        }\n        return contributionsState;\n    }\n    restoreViewState(contributionsState) {\n        for (const [id, contribution] of this._instances) {\n            if (typeof contribution.restoreViewState === 'function') {\n                contribution.restoreViewState(contributionsState[id]);\n            }\n        }\n    }\n    get(id) {\n        this._instantiateById(id);\n        return this._instances.get(id) || null;\n    }\n    onBeforeInteractionEvent() {\n        // this method is called very often by the editor!\n        this._instantiateSome(2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\n    }\n    onAfterModelAttached() {\n        return runWhenWindowIdle(getWindow(this._editor?.getDomNode()), () => {\n            this._instantiateSome(1 /* EditorContributionInstantiation.AfterFirstRender */);\n        }, 50);\n    }\n    _instantiateSome(instantiation) {\n        if (this._finishedInstantiation[instantiation]) {\n            // already done with this instantiation!\n            return;\n        }\n        this._finishedInstantiation[instantiation] = true;\n        const contribs = this._findPendingContributionsByInstantiation(instantiation);\n        for (const contrib of contribs) {\n            this._instantiateById(contrib.id);\n        }\n    }\n    _findPendingContributionsByInstantiation(instantiation) {\n        const result = [];\n        for (const [, desc] of this._pending) {\n            if (desc.instantiation === instantiation) {\n                result.push(desc);\n            }\n        }\n        return result;\n    }\n    _instantiateById(id) {\n        const desc = this._pending.get(id);\n        if (!desc) {\n            return;\n        }\n        this._pending.delete(id);\n        if (!this._instantiationService || !this._editor) {\n            throw new Error(`Cannot instantiate contributions before being initialized!`);\n        }\n        try {\n            const instance = this._instantiationService.createInstance(desc.ctor, this._editor);\n            this._instances.set(desc.id, instance);\n            if (typeof instance.restoreViewState === 'function' && desc.instantiation !== 0 /* EditorContributionInstantiation.Eager */) {\n                console.warn(`Editor contribution '${desc.id}' should be eager instantiated because it uses saveViewState / restoreViewState.`);\n            }\n        }\n        catch (err) {\n            onUnexpectedError(err);\n        }\n    }\n}\n\nexport { CodeEditorContributions };\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 *--------------------------------------------------------------------------------------------*/\nclass InternalEditorAction {\n    constructor(id, label, alias, metadata, _precondition, _run, _contextKeyService) {\n        this.id = id;\n        this.label = label;\n        this.alias = alias;\n        this.metadata = metadata;\n        this._precondition = _precondition;\n        this._run = _run;\n        this._contextKeyService = _contextKeyService;\n    }\n    isSupported() {\n        return this._contextKeyService.contextMatchesRules(this._precondition);\n    }\n    run(args) {\n        if (!this.isSupported()) {\n            return Promise.resolve(undefined);\n        }\n        return this._run(args);\n    }\n}\n\nexport { InternalEditorAction };\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/**\n * The type of the `IEditor`.\n */\nconst EditorType = {\n    ICodeEditor: 'vs.editor.ICodeEditor',\n    IDiffEditor: 'vs.editor.IDiffEditor'\n};\n\nexport { EditorType };\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 *--------------------------------------------------------------------------------------------*/\nfunction countEOL(text) {\n    let eolCount = 0;\n    let firstLineLength = 0;\n    let lastLineStart = 0;\n    let eol = 0 /* StringEOL.Unknown */;\n    for (let i = 0, len = text.length; i < len; i++) {\n        const chr = text.charCodeAt(i);\n        if (chr === 13 /* CharCode.CarriageReturn */) {\n            if (eolCount === 0) {\n                firstLineLength = i;\n            }\n            eolCount++;\n            if (i + 1 < len && text.charCodeAt(i + 1) === 10 /* CharCode.LineFeed */) {\n                // \\r\\n... case\n                eol |= 2 /* StringEOL.CRLF */;\n                i++; // skip \\n\n            }\n            else {\n                // \\r... case\n                eol |= 3 /* StringEOL.Invalid */;\n            }\n            lastLineStart = i + 1;\n        }\n        else if (chr === 10 /* CharCode.LineFeed */) {\n            // \\n... case\n            eol |= 1 /* StringEOL.LF */;\n            if (eolCount === 0) {\n                firstLineLength = i;\n            }\n            eolCount++;\n            lastLineStart = i + 1;\n        }\n    }\n    if (eolCount === 0) {\n        firstLineLength = text.length;\n    }\n    return [eolCount, firstLineLength, text.length - lastLineStart, eol];\n}\n\nexport { countEOL };\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 *--------------------------------------------------------------------------------------------*/\nclass BracketInfo {\n    constructor(range, \n    /** 0-based level */\n    nestingLevel, nestingLevelOfEqualBracketType, isInvalid) {\n        this.range = range;\n        this.nestingLevel = nestingLevel;\n        this.nestingLevelOfEqualBracketType = nestingLevelOfEqualBracketType;\n        this.isInvalid = isInvalid;\n    }\n}\nclass BracketPairInfo {\n    constructor(range, openingBracketRange, closingBracketRange, \n    /** 0-based */\n    nestingLevel, nestingLevelOfEqualBracketType, bracketPairNode) {\n        this.range = range;\n        this.openingBracketRange = openingBracketRange;\n        this.closingBracketRange = closingBracketRange;\n        this.nestingLevel = nestingLevel;\n        this.nestingLevelOfEqualBracketType = nestingLevelOfEqualBracketType;\n        this.bracketPairNode = bracketPairNode;\n    }\n    get openingBracketInfo() {\n        return this.bracketPairNode.openingBracket.bracketInfo;\n    }\n}\nclass BracketPairWithMinIndentationInfo extends BracketPairInfo {\n    constructor(range, openingBracketRange, closingBracketRange, \n    /**\n     * 0-based\n    */\n    nestingLevel, nestingLevelOfEqualBracketType, bracketPairNode, \n    /**\n     * -1 if not requested, otherwise the size of the minimum indentation in the bracket pair in terms of visible columns.\n    */\n    minVisibleColumnIndentation) {\n        super(range, openingBracketRange, closingBracketRange, nestingLevel, nestingLevelOfEqualBracketType, bracketPairNode);\n        this.minVisibleColumnIndentation = minVisibleColumnIndentation;\n    }\n}\n\nexport { BracketInfo, BracketPairInfo, BracketPairWithMinIndentationInfo };\n","import { splitLines } from '../../../../../base/common/strings.js';\nimport { Range } from '../../../core/range.js';\nimport { TextLength } from '../../../core/text/textLength.js';\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/**\n * The end must be greater than or equal to the start.\n*/\nfunction lengthDiff(startLineCount, startColumnCount, endLineCount, endColumnCount) {\n    return (startLineCount !== endLineCount)\n        ? toLength(endLineCount - startLineCount, endColumnCount)\n        : toLength(0, endColumnCount - startColumnCount);\n}\n// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\nconst lengthZero = 0;\nfunction lengthIsZero(length) {\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    return length === 0;\n}\n/*\n * We have 52 bits available in a JS number.\n * We use the upper 26 bits to store the line and the lower 26 bits to store the column.\n */\n///*\nconst factor = 2 ** 26;\n/*/\nconst factor = 1000000;\n// */\nfunction toLength(lineCount, columnCount) {\n    // llllllllllllllllllllllllllcccccccccccccccccccccccccc (52 bits)\n    //       line count (26 bits)    column count (26 bits)\n    // If there is no overflow (all values/sums below 2^26 = 67108864),\n    // we have `toLength(lns1, cols1) + toLength(lns2, cols2) = toLength(lns1 + lns2, cols1 + cols2)`.\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    return (lineCount * factor + columnCount);\n}\nfunction lengthToObj(length) {\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    const l = length;\n    const lineCount = Math.floor(l / factor);\n    const columnCount = l - lineCount * factor;\n    return new TextLength(lineCount, columnCount);\n}\nfunction lengthGetLineCount(length) {\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    return Math.floor(length / factor);\n}\n/**\n * Returns the amount of columns of the given length, assuming that it does not span any line.\n*/\nfunction lengthGetColumnCountIfZeroLineCount(length) {\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    return length;\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction lengthAdd(l1, l2) {\n    let r = l1 + l2;\n    if (l2 >= factor) {\n        r = r - (l1 % factor);\n    }\n    return r;\n}\nfunction sumLengths(items, lengthFn) {\n    return items.reduce((a, b) => lengthAdd(a, lengthFn(b)), lengthZero);\n}\nfunction lengthEquals(length1, length2) {\n    return length1 === length2;\n}\n/**\n * Returns a non negative length `result` such that `lengthAdd(length1, result) = length2`, or zero if such length does not exist.\n */\nfunction lengthDiffNonNegative(length1, length2) {\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    const l1 = length1;\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    const l2 = length2;\n    const diff = l2 - l1;\n    if (diff <= 0) {\n        // line-count of length1 is higher than line-count of length2\n        // or they are equal and column-count of length1 is higher than column-count of length2\n        return lengthZero;\n    }\n    const lineCount1 = Math.floor(l1 / factor);\n    const lineCount2 = Math.floor(l2 / factor);\n    const colCount2 = l2 - lineCount2 * factor;\n    if (lineCount1 === lineCount2) {\n        const colCount1 = l1 - lineCount1 * factor;\n        return toLength(0, colCount2 - colCount1);\n    }\n    else {\n        return toLength(lineCount2 - lineCount1, colCount2);\n    }\n}\nfunction lengthLessThan(length1, length2) {\n    // First, compare line counts, then column counts.\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    return length1 < length2;\n}\nfunction lengthLessThanEqual(length1, length2) {\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    return length1 <= length2;\n}\nfunction lengthGreaterThanEqual(length1, length2) {\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    return length1 >= length2;\n}\nfunction positionToLength(position) {\n    return toLength(position.lineNumber - 1, position.column - 1);\n}\nfunction lengthsToRange(lengthStart, lengthEnd) {\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    const l = lengthStart;\n    const lineCount = Math.floor(l / factor);\n    const colCount = l - lineCount * factor;\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    const l2 = lengthEnd;\n    const lineCount2 = Math.floor(l2 / factor);\n    const colCount2 = l2 - lineCount2 * factor;\n    return new Range(lineCount + 1, colCount + 1, lineCount2 + 1, colCount2 + 1);\n}\nfunction lengthOfString(str) {\n    const lines = splitLines(str);\n    return toLength(lines.length - 1, lines[lines.length - 1].length);\n}\n\nexport { lengthAdd, lengthDiff, lengthDiffNonNegative, lengthEquals, lengthGetColumnCountIfZeroLineCount, lengthGetLineCount, lengthGreaterThanEqual, lengthIsZero, lengthLessThan, lengthLessThanEqual, lengthOfString, lengthToObj, lengthZero, lengthsToRange, positionToLength, sumLengths, toLength };\n","import { Range } from '../../../core/range.js';\nimport { positionToLength, lengthOfString, lengthToObj, lengthDiffNonNegative, toLength, lengthLessThanEqual, lengthAdd } from './length.js';\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 *--------------------------------------------------------------------------------------------*/\nclass TextEditInfo {\n    static fromModelContentChanges(changes) {\n        // Must be sorted in ascending order\n        const edits = changes.map(c => {\n            const range = Range.lift(c.range);\n            return new TextEditInfo(positionToLength(range.getStartPosition()), positionToLength(range.getEndPosition()), lengthOfString(c.text));\n        }).reverse();\n        return edits;\n    }\n    constructor(startOffset, endOffset, newLength) {\n        this.startOffset = startOffset;\n        this.endOffset = endOffset;\n        this.newLength = newLength;\n    }\n    toString() {\n        return `[${lengthToObj(this.startOffset)}...${lengthToObj(this.endOffset)}) -> ${lengthToObj(this.newLength)}`;\n    }\n}\nclass BeforeEditPositionMapper {\n    /**\n     * @param edits Must be sorted by offset in ascending order.\n    */\n    constructor(edits) {\n        this.nextEditIdx = 0;\n        this.deltaOldToNewLineCount = 0;\n        this.deltaOldToNewColumnCount = 0;\n        this.deltaLineIdxInOld = -1;\n        this.edits = edits.map(edit => TextEditInfoCache.from(edit));\n    }\n    /**\n     * @param offset Must be equal to or greater than the last offset this method has been called with.\n    */\n    getOffsetBeforeChange(offset) {\n        this.adjustNextEdit(offset);\n        return this.translateCurToOld(offset);\n    }\n    /**\n     * @param offset Must be equal to or greater than the last offset this method has been called with.\n     * Returns null if there is no edit anymore.\n    */\n    getDistanceToNextChange(offset) {\n        this.adjustNextEdit(offset);\n        const nextEdit = this.edits[this.nextEditIdx];\n        const nextChangeOffset = nextEdit ? this.translateOldToCur(nextEdit.offsetObj) : null;\n        if (nextChangeOffset === null) {\n            return null;\n        }\n        return lengthDiffNonNegative(offset, nextChangeOffset);\n    }\n    translateOldToCur(oldOffsetObj) {\n        if (oldOffsetObj.lineCount === this.deltaLineIdxInOld) {\n            return toLength(oldOffsetObj.lineCount + this.deltaOldToNewLineCount, oldOffsetObj.columnCount + this.deltaOldToNewColumnCount);\n        }\n        else {\n            return toLength(oldOffsetObj.lineCount + this.deltaOldToNewLineCount, oldOffsetObj.columnCount);\n        }\n    }\n    translateCurToOld(newOffset) {\n        const offsetObj = lengthToObj(newOffset);\n        if (offsetObj.lineCount - this.deltaOldToNewLineCount === this.deltaLineIdxInOld) {\n            return toLength(offsetObj.lineCount - this.deltaOldToNewLineCount, offsetObj.columnCount - this.deltaOldToNewColumnCount);\n        }\n        else {\n            return toLength(offsetObj.lineCount - this.deltaOldToNewLineCount, offsetObj.columnCount);\n        }\n    }\n    adjustNextEdit(offset) {\n        while (this.nextEditIdx < this.edits.length) {\n            const nextEdit = this.edits[this.nextEditIdx];\n            // After applying the edit, what is its end offset (considering all previous edits)?\n            const nextEditEndOffsetInCur = this.translateOldToCur(nextEdit.endOffsetAfterObj);\n            if (lengthLessThanEqual(nextEditEndOffsetInCur, offset)) {\n                // We are after the edit, skip it\n                this.nextEditIdx++;\n                const nextEditEndOffsetInCurObj = lengthToObj(nextEditEndOffsetInCur);\n                // Before applying the edit, what is its end offset (considering all previous edits)?\n                const nextEditEndOffsetBeforeInCurObj = lengthToObj(this.translateOldToCur(nextEdit.endOffsetBeforeObj));\n                const lineDelta = nextEditEndOffsetInCurObj.lineCount - nextEditEndOffsetBeforeInCurObj.lineCount;\n                this.deltaOldToNewLineCount += lineDelta;\n                const previousColumnDelta = this.deltaLineIdxInOld === nextEdit.endOffsetBeforeObj.lineCount ? this.deltaOldToNewColumnCount : 0;\n                const columnDelta = nextEditEndOffsetInCurObj.columnCount - nextEditEndOffsetBeforeInCurObj.columnCount;\n                this.deltaOldToNewColumnCount = previousColumnDelta + columnDelta;\n                this.deltaLineIdxInOld = nextEdit.endOffsetBeforeObj.lineCount;\n            }\n            else {\n                // We are in or before the edit.\n                break;\n            }\n        }\n    }\n}\nclass TextEditInfoCache {\n    static from(edit) {\n        return new TextEditInfoCache(edit.startOffset, edit.endOffset, edit.newLength);\n    }\n    constructor(startOffset, endOffset, textLength) {\n        this.endOffsetBeforeObj = lengthToObj(endOffset);\n        this.endOffsetAfterObj = lengthToObj(lengthAdd(startOffset, textLength));\n        this.offsetObj = lengthToObj(startOffset);\n    }\n}\n\nexport { BeforeEditPositionMapper, TextEditInfo };\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 *--------------------------------------------------------------------------------------------*/\nconst emptyArr = [];\n/**\n * Represents an immutable set that works best for a small number of elements (less than 32).\n * It uses bits to encode element membership efficiently.\n*/\nclass SmallImmutableSet {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    static { this.cache = new Array(129); }\n    static create(items, additionalItems) {\n        if (items <= 128 && additionalItems.length === 0) {\n            // We create a cache of 128=2^7 elements to cover all sets with up to 7 (dense) elements.\n            let cached = SmallImmutableSet.cache[items];\n            if (!cached) {\n                cached = new SmallImmutableSet(items, additionalItems);\n                SmallImmutableSet.cache[items] = cached;\n            }\n            return cached;\n        }\n        return new SmallImmutableSet(items, additionalItems);\n    }\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    static { this.empty = SmallImmutableSet.create(0, emptyArr); }\n    static getEmpty() {\n        return this.empty;\n    }\n    constructor(items, additionalItems) {\n        this.items = items;\n        this.additionalItems = additionalItems;\n    }\n    add(value, keyProvider) {\n        const key = keyProvider.getKey(value);\n        let idx = key >> 5; // divided by 32\n        if (idx === 0) {\n            // fast path\n            const newItem = (1 << key) | this.items;\n            if (newItem === this.items) {\n                return this;\n            }\n            return SmallImmutableSet.create(newItem, this.additionalItems);\n        }\n        idx--;\n        const newItems = this.additionalItems.slice(0);\n        while (newItems.length < idx) {\n            newItems.push(0);\n        }\n        newItems[idx] |= 1 << (key & 31);\n        return SmallImmutableSet.create(this.items, newItems);\n    }\n    merge(other) {\n        const merged = this.items | other.items;\n        if (this.additionalItems === emptyArr && other.additionalItems === emptyArr) {\n            // fast path\n            if (merged === this.items) {\n                return this;\n            }\n            if (merged === other.items) {\n                return other;\n            }\n            return SmallImmutableSet.create(merged, emptyArr);\n        }\n        // This can be optimized, but it's not a common case\n        const newItems = [];\n        for (let i = 0; i < Math.max(this.additionalItems.length, other.additionalItems.length); i++) {\n            const item1 = this.additionalItems[i] || 0;\n            const item2 = other.additionalItems[i] || 0;\n            newItems.push(item1 | item2);\n        }\n        return SmallImmutableSet.create(merged, newItems);\n    }\n    intersects(other) {\n        if ((this.items & other.items) !== 0) {\n            return true;\n        }\n        for (let i = 0; i < Math.min(this.additionalItems.length, other.additionalItems.length); i++) {\n            if ((this.additionalItems[i] & other.additionalItems[i]) !== 0) {\n                return true;\n            }\n        }\n        return false;\n    }\n}\nconst identityKeyProvider = {\n    getKey(value) {\n        return value;\n    }\n};\n/**\n * Assigns values a unique incrementing key.\n*/\nclass DenseKeyProvider {\n    constructor() {\n        this.items = new Map();\n    }\n    getKey(value) {\n        let existing = this.items.get(value);\n        if (existing === undefined) {\n            existing = this.items.size;\n            this.items.set(value, existing);\n        }\n        return existing;\n    }\n}\n\nexport { DenseKeyProvider, SmallImmutableSet, identityKeyProvider };\n","import { BugIndicatingError } from '../../../../../base/common/errors.js';\nimport { CursorColumns } from '../../../core/cursorColumns.js';\nimport { lengthToObj, lengthGetLineCount, lengthAdd, lengthZero } from './length.js';\nimport { SmallImmutableSet } from './smallImmutableSet.js';\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/**\n * The base implementation for all AST nodes.\n*/\nclass BaseAstNode {\n    /**\n     * The length of the entire node, which should equal the sum of lengths of all children.\n    */\n    get length() {\n        return this._length;\n    }\n    constructor(length) {\n        this._length = length;\n    }\n}\n/**\n * Represents a bracket pair including its child (e.g. `{ ... }`).\n * Might be unclosed.\n * Immutable, if all children are immutable.\n*/\nclass PairAstNode extends BaseAstNode {\n    static create(openingBracket, child, closingBracket) {\n        let length = openingBracket.length;\n        if (child) {\n            length = lengthAdd(length, child.length);\n        }\n        if (closingBracket) {\n            length = lengthAdd(length, closingBracket.length);\n        }\n        return new PairAstNode(length, openingBracket, child, closingBracket, child ? child.missingOpeningBracketIds : SmallImmutableSet.getEmpty());\n    }\n    get kind() {\n        return 2 /* AstNodeKind.Pair */;\n    }\n    get listHeight() {\n        return 0;\n    }\n    get childrenLength() {\n        return 3;\n    }\n    getChild(idx) {\n        switch (idx) {\n            case 0: return this.openingBracket;\n            case 1: return this.child;\n            case 2: return this.closingBracket;\n        }\n        throw new Error('Invalid child index');\n    }\n    /**\n     * Avoid using this property, it allocates an array!\n    */\n    get children() {\n        const result = [];\n        result.push(this.openingBracket);\n        if (this.child) {\n            result.push(this.child);\n        }\n        if (this.closingBracket) {\n            result.push(this.closingBracket);\n        }\n        return result;\n    }\n    constructor(length, openingBracket, child, closingBracket, missingOpeningBracketIds) {\n        super(length);\n        this.openingBracket = openingBracket;\n        this.child = child;\n        this.closingBracket = closingBracket;\n        this.missingOpeningBracketIds = missingOpeningBracketIds;\n    }\n    canBeReused(openBracketIds) {\n        if (this.closingBracket === null) {\n            // Unclosed pair ast nodes only\n            // end at the end of the document\n            // or when a parent node is closed.\n            // This could be improved:\n            // Only return false if some next token is neither \"undefined\" nor a bracket that closes a parent.\n            return false;\n        }\n        if (openBracketIds.intersects(this.missingOpeningBracketIds)) {\n            return false;\n        }\n        return true;\n    }\n    deepClone() {\n        return new PairAstNode(this.length, this.openingBracket.deepClone(), this.child && this.child.deepClone(), this.closingBracket && this.closingBracket.deepClone(), this.missingOpeningBracketIds);\n    }\n    computeMinIndentation(offset, textModel) {\n        return this.child ? this.child.computeMinIndentation(lengthAdd(offset, this.openingBracket.length), textModel) : Number.MAX_SAFE_INTEGER;\n    }\n}\nclass ListAstNode extends BaseAstNode {\n    /**\n     * This method uses more memory-efficient list nodes that can only store 2 or 3 children.\n    */\n    static create23(item1, item2, item3, immutable = false) {\n        let length = item1.length;\n        let missingBracketIds = item1.missingOpeningBracketIds;\n        if (item1.listHeight !== item2.listHeight) {\n            throw new Error('Invalid list heights');\n        }\n        length = lengthAdd(length, item2.length);\n        missingBracketIds = missingBracketIds.merge(item2.missingOpeningBracketIds);\n        if (item3) {\n            if (item1.listHeight !== item3.listHeight) {\n                throw new Error('Invalid list heights');\n            }\n            length = lengthAdd(length, item3.length);\n            missingBracketIds = missingBracketIds.merge(item3.missingOpeningBracketIds);\n        }\n        return immutable\n            ? new Immutable23ListAstNode(length, item1.listHeight + 1, item1, item2, item3, missingBracketIds)\n            : new TwoThreeListAstNode(length, item1.listHeight + 1, item1, item2, item3, missingBracketIds);\n    }\n    static getEmpty() {\n        return new ImmutableArrayListAstNode(lengthZero, 0, [], SmallImmutableSet.getEmpty());\n    }\n    get kind() {\n        return 4 /* AstNodeKind.List */;\n    }\n    get missingOpeningBracketIds() {\n        return this._missingOpeningBracketIds;\n    }\n    /**\n     * Use ListAstNode.create.\n    */\n    constructor(length, listHeight, _missingOpeningBracketIds) {\n        super(length);\n        this.listHeight = listHeight;\n        this._missingOpeningBracketIds = _missingOpeningBracketIds;\n        this.cachedMinIndentation = -1;\n    }\n    throwIfImmutable() {\n        // NOOP\n    }\n    makeLastElementMutable() {\n        this.throwIfImmutable();\n        const childCount = this.childrenLength;\n        if (childCount === 0) {\n            return undefined;\n        }\n        const lastChild = this.getChild(childCount - 1);\n        const mutable = lastChild.kind === 4 /* AstNodeKind.List */ ? lastChild.toMutable() : lastChild;\n        if (lastChild !== mutable) {\n            this.setChild(childCount - 1, mutable);\n        }\n        return mutable;\n    }\n    makeFirstElementMutable() {\n        this.throwIfImmutable();\n        const childCount = this.childrenLength;\n        if (childCount === 0) {\n            return undefined;\n        }\n        const firstChild = this.getChild(0);\n        const mutable = firstChild.kind === 4 /* AstNodeKind.List */ ? firstChild.toMutable() : firstChild;\n        if (firstChild !== mutable) {\n            this.setChild(0, mutable);\n        }\n        return mutable;\n    }\n    canBeReused(openBracketIds) {\n        if (openBracketIds.intersects(this.missingOpeningBracketIds)) {\n            return false;\n        }\n        if (this.childrenLength === 0) {\n            // Don't reuse empty lists.\n            return false;\n        }\n        let lastChild = this;\n        while (lastChild.kind === 4 /* AstNodeKind.List */) {\n            const lastLength = lastChild.childrenLength;\n            if (lastLength === 0) {\n                // Empty lists should never be contained in other lists.\n                throw new BugIndicatingError();\n            }\n            lastChild = lastChild.getChild(lastLength - 1);\n        }\n        return lastChild.canBeReused(openBracketIds);\n    }\n    handleChildrenChanged() {\n        this.throwIfImmutable();\n        const count = this.childrenLength;\n        let length = this.getChild(0).length;\n        let unopenedBrackets = this.getChild(0).missingOpeningBracketIds;\n        for (let i = 1; i < count; i++) {\n            const child = this.getChild(i);\n            length = lengthAdd(length, child.length);\n            unopenedBrackets = unopenedBrackets.merge(child.missingOpeningBracketIds);\n        }\n        this._length = length;\n        this._missingOpeningBracketIds = unopenedBrackets;\n        this.cachedMinIndentation = -1;\n    }\n    computeMinIndentation(offset, textModel) {\n        if (this.cachedMinIndentation !== -1) {\n            return this.cachedMinIndentation;\n        }\n        let minIndentation = Number.MAX_SAFE_INTEGER;\n        let childOffset = offset;\n        for (let i = 0; i < this.childrenLength; i++) {\n            const child = this.getChild(i);\n            if (child) {\n                minIndentation = Math.min(minIndentation, child.computeMinIndentation(childOffset, textModel));\n                childOffset = lengthAdd(childOffset, child.length);\n            }\n        }\n        this.cachedMinIndentation = minIndentation;\n        return minIndentation;\n    }\n}\nclass TwoThreeListAstNode extends ListAstNode {\n    get childrenLength() {\n        return this._item3 !== null ? 3 : 2;\n    }\n    getChild(idx) {\n        switch (idx) {\n            case 0: return this._item1;\n            case 1: return this._item2;\n            case 2: return this._item3;\n        }\n        throw new Error('Invalid child index');\n    }\n    setChild(idx, node) {\n        switch (idx) {\n            case 0:\n                this._item1 = node;\n                return;\n            case 1:\n                this._item2 = node;\n                return;\n            case 2:\n                this._item3 = node;\n                return;\n        }\n        throw new Error('Invalid child index');\n    }\n    get children() {\n        return this._item3 ? [this._item1, this._item2, this._item3] : [this._item1, this._item2];\n    }\n    get item1() {\n        return this._item1;\n    }\n    get item2() {\n        return this._item2;\n    }\n    get item3() {\n        return this._item3;\n    }\n    constructor(length, listHeight, _item1, _item2, _item3, missingOpeningBracketIds) {\n        super(length, listHeight, missingOpeningBracketIds);\n        this._item1 = _item1;\n        this._item2 = _item2;\n        this._item3 = _item3;\n    }\n    deepClone() {\n        return new TwoThreeListAstNode(this.length, this.listHeight, this._item1.deepClone(), this._item2.deepClone(), this._item3 ? this._item3.deepClone() : null, this.missingOpeningBracketIds);\n    }\n    appendChildOfSameHeight(node) {\n        if (this._item3) {\n            throw new Error('Cannot append to a full (2,3) tree node');\n        }\n        this.throwIfImmutable();\n        this._item3 = node;\n        this.handleChildrenChanged();\n    }\n    unappendChild() {\n        if (!this._item3) {\n            throw new Error('Cannot remove from a non-full (2,3) tree node');\n        }\n        this.throwIfImmutable();\n        const result = this._item3;\n        this._item3 = null;\n        this.handleChildrenChanged();\n        return result;\n    }\n    prependChildOfSameHeight(node) {\n        if (this._item3) {\n            throw new Error('Cannot prepend to a full (2,3) tree node');\n        }\n        this.throwIfImmutable();\n        this._item3 = this._item2;\n        this._item2 = this._item1;\n        this._item1 = node;\n        this.handleChildrenChanged();\n    }\n    unprependChild() {\n        if (!this._item3) {\n            throw new Error('Cannot remove from a non-full (2,3) tree node');\n        }\n        this.throwIfImmutable();\n        const result = this._item1;\n        this._item1 = this._item2;\n        this._item2 = this._item3;\n        this._item3 = null;\n        this.handleChildrenChanged();\n        return result;\n    }\n    toMutable() {\n        return this;\n    }\n}\n/**\n * Immutable, if all children are immutable.\n*/\nclass Immutable23ListAstNode extends TwoThreeListAstNode {\n    toMutable() {\n        return new TwoThreeListAstNode(this.length, this.listHeight, this.item1, this.item2, this.item3, this.missingOpeningBracketIds);\n    }\n    throwIfImmutable() {\n        throw new Error('this instance is immutable');\n    }\n}\n/**\n * For debugging.\n*/\nclass ArrayListAstNode extends ListAstNode {\n    get childrenLength() {\n        return this._children.length;\n    }\n    getChild(idx) {\n        return this._children[idx];\n    }\n    setChild(idx, child) {\n        this._children[idx] = child;\n    }\n    get children() {\n        return this._children;\n    }\n    constructor(length, listHeight, _children, missingOpeningBracketIds) {\n        super(length, listHeight, missingOpeningBracketIds);\n        this._children = _children;\n    }\n    deepClone() {\n        const children = new Array(this._children.length);\n        for (let i = 0; i < this._children.length; i++) {\n            children[i] = this._children[i].deepClone();\n        }\n        return new ArrayListAstNode(this.length, this.listHeight, children, this.missingOpeningBracketIds);\n    }\n    appendChildOfSameHeight(node) {\n        this.throwIfImmutable();\n        this._children.push(node);\n        this.handleChildrenChanged();\n    }\n    unappendChild() {\n        this.throwIfImmutable();\n        const item = this._children.pop();\n        this.handleChildrenChanged();\n        return item;\n    }\n    prependChildOfSameHeight(node) {\n        this.throwIfImmutable();\n        this._children.unshift(node);\n        this.handleChildrenChanged();\n    }\n    unprependChild() {\n        this.throwIfImmutable();\n        const item = this._children.shift();\n        this.handleChildrenChanged();\n        return item;\n    }\n    toMutable() {\n        return this;\n    }\n}\n/**\n * Immutable, if all children are immutable.\n*/\nclass ImmutableArrayListAstNode extends ArrayListAstNode {\n    toMutable() {\n        return new ArrayListAstNode(this.length, this.listHeight, [...this.children], this.missingOpeningBracketIds);\n    }\n    throwIfImmutable() {\n        throw new Error('this instance is immutable');\n    }\n}\nconst emptyArray = [];\nclass ImmutableLeafAstNode extends BaseAstNode {\n    get listHeight() {\n        return 0;\n    }\n    get childrenLength() {\n        return 0;\n    }\n    getChild(idx) {\n        return null;\n    }\n    get children() {\n        return emptyArray;\n    }\n    deepClone() {\n        return this;\n    }\n}\nclass TextAstNode extends ImmutableLeafAstNode {\n    get kind() {\n        return 0 /* AstNodeKind.Text */;\n    }\n    get missingOpeningBracketIds() {\n        return SmallImmutableSet.getEmpty();\n    }\n    canBeReused(_openedBracketIds) {\n        return true;\n    }\n    computeMinIndentation(offset, textModel) {\n        const start = lengthToObj(offset);\n        // Text ast nodes don't have partial indentation (ensured by the tokenizer).\n        // Thus, if this text node does not start at column 0, the first line cannot have any indentation at all.\n        const startLineNumber = (start.columnCount === 0 ? start.lineCount : start.lineCount + 1) + 1;\n        const endLineNumber = lengthGetLineCount(lengthAdd(offset, this.length)) + 1;\n        let result = Number.MAX_SAFE_INTEGER;\n        for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n            const firstNonWsColumn = textModel.getLineFirstNonWhitespaceColumn(lineNumber);\n            const lineContent = textModel.getLineContent(lineNumber);\n            if (firstNonWsColumn === 0) {\n                continue;\n            }\n            const visibleColumn = CursorColumns.visibleColumnFromColumn(lineContent, firstNonWsColumn, textModel.getOptions().tabSize);\n            result = Math.min(result, visibleColumn);\n        }\n        return result;\n    }\n}\nclass BracketAstNode extends ImmutableLeafAstNode {\n    static create(length, bracketInfo, bracketIds) {\n        const node = new BracketAstNode(length, bracketInfo, bracketIds);\n        return node;\n    }\n    get kind() {\n        return 1 /* AstNodeKind.Bracket */;\n    }\n    get missingOpeningBracketIds() {\n        return SmallImmutableSet.getEmpty();\n    }\n    constructor(length, bracketInfo, \n    /**\n     * In case of a opening bracket, this is the id of the opening bracket.\n     * In case of a closing bracket, this contains the ids of all opening brackets it can close.\n    */\n    bracketIds) {\n        super(length);\n        this.bracketInfo = bracketInfo;\n        this.bracketIds = bracketIds;\n    }\n    get text() {\n        return this.bracketInfo.bracketText;\n    }\n    get languageId() {\n        return this.bracketInfo.languageId;\n    }\n    canBeReused(_openedBracketIds) {\n        // These nodes could be reused,\n        // but not in a general way.\n        // Their parent may be reused.\n        return false;\n    }\n    computeMinIndentation(offset, textModel) {\n        return Number.MAX_SAFE_INTEGER;\n    }\n}\nclass InvalidBracketAstNode extends ImmutableLeafAstNode {\n    get kind() {\n        return 3 /* AstNodeKind.UnexpectedClosingBracket */;\n    }\n    constructor(closingBrackets, length) {\n        super(length);\n        this.missingOpeningBracketIds = closingBrackets;\n    }\n    canBeReused(openedBracketIds) {\n        return !openedBracketIds.intersects(this.missingOpeningBracketIds);\n    }\n    computeMinIndentation(offset, textModel) {\n        return Number.MAX_SAFE_INTEGER;\n    }\n}\n\nexport { BracketAstNode, InvalidBracketAstNode, ListAstNode, PairAstNode, TextAstNode };\n","import { NotSupportedError } from '../../../../../base/common/errors.js';\nimport { TokenMetadata } from '../../../encodedTokenAttributes.js';\nimport { TextAstNode } from './ast.js';\nimport { lengthZero, toLength, lengthAdd, lengthToObj, lengthGetColumnCountIfZeroLineCount, lengthDiff } from './length.js';\nimport { SmallImmutableSet } from './smallImmutableSet.js';\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 *--------------------------------------------------------------------------------------------*/\nclass Token {\n    constructor(length, kind, \n    /**\n     * If this token is an opening bracket, this is the id of the opening bracket.\n     * If this token is a closing bracket, this is the id of the first opening bracket that is closed by this bracket.\n     * Otherwise, it is -1.\n     */\n    bracketId, \n    /**\n     * If this token is an opening bracket, this just contains `bracketId`.\n     * If this token is a closing bracket, this lists all opening bracket ids, that it closes.\n     * Otherwise, it is empty.\n     */\n    bracketIds, astNode) {\n        this.length = length;\n        this.kind = kind;\n        this.bracketId = bracketId;\n        this.bracketIds = bracketIds;\n        this.astNode = astNode;\n    }\n}\nclass TextBufferTokenizer {\n    constructor(textModel, bracketTokens) {\n        this.textModel = textModel;\n        this.bracketTokens = bracketTokens;\n        this.reader = new NonPeekableTextBufferTokenizer(this.textModel, this.bracketTokens);\n        this._offset = lengthZero;\n        this.didPeek = false;\n        this.peeked = null;\n        this.textBufferLineCount = textModel.getLineCount();\n        this.textBufferLastLineLength = textModel.getLineLength(this.textBufferLineCount);\n    }\n    get offset() {\n        return this._offset;\n    }\n    get length() {\n        return toLength(this.textBufferLineCount - 1, this.textBufferLastLineLength);\n    }\n    skip(length) {\n        this.didPeek = false;\n        this._offset = lengthAdd(this._offset, length);\n        const obj = lengthToObj(this._offset);\n        this.reader.setPosition(obj.lineCount, obj.columnCount);\n    }\n    read() {\n        let token;\n        if (this.peeked) {\n            this.didPeek = false;\n            token = this.peeked;\n        }\n        else {\n            token = this.reader.read();\n        }\n        if (token) {\n            this._offset = lengthAdd(this._offset, token.length);\n        }\n        return token;\n    }\n    peek() {\n        if (!this.didPeek) {\n            this.peeked = this.reader.read();\n            this.didPeek = true;\n        }\n        return this.peeked;\n    }\n}\n/**\n * Does not support peek.\n*/\nclass NonPeekableTextBufferTokenizer {\n    constructor(textModel, bracketTokens) {\n        this.textModel = textModel;\n        this.bracketTokens = bracketTokens;\n        this.lineIdx = 0;\n        this.line = null;\n        this.lineCharOffset = 0;\n        this.lineTokens = null;\n        this.lineTokenOffset = 0;\n        /** Must be a zero line token. The end of the document cannot be peeked. */\n        this.peekedToken = null;\n        this.textBufferLineCount = textModel.getLineCount();\n        this.textBufferLastLineLength = textModel.getLineLength(this.textBufferLineCount);\n    }\n    setPosition(lineIdx, column) {\n        // We must not jump into a token!\n        if (lineIdx === this.lineIdx) {\n            this.lineCharOffset = column;\n            if (this.line !== null) {\n                this.lineTokenOffset = this.lineCharOffset === 0 ? 0 : this.lineTokens.findTokenIndexAtOffset(this.lineCharOffset);\n            }\n        }\n        else {\n            this.lineIdx = lineIdx;\n            this.lineCharOffset = column;\n            this.line = null;\n        }\n        this.peekedToken = null;\n    }\n    read() {\n        if (this.peekedToken) {\n            const token = this.peekedToken;\n            this.peekedToken = null;\n            this.lineCharOffset += lengthGetColumnCountIfZeroLineCount(token.length);\n            return token;\n        }\n        if (this.lineIdx > this.textBufferLineCount - 1 || (this.lineIdx === this.textBufferLineCount - 1 && this.lineCharOffset >= this.textBufferLastLineLength)) {\n            // We are after the end\n            return null;\n        }\n        if (this.line === null) {\n            this.lineTokens = this.textModel.tokenization.getLineTokens(this.lineIdx + 1);\n            this.line = this.lineTokens.getLineContent();\n            this.lineTokenOffset = this.lineCharOffset === 0 ? 0 : this.lineTokens.findTokenIndexAtOffset(this.lineCharOffset);\n        }\n        const startLineIdx = this.lineIdx;\n        const startLineCharOffset = this.lineCharOffset;\n        // limits the length of text tokens.\n        // If text tokens get too long, incremental updates will be slow\n        let lengthHeuristic = 0;\n        while (true) {\n            const lineTokens = this.lineTokens;\n            const tokenCount = lineTokens.getCount();\n            let peekedBracketToken = null;\n            if (this.lineTokenOffset < tokenCount) {\n                const tokenMetadata = lineTokens.getMetadata(this.lineTokenOffset);\n                while (this.lineTokenOffset + 1 < tokenCount && tokenMetadata === lineTokens.getMetadata(this.lineTokenOffset + 1)) {\n                    // Skip tokens that are identical.\n                    // Sometimes, (bracket) identifiers are split up into multiple tokens.\n                    this.lineTokenOffset++;\n                }\n                const isOther = TokenMetadata.getTokenType(tokenMetadata) === 0 /* StandardTokenType.Other */;\n                const containsBracketType = TokenMetadata.containsBalancedBrackets(tokenMetadata);\n                const endOffset = lineTokens.getEndOffset(this.lineTokenOffset);\n                // Is there a bracket token next? Only consume text.\n                if (containsBracketType && isOther && this.lineCharOffset < endOffset) {\n                    const languageId = lineTokens.getLanguageId(this.lineTokenOffset);\n                    const text = this.line.substring(this.lineCharOffset, endOffset);\n                    const brackets = this.bracketTokens.getSingleLanguageBracketTokens(languageId);\n                    const regexp = brackets.regExpGlobal;\n                    if (regexp) {\n                        regexp.lastIndex = 0;\n                        const match = regexp.exec(text);\n                        if (match) {\n                            peekedBracketToken = brackets.getToken(match[0]);\n                            if (peekedBracketToken) {\n                                // Consume leading text of the token\n                                this.lineCharOffset += match.index;\n                            }\n                        }\n                    }\n                }\n                lengthHeuristic += endOffset - this.lineCharOffset;\n                if (peekedBracketToken) {\n                    // Don't skip the entire token, as a single token could contain multiple brackets.\n                    if (startLineIdx !== this.lineIdx || startLineCharOffset !== this.lineCharOffset) {\n                        // There is text before the bracket\n                        this.peekedToken = peekedBracketToken;\n                        break;\n                    }\n                    else {\n                        // Consume the peeked token\n                        this.lineCharOffset += lengthGetColumnCountIfZeroLineCount(peekedBracketToken.length);\n                        return peekedBracketToken;\n                    }\n                }\n                else {\n                    // Skip the entire token, as the token contains no brackets at all.\n                    this.lineTokenOffset++;\n                    this.lineCharOffset = endOffset;\n                }\n            }\n            else {\n                if (this.lineIdx === this.textBufferLineCount - 1) {\n                    break;\n                }\n                this.lineIdx++;\n                this.lineTokens = this.textModel.tokenization.getLineTokens(this.lineIdx + 1);\n                this.lineTokenOffset = 0;\n                this.line = this.lineTokens.getLineContent();\n                this.lineCharOffset = 0;\n                lengthHeuristic += 33; // max 1000/33 = 30 lines\n                // This limits the amount of work to recompute min-indentation\n                if (lengthHeuristic > 1000) {\n                    // only break (automatically) at the end of line.\n                    break;\n                }\n            }\n            if (lengthHeuristic > 1500) {\n                // Eventually break regardless of the line length so that\n                // very long lines do not cause bad performance.\n                // This effective limits max indentation to 500, as\n                // indentation is not computed across multiple text nodes.\n                break;\n            }\n        }\n        // If a token contains some proper indentation, it also contains \\n{INDENTATION+}(?!{INDENTATION}),\n        // unless the line is too long.\n        // Thus, the min indentation of the document is the minimum min indentation of every text node.\n        const length = lengthDiff(startLineIdx, startLineCharOffset, this.lineIdx, this.lineCharOffset);\n        return new Token(length, 0 /* TokenKind.Text */, -1, SmallImmutableSet.getEmpty(), new TextAstNode(length));\n    }\n}\nclass FastTokenizer {\n    constructor(text, brackets) {\n        this.text = text;\n        this._offset = lengthZero;\n        this.idx = 0;\n        const regExpStr = brackets.getRegExpStr();\n        const regexp = regExpStr ? new RegExp(regExpStr + '|\\n', 'gi') : null;\n        const tokens = [];\n        let match;\n        let curLineCount = 0;\n        let lastLineBreakOffset = 0;\n        let lastTokenEndOffset = 0;\n        let lastTokenEndLine = 0;\n        const smallTextTokens0Line = [];\n        for (let i = 0; i < 60; i++) {\n            smallTextTokens0Line.push(new Token(toLength(0, i), 0 /* TokenKind.Text */, -1, SmallImmutableSet.getEmpty(), new TextAstNode(toLength(0, i))));\n        }\n        const smallTextTokens1Line = [];\n        for (let i = 0; i < 60; i++) {\n            smallTextTokens1Line.push(new Token(toLength(1, i), 0 /* TokenKind.Text */, -1, SmallImmutableSet.getEmpty(), new TextAstNode(toLength(1, i))));\n        }\n        if (regexp) {\n            regexp.lastIndex = 0;\n            // If a token contains indentation, it also contains \\n{INDENTATION+}(?!{INDENTATION})\n            while ((match = regexp.exec(text)) !== null) {\n                const curOffset = match.index;\n                const value = match[0];\n                if (value === '\\n') {\n                    curLineCount++;\n                    lastLineBreakOffset = curOffset + 1;\n                }\n                else {\n                    if (lastTokenEndOffset !== curOffset) {\n                        let token;\n                        if (lastTokenEndLine === curLineCount) {\n                            const colCount = curOffset - lastTokenEndOffset;\n                            if (colCount < smallTextTokens0Line.length) {\n                                token = smallTextTokens0Line[colCount];\n                            }\n                            else {\n                                const length = toLength(0, colCount);\n                                token = new Token(length, 0 /* TokenKind.Text */, -1, SmallImmutableSet.getEmpty(), new TextAstNode(length));\n                            }\n                        }\n                        else {\n                            const lineCount = curLineCount - lastTokenEndLine;\n                            const colCount = curOffset - lastLineBreakOffset;\n                            if (lineCount === 1 && colCount < smallTextTokens1Line.length) {\n                                token = smallTextTokens1Line[colCount];\n                            }\n                            else {\n                                const length = toLength(lineCount, colCount);\n                                token = new Token(length, 0 /* TokenKind.Text */, -1, SmallImmutableSet.getEmpty(), new TextAstNode(length));\n                            }\n                        }\n                        tokens.push(token);\n                    }\n                    // value is matched by regexp, so the token must exist\n                    tokens.push(brackets.getToken(value));\n                    lastTokenEndOffset = curOffset + value.length;\n                    lastTokenEndLine = curLineCount;\n                }\n            }\n        }\n        const offset = text.length;\n        if (lastTokenEndOffset !== offset) {\n            const length = (lastTokenEndLine === curLineCount)\n                ? toLength(0, offset - lastTokenEndOffset)\n                : toLength(curLineCount - lastTokenEndLine, offset - lastLineBreakOffset);\n            tokens.push(new Token(length, 0 /* TokenKind.Text */, -1, SmallImmutableSet.getEmpty(), new TextAstNode(length)));\n        }\n        this.length = toLength(curLineCount, offset - lastLineBreakOffset);\n        this.tokens = tokens;\n    }\n    get offset() {\n        return this._offset;\n    }\n    read() {\n        return this.tokens[this.idx++] || null;\n    }\n    peek() {\n        return this.tokens[this.idx] || null;\n    }\n    skip(length) {\n        throw new NotSupportedError();\n    }\n}\n\nexport { FastTokenizer, TextBufferTokenizer, Token };\n","import { escapeRegExpCharacters } from '../../../../../base/common/strings.js';\nimport { BracketAstNode } from './ast.js';\nimport { toLength } from './length.js';\nimport { SmallImmutableSet, identityKeyProvider } from './smallImmutableSet.js';\nimport { Token } from './tokenizer.js';\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 *--------------------------------------------------------------------------------------------*/\nclass BracketTokens {\n    static createFromLanguage(configuration, denseKeyProvider) {\n        function getId(bracketInfo) {\n            return denseKeyProvider.getKey(`${bracketInfo.languageId}:::${bracketInfo.bracketText}`);\n        }\n        const map = new Map();\n        for (const openingBracket of configuration.bracketsNew.openingBrackets) {\n            const length = toLength(0, openingBracket.bracketText.length);\n            const openingTextId = getId(openingBracket);\n            const bracketIds = SmallImmutableSet.getEmpty().add(openingTextId, identityKeyProvider);\n            map.set(openingBracket.bracketText, new Token(length, 1 /* TokenKind.OpeningBracket */, openingTextId, bracketIds, BracketAstNode.create(length, openingBracket, bracketIds)));\n        }\n        for (const closingBracket of configuration.bracketsNew.closingBrackets) {\n            const length = toLength(0, closingBracket.bracketText.length);\n            let bracketIds = SmallImmutableSet.getEmpty();\n            const closingBrackets = closingBracket.getOpeningBrackets();\n            for (const bracket of closingBrackets) {\n                bracketIds = bracketIds.add(getId(bracket), identityKeyProvider);\n            }\n            map.set(closingBracket.bracketText, new Token(length, 2 /* TokenKind.ClosingBracket */, getId(closingBrackets[0]), bracketIds, BracketAstNode.create(length, closingBracket, bracketIds)));\n        }\n        return new BracketTokens(map);\n    }\n    constructor(map) {\n        this.map = map;\n        this.hasRegExp = false;\n        this._regExpGlobal = null;\n    }\n    getRegExpStr() {\n        if (this.isEmpty) {\n            return null;\n        }\n        else {\n            const keys = [...this.map.keys()];\n            keys.sort();\n            keys.reverse();\n            return keys.map(k => prepareBracketForRegExp(k)).join('|');\n        }\n    }\n    /**\n     * Returns null if there is no such regexp (because there are no brackets).\n    */\n    get regExpGlobal() {\n        if (!this.hasRegExp) {\n            const regExpStr = this.getRegExpStr();\n            this._regExpGlobal = regExpStr ? new RegExp(regExpStr, 'gi') : null;\n            this.hasRegExp = true;\n        }\n        return this._regExpGlobal;\n    }\n    getToken(value) {\n        return this.map.get(value.toLowerCase());\n    }\n    findClosingTokenText(openingBracketIds) {\n        for (const [closingText, info] of this.map) {\n            if (info.kind === 2 /* TokenKind.ClosingBracket */ && info.bracketIds.intersects(openingBracketIds)) {\n                return closingText;\n            }\n        }\n        return undefined;\n    }\n    get isEmpty() {\n        return this.map.size === 0;\n    }\n}\nfunction prepareBracketForRegExp(str) {\n    let escaped = escapeRegExpCharacters(str);\n    // These bracket pair delimiters start or end with letters\n    // see https://github.com/microsoft/vscode/issues/132162 https://github.com/microsoft/vscode/issues/150440\n    if (/^[\\w ]+/.test(str)) {\n        escaped = `\\\\b${escaped}`;\n    }\n    if (/[\\w ]+$/.test(str)) {\n        escaped = `${escaped}\\\\b`;\n    }\n    return escaped;\n}\nclass LanguageAgnosticBracketTokens {\n    constructor(denseKeyProvider, getLanguageConfiguration) {\n        this.denseKeyProvider = denseKeyProvider;\n        this.getLanguageConfiguration = getLanguageConfiguration;\n        this.languageIdToBracketTokens = new Map();\n    }\n    didLanguageChange(languageId) {\n        // Report a change whenever the language configuration updates.\n        return this.languageIdToBracketTokens.has(languageId);\n    }\n    getSingleLanguageBracketTokens(languageId) {\n        let singleLanguageBracketTokens = this.languageIdToBracketTokens.get(languageId);\n        if (!singleLanguageBracketTokens) {\n            singleLanguageBracketTokens = BracketTokens.createFromLanguage(this.getLanguageConfiguration(languageId), this.denseKeyProvider);\n            this.languageIdToBracketTokens.set(languageId, singleLanguageBracketTokens);\n        }\n        return singleLanguageBracketTokens;\n    }\n}\n\nexport { BracketTokens, LanguageAgnosticBracketTokens };\n","import { ListAstNode } from './ast.js';\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/**\n * Concatenates a list of (2,3) AstNode's into a single (2,3) AstNode.\n * This mutates the items of the input array!\n * If all items have the same height, this method has runtime O(items.length).\n * Otherwise, it has runtime O(items.length * max(log(items.length), items.max(i => i.height))).\n*/\nfunction concat23Trees(items) {\n    if (items.length === 0) {\n        return null;\n    }\n    if (items.length === 1) {\n        return items[0];\n    }\n    let i = 0;\n    /**\n     * Reads nodes of same height and concatenates them to a single node.\n    */\n    function readNode() {\n        if (i >= items.length) {\n            return null;\n        }\n        const start = i;\n        const height = items[start].listHeight;\n        i++;\n        while (i < items.length && items[i].listHeight === height) {\n            i++;\n        }\n        if (i - start >= 2) {\n            return concat23TreesOfSameHeight(start === 0 && i === items.length ? items : items.slice(start, i), false);\n        }\n        else {\n            return items[start];\n        }\n    }\n    // The items might not have the same height.\n    // We merge all items by using a binary concat operator.\n    let first = readNode(); // There must be a first item\n    let second = readNode();\n    if (!second) {\n        return first;\n    }\n    for (let item = readNode(); item; item = readNode()) {\n        // Prefer concatenating smaller trees, as the runtime of concat depends on the tree height.\n        if (heightDiff(first, second) <= heightDiff(second, item)) {\n            first = concat(first, second);\n            second = item;\n        }\n        else {\n            second = concat(second, item);\n        }\n    }\n    const result = concat(first, second);\n    return result;\n}\nfunction concat23TreesOfSameHeight(items, createImmutableLists = false) {\n    if (items.length === 0) {\n        return null;\n    }\n    if (items.length === 1) {\n        return items[0];\n    }\n    let length = items.length;\n    // All trees have same height, just create parent nodes.\n    while (length > 3) {\n        const newLength = length >> 1;\n        for (let i = 0; i < newLength; i++) {\n            const j = i << 1;\n            items[i] = ListAstNode.create23(items[j], items[j + 1], j + 3 === length ? items[j + 2] : null, createImmutableLists);\n        }\n        length = newLength;\n    }\n    return ListAstNode.create23(items[0], items[1], length >= 3 ? items[2] : null, createImmutableLists);\n}\nfunction heightDiff(node1, node2) {\n    return Math.abs(node1.listHeight - node2.listHeight);\n}\nfunction concat(node1, node2) {\n    if (node1.listHeight === node2.listHeight) {\n        return ListAstNode.create23(node1, node2, null, false);\n    }\n    else if (node1.listHeight > node2.listHeight) {\n        // node1 is the tree we want to insert into\n        return append(node1, node2);\n    }\n    else {\n        return prepend(node2, node1);\n    }\n}\n/**\n * Appends the given node to the end of this (2,3) tree.\n * Returns the new root.\n*/\nfunction append(list, nodeToAppend) {\n    list = list.toMutable();\n    let curNode = list;\n    const parents = [];\n    let nodeToAppendOfCorrectHeight;\n    while (true) {\n        // assert nodeToInsert.listHeight <= curNode.listHeight\n        if (nodeToAppend.listHeight === curNode.listHeight) {\n            nodeToAppendOfCorrectHeight = nodeToAppend;\n            break;\n        }\n        // assert 0 <= nodeToInsert.listHeight < curNode.listHeight\n        if (curNode.kind !== 4 /* AstNodeKind.List */) {\n            throw new Error('unexpected');\n        }\n        parents.push(curNode);\n        // assert 2 <= curNode.childrenLength <= 3\n        curNode = curNode.makeLastElementMutable();\n    }\n    // assert nodeToAppendOfCorrectHeight!.listHeight === curNode.listHeight\n    for (let i = parents.length - 1; i >= 0; i--) {\n        const parent = parents[i];\n        if (nodeToAppendOfCorrectHeight) {\n            // Can we take the element?\n            if (parent.childrenLength >= 3) {\n                // assert parent.childrenLength === 3 && parent.listHeight === nodeToAppendOfCorrectHeight.listHeight + 1\n                // we need to split to maintain (2,3)-tree property.\n                // Send the third element + the new element to the parent.\n                nodeToAppendOfCorrectHeight = ListAstNode.create23(parent.unappendChild(), nodeToAppendOfCorrectHeight, null, false);\n            }\n            else {\n                parent.appendChildOfSameHeight(nodeToAppendOfCorrectHeight);\n                nodeToAppendOfCorrectHeight = undefined;\n            }\n        }\n        else {\n            parent.handleChildrenChanged();\n        }\n    }\n    if (nodeToAppendOfCorrectHeight) {\n        return ListAstNode.create23(list, nodeToAppendOfCorrectHeight, null, false);\n    }\n    else {\n        return list;\n    }\n}\n/**\n * Prepends the given node to the end of this (2,3) tree.\n * Returns the new root.\n*/\nfunction prepend(list, nodeToAppend) {\n    list = list.toMutable();\n    let curNode = list;\n    const parents = [];\n    // assert nodeToInsert.listHeight <= curNode.listHeight\n    while (nodeToAppend.listHeight !== curNode.listHeight) {\n        // assert 0 <= nodeToInsert.listHeight < curNode.listHeight\n        if (curNode.kind !== 4 /* AstNodeKind.List */) {\n            throw new Error('unexpected');\n        }\n        parents.push(curNode);\n        // assert 2 <= curNode.childrenFast.length <= 3\n        curNode = curNode.makeFirstElementMutable();\n    }\n    let nodeToPrependOfCorrectHeight = nodeToAppend;\n    // assert nodeToAppendOfCorrectHeight!.listHeight === curNode.listHeight\n    for (let i = parents.length - 1; i >= 0; i--) {\n        const parent = parents[i];\n        if (nodeToPrependOfCorrectHeight) {\n            // Can we take the element?\n            if (parent.childrenLength >= 3) {\n                // assert parent.childrenLength === 3 && parent.listHeight === nodeToAppendOfCorrectHeight.listHeight + 1\n                // we need to split to maintain (2,3)-tree property.\n                // Send the third element + the new element to the parent.\n                nodeToPrependOfCorrectHeight = ListAstNode.create23(nodeToPrependOfCorrectHeight, parent.unprependChild(), null, false);\n            }\n            else {\n                parent.prependChildOfSameHeight(nodeToPrependOfCorrectHeight);\n                nodeToPrependOfCorrectHeight = undefined;\n            }\n        }\n        else {\n            parent.handleChildrenChanged();\n        }\n    }\n    if (nodeToPrependOfCorrectHeight) {\n        return ListAstNode.create23(nodeToPrependOfCorrectHeight, list, null, false);\n    }\n    else {\n        return list;\n    }\n}\n\nexport { concat23Trees, concat23TreesOfSameHeight };\n","import { lengthZero, lengthLessThan, lengthAdd } from './length.js';\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/**\n * Allows to efficiently find a longest child at a given offset in a fixed node.\n * The requested offsets must increase monotonously.\n*/\nclass NodeReader {\n    constructor(node) {\n        this.lastOffset = lengthZero;\n        this.nextNodes = [node];\n        this.offsets = [lengthZero];\n        this.idxs = [];\n    }\n    /**\n     * Returns the longest node at `offset` that satisfies the predicate.\n     * @param offset must be greater than or equal to the last offset this method has been called with!\n    */\n    readLongestNodeAt(offset, predicate) {\n        if (lengthLessThan(offset, this.lastOffset)) {\n            throw new Error('Invalid offset');\n        }\n        this.lastOffset = offset;\n        // Find the longest node of all those that are closest to the current offset.\n        while (true) {\n            const curNode = lastOrUndefined(this.nextNodes);\n            if (!curNode) {\n                return undefined;\n            }\n            const curNodeOffset = lastOrUndefined(this.offsets);\n            if (lengthLessThan(offset, curNodeOffset)) {\n                // The next best node is not here yet.\n                // The reader must advance before a cached node is hit.\n                return undefined;\n            }\n            if (lengthLessThan(curNodeOffset, offset)) {\n                // The reader is ahead of the current node.\n                if (lengthAdd(curNodeOffset, curNode.length) <= offset) {\n                    // The reader is after the end of the current node.\n                    this.nextNodeAfterCurrent();\n                }\n                else {\n                    // The reader is somewhere in the current node.\n                    const nextChildIdx = getNextChildIdx(curNode);\n                    if (nextChildIdx !== -1) {\n                        // Go to the first child and repeat.\n                        this.nextNodes.push(curNode.getChild(nextChildIdx));\n                        this.offsets.push(curNodeOffset);\n                        this.idxs.push(nextChildIdx);\n                    }\n                    else {\n                        // We don't have children\n                        this.nextNodeAfterCurrent();\n                    }\n                }\n            }\n            else {\n                // readerOffsetBeforeChange === curNodeOffset\n                if (predicate(curNode)) {\n                    this.nextNodeAfterCurrent();\n                    return curNode;\n                }\n                else {\n                    const nextChildIdx = getNextChildIdx(curNode);\n                    // look for shorter node\n                    if (nextChildIdx === -1) {\n                        // There is no shorter node.\n                        this.nextNodeAfterCurrent();\n                        return undefined;\n                    }\n                    else {\n                        // Descend into first child & repeat.\n                        this.nextNodes.push(curNode.getChild(nextChildIdx));\n                        this.offsets.push(curNodeOffset);\n                        this.idxs.push(nextChildIdx);\n                    }\n                }\n            }\n        }\n    }\n    // Navigates to the longest node that continues after the current node.\n    nextNodeAfterCurrent() {\n        while (true) {\n            const currentOffset = lastOrUndefined(this.offsets);\n            const currentNode = lastOrUndefined(this.nextNodes);\n            this.nextNodes.pop();\n            this.offsets.pop();\n            if (this.idxs.length === 0) {\n                // We just popped the root node, there is no next node.\n                break;\n            }\n            // Parent is not undefined, because idxs is not empty\n            const parent = lastOrUndefined(this.nextNodes);\n            const nextChildIdx = getNextChildIdx(parent, this.idxs[this.idxs.length - 1]);\n            if (nextChildIdx !== -1) {\n                this.nextNodes.push(parent.getChild(nextChildIdx));\n                this.offsets.push(lengthAdd(currentOffset, currentNode.length));\n                this.idxs[this.idxs.length - 1] = nextChildIdx;\n                break;\n            }\n            else {\n                this.idxs.pop();\n            }\n            // We fully consumed the parent.\n            // Current node is now parent, so call nextNodeAfterCurrent again\n        }\n    }\n}\nfunction getNextChildIdx(node, curIdx = -1) {\n    while (true) {\n        curIdx++;\n        if (curIdx >= node.childrenLength) {\n            return -1;\n        }\n        if (node.getChild(curIdx)) {\n            return curIdx;\n        }\n    }\n}\nfunction lastOrUndefined(arr) {\n    return arr.length > 0 ? arr[arr.length - 1] : undefined;\n}\n\nexport { NodeReader };\n","import { ListAstNode, TextAstNode, PairAstNode, InvalidBracketAstNode } from './ast.js';\nimport { BeforeEditPositionMapper } from './beforeEditPositionMapper.js';\nimport { SmallImmutableSet } from './smallImmutableSet.js';\nimport { lengthIsZero, lengthLessThan } from './length.js';\nimport { concat23Trees, concat23TreesOfSameHeight } from './concat23Trees.js';\nimport { NodeReader } from './nodeReader.js';\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/**\n * Non incrementally built ASTs are immutable.\n*/\nfunction parseDocument(tokenizer, edits, oldNode, createImmutableLists) {\n    const parser = new Parser(tokenizer, edits, oldNode, createImmutableLists);\n    return parser.parseDocument();\n}\n/**\n * Non incrementally built ASTs are immutable.\n*/\nclass Parser {\n    constructor(tokenizer, edits, oldNode, createImmutableLists) {\n        this.tokenizer = tokenizer;\n        this.createImmutableLists = createImmutableLists;\n        this._itemsConstructed = 0;\n        this._itemsFromCache = 0;\n        if (oldNode && createImmutableLists) {\n            throw new Error('Not supported');\n        }\n        this.oldNodeReader = oldNode ? new NodeReader(oldNode) : undefined;\n        this.positionMapper = new BeforeEditPositionMapper(edits);\n    }\n    parseDocument() {\n        this._itemsConstructed = 0;\n        this._itemsFromCache = 0;\n        let result = this.parseList(SmallImmutableSet.getEmpty(), 0);\n        if (!result) {\n            result = ListAstNode.getEmpty();\n        }\n        return result;\n    }\n    parseList(openedBracketIds, level) {\n        const items = [];\n        while (true) {\n            let child = this.tryReadChildFromCache(openedBracketIds);\n            if (!child) {\n                const token = this.tokenizer.peek();\n                if (!token ||\n                    (token.kind === 2 /* TokenKind.ClosingBracket */ &&\n                        token.bracketIds.intersects(openedBracketIds))) {\n                    break;\n                }\n                child = this.parseChild(openedBracketIds, level + 1);\n            }\n            if (child.kind === 4 /* AstNodeKind.List */ && child.childrenLength === 0) {\n                continue;\n            }\n            items.push(child);\n        }\n        // When there is no oldNodeReader, all items are created from scratch and must have the same height.\n        const result = this.oldNodeReader ? concat23Trees(items) : concat23TreesOfSameHeight(items, this.createImmutableLists);\n        return result;\n    }\n    tryReadChildFromCache(openedBracketIds) {\n        if (this.oldNodeReader) {\n            const maxCacheableLength = this.positionMapper.getDistanceToNextChange(this.tokenizer.offset);\n            if (maxCacheableLength === null || !lengthIsZero(maxCacheableLength)) {\n                const cachedNode = this.oldNodeReader.readLongestNodeAt(this.positionMapper.getOffsetBeforeChange(this.tokenizer.offset), curNode => {\n                    // The edit could extend the ending token, thus we cannot re-use nodes that touch the edit.\n                    // If there is no edit anymore, we can re-use the node in any case.\n                    if (maxCacheableLength !== null && !lengthLessThan(curNode.length, maxCacheableLength)) {\n                        // Either the node contains edited text or touches edited text.\n                        // In the latter case, brackets might have been extended (`end` -> `ending`), so even touching nodes cannot be reused.\n                        return false;\n                    }\n                    const canBeReused = curNode.canBeReused(openedBracketIds);\n                    return canBeReused;\n                });\n                if (cachedNode) {\n                    this._itemsFromCache++;\n                    this.tokenizer.skip(cachedNode.length);\n                    return cachedNode;\n                }\n            }\n        }\n        return undefined;\n    }\n    parseChild(openedBracketIds, level) {\n        this._itemsConstructed++;\n        const token = this.tokenizer.read();\n        switch (token.kind) {\n            case 2 /* TokenKind.ClosingBracket */:\n                return new InvalidBracketAstNode(token.bracketIds, token.length);\n            case 0 /* TokenKind.Text */:\n                return token.astNode;\n            case 1 /* TokenKind.OpeningBracket */: {\n                if (level > 300) {\n                    // To prevent stack overflows\n                    return new TextAstNode(token.length);\n                }\n                const set = openedBracketIds.merge(token.bracketIds);\n                const child = this.parseList(set, level + 1);\n                const nextToken = this.tokenizer.peek();\n                if (nextToken &&\n                    nextToken.kind === 2 /* TokenKind.ClosingBracket */ &&\n                    (nextToken.bracketId === token.bracketId || nextToken.bracketIds.intersects(token.bracketIds))) {\n                    this.tokenizer.read();\n                    return PairAstNode.create(token.astNode, child, nextToken.astNode);\n                }\n                else {\n                    return PairAstNode.create(token.astNode, child, null);\n                }\n            }\n            default:\n                throw new Error('unexpected');\n        }\n    }\n}\n\nexport { parseDocument };\n","import { ArrayQueue } from '../../../../../base/common/arrays.js';\nimport { TextEditInfo } from './beforeEditPositionMapper.js';\nimport { sumLengths, lengthAdd, lengthDiffNonNegative, lengthIsZero, lengthEquals, lengthZero, lengthToObj } from './length.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction combineTextEditInfos(textEditInfoFirst, textEditInfoSecond) {\n    if (textEditInfoFirst.length === 0) {\n        return textEditInfoSecond;\n    }\n    if (textEditInfoSecond.length === 0) {\n        return textEditInfoFirst;\n    }\n    // s0: State before any edits\n    const s0ToS1Map = new ArrayQueue(toLengthMapping(textEditInfoFirst));\n    // s1: State after first edit, but before second edit\n    const s1ToS2Map = toLengthMapping(textEditInfoSecond);\n    s1ToS2Map.push({ modified: false, lengthBefore: undefined, lengthAfter: undefined }); // Copy everything from old to new\n    // s2: State after both edits\n    let curItem = s0ToS1Map.dequeue();\n    /**\n     * @param s1Length Use undefined for length \"infinity\"\n     */\n    function nextS0ToS1MapWithS1LengthOf(s1Length) {\n        if (s1Length === undefined) {\n            const arr = s0ToS1Map.takeWhile(v => true) || [];\n            if (curItem) {\n                arr.unshift(curItem);\n            }\n            return arr;\n        }\n        const result = [];\n        while (curItem && !lengthIsZero(s1Length)) {\n            const [item, remainingItem] = curItem.splitAt(s1Length);\n            result.push(item);\n            s1Length = lengthDiffNonNegative(item.lengthAfter, s1Length);\n            curItem = remainingItem ?? s0ToS1Map.dequeue();\n        }\n        if (!lengthIsZero(s1Length)) {\n            result.push(new LengthMapping(false, s1Length, s1Length));\n        }\n        return result;\n    }\n    const result = [];\n    function pushEdit(startOffset, endOffset, newLength) {\n        if (result.length > 0 && lengthEquals(result[result.length - 1].endOffset, startOffset)) {\n            const lastResult = result[result.length - 1];\n            result[result.length - 1] = new TextEditInfo(lastResult.startOffset, endOffset, lengthAdd(lastResult.newLength, newLength));\n        }\n        else {\n            result.push({ startOffset, endOffset, newLength });\n        }\n    }\n    let s0offset = lengthZero;\n    for (const s1ToS2 of s1ToS2Map) {\n        const s0ToS1Map = nextS0ToS1MapWithS1LengthOf(s1ToS2.lengthBefore);\n        if (s1ToS2.modified) {\n            const s0Length = sumLengths(s0ToS1Map, s => s.lengthBefore);\n            const s0EndOffset = lengthAdd(s0offset, s0Length);\n            pushEdit(s0offset, s0EndOffset, s1ToS2.lengthAfter);\n            s0offset = s0EndOffset;\n        }\n        else {\n            for (const s1 of s0ToS1Map) {\n                const s0startOffset = s0offset;\n                s0offset = lengthAdd(s0offset, s1.lengthBefore);\n                if (s1.modified) {\n                    pushEdit(s0startOffset, s0offset, s1.lengthAfter);\n                }\n            }\n        }\n    }\n    return result;\n}\nclass LengthMapping {\n    constructor(\n    /**\n     * If false, length before and length after equal.\n     */\n    modified, lengthBefore, lengthAfter) {\n        this.modified = modified;\n        this.lengthBefore = lengthBefore;\n        this.lengthAfter = lengthAfter;\n    }\n    splitAt(lengthAfter) {\n        const remainingLengthAfter = lengthDiffNonNegative(lengthAfter, this.lengthAfter);\n        if (lengthEquals(remainingLengthAfter, lengthZero)) {\n            return [this, undefined];\n        }\n        else if (this.modified) {\n            return [\n                new LengthMapping(this.modified, this.lengthBefore, lengthAfter),\n                new LengthMapping(this.modified, lengthZero, remainingLengthAfter)\n            ];\n        }\n        else {\n            return [\n                new LengthMapping(this.modified, lengthAfter, lengthAfter),\n                new LengthMapping(this.modified, remainingLengthAfter, remainingLengthAfter)\n            ];\n        }\n    }\n    toString() {\n        return `${this.modified ? 'M' : 'U'}:${lengthToObj(this.lengthBefore)} -> ${lengthToObj(this.lengthAfter)}`;\n    }\n}\nfunction toLengthMapping(textEditInfos) {\n    const result = [];\n    let lastOffset = lengthZero;\n    for (const textEditInfo of textEditInfos) {\n        const spaceLength = lengthDiffNonNegative(lastOffset, textEditInfo.startOffset);\n        if (!lengthIsZero(spaceLength)) {\n            result.push(new LengthMapping(false, spaceLength, spaceLength));\n        }\n        const lengthBefore = lengthDiffNonNegative(textEditInfo.startOffset, textEditInfo.endOffset);\n        result.push(new LengthMapping(true, lengthBefore, textEditInfo.newLength));\n        lastOffset = textEditInfo.endOffset;\n    }\n    return result;\n}\n\nexport { combineTextEditInfos };\n","import { Emitter } from '../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport { BracketInfo, BracketPairWithMinIndentationInfo } from '../../../textModelBracketPairs.js';\nimport { TextEditInfo } from './beforeEditPositionMapper.js';\nimport { LanguageAgnosticBracketTokens } from './brackets.js';\nimport { toLength, lengthZero, positionToLength, lengthsToRange, lengthAdd, lengthLessThanEqual, lengthGreaterThanEqual, lengthLessThan } from './length.js';\nimport { parseDocument } from './parser.js';\nimport { DenseKeyProvider } from './smallImmutableSet.js';\nimport { FastTokenizer, TextBufferTokenizer } from './tokenizer.js';\nimport { CallbackIterable } from '../../../../../base/common/arrays.js';\nimport { combineTextEditInfos } from './combineTextEditInfos.js';\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 *--------------------------------------------------------------------------------------------*/\nclass BracketPairsTree extends Disposable {\n    didLanguageChange(languageId) {\n        return this.brackets.didLanguageChange(languageId);\n    }\n    constructor(textModel, getLanguageConfiguration) {\n        super();\n        this.textModel = textModel;\n        this.getLanguageConfiguration = getLanguageConfiguration;\n        this.didChangeEmitter = new Emitter();\n        this.denseKeyProvider = new DenseKeyProvider();\n        this.brackets = new LanguageAgnosticBracketTokens(this.denseKeyProvider, this.getLanguageConfiguration);\n        this.onDidChange = this.didChangeEmitter.event;\n        this.queuedTextEditsForInitialAstWithoutTokens = [];\n        this.queuedTextEdits = [];\n        if (!textModel.tokenization.hasTokens) {\n            const brackets = this.brackets.getSingleLanguageBracketTokens(this.textModel.getLanguageId());\n            const tokenizer = new FastTokenizer(this.textModel.getValue(), brackets);\n            this.initialAstWithoutTokens = parseDocument(tokenizer, [], undefined, true);\n            this.astWithTokens = this.initialAstWithoutTokens;\n        }\n        else if (textModel.tokenization.backgroundTokenizationState === 2 /* BackgroundTokenizationState.Completed */) {\n            // Skip the initial ast, as there is no flickering.\n            // Directly create the tree with token information.\n            this.initialAstWithoutTokens = undefined;\n            this.astWithTokens = this.parseDocumentFromTextBuffer([], undefined, false);\n        }\n        else {\n            // We missed some token changes already, so we cannot use the fast tokenizer + delta increments\n            this.initialAstWithoutTokens = this.parseDocumentFromTextBuffer([], undefined, true);\n            this.astWithTokens = this.initialAstWithoutTokens;\n        }\n    }\n    //#region TextModel events\n    handleDidChangeBackgroundTokenizationState() {\n        if (this.textModel.tokenization.backgroundTokenizationState === 2 /* BackgroundTokenizationState.Completed */) {\n            const wasUndefined = this.initialAstWithoutTokens === undefined;\n            // Clear the initial tree as we can use the tree with token information now.\n            this.initialAstWithoutTokens = undefined;\n            if (!wasUndefined) {\n                this.didChangeEmitter.fire();\n            }\n        }\n    }\n    handleDidChangeTokens({ ranges }) {\n        const edits = ranges.map(r => new TextEditInfo(toLength(r.fromLineNumber - 1, 0), toLength(r.toLineNumber, 0), toLength(r.toLineNumber - r.fromLineNumber + 1, 0)));\n        this.handleEdits(edits, true);\n        if (!this.initialAstWithoutTokens) {\n            this.didChangeEmitter.fire();\n        }\n    }\n    handleContentChanged(change) {\n        const edits = TextEditInfo.fromModelContentChanges(change.changes);\n        this.handleEdits(edits, false);\n    }\n    handleEdits(edits, tokenChange) {\n        // Lazily queue the edits and only apply them when the tree is accessed.\n        const result = combineTextEditInfos(this.queuedTextEdits, edits);\n        this.queuedTextEdits = result;\n        if (this.initialAstWithoutTokens && !tokenChange) {\n            this.queuedTextEditsForInitialAstWithoutTokens = combineTextEditInfos(this.queuedTextEditsForInitialAstWithoutTokens, edits);\n        }\n    }\n    //#endregion\n    flushQueue() {\n        if (this.queuedTextEdits.length > 0) {\n            this.astWithTokens = this.parseDocumentFromTextBuffer(this.queuedTextEdits, this.astWithTokens, false);\n            this.queuedTextEdits = [];\n        }\n        if (this.queuedTextEditsForInitialAstWithoutTokens.length > 0) {\n            if (this.initialAstWithoutTokens) {\n                this.initialAstWithoutTokens = this.parseDocumentFromTextBuffer(this.queuedTextEditsForInitialAstWithoutTokens, this.initialAstWithoutTokens, false);\n            }\n            this.queuedTextEditsForInitialAstWithoutTokens = [];\n        }\n    }\n    /**\n     * @pure (only if isPure = true)\n    */\n    parseDocumentFromTextBuffer(edits, previousAst, immutable) {\n        const previousAstClone = previousAst;\n        const tokenizer = new TextBufferTokenizer(this.textModel, this.brackets);\n        const result = parseDocument(tokenizer, edits, previousAstClone, immutable);\n        return result;\n    }\n    getBracketsInRange(range, onlyColorizedBrackets) {\n        this.flushQueue();\n        const startOffset = toLength(range.startLineNumber - 1, range.startColumn - 1);\n        const endOffset = toLength(range.endLineNumber - 1, range.endColumn - 1);\n        return new CallbackIterable(cb => {\n            const node = this.initialAstWithoutTokens || this.astWithTokens;\n            collectBrackets(node, lengthZero, node.length, startOffset, endOffset, cb, 0, 0, new Map(), onlyColorizedBrackets);\n        });\n    }\n    getBracketPairsInRange(range, includeMinIndentation) {\n        this.flushQueue();\n        const startLength = positionToLength(range.getStartPosition());\n        const endLength = positionToLength(range.getEndPosition());\n        return new CallbackIterable(cb => {\n            const node = this.initialAstWithoutTokens || this.astWithTokens;\n            const context = new CollectBracketPairsContext(cb, includeMinIndentation, this.textModel);\n            collectBracketPairs(node, lengthZero, node.length, startLength, endLength, context, 0, new Map());\n        });\n    }\n    getFirstBracketAfter(position) {\n        this.flushQueue();\n        const node = this.initialAstWithoutTokens || this.astWithTokens;\n        return getFirstBracketAfter(node, lengthZero, node.length, positionToLength(position));\n    }\n    getFirstBracketBefore(position) {\n        this.flushQueue();\n        const node = this.initialAstWithoutTokens || this.astWithTokens;\n        return getFirstBracketBefore(node, lengthZero, node.length, positionToLength(position));\n    }\n}\nfunction getFirstBracketBefore(node, nodeOffsetStart, nodeOffsetEnd, position) {\n    if (node.kind === 4 /* AstNodeKind.List */ || node.kind === 2 /* AstNodeKind.Pair */) {\n        const lengths = [];\n        for (const child of node.children) {\n            nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length);\n            lengths.push({ nodeOffsetStart, nodeOffsetEnd });\n            nodeOffsetStart = nodeOffsetEnd;\n        }\n        for (let i = lengths.length - 1; i >= 0; i--) {\n            const { nodeOffsetStart, nodeOffsetEnd } = lengths[i];\n            if (lengthLessThan(nodeOffsetStart, position)) {\n                const result = getFirstBracketBefore(node.children[i], nodeOffsetStart, nodeOffsetEnd, position);\n                if (result) {\n                    return result;\n                }\n            }\n        }\n        return null;\n    }\n    else if (node.kind === 3 /* AstNodeKind.UnexpectedClosingBracket */) {\n        return null;\n    }\n    else if (node.kind === 1 /* AstNodeKind.Bracket */) {\n        const range = lengthsToRange(nodeOffsetStart, nodeOffsetEnd);\n        return {\n            bracketInfo: node.bracketInfo,\n            range\n        };\n    }\n    return null;\n}\nfunction getFirstBracketAfter(node, nodeOffsetStart, nodeOffsetEnd, position) {\n    if (node.kind === 4 /* AstNodeKind.List */ || node.kind === 2 /* AstNodeKind.Pair */) {\n        for (const child of node.children) {\n            nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length);\n            if (lengthLessThan(position, nodeOffsetEnd)) {\n                const result = getFirstBracketAfter(child, nodeOffsetStart, nodeOffsetEnd, position);\n                if (result) {\n                    return result;\n                }\n            }\n            nodeOffsetStart = nodeOffsetEnd;\n        }\n        return null;\n    }\n    else if (node.kind === 3 /* AstNodeKind.UnexpectedClosingBracket */) {\n        return null;\n    }\n    else if (node.kind === 1 /* AstNodeKind.Bracket */) {\n        const range = lengthsToRange(nodeOffsetStart, nodeOffsetEnd);\n        return {\n            bracketInfo: node.bracketInfo,\n            range\n        };\n    }\n    return null;\n}\nfunction collectBrackets(node, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, push, level, nestingLevelOfEqualBracketType, levelPerBracketType, onlyColorizedBrackets, parentPairIsIncomplete = false) {\n    if (level > 200) {\n        return true;\n    }\n    whileLoop: while (true) {\n        switch (node.kind) {\n            case 4 /* AstNodeKind.List */: {\n                const childCount = node.childrenLength;\n                for (let i = 0; i < childCount; i++) {\n                    const child = node.getChild(i);\n                    if (!child) {\n                        continue;\n                    }\n                    nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length);\n                    if (lengthLessThanEqual(nodeOffsetStart, endOffset) &&\n                        lengthGreaterThanEqual(nodeOffsetEnd, startOffset)) {\n                        const childEndsAfterEnd = lengthGreaterThanEqual(nodeOffsetEnd, endOffset);\n                        if (childEndsAfterEnd) {\n                            // No child after this child in the requested window, don't recurse\n                            node = child;\n                            continue whileLoop;\n                        }\n                        const shouldContinue = collectBrackets(child, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, push, level, 0, levelPerBracketType, onlyColorizedBrackets);\n                        if (!shouldContinue) {\n                            return false;\n                        }\n                    }\n                    nodeOffsetStart = nodeOffsetEnd;\n                }\n                return true;\n            }\n            case 2 /* AstNodeKind.Pair */: {\n                const colorize = !onlyColorizedBrackets || !node.closingBracket || node.closingBracket.bracketInfo.closesColorized(node.openingBracket.bracketInfo);\n                let levelPerBracket = 0;\n                if (levelPerBracketType) {\n                    let existing = levelPerBracketType.get(node.openingBracket.text);\n                    if (existing === undefined) {\n                        existing = 0;\n                    }\n                    levelPerBracket = existing;\n                    if (colorize) {\n                        existing++;\n                        levelPerBracketType.set(node.openingBracket.text, existing);\n                    }\n                }\n                const childCount = node.childrenLength;\n                for (let i = 0; i < childCount; i++) {\n                    const child = node.getChild(i);\n                    if (!child) {\n                        continue;\n                    }\n                    nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length);\n                    if (lengthLessThanEqual(nodeOffsetStart, endOffset) &&\n                        lengthGreaterThanEqual(nodeOffsetEnd, startOffset)) {\n                        const childEndsAfterEnd = lengthGreaterThanEqual(nodeOffsetEnd, endOffset);\n                        if (childEndsAfterEnd && child.kind !== 1 /* AstNodeKind.Bracket */) {\n                            // No child after this child in the requested window, don't recurse\n                            // Don't do this for brackets because of unclosed/unopened brackets\n                            node = child;\n                            if (colorize) {\n                                level++;\n                                nestingLevelOfEqualBracketType = levelPerBracket + 1;\n                            }\n                            else {\n                                nestingLevelOfEqualBracketType = levelPerBracket;\n                            }\n                            continue whileLoop;\n                        }\n                        if (colorize || child.kind !== 1 /* AstNodeKind.Bracket */ || !node.closingBracket) {\n                            const shouldContinue = collectBrackets(child, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, push, colorize ? level + 1 : level, colorize ? levelPerBracket + 1 : levelPerBracket, levelPerBracketType, onlyColorizedBrackets, !node.closingBracket);\n                            if (!shouldContinue) {\n                                return false;\n                            }\n                        }\n                    }\n                    nodeOffsetStart = nodeOffsetEnd;\n                }\n                levelPerBracketType?.set(node.openingBracket.text, levelPerBracket);\n                return true;\n            }\n            case 3 /* AstNodeKind.UnexpectedClosingBracket */: {\n                const range = lengthsToRange(nodeOffsetStart, nodeOffsetEnd);\n                return push(new BracketInfo(range, level - 1, 0, true));\n            }\n            case 1 /* AstNodeKind.Bracket */: {\n                const range = lengthsToRange(nodeOffsetStart, nodeOffsetEnd);\n                return push(new BracketInfo(range, level - 1, nestingLevelOfEqualBracketType - 1, parentPairIsIncomplete));\n            }\n            case 0 /* AstNodeKind.Text */:\n                return true;\n        }\n    }\n}\nclass CollectBracketPairsContext {\n    constructor(push, includeMinIndentation, textModel) {\n        this.push = push;\n        this.includeMinIndentation = includeMinIndentation;\n        this.textModel = textModel;\n    }\n}\nfunction collectBracketPairs(node, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, context, level, levelPerBracketType) {\n    if (level > 200) {\n        return true;\n    }\n    let shouldContinue = true;\n    if (node.kind === 2 /* AstNodeKind.Pair */) {\n        let levelPerBracket = 0;\n        if (levelPerBracketType) {\n            let existing = levelPerBracketType.get(node.openingBracket.text);\n            if (existing === undefined) {\n                existing = 0;\n            }\n            levelPerBracket = existing;\n            existing++;\n            levelPerBracketType.set(node.openingBracket.text, existing);\n        }\n        const openingBracketEnd = lengthAdd(nodeOffsetStart, node.openingBracket.length);\n        let minIndentation = -1;\n        if (context.includeMinIndentation) {\n            minIndentation = node.computeMinIndentation(nodeOffsetStart, context.textModel);\n        }\n        shouldContinue = context.push(new BracketPairWithMinIndentationInfo(lengthsToRange(nodeOffsetStart, nodeOffsetEnd), lengthsToRange(nodeOffsetStart, openingBracketEnd), node.closingBracket\n            ? lengthsToRange(lengthAdd(openingBracketEnd, node.child?.length || lengthZero), nodeOffsetEnd)\n            : undefined, level, levelPerBracket, node, minIndentation));\n        nodeOffsetStart = openingBracketEnd;\n        if (shouldContinue && node.child) {\n            const child = node.child;\n            nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length);\n            if (lengthLessThanEqual(nodeOffsetStart, endOffset) &&\n                lengthGreaterThanEqual(nodeOffsetEnd, startOffset)) {\n                shouldContinue = collectBracketPairs(child, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, context, level + 1, levelPerBracketType);\n                if (!shouldContinue) {\n                    return false;\n                }\n            }\n        }\n        levelPerBracketType?.set(node.openingBracket.text, levelPerBracket);\n    }\n    else {\n        let curOffset = nodeOffsetStart;\n        for (const child of node.children) {\n            const childOffset = curOffset;\n            curOffset = lengthAdd(curOffset, child.length);\n            if (lengthLessThanEqual(childOffset, endOffset) &&\n                lengthLessThanEqual(startOffset, curOffset)) {\n                shouldContinue = collectBracketPairs(child, childOffset, curOffset, startOffset, endOffset, context, level, levelPerBracketType);\n                if (!shouldContinue) {\n                    return false;\n                }\n            }\n        }\n    }\n    return shouldContinue;\n}\n\nexport { BracketPairsTree };\n","import { CallbackIterable, compareBy } from '../../../../base/common/arrays.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { Disposable, MutableDisposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { Range } from '../../core/range.js';\nimport { ignoreBracketsInToken } from '../../languages/supports.js';\nimport { BracketsUtils } from '../../languages/supports/richEditBrackets.js';\nimport { BracketPairsTree } from './bracketPairsTree/bracketPairsTree.js';\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 *--------------------------------------------------------------------------------------------*/\nclass BracketPairsTextModelPart extends Disposable {\n    get canBuildAST() {\n        const maxSupportedDocumentLength = /* max lines */ 50_000 * /* average column count */ 100;\n        return this.textModel.getValueLength() <= maxSupportedDocumentLength;\n    }\n    constructor(textModel, languageConfigurationService) {\n        super();\n        this.textModel = textModel;\n        this.languageConfigurationService = languageConfigurationService;\n        this.bracketPairsTree = this._register(new MutableDisposable());\n        this.onDidChangeEmitter = new Emitter();\n        this.onDidChange = this.onDidChangeEmitter.event;\n        this.bracketsRequested = false;\n    }\n    //#region TextModel events\n    handleLanguageConfigurationServiceChange(e) {\n        if (!e.languageId || this.bracketPairsTree.value?.object.didLanguageChange(e.languageId)) {\n            this.bracketPairsTree.clear();\n            this.updateBracketPairsTree();\n        }\n    }\n    handleDidChangeOptions(e) {\n        this.bracketPairsTree.clear();\n        this.updateBracketPairsTree();\n    }\n    handleDidChangeLanguage(e) {\n        this.bracketPairsTree.clear();\n        this.updateBracketPairsTree();\n    }\n    handleDidChangeContent(change) {\n        this.bracketPairsTree.value?.object.handleContentChanged(change);\n    }\n    handleDidChangeBackgroundTokenizationState() {\n        this.bracketPairsTree.value?.object.handleDidChangeBackgroundTokenizationState();\n    }\n    handleDidChangeTokens(e) {\n        this.bracketPairsTree.value?.object.handleDidChangeTokens(e);\n    }\n    //#endregion\n    updateBracketPairsTree() {\n        if (this.bracketsRequested && this.canBuildAST) {\n            if (!this.bracketPairsTree.value) {\n                const store = new DisposableStore();\n                this.bracketPairsTree.value = createDisposableRef(store.add(new BracketPairsTree(this.textModel, (languageId) => {\n                    return this.languageConfigurationService.getLanguageConfiguration(languageId);\n                })), store);\n                store.add(this.bracketPairsTree.value.object.onDidChange(e => this.onDidChangeEmitter.fire(e)));\n                this.onDidChangeEmitter.fire();\n            }\n        }\n        else {\n            if (this.bracketPairsTree.value) {\n                this.bracketPairsTree.clear();\n                // Important: Don't call fire if there was no change!\n                this.onDidChangeEmitter.fire();\n            }\n        }\n    }\n    /**\n     * Returns all bracket pairs that intersect the given range.\n     * The result is sorted by the start position.\n    */\n    getBracketPairsInRange(range) {\n        this.bracketsRequested = true;\n        this.updateBracketPairsTree();\n        return this.bracketPairsTree.value?.object.getBracketPairsInRange(range, false) || CallbackIterable.empty;\n    }\n    getBracketPairsInRangeWithMinIndentation(range) {\n        this.bracketsRequested = true;\n        this.updateBracketPairsTree();\n        return this.bracketPairsTree.value?.object.getBracketPairsInRange(range, true) || CallbackIterable.empty;\n    }\n    getBracketsInRange(range, onlyColorizedBrackets = false) {\n        this.bracketsRequested = true;\n        this.updateBracketPairsTree();\n        return this.bracketPairsTree.value?.object.getBracketsInRange(range, onlyColorizedBrackets) || CallbackIterable.empty;\n    }\n    findMatchingBracketUp(_bracket, _position, maxDuration) {\n        const position = this.textModel.validatePosition(_position);\n        const languageId = this.textModel.getLanguageIdAtPosition(position.lineNumber, position.column);\n        if (this.canBuildAST) {\n            const closingBracketInfo = this.languageConfigurationService\n                .getLanguageConfiguration(languageId)\n                .bracketsNew.getClosingBracketInfo(_bracket);\n            if (!closingBracketInfo) {\n                return null;\n            }\n            const bracketPair = this.getBracketPairsInRange(Range.fromPositions(_position, _position)).findLast((b) => closingBracketInfo.closes(b.openingBracketInfo));\n            if (bracketPair) {\n                return bracketPair.openingBracketRange;\n            }\n            return null;\n        }\n        else {\n            // Fallback to old bracket matching code:\n            const bracket = _bracket.toLowerCase();\n            const bracketsSupport = this.languageConfigurationService.getLanguageConfiguration(languageId).brackets;\n            if (!bracketsSupport) {\n                return null;\n            }\n            const data = bracketsSupport.textIsBracket[bracket];\n            if (!data) {\n                return null;\n            }\n            return stripBracketSearchCanceled(this._findMatchingBracketUp(data, position, createTimeBasedContinueBracketSearchPredicate(maxDuration)));\n        }\n    }\n    matchBracket(position, maxDuration) {\n        if (this.canBuildAST) {\n            const bracketPair = this.getBracketPairsInRange(Range.fromPositions(position, position)).filter((item) => item.closingBracketRange !== undefined &&\n                (item.openingBracketRange.containsPosition(position) ||\n                    item.closingBracketRange.containsPosition(position))).findLastMaxBy(compareBy((item) => item.openingBracketRange.containsPosition(position)\n                ? item.openingBracketRange\n                : item.closingBracketRange, Range.compareRangesUsingStarts));\n            if (bracketPair) {\n                return [bracketPair.openingBracketRange, bracketPair.closingBracketRange];\n            }\n            return null;\n        }\n        else {\n            // Fallback to old bracket matching code:\n            const continueSearchPredicate = createTimeBasedContinueBracketSearchPredicate(maxDuration);\n            return this._matchBracket(this.textModel.validatePosition(position), continueSearchPredicate);\n        }\n    }\n    _establishBracketSearchOffsets(position, lineTokens, modeBrackets, tokenIndex) {\n        const tokenCount = lineTokens.getCount();\n        const currentLanguageId = lineTokens.getLanguageId(tokenIndex);\n        // limit search to not go before `maxBracketLength`\n        let searchStartOffset = Math.max(0, position.column - 1 - modeBrackets.maxBracketLength);\n        for (let i = tokenIndex - 1; i >= 0; i--) {\n            const tokenEndOffset = lineTokens.getEndOffset(i);\n            if (tokenEndOffset <= searchStartOffset) {\n                break;\n            }\n            if (ignoreBracketsInToken(lineTokens.getStandardTokenType(i)) || lineTokens.getLanguageId(i) !== currentLanguageId) {\n                searchStartOffset = tokenEndOffset;\n                break;\n            }\n        }\n        // limit search to not go after `maxBracketLength`\n        let searchEndOffset = Math.min(lineTokens.getLineContent().length, position.column - 1 + modeBrackets.maxBracketLength);\n        for (let i = tokenIndex + 1; i < tokenCount; i++) {\n            const tokenStartOffset = lineTokens.getStartOffset(i);\n            if (tokenStartOffset >= searchEndOffset) {\n                break;\n            }\n            if (ignoreBracketsInToken(lineTokens.getStandardTokenType(i)) || lineTokens.getLanguageId(i) !== currentLanguageId) {\n                searchEndOffset = tokenStartOffset;\n                break;\n            }\n        }\n        return { searchStartOffset, searchEndOffset };\n    }\n    _matchBracket(position, continueSearchPredicate) {\n        const lineNumber = position.lineNumber;\n        const lineTokens = this.textModel.tokenization.getLineTokens(lineNumber);\n        const lineText = this.textModel.getLineContent(lineNumber);\n        const tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1);\n        if (tokenIndex < 0) {\n            return null;\n        }\n        const currentModeBrackets = this.languageConfigurationService.getLanguageConfiguration(lineTokens.getLanguageId(tokenIndex)).brackets;\n        // check that the token is not to be ignored\n        if (currentModeBrackets && !ignoreBracketsInToken(lineTokens.getStandardTokenType(tokenIndex))) {\n            let { searchStartOffset, searchEndOffset } = this._establishBracketSearchOffsets(position, lineTokens, currentModeBrackets, tokenIndex);\n            // it might be the case that [currentTokenStart -> currentTokenEnd] contains multiple brackets\n            // `bestResult` will contain the most right-side result\n            let bestResult = null;\n            while (true) {\n                const foundBracket = BracketsUtils.findNextBracketInRange(currentModeBrackets.forwardRegex, lineNumber, lineText, searchStartOffset, searchEndOffset);\n                if (!foundBracket) {\n                    // there are no more brackets in this text\n                    break;\n                }\n                // check that we didn't hit a bracket too far away from position\n                if (foundBracket.startColumn <= position.column && position.column <= foundBracket.endColumn) {\n                    const foundBracketText = lineText.substring(foundBracket.startColumn - 1, foundBracket.endColumn - 1).toLowerCase();\n                    const r = this._matchFoundBracket(foundBracket, currentModeBrackets.textIsBracket[foundBracketText], currentModeBrackets.textIsOpenBracket[foundBracketText], continueSearchPredicate);\n                    if (r) {\n                        if (r instanceof BracketSearchCanceled) {\n                            return null;\n                        }\n                        bestResult = r;\n                    }\n                }\n                searchStartOffset = foundBracket.endColumn - 1;\n            }\n            if (bestResult) {\n                return bestResult;\n            }\n        }\n        // If position is in between two tokens, try also looking in the previous token\n        if (tokenIndex > 0 && lineTokens.getStartOffset(tokenIndex) === position.column - 1) {\n            const prevTokenIndex = tokenIndex - 1;\n            const prevModeBrackets = this.languageConfigurationService.getLanguageConfiguration(lineTokens.getLanguageId(prevTokenIndex)).brackets;\n            // check that previous token is not to be ignored\n            if (prevModeBrackets && !ignoreBracketsInToken(lineTokens.getStandardTokenType(prevTokenIndex))) {\n                const { searchStartOffset, searchEndOffset } = this._establishBracketSearchOffsets(position, lineTokens, prevModeBrackets, prevTokenIndex);\n                const foundBracket = BracketsUtils.findPrevBracketInRange(prevModeBrackets.reversedRegex, lineNumber, lineText, searchStartOffset, searchEndOffset);\n                // check that we didn't hit a bracket too far away from position\n                if (foundBracket && foundBracket.startColumn <= position.column && position.column <= foundBracket.endColumn) {\n                    const foundBracketText = lineText.substring(foundBracket.startColumn - 1, foundBracket.endColumn - 1).toLowerCase();\n                    const r = this._matchFoundBracket(foundBracket, prevModeBrackets.textIsBracket[foundBracketText], prevModeBrackets.textIsOpenBracket[foundBracketText], continueSearchPredicate);\n                    if (r) {\n                        if (r instanceof BracketSearchCanceled) {\n                            return null;\n                        }\n                        return r;\n                    }\n                }\n            }\n        }\n        return null;\n    }\n    _matchFoundBracket(foundBracket, data, isOpen, continueSearchPredicate) {\n        if (!data) {\n            return null;\n        }\n        const matched = (isOpen\n            ? this._findMatchingBracketDown(data, foundBracket.getEndPosition(), continueSearchPredicate)\n            : this._findMatchingBracketUp(data, foundBracket.getStartPosition(), continueSearchPredicate));\n        if (!matched) {\n            return null;\n        }\n        if (matched instanceof BracketSearchCanceled) {\n            return matched;\n        }\n        return [foundBracket, matched];\n    }\n    _findMatchingBracketUp(bracket, position, continueSearchPredicate) {\n        // console.log('_findMatchingBracketUp: ', 'bracket: ', JSON.stringify(bracket), 'startPosition: ', String(position));\n        const languageId = bracket.languageId;\n        const reversedBracketRegex = bracket.reversedRegex;\n        let count = -1;\n        let totalCallCount = 0;\n        const searchPrevMatchingBracketInRange = (lineNumber, lineText, searchStartOffset, searchEndOffset) => {\n            while (true) {\n                if (continueSearchPredicate && (++totalCallCount) % 100 === 0 && !continueSearchPredicate()) {\n                    return BracketSearchCanceled.INSTANCE;\n                }\n                const r = BracketsUtils.findPrevBracketInRange(reversedBracketRegex, lineNumber, lineText, searchStartOffset, searchEndOffset);\n                if (!r) {\n                    break;\n                }\n                const hitText = lineText.substring(r.startColumn - 1, r.endColumn - 1).toLowerCase();\n                if (bracket.isOpen(hitText)) {\n                    count++;\n                }\n                else if (bracket.isClose(hitText)) {\n                    count--;\n                }\n                if (count === 0) {\n                    return r;\n                }\n                searchEndOffset = r.startColumn - 1;\n            }\n            return null;\n        };\n        for (let lineNumber = position.lineNumber; lineNumber >= 1; lineNumber--) {\n            const lineTokens = this.textModel.tokenization.getLineTokens(lineNumber);\n            const tokenCount = lineTokens.getCount();\n            const lineText = this.textModel.getLineContent(lineNumber);\n            let tokenIndex = tokenCount - 1;\n            let searchStartOffset = lineText.length;\n            let searchEndOffset = lineText.length;\n            if (lineNumber === position.lineNumber) {\n                tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1);\n                searchStartOffset = position.column - 1;\n                searchEndOffset = position.column - 1;\n            }\n            let prevSearchInToken = true;\n            for (; tokenIndex >= 0; tokenIndex--) {\n                const searchInToken = (lineTokens.getLanguageId(tokenIndex) === languageId && !ignoreBracketsInToken(lineTokens.getStandardTokenType(tokenIndex)));\n                if (searchInToken) {\n                    // this token should be searched\n                    if (prevSearchInToken) {\n                        // the previous token should be searched, simply extend searchStartOffset\n                        searchStartOffset = lineTokens.getStartOffset(tokenIndex);\n                    }\n                    else {\n                        // the previous token should not be searched\n                        searchStartOffset = lineTokens.getStartOffset(tokenIndex);\n                        searchEndOffset = lineTokens.getEndOffset(tokenIndex);\n                    }\n                }\n                else {\n                    // this token should not be searched\n                    if (prevSearchInToken && searchStartOffset !== searchEndOffset) {\n                        const r = searchPrevMatchingBracketInRange(lineNumber, lineText, searchStartOffset, searchEndOffset);\n                        if (r) {\n                            return r;\n                        }\n                    }\n                }\n                prevSearchInToken = searchInToken;\n            }\n            if (prevSearchInToken && searchStartOffset !== searchEndOffset) {\n                const r = searchPrevMatchingBracketInRange(lineNumber, lineText, searchStartOffset, searchEndOffset);\n                if (r) {\n                    return r;\n                }\n            }\n        }\n        return null;\n    }\n    _findMatchingBracketDown(bracket, position, continueSearchPredicate) {\n        // console.log('_findMatchingBracketDown: ', 'bracket: ', JSON.stringify(bracket), 'startPosition: ', String(position));\n        const languageId = bracket.languageId;\n        const bracketRegex = bracket.forwardRegex;\n        let count = 1;\n        let totalCallCount = 0;\n        const searchNextMatchingBracketInRange = (lineNumber, lineText, searchStartOffset, searchEndOffset) => {\n            while (true) {\n                if (continueSearchPredicate && (++totalCallCount) % 100 === 0 && !continueSearchPredicate()) {\n                    return BracketSearchCanceled.INSTANCE;\n                }\n                const r = BracketsUtils.findNextBracketInRange(bracketRegex, lineNumber, lineText, searchStartOffset, searchEndOffset);\n                if (!r) {\n                    break;\n                }\n                const hitText = lineText.substring(r.startColumn - 1, r.endColumn - 1).toLowerCase();\n                if (bracket.isOpen(hitText)) {\n                    count++;\n                }\n                else if (bracket.isClose(hitText)) {\n                    count--;\n                }\n                if (count === 0) {\n                    return r;\n                }\n                searchStartOffset = r.endColumn - 1;\n            }\n            return null;\n        };\n        const lineCount = this.textModel.getLineCount();\n        for (let lineNumber = position.lineNumber; lineNumber <= lineCount; lineNumber++) {\n            const lineTokens = this.textModel.tokenization.getLineTokens(lineNumber);\n            const tokenCount = lineTokens.getCount();\n            const lineText = this.textModel.getLineContent(lineNumber);\n            let tokenIndex = 0;\n            let searchStartOffset = 0;\n            let searchEndOffset = 0;\n            if (lineNumber === position.lineNumber) {\n                tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1);\n                searchStartOffset = position.column - 1;\n                searchEndOffset = position.column - 1;\n            }\n            let prevSearchInToken = true;\n            for (; tokenIndex < tokenCount; tokenIndex++) {\n                const searchInToken = (lineTokens.getLanguageId(tokenIndex) === languageId && !ignoreBracketsInToken(lineTokens.getStandardTokenType(tokenIndex)));\n                if (searchInToken) {\n                    // this token should be searched\n                    if (prevSearchInToken) {\n                        // the previous token should be searched, simply extend searchEndOffset\n                        searchEndOffset = lineTokens.getEndOffset(tokenIndex);\n                    }\n                    else {\n                        // the previous token should not be searched\n                        searchStartOffset = lineTokens.getStartOffset(tokenIndex);\n                        searchEndOffset = lineTokens.getEndOffset(tokenIndex);\n                    }\n                }\n                else {\n                    // this token should not be searched\n                    if (prevSearchInToken && searchStartOffset !== searchEndOffset) {\n                        const r = searchNextMatchingBracketInRange(lineNumber, lineText, searchStartOffset, searchEndOffset);\n                        if (r) {\n                            return r;\n                        }\n                    }\n                }\n                prevSearchInToken = searchInToken;\n            }\n            if (prevSearchInToken && searchStartOffset !== searchEndOffset) {\n                const r = searchNextMatchingBracketInRange(lineNumber, lineText, searchStartOffset, searchEndOffset);\n                if (r) {\n                    return r;\n                }\n            }\n        }\n        return null;\n    }\n    findPrevBracket(_position) {\n        const position = this.textModel.validatePosition(_position);\n        if (this.canBuildAST) {\n            this.bracketsRequested = true;\n            this.updateBracketPairsTree();\n            return this.bracketPairsTree.value?.object.getFirstBracketBefore(position) || null;\n        }\n        let languageId = null;\n        let modeBrackets = null;\n        let bracketConfig = null;\n        for (let lineNumber = position.lineNumber; lineNumber >= 1; lineNumber--) {\n            const lineTokens = this.textModel.tokenization.getLineTokens(lineNumber);\n            const tokenCount = lineTokens.getCount();\n            const lineText = this.textModel.getLineContent(lineNumber);\n            let tokenIndex = tokenCount - 1;\n            let searchStartOffset = lineText.length;\n            let searchEndOffset = lineText.length;\n            if (lineNumber === position.lineNumber) {\n                tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1);\n                searchStartOffset = position.column - 1;\n                searchEndOffset = position.column - 1;\n                const tokenLanguageId = lineTokens.getLanguageId(tokenIndex);\n                if (languageId !== tokenLanguageId) {\n                    languageId = tokenLanguageId;\n                    modeBrackets = this.languageConfigurationService.getLanguageConfiguration(languageId).brackets;\n                    bracketConfig = this.languageConfigurationService.getLanguageConfiguration(languageId).bracketsNew;\n                }\n            }\n            let prevSearchInToken = true;\n            for (; tokenIndex >= 0; tokenIndex--) {\n                const tokenLanguageId = lineTokens.getLanguageId(tokenIndex);\n                if (languageId !== tokenLanguageId) {\n                    // language id change!\n                    if (modeBrackets && bracketConfig && prevSearchInToken && searchStartOffset !== searchEndOffset) {\n                        const r = BracketsUtils.findPrevBracketInRange(modeBrackets.reversedRegex, lineNumber, lineText, searchStartOffset, searchEndOffset);\n                        if (r) {\n                            return this._toFoundBracket(bracketConfig, r);\n                        }\n                        prevSearchInToken = false;\n                    }\n                    languageId = tokenLanguageId;\n                    modeBrackets = this.languageConfigurationService.getLanguageConfiguration(languageId).brackets;\n                    bracketConfig = this.languageConfigurationService.getLanguageConfiguration(languageId).bracketsNew;\n                }\n                const searchInToken = (!!modeBrackets && !ignoreBracketsInToken(lineTokens.getStandardTokenType(tokenIndex)));\n                if (searchInToken) {\n                    // this token should be searched\n                    if (prevSearchInToken) {\n                        // the previous token should be searched, simply extend searchStartOffset\n                        searchStartOffset = lineTokens.getStartOffset(tokenIndex);\n                    }\n                    else {\n                        // the previous token should not be searched\n                        searchStartOffset = lineTokens.getStartOffset(tokenIndex);\n                        searchEndOffset = lineTokens.getEndOffset(tokenIndex);\n                    }\n                }\n                else {\n                    // this token should not be searched\n                    if (bracketConfig && modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) {\n                        const r = BracketsUtils.findPrevBracketInRange(modeBrackets.reversedRegex, lineNumber, lineText, searchStartOffset, searchEndOffset);\n                        if (r) {\n                            return this._toFoundBracket(bracketConfig, r);\n                        }\n                    }\n                }\n                prevSearchInToken = searchInToken;\n            }\n            if (bracketConfig && modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) {\n                const r = BracketsUtils.findPrevBracketInRange(modeBrackets.reversedRegex, lineNumber, lineText, searchStartOffset, searchEndOffset);\n                if (r) {\n                    return this._toFoundBracket(bracketConfig, r);\n                }\n            }\n        }\n        return null;\n    }\n    findNextBracket(_position) {\n        const position = this.textModel.validatePosition(_position);\n        if (this.canBuildAST) {\n            this.bracketsRequested = true;\n            this.updateBracketPairsTree();\n            return this.bracketPairsTree.value?.object.getFirstBracketAfter(position) || null;\n        }\n        const lineCount = this.textModel.getLineCount();\n        let languageId = null;\n        let modeBrackets = null;\n        let bracketConfig = null;\n        for (let lineNumber = position.lineNumber; lineNumber <= lineCount; lineNumber++) {\n            const lineTokens = this.textModel.tokenization.getLineTokens(lineNumber);\n            const tokenCount = lineTokens.getCount();\n            const lineText = this.textModel.getLineContent(lineNumber);\n            let tokenIndex = 0;\n            let searchStartOffset = 0;\n            let searchEndOffset = 0;\n            if (lineNumber === position.lineNumber) {\n                tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1);\n                searchStartOffset = position.column - 1;\n                searchEndOffset = position.column - 1;\n                const tokenLanguageId = lineTokens.getLanguageId(tokenIndex);\n                if (languageId !== tokenLanguageId) {\n                    languageId = tokenLanguageId;\n                    modeBrackets = this.languageConfigurationService.getLanguageConfiguration(languageId).brackets;\n                    bracketConfig = this.languageConfigurationService.getLanguageConfiguration(languageId).bracketsNew;\n                }\n            }\n            let prevSearchInToken = true;\n            for (; tokenIndex < tokenCount; tokenIndex++) {\n                const tokenLanguageId = lineTokens.getLanguageId(tokenIndex);\n                if (languageId !== tokenLanguageId) {\n                    // language id change!\n                    if (bracketConfig && modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) {\n                        const r = BracketsUtils.findNextBracketInRange(modeBrackets.forwardRegex, lineNumber, lineText, searchStartOffset, searchEndOffset);\n                        if (r) {\n                            return this._toFoundBracket(bracketConfig, r);\n                        }\n                        prevSearchInToken = false;\n                    }\n                    languageId = tokenLanguageId;\n                    modeBrackets = this.languageConfigurationService.getLanguageConfiguration(languageId).brackets;\n                    bracketConfig = this.languageConfigurationService.getLanguageConfiguration(languageId).bracketsNew;\n                }\n                const searchInToken = (!!modeBrackets && !ignoreBracketsInToken(lineTokens.getStandardTokenType(tokenIndex)));\n                if (searchInToken) {\n                    // this token should be searched\n                    if (prevSearchInToken) {\n                        // the previous token should be searched, simply extend searchEndOffset\n                        searchEndOffset = lineTokens.getEndOffset(tokenIndex);\n                    }\n                    else {\n                        // the previous token should not be searched\n                        searchStartOffset = lineTokens.getStartOffset(tokenIndex);\n                        searchEndOffset = lineTokens.getEndOffset(tokenIndex);\n                    }\n                }\n                else {\n                    // this token should not be searched\n                    if (bracketConfig && modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) {\n                        const r = BracketsUtils.findNextBracketInRange(modeBrackets.forwardRegex, lineNumber, lineText, searchStartOffset, searchEndOffset);\n                        if (r) {\n                            return this._toFoundBracket(bracketConfig, r);\n                        }\n                    }\n                }\n                prevSearchInToken = searchInToken;\n            }\n            if (bracketConfig && modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) {\n                const r = BracketsUtils.findNextBracketInRange(modeBrackets.forwardRegex, lineNumber, lineText, searchStartOffset, searchEndOffset);\n                if (r) {\n                    return this._toFoundBracket(bracketConfig, r);\n                }\n            }\n        }\n        return null;\n    }\n    findEnclosingBrackets(_position, maxDuration) {\n        const position = this.textModel.validatePosition(_position);\n        if (this.canBuildAST) {\n            const range = Range.fromPositions(position);\n            const bracketPair = this.getBracketPairsInRange(Range.fromPositions(position, position)).findLast((item) => item.closingBracketRange !== undefined && item.range.strictContainsRange(range));\n            if (bracketPair) {\n                return [bracketPair.openingBracketRange, bracketPair.closingBracketRange];\n            }\n            return null;\n        }\n        const continueSearchPredicate = createTimeBasedContinueBracketSearchPredicate(maxDuration);\n        const lineCount = this.textModel.getLineCount();\n        const savedCounts = new Map();\n        let counts = [];\n        const resetCounts = (languageId, modeBrackets) => {\n            if (!savedCounts.has(languageId)) {\n                const tmp = [];\n                for (let i = 0, len = modeBrackets ? modeBrackets.brackets.length : 0; i < len; i++) {\n                    tmp[i] = 0;\n                }\n                savedCounts.set(languageId, tmp);\n            }\n            counts = savedCounts.get(languageId);\n        };\n        let totalCallCount = 0;\n        const searchInRange = (modeBrackets, lineNumber, lineText, searchStartOffset, searchEndOffset) => {\n            while (true) {\n                if (continueSearchPredicate && (++totalCallCount) % 100 === 0 && !continueSearchPredicate()) {\n                    return BracketSearchCanceled.INSTANCE;\n                }\n                const r = BracketsUtils.findNextBracketInRange(modeBrackets.forwardRegex, lineNumber, lineText, searchStartOffset, searchEndOffset);\n                if (!r) {\n                    break;\n                }\n                const hitText = lineText.substring(r.startColumn - 1, r.endColumn - 1).toLowerCase();\n                const bracket = modeBrackets.textIsBracket[hitText];\n                if (bracket) {\n                    if (bracket.isOpen(hitText)) {\n                        counts[bracket.index]++;\n                    }\n                    else if (bracket.isClose(hitText)) {\n                        counts[bracket.index]--;\n                    }\n                    if (counts[bracket.index] === -1) {\n                        return this._matchFoundBracket(r, bracket, false, continueSearchPredicate);\n                    }\n                }\n                searchStartOffset = r.endColumn - 1;\n            }\n            return null;\n        };\n        let languageId = null;\n        let modeBrackets = null;\n        for (let lineNumber = position.lineNumber; lineNumber <= lineCount; lineNumber++) {\n            const lineTokens = this.textModel.tokenization.getLineTokens(lineNumber);\n            const tokenCount = lineTokens.getCount();\n            const lineText = this.textModel.getLineContent(lineNumber);\n            let tokenIndex = 0;\n            let searchStartOffset = 0;\n            let searchEndOffset = 0;\n            if (lineNumber === position.lineNumber) {\n                tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1);\n                searchStartOffset = position.column - 1;\n                searchEndOffset = position.column - 1;\n                const tokenLanguageId = lineTokens.getLanguageId(tokenIndex);\n                if (languageId !== tokenLanguageId) {\n                    languageId = tokenLanguageId;\n                    modeBrackets = this.languageConfigurationService.getLanguageConfiguration(languageId).brackets;\n                    resetCounts(languageId, modeBrackets);\n                }\n            }\n            let prevSearchInToken = true;\n            for (; tokenIndex < tokenCount; tokenIndex++) {\n                const tokenLanguageId = lineTokens.getLanguageId(tokenIndex);\n                if (languageId !== tokenLanguageId) {\n                    // language id change!\n                    if (modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) {\n                        const r = searchInRange(modeBrackets, lineNumber, lineText, searchStartOffset, searchEndOffset);\n                        if (r) {\n                            return stripBracketSearchCanceled(r);\n                        }\n                        prevSearchInToken = false;\n                    }\n                    languageId = tokenLanguageId;\n                    modeBrackets = this.languageConfigurationService.getLanguageConfiguration(languageId).brackets;\n                    resetCounts(languageId, modeBrackets);\n                }\n                const searchInToken = (!!modeBrackets && !ignoreBracketsInToken(lineTokens.getStandardTokenType(tokenIndex)));\n                if (searchInToken) {\n                    // this token should be searched\n                    if (prevSearchInToken) {\n                        // the previous token should be searched, simply extend searchEndOffset\n                        searchEndOffset = lineTokens.getEndOffset(tokenIndex);\n                    }\n                    else {\n                        // the previous token should not be searched\n                        searchStartOffset = lineTokens.getStartOffset(tokenIndex);\n                        searchEndOffset = lineTokens.getEndOffset(tokenIndex);\n                    }\n                }\n                else {\n                    // this token should not be searched\n                    if (modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) {\n                        const r = searchInRange(modeBrackets, lineNumber, lineText, searchStartOffset, searchEndOffset);\n                        if (r) {\n                            return stripBracketSearchCanceled(r);\n                        }\n                    }\n                }\n                prevSearchInToken = searchInToken;\n            }\n            if (modeBrackets && prevSearchInToken && searchStartOffset !== searchEndOffset) {\n                const r = searchInRange(modeBrackets, lineNumber, lineText, searchStartOffset, searchEndOffset);\n                if (r) {\n                    return stripBracketSearchCanceled(r);\n                }\n            }\n        }\n        return null;\n    }\n    _toFoundBracket(bracketConfig, r) {\n        if (!r) {\n            return null;\n        }\n        let text = this.textModel.getValueInRange(r);\n        text = text.toLowerCase();\n        const bracketInfo = bracketConfig.getBracketInfo(text);\n        if (!bracketInfo) {\n            return null;\n        }\n        return {\n            range: r,\n            bracketInfo\n        };\n    }\n}\nfunction createDisposableRef(object, disposable) {\n    return {\n        object,\n        dispose: () => disposable?.dispose(),\n    };\n}\nfunction createTimeBasedContinueBracketSearchPredicate(maxDuration) {\n    if (typeof maxDuration === 'undefined') {\n        return () => true;\n    }\n    else {\n        const startTime = Date.now();\n        return () => {\n            return (Date.now() - startTime <= maxDuration);\n        };\n    }\n}\nclass BracketSearchCanceled {\n    static { this.INSTANCE = new BracketSearchCanceled(); }\n    constructor() {\n        this._searchCanceledBrand = undefined;\n    }\n}\nfunction stripBracketSearchCanceled(result) {\n    if (result instanceof BracketSearchCanceled) {\n        return null;\n    }\n    return result;\n}\n\nexport { BracketPairsTextModelPart };\n","import { Emitter } from '../../../../base/common/event.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { Range } from '../../core/range.js';\nimport { editorBracketHighlightingUnexpectedBracketForeground, editorBracketHighlightingForeground1, editorBracketHighlightingForeground2, editorBracketHighlightingForeground3, editorBracketHighlightingForeground4, editorBracketHighlightingForeground5, editorBracketHighlightingForeground6 } from '../../core/editorColorRegistry.js';\nimport { registerThemingParticipant } from '../../../../platform/theme/common/themeService.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ColorizedBracketPairsDecorationProvider extends Disposable {\n    constructor(textModel) {\n        super();\n        this.textModel = textModel;\n        this.colorProvider = new ColorProvider();\n        this.onDidChangeEmitter = new Emitter();\n        this.onDidChange = this.onDidChangeEmitter.event;\n        this.colorizationOptions = textModel.getOptions().bracketPairColorizationOptions;\n        this._register(textModel.bracketPairs.onDidChange(e => {\n            this.onDidChangeEmitter.fire();\n        }));\n    }\n    //#region TextModel events\n    handleDidChangeOptions(e) {\n        this.colorizationOptions = this.textModel.getOptions().bracketPairColorizationOptions;\n    }\n    //#endregion\n    getDecorationsInRange(range, ownerId, filterOutValidation, onlyMinimapDecorations) {\n        if (onlyMinimapDecorations) {\n            // Bracket pair colorization decorations are not rendered in the minimap\n            return [];\n        }\n        if (ownerId === undefined) {\n            return [];\n        }\n        if (!this.colorizationOptions.enabled) {\n            return [];\n        }\n        const result = this.textModel.bracketPairs.getBracketsInRange(range, true).map(bracket => ({\n            id: `bracket${bracket.range.toString()}-${bracket.nestingLevel}`,\n            options: {\n                description: 'BracketPairColorization',\n                inlineClassName: this.colorProvider.getInlineClassName(bracket, this.colorizationOptions.independentColorPoolPerBracketType),\n            },\n            ownerId: 0,\n            range: bracket.range,\n        })).toArray();\n        return result;\n    }\n    getAllDecorations(ownerId, filterOutValidation) {\n        if (ownerId === undefined) {\n            return [];\n        }\n        if (!this.colorizationOptions.enabled) {\n            return [];\n        }\n        return this.getDecorationsInRange(new Range(1, 1, this.textModel.getLineCount(), 1), ownerId, filterOutValidation);\n    }\n}\nclass ColorProvider {\n    constructor() {\n        this.unexpectedClosingBracketClassName = 'unexpected-closing-bracket';\n    }\n    getInlineClassName(bracket, independentColorPoolPerBracketType) {\n        if (bracket.isInvalid) {\n            return this.unexpectedClosingBracketClassName;\n        }\n        return this.getInlineClassNameOfLevel(independentColorPoolPerBracketType ? bracket.nestingLevelOfEqualBracketType : bracket.nestingLevel);\n    }\n    getInlineClassNameOfLevel(level) {\n        // To support a dynamic amount of colors up to 6 colors,\n        // we use a number that is a lcm of all numbers from 1 to 6.\n        return `bracket-highlighting-${level % 30}`;\n    }\n}\nregisterThemingParticipant((theme, collector) => {\n    const colors = [\n        editorBracketHighlightingForeground1,\n        editorBracketHighlightingForeground2,\n        editorBracketHighlightingForeground3,\n        editorBracketHighlightingForeground4,\n        editorBracketHighlightingForeground5,\n        editorBracketHighlightingForeground6\n    ];\n    const colorProvider = new ColorProvider();\n    collector.addRule(`.monaco-editor .${colorProvider.unexpectedClosingBracketClassName} { color: ${theme.getColor(editorBracketHighlightingUnexpectedBracketForeground)}; }`);\n    const colorValues = colors\n        .map(c => theme.getColor(c))\n        .filter((c) => !!c)\n        .filter(c => !c.isTransparent());\n    for (let level = 0; level < 30; level++) {\n        const color = colorValues[level % colorValues.length];\n        collector.addRule(`.monaco-editor .${colorProvider.getInlineClassNameOfLevel(level)} { color: ${color}; }`);\n    }\n});\n\nexport { ColorizedBracketPairsDecorationProvider };\n","import { writeUInt32BE, writeUInt16LE, readUInt32BE } from '../../../base/common/buffer.js';\nimport { decodeUTF16LE } from './stringBuilder.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction escapeNewLine(str) {\n    return (str\n        .replace(/\\n/g, '\\\\n')\n        .replace(/\\r/g, '\\\\r'));\n}\nclass TextChange {\n    get oldLength() {\n        return this.oldText.length;\n    }\n    get oldEnd() {\n        return this.oldPosition + this.oldText.length;\n    }\n    get newLength() {\n        return this.newText.length;\n    }\n    get newEnd() {\n        return this.newPosition + this.newText.length;\n    }\n    constructor(oldPosition, oldText, newPosition, newText) {\n        this.oldPosition = oldPosition;\n        this.oldText = oldText;\n        this.newPosition = newPosition;\n        this.newText = newText;\n    }\n    toString() {\n        if (this.oldText.length === 0) {\n            return `(insert@${this.oldPosition} \"${escapeNewLine(this.newText)}\")`;\n        }\n        if (this.newText.length === 0) {\n            return `(delete@${this.oldPosition} \"${escapeNewLine(this.oldText)}\")`;\n        }\n        return `(replace@${this.oldPosition} \"${escapeNewLine(this.oldText)}\" with \"${escapeNewLine(this.newText)}\")`;\n    }\n    static _writeStringSize(str) {\n        return (4 + 2 * str.length);\n    }\n    static _writeString(b, str, offset) {\n        const len = str.length;\n        writeUInt32BE(b, len, offset);\n        offset += 4;\n        for (let i = 0; i < len; i++) {\n            writeUInt16LE(b, str.charCodeAt(i), offset);\n            offset += 2;\n        }\n        return offset;\n    }\n    static _readString(b, offset) {\n        const len = readUInt32BE(b, offset);\n        offset += 4;\n        return decodeUTF16LE(b, offset, len);\n    }\n    writeSize() {\n        return (4 // oldPosition\n            + 4 // newPosition\n            + TextChange._writeStringSize(this.oldText)\n            + TextChange._writeStringSize(this.newText));\n    }\n    write(b, offset) {\n        writeUInt32BE(b, this.oldPosition, offset);\n        offset += 4;\n        writeUInt32BE(b, this.newPosition, offset);\n        offset += 4;\n        offset = TextChange._writeString(b, this.oldText, offset);\n        offset = TextChange._writeString(b, this.newText, offset);\n        return offset;\n    }\n    static read(b, offset, dest) {\n        const oldPosition = readUInt32BE(b, offset);\n        offset += 4;\n        const newPosition = readUInt32BE(b, offset);\n        offset += 4;\n        const oldText = TextChange._readString(b, offset);\n        offset += TextChange._writeStringSize(oldText);\n        const newText = TextChange._readString(b, offset);\n        offset += TextChange._writeStringSize(newText);\n        dest.push(new TextChange(oldPosition, oldText, newPosition, newText));\n        return offset;\n    }\n}\nfunction compressConsecutiveTextChanges(prevEdits, currEdits) {\n    if (prevEdits === null || prevEdits.length === 0) {\n        return currEdits;\n    }\n    const compressor = new TextChangeCompressor(prevEdits, currEdits);\n    return compressor.compress();\n}\nclass TextChangeCompressor {\n    constructor(prevEdits, currEdits) {\n        this._prevEdits = prevEdits;\n        this._currEdits = currEdits;\n        this._result = [];\n        this._resultLen = 0;\n        this._prevLen = this._prevEdits.length;\n        this._prevDeltaOffset = 0;\n        this._currLen = this._currEdits.length;\n        this._currDeltaOffset = 0;\n    }\n    compress() {\n        let prevIndex = 0;\n        let currIndex = 0;\n        let prevEdit = this._getPrev(prevIndex);\n        let currEdit = this._getCurr(currIndex);\n        while (prevIndex < this._prevLen || currIndex < this._currLen) {\n            if (prevEdit === null) {\n                this._acceptCurr(currEdit);\n                currEdit = this._getCurr(++currIndex);\n                continue;\n            }\n            if (currEdit === null) {\n                this._acceptPrev(prevEdit);\n                prevEdit = this._getPrev(++prevIndex);\n                continue;\n            }\n            if (currEdit.oldEnd <= prevEdit.newPosition) {\n                this._acceptCurr(currEdit);\n                currEdit = this._getCurr(++currIndex);\n                continue;\n            }\n            if (prevEdit.newEnd <= currEdit.oldPosition) {\n                this._acceptPrev(prevEdit);\n                prevEdit = this._getPrev(++prevIndex);\n                continue;\n            }\n            if (currEdit.oldPosition < prevEdit.newPosition) {\n                const [e1, e2] = TextChangeCompressor._splitCurr(currEdit, prevEdit.newPosition - currEdit.oldPosition);\n                this._acceptCurr(e1);\n                currEdit = e2;\n                continue;\n            }\n            if (prevEdit.newPosition < currEdit.oldPosition) {\n                const [e1, e2] = TextChangeCompressor._splitPrev(prevEdit, currEdit.oldPosition - prevEdit.newPosition);\n                this._acceptPrev(e1);\n                prevEdit = e2;\n                continue;\n            }\n            // At this point, currEdit.oldPosition === prevEdit.newPosition\n            let mergePrev;\n            let mergeCurr;\n            if (currEdit.oldEnd === prevEdit.newEnd) {\n                mergePrev = prevEdit;\n                mergeCurr = currEdit;\n                prevEdit = this._getPrev(++prevIndex);\n                currEdit = this._getCurr(++currIndex);\n            }\n            else if (currEdit.oldEnd < prevEdit.newEnd) {\n                const [e1, e2] = TextChangeCompressor._splitPrev(prevEdit, currEdit.oldLength);\n                mergePrev = e1;\n                mergeCurr = currEdit;\n                prevEdit = e2;\n                currEdit = this._getCurr(++currIndex);\n            }\n            else {\n                const [e1, e2] = TextChangeCompressor._splitCurr(currEdit, prevEdit.newLength);\n                mergePrev = prevEdit;\n                mergeCurr = e1;\n                prevEdit = this._getPrev(++prevIndex);\n                currEdit = e2;\n            }\n            this._result[this._resultLen++] = new TextChange(mergePrev.oldPosition, mergePrev.oldText, mergeCurr.newPosition, mergeCurr.newText);\n            this._prevDeltaOffset += mergePrev.newLength - mergePrev.oldLength;\n            this._currDeltaOffset += mergeCurr.newLength - mergeCurr.oldLength;\n        }\n        const merged = TextChangeCompressor._merge(this._result);\n        const cleaned = TextChangeCompressor._removeNoOps(merged);\n        return cleaned;\n    }\n    _acceptCurr(currEdit) {\n        this._result[this._resultLen++] = TextChangeCompressor._rebaseCurr(this._prevDeltaOffset, currEdit);\n        this._currDeltaOffset += currEdit.newLength - currEdit.oldLength;\n    }\n    _getCurr(currIndex) {\n        return (currIndex < this._currLen ? this._currEdits[currIndex] : null);\n    }\n    _acceptPrev(prevEdit) {\n        this._result[this._resultLen++] = TextChangeCompressor._rebasePrev(this._currDeltaOffset, prevEdit);\n        this._prevDeltaOffset += prevEdit.newLength - prevEdit.oldLength;\n    }\n    _getPrev(prevIndex) {\n        return (prevIndex < this._prevLen ? this._prevEdits[prevIndex] : null);\n    }\n    static _rebaseCurr(prevDeltaOffset, currEdit) {\n        return new TextChange(currEdit.oldPosition - prevDeltaOffset, currEdit.oldText, currEdit.newPosition, currEdit.newText);\n    }\n    static _rebasePrev(currDeltaOffset, prevEdit) {\n        return new TextChange(prevEdit.oldPosition, prevEdit.oldText, prevEdit.newPosition + currDeltaOffset, prevEdit.newText);\n    }\n    static _splitPrev(edit, offset) {\n        const preText = edit.newText.substr(0, offset);\n        const postText = edit.newText.substr(offset);\n        return [\n            new TextChange(edit.oldPosition, edit.oldText, edit.newPosition, preText),\n            new TextChange(edit.oldEnd, '', edit.newPosition + offset, postText)\n        ];\n    }\n    static _splitCurr(edit, offset) {\n        const preText = edit.oldText.substr(0, offset);\n        const postText = edit.oldText.substr(offset);\n        return [\n            new TextChange(edit.oldPosition, preText, edit.newPosition, edit.newText),\n            new TextChange(edit.oldPosition + offset, postText, edit.newEnd, '')\n        ];\n    }\n    static _merge(edits) {\n        if (edits.length === 0) {\n            return edits;\n        }\n        const result = [];\n        let resultLen = 0;\n        let prev = edits[0];\n        for (let i = 1; i < edits.length; i++) {\n            const curr = edits[i];\n            if (prev.oldEnd === curr.oldPosition) {\n                // Merge into `prev`\n                prev = new TextChange(prev.oldPosition, prev.oldText + curr.oldText, prev.newPosition, prev.newText + curr.newText);\n            }\n            else {\n                result[resultLen++] = prev;\n                prev = curr;\n            }\n        }\n        result[resultLen++] = prev;\n        return result;\n    }\n    static _removeNoOps(edits) {\n        if (edits.length === 0) {\n            return edits;\n        }\n        const result = [];\n        let resultLen = 0;\n        for (let i = 0; i < edits.length; i++) {\n            const edit = edits[i];\n            if (edit.oldText === edit.newText) {\n                continue;\n            }\n            result[resultLen++] = edit;\n        }\n        return result;\n    }\n}\n\nexport { TextChange, compressConsecutiveTextChanges };\n","import { prefixedUuid } from '../../base/common/uuid.js';\nimport { TextLength } from './core/text/textLength.js';\n\nconst privateSymbol = Symbol('TextModelEditSource');\nclass TextModelEditSource {\n    constructor(metadata, _privateCtorGuard) {\n        this.metadata = metadata;\n    }\n    toString() {\n        return `${this.metadata.source}`;\n    }\n    getType() {\n        const metadata = this.metadata;\n        switch (metadata.source) {\n            case 'cursor':\n                return metadata.kind;\n            case 'inlineCompletionAccept':\n                return metadata.source + (metadata.$nes ? ':nes' : '');\n            case 'unknown':\n                return metadata.name || 'unknown';\n            default:\n                return metadata.source;\n        }\n    }\n    /**\n     * Converts the metadata to a key string.\n     * Only includes properties/values that have `level` many `$` prefixes or less.\n    */\n    toKey(level, filter = {}) {\n        const metadata = this.metadata;\n        const keys = Object.entries(metadata).filter(([key, value]) => {\n            const filterVal = filter[key];\n            if (filterVal !== undefined) {\n                return filterVal;\n            }\n            const prefixCount = (key.match(/\\$/g) || []).length;\n            return prefixCount <= level && value !== undefined && value !== null && value !== '';\n        }).map(([key, value]) => `${key}:${value}`);\n        return keys.join('-');\n    }\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction createEditSource(metadata) {\n    // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n    return new TextModelEditSource(metadata, privateSymbol);\n}\nconst EditSources = {\n    unknown(data) {\n        return createEditSource({\n            source: 'unknown',\n            name: data.name,\n        });\n    },\n    rename: () => createEditSource({ source: 'rename' }),\n    chatApplyEdits(data) {\n        return createEditSource({\n            source: 'Chat.applyEdits',\n            $modelId: avoidPathRedaction(data.modelId),\n            $extensionId: data.extensionId?.extensionId,\n            $extensionVersion: data.extensionId?.version,\n            $$languageId: data.languageId,\n            $$sessionId: data.sessionId,\n            $$requestId: data.requestId,\n            $$mode: data.mode,\n            $$codeBlockSuggestionId: data.codeBlockSuggestionId,\n        });\n    },\n    chatUndoEdits: () => createEditSource({ source: 'Chat.undoEdits' }),\n    chatReset: () => createEditSource({ source: 'Chat.reset' }),\n    inlineCompletionAccept(data) {\n        return createEditSource({\n            source: 'inlineCompletionAccept',\n            $nes: data.nes,\n            ...toProperties(data.providerId),\n            $$requestUuid: data.requestUuid,\n            $$languageId: data.languageId,\n        });\n    },\n    inlineCompletionPartialAccept(data) {\n        return createEditSource({\n            source: 'inlineCompletionPartialAccept',\n            type: data.type,\n            $nes: data.nes,\n            ...toProperties(data.providerId),\n            $$requestUuid: data.requestUuid,\n            $$languageId: data.languageId,\n        });\n    },\n    inlineChatApplyEdit(data) {\n        return createEditSource({\n            source: 'inlineChat.applyEdits',\n            $modelId: avoidPathRedaction(data.modelId),\n            $extensionId: data.extensionId?.extensionId,\n            $extensionVersion: data.extensionId?.version,\n            $$sessionId: data.sessionId,\n            $$requestId: data.requestId,\n            $$languageId: data.languageId,\n        });\n    },\n    reloadFromDisk: () => createEditSource({ source: 'reloadFromDisk' }),\n    cursor(data) {\n        return createEditSource({\n            source: 'cursor',\n            kind: data.kind,\n            detailedSource: data.detailedSource,\n        });\n    },\n    setValue: () => createEditSource({ source: 'setValue' }),\n    eolChange: () => createEditSource({ source: 'eolChange' }),\n    applyEdits: () => createEditSource({ source: 'applyEdits' }),\n    snippet: () => createEditSource({ source: 'snippet' }),\n    suggest: (data) => createEditSource({ source: 'suggest', ...toProperties(data.providerId) }),\n    codeAction: (data) => createEditSource({ source: 'codeAction', $kind: data.kind, ...toProperties(data.providerId) })\n};\nfunction toProperties(version) {\n    if (!version) {\n        return {};\n    }\n    return {\n        $extensionId: version.extensionId,\n        $extensionVersion: version.extensionVersion,\n        $providerId: version.providerId,\n    };\n}\nfunction avoidPathRedaction(str) {\n    if (str === undefined) {\n        return undefined;\n    }\n    // To avoid false-positive file path redaction.\n    return str.replaceAll('/', '|');\n}\nclass EditDeltaInfo {\n    static fromText(text) {\n        const linesAdded = TextLength.ofText(text).lineCount;\n        const charsAdded = text.length;\n        return new EditDeltaInfo(linesAdded, 0, charsAdded, 0);\n    }\n    static tryCreate(linesAdded, linesRemoved, charsAdded, charsRemoved) {\n        if (linesAdded === undefined || linesRemoved === undefined || charsAdded === undefined || charsRemoved === undefined) {\n            return undefined;\n        }\n        return new EditDeltaInfo(linesAdded, linesRemoved, charsAdded, charsRemoved);\n    }\n    constructor(linesAdded, linesRemoved, charsAdded, charsRemoved) {\n        this.linesAdded = linesAdded;\n        this.linesRemoved = linesRemoved;\n        this.charsAdded = charsAdded;\n        this.charsRemoved = charsRemoved;\n    }\n}\nvar EditSuggestionId;\n(function (EditSuggestionId) {\n    /**\n     * Use AiEditTelemetryServiceImpl to create a new id!\n    */\n    function newId(genPrefixedUuid) {\n        const id = genPrefixedUuid ? genPrefixedUuid('sgt') : prefixedUuid('sgt');\n        return toEditIdentity(id);\n    }\n    EditSuggestionId.newId = newId;\n})(EditSuggestionId || (EditSuggestionId = {}));\nfunction toEditIdentity(id) {\n    return id;\n}\n\nexport { EditDeltaInfo, EditSources, EditSuggestionId, TextModelEditSource };\n","import { localize } from '../../../nls.js';\nimport { onUnexpectedError } from '../../../base/common/errors.js';\nimport { Selection } from '../core/selection.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { compressConsecutiveTextChanges, TextChange } from '../core/textChange.js';\nimport { writeUInt32BE, readUInt32BE, writeUInt8, readUInt8 } from '../../../base/common/buffer.js';\nimport { basename } from '../../../base/common/resources.js';\nimport { EditSources } from '../textModelEditSource.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction uriGetComparisonKey(resource) {\n    return resource.toString();\n}\nclass SingleModelEditStackData {\n    static create(model, beforeCursorState) {\n        const alternativeVersionId = model.getAlternativeVersionId();\n        const eol = getModelEOL(model);\n        return new SingleModelEditStackData(alternativeVersionId, alternativeVersionId, eol, eol, beforeCursorState, beforeCursorState, []);\n    }\n    constructor(beforeVersionId, afterVersionId, beforeEOL, afterEOL, beforeCursorState, afterCursorState, changes) {\n        this.beforeVersionId = beforeVersionId;\n        this.afterVersionId = afterVersionId;\n        this.beforeEOL = beforeEOL;\n        this.afterEOL = afterEOL;\n        this.beforeCursorState = beforeCursorState;\n        this.afterCursorState = afterCursorState;\n        this.changes = changes;\n    }\n    append(model, textChanges, afterEOL, afterVersionId, afterCursorState) {\n        if (textChanges.length > 0) {\n            this.changes = compressConsecutiveTextChanges(this.changes, textChanges);\n        }\n        this.afterEOL = afterEOL;\n        this.afterVersionId = afterVersionId;\n        this.afterCursorState = afterCursorState;\n    }\n    static _writeSelectionsSize(selections) {\n        return 4 + 4 * 4 * (selections ? selections.length : 0);\n    }\n    static _writeSelections(b, selections, offset) {\n        writeUInt32BE(b, (selections ? selections.length : 0), offset);\n        offset += 4;\n        if (selections) {\n            for (const selection of selections) {\n                writeUInt32BE(b, selection.selectionStartLineNumber, offset);\n                offset += 4;\n                writeUInt32BE(b, selection.selectionStartColumn, offset);\n                offset += 4;\n                writeUInt32BE(b, selection.positionLineNumber, offset);\n                offset += 4;\n                writeUInt32BE(b, selection.positionColumn, offset);\n                offset += 4;\n            }\n        }\n        return offset;\n    }\n    static _readSelections(b, offset, dest) {\n        const count = readUInt32BE(b, offset);\n        offset += 4;\n        for (let i = 0; i < count; i++) {\n            const selectionStartLineNumber = readUInt32BE(b, offset);\n            offset += 4;\n            const selectionStartColumn = readUInt32BE(b, offset);\n            offset += 4;\n            const positionLineNumber = readUInt32BE(b, offset);\n            offset += 4;\n            const positionColumn = readUInt32BE(b, offset);\n            offset += 4;\n            dest.push(new Selection(selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn));\n        }\n        return offset;\n    }\n    serialize() {\n        let necessarySize = (4 // beforeVersionId\n            + 4 // afterVersionId\n            + 1 // beforeEOL\n            + 1 // afterEOL\n            + SingleModelEditStackData._writeSelectionsSize(this.beforeCursorState)\n            + SingleModelEditStackData._writeSelectionsSize(this.afterCursorState)\n            + 4 // change count\n        );\n        for (const change of this.changes) {\n            necessarySize += change.writeSize();\n        }\n        const b = new Uint8Array(necessarySize);\n        let offset = 0;\n        writeUInt32BE(b, this.beforeVersionId, offset);\n        offset += 4;\n        writeUInt32BE(b, this.afterVersionId, offset);\n        offset += 4;\n        writeUInt8(b, this.beforeEOL, offset);\n        offset += 1;\n        writeUInt8(b, this.afterEOL, offset);\n        offset += 1;\n        offset = SingleModelEditStackData._writeSelections(b, this.beforeCursorState, offset);\n        offset = SingleModelEditStackData._writeSelections(b, this.afterCursorState, offset);\n        writeUInt32BE(b, this.changes.length, offset);\n        offset += 4;\n        for (const change of this.changes) {\n            offset = change.write(b, offset);\n        }\n        return b.buffer;\n    }\n    static deserialize(source) {\n        const b = new Uint8Array(source);\n        let offset = 0;\n        const beforeVersionId = readUInt32BE(b, offset);\n        offset += 4;\n        const afterVersionId = readUInt32BE(b, offset);\n        offset += 4;\n        const beforeEOL = readUInt8(b, offset);\n        offset += 1;\n        const afterEOL = readUInt8(b, offset);\n        offset += 1;\n        const beforeCursorState = [];\n        offset = SingleModelEditStackData._readSelections(b, offset, beforeCursorState);\n        const afterCursorState = [];\n        offset = SingleModelEditStackData._readSelections(b, offset, afterCursorState);\n        const changeCount = readUInt32BE(b, offset);\n        offset += 4;\n        const changes = [];\n        for (let i = 0; i < changeCount; i++) {\n            offset = TextChange.read(b, offset, changes);\n        }\n        return new SingleModelEditStackData(beforeVersionId, afterVersionId, beforeEOL, afterEOL, beforeCursorState, afterCursorState, changes);\n    }\n}\nclass SingleModelEditStackElement {\n    get type() {\n        return 0 /* UndoRedoElementType.Resource */;\n    }\n    get resource() {\n        if (URI.isUri(this.model)) {\n            return this.model;\n        }\n        return this.model.uri;\n    }\n    constructor(label, code, model, beforeCursorState) {\n        this.label = label;\n        this.code = code;\n        this.model = model;\n        this._data = SingleModelEditStackData.create(model, beforeCursorState);\n    }\n    toString() {\n        const data = (this._data instanceof SingleModelEditStackData ? this._data : SingleModelEditStackData.deserialize(this._data));\n        return data.changes.map(change => change.toString()).join(', ');\n    }\n    matchesResource(resource) {\n        const uri = (URI.isUri(this.model) ? this.model : this.model.uri);\n        return (uri.toString() === resource.toString());\n    }\n    setModel(model) {\n        this.model = model;\n    }\n    canAppend(model) {\n        return (this.model === model && this._data instanceof SingleModelEditStackData);\n    }\n    append(model, textChanges, afterEOL, afterVersionId, afterCursorState) {\n        if (this._data instanceof SingleModelEditStackData) {\n            this._data.append(model, textChanges, afterEOL, afterVersionId, afterCursorState);\n        }\n    }\n    close() {\n        if (this._data instanceof SingleModelEditStackData) {\n            this._data = this._data.serialize();\n        }\n    }\n    open() {\n        if (!(this._data instanceof SingleModelEditStackData)) {\n            this._data = SingleModelEditStackData.deserialize(this._data);\n        }\n    }\n    undo() {\n        if (URI.isUri(this.model)) {\n            // don't have a model\n            throw new Error(`Invalid SingleModelEditStackElement`);\n        }\n        if (this._data instanceof SingleModelEditStackData) {\n            this._data = this._data.serialize();\n        }\n        const data = SingleModelEditStackData.deserialize(this._data);\n        this.model._applyUndo(data.changes, data.beforeEOL, data.beforeVersionId, data.beforeCursorState);\n    }\n    redo() {\n        if (URI.isUri(this.model)) {\n            // don't have a model\n            throw new Error(`Invalid SingleModelEditStackElement`);\n        }\n        if (this._data instanceof SingleModelEditStackData) {\n            this._data = this._data.serialize();\n        }\n        const data = SingleModelEditStackData.deserialize(this._data);\n        this.model._applyRedo(data.changes, data.afterEOL, data.afterVersionId, data.afterCursorState);\n    }\n    heapSize() {\n        if (this._data instanceof SingleModelEditStackData) {\n            this._data = this._data.serialize();\n        }\n        return this._data.byteLength + 168 /*heap overhead*/;\n    }\n}\nclass MultiModelEditStackElement {\n    get resources() {\n        return this._editStackElementsArr.map(editStackElement => editStackElement.resource);\n    }\n    constructor(label, code, editStackElements) {\n        this.label = label;\n        this.code = code;\n        this.type = 1 /* UndoRedoElementType.Workspace */;\n        this._isOpen = true;\n        this._editStackElementsArr = editStackElements.slice(0);\n        this._editStackElementsMap = new Map();\n        for (const editStackElement of this._editStackElementsArr) {\n            const key = uriGetComparisonKey(editStackElement.resource);\n            this._editStackElementsMap.set(key, editStackElement);\n        }\n        this._delegate = null;\n    }\n    prepareUndoRedo() {\n        if (this._delegate) {\n            return this._delegate.prepareUndoRedo(this);\n        }\n    }\n    matchesResource(resource) {\n        const key = uriGetComparisonKey(resource);\n        return (this._editStackElementsMap.has(key));\n    }\n    setModel(model) {\n        const key = uriGetComparisonKey(URI.isUri(model) ? model : model.uri);\n        if (this._editStackElementsMap.has(key)) {\n            this._editStackElementsMap.get(key).setModel(model);\n        }\n    }\n    canAppend(model) {\n        if (!this._isOpen) {\n            return false;\n        }\n        const key = uriGetComparisonKey(model.uri);\n        if (this._editStackElementsMap.has(key)) {\n            const editStackElement = this._editStackElementsMap.get(key);\n            return editStackElement.canAppend(model);\n        }\n        return false;\n    }\n    append(model, textChanges, afterEOL, afterVersionId, afterCursorState) {\n        const key = uriGetComparisonKey(model.uri);\n        const editStackElement = this._editStackElementsMap.get(key);\n        editStackElement.append(model, textChanges, afterEOL, afterVersionId, afterCursorState);\n    }\n    close() {\n        this._isOpen = false;\n    }\n    open() {\n        // cannot reopen\n    }\n    undo() {\n        this._isOpen = false;\n        for (const editStackElement of this._editStackElementsArr) {\n            editStackElement.undo();\n        }\n    }\n    redo() {\n        for (const editStackElement of this._editStackElementsArr) {\n            editStackElement.redo();\n        }\n    }\n    heapSize(resource) {\n        const key = uriGetComparisonKey(resource);\n        if (this._editStackElementsMap.has(key)) {\n            const editStackElement = this._editStackElementsMap.get(key);\n            return editStackElement.heapSize();\n        }\n        return 0;\n    }\n    split() {\n        return this._editStackElementsArr;\n    }\n    toString() {\n        const result = [];\n        for (const editStackElement of this._editStackElementsArr) {\n            result.push(`${basename(editStackElement.resource)}: ${editStackElement}`);\n        }\n        return `{${result.join(', ')}}`;\n    }\n}\nfunction getModelEOL(model) {\n    const eol = model.getEOL();\n    if (eol === '\\n') {\n        return 0 /* EndOfLineSequence.LF */;\n    }\n    else {\n        return 1 /* EndOfLineSequence.CRLF */;\n    }\n}\nfunction isEditStackElement(element) {\n    if (!element) {\n        return false;\n    }\n    return ((element instanceof SingleModelEditStackElement) || (element instanceof MultiModelEditStackElement));\n}\nclass EditStack {\n    constructor(model, undoRedoService) {\n        this._model = model;\n        this._undoRedoService = undoRedoService;\n    }\n    pushStackElement() {\n        const lastElement = this._undoRedoService.getLastElement(this._model.uri);\n        if (isEditStackElement(lastElement)) {\n            lastElement.close();\n        }\n    }\n    popStackElement() {\n        const lastElement = this._undoRedoService.getLastElement(this._model.uri);\n        if (isEditStackElement(lastElement)) {\n            lastElement.open();\n        }\n    }\n    clear() {\n        this._undoRedoService.removeElements(this._model.uri);\n    }\n    _getOrCreateEditStackElement(beforeCursorState, group) {\n        const lastElement = this._undoRedoService.getLastElement(this._model.uri);\n        if (isEditStackElement(lastElement) && lastElement.canAppend(this._model)) {\n            return lastElement;\n        }\n        const newElement = new SingleModelEditStackElement(localize(785, \"Typing\"), 'undoredo.textBufferEdit', this._model, beforeCursorState);\n        this._undoRedoService.pushElement(newElement, group);\n        return newElement;\n    }\n    pushEOL(eol) {\n        const editStackElement = this._getOrCreateEditStackElement(null, undefined);\n        this._model.setEOL(eol);\n        editStackElement.append(this._model, [], getModelEOL(this._model), this._model.getAlternativeVersionId(), null);\n    }\n    pushEditOperation(beforeCursorState, editOperations, cursorStateComputer, group, reason = EditSources.unknown({ name: 'pushEditOperation' })) {\n        const editStackElement = this._getOrCreateEditStackElement(beforeCursorState, group);\n        const inverseEditOperations = this._model.applyEdits(editOperations, true, reason);\n        const afterCursorState = EditStack._computeCursorState(cursorStateComputer, inverseEditOperations);\n        const textChanges = inverseEditOperations.map((op, index) => ({ index: index, textChange: op.textChange }));\n        textChanges.sort((a, b) => {\n            if (a.textChange.oldPosition === b.textChange.oldPosition) {\n                return a.index - b.index;\n            }\n            return a.textChange.oldPosition - b.textChange.oldPosition;\n        });\n        editStackElement.append(this._model, textChanges.map(op => op.textChange), getModelEOL(this._model), this._model.getAlternativeVersionId(), afterCursorState);\n        return afterCursorState;\n    }\n    static _computeCursorState(cursorStateComputer, inverseEditOperations) {\n        try {\n            return cursorStateComputer ? cursorStateComputer(inverseEditOperations) : null;\n        }\n        catch (e) {\n            onUnexpectedError(e);\n            return null;\n        }\n    }\n}\n\nexport { EditStack, MultiModelEditStackElement, SingleModelEditStackData, SingleModelEditStackElement, isEditStackElement };\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 *--------------------------------------------------------------------------------------------*/\nclass SpacesDiffResult {\n    constructor() {\n        this.spacesDiff = 0;\n        this.looksLikeAlignment = false;\n    }\n}\n/**\n * Compute the diff in spaces between two line's indentation.\n */\nfunction spacesDiff(a, aLength, b, bLength, result) {\n    result.spacesDiff = 0;\n    result.looksLikeAlignment = false;\n    // This can go both ways (e.g.):\n    //  - a: \"\\t\"\n    //  - b: \"\\t    \"\n    //  => This should count 1 tab and 4 spaces\n    let i;\n    for (i = 0; i < aLength && i < bLength; i++) {\n        const aCharCode = a.charCodeAt(i);\n        const bCharCode = b.charCodeAt(i);\n        if (aCharCode !== bCharCode) {\n            break;\n        }\n    }\n    let aSpacesCnt = 0, aTabsCount = 0;\n    for (let j = i; j < aLength; j++) {\n        const aCharCode = a.charCodeAt(j);\n        if (aCharCode === 32 /* CharCode.Space */) {\n            aSpacesCnt++;\n        }\n        else {\n            aTabsCount++;\n        }\n    }\n    let bSpacesCnt = 0, bTabsCount = 0;\n    for (let j = i; j < bLength; j++) {\n        const bCharCode = b.charCodeAt(j);\n        if (bCharCode === 32 /* CharCode.Space */) {\n            bSpacesCnt++;\n        }\n        else {\n            bTabsCount++;\n        }\n    }\n    if (aSpacesCnt > 0 && aTabsCount > 0) {\n        return;\n    }\n    if (bSpacesCnt > 0 && bTabsCount > 0) {\n        return;\n    }\n    const tabsDiff = Math.abs(aTabsCount - bTabsCount);\n    const spacesDiff = Math.abs(aSpacesCnt - bSpacesCnt);\n    if (tabsDiff === 0) {\n        // check if the indentation difference might be caused by alignment reasons\n        // sometime folks like to align their code, but this should not be used as a hint\n        result.spacesDiff = spacesDiff;\n        if (spacesDiff > 0 && 0 <= bSpacesCnt - 1 && bSpacesCnt - 1 < a.length && bSpacesCnt < b.length) {\n            if (b.charCodeAt(bSpacesCnt) !== 32 /* CharCode.Space */ && a.charCodeAt(bSpacesCnt - 1) === 32 /* CharCode.Space */) {\n                if (a.charCodeAt(a.length - 1) === 44 /* CharCode.Comma */) {\n                    // This looks like an alignment desire: e.g.\n                    // const a = b + c,\n                    //       d = b - c;\n                    result.looksLikeAlignment = true;\n                }\n            }\n        }\n        return;\n    }\n    if (spacesDiff % tabsDiff === 0) {\n        result.spacesDiff = spacesDiff / tabsDiff;\n        return;\n    }\n}\nfunction guessIndentation(source, defaultTabSize, defaultInsertSpaces) {\n    // Look at most at the first 10k lines\n    const linesCount = Math.min(source.getLineCount(), 10000);\n    let linesIndentedWithTabsCount = 0; // number of lines that contain at least one tab in indentation\n    let linesIndentedWithSpacesCount = 0; // number of lines that contain only spaces in indentation\n    let previousLineText = ''; // content of latest line that contained non-whitespace chars\n    let previousLineIndentation = 0; // index at which latest line contained the first non-whitespace char\n    const ALLOWED_TAB_SIZE_GUESSES = [2, 4, 6, 8, 3, 5, 7]; // prefer even guesses for `tabSize`, limit to [2, 8].\n    const MAX_ALLOWED_TAB_SIZE_GUESS = 8; // max(ALLOWED_TAB_SIZE_GUESSES) = 8\n    const spacesDiffCount = [0, 0, 0, 0, 0, 0, 0, 0, 0]; // `tabSize` scores\n    const tmp = new SpacesDiffResult();\n    for (let lineNumber = 1; lineNumber <= linesCount; lineNumber++) {\n        const currentLineLength = source.getLineLength(lineNumber);\n        const currentLineText = source.getLineContent(lineNumber);\n        // if the text buffer is chunk based, so long lines are cons-string, v8 will flattern the string when we check charCode.\n        // checking charCode on chunks directly is cheaper.\n        const useCurrentLineText = (currentLineLength <= 65536);\n        let currentLineHasContent = false; // does `currentLineText` contain non-whitespace chars\n        let currentLineIndentation = 0; // index at which `currentLineText` contains the first non-whitespace char\n        let currentLineSpacesCount = 0; // count of spaces found in `currentLineText` indentation\n        let currentLineTabsCount = 0; // count of tabs found in `currentLineText` indentation\n        for (let j = 0, lenJ = currentLineLength; j < lenJ; j++) {\n            const charCode = (useCurrentLineText ? currentLineText.charCodeAt(j) : source.getLineCharCode(lineNumber, j));\n            if (charCode === 9 /* CharCode.Tab */) {\n                currentLineTabsCount++;\n            }\n            else if (charCode === 32 /* CharCode.Space */) {\n                currentLineSpacesCount++;\n            }\n            else {\n                // Hit non whitespace character on this line\n                currentLineHasContent = true;\n                currentLineIndentation = j;\n                break;\n            }\n        }\n        // Ignore empty or only whitespace lines\n        if (!currentLineHasContent) {\n            continue;\n        }\n        if (currentLineTabsCount > 0) {\n            linesIndentedWithTabsCount++;\n        }\n        else if (currentLineSpacesCount > 1) {\n            linesIndentedWithSpacesCount++;\n        }\n        spacesDiff(previousLineText, previousLineIndentation, currentLineText, currentLineIndentation, tmp);\n        if (tmp.looksLikeAlignment) {\n            // if defaultInsertSpaces === true && the spaces count == tabSize, we may want to count it as valid indentation\n            //\n            // - item1\n            //   - item2\n            //\n            // otherwise skip this line entirely\n            //\n            // const a = 1,\n            //       b = 2;\n            if (!(defaultInsertSpaces && defaultTabSize === tmp.spacesDiff)) {\n                continue;\n            }\n        }\n        const currentSpacesDiff = tmp.spacesDiff;\n        if (currentSpacesDiff <= MAX_ALLOWED_TAB_SIZE_GUESS) {\n            spacesDiffCount[currentSpacesDiff]++;\n        }\n        previousLineText = currentLineText;\n        previousLineIndentation = currentLineIndentation;\n    }\n    let insertSpaces = defaultInsertSpaces;\n    if (linesIndentedWithTabsCount !== linesIndentedWithSpacesCount) {\n        insertSpaces = (linesIndentedWithTabsCount < linesIndentedWithSpacesCount);\n    }\n    let tabSize = defaultTabSize;\n    // Guess tabSize only if inserting spaces...\n    if (insertSpaces) {\n        let tabSizeScore = (insertSpaces ? 0 : 0.1 * linesCount);\n        // console.log(\"score threshold: \" + tabSizeScore);\n        ALLOWED_TAB_SIZE_GUESSES.forEach((possibleTabSize) => {\n            const possibleTabSizeScore = spacesDiffCount[possibleTabSize];\n            if (possibleTabSizeScore > tabSizeScore) {\n                tabSizeScore = possibleTabSizeScore;\n                tabSize = possibleTabSize;\n            }\n        });\n        // Let a tabSize of 2 win even if it is not the maximum\n        // (only in case 4 was guessed)\n        if (tabSize === 4 && spacesDiffCount[4] > 0 && spacesDiffCount[2] > 0 && spacesDiffCount[2] >= spacesDiffCount[4] / 2) {\n            tabSize = 2;\n        }\n    }\n    // console.log('--------------------------');\n    // console.log('linesIndentedWithTabsCount: ' + linesIndentedWithTabsCount + ', linesIndentedWithSpacesCount: ' + linesIndentedWithSpacesCount);\n    // console.log('spacesDiffCount: ' + spacesDiffCount);\n    // console.log('tabSize: ' + tabSize + ', tabSizeScore: ' + tabSizeScore);\n    return {\n        insertSpaces: insertSpaces,\n        tabSize: tabSize\n    };\n}\n\nexport { guessIndentation };\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 *--------------------------------------------------------------------------------------------*/\nfunction getNodeColor(node) {\n    return ((node.metadata & 1 /* Constants.ColorMask */) >>> 0 /* Constants.ColorOffset */);\n}\nfunction setNodeColor(node, color) {\n    node.metadata = ((node.metadata & 254 /* Constants.ColorMaskInverse */) | (color << 0 /* Constants.ColorOffset */));\n}\nfunction getNodeIsVisited(node) {\n    return ((node.metadata & 2 /* Constants.IsVisitedMask */) >>> 1 /* Constants.IsVisitedOffset */) === 1;\n}\nfunction setNodeIsVisited(node, value) {\n    node.metadata = ((node.metadata & 253 /* Constants.IsVisitedMaskInverse */) | ((value ? 1 : 0) << 1 /* Constants.IsVisitedOffset */));\n}\nfunction getNodeIsForValidation(node) {\n    return ((node.metadata & 4 /* Constants.IsForValidationMask */) >>> 2 /* Constants.IsForValidationOffset */) === 1;\n}\nfunction setNodeIsForValidation(node, value) {\n    node.metadata = ((node.metadata & 251 /* Constants.IsForValidationMaskInverse */) | ((value ? 1 : 0) << 2 /* Constants.IsForValidationOffset */));\n}\nfunction getNodeIsInGlyphMargin(node) {\n    return ((node.metadata & 64 /* Constants.IsMarginMask */) >>> 6 /* Constants.IsMarginOffset */) === 1;\n}\nfunction setNodeIsInGlyphMargin(node, value) {\n    node.metadata = ((node.metadata & 191 /* Constants.IsMarginMaskInverse */) | ((value ? 1 : 0) << 6 /* Constants.IsMarginOffset */));\n}\nfunction getNodeAffectsFont(node) {\n    return ((node.metadata & 128 /* Constants.AffectsFontMask */) >>> 7 /* Constants.AffectsFontOffset */) === 1;\n}\nfunction setNodeAffectsFont(node, value) {\n    node.metadata = ((node.metadata & 127 /* Constants.AffectsFontMaskInverse */) | ((value ? 1 : 0) << 7 /* Constants.AffectsFontOffset */));\n}\nfunction getNodeStickiness(node) {\n    return ((node.metadata & 24 /* Constants.StickinessMask */) >>> 3 /* Constants.StickinessOffset */);\n}\nfunction _setNodeStickiness(node, stickiness) {\n    node.metadata = ((node.metadata & 231 /* Constants.StickinessMaskInverse */) | (stickiness << 3 /* Constants.StickinessOffset */));\n}\nfunction getCollapseOnReplaceEdit(node) {\n    return ((node.metadata & 32 /* Constants.CollapseOnReplaceEditMask */) >>> 5 /* Constants.CollapseOnReplaceEditOffset */) === 1;\n}\nfunction setCollapseOnReplaceEdit(node, value) {\n    node.metadata = ((node.metadata & 223 /* Constants.CollapseOnReplaceEditMaskInverse */) | ((value ? 1 : 0) << 5 /* Constants.CollapseOnReplaceEditOffset */));\n}\nclass IntervalNode {\n    constructor(id, start, end) {\n        this.metadata = 0;\n        this.parent = this;\n        this.left = this;\n        this.right = this;\n        setNodeColor(this, 1 /* NodeColor.Red */);\n        this.start = start;\n        this.end = end;\n        // FORCE_OVERFLOWING_TEST: this.delta = start;\n        this.delta = 0;\n        this.maxEnd = end;\n        this.id = id;\n        this.ownerId = 0;\n        this.options = null;\n        setNodeIsForValidation(this, false);\n        setNodeIsInGlyphMargin(this, false);\n        _setNodeStickiness(this, 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */);\n        setCollapseOnReplaceEdit(this, false);\n        setNodeAffectsFont(this, false);\n        this.cachedVersionId = 0;\n        this.cachedAbsoluteStart = start;\n        this.cachedAbsoluteEnd = end;\n        this.range = null;\n        setNodeIsVisited(this, false);\n    }\n    reset(versionId, start, end, range) {\n        this.start = start;\n        this.end = end;\n        this.maxEnd = end;\n        this.cachedVersionId = versionId;\n        this.cachedAbsoluteStart = start;\n        this.cachedAbsoluteEnd = end;\n        this.range = range;\n    }\n    setOptions(options) {\n        this.options = options;\n        const className = this.options.className;\n        setNodeIsForValidation(this, (className === \"squiggly-error\" /* ClassName.EditorErrorDecoration */\n            || className === \"squiggly-warning\" /* ClassName.EditorWarningDecoration */\n            || className === \"squiggly-info\" /* ClassName.EditorInfoDecoration */));\n        setNodeIsInGlyphMargin(this, this.options.glyphMarginClassName !== null);\n        _setNodeStickiness(this, this.options.stickiness);\n        setCollapseOnReplaceEdit(this, this.options.collapseOnReplaceEdit);\n        setNodeAffectsFont(this, this.options.affectsFont ?? false);\n    }\n    setCachedOffsets(absoluteStart, absoluteEnd, cachedVersionId) {\n        if (this.cachedVersionId !== cachedVersionId) {\n            this.range = null;\n        }\n        this.cachedVersionId = cachedVersionId;\n        this.cachedAbsoluteStart = absoluteStart;\n        this.cachedAbsoluteEnd = absoluteEnd;\n    }\n    detach() {\n        this.parent = null;\n        this.left = null;\n        this.right = null;\n    }\n}\nconst SENTINEL = new IntervalNode(null, 0, 0);\nSENTINEL.parent = SENTINEL;\nSENTINEL.left = SENTINEL;\nSENTINEL.right = SENTINEL;\nsetNodeColor(SENTINEL, 0 /* NodeColor.Black */);\nclass IntervalTree {\n    constructor() {\n        this.root = SENTINEL;\n        this.requestNormalizeDelta = false;\n    }\n    intervalSearch(start, end, filterOwnerId, filterOutValidation, filterFontDecorations, cachedVersionId, onlyMarginDecorations) {\n        if (this.root === SENTINEL) {\n            return [];\n        }\n        return intervalSearch(this, start, end, filterOwnerId, filterOutValidation, filterFontDecorations, cachedVersionId, onlyMarginDecorations);\n    }\n    search(filterOwnerId, filterOutValidation, filterFontDecorations, cachedVersionId, onlyMarginDecorations) {\n        if (this.root === SENTINEL) {\n            return [];\n        }\n        return search(this, filterOwnerId, filterOutValidation, filterFontDecorations, cachedVersionId, onlyMarginDecorations);\n    }\n    /**\n     * Will not set `cachedAbsoluteStart` nor `cachedAbsoluteEnd` on the returned nodes!\n     */\n    collectNodesFromOwner(ownerId) {\n        return collectNodesFromOwner(this, ownerId);\n    }\n    /**\n     * Will not set `cachedAbsoluteStart` nor `cachedAbsoluteEnd` on the returned nodes!\n     */\n    collectNodesPostOrder() {\n        return collectNodesPostOrder(this);\n    }\n    insert(node) {\n        rbTreeInsert(this, node);\n        this._normalizeDeltaIfNecessary();\n    }\n    delete(node) {\n        rbTreeDelete(this, node);\n        this._normalizeDeltaIfNecessary();\n    }\n    resolveNode(node, cachedVersionId) {\n        const initialNode = node;\n        let delta = 0;\n        while (node !== this.root) {\n            if (node === node.parent.right) {\n                delta += node.parent.delta;\n            }\n            node = node.parent;\n        }\n        const nodeStart = initialNode.start + delta;\n        const nodeEnd = initialNode.end + delta;\n        initialNode.setCachedOffsets(nodeStart, nodeEnd, cachedVersionId);\n    }\n    acceptReplace(offset, length, textLength, forceMoveMarkers) {\n        // Our strategy is to remove all directly impacted nodes, and then add them back to the tree.\n        // (1) collect all nodes that are intersecting this edit as nodes of interest\n        const nodesOfInterest = searchForEditing(this, offset, offset + length);\n        // (2) remove all nodes that are intersecting this edit\n        for (let i = 0, len = nodesOfInterest.length; i < len; i++) {\n            const node = nodesOfInterest[i];\n            rbTreeDelete(this, node);\n        }\n        this._normalizeDeltaIfNecessary();\n        // (3) edit all tree nodes except the nodes of interest\n        noOverlapReplace(this, offset, offset + length, textLength);\n        this._normalizeDeltaIfNecessary();\n        // (4) edit the nodes of interest and insert them back in the tree\n        for (let i = 0, len = nodesOfInterest.length; i < len; i++) {\n            const node = nodesOfInterest[i];\n            node.start = node.cachedAbsoluteStart;\n            node.end = node.cachedAbsoluteEnd;\n            nodeAcceptEdit(node, offset, (offset + length), textLength, forceMoveMarkers);\n            node.maxEnd = node.end;\n            rbTreeInsert(this, node);\n        }\n        this._normalizeDeltaIfNecessary();\n    }\n    _normalizeDeltaIfNecessary() {\n        if (!this.requestNormalizeDelta) {\n            return;\n        }\n        this.requestNormalizeDelta = false;\n        normalizeDelta(this);\n    }\n}\n//#region Delta Normalization\nfunction normalizeDelta(T) {\n    let node = T.root;\n    let delta = 0;\n    while (node !== SENTINEL) {\n        if (node.left !== SENTINEL && !getNodeIsVisited(node.left)) {\n            // go left\n            node = node.left;\n            continue;\n        }\n        if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) {\n            // go right\n            delta += node.delta;\n            node = node.right;\n            continue;\n        }\n        // handle current node\n        node.start = delta + node.start;\n        node.end = delta + node.end;\n        node.delta = 0;\n        recomputeMaxEnd(node);\n        setNodeIsVisited(node, true);\n        // going up from this node\n        setNodeIsVisited(node.left, false);\n        setNodeIsVisited(node.right, false);\n        if (node === node.parent.right) {\n            delta -= node.parent.delta;\n        }\n        node = node.parent;\n    }\n    setNodeIsVisited(T.root, false);\n}\nfunction adjustMarkerBeforeColumn(markerOffset, markerStickToPreviousCharacter, checkOffset, moveSemantics) {\n    if (markerOffset < checkOffset) {\n        return true;\n    }\n    if (markerOffset > checkOffset) {\n        return false;\n    }\n    if (moveSemantics === 1 /* MarkerMoveSemantics.ForceMove */) {\n        return false;\n    }\n    if (moveSemantics === 2 /* MarkerMoveSemantics.ForceStay */) {\n        return true;\n    }\n    return markerStickToPreviousCharacter;\n}\n/**\n * This is a lot more complicated than strictly necessary to maintain the same behaviour\n * as when decorations were implemented using two markers.\n */\nfunction nodeAcceptEdit(node, start, end, textLength, forceMoveMarkers) {\n    const nodeStickiness = getNodeStickiness(node);\n    const startStickToPreviousCharacter = (nodeStickiness === 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */\n        || nodeStickiness === 2 /* TrackedRangeStickiness.GrowsOnlyWhenTypingBefore */);\n    const endStickToPreviousCharacter = (nodeStickiness === 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */\n        || nodeStickiness === 2 /* TrackedRangeStickiness.GrowsOnlyWhenTypingBefore */);\n    const deletingCnt = (end - start);\n    const insertingCnt = textLength;\n    const commonLength = Math.min(deletingCnt, insertingCnt);\n    const nodeStart = node.start;\n    let startDone = false;\n    const nodeEnd = node.end;\n    let endDone = false;\n    if (start <= nodeStart && nodeEnd <= end && getCollapseOnReplaceEdit(node)) {\n        // This edit encompasses the entire decoration range\n        // and the decoration has asked to become collapsed\n        node.start = start;\n        startDone = true;\n        node.end = start;\n        endDone = true;\n    }\n    {\n        const moveSemantics = forceMoveMarkers ? 1 /* MarkerMoveSemantics.ForceMove */ : (deletingCnt > 0 ? 2 /* MarkerMoveSemantics.ForceStay */ : 0 /* MarkerMoveSemantics.MarkerDefined */);\n        if (!startDone && adjustMarkerBeforeColumn(nodeStart, startStickToPreviousCharacter, start, moveSemantics)) {\n            startDone = true;\n        }\n        if (!endDone && adjustMarkerBeforeColumn(nodeEnd, endStickToPreviousCharacter, start, moveSemantics)) {\n            endDone = true;\n        }\n    }\n    if (commonLength > 0 && !forceMoveMarkers) {\n        const moveSemantics = (deletingCnt > insertingCnt ? 2 /* MarkerMoveSemantics.ForceStay */ : 0 /* MarkerMoveSemantics.MarkerDefined */);\n        if (!startDone && adjustMarkerBeforeColumn(nodeStart, startStickToPreviousCharacter, start + commonLength, moveSemantics)) {\n            startDone = true;\n        }\n        if (!endDone && adjustMarkerBeforeColumn(nodeEnd, endStickToPreviousCharacter, start + commonLength, moveSemantics)) {\n            endDone = true;\n        }\n    }\n    {\n        const moveSemantics = forceMoveMarkers ? 1 /* MarkerMoveSemantics.ForceMove */ : 0 /* MarkerMoveSemantics.MarkerDefined */;\n        if (!startDone && adjustMarkerBeforeColumn(nodeStart, startStickToPreviousCharacter, end, moveSemantics)) {\n            node.start = start + insertingCnt;\n            startDone = true;\n        }\n        if (!endDone && adjustMarkerBeforeColumn(nodeEnd, endStickToPreviousCharacter, end, moveSemantics)) {\n            node.end = start + insertingCnt;\n            endDone = true;\n        }\n    }\n    // Finish\n    const deltaColumn = (insertingCnt - deletingCnt);\n    if (!startDone) {\n        node.start = Math.max(0, nodeStart + deltaColumn);\n    }\n    if (!endDone) {\n        node.end = Math.max(0, nodeEnd + deltaColumn);\n    }\n    if (node.start > node.end) {\n        node.end = node.start;\n    }\n}\nfunction searchForEditing(T, start, end) {\n    // https://en.wikipedia.org/wiki/Interval_tree#Augmented_tree\n    // Now, it is known that two intervals A and B overlap only when both\n    // A.low <= B.high and A.high >= B.low. When searching the trees for\n    // nodes overlapping with a given interval, you can immediately skip:\n    //  a) all nodes to the right of nodes whose low value is past the end of the given interval.\n    //  b) all nodes that have their maximum 'high' value below the start of the given interval.\n    let node = T.root;\n    let delta = 0;\n    let nodeMaxEnd = 0;\n    let nodeStart = 0;\n    let nodeEnd = 0;\n    const result = [];\n    let resultLen = 0;\n    while (node !== SENTINEL) {\n        if (getNodeIsVisited(node)) {\n            // going up from this node\n            setNodeIsVisited(node.left, false);\n            setNodeIsVisited(node.right, false);\n            if (node === node.parent.right) {\n                delta -= node.parent.delta;\n            }\n            node = node.parent;\n            continue;\n        }\n        if (!getNodeIsVisited(node.left)) {\n            // first time seeing this node\n            nodeMaxEnd = delta + node.maxEnd;\n            if (nodeMaxEnd < start) {\n                // cover case b) from above\n                // there is no need to search this node or its children\n                setNodeIsVisited(node, true);\n                continue;\n            }\n            if (node.left !== SENTINEL) {\n                // go left\n                node = node.left;\n                continue;\n            }\n        }\n        // handle current node\n        nodeStart = delta + node.start;\n        if (nodeStart > end) {\n            // cover case a) from above\n            // there is no need to search this node or its right subtree\n            setNodeIsVisited(node, true);\n            continue;\n        }\n        nodeEnd = delta + node.end;\n        if (nodeEnd >= start) {\n            node.setCachedOffsets(nodeStart, nodeEnd, 0);\n            result[resultLen++] = node;\n        }\n        setNodeIsVisited(node, true);\n        if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) {\n            // go right\n            delta += node.delta;\n            node = node.right;\n            continue;\n        }\n    }\n    setNodeIsVisited(T.root, false);\n    return result;\n}\nfunction noOverlapReplace(T, start, end, textLength) {\n    // https://en.wikipedia.org/wiki/Interval_tree#Augmented_tree\n    // Now, it is known that two intervals A and B overlap only when both\n    // A.low <= B.high and A.high >= B.low. When searching the trees for\n    // nodes overlapping with a given interval, you can immediately skip:\n    //  a) all nodes to the right of nodes whose low value is past the end of the given interval.\n    //  b) all nodes that have their maximum 'high' value below the start of the given interval.\n    let node = T.root;\n    let delta = 0;\n    let nodeMaxEnd = 0;\n    let nodeStart = 0;\n    const editDelta = (textLength - (end - start));\n    while (node !== SENTINEL) {\n        if (getNodeIsVisited(node)) {\n            // going up from this node\n            setNodeIsVisited(node.left, false);\n            setNodeIsVisited(node.right, false);\n            if (node === node.parent.right) {\n                delta -= node.parent.delta;\n            }\n            recomputeMaxEnd(node);\n            node = node.parent;\n            continue;\n        }\n        if (!getNodeIsVisited(node.left)) {\n            // first time seeing this node\n            nodeMaxEnd = delta + node.maxEnd;\n            if (nodeMaxEnd < start) {\n                // cover case b) from above\n                // there is no need to search this node or its children\n                setNodeIsVisited(node, true);\n                continue;\n            }\n            if (node.left !== SENTINEL) {\n                // go left\n                node = node.left;\n                continue;\n            }\n        }\n        // handle current node\n        nodeStart = delta + node.start;\n        if (nodeStart > end) {\n            node.start += editDelta;\n            node.end += editDelta;\n            node.delta += editDelta;\n            if (node.delta < -1073741824 /* Constants.MIN_SAFE_DELTA */ || node.delta > 1073741824 /* Constants.MAX_SAFE_DELTA */) {\n                T.requestNormalizeDelta = true;\n            }\n            // cover case a) from above\n            // there is no need to search this node or its right subtree\n            setNodeIsVisited(node, true);\n            continue;\n        }\n        setNodeIsVisited(node, true);\n        if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) {\n            // go right\n            delta += node.delta;\n            node = node.right;\n            continue;\n        }\n    }\n    setNodeIsVisited(T.root, false);\n}\n//#endregion\n//#region Searching\nfunction collectNodesFromOwner(T, ownerId) {\n    let node = T.root;\n    const result = [];\n    let resultLen = 0;\n    while (node !== SENTINEL) {\n        if (getNodeIsVisited(node)) {\n            // going up from this node\n            setNodeIsVisited(node.left, false);\n            setNodeIsVisited(node.right, false);\n            node = node.parent;\n            continue;\n        }\n        if (node.left !== SENTINEL && !getNodeIsVisited(node.left)) {\n            // go left\n            node = node.left;\n            continue;\n        }\n        // handle current node\n        if (node.ownerId === ownerId) {\n            result[resultLen++] = node;\n        }\n        setNodeIsVisited(node, true);\n        if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) {\n            // go right\n            node = node.right;\n            continue;\n        }\n    }\n    setNodeIsVisited(T.root, false);\n    return result;\n}\nfunction collectNodesPostOrder(T) {\n    let node = T.root;\n    const result = [];\n    let resultLen = 0;\n    while (node !== SENTINEL) {\n        if (getNodeIsVisited(node)) {\n            // going up from this node\n            setNodeIsVisited(node.left, false);\n            setNodeIsVisited(node.right, false);\n            node = node.parent;\n            continue;\n        }\n        if (node.left !== SENTINEL && !getNodeIsVisited(node.left)) {\n            // go left\n            node = node.left;\n            continue;\n        }\n        if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) {\n            // go right\n            node = node.right;\n            continue;\n        }\n        // handle current node\n        result[resultLen++] = node;\n        setNodeIsVisited(node, true);\n    }\n    setNodeIsVisited(T.root, false);\n    return result;\n}\nfunction search(T, filterOwnerId, filterOutValidation, filterFontDecorations, cachedVersionId, onlyMarginDecorations) {\n    let node = T.root;\n    let delta = 0;\n    let nodeStart = 0;\n    let nodeEnd = 0;\n    const result = [];\n    let resultLen = 0;\n    while (node !== SENTINEL) {\n        if (getNodeIsVisited(node)) {\n            // going up from this node\n            setNodeIsVisited(node.left, false);\n            setNodeIsVisited(node.right, false);\n            if (node === node.parent.right) {\n                delta -= node.parent.delta;\n            }\n            node = node.parent;\n            continue;\n        }\n        if (node.left !== SENTINEL && !getNodeIsVisited(node.left)) {\n            // go left\n            node = node.left;\n            continue;\n        }\n        // handle current node\n        nodeStart = delta + node.start;\n        nodeEnd = delta + node.end;\n        node.setCachedOffsets(nodeStart, nodeEnd, cachedVersionId);\n        let include = true;\n        if (filterOwnerId && node.ownerId && node.ownerId !== filterOwnerId) {\n            include = false;\n        }\n        if (filterOutValidation && getNodeIsForValidation(node)) {\n            include = false;\n        }\n        if (filterFontDecorations && getNodeAffectsFont(node)) {\n            include = false;\n        }\n        if (onlyMarginDecorations && !getNodeIsInGlyphMargin(node)) {\n            include = false;\n        }\n        if (include) {\n            result[resultLen++] = node;\n        }\n        setNodeIsVisited(node, true);\n        if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) {\n            // go right\n            delta += node.delta;\n            node = node.right;\n            continue;\n        }\n    }\n    setNodeIsVisited(T.root, false);\n    return result;\n}\nfunction intervalSearch(T, intervalStart, intervalEnd, filterOwnerId, filterOutValidation, filterFontDecorations, cachedVersionId, onlyMarginDecorations) {\n    // https://en.wikipedia.org/wiki/Interval_tree#Augmented_tree\n    // Now, it is known that two intervals A and B overlap only when both\n    // A.low <= B.high and A.high >= B.low. When searching the trees for\n    // nodes overlapping with a given interval, you can immediately skip:\n    //  a) all nodes to the right of nodes whose low value is past the end of the given interval.\n    //  b) all nodes that have their maximum 'high' value below the start of the given interval.\n    let node = T.root;\n    let delta = 0;\n    let nodeMaxEnd = 0;\n    let nodeStart = 0;\n    let nodeEnd = 0;\n    const result = [];\n    let resultLen = 0;\n    while (node !== SENTINEL) {\n        if (getNodeIsVisited(node)) {\n            // going up from this node\n            setNodeIsVisited(node.left, false);\n            setNodeIsVisited(node.right, false);\n            if (node === node.parent.right) {\n                delta -= node.parent.delta;\n            }\n            node = node.parent;\n            continue;\n        }\n        if (!getNodeIsVisited(node.left)) {\n            // first time seeing this node\n            nodeMaxEnd = delta + node.maxEnd;\n            if (nodeMaxEnd < intervalStart) {\n                // cover case b) from above\n                // there is no need to search this node or its children\n                setNodeIsVisited(node, true);\n                continue;\n            }\n            if (node.left !== SENTINEL) {\n                // go left\n                node = node.left;\n                continue;\n            }\n        }\n        // handle current node\n        nodeStart = delta + node.start;\n        if (nodeStart > intervalEnd) {\n            // cover case a) from above\n            // there is no need to search this node or its right subtree\n            setNodeIsVisited(node, true);\n            continue;\n        }\n        nodeEnd = delta + node.end;\n        if (nodeEnd >= intervalStart) {\n            // There is overlap\n            node.setCachedOffsets(nodeStart, nodeEnd, cachedVersionId);\n            let include = true;\n            if (filterOwnerId && node.ownerId && node.ownerId !== filterOwnerId) {\n                include = false;\n            }\n            if (filterOutValidation && getNodeIsForValidation(node)) {\n                include = false;\n            }\n            if (filterFontDecorations && getNodeAffectsFont(node)) {\n                include = false;\n            }\n            if (onlyMarginDecorations && !getNodeIsInGlyphMargin(node)) {\n                include = false;\n            }\n            if (include) {\n                result[resultLen++] = node;\n            }\n        }\n        setNodeIsVisited(node, true);\n        if (node.right !== SENTINEL && !getNodeIsVisited(node.right)) {\n            // go right\n            delta += node.delta;\n            node = node.right;\n            continue;\n        }\n    }\n    setNodeIsVisited(T.root, false);\n    return result;\n}\n//#endregion\n//#region Insertion\nfunction rbTreeInsert(T, newNode) {\n    if (T.root === SENTINEL) {\n        newNode.parent = SENTINEL;\n        newNode.left = SENTINEL;\n        newNode.right = SENTINEL;\n        setNodeColor(newNode, 0 /* NodeColor.Black */);\n        T.root = newNode;\n        return T.root;\n    }\n    treeInsert(T, newNode);\n    recomputeMaxEndWalkToRoot(newNode.parent);\n    // repair tree\n    let x = newNode;\n    while (x !== T.root && getNodeColor(x.parent) === 1 /* NodeColor.Red */) {\n        if (x.parent === x.parent.parent.left) {\n            const y = x.parent.parent.right;\n            if (getNodeColor(y) === 1 /* NodeColor.Red */) {\n                setNodeColor(x.parent, 0 /* NodeColor.Black */);\n                setNodeColor(y, 0 /* NodeColor.Black */);\n                setNodeColor(x.parent.parent, 1 /* NodeColor.Red */);\n                x = x.parent.parent;\n            }\n            else {\n                if (x === x.parent.right) {\n                    x = x.parent;\n                    leftRotate(T, x);\n                }\n                setNodeColor(x.parent, 0 /* NodeColor.Black */);\n                setNodeColor(x.parent.parent, 1 /* NodeColor.Red */);\n                rightRotate(T, x.parent.parent);\n            }\n        }\n        else {\n            const y = x.parent.parent.left;\n            if (getNodeColor(y) === 1 /* NodeColor.Red */) {\n                setNodeColor(x.parent, 0 /* NodeColor.Black */);\n                setNodeColor(y, 0 /* NodeColor.Black */);\n                setNodeColor(x.parent.parent, 1 /* NodeColor.Red */);\n                x = x.parent.parent;\n            }\n            else {\n                if (x === x.parent.left) {\n                    x = x.parent;\n                    rightRotate(T, x);\n                }\n                setNodeColor(x.parent, 0 /* NodeColor.Black */);\n                setNodeColor(x.parent.parent, 1 /* NodeColor.Red */);\n                leftRotate(T, x.parent.parent);\n            }\n        }\n    }\n    setNodeColor(T.root, 0 /* NodeColor.Black */);\n    return newNode;\n}\nfunction treeInsert(T, z) {\n    let delta = 0;\n    let x = T.root;\n    const zAbsoluteStart = z.start;\n    const zAbsoluteEnd = z.end;\n    while (true) {\n        const cmp = intervalCompare(zAbsoluteStart, zAbsoluteEnd, x.start + delta, x.end + delta);\n        if (cmp < 0) {\n            // this node should be inserted to the left\n            // => it is not affected by the node's delta\n            if (x.left === SENTINEL) {\n                z.start -= delta;\n                z.end -= delta;\n                z.maxEnd -= delta;\n                x.left = z;\n                break;\n            }\n            else {\n                x = x.left;\n            }\n        }\n        else {\n            // this node should be inserted to the right\n            // => it is not affected by the node's delta\n            if (x.right === SENTINEL) {\n                z.start -= (delta + x.delta);\n                z.end -= (delta + x.delta);\n                z.maxEnd -= (delta + x.delta);\n                x.right = z;\n                break;\n            }\n            else {\n                delta += x.delta;\n                x = x.right;\n            }\n        }\n    }\n    z.parent = x;\n    z.left = SENTINEL;\n    z.right = SENTINEL;\n    setNodeColor(z, 1 /* NodeColor.Red */);\n}\n//#endregion\n//#region Deletion\nfunction rbTreeDelete(T, z) {\n    let x;\n    let y;\n    // RB-DELETE except we don't swap z and y in case c)\n    // i.e. we always delete what's pointed at by z.\n    if (z.left === SENTINEL) {\n        x = z.right;\n        y = z;\n        // x's delta is no longer influenced by z's delta\n        x.delta += z.delta;\n        if (x.delta < -1073741824 /* Constants.MIN_SAFE_DELTA */ || x.delta > 1073741824 /* Constants.MAX_SAFE_DELTA */) {\n            T.requestNormalizeDelta = true;\n        }\n        x.start += z.delta;\n        x.end += z.delta;\n    }\n    else if (z.right === SENTINEL) {\n        x = z.left;\n        y = z;\n    }\n    else {\n        y = leftest(z.right);\n        x = y.right;\n        // y's delta is no longer influenced by z's delta,\n        // but we don't want to walk the entire right-hand-side subtree of x.\n        // we therefore maintain z's delta in y, and adjust only x\n        x.start += y.delta;\n        x.end += y.delta;\n        x.delta += y.delta;\n        if (x.delta < -1073741824 /* Constants.MIN_SAFE_DELTA */ || x.delta > 1073741824 /* Constants.MAX_SAFE_DELTA */) {\n            T.requestNormalizeDelta = true;\n        }\n        y.start += z.delta;\n        y.end += z.delta;\n        y.delta = z.delta;\n        if (y.delta < -1073741824 /* Constants.MIN_SAFE_DELTA */ || y.delta > 1073741824 /* Constants.MAX_SAFE_DELTA */) {\n            T.requestNormalizeDelta = true;\n        }\n    }\n    if (y === T.root) {\n        T.root = x;\n        setNodeColor(x, 0 /* NodeColor.Black */);\n        z.detach();\n        resetSentinel();\n        recomputeMaxEnd(x);\n        T.root.parent = SENTINEL;\n        return;\n    }\n    const yWasRed = (getNodeColor(y) === 1 /* NodeColor.Red */);\n    if (y === y.parent.left) {\n        y.parent.left = x;\n    }\n    else {\n        y.parent.right = x;\n    }\n    if (y === z) {\n        x.parent = y.parent;\n    }\n    else {\n        if (y.parent === z) {\n            x.parent = y;\n        }\n        else {\n            x.parent = y.parent;\n        }\n        y.left = z.left;\n        y.right = z.right;\n        y.parent = z.parent;\n        setNodeColor(y, getNodeColor(z));\n        if (z === T.root) {\n            T.root = y;\n        }\n        else {\n            if (z === z.parent.left) {\n                z.parent.left = y;\n            }\n            else {\n                z.parent.right = y;\n            }\n        }\n        if (y.left !== SENTINEL) {\n            y.left.parent = y;\n        }\n        if (y.right !== SENTINEL) {\n            y.right.parent = y;\n        }\n    }\n    z.detach();\n    if (yWasRed) {\n        recomputeMaxEndWalkToRoot(x.parent);\n        if (y !== z) {\n            recomputeMaxEndWalkToRoot(y);\n            recomputeMaxEndWalkToRoot(y.parent);\n        }\n        resetSentinel();\n        return;\n    }\n    recomputeMaxEndWalkToRoot(x);\n    recomputeMaxEndWalkToRoot(x.parent);\n    if (y !== z) {\n        recomputeMaxEndWalkToRoot(y);\n        recomputeMaxEndWalkToRoot(y.parent);\n    }\n    // RB-DELETE-FIXUP\n    let w;\n    while (x !== T.root && getNodeColor(x) === 0 /* NodeColor.Black */) {\n        if (x === x.parent.left) {\n            w = x.parent.right;\n            if (getNodeColor(w) === 1 /* NodeColor.Red */) {\n                setNodeColor(w, 0 /* NodeColor.Black */);\n                setNodeColor(x.parent, 1 /* NodeColor.Red */);\n                leftRotate(T, x.parent);\n                w = x.parent.right;\n            }\n            if (getNodeColor(w.left) === 0 /* NodeColor.Black */ && getNodeColor(w.right) === 0 /* NodeColor.Black */) {\n                setNodeColor(w, 1 /* NodeColor.Red */);\n                x = x.parent;\n            }\n            else {\n                if (getNodeColor(w.right) === 0 /* NodeColor.Black */) {\n                    setNodeColor(w.left, 0 /* NodeColor.Black */);\n                    setNodeColor(w, 1 /* NodeColor.Red */);\n                    rightRotate(T, w);\n                    w = x.parent.right;\n                }\n                setNodeColor(w, getNodeColor(x.parent));\n                setNodeColor(x.parent, 0 /* NodeColor.Black */);\n                setNodeColor(w.right, 0 /* NodeColor.Black */);\n                leftRotate(T, x.parent);\n                x = T.root;\n            }\n        }\n        else {\n            w = x.parent.left;\n            if (getNodeColor(w) === 1 /* NodeColor.Red */) {\n                setNodeColor(w, 0 /* NodeColor.Black */);\n                setNodeColor(x.parent, 1 /* NodeColor.Red */);\n                rightRotate(T, x.parent);\n                w = x.parent.left;\n            }\n            if (getNodeColor(w.left) === 0 /* NodeColor.Black */ && getNodeColor(w.right) === 0 /* NodeColor.Black */) {\n                setNodeColor(w, 1 /* NodeColor.Red */);\n                x = x.parent;\n            }\n            else {\n                if (getNodeColor(w.left) === 0 /* NodeColor.Black */) {\n                    setNodeColor(w.right, 0 /* NodeColor.Black */);\n                    setNodeColor(w, 1 /* NodeColor.Red */);\n                    leftRotate(T, w);\n                    w = x.parent.left;\n                }\n                setNodeColor(w, getNodeColor(x.parent));\n                setNodeColor(x.parent, 0 /* NodeColor.Black */);\n                setNodeColor(w.left, 0 /* NodeColor.Black */);\n                rightRotate(T, x.parent);\n                x = T.root;\n            }\n        }\n    }\n    setNodeColor(x, 0 /* NodeColor.Black */);\n    resetSentinel();\n}\nfunction leftest(node) {\n    while (node.left !== SENTINEL) {\n        node = node.left;\n    }\n    return node;\n}\nfunction resetSentinel() {\n    SENTINEL.parent = SENTINEL;\n    SENTINEL.delta = 0; // optional\n    SENTINEL.start = 0; // optional\n    SENTINEL.end = 0; // optional\n}\n//#endregion\n//#region Rotations\nfunction leftRotate(T, x) {\n    const y = x.right; // set y.\n    y.delta += x.delta; // y's delta is no longer influenced by x's delta\n    if (y.delta < -1073741824 /* Constants.MIN_SAFE_DELTA */ || y.delta > 1073741824 /* Constants.MAX_SAFE_DELTA */) {\n        T.requestNormalizeDelta = true;\n    }\n    y.start += x.delta;\n    y.end += x.delta;\n    x.right = y.left; // turn y's left subtree into x's right subtree.\n    if (y.left !== SENTINEL) {\n        y.left.parent = x;\n    }\n    y.parent = x.parent; // link x's parent to y.\n    if (x.parent === SENTINEL) {\n        T.root = y;\n    }\n    else if (x === x.parent.left) {\n        x.parent.left = y;\n    }\n    else {\n        x.parent.right = y;\n    }\n    y.left = x; // put x on y's left.\n    x.parent = y;\n    recomputeMaxEnd(x);\n    recomputeMaxEnd(y);\n}\nfunction rightRotate(T, y) {\n    const x = y.left;\n    y.delta -= x.delta;\n    if (y.delta < -1073741824 /* Constants.MIN_SAFE_DELTA */ || y.delta > 1073741824 /* Constants.MAX_SAFE_DELTA */) {\n        T.requestNormalizeDelta = true;\n    }\n    y.start -= x.delta;\n    y.end -= x.delta;\n    y.left = x.right;\n    if (x.right !== SENTINEL) {\n        x.right.parent = y;\n    }\n    x.parent = y.parent;\n    if (y.parent === SENTINEL) {\n        T.root = x;\n    }\n    else if (y === y.parent.right) {\n        y.parent.right = x;\n    }\n    else {\n        y.parent.left = x;\n    }\n    x.right = y;\n    y.parent = x;\n    recomputeMaxEnd(y);\n    recomputeMaxEnd(x);\n}\n//#endregion\n//#region max end computation\nfunction computeMaxEnd(node) {\n    let maxEnd = node.end;\n    if (node.left !== SENTINEL) {\n        const leftMaxEnd = node.left.maxEnd;\n        if (leftMaxEnd > maxEnd) {\n            maxEnd = leftMaxEnd;\n        }\n    }\n    if (node.right !== SENTINEL) {\n        const rightMaxEnd = node.right.maxEnd + node.delta;\n        if (rightMaxEnd > maxEnd) {\n            maxEnd = rightMaxEnd;\n        }\n    }\n    return maxEnd;\n}\nfunction recomputeMaxEnd(node) {\n    node.maxEnd = computeMaxEnd(node);\n}\nfunction recomputeMaxEndWalkToRoot(node) {\n    while (node !== SENTINEL) {\n        const maxEnd = computeMaxEnd(node);\n        if (node.maxEnd === maxEnd) {\n            // no need to go further\n            return;\n        }\n        node.maxEnd = maxEnd;\n        node = node.parent;\n    }\n}\n//#endregion\n//#region utils\nfunction intervalCompare(aStart, aEnd, bStart, bEnd) {\n    if (aStart === bStart) {\n        return aEnd - bEnd;\n    }\n    return aStart - bStart;\n}\n//#endregion\n\nexport { IntervalNode, IntervalTree, SENTINEL, getNodeColor, intervalCompare, nodeAcceptEdit, recomputeMaxEnd };\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 *--------------------------------------------------------------------------------------------*/\nclass TreeNode {\n    constructor(piece, color) {\n        this.piece = piece;\n        this.color = color;\n        this.size_left = 0;\n        this.lf_left = 0;\n        this.parent = this;\n        this.left = this;\n        this.right = this;\n    }\n    next() {\n        if (this.right !== SENTINEL) {\n            return leftest(this.right);\n        }\n        let node = this;\n        while (node.parent !== SENTINEL) {\n            if (node.parent.left === node) {\n                break;\n            }\n            node = node.parent;\n        }\n        if (node.parent === SENTINEL) {\n            return SENTINEL;\n        }\n        else {\n            return node.parent;\n        }\n    }\n    prev() {\n        if (this.left !== SENTINEL) {\n            return righttest(this.left);\n        }\n        let node = this;\n        while (node.parent !== SENTINEL) {\n            if (node.parent.right === node) {\n                break;\n            }\n            node = node.parent;\n        }\n        if (node.parent === SENTINEL) {\n            return SENTINEL;\n        }\n        else {\n            return node.parent;\n        }\n    }\n    detach() {\n        this.parent = null;\n        this.left = null;\n        this.right = null;\n    }\n}\nconst SENTINEL = new TreeNode(null, 0 /* NodeColor.Black */);\nSENTINEL.parent = SENTINEL;\nSENTINEL.left = SENTINEL;\nSENTINEL.right = SENTINEL;\nSENTINEL.color = 0 /* NodeColor.Black */;\nfunction leftest(node) {\n    while (node.left !== SENTINEL) {\n        node = node.left;\n    }\n    return node;\n}\nfunction righttest(node) {\n    while (node.right !== SENTINEL) {\n        node = node.right;\n    }\n    return node;\n}\nfunction calculateSize(node) {\n    if (node === SENTINEL) {\n        return 0;\n    }\n    return node.size_left + node.piece.length + calculateSize(node.right);\n}\nfunction calculateLF(node) {\n    if (node === SENTINEL) {\n        return 0;\n    }\n    return node.lf_left + node.piece.lineFeedCnt + calculateLF(node.right);\n}\nfunction resetSentinel() {\n    SENTINEL.parent = SENTINEL;\n}\nfunction leftRotate(tree, x) {\n    const y = x.right;\n    // fix size_left\n    y.size_left += x.size_left + (x.piece ? x.piece.length : 0);\n    y.lf_left += x.lf_left + (x.piece ? x.piece.lineFeedCnt : 0);\n    x.right = y.left;\n    if (y.left !== SENTINEL) {\n        y.left.parent = x;\n    }\n    y.parent = x.parent;\n    if (x.parent === SENTINEL) {\n        tree.root = y;\n    }\n    else if (x.parent.left === x) {\n        x.parent.left = y;\n    }\n    else {\n        x.parent.right = y;\n    }\n    y.left = x;\n    x.parent = y;\n}\nfunction rightRotate(tree, y) {\n    const x = y.left;\n    y.left = x.right;\n    if (x.right !== SENTINEL) {\n        x.right.parent = y;\n    }\n    x.parent = y.parent;\n    // fix size_left\n    y.size_left -= x.size_left + (x.piece ? x.piece.length : 0);\n    y.lf_left -= x.lf_left + (x.piece ? x.piece.lineFeedCnt : 0);\n    if (y.parent === SENTINEL) {\n        tree.root = x;\n    }\n    else if (y === y.parent.right) {\n        y.parent.right = x;\n    }\n    else {\n        y.parent.left = x;\n    }\n    x.right = y;\n    y.parent = x;\n}\nfunction rbDelete(tree, z) {\n    let x;\n    let y;\n    if (z.left === SENTINEL) {\n        y = z;\n        x = y.right;\n    }\n    else if (z.right === SENTINEL) {\n        y = z;\n        x = y.left;\n    }\n    else {\n        y = leftest(z.right);\n        x = y.right;\n    }\n    if (y === tree.root) {\n        tree.root = x;\n        // if x is null, we are removing the only node\n        x.color = 0 /* NodeColor.Black */;\n        z.detach();\n        resetSentinel();\n        tree.root.parent = SENTINEL;\n        return;\n    }\n    const yWasRed = (y.color === 1 /* NodeColor.Red */);\n    if (y === y.parent.left) {\n        y.parent.left = x;\n    }\n    else {\n        y.parent.right = x;\n    }\n    if (y === z) {\n        x.parent = y.parent;\n        recomputeTreeMetadata(tree, x);\n    }\n    else {\n        if (y.parent === z) {\n            x.parent = y;\n        }\n        else {\n            x.parent = y.parent;\n        }\n        // as we make changes to x's hierarchy, update size_left of subtree first\n        recomputeTreeMetadata(tree, x);\n        y.left = z.left;\n        y.right = z.right;\n        y.parent = z.parent;\n        y.color = z.color;\n        if (z === tree.root) {\n            tree.root = y;\n        }\n        else {\n            if (z === z.parent.left) {\n                z.parent.left = y;\n            }\n            else {\n                z.parent.right = y;\n            }\n        }\n        if (y.left !== SENTINEL) {\n            y.left.parent = y;\n        }\n        if (y.right !== SENTINEL) {\n            y.right.parent = y;\n        }\n        // update metadata\n        // we replace z with y, so in this sub tree, the length change is z.item.length\n        y.size_left = z.size_left;\n        y.lf_left = z.lf_left;\n        recomputeTreeMetadata(tree, y);\n    }\n    z.detach();\n    if (x.parent.left === x) {\n        const newSizeLeft = calculateSize(x);\n        const newLFLeft = calculateLF(x);\n        if (newSizeLeft !== x.parent.size_left || newLFLeft !== x.parent.lf_left) {\n            const delta = newSizeLeft - x.parent.size_left;\n            const lf_delta = newLFLeft - x.parent.lf_left;\n            x.parent.size_left = newSizeLeft;\n            x.parent.lf_left = newLFLeft;\n            updateTreeMetadata(tree, x.parent, delta, lf_delta);\n        }\n    }\n    recomputeTreeMetadata(tree, x.parent);\n    if (yWasRed) {\n        resetSentinel();\n        return;\n    }\n    // RB-DELETE-FIXUP\n    let w;\n    while (x !== tree.root && x.color === 0 /* NodeColor.Black */) {\n        if (x === x.parent.left) {\n            w = x.parent.right;\n            if (w.color === 1 /* NodeColor.Red */) {\n                w.color = 0 /* NodeColor.Black */;\n                x.parent.color = 1 /* NodeColor.Red */;\n                leftRotate(tree, x.parent);\n                w = x.parent.right;\n            }\n            if (w.left.color === 0 /* NodeColor.Black */ && w.right.color === 0 /* NodeColor.Black */) {\n                w.color = 1 /* NodeColor.Red */;\n                x = x.parent;\n            }\n            else {\n                if (w.right.color === 0 /* NodeColor.Black */) {\n                    w.left.color = 0 /* NodeColor.Black */;\n                    w.color = 1 /* NodeColor.Red */;\n                    rightRotate(tree, w);\n                    w = x.parent.right;\n                }\n                w.color = x.parent.color;\n                x.parent.color = 0 /* NodeColor.Black */;\n                w.right.color = 0 /* NodeColor.Black */;\n                leftRotate(tree, x.parent);\n                x = tree.root;\n            }\n        }\n        else {\n            w = x.parent.left;\n            if (w.color === 1 /* NodeColor.Red */) {\n                w.color = 0 /* NodeColor.Black */;\n                x.parent.color = 1 /* NodeColor.Red */;\n                rightRotate(tree, x.parent);\n                w = x.parent.left;\n            }\n            if (w.left.color === 0 /* NodeColor.Black */ && w.right.color === 0 /* NodeColor.Black */) {\n                w.color = 1 /* NodeColor.Red */;\n                x = x.parent;\n            }\n            else {\n                if (w.left.color === 0 /* NodeColor.Black */) {\n                    w.right.color = 0 /* NodeColor.Black */;\n                    w.color = 1 /* NodeColor.Red */;\n                    leftRotate(tree, w);\n                    w = x.parent.left;\n                }\n                w.color = x.parent.color;\n                x.parent.color = 0 /* NodeColor.Black */;\n                w.left.color = 0 /* NodeColor.Black */;\n                rightRotate(tree, x.parent);\n                x = tree.root;\n            }\n        }\n    }\n    x.color = 0 /* NodeColor.Black */;\n    resetSentinel();\n}\nfunction fixInsert(tree, x) {\n    recomputeTreeMetadata(tree, x);\n    while (x !== tree.root && x.parent.color === 1 /* NodeColor.Red */) {\n        if (x.parent === x.parent.parent.left) {\n            const y = x.parent.parent.right;\n            if (y.color === 1 /* NodeColor.Red */) {\n                x.parent.color = 0 /* NodeColor.Black */;\n                y.color = 0 /* NodeColor.Black */;\n                x.parent.parent.color = 1 /* NodeColor.Red */;\n                x = x.parent.parent;\n            }\n            else {\n                if (x === x.parent.right) {\n                    x = x.parent;\n                    leftRotate(tree, x);\n                }\n                x.parent.color = 0 /* NodeColor.Black */;\n                x.parent.parent.color = 1 /* NodeColor.Red */;\n                rightRotate(tree, x.parent.parent);\n            }\n        }\n        else {\n            const y = x.parent.parent.left;\n            if (y.color === 1 /* NodeColor.Red */) {\n                x.parent.color = 0 /* NodeColor.Black */;\n                y.color = 0 /* NodeColor.Black */;\n                x.parent.parent.color = 1 /* NodeColor.Red */;\n                x = x.parent.parent;\n            }\n            else {\n                if (x === x.parent.left) {\n                    x = x.parent;\n                    rightRotate(tree, x);\n                }\n                x.parent.color = 0 /* NodeColor.Black */;\n                x.parent.parent.color = 1 /* NodeColor.Red */;\n                leftRotate(tree, x.parent.parent);\n            }\n        }\n    }\n    tree.root.color = 0 /* NodeColor.Black */;\n}\nfunction updateTreeMetadata(tree, x, delta, lineFeedCntDelta) {\n    // node length change or line feed count change\n    while (x !== tree.root && x !== SENTINEL) {\n        if (x.parent.left === x) {\n            x.parent.size_left += delta;\n            x.parent.lf_left += lineFeedCntDelta;\n        }\n        x = x.parent;\n    }\n}\nfunction recomputeTreeMetadata(tree, x) {\n    let delta = 0;\n    let lf_delta = 0;\n    if (x === tree.root) {\n        return;\n    }\n    // go upwards till the node whose left subtree is changed.\n    while (x !== tree.root && x === x.parent.right) {\n        x = x.parent;\n    }\n    if (x === tree.root) {\n        // well, it means we add a node to the end (inorder)\n        return;\n    }\n    // x is the node whose right subtree is changed.\n    x = x.parent;\n    delta = calculateSize(x.left) - x.size_left;\n    lf_delta = calculateLF(x.left) - x.lf_left;\n    x.size_left += delta;\n    x.lf_left += lf_delta;\n    // go upwards till root. O(logN)\n    while (x !== tree.root && (delta !== 0 || lf_delta !== 0)) {\n        if (x.parent.left === x) {\n            x.parent.size_left += delta;\n            x.parent.lf_left += lf_delta;\n        }\n        x = x.parent;\n    }\n}\n\nexport { SENTINEL, TreeNode, fixInsert, leftRotate, leftest, rbDelete, recomputeTreeMetadata, rightRotate, righttest, updateTreeMetadata };\n","import { createRegExp, getNextCodePoint } from '../../../base/common/strings.js';\nimport { getMapForWordSeparators } from '../core/wordCharacterClassifier.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { SearchData, FindMatch } from '../model.js';\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 *--------------------------------------------------------------------------------------------*/\nconst LIMIT_FIND_COUNT = 999;\nclass SearchParams {\n    constructor(searchString, isRegex, matchCase, wordSeparators) {\n        this.searchString = searchString;\n        this.isRegex = isRegex;\n        this.matchCase = matchCase;\n        this.wordSeparators = wordSeparators;\n    }\n    parseSearchRequest() {\n        if (this.searchString === '') {\n            return null;\n        }\n        // Try to create a RegExp out of the params\n        let multiline;\n        if (this.isRegex) {\n            multiline = isMultilineRegexSource(this.searchString);\n        }\n        else {\n            multiline = (this.searchString.indexOf('\\n') >= 0);\n        }\n        let regex = null;\n        try {\n            regex = createRegExp(this.searchString, this.isRegex, {\n                matchCase: this.matchCase,\n                wholeWord: false,\n                multiline: multiline,\n                global: true,\n                unicode: true\n            });\n        }\n        catch (err) {\n            return null;\n        }\n        if (!regex) {\n            return null;\n        }\n        let canUseSimpleSearch = (!this.isRegex && !multiline);\n        if (canUseSimpleSearch && this.searchString.toLowerCase() !== this.searchString.toUpperCase()) {\n            // casing might make a difference\n            canUseSimpleSearch = this.matchCase;\n        }\n        return new SearchData(regex, this.wordSeparators ? getMapForWordSeparators(this.wordSeparators, []) : null, canUseSimpleSearch ? this.searchString : null);\n    }\n}\nfunction isMultilineRegexSource(searchString) {\n    if (!searchString || searchString.length === 0) {\n        return false;\n    }\n    for (let i = 0, len = searchString.length; i < len; i++) {\n        const chCode = searchString.charCodeAt(i);\n        if (chCode === 10 /* CharCode.LineFeed */) {\n            return true;\n        }\n        if (chCode === 92 /* CharCode.Backslash */) {\n            // move to next char\n            i++;\n            if (i >= len) {\n                // string ends with a \\\n                break;\n            }\n            const nextChCode = searchString.charCodeAt(i);\n            if (nextChCode === 110 /* CharCode.n */ || nextChCode === 114 /* CharCode.r */ || nextChCode === 87 /* CharCode.W */) {\n                return true;\n            }\n        }\n    }\n    return false;\n}\nfunction createFindMatch(range, rawMatches, captureMatches) {\n    if (!captureMatches) {\n        return new FindMatch(range, null);\n    }\n    const matches = [];\n    for (let i = 0, len = rawMatches.length; i < len; i++) {\n        matches[i] = rawMatches[i];\n    }\n    return new FindMatch(range, matches);\n}\nclass LineFeedCounter {\n    constructor(text) {\n        const lineFeedsOffsets = [];\n        let lineFeedsOffsetsLen = 0;\n        for (let i = 0, textLen = text.length; i < textLen; i++) {\n            if (text.charCodeAt(i) === 10 /* CharCode.LineFeed */) {\n                lineFeedsOffsets[lineFeedsOffsetsLen++] = i;\n            }\n        }\n        this._lineFeedsOffsets = lineFeedsOffsets;\n    }\n    findLineFeedCountBeforeOffset(offset) {\n        const lineFeedsOffsets = this._lineFeedsOffsets;\n        let min = 0;\n        let max = lineFeedsOffsets.length - 1;\n        if (max === -1) {\n            // no line feeds\n            return 0;\n        }\n        if (offset <= lineFeedsOffsets[0]) {\n            // before first line feed\n            return 0;\n        }\n        while (min < max) {\n            const mid = min + ((max - min) / 2 >> 0);\n            if (lineFeedsOffsets[mid] >= offset) {\n                max = mid - 1;\n            }\n            else {\n                if (lineFeedsOffsets[mid + 1] >= offset) {\n                    // bingo!\n                    min = mid;\n                    max = mid;\n                }\n                else {\n                    min = mid + 1;\n                }\n            }\n        }\n        return min + 1;\n    }\n}\nclass TextModelSearch {\n    static findMatches(model, searchParams, searchRange, captureMatches, limitResultCount) {\n        const searchData = searchParams.parseSearchRequest();\n        if (!searchData) {\n            return [];\n        }\n        if (searchData.regex.multiline) {\n            return this._doFindMatchesMultiline(model, searchRange, new Searcher(searchData.wordSeparators, searchData.regex), captureMatches, limitResultCount);\n        }\n        return this._doFindMatchesLineByLine(model, searchRange, searchData, captureMatches, limitResultCount);\n    }\n    /**\n     * Multiline search always executes on the lines concatenated with \\n.\n     * We must therefore compensate for the count of \\n in case the model is CRLF\n     */\n    static _getMultilineMatchRange(model, deltaOffset, text, lfCounter, matchIndex, match0) {\n        let startOffset;\n        let lineFeedCountBeforeMatch = 0;\n        if (lfCounter) {\n            lineFeedCountBeforeMatch = lfCounter.findLineFeedCountBeforeOffset(matchIndex);\n            startOffset = deltaOffset + matchIndex + lineFeedCountBeforeMatch /* add as many \\r as there were \\n */;\n        }\n        else {\n            startOffset = deltaOffset + matchIndex;\n        }\n        let endOffset;\n        if (lfCounter) {\n            const lineFeedCountBeforeEndOfMatch = lfCounter.findLineFeedCountBeforeOffset(matchIndex + match0.length);\n            const lineFeedCountInMatch = lineFeedCountBeforeEndOfMatch - lineFeedCountBeforeMatch;\n            endOffset = startOffset + match0.length + lineFeedCountInMatch /* add as many \\r as there were \\n */;\n        }\n        else {\n            endOffset = startOffset + match0.length;\n        }\n        const startPosition = model.getPositionAt(startOffset);\n        const endPosition = model.getPositionAt(endOffset);\n        return new Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column);\n    }\n    static _doFindMatchesMultiline(model, searchRange, searcher, captureMatches, limitResultCount) {\n        const deltaOffset = model.getOffsetAt(searchRange.getStartPosition());\n        // We always execute multiline search over the lines joined with \\n\n        // This makes it that \\n will match the EOL for both CRLF and LF models\n        // We compensate for offset errors in `_getMultilineMatchRange`\n        const text = model.getValueInRange(searchRange, 1 /* EndOfLinePreference.LF */);\n        const lfCounter = (model.getEOL() === '\\r\\n' ? new LineFeedCounter(text) : null);\n        const result = [];\n        let counter = 0;\n        let m;\n        searcher.reset(0);\n        while ((m = searcher.next(text))) {\n            result[counter++] = createFindMatch(this._getMultilineMatchRange(model, deltaOffset, text, lfCounter, m.index, m[0]), m, captureMatches);\n            if (counter >= limitResultCount) {\n                return result;\n            }\n        }\n        return result;\n    }\n    static _doFindMatchesLineByLine(model, searchRange, searchData, captureMatches, limitResultCount) {\n        const result = [];\n        let resultLen = 0;\n        // Early case for a search range that starts & stops on the same line number\n        if (searchRange.startLineNumber === searchRange.endLineNumber) {\n            const text = model.getLineContent(searchRange.startLineNumber).substring(searchRange.startColumn - 1, searchRange.endColumn - 1);\n            resultLen = this._findMatchesInLine(searchData, text, searchRange.startLineNumber, searchRange.startColumn - 1, resultLen, result, captureMatches, limitResultCount);\n            return result;\n        }\n        // Collect results from first line\n        const text = model.getLineContent(searchRange.startLineNumber).substring(searchRange.startColumn - 1);\n        resultLen = this._findMatchesInLine(searchData, text, searchRange.startLineNumber, searchRange.startColumn - 1, resultLen, result, captureMatches, limitResultCount);\n        // Collect results from middle lines\n        for (let lineNumber = searchRange.startLineNumber + 1; lineNumber < searchRange.endLineNumber && resultLen < limitResultCount; lineNumber++) {\n            resultLen = this._findMatchesInLine(searchData, model.getLineContent(lineNumber), lineNumber, 0, resultLen, result, captureMatches, limitResultCount);\n        }\n        // Collect results from last line\n        if (resultLen < limitResultCount) {\n            const text = model.getLineContent(searchRange.endLineNumber).substring(0, searchRange.endColumn - 1);\n            resultLen = this._findMatchesInLine(searchData, text, searchRange.endLineNumber, 0, resultLen, result, captureMatches, limitResultCount);\n        }\n        return result;\n    }\n    static _findMatchesInLine(searchData, text, lineNumber, deltaOffset, resultLen, result, captureMatches, limitResultCount) {\n        const wordSeparators = searchData.wordSeparators;\n        if (!captureMatches && searchData.simpleSearch) {\n            const searchString = searchData.simpleSearch;\n            const searchStringLen = searchString.length;\n            const textLength = text.length;\n            let lastMatchIndex = -searchStringLen;\n            while ((lastMatchIndex = text.indexOf(searchString, lastMatchIndex + searchStringLen)) !== -1) {\n                if (!wordSeparators || isValidMatch(wordSeparators, text, textLength, lastMatchIndex, searchStringLen)) {\n                    result[resultLen++] = new FindMatch(new Range(lineNumber, lastMatchIndex + 1 + deltaOffset, lineNumber, lastMatchIndex + 1 + searchStringLen + deltaOffset), null);\n                    if (resultLen >= limitResultCount) {\n                        return resultLen;\n                    }\n                }\n            }\n            return resultLen;\n        }\n        const searcher = new Searcher(searchData.wordSeparators, searchData.regex);\n        let m;\n        // Reset regex to search from the beginning\n        searcher.reset(0);\n        do {\n            m = searcher.next(text);\n            if (m) {\n                result[resultLen++] = createFindMatch(new Range(lineNumber, m.index + 1 + deltaOffset, lineNumber, m.index + 1 + m[0].length + deltaOffset), m, captureMatches);\n                if (resultLen >= limitResultCount) {\n                    return resultLen;\n                }\n            }\n        } while (m);\n        return resultLen;\n    }\n    static findNextMatch(model, searchParams, searchStart, captureMatches) {\n        const searchData = searchParams.parseSearchRequest();\n        if (!searchData) {\n            return null;\n        }\n        const searcher = new Searcher(searchData.wordSeparators, searchData.regex);\n        if (searchData.regex.multiline) {\n            return this._doFindNextMatchMultiline(model, searchStart, searcher, captureMatches);\n        }\n        return this._doFindNextMatchLineByLine(model, searchStart, searcher, captureMatches);\n    }\n    static _doFindNextMatchMultiline(model, searchStart, searcher, captureMatches) {\n        const searchTextStart = new Position(searchStart.lineNumber, 1);\n        const deltaOffset = model.getOffsetAt(searchTextStart);\n        const lineCount = model.getLineCount();\n        // We always execute multiline search over the lines joined with \\n\n        // This makes it that \\n will match the EOL for both CRLF and LF models\n        // We compensate for offset errors in `_getMultilineMatchRange`\n        const text = model.getValueInRange(new Range(searchTextStart.lineNumber, searchTextStart.column, lineCount, model.getLineMaxColumn(lineCount)), 1 /* EndOfLinePreference.LF */);\n        const lfCounter = (model.getEOL() === '\\r\\n' ? new LineFeedCounter(text) : null);\n        searcher.reset(searchStart.column - 1);\n        const m = searcher.next(text);\n        if (m) {\n            return createFindMatch(this._getMultilineMatchRange(model, deltaOffset, text, lfCounter, m.index, m[0]), m, captureMatches);\n        }\n        if (searchStart.lineNumber !== 1 || searchStart.column !== 1) {\n            // Try again from the top\n            return this._doFindNextMatchMultiline(model, new Position(1, 1), searcher, captureMatches);\n        }\n        return null;\n    }\n    static _doFindNextMatchLineByLine(model, searchStart, searcher, captureMatches) {\n        const lineCount = model.getLineCount();\n        const startLineNumber = searchStart.lineNumber;\n        // Look in first line\n        const text = model.getLineContent(startLineNumber);\n        const r = this._findFirstMatchInLine(searcher, text, startLineNumber, searchStart.column, captureMatches);\n        if (r) {\n            return r;\n        }\n        for (let i = 1; i <= lineCount; i++) {\n            const lineIndex = (startLineNumber + i - 1) % lineCount;\n            const text = model.getLineContent(lineIndex + 1);\n            const r = this._findFirstMatchInLine(searcher, text, lineIndex + 1, 1, captureMatches);\n            if (r) {\n                return r;\n            }\n        }\n        return null;\n    }\n    static _findFirstMatchInLine(searcher, text, lineNumber, fromColumn, captureMatches) {\n        // Set regex to search from column\n        searcher.reset(fromColumn - 1);\n        const m = searcher.next(text);\n        if (m) {\n            return createFindMatch(new Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length), m, captureMatches);\n        }\n        return null;\n    }\n    static findPreviousMatch(model, searchParams, searchStart, captureMatches) {\n        const searchData = searchParams.parseSearchRequest();\n        if (!searchData) {\n            return null;\n        }\n        const searcher = new Searcher(searchData.wordSeparators, searchData.regex);\n        if (searchData.regex.multiline) {\n            return this._doFindPreviousMatchMultiline(model, searchStart, searcher, captureMatches);\n        }\n        return this._doFindPreviousMatchLineByLine(model, searchStart, searcher, captureMatches);\n    }\n    static _doFindPreviousMatchMultiline(model, searchStart, searcher, captureMatches) {\n        const matches = this._doFindMatchesMultiline(model, new Range(1, 1, searchStart.lineNumber, searchStart.column), searcher, captureMatches, 10 * LIMIT_FIND_COUNT);\n        if (matches.length > 0) {\n            return matches[matches.length - 1];\n        }\n        const lineCount = model.getLineCount();\n        if (searchStart.lineNumber !== lineCount || searchStart.column !== model.getLineMaxColumn(lineCount)) {\n            // Try again with all content\n            return this._doFindPreviousMatchMultiline(model, new Position(lineCount, model.getLineMaxColumn(lineCount)), searcher, captureMatches);\n        }\n        return null;\n    }\n    static _doFindPreviousMatchLineByLine(model, searchStart, searcher, captureMatches) {\n        const lineCount = model.getLineCount();\n        const startLineNumber = searchStart.lineNumber;\n        // Look in first line\n        const text = model.getLineContent(startLineNumber).substring(0, searchStart.column - 1);\n        const r = this._findLastMatchInLine(searcher, text, startLineNumber, captureMatches);\n        if (r) {\n            return r;\n        }\n        for (let i = 1; i <= lineCount; i++) {\n            const lineIndex = (lineCount + startLineNumber - i - 1) % lineCount;\n            const text = model.getLineContent(lineIndex + 1);\n            const r = this._findLastMatchInLine(searcher, text, lineIndex + 1, captureMatches);\n            if (r) {\n                return r;\n            }\n        }\n        return null;\n    }\n    static _findLastMatchInLine(searcher, text, lineNumber, captureMatches) {\n        let bestResult = null;\n        let m;\n        searcher.reset(0);\n        while ((m = searcher.next(text))) {\n            bestResult = createFindMatch(new Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length), m, captureMatches);\n        }\n        return bestResult;\n    }\n}\nfunction leftIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength) {\n    if (matchStartIndex === 0) {\n        // Match starts at start of string\n        return true;\n    }\n    const charBefore = text.charCodeAt(matchStartIndex - 1);\n    if (wordSeparators.get(charBefore) !== 0 /* WordCharacterClass.Regular */) {\n        // The character before the match is a word separator\n        return true;\n    }\n    if (charBefore === 13 /* CharCode.CarriageReturn */ || charBefore === 10 /* CharCode.LineFeed */) {\n        // The character before the match is line break or carriage return.\n        return true;\n    }\n    if (matchLength > 0) {\n        const firstCharInMatch = text.charCodeAt(matchStartIndex);\n        if (wordSeparators.get(firstCharInMatch) !== 0 /* WordCharacterClass.Regular */) {\n            // The first character inside the match is a word separator\n            return true;\n        }\n    }\n    return false;\n}\nfunction rightIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength) {\n    if (matchStartIndex + matchLength === textLength) {\n        // Match ends at end of string\n        return true;\n    }\n    const charAfter = text.charCodeAt(matchStartIndex + matchLength);\n    if (wordSeparators.get(charAfter) !== 0 /* WordCharacterClass.Regular */) {\n        // The character after the match is a word separator\n        return true;\n    }\n    if (charAfter === 13 /* CharCode.CarriageReturn */ || charAfter === 10 /* CharCode.LineFeed */) {\n        // The character after the match is line break or carriage return.\n        return true;\n    }\n    if (matchLength > 0) {\n        const lastCharInMatch = text.charCodeAt(matchStartIndex + matchLength - 1);\n        if (wordSeparators.get(lastCharInMatch) !== 0 /* WordCharacterClass.Regular */) {\n            // The last character in the match is a word separator\n            return true;\n        }\n    }\n    return false;\n}\nfunction isValidMatch(wordSeparators, text, textLength, matchStartIndex, matchLength) {\n    return (leftIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength)\n        && rightIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength));\n}\nclass Searcher {\n    constructor(wordSeparators, searchRegex) {\n        this._wordSeparators = wordSeparators;\n        this._searchRegex = searchRegex;\n        this._prevMatchStartIndex = -1;\n        this._prevMatchLength = 0;\n    }\n    reset(lastIndex) {\n        this._searchRegex.lastIndex = lastIndex;\n        this._prevMatchStartIndex = -1;\n        this._prevMatchLength = 0;\n    }\n    next(text) {\n        const textLength = text.length;\n        let m;\n        do {\n            if (this._prevMatchStartIndex + this._prevMatchLength === textLength) {\n                // Reached the end of the line\n                return null;\n            }\n            m = this._searchRegex.exec(text);\n            if (!m) {\n                return null;\n            }\n            const matchStartIndex = m.index;\n            const matchLength = m[0].length;\n            if (matchStartIndex === this._prevMatchStartIndex && matchLength === this._prevMatchLength) {\n                if (matchLength === 0) {\n                    // the search result is an empty string and won't advance `regex.lastIndex`, so `regex.exec` will stuck here\n                    // we attempt to recover from that by advancing by two if surrogate pair found and by one otherwise\n                    if (getNextCodePoint(text, textLength, this._searchRegex.lastIndex) > 0xFFFF) {\n                        this._searchRegex.lastIndex += 2;\n                    }\n                    else {\n                        this._searchRegex.lastIndex += 1;\n                    }\n                    continue;\n                }\n                // Exit early if the regex matches the same range twice\n                return null;\n            }\n            this._prevMatchStartIndex = matchStartIndex;\n            this._prevMatchLength = matchLength;\n            if (!this._wordSeparators || isValidMatch(this._wordSeparators, text, textLength, matchStartIndex, matchLength)) {\n                return m;\n            }\n        } while (m);\n        return null;\n    }\n}\n\nexport { SearchParams, Searcher, TextModelSearch, createFindMatch, isMultilineRegexSource, isValidMatch };\n","import { Position } from '../../core/position.js';\nimport { Range } from '../../core/range.js';\nimport { FindMatch } from '../../model.js';\nimport { SENTINEL, rbDelete, updateTreeMetadata, TreeNode, leftest, fixInsert, righttest } from './rbTreeBase.js';\nimport { createFindMatch, Searcher, isValidMatch } from '../textModelSearch.js';\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// const lfRegex = new RegExp(/\\r\\n|\\r|\\n/g);\nconst AverageBufferSize = 65535;\nfunction createUintArray(arr) {\n    let r;\n    if (arr[arr.length - 1] < 65536) {\n        r = new Uint16Array(arr.length);\n    }\n    else {\n        r = new Uint32Array(arr.length);\n    }\n    r.set(arr, 0);\n    return r;\n}\nclass LineStarts {\n    constructor(lineStarts, cr, lf, crlf, isBasicASCII) {\n        this.lineStarts = lineStarts;\n        this.cr = cr;\n        this.lf = lf;\n        this.crlf = crlf;\n        this.isBasicASCII = isBasicASCII;\n    }\n}\nfunction createLineStartsFast(str, readonly = true) {\n    const r = [0];\n    let rLength = 1;\n    for (let i = 0, len = str.length; i < len; i++) {\n        const chr = str.charCodeAt(i);\n        if (chr === 13 /* CharCode.CarriageReturn */) {\n            if (i + 1 < len && str.charCodeAt(i + 1) === 10 /* CharCode.LineFeed */) {\n                // \\r\\n... case\n                r[rLength++] = i + 2;\n                i++; // skip \\n\n            }\n            else {\n                // \\r... case\n                r[rLength++] = i + 1;\n            }\n        }\n        else if (chr === 10 /* CharCode.LineFeed */) {\n            r[rLength++] = i + 1;\n        }\n    }\n    if (readonly) {\n        return createUintArray(r);\n    }\n    else {\n        return r;\n    }\n}\nfunction createLineStarts(r, str) {\n    r.length = 0;\n    r[0] = 0;\n    let rLength = 1;\n    let cr = 0, lf = 0, crlf = 0;\n    let isBasicASCII = true;\n    for (let i = 0, len = str.length; i < len; i++) {\n        const chr = str.charCodeAt(i);\n        if (chr === 13 /* CharCode.CarriageReturn */) {\n            if (i + 1 < len && str.charCodeAt(i + 1) === 10 /* CharCode.LineFeed */) {\n                // \\r\\n... case\n                crlf++;\n                r[rLength++] = i + 2;\n                i++; // skip \\n\n            }\n            else {\n                cr++;\n                // \\r... case\n                r[rLength++] = i + 1;\n            }\n        }\n        else if (chr === 10 /* CharCode.LineFeed */) {\n            lf++;\n            r[rLength++] = i + 1;\n        }\n        else {\n            if (isBasicASCII) {\n                if (chr !== 9 /* CharCode.Tab */ && (chr < 32 || chr > 126)) {\n                    isBasicASCII = false;\n                }\n            }\n        }\n    }\n    const result = new LineStarts(createUintArray(r), cr, lf, crlf, isBasicASCII);\n    r.length = 0;\n    return result;\n}\nclass Piece {\n    constructor(bufferIndex, start, end, lineFeedCnt, length) {\n        this.bufferIndex = bufferIndex;\n        this.start = start;\n        this.end = end;\n        this.lineFeedCnt = lineFeedCnt;\n        this.length = length;\n    }\n}\nclass StringBuffer {\n    constructor(buffer, lineStarts) {\n        this.buffer = buffer;\n        this.lineStarts = lineStarts;\n    }\n}\n/**\n * Readonly snapshot for piece tree.\n * In a real multiple thread environment, to make snapshot reading always work correctly, we need to\n * 1. Make TreeNode.piece immutable, then reading and writing can run in parallel.\n * 2. TreeNode/Buffers normalization should not happen during snapshot reading.\n */\nclass PieceTreeSnapshot {\n    constructor(tree, BOM) {\n        this._pieces = [];\n        this._tree = tree;\n        this._BOM = BOM;\n        this._index = 0;\n        if (tree.root !== SENTINEL) {\n            tree.iterate(tree.root, node => {\n                if (node !== SENTINEL) {\n                    this._pieces.push(node.piece);\n                }\n                return true;\n            });\n        }\n    }\n    read() {\n        if (this._pieces.length === 0) {\n            if (this._index === 0) {\n                this._index++;\n                return this._BOM;\n            }\n            else {\n                return null;\n            }\n        }\n        if (this._index > this._pieces.length - 1) {\n            return null;\n        }\n        if (this._index === 0) {\n            return this._BOM + this._tree.getPieceContent(this._pieces[this._index++]);\n        }\n        return this._tree.getPieceContent(this._pieces[this._index++]);\n    }\n}\nclass PieceTreeSearchCache {\n    constructor(limit) {\n        this._limit = limit;\n        this._cache = [];\n    }\n    get(offset) {\n        for (let i = this._cache.length - 1; i >= 0; i--) {\n            const nodePos = this._cache[i];\n            if (nodePos.nodeStartOffset <= offset && nodePos.nodeStartOffset + nodePos.node.piece.length >= offset) {\n                return nodePos;\n            }\n        }\n        return null;\n    }\n    get2(lineNumber) {\n        for (let i = this._cache.length - 1; i >= 0; i--) {\n            const nodePos = this._cache[i];\n            if (nodePos.nodeStartLineNumber && nodePos.nodeStartLineNumber < lineNumber && nodePos.nodeStartLineNumber + nodePos.node.piece.lineFeedCnt >= lineNumber) {\n                return nodePos;\n            }\n        }\n        return null;\n    }\n    set(nodePosition) {\n        if (this._cache.length >= this._limit) {\n            this._cache.shift();\n        }\n        this._cache.push(nodePosition);\n    }\n    validate(offset) {\n        let hasInvalidVal = false;\n        const tmp = this._cache;\n        for (let i = 0; i < tmp.length; i++) {\n            const nodePos = tmp[i];\n            if (nodePos.node.parent === null || nodePos.nodeStartOffset >= offset) {\n                tmp[i] = null;\n                hasInvalidVal = true;\n                continue;\n            }\n        }\n        if (hasInvalidVal) {\n            const newArr = [];\n            for (const entry of tmp) {\n                if (entry !== null) {\n                    newArr.push(entry);\n                }\n            }\n            this._cache = newArr;\n        }\n    }\n}\nclass PieceTreeBase {\n    constructor(chunks, eol, eolNormalized) {\n        this.create(chunks, eol, eolNormalized);\n    }\n    create(chunks, eol, eolNormalized) {\n        this._buffers = [\n            new StringBuffer('', [0])\n        ];\n        this._lastChangeBufferPos = { line: 0, column: 0 };\n        this.root = SENTINEL;\n        this._lineCnt = 1;\n        this._length = 0;\n        this._EOL = eol;\n        this._EOLLength = eol.length;\n        this._EOLNormalized = eolNormalized;\n        let lastNode = null;\n        for (let i = 0, len = chunks.length; i < len; i++) {\n            if (chunks[i].buffer.length > 0) {\n                if (!chunks[i].lineStarts) {\n                    chunks[i].lineStarts = createLineStartsFast(chunks[i].buffer);\n                }\n                const piece = new Piece(i + 1, { line: 0, column: 0 }, { line: chunks[i].lineStarts.length - 1, column: chunks[i].buffer.length - chunks[i].lineStarts[chunks[i].lineStarts.length - 1] }, chunks[i].lineStarts.length - 1, chunks[i].buffer.length);\n                this._buffers.push(chunks[i]);\n                lastNode = this.rbInsertRight(lastNode, piece);\n            }\n        }\n        this._searchCache = new PieceTreeSearchCache(1);\n        this._lastVisitedLine = { lineNumber: 0, value: '' };\n        this.computeBufferMetadata();\n    }\n    normalizeEOL(eol) {\n        const averageBufferSize = AverageBufferSize;\n        const min = averageBufferSize - Math.floor(averageBufferSize / 3);\n        const max = min * 2;\n        let tempChunk = '';\n        let tempChunkLen = 0;\n        const chunks = [];\n        this.iterate(this.root, node => {\n            const str = this.getNodeContent(node);\n            const len = str.length;\n            if (tempChunkLen <= min || tempChunkLen + len < max) {\n                tempChunk += str;\n                tempChunkLen += len;\n                return true;\n            }\n            // flush anyways\n            const text = tempChunk.replace(/\\r\\n|\\r|\\n/g, eol);\n            chunks.push(new StringBuffer(text, createLineStartsFast(text)));\n            tempChunk = str;\n            tempChunkLen = len;\n            return true;\n        });\n        if (tempChunkLen > 0) {\n            const text = tempChunk.replace(/\\r\\n|\\r|\\n/g, eol);\n            chunks.push(new StringBuffer(text, createLineStartsFast(text)));\n        }\n        this.create(chunks, eol, true);\n    }\n    // #region Buffer API\n    getEOL() {\n        return this._EOL;\n    }\n    setEOL(newEOL) {\n        this._EOL = newEOL;\n        this._EOLLength = this._EOL.length;\n        this.normalizeEOL(newEOL);\n    }\n    createSnapshot(BOM) {\n        return new PieceTreeSnapshot(this, BOM);\n    }\n    getOffsetAt(lineNumber, column) {\n        let leftLen = 0; // inorder\n        let x = this.root;\n        while (x !== SENTINEL) {\n            if (x.left !== SENTINEL && x.lf_left + 1 >= lineNumber) {\n                x = x.left;\n            }\n            else if (x.lf_left + x.piece.lineFeedCnt + 1 >= lineNumber) {\n                leftLen += x.size_left;\n                // lineNumber >= 2\n                const accumualtedValInCurrentIndex = this.getAccumulatedValue(x, lineNumber - x.lf_left - 2);\n                return leftLen += accumualtedValInCurrentIndex + column - 1;\n            }\n            else {\n                lineNumber -= x.lf_left + x.piece.lineFeedCnt;\n                leftLen += x.size_left + x.piece.length;\n                x = x.right;\n            }\n        }\n        return leftLen;\n    }\n    getPositionAt(offset) {\n        offset = Math.floor(offset);\n        offset = Math.max(0, offset);\n        let x = this.root;\n        let lfCnt = 0;\n        const originalOffset = offset;\n        while (x !== SENTINEL) {\n            if (x.size_left !== 0 && x.size_left >= offset) {\n                x = x.left;\n            }\n            else if (x.size_left + x.piece.length >= offset) {\n                const out = this.getIndexOf(x, offset - x.size_left);\n                lfCnt += x.lf_left + out.index;\n                if (out.index === 0) {\n                    const lineStartOffset = this.getOffsetAt(lfCnt + 1, 1);\n                    const column = originalOffset - lineStartOffset;\n                    return new Position(lfCnt + 1, column + 1);\n                }\n                return new Position(lfCnt + 1, out.remainder + 1);\n            }\n            else {\n                offset -= x.size_left + x.piece.length;\n                lfCnt += x.lf_left + x.piece.lineFeedCnt;\n                if (x.right === SENTINEL) {\n                    // last node\n                    const lineStartOffset = this.getOffsetAt(lfCnt + 1, 1);\n                    const column = originalOffset - offset - lineStartOffset;\n                    return new Position(lfCnt + 1, column + 1);\n                }\n                else {\n                    x = x.right;\n                }\n            }\n        }\n        return new Position(1, 1);\n    }\n    getValueInRange(range, eol) {\n        if (range.startLineNumber === range.endLineNumber && range.startColumn === range.endColumn) {\n            return '';\n        }\n        const startPosition = this.nodeAt2(range.startLineNumber, range.startColumn);\n        const endPosition = this.nodeAt2(range.endLineNumber, range.endColumn);\n        const value = this.getValueInRange2(startPosition, endPosition);\n        if (eol) {\n            if (eol !== this._EOL || !this._EOLNormalized) {\n                return value.replace(/\\r\\n|\\r|\\n/g, eol);\n            }\n            if (eol === this.getEOL() && this._EOLNormalized) {\n                return value;\n            }\n            return value.replace(/\\r\\n|\\r|\\n/g, eol);\n        }\n        return value;\n    }\n    getValueInRange2(startPosition, endPosition) {\n        if (startPosition.node === endPosition.node) {\n            const node = startPosition.node;\n            const buffer = this._buffers[node.piece.bufferIndex].buffer;\n            const startOffset = this.offsetInBuffer(node.piece.bufferIndex, node.piece.start);\n            return buffer.substring(startOffset + startPosition.remainder, startOffset + endPosition.remainder);\n        }\n        let x = startPosition.node;\n        const buffer = this._buffers[x.piece.bufferIndex].buffer;\n        const startOffset = this.offsetInBuffer(x.piece.bufferIndex, x.piece.start);\n        let ret = buffer.substring(startOffset + startPosition.remainder, startOffset + x.piece.length);\n        x = x.next();\n        while (x !== SENTINEL) {\n            const buffer = this._buffers[x.piece.bufferIndex].buffer;\n            const startOffset = this.offsetInBuffer(x.piece.bufferIndex, x.piece.start);\n            if (x === endPosition.node) {\n                ret += buffer.substring(startOffset, startOffset + endPosition.remainder);\n                break;\n            }\n            else {\n                ret += buffer.substr(startOffset, x.piece.length);\n            }\n            x = x.next();\n        }\n        return ret;\n    }\n    getLinesContent() {\n        const lines = [];\n        let linesLength = 0;\n        let currentLine = '';\n        let danglingCR = false;\n        this.iterate(this.root, node => {\n            if (node === SENTINEL) {\n                return true;\n            }\n            const piece = node.piece;\n            let pieceLength = piece.length;\n            if (pieceLength === 0) {\n                return true;\n            }\n            const buffer = this._buffers[piece.bufferIndex].buffer;\n            const lineStarts = this._buffers[piece.bufferIndex].lineStarts;\n            const pieceStartLine = piece.start.line;\n            const pieceEndLine = piece.end.line;\n            let pieceStartOffset = lineStarts[pieceStartLine] + piece.start.column;\n            if (danglingCR) {\n                if (buffer.charCodeAt(pieceStartOffset) === 10 /* CharCode.LineFeed */) {\n                    // pretend the \\n was in the previous piece..\n                    pieceStartOffset++;\n                    pieceLength--;\n                }\n                lines[linesLength++] = currentLine;\n                currentLine = '';\n                danglingCR = false;\n                if (pieceLength === 0) {\n                    return true;\n                }\n            }\n            if (pieceStartLine === pieceEndLine) {\n                // this piece has no new lines\n                if (!this._EOLNormalized && buffer.charCodeAt(pieceStartOffset + pieceLength - 1) === 13 /* CharCode.CarriageReturn */) {\n                    danglingCR = true;\n                    currentLine += buffer.substr(pieceStartOffset, pieceLength - 1);\n                }\n                else {\n                    currentLine += buffer.substr(pieceStartOffset, pieceLength);\n                }\n                return true;\n            }\n            // add the text before the first line start in this piece\n            currentLine += (this._EOLNormalized\n                ? buffer.substring(pieceStartOffset, Math.max(pieceStartOffset, lineStarts[pieceStartLine + 1] - this._EOLLength))\n                : buffer.substring(pieceStartOffset, lineStarts[pieceStartLine + 1]).replace(/(\\r\\n|\\r|\\n)$/, ''));\n            lines[linesLength++] = currentLine;\n            for (let line = pieceStartLine + 1; line < pieceEndLine; line++) {\n                currentLine = (this._EOLNormalized\n                    ? buffer.substring(lineStarts[line], lineStarts[line + 1] - this._EOLLength)\n                    : buffer.substring(lineStarts[line], lineStarts[line + 1]).replace(/(\\r\\n|\\r|\\n)$/, ''));\n                lines[linesLength++] = currentLine;\n            }\n            if (!this._EOLNormalized && buffer.charCodeAt(lineStarts[pieceEndLine] + piece.end.column - 1) === 13 /* CharCode.CarriageReturn */) {\n                danglingCR = true;\n                if (piece.end.column === 0) {\n                    // The last line ended with a \\r, let's undo the push, it will be pushed by next iteration\n                    linesLength--;\n                }\n                else {\n                    currentLine = buffer.substr(lineStarts[pieceEndLine], piece.end.column - 1);\n                }\n            }\n            else {\n                currentLine = buffer.substr(lineStarts[pieceEndLine], piece.end.column);\n            }\n            return true;\n        });\n        if (danglingCR) {\n            lines[linesLength++] = currentLine;\n            currentLine = '';\n        }\n        lines[linesLength++] = currentLine;\n        return lines;\n    }\n    getLength() {\n        return this._length;\n    }\n    getLineCount() {\n        return this._lineCnt;\n    }\n    getLineContent(lineNumber) {\n        if (this._lastVisitedLine.lineNumber === lineNumber) {\n            return this._lastVisitedLine.value;\n        }\n        this._lastVisitedLine.lineNumber = lineNumber;\n        if (lineNumber === this._lineCnt) {\n            this._lastVisitedLine.value = this.getLineRawContent(lineNumber);\n        }\n        else if (this._EOLNormalized) {\n            this._lastVisitedLine.value = this.getLineRawContent(lineNumber, this._EOLLength);\n        }\n        else {\n            this._lastVisitedLine.value = this.getLineRawContent(lineNumber).replace(/(\\r\\n|\\r|\\n)$/, '');\n        }\n        return this._lastVisitedLine.value;\n    }\n    _getCharCode(nodePos) {\n        if (nodePos.remainder === nodePos.node.piece.length) {\n            // the char we want to fetch is at the head of next node.\n            const matchingNode = nodePos.node.next();\n            if (!matchingNode) {\n                return 0;\n            }\n            const buffer = this._buffers[matchingNode.piece.bufferIndex];\n            const startOffset = this.offsetInBuffer(matchingNode.piece.bufferIndex, matchingNode.piece.start);\n            return buffer.buffer.charCodeAt(startOffset);\n        }\n        else {\n            const buffer = this._buffers[nodePos.node.piece.bufferIndex];\n            const startOffset = this.offsetInBuffer(nodePos.node.piece.bufferIndex, nodePos.node.piece.start);\n            const targetOffset = startOffset + nodePos.remainder;\n            return buffer.buffer.charCodeAt(targetOffset);\n        }\n    }\n    getLineCharCode(lineNumber, index) {\n        const nodePos = this.nodeAt2(lineNumber, index + 1);\n        return this._getCharCode(nodePos);\n    }\n    getLineLength(lineNumber) {\n        if (lineNumber === this.getLineCount()) {\n            const startOffset = this.getOffsetAt(lineNumber, 1);\n            return this.getLength() - startOffset;\n        }\n        return this.getOffsetAt(lineNumber + 1, 1) - this.getOffsetAt(lineNumber, 1) - this._EOLLength;\n    }\n    getNearestChunk(offset) {\n        const nodePos = this.nodeAt(offset);\n        if (nodePos.remainder === nodePos.node.piece.length) {\n            // the offset is at the head of next node.\n            const matchingNode = nodePos.node.next();\n            if (!matchingNode || matchingNode === SENTINEL) {\n                return '';\n            }\n            const buffer = this._buffers[matchingNode.piece.bufferIndex];\n            const startOffset = this.offsetInBuffer(matchingNode.piece.bufferIndex, matchingNode.piece.start);\n            return buffer.buffer.substring(startOffset, startOffset + matchingNode.piece.length);\n        }\n        else {\n            const buffer = this._buffers[nodePos.node.piece.bufferIndex];\n            const startOffset = this.offsetInBuffer(nodePos.node.piece.bufferIndex, nodePos.node.piece.start);\n            const targetOffset = startOffset + nodePos.remainder;\n            const targetEnd = startOffset + nodePos.node.piece.length;\n            return buffer.buffer.substring(targetOffset, targetEnd);\n        }\n    }\n    findMatchesInNode(node, searcher, startLineNumber, startColumn, startCursor, endCursor, searchData, captureMatches, limitResultCount, resultLen, result) {\n        const buffer = this._buffers[node.piece.bufferIndex];\n        const startOffsetInBuffer = this.offsetInBuffer(node.piece.bufferIndex, node.piece.start);\n        const start = this.offsetInBuffer(node.piece.bufferIndex, startCursor);\n        const end = this.offsetInBuffer(node.piece.bufferIndex, endCursor);\n        let m;\n        // Reset regex to search from the beginning\n        const ret = { line: 0, column: 0 };\n        let searchText;\n        let offsetInBuffer;\n        if (searcher._wordSeparators) {\n            searchText = buffer.buffer.substring(start, end);\n            offsetInBuffer = (offset) => offset + start;\n            searcher.reset(0);\n        }\n        else {\n            searchText = buffer.buffer;\n            offsetInBuffer = (offset) => offset;\n            searcher.reset(start);\n        }\n        do {\n            m = searcher.next(searchText);\n            if (m) {\n                if (offsetInBuffer(m.index) >= end) {\n                    return resultLen;\n                }\n                this.positionInBuffer(node, offsetInBuffer(m.index) - startOffsetInBuffer, ret);\n                const lineFeedCnt = this.getLineFeedCnt(node.piece.bufferIndex, startCursor, ret);\n                const retStartColumn = ret.line === startCursor.line ? ret.column - startCursor.column + startColumn : ret.column + 1;\n                const retEndColumn = retStartColumn + m[0].length;\n                result[resultLen++] = createFindMatch(new Range(startLineNumber + lineFeedCnt, retStartColumn, startLineNumber + lineFeedCnt, retEndColumn), m, captureMatches);\n                if (offsetInBuffer(m.index) + m[0].length >= end) {\n                    return resultLen;\n                }\n                if (resultLen >= limitResultCount) {\n                    return resultLen;\n                }\n            }\n        } while (m);\n        return resultLen;\n    }\n    findMatchesLineByLine(searchRange, searchData, captureMatches, limitResultCount) {\n        const result = [];\n        let resultLen = 0;\n        const searcher = new Searcher(searchData.wordSeparators, searchData.regex);\n        let startPosition = this.nodeAt2(searchRange.startLineNumber, searchRange.startColumn);\n        if (startPosition === null) {\n            return [];\n        }\n        const endPosition = this.nodeAt2(searchRange.endLineNumber, searchRange.endColumn);\n        if (endPosition === null) {\n            return [];\n        }\n        let start = this.positionInBuffer(startPosition.node, startPosition.remainder);\n        const end = this.positionInBuffer(endPosition.node, endPosition.remainder);\n        if (startPosition.node === endPosition.node) {\n            this.findMatchesInNode(startPosition.node, searcher, searchRange.startLineNumber, searchRange.startColumn, start, end, searchData, captureMatches, limitResultCount, resultLen, result);\n            return result;\n        }\n        let startLineNumber = searchRange.startLineNumber;\n        let currentNode = startPosition.node;\n        while (currentNode !== endPosition.node) {\n            const lineBreakCnt = this.getLineFeedCnt(currentNode.piece.bufferIndex, start, currentNode.piece.end);\n            if (lineBreakCnt >= 1) {\n                // last line break position\n                const lineStarts = this._buffers[currentNode.piece.bufferIndex].lineStarts;\n                const startOffsetInBuffer = this.offsetInBuffer(currentNode.piece.bufferIndex, currentNode.piece.start);\n                const nextLineStartOffset = lineStarts[start.line + lineBreakCnt];\n                const startColumn = startLineNumber === searchRange.startLineNumber ? searchRange.startColumn : 1;\n                resultLen = this.findMatchesInNode(currentNode, searcher, startLineNumber, startColumn, start, this.positionInBuffer(currentNode, nextLineStartOffset - startOffsetInBuffer), searchData, captureMatches, limitResultCount, resultLen, result);\n                if (resultLen >= limitResultCount) {\n                    return result;\n                }\n                startLineNumber += lineBreakCnt;\n            }\n            const startColumn = startLineNumber === searchRange.startLineNumber ? searchRange.startColumn - 1 : 0;\n            // search for the remaining content\n            if (startLineNumber === searchRange.endLineNumber) {\n                const text = this.getLineContent(startLineNumber).substring(startColumn, searchRange.endColumn - 1);\n                resultLen = this._findMatchesInLine(searchData, searcher, text, searchRange.endLineNumber, startColumn, resultLen, result, captureMatches, limitResultCount);\n                return result;\n            }\n            resultLen = this._findMatchesInLine(searchData, searcher, this.getLineContent(startLineNumber).substr(startColumn), startLineNumber, startColumn, resultLen, result, captureMatches, limitResultCount);\n            if (resultLen >= limitResultCount) {\n                return result;\n            }\n            startLineNumber++;\n            startPosition = this.nodeAt2(startLineNumber, 1);\n            currentNode = startPosition.node;\n            start = this.positionInBuffer(startPosition.node, startPosition.remainder);\n        }\n        if (startLineNumber === searchRange.endLineNumber) {\n            const startColumn = startLineNumber === searchRange.startLineNumber ? searchRange.startColumn - 1 : 0;\n            const text = this.getLineContent(startLineNumber).substring(startColumn, searchRange.endColumn - 1);\n            resultLen = this._findMatchesInLine(searchData, searcher, text, searchRange.endLineNumber, startColumn, resultLen, result, captureMatches, limitResultCount);\n            return result;\n        }\n        const startColumn = startLineNumber === searchRange.startLineNumber ? searchRange.startColumn : 1;\n        resultLen = this.findMatchesInNode(endPosition.node, searcher, startLineNumber, startColumn, start, end, searchData, captureMatches, limitResultCount, resultLen, result);\n        return result;\n    }\n    _findMatchesInLine(searchData, searcher, text, lineNumber, deltaOffset, resultLen, result, captureMatches, limitResultCount) {\n        const wordSeparators = searchData.wordSeparators;\n        if (!captureMatches && searchData.simpleSearch) {\n            const searchString = searchData.simpleSearch;\n            const searchStringLen = searchString.length;\n            const textLength = text.length;\n            let lastMatchIndex = -searchStringLen;\n            while ((lastMatchIndex = text.indexOf(searchString, lastMatchIndex + searchStringLen)) !== -1) {\n                if (!wordSeparators || isValidMatch(wordSeparators, text, textLength, lastMatchIndex, searchStringLen)) {\n                    result[resultLen++] = new FindMatch(new Range(lineNumber, lastMatchIndex + 1 + deltaOffset, lineNumber, lastMatchIndex + 1 + searchStringLen + deltaOffset), null);\n                    if (resultLen >= limitResultCount) {\n                        return resultLen;\n                    }\n                }\n            }\n            return resultLen;\n        }\n        let m;\n        // Reset regex to search from the beginning\n        searcher.reset(0);\n        do {\n            m = searcher.next(text);\n            if (m) {\n                result[resultLen++] = createFindMatch(new Range(lineNumber, m.index + 1 + deltaOffset, lineNumber, m.index + 1 + m[0].length + deltaOffset), m, captureMatches);\n                if (resultLen >= limitResultCount) {\n                    return resultLen;\n                }\n            }\n        } while (m);\n        return resultLen;\n    }\n    // #endregion\n    // #region Piece Table\n    insert(offset, value, eolNormalized = false) {\n        this._EOLNormalized = this._EOLNormalized && eolNormalized;\n        this._lastVisitedLine.lineNumber = 0;\n        this._lastVisitedLine.value = '';\n        if (this.root !== SENTINEL) {\n            const { node, remainder, nodeStartOffset } = this.nodeAt(offset);\n            const piece = node.piece;\n            const bufferIndex = piece.bufferIndex;\n            const insertPosInBuffer = this.positionInBuffer(node, remainder);\n            if (node.piece.bufferIndex === 0 &&\n                piece.end.line === this._lastChangeBufferPos.line &&\n                piece.end.column === this._lastChangeBufferPos.column &&\n                (nodeStartOffset + piece.length === offset) &&\n                value.length < AverageBufferSize) {\n                // changed buffer\n                this.appendToNode(node, value);\n                this.computeBufferMetadata();\n                return;\n            }\n            if (nodeStartOffset === offset) {\n                this.insertContentToNodeLeft(value, node);\n                this._searchCache.validate(offset);\n            }\n            else if (nodeStartOffset + node.piece.length > offset) {\n                // we are inserting into the middle of a node.\n                const nodesToDel = [];\n                let newRightPiece = new Piece(piece.bufferIndex, insertPosInBuffer, piece.end, this.getLineFeedCnt(piece.bufferIndex, insertPosInBuffer, piece.end), this.offsetInBuffer(bufferIndex, piece.end) - this.offsetInBuffer(bufferIndex, insertPosInBuffer));\n                if (this.shouldCheckCRLF() && this.endWithCR(value)) {\n                    const headOfRight = this.nodeCharCodeAt(node, remainder);\n                    if (headOfRight === 10 /** \\n */) {\n                        const newStart = { line: newRightPiece.start.line + 1, column: 0 };\n                        newRightPiece = new Piece(newRightPiece.bufferIndex, newStart, newRightPiece.end, this.getLineFeedCnt(newRightPiece.bufferIndex, newStart, newRightPiece.end), newRightPiece.length - 1);\n                        value += '\\n';\n                    }\n                }\n                // reuse node for content before insertion point.\n                if (this.shouldCheckCRLF() && this.startWithLF(value)) {\n                    const tailOfLeft = this.nodeCharCodeAt(node, remainder - 1);\n                    if (tailOfLeft === 13 /** \\r */) {\n                        const previousPos = this.positionInBuffer(node, remainder - 1);\n                        this.deleteNodeTail(node, previousPos);\n                        value = '\\r' + value;\n                        if (node.piece.length === 0) {\n                            nodesToDel.push(node);\n                        }\n                    }\n                    else {\n                        this.deleteNodeTail(node, insertPosInBuffer);\n                    }\n                }\n                else {\n                    this.deleteNodeTail(node, insertPosInBuffer);\n                }\n                const newPieces = this.createNewPieces(value);\n                if (newRightPiece.length > 0) {\n                    this.rbInsertRight(node, newRightPiece);\n                }\n                let tmpNode = node;\n                for (let k = 0; k < newPieces.length; k++) {\n                    tmpNode = this.rbInsertRight(tmpNode, newPieces[k]);\n                }\n                this.deleteNodes(nodesToDel);\n            }\n            else {\n                this.insertContentToNodeRight(value, node);\n            }\n        }\n        else {\n            // insert new node\n            const pieces = this.createNewPieces(value);\n            let node = this.rbInsertLeft(null, pieces[0]);\n            for (let k = 1; k < pieces.length; k++) {\n                node = this.rbInsertRight(node, pieces[k]);\n            }\n        }\n        // todo, this is too brutal. Total line feed count should be updated the same way as lf_left.\n        this.computeBufferMetadata();\n    }\n    delete(offset, cnt) {\n        this._lastVisitedLine.lineNumber = 0;\n        this._lastVisitedLine.value = '';\n        if (cnt <= 0 || this.root === SENTINEL) {\n            return;\n        }\n        const startPosition = this.nodeAt(offset);\n        const endPosition = this.nodeAt(offset + cnt);\n        const startNode = startPosition.node;\n        const endNode = endPosition.node;\n        if (startNode === endNode) {\n            const startSplitPosInBuffer = this.positionInBuffer(startNode, startPosition.remainder);\n            const endSplitPosInBuffer = this.positionInBuffer(startNode, endPosition.remainder);\n            if (startPosition.nodeStartOffset === offset) {\n                if (cnt === startNode.piece.length) { // delete node\n                    const next = startNode.next();\n                    rbDelete(this, startNode);\n                    this.validateCRLFWithPrevNode(next);\n                    this.computeBufferMetadata();\n                    return;\n                }\n                this.deleteNodeHead(startNode, endSplitPosInBuffer);\n                this._searchCache.validate(offset);\n                this.validateCRLFWithPrevNode(startNode);\n                this.computeBufferMetadata();\n                return;\n            }\n            if (startPosition.nodeStartOffset + startNode.piece.length === offset + cnt) {\n                this.deleteNodeTail(startNode, startSplitPosInBuffer);\n                this.validateCRLFWithNextNode(startNode);\n                this.computeBufferMetadata();\n                return;\n            }\n            // delete content in the middle, this node will be splitted to nodes\n            this.shrinkNode(startNode, startSplitPosInBuffer, endSplitPosInBuffer);\n            this.computeBufferMetadata();\n            return;\n        }\n        const nodesToDel = [];\n        const startSplitPosInBuffer = this.positionInBuffer(startNode, startPosition.remainder);\n        this.deleteNodeTail(startNode, startSplitPosInBuffer);\n        this._searchCache.validate(offset);\n        if (startNode.piece.length === 0) {\n            nodesToDel.push(startNode);\n        }\n        // update last touched node\n        const endSplitPosInBuffer = this.positionInBuffer(endNode, endPosition.remainder);\n        this.deleteNodeHead(endNode, endSplitPosInBuffer);\n        if (endNode.piece.length === 0) {\n            nodesToDel.push(endNode);\n        }\n        // delete nodes in between\n        const secondNode = startNode.next();\n        for (let node = secondNode; node !== SENTINEL && node !== endNode; node = node.next()) {\n            nodesToDel.push(node);\n        }\n        const prev = startNode.piece.length === 0 ? startNode.prev() : startNode;\n        this.deleteNodes(nodesToDel);\n        this.validateCRLFWithNextNode(prev);\n        this.computeBufferMetadata();\n    }\n    insertContentToNodeLeft(value, node) {\n        // we are inserting content to the beginning of node\n        const nodesToDel = [];\n        if (this.shouldCheckCRLF() && this.endWithCR(value) && this.startWithLF(node)) {\n            // move `\\n` to new node.\n            const piece = node.piece;\n            const newStart = { line: piece.start.line + 1, column: 0 };\n            const nPiece = new Piece(piece.bufferIndex, newStart, piece.end, this.getLineFeedCnt(piece.bufferIndex, newStart, piece.end), piece.length - 1);\n            node.piece = nPiece;\n            value += '\\n';\n            updateTreeMetadata(this, node, -1, -1);\n            if (node.piece.length === 0) {\n                nodesToDel.push(node);\n            }\n        }\n        const newPieces = this.createNewPieces(value);\n        let newNode = this.rbInsertLeft(node, newPieces[newPieces.length - 1]);\n        for (let k = newPieces.length - 2; k >= 0; k--) {\n            newNode = this.rbInsertLeft(newNode, newPieces[k]);\n        }\n        this.validateCRLFWithPrevNode(newNode);\n        this.deleteNodes(nodesToDel);\n    }\n    insertContentToNodeRight(value, node) {\n        // we are inserting to the right of this node.\n        if (this.adjustCarriageReturnFromNext(value, node)) {\n            // move \\n to the new node.\n            value += '\\n';\n        }\n        const newPieces = this.createNewPieces(value);\n        const newNode = this.rbInsertRight(node, newPieces[0]);\n        let tmpNode = newNode;\n        for (let k = 1; k < newPieces.length; k++) {\n            tmpNode = this.rbInsertRight(tmpNode, newPieces[k]);\n        }\n        this.validateCRLFWithPrevNode(newNode);\n    }\n    positionInBuffer(node, remainder, ret) {\n        const piece = node.piece;\n        const bufferIndex = node.piece.bufferIndex;\n        const lineStarts = this._buffers[bufferIndex].lineStarts;\n        const startOffset = lineStarts[piece.start.line] + piece.start.column;\n        const offset = startOffset + remainder;\n        // binary search offset between startOffset and endOffset\n        let low = piece.start.line;\n        let high = piece.end.line;\n        let mid = 0;\n        let midStop = 0;\n        let midStart = 0;\n        while (low <= high) {\n            mid = low + ((high - low) / 2) | 0;\n            midStart = lineStarts[mid];\n            if (mid === high) {\n                break;\n            }\n            midStop = lineStarts[mid + 1];\n            if (offset < midStart) {\n                high = mid - 1;\n            }\n            else if (offset >= midStop) {\n                low = mid + 1;\n            }\n            else {\n                break;\n            }\n        }\n        if (ret) {\n            ret.line = mid;\n            ret.column = offset - midStart;\n            return null;\n        }\n        return {\n            line: mid,\n            column: offset - midStart\n        };\n    }\n    getLineFeedCnt(bufferIndex, start, end) {\n        // we don't need to worry about start: abc\\r|\\n, or abc|\\r, or abc|\\n, or abc|\\r\\n doesn't change the fact that, there is one line break after start.\n        // now let's take care of end: abc\\r|\\n, if end is in between \\r and \\n, we need to add line feed count by 1\n        if (end.column === 0) {\n            return end.line - start.line;\n        }\n        const lineStarts = this._buffers[bufferIndex].lineStarts;\n        if (end.line === lineStarts.length - 1) { // it means, there is no \\n after end, otherwise, there will be one more lineStart.\n            return end.line - start.line;\n        }\n        const nextLineStartOffset = lineStarts[end.line + 1];\n        const endOffset = lineStarts[end.line] + end.column;\n        if (nextLineStartOffset > endOffset + 1) { // there are more than 1 character after end, which means it can't be \\n\n            return end.line - start.line;\n        }\n        // endOffset + 1 === nextLineStartOffset\n        // character at endOffset is \\n, so we check the character before first\n        // if character at endOffset is \\r, end.column is 0 and we can't get here.\n        const previousCharOffset = endOffset - 1; // end.column > 0 so it's okay.\n        const buffer = this._buffers[bufferIndex].buffer;\n        if (buffer.charCodeAt(previousCharOffset) === 13) {\n            return end.line - start.line + 1;\n        }\n        else {\n            return end.line - start.line;\n        }\n    }\n    offsetInBuffer(bufferIndex, cursor) {\n        const lineStarts = this._buffers[bufferIndex].lineStarts;\n        return lineStarts[cursor.line] + cursor.column;\n    }\n    deleteNodes(nodes) {\n        for (let i = 0; i < nodes.length; i++) {\n            rbDelete(this, nodes[i]);\n        }\n    }\n    createNewPieces(text) {\n        if (text.length > AverageBufferSize) {\n            // the content is large, operations like substring, charCode becomes slow\n            // so here we split it into smaller chunks, just like what we did for CR/LF normalization\n            const newPieces = [];\n            while (text.length > AverageBufferSize) {\n                const lastChar = text.charCodeAt(AverageBufferSize - 1);\n                let splitText;\n                if (lastChar === 13 /* CharCode.CarriageReturn */ || (lastChar >= 0xD800 && lastChar <= 0xDBFF)) {\n                    // last character is \\r or a high surrogate => keep it back\n                    splitText = text.substring(0, AverageBufferSize - 1);\n                    text = text.substring(AverageBufferSize - 1);\n                }\n                else {\n                    splitText = text.substring(0, AverageBufferSize);\n                    text = text.substring(AverageBufferSize);\n                }\n                const lineStarts = createLineStartsFast(splitText);\n                newPieces.push(new Piece(this._buffers.length, /* buffer index */ { line: 0, column: 0 }, { line: lineStarts.length - 1, column: splitText.length - lineStarts[lineStarts.length - 1] }, lineStarts.length - 1, splitText.length));\n                this._buffers.push(new StringBuffer(splitText, lineStarts));\n            }\n            const lineStarts = createLineStartsFast(text);\n            newPieces.push(new Piece(this._buffers.length, /* buffer index */ { line: 0, column: 0 }, { line: lineStarts.length - 1, column: text.length - lineStarts[lineStarts.length - 1] }, lineStarts.length - 1, text.length));\n            this._buffers.push(new StringBuffer(text, lineStarts));\n            return newPieces;\n        }\n        let startOffset = this._buffers[0].buffer.length;\n        const lineStarts = createLineStartsFast(text, false);\n        let start = this._lastChangeBufferPos;\n        if (this._buffers[0].lineStarts[this._buffers[0].lineStarts.length - 1] === startOffset\n            && startOffset !== 0\n            && this.startWithLF(text)\n            && this.endWithCR(this._buffers[0].buffer) // todo, we can check this._lastChangeBufferPos's column as it's the last one\n        ) {\n            this._lastChangeBufferPos = { line: this._lastChangeBufferPos.line, column: this._lastChangeBufferPos.column + 1 };\n            start = this._lastChangeBufferPos;\n            for (let i = 0; i < lineStarts.length; i++) {\n                lineStarts[i] += startOffset + 1;\n            }\n            this._buffers[0].lineStarts = this._buffers[0].lineStarts.concat(lineStarts.slice(1));\n            this._buffers[0].buffer += '_' + text;\n            startOffset += 1;\n        }\n        else {\n            if (startOffset !== 0) {\n                for (let i = 0; i < lineStarts.length; i++) {\n                    lineStarts[i] += startOffset;\n                }\n            }\n            this._buffers[0].lineStarts = this._buffers[0].lineStarts.concat(lineStarts.slice(1));\n            this._buffers[0].buffer += text;\n        }\n        const endOffset = this._buffers[0].buffer.length;\n        const endIndex = this._buffers[0].lineStarts.length - 1;\n        const endColumn = endOffset - this._buffers[0].lineStarts[endIndex];\n        const endPos = { line: endIndex, column: endColumn };\n        const newPiece = new Piece(0, /** todo@peng */ start, endPos, this.getLineFeedCnt(0, start, endPos), endOffset - startOffset);\n        this._lastChangeBufferPos = endPos;\n        return [newPiece];\n    }\n    getLineRawContent(lineNumber, endOffset = 0) {\n        let x = this.root;\n        let ret = '';\n        const cache = this._searchCache.get2(lineNumber);\n        if (cache) {\n            x = cache.node;\n            const prevAccumulatedValue = this.getAccumulatedValue(x, lineNumber - cache.nodeStartLineNumber - 1);\n            const buffer = this._buffers[x.piece.bufferIndex].buffer;\n            const startOffset = this.offsetInBuffer(x.piece.bufferIndex, x.piece.start);\n            if (cache.nodeStartLineNumber + x.piece.lineFeedCnt === lineNumber) {\n                ret = buffer.substring(startOffset + prevAccumulatedValue, startOffset + x.piece.length);\n            }\n            else {\n                const accumulatedValue = this.getAccumulatedValue(x, lineNumber - cache.nodeStartLineNumber);\n                return buffer.substring(startOffset + prevAccumulatedValue, startOffset + accumulatedValue - endOffset);\n            }\n        }\n        else {\n            let nodeStartOffset = 0;\n            const originalLineNumber = lineNumber;\n            while (x !== SENTINEL) {\n                if (x.left !== SENTINEL && x.lf_left >= lineNumber - 1) {\n                    x = x.left;\n                }\n                else if (x.lf_left + x.piece.lineFeedCnt > lineNumber - 1) {\n                    const prevAccumulatedValue = this.getAccumulatedValue(x, lineNumber - x.lf_left - 2);\n                    const accumulatedValue = this.getAccumulatedValue(x, lineNumber - x.lf_left - 1);\n                    const buffer = this._buffers[x.piece.bufferIndex].buffer;\n                    const startOffset = this.offsetInBuffer(x.piece.bufferIndex, x.piece.start);\n                    nodeStartOffset += x.size_left;\n                    this._searchCache.set({\n                        node: x,\n                        nodeStartOffset,\n                        nodeStartLineNumber: originalLineNumber - (lineNumber - 1 - x.lf_left)\n                    });\n                    return buffer.substring(startOffset + prevAccumulatedValue, startOffset + accumulatedValue - endOffset);\n                }\n                else if (x.lf_left + x.piece.lineFeedCnt === lineNumber - 1) {\n                    const prevAccumulatedValue = this.getAccumulatedValue(x, lineNumber - x.lf_left - 2);\n                    const buffer = this._buffers[x.piece.bufferIndex].buffer;\n                    const startOffset = this.offsetInBuffer(x.piece.bufferIndex, x.piece.start);\n                    ret = buffer.substring(startOffset + prevAccumulatedValue, startOffset + x.piece.length);\n                    break;\n                }\n                else {\n                    lineNumber -= x.lf_left + x.piece.lineFeedCnt;\n                    nodeStartOffset += x.size_left + x.piece.length;\n                    x = x.right;\n                }\n            }\n        }\n        // search in order, to find the node contains end column\n        x = x.next();\n        while (x !== SENTINEL) {\n            const buffer = this._buffers[x.piece.bufferIndex].buffer;\n            if (x.piece.lineFeedCnt > 0) {\n                const accumulatedValue = this.getAccumulatedValue(x, 0);\n                const startOffset = this.offsetInBuffer(x.piece.bufferIndex, x.piece.start);\n                ret += buffer.substring(startOffset, startOffset + accumulatedValue - endOffset);\n                return ret;\n            }\n            else {\n                const startOffset = this.offsetInBuffer(x.piece.bufferIndex, x.piece.start);\n                ret += buffer.substr(startOffset, x.piece.length);\n            }\n            x = x.next();\n        }\n        return ret;\n    }\n    computeBufferMetadata() {\n        let x = this.root;\n        let lfCnt = 1;\n        let len = 0;\n        while (x !== SENTINEL) {\n            lfCnt += x.lf_left + x.piece.lineFeedCnt;\n            len += x.size_left + x.piece.length;\n            x = x.right;\n        }\n        this._lineCnt = lfCnt;\n        this._length = len;\n        this._searchCache.validate(this._length);\n    }\n    // #region node operations\n    getIndexOf(node, accumulatedValue) {\n        const piece = node.piece;\n        const pos = this.positionInBuffer(node, accumulatedValue);\n        const lineCnt = pos.line - piece.start.line;\n        if (this.offsetInBuffer(piece.bufferIndex, piece.end) - this.offsetInBuffer(piece.bufferIndex, piece.start) === accumulatedValue) {\n            // we are checking the end of this node, so a CRLF check is necessary.\n            const realLineCnt = this.getLineFeedCnt(node.piece.bufferIndex, piece.start, pos);\n            if (realLineCnt !== lineCnt) {\n                // aha yes, CRLF\n                return { index: realLineCnt, remainder: 0 };\n            }\n        }\n        return { index: lineCnt, remainder: pos.column };\n    }\n    getAccumulatedValue(node, index) {\n        if (index < 0) {\n            return 0;\n        }\n        const piece = node.piece;\n        const lineStarts = this._buffers[piece.bufferIndex].lineStarts;\n        const expectedLineStartIndex = piece.start.line + index + 1;\n        if (expectedLineStartIndex > piece.end.line) {\n            return lineStarts[piece.end.line] + piece.end.column - lineStarts[piece.start.line] - piece.start.column;\n        }\n        else {\n            return lineStarts[expectedLineStartIndex] - lineStarts[piece.start.line] - piece.start.column;\n        }\n    }\n    deleteNodeTail(node, pos) {\n        const piece = node.piece;\n        const originalLFCnt = piece.lineFeedCnt;\n        const originalEndOffset = this.offsetInBuffer(piece.bufferIndex, piece.end);\n        const newEnd = pos;\n        const newEndOffset = this.offsetInBuffer(piece.bufferIndex, newEnd);\n        const newLineFeedCnt = this.getLineFeedCnt(piece.bufferIndex, piece.start, newEnd);\n        const lf_delta = newLineFeedCnt - originalLFCnt;\n        const size_delta = newEndOffset - originalEndOffset;\n        const newLength = piece.length + size_delta;\n        node.piece = new Piece(piece.bufferIndex, piece.start, newEnd, newLineFeedCnt, newLength);\n        updateTreeMetadata(this, node, size_delta, lf_delta);\n    }\n    deleteNodeHead(node, pos) {\n        const piece = node.piece;\n        const originalLFCnt = piece.lineFeedCnt;\n        const originalStartOffset = this.offsetInBuffer(piece.bufferIndex, piece.start);\n        const newStart = pos;\n        const newLineFeedCnt = this.getLineFeedCnt(piece.bufferIndex, newStart, piece.end);\n        const newStartOffset = this.offsetInBuffer(piece.bufferIndex, newStart);\n        const lf_delta = newLineFeedCnt - originalLFCnt;\n        const size_delta = originalStartOffset - newStartOffset;\n        const newLength = piece.length + size_delta;\n        node.piece = new Piece(piece.bufferIndex, newStart, piece.end, newLineFeedCnt, newLength);\n        updateTreeMetadata(this, node, size_delta, lf_delta);\n    }\n    shrinkNode(node, start, end) {\n        const piece = node.piece;\n        const originalStartPos = piece.start;\n        const originalEndPos = piece.end;\n        // old piece, originalStartPos, start\n        const oldLength = piece.length;\n        const oldLFCnt = piece.lineFeedCnt;\n        const newEnd = start;\n        const newLineFeedCnt = this.getLineFeedCnt(piece.bufferIndex, piece.start, newEnd);\n        const newLength = this.offsetInBuffer(piece.bufferIndex, start) - this.offsetInBuffer(piece.bufferIndex, originalStartPos);\n        node.piece = new Piece(piece.bufferIndex, piece.start, newEnd, newLineFeedCnt, newLength);\n        updateTreeMetadata(this, node, newLength - oldLength, newLineFeedCnt - oldLFCnt);\n        // new right piece, end, originalEndPos\n        const newPiece = new Piece(piece.bufferIndex, end, originalEndPos, this.getLineFeedCnt(piece.bufferIndex, end, originalEndPos), this.offsetInBuffer(piece.bufferIndex, originalEndPos) - this.offsetInBuffer(piece.bufferIndex, end));\n        const newNode = this.rbInsertRight(node, newPiece);\n        this.validateCRLFWithPrevNode(newNode);\n    }\n    appendToNode(node, value) {\n        if (this.adjustCarriageReturnFromNext(value, node)) {\n            value += '\\n';\n        }\n        const hitCRLF = this.shouldCheckCRLF() && this.startWithLF(value) && this.endWithCR(node);\n        const startOffset = this._buffers[0].buffer.length;\n        this._buffers[0].buffer += value;\n        const lineStarts = createLineStartsFast(value, false);\n        for (let i = 0; i < lineStarts.length; i++) {\n            lineStarts[i] += startOffset;\n        }\n        if (hitCRLF) {\n            const prevStartOffset = this._buffers[0].lineStarts[this._buffers[0].lineStarts.length - 2];\n            this._buffers[0].lineStarts.pop();\n            // _lastChangeBufferPos is already wrong\n            this._lastChangeBufferPos = { line: this._lastChangeBufferPos.line - 1, column: startOffset - prevStartOffset };\n        }\n        this._buffers[0].lineStarts = this._buffers[0].lineStarts.concat(lineStarts.slice(1));\n        const endIndex = this._buffers[0].lineStarts.length - 1;\n        const endColumn = this._buffers[0].buffer.length - this._buffers[0].lineStarts[endIndex];\n        const newEnd = { line: endIndex, column: endColumn };\n        const newLength = node.piece.length + value.length;\n        const oldLineFeedCnt = node.piece.lineFeedCnt;\n        const newLineFeedCnt = this.getLineFeedCnt(0, node.piece.start, newEnd);\n        const lf_delta = newLineFeedCnt - oldLineFeedCnt;\n        node.piece = new Piece(node.piece.bufferIndex, node.piece.start, newEnd, newLineFeedCnt, newLength);\n        this._lastChangeBufferPos = newEnd;\n        updateTreeMetadata(this, node, value.length, lf_delta);\n    }\n    nodeAt(offset) {\n        let x = this.root;\n        const cache = this._searchCache.get(offset);\n        if (cache) {\n            return {\n                node: cache.node,\n                nodeStartOffset: cache.nodeStartOffset,\n                remainder: offset - cache.nodeStartOffset\n            };\n        }\n        let nodeStartOffset = 0;\n        while (x !== SENTINEL) {\n            if (x.size_left > offset) {\n                x = x.left;\n            }\n            else if (x.size_left + x.piece.length >= offset) {\n                nodeStartOffset += x.size_left;\n                const ret = {\n                    node: x,\n                    remainder: offset - x.size_left,\n                    nodeStartOffset\n                };\n                this._searchCache.set(ret);\n                return ret;\n            }\n            else {\n                offset -= x.size_left + x.piece.length;\n                nodeStartOffset += x.size_left + x.piece.length;\n                x = x.right;\n            }\n        }\n        return null;\n    }\n    nodeAt2(lineNumber, column) {\n        let x = this.root;\n        let nodeStartOffset = 0;\n        while (x !== SENTINEL) {\n            if (x.left !== SENTINEL && x.lf_left >= lineNumber - 1) {\n                x = x.left;\n            }\n            else if (x.lf_left + x.piece.lineFeedCnt > lineNumber - 1) {\n                const prevAccumualtedValue = this.getAccumulatedValue(x, lineNumber - x.lf_left - 2);\n                const accumulatedValue = this.getAccumulatedValue(x, lineNumber - x.lf_left - 1);\n                nodeStartOffset += x.size_left;\n                return {\n                    node: x,\n                    remainder: Math.min(prevAccumualtedValue + column - 1, accumulatedValue),\n                    nodeStartOffset\n                };\n            }\n            else if (x.lf_left + x.piece.lineFeedCnt === lineNumber - 1) {\n                const prevAccumualtedValue = this.getAccumulatedValue(x, lineNumber - x.lf_left - 2);\n                if (prevAccumualtedValue + column - 1 <= x.piece.length) {\n                    return {\n                        node: x,\n                        remainder: prevAccumualtedValue + column - 1,\n                        nodeStartOffset\n                    };\n                }\n                else {\n                    column -= x.piece.length - prevAccumualtedValue;\n                    break;\n                }\n            }\n            else {\n                lineNumber -= x.lf_left + x.piece.lineFeedCnt;\n                nodeStartOffset += x.size_left + x.piece.length;\n                x = x.right;\n            }\n        }\n        // search in order, to find the node contains position.column\n        x = x.next();\n        while (x !== SENTINEL) {\n            if (x.piece.lineFeedCnt > 0) {\n                const accumulatedValue = this.getAccumulatedValue(x, 0);\n                const nodeStartOffset = this.offsetOfNode(x);\n                return {\n                    node: x,\n                    remainder: Math.min(column - 1, accumulatedValue),\n                    nodeStartOffset\n                };\n            }\n            else {\n                if (x.piece.length >= column - 1) {\n                    const nodeStartOffset = this.offsetOfNode(x);\n                    return {\n                        node: x,\n                        remainder: column - 1,\n                        nodeStartOffset\n                    };\n                }\n                else {\n                    column -= x.piece.length;\n                }\n            }\n            x = x.next();\n        }\n        return null;\n    }\n    nodeCharCodeAt(node, offset) {\n        if (node.piece.lineFeedCnt < 1) {\n            return -1;\n        }\n        const buffer = this._buffers[node.piece.bufferIndex];\n        const newOffset = this.offsetInBuffer(node.piece.bufferIndex, node.piece.start) + offset;\n        return buffer.buffer.charCodeAt(newOffset);\n    }\n    offsetOfNode(node) {\n        if (!node) {\n            return 0;\n        }\n        let pos = node.size_left;\n        while (node !== this.root) {\n            if (node.parent.right === node) {\n                pos += node.parent.size_left + node.parent.piece.length;\n            }\n            node = node.parent;\n        }\n        return pos;\n    }\n    // #endregion\n    // #region CRLF\n    shouldCheckCRLF() {\n        return !(this._EOLNormalized && this._EOL === '\\n');\n    }\n    startWithLF(val) {\n        if (typeof val === 'string') {\n            return val.charCodeAt(0) === 10;\n        }\n        if (val === SENTINEL || val.piece.lineFeedCnt === 0) {\n            return false;\n        }\n        const piece = val.piece;\n        const lineStarts = this._buffers[piece.bufferIndex].lineStarts;\n        const line = piece.start.line;\n        const startOffset = lineStarts[line] + piece.start.column;\n        if (line === lineStarts.length - 1) {\n            // last line, so there is no line feed at the end of this line\n            return false;\n        }\n        const nextLineOffset = lineStarts[line + 1];\n        if (nextLineOffset > startOffset + 1) {\n            return false;\n        }\n        return this._buffers[piece.bufferIndex].buffer.charCodeAt(startOffset) === 10;\n    }\n    endWithCR(val) {\n        if (typeof val === 'string') {\n            return val.charCodeAt(val.length - 1) === 13;\n        }\n        if (val === SENTINEL || val.piece.lineFeedCnt === 0) {\n            return false;\n        }\n        return this.nodeCharCodeAt(val, val.piece.length - 1) === 13;\n    }\n    validateCRLFWithPrevNode(nextNode) {\n        if (this.shouldCheckCRLF() && this.startWithLF(nextNode)) {\n            const node = nextNode.prev();\n            if (this.endWithCR(node)) {\n                this.fixCRLF(node, nextNode);\n            }\n        }\n    }\n    validateCRLFWithNextNode(node) {\n        if (this.shouldCheckCRLF() && this.endWithCR(node)) {\n            const nextNode = node.next();\n            if (this.startWithLF(nextNode)) {\n                this.fixCRLF(node, nextNode);\n            }\n        }\n    }\n    fixCRLF(prev, next) {\n        const nodesToDel = [];\n        // update node\n        const lineStarts = this._buffers[prev.piece.bufferIndex].lineStarts;\n        let newEnd;\n        if (prev.piece.end.column === 0) {\n            // it means, last line ends with \\r, not \\r\\n\n            newEnd = { line: prev.piece.end.line - 1, column: lineStarts[prev.piece.end.line] - lineStarts[prev.piece.end.line - 1] - 1 };\n        }\n        else {\n            // \\r\\n\n            newEnd = { line: prev.piece.end.line, column: prev.piece.end.column - 1 };\n        }\n        const prevNewLength = prev.piece.length - 1;\n        const prevNewLFCnt = prev.piece.lineFeedCnt - 1;\n        prev.piece = new Piece(prev.piece.bufferIndex, prev.piece.start, newEnd, prevNewLFCnt, prevNewLength);\n        updateTreeMetadata(this, prev, -1, -1);\n        if (prev.piece.length === 0) {\n            nodesToDel.push(prev);\n        }\n        // update nextNode\n        const newStart = { line: next.piece.start.line + 1, column: 0 };\n        const newLength = next.piece.length - 1;\n        const newLineFeedCnt = this.getLineFeedCnt(next.piece.bufferIndex, newStart, next.piece.end);\n        next.piece = new Piece(next.piece.bufferIndex, newStart, next.piece.end, newLineFeedCnt, newLength);\n        updateTreeMetadata(this, next, -1, -1);\n        if (next.piece.length === 0) {\n            nodesToDel.push(next);\n        }\n        // create new piece which contains \\r\\n\n        const pieces = this.createNewPieces('\\r\\n');\n        this.rbInsertRight(prev, pieces[0]);\n        // delete empty nodes\n        for (let i = 0; i < nodesToDel.length; i++) {\n            rbDelete(this, nodesToDel[i]);\n        }\n    }\n    adjustCarriageReturnFromNext(value, node) {\n        if (this.shouldCheckCRLF() && this.endWithCR(value)) {\n            const nextNode = node.next();\n            if (this.startWithLF(nextNode)) {\n                // move `\\n` forward\n                value += '\\n';\n                if (nextNode.piece.length === 1) {\n                    rbDelete(this, nextNode);\n                }\n                else {\n                    const piece = nextNode.piece;\n                    const newStart = { line: piece.start.line + 1, column: 0 };\n                    const newLength = piece.length - 1;\n                    const newLineFeedCnt = this.getLineFeedCnt(piece.bufferIndex, newStart, piece.end);\n                    nextNode.piece = new Piece(piece.bufferIndex, newStart, piece.end, newLineFeedCnt, newLength);\n                    updateTreeMetadata(this, nextNode, -1, -1);\n                }\n                return true;\n            }\n        }\n        return false;\n    }\n    // #endregion\n    // #endregion\n    // #region Tree operations\n    iterate(node, callback) {\n        if (node === SENTINEL) {\n            return callback(SENTINEL);\n        }\n        const leftRet = this.iterate(node.left, callback);\n        if (!leftRet) {\n            return leftRet;\n        }\n        return callback(node) && this.iterate(node.right, callback);\n    }\n    getNodeContent(node) {\n        if (node === SENTINEL) {\n            return '';\n        }\n        const buffer = this._buffers[node.piece.bufferIndex];\n        const piece = node.piece;\n        const startOffset = this.offsetInBuffer(piece.bufferIndex, piece.start);\n        const endOffset = this.offsetInBuffer(piece.bufferIndex, piece.end);\n        const currentContent = buffer.buffer.substring(startOffset, endOffset);\n        return currentContent;\n    }\n    getPieceContent(piece) {\n        const buffer = this._buffers[piece.bufferIndex];\n        const startOffset = this.offsetInBuffer(piece.bufferIndex, piece.start);\n        const endOffset = this.offsetInBuffer(piece.bufferIndex, piece.end);\n        const currentContent = buffer.buffer.substring(startOffset, endOffset);\n        return currentContent;\n    }\n    /**\n     *      node              node\n     *     /  \\              /  \\\n     *    a   b    <----   a    b\n     *                         /\n     *                        z\n     */\n    rbInsertRight(node, p) {\n        const z = new TreeNode(p, 1 /* NodeColor.Red */);\n        z.left = SENTINEL;\n        z.right = SENTINEL;\n        z.parent = SENTINEL;\n        z.size_left = 0;\n        z.lf_left = 0;\n        const x = this.root;\n        if (x === SENTINEL) {\n            this.root = z;\n            z.color = 0 /* NodeColor.Black */;\n        }\n        else if (node.right === SENTINEL) {\n            node.right = z;\n            z.parent = node;\n        }\n        else {\n            const nextNode = leftest(node.right);\n            nextNode.left = z;\n            z.parent = nextNode;\n        }\n        fixInsert(this, z);\n        return z;\n    }\n    /**\n     *      node              node\n     *     /  \\              /  \\\n     *    a   b     ---->   a    b\n     *                       \\\n     *                        z\n     */\n    rbInsertLeft(node, p) {\n        const z = new TreeNode(p, 1 /* NodeColor.Red */);\n        z.left = SENTINEL;\n        z.right = SENTINEL;\n        z.parent = SENTINEL;\n        z.size_left = 0;\n        z.lf_left = 0;\n        if (this.root === SENTINEL) {\n            this.root = z;\n            z.color = 0 /* NodeColor.Black */;\n        }\n        else if (node.left === SENTINEL) {\n            node.left = z;\n            z.parent = node;\n        }\n        else {\n            const prevNode = righttest(node.left); // a\n            prevNode.right = z;\n            z.parent = prevNode;\n        }\n        fixInsert(this, z);\n        return z;\n    }\n}\n\nexport { Piece, PieceTreeBase, StringBuffer, createLineStarts, createLineStartsFast };\n","import { Emitter } from '../../../../base/common/event.js';\nimport { isHighSurrogate, firstNonWhitespaceIndex, lastNonWhitespaceIndex, isBasicASCII, containsRTL, containsUnusualLineTerminators } from '../../../../base/common/strings.js';\nimport { Range } from '../../core/range.js';\nimport { ApplyEditsResult } from '../../model.js';\nimport { PieceTreeBase } from './pieceTreeBase.js';\nimport { countEOL } from '../../core/misc/eolCounter.js';\nimport { TextChange } from '../../core/textChange.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass PieceTreeTextBuffer extends Disposable {\n    constructor(chunks, BOM, eol, containsRTL, containsUnusualLineTerminators, isBasicASCII, eolNormalized) {\n        super();\n        this._onDidChangeContent = this._register(new Emitter());\n        this._BOM = BOM;\n        this._mightContainNonBasicASCII = !isBasicASCII;\n        this._mightContainRTL = containsRTL;\n        this._mightContainUnusualLineTerminators = containsUnusualLineTerminators;\n        this._pieceTree = new PieceTreeBase(chunks, eol, eolNormalized);\n    }\n    mightContainRTL() {\n        return this._mightContainRTL;\n    }\n    mightContainUnusualLineTerminators() {\n        return this._mightContainUnusualLineTerminators;\n    }\n    resetMightContainUnusualLineTerminators() {\n        this._mightContainUnusualLineTerminators = false;\n    }\n    mightContainNonBasicASCII() {\n        return this._mightContainNonBasicASCII;\n    }\n    getBOM() {\n        return this._BOM;\n    }\n    getEOL() {\n        return this._pieceTree.getEOL();\n    }\n    createSnapshot(preserveBOM) {\n        return this._pieceTree.createSnapshot(preserveBOM ? this._BOM : '');\n    }\n    getOffsetAt(lineNumber, column) {\n        return this._pieceTree.getOffsetAt(lineNumber, column);\n    }\n    getPositionAt(offset) {\n        return this._pieceTree.getPositionAt(offset);\n    }\n    getRangeAt(start, length) {\n        const end = start + length;\n        const startPosition = this.getPositionAt(start);\n        const endPosition = this.getPositionAt(end);\n        return new Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column);\n    }\n    getValueInRange(range, eol = 0 /* EndOfLinePreference.TextDefined */) {\n        if (range.isEmpty()) {\n            return '';\n        }\n        const lineEnding = this._getEndOfLine(eol);\n        return this._pieceTree.getValueInRange(range, lineEnding);\n    }\n    getValueLengthInRange(range, eol = 0 /* EndOfLinePreference.TextDefined */) {\n        if (range.isEmpty()) {\n            return 0;\n        }\n        if (range.startLineNumber === range.endLineNumber) {\n            return (range.endColumn - range.startColumn);\n        }\n        const startOffset = this.getOffsetAt(range.startLineNumber, range.startColumn);\n        const endOffset = this.getOffsetAt(range.endLineNumber, range.endColumn);\n        // offsets use the text EOL, so we need to compensate for length differences\n        // if the requested EOL doesn't match the text EOL\n        let eolOffsetCompensation = 0;\n        const desiredEOL = this._getEndOfLine(eol);\n        const actualEOL = this.getEOL();\n        if (desiredEOL.length !== actualEOL.length) {\n            const delta = desiredEOL.length - actualEOL.length;\n            const eolCount = range.endLineNumber - range.startLineNumber;\n            eolOffsetCompensation = delta * eolCount;\n        }\n        return endOffset - startOffset + eolOffsetCompensation;\n    }\n    getCharacterCountInRange(range, eol = 0 /* EndOfLinePreference.TextDefined */) {\n        if (this._mightContainNonBasicASCII) {\n            // we must count by iterating\n            let result = 0;\n            const fromLineNumber = range.startLineNumber;\n            const toLineNumber = range.endLineNumber;\n            for (let lineNumber = fromLineNumber; lineNumber <= toLineNumber; lineNumber++) {\n                const lineContent = this.getLineContent(lineNumber);\n                const fromOffset = (lineNumber === fromLineNumber ? range.startColumn - 1 : 0);\n                const toOffset = (lineNumber === toLineNumber ? range.endColumn - 1 : lineContent.length);\n                for (let offset = fromOffset; offset < toOffset; offset++) {\n                    if (isHighSurrogate(lineContent.charCodeAt(offset))) {\n                        result = result + 1;\n                        offset = offset + 1;\n                    }\n                    else {\n                        result = result + 1;\n                    }\n                }\n            }\n            result += this._getEndOfLine(eol).length * (toLineNumber - fromLineNumber);\n            return result;\n        }\n        return this.getValueLengthInRange(range, eol);\n    }\n    getNearestChunk(offset) {\n        return this._pieceTree.getNearestChunk(offset);\n    }\n    getLength() {\n        return this._pieceTree.getLength();\n    }\n    getLineCount() {\n        return this._pieceTree.getLineCount();\n    }\n    getLinesContent() {\n        return this._pieceTree.getLinesContent();\n    }\n    getLineContent(lineNumber) {\n        return this._pieceTree.getLineContent(lineNumber);\n    }\n    getLineCharCode(lineNumber, index) {\n        return this._pieceTree.getLineCharCode(lineNumber, index);\n    }\n    getLineLength(lineNumber) {\n        return this._pieceTree.getLineLength(lineNumber);\n    }\n    getLineFirstNonWhitespaceColumn(lineNumber) {\n        const result = firstNonWhitespaceIndex(this.getLineContent(lineNumber));\n        if (result === -1) {\n            return 0;\n        }\n        return result + 1;\n    }\n    getLineLastNonWhitespaceColumn(lineNumber) {\n        const result = lastNonWhitespaceIndex(this.getLineContent(lineNumber));\n        if (result === -1) {\n            return 0;\n        }\n        return result + 2;\n    }\n    _getEndOfLine(eol) {\n        switch (eol) {\n            case 1 /* EndOfLinePreference.LF */:\n                return '\\n';\n            case 2 /* EndOfLinePreference.CRLF */:\n                return '\\r\\n';\n            case 0 /* EndOfLinePreference.TextDefined */:\n                return this.getEOL();\n            default:\n                throw new Error('Unknown EOL preference');\n        }\n    }\n    setEOL(newEOL) {\n        this._pieceTree.setEOL(newEOL);\n    }\n    applyEdits(rawOperations, recordTrimAutoWhitespace, computeUndoEdits) {\n        let mightContainRTL = this._mightContainRTL;\n        let mightContainUnusualLineTerminators = this._mightContainUnusualLineTerminators;\n        let mightContainNonBasicASCII = this._mightContainNonBasicASCII;\n        let canReduceOperations = true;\n        let operations = [];\n        for (let i = 0; i < rawOperations.length; i++) {\n            const op = rawOperations[i];\n            if (canReduceOperations && op._isTracked) {\n                canReduceOperations = false;\n            }\n            const validatedRange = op.range;\n            if (op.text) {\n                let textMightContainNonBasicASCII = true;\n                if (!mightContainNonBasicASCII) {\n                    textMightContainNonBasicASCII = !isBasicASCII(op.text);\n                    mightContainNonBasicASCII = textMightContainNonBasicASCII;\n                }\n                if (!mightContainRTL && textMightContainNonBasicASCII) {\n                    // check if the new inserted text contains RTL\n                    mightContainRTL = containsRTL(op.text);\n                }\n                if (!mightContainUnusualLineTerminators && textMightContainNonBasicASCII) {\n                    // check if the new inserted text contains unusual line terminators\n                    mightContainUnusualLineTerminators = containsUnusualLineTerminators(op.text);\n                }\n            }\n            let validText = '';\n            let eolCount = 0;\n            let firstLineLength = 0;\n            let lastLineLength = 0;\n            if (op.text) {\n                let strEOL;\n                [eolCount, firstLineLength, lastLineLength, strEOL] = countEOL(op.text);\n                const bufferEOL = this.getEOL();\n                const expectedStrEOL = (bufferEOL === '\\r\\n' ? 2 /* StringEOL.CRLF */ : 1 /* StringEOL.LF */);\n                if (strEOL === 0 /* StringEOL.Unknown */ || strEOL === expectedStrEOL) {\n                    validText = op.text;\n                }\n                else {\n                    validText = op.text.replace(/\\r\\n|\\r|\\n/g, bufferEOL);\n                }\n            }\n            operations[i] = {\n                sortIndex: i,\n                identifier: op.identifier || null,\n                range: validatedRange,\n                rangeOffset: this.getOffsetAt(validatedRange.startLineNumber, validatedRange.startColumn),\n                rangeLength: this.getValueLengthInRange(validatedRange),\n                text: validText,\n                eolCount: eolCount,\n                firstLineLength: firstLineLength,\n                lastLineLength: lastLineLength,\n                forceMoveMarkers: Boolean(op.forceMoveMarkers),\n                isAutoWhitespaceEdit: op.isAutoWhitespaceEdit || false\n            };\n        }\n        // Sort operations ascending\n        operations.sort(PieceTreeTextBuffer._sortOpsAscending);\n        let hasTouchingRanges = false;\n        for (let i = 0, count = operations.length - 1; i < count; i++) {\n            const rangeEnd = operations[i].range.getEndPosition();\n            const nextRangeStart = operations[i + 1].range.getStartPosition();\n            if (nextRangeStart.isBeforeOrEqual(rangeEnd)) {\n                if (nextRangeStart.isBefore(rangeEnd)) {\n                    // overlapping ranges\n                    throw new Error('Overlapping ranges are not allowed!');\n                }\n                hasTouchingRanges = true;\n            }\n        }\n        if (canReduceOperations) {\n            operations = this._reduceOperations(operations);\n        }\n        // Delta encode operations\n        const reverseRanges = (computeUndoEdits || recordTrimAutoWhitespace ? PieceTreeTextBuffer._getInverseEditRanges(operations) : []);\n        const newTrimAutoWhitespaceCandidates = [];\n        if (recordTrimAutoWhitespace) {\n            for (let i = 0; i < operations.length; i++) {\n                const op = operations[i];\n                const reverseRange = reverseRanges[i];\n                if (op.isAutoWhitespaceEdit && op.range.isEmpty()) {\n                    // Record already the future line numbers that might be auto whitespace removal candidates on next edit\n                    for (let lineNumber = reverseRange.startLineNumber; lineNumber <= reverseRange.endLineNumber; lineNumber++) {\n                        let currentLineContent = '';\n                        if (lineNumber === reverseRange.startLineNumber) {\n                            currentLineContent = this.getLineContent(op.range.startLineNumber);\n                            if (firstNonWhitespaceIndex(currentLineContent) !== -1) {\n                                continue;\n                            }\n                        }\n                        newTrimAutoWhitespaceCandidates.push({ lineNumber: lineNumber, oldContent: currentLineContent });\n                    }\n                }\n            }\n        }\n        let reverseOperations = null;\n        if (computeUndoEdits) {\n            let reverseRangeDeltaOffset = 0;\n            reverseOperations = [];\n            for (let i = 0; i < operations.length; i++) {\n                const op = operations[i];\n                const reverseRange = reverseRanges[i];\n                const bufferText = this.getValueInRange(op.range);\n                const reverseRangeOffset = op.rangeOffset + reverseRangeDeltaOffset;\n                reverseRangeDeltaOffset += (op.text.length - bufferText.length);\n                reverseOperations[i] = {\n                    sortIndex: op.sortIndex,\n                    identifier: op.identifier,\n                    range: reverseRange,\n                    text: bufferText,\n                    textChange: new TextChange(op.rangeOffset, bufferText, reverseRangeOffset, op.text)\n                };\n            }\n            // Can only sort reverse operations when the order is not significant\n            if (!hasTouchingRanges) {\n                reverseOperations.sort((a, b) => a.sortIndex - b.sortIndex);\n            }\n        }\n        this._mightContainRTL = mightContainRTL;\n        this._mightContainUnusualLineTerminators = mightContainUnusualLineTerminators;\n        this._mightContainNonBasicASCII = mightContainNonBasicASCII;\n        const contentChanges = this._doApplyEdits(operations);\n        let trimAutoWhitespaceLineNumbers = null;\n        if (recordTrimAutoWhitespace && newTrimAutoWhitespaceCandidates.length > 0) {\n            // sort line numbers auto whitespace removal candidates for next edit descending\n            newTrimAutoWhitespaceCandidates.sort((a, b) => b.lineNumber - a.lineNumber);\n            trimAutoWhitespaceLineNumbers = [];\n            for (let i = 0, len = newTrimAutoWhitespaceCandidates.length; i < len; i++) {\n                const lineNumber = newTrimAutoWhitespaceCandidates[i].lineNumber;\n                if (i > 0 && newTrimAutoWhitespaceCandidates[i - 1].lineNumber === lineNumber) {\n                    // Do not have the same line number twice\n                    continue;\n                }\n                const prevContent = newTrimAutoWhitespaceCandidates[i].oldContent;\n                const lineContent = this.getLineContent(lineNumber);\n                if (lineContent.length === 0 || lineContent === prevContent || firstNonWhitespaceIndex(lineContent) !== -1) {\n                    continue;\n                }\n                trimAutoWhitespaceLineNumbers.push(lineNumber);\n            }\n        }\n        this._onDidChangeContent.fire();\n        return new ApplyEditsResult(reverseOperations, contentChanges, trimAutoWhitespaceLineNumbers);\n    }\n    /**\n     * Transform operations such that they represent the same logic edit,\n     * but that they also do not cause OOM crashes.\n     */\n    _reduceOperations(operations) {\n        if (operations.length < 1000) {\n            // We know from empirical testing that a thousand edits work fine regardless of their shape.\n            return operations;\n        }\n        // At one point, due to how events are emitted and how each operation is handled,\n        // some operations can trigger a high amount of temporary string allocations,\n        // that will immediately get edited again.\n        // e.g. a formatter inserting ridiculous ammounts of \\n on a model with a single line\n        // Therefore, the strategy is to collapse all the operations into a huge single edit operation\n        return [this._toSingleEditOperation(operations)];\n    }\n    _toSingleEditOperation(operations) {\n        let forceMoveMarkers = false;\n        const firstEditRange = operations[0].range;\n        const lastEditRange = operations[operations.length - 1].range;\n        const entireEditRange = new Range(firstEditRange.startLineNumber, firstEditRange.startColumn, lastEditRange.endLineNumber, lastEditRange.endColumn);\n        let lastEndLineNumber = firstEditRange.startLineNumber;\n        let lastEndColumn = firstEditRange.startColumn;\n        const result = [];\n        for (let i = 0, len = operations.length; i < len; i++) {\n            const operation = operations[i];\n            const range = operation.range;\n            forceMoveMarkers = forceMoveMarkers || operation.forceMoveMarkers;\n            // (1) -- Push old text\n            result.push(this.getValueInRange(new Range(lastEndLineNumber, lastEndColumn, range.startLineNumber, range.startColumn)));\n            // (2) -- Push new text\n            if (operation.text.length > 0) {\n                result.push(operation.text);\n            }\n            lastEndLineNumber = range.endLineNumber;\n            lastEndColumn = range.endColumn;\n        }\n        const text = result.join('');\n        const [eolCount, firstLineLength, lastLineLength] = countEOL(text);\n        return {\n            sortIndex: 0,\n            identifier: operations[0].identifier,\n            range: entireEditRange,\n            rangeOffset: this.getOffsetAt(entireEditRange.startLineNumber, entireEditRange.startColumn),\n            rangeLength: this.getValueLengthInRange(entireEditRange, 0 /* EndOfLinePreference.TextDefined */),\n            text: text,\n            eolCount: eolCount,\n            firstLineLength: firstLineLength,\n            lastLineLength: lastLineLength,\n            forceMoveMarkers: forceMoveMarkers,\n            isAutoWhitespaceEdit: false\n        };\n    }\n    _doApplyEdits(operations) {\n        operations.sort(PieceTreeTextBuffer._sortOpsDescending);\n        const contentChanges = [];\n        // operations are from bottom to top\n        for (let i = 0; i < operations.length; i++) {\n            const op = operations[i];\n            const startLineNumber = op.range.startLineNumber;\n            const startColumn = op.range.startColumn;\n            const endLineNumber = op.range.endLineNumber;\n            const endColumn = op.range.endColumn;\n            if (startLineNumber === endLineNumber && startColumn === endColumn && op.text.length === 0) {\n                // no-op\n                continue;\n            }\n            if (op.text) {\n                // replacement\n                this._pieceTree.delete(op.rangeOffset, op.rangeLength);\n                this._pieceTree.insert(op.rangeOffset, op.text, true);\n            }\n            else {\n                // deletion\n                this._pieceTree.delete(op.rangeOffset, op.rangeLength);\n            }\n            const contentChangeRange = new Range(startLineNumber, startColumn, endLineNumber, endColumn);\n            contentChanges.push({\n                range: contentChangeRange,\n                rangeLength: op.rangeLength,\n                text: op.text,\n                rangeOffset: op.rangeOffset,\n                forceMoveMarkers: op.forceMoveMarkers\n            });\n        }\n        return contentChanges;\n    }\n    findMatchesLineByLine(searchRange, searchData, captureMatches, limitResultCount) {\n        return this._pieceTree.findMatchesLineByLine(searchRange, searchData, captureMatches, limitResultCount);\n    }\n    /**\n     * Assumes `operations` are validated and sorted ascending\n     */\n    static _getInverseEditRanges(operations) {\n        const result = [];\n        let prevOpEndLineNumber = 0;\n        let prevOpEndColumn = 0;\n        let prevOp = null;\n        for (let i = 0, len = operations.length; i < len; i++) {\n            const op = operations[i];\n            let startLineNumber;\n            let startColumn;\n            if (prevOp) {\n                if (prevOp.range.endLineNumber === op.range.startLineNumber) {\n                    startLineNumber = prevOpEndLineNumber;\n                    startColumn = prevOpEndColumn + (op.range.startColumn - prevOp.range.endColumn);\n                }\n                else {\n                    startLineNumber = prevOpEndLineNumber + (op.range.startLineNumber - prevOp.range.endLineNumber);\n                    startColumn = op.range.startColumn;\n                }\n            }\n            else {\n                startLineNumber = op.range.startLineNumber;\n                startColumn = op.range.startColumn;\n            }\n            let resultRange;\n            if (op.text.length > 0) {\n                // the operation inserts something\n                const lineCount = op.eolCount + 1;\n                if (lineCount === 1) {\n                    // single line insert\n                    resultRange = new Range(startLineNumber, startColumn, startLineNumber, startColumn + op.firstLineLength);\n                }\n                else {\n                    // multi line insert\n                    resultRange = new Range(startLineNumber, startColumn, startLineNumber + lineCount - 1, op.lastLineLength + 1);\n                }\n            }\n            else {\n                // There is nothing to insert\n                resultRange = new Range(startLineNumber, startColumn, startLineNumber, startColumn);\n            }\n            prevOpEndLineNumber = resultRange.endLineNumber;\n            prevOpEndColumn = resultRange.endColumn;\n            result.push(resultRange);\n            prevOp = op;\n        }\n        return result;\n    }\n    static _sortOpsAscending(a, b) {\n        const r = Range.compareRangesUsingEnds(a.range, b.range);\n        if (r === 0) {\n            return a.sortIndex - b.sortIndex;\n        }\n        return r;\n    }\n    static _sortOpsDescending(a, b) {\n        const r = Range.compareRangesUsingEnds(a.range, b.range);\n        if (r === 0) {\n            return b.sortIndex - a.sortIndex;\n        }\n        return -r;\n    }\n}\n\nexport { PieceTreeTextBuffer };\n","import { startsWithUTF8BOM, UTF8_BOM_CHARACTER, containsRTL, containsUnusualLineTerminators } from '../../../../base/common/strings.js';\nimport { createLineStarts, StringBuffer, createLineStartsFast } from './pieceTreeBase.js';\nimport { PieceTreeTextBuffer } from './pieceTreeTextBuffer.js';\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 *--------------------------------------------------------------------------------------------*/\nclass PieceTreeTextBufferFactory {\n    constructor(_chunks, _bom, _cr, _lf, _crlf, _containsRTL, _containsUnusualLineTerminators, _isBasicASCII, _normalizeEOL) {\n        this._chunks = _chunks;\n        this._bom = _bom;\n        this._cr = _cr;\n        this._lf = _lf;\n        this._crlf = _crlf;\n        this._containsRTL = _containsRTL;\n        this._containsUnusualLineTerminators = _containsUnusualLineTerminators;\n        this._isBasicASCII = _isBasicASCII;\n        this._normalizeEOL = _normalizeEOL;\n    }\n    _getEOL(defaultEOL) {\n        const totalEOLCount = this._cr + this._lf + this._crlf;\n        const totalCRCount = this._cr + this._crlf;\n        if (totalEOLCount === 0) {\n            // This is an empty file or a file with precisely one line\n            return (defaultEOL === 1 /* DefaultEndOfLine.LF */ ? '\\n' : '\\r\\n');\n        }\n        if (totalCRCount > totalEOLCount / 2) {\n            // More than half of the file contains \\r\\n ending lines\n            return '\\r\\n';\n        }\n        // At least one line more ends in \\n\n        return '\\n';\n    }\n    create(defaultEOL) {\n        const eol = this._getEOL(defaultEOL);\n        const chunks = this._chunks;\n        if (this._normalizeEOL &&\n            ((eol === '\\r\\n' && (this._cr > 0 || this._lf > 0))\n                || (eol === '\\n' && (this._cr > 0 || this._crlf > 0)))) {\n            // Normalize pieces\n            for (let i = 0, len = chunks.length; i < len; i++) {\n                const str = chunks[i].buffer.replace(/\\r\\n|\\r|\\n/g, eol);\n                const newLineStart = createLineStartsFast(str);\n                chunks[i] = new StringBuffer(str, newLineStart);\n            }\n        }\n        const textBuffer = new PieceTreeTextBuffer(chunks, this._bom, eol, this._containsRTL, this._containsUnusualLineTerminators, this._isBasicASCII, this._normalizeEOL);\n        return { textBuffer: textBuffer, disposable: textBuffer };\n    }\n}\nclass PieceTreeTextBufferBuilder {\n    constructor() {\n        this.chunks = [];\n        this.BOM = '';\n        this._hasPreviousChar = false;\n        this._previousChar = 0;\n        this._tmpLineStarts = [];\n        this.cr = 0;\n        this.lf = 0;\n        this.crlf = 0;\n        this.containsRTL = false;\n        this.containsUnusualLineTerminators = false;\n        this.isBasicASCII = true;\n    }\n    acceptChunk(chunk) {\n        if (chunk.length === 0) {\n            return;\n        }\n        if (this.chunks.length === 0) {\n            if (startsWithUTF8BOM(chunk)) {\n                this.BOM = UTF8_BOM_CHARACTER;\n                chunk = chunk.substr(1);\n            }\n        }\n        const lastChar = chunk.charCodeAt(chunk.length - 1);\n        if (lastChar === 13 /* CharCode.CarriageReturn */ || (lastChar >= 0xD800 && lastChar <= 0xDBFF)) {\n            // last character is \\r or a high surrogate => keep it back\n            this._acceptChunk1(chunk.substr(0, chunk.length - 1), false);\n            this._hasPreviousChar = true;\n            this._previousChar = lastChar;\n        }\n        else {\n            this._acceptChunk1(chunk, false);\n            this._hasPreviousChar = false;\n            this._previousChar = lastChar;\n        }\n    }\n    _acceptChunk1(chunk, allowEmptyStrings) {\n        if (!allowEmptyStrings && chunk.length === 0) {\n            // Nothing to do\n            return;\n        }\n        if (this._hasPreviousChar) {\n            this._acceptChunk2(String.fromCharCode(this._previousChar) + chunk);\n        }\n        else {\n            this._acceptChunk2(chunk);\n        }\n    }\n    _acceptChunk2(chunk) {\n        const lineStarts = createLineStarts(this._tmpLineStarts, chunk);\n        this.chunks.push(new StringBuffer(chunk, lineStarts.lineStarts));\n        this.cr += lineStarts.cr;\n        this.lf += lineStarts.lf;\n        this.crlf += lineStarts.crlf;\n        if (!lineStarts.isBasicASCII) {\n            // this chunk contains non basic ASCII characters\n            this.isBasicASCII = false;\n            if (!this.containsRTL) {\n                this.containsRTL = containsRTL(chunk);\n            }\n            if (!this.containsUnusualLineTerminators) {\n                this.containsUnusualLineTerminators = containsUnusualLineTerminators(chunk);\n            }\n        }\n    }\n    finish(normalizeEOL = true) {\n        this._finish();\n        return new PieceTreeTextBufferFactory(this.chunks, this.BOM, this.cr, this.lf, this.crlf, this.containsRTL, this.containsUnusualLineTerminators, this.isBasicASCII, normalizeEOL);\n    }\n    _finish() {\n        if (this.chunks.length === 0) {\n            this._acceptChunk1('', true);\n        }\n        if (this._hasPreviousChar) {\n            this._hasPreviousChar = false;\n            // recreate last chunk\n            const lastChunk = this.chunks[this.chunks.length - 1];\n            lastChunk.buffer += String.fromCharCode(this._previousChar);\n            const newLineStarts = createLineStartsFast(lastChunk.buffer);\n            lastChunk.lineStarts = newLineStarts;\n            if (this._previousChar === 13 /* CharCode.CarriageReturn */) {\n                this.cr++;\n            }\n        }\n    }\n}\n\nexport { PieceTreeTextBufferBuilder };\n","import { transaction } from '../transaction.js';\nimport { DebugNameData } from '../debugName.js';\nimport { BaseObservable } from './baseObservable.js';\nimport { DebugLocation } from '../debugLocation.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction observableSignal(debugNameOrOwner, debugLocation = DebugLocation.ofCaller()) {\n    if (typeof debugNameOrOwner === 'string') {\n        return new ObservableSignal(debugNameOrOwner, undefined, debugLocation);\n    }\n    else {\n        return new ObservableSignal(undefined, debugNameOrOwner, debugLocation);\n    }\n}\nclass ObservableSignal extends BaseObservable {\n    get debugName() {\n        return new DebugNameData(this._owner, this._debugName, undefined).getDebugName(this) ?? 'Observable Signal';\n    }\n    toString() {\n        return this.debugName;\n    }\n    constructor(_debugName, _owner, debugLocation) {\n        super(debugLocation);\n        this._debugName = _debugName;\n        this._owner = _owner;\n    }\n    trigger(tx, change) {\n        if (!tx) {\n            transaction(tx => {\n                this.trigger(tx, change);\n            }, () => `Trigger signal ${this.debugName}`);\n            return;\n        }\n        for (const o of this._observers) {\n            tx.updateObserver(o, this);\n            o.handleChange(this, change);\n        }\n    }\n    get() {\n        // NO OP\n    }\n}\n\nexport { observableSignal };\n","import { TransactionImpl } from '../transaction.js';\nimport { getLogger } from '../logging/logging.js';\nimport { BaseObservable } from './baseObservable.js';\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/**\n * Holds off updating observers until the value is actually read.\n*/\nclass LazyObservableValue extends BaseObservable {\n    get debugName() {\n        return this._debugNameData.getDebugName(this) ?? 'LazyObservableValue';\n    }\n    constructor(_debugNameData, initialValue, _equalityComparator, debugLocation) {\n        super(debugLocation);\n        this._debugNameData = _debugNameData;\n        this._equalityComparator = _equalityComparator;\n        this._isUpToDate = true;\n        this._deltas = [];\n        this._updateCounter = 0;\n        this._value = initialValue;\n    }\n    get() {\n        this._update();\n        return this._value;\n    }\n    _update() {\n        if (this._isUpToDate) {\n            return;\n        }\n        this._isUpToDate = true;\n        if (this._deltas.length > 0) {\n            for (const change of this._deltas) {\n                getLogger()?.handleObservableUpdated(this, { change, didChange: true, oldValue: '(unknown)', newValue: this._value, hadValue: true });\n                for (const observer of this._observers) {\n                    observer.handleChange(this, change);\n                }\n            }\n            this._deltas.length = 0;\n        }\n        else {\n            getLogger()?.handleObservableUpdated(this, { change: undefined, didChange: true, oldValue: '(unknown)', newValue: this._value, hadValue: true });\n            for (const observer of this._observers) {\n                observer.handleChange(this, undefined);\n            }\n        }\n    }\n    _beginUpdate() {\n        this._updateCounter++;\n        if (this._updateCounter === 1) {\n            for (const observer of this._observers) {\n                observer.beginUpdate(this);\n            }\n        }\n    }\n    _endUpdate() {\n        this._updateCounter--;\n        if (this._updateCounter === 0) {\n            this._update();\n            // End update could change the observer list.\n            const observers = [...this._observers];\n            for (const r of observers) {\n                r.endUpdate(this);\n            }\n        }\n    }\n    addObserver(observer) {\n        const shouldCallBeginUpdate = !this._observers.has(observer) && this._updateCounter > 0;\n        super.addObserver(observer);\n        if (shouldCallBeginUpdate) {\n            observer.beginUpdate(this);\n        }\n    }\n    removeObserver(observer) {\n        const shouldCallEndUpdate = this._observers.has(observer) && this._updateCounter > 0;\n        super.removeObserver(observer);\n        if (shouldCallEndUpdate) {\n            // Calling end update after removing the observer makes sure endUpdate cannot be called twice here.\n            observer.endUpdate(this);\n        }\n    }\n    set(value, tx, change) {\n        if (change === undefined && this._equalityComparator(this._value, value)) {\n            return;\n        }\n        let _tx;\n        if (!tx) {\n            tx = _tx = new TransactionImpl(() => { }, () => `Setting ${this.debugName}`);\n        }\n        try {\n            this._isUpToDate = false;\n            this._setValue(value);\n            if (change !== undefined) {\n                this._deltas.push(change);\n            }\n            tx.updateObserver({\n                beginUpdate: () => this._beginUpdate(),\n                endUpdate: () => this._endUpdate(),\n                handleChange: (observable, change) => { },\n                handlePossibleChange: (observable) => { },\n            }, this);\n            if (this._updateCounter > 1) {\n                // We already started begin/end update, so we need to manually call handlePossibleChange\n                for (const observer of this._observers) {\n                    observer.handlePossibleChange(this);\n                }\n            }\n        }\n        finally {\n            if (_tx) {\n                _tx.finish();\n            }\n        }\n    }\n    toString() {\n        return `${this.debugName}: ${this._value}`;\n    }\n    _setValue(newValue) {\n        this._value = newValue;\n    }\n}\n\nexport { LazyObservableValue };\n","import { DebugNameData } from '../debugName.js';\nimport { strictEquals } from '../../equals.js';\nimport '../../event.js';\nimport '../../lifecycle.js';\nimport { ObservableValue } from './observableValue.js';\nimport { LazyObservableValue } from './lazyObservableValue.js';\nimport { DebugLocation } from '../debugLocation.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction observableValueOpts(options, initialValue, debugLocation = DebugLocation.ofCaller()) {\n    if (options.lazy) {\n        return new LazyObservableValue(new DebugNameData(options.owner, options.debugName, undefined), initialValue, options.equalsFn ?? strictEquals, debugLocation);\n    }\n    return new ObservableValue(new DebugNameData(options.owner, options.debugName, undefined), initialValue, options.equalsFn ?? strictEquals, debugLocation);\n}\n\nexport { observableValueOpts };\n","import { equals } from '../../../../base/common/arrays.js';\nimport { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { LineRange } from '../../core/ranges/lineRange.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { itemsEquals, itemEquals, equalsIfDefined } from '../../../../base/common/equals.js';\nimport { observableSignal } from '../../../../base/common/observableInternal/observables/observableSignal.js';\nimport { observableValueOpts } from '../../../../base/common/observableInternal/observables/observableValueOpts.js';\nimport { derivedOpts } from '../../../../base/common/observableInternal/observables/derived.js';\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/**\n * @internal\n */\nclass AttachedViews {\n    constructor() {\n        this._onDidChangeVisibleRanges = new Emitter();\n        this.onDidChangeVisibleRanges = this._onDidChangeVisibleRanges.event;\n        this._views = new Set();\n        this._viewsChanged = observableSignal(this);\n        this.visibleLineRanges = derivedOpts({\n            owner: this,\n            equalsFn: itemsEquals(itemEquals())\n        }, reader => {\n            this._viewsChanged.read(reader);\n            const ranges = LineRange.joinMany([...this._views].map(view => view.state.read(reader)?.visibleLineRanges ?? []));\n            return ranges;\n        });\n    }\n    attachView() {\n        const view = new AttachedViewImpl((state) => {\n            this._onDidChangeVisibleRanges.fire({ view, state });\n        });\n        this._views.add(view);\n        this._viewsChanged.trigger(undefined);\n        return view;\n    }\n    detachView(view) {\n        this._views.delete(view);\n        this._onDidChangeVisibleRanges.fire({ view, state: undefined });\n        this._viewsChanged.trigger(undefined);\n    }\n}\n/**\n * @internal\n */\nclass AttachedViewState {\n    constructor(visibleLineRanges, stabilized) {\n        this.visibleLineRanges = visibleLineRanges;\n        this.stabilized = stabilized;\n    }\n    equals(other) {\n        if (this === other) {\n            return true;\n        }\n        if (!equals(this.visibleLineRanges, other.visibleLineRanges, (a, b) => a.equals(b))) {\n            return false;\n        }\n        if (this.stabilized !== other.stabilized) {\n            return false;\n        }\n        return true;\n    }\n}\nclass AttachedViewImpl {\n    get state() { return this._state; }\n    constructor(handleStateChange) {\n        this.handleStateChange = handleStateChange;\n        this._state = observableValueOpts({ owner: this, equalsFn: equalsIfDefined((a, b) => a.equals(b)) }, undefined);\n    }\n    setVisibleLines(visibleLines, stabilized) {\n        const visibleLineRanges = visibleLines.map((line) => new LineRange(line.startLineNumber, line.endLineNumber + 1));\n        const state = new AttachedViewState(visibleLineRanges, stabilized);\n        this._state.set(state, undefined, undefined);\n        this.handleStateChange(state);\n    }\n}\nclass AttachedViewHandler extends Disposable {\n    get lineRanges() { return this._lineRanges; }\n    constructor(_refreshTokens) {\n        super();\n        this._refreshTokens = _refreshTokens;\n        this.runner = this._register(new RunOnceScheduler(() => this.update(), 50));\n        this._computedLineRanges = [];\n        this._lineRanges = [];\n    }\n    update() {\n        if (equals(this._computedLineRanges, this._lineRanges, (a, b) => a.equals(b))) {\n            return;\n        }\n        this._computedLineRanges = this._lineRanges;\n        this._refreshTokens();\n    }\n    handleStateChange(state) {\n        this._lineRanges = state.visibleLineRanges;\n        if (state.stabilized) {\n            this.runner.cancel();\n            this.update();\n        }\n        else {\n            this.runner.schedule();\n        }\n    }\n}\nclass AbstractSyntaxTokenBackend extends Disposable {\n    get backgroundTokenizationState() {\n        return this._backgroundTokenizationState;\n    }\n    constructor(_languageIdCodec, _textModel) {\n        super();\n        this._languageIdCodec = _languageIdCodec;\n        this._textModel = _textModel;\n        this._onDidChangeTokens = this._register(new Emitter());\n        /** @internal, should not be exposed by the text model! */\n        this.onDidChangeTokens = this._onDidChangeTokens.event;\n    }\n    tokenizeIfCheap(lineNumber) {\n        if (this.isCheapToTokenize(lineNumber)) {\n            this.forceTokenization(lineNumber);\n        }\n    }\n}\n\nexport { AbstractSyntaxTokenBackend, AttachedViewHandler, AttachedViewState, AttachedViews };\n","function gotoNextSibling(newCursor, oldCursor) {\n    const n = newCursor.gotoNextSibling();\n    const o = oldCursor.gotoNextSibling();\n    if (n !== o) {\n        throw new Error('Trees are out of sync');\n    }\n    return n && o;\n}\nfunction gotoParent(newCursor, oldCursor) {\n    const n = newCursor.gotoParent();\n    const o = oldCursor.gotoParent();\n    if (n !== o) {\n        throw new Error('Trees are out of sync');\n    }\n    return n && o;\n}\nfunction gotoNthChild(newCursor, oldCursor, index) {\n    const n = newCursor.gotoFirstChild();\n    const o = oldCursor.gotoFirstChild();\n    if (n !== o) {\n        throw new Error('Trees are out of sync');\n    }\n    if (index === 0) {\n        return n && o;\n    }\n    for (let i = 1; i <= index; i++) {\n        const nn = newCursor.gotoNextSibling();\n        const oo = oldCursor.gotoNextSibling();\n        if (nn !== oo) {\n            throw new Error('Trees are out of sync');\n        }\n        if (!nn || !oo) {\n            return false;\n        }\n    }\n    return n && o;\n}\nfunction nextSiblingOrParentSibling(newCursor, oldCursor) {\n    do {\n        if (newCursor.currentNode.nextSibling) {\n            return gotoNextSibling(newCursor, oldCursor);\n        }\n        if (newCursor.currentNode.parent) {\n            gotoParent(newCursor, oldCursor);\n        }\n    } while (newCursor.currentNode.nextSibling || newCursor.currentNode.parent);\n    return false;\n}\nfunction getClosestPreviousNodes(cursor, tree) {\n    // Go up parents until the end of the parent is before the start of the current.\n    const findPrev = tree.walk();\n    findPrev.resetTo(cursor);\n    const startingNode = cursor.currentNode;\n    do {\n        if (findPrev.currentNode.previousSibling && ((findPrev.currentNode.endIndex - findPrev.currentNode.startIndex) !== 0)) {\n            findPrev.gotoPreviousSibling();\n        }\n        else {\n            while (!findPrev.currentNode.previousSibling && findPrev.currentNode.parent) {\n                findPrev.gotoParent();\n            }\n            findPrev.gotoPreviousSibling();\n        }\n    } while ((findPrev.currentNode.endIndex > startingNode.startIndex)\n        && (findPrev.currentNode.parent || findPrev.currentNode.previousSibling)\n        && (findPrev.currentNode.id !== startingNode.id));\n    if ((findPrev.currentNode.id !== startingNode.id) && findPrev.currentNode.endIndex <= startingNode.startIndex) {\n        return findPrev.currentNode;\n    }\n    else {\n        return undefined;\n    }\n}\n\nexport { getClosestPreviousNodes, gotoNextSibling, gotoNthChild, gotoParent, nextSiblingOrParentSibling };\n","import { TaskQueue } from '../../../../../base/common/async.js';\nimport { Disposable, toDisposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { setTimeout0 } from '../../../../../base/common/platform.js';\nimport { ILogService } from '../../../../../platform/log/common/log.js';\nimport { ITelemetryService } from '../../../../../platform/telemetry/common/telemetry.js';\nimport { TextLength } from '../../../core/text/textLength.js';\nimport { gotoParent, getClosestPreviousNodes, nextSiblingOrParentSibling, gotoNthChild } from './cursorUtils.js';\nimport { Range } from '../../../core/range.js';\nimport { transaction } from '../../../../../base/common/observableInternal/transaction.js';\nimport { observableValue } from '../../../../../base/common/observableInternal/observables/observableValue.js';\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet TreeSitterTree = class TreeSitterTree extends Disposable {\n    constructor(languageId, _ranges, \n    // readonly treeSitterLanguage: Language,\n    /** Must have the language set! */\n    _parser, _parserClass, \n    // private readonly _injectionQuery: TreeSitter.Query,\n    textModel, _logService, _telemetryService) {\n        super();\n        this.languageId = languageId;\n        this._ranges = _ranges;\n        this._parser = _parser;\n        this._parserClass = _parserClass;\n        this.textModel = textModel;\n        this._logService = _logService;\n        this._telemetryService = _telemetryService;\n        this._tree = observableValue(this, undefined);\n        this.tree = this._tree;\n        this._treeLastParsedVersion = observableValue(this, -1);\n        this.treeLastParsedVersion = this._treeLastParsedVersion;\n        this._onDidChangeContentQueue = new TaskQueue();\n        this._tree = observableValue(this, undefined);\n        this.tree = this._tree;\n        this._register(toDisposable(() => {\n            this._tree.get()?.delete();\n            this._lastFullyParsed?.delete();\n            this._lastFullyParsedWithEdits?.delete();\n            this._parser.delete();\n        }));\n        this.handleContentChange(undefined, this._ranges);\n    }\n    handleContentChange(e, ranges) {\n        const version = this.textModel.getVersionId();\n        let newRanges = [];\n        if (ranges) {\n            newRanges = this._setRanges(ranges);\n        }\n        if (e) {\n            this._applyEdits(e.changes);\n        }\n        this._onDidChangeContentQueue.clearPending();\n        this._onDidChangeContentQueue.schedule(async () => {\n            if (this._store.isDisposed) {\n                // No need to continue the queue if we are disposed\n                return;\n            }\n            const oldTree = this._lastFullyParsed;\n            let changedNodes;\n            if (this._lastFullyParsedWithEdits && this._lastFullyParsed) {\n                changedNodes = this._findChangedNodes(this._lastFullyParsedWithEdits, this._lastFullyParsed);\n            }\n            const completed = await this._parseAndUpdateTree(version);\n            if (completed) {\n                let ranges;\n                if (!changedNodes) {\n                    if (this._ranges) {\n                        ranges = this._ranges.map(r => ({ newRange: new Range(r.startPosition.row + 1, r.startPosition.column + 1, r.endPosition.row + 1, r.endPosition.column + 1), oldRangeLength: r.endIndex - r.startIndex, newRangeStartOffset: r.startIndex, newRangeEndOffset: r.endIndex }));\n                    }\n                }\n                else if (oldTree && changedNodes) {\n                    ranges = this._findTreeChanges(completed, changedNodes, newRanges);\n                }\n                if (!ranges) {\n                    ranges = [{ newRange: this.textModel.getFullModelRange(), newRangeStartOffset: 0, newRangeEndOffset: this.textModel.getValueLength() }];\n                }\n                const previousTree = this._tree.get();\n                transaction(tx => {\n                    this._tree.set(completed, tx, { ranges, versionId: version });\n                    this._treeLastParsedVersion.set(version, tx);\n                });\n                previousTree?.delete();\n            }\n        });\n    }\n    _applyEdits(changes) {\n        for (const change of changes) {\n            const originalTextLength = TextLength.ofRange(Range.lift(change.range));\n            const newTextLength = TextLength.ofText(change.text);\n            const summedTextLengths = change.text.length === 0 ? newTextLength : originalTextLength.add(newTextLength);\n            const edit = {\n                startIndex: change.rangeOffset,\n                oldEndIndex: change.rangeOffset + change.rangeLength,\n                newEndIndex: change.rangeOffset + change.text.length,\n                startPosition: { row: change.range.startLineNumber - 1, column: change.range.startColumn - 1 },\n                oldEndPosition: { row: change.range.endLineNumber - 1, column: change.range.endColumn - 1 },\n                newEndPosition: { row: change.range.startLineNumber + summedTextLengths.lineCount - 1, column: summedTextLengths.lineCount ? summedTextLengths.columnCount : (change.range.endColumn + summedTextLengths.columnCount) }\n            };\n            this._tree.get()?.edit(edit);\n            this._lastFullyParsedWithEdits?.edit(edit);\n        }\n    }\n    _findChangedNodes(newTree, oldTree) {\n        if ((this._ranges && this._ranges.every(range => range.startPosition.row !== newTree.rootNode.startPosition.row)) || newTree.rootNode.startPosition.row !== 0) {\n            return [];\n        }\n        const newCursor = newTree.walk();\n        const oldCursor = oldTree.walk();\n        const nodes = [];\n        let next = true;\n        do {\n            if (newCursor.currentNode.hasChanges) {\n                // Check if only one of the children has changes.\n                // If it's only one, then we go to that child.\n                // If it's more then, we need to go to each child\n                // If it's none, then we've found one of our ranges\n                const newChildren = newCursor.currentNode.children;\n                const indexChangedChildren = [];\n                const changedChildren = newChildren.filter((c, index) => {\n                    if (c?.hasChanges || (oldCursor.currentNode.children.length <= index)) {\n                        indexChangedChildren.push(index);\n                        return true;\n                    }\n                    return false;\n                });\n                // If we have changes and we *had* an error, the whole node should be refreshed.\n                if ((changedChildren.length === 0) || (newCursor.currentNode.hasError !== oldCursor.currentNode.hasError)) {\n                    // walk up again until we get to the first one that's named as unnamed nodes can be too granular\n                    while (newCursor.currentNode.parent && next && !newCursor.currentNode.isNamed) {\n                        next = gotoParent(newCursor, oldCursor);\n                    }\n                    // Use the end position of the previous node and the start position of the current node\n                    const newNode = newCursor.currentNode;\n                    const closestPreviousNode = getClosestPreviousNodes(newCursor, newTree) ?? newNode;\n                    nodes.push({\n                        startIndex: closestPreviousNode.startIndex,\n                        endIndex: newNode.endIndex,\n                        startPosition: closestPreviousNode.startPosition,\n                        endPosition: newNode.endPosition\n                    });\n                    next = nextSiblingOrParentSibling(newCursor, oldCursor);\n                }\n                else if (changedChildren.length >= 1) {\n                    next = gotoNthChild(newCursor, oldCursor, indexChangedChildren[0]);\n                }\n            }\n            else {\n                next = nextSiblingOrParentSibling(newCursor, oldCursor);\n            }\n        } while (next);\n        newCursor.delete();\n        oldCursor.delete();\n        return nodes;\n    }\n    _findTreeChanges(newTree, changedNodes, newRanges) {\n        let newRangeIndex = 0;\n        const mergedChanges = [];\n        // Find the parent in the new tree of the changed node\n        for (let nodeIndex = 0; nodeIndex < changedNodes.length; nodeIndex++) {\n            const node = changedNodes[nodeIndex];\n            if (mergedChanges.length > 0) {\n                if ((node.startIndex >= mergedChanges[mergedChanges.length - 1].newRangeStartOffset) && (node.endIndex <= mergedChanges[mergedChanges.length - 1].newRangeEndOffset)) {\n                    // This node is within the previous range, skip it\n                    continue;\n                }\n            }\n            const cursor = newTree.walk();\n            const cursorContainersNode = () => cursor.startIndex < node.startIndex && cursor.endIndex > node.endIndex;\n            while (cursorContainersNode()) {\n                // See if we can go to a child\n                let child = cursor.gotoFirstChild();\n                let foundChild = false;\n                while (child) {\n                    if (cursorContainersNode() && cursor.currentNode.isNamed) {\n                        foundChild = true;\n                        break;\n                    }\n                    else {\n                        child = cursor.gotoNextSibling();\n                    }\n                }\n                if (!foundChild) {\n                    cursor.gotoParent();\n                    break;\n                }\n                if (cursor.currentNode.childCount === 0) {\n                    break;\n                }\n            }\n            const startPosition = cursor.currentNode.startPosition;\n            const endPosition = cursor.currentNode.endPosition;\n            const startIndex = cursor.currentNode.startIndex;\n            const endIndex = cursor.currentNode.endIndex;\n            const newChange = { newRange: new Range(startPosition.row + 1, startPosition.column + 1, endPosition.row + 1, endPosition.column + 1), newRangeStartOffset: startIndex, newRangeEndOffset: endIndex };\n            if ((newRangeIndex < newRanges.length) && rangesIntersect(newRanges[newRangeIndex], { startIndex, endIndex})) {\n                // combine the new change with the range\n                if (newRanges[newRangeIndex].startIndex < newChange.newRangeStartOffset) {\n                    newChange.newRange = newChange.newRange.setStartPosition(newRanges[newRangeIndex].startPosition.row + 1, newRanges[newRangeIndex].startPosition.column + 1);\n                    newChange.newRangeStartOffset = newRanges[newRangeIndex].startIndex;\n                }\n                if (newRanges[newRangeIndex].endIndex > newChange.newRangeEndOffset) {\n                    newChange.newRange = newChange.newRange.setEndPosition(newRanges[newRangeIndex].endPosition.row + 1, newRanges[newRangeIndex].endPosition.column + 1);\n                    newChange.newRangeEndOffset = newRanges[newRangeIndex].endIndex;\n                }\n                newRangeIndex++;\n            }\n            else if (newRangeIndex < newRanges.length && newRanges[newRangeIndex].endIndex < newChange.newRangeStartOffset) {\n                // add the full range to the merged changes\n                mergedChanges.push({\n                    newRange: new Range(newRanges[newRangeIndex].startPosition.row + 1, newRanges[newRangeIndex].startPosition.column + 1, newRanges[newRangeIndex].endPosition.row + 1, newRanges[newRangeIndex].endPosition.column + 1),\n                    newRangeStartOffset: newRanges[newRangeIndex].startIndex,\n                    newRangeEndOffset: newRanges[newRangeIndex].endIndex\n                });\n            }\n            if ((mergedChanges.length > 0) && (mergedChanges[mergedChanges.length - 1].newRangeEndOffset >= newChange.newRangeStartOffset)) {\n                // Merge the changes\n                mergedChanges[mergedChanges.length - 1].newRange = Range.fromPositions(mergedChanges[mergedChanges.length - 1].newRange.getStartPosition(), newChange.newRange.getEndPosition());\n                mergedChanges[mergedChanges.length - 1].newRangeEndOffset = newChange.newRangeEndOffset;\n            }\n            else {\n                mergedChanges.push(newChange);\n            }\n        }\n        return this._constrainRanges(mergedChanges);\n    }\n    _constrainRanges(changes) {\n        if (!this._ranges) {\n            return changes;\n        }\n        const constrainedChanges = [];\n        let changesIndex = 0;\n        let rangesIndex = 0;\n        while (changesIndex < changes.length && rangesIndex < this._ranges.length) {\n            const change = changes[changesIndex];\n            const range = this._ranges[rangesIndex];\n            if (change.newRangeEndOffset < range.startIndex) {\n                // Change is before the range, move to the next change\n                changesIndex++;\n            }\n            else if (change.newRangeStartOffset > range.endIndex) {\n                // Change is after the range, move to the next range\n                rangesIndex++;\n            }\n            else {\n                // Change is within the range, constrain it\n                const newRangeStartOffset = Math.max(change.newRangeStartOffset, range.startIndex);\n                const newRangeEndOffset = Math.min(change.newRangeEndOffset, range.endIndex);\n                const newRange = change.newRange.intersectRanges(new Range(range.startPosition.row + 1, range.startPosition.column + 1, range.endPosition.row + 1, range.endPosition.column + 1));\n                constrainedChanges.push({\n                    newRange,\n                    newRangeEndOffset,\n                    newRangeStartOffset\n                });\n                // Remove the intersected range from the current change\n                if (newRangeEndOffset < change.newRangeEndOffset) {\n                    change.newRange = Range.fromPositions(newRange.getEndPosition(), change.newRange.getEndPosition());\n                    change.newRangeStartOffset = newRangeEndOffset + 1;\n                }\n                else {\n                    // Move to the next change\n                    changesIndex++;\n                }\n            }\n        }\n        return constrainedChanges;\n    }\n    async _parseAndUpdateTree(version) {\n        const tree = await this._parse();\n        if (tree) {\n            this._lastFullyParsed?.delete();\n            this._lastFullyParsed = tree.copy();\n            this._lastFullyParsedWithEdits?.delete();\n            this._lastFullyParsedWithEdits = tree.copy();\n            return tree;\n        }\n        else if (!this._tree.get()) {\n            // No tree means this is the initial parse and there were edits\n            // parse function doesn't handle this well and we can end up with an incorrect tree, so we reset\n            this._parser.reset();\n        }\n        return undefined;\n    }\n    _parse() {\n        let parseType = \"fullParse\" /* TelemetryParseType.Full */;\n        if (this._tree.get()) {\n            parseType = \"incrementalParse\" /* TelemetryParseType.Incremental */;\n        }\n        return this._parseAndYield(parseType);\n    }\n    async _parseAndYield(parseType) {\n        let time = 0;\n        let passes = 0;\n        const inProgressVersion = this.textModel.getVersionId();\n        let newTree;\n        const progressCallback = newTimeOutProgressCallback();\n        do {\n            const timer = performance.now();\n            newTree = this._parser.parse((index, position) => this._parseCallback(index), this._tree.get(), { progressCallback, includedRanges: this._ranges });\n            time += performance.now() - timer;\n            passes++;\n            // So long as this isn't the initial parse, even if the model changes and edits are applied, the tree parsing will continue correctly after the await.\n            await new Promise(resolve => setTimeout0(resolve));\n        } while (!this._store.isDisposed && !newTree && inProgressVersion === this.textModel.getVersionId());\n        this._sendParseTimeTelemetry(parseType, time, passes);\n        return (newTree && (inProgressVersion === this.textModel.getVersionId())) ? newTree : undefined;\n    }\n    _parseCallback(index) {\n        try {\n            return this.textModel.getTextBuffer().getNearestChunk(index);\n        }\n        catch (e) {\n            this._logService.debug('Error getting chunk for tree-sitter parsing', e);\n        }\n        return undefined;\n    }\n    _setRanges(newRanges) {\n        const unKnownRanges = [];\n        // If we have existing ranges, find the parts of the new ranges that are not included in the existing ones\n        if (this._ranges) {\n            for (const newRange of newRanges) {\n                let isFullyIncluded = false;\n                for (let i = 0; i < this._ranges.length; i++) {\n                    const existingRange = this._ranges[i];\n                    if (rangesEqual(existingRange, newRange) || rangesIntersect(existingRange, newRange)) {\n                        isFullyIncluded = true;\n                        break;\n                    }\n                }\n                if (!isFullyIncluded) {\n                    unKnownRanges.push(newRange);\n                }\n            }\n        }\n        else {\n            // No existing ranges, all new ranges are unknown\n            unKnownRanges.push(...newRanges);\n        }\n        this._ranges = newRanges;\n        return unKnownRanges;\n    }\n    _sendParseTimeTelemetry(parseType, time, passes) {\n        this._logService.debug(`Tree parsing (${parseType}) took ${time} ms and ${passes} passes.`);\n        if (parseType === \"fullParse\" /* TelemetryParseType.Full */) {\n            this._telemetryService.publicLog2(`treeSitter.fullParse`, { languageId: this.languageId, time, passes });\n        }\n        else {\n            this._telemetryService.publicLog2(`treeSitter.incrementalParse`, { languageId: this.languageId, time, passes });\n        }\n    }\n    createParsedTreeSync(src) {\n        const parser = new this._parserClass();\n        parser.setLanguage(this._parser.language);\n        const tree = parser.parse(src);\n        parser.delete();\n        return tree ?? undefined;\n    }\n};\nTreeSitterTree = __decorate([\n    __param(5, ILogService),\n    __param(6, ITelemetryService)\n], TreeSitterTree);\nfunction newTimeOutProgressCallback() {\n    let lastYieldTime = performance.now();\n    return function parseProgressCallback(_state) {\n        const now = performance.now();\n        if (now - lastYieldTime > 50) {\n            lastYieldTime = now;\n            return true;\n        }\n        return false;\n    };\n}\nfunction rangesEqual(a, b) {\n    return (a.startPosition.row === b.startPosition.row)\n        && (a.startPosition.column === b.startPosition.column)\n        && (a.endPosition.row === b.endPosition.row)\n        && (a.endPosition.column === b.endPosition.column)\n        && (a.startIndex === b.startIndex)\n        && (a.endIndex === b.endIndex);\n}\nfunction rangesIntersect(a, b) {\n    return (a.startIndex <= b.startIndex && a.endIndex >= b.startIndex) ||\n        (b.startIndex <= a.startIndex && b.endIndex >= a.startIndex);\n}\n\nexport { TreeSitterTree, rangesEqual, rangesIntersect };\n","import { EncodedTokenizationResult, TokenizationResult, Token } from '../languages.js';\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 *--------------------------------------------------------------------------------------------*/\nconst NullState = new class {\n    clone() {\n        return this;\n    }\n    equals(other) {\n        return (this === other);\n    }\n};\nfunction nullTokenize(languageId, state) {\n    return new TokenizationResult([new Token(0, '', languageId)], state);\n}\nfunction nullTokenizeEncoded(languageId, state) {\n    const tokens = new Uint32Array(2);\n    tokens[0] = 0;\n    tokens[1] = ((languageId << 0 /* MetadataConsts.LANGUAGEID_OFFSET */)\n        | (0 /* StandardTokenType.Other */ << 8 /* MetadataConsts.TOKEN_TYPE_OFFSET */)\n        | (0 /* FontStyle.None */ << 11 /* MetadataConsts.FONT_STYLE_OFFSET */)\n        | (1 /* ColorId.DefaultForeground */ << 15 /* MetadataConsts.FOREGROUND_OFFSET */)\n        | (2 /* ColorId.DefaultBackground */ << 24 /* MetadataConsts.BACKGROUND_OFFSET */)) >>> 0;\n    return new EncodedTokenizationResult(tokens, state === null ? NullState : state);\n}\n\nexport { NullState, nullTokenize, nullTokenizeEncoded };\n","import { arrayInsert } from '../../../base/common/arrays.js';\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/**\n * An array that avoids being sparse by always\n * filling up unused indices with a default value.\n */\nclass FixedArray {\n    constructor(_default) {\n        this._default = _default;\n        this._store = [];\n    }\n    get(index) {\n        if (index < this._store.length) {\n            return this._store[index];\n        }\n        return this._default;\n    }\n    set(index, value) {\n        while (index >= this._store.length) {\n            this._store[this._store.length] = this._default;\n        }\n        this._store[index] = value;\n    }\n    replace(index, oldLength, newLength) {\n        if (index >= this._store.length) {\n            return;\n        }\n        if (oldLength === 0) {\n            this.insert(index, newLength);\n            return;\n        }\n        else if (newLength === 0) {\n            this.delete(index, oldLength);\n            return;\n        }\n        const before = this._store.slice(0, index);\n        const after = this._store.slice(index + oldLength);\n        const insertArr = arrayFill(newLength, this._default);\n        this._store = before.concat(insertArr, after);\n    }\n    delete(deleteIndex, deleteCount) {\n        if (deleteCount === 0 || deleteIndex >= this._store.length) {\n            return;\n        }\n        this._store.splice(deleteIndex, deleteCount);\n    }\n    insert(insertIndex, insertCount) {\n        if (insertCount === 0 || insertIndex >= this._store.length) {\n            return;\n        }\n        const arr = [];\n        for (let i = 0; i < insertCount; i++) {\n            arr[i] = this._default;\n        }\n        this._store = arrayInsert(this._store, insertIndex, arr);\n    }\n}\nfunction arrayFill(length, value) {\n    const arr = [];\n    for (let i = 0; i < length; i++) {\n        arr[i] = value;\n    }\n    return arr;\n}\n\nexport { FixedArray };\n","/**\n * Represents contiguous tokens over a contiguous range of lines.\n */\nclass ContiguousMultilineTokens {\n    /**\n     * (Inclusive) start line number for these tokens.\n     */\n    get startLineNumber() {\n        return this._startLineNumber;\n    }\n    /**\n     * (Inclusive) end line number for these tokens.\n     */\n    get endLineNumber() {\n        return this._startLineNumber + this._tokens.length - 1;\n    }\n    constructor(startLineNumber, tokens) {\n        this._startLineNumber = startLineNumber;\n        this._tokens = tokens;\n    }\n    /**\n     * @see {@link _tokens}\n     */\n    getLineTokens(lineNumber) {\n        return this._tokens[lineNumber - this._startLineNumber];\n    }\n    appendLineTokens(lineTokens) {\n        this._tokens.push(lineTokens);\n    }\n}\n\nexport { ContiguousMultilineTokens };\n","import { ContiguousMultilineTokens } from './contiguousMultilineTokens.js';\n\nclass ContiguousMultilineTokensBuilder {\n    constructor() {\n        this._tokens = [];\n    }\n    add(lineNumber, lineTokens) {\n        if (this._tokens.length > 0) {\n            const last = this._tokens[this._tokens.length - 1];\n            if (last.endLineNumber + 1 === lineNumber) {\n                // append\n                last.appendLineTokens(lineTokens);\n                return;\n            }\n        }\n        this._tokens.push(new ContiguousMultilineTokens(lineNumber, [lineTokens]));\n    }\n    finalize() {\n        return this._tokens;\n    }\n}\n\nexport { ContiguousMultilineTokensBuilder };\n","import { runWhenGlobalIdle } from '../../../base/common/async.js';\nimport { BugIndicatingError, onUnexpectedError } from '../../../base/common/errors.js';\nimport { setTimeout0 } from '../../../base/common/platform.js';\nimport { StopWatch } from '../../../base/common/stopwatch.js';\nimport { countEOL } from '../core/misc/eolCounter.js';\nimport { LineRange } from '../core/ranges/lineRange.js';\nimport { OffsetRange } from '../core/ranges/offsetRange.js';\nimport { nullTokenizeEncoded } from '../languages/nullTokenize.js';\nimport { FixedArray } from './fixedArray.js';\nimport { ContiguousMultilineTokensBuilder } from '../tokens/contiguousMultilineTokensBuilder.js';\nimport { LineTokens } from '../tokens/lineTokens.js';\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 *--------------------------------------------------------------------------------------------*/\nclass TokenizerWithStateStore {\n    constructor(lineCount, tokenizationSupport) {\n        this.tokenizationSupport = tokenizationSupport;\n        this.initialState = this.tokenizationSupport.getInitialState();\n        this.store = new TrackingTokenizationStateStore(lineCount);\n    }\n    getStartState(lineNumber) {\n        return this.store.getStartState(lineNumber, this.initialState);\n    }\n    getFirstInvalidLine() {\n        return this.store.getFirstInvalidLine(this.initialState);\n    }\n}\nclass TokenizerWithStateStoreAndTextModel extends TokenizerWithStateStore {\n    constructor(lineCount, tokenizationSupport, _textModel, _languageIdCodec) {\n        super(lineCount, tokenizationSupport);\n        this._textModel = _textModel;\n        this._languageIdCodec = _languageIdCodec;\n    }\n    updateTokensUntilLine(builder, lineNumber) {\n        const languageId = this._textModel.getLanguageId();\n        while (true) {\n            const lineToTokenize = this.getFirstInvalidLine();\n            if (!lineToTokenize || lineToTokenize.lineNumber > lineNumber) {\n                break;\n            }\n            const text = this._textModel.getLineContent(lineToTokenize.lineNumber);\n            const r = safeTokenize(this._languageIdCodec, languageId, this.tokenizationSupport, text, true, lineToTokenize.startState);\n            builder.add(lineToTokenize.lineNumber, r.tokens);\n            this.store.setEndState(lineToTokenize.lineNumber, r.endState);\n        }\n    }\n    /** assumes state is up to date */\n    getTokenTypeIfInsertingCharacter(position, character) {\n        // TODO@hediet: use tokenizeLineWithEdit\n        const lineStartState = this.getStartState(position.lineNumber);\n        if (!lineStartState) {\n            return 0 /* StandardTokenType.Other */;\n        }\n        const languageId = this._textModel.getLanguageId();\n        const lineContent = this._textModel.getLineContent(position.lineNumber);\n        // Create the text as if `character` was inserted\n        const text = (lineContent.substring(0, position.column - 1)\n            + character\n            + lineContent.substring(position.column - 1));\n        const r = safeTokenize(this._languageIdCodec, languageId, this.tokenizationSupport, text, true, lineStartState);\n        const lineTokens = new LineTokens(r.tokens, text, this._languageIdCodec);\n        if (lineTokens.getCount() === 0) {\n            return 0 /* StandardTokenType.Other */;\n        }\n        const tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1);\n        return lineTokens.getStandardTokenType(tokenIndex);\n    }\n    /** assumes state is up to date */\n    tokenizeLinesAt(lineNumber, lines) {\n        const lineStartState = this.getStartState(lineNumber);\n        if (!lineStartState) {\n            return null;\n        }\n        const languageId = this._textModel.getLanguageId();\n        const result = [];\n        let state = lineStartState;\n        for (const line of lines) {\n            const r = safeTokenize(this._languageIdCodec, languageId, this.tokenizationSupport, line, true, state);\n            result.push(new LineTokens(r.tokens, line, this._languageIdCodec));\n            state = r.endState;\n        }\n        return result;\n    }\n    hasAccurateTokensForLine(lineNumber) {\n        const firstInvalidLineNumber = this.store.getFirstInvalidEndStateLineNumberOrMax();\n        return (lineNumber < firstInvalidLineNumber);\n    }\n    isCheapToTokenize(lineNumber) {\n        const firstInvalidLineNumber = this.store.getFirstInvalidEndStateLineNumberOrMax();\n        if (lineNumber < firstInvalidLineNumber) {\n            return true;\n        }\n        if (lineNumber === firstInvalidLineNumber\n            && this._textModel.getLineLength(lineNumber) < 2048 /* Constants.CHEAP_TOKENIZATION_LENGTH_LIMIT */) {\n            return true;\n        }\n        return false;\n    }\n    /**\n     * The result is not cached.\n     */\n    tokenizeHeuristically(builder, startLineNumber, endLineNumber) {\n        if (endLineNumber <= this.store.getFirstInvalidEndStateLineNumberOrMax()) {\n            // nothing to do\n            return { heuristicTokens: false };\n        }\n        if (startLineNumber <= this.store.getFirstInvalidEndStateLineNumberOrMax()) {\n            // tokenization has reached the viewport start...\n            this.updateTokensUntilLine(builder, endLineNumber);\n            return { heuristicTokens: false };\n        }\n        let state = this.guessStartState(startLineNumber);\n        const languageId = this._textModel.getLanguageId();\n        for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n            const text = this._textModel.getLineContent(lineNumber);\n            const r = safeTokenize(this._languageIdCodec, languageId, this.tokenizationSupport, text, true, state);\n            builder.add(lineNumber, r.tokens);\n            state = r.endState;\n        }\n        return { heuristicTokens: true };\n    }\n    guessStartState(lineNumber) {\n        let { likelyRelevantLines, initialState } = findLikelyRelevantLines(this._textModel, lineNumber, this);\n        if (!initialState) {\n            initialState = this.tokenizationSupport.getInitialState();\n        }\n        const languageId = this._textModel.getLanguageId();\n        let state = initialState;\n        for (const line of likelyRelevantLines) {\n            const r = safeTokenize(this._languageIdCodec, languageId, this.tokenizationSupport, line, false, state);\n            state = r.endState;\n        }\n        return state;\n    }\n}\nfunction findLikelyRelevantLines(model, lineNumber, store) {\n    let nonWhitespaceColumn = model.getLineFirstNonWhitespaceColumn(lineNumber);\n    const likelyRelevantLines = [];\n    let initialState = null;\n    for (let i = lineNumber - 1; nonWhitespaceColumn > 1 && i >= 1; i--) {\n        const newNonWhitespaceIndex = model.getLineFirstNonWhitespaceColumn(i);\n        // Ignore lines full of whitespace\n        if (newNonWhitespaceIndex === 0) {\n            continue;\n        }\n        if (newNonWhitespaceIndex < nonWhitespaceColumn) {\n            likelyRelevantLines.push(model.getLineContent(i));\n            nonWhitespaceColumn = newNonWhitespaceIndex;\n            initialState = store?.getStartState(i);\n            if (initialState) {\n                break;\n            }\n        }\n    }\n    likelyRelevantLines.reverse();\n    return { likelyRelevantLines, initialState: initialState ?? undefined };\n}\n/**\n * **Invariant:**\n * If the text model is retokenized from line 1 to {@link getFirstInvalidEndStateLineNumber}() - 1,\n * then the recomputed end state for line l will be equal to {@link getEndState}(l).\n */\nclass TrackingTokenizationStateStore {\n    constructor(lineCount) {\n        this.lineCount = lineCount;\n        this._tokenizationStateStore = new TokenizationStateStore();\n        this._invalidEndStatesLineNumbers = new RangePriorityQueueImpl();\n        this._invalidEndStatesLineNumbers.addRange(new OffsetRange(1, lineCount + 1));\n    }\n    getEndState(lineNumber) {\n        return this._tokenizationStateStore.getEndState(lineNumber);\n    }\n    /**\n     * @returns if the end state has changed.\n     */\n    setEndState(lineNumber, state) {\n        if (!state) {\n            throw new BugIndicatingError('Cannot set null/undefined state');\n        }\n        this._invalidEndStatesLineNumbers.delete(lineNumber);\n        const r = this._tokenizationStateStore.setEndState(lineNumber, state);\n        if (r && lineNumber < this.lineCount) {\n            // because the state changed, we cannot trust the next state anymore and have to invalidate it.\n            this._invalidEndStatesLineNumbers.addRange(new OffsetRange(lineNumber + 1, lineNumber + 2));\n        }\n        return r;\n    }\n    acceptChange(range, newLineCount) {\n        this.lineCount += newLineCount - range.length;\n        this._tokenizationStateStore.acceptChange(range, newLineCount);\n        this._invalidEndStatesLineNumbers.addRangeAndResize(new OffsetRange(range.startLineNumber, range.endLineNumberExclusive), newLineCount);\n    }\n    acceptChanges(changes) {\n        for (const c of changes) {\n            const [eolCount] = countEOL(c.text);\n            this.acceptChange(new LineRange(c.range.startLineNumber, c.range.endLineNumber + 1), eolCount + 1);\n        }\n    }\n    invalidateEndStateRange(range) {\n        this._invalidEndStatesLineNumbers.addRange(new OffsetRange(range.startLineNumber, range.endLineNumberExclusive));\n    }\n    getFirstInvalidEndStateLineNumber() { return this._invalidEndStatesLineNumbers.min; }\n    getFirstInvalidEndStateLineNumberOrMax() {\n        return this.getFirstInvalidEndStateLineNumber() || Number.MAX_SAFE_INTEGER;\n    }\n    allStatesValid() { return this._invalidEndStatesLineNumbers.min === null; }\n    getStartState(lineNumber, initialState) {\n        if (lineNumber === 1) {\n            return initialState;\n        }\n        return this.getEndState(lineNumber - 1);\n    }\n    getFirstInvalidLine(initialState) {\n        const lineNumber = this.getFirstInvalidEndStateLineNumber();\n        if (lineNumber === null) {\n            return null;\n        }\n        const startState = this.getStartState(lineNumber, initialState);\n        if (!startState) {\n            throw new BugIndicatingError('Start state must be defined');\n        }\n        return { lineNumber, startState };\n    }\n}\nclass TokenizationStateStore {\n    constructor() {\n        this._lineEndStates = new FixedArray(null);\n    }\n    getEndState(lineNumber) {\n        return this._lineEndStates.get(lineNumber);\n    }\n    setEndState(lineNumber, state) {\n        const oldState = this._lineEndStates.get(lineNumber);\n        if (oldState && oldState.equals(state)) {\n            return false;\n        }\n        this._lineEndStates.set(lineNumber, state);\n        return true;\n    }\n    acceptChange(range, newLineCount) {\n        let length = range.length;\n        if (newLineCount > 0 && length > 0) {\n            // Keep the last state, even though it is unrelated.\n            // But if the new state happens to agree with this last state, then we know we can stop tokenizing.\n            length--;\n            newLineCount--;\n        }\n        this._lineEndStates.replace(range.startLineNumber, length, newLineCount);\n    }\n}\nclass RangePriorityQueueImpl {\n    constructor() {\n        this._ranges = [];\n    }\n    get min() {\n        if (this._ranges.length === 0) {\n            return null;\n        }\n        return this._ranges[0].start;\n    }\n    delete(value) {\n        const idx = this._ranges.findIndex(r => r.contains(value));\n        if (idx !== -1) {\n            const range = this._ranges[idx];\n            if (range.start === value) {\n                if (range.endExclusive === value + 1) {\n                    this._ranges.splice(idx, 1);\n                }\n                else {\n                    this._ranges[idx] = new OffsetRange(value + 1, range.endExclusive);\n                }\n            }\n            else {\n                if (range.endExclusive === value + 1) {\n                    this._ranges[idx] = new OffsetRange(range.start, value);\n                }\n                else {\n                    this._ranges.splice(idx, 1, new OffsetRange(range.start, value), new OffsetRange(value + 1, range.endExclusive));\n                }\n            }\n        }\n    }\n    addRange(range) {\n        OffsetRange.addRange(range, this._ranges);\n    }\n    addRangeAndResize(range, newLength) {\n        let idxFirstMightBeIntersecting = 0;\n        while (!(idxFirstMightBeIntersecting >= this._ranges.length || range.start <= this._ranges[idxFirstMightBeIntersecting].endExclusive)) {\n            idxFirstMightBeIntersecting++;\n        }\n        let idxFirstIsAfter = idxFirstMightBeIntersecting;\n        while (!(idxFirstIsAfter >= this._ranges.length || range.endExclusive < this._ranges[idxFirstIsAfter].start)) {\n            idxFirstIsAfter++;\n        }\n        const delta = newLength - range.length;\n        for (let i = idxFirstIsAfter; i < this._ranges.length; i++) {\n            this._ranges[i] = this._ranges[i].delta(delta);\n        }\n        if (idxFirstMightBeIntersecting === idxFirstIsAfter) {\n            const newRange = new OffsetRange(range.start, range.start + newLength);\n            if (!newRange.isEmpty) {\n                this._ranges.splice(idxFirstMightBeIntersecting, 0, newRange);\n            }\n        }\n        else {\n            const start = Math.min(range.start, this._ranges[idxFirstMightBeIntersecting].start);\n            const endEx = Math.max(range.endExclusive, this._ranges[idxFirstIsAfter - 1].endExclusive);\n            const newRange = new OffsetRange(start, endEx + delta);\n            if (!newRange.isEmpty) {\n                this._ranges.splice(idxFirstMightBeIntersecting, idxFirstIsAfter - idxFirstMightBeIntersecting, newRange);\n            }\n            else {\n                this._ranges.splice(idxFirstMightBeIntersecting, idxFirstIsAfter - idxFirstMightBeIntersecting);\n            }\n        }\n    }\n    toString() {\n        return this._ranges.map(r => r.toString()).join(' + ');\n    }\n}\nfunction safeTokenize(languageIdCodec, languageId, tokenizationSupport, text, hasEOL, state) {\n    let r = null;\n    if (tokenizationSupport) {\n        try {\n            r = tokenizationSupport.tokenizeEncoded(text, hasEOL, state.clone());\n        }\n        catch (e) {\n            onUnexpectedError(e);\n        }\n    }\n    if (!r) {\n        r = nullTokenizeEncoded(languageIdCodec.encodeLanguageId(languageId), state);\n    }\n    LineTokens.convertToEndOffset(r.tokens, text.length);\n    return r;\n}\nclass DefaultBackgroundTokenizer {\n    constructor(_tokenizerWithStateStore, _backgroundTokenStore) {\n        this._tokenizerWithStateStore = _tokenizerWithStateStore;\n        this._backgroundTokenStore = _backgroundTokenStore;\n        this._isDisposed = false;\n        this._isScheduled = false;\n    }\n    dispose() {\n        this._isDisposed = true;\n    }\n    handleChanges() {\n        this._beginBackgroundTokenization();\n    }\n    _beginBackgroundTokenization() {\n        if (this._isScheduled || !this._tokenizerWithStateStore._textModel.isAttachedToEditor() || !this._hasLinesToTokenize()) {\n            return;\n        }\n        this._isScheduled = true;\n        runWhenGlobalIdle((deadline) => {\n            this._isScheduled = false;\n            this._backgroundTokenizeWithDeadline(deadline);\n        });\n    }\n    /**\n     * Tokenize until the deadline occurs, but try to yield every 1-2ms.\n     */\n    _backgroundTokenizeWithDeadline(deadline) {\n        // Read the time remaining from the `deadline` immediately because it is unclear\n        // if the `deadline` object will be valid after execution leaves this function.\n        const endTime = Date.now() + deadline.timeRemaining();\n        const execute = () => {\n            if (this._isDisposed || !this._tokenizerWithStateStore._textModel.isAttachedToEditor() || !this._hasLinesToTokenize()) {\n                // disposed in the meantime or detached or finished\n                return;\n            }\n            this._backgroundTokenizeForAtLeast1ms();\n            if (Date.now() < endTime) {\n                // There is still time before reaching the deadline, so yield to the browser and then\n                // continue execution\n                setTimeout0(execute);\n            }\n            else {\n                // The deadline has been reached, so schedule a new idle callback if necessary\n                this._beginBackgroundTokenization();\n            }\n        };\n        execute();\n    }\n    /**\n     * Tokenize for at least 1ms.\n     */\n    _backgroundTokenizeForAtLeast1ms() {\n        const lineCount = this._tokenizerWithStateStore._textModel.getLineCount();\n        const builder = new ContiguousMultilineTokensBuilder();\n        const sw = StopWatch.create(false);\n        do {\n            if (sw.elapsed() > 1) {\n                // the comparison is intentionally > 1 and not >= 1 to ensure that\n                // a full millisecond has elapsed, given how microseconds are rounded\n                // to milliseconds\n                break;\n            }\n            const tokenizedLineNumber = this._tokenizeOneInvalidLine(builder);\n            if (tokenizedLineNumber >= lineCount) {\n                break;\n            }\n        } while (this._hasLinesToTokenize());\n        this._backgroundTokenStore.setTokens(builder.finalize());\n        this.checkFinished();\n    }\n    _hasLinesToTokenize() {\n        if (!this._tokenizerWithStateStore) {\n            return false;\n        }\n        return !this._tokenizerWithStateStore.store.allStatesValid();\n    }\n    _tokenizeOneInvalidLine(builder) {\n        const firstInvalidLine = this._tokenizerWithStateStore?.getFirstInvalidLine();\n        if (!firstInvalidLine) {\n            return this._tokenizerWithStateStore._textModel.getLineCount() + 1;\n        }\n        this._tokenizerWithStateStore.updateTokensUntilLine(builder, firstInvalidLine.lineNumber);\n        return firstInvalidLine.lineNumber;\n    }\n    checkFinished() {\n        if (this._isDisposed) {\n            return;\n        }\n        if (this._tokenizerWithStateStore.store.allStatesValid()) {\n            this._backgroundTokenStore.backgroundTokenizationFinished();\n        }\n    }\n    requestTokens(startLineNumber, endLineNumberExclusive) {\n        this._tokenizerWithStateStore.store.invalidateEndStateRange(new LineRange(startLineNumber, endLineNumberExclusive));\n    }\n}\n\nexport { DefaultBackgroundTokenizer, RangePriorityQueueImpl, TokenizationStateStore, TokenizerWithStateStore, TokenizerWithStateStoreAndTextModel, TrackingTokenizationStateStore, findLikelyRelevantLines };\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// Exported for tests\nclass ListNode {\n    get children() { return this._children; }\n    get length() { return this._length; }\n    constructor(height) {\n        this.height = height;\n        this._children = [];\n        this._length = 0;\n    }\n    static create(node1, node2) {\n        const list = new ListNode(node1.height + 1);\n        list.appendChild(node1);\n        list.appendChild(node2);\n        return list;\n    }\n    canAppendChild() {\n        return this._children.length < 3;\n    }\n    appendChild(node) {\n        if (!this.canAppendChild()) {\n            throw new Error('Cannot insert more than 3 children in a ListNode');\n        }\n        this._children.push(node);\n        this._length += node.length;\n        this._updateParentLength(node.length);\n        if (!isLeaf(node)) {\n            node.parent = this;\n        }\n    }\n    _updateParentLength(delta) {\n        let updateParent = this.parent;\n        while (updateParent) {\n            updateParent._length += delta;\n            updateParent = updateParent.parent;\n        }\n    }\n    unappendChild() {\n        const child = this._children.pop();\n        this._length -= child.length;\n        this._updateParentLength(-child.length);\n        return child;\n    }\n    prependChild(node) {\n        if (this._children.length >= 3) {\n            throw new Error('Cannot prepend more than 3 children in a ListNode');\n        }\n        this._children.unshift(node);\n        this._length += node.length;\n        this._updateParentLength(node.length);\n        if (!isLeaf(node)) {\n            node.parent = this;\n        }\n    }\n    unprependChild() {\n        const child = this._children.shift();\n        this._length -= child.length;\n        this._updateParentLength(-child.length);\n        return child;\n    }\n    lastChild() {\n        return this._children[this._children.length - 1];\n    }\n    dispose() {\n        this._children.splice(0, this._children.length);\n    }\n}\nvar TokenQuality;\n(function (TokenQuality) {\n    TokenQuality[TokenQuality[\"None\"] = 0] = \"None\";\n    TokenQuality[TokenQuality[\"ViewportGuess\"] = 1] = \"ViewportGuess\";\n    TokenQuality[TokenQuality[\"EditGuess\"] = 2] = \"EditGuess\";\n    TokenQuality[TokenQuality[\"Accurate\"] = 3] = \"Accurate\";\n})(TokenQuality || (TokenQuality = {}));\nfunction isLeaf(node) {\n    return node.token !== undefined;\n}\n// Heavily inspired by https://github.com/microsoft/vscode/blob/4eb2658d592cb6114a7a393655574176cc790c5b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/concat23Trees.ts#L108-L109\nfunction append(node, nodeToAppend) {\n    let curNode = node;\n    const parents = [];\n    let nodeToAppendOfCorrectHeight;\n    while (true) {\n        if (nodeToAppend.height === curNode.height) {\n            nodeToAppendOfCorrectHeight = nodeToAppend;\n            break;\n        }\n        if (isLeaf(curNode)) {\n            throw new Error('unexpected');\n        }\n        parents.push(curNode);\n        curNode = curNode.lastChild();\n    }\n    for (let i = parents.length - 1; i >= 0; i--) {\n        const parent = parents[i];\n        if (nodeToAppendOfCorrectHeight) {\n            // Can we take the element?\n            if (parent.children.length >= 3) {\n                // we need to split to maintain (2,3)-tree property.\n                // Send the third element + the new element to the parent.\n                const newList = ListNode.create(parent.unappendChild(), nodeToAppendOfCorrectHeight);\n                nodeToAppendOfCorrectHeight = newList;\n            }\n            else {\n                parent.appendChild(nodeToAppendOfCorrectHeight);\n                nodeToAppendOfCorrectHeight = undefined;\n            }\n        }\n    }\n    if (nodeToAppendOfCorrectHeight) {\n        const newList = new ListNode(nodeToAppendOfCorrectHeight.height + 1);\n        newList.appendChild(node);\n        newList.appendChild(nodeToAppendOfCorrectHeight);\n        return newList;\n    }\n    else {\n        return node;\n    }\n}\nfunction prepend(list, nodeToAppend) {\n    let curNode = list;\n    const parents = [];\n    while (nodeToAppend.height !== curNode.height) {\n        if (isLeaf(curNode)) {\n            throw new Error('unexpected');\n        }\n        parents.push(curNode);\n        // assert 2 <= curNode.childrenFast.length <= 3\n        curNode = curNode.children[0];\n    }\n    let nodeToPrependOfCorrectHeight = nodeToAppend;\n    // assert nodeToAppendOfCorrectHeight!.listHeight === curNode.listHeight\n    for (let i = parents.length - 1; i >= 0; i--) {\n        const parent = parents[i];\n        if (nodeToPrependOfCorrectHeight) {\n            // Can we take the element?\n            if (parent.children.length >= 3) {\n                // we need to split to maintain (2,3)-tree property.\n                // Send the third element + the new element to the parent.\n                nodeToPrependOfCorrectHeight = ListNode.create(nodeToPrependOfCorrectHeight, parent.unprependChild());\n            }\n            else {\n                parent.prependChild(nodeToPrependOfCorrectHeight);\n                nodeToPrependOfCorrectHeight = undefined;\n            }\n        }\n    }\n    if (nodeToPrependOfCorrectHeight) {\n        return ListNode.create(nodeToPrependOfCorrectHeight, list);\n    }\n    else {\n        return list;\n    }\n}\nfunction concat(node1, node2) {\n    if (node1.height === node2.height) {\n        return ListNode.create(node1, node2);\n    }\n    else if (node1.height > node2.height) {\n        // node1 is the tree we want to insert into\n        return append(node1, node2);\n    }\n    else {\n        return prepend(node2, node1);\n    }\n}\nclass TokenStore {\n    constructor(_textModel) {\n        this._textModel = _textModel;\n        this._root = this.createEmptyRoot();\n    }\n    createEmptyRoot() {\n        return {\n            length: this._textModel.getValueLength(),\n            token: 0,\n            height: 0,\n            tokenQuality: TokenQuality.None\n        };\n    }\n    /**\n     *\n     * @param update all the tokens for the document in sequence\n     */\n    buildStore(tokens, tokenQuality) {\n        this._root = this.createFromUpdates(tokens, tokenQuality);\n    }\n    createFromUpdates(tokens, tokenQuality) {\n        if (tokens.length === 0) {\n            return this.createEmptyRoot();\n        }\n        let newRoot = {\n            length: tokens[0].length,\n            token: tokens[0].token,\n            height: 0,\n            tokenQuality\n        };\n        for (let j = 1; j < tokens.length; j++) {\n            newRoot = append(newRoot, { length: tokens[j].length, token: tokens[j].token, height: 0, tokenQuality });\n        }\n        return newRoot;\n    }\n    /**\n     *\n     * @param tokens tokens are in sequence in the document.\n     */\n    update(length, tokens, tokenQuality) {\n        if (tokens.length === 0) {\n            return;\n        }\n        this.replace(length, tokens[0].startOffsetInclusive, tokens, tokenQuality);\n    }\n    delete(length, startOffset) {\n        this.replace(length, startOffset, [], TokenQuality.EditGuess);\n    }\n    /**\n     *\n     * @param tokens tokens are in sequence in the document.\n     */\n    replace(length, updateOffsetStart, tokens, tokenQuality) {\n        const firstUnchangedOffsetAfterUpdate = updateOffsetStart + length;\n        // Find the last unchanged node preceding the update\n        const precedingNodes = [];\n        // Find the first unchanged node after the update\n        const postcedingNodes = [];\n        const stack = [{ node: this._root, offset: 0 }];\n        while (stack.length > 0) {\n            const node = stack.pop();\n            const currentOffset = node.offset;\n            if (currentOffset < updateOffsetStart && currentOffset + node.node.length <= updateOffsetStart) {\n                if (!isLeaf(node.node)) {\n                    node.node.parent = undefined;\n                }\n                precedingNodes.push(node.node);\n                continue;\n            }\n            else if (isLeaf(node.node) && (currentOffset < updateOffsetStart)) {\n                // We have a partial preceding node\n                precedingNodes.push({ length: updateOffsetStart - currentOffset, token: node.node.token, height: 0, tokenQuality: node.node.tokenQuality });\n                // Node could also be postceeding, so don't continue\n            }\n            if ((updateOffsetStart <= currentOffset) && (currentOffset + node.node.length <= firstUnchangedOffsetAfterUpdate)) {\n                continue;\n            }\n            if (currentOffset >= firstUnchangedOffsetAfterUpdate) {\n                if (!isLeaf(node.node)) {\n                    node.node.parent = undefined;\n                }\n                postcedingNodes.push(node.node);\n                continue;\n            }\n            else if (isLeaf(node.node) && (currentOffset + node.node.length > firstUnchangedOffsetAfterUpdate)) {\n                // we have a partial postceeding node\n                postcedingNodes.push({ length: currentOffset + node.node.length - firstUnchangedOffsetAfterUpdate, token: node.node.token, height: 0, tokenQuality: node.node.tokenQuality });\n                continue;\n            }\n            if (!isLeaf(node.node)) {\n                // Push children in reverse order to process them left-to-right when popping\n                let childOffset = currentOffset + node.node.length;\n                for (let i = node.node.children.length - 1; i >= 0; i--) {\n                    childOffset -= node.node.children[i].length;\n                    stack.push({ node: node.node.children[i], offset: childOffset });\n                }\n            }\n        }\n        let allNodes;\n        if (tokens.length > 0) {\n            allNodes = precedingNodes.concat(this.createFromUpdates(tokens, tokenQuality), postcedingNodes);\n        }\n        else {\n            allNodes = precedingNodes.concat(postcedingNodes);\n        }\n        let newRoot = allNodes[0];\n        for (let i = 1; i < allNodes.length; i++) {\n            newRoot = concat(newRoot, allNodes[i]);\n        }\n        this._root = newRoot ?? this.createEmptyRoot();\n    }\n    /**\n     *\n     * @param startOffsetInclusive\n     * @param endOffsetExclusive\n     * @param visitor Return true from visitor to exit early\n     * @returns\n     */\n    traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, visitor) {\n        const stack = [{ node: this._root, offset: 0 }];\n        while (stack.length > 0) {\n            const { node, offset } = stack.pop();\n            const nodeEnd = offset + node.length;\n            // Skip nodes that are completely before or after the range\n            if (nodeEnd <= startOffsetInclusive || offset >= endOffsetExclusive) {\n                continue;\n            }\n            if (visitor(node, offset)) {\n                return;\n            }\n            if (!isLeaf(node)) {\n                // Push children in reverse order to process them left-to-right when popping\n                let childOffset = offset + node.length;\n                for (let i = node.children.length - 1; i >= 0; i--) {\n                    childOffset -= node.children[i].length;\n                    stack.push({ node: node.children[i], offset: childOffset });\n                }\n            }\n        }\n    }\n    getTokenAt(offset) {\n        let result;\n        this.traverseInOrderInRange(offset, this._root.length, (node, offset) => {\n            if (isLeaf(node)) {\n                result = { token: node.token, startOffsetInclusive: offset, length: node.length };\n                return true;\n            }\n            return false;\n        });\n        return result;\n    }\n    getTokensInRange(startOffsetInclusive, endOffsetExclusive) {\n        const result = [];\n        this.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node, offset) => {\n            if (isLeaf(node)) {\n                let clippedLength = node.length;\n                let clippedOffset = offset;\n                if ((offset < startOffsetInclusive) && (offset + node.length > endOffsetExclusive)) {\n                    clippedOffset = startOffsetInclusive;\n                    clippedLength = endOffsetExclusive - startOffsetInclusive;\n                }\n                else if (offset < startOffsetInclusive) {\n                    clippedLength -= (startOffsetInclusive - offset);\n                    clippedOffset = startOffsetInclusive;\n                }\n                else if (offset + node.length > endOffsetExclusive) {\n                    clippedLength -= (offset + node.length - endOffsetExclusive);\n                }\n                result.push({ token: node.token, startOffsetInclusive: clippedOffset, length: clippedLength });\n            }\n            return false;\n        });\n        return result;\n    }\n    markForRefresh(startOffsetInclusive, endOffsetExclusive) {\n        this.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n            if (isLeaf(node)) {\n                node.tokenQuality = TokenQuality.None;\n            }\n            return false;\n        });\n    }\n    rangeHasTokens(startOffsetInclusive, endOffsetExclusive, minimumTokenQuality) {\n        let hasAny = true;\n        this.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n            if (isLeaf(node) && (node.tokenQuality < minimumTokenQuality)) {\n                hasAny = false;\n            }\n            return false;\n        });\n        return hasAny;\n    }\n    rangeNeedsRefresh(startOffsetInclusive, endOffsetExclusive) {\n        let needsRefresh = false;\n        this.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n            if (isLeaf(node) && (node.tokenQuality !== TokenQuality.Accurate)) {\n                needsRefresh = true;\n            }\n            return false;\n        });\n        return needsRefresh;\n    }\n    getNeedsRefresh() {\n        const result = [];\n        this.traverseInOrderInRange(0, this._textModel.getValueLength(), (node, offset) => {\n            if (isLeaf(node) && (node.tokenQuality !== TokenQuality.Accurate)) {\n                if ((result.length > 0) && (result[result.length - 1].endOffset === offset)) {\n                    result[result.length - 1].endOffset += node.length;\n                }\n                else {\n                    result.push({ startOffset: offset, endOffset: offset + node.length });\n                }\n            }\n            return false;\n        });\n        return result;\n    }\n    dispose() {\n        const stack = [[this._root, false]];\n        while (stack.length > 0) {\n            const [node, visited] = stack.pop();\n            if (isLeaf(node)) ;\n            else if (!visited) {\n                stack.push([node, true]);\n                for (let i = node.children.length - 1; i >= 0; i--) {\n                    stack.push([node.children[i], false]);\n                }\n            }\n            else {\n                node.dispose();\n                node.parent = undefined;\n            }\n        }\n        this._root = undefined;\n    }\n}\n\nexport { ListNode, TokenQuality, TokenStore };\n","import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst ITreeSitterThemeService = createDecorator('treeSitterThemeService');\n\nexport { ITreeSitterThemeService };\n","import { BugIndicatingError } from '../errors.js';\nimport '../arrays.js';\nimport '../event.js';\nimport '../lifecycle.js';\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/**\n * Subscribes to and records changes and the last value of the given observables.\n * Don't use the key \"changes\", as it is reserved for the changes array!\n*/\nfunction recordChanges(obs) {\n    return {\n        createChangeSummary: (_previousChangeSummary) => {\n            // eslint-disable-next-line local/code-no-any-casts\n            return {\n                changes: [],\n            };\n        },\n        handleChange(ctx, changeSummary) {\n            for (const key in obs) {\n                if (ctx.didChange(obs[key])) {\n                    // eslint-disable-next-line local/code-no-any-casts\n                    changeSummary.changes.push({ key, change: ctx.change });\n                }\n            }\n            return true;\n        },\n        beforeUpdate(reader, changeSummary) {\n            for (const key in obs) {\n                if (key === 'changes') {\n                    throw new BugIndicatingError('property name \"changes\" is reserved for change tracking');\n                }\n                changeSummary[key] = obs[key].read(reader);\n            }\n        }\n    };\n}\n/**\n * Subscribes to and records changes and the last value of the given observables.\n * Don't use the key \"changes\", as it is reserved for the changes array!\n*/\nfunction recordChangesLazy(getObs) {\n    let obs = undefined;\n    return {\n        createChangeSummary: (_previousChangeSummary) => {\n            // eslint-disable-next-line local/code-no-any-casts\n            return {\n                changes: [],\n            };\n        },\n        handleChange(ctx, changeSummary) {\n            if (!obs) {\n                obs = getObs();\n            }\n            for (const key in obs) {\n                if (ctx.didChange(obs[key])) {\n                    // eslint-disable-next-line local/code-no-any-casts\n                    changeSummary.changes.push({ key, change: ctx.change });\n                }\n            }\n            return true;\n        },\n        beforeUpdate(reader, changeSummary) {\n            if (!obs) {\n                obs = getObs();\n            }\n            for (const key in obs) {\n                if (key === 'changes') {\n                    throw new BugIndicatingError('property name \"changes\" is reserved for change tracking');\n                }\n                changeSummary[key] = obs[key].read(reader);\n            }\n        }\n    };\n}\n\nexport { recordChanges, recordChangesLazy };\n","import { Emitter } from '../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport { setTimeout0 } from '../../../../../base/common/platform.js';\nimport { StopWatch } from '../../../../../base/common/stopwatch.js';\nimport { findLikelyRelevantLines } from '../../textModelTokens.js';\nimport { TokenStore, TokenQuality } from './tokenStore.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { LineTokens } from '../../../tokens/lineTokens.js';\nimport { Position } from '../../../core/position.js';\nimport { Range } from '../../../core/range.js';\nimport { isDefined } from '../../../../../base/common/types.js';\nimport { ITreeSitterThemeService } from '../../../services/treeSitter/treeSitterThemeService.js';\nimport { BugIndicatingError } from '../../../../../base/common/errors.js';\nimport { autorun, autorunHandleChanges } from '../../../../../base/common/observableInternal/reactions/autorun.js';\nimport { recordChanges } from '../../../../../base/common/observableInternal/changeTracker.js';\nimport { runOnChange } from '../../../../../base/common/observableInternal/utils/runOnChange.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet TreeSitterTokenizationImpl = class TreeSitterTokenizationImpl extends Disposable {\n    get _textModel() {\n        return this._tree.textModel;\n    }\n    constructor(_tree, _highlightingQueries, _languageIdCodec, _visibleLineRanges, _treeSitterThemeService) {\n        super();\n        this._tree = _tree;\n        this._highlightingQueries = _highlightingQueries;\n        this._languageIdCodec = _languageIdCodec;\n        this._visibleLineRanges = _visibleLineRanges;\n        this._treeSitterThemeService = _treeSitterThemeService;\n        this._onDidChangeTokens = this._register(new Emitter());\n        this.onDidChangeTokens = this._onDidChangeTokens.event;\n        this._onDidCompleteBackgroundTokenization = this._register(new Emitter());\n        this.onDidChangeBackgroundTokenization = this._onDidCompleteBackgroundTokenization.event;\n        this._encodedLanguageId = this._languageIdCodec.encodeLanguageId(this._tree.languageId);\n        this._register(runOnChange(this._treeSitterThemeService.onChange, () => {\n            this._updateTheme();\n        }));\n        this._tokenStore = this._register(new TokenStore(this._textModel));\n        this._accurateVersion = this._textModel.getVersionId();\n        this._guessVersion = this._textModel.getVersionId();\n        this._tokenStore.buildStore(this._createEmptyTokens(), TokenQuality.None);\n        this._register(autorun(reader => {\n            const visibleLineRanges = this._visibleLineRanges.read(reader);\n            this._parseAndTokenizeViewPort(visibleLineRanges);\n        }));\n        this._register(autorunHandleChanges({\n            owner: this,\n            changeTracker: recordChanges({ tree: this._tree.tree }),\n        }, (reader, ctx) => {\n            const changeEvent = ctx.changes.at(0)?.change;\n            if (ctx.changes.length > 1) {\n                throw new BugIndicatingError('The tree changed twice in one transaction. This is currently not supported and should not happen.');\n            }\n            if (!changeEvent) {\n                if (ctx.tree) {\n                    this._firstTreeUpdate(this._tree.treeLastParsedVersion.read(reader));\n                }\n            }\n            else {\n                if (this.hasTokens()) {\n                    // Mark the range for refresh immediately\n                    for (const range of changeEvent.ranges) {\n                        this._markForRefresh(range.newRange);\n                    }\n                }\n                // First time we see a tree we need to build a token store.\n                if (!this.hasTokens()) {\n                    this._firstTreeUpdate(changeEvent.versionId);\n                }\n                else {\n                    this._handleTreeUpdate(changeEvent.ranges, changeEvent.versionId);\n                }\n            }\n        }));\n    }\n    handleContentChanged(e) {\n        this._guessVersion = e.versionId;\n        for (const change of e.changes) {\n            if (change.text.length > change.rangeLength) {\n                // If possible, use the token before the change as the starting point for the new token.\n                // This is more likely to let the new text be the correct color as typeing is usually at the end of the token.\n                const offset = change.rangeOffset > 0 ? change.rangeOffset - 1 : change.rangeOffset;\n                const oldToken = this._tokenStore.getTokenAt(offset);\n                let newToken;\n                if (oldToken) {\n                    // Insert. Just grow the token at this position to include the insert.\n                    newToken = { startOffsetInclusive: oldToken.startOffsetInclusive, length: oldToken.length + change.text.length - change.rangeLength, token: oldToken.token };\n                    // Also mark tokens that are in the range of the change as needing a refresh.\n                    this._tokenStore.markForRefresh(offset, change.rangeOffset + (change.text.length > change.rangeLength ? change.text.length : change.rangeLength));\n                }\n                else {\n                    // The document got larger and the change is at the end of the document.\n                    newToken = { startOffsetInclusive: offset, length: change.text.length, token: 0 };\n                }\n                this._tokenStore.update(oldToken?.length ?? 0, [newToken], TokenQuality.EditGuess);\n            }\n            else if (change.text.length < change.rangeLength) {\n                // Delete. Delete the tokens at the corresponding range.\n                const deletedCharCount = change.rangeLength - change.text.length;\n                this._tokenStore.delete(deletedCharCount, change.rangeOffset);\n            }\n        }\n    }\n    getLineTokens(lineNumber) {\n        const content = this._textModel.getLineContent(lineNumber);\n        const rawTokens = this.getTokens(lineNumber);\n        return new LineTokens(rawTokens, content, this._languageIdCodec);\n    }\n    _createEmptyTokens() {\n        const emptyToken = this._emptyToken();\n        const modelEndOffset = this._textModel.getValueLength();\n        const emptyTokens = [this._emptyTokensForOffsetAndLength(0, modelEndOffset, emptyToken)];\n        return emptyTokens;\n    }\n    _emptyToken() {\n        return this._treeSitterThemeService.findMetadata([], this._encodedLanguageId, false, undefined);\n    }\n    _emptyTokensForOffsetAndLength(offset, length, emptyToken) {\n        return { token: emptyToken, length: offset + length, startOffsetInclusive: 0 };\n    }\n    hasAccurateTokensForLine(lineNumber) {\n        return this.hasTokens(new Range(lineNumber, 1, lineNumber, this._textModel.getLineMaxColumn(lineNumber)));\n    }\n    tokenizeLinesAt(lineNumber, lines) {\n        const rawLineTokens = this._guessTokensForLinesContent(lineNumber, lines);\n        const lineTokens = [];\n        if (!rawLineTokens) {\n            return null;\n        }\n        for (let i = 0; i < rawLineTokens.length; i++) {\n            lineTokens.push(new LineTokens(rawLineTokens[i], lines[i], this._languageIdCodec));\n        }\n        return lineTokens;\n    }\n    _rangeHasTokens(range, minimumTokenQuality) {\n        return this._tokenStore.rangeHasTokens(this._textModel.getOffsetAt(range.getStartPosition()), this._textModel.getOffsetAt(range.getEndPosition()), minimumTokenQuality);\n    }\n    hasTokens(accurateForRange) {\n        if (!accurateForRange || (this._guessVersion === this._accurateVersion)) {\n            return true;\n        }\n        return !this._tokenStore.rangeNeedsRefresh(this._textModel.getOffsetAt(accurateForRange.getStartPosition()), this._textModel.getOffsetAt(accurateForRange.getEndPosition()));\n    }\n    getTokens(line) {\n        const lineStartOffset = this._textModel.getOffsetAt({ lineNumber: line, column: 1 });\n        const lineEndOffset = this._textModel.getOffsetAt({ lineNumber: line, column: this._textModel.getLineLength(line) + 1 });\n        const lineTokens = this._tokenStore.getTokensInRange(lineStartOffset, lineEndOffset);\n        const result = new Uint32Array(lineTokens.length * 2);\n        for (let i = 0; i < lineTokens.length; i++) {\n            result[i * 2] = lineTokens[i].startOffsetInclusive - lineStartOffset + lineTokens[i].length;\n            result[i * 2 + 1] = lineTokens[i].token;\n        }\n        return result;\n    }\n    getTokensInRange(range, rangeStartOffset, rangeEndOffset, captures) {\n        const tokens = captures ? this._tokenizeCapturesWithMetadata(captures, rangeStartOffset, rangeEndOffset) : this._tokenize(range, rangeStartOffset, rangeEndOffset);\n        if (tokens?.endOffsetsAndMetadata) {\n            return this._rangeTokensAsUpdates(rangeStartOffset, tokens.endOffsetsAndMetadata);\n        }\n        return undefined;\n    }\n    _updateTokensInStore(version, updates, tokenQuality) {\n        this._accurateVersion = version;\n        for (const update of updates) {\n            const lastToken = update.newTokens.length > 0 ? update.newTokens[update.newTokens.length - 1] : undefined;\n            let oldRangeLength;\n            if (lastToken && (this._guessVersion >= version)) {\n                oldRangeLength = lastToken.startOffsetInclusive + lastToken.length - update.newTokens[0].startOffsetInclusive;\n            }\n            else if (update.oldRangeLength) {\n                oldRangeLength = update.oldRangeLength;\n            }\n            else {\n                oldRangeLength = 0;\n            }\n            this._tokenStore.update(oldRangeLength, update.newTokens, tokenQuality);\n        }\n    }\n    _markForRefresh(range) {\n        this._tokenStore.markForRefresh(this._textModel.getOffsetAt(range.getStartPosition()), this._textModel.getOffsetAt(range.getEndPosition()));\n    }\n    _getNeedsRefresh() {\n        const needsRefreshOffsetRanges = this._tokenStore.getNeedsRefresh();\n        if (!needsRefreshOffsetRanges) {\n            return [];\n        }\n        return needsRefreshOffsetRanges.map(range => ({\n            range: Range.fromPositions(this._textModel.getPositionAt(range.startOffset), this._textModel.getPositionAt(range.endOffset)),\n            startOffset: range.startOffset,\n            endOffset: range.endOffset\n        }));\n    }\n    _parseAndTokenizeViewPort(lineRanges) {\n        const viewportRanges = lineRanges.map(r => r.toInclusiveRange()).filter(isDefined);\n        for (const range of viewportRanges) {\n            const startOffsetOfRangeInDocument = this._textModel.getOffsetAt(range.getStartPosition());\n            const endOffsetOfRangeInDocument = this._textModel.getOffsetAt(range.getEndPosition());\n            const version = this._textModel.getVersionId();\n            if (this._rangeHasTokens(range, TokenQuality.ViewportGuess)) {\n                continue;\n            }\n            const content = this._textModel.getValueInRange(range);\n            const tokenUpdates = this._forceParseAndTokenizeContent(range, startOffsetOfRangeInDocument, endOffsetOfRangeInDocument, content, true);\n            if (!tokenUpdates || this._rangeHasTokens(range, TokenQuality.ViewportGuess)) {\n                continue;\n            }\n            if (tokenUpdates.length === 0) {\n                continue;\n            }\n            const lastToken = tokenUpdates[tokenUpdates.length - 1];\n            const oldRangeLength = lastToken.startOffsetInclusive + lastToken.length - tokenUpdates[0].startOffsetInclusive;\n            this._updateTokensInStore(version, [{ newTokens: tokenUpdates, oldRangeLength }], TokenQuality.ViewportGuess);\n            this._onDidChangeTokens.fire({ changes: { semanticTokensApplied: false, ranges: [{ fromLineNumber: range.startLineNumber, toLineNumber: range.endLineNumber }] } });\n        }\n    }\n    _guessTokensForLinesContent(lineNumber, lines) {\n        if (lines.length === 0) {\n            return undefined;\n        }\n        const lineContent = lines.join(this._textModel.getEOL());\n        const range = new Range(1, 1, lineNumber + lines.length, lines[lines.length - 1].length + 1);\n        const startOffset = this._textModel.getOffsetAt({ lineNumber, column: 1 });\n        const tokens = this._forceParseAndTokenizeContent(range, startOffset, startOffset + lineContent.length, lineContent, false);\n        if (!tokens) {\n            return undefined;\n        }\n        const tokensByLine = new Array(lines.length);\n        let tokensIndex = 0;\n        let tokenStartOffset = 0;\n        let lineStartOffset = 0;\n        for (let i = 0; i < lines.length; i++) {\n            const tokensForLine = [];\n            let moveToNextLine = false;\n            for (let j = tokensIndex; (!moveToNextLine && (j < tokens.length)); j++) {\n                const token = tokens[j];\n                const lineAdjustedEndOffset = token.endOffset - lineStartOffset;\n                const lineAdjustedStartOffset = tokenStartOffset - lineStartOffset;\n                if (lineAdjustedEndOffset <= lines[i].length) {\n                    tokensForLine.push({ endOffset: lineAdjustedEndOffset, metadata: token.metadata });\n                    tokensIndex++;\n                }\n                else if (lineAdjustedStartOffset < lines[i].length) {\n                    const partialToken = { endOffset: lines[i].length, metadata: token.metadata };\n                    tokensForLine.push(partialToken);\n                    moveToNextLine = true;\n                }\n                else {\n                    moveToNextLine = true;\n                }\n                tokenStartOffset = token.endOffset;\n            }\n            tokensByLine[i] = this._endOffsetTokensToUint32Array(tokensForLine);\n            lineStartOffset += lines[i].length + this._textModel.getEOL().length;\n        }\n        return tokensByLine;\n    }\n    _forceParseAndTokenizeContent(range, startOffsetOfRangeInDocument, endOffsetOfRangeInDocument, content, asUpdate) {\n        const likelyRelevantLines = findLikelyRelevantLines(this._textModel, range.startLineNumber).likelyRelevantLines;\n        const likelyRelevantPrefix = likelyRelevantLines.join(this._textModel.getEOL());\n        const tree = this._tree.createParsedTreeSync(`${likelyRelevantPrefix}${content}`);\n        if (!tree) {\n            return;\n        }\n        const treeRange = new Range(1, 1, range.endLineNumber - range.startLineNumber + 1 + likelyRelevantLines.length, range.endColumn);\n        const captures = this.captureAtRange(treeRange);\n        const tokens = this._tokenizeCapturesWithMetadata(captures, likelyRelevantPrefix.length, endOffsetOfRangeInDocument - startOffsetOfRangeInDocument + likelyRelevantPrefix.length);\n        tree.delete();\n        if (!tokens) {\n            return;\n        }\n        if (asUpdate) {\n            return this._rangeTokensAsUpdates(startOffsetOfRangeInDocument, tokens.endOffsetsAndMetadata, likelyRelevantPrefix.length);\n        }\n        else {\n            return tokens.endOffsetsAndMetadata;\n        }\n    }\n    _firstTreeUpdate(versionId) {\n        return this._setViewPortTokens(versionId);\n    }\n    _setViewPortTokens(versionId) {\n        const rangeChanges = this._visibleLineRanges.get().map(lineRange => {\n            const range = lineRange.toInclusiveRange();\n            if (!range) {\n                return undefined;\n            }\n            const newRangeStartOffset = this._textModel.getOffsetAt(range.getStartPosition());\n            const newRangeEndOffset = this._textModel.getOffsetAt(range.getEndPosition());\n            return {\n                newRange: range,\n                newRangeEndOffset,\n                newRangeStartOffset,\n            };\n        }).filter(isDefined);\n        return this._handleTreeUpdate(rangeChanges, versionId);\n    }\n    /**\n     * Do not await in this method, it will cause a race\n     */\n    _handleTreeUpdate(ranges, versionId) {\n        const rangeChanges = [];\n        const chunkSize = 1000;\n        for (let i = 0; i < ranges.length; i++) {\n            const rangeLinesLength = ranges[i].newRange.endLineNumber - ranges[i].newRange.startLineNumber;\n            if (rangeLinesLength > chunkSize) {\n                // Split the range into chunks to avoid long operations\n                const fullRangeEndLineNumber = ranges[i].newRange.endLineNumber;\n                let chunkLineStart = ranges[i].newRange.startLineNumber;\n                let chunkColumnStart = ranges[i].newRange.startColumn;\n                let chunkLineEnd = chunkLineStart + chunkSize;\n                do {\n                    const chunkStartingPosition = new Position(chunkLineStart, chunkColumnStart);\n                    const chunkEndColumn = ((chunkLineEnd === ranges[i].newRange.endLineNumber) ? ranges[i].newRange.endColumn : this._textModel.getLineMaxColumn(chunkLineEnd));\n                    const chunkEndPosition = new Position(chunkLineEnd, chunkEndColumn);\n                    const chunkRange = Range.fromPositions(chunkStartingPosition, chunkEndPosition);\n                    rangeChanges.push({\n                        range: chunkRange,\n                        startOffset: this._textModel.getOffsetAt(chunkRange.getStartPosition()),\n                        endOffset: this._textModel.getOffsetAt(chunkRange.getEndPosition())\n                    });\n                    chunkLineStart = chunkLineEnd + 1;\n                    chunkColumnStart = 1;\n                    if (chunkLineEnd < fullRangeEndLineNumber && chunkLineEnd + chunkSize > fullRangeEndLineNumber) {\n                        chunkLineEnd = fullRangeEndLineNumber;\n                    }\n                    else {\n                        chunkLineEnd = chunkLineEnd + chunkSize;\n                    }\n                } while (chunkLineEnd <= fullRangeEndLineNumber);\n            }\n            else {\n                // Check that the previous range doesn't overlap\n                if ((i === 0) || (rangeChanges[i - 1].endOffset < ranges[i].newRangeStartOffset)) {\n                    rangeChanges.push({\n                        range: ranges[i].newRange,\n                        startOffset: ranges[i].newRangeStartOffset,\n                        endOffset: ranges[i].newRangeEndOffset\n                    });\n                }\n                else if (rangeChanges[i - 1].endOffset < ranges[i].newRangeEndOffset) {\n                    // clip the range to the previous range\n                    const startPosition = this._textModel.getPositionAt(rangeChanges[i - 1].endOffset + 1);\n                    const range = new Range(startPosition.lineNumber, startPosition.column, ranges[i].newRange.endLineNumber, ranges[i].newRange.endColumn);\n                    rangeChanges.push({\n                        range,\n                        startOffset: rangeChanges[i - 1].endOffset + 1,\n                        endOffset: ranges[i].newRangeEndOffset\n                    });\n                }\n            }\n        }\n        // Get the captures immediately while the text model is correct\n        const captures = rangeChanges.map(range => this._getCaptures(range.range));\n        // Don't block\n        return this._updateTreeForRanges(rangeChanges, versionId, captures).then(() => {\n            if (!this._textModel.isDisposed() && (this._tree.treeLastParsedVersion.get() === this._textModel.getVersionId())) {\n                this._refreshNeedsRefresh(versionId);\n            }\n        });\n    }\n    async _updateTreeForRanges(rangeChanges, versionId, captures) {\n        let tokenUpdate;\n        for (let i = 0; i < rangeChanges.length; i++) {\n            if (!this._textModel.isDisposed() && versionId !== this._textModel.getVersionId()) {\n                // Our captures have become invalid and we need to re-capture\n                break;\n            }\n            const capture = captures[i];\n            const range = rangeChanges[i];\n            const updates = this.getTokensInRange(range.range, range.startOffset, range.endOffset, capture);\n            if (updates) {\n                tokenUpdate = { newTokens: updates };\n            }\n            else {\n                tokenUpdate = { newTokens: [] };\n            }\n            this._updateTokensInStore(versionId, [tokenUpdate], TokenQuality.Accurate);\n            this._onDidChangeTokens.fire({\n                changes: {\n                    semanticTokensApplied: false,\n                    ranges: [{ fromLineNumber: range.range.getStartPosition().lineNumber, toLineNumber: range.range.getEndPosition().lineNumber }]\n                }\n            });\n            await new Promise(resolve => setTimeout0(resolve));\n        }\n        this._onDidCompleteBackgroundTokenization.fire();\n    }\n    _refreshNeedsRefresh(versionId) {\n        const rangesToRefresh = this._getNeedsRefresh();\n        if (rangesToRefresh.length === 0) {\n            return;\n        }\n        const rangeChanges = new Array(rangesToRefresh.length);\n        for (let i = 0; i < rangesToRefresh.length; i++) {\n            const range = rangesToRefresh[i];\n            rangeChanges[i] = {\n                newRange: range.range,\n                newRangeStartOffset: range.startOffset,\n                newRangeEndOffset: range.endOffset\n            };\n        }\n        this._handleTreeUpdate(rangeChanges, versionId);\n    }\n    _rangeTokensAsUpdates(rangeOffset, endOffsetToken, startingOffsetInArray) {\n        const updates = [];\n        let lastEnd = 0;\n        for (const token of endOffsetToken) {\n            if (token.endOffset <= lastEnd || (startingOffsetInArray && (token.endOffset < startingOffsetInArray))) {\n                continue;\n            }\n            let tokenUpdate;\n            if (startingOffsetInArray && (lastEnd < startingOffsetInArray)) {\n                tokenUpdate = { startOffsetInclusive: rangeOffset + startingOffsetInArray, length: token.endOffset - startingOffsetInArray, token: token.metadata };\n            }\n            else {\n                tokenUpdate = { startOffsetInclusive: rangeOffset + lastEnd, length: token.endOffset - lastEnd, token: token.metadata };\n            }\n            updates.push(tokenUpdate);\n            lastEnd = token.endOffset;\n        }\n        return updates;\n    }\n    _updateTheme() {\n        const modelRange = this._textModel.getFullModelRange();\n        this._markForRefresh(modelRange);\n        this._parseAndTokenizeViewPort(this._visibleLineRanges.get());\n    }\n    captureAtRange(range) {\n        const tree = this._tree.tree.get();\n        if (!tree) {\n            return [];\n        }\n        // Tree sitter row is 0 based, column is 0 based\n        return this._highlightingQueries.captures(tree.rootNode, { startPosition: { row: range.startLineNumber - 1, column: range.startColumn - 1 }, endPosition: { row: range.endLineNumber - 1, column: range.endColumn - 1 } }).map(capture => ({\n            name: capture.name,\n            text: capture.node.text,\n            node: {\n                startIndex: capture.node.startIndex,\n                endIndex: capture.node.endIndex,\n                startPosition: {\n                    lineNumber: capture.node.startPosition.row + 1,\n                    column: capture.node.startPosition.column + 1\n                },\n                endPosition: {\n                    lineNumber: capture.node.endPosition.row + 1,\n                    column: capture.node.endPosition.column + 1\n                }\n            },\n            encodedLanguageId: this._encodedLanguageId\n        }));\n    }\n    captureAtRangeWithInjections(range) {\n        const captures = this.captureAtRange(range);\n        for (let i = 0; i < captures.length; i++) {\n            const capture = captures[i];\n            const capStartLine = capture.node.startPosition.lineNumber;\n            const capEndLine = capture.node.endPosition.lineNumber;\n            const capStartColumn = capture.node.startPosition.column;\n            const capEndColumn = capture.node.endPosition.column;\n            const startLine = ((capStartLine > range.startLineNumber) && (capStartLine < range.endLineNumber)) ? capStartLine : range.startLineNumber;\n            const endLine = ((capEndLine > range.startLineNumber) && (capEndLine < range.endLineNumber)) ? capEndLine : range.endLineNumber;\n            const startColumn = (capStartLine === range.startLineNumber) ? (capStartColumn < range.startColumn ? range.startColumn : capStartColumn) : (capStartLine < range.startLineNumber ? range.startColumn : capStartColumn);\n            const endColumn = (capEndLine === range.endLineNumber) ? (capEndColumn > range.endColumn ? range.endColumn : capEndColumn) : (capEndLine > range.endLineNumber ? range.endColumn : capEndColumn);\n            const injectionRange = new Range(startLine, startColumn, endLine, endColumn);\n            const injection = this._getInjectionCaptures(capture, injectionRange);\n            if (injection && injection.length > 0) {\n                captures.splice(i + 1, 0, ...injection);\n                i += injection.length;\n            }\n        }\n        return captures;\n    }\n    /**\n     * Gets the tokens for a given line.\n     * Each token takes 2 elements in the array. The first element is the offset of the end of the token *in the line, not in the document*, and the second element is the metadata.\n     *\n     * @param lineNumber\n     * @returns\n     */\n    tokenizeEncoded(lineNumber) {\n        const tokens = this._tokenizeEncoded(lineNumber);\n        if (!tokens) {\n            return undefined;\n        }\n        const updates = this._rangeTokensAsUpdates(this._textModel.getOffsetAt({ lineNumber, column: 1 }), tokens.result);\n        if (tokens.versionId === this._textModel.getVersionId()) {\n            this._updateTokensInStore(tokens.versionId, [{ newTokens: updates, oldRangeLength: this._textModel.getLineLength(lineNumber) }], TokenQuality.Accurate);\n        }\n    }\n    _getCaptures(range) {\n        const captures = this.captureAtRangeWithInjections(range);\n        return captures;\n    }\n    _tokenize(range, rangeStartOffset, rangeEndOffset) {\n        const captures = this._getCaptures(range);\n        const result = this._tokenizeCapturesWithMetadata(captures, rangeStartOffset, rangeEndOffset);\n        if (!result) {\n            return undefined;\n        }\n        return { ...result, versionId: this._tree.treeLastParsedVersion.get() };\n    }\n    _createTokensFromCaptures(captures, rangeStartOffset, rangeEndOffset) {\n        const tree = this._tree.tree.get();\n        const stopwatch = StopWatch.create();\n        const rangeLength = rangeEndOffset - rangeStartOffset;\n        const encodedLanguageId = this._languageIdCodec.encodeLanguageId(this._tree.languageId);\n        const baseScope = TREESITTER_BASE_SCOPES[this._tree.languageId] || 'source';\n        if (captures.length === 0) {\n            if (tree) {\n                stopwatch.stop();\n                const endOffsetsAndMetadata = [{ endOffset: rangeLength, scopes: [], encodedLanguageId }];\n                return { endOffsets: endOffsetsAndMetadata, captureTime: stopwatch.elapsed() };\n            }\n            return undefined;\n        }\n        const endOffsetsAndScopes = Array(captures.length);\n        endOffsetsAndScopes.fill({ endOffset: 0, scopes: [baseScope], encodedLanguageId });\n        let tokenIndex = 0;\n        const increaseSizeOfTokensByOneToken = () => {\n            endOffsetsAndScopes.push({ endOffset: 0, scopes: [baseScope], encodedLanguageId });\n        };\n        const brackets = (capture, startOffset) => {\n            return (capture.name.includes('punctuation') && capture.text) ? Array.from(capture.text.matchAll(BRACKETS)).map(match => startOffset + match.index) : undefined;\n        };\n        const addCurrentTokenToArray = (capture, startOffset, endOffset, position) => {\n            if (position !== undefined) {\n                const oldScopes = endOffsetsAndScopes[position].scopes;\n                let oldBracket = endOffsetsAndScopes[position].bracket;\n                // Check that the previous token ends at the same point that the current token starts\n                const prevEndOffset = position > 0 ? endOffsetsAndScopes[position - 1].endOffset : 0;\n                if (prevEndOffset !== startOffset) {\n                    let preInsertBracket = undefined;\n                    if (oldBracket && oldBracket.length > 0) {\n                        preInsertBracket = [];\n                        const postInsertBracket = [];\n                        for (let i = 0; i < oldBracket.length; i++) {\n                            const bracket = oldBracket[i];\n                            if (bracket < startOffset) {\n                                preInsertBracket.push(bracket);\n                            }\n                            else if (bracket > endOffset) {\n                                postInsertBracket.push(bracket);\n                            }\n                        }\n                        if (preInsertBracket.length === 0) {\n                            preInsertBracket = undefined;\n                        }\n                        if (postInsertBracket.length === 0) {\n                            oldBracket = undefined;\n                        }\n                        else {\n                            oldBracket = postInsertBracket;\n                        }\n                    }\n                    // We need to add some of the position token to cover the space\n                    endOffsetsAndScopes.splice(position, 0, { endOffset: startOffset, scopes: [...oldScopes], bracket: preInsertBracket, encodedLanguageId: capture.encodedLanguageId });\n                    position++;\n                    increaseSizeOfTokensByOneToken();\n                    tokenIndex++;\n                }\n                endOffsetsAndScopes.splice(position, 0, { endOffset: endOffset, scopes: [...oldScopes, capture.name], bracket: brackets(capture, startOffset), encodedLanguageId: capture.encodedLanguageId });\n                endOffsetsAndScopes[tokenIndex].bracket = oldBracket;\n            }\n            else {\n                endOffsetsAndScopes[tokenIndex] = { endOffset: endOffset, scopes: [baseScope, capture.name], bracket: brackets(capture, startOffset), encodedLanguageId: capture.encodedLanguageId };\n            }\n            tokenIndex++;\n        };\n        for (let captureIndex = 0; captureIndex < captures.length; captureIndex++) {\n            const capture = captures[captureIndex];\n            const tokenEndIndex = capture.node.endIndex < rangeEndOffset ? ((capture.node.endIndex < rangeStartOffset) ? rangeStartOffset : capture.node.endIndex) : rangeEndOffset;\n            const tokenStartIndex = capture.node.startIndex < rangeStartOffset ? rangeStartOffset : capture.node.startIndex;\n            const endOffset = tokenEndIndex - rangeStartOffset;\n            // Not every character will get captured, so we need to make sure that our current capture doesn't bleed toward the start of the line and cover characters that it doesn't apply to.\n            // We do this by creating a new token in the array if the previous token ends before the current token starts.\n            let previousEndOffset;\n            const currentTokenLength = tokenEndIndex - tokenStartIndex;\n            if (captureIndex > 0) {\n                previousEndOffset = endOffsetsAndScopes[(tokenIndex - 1)].endOffset;\n            }\n            else {\n                previousEndOffset = tokenStartIndex - rangeStartOffset - 1;\n            }\n            const startOffset = endOffset - currentTokenLength;\n            if ((previousEndOffset >= 0) && (previousEndOffset < startOffset)) {\n                // Add en empty token to cover the space where there were no captures\n                endOffsetsAndScopes[tokenIndex] = { endOffset: startOffset, scopes: [baseScope], encodedLanguageId: this._encodedLanguageId };\n                tokenIndex++;\n                increaseSizeOfTokensByOneToken();\n            }\n            if (currentTokenLength < 0) {\n                // This happens when we have a token \"gap\" right at the end of the capture range. The last capture isn't used because it's start index isn't included in the range.\n                continue;\n            }\n            if (previousEndOffset >= endOffset) {\n                // walk back through the tokens until we find the one that contains the current token\n                let withinTokenIndex = tokenIndex - 1;\n                let previousTokenEndOffset = endOffsetsAndScopes[withinTokenIndex].endOffset;\n                let previousTokenStartOffset = ((withinTokenIndex >= 2) ? endOffsetsAndScopes[withinTokenIndex - 1].endOffset : 0);\n                do {\n                    // Check that the current token doesn't just replace the last token\n                    if ((previousTokenStartOffset + currentTokenLength) === previousTokenEndOffset) {\n                        if (previousTokenStartOffset === startOffset) {\n                            // Current token and previous token span the exact same characters, add the scopes to the previous token\n                            endOffsetsAndScopes[withinTokenIndex].scopes.push(capture.name);\n                            const oldBracket = endOffsetsAndScopes[withinTokenIndex].bracket;\n                            endOffsetsAndScopes[withinTokenIndex].bracket = ((oldBracket && (oldBracket.length > 0)) ? oldBracket : brackets(capture, startOffset));\n                        }\n                    }\n                    else if (previousTokenStartOffset <= startOffset) {\n                        addCurrentTokenToArray(capture, startOffset, endOffset, withinTokenIndex);\n                        break;\n                    }\n                    withinTokenIndex--;\n                    previousTokenStartOffset = ((withinTokenIndex >= 1) ? endOffsetsAndScopes[withinTokenIndex - 1].endOffset : 0);\n                    previousTokenEndOffset = ((withinTokenIndex >= 0) ? endOffsetsAndScopes[withinTokenIndex].endOffset : 0);\n                } while (previousTokenEndOffset > startOffset);\n            }\n            else {\n                // Just add the token to the array\n                addCurrentTokenToArray(capture, startOffset, endOffset);\n            }\n        }\n        // Account for uncaptured characters at the end of the line\n        if ((endOffsetsAndScopes[tokenIndex - 1].endOffset < rangeLength)) {\n            if (rangeLength - endOffsetsAndScopes[tokenIndex - 1].endOffset > 0) {\n                increaseSizeOfTokensByOneToken();\n                endOffsetsAndScopes[tokenIndex] = { endOffset: rangeLength, scopes: endOffsetsAndScopes[tokenIndex].scopes, encodedLanguageId: this._encodedLanguageId };\n                tokenIndex++;\n            }\n        }\n        for (let i = 0; i < endOffsetsAndScopes.length; i++) {\n            const token = endOffsetsAndScopes[i];\n            if (token.endOffset === 0 && i !== 0) {\n                endOffsetsAndScopes.splice(i, endOffsetsAndScopes.length - i);\n                break;\n            }\n        }\n        const captureTime = stopwatch.elapsed();\n        return { endOffsets: endOffsetsAndScopes, captureTime };\n    }\n    _getInjectionCaptures(parentCapture, range) {\n        /*\n                const injection = textModelTreeSitter.getInjection(parentCapture.node.startIndex, this._treeSitterModel.languageId);\n                if (!injection?.tree || injection.versionId !== textModelTreeSitter.parseResult?.versionId) {\n                    return undefined;\n                }\n\n                const feature = TreeSitterTokenizationRegistry.get(injection.languageId);\n                if (!feature) {\n                    return undefined;\n                }\n                return feature.tokSupport_captureAtRangeTree(range, injection.tree, textModelTreeSitter);*/\n        return [];\n    }\n    _tokenizeCapturesWithMetadata(captures, rangeStartOffset, rangeEndOffset) {\n        const stopwatch = StopWatch.create();\n        const emptyTokens = this._createTokensFromCaptures(captures, rangeStartOffset, rangeEndOffset);\n        if (!emptyTokens) {\n            return undefined;\n        }\n        const endOffsetsAndScopes = emptyTokens.endOffsets;\n        for (let i = 0; i < endOffsetsAndScopes.length; i++) {\n            const token = endOffsetsAndScopes[i];\n            token.metadata = this._treeSitterThemeService.findMetadata(token.scopes, token.encodedLanguageId, !!token.bracket && (token.bracket.length > 0), undefined);\n        }\n        const metadataTime = stopwatch.elapsed();\n        return { endOffsetsAndMetadata: endOffsetsAndScopes, captureTime: emptyTokens.captureTime, metadataTime };\n    }\n    _tokenizeEncoded(lineNumber) {\n        const lineOffset = this._textModel.getOffsetAt({ lineNumber: lineNumber, column: 1 });\n        const maxLine = this._textModel.getLineCount();\n        const lineEndOffset = (lineNumber + 1 <= maxLine) ? this._textModel.getOffsetAt({ lineNumber: lineNumber + 1, column: 1 }) : this._textModel.getValueLength();\n        const lineLength = lineEndOffset - lineOffset;\n        const result = this._tokenize(new Range(lineNumber, 1, lineNumber, lineLength + 1), lineOffset, lineEndOffset);\n        if (!result) {\n            return undefined;\n        }\n        return { result: result.endOffsetsAndMetadata, captureTime: result.captureTime, metadataTime: result.metadataTime, versionId: result.versionId };\n    }\n    _endOffsetTokensToUint32Array(endOffsetsAndMetadata) {\n        const uint32Array = new Uint32Array(endOffsetsAndMetadata.length * 2);\n        for (let i = 0; i < endOffsetsAndMetadata.length; i++) {\n            uint32Array[i * 2] = endOffsetsAndMetadata[i].endOffset;\n            uint32Array[i * 2 + 1] = endOffsetsAndMetadata[i].metadata;\n        }\n        return uint32Array;\n    }\n};\nTreeSitterTokenizationImpl = __decorate([\n    __param(4, ITreeSitterThemeService)\n], TreeSitterTokenizationImpl);\nconst TREESITTER_BASE_SCOPES = {\n    'css': 'source.css',\n    'typescript': 'source.ts',\n    'ini': 'source.ini',\n    'regex': 'source.regex',\n};\nconst BRACKETS = /[\\{\\}\\[\\]\\<\\>\\(\\)]/g;\n\nexport { TREESITTER_BASE_SCOPES, TreeSitterTokenizationImpl };\n","import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst ITreeSitterLibraryService = createDecorator('treeSitterLibraryService');\n\nexport { ITreeSitterLibraryService };\n","import { transaction } from '../transaction.js';\nimport { observableValue } from '../observables/observableValue.js';\n\n/**\n * A promise whose state is observable.\n */\nclass ObservablePromise {\n    constructor(promise) {\n        this._value = observableValue(this, undefined);\n        /**\n         * The current state of the promise.\n         * Is `undefined` if the promise didn't resolve yet.\n         */\n        this.promiseResult = this._value;\n        this.promise = promise.then(value => {\n            transaction(tx => {\n                /** @description onPromiseResolved */\n                this._value.set(new PromiseResult(value, undefined), tx);\n            });\n            return value;\n        }, error => {\n            transaction(tx => {\n                /** @description onPromiseRejected */\n                this._value.set(new PromiseResult(undefined, error), tx);\n            });\n            throw error;\n        });\n    }\n}\nclass PromiseResult {\n    constructor(\n    /**\n     * The value of the resolved promise.\n     * Undefined if the promise rejected.\n     */\n    data, \n    /**\n     * The error in case of a rejected promise.\n     * Undefined if the promise resolved.\n     */\n    error) {\n        this.data = data;\n        this.error = error;\n    }\n    /**\n     * Returns the value if the promise resolved, otherwise throws the error.\n     */\n    getDataOrThrow() {\n        if (this.error) {\n            throw this.error;\n        }\n        return this.data;\n    }\n}\n\nexport { ObservablePromise, PromiseResult };\n","import { Emitter } from '../../../../../base/common/event.js';\nimport { toDisposable } from '../../../../../base/common/lifecycle.js';\nimport { LineTokens } from '../../../tokens/lineTokens.js';\nimport { AbstractSyntaxTokenBackend } from '../abstractSyntaxTokenBackend.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { TreeSitterTree } from './treeSitterTree.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { TreeSitterTokenizationImpl } from './treeSitterTokenizationImpl.js';\nimport { ITreeSitterLibraryService } from '../../../services/treeSitter/treeSitterLibraryService.js';\nimport { ObservablePromise } from '../../../../../base/common/observableInternal/utils/promise.js';\nimport { derived } from '../../../../../base/common/observableInternal/observables/derived.js';\nimport { autorun } from '../../../../../base/common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet TreeSitterSyntaxTokenBackend = class TreeSitterSyntaxTokenBackend extends AbstractSyntaxTokenBackend {\n    constructor(_languageIdObs, languageIdCodec, textModel, visibleLineRanges, _treeSitterLibraryService, _instantiationService) {\n        super(languageIdCodec, textModel);\n        this._languageIdObs = _languageIdObs;\n        this._treeSitterLibraryService = _treeSitterLibraryService;\n        this._instantiationService = _instantiationService;\n        this._backgroundTokenizationState = 1 /* BackgroundTokenizationState.InProgress */;\n        this._onDidChangeBackgroundTokenizationState = this._register(new Emitter());\n        this.onDidChangeBackgroundTokenizationState = this._onDidChangeBackgroundTokenizationState.event;\n        const parserClassPromise = new ObservablePromise(this._treeSitterLibraryService.getParserClass());\n        const parserClassObs = derived(this, reader => {\n            const parser = parserClassPromise.promiseResult?.read(reader)?.getDataOrThrow();\n            return parser;\n        });\n        this._tree = derived(this, reader => {\n            const parserClass = parserClassObs.read(reader);\n            if (!parserClass) {\n                return undefined;\n            }\n            const currentLanguage = this._languageIdObs.read(reader);\n            const treeSitterLang = this._treeSitterLibraryService.getLanguage(currentLanguage, false, reader);\n            if (!treeSitterLang) {\n                return undefined;\n            }\n            const parser = new parserClass();\n            reader.store.add(toDisposable(() => {\n                parser.delete();\n            }));\n            parser.setLanguage(treeSitterLang);\n            const queries = this._treeSitterLibraryService.getInjectionQueries(currentLanguage, reader);\n            if (queries === undefined) {\n                return undefined;\n            }\n            return reader.store.add(this._instantiationService.createInstance(TreeSitterTree, currentLanguage, undefined, parser, parserClass, /*queries, */ this._textModel));\n        });\n        this._tokenizationImpl = derived(this, reader => {\n            const treeModel = this._tree.read(reader);\n            if (!treeModel) {\n                return undefined;\n            }\n            const queries = this._treeSitterLibraryService.getHighlightingQueries(treeModel.languageId, reader);\n            if (!queries) {\n                return undefined;\n            }\n            return reader.store.add(this._instantiationService.createInstance(TreeSitterTokenizationImpl, treeModel, queries, this._languageIdCodec, visibleLineRanges));\n        });\n        this._register(autorun(reader => {\n            const tokModel = this._tokenizationImpl.read(reader);\n            if (!tokModel) {\n                return;\n            }\n            reader.store.add(tokModel.onDidChangeTokens((e) => {\n                this._onDidChangeTokens.fire(e.changes);\n            }));\n            reader.store.add(tokModel.onDidChangeBackgroundTokenization(e => {\n                this._backgroundTokenizationState = 2 /* BackgroundTokenizationState.Completed */;\n                this._onDidChangeBackgroundTokenizationState.fire();\n            }));\n        }));\n    }\n    getLineTokens(lineNumber) {\n        const model = this._tokenizationImpl.get();\n        if (!model) {\n            const content = this._textModel.getLineContent(lineNumber);\n            return LineTokens.createEmpty(content, this._languageIdCodec);\n        }\n        return model.getLineTokens(lineNumber);\n    }\n    todo_resetTokenization(fireTokenChangeEvent = true) {\n        if (fireTokenChangeEvent) {\n            this._onDidChangeTokens.fire({\n                semanticTokensApplied: false,\n                ranges: [\n                    {\n                        fromLineNumber: 1,\n                        toLineNumber: this._textModel.getLineCount(),\n                    },\n                ],\n            });\n        }\n    }\n    handleDidChangeAttached() {\n        // TODO @alexr00 implement for background tokenization\n    }\n    handleDidChangeContent(e) {\n        if (e.isFlush) {\n            // Don't fire the event, as the view might not have got the text change event yet\n            this.todo_resetTokenization(false);\n        }\n        else {\n            const model = this._tokenizationImpl.get();\n            model?.handleContentChanged(e);\n        }\n        const treeModel = this._tree.get();\n        treeModel?.handleContentChange(e);\n    }\n    forceTokenization(lineNumber) {\n        const model = this._tokenizationImpl.get();\n        if (!model) {\n            return;\n        }\n        if (!model.hasAccurateTokensForLine(lineNumber)) {\n            model.tokenizeEncoded(lineNumber);\n        }\n    }\n    hasAccurateTokensForLine(lineNumber) {\n        const model = this._tokenizationImpl.get();\n        if (!model) {\n            return false;\n        }\n        return model.hasAccurateTokensForLine(lineNumber);\n    }\n    isCheapToTokenize(lineNumber) {\n        // TODO @alexr00 determine what makes it cheap to tokenize?\n        return true;\n    }\n    getTokenTypeIfInsertingCharacter(lineNumber, column, character) {\n        // TODO @alexr00 implement once we have custom parsing and don't just feed in the whole text model value\n        return 0 /* StandardTokenType.Other */;\n    }\n    tokenizeLinesAt(lineNumber, lines) {\n        const model = this._tokenizationImpl.get();\n        if (!model) {\n            return null;\n        }\n        return model.tokenizeLinesAt(lineNumber, lines);\n    }\n    get hasTokens() {\n        const model = this._tokenizationImpl.get();\n        if (!model) {\n            return false;\n        }\n        return model.hasTokens();\n    }\n};\nTreeSitterSyntaxTokenBackend = __decorate([\n    __param(4, ITreeSitterLibraryService),\n    __param(5, IInstantiationService)\n], TreeSitterSyntaxTokenBackend);\n\nexport { TreeSitterSyntaxTokenBackend };\n","import { arrayInsert } from '../../../base/common/arrays.js';\nimport { LineTokens } from './lineTokens.js';\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/**\n * Represents sparse tokens in a text model.\n */\nclass SparseTokensStore {\n    constructor(languageIdCodec) {\n        this._pieces = [];\n        this._isComplete = false;\n        this._languageIdCodec = languageIdCodec;\n    }\n    flush() {\n        this._pieces = [];\n        this._isComplete = false;\n    }\n    isEmpty() {\n        return (this._pieces.length === 0);\n    }\n    set(pieces, isComplete, textModel = undefined) {\n        this._pieces = pieces || [];\n        this._isComplete = isComplete;\n        if (textModel) {\n            for (const p of this._pieces) {\n                p.reportIfInvalid(textModel);\n            }\n        }\n    }\n    setPartial(_range, pieces) {\n        // console.log(`setPartial ${_range} ${pieces.map(p => p.toString()).join(', ')}`);\n        let range = _range;\n        if (pieces.length > 0) {\n            const _firstRange = pieces[0].getRange();\n            const _lastRange = pieces[pieces.length - 1].getRange();\n            if (!_firstRange || !_lastRange) {\n                return _range;\n            }\n            range = _range.plusRange(_firstRange).plusRange(_lastRange);\n        }\n        let insertPosition = null;\n        for (let i = 0, len = this._pieces.length; i < len; i++) {\n            const piece = this._pieces[i];\n            if (piece.endLineNumber < range.startLineNumber) {\n                // this piece is before the range\n                continue;\n            }\n            if (piece.startLineNumber > range.endLineNumber) {\n                // this piece is after the range, so mark the spot before this piece\n                // as a good insertion position and stop looping\n                insertPosition = insertPosition || { index: i };\n                break;\n            }\n            // this piece might intersect with the range\n            piece.removeTokens(range);\n            if (piece.isEmpty()) {\n                // remove the piece if it became empty\n                this._pieces.splice(i, 1);\n                i--;\n                len--;\n                continue;\n            }\n            if (piece.endLineNumber < range.startLineNumber) {\n                // after removal, this piece is before the range\n                continue;\n            }\n            if (piece.startLineNumber > range.endLineNumber) {\n                // after removal, this piece is after the range\n                insertPosition = insertPosition || { index: i };\n                continue;\n            }\n            // after removal, this piece contains the range\n            const [a, b] = piece.split(range);\n            if (a.isEmpty()) {\n                // this piece is actually after the range\n                insertPosition = insertPosition || { index: i };\n                continue;\n            }\n            if (b.isEmpty()) {\n                // this piece is actually before the range\n                continue;\n            }\n            this._pieces.splice(i, 1, a, b);\n            i++;\n            len++;\n            insertPosition = insertPosition || { index: i };\n        }\n        insertPosition = insertPosition || { index: this._pieces.length };\n        if (pieces.length > 0) {\n            this._pieces = arrayInsert(this._pieces, insertPosition.index, pieces);\n        }\n        // console.log(`I HAVE ${this._pieces.length} pieces`);\n        // console.log(`${this._pieces.map(p => p.toString()).join('\\n')}`);\n        return range;\n    }\n    isComplete() {\n        return this._isComplete;\n    }\n    addSparseTokens(lineNumber, aTokens) {\n        if (aTokens.getTextLength() === 0) {\n            // Don't do anything for empty lines\n            return aTokens;\n        }\n        const pieces = this._pieces;\n        if (pieces.length === 0) {\n            return aTokens;\n        }\n        const pieceIndex = SparseTokensStore._findFirstPieceWithLine(pieces, lineNumber);\n        const bTokens = pieces[pieceIndex].getLineTokens(lineNumber);\n        if (!bTokens) {\n            return aTokens;\n        }\n        const aLen = aTokens.getCount();\n        const bLen = bTokens.getCount();\n        let aIndex = 0;\n        const result = [];\n        let resultLen = 0;\n        let lastEndOffset = 0;\n        const emitToken = (endOffset, metadata) => {\n            if (endOffset === lastEndOffset) {\n                return;\n            }\n            lastEndOffset = endOffset;\n            result[resultLen++] = endOffset;\n            result[resultLen++] = metadata;\n        };\n        for (let bIndex = 0; bIndex < bLen; bIndex++) {\n            // bTokens is not validated yet, but aTokens is. We want to make sure that the LineTokens we return\n            // are valid, so we clamp the ranges to ensure that.\n            const bStartCharacter = Math.min(bTokens.getStartCharacter(bIndex), aTokens.getTextLength());\n            const bEndCharacter = Math.min(bTokens.getEndCharacter(bIndex), aTokens.getTextLength());\n            const bMetadata = bTokens.getMetadata(bIndex);\n            const bMask = (((bMetadata & 1 /* MetadataConsts.SEMANTIC_USE_ITALIC */) ? 2048 /* MetadataConsts.ITALIC_MASK */ : 0)\n                | ((bMetadata & 2 /* MetadataConsts.SEMANTIC_USE_BOLD */) ? 4096 /* MetadataConsts.BOLD_MASK */ : 0)\n                | ((bMetadata & 4 /* MetadataConsts.SEMANTIC_USE_UNDERLINE */) ? 8192 /* MetadataConsts.UNDERLINE_MASK */ : 0)\n                | ((bMetadata & 8 /* MetadataConsts.SEMANTIC_USE_STRIKETHROUGH */) ? 16384 /* MetadataConsts.STRIKETHROUGH_MASK */ : 0)\n                | ((bMetadata & 16 /* MetadataConsts.SEMANTIC_USE_FOREGROUND */) ? 16744448 /* MetadataConsts.FOREGROUND_MASK */ : 0)\n                | ((bMetadata & 32 /* MetadataConsts.SEMANTIC_USE_BACKGROUND */) ? 4278190080 /* MetadataConsts.BACKGROUND_MASK */ : 0)) >>> 0;\n            const aMask = (~bMask) >>> 0;\n            // push any token from `a` that is before `b`\n            while (aIndex < aLen && aTokens.getEndOffset(aIndex) <= bStartCharacter) {\n                emitToken(aTokens.getEndOffset(aIndex), aTokens.getMetadata(aIndex));\n                aIndex++;\n            }\n            // push the token from `a` if it intersects the token from `b`\n            if (aIndex < aLen && aTokens.getStartOffset(aIndex) < bStartCharacter) {\n                emitToken(bStartCharacter, aTokens.getMetadata(aIndex));\n            }\n            // skip any tokens from `a` that are contained inside `b`\n            while (aIndex < aLen && aTokens.getEndOffset(aIndex) < bEndCharacter) {\n                emitToken(aTokens.getEndOffset(aIndex), (aTokens.getMetadata(aIndex) & aMask) | (bMetadata & bMask));\n                aIndex++;\n            }\n            if (aIndex < aLen) {\n                emitToken(bEndCharacter, (aTokens.getMetadata(aIndex) & aMask) | (bMetadata & bMask));\n                if (aTokens.getEndOffset(aIndex) === bEndCharacter) {\n                    // `a` ends exactly at the same spot as `b`!\n                    aIndex++;\n                }\n            }\n            else {\n                const aMergeIndex = Math.min(Math.max(0, aIndex - 1), aLen - 1);\n                // push the token from `b`\n                emitToken(bEndCharacter, (aTokens.getMetadata(aMergeIndex) & aMask) | (bMetadata & bMask));\n            }\n        }\n        // push the remaining tokens from `a`\n        while (aIndex < aLen) {\n            emitToken(aTokens.getEndOffset(aIndex), aTokens.getMetadata(aIndex));\n            aIndex++;\n        }\n        return new LineTokens(new Uint32Array(result), aTokens.getLineContent(), this._languageIdCodec);\n    }\n    static _findFirstPieceWithLine(pieces, lineNumber) {\n        let low = 0;\n        let high = pieces.length - 1;\n        while (low < high) {\n            let mid = low + Math.floor((high - low) / 2);\n            if (pieces[mid].endLineNumber < lineNumber) {\n                low = mid + 1;\n            }\n            else if (pieces[mid].startLineNumber > lineNumber) {\n                high = mid - 1;\n            }\n            else {\n                while (mid > low && pieces[mid - 1].startLineNumber <= lineNumber && lineNumber <= pieces[mid - 1].endLineNumber) {\n                    mid--;\n                }\n                return mid;\n            }\n        }\n        return low;\n    }\n    acceptEdit(range, eolCount, firstLineLength, lastLineLength, firstCharCode) {\n        for (let i = 0; i < this._pieces.length; i++) {\n            const piece = this._pieces[i];\n            piece.acceptEdit(range, eolCount, firstLineLength, lastLineLength, firstCharCode);\n            if (piece.isEmpty()) {\n                // Remove empty pieces\n                this._pieces.splice(i, 1);\n                i--;\n            }\n        }\n    }\n}\n\nexport { SparseTokensStore };\n","import { LineTokens } from './lineTokens.js';\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 *--------------------------------------------------------------------------------------------*/\nconst EMPTY_LINE_TOKENS = (new Uint32Array(0)).buffer;\nclass ContiguousTokensEditing {\n    static deleteBeginning(lineTokens, toChIndex) {\n        if (lineTokens === null || lineTokens === EMPTY_LINE_TOKENS) {\n            return lineTokens;\n        }\n        return ContiguousTokensEditing.delete(lineTokens, 0, toChIndex);\n    }\n    static deleteEnding(lineTokens, fromChIndex) {\n        if (lineTokens === null || lineTokens === EMPTY_LINE_TOKENS) {\n            return lineTokens;\n        }\n        const tokens = toUint32Array(lineTokens);\n        const lineTextLength = tokens[tokens.length - 2];\n        return ContiguousTokensEditing.delete(lineTokens, fromChIndex, lineTextLength);\n    }\n    static delete(lineTokens, fromChIndex, toChIndex) {\n        if (lineTokens === null || lineTokens === EMPTY_LINE_TOKENS || fromChIndex === toChIndex) {\n            return lineTokens;\n        }\n        const tokens = toUint32Array(lineTokens);\n        const tokensCount = (tokens.length >>> 1);\n        // special case: deleting everything\n        if (fromChIndex === 0 && tokens[tokens.length - 2] === toChIndex) {\n            return EMPTY_LINE_TOKENS;\n        }\n        const fromTokenIndex = LineTokens.findIndexInTokensArray(tokens, fromChIndex);\n        const fromTokenStartOffset = (fromTokenIndex > 0 ? tokens[(fromTokenIndex - 1) << 1] : 0);\n        const fromTokenEndOffset = tokens[fromTokenIndex << 1];\n        if (toChIndex < fromTokenEndOffset) {\n            // the delete range is inside a single token\n            const delta = (toChIndex - fromChIndex);\n            for (let i = fromTokenIndex; i < tokensCount; i++) {\n                tokens[i << 1] -= delta;\n            }\n            return lineTokens;\n        }\n        let dest;\n        let lastEnd;\n        if (fromTokenStartOffset !== fromChIndex) {\n            tokens[fromTokenIndex << 1] = fromChIndex;\n            dest = ((fromTokenIndex + 1) << 1);\n            lastEnd = fromChIndex;\n        }\n        else {\n            dest = (fromTokenIndex << 1);\n            lastEnd = fromTokenStartOffset;\n        }\n        const delta = (toChIndex - fromChIndex);\n        for (let tokenIndex = fromTokenIndex + 1; tokenIndex < tokensCount; tokenIndex++) {\n            const tokenEndOffset = tokens[tokenIndex << 1] - delta;\n            if (tokenEndOffset > lastEnd) {\n                tokens[dest++] = tokenEndOffset;\n                tokens[dest++] = tokens[(tokenIndex << 1) + 1];\n                lastEnd = tokenEndOffset;\n            }\n        }\n        if (dest === tokens.length) {\n            // nothing to trim\n            return lineTokens;\n        }\n        const tmp = new Uint32Array(dest);\n        tmp.set(tokens.subarray(0, dest), 0);\n        return tmp.buffer;\n    }\n    static append(lineTokens, _otherTokens) {\n        if (_otherTokens === EMPTY_LINE_TOKENS) {\n            return lineTokens;\n        }\n        if (lineTokens === EMPTY_LINE_TOKENS) {\n            return _otherTokens;\n        }\n        if (lineTokens === null) {\n            return lineTokens;\n        }\n        if (_otherTokens === null) {\n            // cannot determine combined line length...\n            return null;\n        }\n        const myTokens = toUint32Array(lineTokens);\n        const otherTokens = toUint32Array(_otherTokens);\n        const otherTokensCount = (otherTokens.length >>> 1);\n        const result = new Uint32Array(myTokens.length + otherTokens.length);\n        result.set(myTokens, 0);\n        let dest = myTokens.length;\n        const delta = myTokens[myTokens.length - 2];\n        for (let i = 0; i < otherTokensCount; i++) {\n            result[dest++] = otherTokens[(i << 1)] + delta;\n            result[dest++] = otherTokens[(i << 1) + 1];\n        }\n        return result.buffer;\n    }\n    static insert(lineTokens, chIndex, textLength) {\n        if (lineTokens === null || lineTokens === EMPTY_LINE_TOKENS) {\n            // nothing to do\n            return lineTokens;\n        }\n        const tokens = toUint32Array(lineTokens);\n        const tokensCount = (tokens.length >>> 1);\n        let fromTokenIndex = LineTokens.findIndexInTokensArray(tokens, chIndex);\n        if (fromTokenIndex > 0) {\n            const fromTokenStartOffset = tokens[(fromTokenIndex - 1) << 1];\n            if (fromTokenStartOffset === chIndex) {\n                fromTokenIndex--;\n            }\n        }\n        for (let tokenIndex = fromTokenIndex; tokenIndex < tokensCount; tokenIndex++) {\n            tokens[tokenIndex << 1] += textLength;\n        }\n        return lineTokens;\n    }\n}\nfunction toUint32Array(arr) {\n    if (arr instanceof Uint32Array) {\n        return arr;\n    }\n    else {\n        return new Uint32Array(arr);\n    }\n}\n\nexport { ContiguousTokensEditing, EMPTY_LINE_TOKENS, toUint32Array };\n","import { arrayInsert } from '../../../base/common/arrays.js';\nimport { Position } from '../core/position.js';\nimport { EMPTY_LINE_TOKENS, toUint32Array, ContiguousTokensEditing } from './contiguousTokensEditing.js';\nimport { LineTokens } from './lineTokens.js';\nimport { TokenMetadata } from '../encodedTokenAttributes.js';\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/**\n * Represents contiguous tokens in a text model.\n */\nclass ContiguousTokensStore {\n    constructor(languageIdCodec) {\n        this._lineTokens = [];\n        this._len = 0;\n        this._languageIdCodec = languageIdCodec;\n    }\n    flush() {\n        this._lineTokens = [];\n        this._len = 0;\n    }\n    get hasTokens() {\n        return this._lineTokens.length > 0;\n    }\n    getTokens(topLevelLanguageId, lineIndex, lineText) {\n        let rawLineTokens = null;\n        if (lineIndex < this._len) {\n            rawLineTokens = this._lineTokens[lineIndex];\n        }\n        if (rawLineTokens !== null && rawLineTokens !== EMPTY_LINE_TOKENS) {\n            return new LineTokens(toUint32Array(rawLineTokens), lineText, this._languageIdCodec);\n        }\n        const lineTokens = new Uint32Array(2);\n        lineTokens[0] = lineText.length;\n        lineTokens[1] = getDefaultMetadata(this._languageIdCodec.encodeLanguageId(topLevelLanguageId));\n        return new LineTokens(lineTokens, lineText, this._languageIdCodec);\n    }\n    static _massageTokens(topLevelLanguageId, lineTextLength, _tokens) {\n        const tokens = _tokens ? toUint32Array(_tokens) : null;\n        if (lineTextLength === 0) {\n            let hasDifferentLanguageId = false;\n            if (tokens && tokens.length > 1) {\n                hasDifferentLanguageId = (TokenMetadata.getLanguageId(tokens[1]) !== topLevelLanguageId);\n            }\n            if (!hasDifferentLanguageId) {\n                return EMPTY_LINE_TOKENS;\n            }\n        }\n        if (!tokens || tokens.length === 0) {\n            const tokens = new Uint32Array(2);\n            tokens[0] = lineTextLength;\n            tokens[1] = getDefaultMetadata(topLevelLanguageId);\n            return tokens.buffer;\n        }\n        // Ensure the last token covers the end of the text\n        tokens[tokens.length - 2] = lineTextLength;\n        if (tokens.byteOffset === 0 && tokens.byteLength === tokens.buffer.byteLength) {\n            // Store directly the ArrayBuffer pointer to save an object\n            return tokens.buffer;\n        }\n        return tokens;\n    }\n    _ensureLine(lineIndex) {\n        while (lineIndex >= this._len) {\n            this._lineTokens[this._len] = null;\n            this._len++;\n        }\n    }\n    _deleteLines(start, deleteCount) {\n        if (deleteCount === 0) {\n            return;\n        }\n        if (start + deleteCount > this._len) {\n            deleteCount = this._len - start;\n        }\n        this._lineTokens.splice(start, deleteCount);\n        this._len -= deleteCount;\n    }\n    _insertLines(insertIndex, insertCount) {\n        if (insertCount === 0) {\n            return;\n        }\n        const lineTokens = [];\n        for (let i = 0; i < insertCount; i++) {\n            lineTokens[i] = null;\n        }\n        this._lineTokens = arrayInsert(this._lineTokens, insertIndex, lineTokens);\n        this._len += insertCount;\n    }\n    setTokens(topLevelLanguageId, lineIndex, lineTextLength, _tokens, checkEquality) {\n        const tokens = ContiguousTokensStore._massageTokens(this._languageIdCodec.encodeLanguageId(topLevelLanguageId), lineTextLength, _tokens);\n        this._ensureLine(lineIndex);\n        const oldTokens = this._lineTokens[lineIndex];\n        this._lineTokens[lineIndex] = tokens;\n        if (checkEquality) {\n            return !ContiguousTokensStore._equals(oldTokens, tokens);\n        }\n        return false;\n    }\n    static _equals(_a, _b) {\n        if (!_a || !_b) {\n            return !_a && !_b;\n        }\n        const a = toUint32Array(_a);\n        const b = toUint32Array(_b);\n        if (a.length !== b.length) {\n            return false;\n        }\n        for (let i = 0, len = a.length; i < len; i++) {\n            if (a[i] !== b[i]) {\n                return false;\n            }\n        }\n        return true;\n    }\n    //#region Editing\n    acceptEdit(range, eolCount, firstLineLength) {\n        this._acceptDeleteRange(range);\n        this._acceptInsertText(new Position(range.startLineNumber, range.startColumn), eolCount, firstLineLength);\n    }\n    _acceptDeleteRange(range) {\n        const firstLineIndex = range.startLineNumber - 1;\n        if (firstLineIndex >= this._len) {\n            return;\n        }\n        if (range.startLineNumber === range.endLineNumber) {\n            if (range.startColumn === range.endColumn) {\n                // Nothing to delete\n                return;\n            }\n            this._lineTokens[firstLineIndex] = ContiguousTokensEditing.delete(this._lineTokens[firstLineIndex], range.startColumn - 1, range.endColumn - 1);\n            return;\n        }\n        this._lineTokens[firstLineIndex] = ContiguousTokensEditing.deleteEnding(this._lineTokens[firstLineIndex], range.startColumn - 1);\n        const lastLineIndex = range.endLineNumber - 1;\n        let lastLineTokens = null;\n        if (lastLineIndex < this._len) {\n            lastLineTokens = ContiguousTokensEditing.deleteBeginning(this._lineTokens[lastLineIndex], range.endColumn - 1);\n        }\n        // Take remaining text on last line and append it to remaining text on first line\n        this._lineTokens[firstLineIndex] = ContiguousTokensEditing.append(this._lineTokens[firstLineIndex], lastLineTokens);\n        // Delete middle lines\n        this._deleteLines(range.startLineNumber, range.endLineNumber - range.startLineNumber);\n    }\n    _acceptInsertText(position, eolCount, firstLineLength) {\n        if (eolCount === 0 && firstLineLength === 0) {\n            // Nothing to insert\n            return;\n        }\n        const lineIndex = position.lineNumber - 1;\n        if (lineIndex >= this._len) {\n            return;\n        }\n        if (eolCount === 0) {\n            // Inserting text on one line\n            this._lineTokens[lineIndex] = ContiguousTokensEditing.insert(this._lineTokens[lineIndex], position.column - 1, firstLineLength);\n            return;\n        }\n        this._lineTokens[lineIndex] = ContiguousTokensEditing.deleteEnding(this._lineTokens[lineIndex], position.column - 1);\n        this._lineTokens[lineIndex] = ContiguousTokensEditing.insert(this._lineTokens[lineIndex], position.column - 1, firstLineLength);\n        this._insertLines(position.lineNumber, eolCount);\n    }\n    //#endregion\n    setMultilineTokens(tokens, textModel) {\n        if (tokens.length === 0) {\n            return { changes: [] };\n        }\n        const ranges = [];\n        for (let i = 0, len = tokens.length; i < len; i++) {\n            const element = tokens[i];\n            let minChangedLineNumber = 0;\n            let maxChangedLineNumber = 0;\n            let hasChange = false;\n            for (let lineNumber = element.startLineNumber; lineNumber <= element.endLineNumber; lineNumber++) {\n                if (hasChange) {\n                    this.setTokens(textModel.getLanguageId(), lineNumber - 1, textModel.getLineLength(lineNumber), element.getLineTokens(lineNumber), false);\n                    maxChangedLineNumber = lineNumber;\n                }\n                else {\n                    const lineHasChange = this.setTokens(textModel.getLanguageId(), lineNumber - 1, textModel.getLineLength(lineNumber), element.getLineTokens(lineNumber), true);\n                    if (lineHasChange) {\n                        hasChange = true;\n                        minChangedLineNumber = lineNumber;\n                        maxChangedLineNumber = lineNumber;\n                    }\n                }\n            }\n            if (hasChange) {\n                ranges.push({ fromLineNumber: minChangedLineNumber, toLineNumber: maxChangedLineNumber, });\n            }\n        }\n        return { changes: ranges };\n    }\n}\nfunction getDefaultMetadata(topLevelLanguageId) {\n    return ((topLevelLanguageId << 0 /* MetadataConsts.LANGUAGEID_OFFSET */)\n        | (0 /* StandardTokenType.Other */ << 8 /* MetadataConsts.TOKEN_TYPE_OFFSET */)\n        | (0 /* FontStyle.None */ << 11 /* MetadataConsts.FONT_STYLE_OFFSET */)\n        | (1 /* ColorId.DefaultForeground */ << 15 /* MetadataConsts.FOREGROUND_OFFSET */)\n        | (2 /* ColorId.DefaultBackground */ << 24 /* MetadataConsts.BACKGROUND_OFFSET */)\n        // If there is no grammar, we just take a guess and try to match brackets.\n        | (1024 /* MetadataConsts.BALANCED_BRACKETS_MASK */)) >>> 0;\n}\n\nexport { ContiguousTokensStore };\n","import { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { MutableDisposable, DisposableMap } from '../../../../base/common/lifecycle.js';\nimport { countEOL } from '../../core/misc/eolCounter.js';\nimport { Position } from '../../core/position.js';\nimport { LineRange } from '../../core/ranges/lineRange.js';\nimport { TokenizationRegistry } from '../../languages.js';\nimport { ContiguousMultilineTokensBuilder } from '../../tokens/contiguousMultilineTokensBuilder.js';\nimport { ContiguousTokensStore } from '../../tokens/contiguousTokensStore.js';\nimport { TrackingTokenizationStateStore, TokenizerWithStateStoreAndTextModel, DefaultBackgroundTokenizer } from '../textModelTokens.js';\nimport { AbstractSyntaxTokenBackend, AttachedViewHandler } from './abstractSyntaxTokenBackend.js';\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/** For TextMate */\nclass TokenizerSyntaxTokenBackend extends AbstractSyntaxTokenBackend {\n    constructor(languageIdCodec, textModel, getLanguageId, attachedViews) {\n        super(languageIdCodec, textModel);\n        this.getLanguageId = getLanguageId;\n        this._tokenizer = null;\n        this._backgroundTokenizationState = 1 /* BackgroundTokenizationState.InProgress */;\n        this._onDidChangeBackgroundTokenizationState = this._register(new Emitter());\n        this.onDidChangeBackgroundTokenizationState = this._onDidChangeBackgroundTokenizationState.event;\n        this._defaultBackgroundTokenizer = null;\n        this._backgroundTokenizer = this._register(new MutableDisposable());\n        this._tokens = new ContiguousTokensStore(this._languageIdCodec);\n        this._debugBackgroundTokenizer = this._register(new MutableDisposable());\n        this._attachedViewStates = this._register(new DisposableMap());\n        this._register(TokenizationRegistry.onDidChange((e) => {\n            const languageId = this.getLanguageId();\n            if (e.changedLanguages.indexOf(languageId) === -1) {\n                return;\n            }\n            this.todo_resetTokenization();\n        }));\n        this.todo_resetTokenization();\n        this._register(attachedViews.onDidChangeVisibleRanges(({ view, state }) => {\n            if (state) {\n                let existing = this._attachedViewStates.get(view);\n                if (!existing) {\n                    existing = new AttachedViewHandler(() => this.refreshRanges(existing.lineRanges));\n                    this._attachedViewStates.set(view, existing);\n                }\n                existing.handleStateChange(state);\n            }\n            else {\n                this._attachedViewStates.deleteAndDispose(view);\n            }\n        }));\n    }\n    todo_resetTokenization(fireTokenChangeEvent = true) {\n        this._tokens.flush();\n        this._debugBackgroundTokens?.flush();\n        if (this._debugBackgroundStates) {\n            this._debugBackgroundStates = new TrackingTokenizationStateStore(this._textModel.getLineCount());\n        }\n        if (fireTokenChangeEvent) {\n            this._onDidChangeTokens.fire({\n                semanticTokensApplied: false,\n                ranges: [\n                    {\n                        fromLineNumber: 1,\n                        toLineNumber: this._textModel.getLineCount(),\n                    },\n                ],\n            });\n        }\n        const initializeTokenization = () => {\n            if (this._textModel.isTooLargeForTokenization()) {\n                return [null, null];\n            }\n            const tokenizationSupport = TokenizationRegistry.get(this.getLanguageId());\n            if (!tokenizationSupport) {\n                return [null, null];\n            }\n            let initialState;\n            try {\n                initialState = tokenizationSupport.getInitialState();\n            }\n            catch (e) {\n                onUnexpectedError(e);\n                return [null, null];\n            }\n            return [tokenizationSupport, initialState];\n        };\n        const [tokenizationSupport, initialState] = initializeTokenization();\n        if (tokenizationSupport && initialState) {\n            this._tokenizer = new TokenizerWithStateStoreAndTextModel(this._textModel.getLineCount(), tokenizationSupport, this._textModel, this._languageIdCodec);\n        }\n        else {\n            this._tokenizer = null;\n        }\n        this._backgroundTokenizer.clear();\n        this._defaultBackgroundTokenizer = null;\n        if (this._tokenizer) {\n            const b = {\n                setTokens: (tokens) => {\n                    this.setTokens(tokens);\n                },\n                backgroundTokenizationFinished: () => {\n                    if (this._backgroundTokenizationState === 2 /* BackgroundTokenizationState.Completed */) {\n                        // We already did a full tokenization and don't go back to progressing.\n                        return;\n                    }\n                    const newState = 2 /* BackgroundTokenizationState.Completed */;\n                    this._backgroundTokenizationState = newState;\n                    this._onDidChangeBackgroundTokenizationState.fire();\n                },\n                setEndState: (lineNumber, state) => {\n                    if (!this._tokenizer) {\n                        return;\n                    }\n                    const firstInvalidEndStateLineNumber = this._tokenizer.store.getFirstInvalidEndStateLineNumber();\n                    // Don't accept states for definitely valid states, the renderer is ahead of the worker!\n                    if (firstInvalidEndStateLineNumber !== null && lineNumber >= firstInvalidEndStateLineNumber) {\n                        this._tokenizer?.store.setEndState(lineNumber, state);\n                    }\n                },\n            };\n            if (tokenizationSupport && tokenizationSupport.createBackgroundTokenizer && !tokenizationSupport.backgroundTokenizerShouldOnlyVerifyTokens) {\n                this._backgroundTokenizer.value = tokenizationSupport.createBackgroundTokenizer(this._textModel, b);\n            }\n            if (!this._backgroundTokenizer.value && !this._textModel.isTooLargeForTokenization()) {\n                this._backgroundTokenizer.value = this._defaultBackgroundTokenizer =\n                    new DefaultBackgroundTokenizer(this._tokenizer, b);\n                this._defaultBackgroundTokenizer.handleChanges();\n            }\n            if (tokenizationSupport?.backgroundTokenizerShouldOnlyVerifyTokens && tokenizationSupport.createBackgroundTokenizer) {\n                this._debugBackgroundTokens = new ContiguousTokensStore(this._languageIdCodec);\n                this._debugBackgroundStates = new TrackingTokenizationStateStore(this._textModel.getLineCount());\n                this._debugBackgroundTokenizer.clear();\n                this._debugBackgroundTokenizer.value = tokenizationSupport.createBackgroundTokenizer(this._textModel, {\n                    setTokens: (tokens) => {\n                        this._debugBackgroundTokens?.setMultilineTokens(tokens, this._textModel);\n                    },\n                    backgroundTokenizationFinished() {\n                        // NO OP\n                    },\n                    setEndState: (lineNumber, state) => {\n                        this._debugBackgroundStates?.setEndState(lineNumber, state);\n                    },\n                });\n            }\n            else {\n                this._debugBackgroundTokens = undefined;\n                this._debugBackgroundStates = undefined;\n                this._debugBackgroundTokenizer.value = undefined;\n            }\n        }\n        this.refreshAllVisibleLineTokens();\n    }\n    handleDidChangeAttached() {\n        this._defaultBackgroundTokenizer?.handleChanges();\n    }\n    handleDidChangeContent(e) {\n        if (e.isFlush) {\n            // Don't fire the event, as the view might not have got the text change event yet\n            this.todo_resetTokenization(false);\n        }\n        else if (!e.isEolChange) { // We don't have to do anything on an EOL change\n            for (const c of e.changes) {\n                const [eolCount, firstLineLength] = countEOL(c.text);\n                this._tokens.acceptEdit(c.range, eolCount, firstLineLength);\n                this._debugBackgroundTokens?.acceptEdit(c.range, eolCount, firstLineLength);\n            }\n            this._debugBackgroundStates?.acceptChanges(e.changes);\n            if (this._tokenizer) {\n                this._tokenizer.store.acceptChanges(e.changes);\n            }\n            this._defaultBackgroundTokenizer?.handleChanges();\n        }\n    }\n    setTokens(tokens) {\n        const { changes } = this._tokens.setMultilineTokens(tokens, this._textModel);\n        if (changes.length > 0) {\n            this._onDidChangeTokens.fire({ semanticTokensApplied: false, ranges: changes, });\n        }\n        return { changes: changes };\n    }\n    refreshAllVisibleLineTokens() {\n        const ranges = LineRange.joinMany([...this._attachedViewStates].map(([_, s]) => s.lineRanges));\n        this.refreshRanges(ranges);\n    }\n    refreshRanges(ranges) {\n        for (const range of ranges) {\n            this.refreshRange(range.startLineNumber, range.endLineNumberExclusive - 1);\n        }\n    }\n    refreshRange(startLineNumber, endLineNumber) {\n        if (!this._tokenizer) {\n            return;\n        }\n        startLineNumber = Math.max(1, Math.min(this._textModel.getLineCount(), startLineNumber));\n        endLineNumber = Math.min(this._textModel.getLineCount(), endLineNumber);\n        const builder = new ContiguousMultilineTokensBuilder();\n        const { heuristicTokens } = this._tokenizer.tokenizeHeuristically(builder, startLineNumber, endLineNumber);\n        const changedTokens = this.setTokens(builder.finalize());\n        if (heuristicTokens) {\n            // We overrode tokens with heuristically computed ones.\n            // Because old states might get reused (thus stopping invalidation),\n            // we have to explicitly request the tokens for the changed ranges again.\n            for (const c of changedTokens.changes) {\n                this._backgroundTokenizer.value?.requestTokens(c.fromLineNumber, c.toLineNumber + 1);\n            }\n        }\n        this._defaultBackgroundTokenizer?.checkFinished();\n    }\n    forceTokenization(lineNumber) {\n        const builder = new ContiguousMultilineTokensBuilder();\n        this._tokenizer?.updateTokensUntilLine(builder, lineNumber);\n        this.setTokens(builder.finalize());\n        this._defaultBackgroundTokenizer?.checkFinished();\n    }\n    hasAccurateTokensForLine(lineNumber) {\n        if (!this._tokenizer) {\n            return true;\n        }\n        return this._tokenizer.hasAccurateTokensForLine(lineNumber);\n    }\n    isCheapToTokenize(lineNumber) {\n        if (!this._tokenizer) {\n            return true;\n        }\n        return this._tokenizer.isCheapToTokenize(lineNumber);\n    }\n    getLineTokens(lineNumber) {\n        const lineText = this._textModel.getLineContent(lineNumber);\n        const result = this._tokens.getTokens(this._textModel.getLanguageId(), lineNumber - 1, lineText);\n        if (this._debugBackgroundTokens && this._debugBackgroundStates && this._tokenizer) {\n            if (this._debugBackgroundStates.getFirstInvalidEndStateLineNumberOrMax() > lineNumber && this._tokenizer.store.getFirstInvalidEndStateLineNumberOrMax() > lineNumber) {\n                const backgroundResult = this._debugBackgroundTokens.getTokens(this._textModel.getLanguageId(), lineNumber - 1, lineText);\n                if (!result.equals(backgroundResult) && this._debugBackgroundTokenizer.value?.reportMismatchingTokens) {\n                    this._debugBackgroundTokenizer.value.reportMismatchingTokens(lineNumber);\n                }\n            }\n        }\n        return result;\n    }\n    getTokenTypeIfInsertingCharacter(lineNumber, column, character) {\n        if (!this._tokenizer) {\n            return 0 /* StandardTokenType.Other */;\n        }\n        const position = this._textModel.validatePosition(new Position(lineNumber, column));\n        this.forceTokenization(position.lineNumber);\n        return this._tokenizer.getTokenTypeIfInsertingCharacter(position, character);\n    }\n    tokenizeLinesAt(lineNumber, lines) {\n        if (!this._tokenizer) {\n            return null;\n        }\n        this.forceTokenization(lineNumber);\n        return this._tokenizer.tokenizeLinesAt(lineNumber, lines);\n    }\n    get hasTokens() {\n        return this._tokens.hasTokens;\n    }\n}\n\nexport { TokenizerSyntaxTokenBackend };\n","import { BugIndicatingError } from '../../../../base/common/errors.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { countEOL } from '../../core/misc/eolCounter.js';\nimport { Position } from '../../core/position.js';\nimport { getWordAtText } from '../../core/wordHelper.js';\nimport { ILanguageService } from '../../languages/language.js';\nimport { ILanguageConfigurationService } from '../../languages/languageConfigurationRegistry.js';\nimport { TextModelPart } from '../textModelPart.js';\nimport { TreeSitterSyntaxTokenBackend } from './treeSitter/treeSitterSyntaxTokenBackend.js';\nimport { SparseTokensStore } from '../../tokens/sparseTokensStore.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { TokenizerSyntaxTokenBackend } from './tokenizerSyntaxTokenBackend.js';\nimport { ITreeSitterLibraryService } from '../../services/treeSitter/treeSitterLibraryService.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { observableValue } from '../../../../base/common/observableInternal/observables/observableValue.js';\nimport { derived } from '../../../../base/common/observableInternal/observables/derived.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar TokenizationTextModelPart_1;\nlet TokenizationTextModelPart = TokenizationTextModelPart_1 = class TokenizationTextModelPart extends TextModelPart {\n    constructor(_textModel, _bracketPairsTextModelPart, _languageId, _attachedViews, _languageService, _languageConfigurationService, _instantiationService, _treeSitterLibraryService) {\n        super();\n        this._textModel = _textModel;\n        this._bracketPairsTextModelPart = _bracketPairsTextModelPart;\n        this._languageId = _languageId;\n        this._attachedViews = _attachedViews;\n        this._languageService = _languageService;\n        this._languageConfigurationService = _languageConfigurationService;\n        this._instantiationService = _instantiationService;\n        this._treeSitterLibraryService = _treeSitterLibraryService;\n        this._languageIdObs = observableValue(this, this._languageId);\n        this._useTreeSitter = derived(this, reader => {\n            const languageId = this._languageIdObs.read(reader);\n            return this._treeSitterLibraryService.supportsLanguage(languageId, reader);\n        });\n        this.tokens = derived(this, reader => {\n            let tokens;\n            if (this._useTreeSitter.read(reader)) {\n                tokens = reader.store.add(this._instantiationService.createInstance(TreeSitterSyntaxTokenBackend, this._languageIdObs, this._languageService.languageIdCodec, this._textModel, this._attachedViews.visibleLineRanges));\n            }\n            else {\n                tokens = reader.store.add(new TokenizerSyntaxTokenBackend(this._languageService.languageIdCodec, this._textModel, () => this._languageId, this._attachedViews));\n            }\n            reader.store.add(tokens.onDidChangeTokens(e => {\n                this._emitModelTokensChangedEvent(e);\n            }));\n            reader.store.add(tokens.onDidChangeBackgroundTokenizationState(e => {\n                this._bracketPairsTextModelPart.handleDidChangeBackgroundTokenizationState();\n            }));\n            return tokens;\n        });\n        let hadTokens = false;\n        this.tokens.recomputeInitiallyAndOnChange(this._store, value => {\n            if (hadTokens) {\n                // We need to reset the tokenization, as the new token provider otherwise won't have a chance to provide tokens until some action happens in the editor.\n                // TODO@hediet: Look into why this is needed.\n                value.todo_resetTokenization();\n            }\n            hadTokens = true;\n        });\n        this._semanticTokens = new SparseTokensStore(this._languageService.languageIdCodec);\n        this._onDidChangeLanguage = this._register(new Emitter());\n        this.onDidChangeLanguage = this._onDidChangeLanguage.event;\n        this._onDidChangeLanguageConfiguration = this._register(new Emitter());\n        this.onDidChangeLanguageConfiguration = this._onDidChangeLanguageConfiguration.event;\n        this._onDidChangeTokens = this._register(new Emitter());\n        this.onDidChangeTokens = this._onDidChangeTokens.event;\n    }\n    handleLanguageConfigurationServiceChange(e) {\n        if (e.affects(this._languageId)) {\n            this._onDidChangeLanguageConfiguration.fire({});\n        }\n    }\n    handleDidChangeContent(e) {\n        if (e.isFlush) {\n            this._semanticTokens.flush();\n        }\n        else if (!e.isEolChange) { // We don't have to do anything on an EOL change\n            for (const c of e.changes) {\n                const [eolCount, firstLineLength, lastLineLength] = countEOL(c.text);\n                this._semanticTokens.acceptEdit(c.range, eolCount, firstLineLength, lastLineLength, c.text.length > 0 ? c.text.charCodeAt(0) : 0 /* CharCode.Null */);\n            }\n        }\n        this.tokens.get().handleDidChangeContent(e);\n    }\n    handleDidChangeAttached() {\n        this.tokens.get().handleDidChangeAttached();\n    }\n    /**\n     * Includes grammar and semantic tokens.\n     */\n    getLineTokens(lineNumber) {\n        this.validateLineNumber(lineNumber);\n        const syntacticTokens = this.tokens.get().getLineTokens(lineNumber);\n        return this._semanticTokens.addSparseTokens(lineNumber, syntacticTokens);\n    }\n    _emitModelTokensChangedEvent(e) {\n        if (!this._textModel._isDisposing()) {\n            this._bracketPairsTextModelPart.handleDidChangeTokens(e);\n            this._onDidChangeTokens.fire(e);\n        }\n    }\n    // #region Grammar Tokens\n    validateLineNumber(lineNumber) {\n        if (lineNumber < 1 || lineNumber > this._textModel.getLineCount()) {\n            throw new BugIndicatingError('Illegal value for lineNumber');\n        }\n    }\n    get hasTokens() {\n        return this.tokens.get().hasTokens;\n    }\n    resetTokenization() {\n        this.tokens.get().todo_resetTokenization();\n    }\n    get backgroundTokenizationState() {\n        return this.tokens.get().backgroundTokenizationState;\n    }\n    forceTokenization(lineNumber) {\n        this.validateLineNumber(lineNumber);\n        this.tokens.get().forceTokenization(lineNumber);\n    }\n    hasAccurateTokensForLine(lineNumber) {\n        this.validateLineNumber(lineNumber);\n        return this.tokens.get().hasAccurateTokensForLine(lineNumber);\n    }\n    isCheapToTokenize(lineNumber) {\n        this.validateLineNumber(lineNumber);\n        return this.tokens.get().isCheapToTokenize(lineNumber);\n    }\n    tokenizeIfCheap(lineNumber) {\n        this.validateLineNumber(lineNumber);\n        this.tokens.get().tokenizeIfCheap(lineNumber);\n    }\n    getTokenTypeIfInsertingCharacter(lineNumber, column, character) {\n        return this.tokens.get().getTokenTypeIfInsertingCharacter(lineNumber, column, character);\n    }\n    tokenizeLinesAt(lineNumber, lines) {\n        return this.tokens.get().tokenizeLinesAt(lineNumber, lines);\n    }\n    // #endregion\n    // #region Semantic Tokens\n    setSemanticTokens(tokens, isComplete) {\n        this._semanticTokens.set(tokens, isComplete, this._textModel);\n        this._emitModelTokensChangedEvent({\n            semanticTokensApplied: tokens !== null,\n            ranges: [{ fromLineNumber: 1, toLineNumber: this._textModel.getLineCount() }],\n        });\n    }\n    hasCompleteSemanticTokens() {\n        return this._semanticTokens.isComplete();\n    }\n    hasSomeSemanticTokens() {\n        return !this._semanticTokens.isEmpty();\n    }\n    setPartialSemanticTokens(range, tokens) {\n        if (this.hasCompleteSemanticTokens()) {\n            return;\n        }\n        const changedRange = this._textModel.validateRange(this._semanticTokens.setPartial(range, tokens));\n        this._emitModelTokensChangedEvent({\n            semanticTokensApplied: true,\n            ranges: [\n                {\n                    fromLineNumber: changedRange.startLineNumber,\n                    toLineNumber: changedRange.endLineNumber,\n                },\n            ],\n        });\n    }\n    // #endregion\n    // #region Utility Methods\n    getWordAtPosition(_position) {\n        this.assertNotDisposed();\n        const position = this._textModel.validatePosition(_position);\n        const lineContent = this._textModel.getLineContent(position.lineNumber);\n        const lineTokens = this.getLineTokens(position.lineNumber);\n        const tokenIndex = lineTokens.findTokenIndexAtOffset(position.column - 1);\n        // (1). First try checking right biased word\n        const [rbStartOffset, rbEndOffset] = TokenizationTextModelPart_1._findLanguageBoundaries(lineTokens, tokenIndex);\n        const rightBiasedWord = getWordAtText(position.column, this.getLanguageConfiguration(lineTokens.getLanguageId(tokenIndex)).getWordDefinition(), lineContent.substring(rbStartOffset, rbEndOffset), rbStartOffset);\n        // Make sure the result touches the original passed in position\n        if (rightBiasedWord &&\n            rightBiasedWord.startColumn <= _position.column &&\n            _position.column <= rightBiasedWord.endColumn) {\n            return rightBiasedWord;\n        }\n        // (2). Else, if we were at a language boundary, check the left biased word\n        if (tokenIndex > 0 && rbStartOffset === position.column - 1) {\n            // edge case, where `position` sits between two tokens belonging to two different languages\n            const [lbStartOffset, lbEndOffset] = TokenizationTextModelPart_1._findLanguageBoundaries(lineTokens, tokenIndex - 1);\n            const leftBiasedWord = getWordAtText(position.column, this.getLanguageConfiguration(lineTokens.getLanguageId(tokenIndex - 1)).getWordDefinition(), lineContent.substring(lbStartOffset, lbEndOffset), lbStartOffset);\n            // Make sure the result touches the original passed in position\n            if (leftBiasedWord &&\n                leftBiasedWord.startColumn <= _position.column &&\n                _position.column <= leftBiasedWord.endColumn) {\n                return leftBiasedWord;\n            }\n        }\n        return null;\n    }\n    getLanguageConfiguration(languageId) {\n        return this._languageConfigurationService.getLanguageConfiguration(languageId);\n    }\n    static _findLanguageBoundaries(lineTokens, tokenIndex) {\n        const languageId = lineTokens.getLanguageId(tokenIndex);\n        // go left until a different language is hit\n        let startOffset = 0;\n        for (let i = tokenIndex; i >= 0 && lineTokens.getLanguageId(i) === languageId; i--) {\n            startOffset = lineTokens.getStartOffset(i);\n        }\n        // go right until a different language is hit\n        let endOffset = lineTokens.getLineContent().length;\n        for (let i = tokenIndex, tokenCount = lineTokens.getCount(); i < tokenCount && lineTokens.getLanguageId(i) === languageId; i++) {\n            endOffset = lineTokens.getEndOffset(i);\n        }\n        return [startOffset, endOffset];\n    }\n    getWordUntilPosition(position) {\n        const wordAtPosition = this.getWordAtPosition(position);\n        if (!wordAtPosition) {\n            return { word: '', startColumn: position.column, endColumn: position.column, };\n        }\n        return {\n            word: wordAtPosition.word.substr(0, position.column - wordAtPosition.startColumn),\n            startColumn: wordAtPosition.startColumn,\n            endColumn: position.column,\n        };\n    }\n    // #endregion\n    // #region Language Id handling\n    getLanguageId() {\n        return this._languageId;\n    }\n    getLanguageIdAtPosition(lineNumber, column) {\n        const position = this._textModel.validatePosition(new Position(lineNumber, column));\n        const lineTokens = this.getLineTokens(position.lineNumber);\n        return lineTokens.getLanguageId(lineTokens.findTokenIndexAtOffset(position.column - 1));\n    }\n    setLanguageId(languageId, source = 'api') {\n        if (this._languageId === languageId) {\n            // There's nothing to do\n            return;\n        }\n        const e = {\n            oldLanguage: this._languageId,\n            newLanguage: languageId,\n            source\n        };\n        this._languageId = languageId;\n        this._languageIdObs.set(languageId, undefined);\n        this._bracketPairsTextModelPart.handleDidChangeLanguage(e);\n        this._onDidChangeLanguage.fire(e);\n        this._onDidChangeLanguageConfiguration.fire({});\n    }\n};\nTokenizationTextModelPart = TokenizationTextModelPart_1 = __decorate([\n    __param(4, ILanguageService),\n    __param(5, ILanguageConfigurationService),\n    __param(6, IInstantiationService),\n    __param(7, ITreeSitterLibraryService)\n], TokenizationTextModelPart);\n\nexport { TokenizationTextModelPart };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IUndoRedoService = createDecorator('undoRedoService');\nclass ResourceEditStackSnapshot {\n    constructor(resource, elements) {\n        this.resource = resource;\n        this.elements = elements;\n    }\n}\nclass UndoRedoGroup {\n    static { this._ID = 0; }\n    constructor() {\n        this.id = UndoRedoGroup._ID++;\n        this.order = 1;\n    }\n    nextOrder() {\n        if (this.id === 0) {\n            return 0;\n        }\n        return this.order++;\n    }\n    static { this.None = new UndoRedoGroup(); }\n}\nclass UndoRedoSource {\n    static { this._ID = 0; }\n    constructor() {\n        this.id = UndoRedoSource._ID++;\n        this.order = 1;\n    }\n    nextOrder() {\n        if (this.id === 0) {\n            return 0;\n        }\n        return this.order++;\n    }\n    static { this.None = new UndoRedoSource(); }\n}\n\nexport { IUndoRedoService, ResourceEditStackSnapshot, UndoRedoGroup, UndoRedoSource };\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 *--------------------------------------------------------------------------------------------*/\nvar _a;\nfunction groupByMap(data, groupFn) {\n    const result = new Map();\n    for (const element of data) {\n        const key = groupFn(element);\n        let target = result.get(key);\n        if (!target) {\n            target = [];\n            result.set(key, target);\n        }\n        target.push(element);\n    }\n    return result;\n}\nfunction diffSets(before, after) {\n    const removed = [];\n    const added = [];\n    for (const element of before) {\n        if (!after.has(element)) {\n            removed.push(element);\n        }\n    }\n    for (const element of after) {\n        if (!before.has(element)) {\n            added.push(element);\n        }\n    }\n    return { removed, added };\n}\n/**\n * Computes the intersection of two sets.\n *\n * @param setA - The first set.\n * @param setB - The second iterable.\n * @returns A new set containing the elements that are in both `setA` and `setB`.\n */\nfunction intersection(setA, setB) {\n    const result = new Set();\n    for (const elem of setB) {\n        if (setA.has(elem)) {\n            result.add(elem);\n        }\n    }\n    return result;\n}\nclass SetWithKey {\n    static { _a = Symbol.toStringTag; }\n    constructor(values, toKey) {\n        this.toKey = toKey;\n        this._map = new Map();\n        this[_a] = 'SetWithKey';\n        for (const value of values) {\n            this.add(value);\n        }\n    }\n    get size() {\n        return this._map.size;\n    }\n    add(value) {\n        const key = this.toKey(value);\n        this._map.set(key, value);\n        return this;\n    }\n    delete(value) {\n        return this._map.delete(this.toKey(value));\n    }\n    has(value) {\n        return this._map.has(this.toKey(value));\n    }\n    *entries() {\n        for (const entry of this._map.values()) {\n            yield [entry, entry];\n        }\n    }\n    keys() {\n        return this.values();\n    }\n    *values() {\n        for (const entry of this._map.values()) {\n            yield entry;\n        }\n    }\n    clear() {\n        this._map.clear();\n    }\n    forEach(callbackfn, thisArg) {\n        this._map.forEach(entry => callbackfn.call(thisArg, entry, entry, this));\n    }\n    [Symbol.iterator]() {\n        return this.values();\n    }\n}\n\nexport { SetWithKey, diffSets, groupByMap, intersection };\n","import { ArrayQueue, pushMany } from '../../../base/common/arrays.js';\nimport { Color } from '../../../base/common/color.js';\nimport { BugIndicatingError, illegalArgument, onUnexpectedError } from '../../../base/common/errors.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { Disposable, combinedDisposable, MutableDisposable } from '../../../base/common/lifecycle.js';\nimport { singleLetterHash, UNUSUAL_LINE_TERMINATORS, isHighSurrogate, htmlAttributeEncodeValue } from '../../../base/common/strings.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { countEOL } from '../core/misc/eolCounter.js';\nimport { normalizeIndentation } from '../core/misc/indentation.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { Selection } from '../core/selection.js';\nimport { EDITOR_MODEL_DEFAULTS } from '../core/misc/textModelDefaults.js';\nimport { ILanguageService } from '../languages/language.js';\nimport { ILanguageConfigurationService } from '../languages/languageConfigurationRegistry.js';\nimport { TextModelResolvedOptions, ValidAnnotatedEditOperation, isITextSnapshot, OverviewRulerLane, GlyphMarginLane } from '../model.js';\nimport { BracketPairsTextModelPart } from './bracketPairsTextModelPart/bracketPairsImpl.js';\nimport { ColorizedBracketPairsDecorationProvider } from './bracketPairsTextModelPart/colorizedBracketPairsDecorationProvider.js';\nimport { EditStack } from './editStack.js';\nimport { GuidesTextModelPart } from './guidesTextModelPart.js';\nimport { guessIndentation } from './indentationGuesser.js';\nimport { recomputeMaxEnd, IntervalNode, IntervalTree } from './intervalTree.js';\nimport { PieceTreeTextBuffer } from './pieceTreeTextBuffer/pieceTreeTextBuffer.js';\nimport { PieceTreeTextBufferBuilder } from './pieceTreeTextBuffer/pieceTreeTextBufferBuilder.js';\nimport { SearchParams, TextModelSearch } from './textModelSearch.js';\nimport { TokenizationTextModelPart } from './tokens/tokenizationTextModelPart.js';\nimport { AttachedViews } from './tokens/abstractSyntaxTokenBackend.js';\nimport { InternalModelContentChangeEvent, ModelRawContentChangedEvent, ModelRawFlush, ModelRawEOLChanged, LineInjectedText, ModelRawLineChanged, ModelRawLinesDeleted, ModelRawLinesInserted, ModelInjectedTextChangedEvent, ModelLineHeightChanged, ModelLineHeightChangedEvent, ModelFontChanged, ModelFontChangedEvent } from '../textModelEvents.js';\nimport { IInstantiationService } from '../../../platform/instantiation/common/instantiation.js';\nimport { IUndoRedoService } from '../../../platform/undoRedo/common/undoRedo.js';\nimport { SetWithKey } from '../../../base/common/collections.js';\nimport { EditSources } from '../textModelEditSource.js';\nimport { isDark } from '../../../platform/theme/common/theme.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar TextModel_1;\nfunction createTextBufferFactory(text) {\n    const builder = new PieceTreeTextBufferBuilder();\n    builder.acceptChunk(text);\n    return builder.finish();\n}\nfunction createTextBufferFactoryFromSnapshot(snapshot) {\n    const builder = new PieceTreeTextBufferBuilder();\n    let chunk;\n    while (typeof (chunk = snapshot.read()) === 'string') {\n        builder.acceptChunk(chunk);\n    }\n    return builder.finish();\n}\nfunction createTextBuffer(value, defaultEOL) {\n    let factory;\n    if (typeof value === 'string') {\n        factory = createTextBufferFactory(value);\n    }\n    else if (isITextSnapshot(value)) {\n        factory = createTextBufferFactoryFromSnapshot(value);\n    }\n    else {\n        factory = value;\n    }\n    return factory.create(defaultEOL);\n}\nlet MODEL_ID = 0;\nconst LIMIT_FIND_COUNT = 999;\nconst LONG_LINE_BOUNDARY = 10000;\nconst LINE_HEIGHT_CEILING = 300;\nclass TextModelSnapshot {\n    constructor(source) {\n        this._source = source;\n        this._eos = false;\n    }\n    read() {\n        if (this._eos) {\n            return null;\n        }\n        const result = [];\n        let resultCnt = 0;\n        let resultLength = 0;\n        do {\n            const tmp = this._source.read();\n            if (tmp === null) {\n                // end-of-stream\n                this._eos = true;\n                if (resultCnt === 0) {\n                    return null;\n                }\n                else {\n                    return result.join('');\n                }\n            }\n            if (tmp.length > 0) {\n                result[resultCnt++] = tmp;\n                resultLength += tmp.length;\n            }\n            if (resultLength >= 64 * 1024) {\n                return result.join('');\n            }\n        } while (true);\n    }\n}\nconst invalidFunc = () => { throw new Error(`Invalid change accessor`); };\nlet TextModel = class TextModel extends Disposable {\n    static { TextModel_1 = this; }\n    static { this._MODEL_SYNC_LIMIT = 50 * 1024 * 1024; } // 50 MB,  // used in tests\n    static { this.LARGE_FILE_SIZE_THRESHOLD = 20 * 1024 * 1024; } // 20 MB;\n    static { this.LARGE_FILE_LINE_COUNT_THRESHOLD = 300 * 1000; } // 300K lines\n    static { this.LARGE_FILE_HEAP_OPERATION_THRESHOLD = 256 * 1024 * 1024; } // 256M characters, usually ~> 512MB memory usage\n    static { this.DEFAULT_CREATION_OPTIONS = {\n        isForSimpleWidget: false,\n        tabSize: EDITOR_MODEL_DEFAULTS.tabSize,\n        indentSize: EDITOR_MODEL_DEFAULTS.indentSize,\n        insertSpaces: EDITOR_MODEL_DEFAULTS.insertSpaces,\n        detectIndentation: false,\n        defaultEOL: 1 /* model.DefaultEndOfLine.LF */,\n        trimAutoWhitespace: EDITOR_MODEL_DEFAULTS.trimAutoWhitespace,\n        largeFileOptimizations: EDITOR_MODEL_DEFAULTS.largeFileOptimizations,\n        bracketPairColorizationOptions: EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions,\n    }; }\n    static resolveOptions(textBuffer, options) {\n        if (options.detectIndentation) {\n            const guessedIndentation = guessIndentation(textBuffer, options.tabSize, options.insertSpaces);\n            return new TextModelResolvedOptions({\n                tabSize: guessedIndentation.tabSize,\n                indentSize: 'tabSize', // TODO@Alex: guess indentSize independent of tabSize\n                insertSpaces: guessedIndentation.insertSpaces,\n                trimAutoWhitespace: options.trimAutoWhitespace,\n                defaultEOL: options.defaultEOL,\n                bracketPairColorizationOptions: options.bracketPairColorizationOptions,\n            });\n        }\n        return new TextModelResolvedOptions(options);\n    }\n    get onDidChangeLanguage() { return this._tokenizationTextModelPart.onDidChangeLanguage; }\n    get onDidChangeLanguageConfiguration() { return this._tokenizationTextModelPart.onDidChangeLanguageConfiguration; }\n    get onDidChangeTokens() { return this._tokenizationTextModelPart.onDidChangeTokens; }\n    get onDidChangeOptions() { return this._onDidChangeOptions.event; }\n    get onDidChangeAttached() { return this._onDidChangeAttached.event; }\n    get onDidChangeLineHeight() { return this._onDidChangeLineHeight.event; }\n    get onDidChangeFont() { return this._onDidChangeFont.event; }\n    onDidChangeContent(listener) {\n        return this._eventEmitter.slowEvent((e) => listener(e.contentChangedEvent));\n    }\n    onDidChangeContentOrInjectedText(listener) {\n        return combinedDisposable(this._eventEmitter.fastEvent(e => listener(e)), this._onDidChangeInjectedText.event(e => listener(e)));\n    }\n    _isDisposing() { return this.__isDisposing; }\n    get tokenization() { return this._tokenizationTextModelPart; }\n    get bracketPairs() { return this._bracketPairs; }\n    get guides() { return this._guidesTextModelPart; }\n    constructor(source, languageIdOrSelection, creationOptions, associatedResource = null, _undoRedoService, _languageService, _languageConfigurationService, instantiationService) {\n        super();\n        this._undoRedoService = _undoRedoService;\n        this._languageService = _languageService;\n        this._languageConfigurationService = _languageConfigurationService;\n        this.instantiationService = instantiationService;\n        //#region Events\n        this._onWillDispose = this._register(new Emitter());\n        this.onWillDispose = this._onWillDispose.event;\n        this._onDidChangeDecorations = this._register(new DidChangeDecorationsEmitter((affectedInjectedTextLines, affectedLineHeights, affectedFontLines) => this.handleBeforeFireDecorationsChangedEvent(affectedInjectedTextLines, affectedLineHeights, affectedFontLines)));\n        this.onDidChangeDecorations = this._onDidChangeDecorations.event;\n        this._onDidChangeOptions = this._register(new Emitter());\n        this._onDidChangeAttached = this._register(new Emitter());\n        this._onDidChangeInjectedText = this._register(new Emitter());\n        this._onDidChangeLineHeight = this._register(new Emitter());\n        this._onDidChangeFont = this._register(new Emitter());\n        this._eventEmitter = this._register(new DidChangeContentEmitter());\n        this._languageSelectionListener = this._register(new MutableDisposable());\n        this._deltaDecorationCallCnt = 0;\n        this._attachedViews = new AttachedViews();\n        // Generate a new unique model id\n        MODEL_ID++;\n        this.id = '$model' + MODEL_ID;\n        this.isForSimpleWidget = creationOptions.isForSimpleWidget;\n        if (typeof associatedResource === 'undefined' || associatedResource === null) {\n            this._associatedResource = URI.parse('inmemory://model/' + MODEL_ID);\n        }\n        else {\n            this._associatedResource = associatedResource;\n        }\n        this._attachedEditorCount = 0;\n        const { textBuffer, disposable } = createTextBuffer(source, creationOptions.defaultEOL);\n        this._buffer = textBuffer;\n        this._bufferDisposable = disposable;\n        const bufferLineCount = this._buffer.getLineCount();\n        const bufferTextLength = this._buffer.getValueLengthInRange(new Range(1, 1, bufferLineCount, this._buffer.getLineLength(bufferLineCount) + 1), 0 /* model.EndOfLinePreference.TextDefined */);\n        // !!! Make a decision in the ctor and permanently respect this decision !!!\n        // If a model is too large at construction time, it will never get tokenized,\n        // under no circumstances.\n        if (creationOptions.largeFileOptimizations) {\n            this._isTooLargeForTokenization = ((bufferTextLength > TextModel_1.LARGE_FILE_SIZE_THRESHOLD)\n                || (bufferLineCount > TextModel_1.LARGE_FILE_LINE_COUNT_THRESHOLD));\n            this._isTooLargeForHeapOperation = bufferTextLength > TextModel_1.LARGE_FILE_HEAP_OPERATION_THRESHOLD;\n        }\n        else {\n            this._isTooLargeForTokenization = false;\n            this._isTooLargeForHeapOperation = false;\n        }\n        this._options = TextModel_1.resolveOptions(this._buffer, creationOptions);\n        const languageId = (typeof languageIdOrSelection === 'string' ? languageIdOrSelection : languageIdOrSelection.languageId);\n        if (typeof languageIdOrSelection !== 'string') {\n            this._languageSelectionListener.value = languageIdOrSelection.onDidChange(() => this._setLanguage(languageIdOrSelection.languageId));\n        }\n        this._bracketPairs = this._register(new BracketPairsTextModelPart(this, this._languageConfigurationService));\n        this._guidesTextModelPart = this._register(new GuidesTextModelPart(this, this._languageConfigurationService));\n        this._decorationProvider = this._register(new ColorizedBracketPairsDecorationProvider(this));\n        this._tokenizationTextModelPart = this.instantiationService.createInstance(TokenizationTextModelPart, this, this._bracketPairs, languageId, this._attachedViews);\n        this._isTooLargeForSyncing = (bufferTextLength > TextModel_1._MODEL_SYNC_LIMIT);\n        this._versionId = 1;\n        this._alternativeVersionId = 1;\n        this._initialUndoRedoSnapshot = null;\n        this._isDisposed = false;\n        this.__isDisposing = false;\n        this._instanceId = singleLetterHash(MODEL_ID);\n        this._lastDecorationId = 0;\n        this._decorations = Object.create(null);\n        this._decorationsTree = new DecorationsTrees();\n        this._commandManager = new EditStack(this, this._undoRedoService);\n        this._isUndoing = false;\n        this._isRedoing = false;\n        this._trimAutoWhitespaceLines = null;\n        this._register(this._decorationProvider.onDidChange(() => {\n            this._onDidChangeDecorations.beginDeferredEmit();\n            this._onDidChangeDecorations.fire();\n            this._onDidChangeDecorations.endDeferredEmit();\n        }));\n        this._languageService.requestRichLanguageFeatures(languageId);\n        this._register(this._languageConfigurationService.onDidChange(e => {\n            this._bracketPairs.handleLanguageConfigurationServiceChange(e);\n            this._tokenizationTextModelPart.handleLanguageConfigurationServiceChange(e);\n        }));\n    }\n    dispose() {\n        this.__isDisposing = true;\n        this._onWillDispose.fire();\n        this._tokenizationTextModelPart.dispose();\n        this._isDisposed = true;\n        super.dispose();\n        this._bufferDisposable.dispose();\n        this.__isDisposing = false;\n        // Manually release reference to previous text buffer to avoid large leaks\n        // in case someone leaks a TextModel reference\n        const emptyDisposedTextBuffer = new PieceTreeTextBuffer([], '', '\\n', false, false, true, true);\n        emptyDisposedTextBuffer.dispose();\n        this._buffer = emptyDisposedTextBuffer;\n        this._bufferDisposable = Disposable.None;\n    }\n    _assertNotDisposed() {\n        if (this._isDisposed) {\n            throw new BugIndicatingError('Model is disposed!');\n        }\n    }\n    getTextBuffer() {\n        this._assertNotDisposed();\n        return this._buffer;\n    }\n    _emitContentChangedEvent(rawChange, change) {\n        if (this.__isDisposing) {\n            // Do not confuse listeners by emitting any event after disposing\n            return;\n        }\n        this._tokenizationTextModelPart.handleDidChangeContent(change);\n        this._bracketPairs.handleDidChangeContent(change);\n        this._eventEmitter.fire(new InternalModelContentChangeEvent(rawChange, change));\n    }\n    setValue(value, reason = EditSources.setValue()) {\n        this._assertNotDisposed();\n        if (value === null || value === undefined) {\n            throw illegalArgument();\n        }\n        const { textBuffer, disposable } = createTextBuffer(value, this._options.defaultEOL);\n        this._setValueFromTextBuffer(textBuffer, disposable, reason);\n    }\n    _createContentChanged2(range, rangeOffset, rangeLength, rangeEndPosition, text, isUndoing, isRedoing, isFlush, isEolChange, reason) {\n        return {\n            changes: [{\n                    range: range,\n                    rangeOffset: rangeOffset,\n                    rangeLength: rangeLength,\n                    text: text,\n                }],\n            eol: this._buffer.getEOL(),\n            isEolChange: isEolChange,\n            versionId: this.getVersionId(),\n            isUndoing: isUndoing,\n            isRedoing: isRedoing,\n            isFlush: isFlush,\n            detailedReasons: [reason],\n            detailedReasonsChangeLengths: [1],\n        };\n    }\n    _setValueFromTextBuffer(textBuffer, textBufferDisposable, reason) {\n        this._assertNotDisposed();\n        const oldFullModelRange = this.getFullModelRange();\n        const oldModelValueLength = this.getValueLengthInRange(oldFullModelRange);\n        const endLineNumber = this.getLineCount();\n        const endColumn = this.getLineMaxColumn(endLineNumber);\n        this._buffer = textBuffer;\n        this._bufferDisposable.dispose();\n        this._bufferDisposable = textBufferDisposable;\n        this._increaseVersionId();\n        // Destroy all my decorations\n        this._decorations = Object.create(null);\n        this._decorationsTree = new DecorationsTrees();\n        // Destroy my edit history and settings\n        this._commandManager.clear();\n        this._trimAutoWhitespaceLines = null;\n        this._emitContentChangedEvent(new ModelRawContentChangedEvent([\n            new ModelRawFlush()\n        ], this._versionId, false, false), this._createContentChanged2(new Range(1, 1, endLineNumber, endColumn), 0, oldModelValueLength, new Position(endLineNumber, endColumn), this.getValue(), false, false, true, false, reason));\n    }\n    setEOL(eol) {\n        this._assertNotDisposed();\n        const newEOL = (eol === 1 /* model.EndOfLineSequence.CRLF */ ? '\\r\\n' : '\\n');\n        if (this._buffer.getEOL() === newEOL) {\n            // Nothing to do\n            return;\n        }\n        const oldFullModelRange = this.getFullModelRange();\n        const oldModelValueLength = this.getValueLengthInRange(oldFullModelRange);\n        const endLineNumber = this.getLineCount();\n        const endColumn = this.getLineMaxColumn(endLineNumber);\n        this._onBeforeEOLChange();\n        this._buffer.setEOL(newEOL);\n        this._increaseVersionId();\n        this._onAfterEOLChange();\n        this._emitContentChangedEvent(new ModelRawContentChangedEvent([\n            new ModelRawEOLChanged()\n        ], this._versionId, false, false), this._createContentChanged2(new Range(1, 1, endLineNumber, endColumn), 0, oldModelValueLength, new Position(endLineNumber, endColumn), this.getValue(), false, false, false, true, EditSources.eolChange()));\n    }\n    _onBeforeEOLChange() {\n        // Ensure all decorations get their `range` set.\n        this._decorationsTree.ensureAllNodesHaveRanges(this);\n    }\n    _onAfterEOLChange() {\n        // Transform back `range` to offsets\n        const versionId = this.getVersionId();\n        const allDecorations = this._decorationsTree.collectNodesPostOrder();\n        for (let i = 0, len = allDecorations.length; i < len; i++) {\n            const node = allDecorations[i];\n            const range = node.range; // the range is defined due to `_onBeforeEOLChange`\n            const delta = node.cachedAbsoluteStart - node.start;\n            const startOffset = this._buffer.getOffsetAt(range.startLineNumber, range.startColumn);\n            const endOffset = this._buffer.getOffsetAt(range.endLineNumber, range.endColumn);\n            node.cachedAbsoluteStart = startOffset;\n            node.cachedAbsoluteEnd = endOffset;\n            node.cachedVersionId = versionId;\n            node.start = startOffset - delta;\n            node.end = endOffset - delta;\n            recomputeMaxEnd(node);\n        }\n    }\n    onBeforeAttached() {\n        this._attachedEditorCount++;\n        if (this._attachedEditorCount === 1) {\n            this._tokenizationTextModelPart.handleDidChangeAttached();\n            this._onDidChangeAttached.fire(undefined);\n        }\n        return this._attachedViews.attachView();\n    }\n    onBeforeDetached(view) {\n        this._attachedEditorCount--;\n        if (this._attachedEditorCount === 0) {\n            this._tokenizationTextModelPart.handleDidChangeAttached();\n            this._onDidChangeAttached.fire(undefined);\n        }\n        this._attachedViews.detachView(view);\n    }\n    isAttachedToEditor() {\n        return this._attachedEditorCount > 0;\n    }\n    getAttachedEditorCount() {\n        return this._attachedEditorCount;\n    }\n    isTooLargeForSyncing() {\n        return this._isTooLargeForSyncing;\n    }\n    isTooLargeForTokenization() {\n        return this._isTooLargeForTokenization;\n    }\n    isTooLargeForHeapOperation() {\n        return this._isTooLargeForHeapOperation;\n    }\n    isDisposed() {\n        return this._isDisposed;\n    }\n    isDominatedByLongLines() {\n        this._assertNotDisposed();\n        if (this.isTooLargeForTokenization()) {\n            // Cannot word wrap huge files anyways, so it doesn't really matter\n            return false;\n        }\n        let smallLineCharCount = 0;\n        let longLineCharCount = 0;\n        const lineCount = this._buffer.getLineCount();\n        for (let lineNumber = 1; lineNumber <= lineCount; lineNumber++) {\n            const lineLength = this._buffer.getLineLength(lineNumber);\n            if (lineLength >= LONG_LINE_BOUNDARY) {\n                longLineCharCount += lineLength;\n            }\n            else {\n                smallLineCharCount += lineLength;\n            }\n        }\n        return (longLineCharCount > smallLineCharCount);\n    }\n    get uri() {\n        return this._associatedResource;\n    }\n    //#region Options\n    getOptions() {\n        this._assertNotDisposed();\n        return this._options;\n    }\n    getFormattingOptions() {\n        return {\n            tabSize: this._options.indentSize,\n            insertSpaces: this._options.insertSpaces\n        };\n    }\n    updateOptions(_newOpts) {\n        this._assertNotDisposed();\n        const tabSize = (typeof _newOpts.tabSize !== 'undefined') ? _newOpts.tabSize : this._options.tabSize;\n        const indentSize = (typeof _newOpts.indentSize !== 'undefined') ? _newOpts.indentSize : this._options.originalIndentSize;\n        const insertSpaces = (typeof _newOpts.insertSpaces !== 'undefined') ? _newOpts.insertSpaces : this._options.insertSpaces;\n        const trimAutoWhitespace = (typeof _newOpts.trimAutoWhitespace !== 'undefined') ? _newOpts.trimAutoWhitespace : this._options.trimAutoWhitespace;\n        const bracketPairColorizationOptions = (typeof _newOpts.bracketColorizationOptions !== 'undefined') ? _newOpts.bracketColorizationOptions : this._options.bracketPairColorizationOptions;\n        const newOpts = new TextModelResolvedOptions({\n            tabSize: tabSize,\n            indentSize: indentSize,\n            insertSpaces: insertSpaces,\n            defaultEOL: this._options.defaultEOL,\n            trimAutoWhitespace: trimAutoWhitespace,\n            bracketPairColorizationOptions,\n        });\n        if (this._options.equals(newOpts)) {\n            return;\n        }\n        const e = this._options.createChangeEvent(newOpts);\n        this._options = newOpts;\n        this._bracketPairs.handleDidChangeOptions(e);\n        this._decorationProvider.handleDidChangeOptions(e);\n        this._onDidChangeOptions.fire(e);\n    }\n    detectIndentation(defaultInsertSpaces, defaultTabSize) {\n        this._assertNotDisposed();\n        const guessedIndentation = guessIndentation(this._buffer, defaultTabSize, defaultInsertSpaces);\n        this.updateOptions({\n            insertSpaces: guessedIndentation.insertSpaces,\n            tabSize: guessedIndentation.tabSize,\n            indentSize: guessedIndentation.tabSize, // TODO@Alex: guess indentSize independent of tabSize\n        });\n    }\n    normalizeIndentation(str) {\n        this._assertNotDisposed();\n        return normalizeIndentation(str, this._options.indentSize, this._options.insertSpaces);\n    }\n    //#endregion\n    //#region Reading\n    getVersionId() {\n        this._assertNotDisposed();\n        return this._versionId;\n    }\n    mightContainRTL() {\n        return this._buffer.mightContainRTL();\n    }\n    mightContainUnusualLineTerminators() {\n        return this._buffer.mightContainUnusualLineTerminators();\n    }\n    removeUnusualLineTerminators(selections = null) {\n        const matches = this.findMatches(UNUSUAL_LINE_TERMINATORS.source, false, true, false, null, false, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */);\n        this._buffer.resetMightContainUnusualLineTerminators();\n        this.pushEditOperations(selections, matches.map(m => ({ range: m.range, text: null })), () => null);\n    }\n    mightContainNonBasicASCII() {\n        return this._buffer.mightContainNonBasicASCII();\n    }\n    getAlternativeVersionId() {\n        this._assertNotDisposed();\n        return this._alternativeVersionId;\n    }\n    getInitialUndoRedoSnapshot() {\n        this._assertNotDisposed();\n        return this._initialUndoRedoSnapshot;\n    }\n    getOffsetAt(rawPosition) {\n        this._assertNotDisposed();\n        const position = this._validatePosition(rawPosition.lineNumber, rawPosition.column, 0 /* StringOffsetValidationType.Relaxed */);\n        return this._buffer.getOffsetAt(position.lineNumber, position.column);\n    }\n    getPositionAt(rawOffset) {\n        this._assertNotDisposed();\n        const offset = (Math.min(this._buffer.getLength(), Math.max(0, rawOffset)));\n        return this._buffer.getPositionAt(offset);\n    }\n    _increaseVersionId() {\n        this._versionId = this._versionId + 1;\n        this._alternativeVersionId = this._versionId;\n    }\n    _overwriteVersionId(versionId) {\n        this._versionId = versionId;\n    }\n    _overwriteAlternativeVersionId(newAlternativeVersionId) {\n        this._alternativeVersionId = newAlternativeVersionId;\n    }\n    _overwriteInitialUndoRedoSnapshot(newInitialUndoRedoSnapshot) {\n        this._initialUndoRedoSnapshot = newInitialUndoRedoSnapshot;\n    }\n    getValue(eol, preserveBOM = false) {\n        this._assertNotDisposed();\n        if (this.isTooLargeForHeapOperation()) {\n            throw new BugIndicatingError('Operation would exceed heap memory limits');\n        }\n        const fullModelRange = this.getFullModelRange();\n        const fullModelValue = this.getValueInRange(fullModelRange, eol);\n        if (preserveBOM) {\n            return this._buffer.getBOM() + fullModelValue;\n        }\n        return fullModelValue;\n    }\n    createSnapshot(preserveBOM = false) {\n        return new TextModelSnapshot(this._buffer.createSnapshot(preserveBOM));\n    }\n    getValueLength(eol, preserveBOM = false) {\n        this._assertNotDisposed();\n        const fullModelRange = this.getFullModelRange();\n        const fullModelValue = this.getValueLengthInRange(fullModelRange, eol);\n        if (preserveBOM) {\n            return this._buffer.getBOM().length + fullModelValue;\n        }\n        return fullModelValue;\n    }\n    getValueInRange(rawRange, eol = 0 /* model.EndOfLinePreference.TextDefined */) {\n        this._assertNotDisposed();\n        return this._buffer.getValueInRange(this.validateRange(rawRange), eol);\n    }\n    getValueLengthInRange(rawRange, eol = 0 /* model.EndOfLinePreference.TextDefined */) {\n        this._assertNotDisposed();\n        return this._buffer.getValueLengthInRange(this.validateRange(rawRange), eol);\n    }\n    getCharacterCountInRange(rawRange, eol = 0 /* model.EndOfLinePreference.TextDefined */) {\n        this._assertNotDisposed();\n        return this._buffer.getCharacterCountInRange(this.validateRange(rawRange), eol);\n    }\n    getLineCount() {\n        this._assertNotDisposed();\n        return this._buffer.getLineCount();\n    }\n    getLineContent(lineNumber) {\n        this._assertNotDisposed();\n        if (lineNumber < 1 || lineNumber > this.getLineCount()) {\n            throw new BugIndicatingError('Illegal value for lineNumber');\n        }\n        return this._buffer.getLineContent(lineNumber);\n    }\n    getLineLength(lineNumber) {\n        this._assertNotDisposed();\n        if (lineNumber < 1 || lineNumber > this.getLineCount()) {\n            throw new BugIndicatingError('Illegal value for lineNumber');\n        }\n        return this._buffer.getLineLength(lineNumber);\n    }\n    getLinesContent() {\n        this._assertNotDisposed();\n        if (this.isTooLargeForHeapOperation()) {\n            throw new BugIndicatingError('Operation would exceed heap memory limits');\n        }\n        return this._buffer.getLinesContent();\n    }\n    getEOL() {\n        this._assertNotDisposed();\n        return this._buffer.getEOL();\n    }\n    getEndOfLineSequence() {\n        this._assertNotDisposed();\n        return (this._buffer.getEOL() === '\\n'\n            ? 0 /* model.EndOfLineSequence.LF */\n            : 1 /* model.EndOfLineSequence.CRLF */);\n    }\n    getLineMinColumn(lineNumber) {\n        this._assertNotDisposed();\n        return 1;\n    }\n    getLineMaxColumn(lineNumber) {\n        this._assertNotDisposed();\n        if (lineNumber < 1 || lineNumber > this.getLineCount()) {\n            throw new BugIndicatingError('Illegal value for lineNumber');\n        }\n        return this._buffer.getLineLength(lineNumber) + 1;\n    }\n    getLineFirstNonWhitespaceColumn(lineNumber) {\n        this._assertNotDisposed();\n        if (lineNumber < 1 || lineNumber > this.getLineCount()) {\n            throw new BugIndicatingError('Illegal value for lineNumber');\n        }\n        return this._buffer.getLineFirstNonWhitespaceColumn(lineNumber);\n    }\n    getLineLastNonWhitespaceColumn(lineNumber) {\n        this._assertNotDisposed();\n        if (lineNumber < 1 || lineNumber > this.getLineCount()) {\n            throw new BugIndicatingError('Illegal value for lineNumber');\n        }\n        return this._buffer.getLineLastNonWhitespaceColumn(lineNumber);\n    }\n    /**\n     * Validates `range` is within buffer bounds, but allows it to sit in between surrogate pairs, etc.\n     * Will try to not allocate if possible.\n     */\n    _validateRangeRelaxedNoAllocations(range) {\n        const linesCount = this._buffer.getLineCount();\n        const initialStartLineNumber = range.startLineNumber;\n        const initialStartColumn = range.startColumn;\n        let startLineNumber = Math.floor((typeof initialStartLineNumber === 'number' && !isNaN(initialStartLineNumber)) ? initialStartLineNumber : 1);\n        let startColumn = Math.floor((typeof initialStartColumn === 'number' && !isNaN(initialStartColumn)) ? initialStartColumn : 1);\n        if (startLineNumber < 1) {\n            startLineNumber = 1;\n            startColumn = 1;\n        }\n        else if (startLineNumber > linesCount) {\n            startLineNumber = linesCount;\n            startColumn = this.getLineMaxColumn(startLineNumber);\n        }\n        else {\n            if (startColumn <= 1) {\n                startColumn = 1;\n            }\n            else {\n                const maxColumn = this.getLineMaxColumn(startLineNumber);\n                if (startColumn >= maxColumn) {\n                    startColumn = maxColumn;\n                }\n            }\n        }\n        const initialEndLineNumber = range.endLineNumber;\n        const initialEndColumn = range.endColumn;\n        let endLineNumber = Math.floor((typeof initialEndLineNumber === 'number' && !isNaN(initialEndLineNumber)) ? initialEndLineNumber : 1);\n        let endColumn = Math.floor((typeof initialEndColumn === 'number' && !isNaN(initialEndColumn)) ? initialEndColumn : 1);\n        if (endLineNumber < 1) {\n            endLineNumber = 1;\n            endColumn = 1;\n        }\n        else if (endLineNumber > linesCount) {\n            endLineNumber = linesCount;\n            endColumn = this.getLineMaxColumn(endLineNumber);\n        }\n        else {\n            if (endColumn <= 1) {\n                endColumn = 1;\n            }\n            else {\n                const maxColumn = this.getLineMaxColumn(endLineNumber);\n                if (endColumn >= maxColumn) {\n                    endColumn = maxColumn;\n                }\n            }\n        }\n        if (initialStartLineNumber === startLineNumber\n            && initialStartColumn === startColumn\n            && initialEndLineNumber === endLineNumber\n            && initialEndColumn === endColumn\n            && range instanceof Range\n            && !(range instanceof Selection)) {\n            return range;\n        }\n        return new Range(startLineNumber, startColumn, endLineNumber, endColumn);\n    }\n    _isValidPosition(lineNumber, column, validationType) {\n        if (typeof lineNumber !== 'number' || typeof column !== 'number') {\n            return false;\n        }\n        if (isNaN(lineNumber) || isNaN(column)) {\n            return false;\n        }\n        if (lineNumber < 1 || column < 1) {\n            return false;\n        }\n        if ((lineNumber | 0) !== lineNumber || (column | 0) !== column) {\n            return false;\n        }\n        const lineCount = this._buffer.getLineCount();\n        if (lineNumber > lineCount) {\n            return false;\n        }\n        if (column === 1) {\n            return true;\n        }\n        const maxColumn = this.getLineMaxColumn(lineNumber);\n        if (column > maxColumn) {\n            return false;\n        }\n        if (validationType === 1 /* StringOffsetValidationType.SurrogatePairs */) {\n            // !!At this point, column > 1\n            const charCodeBefore = this._buffer.getLineCharCode(lineNumber, column - 2);\n            if (isHighSurrogate(charCodeBefore)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    _validatePosition(_lineNumber, _column, validationType) {\n        const lineNumber = Math.floor((typeof _lineNumber === 'number' && !isNaN(_lineNumber)) ? _lineNumber : 1);\n        const column = Math.floor((typeof _column === 'number' && !isNaN(_column)) ? _column : 1);\n        const lineCount = this._buffer.getLineCount();\n        if (lineNumber < 1) {\n            return new Position(1, 1);\n        }\n        if (lineNumber > lineCount) {\n            return new Position(lineCount, this.getLineMaxColumn(lineCount));\n        }\n        if (column <= 1) {\n            return new Position(lineNumber, 1);\n        }\n        const maxColumn = this.getLineMaxColumn(lineNumber);\n        if (column >= maxColumn) {\n            return new Position(lineNumber, maxColumn);\n        }\n        if (validationType === 1 /* StringOffsetValidationType.SurrogatePairs */) {\n            // If the position would end up in the middle of a high-low surrogate pair,\n            // we move it to before the pair\n            // !!At this point, column > 1\n            const charCodeBefore = this._buffer.getLineCharCode(lineNumber, column - 2);\n            if (isHighSurrogate(charCodeBefore)) {\n                return new Position(lineNumber, column - 1);\n            }\n        }\n        return new Position(lineNumber, column);\n    }\n    validatePosition(position) {\n        const validationType = 1 /* StringOffsetValidationType.SurrogatePairs */;\n        this._assertNotDisposed();\n        // Avoid object allocation and cover most likely case\n        if (position instanceof Position) {\n            if (this._isValidPosition(position.lineNumber, position.column, validationType)) {\n                return position;\n            }\n        }\n        return this._validatePosition(position.lineNumber, position.column, validationType);\n    }\n    isValidRange(range) {\n        return this._isValidRange(range, 1 /* StringOffsetValidationType.SurrogatePairs */);\n    }\n    _isValidRange(range, validationType) {\n        const startLineNumber = range.startLineNumber;\n        const startColumn = range.startColumn;\n        const endLineNumber = range.endLineNumber;\n        const endColumn = range.endColumn;\n        if (!this._isValidPosition(startLineNumber, startColumn, 0 /* StringOffsetValidationType.Relaxed */)) {\n            return false;\n        }\n        if (!this._isValidPosition(endLineNumber, endColumn, 0 /* StringOffsetValidationType.Relaxed */)) {\n            return false;\n        }\n        if (validationType === 1 /* StringOffsetValidationType.SurrogatePairs */) {\n            const charCodeBeforeStart = (startColumn > 1 ? this._buffer.getLineCharCode(startLineNumber, startColumn - 2) : 0);\n            const charCodeBeforeEnd = (endColumn > 1 && endColumn <= this._buffer.getLineLength(endLineNumber) ? this._buffer.getLineCharCode(endLineNumber, endColumn - 2) : 0);\n            const startInsideSurrogatePair = isHighSurrogate(charCodeBeforeStart);\n            const endInsideSurrogatePair = isHighSurrogate(charCodeBeforeEnd);\n            if (!startInsideSurrogatePair && !endInsideSurrogatePair) {\n                return true;\n            }\n            return false;\n        }\n        return true;\n    }\n    validateRange(_range) {\n        const validationType = 1 /* StringOffsetValidationType.SurrogatePairs */;\n        this._assertNotDisposed();\n        // Avoid object allocation and cover most likely case\n        if ((_range instanceof Range) && !(_range instanceof Selection)) {\n            if (this._isValidRange(_range, validationType)) {\n                return _range;\n            }\n        }\n        const start = this._validatePosition(_range.startLineNumber, _range.startColumn, 0 /* StringOffsetValidationType.Relaxed */);\n        const end = this._validatePosition(_range.endLineNumber, _range.endColumn, 0 /* StringOffsetValidationType.Relaxed */);\n        const startLineNumber = start.lineNumber;\n        const startColumn = start.column;\n        const endLineNumber = end.lineNumber;\n        const endColumn = end.column;\n        {\n            const charCodeBeforeStart = (startColumn > 1 ? this._buffer.getLineCharCode(startLineNumber, startColumn - 2) : 0);\n            const charCodeBeforeEnd = (endColumn > 1 && endColumn <= this._buffer.getLineLength(endLineNumber) ? this._buffer.getLineCharCode(endLineNumber, endColumn - 2) : 0);\n            const startInsideSurrogatePair = isHighSurrogate(charCodeBeforeStart);\n            const endInsideSurrogatePair = isHighSurrogate(charCodeBeforeEnd);\n            if (!startInsideSurrogatePair && !endInsideSurrogatePair) {\n                return new Range(startLineNumber, startColumn, endLineNumber, endColumn);\n            }\n            if (startLineNumber === endLineNumber && startColumn === endColumn) {\n                // do not expand a collapsed range, simply move it to a valid location\n                return new Range(startLineNumber, startColumn - 1, endLineNumber, endColumn - 1);\n            }\n            if (startInsideSurrogatePair && endInsideSurrogatePair) {\n                // expand range at both ends\n                return new Range(startLineNumber, startColumn - 1, endLineNumber, endColumn + 1);\n            }\n            if (startInsideSurrogatePair) {\n                // only expand range at the start\n                return new Range(startLineNumber, startColumn - 1, endLineNumber, endColumn);\n            }\n            // only expand range at the end\n            return new Range(startLineNumber, startColumn, endLineNumber, endColumn + 1);\n        }\n    }\n    modifyPosition(rawPosition, offset) {\n        this._assertNotDisposed();\n        const candidate = this.getOffsetAt(rawPosition) + offset;\n        return this.getPositionAt(Math.min(this._buffer.getLength(), Math.max(0, candidate)));\n    }\n    getFullModelRange() {\n        this._assertNotDisposed();\n        const lineCount = this.getLineCount();\n        return new Range(1, 1, lineCount, this.getLineMaxColumn(lineCount));\n    }\n    findMatchesLineByLine(searchRange, searchData, captureMatches, limitResultCount) {\n        return this._buffer.findMatchesLineByLine(searchRange, searchData, captureMatches, limitResultCount);\n    }\n    findMatches(searchString, rawSearchScope, isRegex, matchCase, wordSeparators, captureMatches, limitResultCount = LIMIT_FIND_COUNT) {\n        this._assertNotDisposed();\n        let searchRanges = null;\n        if (rawSearchScope !== null && typeof rawSearchScope !== 'boolean') {\n            if (!Array.isArray(rawSearchScope)) {\n                rawSearchScope = [rawSearchScope];\n            }\n            if (rawSearchScope.every((searchScope) => Range.isIRange(searchScope))) {\n                searchRanges = rawSearchScope.map((searchScope) => this.validateRange(searchScope));\n            }\n        }\n        if (searchRanges === null) {\n            searchRanges = [this.getFullModelRange()];\n        }\n        searchRanges = searchRanges.sort((d1, d2) => d1.startLineNumber - d2.startLineNumber || d1.startColumn - d2.startColumn);\n        const uniqueSearchRanges = [];\n        uniqueSearchRanges.push(searchRanges.reduce((prev, curr) => {\n            if (Range.areIntersecting(prev, curr)) {\n                return prev.plusRange(curr);\n            }\n            uniqueSearchRanges.push(prev);\n            return curr;\n        }));\n        let matchMapper;\n        if (!isRegex && searchString.indexOf('\\n') < 0) {\n            // not regex, not multi line\n            const searchParams = new SearchParams(searchString, isRegex, matchCase, wordSeparators);\n            const searchData = searchParams.parseSearchRequest();\n            if (!searchData) {\n                return [];\n            }\n            matchMapper = (searchRange) => this.findMatchesLineByLine(searchRange, searchData, captureMatches, limitResultCount);\n        }\n        else {\n            matchMapper = (searchRange) => TextModelSearch.findMatches(this, new SearchParams(searchString, isRegex, matchCase, wordSeparators), searchRange, captureMatches, limitResultCount);\n        }\n        return uniqueSearchRanges.map(matchMapper).reduce((arr, matches) => arr.concat(matches), []);\n    }\n    findNextMatch(searchString, rawSearchStart, isRegex, matchCase, wordSeparators, captureMatches) {\n        this._assertNotDisposed();\n        const searchStart = this.validatePosition(rawSearchStart);\n        if (!isRegex && searchString.indexOf('\\n') < 0) {\n            const searchParams = new SearchParams(searchString, isRegex, matchCase, wordSeparators);\n            const searchData = searchParams.parseSearchRequest();\n            if (!searchData) {\n                return null;\n            }\n            const lineCount = this.getLineCount();\n            let searchRange = new Range(searchStart.lineNumber, searchStart.column, lineCount, this.getLineMaxColumn(lineCount));\n            let ret = this.findMatchesLineByLine(searchRange, searchData, captureMatches, 1);\n            TextModelSearch.findNextMatch(this, new SearchParams(searchString, isRegex, matchCase, wordSeparators), searchStart, captureMatches);\n            if (ret.length > 0) {\n                return ret[0];\n            }\n            searchRange = new Range(1, 1, searchStart.lineNumber, this.getLineMaxColumn(searchStart.lineNumber));\n            ret = this.findMatchesLineByLine(searchRange, searchData, captureMatches, 1);\n            if (ret.length > 0) {\n                return ret[0];\n            }\n            return null;\n        }\n        return TextModelSearch.findNextMatch(this, new SearchParams(searchString, isRegex, matchCase, wordSeparators), searchStart, captureMatches);\n    }\n    findPreviousMatch(searchString, rawSearchStart, isRegex, matchCase, wordSeparators, captureMatches) {\n        this._assertNotDisposed();\n        const searchStart = this.validatePosition(rawSearchStart);\n        return TextModelSearch.findPreviousMatch(this, new SearchParams(searchString, isRegex, matchCase, wordSeparators), searchStart, captureMatches);\n    }\n    //#endregion\n    //#region Editing\n    pushStackElement() {\n        this._commandManager.pushStackElement();\n    }\n    popStackElement() {\n        this._commandManager.popStackElement();\n    }\n    pushEOL(eol) {\n        const currentEOL = (this.getEOL() === '\\n' ? 0 /* model.EndOfLineSequence.LF */ : 1 /* model.EndOfLineSequence.CRLF */);\n        if (currentEOL === eol) {\n            return;\n        }\n        try {\n            this._onDidChangeDecorations.beginDeferredEmit();\n            this._eventEmitter.beginDeferredEmit();\n            if (this._initialUndoRedoSnapshot === null) {\n                this._initialUndoRedoSnapshot = this._undoRedoService.createSnapshot(this.uri);\n            }\n            this._commandManager.pushEOL(eol);\n        }\n        finally {\n            this._eventEmitter.endDeferredEmit();\n            this._onDidChangeDecorations.endDeferredEmit();\n        }\n    }\n    _validateEditOperation(rawOperation) {\n        if (rawOperation instanceof ValidAnnotatedEditOperation) {\n            return rawOperation;\n        }\n        return new ValidAnnotatedEditOperation(rawOperation.identifier || null, this.validateRange(rawOperation.range), rawOperation.text, rawOperation.forceMoveMarkers || false, rawOperation.isAutoWhitespaceEdit || false, rawOperation._isTracked || false);\n    }\n    _validateEditOperations(rawOperations) {\n        const result = [];\n        for (let i = 0, len = rawOperations.length; i < len; i++) {\n            result[i] = this._validateEditOperation(rawOperations[i]);\n        }\n        return result;\n    }\n    pushEditOperations(beforeCursorState, editOperations, cursorStateComputer, group, reason) {\n        try {\n            this._onDidChangeDecorations.beginDeferredEmit();\n            this._eventEmitter.beginDeferredEmit();\n            return this._pushEditOperations(beforeCursorState, this._validateEditOperations(editOperations), cursorStateComputer, group, reason);\n        }\n        finally {\n            this._eventEmitter.endDeferredEmit();\n            this._onDidChangeDecorations.endDeferredEmit();\n        }\n    }\n    _pushEditOperations(beforeCursorState, editOperations, cursorStateComputer, group, reason) {\n        if (this._options.trimAutoWhitespace && this._trimAutoWhitespaceLines) {\n            // Go through each saved line number and insert a trim whitespace edit\n            // if it is safe to do so (no conflicts with other edits).\n            const incomingEdits = editOperations.map((op) => {\n                return {\n                    range: this.validateRange(op.range),\n                    text: op.text\n                };\n            });\n            // Sometimes, auto-formatters change ranges automatically which can cause undesired auto whitespace trimming near the cursor\n            // We'll use the following heuristic: if the edits occur near the cursor, then it's ok to trim auto whitespace\n            let editsAreNearCursors = true;\n            if (beforeCursorState) {\n                for (let i = 0, len = beforeCursorState.length; i < len; i++) {\n                    const sel = beforeCursorState[i];\n                    let foundEditNearSel = false;\n                    for (let j = 0, lenJ = incomingEdits.length; j < lenJ; j++) {\n                        const editRange = incomingEdits[j].range;\n                        const selIsAbove = editRange.startLineNumber > sel.endLineNumber;\n                        const selIsBelow = sel.startLineNumber > editRange.endLineNumber;\n                        if (!selIsAbove && !selIsBelow) {\n                            foundEditNearSel = true;\n                            break;\n                        }\n                    }\n                    if (!foundEditNearSel) {\n                        editsAreNearCursors = false;\n                        break;\n                    }\n                }\n            }\n            if (editsAreNearCursors) {\n                for (let i = 0, len = this._trimAutoWhitespaceLines.length; i < len; i++) {\n                    const trimLineNumber = this._trimAutoWhitespaceLines[i];\n                    const maxLineColumn = this.getLineMaxColumn(trimLineNumber);\n                    let allowTrimLine = true;\n                    for (let j = 0, lenJ = incomingEdits.length; j < lenJ; j++) {\n                        const editRange = incomingEdits[j].range;\n                        const editText = incomingEdits[j].text;\n                        if (trimLineNumber < editRange.startLineNumber || trimLineNumber > editRange.endLineNumber) {\n                            // `trimLine` is completely outside this edit\n                            continue;\n                        }\n                        // At this point:\n                        //   editRange.startLineNumber <= trimLine <= editRange.endLineNumber\n                        if (trimLineNumber === editRange.startLineNumber && editRange.startColumn === maxLineColumn\n                            && editRange.isEmpty() && editText && editText.length > 0 && editText.charAt(0) === '\\n') {\n                            // This edit inserts a new line (and maybe other text) after `trimLine`\n                            continue;\n                        }\n                        if (trimLineNumber === editRange.startLineNumber && editRange.startColumn === 1\n                            && editRange.isEmpty() && editText && editText.length > 0 && editText.charAt(editText.length - 1) === '\\n') {\n                            // This edit inserts a new line (and maybe other text) before `trimLine`\n                            continue;\n                        }\n                        // Looks like we can't trim this line as it would interfere with an incoming edit\n                        allowTrimLine = false;\n                        break;\n                    }\n                    if (allowTrimLine) {\n                        const trimRange = new Range(trimLineNumber, 1, trimLineNumber, maxLineColumn);\n                        editOperations.push(new ValidAnnotatedEditOperation(null, trimRange, null, false, false, false));\n                    }\n                }\n            }\n            this._trimAutoWhitespaceLines = null;\n        }\n        if (this._initialUndoRedoSnapshot === null) {\n            this._initialUndoRedoSnapshot = this._undoRedoService.createSnapshot(this.uri);\n        }\n        return this._commandManager.pushEditOperation(beforeCursorState, editOperations, cursorStateComputer, group, reason);\n    }\n    _applyUndo(changes, eol, resultingAlternativeVersionId, resultingSelection) {\n        const edits = changes.map((change) => {\n            const rangeStart = this.getPositionAt(change.newPosition);\n            const rangeEnd = this.getPositionAt(change.newEnd);\n            return {\n                range: new Range(rangeStart.lineNumber, rangeStart.column, rangeEnd.lineNumber, rangeEnd.column),\n                text: change.oldText\n            };\n        });\n        this._applyUndoRedoEdits(edits, eol, true, false, resultingAlternativeVersionId, resultingSelection);\n    }\n    _applyRedo(changes, eol, resultingAlternativeVersionId, resultingSelection) {\n        const edits = changes.map((change) => {\n            const rangeStart = this.getPositionAt(change.oldPosition);\n            const rangeEnd = this.getPositionAt(change.oldEnd);\n            return {\n                range: new Range(rangeStart.lineNumber, rangeStart.column, rangeEnd.lineNumber, rangeEnd.column),\n                text: change.newText\n            };\n        });\n        this._applyUndoRedoEdits(edits, eol, false, true, resultingAlternativeVersionId, resultingSelection);\n    }\n    _applyUndoRedoEdits(edits, eol, isUndoing, isRedoing, resultingAlternativeVersionId, resultingSelection) {\n        try {\n            this._onDidChangeDecorations.beginDeferredEmit();\n            this._eventEmitter.beginDeferredEmit();\n            this._isUndoing = isUndoing;\n            this._isRedoing = isRedoing;\n            this.applyEdits(edits, false);\n            this.setEOL(eol);\n            this._overwriteAlternativeVersionId(resultingAlternativeVersionId);\n        }\n        finally {\n            this._isUndoing = false;\n            this._isRedoing = false;\n            this._eventEmitter.endDeferredEmit(resultingSelection);\n            this._onDidChangeDecorations.endDeferredEmit();\n        }\n    }\n    applyEdits(rawOperations, computeUndoEdits, reason) {\n        try {\n            this._onDidChangeDecorations.beginDeferredEmit();\n            this._eventEmitter.beginDeferredEmit();\n            const operations = this._validateEditOperations(rawOperations);\n            return this._doApplyEdits(operations, computeUndoEdits ?? false, reason ?? EditSources.applyEdits());\n        }\n        finally {\n            this._eventEmitter.endDeferredEmit();\n            this._onDidChangeDecorations.endDeferredEmit();\n        }\n    }\n    _doApplyEdits(rawOperations, computeUndoEdits, reason) {\n        const oldLineCount = this._buffer.getLineCount();\n        const result = this._buffer.applyEdits(rawOperations, this._options.trimAutoWhitespace, computeUndoEdits);\n        const newLineCount = this._buffer.getLineCount();\n        const contentChanges = result.changes;\n        this._trimAutoWhitespaceLines = result.trimAutoWhitespaceLineNumbers;\n        if (contentChanges.length !== 0) {\n            // We do a first pass to update decorations\n            // because we want to read decorations in the second pass\n            // where we will emit content change events\n            // and we want to read the final decorations\n            for (let i = 0, len = contentChanges.length; i < len; i++) {\n                const change = contentChanges[i];\n                this._decorationsTree.acceptReplace(change.rangeOffset, change.rangeLength, change.text.length, change.forceMoveMarkers);\n            }\n            const rawContentChanges = [];\n            this._increaseVersionId();\n            let lineCount = oldLineCount;\n            for (let i = 0, len = contentChanges.length; i < len; i++) {\n                const change = contentChanges[i];\n                const [eolCount] = countEOL(change.text);\n                this._onDidChangeDecorations.fire();\n                const startLineNumber = change.range.startLineNumber;\n                const endLineNumber = change.range.endLineNumber;\n                const deletingLinesCnt = endLineNumber - startLineNumber;\n                const insertingLinesCnt = eolCount;\n                const editingLinesCnt = Math.min(deletingLinesCnt, insertingLinesCnt);\n                const changeLineCountDelta = (insertingLinesCnt - deletingLinesCnt);\n                const currentEditStartLineNumber = newLineCount - lineCount - changeLineCountDelta + startLineNumber;\n                const firstEditLineNumber = currentEditStartLineNumber;\n                const lastInsertedLineNumber = currentEditStartLineNumber + insertingLinesCnt;\n                const decorationsWithInjectedTextInEditedRange = this._decorationsTree.getInjectedTextInInterval(this, this.getOffsetAt(new Position(firstEditLineNumber, 1)), this.getOffsetAt(new Position(lastInsertedLineNumber, this.getLineMaxColumn(lastInsertedLineNumber))), 0);\n                const injectedTextInEditedRange = LineInjectedText.fromDecorations(decorationsWithInjectedTextInEditedRange);\n                const injectedTextInEditedRangeQueue = new ArrayQueue(injectedTextInEditedRange);\n                for (let j = editingLinesCnt; j >= 0; j--) {\n                    const editLineNumber = startLineNumber + j;\n                    const currentEditLineNumber = currentEditStartLineNumber + j;\n                    injectedTextInEditedRangeQueue.takeFromEndWhile(r => r.lineNumber > currentEditLineNumber);\n                    const decorationsInCurrentLine = injectedTextInEditedRangeQueue.takeFromEndWhile(r => r.lineNumber === currentEditLineNumber);\n                    rawContentChanges.push(new ModelRawLineChanged(editLineNumber, this.getLineContent(currentEditLineNumber), decorationsInCurrentLine));\n                }\n                if (editingLinesCnt < deletingLinesCnt) {\n                    // Must delete some lines\n                    const spliceStartLineNumber = startLineNumber + editingLinesCnt;\n                    rawContentChanges.push(new ModelRawLinesDeleted(spliceStartLineNumber + 1, endLineNumber));\n                }\n                if (editingLinesCnt < insertingLinesCnt) {\n                    const injectedTextInEditedRangeQueue = new ArrayQueue(injectedTextInEditedRange);\n                    // Must insert some lines\n                    const spliceLineNumber = startLineNumber + editingLinesCnt;\n                    const cnt = insertingLinesCnt - editingLinesCnt;\n                    const fromLineNumber = newLineCount - lineCount - cnt + spliceLineNumber + 1;\n                    const injectedTexts = [];\n                    const newLines = [];\n                    for (let i = 0; i < cnt; i++) {\n                        const lineNumber = fromLineNumber + i;\n                        newLines[i] = this.getLineContent(lineNumber);\n                        injectedTextInEditedRangeQueue.takeWhile(r => r.lineNumber < lineNumber);\n                        injectedTexts[i] = injectedTextInEditedRangeQueue.takeWhile(r => r.lineNumber === lineNumber);\n                    }\n                    rawContentChanges.push(new ModelRawLinesInserted(spliceLineNumber + 1, startLineNumber + insertingLinesCnt, newLines, injectedTexts));\n                }\n                lineCount += changeLineCountDelta;\n            }\n            this._emitContentChangedEvent(new ModelRawContentChangedEvent(rawContentChanges, this.getVersionId(), this._isUndoing, this._isRedoing), {\n                changes: contentChanges,\n                eol: this._buffer.getEOL(),\n                isEolChange: false,\n                versionId: this.getVersionId(),\n                isUndoing: this._isUndoing,\n                isRedoing: this._isRedoing,\n                isFlush: false,\n                detailedReasons: [reason],\n                detailedReasonsChangeLengths: [contentChanges.length],\n            });\n        }\n        return (result.reverseEdits === null ? undefined : result.reverseEdits);\n    }\n    undo() {\n        return this._undoRedoService.undo(this.uri);\n    }\n    canUndo() {\n        return this._undoRedoService.canUndo(this.uri);\n    }\n    redo() {\n        return this._undoRedoService.redo(this.uri);\n    }\n    canRedo() {\n        return this._undoRedoService.canRedo(this.uri);\n    }\n    //#endregion\n    //#region Decorations\n    handleBeforeFireDecorationsChangedEvent(affectedInjectedTextLines, affectedLineHeights, affectedFontLines) {\n        // This is called before the decoration changed event is fired.\n        if (affectedInjectedTextLines && affectedInjectedTextLines.size > 0) {\n            const affectedLines = Array.from(affectedInjectedTextLines);\n            const lineChangeEvents = affectedLines.map(lineNumber => new ModelRawLineChanged(lineNumber, this.getLineContent(lineNumber), this._getInjectedTextInLine(lineNumber)));\n            this._onDidChangeInjectedText.fire(new ModelInjectedTextChangedEvent(lineChangeEvents));\n        }\n        if (affectedLineHeights && affectedLineHeights.size > 0) {\n            const affectedLines = Array.from(affectedLineHeights);\n            const lineHeightChangeEvent = affectedLines.map(specialLineHeightChange => new ModelLineHeightChanged(specialLineHeightChange.ownerId, specialLineHeightChange.decorationId, specialLineHeightChange.lineNumber, specialLineHeightChange.lineHeight));\n            this._onDidChangeLineHeight.fire(new ModelLineHeightChangedEvent(lineHeightChangeEvent));\n        }\n        if (affectedFontLines && affectedFontLines.size > 0) {\n            const affectedLines = Array.from(affectedFontLines);\n            const fontChangeEvent = affectedLines.map(fontChange => new ModelFontChanged(fontChange.ownerId, fontChange.lineNumber));\n            this._onDidChangeFont.fire(new ModelFontChangedEvent(fontChangeEvent));\n        }\n    }\n    changeDecorations(callback, ownerId = 0) {\n        this._assertNotDisposed();\n        try {\n            this._onDidChangeDecorations.beginDeferredEmit();\n            return this._changeDecorations(ownerId, callback);\n        }\n        finally {\n            this._onDidChangeDecorations.endDeferredEmit();\n        }\n    }\n    _changeDecorations(ownerId, callback) {\n        const changeAccessor = {\n            addDecoration: (range, options) => {\n                return this._deltaDecorationsImpl(ownerId, [], [{ range: range, options: options }])[0];\n            },\n            changeDecoration: (id, newRange) => {\n                this._changeDecorationImpl(ownerId, id, newRange);\n            },\n            changeDecorationOptions: (id, options) => {\n                this._changeDecorationOptionsImpl(ownerId, id, _normalizeOptions(options));\n            },\n            removeDecoration: (id) => {\n                this._deltaDecorationsImpl(ownerId, [id], []);\n            },\n            deltaDecorations: (oldDecorations, newDecorations) => {\n                if (oldDecorations.length === 0 && newDecorations.length === 0) {\n                    // nothing to do\n                    return [];\n                }\n                return this._deltaDecorationsImpl(ownerId, oldDecorations, newDecorations);\n            }\n        };\n        let result = null;\n        try {\n            result = callback(changeAccessor);\n        }\n        catch (e) {\n            onUnexpectedError(e);\n        }\n        // Invalidate change accessor\n        changeAccessor.addDecoration = invalidFunc;\n        changeAccessor.changeDecoration = invalidFunc;\n        changeAccessor.changeDecorationOptions = invalidFunc;\n        changeAccessor.removeDecoration = invalidFunc;\n        changeAccessor.deltaDecorations = invalidFunc;\n        return result;\n    }\n    deltaDecorations(oldDecorations, newDecorations, ownerId = 0) {\n        this._assertNotDisposed();\n        if (!oldDecorations) {\n            oldDecorations = [];\n        }\n        if (oldDecorations.length === 0 && newDecorations.length === 0) {\n            // nothing to do\n            return [];\n        }\n        try {\n            this._deltaDecorationCallCnt++;\n            if (this._deltaDecorationCallCnt > 1) {\n                console.warn(`Invoking deltaDecorations recursively could lead to leaking decorations.`);\n                onUnexpectedError(new Error(`Invoking deltaDecorations recursively could lead to leaking decorations.`));\n            }\n            this._onDidChangeDecorations.beginDeferredEmit();\n            return this._deltaDecorationsImpl(ownerId, oldDecorations, newDecorations);\n        }\n        finally {\n            this._onDidChangeDecorations.endDeferredEmit();\n            this._deltaDecorationCallCnt--;\n        }\n    }\n    _getTrackedRange(id) {\n        return this.getDecorationRange(id);\n    }\n    _setTrackedRange(id, newRange, newStickiness) {\n        const node = (id ? this._decorations[id] : null);\n        if (!node) {\n            if (!newRange) {\n                // node doesn't exist, the request is to delete => nothing to do\n                return null;\n            }\n            // node doesn't exist, the request is to set => add the tracked range\n            return this._deltaDecorationsImpl(0, [], [{ range: newRange, options: TRACKED_RANGE_OPTIONS[newStickiness] }], true)[0];\n        }\n        if (!newRange) {\n            // node exists, the request is to delete => delete node\n            this._decorationsTree.delete(node);\n            delete this._decorations[node.id];\n            return null;\n        }\n        // node exists, the request is to set => change the tracked range and its options\n        const range = this._validateRangeRelaxedNoAllocations(newRange);\n        const startOffset = this._buffer.getOffsetAt(range.startLineNumber, range.startColumn);\n        const endOffset = this._buffer.getOffsetAt(range.endLineNumber, range.endColumn);\n        this._decorationsTree.delete(node);\n        node.reset(this.getVersionId(), startOffset, endOffset, range);\n        node.setOptions(TRACKED_RANGE_OPTIONS[newStickiness]);\n        this._decorationsTree.insert(node);\n        return node.id;\n    }\n    removeAllDecorationsWithOwnerId(ownerId) {\n        if (this._isDisposed) {\n            return;\n        }\n        const nodes = this._decorationsTree.collectNodesFromOwner(ownerId);\n        for (let i = 0, len = nodes.length; i < len; i++) {\n            const node = nodes[i];\n            this._decorationsTree.delete(node);\n            delete this._decorations[node.id];\n        }\n    }\n    getDecorationOptions(decorationId) {\n        const node = this._decorations[decorationId];\n        if (!node) {\n            return null;\n        }\n        return node.options;\n    }\n    getDecorationRange(decorationId) {\n        const node = this._decorations[decorationId];\n        if (!node) {\n            return null;\n        }\n        return this._decorationsTree.getNodeRange(this, node);\n    }\n    getLineDecorations(lineNumber, ownerId = 0, filterOutValidation = false, filterFontDecorations = false) {\n        if (lineNumber < 1 || lineNumber > this.getLineCount()) {\n            return [];\n        }\n        return this.getLinesDecorations(lineNumber, lineNumber, ownerId, filterOutValidation, filterFontDecorations);\n    }\n    getLinesDecorations(_startLineNumber, _endLineNumber, ownerId = 0, filterOutValidation = false, filterFontDecorations = false, onlyMarginDecorations = false) {\n        const lineCount = this.getLineCount();\n        const startLineNumber = Math.min(lineCount, Math.max(1, _startLineNumber));\n        const endLineNumber = Math.min(lineCount, Math.max(1, _endLineNumber));\n        const endColumn = this.getLineMaxColumn(endLineNumber);\n        const range = new Range(startLineNumber, 1, endLineNumber, endColumn);\n        const decorations = this._getDecorationsInRange(range, ownerId, filterOutValidation, filterFontDecorations, onlyMarginDecorations);\n        pushMany(decorations, this._decorationProvider.getDecorationsInRange(range, ownerId, filterOutValidation));\n        return decorations;\n    }\n    getDecorationsInRange(range, ownerId = 0, filterOutValidation = false, filterFontDecorations = false, onlyMinimapDecorations = false, onlyMarginDecorations = false) {\n        const validatedRange = this.validateRange(range);\n        const decorations = this._getDecorationsInRange(validatedRange, ownerId, filterOutValidation, filterFontDecorations, onlyMarginDecorations);\n        pushMany(decorations, this._decorationProvider.getDecorationsInRange(validatedRange, ownerId, filterOutValidation, onlyMinimapDecorations));\n        return decorations;\n    }\n    getOverviewRulerDecorations(ownerId = 0, filterOutValidation = false, filterFontDecorations = false) {\n        return this._decorationsTree.getAll(this, ownerId, filterOutValidation, filterFontDecorations, true, false);\n    }\n    getInjectedTextDecorations(ownerId = 0) {\n        return this._decorationsTree.getAllInjectedText(this, ownerId);\n    }\n    getCustomLineHeightsDecorations(ownerId = 0) {\n        return this._decorationsTree.getAllCustomLineHeights(this, ownerId);\n    }\n    _getInjectedTextInLine(lineNumber) {\n        const startOffset = this._buffer.getOffsetAt(lineNumber, 1);\n        const endOffset = startOffset + this._buffer.getLineLength(lineNumber);\n        const result = this._decorationsTree.getInjectedTextInInterval(this, startOffset, endOffset, 0);\n        return LineInjectedText.fromDecorations(result).filter(t => t.lineNumber === lineNumber);\n    }\n    getFontDecorationsInRange(range, ownerId = 0) {\n        const startOffset = this._buffer.getOffsetAt(range.startLineNumber, range.startColumn);\n        const endOffset = this._buffer.getOffsetAt(range.endLineNumber, range.endColumn);\n        return this._decorationsTree.getFontDecorationsInInterval(this, startOffset, endOffset, ownerId);\n    }\n    getAllDecorations(ownerId = 0, filterOutValidation = false, filterFontDecorations = false) {\n        let result = this._decorationsTree.getAll(this, ownerId, filterOutValidation, filterFontDecorations, false, false);\n        result = result.concat(this._decorationProvider.getAllDecorations(ownerId, filterOutValidation));\n        return result;\n    }\n    getAllMarginDecorations(ownerId = 0) {\n        return this._decorationsTree.getAll(this, ownerId, false, false, false, true);\n    }\n    _getDecorationsInRange(filterRange, filterOwnerId, filterOutValidation, filterFontDecorations, onlyMarginDecorations) {\n        const startOffset = this._buffer.getOffsetAt(filterRange.startLineNumber, filterRange.startColumn);\n        const endOffset = this._buffer.getOffsetAt(filterRange.endLineNumber, filterRange.endColumn);\n        return this._decorationsTree.getAllInInterval(this, startOffset, endOffset, filterOwnerId, filterOutValidation, filterFontDecorations, onlyMarginDecorations);\n    }\n    getRangeAt(start, end) {\n        return this._buffer.getRangeAt(start, end - start);\n    }\n    _changeDecorationImpl(ownerId, decorationId, _range) {\n        const node = this._decorations[decorationId];\n        if (!node) {\n            return;\n        }\n        if (node.options.after) {\n            const oldRange = this.getDecorationRange(decorationId);\n            this._onDidChangeDecorations.recordLineAffectedByInjectedText(oldRange.endLineNumber);\n        }\n        if (node.options.before) {\n            const oldRange = this.getDecorationRange(decorationId);\n            this._onDidChangeDecorations.recordLineAffectedByInjectedText(oldRange.startLineNumber);\n        }\n        if (node.options.lineHeight !== null) {\n            const oldRange = this.getDecorationRange(decorationId);\n            this._onDidChangeDecorations.recordLineAffectedByLineHeightChange(ownerId, decorationId, oldRange.startLineNumber, null);\n        }\n        if (node.options.affectsFont) {\n            const oldRange = this.getDecorationRange(decorationId);\n            this._onDidChangeDecorations.recordLineAffectedByFontChange(ownerId, node.id, oldRange.startLineNumber);\n        }\n        const range = this._validateRangeRelaxedNoAllocations(_range);\n        const startOffset = this._buffer.getOffsetAt(range.startLineNumber, range.startColumn);\n        const endOffset = this._buffer.getOffsetAt(range.endLineNumber, range.endColumn);\n        this._decorationsTree.delete(node);\n        node.reset(this.getVersionId(), startOffset, endOffset, range);\n        this._decorationsTree.insert(node);\n        this._onDidChangeDecorations.checkAffectedAndFire(node.options);\n        if (node.options.after) {\n            this._onDidChangeDecorations.recordLineAffectedByInjectedText(range.endLineNumber);\n        }\n        if (node.options.before) {\n            this._onDidChangeDecorations.recordLineAffectedByInjectedText(range.startLineNumber);\n        }\n        if (node.options.lineHeight !== null) {\n            this._onDidChangeDecorations.recordLineAffectedByLineHeightChange(ownerId, decorationId, range.startLineNumber, node.options.lineHeight);\n        }\n        if (node.options.affectsFont) {\n            this._onDidChangeDecorations.recordLineAffectedByFontChange(ownerId, node.id, range.startLineNumber);\n        }\n    }\n    _changeDecorationOptionsImpl(ownerId, decorationId, options) {\n        const node = this._decorations[decorationId];\n        if (!node) {\n            return;\n        }\n        const nodeWasInOverviewRuler = (node.options.overviewRuler && node.options.overviewRuler.color ? true : false);\n        const nodeIsInOverviewRuler = (options.overviewRuler && options.overviewRuler.color ? true : false);\n        this._onDidChangeDecorations.checkAffectedAndFire(node.options);\n        this._onDidChangeDecorations.checkAffectedAndFire(options);\n        if (node.options.after || options.after) {\n            const nodeRange = this._decorationsTree.getNodeRange(this, node);\n            this._onDidChangeDecorations.recordLineAffectedByInjectedText(nodeRange.endLineNumber);\n        }\n        if (node.options.before || options.before) {\n            const nodeRange = this._decorationsTree.getNodeRange(this, node);\n            this._onDidChangeDecorations.recordLineAffectedByInjectedText(nodeRange.startLineNumber);\n        }\n        if (node.options.lineHeight !== null || options.lineHeight !== null) {\n            const nodeRange = this._decorationsTree.getNodeRange(this, node);\n            this._onDidChangeDecorations.recordLineAffectedByLineHeightChange(ownerId, decorationId, nodeRange.startLineNumber, options.lineHeight);\n        }\n        if (node.options.affectsFont || options.affectsFont) {\n            const nodeRange = this._decorationsTree.getNodeRange(this, node);\n            this._onDidChangeDecorations.recordLineAffectedByFontChange(ownerId, decorationId, nodeRange.startLineNumber);\n        }\n        const movedInOverviewRuler = nodeWasInOverviewRuler !== nodeIsInOverviewRuler;\n        const changedWhetherInjectedText = isOptionsInjectedText(options) !== isNodeInjectedText(node);\n        if (movedInOverviewRuler || changedWhetherInjectedText) {\n            this._decorationsTree.delete(node);\n            node.setOptions(options);\n            this._decorationsTree.insert(node);\n        }\n        else {\n            node.setOptions(options);\n        }\n    }\n    _deltaDecorationsImpl(ownerId, oldDecorationsIds, newDecorations, suppressEvents = false) {\n        const versionId = this.getVersionId();\n        const oldDecorationsLen = oldDecorationsIds.length;\n        let oldDecorationIndex = 0;\n        const newDecorationsLen = newDecorations.length;\n        let newDecorationIndex = 0;\n        this._onDidChangeDecorations.beginDeferredEmit();\n        try {\n            const result = new Array(newDecorationsLen);\n            while (oldDecorationIndex < oldDecorationsLen || newDecorationIndex < newDecorationsLen) {\n                let node = null;\n                if (oldDecorationIndex < oldDecorationsLen) {\n                    // (1) get ourselves an old node\n                    let decorationId;\n                    do {\n                        decorationId = oldDecorationsIds[oldDecorationIndex++];\n                        node = this._decorations[decorationId];\n                    } while (!node && oldDecorationIndex < oldDecorationsLen);\n                    // (2) remove the node from the tree (if it exists)\n                    if (node) {\n                        if (node.options.after) {\n                            const nodeRange = this._decorationsTree.getNodeRange(this, node);\n                            this._onDidChangeDecorations.recordLineAffectedByInjectedText(nodeRange.endLineNumber);\n                        }\n                        if (node.options.before) {\n                            const nodeRange = this._decorationsTree.getNodeRange(this, node);\n                            this._onDidChangeDecorations.recordLineAffectedByInjectedText(nodeRange.startLineNumber);\n                        }\n                        if (node.options.lineHeight !== null) {\n                            const nodeRange = this._decorationsTree.getNodeRange(this, node);\n                            this._onDidChangeDecorations.recordLineAffectedByLineHeightChange(ownerId, decorationId, nodeRange.startLineNumber, null);\n                        }\n                        if (node.options.affectsFont) {\n                            const nodeRange = this._decorationsTree.getNodeRange(this, node);\n                            this._onDidChangeDecorations.recordLineAffectedByFontChange(ownerId, decorationId, nodeRange.startLineNumber);\n                        }\n                        this._decorationsTree.delete(node);\n                        if (!suppressEvents) {\n                            this._onDidChangeDecorations.checkAffectedAndFire(node.options);\n                        }\n                    }\n                }\n                if (newDecorationIndex < newDecorationsLen) {\n                    // (3) create a new node if necessary\n                    if (!node) {\n                        const internalDecorationId = (++this._lastDecorationId);\n                        const decorationId = `${this._instanceId};${internalDecorationId}`;\n                        node = new IntervalNode(decorationId, 0, 0);\n                        this._decorations[decorationId] = node;\n                    }\n                    // (4) initialize node\n                    const newDecoration = newDecorations[newDecorationIndex];\n                    const range = this._validateRangeRelaxedNoAllocations(newDecoration.range);\n                    const options = _normalizeOptions(newDecoration.options);\n                    const startOffset = this._buffer.getOffsetAt(range.startLineNumber, range.startColumn);\n                    const endOffset = this._buffer.getOffsetAt(range.endLineNumber, range.endColumn);\n                    node.ownerId = ownerId;\n                    node.reset(versionId, startOffset, endOffset, range);\n                    node.setOptions(options);\n                    if (node.options.after) {\n                        this._onDidChangeDecorations.recordLineAffectedByInjectedText(range.endLineNumber);\n                    }\n                    if (node.options.before) {\n                        this._onDidChangeDecorations.recordLineAffectedByInjectedText(range.startLineNumber);\n                    }\n                    if (node.options.lineHeight !== null) {\n                        this._onDidChangeDecorations.recordLineAffectedByLineHeightChange(ownerId, node.id, range.startLineNumber, node.options.lineHeight);\n                    }\n                    if (node.options.affectsFont) {\n                        this._onDidChangeDecorations.recordLineAffectedByFontChange(ownerId, node.id, range.startLineNumber);\n                    }\n                    if (!suppressEvents) {\n                        this._onDidChangeDecorations.checkAffectedAndFire(options);\n                    }\n                    this._decorationsTree.insert(node);\n                    result[newDecorationIndex] = node.id;\n                    newDecorationIndex++;\n                }\n                else {\n                    if (node) {\n                        delete this._decorations[node.id];\n                    }\n                }\n            }\n            return result;\n        }\n        finally {\n            this._onDidChangeDecorations.endDeferredEmit();\n        }\n    }\n    //#endregion\n    //#region Tokenization\n    // TODO move them to the tokenization part.\n    getLanguageId() {\n        return this.tokenization.getLanguageId();\n    }\n    setLanguage(languageIdOrSelection, source) {\n        if (typeof languageIdOrSelection === 'string') {\n            this._languageSelectionListener.clear();\n            this._setLanguage(languageIdOrSelection, source);\n        }\n        else {\n            this._languageSelectionListener.value = languageIdOrSelection.onDidChange(() => this._setLanguage(languageIdOrSelection.languageId, source));\n            this._setLanguage(languageIdOrSelection.languageId, source);\n        }\n    }\n    _setLanguage(languageId, source) {\n        this.tokenization.setLanguageId(languageId, source);\n        this._languageService.requestRichLanguageFeatures(languageId);\n    }\n    getLanguageIdAtPosition(lineNumber, column) {\n        return this.tokenization.getLanguageIdAtPosition(lineNumber, column);\n    }\n    getWordAtPosition(position) {\n        return this._tokenizationTextModelPart.getWordAtPosition(position);\n    }\n    getWordUntilPosition(position) {\n        return this._tokenizationTextModelPart.getWordUntilPosition(position);\n    }\n    //#endregion\n    normalizePosition(position, affinity) {\n        return position;\n    }\n    /**\n     * Gets the column at which indentation stops at a given line.\n     * @internal\n    */\n    getLineIndentColumn(lineNumber) {\n        // Columns start with 1.\n        return indentOfLine(this.getLineContent(lineNumber)) + 1;\n    }\n    toString() {\n        return `TextModel(${this.uri.toString()})`;\n    }\n};\nTextModel = TextModel_1 = __decorate([\n    __param(4, IUndoRedoService),\n    __param(5, ILanguageService),\n    __param(6, ILanguageConfigurationService),\n    __param(7, IInstantiationService)\n], TextModel);\nfunction indentOfLine(line) {\n    let indent = 0;\n    for (const c of line) {\n        if (c === ' ' || c === '\\t') {\n            indent++;\n        }\n        else {\n            break;\n        }\n    }\n    return indent;\n}\n//#region Decorations\nfunction isNodeInOverviewRuler(node) {\n    return (node.options.overviewRuler && node.options.overviewRuler.color ? true : false);\n}\nfunction isOptionsInjectedText(options) {\n    return !!options.after || !!options.before;\n}\nfunction isNodeInjectedText(node) {\n    return !!node.options.after || !!node.options.before;\n}\nclass DecorationsTrees {\n    constructor() {\n        this._decorationsTree0 = new IntervalTree();\n        this._decorationsTree1 = new IntervalTree();\n        this._injectedTextDecorationsTree = new IntervalTree();\n    }\n    ensureAllNodesHaveRanges(host) {\n        this.getAll(host, 0, false, false, false, false);\n    }\n    _ensureNodesHaveRanges(host, nodes) {\n        for (const node of nodes) {\n            if (node.range === null) {\n                node.range = host.getRangeAt(node.cachedAbsoluteStart, node.cachedAbsoluteEnd);\n            }\n        }\n        return nodes;\n    }\n    getAllInInterval(host, start, end, filterOwnerId, filterOutValidation, filterFontDecorations, onlyMarginDecorations) {\n        const versionId = host.getVersionId();\n        const result = this._intervalSearch(start, end, filterOwnerId, filterOutValidation, filterFontDecorations, versionId, onlyMarginDecorations);\n        return this._ensureNodesHaveRanges(host, result);\n    }\n    _intervalSearch(start, end, filterOwnerId, filterOutValidation, filterFontDecorations, cachedVersionId, onlyMarginDecorations) {\n        const r0 = this._decorationsTree0.intervalSearch(start, end, filterOwnerId, filterOutValidation, filterFontDecorations, cachedVersionId, onlyMarginDecorations);\n        const r1 = this._decorationsTree1.intervalSearch(start, end, filterOwnerId, filterOutValidation, filterFontDecorations, cachedVersionId, onlyMarginDecorations);\n        const r2 = this._injectedTextDecorationsTree.intervalSearch(start, end, filterOwnerId, filterOutValidation, filterFontDecorations, cachedVersionId, onlyMarginDecorations);\n        return r0.concat(r1).concat(r2);\n    }\n    getInjectedTextInInterval(host, start, end, filterOwnerId) {\n        const versionId = host.getVersionId();\n        const result = this._injectedTextDecorationsTree.intervalSearch(start, end, filterOwnerId, false, false, versionId, false);\n        return this._ensureNodesHaveRanges(host, result).filter((i) => i.options.showIfCollapsed || !i.range.isEmpty());\n    }\n    getFontDecorationsInInterval(host, start, end, filterOwnerId) {\n        const versionId = host.getVersionId();\n        const decorations = this._decorationsTree0.intervalSearch(start, end, filterOwnerId, false, false, versionId, false);\n        return this._ensureNodesHaveRanges(host, decorations).filter((i) => i.options.affectsFont);\n    }\n    getAllInjectedText(host, filterOwnerId) {\n        const versionId = host.getVersionId();\n        const result = this._injectedTextDecorationsTree.search(filterOwnerId, false, false, versionId, false);\n        return this._ensureNodesHaveRanges(host, result).filter((i) => i.options.showIfCollapsed || !i.range.isEmpty());\n    }\n    getAllCustomLineHeights(host, filterOwnerId) {\n        const versionId = host.getVersionId();\n        const result = this._search(filterOwnerId, false, false, false, versionId, false);\n        return this._ensureNodesHaveRanges(host, result).filter((i) => typeof i.options.lineHeight === 'number');\n    }\n    getAll(host, filterOwnerId, filterOutValidation, filterFontDecorations, overviewRulerOnly, onlyMarginDecorations) {\n        const versionId = host.getVersionId();\n        const result = this._search(filterOwnerId, filterOutValidation, filterFontDecorations, overviewRulerOnly, versionId, onlyMarginDecorations);\n        return this._ensureNodesHaveRanges(host, result);\n    }\n    _search(filterOwnerId, filterOutValidation, filterFontDecorations, overviewRulerOnly, cachedVersionId, onlyMarginDecorations) {\n        if (overviewRulerOnly) {\n            return this._decorationsTree1.search(filterOwnerId, filterOutValidation, filterFontDecorations, cachedVersionId, onlyMarginDecorations);\n        }\n        else {\n            const r0 = this._decorationsTree0.search(filterOwnerId, filterOutValidation, filterFontDecorations, cachedVersionId, onlyMarginDecorations);\n            const r1 = this._decorationsTree1.search(filterOwnerId, filterOutValidation, filterFontDecorations, cachedVersionId, onlyMarginDecorations);\n            const r2 = this._injectedTextDecorationsTree.search(filterOwnerId, filterOutValidation, filterFontDecorations, cachedVersionId, onlyMarginDecorations);\n            return r0.concat(r1).concat(r2);\n        }\n    }\n    collectNodesFromOwner(ownerId) {\n        const r0 = this._decorationsTree0.collectNodesFromOwner(ownerId);\n        const r1 = this._decorationsTree1.collectNodesFromOwner(ownerId);\n        const r2 = this._injectedTextDecorationsTree.collectNodesFromOwner(ownerId);\n        return r0.concat(r1).concat(r2);\n    }\n    collectNodesPostOrder() {\n        const r0 = this._decorationsTree0.collectNodesPostOrder();\n        const r1 = this._decorationsTree1.collectNodesPostOrder();\n        const r2 = this._injectedTextDecorationsTree.collectNodesPostOrder();\n        return r0.concat(r1).concat(r2);\n    }\n    insert(node) {\n        if (isNodeInjectedText(node)) {\n            this._injectedTextDecorationsTree.insert(node);\n        }\n        else if (isNodeInOverviewRuler(node)) {\n            this._decorationsTree1.insert(node);\n        }\n        else {\n            this._decorationsTree0.insert(node);\n        }\n    }\n    delete(node) {\n        if (isNodeInjectedText(node)) {\n            this._injectedTextDecorationsTree.delete(node);\n        }\n        else if (isNodeInOverviewRuler(node)) {\n            this._decorationsTree1.delete(node);\n        }\n        else {\n            this._decorationsTree0.delete(node);\n        }\n    }\n    getNodeRange(host, node) {\n        const versionId = host.getVersionId();\n        if (node.cachedVersionId !== versionId) {\n            this._resolveNode(node, versionId);\n        }\n        if (node.range === null) {\n            node.range = host.getRangeAt(node.cachedAbsoluteStart, node.cachedAbsoluteEnd);\n        }\n        return node.range;\n    }\n    _resolveNode(node, cachedVersionId) {\n        if (isNodeInjectedText(node)) {\n            this._injectedTextDecorationsTree.resolveNode(node, cachedVersionId);\n        }\n        else if (isNodeInOverviewRuler(node)) {\n            this._decorationsTree1.resolveNode(node, cachedVersionId);\n        }\n        else {\n            this._decorationsTree0.resolveNode(node, cachedVersionId);\n        }\n    }\n    acceptReplace(offset, length, textLength, forceMoveMarkers) {\n        this._decorationsTree0.acceptReplace(offset, length, textLength, forceMoveMarkers);\n        this._decorationsTree1.acceptReplace(offset, length, textLength, forceMoveMarkers);\n        this._injectedTextDecorationsTree.acceptReplace(offset, length, textLength, forceMoveMarkers);\n    }\n}\nfunction cleanClassName(className) {\n    return className.replace(/[^a-z0-9\\-_]/gi, ' ');\n}\nclass DecorationOptions {\n    constructor(options) {\n        this.color = options.color || '';\n        this.darkColor = options.darkColor || '';\n    }\n}\nclass ModelDecorationOverviewRulerOptions extends DecorationOptions {\n    constructor(options) {\n        super(options);\n        this._resolvedColor = null;\n        this.position = (typeof options.position === 'number' ? options.position : OverviewRulerLane.Center);\n    }\n    getColor(theme) {\n        if (!this._resolvedColor) {\n            if (isDark(theme.type) && this.darkColor) {\n                this._resolvedColor = this._resolveColor(this.darkColor, theme);\n            }\n            else {\n                this._resolvedColor = this._resolveColor(this.color, theme);\n            }\n        }\n        return this._resolvedColor;\n    }\n    invalidateCachedColor() {\n        this._resolvedColor = null;\n    }\n    _resolveColor(color, theme) {\n        if (typeof color === 'string') {\n            return color;\n        }\n        const c = color ? theme.getColor(color.id) : null;\n        if (!c) {\n            return '';\n        }\n        return c.toString();\n    }\n}\nclass ModelDecorationGlyphMarginOptions {\n    constructor(options) {\n        this.position = options?.position ?? GlyphMarginLane.Center;\n        this.persistLane = options?.persistLane;\n    }\n}\nclass ModelDecorationMinimapOptions extends DecorationOptions {\n    constructor(options) {\n        super(options);\n        this.position = options.position;\n        this.sectionHeaderStyle = options.sectionHeaderStyle ?? null;\n        this.sectionHeaderText = options.sectionHeaderText ?? null;\n    }\n    getColor(theme) {\n        if (!this._resolvedColor) {\n            if (isDark(theme.type) && this.darkColor) {\n                this._resolvedColor = this._resolveColor(this.darkColor, theme);\n            }\n            else {\n                this._resolvedColor = this._resolveColor(this.color, theme);\n            }\n        }\n        return this._resolvedColor;\n    }\n    invalidateCachedColor() {\n        this._resolvedColor = undefined;\n    }\n    _resolveColor(color, theme) {\n        if (typeof color === 'string') {\n            return Color.fromHex(color);\n        }\n        return theme.getColor(color.id);\n    }\n}\nclass ModelDecorationInjectedTextOptions {\n    static from(options) {\n        if (options instanceof ModelDecorationInjectedTextOptions) {\n            return options;\n        }\n        return new ModelDecorationInjectedTextOptions(options);\n    }\n    constructor(options) {\n        this.content = options.content || '';\n        this.tokens = options.tokens ?? null;\n        this.inlineClassName = options.inlineClassName || null;\n        this.inlineClassNameAffectsLetterSpacing = options.inlineClassNameAffectsLetterSpacing || false;\n        this.attachedData = options.attachedData || null;\n        this.cursorStops = options.cursorStops || null;\n    }\n}\nclass ModelDecorationOptions {\n    static register(options) {\n        return new ModelDecorationOptions(options);\n    }\n    static createDynamic(options) {\n        return new ModelDecorationOptions(options);\n    }\n    constructor(options) {\n        this.description = options.description;\n        this.blockClassName = options.blockClassName ? cleanClassName(options.blockClassName) : null;\n        this.blockDoesNotCollapse = options.blockDoesNotCollapse ?? null;\n        this.blockIsAfterEnd = options.blockIsAfterEnd ?? null;\n        this.blockPadding = options.blockPadding ?? null;\n        this.stickiness = options.stickiness || 0 /* model.TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */;\n        this.zIndex = options.zIndex || 0;\n        this.className = options.className ? cleanClassName(options.className) : null;\n        this.shouldFillLineOnLineBreak = options.shouldFillLineOnLineBreak ?? null;\n        this.hoverMessage = options.hoverMessage || null;\n        this.glyphMarginHoverMessage = options.glyphMarginHoverMessage || null;\n        this.lineNumberHoverMessage = options.lineNumberHoverMessage || null;\n        this.isWholeLine = options.isWholeLine || false;\n        this.lineHeight = options.lineHeight ? Math.min(options.lineHeight, LINE_HEIGHT_CEILING) : null;\n        this.fontSize = options.fontSize || null;\n        this.affectsFont = !!options.fontSize || !!options.fontFamily || !!options.fontWeight || !!options.fontStyle;\n        this.showIfCollapsed = options.showIfCollapsed || false;\n        this.collapseOnReplaceEdit = options.collapseOnReplaceEdit || false;\n        this.overviewRuler = options.overviewRuler ? new ModelDecorationOverviewRulerOptions(options.overviewRuler) : null;\n        this.minimap = options.minimap ? new ModelDecorationMinimapOptions(options.minimap) : null;\n        this.glyphMargin = options.glyphMarginClassName ? new ModelDecorationGlyphMarginOptions(options.glyphMargin) : null;\n        this.glyphMarginClassName = options.glyphMarginClassName ? cleanClassName(options.glyphMarginClassName) : null;\n        this.linesDecorationsClassName = options.linesDecorationsClassName ? cleanClassName(options.linesDecorationsClassName) : null;\n        this.lineNumberClassName = options.lineNumberClassName ? cleanClassName(options.lineNumberClassName) : null;\n        this.linesDecorationsTooltip = options.linesDecorationsTooltip ? htmlAttributeEncodeValue(options.linesDecorationsTooltip) : null;\n        this.firstLineDecorationClassName = options.firstLineDecorationClassName ? cleanClassName(options.firstLineDecorationClassName) : null;\n        this.marginClassName = options.marginClassName ? cleanClassName(options.marginClassName) : null;\n        this.inlineClassName = options.inlineClassName ? cleanClassName(options.inlineClassName) : null;\n        this.inlineClassNameAffectsLetterSpacing = options.inlineClassNameAffectsLetterSpacing || false;\n        this.beforeContentClassName = options.beforeContentClassName ? cleanClassName(options.beforeContentClassName) : null;\n        this.afterContentClassName = options.afterContentClassName ? cleanClassName(options.afterContentClassName) : null;\n        this.after = options.after ? ModelDecorationInjectedTextOptions.from(options.after) : null;\n        this.before = options.before ? ModelDecorationInjectedTextOptions.from(options.before) : null;\n        this.hideInCommentTokens = options.hideInCommentTokens ?? false;\n        this.hideInStringTokens = options.hideInStringTokens ?? false;\n        this.textDirection = options.textDirection ?? null;\n    }\n}\nModelDecorationOptions.EMPTY = ModelDecorationOptions.register({ description: 'empty' });\n/**\n * The order carefully matches the values of the enum.\n */\nconst TRACKED_RANGE_OPTIONS = [\n    ModelDecorationOptions.register({ description: 'tracked-range-always-grows-when-typing-at-edges', stickiness: 0 /* model.TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */ }),\n    ModelDecorationOptions.register({ description: 'tracked-range-never-grows-when-typing-at-edges', stickiness: 1 /* model.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ }),\n    ModelDecorationOptions.register({ description: 'tracked-range-grows-only-when-typing-before', stickiness: 2 /* model.TrackedRangeStickiness.GrowsOnlyWhenTypingBefore */ }),\n    ModelDecorationOptions.register({ description: 'tracked-range-grows-only-when-typing-after', stickiness: 3 /* model.TrackedRangeStickiness.GrowsOnlyWhenTypingAfter */ }),\n];\nfunction _normalizeOptions(options) {\n    if (options instanceof ModelDecorationOptions) {\n        return options;\n    }\n    return ModelDecorationOptions.createDynamic(options);\n}\nclass LineHeightChangingDecoration {\n    static toKey(obj) {\n        return `${obj.ownerId};${obj.decorationId};${obj.lineNumber}`;\n    }\n    constructor(ownerId, decorationId, lineNumber, lineHeight) {\n        this.ownerId = ownerId;\n        this.decorationId = decorationId;\n        this.lineNumber = lineNumber;\n        this.lineHeight = lineHeight;\n    }\n}\nclass LineFontChangingDecoration {\n    static toKey(obj) {\n        return `${obj.ownerId};${obj.decorationId};${obj.lineNumber}`;\n    }\n    constructor(ownerId, decorationId, lineNumber) {\n        this.ownerId = ownerId;\n        this.decorationId = decorationId;\n        this.lineNumber = lineNumber;\n    }\n}\nclass DidChangeDecorationsEmitter extends Disposable {\n    constructor(handleBeforeFire) {\n        super();\n        this.handleBeforeFire = handleBeforeFire;\n        this._actual = this._register(new Emitter());\n        this.event = this._actual.event;\n        this._affectedInjectedTextLines = null;\n        this._affectedLineHeights = null;\n        this._affectedFontLines = null;\n        this._deferredCnt = 0;\n        this._shouldFireDeferred = false;\n        this._affectsMinimap = false;\n        this._affectsOverviewRuler = false;\n        this._affectsGlyphMargin = false;\n        this._affectsLineNumber = false;\n    }\n    beginDeferredEmit() {\n        this._deferredCnt++;\n    }\n    endDeferredEmit() {\n        this._deferredCnt--;\n        if (this._deferredCnt === 0) {\n            if (this._shouldFireDeferred) {\n                this.doFire();\n            }\n            this._affectedInjectedTextLines?.clear();\n            this._affectedInjectedTextLines = null;\n            this._affectedLineHeights?.clear();\n            this._affectedLineHeights = null;\n            this._affectedFontLines?.clear();\n            this._affectedFontLines = null;\n        }\n    }\n    recordLineAffectedByInjectedText(lineNumber) {\n        if (!this._affectedInjectedTextLines) {\n            this._affectedInjectedTextLines = new Set();\n        }\n        this._affectedInjectedTextLines.add(lineNumber);\n    }\n    recordLineAffectedByLineHeightChange(ownerId, decorationId, lineNumber, lineHeight) {\n        if (!this._affectedLineHeights) {\n            this._affectedLineHeights = new SetWithKey([], LineHeightChangingDecoration.toKey);\n        }\n        this._affectedLineHeights.add(new LineHeightChangingDecoration(ownerId, decorationId, lineNumber, lineHeight));\n    }\n    recordLineAffectedByFontChange(ownerId, decorationId, lineNumber) {\n        if (!this._affectedFontLines) {\n            this._affectedFontLines = new SetWithKey([], LineFontChangingDecoration.toKey);\n        }\n        this._affectedFontLines.add(new LineFontChangingDecoration(ownerId, decorationId, lineNumber));\n    }\n    checkAffectedAndFire(options) {\n        this._affectsMinimap ||= !!options.minimap?.position;\n        this._affectsOverviewRuler ||= !!options.overviewRuler?.color;\n        this._affectsGlyphMargin ||= !!options.glyphMarginClassName;\n        this._affectsLineNumber ||= !!options.lineNumberClassName;\n        this.tryFire();\n    }\n    fire() {\n        this._affectsMinimap = true;\n        this._affectsOverviewRuler = true;\n        this._affectsGlyphMargin = true;\n        this.tryFire();\n    }\n    tryFire() {\n        if (this._deferredCnt === 0) {\n            this.doFire();\n        }\n        else {\n            this._shouldFireDeferred = true;\n        }\n    }\n    doFire() {\n        this.handleBeforeFire(this._affectedInjectedTextLines, this._affectedLineHeights, this._affectedFontLines);\n        const event = {\n            affectsMinimap: this._affectsMinimap,\n            affectsOverviewRuler: this._affectsOverviewRuler,\n            affectsGlyphMargin: this._affectsGlyphMargin,\n            affectsLineNumber: this._affectsLineNumber,\n        };\n        this._shouldFireDeferred = false;\n        this._affectsMinimap = false;\n        this._affectsOverviewRuler = false;\n        this._affectsGlyphMargin = false;\n        this._actual.fire(event);\n    }\n}\n//#endregion\nclass DidChangeContentEmitter extends Disposable {\n    constructor() {\n        super();\n        /**\n         * Both `fastEvent` and `slowEvent` work the same way and contain the same events, but first we invoke `fastEvent` and then `slowEvent`.\n         */\n        this._fastEmitter = this._register(new Emitter());\n        this.fastEvent = this._fastEmitter.event;\n        this._slowEmitter = this._register(new Emitter());\n        this.slowEvent = this._slowEmitter.event;\n        this._deferredCnt = 0;\n        this._deferredEvent = null;\n    }\n    beginDeferredEmit() {\n        this._deferredCnt++;\n    }\n    endDeferredEmit(resultingSelection = null) {\n        this._deferredCnt--;\n        if (this._deferredCnt === 0) {\n            if (this._deferredEvent !== null) {\n                this._deferredEvent.rawContentChangedEvent.resultingSelection = resultingSelection;\n                const e = this._deferredEvent;\n                this._deferredEvent = null;\n                this._fastEmitter.fire(e);\n                this._slowEmitter.fire(e);\n            }\n        }\n    }\n    fire(e) {\n        if (this._deferredCnt > 0) {\n            if (this._deferredEvent) {\n                this._deferredEvent = this._deferredEvent.merge(e);\n            }\n            else {\n                this._deferredEvent = e;\n            }\n            return;\n        }\n        this._fastEmitter.fire(e);\n        this._slowEmitter.fire(e);\n    }\n}\n\nexport { ModelDecorationGlyphMarginOptions, ModelDecorationInjectedTextOptions, ModelDecorationMinimapOptions, ModelDecorationOptions, ModelDecorationOverviewRulerOptions, TextModel, createTextBuffer, createTextBufferFactory, createTextBufferFactoryFromSnapshot, indentOfLine };\n","import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst ILanguageFeaturesService = createDecorator('ILanguageFeaturesService');\n\nexport { ILanguageFeaturesService };\n","import { isHighSurrogate, isLowSurrogate, firstNonWhitespaceIndex, isFullWidthCharacter } from '../../../base/common/strings.js';\nimport { CharacterClassifier } from '../core/characterClassifier.js';\nimport { LineInjectedText } from '../textModelEvents.js';\nimport { ModelLineProjectionData } from '../modelLineProjectionData.js';\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 *--------------------------------------------------------------------------------------------*/\nclass MonospaceLineBreaksComputerFactory {\n    static create(options) {\n        return new MonospaceLineBreaksComputerFactory(options.get(151 /* EditorOption.wordWrapBreakBeforeCharacters */), options.get(150 /* EditorOption.wordWrapBreakAfterCharacters */));\n    }\n    constructor(breakBeforeChars, breakAfterChars) {\n        this.classifier = new WrappingCharacterClassifier(breakBeforeChars, breakAfterChars);\n    }\n    createLineBreaksComputer(fontInfo, tabSize, wrappingColumn, wrappingIndent, wordBreak, wrapOnEscapedLineFeeds) {\n        const requests = [];\n        const injectedTexts = [];\n        const previousBreakingData = [];\n        return {\n            addRequest: (lineText, injectedText, previousLineBreakData) => {\n                requests.push(lineText);\n                injectedTexts.push(injectedText);\n                previousBreakingData.push(previousLineBreakData);\n            },\n            finalize: () => {\n                const columnsForFullWidthChar = fontInfo.typicalFullwidthCharacterWidth / fontInfo.typicalHalfwidthCharacterWidth;\n                const result = [];\n                for (let i = 0, len = requests.length; i < len; i++) {\n                    const injectedText = injectedTexts[i];\n                    const previousLineBreakData = previousBreakingData[i];\n                    const lineText = requests[i];\n                    const isLineFeedWrappingEnabled = wrapOnEscapedLineFeeds && lineText.includes('\"') && lineText.includes('\\\\n');\n                    if (previousLineBreakData && !previousLineBreakData.injectionOptions && !injectedText && !isLineFeedWrappingEnabled) {\n                        result[i] = createLineBreaksFromPreviousLineBreaks(this.classifier, previousLineBreakData, lineText, tabSize, wrappingColumn, columnsForFullWidthChar, wrappingIndent, wordBreak);\n                    }\n                    else {\n                        result[i] = createLineBreaks(this.classifier, lineText, injectedText, tabSize, wrappingColumn, columnsForFullWidthChar, wrappingIndent, wordBreak, isLineFeedWrappingEnabled);\n                    }\n                }\n                arrPool1.length = 0;\n                arrPool2.length = 0;\n                return result;\n            }\n        };\n    }\n}\nclass WrappingCharacterClassifier extends CharacterClassifier {\n    constructor(BREAK_BEFORE, BREAK_AFTER) {\n        super(0 /* CharacterClass.NONE */);\n        for (let i = 0; i < BREAK_BEFORE.length; i++) {\n            this.set(BREAK_BEFORE.charCodeAt(i), 1 /* CharacterClass.BREAK_BEFORE */);\n        }\n        for (let i = 0; i < BREAK_AFTER.length; i++) {\n            this.set(BREAK_AFTER.charCodeAt(i), 2 /* CharacterClass.BREAK_AFTER */);\n        }\n    }\n    get(charCode) {\n        if (charCode >= 0 && charCode < 256) {\n            return this._asciiMap[charCode];\n        }\n        else {\n            // Initialize CharacterClass.BREAK_IDEOGRAPHIC for these Unicode ranges:\n            // 1. CJK Unified Ideographs (0x4E00 -- 0x9FFF)\n            // 2. CJK Unified Ideographs Extension A (0x3400 -- 0x4DBF)\n            // 3. Hiragana and Katakana (0x3040 -- 0x30FF)\n            if ((charCode >= 0x3040 && charCode <= 0x30FF)\n                || (charCode >= 0x3400 && charCode <= 0x4DBF)\n                || (charCode >= 0x4E00 && charCode <= 0x9FFF)) {\n                return 3 /* CharacterClass.BREAK_IDEOGRAPHIC */;\n            }\n            return (this._map.get(charCode) || this._defaultValue);\n        }\n    }\n}\nlet arrPool1 = [];\nlet arrPool2 = [];\nfunction createLineBreaksFromPreviousLineBreaks(classifier, previousBreakingData, lineText, tabSize, firstLineBreakColumn, columnsForFullWidthChar, wrappingIndent, wordBreak) {\n    if (firstLineBreakColumn === -1) {\n        return null;\n    }\n    const len = lineText.length;\n    if (len <= 1) {\n        return null;\n    }\n    const isKeepAll = (wordBreak === 'keepAll');\n    const prevBreakingOffsets = previousBreakingData.breakOffsets;\n    const prevBreakingOffsetsVisibleColumn = previousBreakingData.breakOffsetsVisibleColumn;\n    const wrappedTextIndentLength = computeWrappedTextIndentLength(lineText, tabSize, firstLineBreakColumn, columnsForFullWidthChar, wrappingIndent);\n    const wrappedLineBreakColumn = firstLineBreakColumn - wrappedTextIndentLength;\n    const breakingOffsets = arrPool1;\n    const breakingOffsetsVisibleColumn = arrPool2;\n    let breakingOffsetsCount = 0;\n    let lastBreakingOffset = 0;\n    let lastBreakingOffsetVisibleColumn = 0;\n    let breakingColumn = firstLineBreakColumn;\n    const prevLen = prevBreakingOffsets.length;\n    let prevIndex = 0;\n    if (prevIndex >= 0) {\n        let bestDistance = Math.abs(prevBreakingOffsetsVisibleColumn[prevIndex] - breakingColumn);\n        while (prevIndex + 1 < prevLen) {\n            const distance = Math.abs(prevBreakingOffsetsVisibleColumn[prevIndex + 1] - breakingColumn);\n            if (distance >= bestDistance) {\n                break;\n            }\n            bestDistance = distance;\n            prevIndex++;\n        }\n    }\n    while (prevIndex < prevLen) {\n        // Allow for prevIndex to be -1 (for the case where we hit a tab when walking backwards from the first break)\n        let prevBreakOffset = prevIndex < 0 ? 0 : prevBreakingOffsets[prevIndex];\n        let prevBreakOffsetVisibleColumn = prevIndex < 0 ? 0 : prevBreakingOffsetsVisibleColumn[prevIndex];\n        if (lastBreakingOffset > prevBreakOffset) {\n            prevBreakOffset = lastBreakingOffset;\n            prevBreakOffsetVisibleColumn = lastBreakingOffsetVisibleColumn;\n        }\n        let breakOffset = 0;\n        let breakOffsetVisibleColumn = 0;\n        let forcedBreakOffset = 0;\n        let forcedBreakOffsetVisibleColumn = 0;\n        // initially, we search as much as possible to the right (if it fits)\n        if (prevBreakOffsetVisibleColumn <= breakingColumn) {\n            let visibleColumn = prevBreakOffsetVisibleColumn;\n            let prevCharCode = prevBreakOffset === 0 ? 0 /* CharCode.Null */ : lineText.charCodeAt(prevBreakOffset - 1);\n            let prevCharCodeClass = prevBreakOffset === 0 ? 0 /* CharacterClass.NONE */ : classifier.get(prevCharCode);\n            let entireLineFits = true;\n            for (let i = prevBreakOffset; i < len; i++) {\n                const charStartOffset = i;\n                const charCode = lineText.charCodeAt(i);\n                let charCodeClass;\n                let charWidth;\n                if (isHighSurrogate(charCode)) {\n                    // A surrogate pair must always be considered as a single unit, so it is never to be broken\n                    i++;\n                    charCodeClass = 0 /* CharacterClass.NONE */;\n                    charWidth = 2;\n                }\n                else {\n                    charCodeClass = classifier.get(charCode);\n                    charWidth = computeCharWidth(charCode, visibleColumn, tabSize, columnsForFullWidthChar);\n                }\n                if (charStartOffset > lastBreakingOffset && canBreak(prevCharCode, prevCharCodeClass, charCode, charCodeClass, isKeepAll)) {\n                    breakOffset = charStartOffset;\n                    breakOffsetVisibleColumn = visibleColumn;\n                }\n                visibleColumn += charWidth;\n                // check if adding character at `i` will go over the breaking column\n                if (visibleColumn > breakingColumn) {\n                    // We need to break at least before character at `i`:\n                    if (charStartOffset > lastBreakingOffset) {\n                        forcedBreakOffset = charStartOffset;\n                        forcedBreakOffsetVisibleColumn = visibleColumn - charWidth;\n                    }\n                    else {\n                        // we need to advance at least by one character\n                        forcedBreakOffset = i + 1;\n                        forcedBreakOffsetVisibleColumn = visibleColumn;\n                    }\n                    if (visibleColumn - breakOffsetVisibleColumn > wrappedLineBreakColumn) {\n                        // Cannot break at `breakOffset` => reset it if it was set\n                        breakOffset = 0;\n                    }\n                    entireLineFits = false;\n                    break;\n                }\n                prevCharCode = charCode;\n                prevCharCodeClass = charCodeClass;\n            }\n            if (entireLineFits) {\n                // there is no more need to break => stop the outer loop!\n                if (breakingOffsetsCount > 0) {\n                    // Add last segment, no need to assign to `lastBreakingOffset` and `lastBreakingOffsetVisibleColumn`\n                    breakingOffsets[breakingOffsetsCount] = prevBreakingOffsets[prevBreakingOffsets.length - 1];\n                    breakingOffsetsVisibleColumn[breakingOffsetsCount] = prevBreakingOffsetsVisibleColumn[prevBreakingOffsets.length - 1];\n                    breakingOffsetsCount++;\n                }\n                break;\n            }\n        }\n        if (breakOffset === 0) {\n            // must search left\n            let visibleColumn = prevBreakOffsetVisibleColumn;\n            let charCode = lineText.charCodeAt(prevBreakOffset);\n            let charCodeClass = classifier.get(charCode);\n            let hitATabCharacter = false;\n            for (let i = prevBreakOffset - 1; i >= lastBreakingOffset; i--) {\n                const charStartOffset = i + 1;\n                const prevCharCode = lineText.charCodeAt(i);\n                if (prevCharCode === 9 /* CharCode.Tab */) {\n                    // cannot determine the width of a tab when going backwards, so we must go forwards\n                    hitATabCharacter = true;\n                    break;\n                }\n                let prevCharCodeClass;\n                let prevCharWidth;\n                if (isLowSurrogate(prevCharCode)) {\n                    // A surrogate pair must always be considered as a single unit, so it is never to be broken\n                    i--;\n                    prevCharCodeClass = 0 /* CharacterClass.NONE */;\n                    prevCharWidth = 2;\n                }\n                else {\n                    prevCharCodeClass = classifier.get(prevCharCode);\n                    prevCharWidth = (isFullWidthCharacter(prevCharCode) ? columnsForFullWidthChar : 1);\n                }\n                if (visibleColumn <= breakingColumn) {\n                    if (forcedBreakOffset === 0) {\n                        forcedBreakOffset = charStartOffset;\n                        forcedBreakOffsetVisibleColumn = visibleColumn;\n                    }\n                    if (visibleColumn <= breakingColumn - wrappedLineBreakColumn) {\n                        // went too far!\n                        break;\n                    }\n                    if (canBreak(prevCharCode, prevCharCodeClass, charCode, charCodeClass, isKeepAll)) {\n                        breakOffset = charStartOffset;\n                        breakOffsetVisibleColumn = visibleColumn;\n                        break;\n                    }\n                }\n                visibleColumn -= prevCharWidth;\n                charCode = prevCharCode;\n                charCodeClass = prevCharCodeClass;\n            }\n            if (breakOffset !== 0) {\n                const remainingWidthOfNextLine = wrappedLineBreakColumn - (forcedBreakOffsetVisibleColumn - breakOffsetVisibleColumn);\n                if (remainingWidthOfNextLine <= tabSize) {\n                    const charCodeAtForcedBreakOffset = lineText.charCodeAt(forcedBreakOffset);\n                    let charWidth;\n                    if (isHighSurrogate(charCodeAtForcedBreakOffset)) {\n                        // A surrogate pair must always be considered as a single unit, so it is never to be broken\n                        charWidth = 2;\n                    }\n                    else {\n                        charWidth = computeCharWidth(charCodeAtForcedBreakOffset, forcedBreakOffsetVisibleColumn, tabSize, columnsForFullWidthChar);\n                    }\n                    if (remainingWidthOfNextLine - charWidth < 0) {\n                        // it is not worth it to break at breakOffset, it just introduces an extra needless line!\n                        breakOffset = 0;\n                    }\n                }\n            }\n            if (hitATabCharacter) {\n                // cannot determine the width of a tab when going backwards, so we must go forwards from the previous break\n                prevIndex--;\n                continue;\n            }\n        }\n        if (breakOffset === 0) {\n            // Could not find a good breaking point\n            breakOffset = forcedBreakOffset;\n            breakOffsetVisibleColumn = forcedBreakOffsetVisibleColumn;\n        }\n        if (breakOffset <= lastBreakingOffset) {\n            // Make sure that we are advancing (at least one character)\n            const charCode = lineText.charCodeAt(lastBreakingOffset);\n            if (isHighSurrogate(charCode)) {\n                // A surrogate pair must always be considered as a single unit, so it is never to be broken\n                breakOffset = lastBreakingOffset + 2;\n                breakOffsetVisibleColumn = lastBreakingOffsetVisibleColumn + 2;\n            }\n            else {\n                breakOffset = lastBreakingOffset + 1;\n                breakOffsetVisibleColumn = lastBreakingOffsetVisibleColumn + computeCharWidth(charCode, lastBreakingOffsetVisibleColumn, tabSize, columnsForFullWidthChar);\n            }\n        }\n        lastBreakingOffset = breakOffset;\n        breakingOffsets[breakingOffsetsCount] = breakOffset;\n        lastBreakingOffsetVisibleColumn = breakOffsetVisibleColumn;\n        breakingOffsetsVisibleColumn[breakingOffsetsCount] = breakOffsetVisibleColumn;\n        breakingOffsetsCount++;\n        breakingColumn = breakOffsetVisibleColumn + wrappedLineBreakColumn;\n        while (prevIndex < 0 || (prevIndex < prevLen && prevBreakingOffsetsVisibleColumn[prevIndex] < breakOffsetVisibleColumn)) {\n            prevIndex++;\n        }\n        let bestDistance = Math.abs(prevBreakingOffsetsVisibleColumn[prevIndex] - breakingColumn);\n        while (prevIndex + 1 < prevLen) {\n            const distance = Math.abs(prevBreakingOffsetsVisibleColumn[prevIndex + 1] - breakingColumn);\n            if (distance >= bestDistance) {\n                break;\n            }\n            bestDistance = distance;\n            prevIndex++;\n        }\n    }\n    if (breakingOffsetsCount === 0) {\n        return null;\n    }\n    // Doing here some object reuse which ends up helping a huge deal with GC pauses!\n    breakingOffsets.length = breakingOffsetsCount;\n    breakingOffsetsVisibleColumn.length = breakingOffsetsCount;\n    arrPool1 = previousBreakingData.breakOffsets;\n    arrPool2 = previousBreakingData.breakOffsetsVisibleColumn;\n    previousBreakingData.breakOffsets = breakingOffsets;\n    previousBreakingData.breakOffsetsVisibleColumn = breakingOffsetsVisibleColumn;\n    previousBreakingData.wrappedTextIndentLength = wrappedTextIndentLength;\n    return previousBreakingData;\n}\nfunction createLineBreaks(classifier, _lineText, injectedTexts, tabSize, firstLineBreakColumn, columnsForFullWidthChar, wrappingIndent, wordBreak, wrapOnEscapedLineFeeds) {\n    const lineText = LineInjectedText.applyInjectedText(_lineText, injectedTexts);\n    let injectionOptions;\n    let injectionOffsets;\n    if (injectedTexts && injectedTexts.length > 0) {\n        injectionOptions = injectedTexts.map(t => t.options);\n        injectionOffsets = injectedTexts.map(text => text.column - 1);\n    }\n    else {\n        injectionOptions = null;\n        injectionOffsets = null;\n    }\n    if (firstLineBreakColumn === -1) {\n        if (!injectionOptions) {\n            return null;\n        }\n        // creating a `LineBreakData` with an invalid `breakOffsetsVisibleColumn` is OK\n        // because `breakOffsetsVisibleColumn` will never be used because it contains injected text\n        return new ModelLineProjectionData(injectionOffsets, injectionOptions, [lineText.length], [], 0);\n    }\n    const len = lineText.length;\n    if (len <= 1) {\n        if (!injectionOptions) {\n            return null;\n        }\n        // creating a `LineBreakData` with an invalid `breakOffsetsVisibleColumn` is OK\n        // because `breakOffsetsVisibleColumn` will never be used because it contains injected text\n        return new ModelLineProjectionData(injectionOffsets, injectionOptions, [lineText.length], [], 0);\n    }\n    const isKeepAll = (wordBreak === 'keepAll');\n    const wrappedTextIndentLength = computeWrappedTextIndentLength(lineText, tabSize, firstLineBreakColumn, columnsForFullWidthChar, wrappingIndent);\n    const wrappedLineBreakColumn = firstLineBreakColumn - wrappedTextIndentLength;\n    const breakingOffsets = [];\n    const breakingOffsetsVisibleColumn = [];\n    let breakingOffsetsCount = 0;\n    let breakOffset = 0;\n    let breakOffsetVisibleColumn = 0;\n    let breakingColumn = firstLineBreakColumn;\n    let prevCharCode = lineText.charCodeAt(0);\n    let prevCharCodeClass = classifier.get(prevCharCode);\n    let visibleColumn = computeCharWidth(prevCharCode, 0, tabSize, columnsForFullWidthChar);\n    let startOffset = 1;\n    if (isHighSurrogate(prevCharCode)) {\n        // A surrogate pair must always be considered as a single unit, so it is never to be broken\n        visibleColumn += 1;\n        prevCharCode = lineText.charCodeAt(1);\n        prevCharCodeClass = classifier.get(prevCharCode);\n        startOffset++;\n    }\n    for (let i = startOffset; i < len; i++) {\n        const charStartOffset = i;\n        const charCode = lineText.charCodeAt(i);\n        let charCodeClass;\n        let charWidth;\n        let wrapEscapedLineFeed = false;\n        if (isHighSurrogate(charCode)) {\n            // A surrogate pair must always be considered as a single unit, so it is never to be broken\n            i++;\n            charCodeClass = 0 /* CharacterClass.NONE */;\n            charWidth = 2;\n        }\n        else {\n            charCodeClass = classifier.get(charCode);\n            charWidth = computeCharWidth(charCode, visibleColumn, tabSize, columnsForFullWidthChar);\n        }\n        // literal \\n shall trigger a softwrap\n        if (wrapOnEscapedLineFeeds && isEscapedLineBreakAtPosition(lineText, i)) {\n            breakOffset = charStartOffset;\n            breakOffsetVisibleColumn = visibleColumn;\n            wrapEscapedLineFeed = true;\n        }\n        else if (canBreak(prevCharCode, prevCharCodeClass, charCode, charCodeClass, isKeepAll)) {\n            breakOffset = charStartOffset;\n            breakOffsetVisibleColumn = visibleColumn;\n        }\n        visibleColumn += charWidth;\n        // check if adding character at `i` will go over the breaking column\n        if (visibleColumn > breakingColumn || wrapEscapedLineFeed) {\n            // We need to break at least before character at `i`:\n            if (breakOffset === 0 || visibleColumn - breakOffsetVisibleColumn > wrappedLineBreakColumn) {\n                // Cannot break at `breakOffset`, must break at `i`\n                breakOffset = charStartOffset;\n                breakOffsetVisibleColumn = visibleColumn - charWidth;\n            }\n            breakingOffsets[breakingOffsetsCount] = breakOffset;\n            breakingOffsetsVisibleColumn[breakingOffsetsCount] = breakOffsetVisibleColumn;\n            breakingOffsetsCount++;\n            breakingColumn = breakOffsetVisibleColumn + wrappedLineBreakColumn;\n            breakOffset = 0;\n        }\n        prevCharCode = charCode;\n        prevCharCodeClass = charCodeClass;\n    }\n    if (breakingOffsetsCount === 0 && (!injectedTexts || injectedTexts.length === 0)) {\n        return null;\n    }\n    // Add last segment\n    breakingOffsets[breakingOffsetsCount] = len;\n    breakingOffsetsVisibleColumn[breakingOffsetsCount] = visibleColumn;\n    return new ModelLineProjectionData(injectionOffsets, injectionOptions, breakingOffsets, breakingOffsetsVisibleColumn, wrappedTextIndentLength);\n}\nfunction computeCharWidth(charCode, visibleColumn, tabSize, columnsForFullWidthChar) {\n    if (charCode === 9 /* CharCode.Tab */) {\n        return (tabSize - (visibleColumn % tabSize));\n    }\n    if (isFullWidthCharacter(charCode)) {\n        return columnsForFullWidthChar;\n    }\n    if (charCode < 32) {\n        // when using `editor.renderControlCharacters`, the substitutions are often wide\n        return columnsForFullWidthChar;\n    }\n    return 1;\n}\nfunction tabCharacterWidth(visibleColumn, tabSize) {\n    return (tabSize - (visibleColumn % tabSize));\n}\n/**\n * Checks if the current position in the text should trigger a soft wrap due to escaped line feeds.\n * This handles the wrapOnEscapedLineFeeds feature which allows \\n sequences in strings to trigger wrapping.\n */\nfunction isEscapedLineBreakAtPosition(lineText, i) {\n    if (i >= 2 && lineText.charAt(i - 1) === 'n') {\n        // Check if there's an odd number of backslashes\n        let escapeCount = 0;\n        for (let j = i - 2; j >= 0; j--) {\n            if (lineText.charAt(j) === '\\\\') {\n                escapeCount++;\n            }\n            else {\n                return escapeCount % 2 === 1;\n            }\n        }\n    }\n    return false;\n}\n/**\n * Kinsoku Shori : Don't break after a leading character, like an open bracket\n * Kinsoku Shori : Don't break before a trailing character, like a period\n */\nfunction canBreak(prevCharCode, prevCharCodeClass, charCode, charCodeClass, isKeepAll) {\n    return (charCode !== 32 /* CharCode.Space */\n        && ((prevCharCodeClass === 2 /* CharacterClass.BREAK_AFTER */ && charCodeClass !== 2 /* CharacterClass.BREAK_AFTER */) // break at the end of multiple BREAK_AFTER\n            || (prevCharCodeClass !== 1 /* CharacterClass.BREAK_BEFORE */ && charCodeClass === 1 /* CharacterClass.BREAK_BEFORE */) // break at the start of multiple BREAK_BEFORE\n            || (!isKeepAll && prevCharCodeClass === 3 /* CharacterClass.BREAK_IDEOGRAPHIC */ && charCodeClass !== 2 /* CharacterClass.BREAK_AFTER */)\n            || (!isKeepAll && charCodeClass === 3 /* CharacterClass.BREAK_IDEOGRAPHIC */ && prevCharCodeClass !== 1 /* CharacterClass.BREAK_BEFORE */)));\n}\nfunction computeWrappedTextIndentLength(lineText, tabSize, firstLineBreakColumn, columnsForFullWidthChar, wrappingIndent) {\n    let wrappedTextIndentLength = 0;\n    if (wrappingIndent !== 0 /* WrappingIndent.None */) {\n        const firstNonWhitespaceIndex$1 = firstNonWhitespaceIndex(lineText);\n        if (firstNonWhitespaceIndex$1 !== -1) {\n            // Track existing indent\n            for (let i = 0; i < firstNonWhitespaceIndex$1; i++) {\n                const charWidth = (lineText.charCodeAt(i) === 9 /* CharCode.Tab */ ? tabCharacterWidth(wrappedTextIndentLength, tabSize) : 1);\n                wrappedTextIndentLength += charWidth;\n            }\n            // Increase indent of continuation lines, if desired\n            const numberOfAdditionalTabs = (wrappingIndent === 3 /* WrappingIndent.DeepIndent */ ? 2 : wrappingIndent === 2 /* WrappingIndent.Indent */ ? 1 : 0);\n            for (let i = 0; i < numberOfAdditionalTabs; i++) {\n                const charWidth = tabCharacterWidth(wrappedTextIndentLength, tabSize);\n                wrappedTextIndentLength += charWidth;\n            }\n            // Force sticking to beginning of line if no character would fit except for the indentation\n            if (wrappedTextIndentLength + columnsForFullWidthChar > firstLineBreakColumn) {\n                wrappedTextIndentLength = 0;\n            }\n        }\n    }\n    return wrappedTextIndentLength;\n}\n\nexport { MonospaceLineBreaksComputerFactory };\n","import { SingleCursorState, CursorState } from '../cursorCommon.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { Selection } from '../core/selection.js';\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/**\n * Represents a single cursor.\n*/\nclass Cursor {\n    constructor(context) {\n        this._selTrackedRange = null;\n        this._trackSelection = true;\n        this._setState(context, new SingleCursorState(new Range(1, 1, 1, 1), 0 /* SelectionStartKind.Simple */, 0, new Position(1, 1), 0), new SingleCursorState(new Range(1, 1, 1, 1), 0 /* SelectionStartKind.Simple */, 0, new Position(1, 1), 0));\n    }\n    dispose(context) {\n        this._removeTrackedRange(context);\n    }\n    startTrackingSelection(context) {\n        this._trackSelection = true;\n        this._updateTrackedRange(context);\n    }\n    stopTrackingSelection(context) {\n        this._trackSelection = false;\n        this._removeTrackedRange(context);\n    }\n    _updateTrackedRange(context) {\n        if (!this._trackSelection) {\n            // don't track the selection\n            return;\n        }\n        this._selTrackedRange = context.model._setTrackedRange(this._selTrackedRange, this.modelState.selection, 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */);\n    }\n    _removeTrackedRange(context) {\n        this._selTrackedRange = context.model._setTrackedRange(this._selTrackedRange, null, 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */);\n    }\n    asCursorState() {\n        return new CursorState(this.modelState, this.viewState);\n    }\n    readSelectionFromMarkers(context) {\n        const range = context.model._getTrackedRange(this._selTrackedRange);\n        if (this.modelState.selection.isEmpty() && !range.isEmpty()) {\n            // Avoid selecting text when recovering from markers\n            return Selection.fromRange(range.collapseToEnd(), this.modelState.selection.getDirection());\n        }\n        return Selection.fromRange(range, this.modelState.selection.getDirection());\n    }\n    ensureValidState(context) {\n        this._setState(context, this.modelState, this.viewState);\n    }\n    setState(context, modelState, viewState) {\n        this._setState(context, modelState, viewState);\n    }\n    static _validatePositionWithCache(viewModel, position, cacheInput, cacheOutput) {\n        if (position.equals(cacheInput)) {\n            return cacheOutput;\n        }\n        return viewModel.normalizePosition(position, 2 /* PositionAffinity.None */);\n    }\n    static _validateViewState(viewModel, viewState) {\n        const position = viewState.position;\n        const sStartPosition = viewState.selectionStart.getStartPosition();\n        const sEndPosition = viewState.selectionStart.getEndPosition();\n        const validPosition = viewModel.normalizePosition(position, 2 /* PositionAffinity.None */);\n        const validSStartPosition = this._validatePositionWithCache(viewModel, sStartPosition, position, validPosition);\n        const validSEndPosition = this._validatePositionWithCache(viewModel, sEndPosition, sStartPosition, validSStartPosition);\n        if (position.equals(validPosition) && sStartPosition.equals(validSStartPosition) && sEndPosition.equals(validSEndPosition)) {\n            // fast path: the state is valid\n            return viewState;\n        }\n        return new SingleCursorState(Range.fromPositions(validSStartPosition, validSEndPosition), viewState.selectionStartKind, viewState.selectionStartLeftoverVisibleColumns + sStartPosition.column - validSStartPosition.column, validPosition, viewState.leftoverVisibleColumns + position.column - validPosition.column);\n    }\n    _setState(context, modelState, viewState) {\n        if (viewState) {\n            viewState = Cursor._validateViewState(context.viewModel, viewState);\n        }\n        if (!modelState) {\n            if (!viewState) {\n                return;\n            }\n            // We only have the view state => compute the model state\n            const selectionStart = context.model.validateRange(context.coordinatesConverter.convertViewRangeToModelRange(viewState.selectionStart));\n            const position = context.model.validatePosition(context.coordinatesConverter.convertViewPositionToModelPosition(viewState.position));\n            modelState = new SingleCursorState(selectionStart, viewState.selectionStartKind, viewState.selectionStartLeftoverVisibleColumns, position, viewState.leftoverVisibleColumns);\n        }\n        else {\n            // Validate new model state\n            const selectionStart = context.model.validateRange(modelState.selectionStart);\n            const selectionStartLeftoverVisibleColumns = modelState.selectionStart.equalsRange(selectionStart) ? modelState.selectionStartLeftoverVisibleColumns : 0;\n            const position = context.model.validatePosition(modelState.position);\n            const leftoverVisibleColumns = modelState.position.equals(position) ? modelState.leftoverVisibleColumns : 0;\n            modelState = new SingleCursorState(selectionStart, modelState.selectionStartKind, selectionStartLeftoverVisibleColumns, position, leftoverVisibleColumns);\n        }\n        if (!viewState) {\n            // We only have the model state => compute the view state\n            const viewSelectionStart1 = context.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelState.selectionStart.startLineNumber, modelState.selectionStart.startColumn));\n            const viewSelectionStart2 = context.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelState.selectionStart.endLineNumber, modelState.selectionStart.endColumn));\n            const viewSelectionStart = new Range(viewSelectionStart1.lineNumber, viewSelectionStart1.column, viewSelectionStart2.lineNumber, viewSelectionStart2.column);\n            const viewPosition = context.coordinatesConverter.convertModelPositionToViewPosition(modelState.position);\n            viewState = new SingleCursorState(viewSelectionStart, modelState.selectionStartKind, modelState.selectionStartLeftoverVisibleColumns, viewPosition, modelState.leftoverVisibleColumns);\n        }\n        else {\n            // Validate new view state\n            const viewSelectionStart = context.coordinatesConverter.validateViewRange(viewState.selectionStart, modelState.selectionStart);\n            const viewPosition = context.coordinatesConverter.validateViewPosition(viewState.position, modelState.position);\n            viewState = new SingleCursorState(viewSelectionStart, modelState.selectionStartKind, modelState.selectionStartLeftoverVisibleColumns, viewPosition, modelState.leftoverVisibleColumns);\n        }\n        this.modelState = modelState;\n        this.viewState = viewState;\n        this._updateTrackedRange(context);\n    }\n}\n\nexport { Cursor };\n","import { compareBy } from '../../../base/common/arrays.js';\nimport { findFirstMin, findLastMax } from '../../../base/common/arraysFind.js';\nimport { CursorState } from '../cursorCommon.js';\nimport { Cursor } from './oneCursor.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { Selection } from '../core/selection.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CursorCollection {\n    constructor(context) {\n        this.context = context;\n        this.cursors = [new Cursor(context)];\n        this.lastAddedCursorIndex = 0;\n    }\n    dispose() {\n        for (const cursor of this.cursors) {\n            cursor.dispose(this.context);\n        }\n    }\n    startTrackingSelections() {\n        for (const cursor of this.cursors) {\n            cursor.startTrackingSelection(this.context);\n        }\n    }\n    stopTrackingSelections() {\n        for (const cursor of this.cursors) {\n            cursor.stopTrackingSelection(this.context);\n        }\n    }\n    updateContext(context) {\n        this.context = context;\n    }\n    ensureValidState() {\n        for (const cursor of this.cursors) {\n            cursor.ensureValidState(this.context);\n        }\n    }\n    readSelectionFromMarkers() {\n        return this.cursors.map(c => c.readSelectionFromMarkers(this.context));\n    }\n    getAll() {\n        return this.cursors.map(c => c.asCursorState());\n    }\n    getViewPositions() {\n        return this.cursors.map(c => c.viewState.position);\n    }\n    getTopMostViewPosition() {\n        return findFirstMin(this.cursors, compareBy(c => c.viewState.position, Position.compare)).viewState.position;\n    }\n    getBottomMostViewPosition() {\n        return findLastMax(this.cursors, compareBy(c => c.viewState.position, Position.compare)).viewState.position;\n    }\n    getSelections() {\n        return this.cursors.map(c => c.modelState.selection);\n    }\n    getViewSelections() {\n        return this.cursors.map(c => c.viewState.selection);\n    }\n    setSelections(selections) {\n        this.setStates(CursorState.fromModelSelections(selections));\n    }\n    getPrimaryCursor() {\n        return this.cursors[0].asCursorState();\n    }\n    setStates(states) {\n        if (states === null) {\n            return;\n        }\n        this.cursors[0].setState(this.context, states[0].modelState, states[0].viewState);\n        this._setSecondaryStates(states.slice(1));\n    }\n    /**\n     * Creates or disposes secondary cursors as necessary to match the number of `secondarySelections`.\n     */\n    _setSecondaryStates(secondaryStates) {\n        const secondaryCursorsLength = this.cursors.length - 1;\n        const secondaryStatesLength = secondaryStates.length;\n        if (secondaryCursorsLength < secondaryStatesLength) {\n            const createCnt = secondaryStatesLength - secondaryCursorsLength;\n            for (let i = 0; i < createCnt; i++) {\n                this._addSecondaryCursor();\n            }\n        }\n        else if (secondaryCursorsLength > secondaryStatesLength) {\n            const removeCnt = secondaryCursorsLength - secondaryStatesLength;\n            for (let i = 0; i < removeCnt; i++) {\n                this._removeSecondaryCursor(this.cursors.length - 2);\n            }\n        }\n        for (let i = 0; i < secondaryStatesLength; i++) {\n            this.cursors[i + 1].setState(this.context, secondaryStates[i].modelState, secondaryStates[i].viewState);\n        }\n    }\n    killSecondaryCursors() {\n        this._setSecondaryStates([]);\n    }\n    _addSecondaryCursor() {\n        this.cursors.push(new Cursor(this.context));\n        this.lastAddedCursorIndex = this.cursors.length - 1;\n    }\n    getLastAddedCursorIndex() {\n        if (this.cursors.length === 1 || this.lastAddedCursorIndex === 0) {\n            return 0;\n        }\n        return this.lastAddedCursorIndex;\n    }\n    _removeSecondaryCursor(removeIndex) {\n        if (this.lastAddedCursorIndex >= removeIndex + 1) {\n            this.lastAddedCursorIndex--;\n        }\n        this.cursors[removeIndex + 1].dispose(this.context);\n        this.cursors.splice(removeIndex + 1, 1);\n    }\n    normalize() {\n        if (this.cursors.length === 1) {\n            return;\n        }\n        const cursors = this.cursors.slice(0);\n        const sortedCursors = [];\n        for (let i = 0, len = cursors.length; i < len; i++) {\n            sortedCursors.push({\n                index: i,\n                selection: cursors[i].modelState.selection,\n            });\n        }\n        sortedCursors.sort(compareBy(s => s.selection, Range.compareRangesUsingStarts));\n        for (let sortedCursorIndex = 0; sortedCursorIndex < sortedCursors.length - 1; sortedCursorIndex++) {\n            const current = sortedCursors[sortedCursorIndex];\n            const next = sortedCursors[sortedCursorIndex + 1];\n            const currentSelection = current.selection;\n            const nextSelection = next.selection;\n            if (!this.context.cursorConfig.multiCursorMergeOverlapping) {\n                continue;\n            }\n            let shouldMergeCursors;\n            if (nextSelection.isEmpty() || currentSelection.isEmpty()) {\n                // Merge touching cursors if one of them is collapsed\n                shouldMergeCursors = nextSelection.getStartPosition().isBeforeOrEqual(currentSelection.getEndPosition());\n            }\n            else {\n                // Merge only overlapping cursors (i.e. allow touching ranges)\n                shouldMergeCursors = nextSelection.getStartPosition().isBefore(currentSelection.getEndPosition());\n            }\n            if (shouldMergeCursors) {\n                const winnerSortedCursorIndex = current.index < next.index ? sortedCursorIndex : sortedCursorIndex + 1;\n                const looserSortedCursorIndex = current.index < next.index ? sortedCursorIndex + 1 : sortedCursorIndex;\n                const looserIndex = sortedCursors[looserSortedCursorIndex].index;\n                const winnerIndex = sortedCursors[winnerSortedCursorIndex].index;\n                const looserSelection = sortedCursors[looserSortedCursorIndex].selection;\n                const winnerSelection = sortedCursors[winnerSortedCursorIndex].selection;\n                if (!looserSelection.equalsSelection(winnerSelection)) {\n                    const resultingRange = looserSelection.plusRange(winnerSelection);\n                    const looserSelectionIsLTR = (looserSelection.selectionStartLineNumber === looserSelection.startLineNumber && looserSelection.selectionStartColumn === looserSelection.startColumn);\n                    const winnerSelectionIsLTR = (winnerSelection.selectionStartLineNumber === winnerSelection.startLineNumber && winnerSelection.selectionStartColumn === winnerSelection.startColumn);\n                    // Give more importance to the last added cursor (think Ctrl-dragging + hitting another cursor)\n                    let resultingSelectionIsLTR;\n                    if (looserIndex === this.lastAddedCursorIndex) {\n                        resultingSelectionIsLTR = looserSelectionIsLTR;\n                        this.lastAddedCursorIndex = winnerIndex;\n                    }\n                    else {\n                        // Winner takes it all\n                        resultingSelectionIsLTR = winnerSelectionIsLTR;\n                    }\n                    let resultingSelection;\n                    if (resultingSelectionIsLTR) {\n                        resultingSelection = new Selection(resultingRange.startLineNumber, resultingRange.startColumn, resultingRange.endLineNumber, resultingRange.endColumn);\n                    }\n                    else {\n                        resultingSelection = new Selection(resultingRange.endLineNumber, resultingRange.endColumn, resultingRange.startLineNumber, resultingRange.startColumn);\n                    }\n                    sortedCursors[winnerSortedCursorIndex].selection = resultingSelection;\n                    const resultingState = CursorState.fromModelSelection(resultingSelection);\n                    cursors[winnerIndex].setState(this.context, resultingState.modelState, resultingState.viewState);\n                }\n                for (const sortedCursor of sortedCursors) {\n                    if (sortedCursor.index > looserIndex) {\n                        sortedCursor.index--;\n                    }\n                }\n                cursors.splice(looserIndex, 1);\n                sortedCursors.splice(looserSortedCursorIndex, 1);\n                this._removeSecondaryCursor(looserIndex - 1);\n                sortedCursorIndex--;\n            }\n        }\n    }\n}\n\nexport { CursorCollection };\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 *--------------------------------------------------------------------------------------------*/\nclass CursorContext {\n    constructor(model, viewModel, coordinatesConverter, cursorConfig) {\n        this._cursorContextBrand = undefined;\n        this.model = model;\n        this.viewModel = viewModel;\n        this.coordinatesConverter = coordinatesConverter;\n        this.cursorConfig = cursorConfig;\n    }\n}\n\nexport { CursorContext };\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 *--------------------------------------------------------------------------------------------*/\nclass ViewCompositionStartEvent {\n    constructor() {\n        this.type = 0 /* ViewEventType.ViewCompositionStart */;\n    }\n}\nclass ViewCompositionEndEvent {\n    constructor() {\n        this.type = 1 /* ViewEventType.ViewCompositionEnd */;\n    }\n}\nclass ViewConfigurationChangedEvent {\n    constructor(source) {\n        this.type = 2 /* ViewEventType.ViewConfigurationChanged */;\n        this._source = source;\n    }\n    hasChanged(id) {\n        return this._source.hasChanged(id);\n    }\n}\nclass ViewCursorStateChangedEvent {\n    constructor(selections, modelSelections, reason) {\n        this.selections = selections;\n        this.modelSelections = modelSelections;\n        this.reason = reason;\n        this.type = 3 /* ViewEventType.ViewCursorStateChanged */;\n    }\n}\nclass ViewDecorationsChangedEvent {\n    constructor(source) {\n        this.type = 4 /* ViewEventType.ViewDecorationsChanged */;\n        if (source) {\n            this.affectsMinimap = source.affectsMinimap;\n            this.affectsOverviewRuler = source.affectsOverviewRuler;\n            this.affectsGlyphMargin = source.affectsGlyphMargin;\n            this.affectsLineNumber = source.affectsLineNumber;\n        }\n        else {\n            this.affectsMinimap = true;\n            this.affectsOverviewRuler = true;\n            this.affectsGlyphMargin = true;\n            this.affectsLineNumber = true;\n        }\n    }\n}\nclass ViewFlushedEvent {\n    constructor() {\n        this.type = 5 /* ViewEventType.ViewFlushed */;\n        // Nothing to do\n    }\n}\nclass ViewFocusChangedEvent {\n    constructor(isFocused) {\n        this.type = 6 /* ViewEventType.ViewFocusChanged */;\n        this.isFocused = isFocused;\n    }\n}\nclass ViewLanguageConfigurationEvent {\n    constructor() {\n        this.type = 7 /* ViewEventType.ViewLanguageConfigurationChanged */;\n    }\n}\nclass ViewLineMappingChangedEvent {\n    constructor() {\n        this.type = 8 /* ViewEventType.ViewLineMappingChanged */;\n        // Nothing to do\n    }\n}\nclass ViewLinesChangedEvent {\n    constructor(\n    /**\n     * The first line that has changed.\n     */\n    fromLineNumber, \n    /**\n     * The number of lines that have changed.\n     */\n    count) {\n        this.fromLineNumber = fromLineNumber;\n        this.count = count;\n        this.type = 9 /* ViewEventType.ViewLinesChanged */;\n    }\n}\nclass ViewLinesDeletedEvent {\n    constructor(fromLineNumber, toLineNumber) {\n        this.type = 10 /* ViewEventType.ViewLinesDeleted */;\n        this.fromLineNumber = fromLineNumber;\n        this.toLineNumber = toLineNumber;\n    }\n}\nclass ViewLinesInsertedEvent {\n    constructor(fromLineNumber, toLineNumber) {\n        this.type = 11 /* ViewEventType.ViewLinesInserted */;\n        this.fromLineNumber = fromLineNumber;\n        this.toLineNumber = toLineNumber;\n    }\n}\nclass ViewRevealRangeRequestEvent {\n    constructor(\n    /**\n     * Source of the call that caused the event.\n     */\n    source, \n    /**\n     * Reduce the revealing to a minimum (e.g. avoid scrolling if the bounding box is visible and near the viewport edge).\n     */\n    minimalReveal, \n    /**\n     * Range to be reavealed.\n     */\n    range, \n    /**\n     * Selections to be revealed.\n     */\n    selections, \n    /**\n     * The vertical reveal strategy.\n     */\n    verticalType, \n    /**\n     * If true: there should be a horizontal & vertical revealing.\n     * If false: there should be just a vertical revealing.\n     */\n    revealHorizontal, \n    /**\n     * The scroll type.\n     */\n    scrollType) {\n        this.source = source;\n        this.minimalReveal = minimalReveal;\n        this.range = range;\n        this.selections = selections;\n        this.verticalType = verticalType;\n        this.revealHorizontal = revealHorizontal;\n        this.scrollType = scrollType;\n        this.type = 12 /* ViewEventType.ViewRevealRangeRequest */;\n    }\n}\nclass ViewScrollChangedEvent {\n    constructor(source) {\n        this.type = 13 /* ViewEventType.ViewScrollChanged */;\n        this.scrollWidth = source.scrollWidth;\n        this.scrollLeft = source.scrollLeft;\n        this.scrollHeight = source.scrollHeight;\n        this.scrollTop = source.scrollTop;\n        this.scrollWidthChanged = source.scrollWidthChanged;\n        this.scrollLeftChanged = source.scrollLeftChanged;\n        this.scrollHeightChanged = source.scrollHeightChanged;\n        this.scrollTopChanged = source.scrollTopChanged;\n    }\n}\nclass ViewThemeChangedEvent {\n    constructor(theme) {\n        this.theme = theme;\n        this.type = 14 /* ViewEventType.ViewThemeChanged */;\n    }\n}\nclass ViewTokensChangedEvent {\n    constructor(ranges) {\n        this.type = 15 /* ViewEventType.ViewTokensChanged */;\n        this.ranges = ranges;\n    }\n}\nclass ViewTokensColorsChangedEvent {\n    constructor() {\n        this.type = 16 /* ViewEventType.ViewTokensColorsChanged */;\n        // Nothing to do\n    }\n}\nclass ViewZonesChangedEvent {\n    constructor() {\n        this.type = 17 /* ViewEventType.ViewZonesChanged */;\n        // Nothing to do\n    }\n}\n\nexport { ViewCompositionEndEvent, ViewCompositionStartEvent, ViewConfigurationChangedEvent, ViewCursorStateChangedEvent, ViewDecorationsChangedEvent, ViewFlushedEvent, ViewFocusChangedEvent, ViewLanguageConfigurationEvent, ViewLineMappingChangedEvent, ViewLinesChangedEvent, ViewLinesDeletedEvent, ViewLinesInsertedEvent, ViewRevealRangeRequestEvent, ViewScrollChangedEvent, ViewThemeChangedEvent, ViewTokensChangedEvent, ViewTokensColorsChangedEvent, ViewZonesChangedEvent };\n","import { Emitter } from '../../base/common/event.js';\nimport { Disposable } from '../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ViewModelEventDispatcher extends Disposable {\n    constructor() {\n        super();\n        this._onEvent = this._register(new Emitter());\n        this.onEvent = this._onEvent.event;\n        this._eventHandlers = [];\n        this._viewEventQueue = null;\n        this._isConsumingViewEventQueue = false;\n        this._collector = null;\n        this._collectorCnt = 0;\n        this._outgoingEvents = [];\n    }\n    emitOutgoingEvent(e) {\n        this._addOutgoingEvent(e);\n        this._emitOutgoingEvents();\n    }\n    _addOutgoingEvent(e) {\n        for (let i = 0, len = this._outgoingEvents.length; i < len; i++) {\n            const mergeResult = (this._outgoingEvents[i].kind === e.kind ? this._outgoingEvents[i].attemptToMerge(e) : null);\n            if (mergeResult) {\n                this._outgoingEvents[i] = mergeResult;\n                return;\n            }\n        }\n        // not merged\n        this._outgoingEvents.push(e);\n    }\n    _emitOutgoingEvents() {\n        while (this._outgoingEvents.length > 0) {\n            if (this._collector || this._isConsumingViewEventQueue) {\n                // right now collecting or emitting view events, so let's postpone emitting\n                return;\n            }\n            const event = this._outgoingEvents.shift();\n            if (event.isNoOp()) {\n                continue;\n            }\n            this._onEvent.fire(event);\n        }\n    }\n    addViewEventHandler(eventHandler) {\n        for (let i = 0, len = this._eventHandlers.length; i < len; i++) {\n            if (this._eventHandlers[i] === eventHandler) {\n                console.warn('Detected duplicate listener in ViewEventDispatcher', eventHandler);\n            }\n        }\n        this._eventHandlers.push(eventHandler);\n    }\n    removeViewEventHandler(eventHandler) {\n        for (let i = 0; i < this._eventHandlers.length; i++) {\n            if (this._eventHandlers[i] === eventHandler) {\n                this._eventHandlers.splice(i, 1);\n                break;\n            }\n        }\n    }\n    beginEmitViewEvents() {\n        this._collectorCnt++;\n        if (this._collectorCnt === 1) {\n            this._collector = new ViewModelEventsCollector();\n        }\n        return this._collector;\n    }\n    endEmitViewEvents() {\n        this._collectorCnt--;\n        if (this._collectorCnt === 0) {\n            const outgoingEvents = this._collector.outgoingEvents;\n            const viewEvents = this._collector.viewEvents;\n            this._collector = null;\n            for (const outgoingEvent of outgoingEvents) {\n                this._addOutgoingEvent(outgoingEvent);\n            }\n            if (viewEvents.length > 0) {\n                this._emitMany(viewEvents);\n            }\n        }\n        this._emitOutgoingEvents();\n    }\n    emitSingleViewEvent(event) {\n        try {\n            const eventsCollector = this.beginEmitViewEvents();\n            eventsCollector.emitViewEvent(event);\n        }\n        finally {\n            this.endEmitViewEvents();\n        }\n    }\n    _emitMany(events) {\n        if (this._viewEventQueue) {\n            this._viewEventQueue = this._viewEventQueue.concat(events);\n        }\n        else {\n            this._viewEventQueue = events;\n        }\n        if (!this._isConsumingViewEventQueue) {\n            this._consumeViewEventQueue();\n        }\n    }\n    _consumeViewEventQueue() {\n        try {\n            this._isConsumingViewEventQueue = true;\n            this._doConsumeQueue();\n        }\n        finally {\n            this._isConsumingViewEventQueue = false;\n        }\n    }\n    _doConsumeQueue() {\n        while (this._viewEventQueue) {\n            // Empty event queue, as events might come in while sending these off\n            const events = this._viewEventQueue;\n            this._viewEventQueue = null;\n            // Use a clone of the event handlers list, as they might remove themselves\n            const eventHandlers = this._eventHandlers.slice(0);\n            for (const eventHandler of eventHandlers) {\n                eventHandler.handleEvents(events);\n            }\n        }\n    }\n}\nclass ViewModelEventsCollector {\n    constructor() {\n        this.viewEvents = [];\n        this.outgoingEvents = [];\n    }\n    emitViewEvent(event) {\n        this.viewEvents.push(event);\n    }\n    emitOutgoingEvent(e) {\n        this.outgoingEvents.push(e);\n    }\n}\nclass ContentSizeChangedEvent {\n    constructor(oldContentWidth, oldContentHeight, contentWidth, contentHeight) {\n        this.kind = 0 /* OutgoingViewModelEventKind.ContentSizeChanged */;\n        this._oldContentWidth = oldContentWidth;\n        this._oldContentHeight = oldContentHeight;\n        this.contentWidth = contentWidth;\n        this.contentHeight = contentHeight;\n        this.contentWidthChanged = (this._oldContentWidth !== this.contentWidth);\n        this.contentHeightChanged = (this._oldContentHeight !== this.contentHeight);\n    }\n    isNoOp() {\n        return (!this.contentWidthChanged && !this.contentHeightChanged);\n    }\n    attemptToMerge(other) {\n        if (other.kind !== this.kind) {\n            return null;\n        }\n        return new ContentSizeChangedEvent(this._oldContentWidth, this._oldContentHeight, other.contentWidth, other.contentHeight);\n    }\n}\nclass FocusChangedEvent {\n    constructor(oldHasFocus, hasFocus) {\n        this.kind = 1 /* OutgoingViewModelEventKind.FocusChanged */;\n        this.oldHasFocus = oldHasFocus;\n        this.hasFocus = hasFocus;\n    }\n    isNoOp() {\n        return (this.oldHasFocus === this.hasFocus);\n    }\n    attemptToMerge(other) {\n        if (other.kind !== this.kind) {\n            return null;\n        }\n        return new FocusChangedEvent(this.oldHasFocus, other.hasFocus);\n    }\n}\nclass WidgetFocusChangedEvent {\n    constructor(oldHasFocus, hasFocus) {\n        this.kind = 2 /* OutgoingViewModelEventKind.WidgetFocusChanged */;\n        this.oldHasFocus = oldHasFocus;\n        this.hasFocus = hasFocus;\n    }\n    isNoOp() {\n        return (this.oldHasFocus === this.hasFocus);\n    }\n    attemptToMerge(other) {\n        if (other.kind !== this.kind) {\n            return null;\n        }\n        return new FocusChangedEvent(this.oldHasFocus, other.hasFocus);\n    }\n}\nclass ScrollChangedEvent {\n    constructor(oldScrollWidth, oldScrollLeft, oldScrollHeight, oldScrollTop, scrollWidth, scrollLeft, scrollHeight, scrollTop) {\n        this.kind = 3 /* OutgoingViewModelEventKind.ScrollChanged */;\n        this._oldScrollWidth = oldScrollWidth;\n        this._oldScrollLeft = oldScrollLeft;\n        this._oldScrollHeight = oldScrollHeight;\n        this._oldScrollTop = oldScrollTop;\n        this.scrollWidth = scrollWidth;\n        this.scrollLeft = scrollLeft;\n        this.scrollHeight = scrollHeight;\n        this.scrollTop = scrollTop;\n        this.scrollWidthChanged = (this._oldScrollWidth !== this.scrollWidth);\n        this.scrollLeftChanged = (this._oldScrollLeft !== this.scrollLeft);\n        this.scrollHeightChanged = (this._oldScrollHeight !== this.scrollHeight);\n        this.scrollTopChanged = (this._oldScrollTop !== this.scrollTop);\n    }\n    isNoOp() {\n        return (!this.scrollWidthChanged && !this.scrollLeftChanged && !this.scrollHeightChanged && !this.scrollTopChanged);\n    }\n    attemptToMerge(other) {\n        if (other.kind !== this.kind) {\n            return null;\n        }\n        return new ScrollChangedEvent(this._oldScrollWidth, this._oldScrollLeft, this._oldScrollHeight, this._oldScrollTop, other.scrollWidth, other.scrollLeft, other.scrollHeight, other.scrollTop);\n    }\n}\nclass ViewZonesChangedEvent {\n    constructor() {\n        this.kind = 4 /* OutgoingViewModelEventKind.ViewZonesChanged */;\n    }\n    isNoOp() {\n        return false;\n    }\n    attemptToMerge(other) {\n        if (other.kind !== this.kind) {\n            return null;\n        }\n        return this;\n    }\n}\nclass HiddenAreasChangedEvent {\n    constructor() {\n        this.kind = 5 /* OutgoingViewModelEventKind.HiddenAreasChanged */;\n    }\n    isNoOp() {\n        return false;\n    }\n    attemptToMerge(other) {\n        if (other.kind !== this.kind) {\n            return null;\n        }\n        return this;\n    }\n}\nclass CursorStateChangedEvent {\n    constructor(oldSelections, selections, oldModelVersionId, modelVersionId, source, reason, reachedMaxCursorCount) {\n        this.kind = 7 /* OutgoingViewModelEventKind.CursorStateChanged */;\n        this.oldSelections = oldSelections;\n        this.selections = selections;\n        this.oldModelVersionId = oldModelVersionId;\n        this.modelVersionId = modelVersionId;\n        this.source = source;\n        this.reason = reason;\n        this.reachedMaxCursorCount = reachedMaxCursorCount;\n    }\n    static _selectionsAreEqual(a, b) {\n        if (!a && !b) {\n            return true;\n        }\n        if (!a || !b) {\n            return false;\n        }\n        const aLen = a.length;\n        const bLen = b.length;\n        if (aLen !== bLen) {\n            return false;\n        }\n        for (let i = 0; i < aLen; i++) {\n            if (!a[i].equalsSelection(b[i])) {\n                return false;\n            }\n        }\n        return true;\n    }\n    isNoOp() {\n        return (CursorStateChangedEvent._selectionsAreEqual(this.oldSelections, this.selections)\n            && this.oldModelVersionId === this.modelVersionId);\n    }\n    attemptToMerge(other) {\n        if (other.kind !== this.kind) {\n            return null;\n        }\n        return new CursorStateChangedEvent(this.oldSelections, other.selections, this.oldModelVersionId, other.modelVersionId, other.source, other.reason, this.reachedMaxCursorCount || other.reachedMaxCursorCount);\n    }\n}\nclass ReadOnlyEditAttemptEvent {\n    constructor() {\n        this.kind = 6 /* OutgoingViewModelEventKind.ReadOnlyEditAttempt */;\n    }\n    isNoOp() {\n        return false;\n    }\n    attemptToMerge(other) {\n        if (other.kind !== this.kind) {\n            return null;\n        }\n        return this;\n    }\n}\nclass ModelDecorationsChangedEvent {\n    constructor(event) {\n        this.event = event;\n        this.kind = 8 /* OutgoingViewModelEventKind.ModelDecorationsChanged */;\n    }\n    isNoOp() {\n        return false;\n    }\n    attemptToMerge(other) {\n        return null;\n    }\n}\nclass ModelLanguageChangedEvent {\n    constructor(event) {\n        this.event = event;\n        this.kind = 9 /* OutgoingViewModelEventKind.ModelLanguageChanged */;\n    }\n    isNoOp() {\n        return false;\n    }\n    attemptToMerge(other) {\n        return null;\n    }\n}\nclass ModelLanguageConfigurationChangedEvent {\n    constructor(event) {\n        this.event = event;\n        this.kind = 10 /* OutgoingViewModelEventKind.ModelLanguageConfigurationChanged */;\n    }\n    isNoOp() {\n        return false;\n    }\n    attemptToMerge(other) {\n        return null;\n    }\n}\nclass ModelContentChangedEvent {\n    constructor(event) {\n        this.event = event;\n        this.kind = 11 /* OutgoingViewModelEventKind.ModelContentChanged */;\n    }\n    isNoOp() {\n        return false;\n    }\n    attemptToMerge(other) {\n        return null;\n    }\n}\nclass ModelOptionsChangedEvent {\n    constructor(event) {\n        this.event = event;\n        this.kind = 12 /* OutgoingViewModelEventKind.ModelOptionsChanged */;\n    }\n    isNoOp() {\n        return false;\n    }\n    attemptToMerge(other) {\n        return null;\n    }\n}\nclass ModelTokensChangedEvent {\n    constructor(event) {\n        this.event = event;\n        this.kind = 13 /* OutgoingViewModelEventKind.ModelTokensChanged */;\n    }\n    isNoOp() {\n        return false;\n    }\n    attemptToMerge(other) {\n        return null;\n    }\n}\nclass ModelLineHeightChangedEvent {\n    constructor(event) {\n        this.event = event;\n        this.kind = 14 /* OutgoingViewModelEventKind.ModelLineHeightChanged */;\n    }\n    isNoOp() {\n        return false;\n    }\n    attemptToMerge(other) {\n        return null;\n    }\n}\nclass ModelFontChangedEvent {\n    constructor(event) {\n        this.event = event;\n        this.kind = 15 /* OutgoingViewModelEventKind.ModelFontChangedEvent */;\n    }\n    isNoOp() {\n        return false;\n    }\n    attemptToMerge(other) {\n        return null;\n    }\n}\n\nexport { ContentSizeChangedEvent, CursorStateChangedEvent, FocusChangedEvent, HiddenAreasChangedEvent, ModelContentChangedEvent, ModelDecorationsChangedEvent, ModelFontChangedEvent, ModelLanguageChangedEvent, ModelLanguageConfigurationChangedEvent, ModelLineHeightChangedEvent, ModelOptionsChangedEvent, ModelTokensChangedEvent, ReadOnlyEditAttemptEvent, ScrollChangedEvent, ViewModelEventDispatcher, ViewModelEventsCollector, ViewZonesChangedEvent, WidgetFocusChangedEvent };\n","import { onUnexpectedError } from '../../../base/common/errors.js';\nimport { nextCharLength, commonPrefixLength, commonSuffixLength } from '../../../base/common/strings.js';\nimport { CursorCollection } from './cursorCollection.js';\nimport { CursorState, EditOperationResult } from '../cursorCommon.js';\nimport { CursorContext } from './cursorContext.js';\nimport { DeleteOperations } from './cursorDeleteOperations.js';\nimport { TypeOperations, CompositionOutcome } from './cursorTypeOperations.js';\nimport { BaseTypeWithAutoClosingCommand } from './cursorTypeEditOperations.js';\nimport { Range } from '../core/range.js';\nimport { Selection } from '../core/selection.js';\nimport { ModelInjectedTextChangedEvent } from '../textModelEvents.js';\nimport { ViewRevealRangeRequestEvent, ViewCursorStateChangedEvent } from '../viewEvents.js';\nimport { Disposable, dispose } from '../../../base/common/lifecycle.js';\nimport { CursorStateChangedEvent } from '../viewModelEventDispatcher.js';\nimport { EditSources } from '../textModelEditSource.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CursorsController extends Disposable {\n    constructor(model, viewModel, coordinatesConverter, cursorConfig) {\n        super();\n        this._model = model;\n        this._knownModelVersionId = this._model.getVersionId();\n        this._viewModel = viewModel;\n        this._coordinatesConverter = coordinatesConverter;\n        this.context = new CursorContext(this._model, this._viewModel, this._coordinatesConverter, cursorConfig);\n        this._cursors = new CursorCollection(this.context);\n        this._hasFocus = false;\n        this._isHandling = false;\n        this._compositionState = null;\n        this._columnSelectData = null;\n        this._autoClosedActions = [];\n        this._prevEditOperationType = 0 /* EditOperationType.Other */;\n    }\n    dispose() {\n        this._cursors.dispose();\n        this._autoClosedActions = dispose(this._autoClosedActions);\n        super.dispose();\n    }\n    updateConfiguration(cursorConfig) {\n        this.context = new CursorContext(this._model, this._viewModel, this._coordinatesConverter, cursorConfig);\n        this._cursors.updateContext(this.context);\n    }\n    onLineMappingChanged(eventsCollector) {\n        if (this._knownModelVersionId !== this._model.getVersionId()) {\n            // There are model change events that I didn't yet receive.\n            //\n            // This can happen when editing the model, and the view model receives the change events first,\n            // and the view model emits line mapping changed events, all before the cursor gets a chance to\n            // recover from markers.\n            //\n            // The model change listener above will be called soon and we'll ensure a valid cursor state there.\n            return;\n        }\n        // Ensure valid state\n        this.setStates(eventsCollector, 'viewModel', 0 /* CursorChangeReason.NotSet */, this.getCursorStates());\n    }\n    setHasFocus(hasFocus) {\n        this._hasFocus = hasFocus;\n    }\n    _validateAutoClosedActions() {\n        if (this._autoClosedActions.length > 0) {\n            const selections = this._cursors.getSelections();\n            for (let i = 0; i < this._autoClosedActions.length; i++) {\n                const autoClosedAction = this._autoClosedActions[i];\n                if (!autoClosedAction.isValid(selections)) {\n                    autoClosedAction.dispose();\n                    this._autoClosedActions.splice(i, 1);\n                    i--;\n                }\n            }\n        }\n    }\n    // ------ some getters/setters\n    getPrimaryCursorState() {\n        return this._cursors.getPrimaryCursor();\n    }\n    getLastAddedCursorIndex() {\n        return this._cursors.getLastAddedCursorIndex();\n    }\n    getCursorStates() {\n        return this._cursors.getAll();\n    }\n    setStates(eventsCollector, source, reason, states) {\n        let reachedMaxCursorCount = false;\n        const multiCursorLimit = this.context.cursorConfig.multiCursorLimit;\n        if (states !== null && states.length > multiCursorLimit) {\n            states = states.slice(0, multiCursorLimit);\n            reachedMaxCursorCount = true;\n        }\n        const oldState = CursorModelState.from(this._model, this);\n        this._cursors.setStates(states);\n        this._cursors.normalize();\n        this._columnSelectData = null;\n        this._validateAutoClosedActions();\n        return this._emitStateChangedIfNecessary(eventsCollector, source, reason, oldState, reachedMaxCursorCount);\n    }\n    setCursorColumnSelectData(columnSelectData) {\n        this._columnSelectData = columnSelectData;\n    }\n    revealAll(eventsCollector, source, minimalReveal, verticalType, revealHorizontal, scrollType) {\n        const viewPositions = this._cursors.getViewPositions();\n        let revealViewRange = null;\n        let revealViewSelections = null;\n        if (viewPositions.length > 1) {\n            revealViewSelections = this._cursors.getViewSelections();\n        }\n        else {\n            revealViewRange = Range.fromPositions(viewPositions[0], viewPositions[0]);\n        }\n        eventsCollector.emitViewEvent(new ViewRevealRangeRequestEvent(source, minimalReveal, revealViewRange, revealViewSelections, verticalType, revealHorizontal, scrollType));\n    }\n    revealPrimary(eventsCollector, source, minimalReveal, verticalType, revealHorizontal, scrollType) {\n        const primaryCursor = this._cursors.getPrimaryCursor();\n        const revealViewSelections = [primaryCursor.viewState.selection];\n        eventsCollector.emitViewEvent(new ViewRevealRangeRequestEvent(source, minimalReveal, null, revealViewSelections, verticalType, revealHorizontal, scrollType));\n    }\n    saveState() {\n        const result = [];\n        const selections = this._cursors.getSelections();\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const selection = selections[i];\n            result.push({\n                inSelectionMode: !selection.isEmpty(),\n                selectionStart: {\n                    lineNumber: selection.selectionStartLineNumber,\n                    column: selection.selectionStartColumn,\n                },\n                position: {\n                    lineNumber: selection.positionLineNumber,\n                    column: selection.positionColumn,\n                }\n            });\n        }\n        return result;\n    }\n    restoreState(eventsCollector, states) {\n        const desiredSelections = [];\n        for (let i = 0, len = states.length; i < len; i++) {\n            const state = states[i];\n            let positionLineNumber = 1;\n            let positionColumn = 1;\n            // Avoid missing properties on the literal\n            if (state.position && state.position.lineNumber) {\n                positionLineNumber = state.position.lineNumber;\n            }\n            if (state.position && state.position.column) {\n                positionColumn = state.position.column;\n            }\n            let selectionStartLineNumber = positionLineNumber;\n            let selectionStartColumn = positionColumn;\n            // Avoid missing properties on the literal\n            if (state.selectionStart && state.selectionStart.lineNumber) {\n                selectionStartLineNumber = state.selectionStart.lineNumber;\n            }\n            if (state.selectionStart && state.selectionStart.column) {\n                selectionStartColumn = state.selectionStart.column;\n            }\n            desiredSelections.push({\n                selectionStartLineNumber: selectionStartLineNumber,\n                selectionStartColumn: selectionStartColumn,\n                positionLineNumber: positionLineNumber,\n                positionColumn: positionColumn\n            });\n        }\n        this.setStates(eventsCollector, 'restoreState', 0 /* CursorChangeReason.NotSet */, CursorState.fromModelSelections(desiredSelections));\n        this.revealAll(eventsCollector, 'restoreState', false, 0 /* VerticalRevealType.Simple */, true, 1 /* editorCommon.ScrollType.Immediate */);\n    }\n    onModelContentChanged(eventsCollector, event) {\n        if (event instanceof ModelInjectedTextChangedEvent) {\n            // If injected texts change, the view positions of all cursors need to be updated.\n            if (this._isHandling) {\n                // The view positions will be updated when handling finishes\n                return;\n            }\n            // setStates might remove markers, which could trigger a decoration change.\n            // If there are injected text decorations for that line, `onModelContentChanged` is emitted again\n            // and an endless recursion happens.\n            // _isHandling prevents that.\n            this._isHandling = true;\n            try {\n                this.setStates(eventsCollector, 'modelChange', 0 /* CursorChangeReason.NotSet */, this.getCursorStates());\n            }\n            finally {\n                this._isHandling = false;\n            }\n        }\n        else {\n            const e = event.rawContentChangedEvent;\n            this._knownModelVersionId = e.versionId;\n            if (this._isHandling) {\n                return;\n            }\n            const hadFlushEvent = e.containsEvent(1 /* RawContentChangedType.Flush */);\n            this._prevEditOperationType = 0 /* EditOperationType.Other */;\n            if (hadFlushEvent) {\n                // a model.setValue() was called\n                this._cursors.dispose();\n                this._cursors = new CursorCollection(this.context);\n                this._validateAutoClosedActions();\n                this._emitStateChangedIfNecessary(eventsCollector, 'model', 1 /* CursorChangeReason.ContentFlush */, null, false);\n            }\n            else {\n                if (this._hasFocus && e.resultingSelection && e.resultingSelection.length > 0) {\n                    const cursorState = CursorState.fromModelSelections(e.resultingSelection);\n                    if (this.setStates(eventsCollector, 'modelChange', e.isUndoing ? 5 /* CursorChangeReason.Undo */ : e.isRedoing ? 6 /* CursorChangeReason.Redo */ : 2 /* CursorChangeReason.RecoverFromMarkers */, cursorState)) {\n                        this.revealAll(eventsCollector, 'modelChange', false, 0 /* VerticalRevealType.Simple */, true, 0 /* editorCommon.ScrollType.Smooth */);\n                    }\n                }\n                else {\n                    const selectionsFromMarkers = this._cursors.readSelectionFromMarkers();\n                    this.setStates(eventsCollector, 'modelChange', 2 /* CursorChangeReason.RecoverFromMarkers */, CursorState.fromModelSelections(selectionsFromMarkers));\n                }\n            }\n        }\n    }\n    getSelection() {\n        return this._cursors.getPrimaryCursor().modelState.selection;\n    }\n    getTopMostViewPosition() {\n        return this._cursors.getTopMostViewPosition();\n    }\n    getBottomMostViewPosition() {\n        return this._cursors.getBottomMostViewPosition();\n    }\n    getCursorColumnSelectData() {\n        if (this._columnSelectData) {\n            return this._columnSelectData;\n        }\n        const primaryCursor = this._cursors.getPrimaryCursor();\n        const viewSelectionStart = primaryCursor.viewState.selectionStart.getStartPosition();\n        const viewPosition = primaryCursor.viewState.position;\n        return {\n            isReal: false,\n            fromViewLineNumber: viewSelectionStart.lineNumber,\n            fromViewVisualColumn: this.context.cursorConfig.visibleColumnFromColumn(this._viewModel, viewSelectionStart),\n            toViewLineNumber: viewPosition.lineNumber,\n            toViewVisualColumn: this.context.cursorConfig.visibleColumnFromColumn(this._viewModel, viewPosition),\n        };\n    }\n    getSelections() {\n        return this._cursors.getSelections();\n    }\n    setSelections(eventsCollector, source, selections, reason) {\n        this.setStates(eventsCollector, source, reason, CursorState.fromModelSelections(selections));\n    }\n    getPrevEditOperationType() {\n        return this._prevEditOperationType;\n    }\n    setPrevEditOperationType(type) {\n        this._prevEditOperationType = type;\n    }\n    // ------ auxiliary handling logic\n    _pushAutoClosedAction(autoClosedCharactersRanges, autoClosedEnclosingRanges) {\n        const autoClosedCharactersDeltaDecorations = [];\n        const autoClosedEnclosingDeltaDecorations = [];\n        for (let i = 0, len = autoClosedCharactersRanges.length; i < len; i++) {\n            autoClosedCharactersDeltaDecorations.push({\n                range: autoClosedCharactersRanges[i],\n                options: {\n                    description: 'auto-closed-character',\n                    inlineClassName: 'auto-closed-character',\n                    stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */\n                }\n            });\n            autoClosedEnclosingDeltaDecorations.push({\n                range: autoClosedEnclosingRanges[i],\n                options: {\n                    description: 'auto-closed-enclosing',\n                    stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */\n                }\n            });\n        }\n        const autoClosedCharactersDecorations = this._model.deltaDecorations([], autoClosedCharactersDeltaDecorations);\n        const autoClosedEnclosingDecorations = this._model.deltaDecorations([], autoClosedEnclosingDeltaDecorations);\n        this._autoClosedActions.push(new AutoClosedAction(this._model, autoClosedCharactersDecorations, autoClosedEnclosingDecorations));\n    }\n    _executeEditOperation(opResult, editReason) {\n        if (!opResult) {\n            // Nothing to execute\n            return;\n        }\n        if (opResult.shouldPushStackElementBefore) {\n            this._model.pushStackElement();\n        }\n        const result = CommandExecutor.executeCommands(this._model, this._cursors.getSelections(), opResult.commands, editReason);\n        if (result) {\n            // The commands were applied correctly\n            this._interpretCommandResult(result);\n            // Check for auto-closing closed characters\n            const autoClosedCharactersRanges = [];\n            const autoClosedEnclosingRanges = [];\n            for (let i = 0; i < opResult.commands.length; i++) {\n                const command = opResult.commands[i];\n                if (command instanceof BaseTypeWithAutoClosingCommand && command.enclosingRange && command.closeCharacterRange) {\n                    autoClosedCharactersRanges.push(command.closeCharacterRange);\n                    autoClosedEnclosingRanges.push(command.enclosingRange);\n                }\n            }\n            if (autoClosedCharactersRanges.length > 0) {\n                this._pushAutoClosedAction(autoClosedCharactersRanges, autoClosedEnclosingRanges);\n            }\n            this._prevEditOperationType = opResult.type;\n        }\n        if (opResult.shouldPushStackElementAfter) {\n            this._model.pushStackElement();\n        }\n    }\n    _interpretCommandResult(cursorState) {\n        if (!cursorState || cursorState.length === 0) {\n            cursorState = this._cursors.readSelectionFromMarkers();\n        }\n        this._columnSelectData = null;\n        this._cursors.setSelections(cursorState);\n        this._cursors.normalize();\n    }\n    // -----------------------------------------------------------------------------------------------------------\n    // ----- emitting events\n    _emitStateChangedIfNecessary(eventsCollector, source, reason, oldState, reachedMaxCursorCount) {\n        const newState = CursorModelState.from(this._model, this);\n        if (newState.equals(oldState)) {\n            return false;\n        }\n        const selections = this._cursors.getSelections();\n        const viewSelections = this._cursors.getViewSelections();\n        // Let the view get the event first.\n        eventsCollector.emitViewEvent(new ViewCursorStateChangedEvent(viewSelections, selections, reason));\n        // Only after the view has been notified, let the rest of the world know...\n        if (!oldState\n            || oldState.cursorState.length !== newState.cursorState.length\n            || newState.cursorState.some((newCursorState, i) => !newCursorState.modelState.equals(oldState.cursorState[i].modelState))) {\n            const oldSelections = oldState ? oldState.cursorState.map(s => s.modelState.selection) : null;\n            const oldModelVersionId = oldState ? oldState.modelVersionId : 0;\n            eventsCollector.emitOutgoingEvent(new CursorStateChangedEvent(oldSelections, selections, oldModelVersionId, newState.modelVersionId, source || 'keyboard', reason, reachedMaxCursorCount));\n        }\n        return true;\n    }\n    // -----------------------------------------------------------------------------------------------------------\n    // ----- handlers beyond this point\n    _findAutoClosingPairs(edits) {\n        if (!edits.length) {\n            return null;\n        }\n        const indices = [];\n        for (let i = 0, len = edits.length; i < len; i++) {\n            const edit = edits[i];\n            if (!edit.text || edit.text.indexOf('\\n') >= 0) {\n                return null;\n            }\n            const m = edit.text.match(/([)\\]}>'\"`])([^)\\]}>'\"`]*)$/);\n            if (!m) {\n                return null;\n            }\n            const closeChar = m[1];\n            const autoClosingPairsCandidates = this.context.cursorConfig.autoClosingPairs.autoClosingPairsCloseSingleChar.get(closeChar);\n            if (!autoClosingPairsCandidates || autoClosingPairsCandidates.length !== 1) {\n                return null;\n            }\n            const openChar = autoClosingPairsCandidates[0].open;\n            const closeCharIndex = edit.text.length - m[2].length - 1;\n            const openCharIndex = edit.text.lastIndexOf(openChar, closeCharIndex - 1);\n            if (openCharIndex === -1) {\n                return null;\n            }\n            indices.push([openCharIndex, closeCharIndex]);\n        }\n        return indices;\n    }\n    executeEdits(eventsCollector, source, edits, cursorStateComputer, reason) {\n        let autoClosingIndices = null;\n        if (source === 'snippet') {\n            autoClosingIndices = this._findAutoClosingPairs(edits);\n        }\n        if (autoClosingIndices) {\n            edits[0]._isTracked = true;\n        }\n        const autoClosedCharactersRanges = [];\n        const autoClosedEnclosingRanges = [];\n        const selections = this._model.pushEditOperations(this.getSelections(), edits, (undoEdits) => {\n            if (autoClosingIndices) {\n                for (let i = 0, len = autoClosingIndices.length; i < len; i++) {\n                    const [openCharInnerIndex, closeCharInnerIndex] = autoClosingIndices[i];\n                    const undoEdit = undoEdits[i];\n                    const lineNumber = undoEdit.range.startLineNumber;\n                    const openCharIndex = undoEdit.range.startColumn - 1 + openCharInnerIndex;\n                    const closeCharIndex = undoEdit.range.startColumn - 1 + closeCharInnerIndex;\n                    autoClosedCharactersRanges.push(new Range(lineNumber, closeCharIndex + 1, lineNumber, closeCharIndex + 2));\n                    autoClosedEnclosingRanges.push(new Range(lineNumber, openCharIndex + 1, lineNumber, closeCharIndex + 2));\n                }\n            }\n            const selections = cursorStateComputer(undoEdits);\n            if (selections) {\n                // Don't recover the selection from markers because\n                // we know what it should be.\n                this._isHandling = true;\n            }\n            return selections;\n        }, undefined, reason);\n        if (selections) {\n            this._isHandling = false;\n            this.setSelections(eventsCollector, source, selections, 0 /* CursorChangeReason.NotSet */);\n        }\n        if (autoClosedCharactersRanges.length > 0) {\n            this._pushAutoClosedAction(autoClosedCharactersRanges, autoClosedEnclosingRanges);\n        }\n    }\n    _executeEdit(callback, eventsCollector, source, cursorChangeReason = 0 /* CursorChangeReason.NotSet */) {\n        if (this.context.cursorConfig.readOnly) {\n            // we cannot edit when read only...\n            return;\n        }\n        const oldState = CursorModelState.from(this._model, this);\n        this._cursors.stopTrackingSelections();\n        this._isHandling = true;\n        try {\n            this._cursors.ensureValidState();\n            callback();\n        }\n        catch (err) {\n            onUnexpectedError(err);\n        }\n        this._isHandling = false;\n        this._cursors.startTrackingSelections();\n        this._validateAutoClosedActions();\n        if (this._emitStateChangedIfNecessary(eventsCollector, source, cursorChangeReason, oldState, false)) {\n            this.revealAll(eventsCollector, source, false, 0 /* VerticalRevealType.Simple */, true, 0 /* editorCommon.ScrollType.Smooth */);\n        }\n    }\n    getAutoClosedCharacters() {\n        return AutoClosedAction.getAllAutoClosedCharacters(this._autoClosedActions);\n    }\n    startComposition(eventsCollector) {\n        this._compositionState = new CompositionState(this._model, this.getSelections());\n    }\n    endComposition(eventsCollector, source) {\n        const reason = EditSources.cursor({ kind: 'compositionEnd', detailedSource: source });\n        const compositionOutcome = this._compositionState ? this._compositionState.deduceOutcome(this._model, this.getSelections()) : null;\n        this._compositionState = null;\n        this._executeEdit(() => {\n            if (source === 'keyboard') {\n                // composition finishes, let's check if we need to auto complete if necessary.\n                this._executeEditOperation(TypeOperations.compositionEndWithInterceptors(this._prevEditOperationType, this.context.cursorConfig, this._model, compositionOutcome, this.getSelections(), this.getAutoClosedCharacters()), reason);\n            }\n        }, eventsCollector, source);\n    }\n    type(eventsCollector, text, source) {\n        const reason = EditSources.cursor({ kind: 'type', detailedSource: source });\n        this._executeEdit(() => {\n            if (source === 'keyboard') {\n                // If this event is coming straight from the keyboard, look for electric characters and enter\n                const len = text.length;\n                let offset = 0;\n                while (offset < len) {\n                    const charLength = nextCharLength(text, offset);\n                    const chr = text.substr(offset, charLength);\n                    // Here we must interpret each typed character individually\n                    this._executeEditOperation(TypeOperations.typeWithInterceptors(!!this._compositionState, this._prevEditOperationType, this.context.cursorConfig, this._model, this.getSelections(), this.getAutoClosedCharacters(), chr), reason);\n                    offset += charLength;\n                }\n            }\n            else {\n                this._executeEditOperation(TypeOperations.typeWithoutInterceptors(this._prevEditOperationType, this.context.cursorConfig, this._model, this.getSelections(), text), reason);\n            }\n        }, eventsCollector, source);\n    }\n    compositionType(eventsCollector, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source) {\n        const reason = EditSources.cursor({ kind: 'compositionType', detailedSource: source });\n        if (text.length === 0 && replacePrevCharCnt === 0 && replaceNextCharCnt === 0) {\n            // this edit is a no-op\n            if (positionDelta !== 0) {\n                // but it still wants to move the cursor\n                const newSelections = this.getSelections().map(selection => {\n                    const position = selection.getPosition();\n                    return new Selection(position.lineNumber, position.column + positionDelta, position.lineNumber, position.column + positionDelta);\n                });\n                this.setSelections(eventsCollector, source, newSelections, 0 /* CursorChangeReason.NotSet */);\n            }\n            return;\n        }\n        this._executeEdit(() => {\n            this._executeEditOperation(TypeOperations.compositionType(this._prevEditOperationType, this.context.cursorConfig, this._model, this.getSelections(), text, replacePrevCharCnt, replaceNextCharCnt, positionDelta), reason);\n        }, eventsCollector, source);\n    }\n    paste(eventsCollector, text, pasteOnNewLine, multicursorText, source) {\n        const reason = EditSources.cursor({ kind: 'paste', detailedSource: source });\n        this._executeEdit(() => {\n            this._executeEditOperation(TypeOperations.paste(this.context.cursorConfig, this._model, this.getSelections(), text, pasteOnNewLine, multicursorText || []), reason);\n        }, eventsCollector, source, 4 /* CursorChangeReason.Paste */);\n    }\n    cut(eventsCollector, source) {\n        const reason = EditSources.cursor({ kind: 'cut', detailedSource: source });\n        this._executeEdit(() => {\n            this._executeEditOperation(DeleteOperations.cut(this.context.cursorConfig, this._model, this.getSelections()), reason);\n        }, eventsCollector, source);\n    }\n    executeCommand(eventsCollector, command, source) {\n        const reason = EditSources.cursor({ kind: 'executeCommand', detailedSource: source });\n        this._executeEdit(() => {\n            this._cursors.killSecondaryCursors();\n            this._executeEditOperation(new EditOperationResult(0 /* EditOperationType.Other */, [command], {\n                shouldPushStackElementBefore: false,\n                shouldPushStackElementAfter: false\n            }), reason);\n        }, eventsCollector, source);\n    }\n    executeCommands(eventsCollector, commands, source) {\n        const reason = EditSources.cursor({ kind: 'executeCommands', detailedSource: source });\n        this._executeEdit(() => {\n            this._executeEditOperation(new EditOperationResult(0 /* EditOperationType.Other */, commands, {\n                shouldPushStackElementBefore: false,\n                shouldPushStackElementAfter: false\n            }), reason);\n        }, eventsCollector, source);\n    }\n}\n/**\n * A snapshot of the cursor and the model state\n */\nclass CursorModelState {\n    static from(model, cursor) {\n        return new CursorModelState(model.getVersionId(), cursor.getCursorStates());\n    }\n    constructor(modelVersionId, cursorState) {\n        this.modelVersionId = modelVersionId;\n        this.cursorState = cursorState;\n    }\n    equals(other) {\n        if (!other) {\n            return false;\n        }\n        if (this.modelVersionId !== other.modelVersionId) {\n            return false;\n        }\n        if (this.cursorState.length !== other.cursorState.length) {\n            return false;\n        }\n        for (let i = 0, len = this.cursorState.length; i < len; i++) {\n            if (!this.cursorState[i].equals(other.cursorState[i])) {\n                return false;\n            }\n        }\n        return true;\n    }\n}\nclass AutoClosedAction {\n    static getAllAutoClosedCharacters(autoClosedActions) {\n        let autoClosedCharacters = [];\n        for (const autoClosedAction of autoClosedActions) {\n            autoClosedCharacters = autoClosedCharacters.concat(autoClosedAction.getAutoClosedCharactersRanges());\n        }\n        return autoClosedCharacters;\n    }\n    constructor(model, autoClosedCharactersDecorations, autoClosedEnclosingDecorations) {\n        this._model = model;\n        this._autoClosedCharactersDecorations = autoClosedCharactersDecorations;\n        this._autoClosedEnclosingDecorations = autoClosedEnclosingDecorations;\n    }\n    dispose() {\n        this._autoClosedCharactersDecorations = this._model.deltaDecorations(this._autoClosedCharactersDecorations, []);\n        this._autoClosedEnclosingDecorations = this._model.deltaDecorations(this._autoClosedEnclosingDecorations, []);\n    }\n    getAutoClosedCharactersRanges() {\n        const result = [];\n        for (let i = 0; i < this._autoClosedCharactersDecorations.length; i++) {\n            const decorationRange = this._model.getDecorationRange(this._autoClosedCharactersDecorations[i]);\n            if (decorationRange) {\n                result.push(decorationRange);\n            }\n        }\n        return result;\n    }\n    isValid(selections) {\n        const enclosingRanges = [];\n        for (let i = 0; i < this._autoClosedEnclosingDecorations.length; i++) {\n            const decorationRange = this._model.getDecorationRange(this._autoClosedEnclosingDecorations[i]);\n            if (decorationRange) {\n                enclosingRanges.push(decorationRange);\n                if (decorationRange.startLineNumber !== decorationRange.endLineNumber) {\n                    // Stop tracking if the range becomes multiline...\n                    return false;\n                }\n            }\n        }\n        enclosingRanges.sort(Range.compareRangesUsingStarts);\n        selections.sort(Range.compareRangesUsingStarts);\n        for (let i = 0; i < selections.length; i++) {\n            if (i >= enclosingRanges.length) {\n                return false;\n            }\n            if (!enclosingRanges[i].strictContainsRange(selections[i])) {\n                return false;\n            }\n        }\n        return true;\n    }\n}\nclass CommandExecutor {\n    static executeCommands(model, selectionsBefore, commands, editReason = EditSources.unknown({ name: 'executeCommands' })) {\n        const ctx = {\n            model: model,\n            selectionsBefore: selectionsBefore,\n            trackedRanges: [],\n            trackedRangesDirection: []\n        };\n        const result = this._innerExecuteCommands(ctx, commands, editReason);\n        for (let i = 0, len = ctx.trackedRanges.length; i < len; i++) {\n            ctx.model._setTrackedRange(ctx.trackedRanges[i], null, 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */);\n        }\n        return result;\n    }\n    static _innerExecuteCommands(ctx, commands, editReason) {\n        if (this._arrayIsEmpty(commands)) {\n            return null;\n        }\n        const commandsData = this._getEditOperations(ctx, commands);\n        if (commandsData.operations.length === 0) {\n            return null;\n        }\n        const rawOperations = commandsData.operations;\n        const loserCursorsMap = this._getLoserCursorMap(rawOperations);\n        if (loserCursorsMap.hasOwnProperty('0')) {\n            // These commands are very messed up\n            console.warn('Ignoring commands');\n            return null;\n        }\n        // Remove operations belonging to losing cursors\n        const filteredOperations = [];\n        for (let i = 0, len = rawOperations.length; i < len; i++) {\n            if (!loserCursorsMap.hasOwnProperty(rawOperations[i].identifier.major.toString())) {\n                filteredOperations.push(rawOperations[i]);\n            }\n        }\n        // TODO@Alex: find a better way to do this.\n        // give the hint that edit operations are tracked to the model\n        if (commandsData.hadTrackedEditOperation && filteredOperations.length > 0) {\n            filteredOperations[0]._isTracked = true;\n        }\n        let selectionsAfter = ctx.model.pushEditOperations(ctx.selectionsBefore, filteredOperations, (inverseEditOperations) => {\n            const groupedInverseEditOperations = [];\n            for (let i = 0; i < ctx.selectionsBefore.length; i++) {\n                groupedInverseEditOperations[i] = [];\n            }\n            for (const op of inverseEditOperations) {\n                if (!op.identifier) {\n                    // perhaps auto whitespace trim edits\n                    continue;\n                }\n                groupedInverseEditOperations[op.identifier.major].push(op);\n            }\n            const minorBasedSorter = (a, b) => {\n                return a.identifier.minor - b.identifier.minor;\n            };\n            const cursorSelections = [];\n            for (let i = 0; i < ctx.selectionsBefore.length; i++) {\n                if (groupedInverseEditOperations[i].length > 0) {\n                    groupedInverseEditOperations[i].sort(minorBasedSorter);\n                    cursorSelections[i] = commands[i].computeCursorState(ctx.model, {\n                        getInverseEditOperations: () => {\n                            return groupedInverseEditOperations[i];\n                        },\n                        getTrackedSelection: (id) => {\n                            const idx = parseInt(id, 10);\n                            const range = ctx.model._getTrackedRange(ctx.trackedRanges[idx]);\n                            if (ctx.trackedRangesDirection[idx] === 0 /* SelectionDirection.LTR */) {\n                                return new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn);\n                            }\n                            return new Selection(range.endLineNumber, range.endColumn, range.startLineNumber, range.startColumn);\n                        }\n                    });\n                }\n                else {\n                    cursorSelections[i] = ctx.selectionsBefore[i];\n                }\n            }\n            return cursorSelections;\n        }, undefined, editReason);\n        if (!selectionsAfter) {\n            selectionsAfter = ctx.selectionsBefore;\n        }\n        // Extract losing cursors\n        const losingCursors = [];\n        for (const losingCursorIndex in loserCursorsMap) {\n            if (loserCursorsMap.hasOwnProperty(losingCursorIndex)) {\n                losingCursors.push(parseInt(losingCursorIndex, 10));\n            }\n        }\n        // Sort losing cursors descending\n        losingCursors.sort((a, b) => {\n            return b - a;\n        });\n        // Remove losing cursors\n        for (const losingCursor of losingCursors) {\n            selectionsAfter.splice(losingCursor, 1);\n        }\n        return selectionsAfter;\n    }\n    static _arrayIsEmpty(commands) {\n        for (let i = 0, len = commands.length; i < len; i++) {\n            if (commands[i]) {\n                return false;\n            }\n        }\n        return true;\n    }\n    static _getEditOperations(ctx, commands) {\n        let operations = [];\n        let hadTrackedEditOperation = false;\n        for (let i = 0, len = commands.length; i < len; i++) {\n            const command = commands[i];\n            if (command) {\n                const r = this._getEditOperationsFromCommand(ctx, i, command);\n                operations = operations.concat(r.operations);\n                hadTrackedEditOperation = hadTrackedEditOperation || r.hadTrackedEditOperation;\n            }\n        }\n        return {\n            operations: operations,\n            hadTrackedEditOperation: hadTrackedEditOperation\n        };\n    }\n    static _getEditOperationsFromCommand(ctx, majorIdentifier, command) {\n        // This method acts as a transaction, if the command fails\n        // everything it has done is ignored\n        const operations = [];\n        let operationMinor = 0;\n        const addEditOperation = (range, text, forceMoveMarkers = false) => {\n            if (Range.isEmpty(range) && text === '') {\n                // This command wants to add a no-op => no thank you\n                return;\n            }\n            operations.push({\n                identifier: {\n                    major: majorIdentifier,\n                    minor: operationMinor++\n                },\n                range: range,\n                text: text,\n                forceMoveMarkers: forceMoveMarkers,\n                isAutoWhitespaceEdit: command.insertsAutoWhitespace\n            });\n        };\n        let hadTrackedEditOperation = false;\n        const addTrackedEditOperation = (selection, text, forceMoveMarkers) => {\n            hadTrackedEditOperation = true;\n            addEditOperation(selection, text, forceMoveMarkers);\n        };\n        const trackSelection = (_selection, trackPreviousOnEmpty) => {\n            const selection = Selection.liftSelection(_selection);\n            let stickiness;\n            if (selection.isEmpty()) {\n                if (typeof trackPreviousOnEmpty === 'boolean') {\n                    if (trackPreviousOnEmpty) {\n                        stickiness = 2 /* TrackedRangeStickiness.GrowsOnlyWhenTypingBefore */;\n                    }\n                    else {\n                        stickiness = 3 /* TrackedRangeStickiness.GrowsOnlyWhenTypingAfter */;\n                    }\n                }\n                else {\n                    // Try to lock it with surrounding text\n                    const maxLineColumn = ctx.model.getLineMaxColumn(selection.startLineNumber);\n                    if (selection.startColumn === maxLineColumn) {\n                        stickiness = 2 /* TrackedRangeStickiness.GrowsOnlyWhenTypingBefore */;\n                    }\n                    else {\n                        stickiness = 3 /* TrackedRangeStickiness.GrowsOnlyWhenTypingAfter */;\n                    }\n                }\n            }\n            else {\n                stickiness = 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */;\n            }\n            const l = ctx.trackedRanges.length;\n            const id = ctx.model._setTrackedRange(null, selection, stickiness);\n            ctx.trackedRanges[l] = id;\n            ctx.trackedRangesDirection[l] = selection.getDirection();\n            return l.toString();\n        };\n        const editOperationBuilder = {\n            addEditOperation: addEditOperation,\n            addTrackedEditOperation: addTrackedEditOperation,\n            trackSelection: trackSelection\n        };\n        try {\n            command.getEditOperations(ctx.model, editOperationBuilder);\n        }\n        catch (e) {\n            // TODO@Alex use notification service if this should be user facing\n            // e.friendlyMessage = nls.localize('corrupt.commands', \"Unexpected exception while executing command.\");\n            onUnexpectedError(e);\n            return {\n                operations: [],\n                hadTrackedEditOperation: false\n            };\n        }\n        return {\n            operations: operations,\n            hadTrackedEditOperation: hadTrackedEditOperation\n        };\n    }\n    static _getLoserCursorMap(operations) {\n        // This is destructive on the array\n        operations = operations.slice(0);\n        // Sort operations with last one first\n        operations.sort((a, b) => {\n            // Note the minus!\n            return -(Range.compareRangesUsingEnds(a.range, b.range));\n        });\n        // Operations can not overlap!\n        const loserCursorsMap = {};\n        for (let i = 1; i < operations.length; i++) {\n            const previousOp = operations[i - 1];\n            const currentOp = operations[i];\n            if (Range.getStartPosition(previousOp.range).isBefore(Range.getEndPosition(currentOp.range))) {\n                let loserMajor;\n                if (previousOp.identifier.major > currentOp.identifier.major) {\n                    // previousOp loses the battle\n                    loserMajor = previousOp.identifier.major;\n                }\n                else {\n                    loserMajor = currentOp.identifier.major;\n                }\n                loserCursorsMap[loserMajor.toString()] = true;\n                for (let j = 0; j < operations.length; j++) {\n                    if (operations[j].identifier.major === loserMajor) {\n                        operations.splice(j, 1);\n                        if (j < i) {\n                            i--;\n                        }\n                        j--;\n                    }\n                }\n                if (i > 0) {\n                    i--;\n                }\n            }\n        }\n        return loserCursorsMap;\n    }\n}\nclass CompositionLineState {\n    constructor(text, lineNumber, startSelectionOffset, endSelectionOffset) {\n        this.text = text;\n        this.lineNumber = lineNumber;\n        this.startSelectionOffset = startSelectionOffset;\n        this.endSelectionOffset = endSelectionOffset;\n    }\n}\nclass CompositionState {\n    static _capture(textModel, selections) {\n        const result = [];\n        for (const selection of selections) {\n            if (selection.startLineNumber !== selection.endLineNumber) {\n                return null;\n            }\n            const lineNumber = selection.startLineNumber;\n            result.push(new CompositionLineState(textModel.getLineContent(lineNumber), lineNumber, selection.startColumn - 1, selection.endColumn - 1));\n        }\n        return result;\n    }\n    constructor(textModel, selections) {\n        this._original = CompositionState._capture(textModel, selections);\n    }\n    /**\n     * Returns the inserted text during this composition.\n     * If the composition resulted in existing text being changed (i.e. not a pure insertion) it returns null.\n     */\n    deduceOutcome(textModel, selections) {\n        if (!this._original) {\n            return null;\n        }\n        const current = CompositionState._capture(textModel, selections);\n        if (!current) {\n            return null;\n        }\n        if (this._original.length !== current.length) {\n            return null;\n        }\n        const result = [];\n        for (let i = 0, len = this._original.length; i < len; i++) {\n            result.push(CompositionState._deduceOutcome(this._original[i], current[i]));\n        }\n        return result;\n    }\n    static _deduceOutcome(original, current) {\n        const commonPrefix = Math.min(original.startSelectionOffset, current.startSelectionOffset, commonPrefixLength(original.text, current.text));\n        const commonSuffix = Math.min(original.text.length - original.endSelectionOffset, current.text.length - current.endSelectionOffset, commonSuffixLength(original.text, current.text));\n        const deletedText = original.text.substring(commonPrefix, original.text.length - commonSuffix);\n        const insertedTextStartOffset = commonPrefix;\n        const insertedTextEndOffset = current.text.length - commonSuffix;\n        const insertedText = current.text.substring(insertedTextStartOffset, insertedTextEndOffset);\n        const insertedTextRange = new Range(current.lineNumber, insertedTextStartOffset + 1, current.lineNumber, insertedTextEndOffset + 1);\n        return new CompositionOutcome(deletedText, original.startSelectionOffset - commonPrefix, original.endSelectionOffset - commonPrefix, insertedText, current.startSelectionOffset - commonPrefix, current.endSelectionOffset - commonPrefix, insertedTextRange);\n    }\n}\n\nexport { CommandExecutor, CursorsController };\n","import { splitLines, escape, isFullWidthCharacter } from '../../../base/common/strings.js';\nimport { LineTokens } from '../tokens/lineTokens.js';\nimport { TokenizationRegistry } from '../languages.js';\nimport { nullTokenizeEncoded, NullState } from './nullTokenize.js';\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 *--------------------------------------------------------------------------------------------*/\nconst fallback = {\n    getInitialState: () => NullState,\n    tokenizeEncoded: (buffer, hasEOL, state) => nullTokenizeEncoded(0 /* LanguageId.Null */, state)\n};\nasync function tokenizeToString(languageService, text, languageId) {\n    if (!languageId) {\n        return _tokenizeToString(text, languageService.languageIdCodec, fallback);\n    }\n    const tokenizationSupport = await TokenizationRegistry.getOrCreate(languageId);\n    return _tokenizeToString(text, languageService.languageIdCodec, tokenizationSupport || fallback);\n}\nfunction tokenizeLineToHTML(text, viewLineTokens, colorMap, startOffset, endOffset, tabSize, useNbsp) {\n    let result = `<div>`;\n    let charIndex = 0;\n    let width = 0;\n    let prevIsSpace = true;\n    for (let tokenIndex = 0, tokenCount = viewLineTokens.getCount(); tokenIndex < tokenCount; tokenIndex++) {\n        const tokenEndIndex = viewLineTokens.getEndOffset(tokenIndex);\n        let partContent = '';\n        for (; charIndex < tokenEndIndex && charIndex < endOffset; charIndex++) {\n            const charCode = text.charCodeAt(charIndex);\n            const isTab = charCode === 9 /* CharCode.Tab */;\n            width += isFullWidthCharacter(charCode) ? 2 : (isTab ? 0 : 1);\n            if (charIndex < startOffset) {\n                if (isTab) {\n                    const remainder = width % tabSize;\n                    width += remainder === 0 ? tabSize : tabSize - remainder;\n                }\n                continue;\n            }\n            switch (charCode) {\n                case 9 /* CharCode.Tab */: {\n                    const remainder = width % tabSize;\n                    const insertSpacesCount = remainder === 0 ? tabSize : tabSize - remainder;\n                    width += insertSpacesCount;\n                    let spacesRemaining = insertSpacesCount;\n                    while (spacesRemaining > 0) {\n                        if (useNbsp && prevIsSpace) {\n                            partContent += '&#160;';\n                            prevIsSpace = false;\n                        }\n                        else {\n                            partContent += ' ';\n                            prevIsSpace = true;\n                        }\n                        spacesRemaining--;\n                    }\n                    break;\n                }\n                case 60 /* CharCode.LessThan */:\n                    partContent += '&lt;';\n                    prevIsSpace = false;\n                    break;\n                case 62 /* CharCode.GreaterThan */:\n                    partContent += '&gt;';\n                    prevIsSpace = false;\n                    break;\n                case 38 /* CharCode.Ampersand */:\n                    partContent += '&amp;';\n                    prevIsSpace = false;\n                    break;\n                case 0 /* CharCode.Null */:\n                    partContent += '&#00;';\n                    prevIsSpace = false;\n                    break;\n                case 65279 /* CharCode.UTF8_BOM */:\n                case 8232 /* CharCode.LINE_SEPARATOR */:\n                case 8233 /* CharCode.PARAGRAPH_SEPARATOR */:\n                case 133 /* CharCode.NEXT_LINE */:\n                    partContent += '\\ufffd';\n                    prevIsSpace = false;\n                    break;\n                case 13 /* CharCode.CarriageReturn */:\n                    // zero width space, because carriage return would introduce a line break\n                    partContent += '&#8203';\n                    prevIsSpace = false;\n                    break;\n                case 32 /* CharCode.Space */:\n                    if (useNbsp && prevIsSpace) {\n                        partContent += '&#160;';\n                        prevIsSpace = false;\n                    }\n                    else {\n                        partContent += ' ';\n                        prevIsSpace = true;\n                    }\n                    break;\n                default:\n                    partContent += String.fromCharCode(charCode);\n                    prevIsSpace = false;\n            }\n        }\n        if (tokenEndIndex <= startOffset) {\n            continue;\n        }\n        result += `<span style=\"${viewLineTokens.getInlineStyle(tokenIndex, colorMap)}\">${partContent}</span>`;\n        if (tokenEndIndex > endOffset || charIndex >= endOffset || startOffset >= endOffset) {\n            break;\n        }\n    }\n    result += `</div>`;\n    return result;\n}\nfunction _tokenizeToString(text, languageIdCodec, tokenizationSupport) {\n    let result = `<div class=\"monaco-tokenized-source\">`;\n    const lines = splitLines(text);\n    let currentState = tokenizationSupport.getInitialState();\n    for (let i = 0, len = lines.length; i < len; i++) {\n        const line = lines[i];\n        if (i > 0) {\n            result += `<br/>`;\n        }\n        const tokenizationResult = tokenizationSupport.tokenizeEncoded(line, true, currentState);\n        LineTokens.convertToEndOffset(tokenizationResult.tokens, line.length);\n        const lineTokens = new LineTokens(tokenizationResult.tokens, line, languageIdCodec);\n        const viewLineTokens = lineTokens.inflate();\n        let startOffset = 0;\n        for (let j = 0, lenJ = viewLineTokens.getCount(); j < lenJ; j++) {\n            const type = viewLineTokens.getClassName(j);\n            const endIndex = viewLineTokens.getEndOffset(j);\n            result += `<span class=\"${type}\">${escape(line.substring(startOffset, endIndex))}</span>`;\n            startOffset = endIndex;\n        }\n        currentState = tokenizationResult.endState;\n    }\n    result += `</div>`;\n    return result;\n}\n\nexport { _tokenizeToString, tokenizeLineToHTML, tokenizeToString };\n","import { binarySearch2 } from '../../../base/common/arrays.js';\nimport { intersection } from '../../../base/common/collections.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CustomLine {\n    constructor(decorationId, index, lineNumber, specialHeight, prefixSum) {\n        this.decorationId = decorationId;\n        this.index = index;\n        this.lineNumber = lineNumber;\n        this.specialHeight = specialHeight;\n        this.prefixSum = prefixSum;\n        this.maximumSpecialHeight = specialHeight;\n        this.deleted = false;\n    }\n}\n/**\n * Manages line heights in the editor with support for custom line heights from decorations.\n *\n * This class maintains an ordered collection of line heights, where each line can have either\n * the default height or a custom height specified by decorations. It supports efficient querying\n * of individual line heights as well as accumulated heights up to a specific line.\n *\n * Line heights are stored in a sorted array for efficient binary search operations. Each line\n * with custom height is represented by a {@link CustomLine} object which tracks its special height,\n * accumulated height prefix sum, and associated decoration ID.\n *\n * The class optimizes performance by:\n * - Using binary search to locate lines in the ordered array\n * - Batching updates through a pending changes mechanism\n * - Computing prefix sums for O(1) accumulated height lookup\n * - Tracking maximum height for lines with multiple decorations\n * - Efficiently handling document changes (line insertions and deletions)\n *\n * When lines are inserted or deleted, the manager updates line numbers and prefix sums\n * for all affected lines. It also handles special cases like decorations that span\n * the insertion/deletion points by re-applying those decorations appropriately.\n *\n * All query operations automatically commit pending changes to ensure consistent results.\n * Clients can modify line heights by adding or removing custom line height decorations,\n * which are tracked by their unique decoration IDs.\n */\nclass LineHeightsManager {\n    constructor(defaultLineHeight, customLineHeightData) {\n        this._decorationIDToCustomLine = new ArrayMap();\n        this._orderedCustomLines = [];\n        this._pendingSpecialLinesToInsert = [];\n        this._invalidIndex = 0;\n        this._hasPending = false;\n        this._defaultLineHeight = defaultLineHeight;\n        if (customLineHeightData.length > 0) {\n            for (const data of customLineHeightData) {\n                this.insertOrChangeCustomLineHeight(data.decorationId, data.startLineNumber, data.endLineNumber, data.lineHeight);\n            }\n            this.commit();\n        }\n    }\n    set defaultLineHeight(defaultLineHeight) {\n        this._defaultLineHeight = defaultLineHeight;\n    }\n    get defaultLineHeight() {\n        return this._defaultLineHeight;\n    }\n    removeCustomLineHeight(decorationID) {\n        const customLines = this._decorationIDToCustomLine.get(decorationID);\n        if (!customLines) {\n            return;\n        }\n        this._decorationIDToCustomLine.delete(decorationID);\n        for (const customLine of customLines) {\n            customLine.deleted = true;\n            this._invalidIndex = Math.min(this._invalidIndex, customLine.index);\n        }\n        this._hasPending = true;\n    }\n    insertOrChangeCustomLineHeight(decorationId, startLineNumber, endLineNumber, lineHeight) {\n        this.removeCustomLineHeight(decorationId);\n        for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n            const customLine = new CustomLine(decorationId, -1, lineNumber, lineHeight, 0);\n            this._pendingSpecialLinesToInsert.push(customLine);\n        }\n        this._hasPending = true;\n    }\n    heightForLineNumber(lineNumber) {\n        const searchIndex = this._binarySearchOverOrderedCustomLinesArray(lineNumber);\n        if (searchIndex >= 0) {\n            return this._orderedCustomLines[searchIndex].maximumSpecialHeight;\n        }\n        return this._defaultLineHeight;\n    }\n    getAccumulatedLineHeightsIncludingLineNumber(lineNumber) {\n        const searchIndex = this._binarySearchOverOrderedCustomLinesArray(lineNumber);\n        if (searchIndex >= 0) {\n            return this._orderedCustomLines[searchIndex].prefixSum + this._orderedCustomLines[searchIndex].maximumSpecialHeight;\n        }\n        if (searchIndex === -1) {\n            return this._defaultLineHeight * lineNumber;\n        }\n        const modifiedIndex = -(searchIndex + 1);\n        const previousSpecialLine = this._orderedCustomLines[modifiedIndex - 1];\n        return previousSpecialLine.prefixSum + previousSpecialLine.maximumSpecialHeight + this._defaultLineHeight * (lineNumber - previousSpecialLine.lineNumber);\n    }\n    onLinesDeleted(fromLineNumber, toLineNumber) {\n        const deleteCount = toLineNumber - fromLineNumber + 1;\n        const numberOfCustomLines = this._orderedCustomLines.length;\n        const candidateStartIndexOfDeletion = this._binarySearchOverOrderedCustomLinesArray(fromLineNumber);\n        let startIndexOfDeletion;\n        if (candidateStartIndexOfDeletion >= 0) {\n            startIndexOfDeletion = candidateStartIndexOfDeletion;\n            for (let i = candidateStartIndexOfDeletion - 1; i >= 0; i--) {\n                if (this._orderedCustomLines[i].lineNumber === fromLineNumber) {\n                    startIndexOfDeletion--;\n                }\n                else {\n                    break;\n                }\n            }\n        }\n        else {\n            startIndexOfDeletion = candidateStartIndexOfDeletion === -(numberOfCustomLines + 1) && candidateStartIndexOfDeletion !== -1 ? numberOfCustomLines - 1 : -(candidateStartIndexOfDeletion + 1);\n        }\n        const candidateEndIndexOfDeletion = this._binarySearchOverOrderedCustomLinesArray(toLineNumber);\n        let endIndexOfDeletion;\n        if (candidateEndIndexOfDeletion >= 0) {\n            endIndexOfDeletion = candidateEndIndexOfDeletion;\n            for (let i = candidateEndIndexOfDeletion + 1; i < numberOfCustomLines; i++) {\n                if (this._orderedCustomLines[i].lineNumber === toLineNumber) {\n                    endIndexOfDeletion++;\n                }\n                else {\n                    break;\n                }\n            }\n        }\n        else {\n            endIndexOfDeletion = candidateEndIndexOfDeletion === -(numberOfCustomLines + 1) && candidateEndIndexOfDeletion !== -1 ? numberOfCustomLines - 1 : -(candidateEndIndexOfDeletion + 1);\n        }\n        const isEndIndexBiggerThanStartIndex = endIndexOfDeletion > startIndexOfDeletion;\n        const isEndIndexEqualToStartIndexAndCoversCustomLine = endIndexOfDeletion === startIndexOfDeletion\n            && this._orderedCustomLines[startIndexOfDeletion]\n            && this._orderedCustomLines[startIndexOfDeletion].lineNumber >= fromLineNumber\n            && this._orderedCustomLines[startIndexOfDeletion].lineNumber <= toLineNumber;\n        if (isEndIndexBiggerThanStartIndex || isEndIndexEqualToStartIndexAndCoversCustomLine) {\n            let maximumSpecialHeightOnDeletedInterval = 0;\n            for (let i = startIndexOfDeletion; i <= endIndexOfDeletion; i++) {\n                maximumSpecialHeightOnDeletedInterval = Math.max(maximumSpecialHeightOnDeletedInterval, this._orderedCustomLines[i].maximumSpecialHeight);\n            }\n            let prefixSumOnDeletedInterval = 0;\n            if (startIndexOfDeletion > 0) {\n                const previousSpecialLine = this._orderedCustomLines[startIndexOfDeletion - 1];\n                prefixSumOnDeletedInterval = previousSpecialLine.prefixSum + previousSpecialLine.maximumSpecialHeight + this._defaultLineHeight * (fromLineNumber - previousSpecialLine.lineNumber - 1);\n            }\n            else {\n                prefixSumOnDeletedInterval = fromLineNumber > 0 ? (fromLineNumber - 1) * this._defaultLineHeight : 0;\n            }\n            const firstSpecialLineDeleted = this._orderedCustomLines[startIndexOfDeletion];\n            const lastSpecialLineDeleted = this._orderedCustomLines[endIndexOfDeletion];\n            const firstSpecialLineAfterDeletion = this._orderedCustomLines[endIndexOfDeletion + 1];\n            const heightOfFirstLineAfterDeletion = firstSpecialLineAfterDeletion && firstSpecialLineAfterDeletion.lineNumber === toLineNumber + 1 ? firstSpecialLineAfterDeletion.maximumSpecialHeight : this._defaultLineHeight;\n            const totalHeightDeleted = lastSpecialLineDeleted.prefixSum\n                + lastSpecialLineDeleted.maximumSpecialHeight\n                - firstSpecialLineDeleted.prefixSum\n                + this._defaultLineHeight * (toLineNumber - lastSpecialLineDeleted.lineNumber)\n                + this._defaultLineHeight * (firstSpecialLineDeleted.lineNumber - fromLineNumber)\n                + heightOfFirstLineAfterDeletion - maximumSpecialHeightOnDeletedInterval;\n            const decorationIdsSeen = new Set();\n            const newOrderedCustomLines = [];\n            const newDecorationIDToSpecialLine = new ArrayMap();\n            let numberOfDeletions = 0;\n            for (let i = 0; i < this._orderedCustomLines.length; i++) {\n                const customLine = this._orderedCustomLines[i];\n                if (i < startIndexOfDeletion) {\n                    newOrderedCustomLines.push(customLine);\n                    newDecorationIDToSpecialLine.add(customLine.decorationId, customLine);\n                }\n                else if (i >= startIndexOfDeletion && i <= endIndexOfDeletion) {\n                    const decorationId = customLine.decorationId;\n                    if (!decorationIdsSeen.has(decorationId)) {\n                        customLine.index -= numberOfDeletions;\n                        customLine.lineNumber = fromLineNumber;\n                        customLine.prefixSum = prefixSumOnDeletedInterval;\n                        customLine.maximumSpecialHeight = maximumSpecialHeightOnDeletedInterval;\n                        newOrderedCustomLines.push(customLine);\n                        newDecorationIDToSpecialLine.add(customLine.decorationId, customLine);\n                    }\n                    else {\n                        numberOfDeletions++;\n                    }\n                }\n                else if (i > endIndexOfDeletion) {\n                    customLine.index -= numberOfDeletions;\n                    customLine.lineNumber -= deleteCount;\n                    customLine.prefixSum -= totalHeightDeleted;\n                    newOrderedCustomLines.push(customLine);\n                    newDecorationIDToSpecialLine.add(customLine.decorationId, customLine);\n                }\n                decorationIdsSeen.add(customLine.decorationId);\n            }\n            this._orderedCustomLines = newOrderedCustomLines;\n            this._decorationIDToCustomLine = newDecorationIDToSpecialLine;\n        }\n        else {\n            const totalHeightDeleted = deleteCount * this._defaultLineHeight;\n            for (let i = endIndexOfDeletion; i < this._orderedCustomLines.length; i++) {\n                const customLine = this._orderedCustomLines[i];\n                if (customLine.lineNumber > toLineNumber) {\n                    customLine.lineNumber -= deleteCount;\n                    customLine.prefixSum -= totalHeightDeleted;\n                }\n            }\n        }\n    }\n    onLinesInserted(fromLineNumber, toLineNumber) {\n        const insertCount = toLineNumber - fromLineNumber + 1;\n        const candidateStartIndexOfInsertion = this._binarySearchOverOrderedCustomLinesArray(fromLineNumber);\n        let startIndexOfInsertion;\n        if (candidateStartIndexOfInsertion >= 0) {\n            startIndexOfInsertion = candidateStartIndexOfInsertion;\n            for (let i = candidateStartIndexOfInsertion - 1; i >= 0; i--) {\n                if (this._orderedCustomLines[i].lineNumber === fromLineNumber) {\n                    startIndexOfInsertion--;\n                }\n                else {\n                    break;\n                }\n            }\n        }\n        else {\n            startIndexOfInsertion = -(candidateStartIndexOfInsertion + 1);\n        }\n        const toReAdd = [];\n        const decorationsImmediatelyAfter = new Set();\n        for (let i = startIndexOfInsertion; i < this._orderedCustomLines.length; i++) {\n            if (this._orderedCustomLines[i].lineNumber === fromLineNumber) {\n                decorationsImmediatelyAfter.add(this._orderedCustomLines[i].decorationId);\n            }\n        }\n        const decorationsImmediatelyBefore = new Set();\n        for (let i = startIndexOfInsertion - 1; i >= 0; i--) {\n            if (this._orderedCustomLines[i].lineNumber === fromLineNumber - 1) {\n                decorationsImmediatelyBefore.add(this._orderedCustomLines[i].decorationId);\n            }\n        }\n        const decorationsWithGaps = intersection(decorationsImmediatelyBefore, decorationsImmediatelyAfter);\n        for (let i = startIndexOfInsertion; i < this._orderedCustomLines.length; i++) {\n            this._orderedCustomLines[i].lineNumber += insertCount;\n            this._orderedCustomLines[i].prefixSum += this._defaultLineHeight * insertCount;\n        }\n        if (decorationsWithGaps.size > 0) {\n            for (const decorationId of decorationsWithGaps) {\n                const decoration = this._decorationIDToCustomLine.get(decorationId);\n                if (decoration) {\n                    const startLineNumber = decoration.reduce((min, l) => Math.min(min, l.lineNumber), fromLineNumber); // min\n                    const endLineNumber = decoration.reduce((max, l) => Math.max(max, l.lineNumber), fromLineNumber); // max\n                    const lineHeight = decoration.reduce((max, l) => Math.max(max, l.specialHeight), 0);\n                    toReAdd.push({\n                        decorationId,\n                        startLineNumber,\n                        endLineNumber,\n                        lineHeight\n                    });\n                }\n            }\n            for (const dec of toReAdd) {\n                this.insertOrChangeCustomLineHeight(dec.decorationId, dec.startLineNumber, dec.endLineNumber, dec.lineHeight);\n            }\n            this.commit();\n        }\n    }\n    commit() {\n        if (!this._hasPending) {\n            return;\n        }\n        for (const pendingChange of this._pendingSpecialLinesToInsert) {\n            const candidateInsertionIndex = this._binarySearchOverOrderedCustomLinesArray(pendingChange.lineNumber);\n            const insertionIndex = candidateInsertionIndex >= 0 ? candidateInsertionIndex : -(candidateInsertionIndex + 1);\n            this._orderedCustomLines.splice(insertionIndex, 0, pendingChange);\n            this._invalidIndex = Math.min(this._invalidIndex, insertionIndex);\n        }\n        this._pendingSpecialLinesToInsert = [];\n        const newDecorationIDToSpecialLine = new ArrayMap();\n        const newOrderedSpecialLines = [];\n        for (let i = 0; i < this._invalidIndex; i++) {\n            const customLine = this._orderedCustomLines[i];\n            newOrderedSpecialLines.push(customLine);\n            newDecorationIDToSpecialLine.add(customLine.decorationId, customLine);\n        }\n        let numberOfDeletions = 0;\n        let previousSpecialLine = (this._invalidIndex > 0) ? newOrderedSpecialLines[this._invalidIndex - 1] : undefined;\n        for (let i = this._invalidIndex; i < this._orderedCustomLines.length; i++) {\n            const customLine = this._orderedCustomLines[i];\n            if (customLine.deleted) {\n                numberOfDeletions++;\n                continue;\n            }\n            customLine.index = i - numberOfDeletions;\n            if (previousSpecialLine && previousSpecialLine.lineNumber === customLine.lineNumber) {\n                customLine.maximumSpecialHeight = previousSpecialLine.maximumSpecialHeight;\n                customLine.prefixSum = previousSpecialLine.prefixSum;\n            }\n            else {\n                let maximumSpecialHeight = customLine.specialHeight;\n                for (let j = i; j < this._orderedCustomLines.length; j++) {\n                    const nextSpecialLine = this._orderedCustomLines[j];\n                    if (nextSpecialLine.deleted) {\n                        continue;\n                    }\n                    if (nextSpecialLine.lineNumber !== customLine.lineNumber) {\n                        break;\n                    }\n                    maximumSpecialHeight = Math.max(maximumSpecialHeight, nextSpecialLine.specialHeight);\n                }\n                customLine.maximumSpecialHeight = maximumSpecialHeight;\n                let prefixSum;\n                if (previousSpecialLine) {\n                    prefixSum = previousSpecialLine.prefixSum + previousSpecialLine.maximumSpecialHeight + this._defaultLineHeight * (customLine.lineNumber - previousSpecialLine.lineNumber - 1);\n                }\n                else {\n                    prefixSum = this._defaultLineHeight * (customLine.lineNumber - 1);\n                }\n                customLine.prefixSum = prefixSum;\n            }\n            previousSpecialLine = customLine;\n            newOrderedSpecialLines.push(customLine);\n            newDecorationIDToSpecialLine.add(customLine.decorationId, customLine);\n        }\n        this._orderedCustomLines = newOrderedSpecialLines;\n        this._decorationIDToCustomLine = newDecorationIDToSpecialLine;\n        this._invalidIndex = Infinity;\n        this._hasPending = false;\n    }\n    _binarySearchOverOrderedCustomLinesArray(lineNumber) {\n        return binarySearch2(this._orderedCustomLines.length, (index) => {\n            const line = this._orderedCustomLines[index];\n            if (line.lineNumber === lineNumber) {\n                return 0;\n            }\n            else if (line.lineNumber < lineNumber) {\n                return -1;\n            }\n            else {\n                return 1;\n            }\n        });\n    }\n}\nclass ArrayMap {\n    constructor() {\n        this._map = new Map();\n    }\n    add(key, value) {\n        const array = this._map.get(key);\n        if (!array) {\n            this._map.set(key, [value]);\n        }\n        else {\n            array.push(value);\n        }\n    }\n    get(key) {\n        return this._map.get(key);\n    }\n    delete(key) {\n        this._map.delete(key);\n    }\n}\n\nexport { CustomLine, LineHeightsManager };\n","import { singleLetterHash } from '../../../base/common/strings.js';\nimport { LineHeightsManager } from './lineHeights.js';\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 *--------------------------------------------------------------------------------------------*/\nclass PendingChanges {\n    constructor() {\n        this._hasPending = false;\n        this._inserts = [];\n        this._changes = [];\n        this._removes = [];\n    }\n    insert(x) {\n        this._hasPending = true;\n        this._inserts.push(x);\n    }\n    change(x) {\n        this._hasPending = true;\n        this._changes.push(x);\n    }\n    remove(x) {\n        this._hasPending = true;\n        this._removes.push(x);\n    }\n    commit(linesLayout) {\n        if (!this._hasPending) {\n            return;\n        }\n        const inserts = this._inserts;\n        const changes = this._changes;\n        const removes = this._removes;\n        this._hasPending = false;\n        this._inserts = [];\n        this._changes = [];\n        this._removes = [];\n        linesLayout._commitPendingChanges(inserts, changes, removes);\n    }\n}\nclass EditorWhitespace {\n    constructor(id, afterLineNumber, ordinal, height, minWidth) {\n        this.id = id;\n        this.afterLineNumber = afterLineNumber;\n        this.ordinal = ordinal;\n        this.height = height;\n        this.minWidth = minWidth;\n        this.prefixSum = 0;\n    }\n}\n/**\n * Layouting of objects that take vertical space (by having a height) and push down other objects.\n *\n * These objects are basically either text (lines) or spaces between those lines (whitespaces).\n * This provides commodity operations for working with lines that contain whitespace that pushes lines lower (vertically).\n */\nclass LinesLayout {\n    static { this.INSTANCE_COUNT = 0; }\n    constructor(lineCount, defaultLineHeight, paddingTop, paddingBottom, customLineHeightData) {\n        this._instanceId = singleLetterHash(++LinesLayout.INSTANCE_COUNT);\n        this._pendingChanges = new PendingChanges();\n        this._lastWhitespaceId = 0;\n        this._arr = [];\n        this._prefixSumValidIndex = -1;\n        this._minWidth = -1; /* marker for not being computed */\n        this._lineCount = lineCount;\n        this._paddingTop = paddingTop;\n        this._paddingBottom = paddingBottom;\n        this._lineHeightsManager = new LineHeightsManager(defaultLineHeight, customLineHeightData);\n    }\n    /**\n     * Find the insertion index for a new value inside a sorted array of values.\n     * If the value is already present in the sorted array, the insertion index will be after the already existing value.\n     */\n    static findInsertionIndex(arr, afterLineNumber, ordinal) {\n        let low = 0;\n        let high = arr.length;\n        while (low < high) {\n            const mid = ((low + high) >>> 1);\n            if (afterLineNumber === arr[mid].afterLineNumber) {\n                if (ordinal < arr[mid].ordinal) {\n                    high = mid;\n                }\n                else {\n                    low = mid + 1;\n                }\n            }\n            else if (afterLineNumber < arr[mid].afterLineNumber) {\n                high = mid;\n            }\n            else {\n                low = mid + 1;\n            }\n        }\n        return low;\n    }\n    /**\n     * Change the height of a line in pixels.\n     */\n    setDefaultLineHeight(lineHeight) {\n        this._lineHeightsManager.defaultLineHeight = lineHeight;\n    }\n    /**\n     * Changes the padding used to calculate vertical offsets.\n     */\n    setPadding(paddingTop, paddingBottom) {\n        this._paddingTop = paddingTop;\n        this._paddingBottom = paddingBottom;\n    }\n    /**\n     * Set the number of lines.\n     *\n     * @param lineCount New number of lines.\n     */\n    onFlushed(lineCount, customLineHeightData) {\n        this._lineCount = lineCount;\n        this._lineHeightsManager = new LineHeightsManager(this._lineHeightsManager.defaultLineHeight, customLineHeightData);\n    }\n    changeLineHeights(callback) {\n        let hadAChange = false;\n        try {\n            const accessor = {\n                insertOrChangeCustomLineHeight: (decorationId, startLineNumber, endLineNumber, lineHeight) => {\n                    hadAChange = true;\n                    this._lineHeightsManager.insertOrChangeCustomLineHeight(decorationId, startLineNumber, endLineNumber, lineHeight);\n                },\n                removeCustomLineHeight: (decorationId) => {\n                    hadAChange = true;\n                    this._lineHeightsManager.removeCustomLineHeight(decorationId);\n                }\n            };\n            callback(accessor);\n        }\n        finally {\n            this._lineHeightsManager.commit();\n        }\n        return hadAChange;\n    }\n    changeWhitespace(callback) {\n        let hadAChange = false;\n        try {\n            const accessor = {\n                insertWhitespace: (afterLineNumber, ordinal, heightInPx, minWidth) => {\n                    hadAChange = true;\n                    afterLineNumber = afterLineNumber | 0;\n                    ordinal = ordinal | 0;\n                    heightInPx = heightInPx | 0;\n                    minWidth = minWidth | 0;\n                    const id = this._instanceId + (++this._lastWhitespaceId);\n                    this._pendingChanges.insert(new EditorWhitespace(id, afterLineNumber, ordinal, heightInPx, minWidth));\n                    return id;\n                },\n                changeOneWhitespace: (id, newAfterLineNumber, newHeight) => {\n                    hadAChange = true;\n                    newAfterLineNumber = newAfterLineNumber | 0;\n                    newHeight = newHeight | 0;\n                    this._pendingChanges.change({ id, newAfterLineNumber, newHeight });\n                },\n                removeWhitespace: (id) => {\n                    hadAChange = true;\n                    this._pendingChanges.remove({ id });\n                }\n            };\n            callback(accessor);\n        }\n        finally {\n            this._pendingChanges.commit(this);\n        }\n        return hadAChange;\n    }\n    _commitPendingChanges(inserts, changes, removes) {\n        if (inserts.length > 0 || removes.length > 0) {\n            this._minWidth = -1; /* marker for not being computed */\n        }\n        if (inserts.length + changes.length + removes.length <= 1) {\n            // when only one thing happened, handle it \"delicately\"\n            for (const insert of inserts) {\n                this._insertWhitespace(insert);\n            }\n            for (const change of changes) {\n                this._changeOneWhitespace(change.id, change.newAfterLineNumber, change.newHeight);\n            }\n            for (const remove of removes) {\n                const index = this._findWhitespaceIndex(remove.id);\n                if (index === -1) {\n                    continue;\n                }\n                this._removeWhitespace(index);\n            }\n            return;\n        }\n        // simply rebuild the entire datastructure\n        const toRemove = new Set();\n        for (const remove of removes) {\n            toRemove.add(remove.id);\n        }\n        const toChange = new Map();\n        for (const change of changes) {\n            toChange.set(change.id, change);\n        }\n        const applyRemoveAndChange = (whitespaces) => {\n            const result = [];\n            for (const whitespace of whitespaces) {\n                if (toRemove.has(whitespace.id)) {\n                    continue;\n                }\n                if (toChange.has(whitespace.id)) {\n                    const change = toChange.get(whitespace.id);\n                    whitespace.afterLineNumber = change.newAfterLineNumber;\n                    whitespace.height = change.newHeight;\n                }\n                result.push(whitespace);\n            }\n            return result;\n        };\n        const result = applyRemoveAndChange(this._arr).concat(applyRemoveAndChange(inserts));\n        result.sort((a, b) => {\n            if (a.afterLineNumber === b.afterLineNumber) {\n                return a.ordinal - b.ordinal;\n            }\n            return a.afterLineNumber - b.afterLineNumber;\n        });\n        this._arr = result;\n        this._prefixSumValidIndex = -1;\n    }\n    _insertWhitespace(whitespace) {\n        const insertIndex = LinesLayout.findInsertionIndex(this._arr, whitespace.afterLineNumber, whitespace.ordinal);\n        this._arr.splice(insertIndex, 0, whitespace);\n        this._prefixSumValidIndex = Math.min(this._prefixSumValidIndex, insertIndex - 1);\n    }\n    _findWhitespaceIndex(id) {\n        const arr = this._arr;\n        for (let i = 0, len = arr.length; i < len; i++) {\n            if (arr[i].id === id) {\n                return i;\n            }\n        }\n        return -1;\n    }\n    _changeOneWhitespace(id, newAfterLineNumber, newHeight) {\n        const index = this._findWhitespaceIndex(id);\n        if (index === -1) {\n            return;\n        }\n        if (this._arr[index].height !== newHeight) {\n            this._arr[index].height = newHeight;\n            this._prefixSumValidIndex = Math.min(this._prefixSumValidIndex, index - 1);\n        }\n        if (this._arr[index].afterLineNumber !== newAfterLineNumber) {\n            // `afterLineNumber` changed for this whitespace\n            // Record old whitespace\n            const whitespace = this._arr[index];\n            // Since changing `afterLineNumber` can trigger a reordering, we're gonna remove this whitespace\n            this._removeWhitespace(index);\n            whitespace.afterLineNumber = newAfterLineNumber;\n            // And add it again\n            this._insertWhitespace(whitespace);\n        }\n    }\n    _removeWhitespace(removeIndex) {\n        this._arr.splice(removeIndex, 1);\n        this._prefixSumValidIndex = Math.min(this._prefixSumValidIndex, removeIndex - 1);\n    }\n    /**\n     * Notify the layouter that lines have been deleted (a continuous zone of lines).\n     *\n     * @param fromLineNumber The line number at which the deletion started, inclusive\n     * @param toLineNumber The line number at which the deletion ended, inclusive\n     */\n    onLinesDeleted(fromLineNumber, toLineNumber) {\n        fromLineNumber = fromLineNumber | 0;\n        toLineNumber = toLineNumber | 0;\n        this._lineCount -= (toLineNumber - fromLineNumber + 1);\n        for (let i = 0, len = this._arr.length; i < len; i++) {\n            const afterLineNumber = this._arr[i].afterLineNumber;\n            if (fromLineNumber <= afterLineNumber && afterLineNumber <= toLineNumber) {\n                // The line this whitespace was after has been deleted\n                //  => move whitespace to before first deleted line\n                this._arr[i].afterLineNumber = fromLineNumber - 1;\n            }\n            else if (afterLineNumber > toLineNumber) {\n                // The line this whitespace was after has been moved up\n                //  => move whitespace up\n                this._arr[i].afterLineNumber -= (toLineNumber - fromLineNumber + 1);\n            }\n        }\n        this._lineHeightsManager.onLinesDeleted(fromLineNumber, toLineNumber);\n    }\n    /**\n     * Notify the layouter that lines have been inserted (a continuous zone of lines).\n     *\n     * @param fromLineNumber The line number at which the insertion started, inclusive\n     * @param toLineNumber The line number at which the insertion ended, inclusive.\n     */\n    onLinesInserted(fromLineNumber, toLineNumber) {\n        fromLineNumber = fromLineNumber | 0;\n        toLineNumber = toLineNumber | 0;\n        this._lineCount += (toLineNumber - fromLineNumber + 1);\n        for (let i = 0, len = this._arr.length; i < len; i++) {\n            const afterLineNumber = this._arr[i].afterLineNumber;\n            if (fromLineNumber <= afterLineNumber) {\n                this._arr[i].afterLineNumber += (toLineNumber - fromLineNumber + 1);\n            }\n        }\n        this._lineHeightsManager.onLinesInserted(fromLineNumber, toLineNumber);\n    }\n    /**\n     * Get the sum of all the whitespaces.\n     */\n    getWhitespacesTotalHeight() {\n        if (this._arr.length === 0) {\n            return 0;\n        }\n        return this.getWhitespacesAccumulatedHeight(this._arr.length - 1);\n    }\n    /**\n     * Return the sum of the heights of the whitespaces at [0..index].\n     * This includes the whitespace at `index`.\n     *\n     * @param index The index of the whitespace.\n     * @return The sum of the heights of all whitespaces before the one at `index`, including the one at `index`.\n     */\n    getWhitespacesAccumulatedHeight(index) {\n        index = index | 0;\n        let startIndex = Math.max(0, this._prefixSumValidIndex + 1);\n        if (startIndex === 0) {\n            this._arr[0].prefixSum = this._arr[0].height;\n            startIndex++;\n        }\n        for (let i = startIndex; i <= index; i++) {\n            this._arr[i].prefixSum = this._arr[i - 1].prefixSum + this._arr[i].height;\n        }\n        this._prefixSumValidIndex = Math.max(this._prefixSumValidIndex, index);\n        return this._arr[index].prefixSum;\n    }\n    /**\n     * Get the sum of heights for all objects.\n     *\n     * @return The sum of heights for all objects.\n     */\n    getLinesTotalHeight() {\n        const linesHeight = this._lineHeightsManager.getAccumulatedLineHeightsIncludingLineNumber(this._lineCount);\n        const whitespacesHeight = this.getWhitespacesTotalHeight();\n        return linesHeight + whitespacesHeight + this._paddingTop + this._paddingBottom;\n    }\n    /**\n     * Returns the accumulated height of whitespaces before the given line number.\n     *\n     * @param lineNumber The line number\n     */\n    getWhitespaceAccumulatedHeightBeforeLineNumber(lineNumber) {\n        lineNumber = lineNumber | 0;\n        const lastWhitespaceBeforeLineNumber = this._findLastWhitespaceBeforeLineNumber(lineNumber);\n        if (lastWhitespaceBeforeLineNumber === -1) {\n            return 0;\n        }\n        return this.getWhitespacesAccumulatedHeight(lastWhitespaceBeforeLineNumber);\n    }\n    _findLastWhitespaceBeforeLineNumber(lineNumber) {\n        lineNumber = lineNumber | 0;\n        // Find the whitespace before line number\n        const arr = this._arr;\n        let low = 0;\n        let high = arr.length - 1;\n        while (low <= high) {\n            const delta = (high - low) | 0;\n            const halfDelta = (delta / 2) | 0;\n            const mid = (low + halfDelta) | 0;\n            if (arr[mid].afterLineNumber < lineNumber) {\n                if (mid + 1 >= arr.length || arr[mid + 1].afterLineNumber >= lineNumber) {\n                    return mid;\n                }\n                else {\n                    low = (mid + 1) | 0;\n                }\n            }\n            else {\n                high = (mid - 1) | 0;\n            }\n        }\n        return -1;\n    }\n    _findFirstWhitespaceAfterLineNumber(lineNumber) {\n        lineNumber = lineNumber | 0;\n        const lastWhitespaceBeforeLineNumber = this._findLastWhitespaceBeforeLineNumber(lineNumber);\n        const firstWhitespaceAfterLineNumber = lastWhitespaceBeforeLineNumber + 1;\n        if (firstWhitespaceAfterLineNumber < this._arr.length) {\n            return firstWhitespaceAfterLineNumber;\n        }\n        return -1;\n    }\n    /**\n     * Find the index of the first whitespace which has `afterLineNumber` >= `lineNumber`.\n     * @return The index of the first whitespace with `afterLineNumber` >= `lineNumber` or -1 if no whitespace is found.\n     */\n    getFirstWhitespaceIndexAfterLineNumber(lineNumber) {\n        lineNumber = lineNumber | 0;\n        return this._findFirstWhitespaceAfterLineNumber(lineNumber);\n    }\n    /**\n     * Get the vertical offset (the sum of heights for all objects above) a certain line number.\n     *\n     * @param lineNumber The line number\n     * @return The sum of heights for all objects above `lineNumber`.\n     */\n    getVerticalOffsetForLineNumber(lineNumber, includeViewZones = false) {\n        lineNumber = lineNumber | 0;\n        let previousLinesHeight;\n        if (lineNumber > 1) {\n            previousLinesHeight = this._lineHeightsManager.getAccumulatedLineHeightsIncludingLineNumber(lineNumber - 1);\n        }\n        else {\n            previousLinesHeight = 0;\n        }\n        const previousWhitespacesHeight = this.getWhitespaceAccumulatedHeightBeforeLineNumber(lineNumber - (includeViewZones ? 1 : 0));\n        return previousLinesHeight + previousWhitespacesHeight + this._paddingTop;\n    }\n    getLineHeightForLineNumber(lineNumber) {\n        return this._lineHeightsManager.heightForLineNumber(lineNumber);\n    }\n    /**\n     * Get the vertical offset (the sum of heights for all objects above) a certain line number and also the line height of the line.\n     *\n     * @param lineNumber The line number\n     * @return The sum of heights for all objects above `lineNumber`.\n     */\n    getVerticalOffsetAfterLineNumber(lineNumber, includeViewZones = false) {\n        lineNumber = lineNumber | 0;\n        const previousLinesHeight = this._lineHeightsManager.getAccumulatedLineHeightsIncludingLineNumber(lineNumber);\n        const previousWhitespacesHeight = this.getWhitespaceAccumulatedHeightBeforeLineNumber(lineNumber + (includeViewZones ? 1 : 0));\n        return previousLinesHeight + previousWhitespacesHeight + this._paddingTop;\n    }\n    /**\n     * The maximum min width for all whitespaces.\n     */\n    getWhitespaceMinWidth() {\n        if (this._minWidth === -1) {\n            let minWidth = 0;\n            for (let i = 0, len = this._arr.length; i < len; i++) {\n                minWidth = Math.max(minWidth, this._arr[i].minWidth);\n            }\n            this._minWidth = minWidth;\n        }\n        return this._minWidth;\n    }\n    /**\n     * Check if `verticalOffset` is below all lines.\n     */\n    isAfterLines(verticalOffset) {\n        const totalHeight = this.getLinesTotalHeight();\n        return verticalOffset > totalHeight;\n    }\n    isInTopPadding(verticalOffset) {\n        if (this._paddingTop === 0) {\n            return false;\n        }\n        return (verticalOffset < this._paddingTop);\n    }\n    isInBottomPadding(verticalOffset) {\n        if (this._paddingBottom === 0) {\n            return false;\n        }\n        const totalHeight = this.getLinesTotalHeight();\n        return (verticalOffset >= totalHeight - this._paddingBottom);\n    }\n    /**\n     * Find the first line number that is at or after vertical offset `verticalOffset`.\n     * i.e. if getVerticalOffsetForLine(line) is x and getVerticalOffsetForLine(line + 1) is y, then\n     * getLineNumberAtOrAfterVerticalOffset(i) = line, x <= i < y.\n     *\n     * @param verticalOffset The vertical offset to search at.\n     * @return The line number at or after vertical offset `verticalOffset`.\n     */\n    getLineNumberAtOrAfterVerticalOffset(verticalOffset) {\n        verticalOffset = verticalOffset | 0;\n        if (verticalOffset < 0) {\n            return 1;\n        }\n        const linesCount = this._lineCount | 0;\n        let minLineNumber = 1;\n        let maxLineNumber = linesCount;\n        while (minLineNumber < maxLineNumber) {\n            const midLineNumber = ((minLineNumber + maxLineNumber) / 2) | 0;\n            const lineHeight = this.getLineHeightForLineNumber(midLineNumber);\n            const midLineNumberVerticalOffset = this.getVerticalOffsetForLineNumber(midLineNumber) | 0;\n            if (verticalOffset >= midLineNumberVerticalOffset + lineHeight) {\n                // vertical offset is after mid line number\n                minLineNumber = midLineNumber + 1;\n            }\n            else if (verticalOffset >= midLineNumberVerticalOffset) {\n                // Hit\n                return midLineNumber;\n            }\n            else {\n                // vertical offset is before mid line number, but mid line number could still be what we're searching for\n                maxLineNumber = midLineNumber;\n            }\n        }\n        if (minLineNumber > linesCount) {\n            return linesCount;\n        }\n        return minLineNumber;\n    }\n    /**\n     * Get all the lines and their relative vertical offsets that are positioned between `verticalOffset1` and `verticalOffset2`.\n     *\n     * @param verticalOffset1 The beginning of the viewport.\n     * @param verticalOffset2 The end of the viewport.\n     * @return A structure describing the lines positioned between `verticalOffset1` and `verticalOffset2`.\n     */\n    getLinesViewportData(verticalOffset1, verticalOffset2) {\n        verticalOffset1 = verticalOffset1 | 0;\n        verticalOffset2 = verticalOffset2 | 0;\n        // Find first line number\n        // We don't live in a perfect world, so the line number might start before or after verticalOffset1\n        const startLineNumber = this.getLineNumberAtOrAfterVerticalOffset(verticalOffset1) | 0;\n        const startLineNumberVerticalOffset = this.getVerticalOffsetForLineNumber(startLineNumber) | 0;\n        let endLineNumber = this._lineCount | 0;\n        // Also keep track of what whitespace we've got\n        let whitespaceIndex = this.getFirstWhitespaceIndexAfterLineNumber(startLineNumber) | 0;\n        const whitespaceCount = this.getWhitespacesCount() | 0;\n        let currentWhitespaceHeight;\n        let currentWhitespaceAfterLineNumber;\n        if (whitespaceIndex === -1) {\n            whitespaceIndex = whitespaceCount;\n            currentWhitespaceAfterLineNumber = endLineNumber + 1;\n            currentWhitespaceHeight = 0;\n        }\n        else {\n            currentWhitespaceAfterLineNumber = this.getAfterLineNumberForWhitespaceIndex(whitespaceIndex) | 0;\n            currentWhitespaceHeight = this.getHeightForWhitespaceIndex(whitespaceIndex) | 0;\n        }\n        let currentVerticalOffset = startLineNumberVerticalOffset;\n        let currentLineRelativeOffset = currentVerticalOffset;\n        // IE (all versions) cannot handle units above about 1,533,908 px, so every 500k pixels bring numbers down\n        const STEP_SIZE = 500000;\n        let bigNumbersDelta = 0;\n        if (startLineNumberVerticalOffset >= STEP_SIZE) {\n            // Compute a delta that guarantees that lines are positioned at `lineHeight` increments\n            bigNumbersDelta = Math.floor(startLineNumberVerticalOffset / STEP_SIZE) * STEP_SIZE;\n            bigNumbersDelta = Math.floor(bigNumbersDelta / this._lineHeightsManager.defaultLineHeight) * this._lineHeightsManager.defaultLineHeight;\n            currentLineRelativeOffset -= bigNumbersDelta;\n        }\n        const linesOffsets = [];\n        const verticalCenter = verticalOffset1 + (verticalOffset2 - verticalOffset1) / 2;\n        let centeredLineNumber = -1;\n        // Figure out how far the lines go\n        for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n            const lineHeight = this.getLineHeightForLineNumber(lineNumber);\n            if (centeredLineNumber === -1) {\n                const currentLineTop = currentVerticalOffset;\n                const currentLineBottom = currentVerticalOffset + lineHeight;\n                if ((currentLineTop <= verticalCenter && verticalCenter < currentLineBottom) || currentLineTop > verticalCenter) {\n                    centeredLineNumber = lineNumber;\n                }\n            }\n            // Count current line height in the vertical offsets\n            currentVerticalOffset += lineHeight;\n            linesOffsets[lineNumber - startLineNumber] = currentLineRelativeOffset;\n            // Next line starts immediately after this one\n            currentLineRelativeOffset += lineHeight;\n            while (currentWhitespaceAfterLineNumber === lineNumber) {\n                // Push down next line with the height of the current whitespace\n                currentLineRelativeOffset += currentWhitespaceHeight;\n                // Count current whitespace in the vertical offsets\n                currentVerticalOffset += currentWhitespaceHeight;\n                whitespaceIndex++;\n                if (whitespaceIndex >= whitespaceCount) {\n                    currentWhitespaceAfterLineNumber = endLineNumber + 1;\n                }\n                else {\n                    currentWhitespaceAfterLineNumber = this.getAfterLineNumberForWhitespaceIndex(whitespaceIndex) | 0;\n                    currentWhitespaceHeight = this.getHeightForWhitespaceIndex(whitespaceIndex) | 0;\n                }\n            }\n            if (currentVerticalOffset >= verticalOffset2) {\n                // We have covered the entire viewport area, time to stop\n                endLineNumber = lineNumber;\n                break;\n            }\n        }\n        if (centeredLineNumber === -1) {\n            centeredLineNumber = endLineNumber;\n        }\n        const endLineNumberVerticalOffset = this.getVerticalOffsetForLineNumber(endLineNumber) | 0;\n        let completelyVisibleStartLineNumber = startLineNumber;\n        let completelyVisibleEndLineNumber = endLineNumber;\n        if (completelyVisibleStartLineNumber < completelyVisibleEndLineNumber) {\n            if (startLineNumberVerticalOffset < verticalOffset1) {\n                completelyVisibleStartLineNumber++;\n            }\n        }\n        if (completelyVisibleStartLineNumber < completelyVisibleEndLineNumber) {\n            const endLineHeight = this.getLineHeightForLineNumber(endLineNumber);\n            if (endLineNumberVerticalOffset + endLineHeight > verticalOffset2) {\n                completelyVisibleEndLineNumber--;\n            }\n        }\n        return {\n            bigNumbersDelta: bigNumbersDelta,\n            startLineNumber: startLineNumber,\n            endLineNumber: endLineNumber,\n            relativeVerticalOffset: linesOffsets,\n            centeredLineNumber: centeredLineNumber,\n            completelyVisibleStartLineNumber: completelyVisibleStartLineNumber,\n            completelyVisibleEndLineNumber: completelyVisibleEndLineNumber,\n            lineHeight: this._lineHeightsManager.defaultLineHeight,\n        };\n    }\n    getVerticalOffsetForWhitespaceIndex(whitespaceIndex) {\n        whitespaceIndex = whitespaceIndex | 0;\n        const afterLineNumber = this.getAfterLineNumberForWhitespaceIndex(whitespaceIndex);\n        let previousLinesHeight;\n        if (afterLineNumber >= 1) {\n            previousLinesHeight = this._lineHeightsManager.getAccumulatedLineHeightsIncludingLineNumber(afterLineNumber);\n        }\n        else {\n            previousLinesHeight = 0;\n        }\n        let previousWhitespacesHeight;\n        if (whitespaceIndex > 0) {\n            previousWhitespacesHeight = this.getWhitespacesAccumulatedHeight(whitespaceIndex - 1);\n        }\n        else {\n            previousWhitespacesHeight = 0;\n        }\n        return previousLinesHeight + previousWhitespacesHeight + this._paddingTop;\n    }\n    getWhitespaceIndexAtOrAfterVerticallOffset(verticalOffset) {\n        verticalOffset = verticalOffset | 0;\n        let minWhitespaceIndex = 0;\n        let maxWhitespaceIndex = this.getWhitespacesCount() - 1;\n        if (maxWhitespaceIndex < 0) {\n            return -1;\n        }\n        // Special case: nothing to be found\n        const maxWhitespaceVerticalOffset = this.getVerticalOffsetForWhitespaceIndex(maxWhitespaceIndex);\n        const maxWhitespaceHeight = this.getHeightForWhitespaceIndex(maxWhitespaceIndex);\n        if (verticalOffset >= maxWhitespaceVerticalOffset + maxWhitespaceHeight) {\n            return -1;\n        }\n        while (minWhitespaceIndex < maxWhitespaceIndex) {\n            const midWhitespaceIndex = Math.floor((minWhitespaceIndex + maxWhitespaceIndex) / 2);\n            const midWhitespaceVerticalOffset = this.getVerticalOffsetForWhitespaceIndex(midWhitespaceIndex);\n            const midWhitespaceHeight = this.getHeightForWhitespaceIndex(midWhitespaceIndex);\n            if (verticalOffset >= midWhitespaceVerticalOffset + midWhitespaceHeight) {\n                // vertical offset is after whitespace\n                minWhitespaceIndex = midWhitespaceIndex + 1;\n            }\n            else if (verticalOffset >= midWhitespaceVerticalOffset) {\n                // Hit\n                return midWhitespaceIndex;\n            }\n            else {\n                // vertical offset is before whitespace, but midWhitespaceIndex might still be what we're searching for\n                maxWhitespaceIndex = midWhitespaceIndex;\n            }\n        }\n        return minWhitespaceIndex;\n    }\n    /**\n     * Get exactly the whitespace that is layouted at `verticalOffset`.\n     *\n     * @param verticalOffset The vertical offset.\n     * @return Precisely the whitespace that is layouted at `verticaloffset` or null.\n     */\n    getWhitespaceAtVerticalOffset(verticalOffset) {\n        verticalOffset = verticalOffset | 0;\n        const candidateIndex = this.getWhitespaceIndexAtOrAfterVerticallOffset(verticalOffset);\n        if (candidateIndex < 0) {\n            return null;\n        }\n        if (candidateIndex >= this.getWhitespacesCount()) {\n            return null;\n        }\n        const candidateTop = this.getVerticalOffsetForWhitespaceIndex(candidateIndex);\n        if (candidateTop > verticalOffset) {\n            return null;\n        }\n        const candidateHeight = this.getHeightForWhitespaceIndex(candidateIndex);\n        const candidateId = this.getIdForWhitespaceIndex(candidateIndex);\n        const candidateAfterLineNumber = this.getAfterLineNumberForWhitespaceIndex(candidateIndex);\n        return {\n            id: candidateId,\n            afterLineNumber: candidateAfterLineNumber,\n            verticalOffset: candidateTop,\n            height: candidateHeight\n        };\n    }\n    /**\n     * Get a list of whitespaces that are positioned between `verticalOffset1` and `verticalOffset2`.\n     *\n     * @param verticalOffset1 The beginning of the viewport.\n     * @param verticalOffset2 The end of the viewport.\n     * @return An array with all the whitespaces in the viewport. If no whitespace is in viewport, the array is empty.\n     */\n    getWhitespaceViewportData(verticalOffset1, verticalOffset2) {\n        verticalOffset1 = verticalOffset1 | 0;\n        verticalOffset2 = verticalOffset2 | 0;\n        const startIndex = this.getWhitespaceIndexAtOrAfterVerticallOffset(verticalOffset1);\n        const endIndex = this.getWhitespacesCount() - 1;\n        if (startIndex < 0) {\n            return [];\n        }\n        const result = [];\n        for (let i = startIndex; i <= endIndex; i++) {\n            const top = this.getVerticalOffsetForWhitespaceIndex(i);\n            const height = this.getHeightForWhitespaceIndex(i);\n            if (top >= verticalOffset2) {\n                break;\n            }\n            result.push({\n                id: this.getIdForWhitespaceIndex(i),\n                afterLineNumber: this.getAfterLineNumberForWhitespaceIndex(i),\n                verticalOffset: top,\n                height: height\n            });\n        }\n        return result;\n    }\n    /**\n     * Get all whitespaces.\n     */\n    getWhitespaces() {\n        return this._arr.slice(0);\n    }\n    /**\n     * The number of whitespaces.\n     */\n    getWhitespacesCount() {\n        return this._arr.length;\n    }\n    /**\n     * Get the `id` for whitespace at index `index`.\n     *\n     * @param index The index of the whitespace.\n     * @return `id` of whitespace at `index`.\n     */\n    getIdForWhitespaceIndex(index) {\n        index = index | 0;\n        return this._arr[index].id;\n    }\n    /**\n     * Get the `afterLineNumber` for whitespace at index `index`.\n     *\n     * @param index The index of the whitespace.\n     * @return `afterLineNumber` of whitespace at `index`.\n     */\n    getAfterLineNumberForWhitespaceIndex(index) {\n        index = index | 0;\n        return this._arr[index].afterLineNumber;\n    }\n    /**\n     * Get the `height` for whitespace at index `index`.\n     *\n     * @param index The index of the whitespace.\n     * @return `height` of whitespace at `index`.\n     */\n    getHeightForWhitespaceIndex(index) {\n        index = index | 0;\n        return this._arr[index].height;\n    }\n}\n\nexport { EditorWhitespace, LinesLayout };\n","import { Emitter } from '../../../base/common/event.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { Scrollable } from '../../../base/common/scrollable.js';\nimport { LinesLayout } from './linesLayout.js';\nimport { Viewport } from '../viewModel.js';\nimport { ContentSizeChangedEvent } from '../viewModelEventDispatcher.js';\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 *--------------------------------------------------------------------------------------------*/\nconst SMOOTH_SCROLLING_TIME = 125;\nclass EditorScrollDimensions {\n    constructor(width, contentWidth, height, contentHeight) {\n        width = width | 0;\n        contentWidth = contentWidth | 0;\n        height = height | 0;\n        contentHeight = contentHeight | 0;\n        if (width < 0) {\n            width = 0;\n        }\n        if (contentWidth < 0) {\n            contentWidth = 0;\n        }\n        if (height < 0) {\n            height = 0;\n        }\n        if (contentHeight < 0) {\n            contentHeight = 0;\n        }\n        this.width = width;\n        this.contentWidth = contentWidth;\n        this.scrollWidth = Math.max(width, contentWidth);\n        this.height = height;\n        this.contentHeight = contentHeight;\n        this.scrollHeight = Math.max(height, contentHeight);\n    }\n    equals(other) {\n        return (this.width === other.width\n            && this.contentWidth === other.contentWidth\n            && this.height === other.height\n            && this.contentHeight === other.contentHeight);\n    }\n}\nclass EditorScrollable extends Disposable {\n    constructor(smoothScrollDuration, scheduleAtNextAnimationFrame) {\n        super();\n        this._onDidContentSizeChange = this._register(new Emitter());\n        this.onDidContentSizeChange = this._onDidContentSizeChange.event;\n        this._dimensions = new EditorScrollDimensions(0, 0, 0, 0);\n        this._scrollable = this._register(new Scrollable({\n            forceIntegerValues: true,\n            smoothScrollDuration,\n            scheduleAtNextAnimationFrame\n        }));\n        this.onDidScroll = this._scrollable.onScroll;\n    }\n    getScrollable() {\n        return this._scrollable;\n    }\n    setSmoothScrollDuration(smoothScrollDuration) {\n        this._scrollable.setSmoothScrollDuration(smoothScrollDuration);\n    }\n    validateScrollPosition(scrollPosition) {\n        return this._scrollable.validateScrollPosition(scrollPosition);\n    }\n    getScrollDimensions() {\n        return this._dimensions;\n    }\n    setScrollDimensions(dimensions) {\n        if (this._dimensions.equals(dimensions)) {\n            return;\n        }\n        const oldDimensions = this._dimensions;\n        this._dimensions = dimensions;\n        this._scrollable.setScrollDimensions({\n            width: dimensions.width,\n            scrollWidth: dimensions.scrollWidth,\n            height: dimensions.height,\n            scrollHeight: dimensions.scrollHeight\n        }, true);\n        const contentWidthChanged = (oldDimensions.contentWidth !== dimensions.contentWidth);\n        const contentHeightChanged = (oldDimensions.contentHeight !== dimensions.contentHeight);\n        if (contentWidthChanged || contentHeightChanged) {\n            this._onDidContentSizeChange.fire(new ContentSizeChangedEvent(oldDimensions.contentWidth, oldDimensions.contentHeight, dimensions.contentWidth, dimensions.contentHeight));\n        }\n    }\n    getFutureScrollPosition() {\n        return this._scrollable.getFutureScrollPosition();\n    }\n    getCurrentScrollPosition() {\n        return this._scrollable.getCurrentScrollPosition();\n    }\n    setScrollPositionNow(update) {\n        this._scrollable.setScrollPositionNow(update);\n    }\n    setScrollPositionSmooth(update) {\n        this._scrollable.setScrollPositionSmooth(update);\n    }\n    hasPendingScrollAnimation() {\n        return this._scrollable.hasPendingScrollAnimation();\n    }\n}\nclass ViewLayout extends Disposable {\n    constructor(configuration, lineCount, customLineHeightData, scheduleAtNextAnimationFrame) {\n        super();\n        this._configuration = configuration;\n        const options = this._configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        const padding = options.get(96 /* EditorOption.padding */);\n        this._linesLayout = new LinesLayout(lineCount, options.get(75 /* EditorOption.lineHeight */), padding.top, padding.bottom, customLineHeightData);\n        this._maxLineWidth = 0;\n        this._overlayWidgetsMinWidth = 0;\n        this._scrollable = this._register(new EditorScrollable(0, scheduleAtNextAnimationFrame));\n        this._configureSmoothScrollDuration();\n        this._scrollable.setScrollDimensions(new EditorScrollDimensions(layoutInfo.contentWidth, 0, layoutInfo.height, 0));\n        this.onDidScroll = this._scrollable.onDidScroll;\n        this.onDidContentSizeChange = this._scrollable.onDidContentSizeChange;\n        this._updateHeight();\n    }\n    dispose() {\n        super.dispose();\n    }\n    getScrollable() {\n        return this._scrollable.getScrollable();\n    }\n    onHeightMaybeChanged() {\n        this._updateHeight();\n    }\n    _configureSmoothScrollDuration() {\n        this._scrollable.setSmoothScrollDuration(this._configuration.options.get(130 /* EditorOption.smoothScrolling */) ? SMOOTH_SCROLLING_TIME : 0);\n    }\n    // ---- begin view event handlers\n    onConfigurationChanged(e) {\n        const options = this._configuration.options;\n        if (e.hasChanged(75 /* EditorOption.lineHeight */)) {\n            this._linesLayout.setDefaultLineHeight(options.get(75 /* EditorOption.lineHeight */));\n        }\n        if (e.hasChanged(96 /* EditorOption.padding */)) {\n            const padding = options.get(96 /* EditorOption.padding */);\n            this._linesLayout.setPadding(padding.top, padding.bottom);\n        }\n        if (e.hasChanged(165 /* EditorOption.layoutInfo */)) {\n            const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n            const width = layoutInfo.contentWidth;\n            const height = layoutInfo.height;\n            const scrollDimensions = this._scrollable.getScrollDimensions();\n            const contentWidth = scrollDimensions.contentWidth;\n            this._scrollable.setScrollDimensions(new EditorScrollDimensions(width, scrollDimensions.contentWidth, height, this._getContentHeight(width, height, contentWidth)));\n        }\n        else {\n            this._updateHeight();\n        }\n        if (e.hasChanged(130 /* EditorOption.smoothScrolling */)) {\n            this._configureSmoothScrollDuration();\n        }\n    }\n    onFlushed(lineCount, customLineHeightData) {\n        this._linesLayout.onFlushed(lineCount, customLineHeightData);\n    }\n    onLinesDeleted(fromLineNumber, toLineNumber) {\n        this._linesLayout.onLinesDeleted(fromLineNumber, toLineNumber);\n    }\n    onLinesInserted(fromLineNumber, toLineNumber) {\n        this._linesLayout.onLinesInserted(fromLineNumber, toLineNumber);\n    }\n    // ---- end view event handlers\n    _getHorizontalScrollbarHeight(width, scrollWidth) {\n        const options = this._configuration.options;\n        const scrollbar = options.get(117 /* EditorOption.scrollbar */);\n        if (scrollbar.horizontal === 2 /* ScrollbarVisibility.Hidden */) {\n            // horizontal scrollbar not visible\n            return 0;\n        }\n        if (width >= scrollWidth) {\n            // horizontal scrollbar not visible\n            return 0;\n        }\n        return scrollbar.horizontalScrollbarSize;\n    }\n    _getContentHeight(width, height, contentWidth) {\n        const options = this._configuration.options;\n        let result = this._linesLayout.getLinesTotalHeight();\n        if (options.get(119 /* EditorOption.scrollBeyondLastLine */)) {\n            result += Math.max(0, height - options.get(75 /* EditorOption.lineHeight */) - options.get(96 /* EditorOption.padding */).bottom);\n        }\n        else if (!options.get(117 /* EditorOption.scrollbar */).ignoreHorizontalScrollbarInContentHeight) {\n            result += this._getHorizontalScrollbarHeight(width, contentWidth);\n        }\n        return result;\n    }\n    _updateHeight() {\n        const scrollDimensions = this._scrollable.getScrollDimensions();\n        const width = scrollDimensions.width;\n        const height = scrollDimensions.height;\n        const contentWidth = scrollDimensions.contentWidth;\n        this._scrollable.setScrollDimensions(new EditorScrollDimensions(width, scrollDimensions.contentWidth, height, this._getContentHeight(width, height, contentWidth)));\n    }\n    // ---- Layouting logic\n    getCurrentViewport() {\n        const scrollDimensions = this._scrollable.getScrollDimensions();\n        const currentScrollPosition = this._scrollable.getCurrentScrollPosition();\n        return new Viewport(currentScrollPosition.scrollTop, currentScrollPosition.scrollLeft, scrollDimensions.width, scrollDimensions.height);\n    }\n    getFutureViewport() {\n        const scrollDimensions = this._scrollable.getScrollDimensions();\n        const currentScrollPosition = this._scrollable.getFutureScrollPosition();\n        return new Viewport(currentScrollPosition.scrollTop, currentScrollPosition.scrollLeft, scrollDimensions.width, scrollDimensions.height);\n    }\n    _computeContentWidth() {\n        const options = this._configuration.options;\n        const maxLineWidth = this._maxLineWidth;\n        const wrappingInfo = options.get(166 /* EditorOption.wrappingInfo */);\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        if (wrappingInfo.isViewportWrapping) {\n            const minimap = options.get(81 /* EditorOption.minimap */);\n            if (maxLineWidth > layoutInfo.contentWidth + fontInfo.typicalHalfwidthCharacterWidth) {\n                // This is a case where viewport wrapping is on, but the line extends above the viewport\n                if (minimap.enabled && minimap.side === 'right') {\n                    // We need to accomodate the scrollbar width\n                    return maxLineWidth + layoutInfo.verticalScrollbarWidth;\n                }\n            }\n            return maxLineWidth;\n        }\n        else {\n            const extraHorizontalSpace = options.get(118 /* EditorOption.scrollBeyondLastColumn */) * fontInfo.typicalHalfwidthCharacterWidth;\n            const whitespaceMinWidth = this._linesLayout.getWhitespaceMinWidth();\n            return Math.max(maxLineWidth + extraHorizontalSpace + layoutInfo.verticalScrollbarWidth, whitespaceMinWidth, this._overlayWidgetsMinWidth);\n        }\n    }\n    setMaxLineWidth(maxLineWidth) {\n        this._maxLineWidth = maxLineWidth;\n        this._updateContentWidth();\n    }\n    setOverlayWidgetsMinWidth(maxMinWidth) {\n        this._overlayWidgetsMinWidth = maxMinWidth;\n        this._updateContentWidth();\n    }\n    _updateContentWidth() {\n        const scrollDimensions = this._scrollable.getScrollDimensions();\n        this._scrollable.setScrollDimensions(new EditorScrollDimensions(scrollDimensions.width, this._computeContentWidth(), scrollDimensions.height, scrollDimensions.contentHeight));\n        // The height might depend on the fact that there is a horizontal scrollbar or not\n        this._updateHeight();\n    }\n    // ---- view state\n    saveState() {\n        const currentScrollPosition = this._scrollable.getFutureScrollPosition();\n        const scrollTop = currentScrollPosition.scrollTop;\n        const firstLineNumberInViewport = this._linesLayout.getLineNumberAtOrAfterVerticalOffset(scrollTop);\n        const whitespaceAboveFirstLine = this._linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(firstLineNumberInViewport);\n        return {\n            scrollTop: scrollTop,\n            scrollTopWithoutViewZones: scrollTop - whitespaceAboveFirstLine,\n            scrollLeft: currentScrollPosition.scrollLeft\n        };\n    }\n    // ----\n    changeWhitespace(callback) {\n        const hadAChange = this._linesLayout.changeWhitespace(callback);\n        if (hadAChange) {\n            this.onHeightMaybeChanged();\n        }\n        return hadAChange;\n    }\n    changeSpecialLineHeights(callback) {\n        const hadAChange = this._linesLayout.changeLineHeights(callback);\n        if (hadAChange) {\n            this.onHeightMaybeChanged();\n        }\n        return hadAChange;\n    }\n    getVerticalOffsetForLineNumber(lineNumber, includeViewZones = false) {\n        return this._linesLayout.getVerticalOffsetForLineNumber(lineNumber, includeViewZones);\n    }\n    getVerticalOffsetAfterLineNumber(lineNumber, includeViewZones = false) {\n        return this._linesLayout.getVerticalOffsetAfterLineNumber(lineNumber, includeViewZones);\n    }\n    getLineHeightForLineNumber(lineNumber) {\n        return this._linesLayout.getLineHeightForLineNumber(lineNumber);\n    }\n    isAfterLines(verticalOffset) {\n        return this._linesLayout.isAfterLines(verticalOffset);\n    }\n    isInTopPadding(verticalOffset) {\n        return this._linesLayout.isInTopPadding(verticalOffset);\n    }\n    isInBottomPadding(verticalOffset) {\n        return this._linesLayout.isInBottomPadding(verticalOffset);\n    }\n    getLineNumberAtVerticalOffset(verticalOffset) {\n        return this._linesLayout.getLineNumberAtOrAfterVerticalOffset(verticalOffset);\n    }\n    getWhitespaceAtVerticalOffset(verticalOffset) {\n        return this._linesLayout.getWhitespaceAtVerticalOffset(verticalOffset);\n    }\n    getLinesViewportData() {\n        const visibleBox = this.getCurrentViewport();\n        return this._linesLayout.getLinesViewportData(visibleBox.top, visibleBox.top + visibleBox.height);\n    }\n    getLinesViewportDataAtScrollTop(scrollTop) {\n        // do some minimal validations on scrollTop\n        const scrollDimensions = this._scrollable.getScrollDimensions();\n        if (scrollTop + scrollDimensions.height > scrollDimensions.scrollHeight) {\n            scrollTop = scrollDimensions.scrollHeight - scrollDimensions.height;\n        }\n        if (scrollTop < 0) {\n            scrollTop = 0;\n        }\n        return this._linesLayout.getLinesViewportData(scrollTop, scrollTop + scrollDimensions.height);\n    }\n    getWhitespaceViewportData() {\n        const visibleBox = this.getCurrentViewport();\n        return this._linesLayout.getWhitespaceViewportData(visibleBox.top, visibleBox.top + visibleBox.height);\n    }\n    getWhitespaces() {\n        return this._linesLayout.getWhitespaces();\n    }\n    // ----\n    getContentWidth() {\n        const scrollDimensions = this._scrollable.getScrollDimensions();\n        return scrollDimensions.contentWidth;\n    }\n    getScrollWidth() {\n        const scrollDimensions = this._scrollable.getScrollDimensions();\n        return scrollDimensions.scrollWidth;\n    }\n    getContentHeight() {\n        const scrollDimensions = this._scrollable.getScrollDimensions();\n        return scrollDimensions.contentHeight;\n    }\n    getScrollHeight() {\n        const scrollDimensions = this._scrollable.getScrollDimensions();\n        return scrollDimensions.scrollHeight;\n    }\n    getCurrentScrollLeft() {\n        const currentScrollPosition = this._scrollable.getCurrentScrollPosition();\n        return currentScrollPosition.scrollLeft;\n    }\n    getCurrentScrollTop() {\n        const currentScrollPosition = this._scrollable.getCurrentScrollPosition();\n        return currentScrollPosition.scrollTop;\n    }\n    validateScrollPosition(scrollPosition) {\n        return this._scrollable.validateScrollPosition(scrollPosition);\n    }\n    setScrollPosition(position, type) {\n        if (type === 1 /* ScrollType.Immediate */) {\n            this._scrollable.setScrollPositionNow(position);\n        }\n        else {\n            this._scrollable.setScrollPositionSmooth(position);\n        }\n    }\n    hasPendingScrollAnimation() {\n        return this._scrollable.hasPendingScrollAnimation();\n    }\n    deltaScrollNow(deltaScrollLeft, deltaScrollTop) {\n        const currentScrollPosition = this._scrollable.getCurrentScrollPosition();\n        this._scrollable.setScrollPositionNow({\n            scrollLeft: currentScrollPosition.scrollLeft + deltaScrollLeft,\n            scrollTop: currentScrollPosition.scrollTop + deltaScrollTop\n        });\n    }\n}\n\nexport { ViewLayout };\n","import { Range } from '../core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nclass InlineDecoration {\n    constructor(range, inlineClassName, type) {\n        this.range = range;\n        this.inlineClassName = inlineClassName;\n        this.type = type;\n    }\n}\nclass SingleLineInlineDecoration {\n    constructor(startOffset, endOffset, inlineClassName, inlineClassNameAffectsLetterSpacing) {\n        this.startOffset = startOffset;\n        this.endOffset = endOffset;\n        this.inlineClassName = inlineClassName;\n        this.inlineClassNameAffectsLetterSpacing = inlineClassNameAffectsLetterSpacing;\n    }\n    toInlineDecoration(lineNumber) {\n        return new InlineDecoration(new Range(lineNumber, this.startOffset + 1, lineNumber, this.endOffset + 1), this.inlineClassName, this.inlineClassNameAffectsLetterSpacing ? 3 /* InlineDecorationType.RegularAffectingLetterSpacing */ : 0 /* InlineDecorationType.Regular */);\n    }\n}\n\nexport { InlineDecoration, SingleLineInlineDecoration };\n","import { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { filterValidationDecorations, filterFontDecorations } from '../config/editorOptions.js';\nimport { ViewModelDecoration, isModelDecorationVisible } from './viewModelDecoration.js';\nimport { InlineDecoration } from './inlineDecorations.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ViewModelDecorations {\n    constructor(editorId, model, configuration, linesCollection, coordinatesConverter) {\n        this.editorId = editorId;\n        this.model = model;\n        this.configuration = configuration;\n        this._linesCollection = linesCollection;\n        this._coordinatesConverter = coordinatesConverter;\n        this._decorationsCache = Object.create(null);\n        this._cachedModelDecorationsResolver = null;\n        this._cachedModelDecorationsResolverViewRange = null;\n    }\n    _clearCachedModelDecorationsResolver() {\n        this._cachedModelDecorationsResolver = null;\n        this._cachedModelDecorationsResolverViewRange = null;\n    }\n    dispose() {\n        this._decorationsCache = Object.create(null);\n        this._clearCachedModelDecorationsResolver();\n    }\n    reset() {\n        this._decorationsCache = Object.create(null);\n        this._clearCachedModelDecorationsResolver();\n    }\n    onModelDecorationsChanged() {\n        this._decorationsCache = Object.create(null);\n        this._clearCachedModelDecorationsResolver();\n    }\n    onLineMappingChanged() {\n        this._decorationsCache = Object.create(null);\n        this._clearCachedModelDecorationsResolver();\n    }\n    _getOrCreateViewModelDecoration(modelDecoration) {\n        const id = modelDecoration.id;\n        let r = this._decorationsCache[id];\n        if (!r) {\n            const modelRange = modelDecoration.range;\n            const options = modelDecoration.options;\n            let viewRange;\n            if (options.isWholeLine) {\n                const start = this._coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.startLineNumber, 1), 0 /* PositionAffinity.Left */, false, true);\n                const end = this._coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.endLineNumber, this.model.getLineMaxColumn(modelRange.endLineNumber)), 1 /* PositionAffinity.Right */);\n                viewRange = new Range(start.lineNumber, start.column, end.lineNumber, end.column);\n            }\n            else {\n                // For backwards compatibility reasons, we want injected text before any decoration.\n                // Thus, move decorations to the right.\n                viewRange = this._coordinatesConverter.convertModelRangeToViewRange(modelRange, 1 /* PositionAffinity.Right */);\n            }\n            r = new ViewModelDecoration(viewRange, options);\n            this._decorationsCache[id] = r;\n        }\n        return r;\n    }\n    getMinimapDecorationsInRange(range) {\n        return this._getDecorationsInRange(range, true, false).decorations;\n    }\n    getDecorationsViewportData(viewRange) {\n        let cacheIsValid = (this._cachedModelDecorationsResolver !== null);\n        cacheIsValid = cacheIsValid && (viewRange.equalsRange(this._cachedModelDecorationsResolverViewRange));\n        if (!cacheIsValid) {\n            this._cachedModelDecorationsResolver = this._getDecorationsInRange(viewRange, false, false);\n            this._cachedModelDecorationsResolverViewRange = viewRange;\n        }\n        return this._cachedModelDecorationsResolver;\n    }\n    getDecorationsOnLine(lineNumber, onlyMinimapDecorations = false, onlyMarginDecorations = false) {\n        const range = new Range(lineNumber, this._linesCollection.getViewLineMinColumn(lineNumber), lineNumber, this._linesCollection.getViewLineMaxColumn(lineNumber));\n        return this._getDecorationsInRange(range, onlyMinimapDecorations, onlyMarginDecorations);\n    }\n    _getDecorationsInRange(viewRange, onlyMinimapDecorations, onlyMarginDecorations) {\n        const modelDecorations = this._linesCollection.getDecorationsInRange(viewRange, this.editorId, filterValidationDecorations(this.configuration.options), filterFontDecorations(this.configuration.options), onlyMinimapDecorations, onlyMarginDecorations);\n        const startLineNumber = viewRange.startLineNumber;\n        const endLineNumber = viewRange.endLineNumber;\n        const decorationsInViewport = [];\n        let decorationsInViewportLen = 0;\n        const inlineDecorations = [];\n        for (let j = startLineNumber; j <= endLineNumber; j++) {\n            inlineDecorations[j - startLineNumber] = [];\n        }\n        let hasVariableFonts = false;\n        for (let i = 0, len = modelDecorations.length; i < len; i++) {\n            const modelDecoration = modelDecorations[i];\n            const decorationOptions = modelDecoration.options;\n            if (!isModelDecorationVisible(this.model, modelDecoration)) {\n                continue;\n            }\n            const viewModelDecoration = this._getOrCreateViewModelDecoration(modelDecoration);\n            const viewRange = viewModelDecoration.range;\n            decorationsInViewport[decorationsInViewportLen++] = viewModelDecoration;\n            if (decorationOptions.inlineClassName) {\n                const inlineDecoration = new InlineDecoration(viewRange, decorationOptions.inlineClassName, decorationOptions.inlineClassNameAffectsLetterSpacing ? 3 /* InlineDecorationType.RegularAffectingLetterSpacing */ : 0 /* InlineDecorationType.Regular */);\n                const intersectedStartLineNumber = Math.max(startLineNumber, viewRange.startLineNumber);\n                const intersectedEndLineNumber = Math.min(endLineNumber, viewRange.endLineNumber);\n                for (let j = intersectedStartLineNumber; j <= intersectedEndLineNumber; j++) {\n                    inlineDecorations[j - startLineNumber].push(inlineDecoration);\n                }\n            }\n            if (decorationOptions.beforeContentClassName) {\n                if (startLineNumber <= viewRange.startLineNumber && viewRange.startLineNumber <= endLineNumber) {\n                    const inlineDecoration = new InlineDecoration(new Range(viewRange.startLineNumber, viewRange.startColumn, viewRange.startLineNumber, viewRange.startColumn), decorationOptions.beforeContentClassName, 1 /* InlineDecorationType.Before */);\n                    inlineDecorations[viewRange.startLineNumber - startLineNumber].push(inlineDecoration);\n                }\n            }\n            if (decorationOptions.afterContentClassName) {\n                if (startLineNumber <= viewRange.endLineNumber && viewRange.endLineNumber <= endLineNumber) {\n                    const inlineDecoration = new InlineDecoration(new Range(viewRange.endLineNumber, viewRange.endColumn, viewRange.endLineNumber, viewRange.endColumn), decorationOptions.afterContentClassName, 2 /* InlineDecorationType.After */);\n                    inlineDecorations[viewRange.endLineNumber - startLineNumber].push(inlineDecoration);\n                }\n            }\n            if (decorationOptions.affectsFont) {\n                hasVariableFonts = true;\n            }\n        }\n        return {\n            decorations: decorationsInViewport,\n            inlineDecorations: inlineDecorations,\n            hasVariableFonts\n        };\n    }\n}\n\nexport { ViewModelDecorations };\n","import { LineTokens } from '../tokens/lineTokens.js';\nimport { Position } from '../core/position.js';\nimport { LineInjectedText } from '../textModelEvents.js';\nimport { ViewLineData } from '../viewModel.js';\nimport { SingleLineInlineDecoration } from './inlineDecorations.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction createModelLineProjection(lineBreakData, isVisible) {\n    if (lineBreakData === null) {\n        // No mapping needed\n        if (isVisible) {\n            return IdentityModelLineProjection.INSTANCE;\n        }\n        return HiddenModelLineProjection.INSTANCE;\n    }\n    else {\n        return new ModelLineProjection(lineBreakData, isVisible);\n    }\n}\n/**\n * This projection is used to\n * * wrap model lines\n * * inject text\n */\nclass ModelLineProjection {\n    constructor(lineBreakData, isVisible) {\n        this._projectionData = lineBreakData;\n        this._isVisible = isVisible;\n    }\n    isVisible() {\n        return this._isVisible;\n    }\n    setVisible(isVisible) {\n        this._isVisible = isVisible;\n        return this;\n    }\n    getProjectionData() {\n        return this._projectionData;\n    }\n    getViewLineCount() {\n        if (!this._isVisible) {\n            return 0;\n        }\n        return this._projectionData.getOutputLineCount();\n    }\n    getViewLineContent(model, modelLineNumber, outputLineIndex) {\n        this._assertVisible();\n        const startOffsetInInputWithInjections = outputLineIndex > 0 ? this._projectionData.breakOffsets[outputLineIndex - 1] : 0;\n        const endOffsetInInputWithInjections = this._projectionData.breakOffsets[outputLineIndex];\n        let r;\n        if (this._projectionData.injectionOffsets !== null) {\n            const injectedTexts = this._projectionData.injectionOffsets.map((offset, idx) => new LineInjectedText(0, 0, offset + 1, this._projectionData.injectionOptions[idx], 0));\n            const lineWithInjections = LineInjectedText.applyInjectedText(model.getLineContent(modelLineNumber), injectedTexts);\n            r = lineWithInjections.substring(startOffsetInInputWithInjections, endOffsetInInputWithInjections);\n        }\n        else {\n            r = model.getValueInRange({\n                startLineNumber: modelLineNumber,\n                startColumn: startOffsetInInputWithInjections + 1,\n                endLineNumber: modelLineNumber,\n                endColumn: endOffsetInInputWithInjections + 1\n            });\n        }\n        if (outputLineIndex > 0) {\n            r = spaces(this._projectionData.wrappedTextIndentLength) + r;\n        }\n        return r;\n    }\n    getViewLineLength(model, modelLineNumber, outputLineIndex) {\n        this._assertVisible();\n        return this._projectionData.getLineLength(outputLineIndex);\n    }\n    getViewLineMinColumn(_model, _modelLineNumber, outputLineIndex) {\n        this._assertVisible();\n        return this._projectionData.getMinOutputOffset(outputLineIndex) + 1;\n    }\n    getViewLineMaxColumn(model, modelLineNumber, outputLineIndex) {\n        this._assertVisible();\n        return this._projectionData.getMaxOutputOffset(outputLineIndex) + 1;\n    }\n    /**\n     * Try using {@link getViewLinesData} instead.\n    */\n    getViewLineData(model, modelLineNumber, outputLineIndex) {\n        const arr = new Array();\n        this.getViewLinesData(model, modelLineNumber, outputLineIndex, 1, 0, [true], arr);\n        return arr[0];\n    }\n    getViewLinesData(model, modelLineNumber, outputLineIdx, lineCount, globalStartIndex, needed, result) {\n        this._assertVisible();\n        const lineBreakData = this._projectionData;\n        const injectionOffsets = lineBreakData.injectionOffsets;\n        const injectionOptions = lineBreakData.injectionOptions;\n        let inlineDecorationsPerOutputLine = null;\n        if (injectionOffsets) {\n            inlineDecorationsPerOutputLine = [];\n            let totalInjectedTextLengthBefore = 0;\n            let currentInjectedOffset = 0;\n            for (let outputLineIndex = 0; outputLineIndex < lineBreakData.getOutputLineCount(); outputLineIndex++) {\n                const inlineDecorations = new Array();\n                inlineDecorationsPerOutputLine[outputLineIndex] = inlineDecorations;\n                const lineStartOffsetInInputWithInjections = outputLineIndex > 0 ? lineBreakData.breakOffsets[outputLineIndex - 1] : 0;\n                const lineEndOffsetInInputWithInjections = lineBreakData.breakOffsets[outputLineIndex];\n                while (currentInjectedOffset < injectionOffsets.length) {\n                    const length = injectionOptions[currentInjectedOffset].content.length;\n                    const injectedTextStartOffsetInInputWithInjections = injectionOffsets[currentInjectedOffset] + totalInjectedTextLengthBefore;\n                    const injectedTextEndOffsetInInputWithInjections = injectedTextStartOffsetInInputWithInjections + length;\n                    if (injectedTextStartOffsetInInputWithInjections > lineEndOffsetInInputWithInjections) {\n                        // Injected text only starts in later wrapped lines.\n                        break;\n                    }\n                    if (lineStartOffsetInInputWithInjections < injectedTextEndOffsetInInputWithInjections) {\n                        // Injected text ends after or in this line (but also starts in or before this line).\n                        const options = injectionOptions[currentInjectedOffset];\n                        if (options.inlineClassName) {\n                            const offset = (outputLineIndex > 0 ? lineBreakData.wrappedTextIndentLength : 0);\n                            const start = offset + Math.max(injectedTextStartOffsetInInputWithInjections - lineStartOffsetInInputWithInjections, 0);\n                            const end = offset + Math.min(injectedTextEndOffsetInInputWithInjections - lineStartOffsetInInputWithInjections, lineEndOffsetInInputWithInjections - lineStartOffsetInInputWithInjections);\n                            if (start !== end) {\n                                inlineDecorations.push(new SingleLineInlineDecoration(start, end, options.inlineClassName, options.inlineClassNameAffectsLetterSpacing));\n                            }\n                        }\n                    }\n                    if (injectedTextEndOffsetInInputWithInjections <= lineEndOffsetInInputWithInjections) {\n                        totalInjectedTextLengthBefore += length;\n                        currentInjectedOffset++;\n                    }\n                    else {\n                        // injected text breaks into next line, process it again\n                        break;\n                    }\n                }\n            }\n        }\n        let lineWithInjections;\n        if (injectionOffsets) {\n            const tokensToInsert = [];\n            for (let idx = 0; idx < injectionOffsets.length; idx++) {\n                const offset = injectionOffsets[idx];\n                const tokens = injectionOptions[idx].tokens;\n                if (tokens) {\n                    tokens.forEach((range, info) => {\n                        tokensToInsert.push({\n                            offset,\n                            text: range.substring(injectionOptions[idx].content),\n                            tokenMetadata: info.metadata,\n                        });\n                    });\n                }\n                else {\n                    tokensToInsert.push({\n                        offset,\n                        text: injectionOptions[idx].content,\n                        tokenMetadata: LineTokens.defaultTokenMetadata,\n                    });\n                }\n            }\n            lineWithInjections = model.tokenization.getLineTokens(modelLineNumber).withInserted(tokensToInsert);\n        }\n        else {\n            lineWithInjections = model.tokenization.getLineTokens(modelLineNumber);\n        }\n        for (let outputLineIndex = outputLineIdx; outputLineIndex < outputLineIdx + lineCount; outputLineIndex++) {\n            const globalIndex = globalStartIndex + outputLineIndex - outputLineIdx;\n            if (!needed[globalIndex]) {\n                result[globalIndex] = null;\n                continue;\n            }\n            result[globalIndex] = this._getViewLineData(lineWithInjections, inlineDecorationsPerOutputLine ? inlineDecorationsPerOutputLine[outputLineIndex] : null, outputLineIndex);\n        }\n    }\n    _getViewLineData(lineWithInjections, inlineDecorations, outputLineIndex) {\n        this._assertVisible();\n        const lineBreakData = this._projectionData;\n        const deltaStartIndex = (outputLineIndex > 0 ? lineBreakData.wrappedTextIndentLength : 0);\n        const lineStartOffsetInInputWithInjections = outputLineIndex > 0 ? lineBreakData.breakOffsets[outputLineIndex - 1] : 0;\n        const lineEndOffsetInInputWithInjections = lineBreakData.breakOffsets[outputLineIndex];\n        const tokens = lineWithInjections.sliceAndInflate(lineStartOffsetInInputWithInjections, lineEndOffsetInInputWithInjections, deltaStartIndex);\n        let lineContent = tokens.getLineContent();\n        if (outputLineIndex > 0) {\n            lineContent = spaces(lineBreakData.wrappedTextIndentLength) + lineContent;\n        }\n        const minColumn = this._projectionData.getMinOutputOffset(outputLineIndex) + 1;\n        const maxColumn = lineContent.length + 1;\n        const continuesWithWrappedLine = (outputLineIndex + 1 < this.getViewLineCount());\n        const startVisibleColumn = (outputLineIndex === 0 ? 0 : lineBreakData.breakOffsetsVisibleColumn[outputLineIndex - 1]);\n        return new ViewLineData(lineContent, continuesWithWrappedLine, minColumn, maxColumn, startVisibleColumn, tokens, inlineDecorations);\n    }\n    getModelColumnOfViewPosition(outputLineIndex, outputColumn) {\n        this._assertVisible();\n        return this._projectionData.translateToInputOffset(outputLineIndex, outputColumn - 1) + 1;\n    }\n    getViewPositionOfModelPosition(deltaLineNumber, inputColumn, affinity = 2 /* PositionAffinity.None */) {\n        this._assertVisible();\n        const r = this._projectionData.translateToOutputPosition(inputColumn - 1, affinity);\n        return r.toPosition(deltaLineNumber);\n    }\n    getViewLineNumberOfModelPosition(deltaLineNumber, inputColumn) {\n        this._assertVisible();\n        const r = this._projectionData.translateToOutputPosition(inputColumn - 1);\n        return deltaLineNumber + r.outputLineIndex;\n    }\n    normalizePosition(outputLineIndex, outputPosition, affinity) {\n        const baseViewLineNumber = outputPosition.lineNumber - outputLineIndex;\n        const normalizedOutputPosition = this._projectionData.normalizeOutputPosition(outputLineIndex, outputPosition.column - 1, affinity);\n        const result = normalizedOutputPosition.toPosition(baseViewLineNumber);\n        return result;\n    }\n    getInjectedTextAt(outputLineIndex, outputColumn) {\n        return this._projectionData.getInjectedText(outputLineIndex, outputColumn - 1);\n    }\n    _assertVisible() {\n        if (!this._isVisible) {\n            throw new Error('Not supported');\n        }\n    }\n}\n/**\n * This projection does not change the model line.\n*/\nclass IdentityModelLineProjection {\n    static { this.INSTANCE = new IdentityModelLineProjection(); }\n    constructor() { }\n    isVisible() {\n        return true;\n    }\n    setVisible(isVisible) {\n        if (isVisible) {\n            return this;\n        }\n        return HiddenModelLineProjection.INSTANCE;\n    }\n    getProjectionData() {\n        return null;\n    }\n    getViewLineCount() {\n        return 1;\n    }\n    getViewLineContent(model, modelLineNumber, _outputLineIndex) {\n        return model.getLineContent(modelLineNumber);\n    }\n    getViewLineLength(model, modelLineNumber, _outputLineIndex) {\n        return model.getLineLength(modelLineNumber);\n    }\n    getViewLineMinColumn(model, modelLineNumber, _outputLineIndex) {\n        return model.getLineMinColumn(modelLineNumber);\n    }\n    getViewLineMaxColumn(model, modelLineNumber, _outputLineIndex) {\n        return model.getLineMaxColumn(modelLineNumber);\n    }\n    getViewLineData(model, modelLineNumber, _outputLineIndex) {\n        const lineTokens = model.tokenization.getLineTokens(modelLineNumber);\n        const lineContent = lineTokens.getLineContent();\n        return new ViewLineData(lineContent, false, 1, lineContent.length + 1, 0, lineTokens.inflate(), null);\n    }\n    getViewLinesData(model, modelLineNumber, _fromOuputLineIndex, _toOutputLineIndex, globalStartIndex, needed, result) {\n        if (!needed[globalStartIndex]) {\n            result[globalStartIndex] = null;\n            return;\n        }\n        result[globalStartIndex] = this.getViewLineData(model, modelLineNumber, 0);\n    }\n    getModelColumnOfViewPosition(_outputLineIndex, outputColumn) {\n        return outputColumn;\n    }\n    getViewPositionOfModelPosition(deltaLineNumber, inputColumn) {\n        return new Position(deltaLineNumber, inputColumn);\n    }\n    getViewLineNumberOfModelPosition(deltaLineNumber, _inputColumn) {\n        return deltaLineNumber;\n    }\n    normalizePosition(outputLineIndex, outputPosition, affinity) {\n        return outputPosition;\n    }\n    getInjectedTextAt(_outputLineIndex, _outputColumn) {\n        return null;\n    }\n}\n/**\n * This projection hides the model line.\n */\nclass HiddenModelLineProjection {\n    static { this.INSTANCE = new HiddenModelLineProjection(); }\n    constructor() { }\n    isVisible() {\n        return false;\n    }\n    setVisible(isVisible) {\n        if (!isVisible) {\n            return this;\n        }\n        return IdentityModelLineProjection.INSTANCE;\n    }\n    getProjectionData() {\n        return null;\n    }\n    getViewLineCount() {\n        return 0;\n    }\n    getViewLineContent(_model, _modelLineNumber, _outputLineIndex) {\n        throw new Error('Not supported');\n    }\n    getViewLineLength(_model, _modelLineNumber, _outputLineIndex) {\n        throw new Error('Not supported');\n    }\n    getViewLineMinColumn(_model, _modelLineNumber, _outputLineIndex) {\n        throw new Error('Not supported');\n    }\n    getViewLineMaxColumn(_model, _modelLineNumber, _outputLineIndex) {\n        throw new Error('Not supported');\n    }\n    getViewLineData(_model, _modelLineNumber, _outputLineIndex) {\n        throw new Error('Not supported');\n    }\n    getViewLinesData(_model, _modelLineNumber, _fromOuputLineIndex, _toOutputLineIndex, _globalStartIndex, _needed, _result) {\n        throw new Error('Not supported');\n    }\n    getModelColumnOfViewPosition(_outputLineIndex, _outputColumn) {\n        throw new Error('Not supported');\n    }\n    getViewPositionOfModelPosition(_deltaLineNumber, _inputColumn) {\n        throw new Error('Not supported');\n    }\n    getViewLineNumberOfModelPosition(_deltaLineNumber, _inputColumn) {\n        throw new Error('Not supported');\n    }\n    normalizePosition(outputLineIndex, outputPosition, affinity) {\n        throw new Error('Not supported');\n    }\n    getInjectedTextAt(_outputLineIndex, _outputColumn) {\n        throw new Error('Not supported');\n    }\n}\nconst _spaces = [''];\nfunction spaces(count) {\n    if (count >= _spaces.length) {\n        for (let i = 1; i <= count; i++) {\n            _spaces[i] = _makeSpaces(i);\n        }\n    }\n    return _spaces[count];\n}\nfunction _makeSpaces(count) {\n    return new Array(count + 1).join(' ');\n}\n\nexport { createModelLineProjection };\n","import { arrayInsert } from '../../../base/common/arrays.js';\nimport { toUint32 } from '../../../base/common/uint.js';\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 *--------------------------------------------------------------------------------------------*/\nclass PrefixSumComputer {\n    constructor(values) {\n        this.values = values;\n        this.prefixSum = new Uint32Array(values.length);\n        this.prefixSumValidIndex = new Int32Array(1);\n        this.prefixSumValidIndex[0] = -1;\n    }\n    insertValues(insertIndex, insertValues) {\n        insertIndex = toUint32(insertIndex);\n        const oldValues = this.values;\n        const oldPrefixSum = this.prefixSum;\n        const insertValuesLen = insertValues.length;\n        if (insertValuesLen === 0) {\n            return false;\n        }\n        this.values = new Uint32Array(oldValues.length + insertValuesLen);\n        this.values.set(oldValues.subarray(0, insertIndex), 0);\n        this.values.set(oldValues.subarray(insertIndex), insertIndex + insertValuesLen);\n        this.values.set(insertValues, insertIndex);\n        if (insertIndex - 1 < this.prefixSumValidIndex[0]) {\n            this.prefixSumValidIndex[0] = insertIndex - 1;\n        }\n        this.prefixSum = new Uint32Array(this.values.length);\n        if (this.prefixSumValidIndex[0] >= 0) {\n            this.prefixSum.set(oldPrefixSum.subarray(0, this.prefixSumValidIndex[0] + 1));\n        }\n        return true;\n    }\n    setValue(index, value) {\n        index = toUint32(index);\n        value = toUint32(value);\n        if (this.values[index] === value) {\n            return false;\n        }\n        this.values[index] = value;\n        if (index - 1 < this.prefixSumValidIndex[0]) {\n            this.prefixSumValidIndex[0] = index - 1;\n        }\n        return true;\n    }\n    removeValues(startIndex, count) {\n        startIndex = toUint32(startIndex);\n        count = toUint32(count);\n        const oldValues = this.values;\n        const oldPrefixSum = this.prefixSum;\n        if (startIndex >= oldValues.length) {\n            return false;\n        }\n        const maxCount = oldValues.length - startIndex;\n        if (count >= maxCount) {\n            count = maxCount;\n        }\n        if (count === 0) {\n            return false;\n        }\n        this.values = new Uint32Array(oldValues.length - count);\n        this.values.set(oldValues.subarray(0, startIndex), 0);\n        this.values.set(oldValues.subarray(startIndex + count), startIndex);\n        this.prefixSum = new Uint32Array(this.values.length);\n        if (startIndex - 1 < this.prefixSumValidIndex[0]) {\n            this.prefixSumValidIndex[0] = startIndex - 1;\n        }\n        if (this.prefixSumValidIndex[0] >= 0) {\n            this.prefixSum.set(oldPrefixSum.subarray(0, this.prefixSumValidIndex[0] + 1));\n        }\n        return true;\n    }\n    getTotalSum() {\n        if (this.values.length === 0) {\n            return 0;\n        }\n        return this._getPrefixSum(this.values.length - 1);\n    }\n    /**\n     * Returns the sum of the first `index + 1` many items.\n     * @returns `SUM(0 <= j <= index, values[j])`.\n     */\n    getPrefixSum(index) {\n        if (index < 0) {\n            return 0;\n        }\n        index = toUint32(index);\n        return this._getPrefixSum(index);\n    }\n    _getPrefixSum(index) {\n        if (index <= this.prefixSumValidIndex[0]) {\n            return this.prefixSum[index];\n        }\n        let startIndex = this.prefixSumValidIndex[0] + 1;\n        if (startIndex === 0) {\n            this.prefixSum[0] = this.values[0];\n            startIndex++;\n        }\n        if (index >= this.values.length) {\n            index = this.values.length - 1;\n        }\n        for (let i = startIndex; i <= index; i++) {\n            this.prefixSum[i] = this.prefixSum[i - 1] + this.values[i];\n        }\n        this.prefixSumValidIndex[0] = Math.max(this.prefixSumValidIndex[0], index);\n        return this.prefixSum[index];\n    }\n    getIndexOf(sum) {\n        sum = Math.floor(sum);\n        // Compute all sums (to get a fully valid prefixSum)\n        this.getTotalSum();\n        let low = 0;\n        let high = this.values.length - 1;\n        let mid = 0;\n        let midStop = 0;\n        let midStart = 0;\n        while (low <= high) {\n            mid = low + ((high - low) / 2) | 0;\n            midStop = this.prefixSum[mid];\n            midStart = midStop - this.values[mid];\n            if (sum < midStart) {\n                high = mid - 1;\n            }\n            else if (sum >= midStop) {\n                low = mid + 1;\n            }\n            else {\n                break;\n            }\n        }\n        return new PrefixSumIndexOfResult(mid, sum - midStart);\n    }\n}\n/**\n * {@link getIndexOf} has an amortized runtime complexity of O(1).\n *\n * ({@link PrefixSumComputer.getIndexOf} is just  O(log n))\n*/\nclass ConstantTimePrefixSumComputer {\n    constructor(values) {\n        this._values = values;\n        this._isValid = false;\n        this._validEndIndex = -1;\n        this._prefixSum = [];\n        this._indexBySum = [];\n    }\n    /**\n     * @returns SUM(0 <= j < values.length, values[j])\n     */\n    getTotalSum() {\n        this._ensureValid();\n        return this._indexBySum.length;\n    }\n    /**\n     * Returns the sum of the first `count` many items.\n     * @returns `SUM(0 <= j < count, values[j])`.\n     */\n    getPrefixSum(count) {\n        this._ensureValid();\n        if (count === 0) {\n            return 0;\n        }\n        return this._prefixSum[count - 1];\n    }\n    /**\n     * @returns `result`, such that `getPrefixSum(result.index) + result.remainder = sum`\n     */\n    getIndexOf(sum) {\n        this._ensureValid();\n        const idx = this._indexBySum[sum];\n        const viewLinesAbove = idx > 0 ? this._prefixSum[idx - 1] : 0;\n        return new PrefixSumIndexOfResult(idx, sum - viewLinesAbove);\n    }\n    removeValues(start, deleteCount) {\n        this._values.splice(start, deleteCount);\n        this._invalidate(start);\n    }\n    insertValues(insertIndex, insertArr) {\n        this._values = arrayInsert(this._values, insertIndex, insertArr);\n        this._invalidate(insertIndex);\n    }\n    _invalidate(index) {\n        this._isValid = false;\n        this._validEndIndex = Math.min(this._validEndIndex, index - 1);\n    }\n    _ensureValid() {\n        if (this._isValid) {\n            return;\n        }\n        for (let i = this._validEndIndex + 1, len = this._values.length; i < len; i++) {\n            const value = this._values[i];\n            const sumAbove = i > 0 ? this._prefixSum[i - 1] : 0;\n            this._prefixSum[i] = sumAbove + value;\n            for (let j = 0; j < value; j++) {\n                this._indexBySum[sumAbove + j] = i;\n            }\n        }\n        // trim things\n        this._prefixSum.length = this._values.length;\n        this._indexBySum.length = this._prefixSum[this._prefixSum.length - 1];\n        // mark as valid\n        this._isValid = true;\n        this._validEndIndex = this._values.length - 1;\n    }\n    setValue(index, value) {\n        if (this._values[index] === value) {\n            // no change\n            return;\n        }\n        this._values[index] = value;\n        this._invalidate(index);\n    }\n}\nclass PrefixSumIndexOfResult {\n    constructor(index, remainder) {\n        this.index = index;\n        this.remainder = remainder;\n        this._prefixSumIndexOfResultBrand = undefined;\n        this.index = index;\n        this.remainder = remainder;\n    }\n}\n\nexport { ConstantTimePrefixSumComputer, PrefixSumComputer, PrefixSumIndexOfResult };\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 *--------------------------------------------------------------------------------------------*/\nclass IdentityCoordinatesConverter {\n    constructor(model) {\n        this._model = model;\n    }\n    _validPosition(pos) {\n        return this._model.validatePosition(pos);\n    }\n    _validRange(range) {\n        return this._model.validateRange(range);\n    }\n    // View -> Model conversion and related methods\n    convertViewPositionToModelPosition(viewPosition) {\n        return this._validPosition(viewPosition);\n    }\n    convertViewRangeToModelRange(viewRange) {\n        return this._validRange(viewRange);\n    }\n    validateViewPosition(_viewPosition, expectedModelPosition) {\n        return this._validPosition(expectedModelPosition);\n    }\n    validateViewRange(_viewRange, expectedModelRange) {\n        return this._validRange(expectedModelRange);\n    }\n    // Model -> View conversion and related methods\n    convertModelPositionToViewPosition(modelPosition) {\n        return this._validPosition(modelPosition);\n    }\n    convertModelRangeToViewRange(modelRange) {\n        return this._validRange(modelRange);\n    }\n    modelPositionIsVisible(modelPosition) {\n        const lineCount = this._model.getLineCount();\n        if (modelPosition.lineNumber < 1 || modelPosition.lineNumber > lineCount) {\n            // invalid arguments\n            return false;\n        }\n        return true;\n    }\n    getModelLineViewLineCount(modelLineNumber) {\n        return 1;\n    }\n    getViewLineNumberOfModelPosition(modelLineNumber, modelColumn) {\n        return modelLineNumber;\n    }\n}\n\nexport { IdentityCoordinatesConverter };\n","import { ArrayQueue } from '../../../base/common/arrays.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { IndentGuide, IndentGuideHorizontalLine } from '../textModelGuides.js';\nimport { ModelDecorationOptions } from '../model/textModel.js';\nimport { LineInjectedText } from '../textModelEvents.js';\nimport { ViewLinesDeletedEvent, ViewLinesInsertedEvent, ViewLinesChangedEvent } from '../viewEvents.js';\nimport { createModelLineProjection } from './modelLineProjection.js';\nimport { ConstantTimePrefixSumComputer } from '../model/prefixSumComputer.js';\nimport { ViewLineData } from '../viewModel.js';\nimport { IdentityCoordinatesConverter } from '../coordinatesConverter.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ViewModelLinesFromProjectedModel {\n    constructor(editorId, model, domLineBreaksComputerFactory, monospaceLineBreaksComputerFactory, fontInfo, tabSize, wrappingStrategy, wrappingColumn, wrappingIndent, wordBreak, wrapOnEscapedLineFeeds) {\n        this._editorId = editorId;\n        this.model = model;\n        this._validModelVersionId = -1;\n        this._domLineBreaksComputerFactory = domLineBreaksComputerFactory;\n        this._monospaceLineBreaksComputerFactory = monospaceLineBreaksComputerFactory;\n        this.fontInfo = fontInfo;\n        this.tabSize = tabSize;\n        this.wrappingStrategy = wrappingStrategy;\n        this.wrappingColumn = wrappingColumn;\n        this.wrappingIndent = wrappingIndent;\n        this.wordBreak = wordBreak;\n        this.wrapOnEscapedLineFeeds = wrapOnEscapedLineFeeds;\n        this._constructLines(/*resetHiddenAreas*/ true, null);\n    }\n    dispose() {\n        this.hiddenAreasDecorationIds = this.model.deltaDecorations(this.hiddenAreasDecorationIds, []);\n    }\n    createCoordinatesConverter() {\n        return new CoordinatesConverter(this);\n    }\n    _constructLines(resetHiddenAreas, previousLineBreaks) {\n        this.modelLineProjections = [];\n        if (resetHiddenAreas) {\n            this.hiddenAreasDecorationIds = this.model.deltaDecorations(this.hiddenAreasDecorationIds, []);\n        }\n        const linesContent = this.model.getLinesContent();\n        const injectedTextDecorations = this.model.getInjectedTextDecorations(this._editorId);\n        const lineCount = linesContent.length;\n        const lineBreaksComputer = this.createLineBreaksComputer();\n        const injectedTextQueue = new ArrayQueue(LineInjectedText.fromDecorations(injectedTextDecorations));\n        for (let i = 0; i < lineCount; i++) {\n            const lineInjectedText = injectedTextQueue.takeWhile(t => t.lineNumber === i + 1);\n            lineBreaksComputer.addRequest(linesContent[i], lineInjectedText, previousLineBreaks ? previousLineBreaks[i] : null);\n        }\n        const linesBreaks = lineBreaksComputer.finalize();\n        const values = [];\n        const hiddenAreas = this.hiddenAreasDecorationIds.map((areaId) => this.model.getDecorationRange(areaId)).sort(Range.compareRangesUsingStarts);\n        let hiddenAreaStart = 1, hiddenAreaEnd = 0;\n        let hiddenAreaIdx = -1;\n        let nextLineNumberToUpdateHiddenArea = (hiddenAreaIdx + 1 < hiddenAreas.length) ? hiddenAreaEnd + 1 : lineCount + 2;\n        for (let i = 0; i < lineCount; i++) {\n            const lineNumber = i + 1;\n            if (lineNumber === nextLineNumberToUpdateHiddenArea) {\n                hiddenAreaIdx++;\n                hiddenAreaStart = hiddenAreas[hiddenAreaIdx].startLineNumber;\n                hiddenAreaEnd = hiddenAreas[hiddenAreaIdx].endLineNumber;\n                nextLineNumberToUpdateHiddenArea = (hiddenAreaIdx + 1 < hiddenAreas.length) ? hiddenAreaEnd + 1 : lineCount + 2;\n            }\n            const isInHiddenArea = (lineNumber >= hiddenAreaStart && lineNumber <= hiddenAreaEnd);\n            const line = createModelLineProjection(linesBreaks[i], !isInHiddenArea);\n            values[i] = line.getViewLineCount();\n            this.modelLineProjections[i] = line;\n        }\n        this._validModelVersionId = this.model.getVersionId();\n        this.projectedModelLineLineCounts = new ConstantTimePrefixSumComputer(values);\n    }\n    getHiddenAreas() {\n        return this.hiddenAreasDecorationIds.map((decId) => this.model.getDecorationRange(decId));\n    }\n    setHiddenAreas(_ranges) {\n        const validatedRanges = _ranges.map(r => this.model.validateRange(r));\n        const newRanges = normalizeLineRanges(validatedRanges);\n        // TODO@Martin: Please stop calling this method on each model change!\n        // This checks if there really was a change\n        const oldRanges = this.hiddenAreasDecorationIds.map((areaId) => this.model.getDecorationRange(areaId)).sort(Range.compareRangesUsingStarts);\n        if (newRanges.length === oldRanges.length) {\n            let hasDifference = false;\n            for (let i = 0; i < newRanges.length; i++) {\n                if (!newRanges[i].equalsRange(oldRanges[i])) {\n                    hasDifference = true;\n                    break;\n                }\n            }\n            if (!hasDifference) {\n                return false;\n            }\n        }\n        const newDecorations = newRanges.map((r) => ({\n            range: r,\n            options: ModelDecorationOptions.EMPTY,\n        }));\n        this.hiddenAreasDecorationIds = this.model.deltaDecorations(this.hiddenAreasDecorationIds, newDecorations);\n        const hiddenAreas = newRanges;\n        let hiddenAreaStart = 1, hiddenAreaEnd = 0;\n        let hiddenAreaIdx = -1;\n        let nextLineNumberToUpdateHiddenArea = (hiddenAreaIdx + 1 < hiddenAreas.length) ? hiddenAreaEnd + 1 : this.modelLineProjections.length + 2;\n        let hasVisibleLine = false;\n        for (let i = 0; i < this.modelLineProjections.length; i++) {\n            const lineNumber = i + 1;\n            if (lineNumber === nextLineNumberToUpdateHiddenArea) {\n                hiddenAreaIdx++;\n                hiddenAreaStart = hiddenAreas[hiddenAreaIdx].startLineNumber;\n                hiddenAreaEnd = hiddenAreas[hiddenAreaIdx].endLineNumber;\n                nextLineNumberToUpdateHiddenArea = (hiddenAreaIdx + 1 < hiddenAreas.length) ? hiddenAreaEnd + 1 : this.modelLineProjections.length + 2;\n            }\n            let lineChanged = false;\n            if (lineNumber >= hiddenAreaStart && lineNumber <= hiddenAreaEnd) {\n                // Line should be hidden\n                if (this.modelLineProjections[i].isVisible()) {\n                    this.modelLineProjections[i] = this.modelLineProjections[i].setVisible(false);\n                    lineChanged = true;\n                }\n            }\n            else {\n                hasVisibleLine = true;\n                // Line should be visible\n                if (!this.modelLineProjections[i].isVisible()) {\n                    this.modelLineProjections[i] = this.modelLineProjections[i].setVisible(true);\n                    lineChanged = true;\n                }\n            }\n            if (lineChanged) {\n                const newOutputLineCount = this.modelLineProjections[i].getViewLineCount();\n                this.projectedModelLineLineCounts.setValue(i, newOutputLineCount);\n            }\n        }\n        if (!hasVisibleLine) {\n            // Cannot have everything be hidden => reveal everything!\n            this.setHiddenAreas([]);\n        }\n        return true;\n    }\n    modelPositionIsVisible(modelLineNumber, _modelColumn) {\n        if (modelLineNumber < 1 || modelLineNumber > this.modelLineProjections.length) {\n            // invalid arguments\n            return false;\n        }\n        return this.modelLineProjections[modelLineNumber - 1].isVisible();\n    }\n    getModelLineViewLineCount(modelLineNumber) {\n        if (modelLineNumber < 1 || modelLineNumber > this.modelLineProjections.length) {\n            // invalid arguments\n            return 1;\n        }\n        return this.modelLineProjections[modelLineNumber - 1].getViewLineCount();\n    }\n    setTabSize(newTabSize) {\n        if (this.tabSize === newTabSize) {\n            return false;\n        }\n        this.tabSize = newTabSize;\n        this._constructLines(/*resetHiddenAreas*/ false, null);\n        return true;\n    }\n    setWrappingSettings(fontInfo, wrappingStrategy, wrappingColumn, wrappingIndent, wordBreak) {\n        const equalFontInfo = this.fontInfo.equals(fontInfo);\n        const equalWrappingStrategy = (this.wrappingStrategy === wrappingStrategy);\n        const equalWrappingColumn = (this.wrappingColumn === wrappingColumn);\n        const equalWrappingIndent = (this.wrappingIndent === wrappingIndent);\n        const equalWordBreak = (this.wordBreak === wordBreak);\n        if (equalFontInfo && equalWrappingStrategy && equalWrappingColumn && equalWrappingIndent && equalWordBreak) {\n            return false;\n        }\n        const onlyWrappingColumnChanged = (equalFontInfo && equalWrappingStrategy && !equalWrappingColumn && equalWrappingIndent && equalWordBreak);\n        this.fontInfo = fontInfo;\n        this.wrappingStrategy = wrappingStrategy;\n        this.wrappingColumn = wrappingColumn;\n        this.wrappingIndent = wrappingIndent;\n        this.wordBreak = wordBreak;\n        let previousLineBreaks = null;\n        if (onlyWrappingColumnChanged) {\n            previousLineBreaks = [];\n            for (let i = 0, len = this.modelLineProjections.length; i < len; i++) {\n                previousLineBreaks[i] = this.modelLineProjections[i].getProjectionData();\n            }\n        }\n        this._constructLines(/*resetHiddenAreas*/ false, previousLineBreaks);\n        return true;\n    }\n    createLineBreaksComputer() {\n        const lineBreaksComputerFactory = (this.wrappingStrategy === 'advanced'\n            ? this._domLineBreaksComputerFactory\n            : this._monospaceLineBreaksComputerFactory);\n        return lineBreaksComputerFactory.createLineBreaksComputer(this.fontInfo, this.tabSize, this.wrappingColumn, this.wrappingIndent, this.wordBreak, this.wrapOnEscapedLineFeeds);\n    }\n    onModelFlushed() {\n        this._constructLines(/*resetHiddenAreas*/ true, null);\n    }\n    onModelLinesDeleted(versionId, fromLineNumber, toLineNumber) {\n        if (!versionId || versionId <= this._validModelVersionId) {\n            // Here we check for versionId in case the lines were reconstructed in the meantime.\n            // We don't want to apply stale change events on top of a newer read model state.\n            return null;\n        }\n        const outputFromLineNumber = (fromLineNumber === 1 ? 1 : this.projectedModelLineLineCounts.getPrefixSum(fromLineNumber - 1) + 1);\n        const outputToLineNumber = this.projectedModelLineLineCounts.getPrefixSum(toLineNumber);\n        this.modelLineProjections.splice(fromLineNumber - 1, toLineNumber - fromLineNumber + 1);\n        this.projectedModelLineLineCounts.removeValues(fromLineNumber - 1, toLineNumber - fromLineNumber + 1);\n        return new ViewLinesDeletedEvent(outputFromLineNumber, outputToLineNumber);\n    }\n    onModelLinesInserted(versionId, fromLineNumber, _toLineNumber, lineBreaks) {\n        if (!versionId || versionId <= this._validModelVersionId) {\n            // Here we check for versionId in case the lines were reconstructed in the meantime.\n            // We don't want to apply stale change events on top of a newer read model state.\n            return null;\n        }\n        // cannot use this.getHiddenAreas() because those decorations have already seen the effect of this model change\n        const isInHiddenArea = (fromLineNumber > 2 && !this.modelLineProjections[fromLineNumber - 2].isVisible());\n        const outputFromLineNumber = (fromLineNumber === 1 ? 1 : this.projectedModelLineLineCounts.getPrefixSum(fromLineNumber - 1) + 1);\n        let totalOutputLineCount = 0;\n        const insertLines = [];\n        const insertPrefixSumValues = [];\n        for (let i = 0, len = lineBreaks.length; i < len; i++) {\n            const line = createModelLineProjection(lineBreaks[i], !isInHiddenArea);\n            insertLines.push(line);\n            const outputLineCount = line.getViewLineCount();\n            totalOutputLineCount += outputLineCount;\n            insertPrefixSumValues[i] = outputLineCount;\n        }\n        // TODO@Alex: use arrays.arrayInsert\n        this.modelLineProjections =\n            this.modelLineProjections.slice(0, fromLineNumber - 1)\n                .concat(insertLines)\n                .concat(this.modelLineProjections.slice(fromLineNumber - 1));\n        this.projectedModelLineLineCounts.insertValues(fromLineNumber - 1, insertPrefixSumValues);\n        return new ViewLinesInsertedEvent(outputFromLineNumber, outputFromLineNumber + totalOutputLineCount - 1);\n    }\n    onModelLineChanged(versionId, lineNumber, lineBreakData) {\n        if (versionId !== null && versionId <= this._validModelVersionId) {\n            // Here we check for versionId in case the lines were reconstructed in the meantime.\n            // We don't want to apply stale change events on top of a newer read model state.\n            return [false, null, null, null];\n        }\n        const lineIndex = lineNumber - 1;\n        const oldOutputLineCount = this.modelLineProjections[lineIndex].getViewLineCount();\n        const isVisible = this.modelLineProjections[lineIndex].isVisible();\n        const line = createModelLineProjection(lineBreakData, isVisible);\n        this.modelLineProjections[lineIndex] = line;\n        const newOutputLineCount = this.modelLineProjections[lineIndex].getViewLineCount();\n        let lineMappingChanged = false;\n        let changeFrom = 0;\n        let changeTo = -1;\n        let insertFrom = 0;\n        let insertTo = -1;\n        let deleteFrom = 0;\n        let deleteTo = -1;\n        if (oldOutputLineCount > newOutputLineCount) {\n            changeFrom = this.projectedModelLineLineCounts.getPrefixSum(lineNumber - 1) + 1;\n            changeTo = changeFrom + newOutputLineCount - 1;\n            deleteFrom = changeTo + 1;\n            deleteTo = deleteFrom + (oldOutputLineCount - newOutputLineCount) - 1;\n            lineMappingChanged = true;\n        }\n        else if (oldOutputLineCount < newOutputLineCount) {\n            changeFrom = this.projectedModelLineLineCounts.getPrefixSum(lineNumber - 1) + 1;\n            changeTo = changeFrom + oldOutputLineCount - 1;\n            insertFrom = changeTo + 1;\n            insertTo = insertFrom + (newOutputLineCount - oldOutputLineCount) - 1;\n            lineMappingChanged = true;\n        }\n        else {\n            changeFrom = this.projectedModelLineLineCounts.getPrefixSum(lineNumber - 1) + 1;\n            changeTo = changeFrom + newOutputLineCount - 1;\n        }\n        this.projectedModelLineLineCounts.setValue(lineIndex, newOutputLineCount);\n        const viewLinesChangedEvent = (changeFrom <= changeTo ? new ViewLinesChangedEvent(changeFrom, changeTo - changeFrom + 1) : null);\n        const viewLinesInsertedEvent = (insertFrom <= insertTo ? new ViewLinesInsertedEvent(insertFrom, insertTo) : null);\n        const viewLinesDeletedEvent = (deleteFrom <= deleteTo ? new ViewLinesDeletedEvent(deleteFrom, deleteTo) : null);\n        return [lineMappingChanged, viewLinesChangedEvent, viewLinesInsertedEvent, viewLinesDeletedEvent];\n    }\n    acceptVersionId(versionId) {\n        this._validModelVersionId = versionId;\n        if (this.modelLineProjections.length === 1 && !this.modelLineProjections[0].isVisible()) {\n            // At least one line must be visible => reset hidden areas\n            this.setHiddenAreas([]);\n        }\n    }\n    getViewLineCount() {\n        return this.projectedModelLineLineCounts.getTotalSum();\n    }\n    _toValidViewLineNumber(viewLineNumber) {\n        if (viewLineNumber < 1) {\n            return 1;\n        }\n        const viewLineCount = this.getViewLineCount();\n        if (viewLineNumber > viewLineCount) {\n            return viewLineCount;\n        }\n        return viewLineNumber | 0;\n    }\n    getActiveIndentGuide(viewLineNumber, minLineNumber, maxLineNumber) {\n        viewLineNumber = this._toValidViewLineNumber(viewLineNumber);\n        minLineNumber = this._toValidViewLineNumber(minLineNumber);\n        maxLineNumber = this._toValidViewLineNumber(maxLineNumber);\n        const modelPosition = this.convertViewPositionToModelPosition(viewLineNumber, this.getViewLineMinColumn(viewLineNumber));\n        const modelMinPosition = this.convertViewPositionToModelPosition(minLineNumber, this.getViewLineMinColumn(minLineNumber));\n        const modelMaxPosition = this.convertViewPositionToModelPosition(maxLineNumber, this.getViewLineMinColumn(maxLineNumber));\n        const result = this.model.guides.getActiveIndentGuide(modelPosition.lineNumber, modelMinPosition.lineNumber, modelMaxPosition.lineNumber);\n        const viewStartPosition = this.convertModelPositionToViewPosition(result.startLineNumber, 1);\n        const viewEndPosition = this.convertModelPositionToViewPosition(result.endLineNumber, this.model.getLineMaxColumn(result.endLineNumber));\n        return {\n            startLineNumber: viewStartPosition.lineNumber,\n            endLineNumber: viewEndPosition.lineNumber,\n            indent: result.indent\n        };\n    }\n    // #region ViewLineInfo\n    getViewLineInfo(viewLineNumber) {\n        viewLineNumber = this._toValidViewLineNumber(viewLineNumber);\n        const r = this.projectedModelLineLineCounts.getIndexOf(viewLineNumber - 1);\n        const lineIndex = r.index;\n        const remainder = r.remainder;\n        return new ViewLineInfo(lineIndex + 1, remainder);\n    }\n    getMinColumnOfViewLine(viewLineInfo) {\n        return this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewLineMinColumn(this.model, viewLineInfo.modelLineNumber, viewLineInfo.modelLineWrappedLineIdx);\n    }\n    getMaxColumnOfViewLine(viewLineInfo) {\n        return this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewLineMaxColumn(this.model, viewLineInfo.modelLineNumber, viewLineInfo.modelLineWrappedLineIdx);\n    }\n    getModelStartPositionOfViewLine(viewLineInfo) {\n        const line = this.modelLineProjections[viewLineInfo.modelLineNumber - 1];\n        const minViewColumn = line.getViewLineMinColumn(this.model, viewLineInfo.modelLineNumber, viewLineInfo.modelLineWrappedLineIdx);\n        const column = line.getModelColumnOfViewPosition(viewLineInfo.modelLineWrappedLineIdx, minViewColumn);\n        return new Position(viewLineInfo.modelLineNumber, column);\n    }\n    getModelEndPositionOfViewLine(viewLineInfo) {\n        const line = this.modelLineProjections[viewLineInfo.modelLineNumber - 1];\n        const maxViewColumn = line.getViewLineMaxColumn(this.model, viewLineInfo.modelLineNumber, viewLineInfo.modelLineWrappedLineIdx);\n        const column = line.getModelColumnOfViewPosition(viewLineInfo.modelLineWrappedLineIdx, maxViewColumn);\n        return new Position(viewLineInfo.modelLineNumber, column);\n    }\n    getViewLineInfosGroupedByModelRanges(viewStartLineNumber, viewEndLineNumber) {\n        const startViewLine = this.getViewLineInfo(viewStartLineNumber);\n        const endViewLine = this.getViewLineInfo(viewEndLineNumber);\n        const result = new Array();\n        let lastVisibleModelPos = this.getModelStartPositionOfViewLine(startViewLine);\n        let viewLines = new Array();\n        for (let curModelLine = startViewLine.modelLineNumber; curModelLine <= endViewLine.modelLineNumber; curModelLine++) {\n            const line = this.modelLineProjections[curModelLine - 1];\n            if (line.isVisible()) {\n                const startOffset = curModelLine === startViewLine.modelLineNumber\n                    ? startViewLine.modelLineWrappedLineIdx\n                    : 0;\n                const endOffset = curModelLine === endViewLine.modelLineNumber\n                    ? endViewLine.modelLineWrappedLineIdx + 1\n                    : line.getViewLineCount();\n                for (let i = startOffset; i < endOffset; i++) {\n                    viewLines.push(new ViewLineInfo(curModelLine, i));\n                }\n            }\n            if (!line.isVisible() && lastVisibleModelPos) {\n                const lastVisibleModelPos2 = new Position(curModelLine - 1, this.model.getLineMaxColumn(curModelLine - 1) + 1);\n                const modelRange = Range.fromPositions(lastVisibleModelPos, lastVisibleModelPos2);\n                result.push(new ViewLineInfoGroupedByModelRange(modelRange, viewLines));\n                viewLines = [];\n                lastVisibleModelPos = null;\n            }\n            else if (line.isVisible() && !lastVisibleModelPos) {\n                lastVisibleModelPos = new Position(curModelLine, 1);\n            }\n        }\n        if (lastVisibleModelPos) {\n            const modelRange = Range.fromPositions(lastVisibleModelPos, this.getModelEndPositionOfViewLine(endViewLine));\n            result.push(new ViewLineInfoGroupedByModelRange(modelRange, viewLines));\n        }\n        return result;\n    }\n    // #endregion\n    getViewLinesBracketGuides(viewStartLineNumber, viewEndLineNumber, activeViewPosition, options) {\n        const modelActivePosition = activeViewPosition ? this.convertViewPositionToModelPosition(activeViewPosition.lineNumber, activeViewPosition.column) : null;\n        const resultPerViewLine = [];\n        for (const group of this.getViewLineInfosGroupedByModelRanges(viewStartLineNumber, viewEndLineNumber)) {\n            const modelRangeStartLineNumber = group.modelRange.startLineNumber;\n            const bracketGuidesPerModelLine = this.model.guides.getLinesBracketGuides(modelRangeStartLineNumber, group.modelRange.endLineNumber, modelActivePosition, options);\n            for (const viewLineInfo of group.viewLines) {\n                const bracketGuides = bracketGuidesPerModelLine[viewLineInfo.modelLineNumber - modelRangeStartLineNumber];\n                // visibleColumns stay as they are (this is a bug and needs to be fixed, but it is not a regression)\n                // model-columns must be converted to view-model columns.\n                const result = bracketGuides.map(g => {\n                    if (g.forWrappedLinesAfterColumn !== -1) {\n                        const p = this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.forWrappedLinesAfterColumn);\n                        if (p.lineNumber >= viewLineInfo.modelLineWrappedLineIdx) {\n                            return undefined;\n                        }\n                    }\n                    if (g.forWrappedLinesBeforeOrAtColumn !== -1) {\n                        const p = this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.forWrappedLinesBeforeOrAtColumn);\n                        if (p.lineNumber < viewLineInfo.modelLineWrappedLineIdx) {\n                            return undefined;\n                        }\n                    }\n                    if (!g.horizontalLine) {\n                        return g;\n                    }\n                    let column = -1;\n                    if (g.column !== -1) {\n                        const p = this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.column);\n                        if (p.lineNumber === viewLineInfo.modelLineWrappedLineIdx) {\n                            column = p.column;\n                        }\n                        else if (p.lineNumber < viewLineInfo.modelLineWrappedLineIdx) {\n                            column = this.getMinColumnOfViewLine(viewLineInfo);\n                        }\n                        else if (p.lineNumber > viewLineInfo.modelLineWrappedLineIdx) {\n                            return undefined;\n                        }\n                    }\n                    const viewPosition = this.convertModelPositionToViewPosition(viewLineInfo.modelLineNumber, g.horizontalLine.endColumn);\n                    const p = this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.horizontalLine.endColumn);\n                    if (p.lineNumber === viewLineInfo.modelLineWrappedLineIdx) {\n                        return new IndentGuide(g.visibleColumn, column, g.className, new IndentGuideHorizontalLine(g.horizontalLine.top, viewPosition.column), -1, -1);\n                    }\n                    else if (p.lineNumber < viewLineInfo.modelLineWrappedLineIdx) {\n                        return undefined;\n                    }\n                    else {\n                        if (g.visibleColumn !== -1) {\n                            // Don't repeat horizontal lines that use visibleColumn for unrelated lines.\n                            return undefined;\n                        }\n                        return new IndentGuide(g.visibleColumn, column, g.className, new IndentGuideHorizontalLine(g.horizontalLine.top, this.getMaxColumnOfViewLine(viewLineInfo)), -1, -1);\n                    }\n                });\n                resultPerViewLine.push(result.filter((r) => !!r));\n            }\n        }\n        return resultPerViewLine;\n    }\n    getViewLinesIndentGuides(viewStartLineNumber, viewEndLineNumber) {\n        // TODO: Use the same code as in `getViewLinesBracketGuides`.\n        // Future TODO: Merge with `getViewLinesBracketGuides`.\n        // However, this requires more refactoring of indent guides.\n        viewStartLineNumber = this._toValidViewLineNumber(viewStartLineNumber);\n        viewEndLineNumber = this._toValidViewLineNumber(viewEndLineNumber);\n        const modelStart = this.convertViewPositionToModelPosition(viewStartLineNumber, this.getViewLineMinColumn(viewStartLineNumber));\n        const modelEnd = this.convertViewPositionToModelPosition(viewEndLineNumber, this.getViewLineMaxColumn(viewEndLineNumber));\n        let result = [];\n        const resultRepeatCount = [];\n        const resultRepeatOption = [];\n        const modelStartLineIndex = modelStart.lineNumber - 1;\n        const modelEndLineIndex = modelEnd.lineNumber - 1;\n        let reqStart = null;\n        for (let modelLineIndex = modelStartLineIndex; modelLineIndex <= modelEndLineIndex; modelLineIndex++) {\n            const line = this.modelLineProjections[modelLineIndex];\n            if (line.isVisible()) {\n                const viewLineStartIndex = line.getViewLineNumberOfModelPosition(0, modelLineIndex === modelStartLineIndex ? modelStart.column : 1);\n                const viewLineEndIndex = line.getViewLineNumberOfModelPosition(0, this.model.getLineMaxColumn(modelLineIndex + 1));\n                const count = viewLineEndIndex - viewLineStartIndex + 1;\n                let option = 0 /* IndentGuideRepeatOption.BlockNone */;\n                if (count > 1 && line.getViewLineMinColumn(this.model, modelLineIndex + 1, viewLineEndIndex) === 1) {\n                    // wrapped lines should block indent guides\n                    option = (viewLineStartIndex === 0 ? 1 /* IndentGuideRepeatOption.BlockSubsequent */ : 2 /* IndentGuideRepeatOption.BlockAll */);\n                }\n                resultRepeatCount.push(count);\n                resultRepeatOption.push(option);\n                // merge into previous request\n                if (reqStart === null) {\n                    reqStart = new Position(modelLineIndex + 1, 0);\n                }\n            }\n            else {\n                // hit invisible line => flush request\n                if (reqStart !== null) {\n                    result = result.concat(this.model.guides.getLinesIndentGuides(reqStart.lineNumber, modelLineIndex));\n                    reqStart = null;\n                }\n            }\n        }\n        if (reqStart !== null) {\n            result = result.concat(this.model.guides.getLinesIndentGuides(reqStart.lineNumber, modelEnd.lineNumber));\n            reqStart = null;\n        }\n        const viewLineCount = viewEndLineNumber - viewStartLineNumber + 1;\n        const viewIndents = new Array(viewLineCount);\n        let currIndex = 0;\n        for (let i = 0, len = result.length; i < len; i++) {\n            let value = result[i];\n            const count = Math.min(viewLineCount - currIndex, resultRepeatCount[i]);\n            const option = resultRepeatOption[i];\n            let blockAtIndex;\n            if (option === 2 /* IndentGuideRepeatOption.BlockAll */) {\n                blockAtIndex = 0;\n            }\n            else if (option === 1 /* IndentGuideRepeatOption.BlockSubsequent */) {\n                blockAtIndex = 1;\n            }\n            else {\n                blockAtIndex = count;\n            }\n            for (let j = 0; j < count; j++) {\n                if (j === blockAtIndex) {\n                    value = 0;\n                }\n                viewIndents[currIndex++] = value;\n            }\n        }\n        return viewIndents;\n    }\n    getViewLineContent(viewLineNumber) {\n        const info = this.getViewLineInfo(viewLineNumber);\n        return this.modelLineProjections[info.modelLineNumber - 1].getViewLineContent(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx);\n    }\n    getViewLineLength(viewLineNumber) {\n        const info = this.getViewLineInfo(viewLineNumber);\n        return this.modelLineProjections[info.modelLineNumber - 1].getViewLineLength(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx);\n    }\n    getViewLineMinColumn(viewLineNumber) {\n        const info = this.getViewLineInfo(viewLineNumber);\n        return this.modelLineProjections[info.modelLineNumber - 1].getViewLineMinColumn(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx);\n    }\n    getViewLineMaxColumn(viewLineNumber) {\n        const info = this.getViewLineInfo(viewLineNumber);\n        return this.modelLineProjections[info.modelLineNumber - 1].getViewLineMaxColumn(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx);\n    }\n    getViewLineData(viewLineNumber) {\n        const info = this.getViewLineInfo(viewLineNumber);\n        return this.modelLineProjections[info.modelLineNumber - 1].getViewLineData(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx);\n    }\n    getViewLinesData(viewStartLineNumber, viewEndLineNumber, needed) {\n        viewStartLineNumber = this._toValidViewLineNumber(viewStartLineNumber);\n        viewEndLineNumber = this._toValidViewLineNumber(viewEndLineNumber);\n        const start = this.projectedModelLineLineCounts.getIndexOf(viewStartLineNumber - 1);\n        let viewLineNumber = viewStartLineNumber;\n        const startModelLineIndex = start.index;\n        const startRemainder = start.remainder;\n        const result = [];\n        for (let modelLineIndex = startModelLineIndex, len = this.model.getLineCount(); modelLineIndex < len; modelLineIndex++) {\n            const line = this.modelLineProjections[modelLineIndex];\n            if (!line.isVisible()) {\n                continue;\n            }\n            const fromViewLineIndex = (modelLineIndex === startModelLineIndex ? startRemainder : 0);\n            let remainingViewLineCount = line.getViewLineCount() - fromViewLineIndex;\n            let lastLine = false;\n            if (viewLineNumber + remainingViewLineCount > viewEndLineNumber) {\n                lastLine = true;\n                remainingViewLineCount = viewEndLineNumber - viewLineNumber + 1;\n            }\n            line.getViewLinesData(this.model, modelLineIndex + 1, fromViewLineIndex, remainingViewLineCount, viewLineNumber - viewStartLineNumber, needed, result);\n            viewLineNumber += remainingViewLineCount;\n            if (lastLine) {\n                break;\n            }\n        }\n        return result;\n    }\n    validateViewPosition(viewLineNumber, viewColumn, expectedModelPosition) {\n        viewLineNumber = this._toValidViewLineNumber(viewLineNumber);\n        const r = this.projectedModelLineLineCounts.getIndexOf(viewLineNumber - 1);\n        const lineIndex = r.index;\n        const remainder = r.remainder;\n        const line = this.modelLineProjections[lineIndex];\n        const minColumn = line.getViewLineMinColumn(this.model, lineIndex + 1, remainder);\n        const maxColumn = line.getViewLineMaxColumn(this.model, lineIndex + 1, remainder);\n        if (viewColumn < minColumn) {\n            viewColumn = minColumn;\n        }\n        if (viewColumn > maxColumn) {\n            viewColumn = maxColumn;\n        }\n        const computedModelColumn = line.getModelColumnOfViewPosition(remainder, viewColumn);\n        const computedModelPosition = this.model.validatePosition(new Position(lineIndex + 1, computedModelColumn));\n        if (computedModelPosition.equals(expectedModelPosition)) {\n            return new Position(viewLineNumber, viewColumn);\n        }\n        return this.convertModelPositionToViewPosition(expectedModelPosition.lineNumber, expectedModelPosition.column);\n    }\n    validateViewRange(viewRange, expectedModelRange) {\n        const validViewStart = this.validateViewPosition(viewRange.startLineNumber, viewRange.startColumn, expectedModelRange.getStartPosition());\n        const validViewEnd = this.validateViewPosition(viewRange.endLineNumber, viewRange.endColumn, expectedModelRange.getEndPosition());\n        return new Range(validViewStart.lineNumber, validViewStart.column, validViewEnd.lineNumber, validViewEnd.column);\n    }\n    convertViewPositionToModelPosition(viewLineNumber, viewColumn) {\n        const info = this.getViewLineInfo(viewLineNumber);\n        const inputColumn = this.modelLineProjections[info.modelLineNumber - 1].getModelColumnOfViewPosition(info.modelLineWrappedLineIdx, viewColumn);\n        // console.log('out -> in ' + viewLineNumber + ',' + viewColumn + ' ===> ' + (lineIndex+1) + ',' + inputColumn);\n        return this.model.validatePosition(new Position(info.modelLineNumber, inputColumn));\n    }\n    convertViewRangeToModelRange(viewRange) {\n        const start = this.convertViewPositionToModelPosition(viewRange.startLineNumber, viewRange.startColumn);\n        const end = this.convertViewPositionToModelPosition(viewRange.endLineNumber, viewRange.endColumn);\n        return new Range(start.lineNumber, start.column, end.lineNumber, end.column);\n    }\n    convertModelPositionToViewPosition(_modelLineNumber, _modelColumn, affinity = 2 /* PositionAffinity.None */, allowZeroLineNumber = false, belowHiddenRanges = false) {\n        const validPosition = this.model.validatePosition(new Position(_modelLineNumber, _modelColumn));\n        const inputLineNumber = validPosition.lineNumber;\n        const inputColumn = validPosition.column;\n        let lineIndex = inputLineNumber - 1, lineIndexChanged = false;\n        if (belowHiddenRanges) {\n            while (lineIndex < this.modelLineProjections.length && !this.modelLineProjections[lineIndex].isVisible()) {\n                lineIndex++;\n                lineIndexChanged = true;\n            }\n        }\n        else {\n            while (lineIndex > 0 && !this.modelLineProjections[lineIndex].isVisible()) {\n                lineIndex--;\n                lineIndexChanged = true;\n            }\n        }\n        if (lineIndex === 0 && !this.modelLineProjections[lineIndex].isVisible()) {\n            // Could not reach a real line\n            // console.log('in -> out ' + inputLineNumber + ',' + inputColumn + ' ===> ' + 1 + ',' + 1);\n            // TODO@alexdima@hediet this isn't soo pretty\n            return new Position(allowZeroLineNumber ? 0 : 1, 1);\n        }\n        const deltaLineNumber = 1 + this.projectedModelLineLineCounts.getPrefixSum(lineIndex);\n        let r;\n        if (lineIndexChanged) {\n            if (belowHiddenRanges) {\n                r = this.modelLineProjections[lineIndex].getViewPositionOfModelPosition(deltaLineNumber, 1, affinity);\n            }\n            else {\n                r = this.modelLineProjections[lineIndex].getViewPositionOfModelPosition(deltaLineNumber, this.model.getLineMaxColumn(lineIndex + 1), affinity);\n            }\n        }\n        else {\n            r = this.modelLineProjections[inputLineNumber - 1].getViewPositionOfModelPosition(deltaLineNumber, inputColumn, affinity);\n        }\n        // console.log('in -> out ' + inputLineNumber + ',' + inputColumn + ' ===> ' + r.lineNumber + ',' + r);\n        return r;\n    }\n    /**\n     * @param affinity The affinity in case of an empty range. Has no effect for non-empty ranges.\n    */\n    convertModelRangeToViewRange(modelRange, affinity = 0 /* PositionAffinity.Left */) {\n        if (modelRange.isEmpty()) {\n            const start = this.convertModelPositionToViewPosition(modelRange.startLineNumber, modelRange.startColumn, affinity);\n            return Range.fromPositions(start);\n        }\n        else {\n            const start = this.convertModelPositionToViewPosition(modelRange.startLineNumber, modelRange.startColumn, 1 /* PositionAffinity.Right */);\n            const end = this.convertModelPositionToViewPosition(modelRange.endLineNumber, modelRange.endColumn, 0 /* PositionAffinity.Left */);\n            return new Range(start.lineNumber, start.column, end.lineNumber, end.column);\n        }\n    }\n    getViewLineNumberOfModelPosition(modelLineNumber, modelColumn) {\n        let lineIndex = modelLineNumber - 1;\n        if (this.modelLineProjections[lineIndex].isVisible()) {\n            // this model line is visible\n            const deltaLineNumber = 1 + this.projectedModelLineLineCounts.getPrefixSum(lineIndex);\n            return this.modelLineProjections[lineIndex].getViewLineNumberOfModelPosition(deltaLineNumber, modelColumn);\n        }\n        // this model line is not visible\n        while (lineIndex > 0 && !this.modelLineProjections[lineIndex].isVisible()) {\n            lineIndex--;\n        }\n        if (lineIndex === 0 && !this.modelLineProjections[lineIndex].isVisible()) {\n            // Could not reach a real line\n            return 1;\n        }\n        const deltaLineNumber = 1 + this.projectedModelLineLineCounts.getPrefixSum(lineIndex);\n        return this.modelLineProjections[lineIndex].getViewLineNumberOfModelPosition(deltaLineNumber, this.model.getLineMaxColumn(lineIndex + 1));\n    }\n    getDecorationsInRange(range, ownerId, filterOutValidation, filterFontDecorations, onlyMinimapDecorations, onlyMarginDecorations) {\n        const modelStart = this.convertViewPositionToModelPosition(range.startLineNumber, range.startColumn);\n        const modelEnd = this.convertViewPositionToModelPosition(range.endLineNumber, range.endColumn);\n        if (modelEnd.lineNumber - modelStart.lineNumber <= range.endLineNumber - range.startLineNumber) {\n            // most likely there are no hidden lines => fast path\n            // fetch decorations from column 1 to cover the case of wrapped lines that have whole line decorations at column 1\n            return this.model.getDecorationsInRange(new Range(modelStart.lineNumber, 1, modelEnd.lineNumber, modelEnd.column), ownerId, filterOutValidation, filterFontDecorations, onlyMinimapDecorations, onlyMarginDecorations);\n        }\n        let result = [];\n        const modelStartLineIndex = modelStart.lineNumber - 1;\n        const modelEndLineIndex = modelEnd.lineNumber - 1;\n        let reqStart = null;\n        for (let modelLineIndex = modelStartLineIndex; modelLineIndex <= modelEndLineIndex; modelLineIndex++) {\n            const line = this.modelLineProjections[modelLineIndex];\n            if (line.isVisible()) {\n                // merge into previous request\n                if (reqStart === null) {\n                    reqStart = new Position(modelLineIndex + 1, modelLineIndex === modelStartLineIndex ? modelStart.column : 1);\n                }\n            }\n            else {\n                // hit invisible line => flush request\n                if (reqStart !== null) {\n                    const maxLineColumn = this.model.getLineMaxColumn(modelLineIndex);\n                    result = result.concat(this.model.getDecorationsInRange(new Range(reqStart.lineNumber, reqStart.column, modelLineIndex, maxLineColumn), ownerId, filterOutValidation, filterFontDecorations, onlyMinimapDecorations));\n                    reqStart = null;\n                }\n            }\n        }\n        if (reqStart !== null) {\n            result = result.concat(this.model.getDecorationsInRange(new Range(reqStart.lineNumber, reqStart.column, modelEnd.lineNumber, modelEnd.column), ownerId, filterOutValidation, filterFontDecorations, onlyMinimapDecorations));\n            reqStart = null;\n        }\n        result.sort((a, b) => {\n            const res = Range.compareRangesUsingStarts(a.range, b.range);\n            if (res === 0) {\n                if (a.id < b.id) {\n                    return -1;\n                }\n                if (a.id > b.id) {\n                    return 1;\n                }\n                return 0;\n            }\n            return res;\n        });\n        // Eliminate duplicate decorations that might have intersected our visible ranges multiple times\n        const finalResult = [];\n        let finalResultLen = 0;\n        let prevDecId = null;\n        for (const dec of result) {\n            const decId = dec.id;\n            if (prevDecId === decId) {\n                // skip\n                continue;\n            }\n            prevDecId = decId;\n            finalResult[finalResultLen++] = dec;\n        }\n        return finalResult;\n    }\n    getInjectedTextAt(position) {\n        const info = this.getViewLineInfo(position.lineNumber);\n        return this.modelLineProjections[info.modelLineNumber - 1].getInjectedTextAt(info.modelLineWrappedLineIdx, position.column);\n    }\n    normalizePosition(position, affinity) {\n        const info = this.getViewLineInfo(position.lineNumber);\n        return this.modelLineProjections[info.modelLineNumber - 1].normalizePosition(info.modelLineWrappedLineIdx, position, affinity);\n    }\n    getLineIndentColumn(lineNumber) {\n        const info = this.getViewLineInfo(lineNumber);\n        if (info.modelLineWrappedLineIdx === 0) {\n            return this.model.getLineIndentColumn(info.modelLineNumber);\n        }\n        // wrapped lines have no indentation.\n        // We deliberately don't handle the case that indentation is wrapped\n        // to avoid two view lines reporting indentation for the very same model line.\n        return 0;\n    }\n}\n/**\n * Overlapping unsorted ranges:\n * [   )      [ )       [  )\n *    [    )      [       )\n * ->\n * Non overlapping sorted ranges:\n * [       )  [ ) [        )\n *\n * Note: This function only considers line information! Columns are ignored.\n*/\nfunction normalizeLineRanges(ranges) {\n    if (ranges.length === 0) {\n        return [];\n    }\n    const sortedRanges = ranges.slice();\n    sortedRanges.sort(Range.compareRangesUsingStarts);\n    const result = [];\n    let currentRangeStart = sortedRanges[0].startLineNumber;\n    let currentRangeEnd = sortedRanges[0].endLineNumber;\n    for (let i = 1, len = sortedRanges.length; i < len; i++) {\n        const range = sortedRanges[i];\n        if (range.startLineNumber > currentRangeEnd + 1) {\n            result.push(new Range(currentRangeStart, 1, currentRangeEnd, 1));\n            currentRangeStart = range.startLineNumber;\n            currentRangeEnd = range.endLineNumber;\n        }\n        else if (range.endLineNumber > currentRangeEnd) {\n            currentRangeEnd = range.endLineNumber;\n        }\n    }\n    result.push(new Range(currentRangeStart, 1, currentRangeEnd, 1));\n    return result;\n}\n/**\n * Represents a view line. Can be used to efficiently query more information about it.\n */\nclass ViewLineInfo {\n    constructor(modelLineNumber, modelLineWrappedLineIdx) {\n        this.modelLineNumber = modelLineNumber;\n        this.modelLineWrappedLineIdx = modelLineWrappedLineIdx;\n    }\n}\n/**\n * A list of view lines that have a contiguous span in the model.\n*/\nclass ViewLineInfoGroupedByModelRange {\n    constructor(modelRange, viewLines) {\n        this.modelRange = modelRange;\n        this.viewLines = viewLines;\n    }\n}\nclass CoordinatesConverter {\n    constructor(lines) {\n        this._lines = lines;\n    }\n    // View -> Model conversion and related methods\n    convertViewPositionToModelPosition(viewPosition) {\n        return this._lines.convertViewPositionToModelPosition(viewPosition.lineNumber, viewPosition.column);\n    }\n    convertViewRangeToModelRange(viewRange) {\n        return this._lines.convertViewRangeToModelRange(viewRange);\n    }\n    validateViewPosition(viewPosition, expectedModelPosition) {\n        return this._lines.validateViewPosition(viewPosition.lineNumber, viewPosition.column, expectedModelPosition);\n    }\n    validateViewRange(viewRange, expectedModelRange) {\n        return this._lines.validateViewRange(viewRange, expectedModelRange);\n    }\n    // Model -> View conversion and related methods\n    convertModelPositionToViewPosition(modelPosition, affinity, allowZero, belowHiddenRanges) {\n        return this._lines.convertModelPositionToViewPosition(modelPosition.lineNumber, modelPosition.column, affinity, allowZero, belowHiddenRanges);\n    }\n    convertModelRangeToViewRange(modelRange, affinity) {\n        return this._lines.convertModelRangeToViewRange(modelRange, affinity);\n    }\n    modelPositionIsVisible(modelPosition) {\n        return this._lines.modelPositionIsVisible(modelPosition.lineNumber, modelPosition.column);\n    }\n    getModelLineViewLineCount(modelLineNumber) {\n        return this._lines.getModelLineViewLineCount(modelLineNumber);\n    }\n    getViewLineNumberOfModelPosition(modelLineNumber, modelColumn) {\n        return this._lines.getViewLineNumberOfModelPosition(modelLineNumber, modelColumn);\n    }\n}\nclass ViewModelLinesFromModelAsIs {\n    constructor(model) {\n        this.model = model;\n    }\n    dispose() {\n    }\n    createCoordinatesConverter() {\n        return new IdentityCoordinatesConverter(this.model);\n    }\n    getHiddenAreas() {\n        return [];\n    }\n    setHiddenAreas(_ranges) {\n        return false;\n    }\n    setTabSize(_newTabSize) {\n        return false;\n    }\n    setWrappingSettings(_fontInfo, _wrappingStrategy, _wrappingColumn, _wrappingIndent) {\n        return false;\n    }\n    createLineBreaksComputer() {\n        const result = [];\n        return {\n            addRequest: (lineText, injectedText, previousLineBreakData) => {\n                result.push(null);\n            },\n            finalize: () => {\n                return result;\n            }\n        };\n    }\n    onModelFlushed() {\n    }\n    onModelLinesDeleted(_versionId, fromLineNumber, toLineNumber) {\n        return new ViewLinesDeletedEvent(fromLineNumber, toLineNumber);\n    }\n    onModelLinesInserted(_versionId, fromLineNumber, toLineNumber, lineBreaks) {\n        return new ViewLinesInsertedEvent(fromLineNumber, toLineNumber);\n    }\n    onModelLineChanged(_versionId, lineNumber, lineBreakData) {\n        return [false, new ViewLinesChangedEvent(lineNumber, 1), null, null];\n    }\n    acceptVersionId(_versionId) {\n    }\n    getViewLineCount() {\n        return this.model.getLineCount();\n    }\n    getActiveIndentGuide(viewLineNumber, _minLineNumber, _maxLineNumber) {\n        return {\n            startLineNumber: viewLineNumber,\n            endLineNumber: viewLineNumber,\n            indent: 0\n        };\n    }\n    getViewLinesBracketGuides(startLineNumber, endLineNumber, activePosition) {\n        return new Array(endLineNumber - startLineNumber + 1).fill([]);\n    }\n    getViewLinesIndentGuides(viewStartLineNumber, viewEndLineNumber) {\n        const viewLineCount = viewEndLineNumber - viewStartLineNumber + 1;\n        const result = new Array(viewLineCount);\n        for (let i = 0; i < viewLineCount; i++) {\n            result[i] = 0;\n        }\n        return result;\n    }\n    getViewLineContent(viewLineNumber) {\n        return this.model.getLineContent(viewLineNumber);\n    }\n    getViewLineLength(viewLineNumber) {\n        return this.model.getLineLength(viewLineNumber);\n    }\n    getViewLineMinColumn(viewLineNumber) {\n        return this.model.getLineMinColumn(viewLineNumber);\n    }\n    getViewLineMaxColumn(viewLineNumber) {\n        return this.model.getLineMaxColumn(viewLineNumber);\n    }\n    getViewLineData(viewLineNumber) {\n        const lineTokens = this.model.tokenization.getLineTokens(viewLineNumber);\n        const lineContent = lineTokens.getLineContent();\n        return new ViewLineData(lineContent, false, 1, lineContent.length + 1, 0, lineTokens.inflate(), null);\n    }\n    getViewLinesData(viewStartLineNumber, viewEndLineNumber, needed) {\n        const lineCount = this.model.getLineCount();\n        viewStartLineNumber = Math.min(Math.max(1, viewStartLineNumber), lineCount);\n        viewEndLineNumber = Math.min(Math.max(1, viewEndLineNumber), lineCount);\n        const result = [];\n        for (let lineNumber = viewStartLineNumber; lineNumber <= viewEndLineNumber; lineNumber++) {\n            const idx = lineNumber - viewStartLineNumber;\n            result[idx] = needed[idx] ? this.getViewLineData(lineNumber) : null;\n        }\n        return result;\n    }\n    getDecorationsInRange(range, ownerId, filterOutValidation, filterFontDecorations, onlyMinimapDecorations, onlyMarginDecorations) {\n        return this.model.getDecorationsInRange(range, ownerId, filterOutValidation, filterFontDecorations, onlyMinimapDecorations, onlyMarginDecorations);\n    }\n    normalizePosition(position, affinity) {\n        return this.model.normalizePosition(position, affinity);\n    }\n    getLineIndentColumn(lineNumber) {\n        return this.model.getLineIndentColumn(lineNumber);\n    }\n    getInjectedTextAt(position) {\n        // Identity lines collection does not support injected text.\n        return null;\n    }\n}\n\nexport { ViewModelLinesFromModelAsIs, ViewModelLinesFromProjectedModel };\n","import { GlyphMarginLane } from '../model.js';\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 *--------------------------------------------------------------------------------------------*/\nconst MAX_LANE = GlyphMarginLane.Right;\nclass GlyphMarginLanesModel {\n    constructor(maxLine) {\n        this.persist = 0;\n        this._requiredLanes = 1; // always render at least one lane\n        this.lanes = new Uint8Array(Math.ceil(((maxLine + 1) * MAX_LANE) / 8));\n    }\n    reset(maxLine) {\n        const bytes = Math.ceil(((maxLine + 1) * MAX_LANE) / 8);\n        if (this.lanes.length < bytes) {\n            this.lanes = new Uint8Array(bytes);\n        }\n        else {\n            this.lanes.fill(0);\n        }\n        this._requiredLanes = 1;\n    }\n    get requiredLanes() {\n        return this._requiredLanes;\n    }\n    push(lane, range, persist) {\n        if (persist) {\n            this.persist |= (1 << (lane - 1));\n        }\n        for (let i = range.startLineNumber; i <= range.endLineNumber; i++) {\n            const bit = (MAX_LANE * i) + (lane - 1);\n            this.lanes[bit >>> 3] |= (1 << (bit % 8));\n            this._requiredLanes = Math.max(this._requiredLanes, this.countAtLine(i));\n        }\n    }\n    getLanesAtLine(lineNumber) {\n        const lanes = [];\n        let bit = MAX_LANE * lineNumber;\n        for (let i = 0; i < MAX_LANE; i++) {\n            if (this.persist & (1 << i) || this.lanes[bit >>> 3] & (1 << (bit % 8))) {\n                lanes.push(i + 1);\n            }\n            bit++;\n        }\n        return lanes.length ? lanes : [GlyphMarginLane.Center];\n    }\n    countAtLine(lineNumber) {\n        let bit = MAX_LANE * lineNumber;\n        let count = 0;\n        for (let i = 0; i < MAX_LANE; i++) {\n            if (this.persist & (1 << i) || this.lanes[bit >>> 3] & (1 << (bit % 8))) {\n                count++;\n            }\n            bit++;\n        }\n        return count;\n    }\n}\n\nexport { GlyphMarginLanesModel };\n","import { ArrayQueue } from '../../../base/common/arrays.js';\nimport { RunOnceScheduler } from '../../../base/common/async.js';\nimport { Color } from '../../../base/common/color.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { isWindows } from '../../../base/common/platform.js';\nimport { firstNonWhitespaceIndex, lastNonWhitespaceIndex } from '../../../base/common/strings.js';\nimport { filterValidationDecorations, filterFontDecorations } from '../config/editorOptions.js';\nimport { EDITOR_FONT_DEFAULTS } from '../config/fontInfo.js';\nimport { CursorsController } from '../cursor/cursor.js';\nimport { CursorConfiguration } from '../cursorCommon.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { TextDirection } from '../model.js';\nimport { InternalModelContentChangeEvent, ModelLineHeightChangedEvent as ModelLineHeightChangedEvent$1, ModelFontChangedEvent as ModelFontChangedEvent$1 } from '../textModelEvents.js';\nimport { TokenizationRegistry } from '../languages.js';\nimport { PLAINTEXT_LANGUAGE_ID } from '../languages/modesRegistry.js';\nimport { tokenizeLineToHTML } from '../languages/textToHtmlTokenizer.js';\nimport { ViewScrollChangedEvent, ViewTokensColorsChangedEvent, ViewThemeChangedEvent, ViewFocusChangedEvent, ViewCompositionStartEvent, ViewCompositionEndEvent, ViewFlushedEvent, ViewLineMappingChangedEvent, ViewDecorationsChangedEvent, ViewConfigurationChangedEvent, ViewTokensChangedEvent, ViewLanguageConfigurationEvent, ViewRevealRangeRequestEvent, ViewZonesChangedEvent } from '../viewEvents.js';\nimport { ViewLayout } from '../viewLayout/viewLayout.js';\nimport { MinimapTokensColorTracker } from './minimapTokensColorTracker.js';\nimport { ViewLineRenderingData, MinimapLinesRenderingData, OverviewRulerDecorationsGroup } from '../viewModel.js';\nimport { ViewModelDecorations } from './viewModelDecorations.js';\nimport { ViewModelEventDispatcher, ScrollChangedEvent, FocusChangedEvent, WidgetFocusChangedEvent, ModelContentChangedEvent, ModelLineHeightChangedEvent, ModelFontChangedEvent, ModelTokensChangedEvent, ModelLanguageConfigurationChangedEvent, ModelLanguageChangedEvent, ModelOptionsChangedEvent, ModelDecorationsChangedEvent, HiddenAreasChangedEvent, ReadOnlyEditAttemptEvent, ViewZonesChangedEvent as ViewZonesChangedEvent$1 } from '../viewModelEventDispatcher.js';\nimport { ViewModelLinesFromModelAsIs, ViewModelLinesFromProjectedModel } from './viewModelLines.js';\nimport { GlyphMarginLanesModel } from './glyphLanesModel.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ViewModel extends Disposable {\n    constructor(editorId, configuration, model, domLineBreaksComputerFactory, monospaceLineBreaksComputerFactory, scheduleAtNextAnimationFrame, languageConfigurationService, _themeService, _attachedView, _transactionalTarget) {\n        super();\n        this.languageConfigurationService = languageConfigurationService;\n        this._themeService = _themeService;\n        this._attachedView = _attachedView;\n        this._transactionalTarget = _transactionalTarget;\n        this.hiddenAreasModel = new HiddenAreasModel();\n        this.previousHiddenAreas = [];\n        this._editorId = editorId;\n        this._configuration = configuration;\n        this.model = model;\n        this._eventDispatcher = new ViewModelEventDispatcher();\n        this.onEvent = this._eventDispatcher.onEvent;\n        this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n        this._updateConfigurationViewLineCount = this._register(new RunOnceScheduler(() => this._updateConfigurationViewLineCountNow(), 0));\n        this._hasFocus = false;\n        this._viewportStart = ViewportStart.create(this.model);\n        this.glyphLanes = new GlyphMarginLanesModel(0);\n        if (this.model.isTooLargeForTokenization()) {\n            this._lines = new ViewModelLinesFromModelAsIs(this.model);\n        }\n        else {\n            const options = this._configuration.options;\n            const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n            const wrappingStrategy = options.get(156 /* EditorOption.wrappingStrategy */);\n            const wrappingInfo = options.get(166 /* EditorOption.wrappingInfo */);\n            const wrappingIndent = options.get(155 /* EditorOption.wrappingIndent */);\n            const wordBreak = options.get(146 /* EditorOption.wordBreak */);\n            const wrapOnEscapedLineFeeds = options.get(160 /* EditorOption.wrapOnEscapedLineFeeds */);\n            this._lines = new ViewModelLinesFromProjectedModel(this._editorId, this.model, domLineBreaksComputerFactory, monospaceLineBreaksComputerFactory, fontInfo, this.model.getOptions().tabSize, wrappingStrategy, wrappingInfo.wrappingColumn, wrappingIndent, wordBreak, wrapOnEscapedLineFeeds);\n        }\n        this.coordinatesConverter = this._lines.createCoordinatesConverter();\n        this._cursor = this._register(new CursorsController(model, this, this.coordinatesConverter, this.cursorConfig));\n        this.viewLayout = this._register(new ViewLayout(this._configuration, this.getLineCount(), this._getCustomLineHeights(), scheduleAtNextAnimationFrame));\n        this._register(this.viewLayout.onDidScroll((e) => {\n            if (e.scrollTopChanged) {\n                this._handleVisibleLinesChanged();\n            }\n            if (e.scrollTopChanged) {\n                this._viewportStart.invalidate();\n            }\n            this._eventDispatcher.emitSingleViewEvent(new ViewScrollChangedEvent(e));\n            this._eventDispatcher.emitOutgoingEvent(new ScrollChangedEvent(e.oldScrollWidth, e.oldScrollLeft, e.oldScrollHeight, e.oldScrollTop, e.scrollWidth, e.scrollLeft, e.scrollHeight, e.scrollTop));\n        }));\n        this._register(this.viewLayout.onDidContentSizeChange((e) => {\n            this._eventDispatcher.emitOutgoingEvent(e);\n        }));\n        this._decorations = new ViewModelDecorations(this._editorId, this.model, this._configuration, this._lines, this.coordinatesConverter);\n        this._registerModelEvents();\n        this._register(this._configuration.onDidChangeFast((e) => {\n            try {\n                const eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n                this._onConfigurationChanged(eventsCollector, e);\n            }\n            finally {\n                this._eventDispatcher.endEmitViewEvents();\n            }\n        }));\n        this._register(MinimapTokensColorTracker.getInstance().onDidChange(() => {\n            this._eventDispatcher.emitSingleViewEvent(new ViewTokensColorsChangedEvent());\n        }));\n        this._register(this._themeService.onDidColorThemeChange((theme) => {\n            this._invalidateDecorationsColorCache();\n            this._eventDispatcher.emitSingleViewEvent(new ViewThemeChangedEvent(theme));\n        }));\n        this._updateConfigurationViewLineCountNow();\n    }\n    dispose() {\n        // First remove listeners, as disposing the lines might end up sending\n        // model decoration changed events ... and we no longer care about them ...\n        super.dispose();\n        this._decorations.dispose();\n        this._lines.dispose();\n        this._viewportStart.dispose();\n        this._eventDispatcher.dispose();\n    }\n    createLineBreaksComputer() {\n        return this._lines.createLineBreaksComputer();\n    }\n    addViewEventHandler(eventHandler) {\n        this._eventDispatcher.addViewEventHandler(eventHandler);\n    }\n    removeViewEventHandler(eventHandler) {\n        this._eventDispatcher.removeViewEventHandler(eventHandler);\n    }\n    _getCustomLineHeights() {\n        const allowVariableLineHeights = this._configuration.options.get(5 /* EditorOption.allowVariableLineHeights */);\n        if (!allowVariableLineHeights) {\n            return [];\n        }\n        const decorations = this.model.getCustomLineHeightsDecorations(this._editorId);\n        return decorations.map((d) => {\n            const lineNumber = d.range.startLineNumber;\n            const viewRange = this.coordinatesConverter.convertModelRangeToViewRange(new Range(lineNumber, 1, lineNumber, this.model.getLineMaxColumn(lineNumber)));\n            return {\n                decorationId: d.id,\n                startLineNumber: viewRange.startLineNumber,\n                endLineNumber: viewRange.endLineNumber,\n                lineHeight: d.options.lineHeight || 0\n            };\n        });\n    }\n    _updateConfigurationViewLineCountNow() {\n        this._configuration.setViewLineCount(this._lines.getViewLineCount());\n    }\n    getModelVisibleRanges() {\n        const linesViewportData = this.viewLayout.getLinesViewportData();\n        const viewVisibleRange = new Range(linesViewportData.startLineNumber, this.getLineMinColumn(linesViewportData.startLineNumber), linesViewportData.endLineNumber, this.getLineMaxColumn(linesViewportData.endLineNumber));\n        const modelVisibleRanges = this._toModelVisibleRanges(viewVisibleRange);\n        return modelVisibleRanges;\n    }\n    visibleLinesStabilized() {\n        const modelVisibleRanges = this.getModelVisibleRanges();\n        this._attachedView.setVisibleLines(modelVisibleRanges, true);\n    }\n    _handleVisibleLinesChanged() {\n        const modelVisibleRanges = this.getModelVisibleRanges();\n        this._attachedView.setVisibleLines(modelVisibleRanges, false);\n    }\n    setHasFocus(hasFocus) {\n        this._hasFocus = hasFocus;\n        this._cursor.setHasFocus(hasFocus);\n        this._eventDispatcher.emitSingleViewEvent(new ViewFocusChangedEvent(hasFocus));\n        this._eventDispatcher.emitOutgoingEvent(new FocusChangedEvent(!hasFocus, hasFocus));\n    }\n    setHasWidgetFocus(hasWidgetFocus) {\n        this._eventDispatcher.emitOutgoingEvent(new WidgetFocusChangedEvent(!hasWidgetFocus, hasWidgetFocus));\n    }\n    onCompositionStart() {\n        this._eventDispatcher.emitSingleViewEvent(new ViewCompositionStartEvent());\n    }\n    onCompositionEnd() {\n        this._eventDispatcher.emitSingleViewEvent(new ViewCompositionEndEvent());\n    }\n    _captureStableViewport() {\n        // We might need to restore the current start view range, so save it (if available)\n        // But only if the scroll position is not at the top of the file\n        if (this._viewportStart.isValid && this.viewLayout.getCurrentScrollTop() > 0) {\n            const previousViewportStartViewPosition = new Position(this._viewportStart.viewLineNumber, this.getLineMinColumn(this._viewportStart.viewLineNumber));\n            const previousViewportStartModelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(previousViewportStartViewPosition);\n            return new StableViewport(previousViewportStartModelPosition, this._viewportStart.startLineDelta);\n        }\n        return new StableViewport(null, 0);\n    }\n    _onConfigurationChanged(eventsCollector, e) {\n        const stableViewport = this._captureStableViewport();\n        const options = this._configuration.options;\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        const wrappingStrategy = options.get(156 /* EditorOption.wrappingStrategy */);\n        const wrappingInfo = options.get(166 /* EditorOption.wrappingInfo */);\n        const wrappingIndent = options.get(155 /* EditorOption.wrappingIndent */);\n        const wordBreak = options.get(146 /* EditorOption.wordBreak */);\n        if (this._lines.setWrappingSettings(fontInfo, wrappingStrategy, wrappingInfo.wrappingColumn, wrappingIndent, wordBreak)) {\n            eventsCollector.emitViewEvent(new ViewFlushedEvent());\n            eventsCollector.emitViewEvent(new ViewLineMappingChangedEvent());\n            eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null));\n            this._cursor.onLineMappingChanged(eventsCollector);\n            this._decorations.onLineMappingChanged();\n            this.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n            this._updateConfigurationViewLineCount.schedule();\n        }\n        if (e.hasChanged(104 /* EditorOption.readOnly */)) {\n            // Must read again all decorations due to readOnly filtering\n            this._decorations.reset();\n            eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null));\n        }\n        if (e.hasChanged(112 /* EditorOption.renderValidationDecorations */)) {\n            this._decorations.reset();\n            eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null));\n        }\n        eventsCollector.emitViewEvent(new ViewConfigurationChangedEvent(e));\n        this.viewLayout.onConfigurationChanged(e);\n        stableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout);\n        if (CursorConfiguration.shouldRecreate(e)) {\n            this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n            this._cursor.updateConfiguration(this.cursorConfig);\n        }\n    }\n    _registerModelEvents() {\n        this._register(this.model.onDidChangeContentOrInjectedText((e) => {\n            try {\n                const eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n                let hadOtherModelChange = false;\n                let hadModelLineChangeThatChangedLineMapping = false;\n                const changes = (e instanceof InternalModelContentChangeEvent ? e.rawContentChangedEvent.changes : e.changes);\n                const versionId = (e instanceof InternalModelContentChangeEvent ? e.rawContentChangedEvent.versionId : null);\n                // Do a first pass to compute line mappings, and a second pass to actually interpret them\n                const lineBreaksComputer = this._lines.createLineBreaksComputer();\n                for (const change of changes) {\n                    switch (change.changeType) {\n                        case 4 /* textModelEvents.RawContentChangedType.LinesInserted */: {\n                            for (let lineIdx = 0; lineIdx < change.detail.length; lineIdx++) {\n                                const line = change.detail[lineIdx];\n                                let injectedText = change.injectedTexts[lineIdx];\n                                if (injectedText) {\n                                    injectedText = injectedText.filter(element => (!element.ownerId || element.ownerId === this._editorId));\n                                }\n                                lineBreaksComputer.addRequest(line, injectedText, null);\n                            }\n                            break;\n                        }\n                        case 2 /* textModelEvents.RawContentChangedType.LineChanged */: {\n                            let injectedText = null;\n                            if (change.injectedText) {\n                                injectedText = change.injectedText.filter(element => (!element.ownerId || element.ownerId === this._editorId));\n                            }\n                            lineBreaksComputer.addRequest(change.detail, injectedText, null);\n                            break;\n                        }\n                    }\n                }\n                const lineBreaks = lineBreaksComputer.finalize();\n                const lineBreakQueue = new ArrayQueue(lineBreaks);\n                for (const change of changes) {\n                    switch (change.changeType) {\n                        case 1 /* textModelEvents.RawContentChangedType.Flush */: {\n                            this._lines.onModelFlushed();\n                            eventsCollector.emitViewEvent(new ViewFlushedEvent());\n                            this._decorations.reset();\n                            this.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n                            hadOtherModelChange = true;\n                            break;\n                        }\n                        case 3 /* textModelEvents.RawContentChangedType.LinesDeleted */: {\n                            const linesDeletedEvent = this._lines.onModelLinesDeleted(versionId, change.fromLineNumber, change.toLineNumber);\n                            if (linesDeletedEvent !== null) {\n                                eventsCollector.emitViewEvent(linesDeletedEvent);\n                                this.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber);\n                            }\n                            hadOtherModelChange = true;\n                            break;\n                        }\n                        case 4 /* textModelEvents.RawContentChangedType.LinesInserted */: {\n                            const insertedLineBreaks = lineBreakQueue.takeCount(change.detail.length);\n                            const linesInsertedEvent = this._lines.onModelLinesInserted(versionId, change.fromLineNumber, change.toLineNumber, insertedLineBreaks);\n                            if (linesInsertedEvent !== null) {\n                                eventsCollector.emitViewEvent(linesInsertedEvent);\n                                this.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber);\n                            }\n                            hadOtherModelChange = true;\n                            break;\n                        }\n                        case 2 /* textModelEvents.RawContentChangedType.LineChanged */: {\n                            const changedLineBreakData = lineBreakQueue.dequeue();\n                            const [lineMappingChanged, linesChangedEvent, linesInsertedEvent, linesDeletedEvent] = this._lines.onModelLineChanged(versionId, change.lineNumber, changedLineBreakData);\n                            hadModelLineChangeThatChangedLineMapping = lineMappingChanged;\n                            if (linesChangedEvent) {\n                                eventsCollector.emitViewEvent(linesChangedEvent);\n                            }\n                            if (linesInsertedEvent) {\n                                eventsCollector.emitViewEvent(linesInsertedEvent);\n                                this.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber);\n                            }\n                            if (linesDeletedEvent) {\n                                eventsCollector.emitViewEvent(linesDeletedEvent);\n                                this.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber);\n                            }\n                            break;\n                        }\n                        case 5 /* textModelEvents.RawContentChangedType.EOLChanged */: {\n                            // Nothing to do. The new version will be accepted below\n                            break;\n                        }\n                    }\n                }\n                if (versionId !== null) {\n                    this._lines.acceptVersionId(versionId);\n                }\n                this.viewLayout.onHeightMaybeChanged();\n                if (!hadOtherModelChange && hadModelLineChangeThatChangedLineMapping) {\n                    eventsCollector.emitViewEvent(new ViewLineMappingChangedEvent());\n                    eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null));\n                    this._cursor.onLineMappingChanged(eventsCollector);\n                    this._decorations.onLineMappingChanged();\n                }\n            }\n            finally {\n                this._eventDispatcher.endEmitViewEvents();\n            }\n            // Update the configuration and reset the centered view line\n            const viewportStartWasValid = this._viewportStart.isValid;\n            this._viewportStart.invalidate();\n            this._configuration.setModelLineCount(this.model.getLineCount());\n            this._updateConfigurationViewLineCountNow();\n            // Recover viewport\n            if (!this._hasFocus && this.model.getAttachedEditorCount() >= 2 && viewportStartWasValid) {\n                const modelRange = this.model._getTrackedRange(this._viewportStart.modelTrackedRange);\n                if (modelRange) {\n                    const viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(modelRange.getStartPosition());\n                    const viewPositionTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber);\n                    this.viewLayout.setScrollPosition({ scrollTop: viewPositionTop + this._viewportStart.startLineDelta }, 1 /* ScrollType.Immediate */);\n                }\n            }\n            try {\n                const eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n                if (e instanceof InternalModelContentChangeEvent) {\n                    eventsCollector.emitOutgoingEvent(new ModelContentChangedEvent(e.contentChangedEvent));\n                }\n                this._cursor.onModelContentChanged(eventsCollector, e);\n            }\n            finally {\n                this._eventDispatcher.endEmitViewEvents();\n            }\n            this._handleVisibleLinesChanged();\n        }));\n        const allowVariableLineHeights = this._configuration.options.get(5 /* EditorOption.allowVariableLineHeights */);\n        if (allowVariableLineHeights) {\n            this._register(this.model.onDidChangeLineHeight((e) => {\n                const filteredChanges = e.changes.filter((change) => change.ownerId === this._editorId || change.ownerId === 0);\n                this.viewLayout.changeSpecialLineHeights((accessor) => {\n                    for (const change of filteredChanges) {\n                        const { decorationId, lineNumber, lineHeight } = change;\n                        const viewRange = this.coordinatesConverter.convertModelRangeToViewRange(new Range(lineNumber, 1, lineNumber, this.model.getLineMaxColumn(lineNumber)));\n                        if (lineHeight !== null) {\n                            accessor.insertOrChangeCustomLineHeight(decorationId, viewRange.startLineNumber, viewRange.endLineNumber, lineHeight);\n                        }\n                        else {\n                            accessor.removeCustomLineHeight(decorationId);\n                        }\n                    }\n                });\n                // recreate the model event using the filtered changes\n                if (filteredChanges.length > 0) {\n                    const filteredEvent = new ModelLineHeightChangedEvent$1(filteredChanges);\n                    this._eventDispatcher.emitOutgoingEvent(new ModelLineHeightChangedEvent(filteredEvent));\n                }\n            }));\n        }\n        const allowVariableFonts = this._configuration.options.get(172 /* EditorOption.effectiveAllowVariableFonts */);\n        if (allowVariableFonts) {\n            this._register(this.model.onDidChangeFont((e) => {\n                const filteredChanges = e.changes.filter((change) => change.ownerId === this._editorId || change.ownerId === 0);\n                // recreate the model event using the filtered changes\n                if (filteredChanges.length > 0) {\n                    const filteredEvent = new ModelFontChangedEvent$1(filteredChanges);\n                    this._eventDispatcher.emitOutgoingEvent(new ModelFontChangedEvent(filteredEvent));\n                }\n            }));\n        }\n        this._register(this.model.onDidChangeTokens((e) => {\n            const viewRanges = [];\n            for (let j = 0, lenJ = e.ranges.length; j < lenJ; j++) {\n                const modelRange = e.ranges[j];\n                const viewStartLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.fromLineNumber, 1)).lineNumber;\n                const viewEndLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.toLineNumber, this.model.getLineMaxColumn(modelRange.toLineNumber))).lineNumber;\n                viewRanges[j] = {\n                    fromLineNumber: viewStartLineNumber,\n                    toLineNumber: viewEndLineNumber\n                };\n            }\n            this._eventDispatcher.emitSingleViewEvent(new ViewTokensChangedEvent(viewRanges));\n            this._eventDispatcher.emitOutgoingEvent(new ModelTokensChangedEvent(e));\n        }));\n        this._register(this.model.onDidChangeLanguageConfiguration((e) => {\n            this._eventDispatcher.emitSingleViewEvent(new ViewLanguageConfigurationEvent());\n            this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n            this._cursor.updateConfiguration(this.cursorConfig);\n            this._eventDispatcher.emitOutgoingEvent(new ModelLanguageConfigurationChangedEvent(e));\n        }));\n        this._register(this.model.onDidChangeLanguage((e) => {\n            this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n            this._cursor.updateConfiguration(this.cursorConfig);\n            this._eventDispatcher.emitOutgoingEvent(new ModelLanguageChangedEvent(e));\n        }));\n        this._register(this.model.onDidChangeOptions((e) => {\n            // A tab size change causes a line mapping changed event => all view parts will repaint OK, no further event needed here\n            if (this._lines.setTabSize(this.model.getOptions().tabSize)) {\n                try {\n                    const eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n                    eventsCollector.emitViewEvent(new ViewFlushedEvent());\n                    eventsCollector.emitViewEvent(new ViewLineMappingChangedEvent());\n                    eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null));\n                    this._cursor.onLineMappingChanged(eventsCollector);\n                    this._decorations.onLineMappingChanged();\n                    this.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n                }\n                finally {\n                    this._eventDispatcher.endEmitViewEvents();\n                }\n                this._updateConfigurationViewLineCount.schedule();\n            }\n            this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n            this._cursor.updateConfiguration(this.cursorConfig);\n            this._eventDispatcher.emitOutgoingEvent(new ModelOptionsChangedEvent(e));\n        }));\n        this._register(this.model.onDidChangeDecorations((e) => {\n            this._decorations.onModelDecorationsChanged();\n            this._eventDispatcher.emitSingleViewEvent(new ViewDecorationsChangedEvent(e));\n            this._eventDispatcher.emitOutgoingEvent(new ModelDecorationsChangedEvent(e));\n        }));\n    }\n    getFontSizeAtPosition(position) {\n        const allowVariableFonts = this._configuration.options.get(172 /* EditorOption.effectiveAllowVariableFonts */);\n        if (!allowVariableFonts) {\n            return null;\n        }\n        const fontDecorations = this.model.getFontDecorationsInRange(Range.fromPositions(position), this._editorId);\n        let fontSize = this._configuration.options.get(59 /* EditorOption.fontInfo */).fontSize + 'px';\n        for (const fontDecoration of fontDecorations) {\n            if (fontDecoration.options.fontSize) {\n                fontSize = fontDecoration.options.fontSize;\n                break;\n            }\n        }\n        return fontSize;\n    }\n    /**\n     * @param forceUpdate If true, the hidden areas will be updated even if the new ranges are the same as the previous ranges.\n     * This is because the model might have changed, which resets the hidden areas, but not the last cached value.\n     * This needs a better fix in the future.\n    */\n    setHiddenAreas(ranges, source, forceUpdate) {\n        this.hiddenAreasModel.setHiddenAreas(source, ranges);\n        const mergedRanges = this.hiddenAreasModel.getMergedRanges();\n        if (mergedRanges === this.previousHiddenAreas && !forceUpdate) {\n            return;\n        }\n        this.previousHiddenAreas = mergedRanges;\n        const stableViewport = this._captureStableViewport();\n        let lineMappingChanged = false;\n        try {\n            const eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n            lineMappingChanged = this._lines.setHiddenAreas(mergedRanges);\n            if (lineMappingChanged) {\n                eventsCollector.emitViewEvent(new ViewFlushedEvent());\n                eventsCollector.emitViewEvent(new ViewLineMappingChangedEvent());\n                eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null));\n                this._cursor.onLineMappingChanged(eventsCollector);\n                this._decorations.onLineMappingChanged();\n                this.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n                this.viewLayout.onHeightMaybeChanged();\n            }\n            const firstModelLineInViewPort = stableViewport.viewportStartModelPosition?.lineNumber;\n            const firstModelLineIsHidden = firstModelLineInViewPort && mergedRanges.some(range => range.startLineNumber <= firstModelLineInViewPort && firstModelLineInViewPort <= range.endLineNumber);\n            if (!firstModelLineIsHidden) {\n                stableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout);\n            }\n        }\n        finally {\n            this._eventDispatcher.endEmitViewEvents();\n        }\n        this._updateConfigurationViewLineCount.schedule();\n        if (lineMappingChanged) {\n            this._eventDispatcher.emitOutgoingEvent(new HiddenAreasChangedEvent());\n        }\n    }\n    getVisibleRangesPlusViewportAboveBelow() {\n        const layoutInfo = this._configuration.options.get(165 /* EditorOption.layoutInfo */);\n        const lineHeight = this._configuration.options.get(75 /* EditorOption.lineHeight */);\n        const linesAround = Math.max(20, Math.round(layoutInfo.height / lineHeight));\n        const partialData = this.viewLayout.getLinesViewportData();\n        const startViewLineNumber = Math.max(1, partialData.completelyVisibleStartLineNumber - linesAround);\n        const endViewLineNumber = Math.min(this.getLineCount(), partialData.completelyVisibleEndLineNumber + linesAround);\n        return this._toModelVisibleRanges(new Range(startViewLineNumber, this.getLineMinColumn(startViewLineNumber), endViewLineNumber, this.getLineMaxColumn(endViewLineNumber)));\n    }\n    getVisibleRanges() {\n        const visibleViewRange = this.getCompletelyVisibleViewRange();\n        return this._toModelVisibleRanges(visibleViewRange);\n    }\n    getHiddenAreas() {\n        return this._lines.getHiddenAreas();\n    }\n    _toModelVisibleRanges(visibleViewRange) {\n        const visibleRange = this.coordinatesConverter.convertViewRangeToModelRange(visibleViewRange);\n        const hiddenAreas = this._lines.getHiddenAreas();\n        if (hiddenAreas.length === 0) {\n            return [visibleRange];\n        }\n        const result = [];\n        let resultLen = 0;\n        let startLineNumber = visibleRange.startLineNumber;\n        let startColumn = visibleRange.startColumn;\n        const endLineNumber = visibleRange.endLineNumber;\n        const endColumn = visibleRange.endColumn;\n        for (let i = 0, len = hiddenAreas.length; i < len; i++) {\n            const hiddenStartLineNumber = hiddenAreas[i].startLineNumber;\n            const hiddenEndLineNumber = hiddenAreas[i].endLineNumber;\n            if (hiddenEndLineNumber < startLineNumber) {\n                continue;\n            }\n            if (hiddenStartLineNumber > endLineNumber) {\n                continue;\n            }\n            if (startLineNumber < hiddenStartLineNumber) {\n                result[resultLen++] = new Range(startLineNumber, startColumn, hiddenStartLineNumber - 1, this.model.getLineMaxColumn(hiddenStartLineNumber - 1));\n            }\n            startLineNumber = hiddenEndLineNumber + 1;\n            startColumn = 1;\n        }\n        if (startLineNumber < endLineNumber || (startLineNumber === endLineNumber && startColumn < endColumn)) {\n            result[resultLen++] = new Range(startLineNumber, startColumn, endLineNumber, endColumn);\n        }\n        return result;\n    }\n    getCompletelyVisibleViewRange() {\n        const partialData = this.viewLayout.getLinesViewportData();\n        const startViewLineNumber = partialData.completelyVisibleStartLineNumber;\n        const endViewLineNumber = partialData.completelyVisibleEndLineNumber;\n        return new Range(startViewLineNumber, this.getLineMinColumn(startViewLineNumber), endViewLineNumber, this.getLineMaxColumn(endViewLineNumber));\n    }\n    getCompletelyVisibleViewRangeAtScrollTop(scrollTop) {\n        const partialData = this.viewLayout.getLinesViewportDataAtScrollTop(scrollTop);\n        const startViewLineNumber = partialData.completelyVisibleStartLineNumber;\n        const endViewLineNumber = partialData.completelyVisibleEndLineNumber;\n        return new Range(startViewLineNumber, this.getLineMinColumn(startViewLineNumber), endViewLineNumber, this.getLineMaxColumn(endViewLineNumber));\n    }\n    saveState() {\n        const compatViewState = this.viewLayout.saveState();\n        const scrollTop = compatViewState.scrollTop;\n        const firstViewLineNumber = this.viewLayout.getLineNumberAtVerticalOffset(scrollTop);\n        const firstPosition = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(firstViewLineNumber, this.getLineMinColumn(firstViewLineNumber)));\n        const firstPositionDeltaTop = this.viewLayout.getVerticalOffsetForLineNumber(firstViewLineNumber) - scrollTop;\n        return {\n            scrollLeft: compatViewState.scrollLeft,\n            firstPosition: firstPosition,\n            firstPositionDeltaTop: firstPositionDeltaTop\n        };\n    }\n    reduceRestoreState(state) {\n        if (typeof state.firstPosition === 'undefined') {\n            // This is a view state serialized by an older version\n            return this._reduceRestoreStateCompatibility(state);\n        }\n        const modelPosition = this.model.validatePosition(state.firstPosition);\n        const viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(modelPosition);\n        const scrollTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber) - state.firstPositionDeltaTop;\n        return {\n            scrollLeft: state.scrollLeft,\n            scrollTop: scrollTop\n        };\n    }\n    _reduceRestoreStateCompatibility(state) {\n        return {\n            scrollLeft: state.scrollLeft,\n            scrollTop: state.scrollTopWithoutViewZones\n        };\n    }\n    getTabSize() {\n        return this.model.getOptions().tabSize;\n    }\n    getLineCount() {\n        return this._lines.getViewLineCount();\n    }\n    /**\n     * Gives a hint that a lot of requests are about to come in for these line numbers.\n     */\n    setViewport(startLineNumber, endLineNumber, centeredLineNumber) {\n        this._viewportStart.update(this, startLineNumber);\n    }\n    getActiveIndentGuide(lineNumber, minLineNumber, maxLineNumber) {\n        return this._lines.getActiveIndentGuide(lineNumber, minLineNumber, maxLineNumber);\n    }\n    getLinesIndentGuides(startLineNumber, endLineNumber) {\n        return this._lines.getViewLinesIndentGuides(startLineNumber, endLineNumber);\n    }\n    getBracketGuidesInRangeByLine(startLineNumber, endLineNumber, activePosition, options) {\n        return this._lines.getViewLinesBracketGuides(startLineNumber, endLineNumber, activePosition, options);\n    }\n    getLineContent(lineNumber) {\n        return this._lines.getViewLineContent(lineNumber);\n    }\n    getLineLength(lineNumber) {\n        return this._lines.getViewLineLength(lineNumber);\n    }\n    getLineMinColumn(lineNumber) {\n        return this._lines.getViewLineMinColumn(lineNumber);\n    }\n    getLineMaxColumn(lineNumber) {\n        return this._lines.getViewLineMaxColumn(lineNumber);\n    }\n    getLineFirstNonWhitespaceColumn(lineNumber) {\n        const result = firstNonWhitespaceIndex(this.getLineContent(lineNumber));\n        if (result === -1) {\n            return 0;\n        }\n        return result + 1;\n    }\n    getLineLastNonWhitespaceColumn(lineNumber) {\n        const result = lastNonWhitespaceIndex(this.getLineContent(lineNumber));\n        if (result === -1) {\n            return 0;\n        }\n        return result + 2;\n    }\n    getMinimapDecorationsInRange(range) {\n        return this._decorations.getMinimapDecorationsInRange(range);\n    }\n    getDecorationsInViewport(visibleRange) {\n        return this._decorations.getDecorationsViewportData(visibleRange).decorations;\n    }\n    getInjectedTextAt(viewPosition) {\n        return this._lines.getInjectedTextAt(viewPosition);\n    }\n    _getTextDirection(lineNumber, decorations) {\n        let rtlCount = 0;\n        for (const decoration of decorations) {\n            const range = decoration.range;\n            if (range.startLineNumber > lineNumber || range.endLineNumber < lineNumber) {\n                continue;\n            }\n            const textDirection = decoration.options.textDirection;\n            if (textDirection === TextDirection.RTL) {\n                rtlCount++;\n            }\n            else if (textDirection === TextDirection.LTR) {\n                rtlCount--;\n            }\n        }\n        return rtlCount > 0 ? TextDirection.RTL : TextDirection.LTR;\n    }\n    getTextDirection(lineNumber) {\n        const decorationsCollection = this._decorations.getDecorationsOnLine(lineNumber);\n        return this._getTextDirection(lineNumber, decorationsCollection.decorations);\n    }\n    getViewportViewLineRenderingData(visibleRange, lineNumber) {\n        const viewportDecorationsCollection = this._decorations.getDecorationsViewportData(visibleRange);\n        const inlineDecorations = viewportDecorationsCollection.inlineDecorations[lineNumber - visibleRange.startLineNumber];\n        return this._getViewLineRenderingData(lineNumber, inlineDecorations, viewportDecorationsCollection.hasVariableFonts, viewportDecorationsCollection.decorations);\n    }\n    getViewLineRenderingData(lineNumber) {\n        const decorationsCollection = this._decorations.getDecorationsOnLine(lineNumber);\n        return this._getViewLineRenderingData(lineNumber, decorationsCollection.inlineDecorations[0], decorationsCollection.hasVariableFonts, decorationsCollection.decorations);\n    }\n    _getViewLineRenderingData(lineNumber, inlineDecorations, hasVariableFonts, decorations) {\n        const mightContainRTL = this.model.mightContainRTL();\n        const mightContainNonBasicASCII = this.model.mightContainNonBasicASCII();\n        const tabSize = this.getTabSize();\n        const lineData = this._lines.getViewLineData(lineNumber);\n        if (lineData.inlineDecorations) {\n            inlineDecorations = [\n                ...inlineDecorations,\n                ...lineData.inlineDecorations.map(d => d.toInlineDecoration(lineNumber))\n            ];\n        }\n        return new ViewLineRenderingData(lineData.minColumn, lineData.maxColumn, lineData.content, lineData.continuesWithWrappedLine, mightContainRTL, mightContainNonBasicASCII, lineData.tokens, inlineDecorations, tabSize, lineData.startVisibleColumn, this._getTextDirection(lineNumber, decorations), hasVariableFonts);\n    }\n    getViewLineData(lineNumber) {\n        return this._lines.getViewLineData(lineNumber);\n    }\n    getMinimapLinesRenderingData(startLineNumber, endLineNumber, needed) {\n        const result = this._lines.getViewLinesData(startLineNumber, endLineNumber, needed);\n        return new MinimapLinesRenderingData(this.getTabSize(), result);\n    }\n    getAllOverviewRulerDecorations(theme) {\n        const decorations = this.model.getOverviewRulerDecorations(this._editorId, filterValidationDecorations(this._configuration.options), filterFontDecorations(this._configuration.options));\n        const result = new OverviewRulerDecorations();\n        for (const decoration of decorations) {\n            const decorationOptions = decoration.options;\n            const opts = decorationOptions.overviewRuler;\n            if (!opts) {\n                continue;\n            }\n            const lane = opts.position;\n            if (lane === 0) {\n                continue;\n            }\n            const color = opts.getColor(theme.value);\n            const viewStartLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration.range.startLineNumber, decoration.range.startColumn);\n            const viewEndLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration.range.endLineNumber, decoration.range.endColumn);\n            result.accept(color, decorationOptions.zIndex, viewStartLineNumber, viewEndLineNumber, lane);\n        }\n        return result.asArray;\n    }\n    _invalidateDecorationsColorCache() {\n        const decorations = this.model.getOverviewRulerDecorations();\n        for (const decoration of decorations) {\n            const opts1 = decoration.options.overviewRuler;\n            opts1?.invalidateCachedColor();\n            const opts2 = decoration.options.minimap;\n            opts2?.invalidateCachedColor();\n        }\n    }\n    getValueInRange(range, eol) {\n        const modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range);\n        return this.model.getValueInRange(modelRange, eol);\n    }\n    getValueLengthInRange(range, eol) {\n        const modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range);\n        return this.model.getValueLengthInRange(modelRange, eol);\n    }\n    modifyPosition(position, offset) {\n        const modelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(position);\n        const resultModelPosition = this.model.modifyPosition(modelPosition, offset);\n        return this.coordinatesConverter.convertModelPositionToViewPosition(resultModelPosition);\n    }\n    deduceModelPositionRelativeToViewPosition(viewAnchorPosition, deltaOffset, lineFeedCnt) {\n        const modelAnchor = this.coordinatesConverter.convertViewPositionToModelPosition(viewAnchorPosition);\n        if (this.model.getEOL().length === 2) {\n            // This model uses CRLF, so the delta must take that into account\n            if (deltaOffset < 0) {\n                deltaOffset -= lineFeedCnt;\n            }\n            else {\n                deltaOffset += lineFeedCnt;\n            }\n        }\n        const modelAnchorOffset = this.model.getOffsetAt(modelAnchor);\n        const resultOffset = modelAnchorOffset + deltaOffset;\n        return this.model.getPositionAt(resultOffset);\n    }\n    getPlainTextToCopy(modelRanges, emptySelectionClipboard, forceCRLF) {\n        const newLineCharacter = forceCRLF ? '\\r\\n' : this.model.getEOL();\n        modelRanges = modelRanges.slice(0);\n        modelRanges.sort(Range.compareRangesUsingStarts);\n        let hasEmptyRange = false;\n        let hasNonEmptyRange = false;\n        for (const range of modelRanges) {\n            if (range.isEmpty()) {\n                hasEmptyRange = true;\n            }\n            else {\n                hasNonEmptyRange = true;\n            }\n        }\n        if (!hasNonEmptyRange) {\n            // all ranges are empty\n            if (!emptySelectionClipboard) {\n                return '';\n            }\n            const modelLineNumbers = modelRanges.map((r) => r.startLineNumber);\n            let result = '';\n            for (let i = 0; i < modelLineNumbers.length; i++) {\n                if (i > 0 && modelLineNumbers[i - 1] === modelLineNumbers[i]) {\n                    continue;\n                }\n                result += this.model.getLineContent(modelLineNumbers[i]) + newLineCharacter;\n            }\n            return result;\n        }\n        if (hasEmptyRange && emptySelectionClipboard) {\n            // mixed empty selections and non-empty selections\n            const result = [];\n            let prevModelLineNumber = 0;\n            for (const modelRange of modelRanges) {\n                const modelLineNumber = modelRange.startLineNumber;\n                if (modelRange.isEmpty()) {\n                    if (modelLineNumber !== prevModelLineNumber) {\n                        result.push(this.model.getLineContent(modelLineNumber));\n                    }\n                }\n                else {\n                    result.push(this.model.getValueInRange(modelRange, forceCRLF ? 2 /* EndOfLinePreference.CRLF */ : 0 /* EndOfLinePreference.TextDefined */));\n                }\n                prevModelLineNumber = modelLineNumber;\n            }\n            return result.length === 1 ? result[0] : result;\n        }\n        const result = [];\n        for (const modelRange of modelRanges) {\n            if (!modelRange.isEmpty()) {\n                result.push(this.model.getValueInRange(modelRange, forceCRLF ? 2 /* EndOfLinePreference.CRLF */ : 0 /* EndOfLinePreference.TextDefined */));\n            }\n        }\n        return result.length === 1 ? result[0] : result;\n    }\n    getRichTextToCopy(modelRanges, emptySelectionClipboard) {\n        const languageId = this.model.getLanguageId();\n        if (languageId === PLAINTEXT_LANGUAGE_ID) {\n            return null;\n        }\n        if (modelRanges.length !== 1) {\n            // no multiple selection support at this time\n            return null;\n        }\n        let range = modelRanges[0];\n        if (range.isEmpty()) {\n            if (!emptySelectionClipboard) {\n                // nothing to copy\n                return null;\n            }\n            const lineNumber = range.startLineNumber;\n            range = new Range(lineNumber, this.model.getLineMinColumn(lineNumber), lineNumber, this.model.getLineMaxColumn(lineNumber));\n        }\n        const fontInfo = this._configuration.options.get(59 /* EditorOption.fontInfo */);\n        const colorMap = this._getColorMap();\n        const hasBadChars = (/[:;\\\\\\/<>]/.test(fontInfo.fontFamily));\n        const useDefaultFontFamily = (hasBadChars || fontInfo.fontFamily === EDITOR_FONT_DEFAULTS.fontFamily);\n        let fontFamily;\n        if (useDefaultFontFamily) {\n            fontFamily = EDITOR_FONT_DEFAULTS.fontFamily;\n        }\n        else {\n            fontFamily = fontInfo.fontFamily;\n            fontFamily = fontFamily.replace(/\"/g, '\\'');\n            const hasQuotesOrIsList = /[,']/.test(fontFamily);\n            if (!hasQuotesOrIsList) {\n                const needsQuotes = /[+ ]/.test(fontFamily);\n                if (needsQuotes) {\n                    fontFamily = `'${fontFamily}'`;\n                }\n            }\n            fontFamily = `${fontFamily}, ${EDITOR_FONT_DEFAULTS.fontFamily}`;\n        }\n        return {\n            mode: languageId,\n            html: (`<div style=\"`\n                + `color: ${colorMap[1 /* ColorId.DefaultForeground */]};`\n                + `background-color: ${colorMap[2 /* ColorId.DefaultBackground */]};`\n                + `font-family: ${fontFamily};`\n                + `font-weight: ${fontInfo.fontWeight};`\n                + `font-size: ${fontInfo.fontSize}px;`\n                + `line-height: ${fontInfo.lineHeight}px;`\n                + `white-space: pre;`\n                + `\">`\n                + this._getHTMLToCopy(range, colorMap)\n                + '</div>')\n        };\n    }\n    _getHTMLToCopy(modelRange, colorMap) {\n        const startLineNumber = modelRange.startLineNumber;\n        const startColumn = modelRange.startColumn;\n        const endLineNumber = modelRange.endLineNumber;\n        const endColumn = modelRange.endColumn;\n        const tabSize = this.getTabSize();\n        let result = '';\n        for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n            const lineTokens = this.model.tokenization.getLineTokens(lineNumber);\n            const lineContent = lineTokens.getLineContent();\n            const startOffset = (lineNumber === startLineNumber ? startColumn - 1 : 0);\n            const endOffset = (lineNumber === endLineNumber ? endColumn - 1 : lineContent.length);\n            if (lineContent === '') {\n                result += '<br>';\n            }\n            else {\n                result += tokenizeLineToHTML(lineContent, lineTokens.inflate(), colorMap, startOffset, endOffset, tabSize, isWindows);\n            }\n        }\n        return result;\n    }\n    _getColorMap() {\n        const colorMap = TokenizationRegistry.getColorMap();\n        const result = ['#000000'];\n        if (colorMap) {\n            for (let i = 1, len = colorMap.length; i < len; i++) {\n                result[i] = Color.Format.CSS.formatHex(colorMap[i]);\n            }\n        }\n        return result;\n    }\n    //#region cursor operations\n    getPrimaryCursorState() {\n        return this._cursor.getPrimaryCursorState();\n    }\n    getLastAddedCursorIndex() {\n        return this._cursor.getLastAddedCursorIndex();\n    }\n    getCursorStates() {\n        return this._cursor.getCursorStates();\n    }\n    setCursorStates(source, reason, states) {\n        return this._withViewEventsCollector(eventsCollector => this._cursor.setStates(eventsCollector, source, reason, states));\n    }\n    getCursorColumnSelectData() {\n        return this._cursor.getCursorColumnSelectData();\n    }\n    getCursorAutoClosedCharacters() {\n        return this._cursor.getAutoClosedCharacters();\n    }\n    setCursorColumnSelectData(columnSelectData) {\n        this._cursor.setCursorColumnSelectData(columnSelectData);\n    }\n    getPrevEditOperationType() {\n        return this._cursor.getPrevEditOperationType();\n    }\n    setPrevEditOperationType(type) {\n        this._cursor.setPrevEditOperationType(type);\n    }\n    getSelection() {\n        return this._cursor.getSelection();\n    }\n    getSelections() {\n        return this._cursor.getSelections();\n    }\n    getPosition() {\n        return this._cursor.getPrimaryCursorState().modelState.position;\n    }\n    setSelections(source, selections, reason = 0 /* CursorChangeReason.NotSet */) {\n        this._withViewEventsCollector(eventsCollector => this._cursor.setSelections(eventsCollector, source, selections, reason));\n    }\n    saveCursorState() {\n        return this._cursor.saveState();\n    }\n    restoreCursorState(states) {\n        this._withViewEventsCollector(eventsCollector => this._cursor.restoreState(eventsCollector, states));\n    }\n    _executeCursorEdit(callback) {\n        if (this._cursor.context.cursorConfig.readOnly) {\n            // we cannot edit when read only...\n            this._eventDispatcher.emitOutgoingEvent(new ReadOnlyEditAttemptEvent());\n            return;\n        }\n        this._withViewEventsCollector(callback);\n    }\n    executeEdits(source, edits, cursorStateComputer, reason) {\n        this._executeCursorEdit(eventsCollector => this._cursor.executeEdits(eventsCollector, source, edits, cursorStateComputer, reason));\n    }\n    startComposition() {\n        this._executeCursorEdit(eventsCollector => this._cursor.startComposition(eventsCollector));\n    }\n    endComposition(source) {\n        this._executeCursorEdit(eventsCollector => this._cursor.endComposition(eventsCollector, source));\n    }\n    type(text, source) {\n        this._executeCursorEdit(eventsCollector => this._cursor.type(eventsCollector, text, source));\n    }\n    compositionType(text, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source) {\n        this._executeCursorEdit(eventsCollector => this._cursor.compositionType(eventsCollector, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source));\n    }\n    paste(text, pasteOnNewLine, multicursorText, source) {\n        this._executeCursorEdit(eventsCollector => this._cursor.paste(eventsCollector, text, pasteOnNewLine, multicursorText, source));\n    }\n    cut(source) {\n        this._executeCursorEdit(eventsCollector => this._cursor.cut(eventsCollector, source));\n    }\n    executeCommand(command, source) {\n        this._executeCursorEdit(eventsCollector => this._cursor.executeCommand(eventsCollector, command, source));\n    }\n    executeCommands(commands, source) {\n        this._executeCursorEdit(eventsCollector => this._cursor.executeCommands(eventsCollector, commands, source));\n    }\n    revealAllCursors(source, revealHorizontal, minimalReveal = false) {\n        this._withViewEventsCollector(eventsCollector => this._cursor.revealAll(eventsCollector, source, minimalReveal, 0 /* viewEvents.VerticalRevealType.Simple */, revealHorizontal, 0 /* ScrollType.Smooth */));\n    }\n    revealPrimaryCursor(source, revealHorizontal, minimalReveal = false) {\n        this._withViewEventsCollector(eventsCollector => this._cursor.revealPrimary(eventsCollector, source, minimalReveal, 0 /* viewEvents.VerticalRevealType.Simple */, revealHorizontal, 0 /* ScrollType.Smooth */));\n    }\n    revealTopMostCursor(source) {\n        const viewPosition = this._cursor.getTopMostViewPosition();\n        const viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column);\n        this._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new ViewRevealRangeRequestEvent(source, false, viewRange, null, 0 /* viewEvents.VerticalRevealType.Simple */, true, 0 /* ScrollType.Smooth */)));\n    }\n    revealBottomMostCursor(source) {\n        const viewPosition = this._cursor.getBottomMostViewPosition();\n        const viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column);\n        this._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new ViewRevealRangeRequestEvent(source, false, viewRange, null, 0 /* viewEvents.VerticalRevealType.Simple */, true, 0 /* ScrollType.Smooth */)));\n    }\n    revealRange(source, revealHorizontal, viewRange, verticalType, scrollType) {\n        this._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new ViewRevealRangeRequestEvent(source, false, viewRange, null, verticalType, revealHorizontal, scrollType)));\n    }\n    //#endregion\n    //#region viewLayout\n    changeWhitespace(callback) {\n        const hadAChange = this.viewLayout.changeWhitespace(callback);\n        if (hadAChange) {\n            this._eventDispatcher.emitSingleViewEvent(new ViewZonesChangedEvent());\n            this._eventDispatcher.emitOutgoingEvent(new ViewZonesChangedEvent$1());\n        }\n    }\n    //#endregion\n    _withViewEventsCollector(callback) {\n        return this._transactionalTarget.batchChanges(() => {\n            try {\n                const eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n                return callback(eventsCollector);\n            }\n            finally {\n                this._eventDispatcher.endEmitViewEvents();\n            }\n        });\n    }\n    batchEvents(callback) {\n        this._withViewEventsCollector(() => { callback(); });\n    }\n    normalizePosition(position, affinity) {\n        return this._lines.normalizePosition(position, affinity);\n    }\n    /**\n     * Gets the column at which indentation stops at a given line.\n     * @internal\n    */\n    getLineIndentColumn(lineNumber) {\n        return this._lines.getLineIndentColumn(lineNumber);\n    }\n}\nclass ViewportStart {\n    static create(model) {\n        const viewportStartLineTrackedRange = model._setTrackedRange(null, new Range(1, 1, 1, 1), 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */);\n        return new ViewportStart(model, 1, false, viewportStartLineTrackedRange, 0);\n    }\n    get viewLineNumber() {\n        return this._viewLineNumber;\n    }\n    get isValid() {\n        return this._isValid;\n    }\n    get modelTrackedRange() {\n        return this._modelTrackedRange;\n    }\n    get startLineDelta() {\n        return this._startLineDelta;\n    }\n    constructor(_model, _viewLineNumber, _isValid, _modelTrackedRange, _startLineDelta) {\n        this._model = _model;\n        this._viewLineNumber = _viewLineNumber;\n        this._isValid = _isValid;\n        this._modelTrackedRange = _modelTrackedRange;\n        this._startLineDelta = _startLineDelta;\n    }\n    dispose() {\n        this._model._setTrackedRange(this._modelTrackedRange, null, 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */);\n    }\n    update(viewModel, startLineNumber) {\n        const position = viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(startLineNumber, viewModel.getLineMinColumn(startLineNumber)));\n        const viewportStartLineTrackedRange = viewModel.model._setTrackedRange(this._modelTrackedRange, new Range(position.lineNumber, position.column, position.lineNumber, position.column), 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */);\n        const viewportStartLineTop = viewModel.viewLayout.getVerticalOffsetForLineNumber(startLineNumber);\n        const scrollTop = viewModel.viewLayout.getCurrentScrollTop();\n        this._viewLineNumber = startLineNumber;\n        this._isValid = true;\n        this._modelTrackedRange = viewportStartLineTrackedRange;\n        this._startLineDelta = scrollTop - viewportStartLineTop;\n    }\n    invalidate() {\n        this._isValid = false;\n    }\n}\nclass OverviewRulerDecorations {\n    constructor() {\n        this._asMap = Object.create(null);\n        this.asArray = [];\n    }\n    accept(color, zIndex, startLineNumber, endLineNumber, lane) {\n        const prevGroup = this._asMap[color];\n        if (prevGroup) {\n            const prevData = prevGroup.data;\n            const prevLane = prevData[prevData.length - 3];\n            const prevEndLineNumber = prevData[prevData.length - 1];\n            if (prevLane === lane && prevEndLineNumber + 1 >= startLineNumber) {\n                // merge into prev\n                if (endLineNumber > prevEndLineNumber) {\n                    prevData[prevData.length - 1] = endLineNumber;\n                }\n                return;\n            }\n            // push\n            prevData.push(lane, startLineNumber, endLineNumber);\n        }\n        else {\n            const group = new OverviewRulerDecorationsGroup(color, zIndex, [lane, startLineNumber, endLineNumber]);\n            this._asMap[color] = group;\n            this.asArray.push(group);\n        }\n    }\n}\nclass HiddenAreasModel {\n    constructor() {\n        this.hiddenAreas = new Map();\n        this.shouldRecompute = false;\n        this.ranges = [];\n    }\n    setHiddenAreas(source, ranges) {\n        const existing = this.hiddenAreas.get(source);\n        if (existing && rangeArraysEqual(existing, ranges)) {\n            return;\n        }\n        this.hiddenAreas.set(source, ranges);\n        this.shouldRecompute = true;\n    }\n    /**\n     * The returned array is immutable.\n    */\n    getMergedRanges() {\n        if (!this.shouldRecompute) {\n            return this.ranges;\n        }\n        this.shouldRecompute = false;\n        const newRanges = Array.from(this.hiddenAreas.values()).reduce((r, hiddenAreas) => mergeLineRangeArray(r, hiddenAreas), []);\n        if (rangeArraysEqual(this.ranges, newRanges)) {\n            return this.ranges;\n        }\n        this.ranges = newRanges;\n        return this.ranges;\n    }\n}\nfunction mergeLineRangeArray(arr1, arr2) {\n    const result = [];\n    let i = 0;\n    let j = 0;\n    while (i < arr1.length && j < arr2.length) {\n        const item1 = arr1[i];\n        const item2 = arr2[j];\n        if (item1.endLineNumber < item2.startLineNumber - 1) {\n            result.push(arr1[i++]);\n        }\n        else if (item2.endLineNumber < item1.startLineNumber - 1) {\n            result.push(arr2[j++]);\n        }\n        else {\n            const startLineNumber = Math.min(item1.startLineNumber, item2.startLineNumber);\n            const endLineNumber = Math.max(item1.endLineNumber, item2.endLineNumber);\n            result.push(new Range(startLineNumber, 1, endLineNumber, 1));\n            i++;\n            j++;\n        }\n    }\n    while (i < arr1.length) {\n        result.push(arr1[i++]);\n    }\n    while (j < arr2.length) {\n        result.push(arr2[j++]);\n    }\n    return result;\n}\nfunction rangeArraysEqual(arr1, arr2) {\n    if (arr1.length !== arr2.length) {\n        return false;\n    }\n    for (let i = 0; i < arr1.length; i++) {\n        if (!arr1[i].equalsRange(arr2[i])) {\n            return false;\n        }\n    }\n    return true;\n}\n/**\n * Maintain a stable viewport by trying to keep the first line in the viewport constant.\n */\nclass StableViewport {\n    constructor(viewportStartModelPosition, startLineDelta) {\n        this.viewportStartModelPosition = viewportStartModelPosition;\n        this.startLineDelta = startLineDelta;\n    }\n    recoverViewportStart(coordinatesConverter, viewLayout) {\n        if (!this.viewportStartModelPosition) {\n            return;\n        }\n        const viewPosition = coordinatesConverter.convertModelPositionToViewPosition(this.viewportStartModelPosition);\n        const viewPositionTop = viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber);\n        viewLayout.setScrollPosition({ scrollTop: viewPositionTop + this.startLineDelta }, 1 /* ScrollType.Immediate */);\n    }\n}\n\nexport { ViewModel };\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 *--------------------------------------------------------------------------------------------*/\nclass ServiceCollection {\n    constructor(...entries) {\n        this._entries = new Map();\n        for (const [id, service] of entries) {\n            this.set(id, service);\n        }\n    }\n    set(id, instanceOrDescriptor) {\n        const result = this._entries.get(id);\n        this._entries.set(id, instanceOrDescriptor);\n        return result;\n    }\n    get(id) {\n        return this._entries.get(id);\n    }\n}\n\nexport { ServiceCollection };\n","import '../../services/markerDecorations.js';\nimport { DragAndDropObserver, getWindow, scheduleAtNextAnimationFrame } from '../../../../base/browser/dom.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { createEventDeliveryQueue, Emitter } from '../../../../base/common/event.js';\nimport { Disposable, dispose } from '../../../../base/common/lifecycle.js';\nimport { Schemas } from '../../../../base/common/network.js';\nimport './editor.css';\nimport { applyFontInfo } from '../../config/domFontInfo.js';\nimport { EditorConfiguration } from '../../config/editorConfiguration.js';\nimport { TabFocus } from '../../config/tabFocus.js';\nimport { EditorExtensionsRegistry } from '../../editorExtensions.js';\nimport { ICodeEditorService } from '../../services/codeEditorService.js';\nimport { View } from '../../view.js';\nimport { DOMLineBreaksComputerFactory } from '../../view/domLineBreaksComputer.js';\nimport { ViewUserInputEvents } from '../../view/viewUserInputEvents.js';\nimport { CodeEditorContributions } from './codeEditorContributions.js';\nimport { filterValidationDecorations, filterFontDecorations } from '../../../common/config/editorOptions.js';\nimport { CursorColumns } from '../../../common/core/cursorColumns.js';\nimport { editorUnnecessaryCodeOpacity } from '../../../common/core/editorColorRegistry.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { WordOperations } from '../../../common/cursor/cursorWordOperations.js';\nimport { InternalEditorAction } from '../../../common/editorAction.js';\nimport { EditorType } from '../../../common/editorCommon.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { MonospaceLineBreaksComputerFactory } from '../../../common/viewModel/monospaceLineBreaksComputer.js';\nimport { ViewModel } from '../../../common/viewModel/viewModelImpl.js';\nimport { localize } from '../../../../nls.js';\nimport { IAccessibilityService } from '../../../../platform/accessibility/common/accessibility.js';\nimport { ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { ServiceCollection } from '../../../../platform/instantiation/common/serviceCollection.js';\nimport { Severity, INotificationService } from '../../../../platform/notification/common/notification.js';\nimport '../../../../platform/theme/common/colorUtils.js';\nimport '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorErrorForeground, editorWarningForeground, editorInfoForeground, editorHintForeground } from '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { IThemeService, registerThemingParticipant } from '../../../../platform/theme/common/themeService.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { TextModelEditSource, EditSources } from '../../../common/textModelEditSource.js';\nimport { isObject } from '../../../../base/common/types.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar CodeEditorWidget_1;\nlet CodeEditorWidget = class CodeEditorWidget extends Disposable {\n    static { CodeEditorWidget_1 = this; }\n    static { this.dropIntoEditorDecorationOptions = ModelDecorationOptions.register({\n        description: 'workbench-dnd-target',\n        className: 'dnd-target'\n    }); }\n    //#endregion\n    get isSimpleWidget() {\n        return this._configuration.isSimpleWidget;\n    }\n    get contextMenuId() {\n        return this._configuration.contextMenuId;\n    }\n    get contextKeyService() { return this._contextKeyService; }\n    constructor(domElement, _options, codeEditorWidgetOptions, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService) {\n        super();\n        this.languageConfigurationService = languageConfigurationService;\n        //#region Eventing\n        this._deliveryQueue = createEventDeliveryQueue();\n        this._contributions = this._register(new CodeEditorContributions());\n        this._onDidDispose = this._register(new Emitter());\n        this.onDidDispose = this._onDidDispose.event;\n        this._onDidChangeModelContent = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidChangeModelContent = this._onDidChangeModelContent.event;\n        this._onDidChangeModelLanguage = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidChangeModelLanguage = this._onDidChangeModelLanguage.event;\n        this._onDidChangeModelLanguageConfiguration = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidChangeModelLanguageConfiguration = this._onDidChangeModelLanguageConfiguration.event;\n        this._onDidChangeModelOptions = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidChangeModelOptions = this._onDidChangeModelOptions.event;\n        this._onDidChangeModelDecorations = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidChangeModelDecorations = this._onDidChangeModelDecorations.event;\n        this._onDidChangeLineHeight = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidChangeLineHeight = this._onDidChangeLineHeight.event;\n        this._onDidChangeFont = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidChangeFont = this._onDidChangeFont.event;\n        this._onDidChangeModelTokens = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidChangeModelTokens = this._onDidChangeModelTokens.event;\n        this._onDidChangeConfiguration = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidChangeConfiguration = this._onDidChangeConfiguration.event;\n        this._onWillChangeModel = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onWillChangeModel = this._onWillChangeModel.event;\n        this._onDidChangeModel = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidChangeModel = this._onDidChangeModel.event;\n        this._onDidChangeCursorPosition = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidChangeCursorPosition = this._onDidChangeCursorPosition.event;\n        this._onDidChangeCursorSelection = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidChangeCursorSelection = this._onDidChangeCursorSelection.event;\n        this._onDidAttemptReadOnlyEdit = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onDidAttemptReadOnlyEdit = this._onDidAttemptReadOnlyEdit.event;\n        this._onDidLayoutChange = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidLayoutChange = this._onDidLayoutChange.event;\n        this._editorTextFocus = this._register(new BooleanEventEmitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidFocusEditorText = this._editorTextFocus.onDidChangeToTrue;\n        this.onDidBlurEditorText = this._editorTextFocus.onDidChangeToFalse;\n        this._editorWidgetFocus = this._register(new BooleanEventEmitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidFocusEditorWidget = this._editorWidgetFocus.onDidChangeToTrue;\n        this.onDidBlurEditorWidget = this._editorWidgetFocus.onDidChangeToFalse;\n        this._onWillType = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onWillType = this._onWillType.event;\n        this._onDidType = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onDidType = this._onDidType.event;\n        this._onDidCompositionStart = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onDidCompositionStart = this._onDidCompositionStart.event;\n        this._onDidCompositionEnd = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onDidCompositionEnd = this._onDidCompositionEnd.event;\n        this._onDidPaste = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onDidPaste = this._onDidPaste.event;\n        this._onMouseUp = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onMouseUp = this._onMouseUp.event;\n        this._onMouseDown = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onMouseDown = this._onMouseDown.event;\n        this._onMouseDrag = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onMouseDrag = this._onMouseDrag.event;\n        this._onMouseDrop = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onMouseDrop = this._onMouseDrop.event;\n        this._onMouseDropCanceled = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onMouseDropCanceled = this._onMouseDropCanceled.event;\n        this._onDropIntoEditor = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onDropIntoEditor = this._onDropIntoEditor.event;\n        this._onContextMenu = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onContextMenu = this._onContextMenu.event;\n        this._onMouseMove = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onMouseMove = this._onMouseMove.event;\n        this._onMouseLeave = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onMouseLeave = this._onMouseLeave.event;\n        this._onMouseWheel = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onMouseWheel = this._onMouseWheel.event;\n        this._onKeyUp = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onKeyUp = this._onKeyUp.event;\n        this._onKeyDown = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));\n        this.onKeyDown = this._onKeyDown.event;\n        this._onDidContentSizeChange = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidContentSizeChange = this._onDidContentSizeChange.event;\n        this._onDidScrollChange = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidScrollChange = this._onDidScrollChange.event;\n        this._onDidChangeViewZones = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidChangeViewZones = this._onDidChangeViewZones.event;\n        this._onDidChangeHiddenAreas = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));\n        this.onDidChangeHiddenAreas = this._onDidChangeHiddenAreas.event;\n        this._updateCounter = 0;\n        this._onWillTriggerEditorOperationEvent = this._register(new Emitter());\n        this._onBeginUpdate = this._register(new Emitter());\n        this.onBeginUpdate = this._onBeginUpdate.event;\n        this._onEndUpdate = this._register(new Emitter());\n        this.onEndUpdate = this._onEndUpdate.event;\n        this._onBeforeExecuteEdit = this._register(new Emitter());\n        this.onBeforeExecuteEdit = this._onBeforeExecuteEdit.event;\n        this._actions = new Map();\n        this._bannerDomNode = null;\n        this._dropIntoEditorDecorations = this.createDecorationsCollection();\n        this.inComposition = false;\n        codeEditorService.willCreateCodeEditor();\n        const options = { ..._options };\n        this._domElement = domElement;\n        this._overflowWidgetsDomNode = options.overflowWidgetsDomNode;\n        delete options.overflowWidgetsDomNode;\n        this._id = (++EDITOR_ID);\n        this._decorationTypeKeysToIds = {};\n        this._decorationTypeSubtypes = {};\n        this._telemetryData = codeEditorWidgetOptions.telemetryData;\n        this._configuration = this._register(this._createConfiguration(codeEditorWidgetOptions.isSimpleWidget || false, codeEditorWidgetOptions.contextMenuId ?? (codeEditorWidgetOptions.isSimpleWidget ? MenuId.SimpleEditorContext : MenuId.EditorContext), options, accessibilityService));\n        this._register(this._configuration.onDidChange((e) => {\n            this._onDidChangeConfiguration.fire(e);\n            const options = this._configuration.options;\n            if (e.hasChanged(165 /* EditorOption.layoutInfo */)) {\n                const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n                this._onDidLayoutChange.fire(layoutInfo);\n            }\n        }));\n        this._contextKeyService = this._register(contextKeyService.createScoped(this._domElement));\n        if (codeEditorWidgetOptions.contextKeyValues) {\n            for (const [key, value] of Object.entries(codeEditorWidgetOptions.contextKeyValues)) {\n                this._contextKeyService.createKey(key, value);\n            }\n        }\n        this._notificationService = notificationService;\n        this._codeEditorService = codeEditorService;\n        this._commandService = commandService;\n        this._themeService = themeService;\n        this._register(new EditorContextKeysManager(this, this._contextKeyService));\n        this._register(new EditorModeContext(this, this._contextKeyService, languageFeaturesService));\n        this._instantiationService = this._register(instantiationService.createChild(new ServiceCollection([IContextKeyService, this._contextKeyService])));\n        this._modelData = null;\n        this._contentWidgets = {};\n        this._overlayWidgets = {};\n        this._glyphMarginWidgets = {};\n        let contributions;\n        if (Array.isArray(codeEditorWidgetOptions.contributions)) {\n            contributions = codeEditorWidgetOptions.contributions;\n        }\n        else {\n            contributions = EditorExtensionsRegistry.getEditorContributions();\n        }\n        this._contributions.initialize(this, contributions, this._instantiationService);\n        for (const action of EditorExtensionsRegistry.getEditorActions()) {\n            if (this._actions.has(action.id)) {\n                onUnexpectedError(new Error(`Cannot have two actions with the same id ${action.id}`));\n                continue;\n            }\n            const internalAction = new InternalEditorAction(action.id, action.label, action.alias, action.metadata, action.precondition ?? undefined, (args) => {\n                return this._instantiationService.invokeFunction((accessor) => {\n                    return Promise.resolve(action.runEditorCommand(accessor, this, args));\n                });\n            }, this._contextKeyService);\n            this._actions.set(internalAction.id, internalAction);\n        }\n        const isDropIntoEnabled = () => {\n            return !this._configuration.options.get(104 /* EditorOption.readOnly */)\n                && this._configuration.options.get(43 /* EditorOption.dropIntoEditor */).enabled;\n        };\n        this._register(new DragAndDropObserver(this._domElement, {\n            onDragOver: e => {\n                if (!isDropIntoEnabled()) {\n                    return;\n                }\n                const target = this.getTargetAtClientPoint(e.clientX, e.clientY);\n                if (target?.position) {\n                    this.showDropIndicatorAt(target.position);\n                }\n            },\n            onDrop: async (e) => {\n                if (!isDropIntoEnabled()) {\n                    return;\n                }\n                this.removeDropIndicator();\n                if (!e.dataTransfer) {\n                    return;\n                }\n                const target = this.getTargetAtClientPoint(e.clientX, e.clientY);\n                if (target?.position) {\n                    this._onDropIntoEditor.fire({ position: target.position, event: e });\n                }\n            },\n            onDragLeave: () => {\n                this.removeDropIndicator();\n            },\n            onDragEnd: () => {\n                this.removeDropIndicator();\n            },\n        }));\n        this._codeEditorService.addCodeEditor(this);\n    }\n    writeScreenReaderContent(reason) {\n        this._modelData?.view.writeScreenReaderContent(reason);\n    }\n    _createConfiguration(isSimpleWidget, contextMenuId, options, accessibilityService) {\n        return new EditorConfiguration(isSimpleWidget, contextMenuId, options, this._domElement, accessibilityService);\n    }\n    getId() {\n        return this.getEditorType() + ':' + this._id;\n    }\n    getEditorType() {\n        return EditorType.ICodeEditor;\n    }\n    dispose() {\n        this._codeEditorService.removeCodeEditor(this);\n        this._actions.clear();\n        this._contentWidgets = {};\n        this._overlayWidgets = {};\n        this._removeDecorationTypes();\n        this._postDetachModelCleanup(this._detachModel());\n        this._onDidDispose.fire();\n        super.dispose();\n    }\n    invokeWithinContext(fn) {\n        return this._instantiationService.invokeFunction(fn);\n    }\n    updateOptions(newOptions) {\n        this._configuration.updateOptions(newOptions || {});\n    }\n    getOptions() {\n        return this._configuration.options;\n    }\n    getOption(id) {\n        return this._configuration.options.get(id);\n    }\n    getRawOptions() {\n        return this._configuration.getRawOptions();\n    }\n    getOverflowWidgetsDomNode() {\n        return this._overflowWidgetsDomNode;\n    }\n    getConfiguredWordAtPosition(position) {\n        if (!this._modelData) {\n            return null;\n        }\n        return WordOperations.getWordAtPosition(this._modelData.model, this._configuration.options.get(148 /* EditorOption.wordSeparators */), this._configuration.options.get(147 /* EditorOption.wordSegmenterLocales */), position);\n    }\n    getValue(options = null) {\n        if (!this._modelData) {\n            return '';\n        }\n        const preserveBOM = (options && options.preserveBOM) ? true : false;\n        let eolPreference = 0 /* EndOfLinePreference.TextDefined */;\n        if (options && options.lineEnding && options.lineEnding === '\\n') {\n            eolPreference = 1 /* EndOfLinePreference.LF */;\n        }\n        else if (options && options.lineEnding && options.lineEnding === '\\r\\n') {\n            eolPreference = 2 /* EndOfLinePreference.CRLF */;\n        }\n        return this._modelData.model.getValue(eolPreference, preserveBOM);\n    }\n    setValue(newValue) {\n        try {\n            this._beginUpdate();\n            if (!this._modelData) {\n                return;\n            }\n            this._modelData.model.setValue(newValue);\n        }\n        finally {\n            this._endUpdate();\n        }\n    }\n    getModel() {\n        if (!this._modelData) {\n            return null;\n        }\n        return this._modelData.model;\n    }\n    setModel(_model = null) {\n        try {\n            this._beginUpdate();\n            const model = _model;\n            if (this._modelData === null && model === null) {\n                // Current model is the new model\n                return;\n            }\n            if (this._modelData && this._modelData.model === model) {\n                // Current model is the new model\n                return;\n            }\n            const e = {\n                oldModelUrl: this._modelData?.model.uri || null,\n                newModelUrl: model?.uri || null\n            };\n            this._onWillChangeModel.fire(e);\n            const hasTextFocus = this.hasTextFocus();\n            const detachedModel = this._detachModel();\n            this._attachModel(model);\n            if (this.hasModel()) {\n                // we have a new model (with a new view)!\n                if (hasTextFocus) {\n                    this.focus();\n                }\n            }\n            else {\n                // we have no model (and no view) anymore\n                // make sure the outside world knows we are not focused\n                this._editorTextFocus.setValue(false);\n                this._editorWidgetFocus.setValue(false);\n            }\n            this._removeDecorationTypes();\n            this._onDidChangeModel.fire(e);\n            this._postDetachModelCleanup(detachedModel);\n            this._contributionsDisposable = this._contributions.onAfterModelAttached();\n        }\n        finally {\n            this._endUpdate();\n        }\n    }\n    _removeDecorationTypes() {\n        this._decorationTypeKeysToIds = {};\n        if (this._decorationTypeSubtypes) {\n            for (const decorationType in this._decorationTypeSubtypes) {\n                const subTypes = this._decorationTypeSubtypes[decorationType];\n                for (const subType in subTypes) {\n                    this._removeDecorationType(decorationType + '-' + subType);\n                }\n            }\n            this._decorationTypeSubtypes = {};\n        }\n    }\n    getVisibleRanges() {\n        if (!this._modelData) {\n            return [];\n        }\n        return this._modelData.viewModel.getVisibleRanges();\n    }\n    getVisibleRangesPlusViewportAboveBelow() {\n        if (!this._modelData) {\n            return [];\n        }\n        return this._modelData.viewModel.getVisibleRangesPlusViewportAboveBelow();\n    }\n    getWhitespaces() {\n        if (!this._modelData) {\n            return [];\n        }\n        return this._modelData.viewModel.viewLayout.getWhitespaces();\n    }\n    static _getVerticalOffsetAfterPosition(modelData, modelLineNumber, modelColumn, includeViewZones) {\n        const modelPosition = modelData.model.validatePosition({\n            lineNumber: modelLineNumber,\n            column: modelColumn\n        });\n        const viewPosition = modelData.viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition);\n        return modelData.viewModel.viewLayout.getVerticalOffsetAfterLineNumber(viewPosition.lineNumber, includeViewZones);\n    }\n    getTopForLineNumber(lineNumber, includeViewZones = false) {\n        if (!this._modelData) {\n            return -1;\n        }\n        return CodeEditorWidget_1._getVerticalOffsetForPosition(this._modelData, lineNumber, 1, includeViewZones);\n    }\n    getTopForPosition(lineNumber, column) {\n        if (!this._modelData) {\n            return -1;\n        }\n        return CodeEditorWidget_1._getVerticalOffsetForPosition(this._modelData, lineNumber, column, false);\n    }\n    static _getVerticalOffsetForPosition(modelData, modelLineNumber, modelColumn, includeViewZones = false) {\n        const modelPosition = modelData.model.validatePosition({\n            lineNumber: modelLineNumber,\n            column: modelColumn\n        });\n        const viewPosition = modelData.viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition);\n        return modelData.viewModel.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber, includeViewZones);\n    }\n    getBottomForLineNumber(lineNumber, includeViewZones = false) {\n        if (!this._modelData) {\n            return -1;\n        }\n        const maxCol = this._modelData.model.getLineMaxColumn(lineNumber);\n        return CodeEditorWidget_1._getVerticalOffsetAfterPosition(this._modelData, lineNumber, maxCol, includeViewZones);\n    }\n    getLineHeightForPosition(position) {\n        if (!this._modelData) {\n            return -1;\n        }\n        const viewModel = this._modelData.viewModel;\n        const coordinatesConverter = viewModel.coordinatesConverter;\n        const pos = Position.lift(position);\n        if (coordinatesConverter.modelPositionIsVisible(pos)) {\n            const viewPosition = coordinatesConverter.convertModelPositionToViewPosition(pos);\n            return viewModel.viewLayout.getLineHeightForLineNumber(viewPosition.lineNumber);\n        }\n        return 0;\n    }\n    setHiddenAreas(ranges, source, forceUpdate) {\n        this._modelData?.viewModel.setHiddenAreas(ranges.map(r => Range.lift(r)), source, forceUpdate);\n    }\n    getVisibleColumnFromPosition(rawPosition) {\n        if (!this._modelData) {\n            return rawPosition.column;\n        }\n        const position = this._modelData.model.validatePosition(rawPosition);\n        const tabSize = this._modelData.model.getOptions().tabSize;\n        return CursorColumns.visibleColumnFromColumn(this._modelData.model.getLineContent(position.lineNumber), position.column, tabSize) + 1;\n    }\n    getPosition() {\n        if (!this._modelData) {\n            return null;\n        }\n        return this._modelData.viewModel.getPosition();\n    }\n    setPosition(position, source = 'api') {\n        if (!this._modelData) {\n            return;\n        }\n        if (!Position.isIPosition(position)) {\n            throw new Error('Invalid arguments');\n        }\n        this._modelData.viewModel.setSelections(source, [{\n                selectionStartLineNumber: position.lineNumber,\n                selectionStartColumn: position.column,\n                positionLineNumber: position.lineNumber,\n                positionColumn: position.column\n            }]);\n    }\n    _sendRevealRange(modelRange, verticalType, revealHorizontal, scrollType) {\n        if (!this._modelData) {\n            return;\n        }\n        if (!Range.isIRange(modelRange)) {\n            throw new Error('Invalid arguments');\n        }\n        const validatedModelRange = this._modelData.model.validateRange(modelRange);\n        const viewRange = this._modelData.viewModel.coordinatesConverter.convertModelRangeToViewRange(validatedModelRange);\n        this._modelData.viewModel.revealRange('api', revealHorizontal, viewRange, verticalType, scrollType);\n    }\n    revealLine(lineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealLine(lineNumber, 0 /* VerticalRevealType.Simple */, scrollType);\n    }\n    revealLineInCenter(lineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealLine(lineNumber, 1 /* VerticalRevealType.Center */, scrollType);\n    }\n    revealLineInCenterIfOutsideViewport(lineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealLine(lineNumber, 2 /* VerticalRevealType.CenterIfOutsideViewport */, scrollType);\n    }\n    revealLineNearTop(lineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealLine(lineNumber, 5 /* VerticalRevealType.NearTop */, scrollType);\n    }\n    _revealLine(lineNumber, revealType, scrollType) {\n        if (typeof lineNumber !== 'number') {\n            throw new Error('Invalid arguments');\n        }\n        this._sendRevealRange(new Range(lineNumber, 1, lineNumber, 1), revealType, false, scrollType);\n    }\n    revealPosition(position, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealPosition(position, 0 /* VerticalRevealType.Simple */, true, scrollType);\n    }\n    revealPositionInCenter(position, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealPosition(position, 1 /* VerticalRevealType.Center */, true, scrollType);\n    }\n    revealPositionInCenterIfOutsideViewport(position, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealPosition(position, 2 /* VerticalRevealType.CenterIfOutsideViewport */, true, scrollType);\n    }\n    revealPositionNearTop(position, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealPosition(position, 5 /* VerticalRevealType.NearTop */, true, scrollType);\n    }\n    _revealPosition(position, verticalType, revealHorizontal, scrollType) {\n        if (!Position.isIPosition(position)) {\n            throw new Error('Invalid arguments');\n        }\n        this._sendRevealRange(new Range(position.lineNumber, position.column, position.lineNumber, position.column), verticalType, revealHorizontal, scrollType);\n    }\n    getSelection() {\n        if (!this._modelData) {\n            return null;\n        }\n        return this._modelData.viewModel.getSelection();\n    }\n    getSelections() {\n        if (!this._modelData) {\n            return null;\n        }\n        return this._modelData.viewModel.getSelections();\n    }\n    setSelection(something, source = 'api') {\n        const isSelection = Selection.isISelection(something);\n        const isRange = Range.isIRange(something);\n        if (!isSelection && !isRange) {\n            throw new Error('Invalid arguments');\n        }\n        if (isSelection) {\n            this._setSelectionImpl(something, source);\n        }\n        else if (isRange) {\n            // act as if it was an IRange\n            const selection = {\n                selectionStartLineNumber: something.startLineNumber,\n                selectionStartColumn: something.startColumn,\n                positionLineNumber: something.endLineNumber,\n                positionColumn: something.endColumn\n            };\n            this._setSelectionImpl(selection, source);\n        }\n    }\n    _setSelectionImpl(sel, source) {\n        if (!this._modelData) {\n            return;\n        }\n        const selection = new Selection(sel.selectionStartLineNumber, sel.selectionStartColumn, sel.positionLineNumber, sel.positionColumn);\n        this._modelData.viewModel.setSelections(source, [selection]);\n    }\n    revealLines(startLineNumber, endLineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealLines(startLineNumber, endLineNumber, 0 /* VerticalRevealType.Simple */, scrollType);\n    }\n    revealLinesInCenter(startLineNumber, endLineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealLines(startLineNumber, endLineNumber, 1 /* VerticalRevealType.Center */, scrollType);\n    }\n    revealLinesInCenterIfOutsideViewport(startLineNumber, endLineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealLines(startLineNumber, endLineNumber, 2 /* VerticalRevealType.CenterIfOutsideViewport */, scrollType);\n    }\n    revealLinesNearTop(startLineNumber, endLineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealLines(startLineNumber, endLineNumber, 5 /* VerticalRevealType.NearTop */, scrollType);\n    }\n    _revealLines(startLineNumber, endLineNumber, verticalType, scrollType) {\n        if (typeof startLineNumber !== 'number' || typeof endLineNumber !== 'number') {\n            throw new Error('Invalid arguments');\n        }\n        this._sendRevealRange(new Range(startLineNumber, 1, endLineNumber, 1), verticalType, false, scrollType);\n    }\n    revealRange(range, scrollType = 0 /* editorCommon.ScrollType.Smooth */, revealVerticalInCenter = false, revealHorizontal = true) {\n        this._revealRange(range, revealVerticalInCenter ? 1 /* VerticalRevealType.Center */ : 0 /* VerticalRevealType.Simple */, revealHorizontal, scrollType);\n    }\n    revealRangeInCenter(range, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealRange(range, 1 /* VerticalRevealType.Center */, true, scrollType);\n    }\n    revealRangeInCenterIfOutsideViewport(range, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealRange(range, 2 /* VerticalRevealType.CenterIfOutsideViewport */, true, scrollType);\n    }\n    revealRangeNearTop(range, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealRange(range, 5 /* VerticalRevealType.NearTop */, true, scrollType);\n    }\n    revealRangeNearTopIfOutsideViewport(range, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealRange(range, 6 /* VerticalRevealType.NearTopIfOutsideViewport */, true, scrollType);\n    }\n    revealRangeAtTop(range, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {\n        this._revealRange(range, 3 /* VerticalRevealType.Top */, true, scrollType);\n    }\n    _revealRange(range, verticalType, revealHorizontal, scrollType) {\n        if (!Range.isIRange(range)) {\n            throw new Error('Invalid arguments');\n        }\n        this._sendRevealRange(Range.lift(range), verticalType, revealHorizontal, scrollType);\n    }\n    setSelections(ranges, source = 'api', reason = 0 /* CursorChangeReason.NotSet */) {\n        if (!this._modelData) {\n            return;\n        }\n        if (!ranges || ranges.length === 0) {\n            throw new Error('Invalid arguments');\n        }\n        for (let i = 0, len = ranges.length; i < len; i++) {\n            if (!Selection.isISelection(ranges[i])) {\n                throw new Error('Invalid arguments');\n            }\n        }\n        this._modelData.viewModel.setSelections(source, ranges, reason);\n    }\n    getContentWidth() {\n        if (!this._modelData) {\n            return -1;\n        }\n        return this._modelData.viewModel.viewLayout.getContentWidth();\n    }\n    getScrollWidth() {\n        if (!this._modelData) {\n            return -1;\n        }\n        return this._modelData.viewModel.viewLayout.getScrollWidth();\n    }\n    getScrollLeft() {\n        if (!this._modelData) {\n            return -1;\n        }\n        return this._modelData.viewModel.viewLayout.getCurrentScrollLeft();\n    }\n    getContentHeight() {\n        if (!this._modelData) {\n            return -1;\n        }\n        return this._modelData.viewModel.viewLayout.getContentHeight();\n    }\n    getScrollHeight() {\n        if (!this._modelData) {\n            return -1;\n        }\n        return this._modelData.viewModel.viewLayout.getScrollHeight();\n    }\n    getScrollTop() {\n        if (!this._modelData) {\n            return -1;\n        }\n        return this._modelData.viewModel.viewLayout.getCurrentScrollTop();\n    }\n    setScrollLeft(newScrollLeft, scrollType = 1 /* editorCommon.ScrollType.Immediate */) {\n        if (!this._modelData) {\n            return;\n        }\n        if (typeof newScrollLeft !== 'number') {\n            throw new Error('Invalid arguments');\n        }\n        this._modelData.viewModel.viewLayout.setScrollPosition({\n            scrollLeft: newScrollLeft\n        }, scrollType);\n    }\n    setScrollTop(newScrollTop, scrollType = 1 /* editorCommon.ScrollType.Immediate */) {\n        if (!this._modelData) {\n            return;\n        }\n        if (typeof newScrollTop !== 'number') {\n            throw new Error('Invalid arguments');\n        }\n        this._modelData.viewModel.viewLayout.setScrollPosition({\n            scrollTop: newScrollTop\n        }, scrollType);\n    }\n    setScrollPosition(position, scrollType = 1 /* editorCommon.ScrollType.Immediate */) {\n        if (!this._modelData) {\n            return;\n        }\n        this._modelData.viewModel.viewLayout.setScrollPosition(position, scrollType);\n    }\n    hasPendingScrollAnimation() {\n        if (!this._modelData) {\n            return false;\n        }\n        return this._modelData.viewModel.viewLayout.hasPendingScrollAnimation();\n    }\n    saveViewState() {\n        if (!this._modelData) {\n            return null;\n        }\n        const contributionsState = this._contributions.saveViewState();\n        const cursorState = this._modelData.viewModel.saveCursorState();\n        const viewState = this._modelData.viewModel.saveState();\n        return {\n            cursorState: cursorState,\n            viewState: viewState,\n            contributionsState: contributionsState\n        };\n    }\n    restoreViewState(s) {\n        if (!this._modelData || !this._modelData.hasRealView) {\n            return;\n        }\n        const codeEditorState = s;\n        if (codeEditorState && codeEditorState.cursorState && codeEditorState.viewState) {\n            const cursorState = codeEditorState.cursorState;\n            if (Array.isArray(cursorState)) {\n                if (cursorState.length > 0) {\n                    this._modelData.viewModel.restoreCursorState(cursorState);\n                }\n            }\n            else {\n                // Backwards compatibility\n                this._modelData.viewModel.restoreCursorState([cursorState]);\n            }\n            this._contributions.restoreViewState(codeEditorState.contributionsState || {});\n            const reducedState = this._modelData.viewModel.reduceRestoreState(codeEditorState.viewState);\n            this._modelData.view.restoreState(reducedState);\n        }\n    }\n    handleInitialized() {\n        this._getViewModel()?.visibleLinesStabilized();\n    }\n    getContribution(id) {\n        return this._contributions.get(id);\n    }\n    getActions() {\n        return Array.from(this._actions.values());\n    }\n    getSupportedActions() {\n        let result = this.getActions();\n        result = result.filter(action => action.isSupported());\n        return result;\n    }\n    getAction(id) {\n        return this._actions.get(id) || null;\n    }\n    trigger(source, handlerId, payload) {\n        payload = payload || {};\n        try {\n            this._onWillTriggerEditorOperationEvent.fire({ source: source, handlerId: handlerId, payload: payload });\n            this._beginUpdate();\n            switch (handlerId) {\n                case \"compositionStart\" /* editorCommon.Handler.CompositionStart */:\n                    this._startComposition();\n                    return;\n                case \"compositionEnd\" /* editorCommon.Handler.CompositionEnd */:\n                    this._endComposition(source);\n                    return;\n                case \"type\" /* editorCommon.Handler.Type */: {\n                    const args = payload;\n                    this._type(source, args.text || '');\n                    return;\n                }\n                case \"replacePreviousChar\" /* editorCommon.Handler.ReplacePreviousChar */: {\n                    const args = payload;\n                    this._compositionType(source, args.text || '', args.replaceCharCnt || 0, 0, 0);\n                    return;\n                }\n                case \"compositionType\" /* editorCommon.Handler.CompositionType */: {\n                    const args = payload;\n                    this._compositionType(source, args.text || '', args.replacePrevCharCnt || 0, args.replaceNextCharCnt || 0, args.positionDelta || 0);\n                    return;\n                }\n                case \"paste\" /* editorCommon.Handler.Paste */: {\n                    const args = payload;\n                    this._paste(source, args.text || '', args.pasteOnNewLine || false, args.multicursorText || null, args.mode || null, args.clipboardEvent);\n                    return;\n                }\n                case \"cut\" /* editorCommon.Handler.Cut */:\n                    this._cut(source);\n                    return;\n            }\n            const action = this.getAction(handlerId);\n            if (action) {\n                Promise.resolve(action.run(payload)).then(undefined, onUnexpectedError);\n                return;\n            }\n            if (!this._modelData) {\n                return;\n            }\n            if (this._triggerEditorCommand(source, handlerId, payload)) {\n                return;\n            }\n            this._triggerCommand(handlerId, payload);\n        }\n        finally {\n            this._endUpdate();\n        }\n    }\n    _triggerCommand(handlerId, payload) {\n        this._commandService.executeCommand(handlerId, payload);\n    }\n    _startComposition() {\n        if (!this._modelData) {\n            return;\n        }\n        this.inComposition = true;\n        this._modelData.viewModel.startComposition();\n        this._onDidCompositionStart.fire();\n    }\n    _endComposition(source) {\n        if (!this._modelData) {\n            return;\n        }\n        this.inComposition = false;\n        this._modelData.viewModel.endComposition(source);\n        this._onDidCompositionEnd.fire();\n    }\n    _type(source, text) {\n        if (!this._modelData || text.length === 0) {\n            return;\n        }\n        if (source === 'keyboard') {\n            this._onWillType.fire(text);\n        }\n        this._modelData.viewModel.type(text, source);\n        if (source === 'keyboard') {\n            this._onDidType.fire(text);\n        }\n    }\n    _compositionType(source, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta) {\n        if (!this._modelData) {\n            return;\n        }\n        this._modelData.viewModel.compositionType(text, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source);\n    }\n    _paste(source, text, pasteOnNewLine, multicursorText, mode, clipboardEvent) {\n        if (!this._modelData) {\n            return;\n        }\n        const viewModel = this._modelData.viewModel;\n        const startPosition = viewModel.getSelection().getStartPosition();\n        viewModel.paste(text, pasteOnNewLine, multicursorText, source);\n        const endPosition = viewModel.getSelection().getStartPosition();\n        if (source === 'keyboard') {\n            this._onDidPaste.fire({\n                clipboardEvent,\n                range: new Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column),\n                languageId: mode\n            });\n        }\n    }\n    _cut(source) {\n        if (!this._modelData) {\n            return;\n        }\n        this._modelData.viewModel.cut(source);\n    }\n    _triggerEditorCommand(source, handlerId, payload) {\n        const command = EditorExtensionsRegistry.getEditorCommand(handlerId);\n        if (command) {\n            payload = payload || {};\n            if (isObject(payload)) {\n                payload.source = source;\n            }\n            this._instantiationService.invokeFunction((accessor) => {\n                Promise.resolve(command.runEditorCommand(accessor, this, payload)).then(undefined, onUnexpectedError);\n            });\n            return true;\n        }\n        return false;\n    }\n    _getViewModel() {\n        if (!this._modelData) {\n            return null;\n        }\n        return this._modelData.viewModel;\n    }\n    pushUndoStop() {\n        if (!this._modelData) {\n            return false;\n        }\n        if (this._configuration.options.get(104 /* EditorOption.readOnly */)) {\n            // read only editor => sorry!\n            return false;\n        }\n        this._modelData.model.pushStackElement();\n        return true;\n    }\n    popUndoStop() {\n        if (!this._modelData) {\n            return false;\n        }\n        if (this._configuration.options.get(104 /* EditorOption.readOnly */)) {\n            // read only editor => sorry!\n            return false;\n        }\n        this._modelData.model.popStackElement();\n        return true;\n    }\n    edit(edit, reason) {\n        return this.executeEdits(reason, edit.replacements.map(e => ({ range: e.range, text: e.text })), undefined);\n    }\n    executeEdits(source, edits, endCursorState) {\n        if (!this._modelData) {\n            return false;\n        }\n        if (this._configuration.options.get(104 /* EditorOption.readOnly */)) {\n            // read only editor => sorry!\n            return false;\n        }\n        let cursorStateComputer;\n        if (!endCursorState) {\n            cursorStateComputer = () => null;\n        }\n        else if (Array.isArray(endCursorState)) {\n            cursorStateComputer = () => endCursorState;\n        }\n        else {\n            cursorStateComputer = endCursorState;\n        }\n        let sourceStr;\n        let reason;\n        if (source instanceof TextModelEditSource) {\n            reason = source;\n            sourceStr = source.metadata.source;\n        }\n        else {\n            reason = EditSources.unknown({ name: sourceStr });\n            sourceStr = source;\n        }\n        this._onBeforeExecuteEdit.fire({ source: sourceStr ?? undefined });\n        this._modelData.viewModel.executeEdits(sourceStr, edits, cursorStateComputer, reason);\n        return true;\n    }\n    executeCommand(source, command) {\n        if (!this._modelData) {\n            return;\n        }\n        this._modelData.viewModel.executeCommand(command, source);\n    }\n    executeCommands(source, commands) {\n        if (!this._modelData) {\n            return;\n        }\n        this._modelData.viewModel.executeCommands(commands, source);\n    }\n    createDecorationsCollection(decorations) {\n        return new EditorDecorationsCollection(this, decorations);\n    }\n    changeDecorations(callback) {\n        if (!this._modelData) {\n            // callback will not be called\n            return null;\n        }\n        return this._modelData.model.changeDecorations(callback, this._id);\n    }\n    getLineDecorations(lineNumber) {\n        if (!this._modelData) {\n            return null;\n        }\n        const options = this._configuration.options;\n        return this._modelData.model.getLineDecorations(lineNumber, this._id, filterValidationDecorations(options), filterFontDecorations(options));\n    }\n    getDecorationsInRange(range) {\n        if (!this._modelData) {\n            return null;\n        }\n        const options = this._configuration.options;\n        return this._modelData.model.getDecorationsInRange(range, this._id, filterValidationDecorations(options), filterFontDecorations(options));\n    }\n    getFontSizeAtPosition(position) {\n        if (!this._modelData) {\n            return null;\n        }\n        return this._modelData.viewModel.getFontSizeAtPosition(position);\n    }\n    /**\n     * @deprecated\n     */\n    deltaDecorations(oldDecorations, newDecorations) {\n        if (!this._modelData) {\n            return [];\n        }\n        if (oldDecorations.length === 0 && newDecorations.length === 0) {\n            return oldDecorations;\n        }\n        return this._modelData.model.deltaDecorations(oldDecorations, newDecorations, this._id);\n    }\n    removeDecorations(decorationIds) {\n        if (!this._modelData || decorationIds.length === 0) {\n            return;\n        }\n        this._modelData.model.changeDecorations((changeAccessor) => {\n            changeAccessor.deltaDecorations(decorationIds, []);\n        });\n    }\n    removeDecorationsByType(decorationTypeKey) {\n        // remove decorations for type and sub type\n        const oldDecorationsIds = this._decorationTypeKeysToIds[decorationTypeKey];\n        if (oldDecorationsIds) {\n            this.changeDecorations(accessor => accessor.deltaDecorations(oldDecorationsIds, []));\n        }\n        if (this._decorationTypeKeysToIds.hasOwnProperty(decorationTypeKey)) {\n            delete this._decorationTypeKeysToIds[decorationTypeKey];\n        }\n        if (this._decorationTypeSubtypes.hasOwnProperty(decorationTypeKey)) {\n            delete this._decorationTypeSubtypes[decorationTypeKey];\n        }\n    }\n    getLayoutInfo() {\n        const options = this._configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        return layoutInfo;\n    }\n    createOverviewRuler(cssClassName) {\n        if (!this._modelData || !this._modelData.hasRealView) {\n            return null;\n        }\n        return this._modelData.view.createOverviewRuler(cssClassName);\n    }\n    getContainerDomNode() {\n        return this._domElement;\n    }\n    getDomNode() {\n        if (!this._modelData || !this._modelData.hasRealView) {\n            return null;\n        }\n        return this._modelData.view.domNode.domNode;\n    }\n    delegateVerticalScrollbarPointerDown(browserEvent) {\n        if (!this._modelData || !this._modelData.hasRealView) {\n            return;\n        }\n        this._modelData.view.delegateVerticalScrollbarPointerDown(browserEvent);\n    }\n    delegateScrollFromMouseWheelEvent(browserEvent) {\n        if (!this._modelData || !this._modelData.hasRealView) {\n            return;\n        }\n        this._modelData.view.delegateScrollFromMouseWheelEvent(browserEvent);\n    }\n    layout(dimension, postponeRendering = false) {\n        this._configuration.observeContainer(dimension);\n        if (!postponeRendering) {\n            this.render();\n        }\n    }\n    focus() {\n        if (!this._modelData || !this._modelData.hasRealView) {\n            return;\n        }\n        this._modelData.view.focus();\n    }\n    hasTextFocus() {\n        if (!this._modelData || !this._modelData.hasRealView) {\n            return false;\n        }\n        return this._modelData.view.isFocused();\n    }\n    hasWidgetFocus() {\n        if (!this._modelData || !this._modelData.hasRealView) {\n            return false;\n        }\n        return this._modelData.view.isWidgetFocused();\n    }\n    addContentWidget(widget) {\n        const widgetData = {\n            widget: widget,\n            position: widget.getPosition()\n        };\n        if (this._contentWidgets.hasOwnProperty(widget.getId())) {\n            console.warn('Overwriting a content widget with the same id:' + widget.getId());\n        }\n        this._contentWidgets[widget.getId()] = widgetData;\n        if (this._modelData && this._modelData.hasRealView) {\n            this._modelData.view.addContentWidget(widgetData);\n        }\n    }\n    layoutContentWidget(widget) {\n        const widgetId = widget.getId();\n        if (this._contentWidgets.hasOwnProperty(widgetId)) {\n            const widgetData = this._contentWidgets[widgetId];\n            widgetData.position = widget.getPosition();\n            if (this._modelData && this._modelData.hasRealView) {\n                this._modelData.view.layoutContentWidget(widgetData);\n            }\n        }\n    }\n    removeContentWidget(widget) {\n        const widgetId = widget.getId();\n        if (this._contentWidgets.hasOwnProperty(widgetId)) {\n            const widgetData = this._contentWidgets[widgetId];\n            delete this._contentWidgets[widgetId];\n            if (this._modelData && this._modelData.hasRealView) {\n                this._modelData.view.removeContentWidget(widgetData);\n            }\n        }\n    }\n    addOverlayWidget(widget) {\n        const widgetData = {\n            widget: widget,\n            position: widget.getPosition()\n        };\n        if (this._overlayWidgets.hasOwnProperty(widget.getId())) {\n            console.warn('Overwriting an overlay widget with the same id.');\n        }\n        this._overlayWidgets[widget.getId()] = widgetData;\n        if (this._modelData && this._modelData.hasRealView) {\n            this._modelData.view.addOverlayWidget(widgetData);\n        }\n    }\n    layoutOverlayWidget(widget) {\n        const widgetId = widget.getId();\n        if (this._overlayWidgets.hasOwnProperty(widgetId)) {\n            const widgetData = this._overlayWidgets[widgetId];\n            widgetData.position = widget.getPosition();\n            if (this._modelData && this._modelData.hasRealView) {\n                this._modelData.view.layoutOverlayWidget(widgetData);\n            }\n        }\n    }\n    removeOverlayWidget(widget) {\n        const widgetId = widget.getId();\n        if (this._overlayWidgets.hasOwnProperty(widgetId)) {\n            const widgetData = this._overlayWidgets[widgetId];\n            delete this._overlayWidgets[widgetId];\n            if (this._modelData && this._modelData.hasRealView) {\n                this._modelData.view.removeOverlayWidget(widgetData);\n            }\n        }\n    }\n    addGlyphMarginWidget(widget) {\n        const widgetData = {\n            widget: widget,\n            position: widget.getPosition()\n        };\n        if (this._glyphMarginWidgets.hasOwnProperty(widget.getId())) {\n            console.warn('Overwriting a glyph margin widget with the same id.');\n        }\n        this._glyphMarginWidgets[widget.getId()] = widgetData;\n        if (this._modelData && this._modelData.hasRealView) {\n            this._modelData.view.addGlyphMarginWidget(widgetData);\n        }\n    }\n    layoutGlyphMarginWidget(widget) {\n        const widgetId = widget.getId();\n        if (this._glyphMarginWidgets.hasOwnProperty(widgetId)) {\n            const widgetData = this._glyphMarginWidgets[widgetId];\n            widgetData.position = widget.getPosition();\n            if (this._modelData && this._modelData.hasRealView) {\n                this._modelData.view.layoutGlyphMarginWidget(widgetData);\n            }\n        }\n    }\n    removeGlyphMarginWidget(widget) {\n        const widgetId = widget.getId();\n        if (this._glyphMarginWidgets.hasOwnProperty(widgetId)) {\n            const widgetData = this._glyphMarginWidgets[widgetId];\n            delete this._glyphMarginWidgets[widgetId];\n            if (this._modelData && this._modelData.hasRealView) {\n                this._modelData.view.removeGlyphMarginWidget(widgetData);\n            }\n        }\n    }\n    changeViewZones(callback) {\n        if (!this._modelData || !this._modelData.hasRealView) {\n            return;\n        }\n        this._modelData.view.change(callback);\n    }\n    getTargetAtClientPoint(clientX, clientY) {\n        if (!this._modelData || !this._modelData.hasRealView) {\n            return null;\n        }\n        return this._modelData.view.getTargetAtClientPoint(clientX, clientY);\n    }\n    getScrolledVisiblePosition(rawPosition) {\n        if (!this._modelData || !this._modelData.hasRealView) {\n            return null;\n        }\n        const position = this._modelData.model.validatePosition(rawPosition);\n        const options = this._configuration.options;\n        const layoutInfo = options.get(165 /* EditorOption.layoutInfo */);\n        const top = CodeEditorWidget_1._getVerticalOffsetForPosition(this._modelData, position.lineNumber, position.column) - this.getScrollTop();\n        const left = this._modelData.view.getOffsetForColumn(position.lineNumber, position.column) + layoutInfo.glyphMarginWidth + layoutInfo.lineNumbersWidth + layoutInfo.decorationsWidth - this.getScrollLeft();\n        const height = this.getLineHeightForPosition(position);\n        return {\n            top: top,\n            left: left,\n            height\n        };\n    }\n    getOffsetForColumn(lineNumber, column) {\n        if (!this._modelData || !this._modelData.hasRealView) {\n            return -1;\n        }\n        return this._modelData.view.getOffsetForColumn(lineNumber, column);\n    }\n    render(forceRedraw = false) {\n        if (!this._modelData || !this._modelData.hasRealView) {\n            return;\n        }\n        this._modelData.viewModel.batchEvents(() => {\n            this._modelData.view.render(true, forceRedraw);\n        });\n    }\n    setAriaOptions(options) {\n        if (!this._modelData || !this._modelData.hasRealView) {\n            return;\n        }\n        this._modelData.view.setAriaOptions(options);\n    }\n    applyFontInfo(target) {\n        applyFontInfo(target, this._configuration.options.get(59 /* EditorOption.fontInfo */));\n    }\n    setBanner(domNode, domNodeHeight) {\n        if (this._bannerDomNode && this._domElement.contains(this._bannerDomNode)) {\n            this._bannerDomNode.remove();\n        }\n        this._bannerDomNode = domNode;\n        this._configuration.setReservedHeight(domNode ? domNodeHeight : 0);\n        if (this._bannerDomNode) {\n            this._domElement.prepend(this._bannerDomNode);\n        }\n    }\n    _attachModel(model) {\n        if (!model) {\n            this._modelData = null;\n            return;\n        }\n        const listenersToRemove = [];\n        this._domElement.setAttribute('data-mode-id', model.getLanguageId());\n        this._configuration.setIsDominatedByLongLines(model.isDominatedByLongLines());\n        this._configuration.setModelLineCount(model.getLineCount());\n        const attachedView = model.onBeforeAttached();\n        const viewModel = new ViewModel(this._id, this._configuration, model, DOMLineBreaksComputerFactory.create(getWindow(this._domElement)), MonospaceLineBreaksComputerFactory.create(this._configuration.options), (callback) => scheduleAtNextAnimationFrame(getWindow(this._domElement), callback), this.languageConfigurationService, this._themeService, attachedView, {\n            batchChanges: (cb) => {\n                try {\n                    this._beginUpdate();\n                    return cb();\n                }\n                finally {\n                    this._endUpdate();\n                }\n            },\n        });\n        // Someone might destroy the model from under the editor, so prevent any exceptions by setting a null model\n        listenersToRemove.push(model.onWillDispose(() => this.setModel(null)));\n        listenersToRemove.push(viewModel.onEvent((e) => {\n            switch (e.kind) {\n                case 0 /* OutgoingViewModelEventKind.ContentSizeChanged */:\n                    this._onDidContentSizeChange.fire(e);\n                    break;\n                case 1 /* OutgoingViewModelEventKind.FocusChanged */:\n                    this._editorTextFocus.setValue(e.hasFocus);\n                    break;\n                case 2 /* OutgoingViewModelEventKind.WidgetFocusChanged */:\n                    this._editorWidgetFocus.setValue(e.hasFocus);\n                    break;\n                case 3 /* OutgoingViewModelEventKind.ScrollChanged */:\n                    this._onDidScrollChange.fire(e);\n                    break;\n                case 4 /* OutgoingViewModelEventKind.ViewZonesChanged */:\n                    this._onDidChangeViewZones.fire();\n                    break;\n                case 5 /* OutgoingViewModelEventKind.HiddenAreasChanged */:\n                    this._onDidChangeHiddenAreas.fire();\n                    break;\n                case 6 /* OutgoingViewModelEventKind.ReadOnlyEditAttempt */:\n                    this._onDidAttemptReadOnlyEdit.fire();\n                    break;\n                case 7 /* OutgoingViewModelEventKind.CursorStateChanged */: {\n                    if (e.reachedMaxCursorCount) {\n                        const multiCursorLimit = this.getOption(89 /* EditorOption.multiCursorLimit */);\n                        const message = localize(83, \"The number of cursors has been limited to {0}. Consider using [find and replace](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) for larger changes or increase the editor multi cursor limit setting.\", multiCursorLimit);\n                        this._notificationService.prompt(Severity.Warning, message, [\n                            {\n                                label: 'Find and Replace',\n                                run: () => {\n                                    this._commandService.executeCommand('editor.action.startFindReplaceAction');\n                                }\n                            },\n                            {\n                                label: localize(84, 'Increase Multi Cursor Limit'),\n                                run: () => {\n                                    this._commandService.executeCommand('workbench.action.openSettings2', {\n                                        query: 'editor.multiCursorLimit'\n                                    });\n                                }\n                            }\n                        ]);\n                    }\n                    const positions = [];\n                    for (let i = 0, len = e.selections.length; i < len; i++) {\n                        positions[i] = e.selections[i].getPosition();\n                    }\n                    const e1 = {\n                        position: positions[0],\n                        secondaryPositions: positions.slice(1),\n                        reason: e.reason,\n                        source: e.source\n                    };\n                    this._onDidChangeCursorPosition.fire(e1);\n                    const e2 = {\n                        selection: e.selections[0],\n                        secondarySelections: e.selections.slice(1),\n                        modelVersionId: e.modelVersionId,\n                        oldSelections: e.oldSelections,\n                        oldModelVersionId: e.oldModelVersionId,\n                        source: e.source,\n                        reason: e.reason\n                    };\n                    this._onDidChangeCursorSelection.fire(e2);\n                    break;\n                }\n                case 8 /* OutgoingViewModelEventKind.ModelDecorationsChanged */:\n                    this._onDidChangeModelDecorations.fire(e.event);\n                    break;\n                case 9 /* OutgoingViewModelEventKind.ModelLanguageChanged */:\n                    this._domElement.setAttribute('data-mode-id', model.getLanguageId());\n                    this._onDidChangeModelLanguage.fire(e.event);\n                    break;\n                case 10 /* OutgoingViewModelEventKind.ModelLanguageConfigurationChanged */:\n                    this._onDidChangeModelLanguageConfiguration.fire(e.event);\n                    break;\n                case 11 /* OutgoingViewModelEventKind.ModelContentChanged */:\n                    this._onDidChangeModelContent.fire(e.event);\n                    break;\n                case 12 /* OutgoingViewModelEventKind.ModelOptionsChanged */:\n                    this._onDidChangeModelOptions.fire(e.event);\n                    break;\n                case 13 /* OutgoingViewModelEventKind.ModelTokensChanged */:\n                    this._onDidChangeModelTokens.fire(e.event);\n                    break;\n                case 14 /* OutgoingViewModelEventKind.ModelLineHeightChanged */:\n                    this._onDidChangeLineHeight.fire(e.event);\n                    break;\n                case 15 /* OutgoingViewModelEventKind.ModelFontChangedEvent */:\n                    this._onDidChangeFont.fire(e.event);\n                    break;\n            }\n        }));\n        const [view, hasRealView] = this._createView(viewModel);\n        if (hasRealView) {\n            this._domElement.appendChild(view.domNode.domNode);\n            let keys = Object.keys(this._contentWidgets);\n            for (let i = 0, len = keys.length; i < len; i++) {\n                const widgetId = keys[i];\n                view.addContentWidget(this._contentWidgets[widgetId]);\n            }\n            keys = Object.keys(this._overlayWidgets);\n            for (let i = 0, len = keys.length; i < len; i++) {\n                const widgetId = keys[i];\n                view.addOverlayWidget(this._overlayWidgets[widgetId]);\n            }\n            keys = Object.keys(this._glyphMarginWidgets);\n            for (let i = 0, len = keys.length; i < len; i++) {\n                const widgetId = keys[i];\n                view.addGlyphMarginWidget(this._glyphMarginWidgets[widgetId]);\n            }\n            view.render(false, true);\n            view.domNode.domNode.setAttribute('data-uri', model.uri.toString());\n        }\n        this._modelData = new ModelData(model, viewModel, view, hasRealView, listenersToRemove, attachedView);\n    }\n    _createView(viewModel) {\n        let commandDelegate;\n        if (this.isSimpleWidget) {\n            commandDelegate = {\n                paste: (text, pasteOnNewLine, multicursorText, mode) => {\n                    this._paste('keyboard', text, pasteOnNewLine, multicursorText, mode);\n                },\n                type: (text) => {\n                    this._type('keyboard', text);\n                },\n                compositionType: (text, replacePrevCharCnt, replaceNextCharCnt, positionDelta) => {\n                    this._compositionType('keyboard', text, replacePrevCharCnt, replaceNextCharCnt, positionDelta);\n                },\n                startComposition: () => {\n                    this._startComposition();\n                },\n                endComposition: () => {\n                    this._endComposition('keyboard');\n                },\n                cut: () => {\n                    this._cut('keyboard');\n                }\n            };\n        }\n        else {\n            commandDelegate = {\n                paste: (text, pasteOnNewLine, multicursorText, mode) => {\n                    const payload = { text, pasteOnNewLine, multicursorText, mode };\n                    this._commandService.executeCommand(\"paste\" /* editorCommon.Handler.Paste */, payload);\n                },\n                type: (text) => {\n                    const payload = { text };\n                    this._commandService.executeCommand(\"type\" /* editorCommon.Handler.Type */, payload);\n                },\n                compositionType: (text, replacePrevCharCnt, replaceNextCharCnt, positionDelta) => {\n                    // Try if possible to go through the existing `replacePreviousChar` command\n                    if (replaceNextCharCnt || positionDelta) {\n                        // must be handled through the new command\n                        const payload = { text, replacePrevCharCnt, replaceNextCharCnt, positionDelta };\n                        this._commandService.executeCommand(\"compositionType\" /* editorCommon.Handler.CompositionType */, payload);\n                    }\n                    else {\n                        const payload = { text, replaceCharCnt: replacePrevCharCnt };\n                        this._commandService.executeCommand(\"replacePreviousChar\" /* editorCommon.Handler.ReplacePreviousChar */, payload);\n                    }\n                },\n                startComposition: () => {\n                    this._commandService.executeCommand(\"compositionStart\" /* editorCommon.Handler.CompositionStart */, {});\n                },\n                endComposition: () => {\n                    this._commandService.executeCommand(\"compositionEnd\" /* editorCommon.Handler.CompositionEnd */, {});\n                },\n                cut: () => {\n                    this._commandService.executeCommand(\"cut\" /* editorCommon.Handler.Cut */, {});\n                }\n            };\n        }\n        const viewUserInputEvents = new ViewUserInputEvents(viewModel.coordinatesConverter);\n        viewUserInputEvents.onKeyDown = (e) => this._onKeyDown.fire(e);\n        viewUserInputEvents.onKeyUp = (e) => this._onKeyUp.fire(e);\n        viewUserInputEvents.onContextMenu = (e) => this._onContextMenu.fire(e);\n        viewUserInputEvents.onMouseMove = (e) => this._onMouseMove.fire(e);\n        viewUserInputEvents.onMouseLeave = (e) => this._onMouseLeave.fire(e);\n        viewUserInputEvents.onMouseDown = (e) => this._onMouseDown.fire(e);\n        viewUserInputEvents.onMouseUp = (e) => this._onMouseUp.fire(e);\n        viewUserInputEvents.onMouseDrag = (e) => this._onMouseDrag.fire(e);\n        viewUserInputEvents.onMouseDrop = (e) => this._onMouseDrop.fire(e);\n        viewUserInputEvents.onMouseDropCanceled = (e) => this._onMouseDropCanceled.fire(e);\n        viewUserInputEvents.onMouseWheel = (e) => this._onMouseWheel.fire(e);\n        const view = new View(this._domElement, this.getId(), commandDelegate, this._configuration, this._themeService.getColorTheme(), viewModel, viewUserInputEvents, this._overflowWidgetsDomNode, this._instantiationService);\n        return [view, true];\n    }\n    _postDetachModelCleanup(detachedModel) {\n        detachedModel?.removeAllDecorationsWithOwnerId(this._id);\n    }\n    _detachModel() {\n        this._contributionsDisposable?.dispose();\n        this._contributionsDisposable = undefined;\n        if (!this._modelData) {\n            return null;\n        }\n        const model = this._modelData.model;\n        const removeDomNode = this._modelData.hasRealView ? this._modelData.view.domNode.domNode : null;\n        this._modelData.dispose();\n        this._modelData = null;\n        this._domElement.removeAttribute('data-mode-id');\n        if (removeDomNode && this._domElement.contains(removeDomNode)) {\n            removeDomNode.remove();\n        }\n        if (this._bannerDomNode && this._domElement.contains(this._bannerDomNode)) {\n            this._bannerDomNode.remove();\n        }\n        return model;\n    }\n    _removeDecorationType(key) {\n        this._codeEditorService.removeDecorationType(key);\n    }\n    hasModel() {\n        return (this._modelData !== null);\n    }\n    showDropIndicatorAt(position) {\n        const newDecorations = [{\n                range: new Range(position.lineNumber, position.column, position.lineNumber, position.column),\n                options: CodeEditorWidget_1.dropIntoEditorDecorationOptions\n            }];\n        this._dropIntoEditorDecorations.set(newDecorations);\n        this.revealPosition(position, 1 /* editorCommon.ScrollType.Immediate */);\n    }\n    removeDropIndicator() {\n        this._dropIntoEditorDecorations.clear();\n    }\n    _beginUpdate() {\n        this._updateCounter++;\n        if (this._updateCounter === 1) {\n            this._onBeginUpdate.fire();\n        }\n    }\n    _endUpdate() {\n        this._updateCounter--;\n        if (this._updateCounter === 0) {\n            this._onEndUpdate.fire();\n        }\n    }\n};\nCodeEditorWidget = CodeEditorWidget_1 = __decorate([\n    __param(3, IInstantiationService),\n    __param(4, ICodeEditorService),\n    __param(5, ICommandService),\n    __param(6, IContextKeyService),\n    __param(7, IThemeService),\n    __param(8, INotificationService),\n    __param(9, IAccessibilityService),\n    __param(10, ILanguageConfigurationService),\n    __param(11, ILanguageFeaturesService)\n], CodeEditorWidget);\nlet EDITOR_ID = 0;\nclass ModelData {\n    constructor(model, viewModel, view, hasRealView, listenersToRemove, attachedView) {\n        this.model = model;\n        this.viewModel = viewModel;\n        this.view = view;\n        this.hasRealView = hasRealView;\n        this.listenersToRemove = listenersToRemove;\n        this.attachedView = attachedView;\n    }\n    dispose() {\n        dispose(this.listenersToRemove);\n        this.model.onBeforeDetached(this.attachedView);\n        if (this.hasRealView) {\n            this.view.dispose();\n        }\n        this.viewModel.dispose();\n    }\n}\nclass BooleanEventEmitter extends Disposable {\n    constructor(_emitterOptions) {\n        super();\n        this._emitterOptions = _emitterOptions;\n        this._onDidChangeToTrue = this._register(new Emitter(this._emitterOptions));\n        this.onDidChangeToTrue = this._onDidChangeToTrue.event;\n        this._onDidChangeToFalse = this._register(new Emitter(this._emitterOptions));\n        this.onDidChangeToFalse = this._onDidChangeToFalse.event;\n        this._value = 0 /* BooleanEventValue.NotSet */;\n    }\n    setValue(_value) {\n        const value = (_value ? 2 /* BooleanEventValue.True */ : 1 /* BooleanEventValue.False */);\n        if (this._value === value) {\n            return;\n        }\n        this._value = value;\n        if (this._value === 2 /* BooleanEventValue.True */) {\n            this._onDidChangeToTrue.fire();\n        }\n        else if (this._value === 1 /* BooleanEventValue.False */) {\n            this._onDidChangeToFalse.fire();\n        }\n    }\n}\n/**\n * A regular event emitter that also makes sure contributions are instantiated if necessary\n */\nclass InteractionEmitter extends Emitter {\n    constructor(_contributions, deliveryQueue) {\n        super({ deliveryQueue });\n        this._contributions = _contributions;\n    }\n    fire(event) {\n        this._contributions.onBeforeInteractionEvent();\n        super.fire(event);\n    }\n}\nclass EditorContextKeysManager extends Disposable {\n    constructor(editor, contextKeyService) {\n        super();\n        this._editor = editor;\n        contextKeyService.createKey('editorId', editor.getId());\n        this._editorSimpleInput = EditorContextKeys.editorSimpleInput.bindTo(contextKeyService);\n        this._editorFocus = EditorContextKeys.focus.bindTo(contextKeyService);\n        this._textInputFocus = EditorContextKeys.textInputFocus.bindTo(contextKeyService);\n        this._editorTextFocus = EditorContextKeys.editorTextFocus.bindTo(contextKeyService);\n        this._tabMovesFocus = EditorContextKeys.tabMovesFocus.bindTo(contextKeyService);\n        this._editorReadonly = EditorContextKeys.readOnly.bindTo(contextKeyService);\n        this._inDiffEditor = EditorContextKeys.inDiffEditor.bindTo(contextKeyService);\n        this._editorColumnSelection = EditorContextKeys.columnSelection.bindTo(contextKeyService);\n        this._hasMultipleSelections = EditorContextKeys.hasMultipleSelections.bindTo(contextKeyService);\n        this._hasNonEmptySelection = EditorContextKeys.hasNonEmptySelection.bindTo(contextKeyService);\n        this._canUndo = EditorContextKeys.canUndo.bindTo(contextKeyService);\n        this._canRedo = EditorContextKeys.canRedo.bindTo(contextKeyService);\n        this._register(this._editor.onDidChangeConfiguration(() => this._updateFromConfig()));\n        this._register(this._editor.onDidChangeCursorSelection(() => this._updateFromSelection()));\n        this._register(this._editor.onDidFocusEditorWidget(() => this._updateFromFocus()));\n        this._register(this._editor.onDidBlurEditorWidget(() => this._updateFromFocus()));\n        this._register(this._editor.onDidFocusEditorText(() => this._updateFromFocus()));\n        this._register(this._editor.onDidBlurEditorText(() => this._updateFromFocus()));\n        this._register(this._editor.onDidChangeModel(() => this._updateFromModel()));\n        this._register(this._editor.onDidChangeConfiguration(() => this._updateFromModel()));\n        this._register(TabFocus.onDidChangeTabFocus((tabFocusMode) => this._tabMovesFocus.set(tabFocusMode)));\n        this._updateFromConfig();\n        this._updateFromSelection();\n        this._updateFromFocus();\n        this._updateFromModel();\n        this._editorSimpleInput.set(this._editor.isSimpleWidget);\n    }\n    _updateFromConfig() {\n        const options = this._editor.getOptions();\n        this._tabMovesFocus.set(options.get(164 /* EditorOption.tabFocusMode */) || TabFocus.getTabFocusMode());\n        this._editorReadonly.set(options.get(104 /* EditorOption.readOnly */));\n        this._inDiffEditor.set(options.get(70 /* EditorOption.inDiffEditor */));\n        this._editorColumnSelection.set(options.get(28 /* EditorOption.columnSelection */));\n    }\n    _updateFromSelection() {\n        const selections = this._editor.getSelections();\n        if (!selections) {\n            this._hasMultipleSelections.reset();\n            this._hasNonEmptySelection.reset();\n        }\n        else {\n            this._hasMultipleSelections.set(selections.length > 1);\n            this._hasNonEmptySelection.set(selections.some(s => !s.isEmpty()));\n        }\n    }\n    _updateFromFocus() {\n        this._editorFocus.set(this._editor.hasWidgetFocus() && !this._editor.isSimpleWidget);\n        this._editorTextFocus.set(this._editor.hasTextFocus() && !this._editor.isSimpleWidget);\n        this._textInputFocus.set(this._editor.hasTextFocus());\n    }\n    _updateFromModel() {\n        const model = this._editor.getModel();\n        this._canUndo.set(Boolean(model && model.canUndo()));\n        this._canRedo.set(Boolean(model && model.canRedo()));\n    }\n}\nclass EditorModeContext extends Disposable {\n    constructor(_editor, _contextKeyService, _languageFeaturesService) {\n        super();\n        this._editor = _editor;\n        this._contextKeyService = _contextKeyService;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._langId = EditorContextKeys.languageId.bindTo(_contextKeyService);\n        this._hasCompletionItemProvider = EditorContextKeys.hasCompletionItemProvider.bindTo(_contextKeyService);\n        this._hasCodeActionsProvider = EditorContextKeys.hasCodeActionsProvider.bindTo(_contextKeyService);\n        this._hasCodeLensProvider = EditorContextKeys.hasCodeLensProvider.bindTo(_contextKeyService);\n        this._hasDefinitionProvider = EditorContextKeys.hasDefinitionProvider.bindTo(_contextKeyService);\n        this._hasDeclarationProvider = EditorContextKeys.hasDeclarationProvider.bindTo(_contextKeyService);\n        this._hasImplementationProvider = EditorContextKeys.hasImplementationProvider.bindTo(_contextKeyService);\n        this._hasTypeDefinitionProvider = EditorContextKeys.hasTypeDefinitionProvider.bindTo(_contextKeyService);\n        this._hasHoverProvider = EditorContextKeys.hasHoverProvider.bindTo(_contextKeyService);\n        this._hasDocumentHighlightProvider = EditorContextKeys.hasDocumentHighlightProvider.bindTo(_contextKeyService);\n        this._hasDocumentSymbolProvider = EditorContextKeys.hasDocumentSymbolProvider.bindTo(_contextKeyService);\n        this._hasReferenceProvider = EditorContextKeys.hasReferenceProvider.bindTo(_contextKeyService);\n        this._hasRenameProvider = EditorContextKeys.hasRenameProvider.bindTo(_contextKeyService);\n        this._hasSignatureHelpProvider = EditorContextKeys.hasSignatureHelpProvider.bindTo(_contextKeyService);\n        this._hasInlayHintsProvider = EditorContextKeys.hasInlayHintsProvider.bindTo(_contextKeyService);\n        this._hasDocumentFormattingProvider = EditorContextKeys.hasDocumentFormattingProvider.bindTo(_contextKeyService);\n        this._hasDocumentSelectionFormattingProvider = EditorContextKeys.hasDocumentSelectionFormattingProvider.bindTo(_contextKeyService);\n        this._hasMultipleDocumentFormattingProvider = EditorContextKeys.hasMultipleDocumentFormattingProvider.bindTo(_contextKeyService);\n        this._hasMultipleDocumentSelectionFormattingProvider = EditorContextKeys.hasMultipleDocumentSelectionFormattingProvider.bindTo(_contextKeyService);\n        this._isInEmbeddedEditor = EditorContextKeys.isInEmbeddedEditor.bindTo(_contextKeyService);\n        const update = () => this._update();\n        // update when model/mode changes\n        this._register(_editor.onDidChangeModel(update));\n        this._register(_editor.onDidChangeModelLanguage(update));\n        // update when registries change\n        this._register(_languageFeaturesService.completionProvider.onDidChange(update));\n        this._register(_languageFeaturesService.codeActionProvider.onDidChange(update));\n        this._register(_languageFeaturesService.codeLensProvider.onDidChange(update));\n        this._register(_languageFeaturesService.definitionProvider.onDidChange(update));\n        this._register(_languageFeaturesService.declarationProvider.onDidChange(update));\n        this._register(_languageFeaturesService.implementationProvider.onDidChange(update));\n        this._register(_languageFeaturesService.typeDefinitionProvider.onDidChange(update));\n        this._register(_languageFeaturesService.hoverProvider.onDidChange(update));\n        this._register(_languageFeaturesService.documentHighlightProvider.onDidChange(update));\n        this._register(_languageFeaturesService.documentSymbolProvider.onDidChange(update));\n        this._register(_languageFeaturesService.referenceProvider.onDidChange(update));\n        this._register(_languageFeaturesService.renameProvider.onDidChange(update));\n        this._register(_languageFeaturesService.documentFormattingEditProvider.onDidChange(update));\n        this._register(_languageFeaturesService.documentRangeFormattingEditProvider.onDidChange(update));\n        this._register(_languageFeaturesService.signatureHelpProvider.onDidChange(update));\n        this._register(_languageFeaturesService.inlayHintsProvider.onDidChange(update));\n        update();\n    }\n    dispose() {\n        super.dispose();\n    }\n    reset() {\n        this._contextKeyService.bufferChangeEvents(() => {\n            this._langId.reset();\n            this._hasCompletionItemProvider.reset();\n            this._hasCodeActionsProvider.reset();\n            this._hasCodeLensProvider.reset();\n            this._hasDefinitionProvider.reset();\n            this._hasDeclarationProvider.reset();\n            this._hasImplementationProvider.reset();\n            this._hasTypeDefinitionProvider.reset();\n            this._hasHoverProvider.reset();\n            this._hasDocumentHighlightProvider.reset();\n            this._hasDocumentSymbolProvider.reset();\n            this._hasReferenceProvider.reset();\n            this._hasRenameProvider.reset();\n            this._hasDocumentFormattingProvider.reset();\n            this._hasDocumentSelectionFormattingProvider.reset();\n            this._hasSignatureHelpProvider.reset();\n            this._isInEmbeddedEditor.reset();\n        });\n    }\n    _update() {\n        const model = this._editor.getModel();\n        if (!model) {\n            this.reset();\n            return;\n        }\n        this._contextKeyService.bufferChangeEvents(() => {\n            this._langId.set(model.getLanguageId());\n            this._hasCompletionItemProvider.set(this._languageFeaturesService.completionProvider.has(model));\n            this._hasCodeActionsProvider.set(this._languageFeaturesService.codeActionProvider.has(model));\n            this._hasCodeLensProvider.set(this._languageFeaturesService.codeLensProvider.has(model));\n            this._hasDefinitionProvider.set(this._languageFeaturesService.definitionProvider.has(model));\n            this._hasDeclarationProvider.set(this._languageFeaturesService.declarationProvider.has(model));\n            this._hasImplementationProvider.set(this._languageFeaturesService.implementationProvider.has(model));\n            this._hasTypeDefinitionProvider.set(this._languageFeaturesService.typeDefinitionProvider.has(model));\n            this._hasHoverProvider.set(this._languageFeaturesService.hoverProvider.has(model));\n            this._hasDocumentHighlightProvider.set(this._languageFeaturesService.documentHighlightProvider.has(model));\n            this._hasDocumentSymbolProvider.set(this._languageFeaturesService.documentSymbolProvider.has(model));\n            this._hasReferenceProvider.set(this._languageFeaturesService.referenceProvider.has(model));\n            this._hasRenameProvider.set(this._languageFeaturesService.renameProvider.has(model));\n            this._hasSignatureHelpProvider.set(this._languageFeaturesService.signatureHelpProvider.has(model));\n            this._hasInlayHintsProvider.set(this._languageFeaturesService.inlayHintsProvider.has(model));\n            this._hasDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.has(model) || this._languageFeaturesService.documentRangeFormattingEditProvider.has(model));\n            this._hasDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.has(model));\n            this._hasMultipleDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.all(model).length + this._languageFeaturesService.documentRangeFormattingEditProvider.all(model).length > 1);\n            this._hasMultipleDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.all(model).length > 1);\n            this._isInEmbeddedEditor.set(model.uri.scheme === Schemas.walkThroughSnippet || model.uri.scheme === Schemas.vscodeChatCodeBlock);\n        });\n    }\n}\nclass EditorDecorationsCollection {\n    get length() {\n        return this._decorationIds.length;\n    }\n    constructor(_editor, decorations) {\n        this._editor = _editor;\n        this._decorationIds = [];\n        this._isChangingDecorations = false;\n        if (Array.isArray(decorations) && decorations.length > 0) {\n            this.set(decorations);\n        }\n    }\n    onDidChange(listener, thisArgs, disposables) {\n        return this._editor.onDidChangeModelDecorations((e) => {\n            if (this._isChangingDecorations) {\n                return;\n            }\n            listener.call(thisArgs, e);\n        }, disposables);\n    }\n    getRange(index) {\n        if (!this._editor.hasModel()) {\n            return null;\n        }\n        if (index >= this._decorationIds.length) {\n            return null;\n        }\n        return this._editor.getModel().getDecorationRange(this._decorationIds[index]);\n    }\n    getRanges() {\n        if (!this._editor.hasModel()) {\n            return [];\n        }\n        const model = this._editor.getModel();\n        const result = [];\n        for (const decorationId of this._decorationIds) {\n            const range = model.getDecorationRange(decorationId);\n            if (range) {\n                result.push(range);\n            }\n        }\n        return result;\n    }\n    has(decoration) {\n        return this._decorationIds.includes(decoration.id);\n    }\n    clear() {\n        if (this._decorationIds.length === 0) {\n            // nothing to do\n            return;\n        }\n        this.set([]);\n    }\n    set(newDecorations) {\n        try {\n            this._isChangingDecorations = true;\n            this._editor.changeDecorations((accessor) => {\n                this._decorationIds = accessor.deltaDecorations(this._decorationIds, newDecorations);\n            });\n        }\n        finally {\n            this._isChangingDecorations = false;\n        }\n        return this._decorationIds;\n    }\n    append(newDecorations) {\n        let newDecorationIds = [];\n        try {\n            this._isChangingDecorations = true;\n            this._editor.changeDecorations((accessor) => {\n                newDecorationIds = accessor.deltaDecorations([], newDecorations);\n                this._decorationIds = this._decorationIds.concat(newDecorationIds);\n            });\n        }\n        finally {\n            this._isChangingDecorations = false;\n        }\n        return newDecorationIds;\n    }\n}\nconst squigglyStart = encodeURIComponent(`<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 3' enable-background='new 0 0 6 3' height='3' width='6'><g fill='`);\nconst squigglyEnd = encodeURIComponent(`'><polygon points='5.5,0 2.5,3 1.1,3 4.1,0'/><polygon points='4,0 6,2 6,0.6 5.4,0'/><polygon points='0,2 1,3 2.4,3 0,0.6'/></g></svg>`);\nfunction getSquigglySVGData(color) {\n    return squigglyStart + encodeURIComponent(color.toString()) + squigglyEnd;\n}\nconst dotdotdotStart = encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"3\" width=\"12\"><g fill=\"`);\nconst dotdotdotEnd = encodeURIComponent(`\"><circle cx=\"1\" cy=\"1\" r=\"1\"/><circle cx=\"5\" cy=\"1\" r=\"1\"/><circle cx=\"9\" cy=\"1\" r=\"1\"/></g></svg>`);\nfunction getDotDotDotSVGData(color) {\n    return dotdotdotStart + encodeURIComponent(color.toString()) + dotdotdotEnd;\n}\nregisterThemingParticipant((theme, collector) => {\n    const errorForeground = theme.getColor(editorErrorForeground);\n    if (errorForeground) {\n        collector.addRule(`.monaco-editor .${\"squiggly-error\" /* ClassName.EditorErrorDecoration */} { background: url(\"data:image/svg+xml,${getSquigglySVGData(errorForeground)}\") repeat-x bottom left; }`);\n        collector.addRule(`:root { --monaco-editor-error-decoration: url(\"data:image/svg+xml,${getSquigglySVGData(errorForeground)}\"); }`);\n    }\n    const warningForeground = theme.getColor(editorWarningForeground);\n    if (warningForeground) {\n        collector.addRule(`.monaco-editor .${\"squiggly-warning\" /* ClassName.EditorWarningDecoration */} { background: url(\"data:image/svg+xml,${getSquigglySVGData(warningForeground)}\") repeat-x bottom left; }`);\n        collector.addRule(`:root { --monaco-editor-warning-decoration: url(\"data:image/svg+xml,${getSquigglySVGData(warningForeground)}\"); }`);\n    }\n    const infoForeground = theme.getColor(editorInfoForeground);\n    if (infoForeground) {\n        collector.addRule(`.monaco-editor .${\"squiggly-info\" /* ClassName.EditorInfoDecoration */} { background: url(\"data:image/svg+xml,${getSquigglySVGData(infoForeground)}\") repeat-x bottom left; }`);\n        collector.addRule(`:root { --monaco-editor-info-decoration: url(\"data:image/svg+xml,${getSquigglySVGData(infoForeground)}\"); }`);\n    }\n    const hintForeground = theme.getColor(editorHintForeground);\n    if (hintForeground) {\n        collector.addRule(`.monaco-editor .${\"squiggly-hint\" /* ClassName.EditorHintDecoration */} { background: url(\"data:image/svg+xml,${getDotDotDotSVGData(hintForeground)}\") no-repeat bottom left; }`);\n        collector.addRule(`:root { --monaco-editor-hint-decoration: url(\"data:image/svg+xml,${getDotDotDotSVGData(hintForeground)}\"); }`);\n    }\n    const unnecessaryForeground = theme.getColor(editorUnnecessaryCodeOpacity);\n    if (unnecessaryForeground) {\n        collector.addRule(`.monaco-editor.showUnused .${\"squiggly-inline-unnecessary\" /* ClassName.EditorUnnecessaryInlineDecoration */} { opacity: ${unnecessaryForeground.rgba.a}; }`);\n        collector.addRule(`:root { --monaco-editor-unnecessary-decoration-opacity: ${unnecessaryForeground.rgba.a}; }`);\n    }\n});\n\nexport { BooleanEventEmitter, CodeEditorWidget, EditorModeContext };\n","import { ConvenientObservable } from './baseObservable.js';\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/**\n * Represents an efficient observable whose value never changes.\n */\nfunction constObservable(value) {\n    return new ConstObservable(value);\n}\nclass ConstObservable extends ConvenientObservable {\n    constructor(value) {\n        super();\n        this.value = value;\n    }\n    get debugName() {\n        return this.toString();\n    }\n    get() {\n        return this.value;\n    }\n    addObserver(observer) {\n        // NO OP\n    }\n    removeObserver(observer) {\n        // NO OP\n    }\n    toString() {\n        return `Const: ${this.value}`;\n    }\n}\n\nexport { constObservable };\n","import './observableInternal/index.js';\nimport { constObservable } from './observableInternal/observables/constObservable.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction readHotReloadableExport(value, reader) {\n    return value;\n}\nfunction createHotClass(clazz) {\n    {\n        return constObservable(clazz);\n    }\n}\n\nexport { createHotClass, readHotReloadableExport };\n","import { localize } from '../../../nls.js';\nimport { createDecorator } from '../../instantiation/common/instantiation.js';\n\nconst IAccessibilitySignalService = createDecorator('accessibilitySignalService');\n/**\n * Corresponds to the audio files in ./media.\n*/\nclass Sound {\n    static register(options) {\n        const sound = new Sound(options.fileName);\n        return sound;\n    }\n    static { this.error = Sound.register({ fileName: 'error.mp3' }); }\n    static { this.warning = Sound.register({ fileName: 'warning.mp3' }); }\n    static { this.success = Sound.register({ fileName: 'success.mp3' }); }\n    static { this.foldedArea = Sound.register({ fileName: 'foldedAreas.mp3' }); }\n    static { this.break = Sound.register({ fileName: 'break.mp3' }); }\n    static { this.quickFixes = Sound.register({ fileName: 'quickFixes.mp3' }); }\n    static { this.taskCompleted = Sound.register({ fileName: 'taskCompleted.mp3' }); }\n    static { this.taskFailed = Sound.register({ fileName: 'taskFailed.mp3' }); }\n    static { this.terminalBell = Sound.register({ fileName: 'terminalBell.mp3' }); }\n    static { this.diffLineInserted = Sound.register({ fileName: 'diffLineInserted.mp3' }); }\n    static { this.diffLineDeleted = Sound.register({ fileName: 'diffLineDeleted.mp3' }); }\n    static { this.diffLineModified = Sound.register({ fileName: 'diffLineModified.mp3' }); }\n    static { this.requestSent = Sound.register({ fileName: 'requestSent.mp3' }); }\n    static { this.responseReceived1 = Sound.register({ fileName: 'responseReceived1.mp3' }); }\n    static { this.responseReceived2 = Sound.register({ fileName: 'responseReceived2.mp3' }); }\n    static { this.responseReceived3 = Sound.register({ fileName: 'responseReceived3.mp3' }); }\n    static { this.responseReceived4 = Sound.register({ fileName: 'responseReceived4.mp3' }); }\n    static { this.clear = Sound.register({ fileName: 'clear.mp3' }); }\n    static { this.save = Sound.register({ fileName: 'save.mp3' }); }\n    static { this.format = Sound.register({ fileName: 'format.mp3' }); }\n    static { this.voiceRecordingStarted = Sound.register({ fileName: 'voiceRecordingStarted.mp3' }); }\n    static { this.voiceRecordingStopped = Sound.register({ fileName: 'voiceRecordingStopped.mp3' }); }\n    static { this.progress = Sound.register({ fileName: 'progress.mp3' }); }\n    static { this.chatEditModifiedFile = Sound.register({ fileName: 'chatEditModifiedFile.mp3' }); }\n    static { this.editsKept = Sound.register({ fileName: 'editsKept.mp3' }); }\n    static { this.editsUndone = Sound.register({ fileName: 'editsUndone.mp3' }); }\n    static { this.nextEditSuggestion = Sound.register({ fileName: 'nextEditSuggestion.mp3' }); }\n    static { this.terminalCommandSucceeded = Sound.register({ fileName: 'terminalCommandSucceeded.mp3' }); }\n    static { this.chatUserActionRequired = Sound.register({ fileName: 'chatUserActionRequired.mp3' }); }\n    static { this.codeActionTriggered = Sound.register({ fileName: 'codeActionTriggered.mp3' }); }\n    static { this.codeActionApplied = Sound.register({ fileName: 'codeActionApplied.mp3' }); }\n    constructor(fileName) {\n        this.fileName = fileName;\n    }\n}\nclass SoundSource {\n    constructor(randomOneOf) {\n        this.randomOneOf = randomOneOf;\n    }\n}\nclass AccessibilitySignal {\n    constructor(sound, name, legacySoundSettingsKey, settingsKey, legacyAnnouncementSettingsKey, announcementMessage, managesOwnEnablement = false) {\n        this.sound = sound;\n        this.name = name;\n        this.legacySoundSettingsKey = legacySoundSettingsKey;\n        this.settingsKey = settingsKey;\n        this.legacyAnnouncementSettingsKey = legacyAnnouncementSettingsKey;\n        this.announcementMessage = announcementMessage;\n        this.managesOwnEnablement = managesOwnEnablement;\n    }\n    static { this._signals = new Set(); }\n    static register(options) {\n        const soundSource = new SoundSource('randomOneOf' in options.sound ? options.sound.randomOneOf : [options.sound]);\n        const signal = new AccessibilitySignal(soundSource, options.name, options.legacySoundSettingsKey, options.settingsKey, options.legacyAnnouncementSettingsKey, options.announcementMessage, options.managesOwnEnablement);\n        AccessibilitySignal._signals.add(signal);\n        return signal;\n    }\n    static { this.errorAtPosition = AccessibilitySignal.register({\n        name: localize(1576, 'Error at Position'),\n        sound: Sound.error,\n        announcementMessage: localize(1577, 'Error'),\n        settingsKey: 'accessibility.signals.positionHasError',\n        delaySettingsKey: 'accessibility.signalOptions.delays.errorAtPosition'\n    }); }\n    static { this.warningAtPosition = AccessibilitySignal.register({\n        name: localize(1578, 'Warning at Position'),\n        sound: Sound.warning,\n        announcementMessage: localize(1579, 'Warning'),\n        settingsKey: 'accessibility.signals.positionHasWarning',\n        delaySettingsKey: 'accessibility.signalOptions.delays.warningAtPosition'\n    }); }\n    static { this.errorOnLine = AccessibilitySignal.register({\n        name: localize(1580, 'Error on Line'),\n        sound: Sound.error,\n        legacySoundSettingsKey: 'audioCues.lineHasError',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.error',\n        announcementMessage: localize(1581, 'Error on Line'),\n        settingsKey: 'accessibility.signals.lineHasError',\n    }); }\n    static { this.warningOnLine = AccessibilitySignal.register({\n        name: localize(1582, 'Warning on Line'),\n        sound: Sound.warning,\n        legacySoundSettingsKey: 'audioCues.lineHasWarning',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.warning',\n        announcementMessage: localize(1583, 'Warning on Line'),\n        settingsKey: 'accessibility.signals.lineHasWarning',\n    }); }\n    static { this.foldedArea = AccessibilitySignal.register({\n        name: localize(1584, 'Folded Area on Line'),\n        sound: Sound.foldedArea,\n        legacySoundSettingsKey: 'audioCues.lineHasFoldedArea',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.foldedArea',\n        announcementMessage: localize(1585, 'Folded'),\n        settingsKey: 'accessibility.signals.lineHasFoldedArea',\n    }); }\n    static { this.break = AccessibilitySignal.register({\n        name: localize(1586, 'Breakpoint on Line'),\n        sound: Sound.break,\n        legacySoundSettingsKey: 'audioCues.lineHasBreakpoint',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.breakpoint',\n        announcementMessage: localize(1587, 'Breakpoint'),\n        settingsKey: 'accessibility.signals.lineHasBreakpoint',\n    }); }\n    static { this.inlineSuggestion = AccessibilitySignal.register({\n        name: localize(1588, 'Inline Suggestion on Line'),\n        sound: Sound.quickFixes,\n        legacySoundSettingsKey: 'audioCues.lineHasInlineSuggestion',\n        settingsKey: 'accessibility.signals.lineHasInlineSuggestion',\n    }); }\n    static { this.nextEditSuggestion = AccessibilitySignal.register({\n        name: localize(1589, 'Next Edit Suggestion on Line'),\n        sound: Sound.nextEditSuggestion,\n        legacySoundSettingsKey: 'audioCues.nextEditSuggestion',\n        settingsKey: 'accessibility.signals.nextEditSuggestion',\n        announcementMessage: localize(1590, 'Next Edit Suggestion'),\n    }); }\n    static { this.terminalQuickFix = AccessibilitySignal.register({\n        name: localize(1591, 'Terminal Quick Fix'),\n        sound: Sound.quickFixes,\n        legacySoundSettingsKey: 'audioCues.terminalQuickFix',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.terminalQuickFix',\n        announcementMessage: localize(1592, 'Quick Fix'),\n        settingsKey: 'accessibility.signals.terminalQuickFix',\n    }); }\n    static { this.onDebugBreak = AccessibilitySignal.register({\n        name: localize(1593, 'Debugger Stopped on Breakpoint'),\n        sound: Sound.break,\n        legacySoundSettingsKey: 'audioCues.onDebugBreak',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.onDebugBreak',\n        announcementMessage: localize(1594, 'Breakpoint'),\n        settingsKey: 'accessibility.signals.onDebugBreak',\n    }); }\n    static { this.noInlayHints = AccessibilitySignal.register({\n        name: localize(1595, 'No Inlay Hints on Line'),\n        sound: Sound.error,\n        legacySoundSettingsKey: 'audioCues.noInlayHints',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.noInlayHints',\n        announcementMessage: localize(1596, 'No Inlay Hints'),\n        settingsKey: 'accessibility.signals.noInlayHints',\n    }); }\n    static { this.taskCompleted = AccessibilitySignal.register({\n        name: localize(1597, 'Task Completed'),\n        sound: Sound.taskCompleted,\n        legacySoundSettingsKey: 'audioCues.taskCompleted',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.taskCompleted',\n        announcementMessage: localize(1598, 'Task Completed'),\n        settingsKey: 'accessibility.signals.taskCompleted',\n    }); }\n    static { this.taskFailed = AccessibilitySignal.register({\n        name: localize(1599, 'Task Failed'),\n        sound: Sound.taskFailed,\n        legacySoundSettingsKey: 'audioCues.taskFailed',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.taskFailed',\n        announcementMessage: localize(1600, 'Task Failed'),\n        settingsKey: 'accessibility.signals.taskFailed',\n    }); }\n    static { this.terminalCommandFailed = AccessibilitySignal.register({\n        name: localize(1601, 'Terminal Command Failed'),\n        sound: Sound.error,\n        legacySoundSettingsKey: 'audioCues.terminalCommandFailed',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.terminalCommandFailed',\n        announcementMessage: localize(1602, 'Command Failed'),\n        settingsKey: 'accessibility.signals.terminalCommandFailed',\n    }); }\n    static { this.terminalCommandSucceeded = AccessibilitySignal.register({\n        name: localize(1603, 'Terminal Command Succeeded'),\n        sound: Sound.terminalCommandSucceeded,\n        announcementMessage: localize(1604, 'Command Succeeded'),\n        settingsKey: 'accessibility.signals.terminalCommandSucceeded',\n    }); }\n    static { this.terminalBell = AccessibilitySignal.register({\n        name: localize(1605, 'Terminal Bell'),\n        sound: Sound.terminalBell,\n        legacySoundSettingsKey: 'audioCues.terminalBell',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.terminalBell',\n        announcementMessage: localize(1606, 'Terminal Bell'),\n        settingsKey: 'accessibility.signals.terminalBell',\n    }); }\n    static { this.notebookCellCompleted = AccessibilitySignal.register({\n        name: localize(1607, 'Notebook Cell Completed'),\n        sound: Sound.taskCompleted,\n        legacySoundSettingsKey: 'audioCues.notebookCellCompleted',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.notebookCellCompleted',\n        announcementMessage: localize(1608, 'Notebook Cell Completed'),\n        settingsKey: 'accessibility.signals.notebookCellCompleted',\n    }); }\n    static { this.notebookCellFailed = AccessibilitySignal.register({\n        name: localize(1609, 'Notebook Cell Failed'),\n        sound: Sound.taskFailed,\n        legacySoundSettingsKey: 'audioCues.notebookCellFailed',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.notebookCellFailed',\n        announcementMessage: localize(1610, 'Notebook Cell Failed'),\n        settingsKey: 'accessibility.signals.notebookCellFailed',\n    }); }\n    static { this.diffLineInserted = AccessibilitySignal.register({\n        name: localize(1611, 'Diff Line Inserted'),\n        sound: Sound.diffLineInserted,\n        legacySoundSettingsKey: 'audioCues.diffLineInserted',\n        settingsKey: 'accessibility.signals.diffLineInserted',\n    }); }\n    static { this.diffLineDeleted = AccessibilitySignal.register({\n        name: localize(1612, 'Diff Line Deleted'),\n        sound: Sound.diffLineDeleted,\n        legacySoundSettingsKey: 'audioCues.diffLineDeleted',\n        settingsKey: 'accessibility.signals.diffLineDeleted',\n    }); }\n    static { this.diffLineModified = AccessibilitySignal.register({\n        name: localize(1613, 'Diff Line Modified'),\n        sound: Sound.diffLineModified,\n        legacySoundSettingsKey: 'audioCues.diffLineModified',\n        settingsKey: 'accessibility.signals.diffLineModified',\n    }); }\n    static { this.chatEditModifiedFile = AccessibilitySignal.register({\n        name: localize(1614, 'Chat Edit Modified File'),\n        sound: Sound.chatEditModifiedFile,\n        announcementMessage: localize(1615, 'File Modified from Chat Edits'),\n        settingsKey: 'accessibility.signals.chatEditModifiedFile',\n    }); }\n    static { this.chatRequestSent = AccessibilitySignal.register({\n        name: localize(1616, 'Chat Request Sent'),\n        sound: Sound.requestSent,\n        legacySoundSettingsKey: 'audioCues.chatRequestSent',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.chatRequestSent',\n        announcementMessage: localize(1617, 'Chat Request Sent'),\n        settingsKey: 'accessibility.signals.chatRequestSent',\n    }); }\n    static { this.chatResponseReceived = AccessibilitySignal.register({\n        name: localize(1618, 'Chat Response Received'),\n        legacySoundSettingsKey: 'audioCues.chatResponseReceived',\n        sound: {\n            randomOneOf: [\n                Sound.responseReceived1,\n                Sound.responseReceived2,\n                Sound.responseReceived3,\n                Sound.responseReceived4\n            ]\n        },\n        settingsKey: 'accessibility.signals.chatResponseReceived'\n    }); }\n    static { this.codeActionTriggered = AccessibilitySignal.register({\n        name: localize(1619, 'Code Action Request Triggered'),\n        sound: Sound.codeActionTriggered,\n        legacySoundSettingsKey: 'audioCues.codeActionRequestTriggered',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.codeActionRequestTriggered',\n        announcementMessage: localize(1620, 'Code Action Request Triggered'),\n        settingsKey: 'accessibility.signals.codeActionTriggered',\n    }); }\n    static { this.codeActionApplied = AccessibilitySignal.register({\n        name: localize(1621, 'Code Action Applied'),\n        legacySoundSettingsKey: 'audioCues.codeActionApplied',\n        sound: Sound.codeActionApplied,\n        settingsKey: 'accessibility.signals.codeActionApplied'\n    }); }\n    static { this.progress = AccessibilitySignal.register({\n        name: localize(1622, 'Progress'),\n        sound: Sound.progress,\n        legacySoundSettingsKey: 'audioCues.chatResponsePending',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.progress',\n        announcementMessage: localize(1623, 'Progress'),\n        settingsKey: 'accessibility.signals.progress'\n    }); }\n    static { this.clear = AccessibilitySignal.register({\n        name: localize(1624, 'Clear'),\n        sound: Sound.clear,\n        legacySoundSettingsKey: 'audioCues.clear',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.clear',\n        announcementMessage: localize(1625, 'Clear'),\n        settingsKey: 'accessibility.signals.clear'\n    }); }\n    static { this.save = AccessibilitySignal.register({\n        name: localize(1626, 'Save'),\n        sound: Sound.save,\n        legacySoundSettingsKey: 'audioCues.save',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.save',\n        announcementMessage: localize(1627, 'Save'),\n        settingsKey: 'accessibility.signals.save'\n    }); }\n    static { this.format = AccessibilitySignal.register({\n        name: localize(1628, 'Format'),\n        sound: Sound.format,\n        legacySoundSettingsKey: 'audioCues.format',\n        legacyAnnouncementSettingsKey: 'accessibility.alert.format',\n        announcementMessage: localize(1629, 'Format'),\n        settingsKey: 'accessibility.signals.format'\n    }); }\n    static { this.voiceRecordingStarted = AccessibilitySignal.register({\n        name: localize(1630, 'Voice Recording Started'),\n        sound: Sound.voiceRecordingStarted,\n        legacySoundSettingsKey: 'audioCues.voiceRecordingStarted',\n        settingsKey: 'accessibility.signals.voiceRecordingStarted'\n    }); }\n    static { this.voiceRecordingStopped = AccessibilitySignal.register({\n        name: localize(1631, 'Voice Recording Stopped'),\n        sound: Sound.voiceRecordingStopped,\n        legacySoundSettingsKey: 'audioCues.voiceRecordingStopped',\n        settingsKey: 'accessibility.signals.voiceRecordingStopped'\n    }); }\n    static { this.editsKept = AccessibilitySignal.register({\n        name: localize(1632, 'Edits Kept'),\n        sound: Sound.editsKept,\n        announcementMessage: localize(1633, 'Edits Kept'),\n        settingsKey: 'accessibility.signals.editsKept',\n    }); }\n    static { this.editsUndone = AccessibilitySignal.register({\n        name: localize(1634, 'Undo Edits'),\n        sound: Sound.editsUndone,\n        announcementMessage: localize(1635, 'Edits Undone'),\n        settingsKey: 'accessibility.signals.editsUndone',\n    }); }\n    static { this.chatUserActionRequired = AccessibilitySignal.register({\n        name: localize(1636, 'Chat User Action Required'),\n        sound: Sound.chatUserActionRequired,\n        announcementMessage: localize(1637, 'Chat User Action Required'),\n        settingsKey: 'accessibility.signals.chatUserActionRequired',\n        managesOwnEnablement: true\n    }); }\n}\n\nexport { AccessibilitySignal, IAccessibilitySignalService, Sound, SoundSource };\n","import { DisposableStore } from '../../../base/common/lifecycle.js';\nimport '../../../base/common/observableInternal/index.js';\nimport { DebugLocation } from '../../../base/common/observableInternal/debugLocation.js';\nimport { observableFromEventOpts } from '../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { derivedOpts } from '../../../base/common/observableInternal/observables/derived.js';\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/** Creates an observable update when a configuration key updates. */\nfunction observableConfigValue(key, defaultValue, configurationService, debugLocation = DebugLocation.ofCaller()) {\n    return observableFromEventOpts({ debugName: () => `Configuration Key \"${key}\"`, }, (handleChange) => configurationService.onDidChangeConfiguration(e => {\n        if (e.affectsConfiguration(key)) {\n            handleChange(e);\n        }\n    }), () => configurationService.getValue(key) ?? defaultValue, debugLocation);\n}\n/** Update the configuration key with a value derived from observables. */\nfunction bindContextKey(key, service, computeValue, debugLocation = DebugLocation.ofCaller()) {\n    const boundKey = key.bindTo(service);\n    const store = new DisposableStore();\n    derivedOpts({ debugName: () => `Set Context Key \"${key.key}\"` }, reader => {\n        const value = computeValue(reader);\n        boundKey.set(value);\n        return value;\n    }, debugLocation).recomputeInitiallyAndOnChange(store);\n    return store;\n}\n\nexport { bindContextKey, observableConfigValue };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\n\nconst IProgressService = createDecorator('progressService');\nclass Progress {\n    static { this.None = Object.freeze({ report() { } }); }\n    constructor(callback) {\n        this.callback = callback;\n    }\n    report(item) {\n        this._value = item;\n        this.callback(this._value);\n    }\n}\nconst IEditorProgressService = createDecorator('editorProgressService');\n\nexport { IEditorProgressService, IProgressService, Progress };\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 *--------------------------------------------------------------------------------------------*/\nclass StableEditorScrollState {\n    static capture(editor) {\n        if (editor.getScrollTop() === 0 || editor.hasPendingScrollAnimation()) {\n            // Never mess with the scroll top if the editor is at the top of the file or if there is a pending scroll animation\n            return new StableEditorScrollState(editor.getScrollTop(), editor.getContentHeight(), null, 0, null);\n        }\n        let visiblePosition = null;\n        let visiblePositionScrollDelta = 0;\n        const visibleRanges = editor.getVisibleRanges();\n        if (visibleRanges.length > 0) {\n            visiblePosition = visibleRanges[0].getStartPosition();\n            const visiblePositionScrollTop = editor.getTopForPosition(visiblePosition.lineNumber, visiblePosition.column);\n            visiblePositionScrollDelta = editor.getScrollTop() - visiblePositionScrollTop;\n        }\n        return new StableEditorScrollState(editor.getScrollTop(), editor.getContentHeight(), visiblePosition, visiblePositionScrollDelta, editor.getPosition());\n    }\n    constructor(_initialScrollTop, _initialContentHeight, _visiblePosition, _visiblePositionScrollDelta, _cursorPosition) {\n        this._initialScrollTop = _initialScrollTop;\n        this._initialContentHeight = _initialContentHeight;\n        this._visiblePosition = _visiblePosition;\n        this._visiblePositionScrollDelta = _visiblePositionScrollDelta;\n        this._cursorPosition = _cursorPosition;\n    }\n    restore(editor) {\n        if (this._initialContentHeight === editor.getContentHeight() && this._initialScrollTop === editor.getScrollTop()) {\n            // The editor's content height and scroll top haven't changed, so we don't need to do anything\n            return;\n        }\n        if (this._visiblePosition) {\n            const visiblePositionScrollTop = editor.getTopForPosition(this._visiblePosition.lineNumber, this._visiblePosition.column);\n            editor.setScrollTop(visiblePositionScrollTop + this._visiblePositionScrollDelta);\n        }\n    }\n    restoreRelativeVerticalPositionOfCursor(editor) {\n        if (this._initialContentHeight === editor.getContentHeight() && this._initialScrollTop === editor.getScrollTop()) {\n            // The editor's content height and scroll top haven't changed, so we don't need to do anything\n            return;\n        }\n        const currentCursorPosition = editor.getPosition();\n        if (!this._cursorPosition || !currentCursorPosition) {\n            return;\n        }\n        const offset = editor.getTopForLineNumber(currentCursorPosition.lineNumber) - editor.getTopForLineNumber(this._cursorPosition.lineNumber);\n        editor.setScrollTop(editor.getScrollTop() + offset, 1 /* ScrollType.Immediate */);\n    }\n}\n\nexport { StableEditorScrollState };\n","import { Mimes } from '../common/mime.js';\n\n// Common data transfers\nconst DataTransfers = {\n    /**\n     * Application specific resource transfer type\n     */\n    RESOURCES: 'ResourceURLs',\n    /**\n     * Typically transfer type for copy/paste transfers.\n     */\n    TEXT: Mimes.text,\n    /**\n     * Internal type used to pass around text/uri-list data.\n     *\n     * This is needed to work around https://bugs.chromium.org/p/chromium/issues/detail?id=239745.\n     */\n    INTERNAL_URI_LIST: 'application/vnd.code.uri-list',\n};\n\nexport { DataTransfers };\n","import { Lazy } from '../../../common/lazy.js';\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 *--------------------------------------------------------------------------------------------*/\nconst nullHoverDelegateFactory = () => ({\n    get delay() { return -1; },\n    dispose: () => { },\n    showHover: () => { return undefined; },\n});\nlet hoverDelegateFactory = nullHoverDelegateFactory;\nconst defaultHoverDelegateMouse = new Lazy(() => hoverDelegateFactory('mouse', false));\nconst defaultHoverDelegateElement = new Lazy(() => hoverDelegateFactory('element', false));\n// TODO: Remove when getDefaultHoverDelegate is no longer used\nfunction setHoverDelegateFactory(hoverDelegateProvider) {\n    hoverDelegateFactory = hoverDelegateProvider;\n}\n// TODO: Refine type for use in new IHoverService interface\nfunction getDefaultHoverDelegate(placement) {\n    if (placement === 'element') {\n        return defaultHoverDelegateElement.value;\n    }\n    return defaultHoverDelegateMouse.value;\n}\n// TODO: Create equivalent in IHoverService\nfunction createInstantHoverDelegate() {\n    // Creates a hover delegate with instant hover enabled.\n    // This hover belongs to the consumer and requires the them to dispose it.\n    // Instant hover only makes sense for 'element' placement.\n    return hoverDelegateFactory('element', true);\n}\n\nexport { createInstantHoverDelegate, getDefaultHoverDelegate, setHoverDelegateFactory };\n","import { FileAccess } from '../common/network.js';\n\nfunction asFragment(raw) {\n    return raw;\n}\nfunction asCssValueWithDefault(cssPropertyValue, dflt) {\n    if (cssPropertyValue !== undefined) {\n        const variableMatch = cssPropertyValue.match(/^\\s*var\\((.+)\\)$/);\n        if (variableMatch) {\n            const varArguments = variableMatch[1].split(',', 2);\n            if (varArguments.length === 2) {\n                dflt = asCssValueWithDefault(varArguments[1].trim(), dflt);\n            }\n            return `var(${varArguments[0]}, ${dflt})`;\n        }\n        return cssPropertyValue;\n    }\n    return dflt;\n}\nfunction identValue(value) {\n    const out = value.replaceAll(/[^_\\-a-z0-9]/gi, '');\n    if (out !== value) {\n        console.warn(`CSS ident value ${value} modified to ${out} to be safe for CSS`);\n    }\n    return asFragment(out);\n}\nfunction stringValue(value) {\n    return asFragment(`'${value.replaceAll(/'/g, '\\\\000027')}'`);\n}\n/**\n * returns url('...')\n */\nfunction asCSSUrl(uri) {\n    if (!uri) {\n        return asFragment(`url('')`);\n    }\n    return inline `url('${asFragment(CSS.escape(FileAccess.uriToBrowserUri(uri).toString(true)))}')`;\n}\nfunction className(value, escapingExpected = false) {\n    const out = CSS.escape(value);\n    if (!escapingExpected && out !== value) {\n        console.warn(`CSS class name ${value} modified to ${out} to be safe for CSS`);\n    }\n    return asFragment(out);\n}\n/**\n * Template string tag that that constructs a CSS fragment.\n *\n * All expressions in the template must be css safe values.\n */\nfunction inline(strings, ...values) {\n    return asFragment(strings.reduce((result, str, i) => {\n        const value = values[i] || '';\n        return result + str + value;\n    }, ''));\n}\nclass Builder {\n    constructor() {\n        this._parts = [];\n    }\n    push(...parts) {\n        this._parts.push(...parts);\n    }\n    join(joiner = '\\n') {\n        return asFragment(this._parts.join(joiner));\n    }\n}\n\nexport { Builder, asCSSUrl, asCssValueWithDefault, className, identValue, inline, stringValue };\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// allow-any-unicode-comment-file\n/**\n * Gets alternative Korean characters for the character code. This will return the ascii\n * character code(s) that a Hangul character may have been input with using a qwerty layout.\n *\n * This only aims to cover modern (not archaic) Hangul syllables.\n *\n * @param code The character code to get alternate characters for\n */\nfunction getKoreanAltChars(code) {\n    const result = disassembleKorean(code);\n    if (result && result.length > 0) {\n        return new Uint32Array(result);\n    }\n    return undefined;\n}\nlet codeBufferLength = 0;\nconst codeBuffer = new Uint32Array(10);\nfunction disassembleKorean(code) {\n    codeBufferLength = 0;\n    // Initial consonants (초성)\n    getCodesFromArray(code, modernConsonants, 4352 /* HangulRangeStartCode.InitialConsonant */);\n    if (codeBufferLength > 0) {\n        return codeBuffer.subarray(0, codeBufferLength);\n    }\n    // Vowels (중성)\n    getCodesFromArray(code, modernVowels, 4449 /* HangulRangeStartCode.Vowel */);\n    if (codeBufferLength > 0) {\n        return codeBuffer.subarray(0, codeBufferLength);\n    }\n    // Final consonants (종성)\n    getCodesFromArray(code, modernFinalConsonants, 4520 /* HangulRangeStartCode.FinalConsonant */);\n    if (codeBufferLength > 0) {\n        return codeBuffer.subarray(0, codeBufferLength);\n    }\n    // Hangul Compatibility Jamo\n    getCodesFromArray(code, compatibilityJamo, 12593 /* HangulRangeStartCode.CompatibilityJamo */);\n    if (codeBufferLength) {\n        return codeBuffer.subarray(0, codeBufferLength);\n    }\n    // Hangul Syllables\n    if (code >= 0xAC00 && code <= 0xD7A3) {\n        const hangulIndex = code - 0xAC00;\n        const vowelAndFinalConsonantProduct = hangulIndex % 588;\n        // 0-based starting at 0x1100\n        const initialConsonantIndex = Math.floor(hangulIndex / 588);\n        // 0-based starting at 0x1161\n        const vowelIndex = Math.floor(vowelAndFinalConsonantProduct / 28);\n        // 0-based starting at 0x11A8\n        // Subtract 1 as the standard algorithm uses the 0 index to represent no\n        // final consonant\n        const finalConsonantIndex = vowelAndFinalConsonantProduct % 28 - 1;\n        if (initialConsonantIndex < modernConsonants.length) {\n            getCodesFromArray(initialConsonantIndex, modernConsonants, 0);\n        }\n        else if (4352 /* HangulRangeStartCode.InitialConsonant */ + initialConsonantIndex - 12593 /* HangulRangeStartCode.CompatibilityJamo */ < compatibilityJamo.length) {\n            getCodesFromArray(4352 /* HangulRangeStartCode.InitialConsonant */ + initialConsonantIndex, compatibilityJamo, 12593 /* HangulRangeStartCode.CompatibilityJamo */);\n        }\n        if (vowelIndex < modernVowels.length) {\n            getCodesFromArray(vowelIndex, modernVowels, 0);\n        }\n        else if (4449 /* HangulRangeStartCode.Vowel */ + vowelIndex - 12593 /* HangulRangeStartCode.CompatibilityJamo */ < compatibilityJamo.length) {\n            getCodesFromArray(4449 /* HangulRangeStartCode.Vowel */ + vowelIndex - 12593 /* HangulRangeStartCode.CompatibilityJamo */, compatibilityJamo, 12593 /* HangulRangeStartCode.CompatibilityJamo */);\n        }\n        if (finalConsonantIndex >= 0) {\n            if (finalConsonantIndex < modernFinalConsonants.length) {\n                getCodesFromArray(finalConsonantIndex, modernFinalConsonants, 0);\n            }\n            else if (4520 /* HangulRangeStartCode.FinalConsonant */ + finalConsonantIndex - 12593 /* HangulRangeStartCode.CompatibilityJamo */ < compatibilityJamo.length) {\n                getCodesFromArray(4520 /* HangulRangeStartCode.FinalConsonant */ + finalConsonantIndex - 12593 /* HangulRangeStartCode.CompatibilityJamo */, compatibilityJamo, 12593 /* HangulRangeStartCode.CompatibilityJamo */);\n            }\n        }\n        if (codeBufferLength > 0) {\n            return codeBuffer.subarray(0, codeBufferLength);\n        }\n    }\n    return undefined;\n}\nfunction getCodesFromArray(code, array, arrayStartIndex) {\n    // Verify the code is within the array's range\n    if (code >= arrayStartIndex && code < arrayStartIndex + array.length) {\n        addCodesToBuffer(array[code - arrayStartIndex]);\n    }\n}\nfunction addCodesToBuffer(codes) {\n    // NUL is ignored, this is used for archaic characters to avoid using a Map\n    // for the data\n    if (codes === 0 /* AsciiCode.NUL */) {\n        return;\n    }\n    // Number stored in format: OptionalThirdCode << 16 | OptionalSecondCode << 8 | Code\n    codeBuffer[codeBufferLength++] = codes & 0xFF;\n    if (codes >> 8) {\n        codeBuffer[codeBufferLength++] = (codes >> 8) & 0xFF;\n    }\n    if (codes >> 16) {\n        codeBuffer[codeBufferLength++] = (codes >> 16) & 0xFF;\n    }\n}\n/**\n * Hangul Jamo - Modern consonants #1\n *\n * Range U+1100..U+1112\n *\n * |        | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |\n * |--------|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n * | U+110x | ᄀ | ᄁ | ᄂ | ᄃ | ᄄ | ᄅ | ᄆ | ᄇ | ᄈ | ᄉ | ᄊ | ᄋ | ᄌ | ᄍ | ᄎ | ᄏ |\n * | U+111x | ᄐ | ᄑ | ᄒ |\n */\nconst modernConsonants = new Uint8Array([\n    114 /* AsciiCode.r */, // ㄱ\n    82 /* AsciiCode.R */, // ㄲ\n    115 /* AsciiCode.s */, // ㄴ\n    101 /* AsciiCode.e */, // ㄷ\n    69 /* AsciiCode.E */, // ㄸ\n    102 /* AsciiCode.f */, // ㄹ\n    97 /* AsciiCode.a */, // ㅁ\n    113 /* AsciiCode.q */, // ㅂ\n    81 /* AsciiCode.Q */, // ㅃ\n    116 /* AsciiCode.t */, // ㅅ\n    84 /* AsciiCode.T */, // ㅆ\n    100 /* AsciiCode.d */, // ㅇ\n    119 /* AsciiCode.w */, // ㅈ\n    87 /* AsciiCode.W */, // ㅉ\n    99 /* AsciiCode.c */, // ㅊ\n    122 /* AsciiCode.z */, // ㅋ\n    120 /* AsciiCode.x */, // ㅌ\n    118 /* AsciiCode.v */, // ㅍ\n    103 /* AsciiCode.g */, // ㅎ\n]);\n/**\n * Hangul Jamo - Modern Vowels\n *\n * Range U+1161..U+1175\n *\n * |        | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |\n * |--------|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n * | U+116x |   | ᅡ | ᅢ | ᅣ | ᅤ | ᅥ | ᅦ | ᅧ | ᅨ | ᅩ | ᅪ | ᅫ | ᅬ | ᅭ | ᅮ | ᅯ |\n * | U+117x | ᅰ | ᅱ | ᅲ | ᅳ | ᅴ | ᅵ |\n */\nconst modernVowels = new Uint16Array([\n    107 /* AsciiCode.k */, //  -> ㅏ\n    111 /* AsciiCode.o */, //  -> ㅐ\n    105 /* AsciiCode.i */, //  -> ㅑ\n    79 /* AsciiCode.O */, //  -> ㅒ\n    106 /* AsciiCode.j */, //  -> ㅓ\n    112 /* AsciiCode.p */, //  -> ㅔ\n    117 /* AsciiCode.u */, //  -> ㅕ\n    80 /* AsciiCode.P */, //  -> ㅖ\n    104 /* AsciiCode.h */, //  -> ㅗ\n    27496 /* AsciiCodeCombo.hk */, //  -> ㅘ\n    28520 /* AsciiCodeCombo.ho */, //  -> ㅙ\n    27752 /* AsciiCodeCombo.hl */, //  -> ㅚ\n    121 /* AsciiCode.y */, //  -> ㅛ\n    110 /* AsciiCode.n */, //  -> ㅜ\n    27246 /* AsciiCodeCombo.nj */, //  -> ㅝ\n    28782 /* AsciiCodeCombo.np */, //  -> ㅞ\n    27758 /* AsciiCodeCombo.nl */, //  -> ㅟ\n    98 /* AsciiCode.b */, //  -> ㅠ\n    109 /* AsciiCode.m */, //  -> ㅡ\n    27757 /* AsciiCodeCombo.ml */, //  -> ㅢ\n    108 /* AsciiCode.l */, //  -> ㅣ\n]);\n/**\n * Hangul Jamo - Modern Consonants #2\n *\n * Range U+11A8..U+11C2\n *\n * |        | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |\n * |--------|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n * | U+11Ax |   |   |   |   |   |   |   |   | ᆨ | ᆩ | ᆪ | ᆫ | ᆬ | ᆭ | ᆮ | ᆯ |\n * | U+11Bx | ᆰ | ᆱ | ᆲ | ᆳ | ᆴ | ᆵ | ᆶ | ᆷ | ᆸ | ᆹ | ᆺ | ᆻ | ᆼ | ᆽ | ᆾ | ᆿ |\n * | U+11Cx | ᇀ | ᇁ | ᇂ |\n */\nconst modernFinalConsonants = new Uint16Array([\n    114 /* AsciiCode.r */, // ㄱ\n    82 /* AsciiCode.R */, // ㄲ\n    29810 /* AsciiCodeCombo.rt */, // ㄳ\n    115 /* AsciiCode.s */, // ㄴ\n    30579 /* AsciiCodeCombo.sw */, // ㄵ\n    26483 /* AsciiCodeCombo.sg */, // ㄶ\n    101 /* AsciiCode.e */, // ㄷ\n    102 /* AsciiCode.f */, // ㄹ\n    29286 /* AsciiCodeCombo.fr */, // ㄺ\n    24934 /* AsciiCodeCombo.fa */, // ㄻ\n    29030 /* AsciiCodeCombo.fq */, // ㄼ\n    29798 /* AsciiCodeCombo.ft */, // ㄽ\n    30822 /* AsciiCodeCombo.fx */, // ㄾ\n    30310 /* AsciiCodeCombo.fv */, // ㄿ\n    26470 /* AsciiCodeCombo.fg */, // ㅀ\n    97 /* AsciiCode.a */, // ㅁ\n    113 /* AsciiCode.q */, // ㅂ\n    29809 /* AsciiCodeCombo.qt */, // ㅄ\n    116 /* AsciiCode.t */, // ㅅ\n    84 /* AsciiCode.T */, // ㅆ\n    100 /* AsciiCode.d */, // ㅇ\n    119 /* AsciiCode.w */, // ㅈ\n    99 /* AsciiCode.c */, // ㅊ\n    122 /* AsciiCode.z */, // ㅋ\n    120 /* AsciiCode.x */, // ㅌ\n    118 /* AsciiCode.v */, // ㅍ\n    103 /* AsciiCode.g */, // ㅎ\n]);\n/**\n * Hangul Compatibility Jamo\n *\n * Range U+3131..U+318F\n *\n * This includes range includes archaic jamo which we don't consider, these are\n * given the NUL character code in order to be ignored.\n *\n * |        | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |\n * |--------|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n * | U+313x |   | ㄱ | ㄲ | ㄳ | ㄴ | ㄵ | ㄶ | ㄷ | ㄸ | ㄹ | ㄺ | ㄻ | ㄼ | ㄽ | ㄾ | ㄿ |\n * | U+314x | ㅀ | ㅁ | ㅂ | ㅃ | ㅄ | ㅅ | ㅆ | ㅇ | ㅈ | ㅉ | ㅊ | ㅋ | ㅌ | ㅍ | ㅎ | ㅏ |\n * | U+315x | ㅐ | ㅑ | ㅒ | ㅓ | ㅔ | ㅕ | ㅖ | ㅗ | ㅘ | ㅙ | ㅚ | ㅛ | ㅜ | ㅝ | ㅞ | ㅟ |\n * | U+316x | ㅠ | ㅡ | ㅢ | ㅣ | HF | ㅥ | ㅦ | ㅧ | ㅨ | ㅩ | ㅪ | ㅫ | ㅬ | ㅭ | ㅮ | ㅯ |\n * | U+317x | ㅰ | ㅱ | ㅲ | ㅳ | ㅴ | ㅵ | ㅶ | ㅷ | ㅸ | ㅹ | ㅺ | ㅻ | ㅼ | ㅽ | ㅾ | ㅿ |\n * | U+318x | ㆀ | ㆁ | ㆂ | ㆃ | ㆄ | ㆅ | ㆆ | ㆇ | ㆈ | ㆉ | ㆊ | ㆋ | ㆌ | ㆍ | ㆎ |\n */\nconst compatibilityJamo = new Uint16Array([\n    114 /* AsciiCode.r */, // ㄱ\n    82 /* AsciiCode.R */, // ㄲ\n    29810 /* AsciiCodeCombo.rt */, // ㄳ\n    115 /* AsciiCode.s */, // ㄴ\n    30579 /* AsciiCodeCombo.sw */, // ㄵ\n    26483 /* AsciiCodeCombo.sg */, // ㄶ\n    101 /* AsciiCode.e */, // ㄷ\n    69 /* AsciiCode.E */, // ㄸ\n    102 /* AsciiCode.f */, // ㄹ\n    29286 /* AsciiCodeCombo.fr */, // ㄺ\n    24934 /* AsciiCodeCombo.fa */, // ㄻ\n    29030 /* AsciiCodeCombo.fq */, // ㄼ\n    29798 /* AsciiCodeCombo.ft */, // ㄽ\n    30822 /* AsciiCodeCombo.fx */, // ㄾ\n    30310 /* AsciiCodeCombo.fv */, // ㄿ\n    26470 /* AsciiCodeCombo.fg */, // ㅀ\n    97 /* AsciiCode.a */, // ㅁ\n    113 /* AsciiCode.q */, // ㅂ\n    81 /* AsciiCode.Q */, // ㅃ\n    29809 /* AsciiCodeCombo.qt */, // ㅄ\n    116 /* AsciiCode.t */, // ㅅ\n    84 /* AsciiCode.T */, // ㅆ\n    100 /* AsciiCode.d */, // ㅇ\n    119 /* AsciiCode.w */, // ㅈ\n    87 /* AsciiCode.W */, // ㅉ\n    99 /* AsciiCode.c */, // ㅊ\n    122 /* AsciiCode.z */, // ㅋ\n    120 /* AsciiCode.x */, // ㅌ\n    118 /* AsciiCode.v */, // ㅍ\n    103 /* AsciiCode.g */, // ㅎ\n    107 /* AsciiCode.k */, // ㅏ\n    111 /* AsciiCode.o */, // ㅐ\n    105 /* AsciiCode.i */, // ㅑ\n    79 /* AsciiCode.O */, // ㅒ\n    106 /* AsciiCode.j */, // ㅓ\n    112 /* AsciiCode.p */, // ㅔ\n    117 /* AsciiCode.u */, // ㅕ\n    80 /* AsciiCode.P */, // ㅖ\n    104 /* AsciiCode.h */, // ㅗ\n    27496 /* AsciiCodeCombo.hk */, // ㅘ\n    28520 /* AsciiCodeCombo.ho */, // ㅙ\n    27752 /* AsciiCodeCombo.hl */, // ㅚ\n    121 /* AsciiCode.y */, // ㅛ\n    110 /* AsciiCode.n */, // ㅜ\n    27246 /* AsciiCodeCombo.nj */, // ㅝ\n    28782 /* AsciiCodeCombo.np */, // ㅞ\n    27758 /* AsciiCodeCombo.nl */, // ㅟ\n    98 /* AsciiCode.b */, // ㅠ\n    109 /* AsciiCode.m */, // ㅡ\n    27757 /* AsciiCodeCombo.ml */, // ㅢ\n    108 /* AsciiCode.l */, // ㅣ\n    // HF: Hangul Filler (everything after this is archaic)\n    // ㅥ\n    // ㅦ\n    // ㅧ\n    // ㅨ\n    // ㅩ\n    // ㅪ\n    // ㅫ\n    // ㅬ\n    // ㅮ\n    // ㅯ\n    // ㅰ\n    // ㅱ\n    // ㅲ\n    // ㅳ\n    // ㅴ\n    // ㅵ\n    // ㅶ\n    // ㅷ\n    // ㅸ\n    // ㅹ\n    // ㅺ\n    // ㅻ\n    // ㅼ\n    // ㅽ\n    // ㅾ\n    // ㅿ\n    // ㆀ\n    // ㆁ\n    // ㆂ\n    // ㆃ\n    // ㆄ\n    // ㆅ\n    // ㆆ\n    // ㆇ\n    // ㆈ\n    // ㆉ\n    // ㆊ\n    // ㆋ\n    // ㆌ\n    // ㆍ\n    // ㆎ\n]);\n\nexport { getKoreanAltChars };\n","import { LRUCache } from './map.js';\nimport { getKoreanAltChars } from './naturalLanguage/korean.js';\nimport { startsWithIgnoreCase, isEmojiImprecise, convertSimple2RegExpPattern } from './strings.js';\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// Combined filters\n/**\n * @returns A filter which combines the provided set\n * of filters with an or. The *first* filters that\n * matches defined the return value of the returned\n * filter.\n */\nfunction or(...filter) {\n    return function (word, wordToMatchAgainst) {\n        for (let i = 0, len = filter.length; i < len; i++) {\n            const match = filter[i](word, wordToMatchAgainst);\n            if (match) {\n                return match;\n            }\n        }\n        return null;\n    };\n}\n// Prefix\n_matchesPrefix.bind(undefined, false);\nconst matchesPrefix = _matchesPrefix.bind(undefined, true);\nfunction _matchesPrefix(ignoreCase, word, wordToMatchAgainst) {\n    if (!wordToMatchAgainst || wordToMatchAgainst.length < word.length) {\n        return null;\n    }\n    let matches;\n    if (ignoreCase) {\n        matches = startsWithIgnoreCase(wordToMatchAgainst, word);\n    }\n    else {\n        matches = wordToMatchAgainst.indexOf(word) === 0;\n    }\n    if (!matches) {\n        return null;\n    }\n    return word.length > 0 ? [{ start: 0, end: word.length }] : [];\n}\n// Contiguous Substring\nfunction matchesContiguousSubString(word, wordToMatchAgainst) {\n    const index = wordToMatchAgainst.toLowerCase().indexOf(word.toLowerCase());\n    if (index === -1) {\n        return null;\n    }\n    return [{ start: index, end: index + word.length }];\n}\n// Substring\nfunction matchesSubString(word, wordToMatchAgainst) {\n    return _matchesSubString(word.toLowerCase(), wordToMatchAgainst.toLowerCase(), 0, 0);\n}\nfunction _matchesSubString(word, wordToMatchAgainst, i, j) {\n    if (i === word.length) {\n        return [];\n    }\n    else if (j === wordToMatchAgainst.length) {\n        return null;\n    }\n    else {\n        if (word[i] === wordToMatchAgainst[j]) {\n            let result = null;\n            if (result = _matchesSubString(word, wordToMatchAgainst, i + 1, j + 1)) {\n                return join({ start: j, end: j + 1 }, result);\n            }\n            return null;\n        }\n        return _matchesSubString(word, wordToMatchAgainst, i, j + 1);\n    }\n}\n// CamelCase\nfunction isLower(code) {\n    return 97 /* CharCode.a */ <= code && code <= 122 /* CharCode.z */;\n}\nfunction isUpper(code) {\n    return 65 /* CharCode.A */ <= code && code <= 90 /* CharCode.Z */;\n}\nfunction isNumber(code) {\n    return 48 /* CharCode.Digit0 */ <= code && code <= 57 /* CharCode.Digit9 */;\n}\nfunction isWhitespace(code) {\n    return (code === 32 /* CharCode.Space */\n        || code === 9 /* CharCode.Tab */\n        || code === 10 /* CharCode.LineFeed */\n        || code === 13 /* CharCode.CarriageReturn */);\n}\nconst wordSeparators = new Set();\n// These are chosen as natural word separators based on writen text.\n// It is a subset of the word separators used by the monaco editor.\n'()[]{}<>`\\'\"-/;:,.?!'\n    .split('')\n    .forEach(s => wordSeparators.add(s.charCodeAt(0)));\nfunction isWordSeparator(code) {\n    return isWhitespace(code) || wordSeparators.has(code);\n}\nfunction charactersMatch(codeA, codeB) {\n    return (codeA === codeB) || (isWordSeparator(codeA) && isWordSeparator(codeB));\n}\nconst alternateCharsCache = new Map();\n/**\n * Gets alternative codes to the character code passed in. This comes in the\n * form of an array of character codes, all of which must match _in order_ to\n * successfully match.\n *\n * @param code The character code to check.\n */\nfunction getAlternateCodes(code) {\n    if (alternateCharsCache.has(code)) {\n        return alternateCharsCache.get(code);\n    }\n    // NOTE: This function is written in such a way that it can be extended in\n    // the future, but right now the return type takes into account it's only\n    // supported by a single \"alt codes provider\".\n    // `ArrayLike<ArrayLike<number>>` is a more appropriate type if changed.\n    let result;\n    const codes = getKoreanAltChars(code);\n    if (codes) {\n        result = codes;\n    }\n    alternateCharsCache.set(code, result);\n    return result;\n}\nfunction isAlphanumeric(code) {\n    return isLower(code) || isUpper(code) || isNumber(code);\n}\nfunction join(head, tail) {\n    if (tail.length === 0) {\n        tail = [head];\n    }\n    else if (head.end === tail[0].start) {\n        tail[0].start = head.start;\n    }\n    else {\n        tail.unshift(head);\n    }\n    return tail;\n}\nfunction nextAnchor(camelCaseWord, start) {\n    for (let i = start; i < camelCaseWord.length; i++) {\n        const c = camelCaseWord.charCodeAt(i);\n        if (isUpper(c) || isNumber(c) || (i > 0 && !isAlphanumeric(camelCaseWord.charCodeAt(i - 1)))) {\n            return i;\n        }\n    }\n    return camelCaseWord.length;\n}\nfunction _matchesCamelCase(word, camelCaseWord, i, j) {\n    if (i === word.length) {\n        return [];\n    }\n    else if (j === camelCaseWord.length) {\n        return null;\n    }\n    else if (word[i] !== camelCaseWord[j].toLowerCase()) {\n        return null;\n    }\n    else {\n        let result = null;\n        let nextUpperIndex = j + 1;\n        result = _matchesCamelCase(word, camelCaseWord, i + 1, j + 1);\n        while (!result && (nextUpperIndex = nextAnchor(camelCaseWord, nextUpperIndex)) < camelCaseWord.length) {\n            result = _matchesCamelCase(word, camelCaseWord, i + 1, nextUpperIndex);\n            nextUpperIndex++;\n        }\n        return result === null ? null : join({ start: j, end: j + 1 }, result);\n    }\n}\n// Heuristic to avoid computing camel case matcher for words that don't\n// look like camelCaseWords.\nfunction analyzeCamelCaseWord(word) {\n    let upper = 0, lower = 0, alpha = 0, numeric = 0, code = 0;\n    for (let i = 0; i < word.length; i++) {\n        code = word.charCodeAt(i);\n        if (isUpper(code)) {\n            upper++;\n        }\n        if (isLower(code)) {\n            lower++;\n        }\n        if (isAlphanumeric(code)) {\n            alpha++;\n        }\n        if (isNumber(code)) {\n            numeric++;\n        }\n    }\n    const upperPercent = upper / word.length;\n    const lowerPercent = lower / word.length;\n    const alphaPercent = alpha / word.length;\n    const numericPercent = numeric / word.length;\n    return { upperPercent, lowerPercent, alphaPercent, numericPercent };\n}\nfunction isUpperCaseWord(analysis) {\n    const { upperPercent, lowerPercent } = analysis;\n    return lowerPercent === 0 && upperPercent > 0.6;\n}\nfunction isCamelCaseWord(analysis) {\n    const { upperPercent, lowerPercent, alphaPercent, numericPercent } = analysis;\n    return lowerPercent > 0.2 && upperPercent < 0.8 && alphaPercent > 0.6 && numericPercent < 0.2;\n}\n// Heuristic to avoid computing camel case matcher for words that don't\n// look like camel case patterns.\nfunction isCamelCasePattern(word) {\n    let upper = 0, lower = 0, code = 0, whitespace = 0;\n    for (let i = 0; i < word.length; i++) {\n        code = word.charCodeAt(i);\n        if (isUpper(code)) {\n            upper++;\n        }\n        if (isLower(code)) {\n            lower++;\n        }\n        if (isWhitespace(code)) {\n            whitespace++;\n        }\n    }\n    if ((upper === 0 || lower === 0) && whitespace === 0) {\n        return word.length <= 30;\n    }\n    else {\n        return upper <= 5;\n    }\n}\nfunction matchesCamelCase(word, camelCaseWord) {\n    if (!camelCaseWord) {\n        return null;\n    }\n    camelCaseWord = camelCaseWord.trim();\n    if (camelCaseWord.length === 0) {\n        return null;\n    }\n    if (!isCamelCasePattern(word)) {\n        return null;\n    }\n    // TODO: Consider removing this check\n    if (camelCaseWord.length > 60) {\n        camelCaseWord = camelCaseWord.substring(0, 60);\n    }\n    const analysis = analyzeCamelCaseWord(camelCaseWord);\n    if (!isCamelCaseWord(analysis)) {\n        if (!isUpperCaseWord(analysis)) {\n            return null;\n        }\n        camelCaseWord = camelCaseWord.toLowerCase();\n    }\n    let result = null;\n    let i = 0;\n    word = word.toLowerCase();\n    while (i < camelCaseWord.length && (result = _matchesCamelCase(word, camelCaseWord, 0, i)) === null) {\n        i = nextAnchor(camelCaseWord, i + 1);\n    }\n    return result;\n}\n// Matches beginning of words supporting non-ASCII languages\n// If `contiguous` is true then matches word with beginnings of the words in the target. E.g. \"pul\" will match \"Git: Pull\"\n// Otherwise also matches sub string of the word with beginnings of the words in the target. E.g. \"gp\" or \"g p\" will match \"Git: Pull\"\n// Useful in cases where the target is words (e.g. command labels)\nfunction matchesWords(word, target, contiguous = false) {\n    if (!target || target.length === 0) {\n        return null;\n    }\n    let result = null;\n    let targetIndex = 0;\n    word = word.toLowerCase();\n    target = target.toLowerCase();\n    while (targetIndex < target.length) {\n        result = _matchesWords(word, target, 0, targetIndex, contiguous);\n        if (result !== null) {\n            break;\n        }\n        targetIndex = nextWord(target, targetIndex + 1);\n    }\n    return result;\n}\nfunction _matchesWords(word, target, wordIndex, targetIndex, contiguous) {\n    let targetIndexOffset = 0;\n    if (wordIndex === word.length) {\n        return [];\n    }\n    else if (targetIndex === target.length) {\n        return null;\n    }\n    else if (!charactersMatch(word.charCodeAt(wordIndex), target.charCodeAt(targetIndex))) {\n        // Verify alternate characters before exiting\n        const altChars = getAlternateCodes(word.charCodeAt(wordIndex));\n        if (!altChars) {\n            return null;\n        }\n        for (let k = 0; k < altChars.length; k++) {\n            if (!charactersMatch(altChars[k], target.charCodeAt(targetIndex + k))) {\n                return null;\n            }\n        }\n        targetIndexOffset += altChars.length - 1;\n    }\n    let result = null;\n    let nextWordIndex = targetIndex + targetIndexOffset + 1;\n    result = _matchesWords(word, target, wordIndex + 1, nextWordIndex, contiguous);\n    if (!contiguous) {\n        while (!result && (nextWordIndex = nextWord(target, nextWordIndex)) < target.length) {\n            result = _matchesWords(word, target, wordIndex + 1, nextWordIndex, contiguous);\n            nextWordIndex++;\n        }\n    }\n    if (!result) {\n        return null;\n    }\n    // If the characters don't exactly match, then they must be word separators (see charactersMatch(...)).\n    // We don't want to include this in the matches but we don't want to throw the target out all together so we return `result`.\n    if (word.charCodeAt(wordIndex) !== target.charCodeAt(targetIndex)) {\n        // Verify alternate characters before exiting\n        const altChars = getAlternateCodes(word.charCodeAt(wordIndex));\n        if (!altChars) {\n            return result;\n        }\n        for (let k = 0; k < altChars.length; k++) {\n            if (altChars[k] !== target.charCodeAt(targetIndex + k)) {\n                return result;\n            }\n        }\n    }\n    return join({ start: targetIndex, end: targetIndex + targetIndexOffset + 1 }, result);\n}\nfunction nextWord(word, start) {\n    for (let i = start; i < word.length; i++) {\n        if (isWordSeparator(word.charCodeAt(i)) ||\n            (i > 0 && isWordSeparator(word.charCodeAt(i - 1)))) {\n            return i;\n        }\n    }\n    return word.length;\n}\n// Fuzzy\nconst fuzzyContiguousFilter = or(matchesPrefix, matchesCamelCase, matchesContiguousSubString);\nconst fuzzySeparateFilter = or(matchesPrefix, matchesCamelCase, matchesSubString);\nconst fuzzyRegExpCache = new LRUCache(10000); // bounded to 10000 elements\nfunction matchesFuzzy(word, wordToMatchAgainst, enableSeparateSubstringMatching = false) {\n    if (typeof word !== 'string' || typeof wordToMatchAgainst !== 'string') {\n        return null; // return early for invalid input\n    }\n    // Form RegExp for wildcard matches\n    let regexp = fuzzyRegExpCache.get(word);\n    if (!regexp) {\n        regexp = new RegExp(convertSimple2RegExpPattern(word), 'i');\n        fuzzyRegExpCache.set(word, regexp);\n    }\n    // RegExp Filter\n    const match = regexp.exec(wordToMatchAgainst);\n    if (match) {\n        return [{ start: match.index, end: match.index + match[0].length }];\n    }\n    // Default Filter\n    return enableSeparateSubstringMatching ? fuzzySeparateFilter(word, wordToMatchAgainst) : fuzzyContiguousFilter(word, wordToMatchAgainst);\n}\n/**\n * Match pattern against word in a fuzzy way. As in IntelliSense and faster and more\n * powerful than `matchesFuzzy`\n */\nfunction matchesFuzzy2(pattern, word) {\n    const score = fuzzyScore(pattern, pattern.toLowerCase(), 0, word, word.toLowerCase(), 0, { firstMatchCanBeWeak: true, boostFullMatch: true });\n    return score ? createMatches(score) : null;\n}\nfunction anyScore(pattern, lowPattern, patternPos, word, lowWord, wordPos) {\n    const max = Math.min(13, pattern.length);\n    for (; patternPos < max; patternPos++) {\n        const result = fuzzyScore(pattern, lowPattern, patternPos, word, lowWord, wordPos, { firstMatchCanBeWeak: true, boostFullMatch: true });\n        if (result) {\n            return result;\n        }\n    }\n    return [0, wordPos];\n}\n//#region --- fuzzyScore ---\nfunction createMatches(score) {\n    if (typeof score === 'undefined') {\n        return [];\n    }\n    const res = [];\n    const wordPos = score[1];\n    for (let i = score.length - 1; i > 1; i--) {\n        const pos = score[i] + wordPos;\n        const last = res[res.length - 1];\n        if (last && last.end === pos) {\n            last.end = pos + 1;\n        }\n        else {\n            res.push({ start: pos, end: pos + 1 });\n        }\n    }\n    return res;\n}\nconst _maxLen = 128;\nfunction initTable() {\n    const table = [];\n    const row = [];\n    for (let i = 0; i <= _maxLen; i++) {\n        row[i] = 0;\n    }\n    for (let i = 0; i <= _maxLen; i++) {\n        table.push(row.slice(0));\n    }\n    return table;\n}\nfunction initArr(maxLen) {\n    const row = [];\n    for (let i = 0; i <= maxLen; i++) {\n        row[i] = 0;\n    }\n    return row;\n}\nconst _minWordMatchPos = initArr(2 * _maxLen); // min word position for a certain pattern position\nconst _maxWordMatchPos = initArr(2 * _maxLen); // max word position for a certain pattern position\nconst _diag = initTable(); // the length of a contiguous diagonal match\nconst _table = initTable();\nconst _arrows = initTable();\nfunction isSeparatorAtPos(value, index) {\n    if (index < 0 || index >= value.length) {\n        return false;\n    }\n    const code = value.codePointAt(index);\n    switch (code) {\n        case 95 /* CharCode.Underline */:\n        case 45 /* CharCode.Dash */:\n        case 46 /* CharCode.Period */:\n        case 32 /* CharCode.Space */:\n        case 47 /* CharCode.Slash */:\n        case 92 /* CharCode.Backslash */:\n        case 39 /* CharCode.SingleQuote */:\n        case 34 /* CharCode.DoubleQuote */:\n        case 58 /* CharCode.Colon */:\n        case 36 /* CharCode.DollarSign */:\n        case 60 /* CharCode.LessThan */:\n        case 62 /* CharCode.GreaterThan */:\n        case 40 /* CharCode.OpenParen */:\n        case 41 /* CharCode.CloseParen */:\n        case 91 /* CharCode.OpenSquareBracket */:\n        case 93 /* CharCode.CloseSquareBracket */:\n        case 123 /* CharCode.OpenCurlyBrace */:\n        case 125 /* CharCode.CloseCurlyBrace */:\n            return true;\n        case undefined:\n            return false;\n        default:\n            if (isEmojiImprecise(code)) {\n                return true;\n            }\n            return false;\n    }\n}\nfunction isWhitespaceAtPos(value, index) {\n    if (index < 0 || index >= value.length) {\n        return false;\n    }\n    const code = value.charCodeAt(index);\n    switch (code) {\n        case 32 /* CharCode.Space */:\n        case 9 /* CharCode.Tab */:\n            return true;\n        default:\n            return false;\n    }\n}\nfunction isUpperCaseAtPos(pos, word, wordLow) {\n    return word[pos] !== wordLow[pos];\n}\nfunction isPatternInWord(patternLow, patternPos, patternLen, wordLow, wordPos, wordLen, fillMinWordPosArr = false) {\n    while (patternPos < patternLen && wordPos < wordLen) {\n        if (patternLow[patternPos] === wordLow[wordPos]) {\n            if (fillMinWordPosArr) {\n                // Remember the min word position for each pattern position\n                _minWordMatchPos[patternPos] = wordPos;\n            }\n            patternPos += 1;\n        }\n        wordPos += 1;\n    }\n    return patternPos === patternLen; // pattern must be exhausted\n}\nvar FuzzyScore;\n(function (FuzzyScore) {\n    /**\n     * No matches and value `-100`\n     */\n    FuzzyScore.Default = ([-100, 0]);\n    function isDefault(score) {\n        return !score || (score.length === 2 && score[0] === -100 && score[1] === 0);\n    }\n    FuzzyScore.isDefault = isDefault;\n})(FuzzyScore || (FuzzyScore = {}));\nclass FuzzyScoreOptions {\n    static { this.default = { boostFullMatch: true, firstMatchCanBeWeak: false }; }\n    constructor(firstMatchCanBeWeak, boostFullMatch) {\n        this.firstMatchCanBeWeak = firstMatchCanBeWeak;\n        this.boostFullMatch = boostFullMatch;\n    }\n}\nfunction fuzzyScore(pattern, patternLow, patternStart, word, wordLow, wordStart, options = FuzzyScoreOptions.default) {\n    const patternLen = pattern.length > _maxLen ? _maxLen : pattern.length;\n    const wordLen = word.length > _maxLen ? _maxLen : word.length;\n    if (patternStart >= patternLen || wordStart >= wordLen || (patternLen - patternStart) > (wordLen - wordStart)) {\n        return undefined;\n    }\n    // Run a simple check if the characters of pattern occur\n    // (in order) at all in word. If that isn't the case we\n    // stop because no match will be possible\n    if (!isPatternInWord(patternLow, patternStart, patternLen, wordLow, wordStart, wordLen, true)) {\n        return undefined;\n    }\n    // Find the max matching word position for each pattern position\n    // NOTE: the min matching word position was filled in above, in the `isPatternInWord` call\n    _fillInMaxWordMatchPos(patternLen, wordLen, patternStart, wordStart, patternLow, wordLow);\n    let row = 1;\n    let column = 1;\n    let patternPos = patternStart;\n    let wordPos = wordStart;\n    const hasStrongFirstMatch = [false];\n    // There will be a match, fill in tables\n    for (row = 1, patternPos = patternStart; patternPos < patternLen; row++, patternPos++) {\n        // Reduce search space to possible matching word positions and to possible access from next row\n        const minWordMatchPos = _minWordMatchPos[patternPos];\n        const maxWordMatchPos = _maxWordMatchPos[patternPos];\n        const nextMaxWordMatchPos = (patternPos + 1 < patternLen ? _maxWordMatchPos[patternPos + 1] : wordLen);\n        for (column = minWordMatchPos - wordStart + 1, wordPos = minWordMatchPos; wordPos < nextMaxWordMatchPos; column++, wordPos++) {\n            let score = Number.MIN_SAFE_INTEGER;\n            let canComeDiag = false;\n            if (wordPos <= maxWordMatchPos) {\n                score = _doScore(pattern, patternLow, patternPos, patternStart, word, wordLow, wordPos, wordLen, wordStart, _diag[row - 1][column - 1] === 0, hasStrongFirstMatch);\n            }\n            let diagScore = 0;\n            if (score !== Number.MIN_SAFE_INTEGER) {\n                canComeDiag = true;\n                diagScore = score + _table[row - 1][column - 1];\n            }\n            const canComeLeft = wordPos > minWordMatchPos;\n            const leftScore = canComeLeft ? _table[row][column - 1] + (_diag[row][column - 1] > 0 ? -5 : 0) : 0; // penalty for a gap start\n            const canComeLeftLeft = wordPos > minWordMatchPos + 1 && _diag[row][column - 1] > 0;\n            const leftLeftScore = canComeLeftLeft ? _table[row][column - 2] + (_diag[row][column - 2] > 0 ? -5 : 0) : 0; // penalty for a gap start\n            if (canComeLeftLeft && (!canComeLeft || leftLeftScore >= leftScore) && (!canComeDiag || leftLeftScore >= diagScore)) {\n                // always prefer choosing left left to jump over a diagonal because that means a match is earlier in the word\n                _table[row][column] = leftLeftScore;\n                _arrows[row][column] = 3 /* Arrow.LeftLeft */;\n                _diag[row][column] = 0;\n            }\n            else if (canComeLeft && (!canComeDiag || leftScore >= diagScore)) {\n                // always prefer choosing left since that means a match is earlier in the word\n                _table[row][column] = leftScore;\n                _arrows[row][column] = 2 /* Arrow.Left */;\n                _diag[row][column] = 0;\n            }\n            else if (canComeDiag) {\n                _table[row][column] = diagScore;\n                _arrows[row][column] = 1 /* Arrow.Diag */;\n                _diag[row][column] = _diag[row - 1][column - 1] + 1;\n            }\n            else {\n                throw new Error(`not possible`);\n            }\n        }\n    }\n    if (!hasStrongFirstMatch[0] && !options.firstMatchCanBeWeak) {\n        return undefined;\n    }\n    row--;\n    column--;\n    const result = [_table[row][column], wordStart];\n    let backwardsDiagLength = 0;\n    let maxMatchColumn = 0;\n    while (row >= 1) {\n        // Find the column where we go diagonally up\n        let diagColumn = column;\n        do {\n            const arrow = _arrows[row][diagColumn];\n            if (arrow === 3 /* Arrow.LeftLeft */) {\n                diagColumn = diagColumn - 2;\n            }\n            else if (arrow === 2 /* Arrow.Left */) {\n                diagColumn = diagColumn - 1;\n            }\n            else {\n                // found the diagonal\n                break;\n            }\n        } while (diagColumn >= 1);\n        // Overturn the \"forwards\" decision if keeping the \"backwards\" diagonal would give a better match\n        if (backwardsDiagLength > 1 // only if we would have a contiguous match of 3 characters\n            && patternLow[patternStart + row - 1] === wordLow[wordStart + column - 1] // only if we can do a contiguous match diagonally\n            && !isUpperCaseAtPos(diagColumn + wordStart - 1, word, wordLow) // only if the forwards chose diagonal is not an uppercase\n            && backwardsDiagLength + 1 > _diag[row][diagColumn] // only if our contiguous match would be longer than the \"forwards\" contiguous match\n        ) {\n            diagColumn = column;\n        }\n        if (diagColumn === column) {\n            // this is a contiguous match\n            backwardsDiagLength++;\n        }\n        else {\n            backwardsDiagLength = 1;\n        }\n        if (!maxMatchColumn) {\n            // remember the last matched column\n            maxMatchColumn = diagColumn;\n        }\n        row--;\n        column = diagColumn - 1;\n        result.push(column);\n    }\n    if (wordLen - wordStart === patternLen && options.boostFullMatch) {\n        // the word matches the pattern with all characters!\n        // giving the score a total match boost (to come up ahead other words)\n        result[0] += 2;\n    }\n    // Add 1 penalty for each skipped character in the word\n    const skippedCharsCount = maxMatchColumn - patternLen;\n    result[0] -= skippedCharsCount;\n    return result;\n}\nfunction _fillInMaxWordMatchPos(patternLen, wordLen, patternStart, wordStart, patternLow, wordLow) {\n    let patternPos = patternLen - 1;\n    let wordPos = wordLen - 1;\n    while (patternPos >= patternStart && wordPos >= wordStart) {\n        if (patternLow[patternPos] === wordLow[wordPos]) {\n            _maxWordMatchPos[patternPos] = wordPos;\n            patternPos--;\n        }\n        wordPos--;\n    }\n}\nfunction _doScore(pattern, patternLow, patternPos, patternStart, word, wordLow, wordPos, wordLen, wordStart, newMatchStart, outFirstMatchStrong) {\n    if (patternLow[patternPos] !== wordLow[wordPos]) {\n        return Number.MIN_SAFE_INTEGER;\n    }\n    let score = 1;\n    let isGapLocation = false;\n    if (wordPos === (patternPos - patternStart)) {\n        // common prefix: `foobar <-> foobaz`\n        //                            ^^^^^\n        score = pattern[patternPos] === word[wordPos] ? 7 : 5;\n    }\n    else if (isUpperCaseAtPos(wordPos, word, wordLow) && (wordPos === 0 || !isUpperCaseAtPos(wordPos - 1, word, wordLow))) {\n        // hitting upper-case: `foo <-> forOthers`\n        //                              ^^ ^\n        score = pattern[patternPos] === word[wordPos] ? 7 : 5;\n        isGapLocation = true;\n    }\n    else if (isSeparatorAtPos(wordLow, wordPos) && (wordPos === 0 || !isSeparatorAtPos(wordLow, wordPos - 1))) {\n        // hitting a separator: `. <-> foo.bar`\n        //                                ^\n        score = 5;\n    }\n    else if (isSeparatorAtPos(wordLow, wordPos - 1) || isWhitespaceAtPos(wordLow, wordPos - 1)) {\n        // post separator: `foo <-> bar_foo`\n        //                              ^^^\n        score = 5;\n        isGapLocation = true;\n    }\n    if (score > 1 && patternPos === patternStart) {\n        outFirstMatchStrong[0] = true;\n    }\n    if (!isGapLocation) {\n        isGapLocation = isUpperCaseAtPos(wordPos, word, wordLow) || isSeparatorAtPos(wordLow, wordPos - 1) || isWhitespaceAtPos(wordLow, wordPos - 1);\n    }\n    //\n    if (patternPos === patternStart) { // first character in pattern\n        if (wordPos > wordStart) {\n            // the first pattern character would match a word character that is not at the word start\n            // so introduce a penalty to account for the gap preceding this match\n            score -= isGapLocation ? 3 : 5;\n        }\n    }\n    else {\n        if (newMatchStart) {\n            // this would be the beginning of a new match (i.e. there would be a gap before this location)\n            score += isGapLocation ? 2 : 0;\n        }\n        else {\n            // this is part of a contiguous match, so give it a slight bonus, but do so only if it would not be a preferred gap location\n            score += isGapLocation ? 0 : 1;\n        }\n    }\n    if (wordPos + 1 === wordLen) {\n        // we always penalize gaps, but this gives unfair advantages to a match that would match the last character in the word\n        // so pretend there is a gap after the last character in the word to normalize things\n        score -= isGapLocation ? 3 : 5;\n    }\n    return score;\n}\n//#endregion\n//#region --- graceful ---\nfunction fuzzyScoreGracefulAggressive(pattern, lowPattern, patternPos, word, lowWord, wordPos, options) {\n    return fuzzyScoreWithPermutations(pattern, lowPattern, patternPos, word, lowWord, wordPos, true, options);\n}\nfunction fuzzyScoreWithPermutations(pattern, lowPattern, patternPos, word, lowWord, wordPos, aggressive, options) {\n    let top = fuzzyScore(pattern, lowPattern, patternPos, word, lowWord, wordPos, options);\n    if (top && false) {\n        // when using the original pattern yield a result we`\n        // return it unless we are aggressive and try to find\n        // a better alignment, e.g. `cno` -> `^co^ns^ole` or `^c^o^nsole`.\n        return top;\n    }\n    if (pattern.length >= 3) {\n        // When the pattern is long enough then try a few (max 7)\n        // permutations of the pattern to find a better match. The\n        // permutations only swap neighbouring characters, e.g\n        // `cnoso` becomes `conso`, `cnsoo`, `cnoos`.\n        const tries = Math.min(7, pattern.length - 1);\n        for (let movingPatternPos = patternPos + 1; movingPatternPos < tries; movingPatternPos++) {\n            const newPattern = nextTypoPermutation(pattern, movingPatternPos);\n            if (newPattern) {\n                const candidate = fuzzyScore(newPattern, newPattern.toLowerCase(), patternPos, word, lowWord, wordPos, options);\n                if (candidate) {\n                    candidate[0] -= 3; // permutation penalty\n                    if (!top || candidate[0] > top[0]) {\n                        top = candidate;\n                    }\n                }\n            }\n        }\n    }\n    return top;\n}\nfunction nextTypoPermutation(pattern, patternPos) {\n    if (patternPos + 1 >= pattern.length) {\n        return undefined;\n    }\n    const swap1 = pattern[patternPos];\n    const swap2 = pattern[patternPos + 1];\n    if (swap1 === swap2) {\n        return undefined;\n    }\n    return pattern.slice(0, patternPos)\n        + swap2\n        + swap1\n        + pattern.slice(patternPos + 2);\n}\n//#endregion\n\nexport { FuzzyScore, FuzzyScoreOptions, anyScore, createMatches, fuzzyScore, fuzzyScoreGracefulAggressive, isPatternInWord, isUpper, matchesCamelCase, matchesContiguousSubString, matchesFuzzy, matchesFuzzy2, matchesPrefix, matchesSubString, matchesWords, or };\n","import { matchesFuzzy } from './filters.js';\nimport { ltrim } from './strings.js';\nimport { ThemeIcon } from './themables.js';\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 *--------------------------------------------------------------------------------------------*/\nconst iconStartMarker = '$(';\nconst iconsRegex = new RegExp(`\\\\$\\\\(${ThemeIcon.iconNameExpression}(?:${ThemeIcon.iconModifierExpression})?\\\\)`, 'g'); // no capturing groups\nconst escapeIconsRegex = new RegExp(`(\\\\\\\\)?${iconsRegex.source}`, 'g');\nfunction escapeIcons(text) {\n    return text.replace(escapeIconsRegex, (match, escaped) => escaped ? match : `\\\\${match}`);\n}\nconst markdownEscapedIconsRegex = new RegExp(`\\\\\\\\${iconsRegex.source}`, 'g');\nfunction markdownEscapeEscapedIcons(text) {\n    // Need to add an extra \\ for escaping in markdown\n    return text.replace(markdownEscapedIconsRegex, match => `\\\\${match}`);\n}\nconst stripIconsRegex = new RegExp(`(\\\\s)?(\\\\\\\\)?${iconsRegex.source}(\\\\s)?`, 'g');\n/**\n * Takes a label with icons (`$(iconId)xyz`)  and strips the icons out (`xyz`)\n */\nfunction stripIcons(text) {\n    if (text.indexOf(iconStartMarker) === -1) {\n        return text;\n    }\n    return text.replace(stripIconsRegex, (match, preWhitespace, escaped, postWhitespace) => escaped ? match : preWhitespace || postWhitespace || '');\n}\n/**\n * Takes a label with icons (`$(iconId)xyz`), removes the icon syntax adds whitespace so that screen readers can read the text better.\n */\nfunction getCodiconAriaLabel(text) {\n    if (!text) {\n        return '';\n    }\n    return text.replace(/\\$\\((.*?)\\)/g, (_match, codiconName) => ` ${codiconName} `).trim();\n}\nconst _parseIconsRegex = new RegExp(`\\\\$\\\\(${ThemeIcon.iconNameCharacter}+\\\\)`, 'g');\n/**\n * Takes a label with icons (`abc $(iconId)xyz`) and returns the text (`abc xyz`) and the offsets of the icons (`[3]`)\n */\nfunction parseLabelWithIcons(input) {\n    _parseIconsRegex.lastIndex = 0;\n    let text = '';\n    const iconOffsets = [];\n    let iconsOffset = 0;\n    while (true) {\n        const pos = _parseIconsRegex.lastIndex;\n        const match = _parseIconsRegex.exec(input);\n        const chars = input.substring(pos, match?.index);\n        if (chars.length > 0) {\n            text += chars;\n            for (let i = 0; i < chars.length; i++) {\n                iconOffsets.push(iconsOffset);\n            }\n        }\n        if (!match) {\n            break;\n        }\n        iconsOffset += match[0].length;\n    }\n    return { text, iconOffsets };\n}\nfunction matchesFuzzyIconAware(query, target, enableSeparateSubstringMatching = false) {\n    const { text, iconOffsets } = target;\n    // Return early if there are no icon markers in the word to match against\n    if (!iconOffsets || iconOffsets.length === 0) {\n        return matchesFuzzy(query, text, enableSeparateSubstringMatching);\n    }\n    // Trim the word to match against because it could have leading\n    // whitespace now if the word started with an icon\n    const wordToMatchAgainstWithoutIconsTrimmed = ltrim(text, ' ');\n    const leadingWhitespaceOffset = text.length - wordToMatchAgainstWithoutIconsTrimmed.length;\n    // match on value without icon\n    const matches = matchesFuzzy(query, wordToMatchAgainstWithoutIconsTrimmed, enableSeparateSubstringMatching);\n    // Map matches back to offsets with icon and trimming\n    if (matches) {\n        for (const match of matches) {\n            const iconOffset = iconOffsets[match.start + leadingWhitespaceOffset] /* icon offsets at index */ + leadingWhitespaceOffset /* overall leading whitespace offset */;\n            match.start += iconOffset;\n            match.end += iconOffset;\n        }\n    }\n    return matches;\n}\n\nexport { escapeIcons, getCodiconAriaLabel, markdownEscapeEscapedIcons, matchesFuzzyIconAware, parseLabelWithIcons, stripIcons };\n","import { illegalArgument } from './errors.js';\nimport { escapeIcons } from './iconLabels.js';\nimport { Schemas } from './network.js';\nimport { isEqual } from './resources.js';\nimport { escapeRegExpCharacters } from './strings.js';\nimport { URI } from './uri.js';\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 *--------------------------------------------------------------------------------------------*/\nclass MarkdownString {\n    constructor(value = '', isTrustedOrOptions = false) {\n        this.value = value;\n        if (typeof this.value !== 'string') {\n            throw illegalArgument('value');\n        }\n        if (typeof isTrustedOrOptions === 'boolean') {\n            this.isTrusted = isTrustedOrOptions;\n            this.supportThemeIcons = false;\n            this.supportHtml = false;\n            this.supportAlertSyntax = false;\n        }\n        else {\n            this.isTrusted = isTrustedOrOptions.isTrusted ?? undefined;\n            this.supportThemeIcons = isTrustedOrOptions.supportThemeIcons ?? false;\n            this.supportHtml = isTrustedOrOptions.supportHtml ?? false;\n            this.supportAlertSyntax = isTrustedOrOptions.supportAlertSyntax ?? false;\n        }\n    }\n    appendText(value, newlineStyle = 0 /* MarkdownStringTextNewlineStyle.Paragraph */) {\n        this.value += escapeMarkdownSyntaxTokens(this.supportThemeIcons ? escapeIcons(value) : value) // CodeQL [SM02383] The Markdown is fully sanitized after being rendered.\n            .replace(/([ \\t]+)/g, (_match, g1) => '&nbsp;'.repeat(g1.length)) // CodeQL [SM02383] The Markdown is fully sanitized after being rendered.\n            .replace(/\\>/gm, '\\\\>') // CodeQL [SM02383] The Markdown is fully sanitized after being rendered.\n            .replace(/\\n/g, newlineStyle === 1 /* MarkdownStringTextNewlineStyle.Break */ ? '\\\\\\n' : '\\n\\n'); // CodeQL [SM02383] The Markdown is fully sanitized after being rendered.\n        return this;\n    }\n    appendMarkdown(value) {\n        this.value += value;\n        return this;\n    }\n    appendCodeblock(langId, code) {\n        this.value += `\\n${appendEscapedMarkdownCodeBlockFence(code, langId)}\\n`;\n        return this;\n    }\n    appendLink(target, label, title) {\n        this.value += '[';\n        this.value += this._escape(label, ']');\n        this.value += '](';\n        this.value += this._escape(String(target), ')');\n        if (title) {\n            this.value += ` \"${this._escape(this._escape(title, '\"'), ')')}\"`;\n        }\n        this.value += ')';\n        return this;\n    }\n    _escape(value, ch) {\n        const r = new RegExp(escapeRegExpCharacters(ch), 'g');\n        return value.replace(r, (match, offset) => {\n            if (value.charAt(offset - 1) !== '\\\\') {\n                return `\\\\${match}`;\n            }\n            else {\n                return match;\n            }\n        });\n    }\n}\nfunction isEmptyMarkdownString(oneOrMany) {\n    if (isMarkdownString(oneOrMany)) {\n        return !oneOrMany.value;\n    }\n    else if (Array.isArray(oneOrMany)) {\n        return oneOrMany.every(isEmptyMarkdownString);\n    }\n    else {\n        return true;\n    }\n}\nfunction isMarkdownString(thing) {\n    if (thing instanceof MarkdownString) {\n        return true;\n    }\n    else if (thing && typeof thing === 'object') {\n        return typeof thing.value === 'string'\n            && (typeof thing.isTrusted === 'boolean' || typeof thing.isTrusted === 'object' || thing.isTrusted === undefined)\n            && (typeof thing.supportThemeIcons === 'boolean' || thing.supportThemeIcons === undefined)\n            && (typeof thing.supportAlertSyntax === 'boolean' || thing.supportAlertSyntax === undefined);\n    }\n    return false;\n}\nfunction markdownStringEqual(a, b) {\n    if (a === b) {\n        return true;\n    }\n    else if (!a || !b) {\n        return false;\n    }\n    else {\n        return a.value === b.value\n            && a.isTrusted === b.isTrusted\n            && a.supportThemeIcons === b.supportThemeIcons\n            && a.supportHtml === b.supportHtml\n            && a.supportAlertSyntax === b.supportAlertSyntax\n            && (a.baseUri === b.baseUri || !!a.baseUri && !!b.baseUri && isEqual(URI.from(a.baseUri), URI.from(b.baseUri)));\n    }\n}\nfunction escapeMarkdownSyntaxTokens(text) {\n    // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash\n    return text.replace(/[\\\\`*_{}[\\]()#+\\-!~]/g, '\\\\$&'); // CodeQL [SM02383] Backslash is escaped in the character class\n}\n/**\n * @see https://github.com/microsoft/vscode/issues/193746\n */\nfunction appendEscapedMarkdownCodeBlockFence(code, langId) {\n    const longestFenceLength = code.match(/^`+/gm)?.reduce((a, b) => (a.length > b.length ? a : b)).length ??\n        0;\n    const desiredFenceLength = longestFenceLength >= 3 ? longestFenceLength + 1 : 3;\n    // the markdown result\n    return [\n        `${'`'.repeat(desiredFenceLength)}${langId}`,\n        code,\n        `${'`'.repeat(desiredFenceLength)}`,\n    ].join('\\n');\n}\nfunction escapeDoubleQuotes(input) {\n    return input.replace(/\"/g, '&quot;');\n}\nfunction removeMarkdownEscapes(text) {\n    if (!text) {\n        return text;\n    }\n    return text.replace(/\\\\([\\\\`*_{}[\\]()#+\\-.!~])/g, '$1');\n}\nfunction parseHrefAndDimensions(href) {\n    const dimensions = [];\n    const splitted = href.split('|').map(s => s.trim());\n    href = splitted[0];\n    const parameters = splitted[1];\n    if (parameters) {\n        const heightFromParams = /height=(\\d+)/.exec(parameters);\n        const widthFromParams = /width=(\\d+)/.exec(parameters);\n        const height = heightFromParams ? heightFromParams[1] : '';\n        const width = widthFromParams ? widthFromParams[1] : '';\n        const widthIsFinite = isFinite(parseInt(width));\n        const heightIsFinite = isFinite(parseInt(height));\n        if (widthIsFinite) {\n            dimensions.push(`width=\"${width}\"`);\n        }\n        if (heightIsFinite) {\n            dimensions.push(`height=\"${height}\"`);\n        }\n    }\n    return { href, dimensions };\n}\nfunction createCommandUri(commandId, ...commandArgs) {\n    return URI.from({\n        scheme: Schemas.command,\n        path: commandId,\n        query: commandArgs.length ? encodeURIComponent(JSON.stringify(commandArgs)) : undefined,\n    });\n}\n\nexport { MarkdownString, appendEscapedMarkdownCodeBlockFence, createCommandUri, escapeDoubleQuotes, escapeMarkdownSyntaxTokens, isEmptyMarkdownString, isMarkdownString, markdownStringEqual, parseHrefAndDimensions, removeMarkdownEscapes };\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 *--------------------------------------------------------------------------------------------*/\nclass IdGenerator {\n    constructor(prefix) {\n        this._prefix = prefix;\n        this._lastId = 0;\n    }\n    nextId() {\n        return this._prefix + (++this._lastId);\n    }\n}\nconst defaultGenerator = new IdGenerator('id#');\n\nexport { IdGenerator, defaultGenerator };\n","/**\n * marked v14.0.0 - a markdown parser\n * Copyright (c) 2011-2024, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\n/**\n * Gets the original marked default options.\n */\nfunction _getDefaults() {\n    return {\n        async: false,\n        breaks: false,\n        extensions: null,\n        gfm: true,\n        hooks: null,\n        pedantic: false,\n        renderer: null,\n        silent: false,\n        tokenizer: null,\n        walkTokens: null,\n    };\n}\nlet _defaults = _getDefaults();\nfunction changeDefaults(newDefaults) {\n    _defaults = newDefaults;\n}\n\n/**\n * Helpers\n */\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = new RegExp(escapeTest.source, 'g');\nconst escapeTestNoEncode = /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/;\nconst escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');\nconst escapeReplacements = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;',\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape$1(html, encode) {\n    if (encode) {\n        if (escapeTest.test(html)) {\n            return html.replace(escapeReplace, getEscapeReplacement);\n        }\n    }\n    else {\n        if (escapeTestNoEncode.test(html)) {\n            return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n        }\n    }\n    return html;\n}\nconst caret = /(^|[^\\[])\\^/g;\nfunction edit(regex, opt) {\n    let source = typeof regex === 'string' ? regex : regex.source;\n    opt = opt || '';\n    const obj = {\n        replace: (name, val) => {\n            let valSource = typeof val === 'string' ? val : val.source;\n            valSource = valSource.replace(caret, '$1');\n            source = source.replace(name, valSource);\n            return obj;\n        },\n        getRegex: () => {\n            return new RegExp(source, opt);\n        },\n    };\n    return obj;\n}\nfunction cleanUrl(href) {\n    try {\n        href = encodeURI(href).replace(/%25/g, '%');\n    }\n    catch {\n        return null;\n    }\n    return href;\n}\nconst noopTest = { exec: () => null };\nfunction splitCells(tableRow, count) {\n    // ensure that every cell-delimiting pipe has a space\n    // before it to distinguish it from an escaped pipe\n    const row = tableRow.replace(/\\|/g, (match, offset, str) => {\n        let escaped = false;\n        let curr = offset;\n        while (--curr >= 0 && str[curr] === '\\\\')\n            escaped = !escaped;\n        if (escaped) {\n            // odd number of slashes means | is escaped\n            // so we leave it alone\n            return '|';\n        }\n        else {\n            // add space before unescaped |\n            return ' |';\n        }\n    }), cells = row.split(/ \\|/);\n    let i = 0;\n    // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n    if (!cells[0].trim()) {\n        cells.shift();\n    }\n    if (cells.length > 0 && !cells[cells.length - 1].trim()) {\n        cells.pop();\n    }\n    if (count) {\n        if (cells.length > count) {\n            cells.splice(count);\n        }\n        else {\n            while (cells.length < count)\n                cells.push('');\n        }\n    }\n    for (; i < cells.length; i++) {\n        // leading or trailing whitespace is ignored per the gfm spec\n        cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n    }\n    return cells;\n}\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nfunction rtrim(str, c, invert) {\n    const l = str.length;\n    if (l === 0) {\n        return '';\n    }\n    // Length of suffix matching the invert condition.\n    let suffLen = 0;\n    // Step left until we fail to match the invert condition.\n    while (suffLen < l) {\n        const currChar = str.charAt(l - suffLen - 1);\n        if (currChar === c && true) {\n            suffLen++;\n        }\n        else {\n            break;\n        }\n    }\n    return str.slice(0, l - suffLen);\n}\nfunction findClosingBracket(str, b) {\n    if (str.indexOf(b[1]) === -1) {\n        return -1;\n    }\n    let level = 0;\n    for (let i = 0; i < str.length; i++) {\n        if (str[i] === '\\\\') {\n            i++;\n        }\n        else if (str[i] === b[0]) {\n            level++;\n        }\n        else if (str[i] === b[1]) {\n            level--;\n            if (level < 0) {\n                return i;\n            }\n        }\n    }\n    return -1;\n}\n\nfunction outputLink(cap, link, raw, lexer) {\n    const href = link.href;\n    const title = link.title ? escape$1(link.title) : null;\n    const text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n    if (cap[0].charAt(0) !== '!') {\n        lexer.state.inLink = true;\n        const token = {\n            type: 'link',\n            raw,\n            href,\n            title,\n            text,\n            tokens: lexer.inlineTokens(text),\n        };\n        lexer.state.inLink = false;\n        return token;\n    }\n    return {\n        type: 'image',\n        raw,\n        href,\n        title,\n        text: escape$1(text),\n    };\n}\nfunction indentCodeCompensation(raw, text) {\n    const matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n    if (matchIndentToCode === null) {\n        return text;\n    }\n    const indentToCode = matchIndentToCode[1];\n    return text\n        .split('\\n')\n        .map(node => {\n        const matchIndentInNode = node.match(/^\\s+/);\n        if (matchIndentInNode === null) {\n            return node;\n        }\n        const [indentInNode] = matchIndentInNode;\n        if (indentInNode.length >= indentToCode.length) {\n            return node.slice(indentToCode.length);\n        }\n        return node;\n    })\n        .join('\\n');\n}\n/**\n * Tokenizer\n */\nclass _Tokenizer {\n    options;\n    rules; // set by the lexer\n    lexer; // set by the lexer\n    constructor(options) {\n        this.options = options || _defaults;\n    }\n    space(src) {\n        const cap = this.rules.block.newline.exec(src);\n        if (cap && cap[0].length > 0) {\n            return {\n                type: 'space',\n                raw: cap[0],\n            };\n        }\n    }\n    code(src) {\n        const cap = this.rules.block.code.exec(src);\n        if (cap) {\n            const text = cap[0].replace(/^ {1,4}/gm, '');\n            return {\n                type: 'code',\n                raw: cap[0],\n                codeBlockStyle: 'indented',\n                text: !this.options.pedantic\n                    ? rtrim(text, '\\n')\n                    : text,\n            };\n        }\n    }\n    fences(src) {\n        const cap = this.rules.block.fences.exec(src);\n        if (cap) {\n            const raw = cap[0];\n            const text = indentCodeCompensation(raw, cap[3] || '');\n            return {\n                type: 'code',\n                raw,\n                lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],\n                text,\n            };\n        }\n    }\n    heading(src) {\n        const cap = this.rules.block.heading.exec(src);\n        if (cap) {\n            let text = cap[2].trim();\n            // remove trailing #s\n            if (/#$/.test(text)) {\n                const trimmed = rtrim(text, '#');\n                if (this.options.pedantic) {\n                    text = trimmed.trim();\n                }\n                else if (!trimmed || / $/.test(trimmed)) {\n                    // CommonMark requires space before trailing #s\n                    text = trimmed.trim();\n                }\n            }\n            return {\n                type: 'heading',\n                raw: cap[0],\n                depth: cap[1].length,\n                text,\n                tokens: this.lexer.inline(text),\n            };\n        }\n    }\n    hr(src) {\n        const cap = this.rules.block.hr.exec(src);\n        if (cap) {\n            return {\n                type: 'hr',\n                raw: rtrim(cap[0], '\\n'),\n            };\n        }\n    }\n    blockquote(src) {\n        const cap = this.rules.block.blockquote.exec(src);\n        if (cap) {\n            let lines = rtrim(cap[0], '\\n').split('\\n');\n            let raw = '';\n            let text = '';\n            const tokens = [];\n            while (lines.length > 0) {\n                let inBlockquote = false;\n                const currentLines = [];\n                let i;\n                for (i = 0; i < lines.length; i++) {\n                    // get lines up to a continuation\n                    if (/^ {0,3}>/.test(lines[i])) {\n                        currentLines.push(lines[i]);\n                        inBlockquote = true;\n                    }\n                    else if (!inBlockquote) {\n                        currentLines.push(lines[i]);\n                    }\n                    else {\n                        break;\n                    }\n                }\n                lines = lines.slice(i);\n                const currentRaw = currentLines.join('\\n');\n                const currentText = currentRaw\n                    // precede setext continuation with 4 spaces so it isn't a setext\n                    .replace(/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g, '\\n    $1')\n                    .replace(/^ {0,3}>[ \\t]?/gm, '');\n                raw = raw ? `${raw}\\n${currentRaw}` : currentRaw;\n                text = text ? `${text}\\n${currentText}` : currentText;\n                // parse blockquote lines as top level tokens\n                // merge paragraphs if this is a continuation\n                const top = this.lexer.state.top;\n                this.lexer.state.top = true;\n                this.lexer.blockTokens(currentText, tokens, true);\n                this.lexer.state.top = top;\n                // if there is no continuation then we are done\n                if (lines.length === 0) {\n                    break;\n                }\n                const lastToken = tokens[tokens.length - 1];\n                if (lastToken?.type === 'code') {\n                    // blockquote continuation cannot be preceded by a code block\n                    break;\n                }\n                else if (lastToken?.type === 'blockquote') {\n                    // include continuation in nested blockquote\n                    const oldToken = lastToken;\n                    const newText = oldToken.raw + '\\n' + lines.join('\\n');\n                    const newToken = this.blockquote(newText);\n                    tokens[tokens.length - 1] = newToken;\n                    raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw;\n                    text = text.substring(0, text.length - oldToken.text.length) + newToken.text;\n                    break;\n                }\n                else if (lastToken?.type === 'list') {\n                    // include continuation in nested list\n                    const oldToken = lastToken;\n                    const newText = oldToken.raw + '\\n' + lines.join('\\n');\n                    const newToken = this.list(newText);\n                    tokens[tokens.length - 1] = newToken;\n                    raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;\n                    text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;\n                    lines = newText.substring(tokens[tokens.length - 1].raw.length).split('\\n');\n                    continue;\n                }\n            }\n            return {\n                type: 'blockquote',\n                raw,\n                tokens,\n                text,\n            };\n        }\n    }\n    list(src) {\n        let cap = this.rules.block.list.exec(src);\n        if (cap) {\n            let bull = cap[1].trim();\n            const isordered = bull.length > 1;\n            const list = {\n                type: 'list',\n                raw: '',\n                ordered: isordered,\n                start: isordered ? +bull.slice(0, -1) : '',\n                loose: false,\n                items: [],\n            };\n            bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n            if (this.options.pedantic) {\n                bull = isordered ? bull : '[*+-]';\n            }\n            // Get next list item\n            const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`);\n            let endsWithBlankLine = false;\n            // Check if current bullet point can start a new List Item\n            while (src) {\n                let endEarly = false;\n                let raw = '';\n                let itemContents = '';\n                if (!(cap = itemRegex.exec(src))) {\n                    break;\n                }\n                if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n                    break;\n                }\n                raw = cap[0];\n                src = src.substring(raw.length);\n                let line = cap[2].split('\\n', 1)[0].replace(/^\\t+/, (t) => ' '.repeat(3 * t.length));\n                let nextLine = src.split('\\n', 1)[0];\n                let blankLine = !line.trim();\n                let indent = 0;\n                if (this.options.pedantic) {\n                    indent = 2;\n                    itemContents = line.trimStart();\n                }\n                else if (blankLine) {\n                    indent = cap[1].length + 1;\n                }\n                else {\n                    indent = cap[2].search(/[^ ]/); // Find first non-space char\n                    indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n                    itemContents = line.slice(indent);\n                    indent += cap[1].length;\n                }\n                if (blankLine && /^ *$/.test(nextLine)) { // Items begin with at most one blank line\n                    raw += nextLine + '\\n';\n                    src = src.substring(nextLine.length + 1);\n                    endEarly = true;\n                }\n                if (!endEarly) {\n                    const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`);\n                    const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`);\n                    const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`);\n                    const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);\n                    // Check if following lines should be included in List Item\n                    while (src) {\n                        const rawLine = src.split('\\n', 1)[0];\n                        nextLine = rawLine;\n                        // Re-align to follow commonmark nesting rules\n                        if (this.options.pedantic) {\n                            nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, '  ');\n                        }\n                        // End list item if found code fences\n                        if (fencesBeginRegex.test(nextLine)) {\n                            break;\n                        }\n                        // End list item if found start of new heading\n                        if (headingBeginRegex.test(nextLine)) {\n                            break;\n                        }\n                        // End list item if found start of new bullet\n                        if (nextBulletRegex.test(nextLine)) {\n                            break;\n                        }\n                        // Horizontal rule found\n                        if (hrRegex.test(src)) {\n                            break;\n                        }\n                        if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible\n                            itemContents += '\\n' + nextLine.slice(indent);\n                        }\n                        else {\n                            // not enough indentation\n                            if (blankLine) {\n                                break;\n                            }\n                            // paragraph continuation unless last line was a different block level element\n                            if (line.search(/[^ ]/) >= 4) { // indented code block\n                                break;\n                            }\n                            if (fencesBeginRegex.test(line)) {\n                                break;\n                            }\n                            if (headingBeginRegex.test(line)) {\n                                break;\n                            }\n                            if (hrRegex.test(line)) {\n                                break;\n                            }\n                            itemContents += '\\n' + nextLine;\n                        }\n                        if (!blankLine && !nextLine.trim()) { // Check if current line is blank\n                            blankLine = true;\n                        }\n                        raw += rawLine + '\\n';\n                        src = src.substring(rawLine.length + 1);\n                        line = nextLine.slice(indent);\n                    }\n                }\n                if (!list.loose) {\n                    // If the previous item ended with a blank line, the list is loose\n                    if (endsWithBlankLine) {\n                        list.loose = true;\n                    }\n                    else if (/\\n *\\n *$/.test(raw)) {\n                        endsWithBlankLine = true;\n                    }\n                }\n                let istask = null;\n                let ischecked;\n                // Check for task list items\n                if (this.options.gfm) {\n                    istask = /^\\[[ xX]\\] /.exec(itemContents);\n                    if (istask) {\n                        ischecked = istask[0] !== '[ ] ';\n                        itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n                    }\n                }\n                list.items.push({\n                    type: 'list_item',\n                    raw,\n                    task: !!istask,\n                    checked: ischecked,\n                    loose: false,\n                    text: itemContents,\n                    tokens: [],\n                });\n                list.raw += raw;\n            }\n            // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n            list.items[list.items.length - 1].raw = list.items[list.items.length - 1].raw.trimEnd();\n            list.items[list.items.length - 1].text = list.items[list.items.length - 1].text.trimEnd();\n            list.raw = list.raw.trimEnd();\n            // Item child tokens handled here at end because we needed to have the final item to trim it first\n            for (let i = 0; i < list.items.length; i++) {\n                this.lexer.state.top = false;\n                list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n                if (!list.loose) {\n                    // Check if list should be loose\n                    const spacers = list.items[i].tokens.filter(t => t.type === 'space');\n                    const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\\n.*\\n/.test(t.raw));\n                    list.loose = hasMultipleLineBreaks;\n                }\n            }\n            // Set all items to loose if list is loose\n            if (list.loose) {\n                for (let i = 0; i < list.items.length; i++) {\n                    list.items[i].loose = true;\n                }\n            }\n            return list;\n        }\n    }\n    html(src) {\n        const cap = this.rules.block.html.exec(src);\n        if (cap) {\n            const token = {\n                type: 'html',\n                block: true,\n                raw: cap[0],\n                pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n                text: cap[0],\n            };\n            return token;\n        }\n    }\n    def(src) {\n        const cap = this.rules.block.def.exec(src);\n        if (cap) {\n            const tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n            const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';\n            const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];\n            return {\n                type: 'def',\n                tag,\n                raw: cap[0],\n                href,\n                title,\n            };\n        }\n    }\n    table(src) {\n        const cap = this.rules.block.table.exec(src);\n        if (!cap) {\n            return;\n        }\n        if (!/[:|]/.test(cap[2])) {\n            // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n            return;\n        }\n        const headers = splitCells(cap[1]);\n        const aligns = cap[2].replace(/^\\||\\| *$/g, '').split('|');\n        const rows = cap[3] && cap[3].trim() ? cap[3].replace(/\\n[ \\t]*$/, '').split('\\n') : [];\n        const item = {\n            type: 'table',\n            raw: cap[0],\n            header: [],\n            align: [],\n            rows: [],\n        };\n        if (headers.length !== aligns.length) {\n            // header and align columns must be equal, rows can be different.\n            return;\n        }\n        for (const align of aligns) {\n            if (/^ *-+: *$/.test(align)) {\n                item.align.push('right');\n            }\n            else if (/^ *:-+: *$/.test(align)) {\n                item.align.push('center');\n            }\n            else if (/^ *:-+ *$/.test(align)) {\n                item.align.push('left');\n            }\n            else {\n                item.align.push(null);\n            }\n        }\n        for (let i = 0; i < headers.length; i++) {\n            item.header.push({\n                text: headers[i],\n                tokens: this.lexer.inline(headers[i]),\n                header: true,\n                align: item.align[i],\n            });\n        }\n        for (const row of rows) {\n            item.rows.push(splitCells(row, item.header.length).map((cell, i) => {\n                return {\n                    text: cell,\n                    tokens: this.lexer.inline(cell),\n                    header: false,\n                    align: item.align[i],\n                };\n            }));\n        }\n        return item;\n    }\n    lheading(src) {\n        const cap = this.rules.block.lheading.exec(src);\n        if (cap) {\n            return {\n                type: 'heading',\n                raw: cap[0],\n                depth: cap[2].charAt(0) === '=' ? 1 : 2,\n                text: cap[1],\n                tokens: this.lexer.inline(cap[1]),\n            };\n        }\n    }\n    paragraph(src) {\n        const cap = this.rules.block.paragraph.exec(src);\n        if (cap) {\n            const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n                ? cap[1].slice(0, -1)\n                : cap[1];\n            return {\n                type: 'paragraph',\n                raw: cap[0],\n                text,\n                tokens: this.lexer.inline(text),\n            };\n        }\n    }\n    text(src) {\n        const cap = this.rules.block.text.exec(src);\n        if (cap) {\n            return {\n                type: 'text',\n                raw: cap[0],\n                text: cap[0],\n                tokens: this.lexer.inline(cap[0]),\n            };\n        }\n    }\n    escape(src) {\n        const cap = this.rules.inline.escape.exec(src);\n        if (cap) {\n            return {\n                type: 'escape',\n                raw: cap[0],\n                text: escape$1(cap[1]),\n            };\n        }\n    }\n    tag(src) {\n        const cap = this.rules.inline.tag.exec(src);\n        if (cap) {\n            if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {\n                this.lexer.state.inLink = true;\n            }\n            else if (this.lexer.state.inLink && /^<\\/a>/i.test(cap[0])) {\n                this.lexer.state.inLink = false;\n            }\n            if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n                this.lexer.state.inRawBlock = true;\n            }\n            else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n                this.lexer.state.inRawBlock = false;\n            }\n            return {\n                type: 'html',\n                raw: cap[0],\n                inLink: this.lexer.state.inLink,\n                inRawBlock: this.lexer.state.inRawBlock,\n                block: false,\n                text: cap[0],\n            };\n        }\n    }\n    link(src) {\n        const cap = this.rules.inline.link.exec(src);\n        if (cap) {\n            const trimmedUrl = cap[2].trim();\n            if (!this.options.pedantic && /^</.test(trimmedUrl)) {\n                // commonmark requires matching angle brackets\n                if (!(/>$/.test(trimmedUrl))) {\n                    return;\n                }\n                // ending angle bracket cannot be escaped\n                const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n                if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n                    return;\n                }\n            }\n            else {\n                // find closing parenthesis\n                const lastParenIndex = findClosingBracket(cap[2], '()');\n                if (lastParenIndex > -1) {\n                    const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n                    const linkLen = start + cap[1].length + lastParenIndex;\n                    cap[2] = cap[2].substring(0, lastParenIndex);\n                    cap[0] = cap[0].substring(0, linkLen).trim();\n                    cap[3] = '';\n                }\n            }\n            let href = cap[2];\n            let title = '';\n            if (this.options.pedantic) {\n                // split pedantic href and title\n                const link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n                if (link) {\n                    href = link[1];\n                    title = link[3];\n                }\n            }\n            else {\n                title = cap[3] ? cap[3].slice(1, -1) : '';\n            }\n            href = href.trim();\n            if (/^</.test(href)) {\n                if (this.options.pedantic && !(/>$/.test(trimmedUrl))) {\n                    // pedantic allows starting angle bracket without ending angle bracket\n                    href = href.slice(1);\n                }\n                else {\n                    href = href.slice(1, -1);\n                }\n            }\n            return outputLink(cap, {\n                href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,\n                title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title,\n            }, cap[0], this.lexer);\n        }\n    }\n    reflink(src, links) {\n        let cap;\n        if ((cap = this.rules.inline.reflink.exec(src))\n            || (cap = this.rules.inline.nolink.exec(src))) {\n            const linkString = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n            const link = links[linkString.toLowerCase()];\n            if (!link) {\n                const text = cap[0].charAt(0);\n                return {\n                    type: 'text',\n                    raw: text,\n                    text,\n                };\n            }\n            return outputLink(cap, link, cap[0], this.lexer);\n        }\n    }\n    emStrong(src, maskedSrc, prevChar = '') {\n        let match = this.rules.inline.emStrongLDelim.exec(src);\n        if (!match)\n            return;\n        // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n        if (match[3] && prevChar.match(/[\\p{L}\\p{N}]/u))\n            return;\n        const nextChar = match[1] || match[2] || '';\n        if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n            // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n            const lLength = [...match[0]].length - 1;\n            let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n            const endReg = match[0][0] === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n            endReg.lastIndex = 0;\n            // Clip maskedSrc to same section of string as src (move to lexer?)\n            maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n            while ((match = endReg.exec(maskedSrc)) != null) {\n                rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n                if (!rDelim)\n                    continue; // skip single * in __abc*abc__\n                rLength = [...rDelim].length;\n                if (match[3] || match[4]) { // found another Left Delim\n                    delimTotal += rLength;\n                    continue;\n                }\n                else if (match[5] || match[6]) { // either Left or Right Delim\n                    if (lLength % 3 && !((lLength + rLength) % 3)) {\n                        midDelimTotal += rLength;\n                        continue; // CommonMark Emphasis Rules 9-10\n                    }\n                }\n                delimTotal -= rLength;\n                if (delimTotal > 0)\n                    continue; // Haven't found enough closing delimiters\n                // Remove extra characters. *a*** -> *a*\n                rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n                // char length can be >1 for unicode characters;\n                const lastCharLength = [...match[0]][0].length;\n                const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n                // Create `em` if smallest delimiter has odd char count. *a***\n                if (Math.min(lLength, rLength) % 2) {\n                    const text = raw.slice(1, -1);\n                    return {\n                        type: 'em',\n                        raw,\n                        text,\n                        tokens: this.lexer.inlineTokens(text),\n                    };\n                }\n                // Create 'strong' if smallest delimiter has even char count. **a***\n                const text = raw.slice(2, -2);\n                return {\n                    type: 'strong',\n                    raw,\n                    text,\n                    tokens: this.lexer.inlineTokens(text),\n                };\n            }\n        }\n    }\n    codespan(src) {\n        const cap = this.rules.inline.code.exec(src);\n        if (cap) {\n            let text = cap[2].replace(/\\n/g, ' ');\n            const hasNonSpaceChars = /[^ ]/.test(text);\n            const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n            if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n                text = text.substring(1, text.length - 1);\n            }\n            text = escape$1(text, true);\n            return {\n                type: 'codespan',\n                raw: cap[0],\n                text,\n            };\n        }\n    }\n    br(src) {\n        const cap = this.rules.inline.br.exec(src);\n        if (cap) {\n            return {\n                type: 'br',\n                raw: cap[0],\n            };\n        }\n    }\n    del(src) {\n        const cap = this.rules.inline.del.exec(src);\n        if (cap) {\n            return {\n                type: 'del',\n                raw: cap[0],\n                text: cap[2],\n                tokens: this.lexer.inlineTokens(cap[2]),\n            };\n        }\n    }\n    autolink(src) {\n        const cap = this.rules.inline.autolink.exec(src);\n        if (cap) {\n            let text, href;\n            if (cap[2] === '@') {\n                text = escape$1(cap[1]);\n                href = 'mailto:' + text;\n            }\n            else {\n                text = escape$1(cap[1]);\n                href = text;\n            }\n            return {\n                type: 'link',\n                raw: cap[0],\n                text,\n                href,\n                tokens: [\n                    {\n                        type: 'text',\n                        raw: text,\n                        text,\n                    },\n                ],\n            };\n        }\n    }\n    url(src) {\n        let cap;\n        if (cap = this.rules.inline.url.exec(src)) {\n            let text, href;\n            if (cap[2] === '@') {\n                text = escape$1(cap[0]);\n                href = 'mailto:' + text;\n            }\n            else {\n                // do extended autolink path validation\n                let prevCapZero;\n                do {\n                    prevCapZero = cap[0];\n                    cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';\n                } while (prevCapZero !== cap[0]);\n                text = escape$1(cap[0]);\n                if (cap[1] === 'www.') {\n                    href = 'http://' + cap[0];\n                }\n                else {\n                    href = cap[0];\n                }\n            }\n            return {\n                type: 'link',\n                raw: cap[0],\n                text,\n                href,\n                tokens: [\n                    {\n                        type: 'text',\n                        raw: text,\n                        text,\n                    },\n                ],\n            };\n        }\n    }\n    inlineText(src) {\n        const cap = this.rules.inline.text.exec(src);\n        if (cap) {\n            let text;\n            if (this.lexer.state.inRawBlock) {\n                text = cap[0];\n            }\n            else {\n                text = escape$1(cap[0]);\n            }\n            return {\n                type: 'text',\n                raw: cap[0],\n                text,\n            };\n        }\n    }\n}\n\n/**\n * Block-Level Grammar\n */\nconst newline = /^(?: *(?:\\n|$))+/;\nconst blockCode = /^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/;\nconst fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nconst hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nconst heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nconst bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nconst lheading = edit(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/)\n    .replace(/bull/g, bullet) // lists can interrupt\n    .replace(/blockCode/g, / {4}/) // indented code blocks can interrupt\n    .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n    .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n    .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n    .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n    .getRegex();\nconst _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/;\nconst blockText = /^[^\\n]+/;\nconst _blockLabel = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nconst def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n *)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n *)?| *\\n *)(title))? *(?:\\n+|$)/)\n    .replace('label', _blockLabel)\n    .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n    .getRegex();\nconst list = edit(/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/)\n    .replace(/bull/g, bullet)\n    .getRegex();\nconst _tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n    + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n    + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n    + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n    + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'\n    + '|tr|track|ul';\nconst _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nconst html = edit('^ {0,3}(?:' // optional indentation\n    + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n    + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n    + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n    + '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n    + '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n    + '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (6)\n    + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) open tag\n    + '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) closing tag\n    + ')', 'i')\n    .replace('comment', _comment)\n    .replace('tag', _tag)\n    .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n    .getRegex();\nconst paragraph = edit(_paragraph)\n    .replace('hr', hr)\n    .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n    .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n    .replace('|table', '')\n    .replace('blockquote', ' {0,3}>')\n    .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n    .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n    .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n    .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n    .getRegex();\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n    .replace('paragraph', paragraph)\n    .getRegex();\n/**\n * Normal Block Grammar\n */\nconst blockNormal = {\n    blockquote,\n    code: blockCode,\n    def,\n    fences,\n    heading,\n    hr,\n    html,\n    lheading,\n    list,\n    newline,\n    paragraph,\n    table: noopTest,\n    text: blockText,\n};\n/**\n * GFM Block Grammar\n */\nconst gfmTable = edit('^ *([^\\\\n ].*)\\\\n' // Header\n    + ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n    + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)') // Cells\n    .replace('hr', hr)\n    .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n    .replace('blockquote', ' {0,3}>')\n    .replace('code', ' {4}[^\\\\n]')\n    .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n    .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n    .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n    .replace('tag', _tag) // tables can be interrupted by type (6) html blocks\n    .getRegex();\nconst blockGfm = {\n    ...blockNormal,\n    table: gfmTable,\n    paragraph: edit(_paragraph)\n        .replace('hr', hr)\n        .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n        .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n        .replace('table', gfmTable) // interrupt paragraphs with table\n        .replace('blockquote', ' {0,3}>')\n        .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n        .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n        .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n        .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n        .getRegex(),\n};\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\nconst blockPedantic = {\n    ...blockNormal,\n    html: edit('^ *(?:comment *(?:\\\\n|\\\\s*$)'\n        + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n        + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n        .replace('comment', _comment)\n        .replace(/tag/g, '(?!(?:'\n        + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n        + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n        + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n        .getRegex(),\n    def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n    heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n    fences: noopTest, // fences not supported\n    lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n    paragraph: edit(_paragraph)\n        .replace('hr', hr)\n        .replace('heading', ' *#{1,6} *[^\\n]')\n        .replace('lheading', lheading)\n        .replace('|table', '')\n        .replace('blockquote', ' {0,3}>')\n        .replace('|fences', '')\n        .replace('|list', '')\n        .replace('|html', '')\n        .replace('|tag', '')\n        .getRegex(),\n};\n/**\n * Inline-Level Grammar\n */\nconst escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = '\\\\p{P}\\\\p{S}';\nconst punctuation = edit(/^((?![*_])[\\spunctuation])/, 'u')\n    .replace(/punctuation/g, _punctuation).getRegex();\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = /\\[[^[\\]]*?\\]\\([^\\(\\)]*?\\)|`[^`]*?`|<[^<>]*?>/g;\nconst emStrongLDelim = edit(/^(?:\\*+(?:((?!\\*)[punct])|[^\\s*]))|^_+(?:((?!_)[punct])|([^\\s_]))/, 'u')\n    .replace(/punct/g, _punctuation)\n    .getRegex();\nconst emStrongRDelimAst = edit('^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n    + '|[^*]+(?=[^*])' // Consume to delim\n    + '|(?!\\\\*)[punct](\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n    + '|[^punct\\\\s](\\\\*+)(?!\\\\*)(?=[punct\\\\s]|$)' // (2) a***#, a*** can only be a Right Delimiter\n    + '|(?!\\\\*)[punct\\\\s](\\\\*+)(?=[^punct\\\\s])' // (3) #***a, ***a can only be Left Delimiter\n    + '|[\\\\s](\\\\*+)(?!\\\\*)(?=[punct])' // (4) ***# can only be Left Delimiter\n    + '|(?!\\\\*)[punct](\\\\*+)(?!\\\\*)(?=[punct])' // (5) #***# can be either Left or Right Delimiter\n    + '|[^punct\\\\s](\\\\*+)(?=[^punct\\\\s])', 'gu') // (6) a***a can be either Left or Right Delimiter\n    .replace(/punct/g, _punctuation)\n    .getRegex();\n// (6) Not allowed for _\nconst emStrongRDelimUnd = edit('^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n    + '|[^_]+(?=[^_])' // Consume to delim\n    + '|(?!_)[punct](_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n    + '|[^punct\\\\s](_+)(?!_)(?=[punct\\\\s]|$)' // (2) a___#, a___ can only be a Right Delimiter\n    + '|(?!_)[punct\\\\s](_+)(?=[^punct\\\\s])' // (3) #___a, ___a can only be Left Delimiter\n    + '|[\\\\s](_+)(?!_)(?=[punct])' // (4) ___# can only be Left Delimiter\n    + '|(?!_)[punct](_+)(?!_)(?=[punct])', 'gu') // (5) #___# can be either Left or Right Delimiter\n    .replace(/punct/g, _punctuation)\n    .getRegex();\nconst anyPunctuation = edit(/\\\\([punct])/, 'gu')\n    .replace(/punct/g, _punctuation)\n    .getRegex();\nconst autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/)\n    .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)\n    .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/)\n    .getRegex();\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit('^comment'\n    + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n    + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n    + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n    + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n    + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>') // CDATA section\n    .replace('comment', _inlineComment)\n    .replace('attribute', /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/)\n    .getRegex();\nconst _inlineLabel = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\nconst link = edit(/^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/)\n    .replace('label', _inlineLabel)\n    .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/)\n    .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n    .getRegex();\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n    .replace('label', _inlineLabel)\n    .replace('ref', _blockLabel)\n    .getRegex();\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n    .replace('ref', _blockLabel)\n    .getRegex();\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n    .replace('reflink', reflink)\n    .replace('nolink', nolink)\n    .getRegex();\n/**\n * Normal Inline Grammar\n */\nconst inlineNormal = {\n    _backpedal: noopTest, // only used for GFM url\n    anyPunctuation,\n    autolink,\n    blockSkip,\n    br,\n    code: inlineCode,\n    del: noopTest,\n    emStrongLDelim,\n    emStrongRDelimAst,\n    emStrongRDelimUnd,\n    escape,\n    link,\n    nolink,\n    punctuation,\n    reflink,\n    reflinkSearch,\n    tag,\n    text: inlineText,\n    url: noopTest,\n};\n/**\n * Pedantic Inline Grammar\n */\nconst inlinePedantic = {\n    ...inlineNormal,\n    link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n        .replace('label', _inlineLabel)\n        .getRegex(),\n    reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n        .replace('label', _inlineLabel)\n        .getRegex(),\n};\n/**\n * GFM Inline Grammar\n */\nconst inlineGfm = {\n    ...inlineNormal,\n    escape: edit(escape).replace('])', '~|])').getRegex(),\n    url: edit(/^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/, 'i')\n        .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/)\n        .getRegex(),\n    _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n    del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n    text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/,\n};\n/**\n * GFM + Line Breaks Inline Grammar\n */\nconst inlineBreaks = {\n    ...inlineGfm,\n    br: edit(br).replace('{2,}', '*').getRegex(),\n    text: edit(inlineGfm.text)\n        .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n        .replace(/\\{2,\\}/g, '*')\n        .getRegex(),\n};\n/**\n * exports\n */\nconst block = {\n    normal: blockNormal,\n    gfm: blockGfm,\n    pedantic: blockPedantic,\n};\nconst inline = {\n    normal: inlineNormal,\n    gfm: inlineGfm,\n    breaks: inlineBreaks,\n    pedantic: inlinePedantic,\n};\n\n/**\n * Block Lexer\n */\nclass _Lexer {\n    tokens;\n    options;\n    state;\n    tokenizer;\n    inlineQueue;\n    constructor(options) {\n        // TokenList cannot be created in one go\n        this.tokens = [];\n        this.tokens.links = Object.create(null);\n        this.options = options || _defaults;\n        this.options.tokenizer = this.options.tokenizer || new _Tokenizer();\n        this.tokenizer = this.options.tokenizer;\n        this.tokenizer.options = this.options;\n        this.tokenizer.lexer = this;\n        this.inlineQueue = [];\n        this.state = {\n            inLink: false,\n            inRawBlock: false,\n            top: true,\n        };\n        const rules = {\n            block: block.normal,\n            inline: inline.normal,\n        };\n        if (this.options.pedantic) {\n            rules.block = block.pedantic;\n            rules.inline = inline.pedantic;\n        }\n        else if (this.options.gfm) {\n            rules.block = block.gfm;\n            if (this.options.breaks) {\n                rules.inline = inline.breaks;\n            }\n            else {\n                rules.inline = inline.gfm;\n            }\n        }\n        this.tokenizer.rules = rules;\n    }\n    /**\n     * Expose Rules\n     */\n    static get rules() {\n        return {\n            block,\n            inline,\n        };\n    }\n    /**\n     * Static Lex Method\n     */\n    static lex(src, options) {\n        const lexer = new _Lexer(options);\n        return lexer.lex(src);\n    }\n    /**\n     * Static Lex Inline Method\n     */\n    static lexInline(src, options) {\n        const lexer = new _Lexer(options);\n        return lexer.inlineTokens(src);\n    }\n    /**\n     * Preprocessing\n     */\n    lex(src) {\n        src = src\n            .replace(/\\r\\n|\\r/g, '\\n');\n        this.blockTokens(src, this.tokens);\n        for (let i = 0; i < this.inlineQueue.length; i++) {\n            const next = this.inlineQueue[i];\n            this.inlineTokens(next.src, next.tokens);\n        }\n        this.inlineQueue = [];\n        return this.tokens;\n    }\n    blockTokens(src, tokens = [], lastParagraphClipped = false) {\n        if (this.options.pedantic) {\n            src = src.replace(/\\t/g, '    ').replace(/^ +$/gm, '');\n        }\n        else {\n            src = src.replace(/^( *)(\\t+)/gm, (_, leading, tabs) => {\n                return leading + '    '.repeat(tabs.length);\n            });\n        }\n        let token;\n        let lastToken;\n        let cutSrc;\n        while (src) {\n            if (this.options.extensions\n                && this.options.extensions.block\n                && this.options.extensions.block.some((extTokenizer) => {\n                    if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n                        src = src.substring(token.raw.length);\n                        tokens.push(token);\n                        return true;\n                    }\n                    return false;\n                })) {\n                continue;\n            }\n            // newline\n            if (token = this.tokenizer.space(src)) {\n                src = src.substring(token.raw.length);\n                if (token.raw.length === 1 && tokens.length > 0) {\n                    // if there's a single \\n as a spacer, it's terminating the last line,\n                    // so move it there so that we don't get unnecessary paragraph tags\n                    tokens[tokens.length - 1].raw += '\\n';\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // code\n            if (token = this.tokenizer.code(src)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                // An indented code block cannot interrupt a paragraph.\n                if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.text;\n                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // fences\n            if (token = this.tokenizer.fences(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // heading\n            if (token = this.tokenizer.heading(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // hr\n            if (token = this.tokenizer.hr(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // blockquote\n            if (token = this.tokenizer.blockquote(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // list\n            if (token = this.tokenizer.list(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // html\n            if (token = this.tokenizer.html(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // def\n            if (token = this.tokenizer.def(src)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.raw;\n                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n                }\n                else if (!this.tokens.links[token.tag]) {\n                    this.tokens.links[token.tag] = {\n                        href: token.href,\n                        title: token.title,\n                    };\n                }\n                continue;\n            }\n            // table (gfm)\n            if (token = this.tokenizer.table(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // lheading\n            if (token = this.tokenizer.lheading(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // top-level paragraph\n            // prevent paragraph consuming extensions by clipping 'src' to extension start\n            cutSrc = src;\n            if (this.options.extensions && this.options.extensions.startBlock) {\n                let startIndex = Infinity;\n                const tempSrc = src.slice(1);\n                let tempStart;\n                this.options.extensions.startBlock.forEach((getStartIndex) => {\n                    tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n                    if (typeof tempStart === 'number' && tempStart >= 0) {\n                        startIndex = Math.min(startIndex, tempStart);\n                    }\n                });\n                if (startIndex < Infinity && startIndex >= 0) {\n                    cutSrc = src.substring(0, startIndex + 1);\n                }\n            }\n            if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n                lastToken = tokens[tokens.length - 1];\n                if (lastParagraphClipped && lastToken?.type === 'paragraph') {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.text;\n                    this.inlineQueue.pop();\n                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                lastParagraphClipped = (cutSrc.length !== src.length);\n                src = src.substring(token.raw.length);\n                continue;\n            }\n            // text\n            if (token = this.tokenizer.text(src)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && lastToken.type === 'text') {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.text;\n                    this.inlineQueue.pop();\n                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            if (src) {\n                const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n                if (this.options.silent) {\n                    console.error(errMsg);\n                    break;\n                }\n                else {\n                    throw new Error(errMsg);\n                }\n            }\n        }\n        this.state.top = true;\n        return tokens;\n    }\n    inline(src, tokens = []) {\n        this.inlineQueue.push({ src, tokens });\n        return tokens;\n    }\n    /**\n     * Lexing/Compiling\n     */\n    inlineTokens(src, tokens = []) {\n        let token, lastToken, cutSrc;\n        // String with links masked to avoid interference with em and strong\n        let maskedSrc = src;\n        let match;\n        let keepPrevChar, prevChar;\n        // Mask out reflinks\n        if (this.tokens.links) {\n            const links = Object.keys(this.tokens.links);\n            if (links.length > 0) {\n                while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n                    if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n                        maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n                    }\n                }\n            }\n        }\n        // Mask out other blocks\n        while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n            maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n        }\n        // Mask out escaped characters\n        while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n            maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n        }\n        while (src) {\n            if (!keepPrevChar) {\n                prevChar = '';\n            }\n            keepPrevChar = false;\n            // extensions\n            if (this.options.extensions\n                && this.options.extensions.inline\n                && this.options.extensions.inline.some((extTokenizer) => {\n                    if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n                        src = src.substring(token.raw.length);\n                        tokens.push(token);\n                        return true;\n                    }\n                    return false;\n                })) {\n                continue;\n            }\n            // escape\n            if (token = this.tokenizer.escape(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // tag\n            if (token = this.tokenizer.tag(src)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n                    lastToken.raw += token.raw;\n                    lastToken.text += token.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // link\n            if (token = this.tokenizer.link(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // reflink, nolink\n            if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n                    lastToken.raw += token.raw;\n                    lastToken.text += token.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // em & strong\n            if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // code\n            if (token = this.tokenizer.codespan(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // br\n            if (token = this.tokenizer.br(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // del (gfm)\n            if (token = this.tokenizer.del(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // autolink\n            if (token = this.tokenizer.autolink(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // url (gfm)\n            if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // text\n            // prevent inlineText consuming extensions by clipping 'src' to extension start\n            cutSrc = src;\n            if (this.options.extensions && this.options.extensions.startInline) {\n                let startIndex = Infinity;\n                const tempSrc = src.slice(1);\n                let tempStart;\n                this.options.extensions.startInline.forEach((getStartIndex) => {\n                    tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n                    if (typeof tempStart === 'number' && tempStart >= 0) {\n                        startIndex = Math.min(startIndex, tempStart);\n                    }\n                });\n                if (startIndex < Infinity && startIndex >= 0) {\n                    cutSrc = src.substring(0, startIndex + 1);\n                }\n            }\n            if (token = this.tokenizer.inlineText(cutSrc)) {\n                src = src.substring(token.raw.length);\n                if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n                    prevChar = token.raw.slice(-1);\n                }\n                keepPrevChar = true;\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && lastToken.type === 'text') {\n                    lastToken.raw += token.raw;\n                    lastToken.text += token.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            if (src) {\n                const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n                if (this.options.silent) {\n                    console.error(errMsg);\n                    break;\n                }\n                else {\n                    throw new Error(errMsg);\n                }\n            }\n        }\n        return tokens;\n    }\n}\n\n/**\n * Renderer\n */\nclass _Renderer {\n    options;\n    parser; // set by the parser\n    constructor(options) {\n        this.options = options || _defaults;\n    }\n    space(token) {\n        return '';\n    }\n    code({ text, lang, escaped }) {\n        const langString = (lang || '').match(/^\\S*/)?.[0];\n        const code = text.replace(/\\n$/, '') + '\\n';\n        if (!langString) {\n            return '<pre><code>'\n                + (escaped ? code : escape$1(code, true))\n                + '</code></pre>\\n';\n        }\n        return '<pre><code class=\"language-'\n            + escape$1(langString)\n            + '\">'\n            + (escaped ? code : escape$1(code, true))\n            + '</code></pre>\\n';\n    }\n    blockquote({ tokens }) {\n        const body = this.parser.parse(tokens);\n        return `<blockquote>\\n${body}</blockquote>\\n`;\n    }\n    html({ text }) {\n        return text;\n    }\n    heading({ tokens, depth }) {\n        return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>\\n`;\n    }\n    hr(token) {\n        return '<hr>\\n';\n    }\n    list(token) {\n        const ordered = token.ordered;\n        const start = token.start;\n        let body = '';\n        for (let j = 0; j < token.items.length; j++) {\n            const item = token.items[j];\n            body += this.listitem(item);\n        }\n        const type = ordered ? 'ol' : 'ul';\n        const startAttr = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n        return '<' + type + startAttr + '>\\n' + body + '</' + type + '>\\n';\n    }\n    listitem(item) {\n        let itemBody = '';\n        if (item.task) {\n            const checkbox = this.checkbox({ checked: !!item.checked });\n            if (item.loose) {\n                if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n                    item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n                    if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n                        item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n                    }\n                }\n                else {\n                    item.tokens.unshift({\n                        type: 'text',\n                        raw: checkbox + ' ',\n                        text: checkbox + ' ',\n                    });\n                }\n            }\n            else {\n                itemBody += checkbox + ' ';\n            }\n        }\n        itemBody += this.parser.parse(item.tokens, !!item.loose);\n        return `<li>${itemBody}</li>\\n`;\n    }\n    checkbox({ checked }) {\n        return '<input '\n            + (checked ? 'checked=\"\" ' : '')\n            + 'disabled=\"\" type=\"checkbox\">';\n    }\n    paragraph({ tokens }) {\n        return `<p>${this.parser.parseInline(tokens)}</p>\\n`;\n    }\n    table(token) {\n        let header = '';\n        // header\n        let cell = '';\n        for (let j = 0; j < token.header.length; j++) {\n            cell += this.tablecell(token.header[j]);\n        }\n        header += this.tablerow({ text: cell });\n        let body = '';\n        for (let j = 0; j < token.rows.length; j++) {\n            const row = token.rows[j];\n            cell = '';\n            for (let k = 0; k < row.length; k++) {\n                cell += this.tablecell(row[k]);\n            }\n            body += this.tablerow({ text: cell });\n        }\n        if (body)\n            body = `<tbody>${body}</tbody>`;\n        return '<table>\\n'\n            + '<thead>\\n'\n            + header\n            + '</thead>\\n'\n            + body\n            + '</table>\\n';\n    }\n    tablerow({ text }) {\n        return `<tr>\\n${text}</tr>\\n`;\n    }\n    tablecell(token) {\n        const content = this.parser.parseInline(token.tokens);\n        const type = token.header ? 'th' : 'td';\n        const tag = token.align\n            ? `<${type} align=\"${token.align}\">`\n            : `<${type}>`;\n        return tag + content + `</${type}>\\n`;\n    }\n    /**\n     * span level renderer\n     */\n    strong({ tokens }) {\n        return `<strong>${this.parser.parseInline(tokens)}</strong>`;\n    }\n    em({ tokens }) {\n        return `<em>${this.parser.parseInline(tokens)}</em>`;\n    }\n    codespan({ text }) {\n        return `<code>${text}</code>`;\n    }\n    br(token) {\n        return '<br>';\n    }\n    del({ tokens }) {\n        return `<del>${this.parser.parseInline(tokens)}</del>`;\n    }\n    link({ href, title, tokens }) {\n        const text = this.parser.parseInline(tokens);\n        const cleanHref = cleanUrl(href);\n        if (cleanHref === null) {\n            return text;\n        }\n        href = cleanHref;\n        let out = '<a href=\"' + href + '\"';\n        if (title) {\n            out += ' title=\"' + title + '\"';\n        }\n        out += '>' + text + '</a>';\n        return out;\n    }\n    image({ href, title, text }) {\n        const cleanHref = cleanUrl(href);\n        if (cleanHref === null) {\n            return text;\n        }\n        href = cleanHref;\n        let out = `<img src=\"${href}\" alt=\"${text}\"`;\n        if (title) {\n            out += ` title=\"${title}\"`;\n        }\n        out += '>';\n        return out;\n    }\n    text(token) {\n        return 'tokens' in token && token.tokens ? this.parser.parseInline(token.tokens) : token.text;\n    }\n}\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nclass _TextRenderer {\n    // no need for block level renderers\n    strong({ text }) {\n        return text;\n    }\n    em({ text }) {\n        return text;\n    }\n    codespan({ text }) {\n        return text;\n    }\n    del({ text }) {\n        return text;\n    }\n    html({ text }) {\n        return text;\n    }\n    text({ text }) {\n        return text;\n    }\n    link({ text }) {\n        return '' + text;\n    }\n    image({ text }) {\n        return '' + text;\n    }\n    br() {\n        return '';\n    }\n}\n\n/**\n * Parsing & Compiling\n */\nclass _Parser {\n    options;\n    renderer;\n    textRenderer;\n    constructor(options) {\n        this.options = options || _defaults;\n        this.options.renderer = this.options.renderer || new _Renderer();\n        this.renderer = this.options.renderer;\n        this.renderer.options = this.options;\n        this.renderer.parser = this;\n        this.textRenderer = new _TextRenderer();\n    }\n    /**\n     * Static Parse Method\n     */\n    static parse(tokens, options) {\n        const parser = new _Parser(options);\n        return parser.parse(tokens);\n    }\n    /**\n     * Static Parse Inline Method\n     */\n    static parseInline(tokens, options) {\n        const parser = new _Parser(options);\n        return parser.parseInline(tokens);\n    }\n    /**\n     * Parse Loop\n     */\n    parse(tokens, top = true) {\n        let out = '';\n        for (let i = 0; i < tokens.length; i++) {\n            const anyToken = tokens[i];\n            // Run any renderer extensions\n            if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[anyToken.type]) {\n                const genericToken = anyToken;\n                const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n                if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(genericToken.type)) {\n                    out += ret || '';\n                    continue;\n                }\n            }\n            const token = anyToken;\n            switch (token.type) {\n                case 'space': {\n                    out += this.renderer.space(token);\n                    continue;\n                }\n                case 'hr': {\n                    out += this.renderer.hr(token);\n                    continue;\n                }\n                case 'heading': {\n                    out += this.renderer.heading(token);\n                    continue;\n                }\n                case 'code': {\n                    out += this.renderer.code(token);\n                    continue;\n                }\n                case 'table': {\n                    out += this.renderer.table(token);\n                    continue;\n                }\n                case 'blockquote': {\n                    out += this.renderer.blockquote(token);\n                    continue;\n                }\n                case 'list': {\n                    out += this.renderer.list(token);\n                    continue;\n                }\n                case 'html': {\n                    out += this.renderer.html(token);\n                    continue;\n                }\n                case 'paragraph': {\n                    out += this.renderer.paragraph(token);\n                    continue;\n                }\n                case 'text': {\n                    let textToken = token;\n                    let body = this.renderer.text(textToken);\n                    while (i + 1 < tokens.length && tokens[i + 1].type === 'text') {\n                        textToken = tokens[++i];\n                        body += '\\n' + this.renderer.text(textToken);\n                    }\n                    if (top) {\n                        out += this.renderer.paragraph({\n                            type: 'paragraph',\n                            raw: body,\n                            text: body,\n                            tokens: [{ type: 'text', raw: body, text: body }],\n                        });\n                    }\n                    else {\n                        out += body;\n                    }\n                    continue;\n                }\n                default: {\n                    const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n                    if (this.options.silent) {\n                        console.error(errMsg);\n                        return '';\n                    }\n                    else {\n                        throw new Error(errMsg);\n                    }\n                }\n            }\n        }\n        return out;\n    }\n    /**\n     * Parse Inline Tokens\n     */\n    parseInline(tokens, renderer) {\n        renderer = renderer || this.renderer;\n        let out = '';\n        for (let i = 0; i < tokens.length; i++) {\n            const anyToken = tokens[i];\n            // Run any renderer extensions\n            if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[anyToken.type]) {\n                const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);\n                if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(anyToken.type)) {\n                    out += ret || '';\n                    continue;\n                }\n            }\n            const token = anyToken;\n            switch (token.type) {\n                case 'escape': {\n                    out += renderer.text(token);\n                    break;\n                }\n                case 'html': {\n                    out += renderer.html(token);\n                    break;\n                }\n                case 'link': {\n                    out += renderer.link(token);\n                    break;\n                }\n                case 'image': {\n                    out += renderer.image(token);\n                    break;\n                }\n                case 'strong': {\n                    out += renderer.strong(token);\n                    break;\n                }\n                case 'em': {\n                    out += renderer.em(token);\n                    break;\n                }\n                case 'codespan': {\n                    out += renderer.codespan(token);\n                    break;\n                }\n                case 'br': {\n                    out += renderer.br(token);\n                    break;\n                }\n                case 'del': {\n                    out += renderer.del(token);\n                    break;\n                }\n                case 'text': {\n                    out += renderer.text(token);\n                    break;\n                }\n                default: {\n                    const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n                    if (this.options.silent) {\n                        console.error(errMsg);\n                        return '';\n                    }\n                    else {\n                        throw new Error(errMsg);\n                    }\n                }\n            }\n        }\n        return out;\n    }\n}\n\nclass _Hooks {\n    options;\n    constructor(options) {\n        this.options = options || _defaults;\n    }\n    static passThroughHooks = new Set([\n        'preprocess',\n        'postprocess',\n        'processAllTokens',\n    ]);\n    /**\n     * Process markdown before marked\n     */\n    preprocess(markdown) {\n        return markdown;\n    }\n    /**\n     * Process HTML after marked is finished\n     */\n    postprocess(html) {\n        return html;\n    }\n    /**\n     * Process all tokens before walk tokens\n     */\n    processAllTokens(tokens) {\n        return tokens;\n    }\n}\n\nclass Marked {\n    defaults = _getDefaults();\n    options = this.setOptions;\n    parse = this.parseMarkdown(_Lexer.lex, _Parser.parse);\n    parseInline = this.parseMarkdown(_Lexer.lexInline, _Parser.parseInline);\n    Parser = _Parser;\n    Renderer = _Renderer;\n    TextRenderer = _TextRenderer;\n    Lexer = _Lexer;\n    Tokenizer = _Tokenizer;\n    Hooks = _Hooks;\n    constructor(...args) {\n        this.use(...args);\n    }\n    /**\n     * Run callback for every token\n     */\n    walkTokens(tokens, callback) {\n        let values = [];\n        for (const token of tokens) {\n            values = values.concat(callback.call(this, token));\n            switch (token.type) {\n                case 'table': {\n                    const tableToken = token;\n                    for (const cell of tableToken.header) {\n                        values = values.concat(this.walkTokens(cell.tokens, callback));\n                    }\n                    for (const row of tableToken.rows) {\n                        for (const cell of row) {\n                            values = values.concat(this.walkTokens(cell.tokens, callback));\n                        }\n                    }\n                    break;\n                }\n                case 'list': {\n                    const listToken = token;\n                    values = values.concat(this.walkTokens(listToken.items, callback));\n                    break;\n                }\n                default: {\n                    const genericToken = token;\n                    if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n                        this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n                            const tokens = genericToken[childTokens].flat(Infinity);\n                            values = values.concat(this.walkTokens(tokens, callback));\n                        });\n                    }\n                    else if (genericToken.tokens) {\n                        values = values.concat(this.walkTokens(genericToken.tokens, callback));\n                    }\n                }\n            }\n        }\n        return values;\n    }\n    use(...args) {\n        const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };\n        args.forEach((pack) => {\n            // copy options to new object\n            const opts = { ...pack };\n            // set async to true if it was set to true before\n            opts.async = this.defaults.async || opts.async || false;\n            // ==-- Parse \"addon\" extensions --== //\n            if (pack.extensions) {\n                pack.extensions.forEach((ext) => {\n                    if (!ext.name) {\n                        throw new Error('extension name required');\n                    }\n                    if ('renderer' in ext) { // Renderer extensions\n                        const prevRenderer = extensions.renderers[ext.name];\n                        if (prevRenderer) {\n                            // Replace extension with func to run new extension but fall back if false\n                            extensions.renderers[ext.name] = function (...args) {\n                                let ret = ext.renderer.apply(this, args);\n                                if (ret === false) {\n                                    ret = prevRenderer.apply(this, args);\n                                }\n                                return ret;\n                            };\n                        }\n                        else {\n                            extensions.renderers[ext.name] = ext.renderer;\n                        }\n                    }\n                    if ('tokenizer' in ext) { // Tokenizer Extensions\n                        if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n                            throw new Error(\"extension level must be 'block' or 'inline'\");\n                        }\n                        const extLevel = extensions[ext.level];\n                        if (extLevel) {\n                            extLevel.unshift(ext.tokenizer);\n                        }\n                        else {\n                            extensions[ext.level] = [ext.tokenizer];\n                        }\n                        if (ext.start) { // Function to check for start of token\n                            if (ext.level === 'block') {\n                                if (extensions.startBlock) {\n                                    extensions.startBlock.push(ext.start);\n                                }\n                                else {\n                                    extensions.startBlock = [ext.start];\n                                }\n                            }\n                            else if (ext.level === 'inline') {\n                                if (extensions.startInline) {\n                                    extensions.startInline.push(ext.start);\n                                }\n                                else {\n                                    extensions.startInline = [ext.start];\n                                }\n                            }\n                        }\n                    }\n                    if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n                        extensions.childTokens[ext.name] = ext.childTokens;\n                    }\n                });\n                opts.extensions = extensions;\n            }\n            // ==-- Parse \"overwrite\" extensions --== //\n            if (pack.renderer) {\n                const renderer = this.defaults.renderer || new _Renderer(this.defaults);\n                for (const prop in pack.renderer) {\n                    if (!(prop in renderer)) {\n                        throw new Error(`renderer '${prop}' does not exist`);\n                    }\n                    if (['options', 'parser'].includes(prop)) {\n                        // ignore options property\n                        continue;\n                    }\n                    const rendererProp = prop;\n                    const rendererFunc = pack.renderer[rendererProp];\n                    const prevRenderer = renderer[rendererProp];\n                    // Replace renderer with func to run extension, but fall back if false\n                    renderer[rendererProp] = (...args) => {\n                        let ret = rendererFunc.apply(renderer, args);\n                        if (ret === false) {\n                            ret = prevRenderer.apply(renderer, args);\n                        }\n                        return ret || '';\n                    };\n                }\n                opts.renderer = renderer;\n            }\n            if (pack.tokenizer) {\n                const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);\n                for (const prop in pack.tokenizer) {\n                    if (!(prop in tokenizer)) {\n                        throw new Error(`tokenizer '${prop}' does not exist`);\n                    }\n                    if (['options', 'rules', 'lexer'].includes(prop)) {\n                        // ignore options, rules, and lexer properties\n                        continue;\n                    }\n                    const tokenizerProp = prop;\n                    const tokenizerFunc = pack.tokenizer[tokenizerProp];\n                    const prevTokenizer = tokenizer[tokenizerProp];\n                    // Replace tokenizer with func to run extension, but fall back if false\n                    // @ts-expect-error cannot type tokenizer function dynamically\n                    tokenizer[tokenizerProp] = (...args) => {\n                        let ret = tokenizerFunc.apply(tokenizer, args);\n                        if (ret === false) {\n                            ret = prevTokenizer.apply(tokenizer, args);\n                        }\n                        return ret;\n                    };\n                }\n                opts.tokenizer = tokenizer;\n            }\n            // ==-- Parse Hooks extensions --== //\n            if (pack.hooks) {\n                const hooks = this.defaults.hooks || new _Hooks();\n                for (const prop in pack.hooks) {\n                    if (!(prop in hooks)) {\n                        throw new Error(`hook '${prop}' does not exist`);\n                    }\n                    if (prop === 'options') {\n                        // ignore options property\n                        continue;\n                    }\n                    const hooksProp = prop;\n                    const hooksFunc = pack.hooks[hooksProp];\n                    const prevHook = hooks[hooksProp];\n                    if (_Hooks.passThroughHooks.has(prop)) {\n                        // @ts-expect-error cannot type hook function dynamically\n                        hooks[hooksProp] = (arg) => {\n                            if (this.defaults.async) {\n                                return Promise.resolve(hooksFunc.call(hooks, arg)).then(ret => {\n                                    return prevHook.call(hooks, ret);\n                                });\n                            }\n                            const ret = hooksFunc.call(hooks, arg);\n                            return prevHook.call(hooks, ret);\n                        };\n                    }\n                    else {\n                        // @ts-expect-error cannot type hook function dynamically\n                        hooks[hooksProp] = (...args) => {\n                            let ret = hooksFunc.apply(hooks, args);\n                            if (ret === false) {\n                                ret = prevHook.apply(hooks, args);\n                            }\n                            return ret;\n                        };\n                    }\n                }\n                opts.hooks = hooks;\n            }\n            // ==-- Parse WalkTokens extensions --== //\n            if (pack.walkTokens) {\n                const walkTokens = this.defaults.walkTokens;\n                const packWalktokens = pack.walkTokens;\n                opts.walkTokens = function (token) {\n                    let values = [];\n                    values.push(packWalktokens.call(this, token));\n                    if (walkTokens) {\n                        values = values.concat(walkTokens.call(this, token));\n                    }\n                    return values;\n                };\n            }\n            this.defaults = { ...this.defaults, ...opts };\n        });\n        return this;\n    }\n    setOptions(opt) {\n        this.defaults = { ...this.defaults, ...opt };\n        return this;\n    }\n    lexer(src, options) {\n        return _Lexer.lex(src, options ?? this.defaults);\n    }\n    parser(tokens, options) {\n        return _Parser.parse(tokens, options ?? this.defaults);\n    }\n    parseMarkdown(lexer, parser) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const parse = (src, options) => {\n            const origOpt = { ...options };\n            const opt = { ...this.defaults, ...origOpt };\n            const throwError = this.onError(!!opt.silent, !!opt.async);\n            // throw error if an extension set async to true but parse was called with async: false\n            if (this.defaults.async === true && origOpt.async === false) {\n                return throwError(new Error('marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.'));\n            }\n            // throw error in case of non string input\n            if (typeof src === 'undefined' || src === null) {\n                return throwError(new Error('marked(): input parameter is undefined or null'));\n            }\n            if (typeof src !== 'string') {\n                return throwError(new Error('marked(): input parameter is of type '\n                    + Object.prototype.toString.call(src) + ', string expected'));\n            }\n            if (opt.hooks) {\n                opt.hooks.options = opt;\n            }\n            if (opt.async) {\n                return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src)\n                    .then(src => lexer(src, opt))\n                    .then(tokens => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens)\n                    .then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens)\n                    .then(tokens => parser(tokens, opt))\n                    .then(html => opt.hooks ? opt.hooks.postprocess(html) : html)\n                    .catch(throwError);\n            }\n            try {\n                if (opt.hooks) {\n                    src = opt.hooks.preprocess(src);\n                }\n                let tokens = lexer(src, opt);\n                if (opt.hooks) {\n                    tokens = opt.hooks.processAllTokens(tokens);\n                }\n                if (opt.walkTokens) {\n                    this.walkTokens(tokens, opt.walkTokens);\n                }\n                let html = parser(tokens, opt);\n                if (opt.hooks) {\n                    html = opt.hooks.postprocess(html);\n                }\n                return html;\n            }\n            catch (e) {\n                return throwError(e);\n            }\n        };\n        return parse;\n    }\n    onError(silent, async) {\n        return (e) => {\n            e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n            if (silent) {\n                const msg = '<p>An error occurred:</p><pre>'\n                    + escape$1(e.message + '', true)\n                    + '</pre>';\n                if (async) {\n                    return Promise.resolve(msg);\n                }\n                return msg;\n            }\n            if (async) {\n                return Promise.reject(e);\n            }\n            throw e;\n        };\n    }\n}\n\nconst markedInstance = new Marked();\nfunction marked(src, opt) {\n    return markedInstance.parse(src, opt);\n}\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n    marked.setOptions = function (options) {\n        markedInstance.setOptions(options);\n        marked.defaults = markedInstance.defaults;\n        changeDefaults(marked.defaults);\n        return marked;\n    };\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\nmarked.defaults = _defaults;\n/**\n * Use Extension\n */\nmarked.use = function (...args) {\n    markedInstance.use(...args);\n    marked.defaults = markedInstance.defaults;\n    changeDefaults(marked.defaults);\n    return marked;\n};\n/**\n * Run callback for every token\n */\nmarked.walkTokens = function (tokens, callback) {\n    return markedInstance.walkTokens(tokens, callback);\n};\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\nmarked.options;\nmarked.setOptions;\nmarked.use;\nmarked.walkTokens;\nmarked.parseInline;\nconst parse = marked;\n_Parser.parse;\nconst lexer = _Lexer.lex;\n\nexport { _Hooks as Hooks, _Lexer as Lexer, Marked, _Parser as Parser, _Renderer as Renderer, _TextRenderer as TextRenderer, _Tokenizer as Tokenizer, _defaults as defaults, _getDefaults as getDefaults, lexer, marked, parse };\n","import { VSBuffer } from './buffer.js';\nimport { URI } from './uri.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction stringify(obj) {\n    return JSON.stringify(obj, replacer);\n}\nfunction parse(text) {\n    let data = JSON.parse(text);\n    data = revive(data);\n    return data;\n}\nfunction replacer(key, value) {\n    // URI is done via toJSON-member\n    if (value instanceof RegExp) {\n        return {\n            $mid: 2 /* MarshalledId.Regexp */,\n            source: value.source,\n            flags: value.flags,\n        };\n    }\n    return value;\n}\nfunction revive(obj, depth = 0) {\n    if (!obj || depth > 200) {\n        return obj;\n    }\n    if (typeof obj === 'object') {\n        switch (obj.$mid) {\n            // eslint-disable-next-line local/code-no-any-casts\n            case 1 /* MarshalledId.Uri */: return URI.revive(obj);\n            // eslint-disable-next-line local/code-no-any-casts\n            case 2 /* MarshalledId.Regexp */: return new RegExp(obj.source, obj.flags);\n            // eslint-disable-next-line local/code-no-any-casts\n            case 17 /* MarshalledId.Date */: return new Date(obj.source);\n        }\n        if (obj instanceof VSBuffer\n            || obj instanceof Uint8Array) {\n            // eslint-disable-next-line local/code-no-any-casts\n            return obj;\n        }\n        if (Array.isArray(obj)) {\n            for (let i = 0; i < obj.length; ++i) {\n                obj[i] = revive(obj[i], depth + 1);\n            }\n        }\n        else {\n            // walk object\n            for (const key in obj) {\n                if (Object.hasOwnProperty.call(obj, key)) {\n                    obj[key] = revive(obj[key], depth + 1);\n                }\n            }\n        }\n    }\n    return obj;\n}\n\nexport { parse, revive, stringify };\n","/*! @license DOMPurify 3.2.7 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.7/LICENSE */\n\nconst {\n  entries,\n  setPrototypeOf,\n  isFrozen,\n  getPrototypeOf,\n  getOwnPropertyDescriptor\n} = Object;\nlet {\n  freeze,\n  seal,\n  create\n} = Object; // eslint-disable-line import/no-mutable-exports\nlet {\n  apply,\n  construct\n} = typeof Reflect !== 'undefined' && Reflect;\nif (!freeze) {\n  freeze = function freeze(x) {\n    return x;\n  };\n}\nif (!seal) {\n  seal = function seal(x) {\n    return x;\n  };\n}\nif (!apply) {\n  apply = function apply(func, thisArg) {\n    for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n      args[_key - 2] = arguments[_key];\n    }\n    return func.apply(thisArg, args);\n  };\n}\nif (!construct) {\n  construct = function construct(Func) {\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n    return new Func(...args);\n  };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n  return function (thisArg) {\n    if (thisArg instanceof RegExp) {\n      thisArg.lastIndex = 0;\n    }\n    for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n      args[_key3 - 1] = arguments[_key3];\n    }\n    return apply(func, thisArg, args);\n  };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n  return function () {\n    for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n      args[_key4] = arguments[_key4];\n    }\n    return construct(Func, args);\n  };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n  let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n  if (setPrototypeOf) {\n    // Make 'in' and truthy checks like Boolean(set.constructor)\n    // independent of any properties defined on Object.prototype.\n    // Prevent prototype setters from intercepting set as a this value.\n    setPrototypeOf(set, null);\n  }\n  let l = array.length;\n  while (l--) {\n    let element = array[l];\n    if (typeof element === 'string') {\n      const lcElement = transformCaseFunc(element);\n      if (lcElement !== element) {\n        // Config presets (e.g. tags.js, attrs.js) are immutable.\n        if (!isFrozen(array)) {\n          array[l] = lcElement;\n        }\n        element = lcElement;\n      }\n    }\n    set[element] = true;\n  }\n  return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n  for (let index = 0; index < array.length; index++) {\n    const isPropertyExist = objectHasOwnProperty(array, index);\n    if (!isPropertyExist) {\n      array[index] = null;\n    }\n  }\n  return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n  const newObject = create(null);\n  for (const [property, value] of entries(object)) {\n    const isPropertyExist = objectHasOwnProperty(object, property);\n    if (isPropertyExist) {\n      if (Array.isArray(value)) {\n        newObject[property] = cleanArray(value);\n      } else if (value && typeof value === 'object' && value.constructor === Object) {\n        newObject[property] = clone(value);\n      } else {\n        newObject[property] = value;\n      }\n    }\n  }\n  return newObject;\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n  while (object !== null) {\n    const desc = getOwnPropertyDescriptor(object, prop);\n    if (desc) {\n      if (desc.get) {\n        return unapply(desc.get);\n      }\n      if (typeof desc.value === 'function') {\n        return unapply(desc.value);\n      }\n    }\n    object = getPrototypeOf(object);\n  }\n  function fallbackValue() {\n    return null;\n  }\n  return fallbackValue;\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'slot', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  ARIA_ATTR: ARIA_ATTR,\n  ATTR_WHITESPACE: ATTR_WHITESPACE,\n  CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n  DATA_ATTR: DATA_ATTR,\n  DOCTYPE_NAME: DOCTYPE_NAME,\n  ERB_EXPR: ERB_EXPR,\n  IS_ALLOWED_URI: IS_ALLOWED_URI,\n  IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n  MUSTACHE_EXPR: MUSTACHE_EXPR,\n  TMPLIT_EXPR: TMPLIT_EXPR\n});\n\n/* eslint-disable @typescript-eslint/indent */\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n  element: 1,\n  text: 3,\n  // Deprecated\n  progressingInstruction: 7,\n  comment: 8,\n  document: 9};\nconst getGlobal = function getGlobal() {\n  return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n  if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n    return null;\n  }\n  // Allow the callers to control the unique policy name\n  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n  // Policy creation with duplicate names throws in Trusted Types.\n  let suffix = null;\n  const ATTR_NAME = 'data-tt-policy-suffix';\n  if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n    suffix = purifyHostElement.getAttribute(ATTR_NAME);\n  }\n  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n  try {\n    return trustedTypes.createPolicy(policyName, {\n      createHTML(html) {\n        return html;\n      },\n      createScriptURL(scriptUrl) {\n        return scriptUrl;\n      }\n    });\n  } catch (_) {\n    // Policy creation failed (most likely another DOMPurify script has\n    // already run). Skip creating the policy, as this will only cause errors\n    // if TT are enforced.\n    console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n    return null;\n  }\n};\nconst _createHooksMap = function _createHooksMap() {\n  return {\n    afterSanitizeAttributes: [],\n    afterSanitizeElements: [],\n    afterSanitizeShadowDOM: [],\n    beforeSanitizeAttributes: [],\n    beforeSanitizeElements: [],\n    beforeSanitizeShadowDOM: [],\n    uponSanitizeAttribute: [],\n    uponSanitizeElement: [],\n    uponSanitizeShadowNode: []\n  };\n};\nfunction createDOMPurify() {\n  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n  const DOMPurify = root => createDOMPurify(root);\n  DOMPurify.version = '3.2.7';\n  DOMPurify.removed = [];\n  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n    // Not running in a browser, provide a factory function\n    // so that you can pass your own Window\n    DOMPurify.isSupported = false;\n    return DOMPurify;\n  }\n  let {\n    document\n  } = window;\n  const originalDocument = document;\n  const currentScript = originalDocument.currentScript;\n  const {\n    DocumentFragment,\n    HTMLTemplateElement,\n    Node,\n    Element,\n    NodeFilter,\n    NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n    HTMLFormElement,\n    DOMParser,\n    trustedTypes\n  } = window;\n  const ElementPrototype = Element.prototype;\n  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n  const remove = lookupGetter(ElementPrototype, 'remove');\n  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n  const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n  // As per issue #47, the web-components registry is inherited by a\n  // new document created via createHTMLDocument. As per the spec\n  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n  // a new empty registry is used when creating a template contents owner\n  // document, so we use that as our parent document to ensure nothing\n  // is inherited.\n  if (typeof HTMLTemplateElement === 'function') {\n    const template = document.createElement('template');\n    if (template.content && template.content.ownerDocument) {\n      document = template.content.ownerDocument;\n    }\n  }\n  let trustedTypesPolicy;\n  let emptyHTML = '';\n  const {\n    implementation,\n    createNodeIterator,\n    createDocumentFragment,\n    getElementsByTagName\n  } = document;\n  const {\n    importNode\n  } = originalDocument;\n  let hooks = _createHooksMap();\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n  const {\n    MUSTACHE_EXPR,\n    ERB_EXPR,\n    TMPLIT_EXPR,\n    DATA_ATTR,\n    ARIA_ATTR,\n    IS_SCRIPT_OR_DATA,\n    ATTR_WHITESPACE,\n    CUSTOM_ELEMENT\n  } = EXPRESSIONS;\n  let {\n    IS_ALLOWED_URI: IS_ALLOWED_URI$1\n  } = EXPRESSIONS;\n  /**\n   * We consider the elements and attributes below to be safe. Ideally\n   * don't add any new ones but feel free to remove unwanted ones.\n   */\n  /* allowed element names */\n  let ALLOWED_TAGS = null;\n  const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n  /* Allowed attribute names */\n  let ALLOWED_ATTR = null;\n  const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n  /*\n   * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n   */\n  let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    allowCustomizedBuiltInElements: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: false\n    }\n  }));\n  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n  let FORBID_TAGS = null;\n  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n  let FORBID_ATTR = null;\n  /* Decide if ARIA attributes are okay */\n  let ALLOW_ARIA_ATTR = true;\n  /* Decide if custom data attributes are okay */\n  let ALLOW_DATA_ATTR = true;\n  /* Decide if unknown protocols are okay */\n  let ALLOW_UNKNOWN_PROTOCOLS = false;\n  /* Decide if self-closing tags in attributes are allowed.\n   * Usually removed due to a mXSS issue in jQuery 3.0 */\n  let ALLOW_SELF_CLOSE_IN_ATTR = true;\n  /* Output should be safe for common template engines.\n   * This means, DOMPurify removes data attributes, mustaches and ERB\n   */\n  let SAFE_FOR_TEMPLATES = false;\n  /* Output should be safe even for XML used within HTML and alike.\n   * This means, DOMPurify removes comments when containing risky content.\n   */\n  let SAFE_FOR_XML = true;\n  /* Decide if document with <html>... should be returned */\n  let WHOLE_DOCUMENT = false;\n  /* Track whether config is already set on this instance of DOMPurify. */\n  let SET_CONFIG = false;\n  /* Decide if all elements (e.g. style, script) must be children of\n   * document.body. By default, browsers might move them to document.head */\n  let FORCE_BODY = false;\n  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n   * string (or a TrustedHTML object if Trusted Types are supported).\n   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n   */\n  let RETURN_DOM = false;\n  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n   * string  (or a TrustedHTML object if Trusted Types are supported) */\n  let RETURN_DOM_FRAGMENT = false;\n  /* Try to return a Trusted Type object instead of a string, return a string in\n   * case Trusted Types are not supported  */\n  let RETURN_TRUSTED_TYPE = false;\n  /* Output should be free from DOM clobbering attacks?\n   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n   */\n  let SANITIZE_DOM = true;\n  /* Achieve full DOM Clobbering protection by isolating the namespace of named\n   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n   *\n   * HTML/DOM spec rules that enable DOM Clobbering:\n   *   - Named Access on Window (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.2.10.2)\n   *\n   * Namespace isolation is implemented by prefixing `id` and `name` attributes\n   * with a constant string, i.e., `user-content-`\n   */\n  let SANITIZE_NAMED_PROPS = false;\n  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n  /* Keep element content when removing element? */\n  let KEEP_CONTENT = true;\n  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n   * of importing it into a new Document and returning a sanitized copy */\n  let IN_PLACE = false;\n  /* Allow usage of profiles like html, svg and mathMl */\n  let USE_PROFILES = {};\n  /* Tags to ignore content of when KEEP_CONTENT is true */\n  let FORBID_CONTENTS = null;\n  const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n  /* Tags that are safe for data: URIs */\n  let DATA_URI_TAGS = null;\n  const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n  /* Attributes safe for values like \"javascript:\" */\n  let URI_SAFE_ATTRIBUTES = null;\n  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  /* Document namespace */\n  let NAMESPACE = HTML_NAMESPACE;\n  let IS_EMPTY_INPUT = false;\n  /* Allowed XHTML+XML namespaces */\n  let ALLOWED_NAMESPACES = null;\n  const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n  let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n  let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n  // Certain elements are allowed in both SVG and HTML\n  // namespace. We need to specify them explicitly\n  // so that they don't get erroneously deleted from\n  // HTML namespace.\n  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n  /* Parsing of strict XHTML documents */\n  let PARSER_MEDIA_TYPE = null;\n  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n  let transformCaseFunc = null;\n  /* Keep a reference to config to pass to hooks */\n  let CONFIG = null;\n  /* Ideally, do not touch anything below this line */\n  /* ______________________________________________ */\n  const formElement = document.createElement('form');\n  const isRegexOrFunction = function isRegexOrFunction(testValue) {\n    return testValue instanceof RegExp || testValue instanceof Function;\n  };\n  /**\n   * _parseConfig\n   *\n   * @param cfg optional config literal\n   */\n  // eslint-disable-next-line complexity\n  const _parseConfig = function _parseConfig() {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    if (CONFIG && CONFIG === cfg) {\n      return;\n    }\n    /* Shield configuration object from tampering */\n    if (!cfg || typeof cfg !== 'object') {\n      cfg = {};\n    }\n    /* Shield configuration object from prototype pollution */\n    cfg = clone(cfg);\n    PARSER_MEDIA_TYPE =\n    // eslint-disable-next-line unicorn/prefer-includes\n    SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n    // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n    transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n    /* Set configuration parameters */\n    ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n    ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n    ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n    URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n    DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n    FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n    FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : clone({});\n    FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : clone({});\n    USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\n    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n    SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n    RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n    FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n    IN_PLACE = cfg.IN_PLACE || false; // Default false\n    IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n    MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS;\n    HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS;\n    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n    }\n    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n    }\n    if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n    }\n    if (SAFE_FOR_TEMPLATES) {\n      ALLOW_DATA_ATTR = false;\n    }\n    if (RETURN_DOM_FRAGMENT) {\n      RETURN_DOM = true;\n    }\n    /* Parse profile info */\n    if (USE_PROFILES) {\n      ALLOWED_TAGS = addToSet({}, text);\n      ALLOWED_ATTR = [];\n      if (USE_PROFILES.html === true) {\n        addToSet(ALLOWED_TAGS, html$1);\n        addToSet(ALLOWED_ATTR, html);\n      }\n      if (USE_PROFILES.svg === true) {\n        addToSet(ALLOWED_TAGS, svg$1);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.svgFilters === true) {\n        addToSet(ALLOWED_TAGS, svgFilters);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.mathMl === true) {\n        addToSet(ALLOWED_TAGS, mathMl$1);\n        addToSet(ALLOWED_ATTR, mathMl);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n    }\n    /* Merge configuration parameters */\n    if (cfg.ADD_TAGS) {\n      if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n        ALLOWED_TAGS = clone(ALLOWED_TAGS);\n      }\n      addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n    }\n    if (cfg.ADD_ATTR) {\n      if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n        ALLOWED_ATTR = clone(ALLOWED_ATTR);\n      }\n      addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n    }\n    if (cfg.ADD_URI_SAFE_ATTR) {\n      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n    }\n    if (cfg.FORBID_CONTENTS) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n    }\n    /* Add #text in case KEEP_CONTENT is set to true */\n    if (KEEP_CONTENT) {\n      ALLOWED_TAGS['#text'] = true;\n    }\n    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n    if (WHOLE_DOCUMENT) {\n      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n    }\n    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n    if (ALLOWED_TAGS.table) {\n      addToSet(ALLOWED_TAGS, ['tbody']);\n      delete FORBID_TAGS.tbody;\n    }\n    if (cfg.TRUSTED_TYPES_POLICY) {\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n      }\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n      }\n      // Overwrite existing TrustedTypes policy.\n      trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n      // Sign local variables required by `sanitize`.\n      emptyHTML = trustedTypesPolicy.createHTML('');\n    } else {\n      // Uninitialized policy, attempt to initialize the internal dompurify policy.\n      if (trustedTypesPolicy === undefined) {\n        trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n      }\n      // If creating the internal policy succeeded sign internal variables.\n      if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n        emptyHTML = trustedTypesPolicy.createHTML('');\n      }\n    }\n    // Prevent further manipulation of configuration.\n    // Not available in IE8, Safari 5, etc.\n    if (freeze) {\n      freeze(cfg);\n    }\n    CONFIG = cfg;\n  };\n  /* Keep track of all possible SVG and MathML tags\n   * so that we can perform the namespace checks\n   * correctly. */\n  const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n  const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n  /**\n   * @param element a DOM element whose namespace is being checked\n   * @returns Return false if the element has a\n   *  namespace that a spec-compliant parser would never\n   *  return. Return true otherwise.\n   */\n  const _checkValidNamespace = function _checkValidNamespace(element) {\n    let parent = getParentNode(element);\n    // In JSDOM, if we're inside shadow DOM, then parentNode\n    // can be null. We just simulate parent in this case.\n    if (!parent || !parent.tagName) {\n      parent = {\n        namespaceURI: NAMESPACE,\n        tagName: 'template'\n      };\n    }\n    const tagName = stringToLowerCase(element.tagName);\n    const parentTagName = stringToLowerCase(parent.tagName);\n    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return false;\n    }\n    if (element.namespaceURI === SVG_NAMESPACE) {\n      // The only way to switch from HTML namespace to SVG\n      // is via <svg>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === 'svg';\n      }\n      // The only way to switch from MathML to SVG is via`\n      // svg if parent is either <annotation-xml> or MathML\n      // text integration points.\n      if (parent.namespaceURI === MATHML_NAMESPACE) {\n        return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n      }\n      // We only allow elements that are defined in SVG\n      // spec. All others are disallowed in SVG namespace.\n      return Boolean(ALL_SVG_TAGS[tagName]);\n    }\n    if (element.namespaceURI === MATHML_NAMESPACE) {\n      // The only way to switch from HTML namespace to MathML\n      // is via <math>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === 'math';\n      }\n      // The only way to switch from SVG to MathML is via\n      // <math> and HTML integration points\n      if (parent.namespaceURI === SVG_NAMESPACE) {\n        return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n      }\n      // We only allow elements that are defined in MathML\n      // spec. All others are disallowed in MathML namespace.\n      return Boolean(ALL_MATHML_TAGS[tagName]);\n    }\n    if (element.namespaceURI === HTML_NAMESPACE) {\n      // The only way to switch from SVG to HTML is via\n      // HTML integration points, and from MathML to HTML\n      // is via MathML text integration points\n      if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n        return false;\n      }\n      if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n        return false;\n      }\n      // We disallow tags that are specific for MathML\n      // or SVG and should never appear in HTML namespace\n      return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n    }\n    // For XHTML and XML documents that support custom namespaces\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return true;\n    }\n    // The code should never reach this place (this means\n    // that the element somehow got namespace that is not\n    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n    // Return false just in case.\n    return false;\n  };\n  /**\n   * _forceRemove\n   *\n   * @param node a DOM node\n   */\n  const _forceRemove = function _forceRemove(node) {\n    arrayPush(DOMPurify.removed, {\n      element: node\n    });\n    try {\n      // eslint-disable-next-line unicorn/prefer-dom-node-remove\n      getParentNode(node).removeChild(node);\n    } catch (_) {\n      remove(node);\n    }\n  };\n  /**\n   * _removeAttribute\n   *\n   * @param name an Attribute name\n   * @param element a DOM node\n   */\n  const _removeAttribute = function _removeAttribute(name, element) {\n    try {\n      arrayPush(DOMPurify.removed, {\n        attribute: element.getAttributeNode(name),\n        from: element\n      });\n    } catch (_) {\n      arrayPush(DOMPurify.removed, {\n        attribute: null,\n        from: element\n      });\n    }\n    element.removeAttribute(name);\n    // We void attribute values for unremovable \"is\" attributes\n    if (name === 'is') {\n      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n        try {\n          _forceRemove(element);\n        } catch (_) {}\n      } else {\n        try {\n          element.setAttribute(name, '');\n        } catch (_) {}\n      }\n    }\n  };\n  /**\n   * _initDocument\n   *\n   * @param dirty - a string of dirty markup\n   * @return a DOM, filled with the dirty markup\n   */\n  const _initDocument = function _initDocument(dirty) {\n    /* Create a HTML document */\n    let doc = null;\n    let leadingWhitespace = null;\n    if (FORCE_BODY) {\n      dirty = '<remove></remove>' + dirty;\n    } else {\n      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n      const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n      leadingWhitespace = matches && matches[0];\n    }\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n      dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n    }\n    const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n    /*\n     * Use the DOMParser API by default, fallback later if needs be\n     * DOMParser not work for svg when has multiple root element.\n     */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      try {\n        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n      } catch (_) {}\n    }\n    /* Use createHTMLDocument in case DOMParser is not available */\n    if (!doc || !doc.documentElement) {\n      doc = implementation.createDocument(NAMESPACE, 'template', null);\n      try {\n        doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n      } catch (_) {\n        // Syntax error if dirtyPayload is invalid xml\n      }\n    }\n    const body = doc.body || doc.documentElement;\n    if (dirty && leadingWhitespace) {\n      body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n    }\n    /* Work on whole document or just its body */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n    }\n    return WHOLE_DOCUMENT ? doc.documentElement : body;\n  };\n  /**\n   * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n   *\n   * @param root The root element or node to start traversing on.\n   * @return The created NodeIterator\n   */\n  const _createNodeIterator = function _createNodeIterator(root) {\n    return createNodeIterator.call(root.ownerDocument || root, root,\n    // eslint-disable-next-line no-bitwise\n    NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n  };\n  /**\n   * _isClobbered\n   *\n   * @param element element to check for clobbering attacks\n   * @return true if clobbered, false if safe\n   */\n  const _isClobbered = function _isClobbered(element) {\n    return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n  };\n  /**\n   * Checks whether the given object is a DOM node.\n   *\n   * @param value object to check whether it's a DOM node\n   * @return true is object is a DOM node\n   */\n  const _isNode = function _isNode(value) {\n    return typeof Node === 'function' && value instanceof Node;\n  };\n  function _executeHooks(hooks, currentNode, data) {\n    arrayForEach(hooks, hook => {\n      hook.call(DOMPurify, currentNode, data, CONFIG);\n    });\n  }\n  /**\n   * _sanitizeElements\n   *\n   * @protect nodeName\n   * @protect textContent\n   * @protect removeChild\n   * @param currentNode to check for permission to exist\n   * @return true if node was killed, false if left alive\n   */\n  const _sanitizeElements = function _sanitizeElements(currentNode) {\n    let content = null;\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n    /* Check if element is clobbered or can clobber */\n    if (_isClobbered(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Now let's check the element's type and name */\n    const tagName = transformCaseFunc(currentNode.nodeName);\n    /* Execute a hook if present */\n    _executeHooks(hooks.uponSanitizeElement, currentNode, {\n      tagName,\n      allowedTags: ALLOWED_TAGS\n    });\n    /* Detect mXSS attempts abusing namespace confusion */\n    if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w!]/g, currentNode.innerHTML) && regExpTest(/<[/\\w!]/g, currentNode.textContent)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any occurrence of processing instructions */\n    if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any kind of possibly harmful comments */\n    if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove element if anything forbids its presence */\n    if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n      /* Check if we have a custom element to handle */\n      if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n          return false;\n        }\n        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n          return false;\n        }\n      }\n      /* Keep content except for bad-listed elements */\n      if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n        const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n        const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n        if (childNodes && parentNode) {\n          const childCount = childNodes.length;\n          for (let i = childCount - 1; i >= 0; --i) {\n            const childClone = cloneNode(childNodes[i], true);\n            childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n            parentNode.insertBefore(childClone, getNextSibling(currentNode));\n          }\n        }\n      }\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Check whether element has a valid namespace */\n    if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Make sure that older browsers don't get fallback-tag mXSS */\n    if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Sanitize element content to be template-safe */\n    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n      /* Get the element's text content */\n      content = currentNode.textContent;\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n        content = stringReplace(content, expr, ' ');\n      });\n      if (currentNode.textContent !== content) {\n        arrayPush(DOMPurify.removed, {\n          element: currentNode.cloneNode()\n        });\n        currentNode.textContent = content;\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n    return false;\n  };\n  /**\n   * _isValidAttribute\n   *\n   * @param lcTag Lowercase tag name of containing element.\n   * @param lcName Lowercase attribute name.\n   * @param value Attribute value.\n   * @return Returns true if `value` is valid, otherwise false.\n   */\n  // eslint-disable-next-line complexity\n  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n    /* Make sure attribute cannot clobber */\n    if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n      return false;\n    }\n    /* Allow valid data-* attributes: At least one character after \"-\"\n        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n        We don't need to check the value; it's always URI safe. */\n    if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n      if (\n      // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n      // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n      _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) ||\n      // Alternative, second condition checks if it's an `is`-attribute, AND\n      // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n        return false;\n      }\n      /* Check value is safe. First, is attr inert? If so, is safe */\n    } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n      return false;\n    } else ;\n    return true;\n  };\n  /**\n   * _isBasicCustomElement\n   * checks if at least one dash is included in tagName, and it's not the first char\n   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n   *\n   * @param tagName name of the tag of the node to sanitize\n   * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n   */\n  const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n    return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);\n  };\n  /**\n   * _sanitizeAttributes\n   *\n   * @protect attributes\n   * @protect nodeName\n   * @protect removeAttribute\n   * @protect setAttribute\n   *\n   * @param currentNode to sanitize\n   */\n  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n    const {\n      attributes\n    } = currentNode;\n    /* Check if we have attributes; if not we might have a text node */\n    if (!attributes || _isClobbered(currentNode)) {\n      return;\n    }\n    const hookEvent = {\n      attrName: '',\n      attrValue: '',\n      keepAttr: true,\n      allowedAttributes: ALLOWED_ATTR,\n      forceKeepAttr: undefined\n    };\n    let l = attributes.length;\n    /* Go backwards over all attributes; safely remove bad ones */\n    while (l--) {\n      const attr = attributes[l];\n      const {\n        name,\n        namespaceURI,\n        value: attrValue\n      } = attr;\n      const lcName = transformCaseFunc(name);\n      const initValue = attrValue;\n      let value = name === 'value' ? initValue : stringTrim(initValue);\n      /* Execute a hook if present */\n      hookEvent.attrName = lcName;\n      hookEvent.attrValue = value;\n      hookEvent.keepAttr = true;\n      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n      _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n      value = hookEvent.attrValue;\n      /* Full DOM Clobbering protection via namespace isolation,\n       * Prefix id and name attributes with `user-content-`\n       */\n      if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n        // Remove the attribute with this value\n        _removeAttribute(name, currentNode);\n        // Prefix the value and later re-create the attribute with the sanitized value\n        value = SANITIZE_NAMED_PROPS_PREFIX + value;\n      }\n      /* Work around a security issue with comments inside attributes */\n      if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title|textarea)/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n      if (lcName === 'attributename' && stringMatch(value, 'href')) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (hookEvent.forceKeepAttr) {\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (!hookEvent.keepAttr) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Work around a security issue in jQuery 3.0 */\n      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Sanitize attribute content to be template-safe */\n      if (SAFE_FOR_TEMPLATES) {\n        arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n          value = stringReplace(value, expr, ' ');\n        });\n      }\n      /* Is `value` valid for this attribute? */\n      const lcTag = transformCaseFunc(currentNode.nodeName);\n      if (!_isValidAttribute(lcTag, lcName, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Handle attributes that require Trusted Types */\n      if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n        if (namespaceURI) ; else {\n          switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n            case 'TrustedHTML':\n              {\n                value = trustedTypesPolicy.createHTML(value);\n                break;\n              }\n            case 'TrustedScriptURL':\n              {\n                value = trustedTypesPolicy.createScriptURL(value);\n                break;\n              }\n          }\n        }\n      }\n      /* Handle invalid data-* attribute set by try-catching it */\n      if (value !== initValue) {\n        try {\n          if (namespaceURI) {\n            currentNode.setAttributeNS(namespaceURI, name, value);\n          } else {\n            /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n            currentNode.setAttribute(name, value);\n          }\n          if (_isClobbered(currentNode)) {\n            _forceRemove(currentNode);\n          } else {\n            arrayPop(DOMPurify.removed);\n          }\n        } catch (_) {\n          _removeAttribute(name, currentNode);\n        }\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n  };\n  /**\n   * _sanitizeShadowDOM\n   *\n   * @param fragment to iterate over recursively\n   */\n  const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n    let shadowNode = null;\n    const shadowIterator = _createNodeIterator(fragment);\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n    while (shadowNode = shadowIterator.nextNode()) {\n      /* Execute a hook if present */\n      _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n      /* Sanitize tags and elements */\n      _sanitizeElements(shadowNode);\n      /* Check attributes next */\n      _sanitizeAttributes(shadowNode);\n      /* Deep shadow DOM detected */\n      if (shadowNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM(shadowNode.content);\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n  };\n  // eslint-disable-next-line complexity\n  DOMPurify.sanitize = function (dirty) {\n    let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let body = null;\n    let importedNode = null;\n    let currentNode = null;\n    let returnNode = null;\n    /* Make sure we have a string to sanitize.\n      DO NOT return early, as this will return the wrong type if\n      the user has requested a DOM object rather than a string */\n    IS_EMPTY_INPUT = !dirty;\n    if (IS_EMPTY_INPUT) {\n      dirty = '<!-->';\n    }\n    /* Stringify, in case dirty is an object */\n    if (typeof dirty !== 'string' && !_isNode(dirty)) {\n      if (typeof dirty.toString === 'function') {\n        dirty = dirty.toString();\n        if (typeof dirty !== 'string') {\n          throw typeErrorCreate('dirty is not a string, aborting');\n        }\n      } else {\n        throw typeErrorCreate('toString is not a function');\n      }\n    }\n    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\n      return dirty;\n    }\n    /* Assign config vars */\n    if (!SET_CONFIG) {\n      _parseConfig(cfg);\n    }\n    /* Clean up removed elements */\n    DOMPurify.removed = [];\n    /* Check if dirty is correctly typed for IN_PLACE */\n    if (typeof dirty === 'string') {\n      IN_PLACE = false;\n    }\n    if (IN_PLACE) {\n      /* Do some early pre-sanitization to avoid unsafe root nodes */\n      if (dirty.nodeName) {\n        const tagName = transformCaseFunc(dirty.nodeName);\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n        }\n      }\n    } else if (dirty instanceof Node) {\n      /* If dirty is a DOM element, append to an empty document to avoid\n         elements being stripped by the parser */\n      body = _initDocument('<!---->');\n      importedNode = body.ownerDocument.importNode(dirty, true);\n      if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n        /* Node is already a body, use as is */\n        body = importedNode;\n      } else if (importedNode.nodeName === 'HTML') {\n        body = importedNode;\n      } else {\n        // eslint-disable-next-line unicorn/prefer-dom-node-append\n        body.appendChild(importedNode);\n      }\n    } else {\n      /* Exit directly if we have nothing to do */\n      if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n      // eslint-disable-next-line unicorn/prefer-includes\n      dirty.indexOf('<') === -1) {\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n      }\n      /* Initialize the document to work on */\n      body = _initDocument(dirty);\n      /* Check we have a DOM node from the data */\n      if (!body) {\n        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n      }\n    }\n    /* Remove first element node (ours) if FORCE_BODY is set */\n    if (body && FORCE_BODY) {\n      _forceRemove(body.firstChild);\n    }\n    /* Get node iterator */\n    const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n    /* Now start iterating over the created document */\n    while (currentNode = nodeIterator.nextNode()) {\n      /* Sanitize tags and elements */\n      _sanitizeElements(currentNode);\n      /* Check attributes next */\n      _sanitizeAttributes(currentNode);\n      /* Shadow DOM detected, sanitize it */\n      if (currentNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM(currentNode.content);\n      }\n    }\n    /* If we sanitized `dirty` in-place, return it. */\n    if (IN_PLACE) {\n      return dirty;\n    }\n    /* Return sanitized string or DOM */\n    if (RETURN_DOM) {\n      if (RETURN_DOM_FRAGMENT) {\n        returnNode = createDocumentFragment.call(body.ownerDocument);\n        while (body.firstChild) {\n          // eslint-disable-next-line unicorn/prefer-dom-node-append\n          returnNode.appendChild(body.firstChild);\n        }\n      } else {\n        returnNode = body;\n      }\n      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n        /*\n          AdoptNode() is not used because internal state is not reset\n          (e.g. the past names map of a HTMLFormElement), this is safe\n          in theory but we would rather not risk another attack vector.\n          The state that is cloned by importNode() is explicitly defined\n          by the specs.\n        */\n        returnNode = importNode.call(originalDocument, returnNode, true);\n      }\n      return returnNode;\n    }\n    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n    /* Serialize doctype if allowed */\n    if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n      serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n    }\n    /* Sanitize final string template-safe */\n    if (SAFE_FOR_TEMPLATES) {\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n        serializedHTML = stringReplace(serializedHTML, expr, ' ');\n      });\n    }\n    return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n  };\n  DOMPurify.setConfig = function () {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    _parseConfig(cfg);\n    SET_CONFIG = true;\n  };\n  DOMPurify.clearConfig = function () {\n    CONFIG = null;\n    SET_CONFIG = false;\n  };\n  DOMPurify.isValidAttribute = function (tag, attr, value) {\n    /* Initialize shared config vars if necessary. */\n    if (!CONFIG) {\n      _parseConfig({});\n    }\n    const lcTag = transformCaseFunc(tag);\n    const lcName = transformCaseFunc(attr);\n    return _isValidAttribute(lcTag, lcName, value);\n  };\n  DOMPurify.addHook = function (entryPoint, hookFunction) {\n    if (typeof hookFunction !== 'function') {\n      return;\n    }\n    arrayPush(hooks[entryPoint], hookFunction);\n  };\n  DOMPurify.removeHook = function (entryPoint, hookFunction) {\n    if (hookFunction !== undefined) {\n      const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n      return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n    }\n    return arrayPop(hooks[entryPoint]);\n  };\n  DOMPurify.removeHooks = function (entryPoint) {\n    hooks[entryPoint] = [];\n  };\n  DOMPurify.removeAllHooks = function () {\n    hooks = _createHooksMap();\n  };\n  return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n","import { Schemas } from '../common/network.js';\nimport { reset } from './dom.js';\nimport purify from './dompurify/dompurify.js';\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/**\n * List of safe, non-input html tags.\n */\nconst basicMarkupHtmlTags = Object.freeze([\n    'a',\n    'abbr',\n    'b',\n    'bdo',\n    'blockquote',\n    'br',\n    'caption',\n    'cite',\n    'code',\n    'col',\n    'colgroup',\n    'dd',\n    'del',\n    'details',\n    'dfn',\n    'div',\n    'dl',\n    'dt',\n    'em',\n    'figcaption',\n    'figure',\n    'h1',\n    'h2',\n    'h3',\n    'h4',\n    'h5',\n    'h6',\n    'hr',\n    'i',\n    'img',\n    'ins',\n    'kbd',\n    'label',\n    'li',\n    'mark',\n    'ol',\n    'p',\n    'pre',\n    'q',\n    'rp',\n    'rt',\n    'ruby',\n    's',\n    'samp',\n    'small',\n    'small',\n    'source',\n    'span',\n    'strike',\n    'strong',\n    'sub',\n    'summary',\n    'sup',\n    'table',\n    'tbody',\n    'td',\n    'tfoot',\n    'th',\n    'thead',\n    'time',\n    'tr',\n    'tt',\n    'u',\n    'ul',\n    'var',\n    'video',\n    'wbr',\n]);\nconst defaultAllowedAttrs = Object.freeze([\n    'href',\n    'target',\n    'src',\n    'alt',\n    'title',\n    'for',\n    'name',\n    'role',\n    'tabindex',\n    'x-dispatch',\n    'required',\n    'checked',\n    'placeholder',\n    'type',\n    'start',\n    'width',\n    'height',\n    'align',\n]);\nconst fakeRelativeUrlProtocol = 'vscode-relative-path';\nfunction validateLink(value, allowedProtocols) {\n    if (allowedProtocols.override === '*') {\n        return true; // allow all protocols\n    }\n    try {\n        const url = new URL(value, fakeRelativeUrlProtocol + '://');\n        if (allowedProtocols.override.includes(url.protocol.replace(/:$/, ''))) {\n            return true;\n        }\n        if (allowedProtocols.allowRelativePaths\n            && url.protocol === fakeRelativeUrlProtocol + ':'\n            && !value.trim().toLowerCase().startsWith(fakeRelativeUrlProtocol)) {\n            return true;\n        }\n        return false;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Hooks dompurify using `afterSanitizeAttributes` to check that all `href` and `src`\n * attributes are valid.\n */\nfunction hookDomPurifyHrefAndSrcSanitizer(allowedLinkProtocols, allowedMediaProtocols) {\n    purify.addHook('afterSanitizeAttributes', (node) => {\n        // check all href/src attributes for validity\n        for (const attr of ['href', 'src']) {\n            if (node.hasAttribute(attr)) {\n                const attrValue = node.getAttribute(attr);\n                if (attr === 'href') {\n                    if (!attrValue.startsWith('#') && !validateLink(attrValue, allowedLinkProtocols)) {\n                        node.removeAttribute(attr);\n                    }\n                }\n                else { // 'src'\n                    if (!validateLink(attrValue, allowedMediaProtocols)) {\n                        node.removeAttribute(attr);\n                    }\n                }\n            }\n        }\n    });\n}\nconst defaultDomPurifyConfig = Object.freeze({\n    ALLOWED_TAGS: [...basicMarkupHtmlTags],\n    ALLOWED_ATTR: [...defaultAllowedAttrs],\n    // We sanitize the src/href attributes later if needed\n    ALLOW_UNKNOWN_PROTOCOLS: true,\n});\n/**\n * Sanitizes an html string.\n *\n * @param untrusted The HTML string to sanitize.\n * @param config Optional configuration for sanitization. If not provided, defaults to a safe configuration.\n *\n * @returns A sanitized string of html.\n */\nfunction sanitizeHtml(untrusted, config) {\n    return doSanitizeHtml(untrusted, config, 'trusted');\n}\nfunction doSanitizeHtml(untrusted, config, outputType) {\n    try {\n        const resolvedConfig = { ...defaultDomPurifyConfig };\n        if (config?.allowedTags) {\n            if (config.allowedTags.override) {\n                resolvedConfig.ALLOWED_TAGS = [...config.allowedTags.override];\n            }\n            if (config.allowedTags.augment) {\n                resolvedConfig.ALLOWED_TAGS = [...(resolvedConfig.ALLOWED_TAGS ?? []), ...config.allowedTags.augment];\n            }\n        }\n        let resolvedAttributes = [...defaultAllowedAttrs];\n        if (config?.allowedAttributes) {\n            if (config.allowedAttributes.override) {\n                resolvedAttributes = [...config.allowedAttributes.override];\n            }\n            if (config.allowedAttributes.augment) {\n                resolvedAttributes = [...resolvedAttributes, ...config.allowedAttributes.augment];\n            }\n        }\n        // All attr names are lower-case in the sanitizer hooks\n        resolvedAttributes = resolvedAttributes.map((attr) => {\n            if (typeof attr === 'string') {\n                return attr.toLowerCase();\n            }\n            return {\n                attributeName: attr.attributeName.toLowerCase(),\n                shouldKeep: attr.shouldKeep,\n            };\n        });\n        const allowedAttrNames = new Set(resolvedAttributes.map(attr => typeof attr === 'string' ? attr : attr.attributeName));\n        const allowedAttrPredicates = new Map();\n        for (const attr of resolvedAttributes) {\n            if (typeof attr === 'string') {\n                // New string attribute value clears previously set predicates\n                allowedAttrPredicates.delete(attr);\n            }\n            else {\n                allowedAttrPredicates.set(attr.attributeName, attr);\n            }\n        }\n        resolvedConfig.ALLOWED_ATTR = Array.from(allowedAttrNames);\n        hookDomPurifyHrefAndSrcSanitizer({\n            override: config?.allowedLinkProtocols?.override ?? [Schemas.http, Schemas.https],\n            allowRelativePaths: config?.allowRelativeLinkPaths ?? false\n        }, {\n            override: config?.allowedMediaProtocols?.override ?? [Schemas.http, Schemas.https],\n            allowRelativePaths: config?.allowRelativeMediaPaths ?? false\n        });\n        if (config?.replaceWithPlaintext) {\n            purify.addHook('uponSanitizeElement', replaceWithPlainTextHook);\n        }\n        if (allowedAttrPredicates.size) {\n            purify.addHook('uponSanitizeAttribute', (node, e) => {\n                const predicate = allowedAttrPredicates.get(e.attrName);\n                if (predicate) {\n                    const result = predicate.shouldKeep(node, e);\n                    if (typeof result === 'string') {\n                        e.keepAttr = true;\n                        e.attrValue = result;\n                    }\n                    else {\n                        e.keepAttr = result;\n                    }\n                }\n                else {\n                    e.keepAttr = allowedAttrNames.has(e.attrName);\n                }\n            });\n        }\n        if (outputType === 'dom') {\n            return purify.sanitize(untrusted, {\n                ...resolvedConfig,\n                RETURN_DOM_FRAGMENT: true\n            });\n        }\n        else {\n            return purify.sanitize(untrusted, {\n                ...resolvedConfig,\n                RETURN_TRUSTED_TYPE: true\n            }); // Cast from lib TrustedHTML to global TrustedHTML\n        }\n    }\n    finally {\n        purify.removeAllHooks();\n    }\n}\nconst selfClosingTags = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr'];\nconst replaceWithPlainTextHook = (node, data, _config) => {\n    if (!data.allowedTags[data.tagName] && data.tagName !== 'body') {\n        const replacement = convertTagToPlaintext(node);\n        if (replacement) {\n            if (node.nodeType === Node.COMMENT_NODE) {\n                // Workaround for https://github.com/cure53/DOMPurify/issues/1005\n                // The comment will be deleted in the next phase. However if we try to remove it now, it will cause\n                // an exception. Instead we insert the text node before the comment.\n                node.parentElement?.insertBefore(replacement, node);\n            }\n            else {\n                node.parentElement?.replaceChild(replacement, node);\n            }\n        }\n    }\n};\nfunction convertTagToPlaintext(node) {\n    if (!node.ownerDocument) {\n        return;\n    }\n    let startTagText;\n    let endTagText;\n    if (node.nodeType === Node.COMMENT_NODE) {\n        startTagText = `<!--${node.textContent}-->`;\n    }\n    else if (node instanceof Element) {\n        const tagName = node.tagName.toLowerCase();\n        const isSelfClosing = selfClosingTags.includes(tagName);\n        const attrString = node.attributes.length ?\n            ' ' + Array.from(node.attributes)\n                .map(attr => `${attr.name}=\"${attr.value}\"`)\n                .join(' ')\n            : '';\n        startTagText = `<${tagName}${attrString}>`;\n        if (!isSelfClosing) {\n            endTagText = `</${tagName}>`;\n        }\n    }\n    else {\n        return;\n    }\n    const fragment = document.createDocumentFragment();\n    const textNode = node.ownerDocument.createTextNode(startTagText);\n    fragment.appendChild(textNode);\n    while (node.firstChild) {\n        fragment.appendChild(node.firstChild);\n    }\n    const endTagTextNode = endTagText ? node.ownerDocument.createTextNode(endTagText) : undefined;\n    if (endTagTextNode) {\n        fragment.appendChild(endTagTextNode);\n    }\n    return fragment;\n}\n/**\n * Sanitizes the given `value` and reset the given `node` with it.\n */\nfunction safeSetInnerHtml(node, untrusted, config) {\n    const fragment = doSanitizeHtml(untrusted, config, 'dom');\n    reset(node, fragment);\n}\n\nexport { basicMarkupHtmlTags, convertTagToPlaintext, defaultAllowedAttrs, safeSetInnerHtml, sanitizeHtml };\n","import { $ } from '../../dom.js';\nimport { ThemeIcon } from '../../../common/themables.js';\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 *--------------------------------------------------------------------------------------------*/\nconst labelWithIconsRegex = new RegExp(`(\\\\\\\\)?\\\\$\\\\((${ThemeIcon.iconNameExpression}(?:${ThemeIcon.iconModifierExpression})?)\\\\)`, 'g');\nfunction renderLabelWithIcons(text) {\n    const elements = new Array();\n    let match;\n    let textStart = 0, textStop = 0;\n    while ((match = labelWithIconsRegex.exec(text)) !== null) {\n        textStop = match.index || 0;\n        if (textStart < textStop) {\n            elements.push(text.substring(textStart, textStop));\n        }\n        textStart = (match.index || 0) + match[0].length;\n        const [, escaped, codicon] = match;\n        elements.push(escaped ? `$(${codicon})` : renderIcon({ id: codicon }));\n    }\n    if (textStart < text.length) {\n        elements.push(text.substring(textStart));\n    }\n    return elements;\n}\nfunction renderIcon(icon) {\n    const node = $(`span`);\n    node.classList.add(...ThemeIcon.asClassNameArray(icon));\n    return node;\n}\n\nexport { renderIcon, renderLabelWithIcons };\n","import { onUnexpectedError } from '../common/errors.js';\nimport { removeMarkdownEscapes, escapeDoubleQuotes, parseHrefAndDimensions } from '../common/htmlContent.js';\nimport { markdownEscapeEscapedIcons } from '../common/iconLabels.js';\nimport { defaultGenerator } from '../common/idGenerator.js';\nimport { Lazy } from '../common/lazy.js';\nimport { DisposableStore } from '../common/lifecycle.js';\nimport { Renderer as _Renderer, Marked, lexer, parse as parse$1 } from '../common/marked/marked.js';\nimport { parse } from '../common/marshalling.js';\nimport { Schemas, FileAccess } from '../common/network.js';\nimport { cloneAndChange } from '../common/objects.js';\nimport { resolvePath, dirname } from '../common/resources.js';\nimport { escape } from '../common/strings.js';\nimport { URI } from '../common/uri.js';\nimport { reset, addDisposableListener, $, getWindow, isHTMLElement } from './dom.js';\nimport { basicMarkupHtmlTags, safeSetInnerHtml, convertTagToPlaintext, sanitizeHtml } from './domSanitize.js';\nimport { StandardKeyboardEvent } from './keyboardEvent.js';\nimport { StandardMouseEvent } from './mouseEvent.js';\nimport { renderLabelWithIcons, renderIcon } from './ui/iconLabel/iconLabels.js';\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 *--------------------------------------------------------------------------------------------*/\nconst defaultMarkedRenderers = Object.freeze({\n    image: ({ href, title, text }) => {\n        let dimensions = [];\n        let attributes = [];\n        if (href) {\n            ({ href, dimensions } = parseHrefAndDimensions(href));\n            attributes.push(`src=\"${escapeDoubleQuotes(href)}\"`);\n        }\n        if (text) {\n            attributes.push(`alt=\"${escapeDoubleQuotes(text)}\"`);\n        }\n        if (title) {\n            attributes.push(`title=\"${escapeDoubleQuotes(title)}\"`);\n        }\n        if (dimensions.length) {\n            attributes = attributes.concat(dimensions);\n        }\n        return '<img ' + attributes.join(' ') + '>';\n    },\n    paragraph({ tokens }) {\n        return `<p>${this.parser.parseInline(tokens)}</p>`;\n    },\n    link({ href, title, tokens }) {\n        let text = this.parser.parseInline(tokens);\n        if (typeof href !== 'string') {\n            return '';\n        }\n        // Remove markdown escapes. Workaround for https://github.com/chjj/marked/issues/829\n        if (href === text) { // raw link case\n            text = removeMarkdownEscapes(text);\n        }\n        title = typeof title === 'string' ? escapeDoubleQuotes(removeMarkdownEscapes(title)) : '';\n        href = removeMarkdownEscapes(href);\n        // HTML Encode href\n        href = href.replace(/&/g, '&amp;')\n            .replace(/</g, '&lt;')\n            .replace(/>/g, '&gt;')\n            .replace(/\"/g, '&quot;')\n            .replace(/'/g, '&#39;');\n        return `<a href=\"${href}\" title=\"${title || href}\" draggable=\"false\">${text}</a>`;\n    },\n});\n/**\n * Blockquote renderer that processes GitHub-style alert syntax.\n * Transforms blockquotes like \"> [!NOTE]\" into structured alert markup with icons.\n *\n * Based on GitHub's alert syntax: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts\n */\nfunction createAlertBlockquoteRenderer(fallbackRenderer) {\n    return function (token) {\n        const { tokens } = token;\n        // Check if this blockquote starts with alert syntax [!TYPE]\n        const firstToken = tokens[0];\n        if (firstToken?.type !== 'paragraph') {\n            return fallbackRenderer.call(this, token);\n        }\n        const paragraphTokens = firstToken.tokens;\n        if (!paragraphTokens || paragraphTokens.length === 0) {\n            return fallbackRenderer.call(this, token);\n        }\n        const firstTextToken = paragraphTokens[0];\n        if (firstTextToken?.type !== 'text') {\n            return fallbackRenderer.call(this, token);\n        }\n        const pattern = /^\\s*\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*?\\n*/i;\n        const match = firstTextToken.raw.match(pattern);\n        if (!match) {\n            return fallbackRenderer.call(this, token);\n        }\n        // Remove the alert marker from the token\n        firstTextToken.raw = firstTextToken.raw.replace(pattern, '');\n        firstTextToken.text = firstTextToken.text.replace(pattern, '');\n        const alertIcons = {\n            'note': 'info',\n            'tip': 'light-bulb',\n            'important': 'comment',\n            'warning': 'alert',\n            'caution': 'stop'\n        };\n        const type = match[1];\n        const typeCapitalized = type.charAt(0).toUpperCase() + type.slice(1).toLowerCase();\n        const severity = type.toLowerCase();\n        const iconHtml = renderIcon({ id: alertIcons[severity] }).outerHTML;\n        // Render the remaining content\n        const content = this.parser.parse(tokens);\n        // Return alert markup with icon and severity (skipping the first 3 characters: `<p>`)\n        return `<blockquote data-severity=\"${severity}\"><p><span>${iconHtml}${typeCapitalized}</span>${content.substring(3)}</blockquote>\\n`;\n    };\n}\n/**\n * Low-level way create a html element from a markdown string.\n *\n * **Note** that for most cases you should be using {@link import('../../editor/browser/widget/markdownRenderer/browser/markdownRenderer.js').MarkdownRenderer MarkdownRenderer}\n * which comes with support for pretty code block rendering and which uses the default way of handling links.\n */\nfunction renderMarkdown(markdown, options = {}, target) {\n    const disposables = new DisposableStore();\n    let isDisposed = false;\n    const markedInstance = new Marked(...(options.markedExtensions ?? []));\n    const { renderer, codeBlocks, syncCodeBlocks } = createMarkdownRenderer(markedInstance, options, markdown);\n    const value = preprocessMarkdownString(markdown);\n    let renderedMarkdown;\n    if (options.fillInIncompleteTokens) {\n        // The defaults are applied by parse but not lexer()/parser(), and they need to be present\n        const opts = {\n            ...markedInstance.defaults,\n            ...options.markedOptions,\n            renderer\n        };\n        const tokens = markedInstance.lexer(value, opts);\n        const newTokens = fillInIncompleteTokens(tokens);\n        renderedMarkdown = markedInstance.parser(newTokens, opts);\n    }\n    else {\n        renderedMarkdown = markedInstance.parse(value, { ...options?.markedOptions, renderer, async: false });\n    }\n    // Rewrite theme icons\n    if (markdown.supportThemeIcons) {\n        const elements = renderLabelWithIcons(renderedMarkdown);\n        renderedMarkdown = elements.map(e => typeof e === 'string' ? e : e.outerHTML).join('');\n    }\n    const renderedContent = document.createElement('div');\n    const sanitizerConfig = getDomSanitizerConfig(markdown, options.sanitizerConfig ?? {});\n    safeSetInnerHtml(renderedContent, renderedMarkdown, sanitizerConfig);\n    // Rewrite links and images before potentially inserting them into the real dom\n    rewriteRenderedLinks(markdown, options, renderedContent);\n    let outElement;\n    if (target) {\n        outElement = target;\n        reset(target, ...renderedContent.children);\n    }\n    else {\n        outElement = renderedContent;\n    }\n    if (codeBlocks.length > 0) {\n        Promise.all(codeBlocks).then((tuples) => {\n            if (isDisposed) {\n                return;\n            }\n            const renderedElements = new Map(tuples);\n            // eslint-disable-next-line no-restricted-syntax\n            const placeholderElements = outElement.querySelectorAll(`div[data-code]`);\n            for (const placeholderElement of placeholderElements) {\n                const renderedElement = renderedElements.get(placeholderElement.dataset['code'] ?? '');\n                if (renderedElement) {\n                    reset(placeholderElement, renderedElement);\n                }\n            }\n            options.asyncRenderCallback?.();\n        });\n    }\n    else if (syncCodeBlocks.length > 0) {\n        const renderedElements = new Map(syncCodeBlocks);\n        // eslint-disable-next-line no-restricted-syntax\n        const placeholderElements = outElement.querySelectorAll(`div[data-code]`);\n        for (const placeholderElement of placeholderElements) {\n            const renderedElement = renderedElements.get(placeholderElement.dataset['code'] ?? '');\n            if (renderedElement) {\n                reset(placeholderElement, renderedElement);\n            }\n        }\n    }\n    // Signal size changes for image tags\n    if (options.asyncRenderCallback) {\n        // eslint-disable-next-line no-restricted-syntax\n        for (const img of outElement.getElementsByTagName('img')) {\n            const listener = disposables.add(addDisposableListener(img, 'load', () => {\n                listener.dispose();\n                options.asyncRenderCallback();\n            }));\n        }\n    }\n    // Add event listeners for links\n    if (options.actionHandler) {\n        const clickCb = (e) => {\n            const mouseEvent = new StandardMouseEvent(getWindow(outElement), e);\n            if (!mouseEvent.leftButton && !mouseEvent.middleButton) {\n                return;\n            }\n            activateLink(markdown, options, mouseEvent);\n        };\n        disposables.add(addDisposableListener(outElement, 'click', clickCb));\n        disposables.add(addDisposableListener(outElement, 'auxclick', clickCb));\n        disposables.add(addDisposableListener(outElement, 'keydown', (e) => {\n            const keyboardEvent = new StandardKeyboardEvent(e);\n            if (!keyboardEvent.equals(10 /* KeyCode.Space */) && !keyboardEvent.equals(3 /* KeyCode.Enter */)) {\n                return;\n            }\n            activateLink(markdown, options, keyboardEvent);\n        }));\n    }\n    // Remove/disable inputs\n    // eslint-disable-next-line no-restricted-syntax\n    for (const input of [...outElement.getElementsByTagName('input')]) {\n        if (input.attributes.getNamedItem('type')?.value === 'checkbox') {\n            input.setAttribute('disabled', '');\n        }\n        else {\n            if (options.sanitizerConfig?.replaceWithPlaintext) {\n                const replacement = convertTagToPlaintext(input);\n                if (replacement) {\n                    input.parentElement?.replaceChild(replacement, input);\n                }\n                else {\n                    input.remove();\n                }\n            }\n            else {\n                input.remove();\n            }\n        }\n    }\n    return {\n        element: outElement,\n        dispose: () => {\n            isDisposed = true;\n            disposables.dispose();\n        }\n    };\n}\nfunction rewriteRenderedLinks(markdown, options, root) {\n    // eslint-disable-next-line no-restricted-syntax\n    for (const el of root.querySelectorAll('img, audio, video, source')) {\n        const src = el.getAttribute('src'); // Get the raw 'src' attribute value as text, not the resolved 'src'\n        if (src) {\n            let href = src;\n            try {\n                if (markdown.baseUri) { // absolute or relative local path, or file: uri\n                    href = resolveWithBaseUri(URI.from(markdown.baseUri), href);\n                }\n            }\n            catch (err) { }\n            el.setAttribute('src', massageHref(markdown, href, true));\n            if (options.sanitizerConfig?.remoteImageIsAllowed) {\n                const uri = URI.parse(href);\n                if (uri.scheme !== Schemas.file && uri.scheme !== Schemas.data && !options.sanitizerConfig.remoteImageIsAllowed(uri)) {\n                    el.replaceWith($('', undefined, el.outerHTML));\n                }\n            }\n        }\n    }\n    // eslint-disable-next-line no-restricted-syntax\n    for (const el of root.querySelectorAll('a')) {\n        const href = el.getAttribute('href'); // Get the raw 'href' attribute value as text, not the resolved 'href'\n        el.setAttribute('href', ''); // Clear out href. We use the `data-href` for handling clicks instead\n        if (!href\n            || /^data:|javascript:/i.test(href)\n            || (/^command:/i.test(href) && !markdown.isTrusted)\n            || /^command:(\\/\\/\\/)?_workbench\\.downloadResource/i.test(href)) {\n            // drop the link\n            el.replaceWith(...el.childNodes);\n        }\n        else {\n            let resolvedHref = massageHref(markdown, href, false);\n            if (markdown.baseUri) {\n                resolvedHref = resolveWithBaseUri(URI.from(markdown.baseUri), href);\n            }\n            el.dataset.href = resolvedHref;\n        }\n    }\n}\nfunction createMarkdownRenderer(marked, options, markdown) {\n    const renderer = new marked.Renderer(options.markedOptions);\n    renderer.image = defaultMarkedRenderers.image;\n    renderer.link = defaultMarkedRenderers.link;\n    renderer.paragraph = defaultMarkedRenderers.paragraph;\n    if (markdown.supportAlertSyntax) {\n        renderer.blockquote = createAlertBlockquoteRenderer(renderer.blockquote);\n    }\n    // Will collect [id, renderedElement] tuples\n    const codeBlocks = [];\n    const syncCodeBlocks = [];\n    if (options.codeBlockRendererSync) {\n        renderer.code = ({ text, lang, raw }) => {\n            const id = defaultGenerator.nextId();\n            const value = options.codeBlockRendererSync(postProcessCodeBlockLanguageId(lang), text, raw);\n            syncCodeBlocks.push([id, value]);\n            return `<div class=\"code\" data-code=\"${id}\">${escape(text)}</div>`;\n        };\n    }\n    else if (options.codeBlockRenderer) {\n        renderer.code = ({ text, lang }) => {\n            const id = defaultGenerator.nextId();\n            const value = options.codeBlockRenderer(postProcessCodeBlockLanguageId(lang), text);\n            codeBlocks.push(value.then(element => [id, element]));\n            return `<div class=\"code\" data-code=\"${id}\">${escape(text)}</div>`;\n        };\n    }\n    if (!markdown.supportHtml) {\n        // Note: we always pass the output through dompurify after this so that we don't rely on\n        // marked for real sanitization.\n        renderer.html = ({ text }) => {\n            if (options.sanitizerConfig?.replaceWithPlaintext) {\n                return escape(text);\n            }\n            const match = markdown.isTrusted ? text.match(/^(<span[^>]+>)|(<\\/\\s*span>)$/) : undefined;\n            return match ? text : '';\n        };\n    }\n    return { renderer, codeBlocks, syncCodeBlocks };\n}\nfunction preprocessMarkdownString(markdown) {\n    let value = markdown.value;\n    // values that are too long will freeze the UI\n    if (value.length > 100_000) {\n        value = `${value.substr(0, 100_000)}…`;\n    }\n    // escape theme icons\n    if (markdown.supportThemeIcons) {\n        value = markdownEscapeEscapedIcons(value);\n    }\n    return value;\n}\nfunction activateLink(mdStr, options, event) {\n    const target = event.target.closest('a[data-href]');\n    if (!isHTMLElement(target)) {\n        return;\n    }\n    try {\n        let href = target.dataset['href'];\n        if (href) {\n            if (mdStr.baseUri) {\n                href = resolveWithBaseUri(URI.from(mdStr.baseUri), href);\n            }\n            options.actionHandler?.(href, mdStr);\n        }\n    }\n    catch (err) {\n        onUnexpectedError(err);\n    }\n    finally {\n        event.preventDefault();\n    }\n}\nfunction uriMassage(markdown, part) {\n    let data;\n    try {\n        data = parse(decodeURIComponent(part));\n    }\n    catch (e) {\n        // ignore\n    }\n    if (!data) {\n        return part;\n    }\n    data = cloneAndChange(data, value => {\n        if (markdown.uris && markdown.uris[value]) {\n            return URI.revive(markdown.uris[value]);\n        }\n        else {\n            return undefined;\n        }\n    });\n    return encodeURIComponent(JSON.stringify(data));\n}\nfunction massageHref(markdown, href, isDomUri) {\n    const data = markdown.uris && markdown.uris[href];\n    let uri = URI.revive(data);\n    if (isDomUri) {\n        if (href.startsWith(Schemas.data + ':')) {\n            return href;\n        }\n        if (!uri) {\n            uri = URI.parse(href);\n        }\n        // this URI will end up as \"src\"-attribute of a dom node\n        // and because of that special rewriting needs to be done\n        // so that the URI uses a protocol that's understood by\n        // browsers (like http or https)\n        return FileAccess.uriToBrowserUri(uri).toString(true);\n    }\n    if (!uri) {\n        return href;\n    }\n    if (URI.parse(href).toString() === uri.toString()) {\n        return href; // no transformation performed\n    }\n    if (uri.query) {\n        uri = uri.with({ query: uriMassage(markdown, uri.query) });\n    }\n    return uri.toString();\n}\nfunction postProcessCodeBlockLanguageId(lang) {\n    if (!lang) {\n        return '';\n    }\n    const parts = lang.split(/[\\s+|:|,|\\{|\\?]/, 1);\n    if (parts.length) {\n        return parts[0];\n    }\n    return lang;\n}\nfunction resolveWithBaseUri(baseUri, href) {\n    const hasScheme = /^\\w[\\w\\d+.-]*:/.test(href);\n    if (hasScheme) {\n        return href;\n    }\n    if (baseUri.path.endsWith('/')) {\n        return resolvePath(baseUri, href).toString();\n    }\n    else {\n        return resolvePath(dirname(baseUri), href).toString();\n    }\n}\nfunction sanitizeRenderedMarkdown(renderedMarkdown, originalMdStrConfig, options = {}) {\n    const sanitizerConfig = getDomSanitizerConfig(originalMdStrConfig, options);\n    return sanitizeHtml(renderedMarkdown, sanitizerConfig);\n}\nconst allowedMarkdownHtmlTags = Object.freeze([\n    ...basicMarkupHtmlTags,\n    'input', // Allow inputs for rendering checkboxes. Other types of inputs are removed and the inputs are always disabled\n]);\nconst allowedMarkdownHtmlAttributes = Object.freeze([\n    'align',\n    'autoplay',\n    'alt',\n    'colspan',\n    'controls',\n    'draggable',\n    'height',\n    'href',\n    'loop',\n    'muted',\n    'playsinline',\n    'poster',\n    'rowspan',\n    'src',\n    'target',\n    'title',\n    'type',\n    'width',\n    'start',\n    // Input (For disabled inputs)\n    'checked',\n    'disabled',\n    'value',\n    // Custom markdown attributes\n    'data-code',\n    'data-href',\n    'data-severity',\n    // Only allow very specific styles\n    {\n        attributeName: 'style',\n        shouldKeep: (element, data) => {\n            if (element.tagName === 'SPAN') {\n                if (data.attrName === 'style') {\n                    return /^(color\\:(#[0-9a-fA-F]+|var\\(--vscode(-[a-zA-Z0-9]+)+\\));)?(background-color\\:(#[0-9a-fA-F]+|var\\(--vscode(-[a-zA-Z0-9]+)+\\));)?(border-radius:[0-9]+px;)?$/.test(data.attrValue);\n                }\n            }\n            return false;\n        }\n    },\n    // Only allow codicons for classes\n    {\n        attributeName: 'class',\n        shouldKeep: (element, data) => {\n            if (element.tagName === 'SPAN') {\n                if (data.attrName === 'class') {\n                    return /^codicon codicon-[a-z\\-]+( codicon-modifier-[a-z\\-]+)?$/.test(data.attrValue);\n                }\n            }\n            return false;\n        },\n    },\n]);\nfunction getDomSanitizerConfig(mdStrConfig, options) {\n    const isTrusted = mdStrConfig.isTrusted ?? false;\n    const allowedLinkSchemes = [\n        Schemas.http,\n        Schemas.https,\n        Schemas.mailto,\n        Schemas.file,\n        Schemas.vscodeFileResource,\n        Schemas.vscodeRemote,\n        Schemas.vscodeRemoteResource,\n        Schemas.vscodeNotebookCell\n    ];\n    if (isTrusted) {\n        allowedLinkSchemes.push(Schemas.command);\n    }\n    if (options.allowedLinkSchemes?.augment) {\n        allowedLinkSchemes.push(...options.allowedLinkSchemes.augment);\n    }\n    return {\n        // allowedTags should included everything that markdown renders to.\n        // Since we have our own sanitize function for marked, it's possible we missed some tag so let dompurify make sure.\n        // HTML tags that can result from markdown are from reading https://spec.commonmark.org/0.29/\n        // HTML table tags that can result from markdown are from https://github.github.com/gfm/#tables-extension-\n        allowedTags: {\n            override: options.allowedTags?.override ?? allowedMarkdownHtmlTags\n        },\n        allowedAttributes: {\n            override: options.allowedAttributes?.override ?? allowedMarkdownHtmlAttributes,\n        },\n        allowedLinkProtocols: {\n            override: allowedLinkSchemes,\n        },\n        allowRelativeLinkPaths: !!mdStrConfig.baseUri,\n        allowedMediaProtocols: {\n            override: [\n                Schemas.http,\n                Schemas.https,\n                Schemas.data,\n                Schemas.file,\n                Schemas.vscodeFileResource,\n                Schemas.vscodeRemote,\n                Schemas.vscodeRemoteResource,\n            ]\n        },\n        allowRelativeMediaPaths: !!mdStrConfig.baseUri,\n        replaceWithPlaintext: options.replaceWithPlaintext,\n    };\n}\n/**\n * Renders `str` as plaintext, stripping out Markdown syntax if it's a {@link IMarkdownString}.\n *\n * For example `# Header` would be output as `Header`.\n */\nfunction renderAsPlaintext(str, options) {\n    if (typeof str === 'string') {\n        return str;\n    }\n    // values that are too long will freeze the UI\n    let value = str.value ?? '';\n    if (value.length > 100_000) {\n        value = `${value.substr(0, 100_000)}…`;\n    }\n    const html = parse$1(value, { async: false, renderer: plainTextRenderer.value });\n    return sanitizeRenderedMarkdown(html, { isTrusted: false }, {})\n        .toString()\n        .replace(/&(#\\d+|[a-zA-Z]+);/g, m => unescapeInfo.get(m) ?? m)\n        .trim();\n}\nconst unescapeInfo = new Map([\n    ['&quot;', '\"'],\n    ['&nbsp;', ' '],\n    ['&amp;', '&'],\n    ['&#39;', '\\''],\n    ['&lt;', '<'],\n    ['&gt;', '>'],\n]);\nfunction createPlainTextRenderer() {\n    const renderer = new _Renderer();\n    renderer.code = ({ text }) => {\n        return escape(text);\n    };\n    renderer.blockquote = ({ text }) => {\n        return text + '\\n';\n    };\n    renderer.html = (_) => {\n        return '';\n    };\n    renderer.heading = function ({ tokens }) {\n        return this.parser.parseInline(tokens) + '\\n';\n    };\n    renderer.hr = () => {\n        return '';\n    };\n    renderer.list = function ({ items }) {\n        return items.map(x => this.listitem(x)).join('\\n') + '\\n';\n    };\n    renderer.listitem = ({ text }) => {\n        return text + '\\n';\n    };\n    renderer.paragraph = function ({ tokens }) {\n        return this.parser.parseInline(tokens) + '\\n';\n    };\n    renderer.table = function ({ header, rows }) {\n        return header.map(cell => this.tablecell(cell)).join(' ') + '\\n' + rows.map(cells => cells.map(cell => this.tablecell(cell)).join(' ')).join('\\n') + '\\n';\n    };\n    renderer.tablerow = ({ text }) => {\n        return text;\n    };\n    renderer.tablecell = function ({ tokens }) {\n        return this.parser.parseInline(tokens);\n    };\n    renderer.strong = ({ text }) => {\n        return text;\n    };\n    renderer.em = ({ text }) => {\n        return text;\n    };\n    renderer.codespan = ({ text }) => {\n        return escape(text);\n    };\n    renderer.br = (_) => {\n        return '\\n';\n    };\n    renderer.del = ({ text }) => {\n        return text;\n    };\n    renderer.image = (_) => {\n        return '';\n    };\n    renderer.text = ({ text }) => {\n        return text;\n    };\n    renderer.link = ({ text }) => {\n        return text;\n    };\n    return renderer;\n}\nconst plainTextRenderer = new Lazy(createPlainTextRenderer);\nnew Lazy(() => {\n    const renderer = createPlainTextRenderer();\n    renderer.code = ({ text }) => {\n        return `\\n\\`\\`\\`\\n${escape(text)}\\n\\`\\`\\`\\n`;\n    };\n    return renderer;\n});\nfunction mergeRawTokenText(tokens) {\n    let mergedTokenText = '';\n    tokens.forEach(token => {\n        mergedTokenText += token.raw;\n    });\n    return mergedTokenText;\n}\nfunction completeSingleLinePattern(token) {\n    if (!token.tokens) {\n        return undefined;\n    }\n    for (let i = token.tokens.length - 1; i >= 0; i--) {\n        const subtoken = token.tokens[i];\n        if (subtoken.type === 'text') {\n            const lines = subtoken.raw.split('\\n');\n            const lastLine = lines[lines.length - 1];\n            if (lastLine.includes('`')) {\n                return completeCodespan(token);\n            }\n            else if (lastLine.includes('**')) {\n                return completeDoublestar(token);\n            }\n            else if (lastLine.match(/\\*\\w/)) {\n                return completeStar(token);\n            }\n            else if (lastLine.match(/(^|\\s)__\\w/)) {\n                return completeDoubleUnderscore(token);\n            }\n            else if (lastLine.match(/(^|\\s)_\\w/)) {\n                return completeUnderscore(token);\n            }\n            else if (\n            // Text with start of link target\n            hasLinkTextAndStartOfLinkTarget(lastLine) ||\n                // This token doesn't have the link text, eg if it contains other markdown constructs that are in other subtokens.\n                // But some preceding token does have an unbalanced [ at least\n                hasStartOfLinkTargetAndNoLinkText(lastLine) && token.tokens.slice(0, i).some(t => t.type === 'text' && t.raw.match(/\\[[^\\]]*$/))) {\n                const nextTwoSubTokens = token.tokens.slice(i + 1);\n                // A markdown link can look like\n                // [link text](https://microsoft.com \"more text\")\n                // Where \"more text\" is a title for the link or an argument to a vscode command link\n                if (\n                // If the link was parsed as a link, then look for a link token and a text token with a quote\n                nextTwoSubTokens[0]?.type === 'link' && nextTwoSubTokens[1]?.type === 'text' && nextTwoSubTokens[1].raw.match(/^ *\"[^\"]*$/) ||\n                    // And if the link was not parsed as a link (eg command link), just look for a single quote in this token\n                    lastLine.match(/^[^\"]* +\"[^\"]*$/)) {\n                    return completeLinkTargetArg(token);\n                }\n                return completeLinkTarget(token);\n            }\n            // Contains the start of link text, and no following tokens contain the link target\n            else if (lastLine.match(/(^|\\s)\\[\\w*[^\\]]*$/)) {\n                return completeLinkText(token);\n            }\n        }\n    }\n    return undefined;\n}\nfunction hasLinkTextAndStartOfLinkTarget(str) {\n    return !!str.match(/(^|\\s)\\[.*\\]\\(\\w*/);\n}\nfunction hasStartOfLinkTargetAndNoLinkText(str) {\n    return !!str.match(/^[^\\[]*\\]\\([^\\)]*$/);\n}\nfunction completeListItemPattern(list) {\n    // Patch up this one list item\n    const lastListItem = list.items[list.items.length - 1];\n    const lastListSubToken = lastListItem.tokens ? lastListItem.tokens[lastListItem.tokens.length - 1] : undefined;\n    /*\n    Example list token structures:\n\n    list\n        list_item\n            text\n                text\n                codespan\n                link\n        list_item\n            text\n            code // Complete indented codeblock\n        list_item\n            text\n            space\n            text\n                text // Incomplete indented codeblock\n        list_item\n            text\n            list // Nested list\n                list_item\n                    text\n                        text\n\n    Contrast with paragraph:\n    paragraph\n        text\n        codespan\n    */\n    const listEndsInHeading = (list) => {\n        // A list item can be rendered as a heading for some reason when it has a subitem where we haven't rendered the text yet like this:\n        // 1. list item\n        //    -\n        const lastItem = list.items.at(-1);\n        const lastToken = lastItem?.tokens.at(-1);\n        return lastToken?.type === 'heading' || lastToken?.type === 'list' && listEndsInHeading(lastToken);\n    };\n    let newToken;\n    if (lastListSubToken?.type === 'text' && !('inRawBlock' in lastListItem)) { // Why does Tag have a type of 'text'\n        newToken = completeSingleLinePattern(lastListSubToken);\n    }\n    else if (listEndsInHeading(list)) {\n        const newList = lexer(list.raw.trim() + ' &nbsp;')[0];\n        if (newList.type !== 'list') {\n            // Something went wrong\n            return;\n        }\n        return newList;\n    }\n    if (!newToken || newToken.type !== 'paragraph') { // 'text' item inside the list item turns into paragraph\n        // Nothing to fix, or not a pattern we were expecting\n        return;\n    }\n    const previousListItemsText = mergeRawTokenText(list.items.slice(0, -1));\n    // Grabbing the `- ` or `1. ` or `* ` off the list item because I can't find a better way to do this\n    const lastListItemLead = lastListItem.raw.match(/^(\\s*(-|\\d+\\.|\\*) +)/)?.[0];\n    if (!lastListItemLead) {\n        // Is badly formatted\n        return;\n    }\n    const newListItemText = lastListItemLead +\n        mergeRawTokenText(lastListItem.tokens.slice(0, -1)) +\n        newToken.raw;\n    const newList = lexer(previousListItemsText + newListItemText)[0];\n    if (newList.type !== 'list') {\n        // Something went wrong\n        return;\n    }\n    return newList;\n}\nfunction completeHeading(token, fullRawText) {\n    if (token.raw.match(/-\\s*$/)) {\n        return lexer(fullRawText + ' &nbsp;');\n    }\n}\nconst maxIncompleteTokensFixRounds = 3;\nfunction fillInIncompleteTokens(tokens) {\n    for (let i = 0; i < maxIncompleteTokensFixRounds; i++) {\n        const newTokens = fillInIncompleteTokensOnce(tokens);\n        if (newTokens) {\n            tokens = newTokens;\n        }\n        else {\n            break;\n        }\n    }\n    return tokens;\n}\nfunction fillInIncompleteTokensOnce(tokens) {\n    let i;\n    let newTokens;\n    for (i = 0; i < tokens.length; i++) {\n        const token = tokens[i];\n        if (token.type === 'paragraph' && token.raw.match(/(\\n|^)\\|/)) {\n            newTokens = completeTable(tokens.slice(i));\n            break;\n        }\n    }\n    const lastToken = tokens.at(-1);\n    if (!newTokens && lastToken?.type === 'list') {\n        const newListToken = completeListItemPattern(lastToken);\n        if (newListToken) {\n            newTokens = [newListToken];\n            i = tokens.length - 1;\n        }\n    }\n    if (!newTokens && lastToken?.type === 'paragraph') {\n        // Only operates on a single token, because any newline that follows this should break these patterns\n        const newToken = completeSingleLinePattern(lastToken);\n        if (newToken) {\n            newTokens = [newToken];\n            i = tokens.length - 1;\n        }\n    }\n    if (newTokens) {\n        const newTokensList = [\n            ...tokens.slice(0, i),\n            ...newTokens\n        ];\n        newTokensList.links = tokens.links;\n        return newTokensList;\n    }\n    if (lastToken?.type === 'heading') {\n        const completeTokens = completeHeading(lastToken, mergeRawTokenText(tokens));\n        if (completeTokens) {\n            return completeTokens;\n        }\n    }\n    return null;\n}\nfunction completeCodespan(token) {\n    return completeWithString(token, '`');\n}\nfunction completeStar(tokens) {\n    return completeWithString(tokens, '*');\n}\nfunction completeUnderscore(tokens) {\n    return completeWithString(tokens, '_');\n}\nfunction completeLinkTarget(tokens) {\n    return completeWithString(tokens, ')', false);\n}\nfunction completeLinkTargetArg(tokens) {\n    return completeWithString(tokens, '\")', false);\n}\nfunction completeLinkText(tokens) {\n    return completeWithString(tokens, '](https://microsoft.com)', false);\n}\nfunction completeDoublestar(tokens) {\n    return completeWithString(tokens, '**');\n}\nfunction completeDoubleUnderscore(tokens) {\n    return completeWithString(tokens, '__');\n}\nfunction completeWithString(tokens, closingString, shouldTrim = true) {\n    const mergedRawText = mergeRawTokenText(Array.isArray(tokens) ? tokens : [tokens]);\n    // If it was completed correctly, this should be a single token.\n    // Expecting either a Paragraph or a List\n    const trimmedRawText = shouldTrim ? mergedRawText.trimEnd() : mergedRawText;\n    return lexer(trimmedRawText + closingString)[0];\n}\nfunction completeTable(tokens) {\n    const mergedRawText = mergeRawTokenText(tokens);\n    const lines = mergedRawText.split('\\n');\n    let numCols; // The number of line1 col headers\n    let hasSeparatorRow = false;\n    for (let i = 0; i < lines.length; i++) {\n        const line = lines[i].trim();\n        if (typeof numCols === 'undefined' && line.match(/^\\s*\\|/)) {\n            const line1Matches = line.match(/(\\|[^\\|]+)(?=\\||$)/g);\n            if (line1Matches) {\n                numCols = line1Matches.length;\n            }\n        }\n        else if (typeof numCols === 'number') {\n            if (line.match(/^\\s*\\|/)) {\n                if (i !== lines.length - 1) {\n                    // We got the line1 header row, and the line2 separator row, but there are more lines, and it wasn't parsed as a table!\n                    // That's strange and means that the table is probably malformed in the source, so I won't try to patch it up.\n                    return undefined;\n                }\n                // Got a line2 separator row- partial or complete, doesn't matter, we'll replace it with a correct one\n                hasSeparatorRow = true;\n            }\n            else {\n                // The line after the header row isn't a valid separator row, so the table is malformed, don't fix it up\n                return undefined;\n            }\n        }\n    }\n    if (typeof numCols === 'number' && numCols > 0) {\n        const prefixText = hasSeparatorRow ? lines.slice(0, -1).join('\\n') : mergedRawText;\n        const line1EndsInPipe = !!prefixText.match(/\\|\\s*$/);\n        const newRawText = prefixText + (line1EndsInPipe ? '' : '|') + `\\n|${' --- |'.repeat(numCols)}`;\n        return lexer(newRawText);\n    }\n    return undefined;\n}\n\nexport { allowedMarkdownHtmlAttributes, allowedMarkdownHtmlTags, fillInIncompleteTokens, renderAsPlaintext, renderMarkdown };\n","import { Disposable } from '../../../common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nlet baseHoverDelegate = {\n    showInstantHover: () => undefined,\n    showDelayedHover: () => undefined,\n    setupDelayedHover: () => Disposable.None,\n    setupDelayedHoverAtMouse: () => Disposable.None,\n    hideHover: () => undefined,\n    showAndFocusLastHover: () => undefined,\n    setupManagedHover: () => ({\n        dispose: () => undefined,\n        show: () => undefined,\n        hide: () => undefined,\n        update: () => undefined,\n    }),\n    showManagedHover: () => undefined\n};\n/**\n * Sets the hover delegate for use **only in the `base/` layer**.\n */\nfunction setBaseLayerHoverDelegate(hoverDelegate) {\n    baseHoverDelegate = hoverDelegate;\n}\n/**\n * Gets the hover delegate for use **only in the `base/` layer**.\n *\n * Since the hover service depends on various platform services, this delegate essentially bypasses\n * the standard dependency injection mechanism by injecting a global hover service at start up. The\n * only reason this should be used is if `IHoverService` is not available.\n */\nfunction getBaseLayerHoverDelegate() {\n    return baseHoverDelegate;\n}\n\nexport { getBaseLayerHoverDelegate, setBaseLayerHoverDelegate };\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 *--------------------------------------------------------------------------------------------*/\nclass CombinedSpliceable {\n    constructor(spliceables) {\n        this.spliceables = spliceables;\n    }\n    splice(start, deleteCount, elements) {\n        this.spliceables.forEach(s => s.splice(start, deleteCount, elements));\n    }\n}\n\nexport { CombinedSpliceable };\n","function clamp(value, min, max) {\n    return Math.min(Math.max(value, min), max);\n}\nclass MovingAverage {\n    constructor() {\n        this._n = 1;\n        this._val = 0;\n    }\n    update(value) {\n        this._val = this._val + (value - this._val) / this._n;\n        this._n += 1;\n        return this._val;\n    }\n    get value() {\n        return this._val;\n    }\n}\nclass SlidingWindowAverage {\n    constructor(size) {\n        this._n = 0;\n        this._val = 0;\n        this._values = [];\n        this._index = 0;\n        this._sum = 0;\n        this._values = new Array(size);\n        this._values.fill(0, 0, size);\n    }\n    update(value) {\n        const oldValue = this._values[this._index];\n        this._values[this._index] = value;\n        this._index = (this._index + 1) % this._values.length;\n        this._sum -= oldValue;\n        this._sum += value;\n        if (this._n < this._values.length) {\n            this._n += 1;\n        }\n        this._val = this._sum / this._n;\n        return this._val;\n    }\n    get value() {\n        return this._val;\n    }\n}\n\nexport { MovingAverage, SlidingWindowAverage, clamp };\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 *--------------------------------------------------------------------------------------------*/\nclass ListError extends Error {\n    constructor(user, message) {\n        super(`ListError [${user}] ${message}`);\n    }\n}\n\nexport { ListError };\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 *--------------------------------------------------------------------------------------------*/\nvar Range;\n(function (Range) {\n    /**\n     * Returns the intersection between two ranges as a range itself.\n     * Returns `{ start: 0, end: 0 }` if the intersection is empty.\n     */\n    function intersect(one, other) {\n        if (one.start >= other.end || other.start >= one.end) {\n            return { start: 0, end: 0 };\n        }\n        const start = Math.max(one.start, other.start);\n        const end = Math.min(one.end, other.end);\n        if (end - start <= 0) {\n            return { start: 0, end: 0 };\n        }\n        return { start, end };\n    }\n    Range.intersect = intersect;\n    function isEmpty(range) {\n        return range.end - range.start <= 0;\n    }\n    Range.isEmpty = isEmpty;\n    function intersects(one, other) {\n        return !isEmpty(intersect(one, other));\n    }\n    Range.intersects = intersects;\n    function relativeComplement(one, other) {\n        const result = [];\n        const first = { start: one.start, end: Math.min(other.start, one.end) };\n        const second = { start: Math.max(other.end, one.start), end: one.end };\n        if (!isEmpty(first)) {\n            result.push(first);\n        }\n        if (!isEmpty(second)) {\n            result.push(second);\n        }\n        return result;\n    }\n    Range.relativeComplement = relativeComplement;\n})(Range || (Range = {}));\n\nexport { Range };\n","import { Range } from '../../../common/range.js';\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/**\n * Returns the intersection between a ranged group and a range.\n * Returns `[]` if the intersection is empty.\n */\nfunction groupIntersect(range, groups) {\n    const result = [];\n    for (const r of groups) {\n        if (range.start >= r.range.end) {\n            continue;\n        }\n        if (range.end < r.range.start) {\n            break;\n        }\n        const intersection = Range.intersect(range, r.range);\n        if (Range.isEmpty(intersection)) {\n            continue;\n        }\n        result.push({\n            range: intersection,\n            size: r.size\n        });\n    }\n    return result;\n}\n/**\n * Shifts a range by that `much`.\n */\nfunction shift({ start, end }, much) {\n    return { start: start + much, end: end + much };\n}\n/**\n * Consolidates a collection of ranged groups.\n *\n * Consolidation is the process of merging consecutive ranged groups\n * that share the same `size`.\n */\nfunction consolidate(groups) {\n    const result = [];\n    let previousGroup = null;\n    for (const group of groups) {\n        const start = group.range.start;\n        const end = group.range.end;\n        const size = group.size;\n        if (previousGroup && size === previousGroup.size) {\n            previousGroup.range.end = end;\n            continue;\n        }\n        previousGroup = { range: { start, end }, size };\n        result.push(previousGroup);\n    }\n    return result;\n}\n/**\n * Concatenates several collections of ranged groups into a single\n * collection.\n */\nfunction concat(...groups) {\n    return consolidate(groups.reduce((r, g) => r.concat(g), []));\n}\nclass RangeMap {\n    get paddingTop() {\n        return this._paddingTop;\n    }\n    set paddingTop(paddingTop) {\n        this._size = this._size + paddingTop - this._paddingTop;\n        this._paddingTop = paddingTop;\n    }\n    constructor(topPadding) {\n        this.groups = [];\n        this._size = 0;\n        this._paddingTop = 0;\n        this._paddingTop = topPadding ?? 0;\n        this._size = this._paddingTop;\n    }\n    splice(index, deleteCount, items = []) {\n        const diff = items.length - deleteCount;\n        const before = groupIntersect({ start: 0, end: index }, this.groups);\n        const after = groupIntersect({ start: index + deleteCount, end: Number.POSITIVE_INFINITY }, this.groups)\n            .map(g => ({ range: shift(g.range, diff), size: g.size }));\n        const middle = items.map((item, i) => ({\n            range: { start: index + i, end: index + i + 1 },\n            size: item.size\n        }));\n        this.groups = concat(before, middle, after);\n        this._size = this._paddingTop + this.groups.reduce((t, g) => t + (g.size * (g.range.end - g.range.start)), 0);\n    }\n    /**\n     * Returns the number of items in the range map.\n     */\n    get count() {\n        const len = this.groups.length;\n        if (!len) {\n            return 0;\n        }\n        return this.groups[len - 1].range.end;\n    }\n    /**\n     * Returns the sum of the sizes of all items in the range map.\n     */\n    get size() {\n        return this._size;\n    }\n    /**\n     * Returns the index of the item at the given position.\n     */\n    indexAt(position) {\n        if (position < 0) {\n            return -1;\n        }\n        if (position < this._paddingTop) {\n            return 0;\n        }\n        let index = 0;\n        let size = this._paddingTop;\n        for (const group of this.groups) {\n            const count = group.range.end - group.range.start;\n            const newSize = size + (count * group.size);\n            if (position < newSize) {\n                return index + Math.floor((position - size) / group.size);\n            }\n            index += count;\n            size = newSize;\n        }\n        return index;\n    }\n    /**\n     * Returns the index of the item right after the item at the\n     * index of the given position.\n     */\n    indexAfter(position) {\n        return Math.min(this.indexAt(position) + 1, this.count);\n    }\n    /**\n     * Returns the start position of the item at the given index.\n     */\n    positionAt(index) {\n        if (index < 0) {\n            return -1;\n        }\n        let position = 0;\n        let count = 0;\n        for (const group of this.groups) {\n            const groupCount = group.range.end - group.range.start;\n            const newCount = count + groupCount;\n            if (index < newCount) {\n                return this._paddingTop + position + ((index - count) * group.size);\n            }\n            position += groupCount * group.size;\n            count = newCount;\n        }\n        return -1;\n    }\n}\n\nexport { RangeMap, consolidate, groupIntersect, shift };\n","import { $ } from '../../dom.js';\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 *--------------------------------------------------------------------------------------------*/\nclass RowCache {\n    constructor(renderers) {\n        this.renderers = renderers;\n        this.cache = new Map();\n        this.transactionNodesPendingRemoval = new Set();\n        this.inTransaction = false;\n    }\n    /**\n     * Returns a row either by creating a new one or reusing\n     * a previously released row which shares the same templateId.\n     *\n     * @returns A row and `isReusingConnectedDomNode` if the row's node is already in the dom in a stale position.\n     */\n    alloc(templateId) {\n        let result = this.getTemplateCache(templateId).pop();\n        let isStale = false;\n        if (result) {\n            isStale = this.transactionNodesPendingRemoval.has(result.domNode);\n            if (isStale) {\n                this.transactionNodesPendingRemoval.delete(result.domNode);\n            }\n        }\n        else {\n            const domNode = $('.monaco-list-row');\n            const renderer = this.getRenderer(templateId);\n            const templateData = renderer.renderTemplate(domNode);\n            result = { domNode, templateId, templateData };\n        }\n        return { row: result, isReusingConnectedDomNode: isStale };\n    }\n    /**\n     * Releases the row for eventual reuse.\n     */\n    release(row) {\n        if (!row) {\n            return;\n        }\n        this.releaseRow(row);\n    }\n    /**\n     * Begin a set of changes that use the cache. This lets us skip work when a row is removed and then inserted again.\n     */\n    transact(makeChanges) {\n        if (this.inTransaction) {\n            throw new Error('Already in transaction');\n        }\n        this.inTransaction = true;\n        try {\n            makeChanges();\n        }\n        finally {\n            for (const domNode of this.transactionNodesPendingRemoval) {\n                this.doRemoveNode(domNode);\n            }\n            this.transactionNodesPendingRemoval.clear();\n            this.inTransaction = false;\n        }\n    }\n    releaseRow(row) {\n        const { domNode, templateId } = row;\n        if (domNode) {\n            if (this.inTransaction) {\n                this.transactionNodesPendingRemoval.add(domNode);\n            }\n            else {\n                this.doRemoveNode(domNode);\n            }\n        }\n        const cache = this.getTemplateCache(templateId);\n        cache.push(row);\n    }\n    doRemoveNode(domNode) {\n        domNode.classList.remove('scrolling');\n        domNode.remove();\n    }\n    getTemplateCache(templateId) {\n        let result = this.cache.get(templateId);\n        if (!result) {\n            result = [];\n            this.cache.set(templateId, result);\n        }\n        return result;\n    }\n    dispose() {\n        this.cache.forEach((cachedRows, templateId) => {\n            for (const cachedRow of cachedRows) {\n                const renderer = this.getRenderer(templateId);\n                renderer.disposeTemplate(cachedRow.templateData);\n                cachedRow.templateData = null;\n            }\n        });\n        this.cache.clear();\n        this.transactionNodesPendingRemoval.clear();\n    }\n    getRenderer(templateId) {\n        const renderer = this.renderers.get(templateId);\n        if (!renderer) {\n            throw new Error(`No renderer found for ${templateId}`);\n        }\n        return renderer;\n    }\n}\n\nexport { RowCache };\n","import { $ } from '../../dom.js';\nimport './dnd.css';\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 *--------------------------------------------------------------------------------------------*/\nfunction applyDragImage(event, container, label, extraClasses = []) {\n    if (!event.dataTransfer) {\n        return;\n    }\n    const dragImage = $('.monaco-drag-image');\n    dragImage.textContent = label;\n    dragImage.classList.add(...extraClasses);\n    const getDragImageContainer = (e) => {\n        while (e && !e.classList.contains('monaco-workbench')) {\n            e = e.parentElement;\n        }\n        return e || container.ownerDocument.body;\n    };\n    const dragContainer = getDragImageContainer(container);\n    dragContainer.appendChild(dragImage);\n    event.dataTransfer.setDragImage(dragImage, -10, -10);\n    // Removes the element when the DND operation is done\n    setTimeout(() => dragImage.remove(), 0);\n}\n\nexport { applyDragImage };\n","import { DataTransfers } from '../../dnd.js';\nimport { getContentWidth, scheduleAtNextAnimationFrame, getWindow, addDisposableListener, getActiveElement, getContentHeight, getDocument, getTopLeftOffset, animate, isHTMLElement, isSVGElement, isAncestor } from '../../dom.js';\nimport { DomEmitter } from '../../event.js';\nimport { Gesture, EventType } from '../../touch.js';\nimport { SmoothScrollableElement } from '../scrollbar/scrollableElement.js';\nimport { splice, distinct, equals } from '../../../common/arrays.js';\nimport { Delayer, disposableTimeout } from '../../../common/async.js';\nimport { memoize } from '../../../common/decorators.js';\nimport { Emitter, Event } from '../../../common/event.js';\nimport { Disposable, DisposableStore, toDisposable } from '../../../common/lifecycle.js';\nimport { Range } from '../../../common/range.js';\nimport { Scrollable } from '../../../common/scrollable.js';\nimport { RangeMap, shift } from './rangeMap.js';\nimport { RowCache } from './rowCache.js';\nimport { BugIndicatingError } from '../../../common/errors.js';\nimport { clamp } from '../../../common/numbers.js';\nimport { applyDragImage } from '../dnd/dnd.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nconst StaticDND = {\n    CurrentDragAndDropData: undefined\n};\nconst DefaultOptions = {\n    useShadows: true,\n    verticalScrollMode: 1 /* ScrollbarVisibility.Auto */,\n    setRowLineHeight: true,\n    setRowHeight: true,\n    supportDynamicHeights: false,\n    dnd: {\n        getDragElements(e) { return [e]; },\n        getDragURI() { return null; },\n        onDragStart() { },\n        onDragOver() { return false; },\n        drop() { },\n        dispose() { }\n    },\n    horizontalScrolling: false,\n    transformOptimization: true,\n    alwaysConsumeMouseWheel: true,\n};\nclass ElementsDragAndDropData {\n    constructor(elements) {\n        this.elements = elements;\n    }\n    update() { }\n    getData() {\n        return this.elements;\n    }\n}\nclass ExternalElementsDragAndDropData {\n    constructor(elements) {\n        this.elements = elements;\n    }\n    update() { }\n    getData() {\n        return this.elements;\n    }\n}\nclass NativeDragAndDropData {\n    constructor() {\n        this.types = [];\n        this.files = [];\n    }\n    update(dataTransfer) {\n        if (dataTransfer.types) {\n            this.types.splice(0, this.types.length, ...dataTransfer.types);\n        }\n        if (dataTransfer.files) {\n            this.files.splice(0, this.files.length);\n            for (let i = 0; i < dataTransfer.files.length; i++) {\n                const file = dataTransfer.files.item(i);\n                if (file && (file.size || file.type)) {\n                    this.files.push(file);\n                }\n            }\n        }\n    }\n    getData() {\n        return {\n            types: this.types,\n            files: this.files\n        };\n    }\n}\nfunction equalsDragFeedback(f1, f2) {\n    if (Array.isArray(f1) && Array.isArray(f2)) {\n        return equals(f1, f2);\n    }\n    return f1 === f2;\n}\nclass ListViewAccessibilityProvider {\n    constructor(accessibilityProvider) {\n        if (accessibilityProvider?.getSetSize) {\n            this.getSetSize = accessibilityProvider.getSetSize.bind(accessibilityProvider);\n        }\n        else {\n            this.getSetSize = (e, i, l) => l;\n        }\n        if (accessibilityProvider?.getPosInSet) {\n            this.getPosInSet = accessibilityProvider.getPosInSet.bind(accessibilityProvider);\n        }\n        else {\n            this.getPosInSet = (e, i) => i + 1;\n        }\n        if (accessibilityProvider?.getRole) {\n            this.getRole = accessibilityProvider.getRole.bind(accessibilityProvider);\n        }\n        else {\n            this.getRole = _ => 'listitem';\n        }\n        if (accessibilityProvider?.isChecked) {\n            this.isChecked = accessibilityProvider.isChecked.bind(accessibilityProvider);\n        }\n        else {\n            this.isChecked = _ => undefined;\n        }\n    }\n}\n/**\n * The {@link ListView} is a virtual scrolling engine.\n *\n * Given that it only renders elements within its viewport, it can hold large\n * collections of elements and stay very performant. The performance bottleneck\n * usually lies within the user's rendering code for each element.\n *\n * @remarks It is a low-level widget, not meant to be used directly. Refer to the\n * List widget instead.\n */\nclass ListView {\n    static { this.InstanceCount = 0; }\n    get contentHeight() { return this.rangeMap.size; }\n    get onDidScroll() { return this.scrollableElement.onScroll; }\n    get scrollableElementDomNode() { return this.scrollableElement.getDomNode(); }\n    get horizontalScrolling() { return this._horizontalScrolling; }\n    set horizontalScrolling(value) {\n        if (value === this._horizontalScrolling) {\n            return;\n        }\n        if (value && this.supportDynamicHeights) {\n            throw new Error('Horizontal scrolling and dynamic heights not supported simultaneously');\n        }\n        this._horizontalScrolling = value;\n        this.domNode.classList.toggle('horizontal-scrolling', this._horizontalScrolling);\n        if (this._horizontalScrolling) {\n            for (const item of this.items) {\n                this.measureItemWidth(item);\n            }\n            this.updateScrollWidth();\n            this.scrollableElement.setScrollDimensions({ width: getContentWidth(this.domNode) });\n            this.rowsContainer.style.width = `${Math.max(this.scrollWidth || 0, this.renderWidth)}px`;\n        }\n        else {\n            this.scrollableElementWidthDelayer.cancel();\n            this.scrollableElement.setScrollDimensions({ width: this.renderWidth, scrollWidth: this.renderWidth });\n            this.rowsContainer.style.width = '';\n        }\n    }\n    constructor(container, virtualDelegate, renderers, options = DefaultOptions) {\n        this.virtualDelegate = virtualDelegate;\n        this.domId = `list_id_${++ListView.InstanceCount}`;\n        this.renderers = new Map();\n        this.renderWidth = 0;\n        this._scrollHeight = 0;\n        this.scrollableElementUpdateDisposable = null;\n        this.scrollableElementWidthDelayer = new Delayer(50);\n        this.splicing = false;\n        this.dragOverAnimationStopDisposable = Disposable.None;\n        this.dragOverMouseY = 0;\n        this.canDrop = false;\n        this.currentDragFeedbackDisposable = Disposable.None;\n        this.onDragLeaveTimeout = Disposable.None;\n        this.currentSelectionDisposable = Disposable.None;\n        this.disposables = new DisposableStore();\n        this._onDidChangeContentHeight = new Emitter();\n        this._onDidChangeContentWidth = new Emitter();\n        this.onDidChangeContentHeight = Event.latch(this._onDidChangeContentHeight.event, undefined, this.disposables);\n        this._horizontalScrolling = false;\n        if (options.horizontalScrolling && options.supportDynamicHeights) {\n            throw new Error('Horizontal scrolling and dynamic heights not supported simultaneously');\n        }\n        this.items = [];\n        this.itemId = 0;\n        this.rangeMap = this.createRangeMap(options.paddingTop ?? 0);\n        for (const renderer of renderers) {\n            this.renderers.set(renderer.templateId, renderer);\n        }\n        this.cache = this.disposables.add(new RowCache(this.renderers));\n        this.lastRenderTop = 0;\n        this.lastRenderHeight = 0;\n        this.domNode = document.createElement('div');\n        this.domNode.className = 'monaco-list';\n        this.domNode.classList.add(this.domId);\n        this.domNode.tabIndex = 0;\n        this.domNode.classList.toggle('mouse-support', typeof options.mouseSupport === 'boolean' ? options.mouseSupport : true);\n        this._horizontalScrolling = options.horizontalScrolling ?? DefaultOptions.horizontalScrolling;\n        this.domNode.classList.toggle('horizontal-scrolling', this._horizontalScrolling);\n        this.paddingBottom = typeof options.paddingBottom === 'undefined' ? 0 : options.paddingBottom;\n        this.accessibilityProvider = new ListViewAccessibilityProvider(options.accessibilityProvider);\n        this.rowsContainer = document.createElement('div');\n        this.rowsContainer.className = 'monaco-list-rows';\n        const transformOptimization = options.transformOptimization ?? DefaultOptions.transformOptimization;\n        if (transformOptimization) {\n            this.rowsContainer.style.transform = 'translate3d(0px, 0px, 0px)';\n            this.rowsContainer.style.overflow = 'hidden';\n            this.rowsContainer.style.contain = 'strict';\n        }\n        this.disposables.add(Gesture.addTarget(this.rowsContainer));\n        this.scrollable = this.disposables.add(new Scrollable({\n            forceIntegerValues: true,\n            smoothScrollDuration: (options.smoothScrolling ?? false) ? 125 : 0,\n            scheduleAtNextAnimationFrame: cb => scheduleAtNextAnimationFrame(getWindow(this.domNode), cb)\n        }));\n        this.scrollableElement = this.disposables.add(new SmoothScrollableElement(this.rowsContainer, {\n            alwaysConsumeMouseWheel: options.alwaysConsumeMouseWheel ?? DefaultOptions.alwaysConsumeMouseWheel,\n            horizontal: 1 /* ScrollbarVisibility.Auto */,\n            vertical: options.verticalScrollMode ?? DefaultOptions.verticalScrollMode,\n            useShadows: options.useShadows ?? DefaultOptions.useShadows,\n            mouseWheelScrollSensitivity: options.mouseWheelScrollSensitivity,\n            fastScrollSensitivity: options.fastScrollSensitivity,\n            scrollByPage: options.scrollByPage\n        }, this.scrollable));\n        this.domNode.appendChild(this.scrollableElement.getDomNode());\n        container.appendChild(this.domNode);\n        this.scrollableElement.onScroll(this.onScroll, this, this.disposables);\n        this.disposables.add(addDisposableListener(this.rowsContainer, EventType.Change, e => this.onTouchChange(e)));\n        this.disposables.add(addDisposableListener(this.scrollableElement.getDomNode(), 'scroll', e => {\n            // Make sure the active element is scrolled into view\n            const element = e.target;\n            const scrollValue = element.scrollTop;\n            element.scrollTop = 0;\n            if (options.scrollToActiveElement) {\n                this.setScrollTop(this.scrollTop + scrollValue);\n            }\n        }));\n        this.disposables.add(addDisposableListener(this.domNode, 'dragover', e => this.onDragOver(this.toDragEvent(e))));\n        this.disposables.add(addDisposableListener(this.domNode, 'drop', e => this.onDrop(this.toDragEvent(e))));\n        this.disposables.add(addDisposableListener(this.domNode, 'dragleave', e => this.onDragLeave(this.toDragEvent(e))));\n        this.disposables.add(addDisposableListener(this.domNode, 'dragend', e => this.onDragEnd(e)));\n        if (options.userSelection) {\n            if (options.dnd) {\n                throw new Error('DND and user selection cannot be used simultaneously');\n            }\n            this.disposables.add(addDisposableListener(this.domNode, 'mousedown', e => this.onPotentialSelectionStart(e)));\n        }\n        this.setRowLineHeight = options.setRowLineHeight ?? DefaultOptions.setRowLineHeight;\n        this.setRowHeight = options.setRowHeight ?? DefaultOptions.setRowHeight;\n        this.supportDynamicHeights = options.supportDynamicHeights ?? DefaultOptions.supportDynamicHeights;\n        this.dnd = options.dnd ?? this.disposables.add(DefaultOptions.dnd);\n        this.layout(options.initialSize?.height, options.initialSize?.width);\n        if (options.scrollToActiveElement) {\n            this._setupFocusObserver(container);\n        }\n    }\n    _setupFocusObserver(container) {\n        this.disposables.add(addDisposableListener(container, 'focus', () => {\n            const element = getActiveElement();\n            if (this.activeElement !== element && element !== null) {\n                this.activeElement = element;\n                this._scrollToActiveElement(this.activeElement, container);\n            }\n        }, true));\n    }\n    _scrollToActiveElement(element, container) {\n        // The scroll event on the list only fires when scrolling down.\n        // If the active element is above the viewport, we need to scroll up.\n        const containerRect = container.getBoundingClientRect();\n        const elementRect = element.getBoundingClientRect();\n        const topOffset = elementRect.top - containerRect.top;\n        if (topOffset < 0) {\n            // Scroll up\n            this.setScrollTop(this.scrollTop + topOffset);\n        }\n    }\n    updateOptions(options) {\n        if (options.paddingBottom !== undefined) {\n            this.paddingBottom = options.paddingBottom;\n            this.scrollableElement.setScrollDimensions({ scrollHeight: this.scrollHeight });\n        }\n        if (options.smoothScrolling !== undefined) {\n            this.scrollable.setSmoothScrollDuration(options.smoothScrolling ? 125 : 0);\n        }\n        if (options.horizontalScrolling !== undefined) {\n            this.horizontalScrolling = options.horizontalScrolling;\n        }\n        let scrollableOptions;\n        if (options.scrollByPage !== undefined) {\n            scrollableOptions = { ...(scrollableOptions ?? {}), scrollByPage: options.scrollByPage };\n        }\n        if (options.mouseWheelScrollSensitivity !== undefined) {\n            scrollableOptions = { ...(scrollableOptions ?? {}), mouseWheelScrollSensitivity: options.mouseWheelScrollSensitivity };\n        }\n        if (options.fastScrollSensitivity !== undefined) {\n            scrollableOptions = { ...(scrollableOptions ?? {}), fastScrollSensitivity: options.fastScrollSensitivity };\n        }\n        if (scrollableOptions) {\n            this.scrollableElement.updateOptions(scrollableOptions);\n        }\n        if (options.paddingTop !== undefined && options.paddingTop !== this.rangeMap.paddingTop) {\n            // trigger a rerender\n            const lastRenderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight);\n            const offset = options.paddingTop - this.rangeMap.paddingTop;\n            this.rangeMap.paddingTop = options.paddingTop;\n            this.render(lastRenderRange, Math.max(0, this.lastRenderTop + offset), this.lastRenderHeight, undefined, undefined, true);\n            this.setScrollTop(this.lastRenderTop);\n            this.eventuallyUpdateScrollDimensions();\n            if (this.supportDynamicHeights) {\n                this._rerender(this.lastRenderTop, this.lastRenderHeight);\n            }\n        }\n    }\n    createRangeMap(paddingTop) {\n        return new RangeMap(paddingTop);\n    }\n    splice(start, deleteCount, elements = []) {\n        if (this.splicing) {\n            throw new Error('Can\\'t run recursive splices.');\n        }\n        this.splicing = true;\n        try {\n            return this._splice(start, deleteCount, elements);\n        }\n        finally {\n            this.splicing = false;\n            this._onDidChangeContentHeight.fire(this.contentHeight);\n        }\n    }\n    _splice(start, deleteCount, elements = []) {\n        const previousRenderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight);\n        const deleteRange = { start, end: start + deleteCount };\n        const removeRange = Range.intersect(previousRenderRange, deleteRange);\n        // try to reuse rows, avoid removing them from DOM\n        const rowsToDispose = new Map();\n        for (let i = removeRange.end - 1; i >= removeRange.start; i--) {\n            const item = this.items[i];\n            item.dragStartDisposable.dispose();\n            item.checkedDisposable.dispose();\n            if (item.row) {\n                let rows = rowsToDispose.get(item.templateId);\n                if (!rows) {\n                    rows = [];\n                    rowsToDispose.set(item.templateId, rows);\n                }\n                const renderer = this.renderers.get(item.templateId);\n                if (renderer && renderer.disposeElement) {\n                    renderer.disposeElement(item.element, i, item.row.templateData, { height: item.size });\n                }\n                rows.unshift(item.row);\n            }\n            item.row = null;\n            item.stale = true;\n        }\n        const previousRestRange = { start: start + deleteCount, end: this.items.length };\n        const previousRenderedRestRange = Range.intersect(previousRestRange, previousRenderRange);\n        const previousUnrenderedRestRanges = Range.relativeComplement(previousRestRange, previousRenderRange);\n        const inserted = elements.map(element => ({\n            id: String(this.itemId++),\n            element,\n            templateId: this.virtualDelegate.getTemplateId(element),\n            size: this.virtualDelegate.getHeight(element),\n            width: undefined,\n            hasDynamicHeight: !!this.virtualDelegate.hasDynamicHeight && this.virtualDelegate.hasDynamicHeight(element),\n            lastDynamicHeightWidth: undefined,\n            row: null,\n            uri: undefined,\n            dropTarget: false,\n            dragStartDisposable: Disposable.None,\n            checkedDisposable: Disposable.None,\n            stale: false\n        }));\n        let deleted;\n        // TODO@joao: improve this optimization to catch even more cases\n        if (start === 0 && deleteCount >= this.items.length) {\n            this.rangeMap = this.createRangeMap(this.rangeMap.paddingTop);\n            this.rangeMap.splice(0, 0, inserted);\n            deleted = this.items;\n            this.items = inserted;\n        }\n        else {\n            this.rangeMap.splice(start, deleteCount, inserted);\n            deleted = splice(this.items, start, deleteCount, inserted);\n        }\n        const delta = elements.length - deleteCount;\n        const renderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight);\n        const renderedRestRange = shift(previousRenderedRestRange, delta);\n        const updateRange = Range.intersect(renderRange, renderedRestRange);\n        for (let i = updateRange.start; i < updateRange.end; i++) {\n            this.updateItemInDOM(this.items[i], i);\n        }\n        const removeRanges = Range.relativeComplement(renderedRestRange, renderRange);\n        for (const range of removeRanges) {\n            for (let i = range.start; i < range.end; i++) {\n                this.removeItemFromDOM(i);\n            }\n        }\n        const unrenderedRestRanges = previousUnrenderedRestRanges.map(r => shift(r, delta));\n        const elementsRange = { start, end: start + elements.length };\n        const insertRanges = [elementsRange, ...unrenderedRestRanges].map(r => Range.intersect(renderRange, r)).reverse();\n        for (const range of insertRanges) {\n            for (let i = range.end - 1; i >= range.start; i--) {\n                const item = this.items[i];\n                const rows = rowsToDispose.get(item.templateId);\n                const row = rows?.pop();\n                this.insertItemInDOM(i, row);\n            }\n        }\n        for (const rows of rowsToDispose.values()) {\n            for (const row of rows) {\n                this.cache.release(row);\n            }\n        }\n        this.eventuallyUpdateScrollDimensions();\n        if (this.supportDynamicHeights) {\n            this._rerender(this.scrollTop, this.renderHeight);\n        }\n        return deleted.map(i => i.element);\n    }\n    eventuallyUpdateScrollDimensions() {\n        this._scrollHeight = this.contentHeight;\n        this.rowsContainer.style.height = `${this._scrollHeight}px`;\n        if (!this.scrollableElementUpdateDisposable) {\n            this.scrollableElementUpdateDisposable = scheduleAtNextAnimationFrame(getWindow(this.domNode), () => {\n                this.scrollableElement.setScrollDimensions({ scrollHeight: this.scrollHeight });\n                this.updateScrollWidth();\n                this.scrollableElementUpdateDisposable = null;\n            });\n        }\n    }\n    eventuallyUpdateScrollWidth() {\n        if (!this.horizontalScrolling) {\n            this.scrollableElementWidthDelayer.cancel();\n            return;\n        }\n        this.scrollableElementWidthDelayer.trigger(() => this.updateScrollWidth());\n    }\n    updateScrollWidth() {\n        if (!this.horizontalScrolling) {\n            return;\n        }\n        let scrollWidth = 0;\n        for (const item of this.items) {\n            if (typeof item.width !== 'undefined') {\n                scrollWidth = Math.max(scrollWidth, item.width);\n            }\n        }\n        this.scrollWidth = scrollWidth;\n        this.scrollableElement.setScrollDimensions({ scrollWidth: scrollWidth === 0 ? 0 : (scrollWidth + 10) });\n        this._onDidChangeContentWidth.fire(this.scrollWidth);\n    }\n    rerender() {\n        if (!this.supportDynamicHeights) {\n            return;\n        }\n        for (const item of this.items) {\n            item.lastDynamicHeightWidth = undefined;\n        }\n        this._rerender(this.lastRenderTop, this.lastRenderHeight);\n    }\n    get length() {\n        return this.items.length;\n    }\n    get renderHeight() {\n        const scrollDimensions = this.scrollableElement.getScrollDimensions();\n        return scrollDimensions.height;\n    }\n    get firstVisibleIndex() {\n        const range = this.getVisibleRange(this.lastRenderTop, this.lastRenderHeight);\n        return range.start;\n    }\n    element(index) {\n        return this.items[index].element;\n    }\n    indexOf(element) {\n        return this.items.findIndex(item => item.element === element);\n    }\n    domElement(index) {\n        const row = this.items[index].row;\n        return row && row.domNode;\n    }\n    elementHeight(index) {\n        return this.items[index].size;\n    }\n    elementTop(index) {\n        return this.rangeMap.positionAt(index);\n    }\n    indexAt(position) {\n        return this.rangeMap.indexAt(position);\n    }\n    indexAfter(position) {\n        return this.rangeMap.indexAfter(position);\n    }\n    layout(height, width) {\n        const scrollDimensions = {\n            height: typeof height === 'number' ? height : getContentHeight(this.domNode)\n        };\n        if (this.scrollableElementUpdateDisposable) {\n            this.scrollableElementUpdateDisposable.dispose();\n            this.scrollableElementUpdateDisposable = null;\n            scrollDimensions.scrollHeight = this.scrollHeight;\n        }\n        this.scrollableElement.setScrollDimensions(scrollDimensions);\n        if (typeof width !== 'undefined') {\n            this.renderWidth = width;\n            if (this.supportDynamicHeights) {\n                this._rerender(this.scrollTop, this.renderHeight);\n            }\n        }\n        if (this.horizontalScrolling) {\n            this.scrollableElement.setScrollDimensions({\n                width: typeof width === 'number' ? width : getContentWidth(this.domNode)\n            });\n        }\n    }\n    // Render\n    render(previousRenderRange, renderTop, renderHeight, renderLeft, scrollWidth, updateItemsInDOM = false, onScroll = false) {\n        const renderRange = this.getRenderRange(renderTop, renderHeight);\n        const rangesToInsert = Range.relativeComplement(renderRange, previousRenderRange).reverse();\n        const rangesToRemove = Range.relativeComplement(previousRenderRange, renderRange);\n        if (updateItemsInDOM) {\n            const rangesToUpdate = Range.intersect(previousRenderRange, renderRange);\n            for (let i = rangesToUpdate.start; i < rangesToUpdate.end; i++) {\n                this.updateItemInDOM(this.items[i], i);\n            }\n        }\n        this.cache.transact(() => {\n            for (const range of rangesToRemove) {\n                for (let i = range.start; i < range.end; i++) {\n                    this.removeItemFromDOM(i, onScroll);\n                }\n            }\n            for (const range of rangesToInsert) {\n                for (let i = range.end - 1; i >= range.start; i--) {\n                    this.insertItemInDOM(i);\n                }\n            }\n        });\n        if (renderLeft !== undefined) {\n            this.rowsContainer.style.left = `-${renderLeft}px`;\n        }\n        this.rowsContainer.style.top = `-${renderTop}px`;\n        if (this.horizontalScrolling && scrollWidth !== undefined) {\n            this.rowsContainer.style.width = `${Math.max(scrollWidth, this.renderWidth)}px`;\n        }\n        this.lastRenderTop = renderTop;\n        this.lastRenderHeight = renderHeight;\n    }\n    // DOM operations\n    insertItemInDOM(index, row) {\n        const item = this.items[index];\n        if (!item.row) {\n            if (row) {\n                item.row = row;\n                item.stale = true;\n            }\n            else {\n                const result = this.cache.alloc(item.templateId);\n                item.row = result.row;\n                item.stale ||= result.isReusingConnectedDomNode;\n            }\n        }\n        const role = this.accessibilityProvider.getRole(item.element) || 'listitem';\n        item.row.domNode.setAttribute('role', role);\n        const checked = this.accessibilityProvider.isChecked(item.element);\n        const toAriaState = (value) => value === 'mixed' ? 'mixed' : String(!!value);\n        if (typeof checked === 'boolean' || checked === 'mixed') {\n            item.row.domNode.setAttribute('aria-checked', toAriaState(checked));\n        }\n        else if (checked) {\n            const update = (value) => item.row.domNode.setAttribute('aria-checked', toAriaState(value));\n            update(checked.value);\n            item.checkedDisposable = checked.onDidChange(() => update(checked.value));\n        }\n        if (item.stale || !item.row.domNode.parentElement) {\n            const referenceNode = this.items.at(index + 1)?.row?.domNode ?? null;\n            if (item.row.domNode.parentElement !== this.rowsContainer || item.row.domNode.nextElementSibling !== referenceNode) {\n                this.rowsContainer.insertBefore(item.row.domNode, referenceNode);\n            }\n            item.stale = false;\n        }\n        this.updateItemInDOM(item, index);\n        const renderer = this.renderers.get(item.templateId);\n        if (!renderer) {\n            throw new Error(`No renderer found for template id ${item.templateId}`);\n        }\n        renderer?.renderElement(item.element, index, item.row.templateData, { height: item.size });\n        const uri = this.dnd.getDragURI(item.element);\n        item.dragStartDisposable.dispose();\n        item.row.domNode.draggable = !!uri;\n        if (uri) {\n            item.dragStartDisposable = addDisposableListener(item.row.domNode, 'dragstart', event => this.onDragStart(item.element, uri, event));\n        }\n        if (this.horizontalScrolling) {\n            this.measureItemWidth(item);\n            this.eventuallyUpdateScrollWidth();\n        }\n    }\n    measureItemWidth(item) {\n        if (!item.row || !item.row.domNode) {\n            return;\n        }\n        item.row.domNode.style.width = 'fit-content';\n        item.width = getContentWidth(item.row.domNode);\n        const style = getWindow(item.row.domNode).getComputedStyle(item.row.domNode);\n        if (style.paddingLeft) {\n            item.width += parseFloat(style.paddingLeft);\n        }\n        if (style.paddingRight) {\n            item.width += parseFloat(style.paddingRight);\n        }\n        item.row.domNode.style.width = '';\n    }\n    updateItemInDOM(item, index) {\n        item.row.domNode.style.top = `${this.elementTop(index)}px`;\n        if (this.setRowHeight) {\n            item.row.domNode.style.height = `${item.size}px`;\n        }\n        if (this.setRowLineHeight) {\n            item.row.domNode.style.lineHeight = `${item.size}px`;\n        }\n        item.row.domNode.setAttribute('data-index', `${index}`);\n        item.row.domNode.setAttribute('data-last-element', index === this.length - 1 ? 'true' : 'false');\n        item.row.domNode.setAttribute('data-parity', index % 2 === 0 ? 'even' : 'odd');\n        item.row.domNode.setAttribute('aria-setsize', String(this.accessibilityProvider.getSetSize(item.element, index, this.length)));\n        item.row.domNode.setAttribute('aria-posinset', String(this.accessibilityProvider.getPosInSet(item.element, index)));\n        item.row.domNode.setAttribute('id', this.getElementDomId(index));\n        item.row.domNode.classList.toggle('drop-target', item.dropTarget);\n    }\n    removeItemFromDOM(index, onScroll) {\n        const item = this.items[index];\n        item.dragStartDisposable.dispose();\n        item.checkedDisposable.dispose();\n        if (item.row) {\n            const renderer = this.renderers.get(item.templateId);\n            if (renderer && renderer.disposeElement) {\n                renderer.disposeElement(item.element, index, item.row.templateData, { height: item.size, onScroll });\n            }\n            this.cache.release(item.row);\n            item.row = null;\n        }\n        if (this.horizontalScrolling) {\n            this.eventuallyUpdateScrollWidth();\n        }\n    }\n    getScrollTop() {\n        const scrollPosition = this.scrollableElement.getScrollPosition();\n        return scrollPosition.scrollTop;\n    }\n    setScrollTop(scrollTop, reuseAnimation) {\n        if (this.scrollableElementUpdateDisposable) {\n            this.scrollableElementUpdateDisposable.dispose();\n            this.scrollableElementUpdateDisposable = null;\n            this.scrollableElement.setScrollDimensions({ scrollHeight: this.scrollHeight });\n        }\n        this.scrollableElement.setScrollPosition({ scrollTop, reuseAnimation });\n    }\n    get scrollTop() {\n        return this.getScrollTop();\n    }\n    set scrollTop(scrollTop) {\n        this.setScrollTop(scrollTop);\n    }\n    get scrollHeight() {\n        return this._scrollHeight + (this.horizontalScrolling ? 10 : 0) + this.paddingBottom;\n    }\n    // Events\n    get onMouseClick() { return Event.map(this.disposables.add(new DomEmitter(this.domNode, 'click')).event, e => this.toMouseEvent(e), this.disposables); }\n    get onMouseDblClick() { return Event.map(this.disposables.add(new DomEmitter(this.domNode, 'dblclick')).event, e => this.toMouseEvent(e), this.disposables); }\n    get onMouseMiddleClick() { return Event.filter(Event.map(this.disposables.add(new DomEmitter(this.domNode, 'auxclick')).event, e => this.toMouseEvent(e), this.disposables), e => e.browserEvent.button === 1, this.disposables); }\n    get onMouseDown() { return Event.map(this.disposables.add(new DomEmitter(this.domNode, 'mousedown')).event, e => this.toMouseEvent(e), this.disposables); }\n    get onMouseOver() { return Event.map(this.disposables.add(new DomEmitter(this.domNode, 'mouseover')).event, e => this.toMouseEvent(e), this.disposables); }\n    get onMouseOut() { return Event.map(this.disposables.add(new DomEmitter(this.domNode, 'mouseout')).event, e => this.toMouseEvent(e), this.disposables); }\n    get onContextMenu() { return Event.any(Event.map(this.disposables.add(new DomEmitter(this.domNode, 'contextmenu')).event, e => this.toMouseEvent(e), this.disposables), Event.map(this.disposables.add(new DomEmitter(this.domNode, EventType.Contextmenu)).event, e => this.toGestureEvent(e), this.disposables)); }\n    get onTouchStart() { return Event.map(this.disposables.add(new DomEmitter(this.domNode, 'touchstart')).event, e => this.toTouchEvent(e), this.disposables); }\n    get onTap() { return Event.map(this.disposables.add(new DomEmitter(this.rowsContainer, EventType.Tap)).event, e => this.toGestureEvent(e), this.disposables); }\n    toMouseEvent(browserEvent) {\n        const index = this.getItemIndexFromEventTarget(browserEvent.target || null);\n        const item = typeof index === 'undefined' ? undefined : this.items[index];\n        const element = item && item.element;\n        return { browserEvent, index, element };\n    }\n    toTouchEvent(browserEvent) {\n        const index = this.getItemIndexFromEventTarget(browserEvent.target || null);\n        const item = typeof index === 'undefined' ? undefined : this.items[index];\n        const element = item && item.element;\n        return { browserEvent, index, element };\n    }\n    toGestureEvent(browserEvent) {\n        const index = this.getItemIndexFromEventTarget(browserEvent.initialTarget || null);\n        const item = typeof index === 'undefined' ? undefined : this.items[index];\n        const element = item && item.element;\n        return { browserEvent, index, element };\n    }\n    toDragEvent(browserEvent) {\n        const index = this.getItemIndexFromEventTarget(browserEvent.target || null);\n        const item = typeof index === 'undefined' ? undefined : this.items[index];\n        const element = item && item.element;\n        const sector = this.getTargetSector(browserEvent, index);\n        return { browserEvent, index, element, sector };\n    }\n    onScroll(e) {\n        try {\n            const previousRenderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight);\n            this.render(previousRenderRange, e.scrollTop, e.height, e.scrollLeft, e.scrollWidth, undefined, true);\n            if (this.supportDynamicHeights) {\n                this._rerender(e.scrollTop, e.height, e.inSmoothScrolling);\n            }\n        }\n        catch (err) {\n            console.error('Got bad scroll event:', e);\n            throw err;\n        }\n    }\n    onTouchChange(event) {\n        event.preventDefault();\n        event.stopPropagation();\n        this.scrollTop -= event.translationY;\n    }\n    // DND\n    onDragStart(element, uri, event) {\n        if (!event.dataTransfer) {\n            return;\n        }\n        const elements = this.dnd.getDragElements(element);\n        event.dataTransfer.effectAllowed = 'copyMove';\n        event.dataTransfer.setData(DataTransfers.TEXT, uri);\n        let label;\n        if (this.dnd.getDragLabel) {\n            label = this.dnd.getDragLabel(elements, event);\n        }\n        if (typeof label === 'undefined') {\n            label = String(elements.length);\n        }\n        applyDragImage(event, this.domNode, label, [this.domId /* add domId to get list specific styling */]);\n        this.domNode.classList.add('dragging');\n        this.currentDragData = new ElementsDragAndDropData(elements);\n        StaticDND.CurrentDragAndDropData = new ExternalElementsDragAndDropData(elements);\n        this.dnd.onDragStart?.(this.currentDragData, event);\n    }\n    onPotentialSelectionStart(e) {\n        this.currentSelectionDisposable.dispose();\n        const doc = getDocument(this.domNode);\n        // Set up both the 'movement store' for watching the mouse, and the\n        // 'selection store' which lasts as long as there's a selection, even\n        // after the usr has stopped modifying it.\n        const selectionStore = this.currentSelectionDisposable = new DisposableStore();\n        const movementStore = selectionStore.add(new DisposableStore());\n        // The selection events we get from the DOM are fairly limited and we lack a 'selection end' event.\n        // Selection events also don't tell us where the input doing the selection is. So, make a poor\n        // assumption that a user is using the mouse, and base our events on that.\n        movementStore.add(addDisposableListener(this.domNode, 'selectstart', () => {\n            movementStore.add(addDisposableListener(doc, 'mousemove', e => {\n                if (doc.getSelection()?.isCollapsed === false) {\n                    this.setupDragAndDropScrollTopAnimation(e);\n                }\n            }));\n            // The selection is cleared either on mouseup if there's no selection, or on next mousedown\n            // when `this.currentSelectionDisposable` is reset.\n            selectionStore.add(toDisposable(() => {\n                const previousRenderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight);\n                this.currentSelectionBounds = undefined;\n                this.render(previousRenderRange, this.lastRenderTop, this.lastRenderHeight, undefined, undefined);\n            }));\n            selectionStore.add(addDisposableListener(doc, 'selectionchange', () => {\n                const selection = doc.getSelection();\n                // if the selection changed _after_ mouseup, it's from clearing the list or similar, so teardown\n                if (!selection || selection.isCollapsed) {\n                    if (movementStore.isDisposed) {\n                        selectionStore.dispose();\n                    }\n                    return;\n                }\n                let start = this.getIndexOfListElement(selection.anchorNode);\n                let end = this.getIndexOfListElement(selection.focusNode);\n                if (start !== undefined && end !== undefined) {\n                    if (end < start) {\n                        [start, end] = [end, start];\n                    }\n                    this.currentSelectionBounds = { start, end };\n                }\n            }));\n        }));\n        movementStore.add(addDisposableListener(doc, 'mouseup', () => {\n            movementStore.dispose();\n            this.teardownDragAndDropScrollTopAnimation();\n            if (doc.getSelection()?.isCollapsed !== false) {\n                selectionStore.dispose();\n            }\n        }));\n    }\n    getIndexOfListElement(element) {\n        if (!element || !this.domNode.contains(element)) {\n            return undefined;\n        }\n        while (element && element !== this.domNode) {\n            if (element.dataset?.index) {\n                return Number(element.dataset.index);\n            }\n            element = element.parentElement;\n        }\n        return undefined;\n    }\n    onDragOver(event) {\n        event.browserEvent.preventDefault(); // needed so that the drop event fires (https://stackoverflow.com/questions/21339924/drop-event-not-firing-in-chrome)\n        this.onDragLeaveTimeout.dispose();\n        if (StaticDND.CurrentDragAndDropData && StaticDND.CurrentDragAndDropData.getData() === 'vscode-ui') {\n            return false;\n        }\n        this.setupDragAndDropScrollTopAnimation(event.browserEvent);\n        if (!event.browserEvent.dataTransfer) {\n            return false;\n        }\n        // Drag over from outside\n        if (!this.currentDragData) {\n            if (StaticDND.CurrentDragAndDropData) {\n                // Drag over from another list\n                this.currentDragData = StaticDND.CurrentDragAndDropData;\n            }\n            else {\n                // Drag over from the desktop\n                if (!event.browserEvent.dataTransfer.types) {\n                    return false;\n                }\n                this.currentDragData = new NativeDragAndDropData();\n            }\n        }\n        const result = this.dnd.onDragOver(this.currentDragData, event.element, event.index, event.sector, event.browserEvent);\n        this.canDrop = typeof result === 'boolean' ? result : result.accept;\n        if (!this.canDrop) {\n            this.currentDragFeedback = undefined;\n            this.currentDragFeedbackDisposable.dispose();\n            return false;\n        }\n        event.browserEvent.dataTransfer.dropEffect = (typeof result !== 'boolean' && result.effect?.type === 0 /* ListDragOverEffectType.Copy */) ? 'copy' : 'move';\n        let feedback;\n        if (typeof result !== 'boolean' && result.feedback) {\n            feedback = result.feedback;\n        }\n        else {\n            if (typeof event.index === 'undefined') {\n                feedback = [-1];\n            }\n            else {\n                feedback = [event.index];\n            }\n        }\n        // sanitize feedback list\n        feedback = distinct(feedback).filter(i => i >= -1 && i < this.length).sort((a, b) => a - b);\n        feedback = feedback[0] === -1 ? [-1] : feedback;\n        let dragOverEffectPosition = typeof result !== 'boolean' && result.effect && result.effect.position ? result.effect.position : \"drop-target\" /* ListDragOverEffectPosition.Over */;\n        if (equalsDragFeedback(this.currentDragFeedback, feedback) && this.currentDragFeedbackPosition === dragOverEffectPosition) {\n            return true;\n        }\n        this.currentDragFeedback = feedback;\n        this.currentDragFeedbackPosition = dragOverEffectPosition;\n        this.currentDragFeedbackDisposable.dispose();\n        if (feedback[0] === -1) { // entire list feedback\n            this.domNode.classList.add(dragOverEffectPosition);\n            this.rowsContainer.classList.add(dragOverEffectPosition);\n            this.currentDragFeedbackDisposable = toDisposable(() => {\n                this.domNode.classList.remove(dragOverEffectPosition);\n                this.rowsContainer.classList.remove(dragOverEffectPosition);\n            });\n        }\n        else {\n            if (feedback.length > 1 && dragOverEffectPosition !== \"drop-target\" /* ListDragOverEffectPosition.Over */) {\n                throw new Error('Can\\'t use multiple feedbacks with position different than \\'over\\'');\n            }\n            // Make sure there is no flicker when moving between two items\n            // Always use the before feedback if possible\n            if (dragOverEffectPosition === \"drop-target-after\" /* ListDragOverEffectPosition.After */) {\n                if (feedback[0] < this.length - 1) {\n                    feedback[0] += 1;\n                    dragOverEffectPosition = \"drop-target-before\" /* ListDragOverEffectPosition.Before */;\n                }\n            }\n            for (const index of feedback) {\n                const item = this.items[index];\n                item.dropTarget = true;\n                item.row?.domNode.classList.add(dragOverEffectPosition);\n            }\n            this.currentDragFeedbackDisposable = toDisposable(() => {\n                for (const index of feedback) {\n                    const item = this.items[index];\n                    item.dropTarget = false;\n                    item.row?.domNode.classList.remove(dragOverEffectPosition);\n                }\n            });\n        }\n        return true;\n    }\n    onDragLeave(event) {\n        this.onDragLeaveTimeout.dispose();\n        this.onDragLeaveTimeout = disposableTimeout(() => this.clearDragOverFeedback(), 100, this.disposables);\n        if (this.currentDragData) {\n            this.dnd.onDragLeave?.(this.currentDragData, event.element, event.index, event.browserEvent);\n        }\n    }\n    onDrop(event) {\n        if (!this.canDrop) {\n            return;\n        }\n        const dragData = this.currentDragData;\n        this.teardownDragAndDropScrollTopAnimation();\n        this.clearDragOverFeedback();\n        this.domNode.classList.remove('dragging');\n        this.currentDragData = undefined;\n        StaticDND.CurrentDragAndDropData = undefined;\n        if (!dragData || !event.browserEvent.dataTransfer) {\n            return;\n        }\n        event.browserEvent.preventDefault();\n        dragData.update(event.browserEvent.dataTransfer);\n        this.dnd.drop(dragData, event.element, event.index, event.sector, event.browserEvent);\n    }\n    onDragEnd(event) {\n        this.canDrop = false;\n        this.teardownDragAndDropScrollTopAnimation();\n        this.clearDragOverFeedback();\n        this.domNode.classList.remove('dragging');\n        this.currentDragData = undefined;\n        StaticDND.CurrentDragAndDropData = undefined;\n        this.dnd.onDragEnd?.(event);\n    }\n    clearDragOverFeedback() {\n        this.currentDragFeedback = undefined;\n        this.currentDragFeedbackPosition = undefined;\n        this.currentDragFeedbackDisposable.dispose();\n        this.currentDragFeedbackDisposable = Disposable.None;\n    }\n    // DND scroll top animation\n    setupDragAndDropScrollTopAnimation(event) {\n        if (!this.dragOverAnimationDisposable) {\n            const viewTop = getTopLeftOffset(this.domNode).top;\n            this.dragOverAnimationDisposable = animate(getWindow(this.domNode), this.animateDragAndDropScrollTop.bind(this, viewTop));\n        }\n        this.dragOverAnimationStopDisposable.dispose();\n        this.dragOverAnimationStopDisposable = disposableTimeout(() => {\n            if (this.dragOverAnimationDisposable) {\n                this.dragOverAnimationDisposable.dispose();\n                this.dragOverAnimationDisposable = undefined;\n            }\n        }, 1000, this.disposables);\n        this.dragOverMouseY = event.pageY;\n    }\n    animateDragAndDropScrollTop(viewTop) {\n        if (this.dragOverMouseY === undefined) {\n            return;\n        }\n        const diff = this.dragOverMouseY - viewTop;\n        const upperLimit = this.renderHeight - 35;\n        if (diff < 35) {\n            this.scrollTop += Math.max(-14, Math.floor(0.3 * (diff - 35)));\n        }\n        else if (diff > upperLimit) {\n            this.scrollTop += Math.min(14, Math.floor(0.3 * (diff - upperLimit)));\n        }\n    }\n    teardownDragAndDropScrollTopAnimation() {\n        this.dragOverAnimationStopDisposable.dispose();\n        if (this.dragOverAnimationDisposable) {\n            this.dragOverAnimationDisposable.dispose();\n            this.dragOverAnimationDisposable = undefined;\n        }\n    }\n    // Util\n    getTargetSector(browserEvent, targetIndex) {\n        if (targetIndex === undefined) {\n            return undefined;\n        }\n        const relativePosition = browserEvent.offsetY / this.items[targetIndex].size;\n        const sector = Math.floor(relativePosition / 0.25);\n        return clamp(sector, 0, 3);\n    }\n    getItemIndexFromEventTarget(target) {\n        const scrollableElement = this.scrollableElement.getDomNode();\n        let element = target;\n        while ((isHTMLElement(element) || isSVGElement(element)) && element !== this.rowsContainer && scrollableElement.contains(element)) {\n            const rawIndex = element.getAttribute('data-index');\n            if (rawIndex) {\n                const index = Number(rawIndex);\n                if (!isNaN(index)) {\n                    return index;\n                }\n            }\n            element = element.parentElement;\n        }\n        return undefined;\n    }\n    getVisibleRange(renderTop, renderHeight) {\n        return {\n            start: this.rangeMap.indexAt(renderTop),\n            end: this.rangeMap.indexAfter(renderTop + renderHeight - 1)\n        };\n    }\n    getRenderRange(renderTop, renderHeight) {\n        const range = this.getVisibleRange(renderTop, renderHeight);\n        if (this.currentSelectionBounds) {\n            const max = this.rangeMap.count;\n            range.start = Math.min(range.start, this.currentSelectionBounds.start, max);\n            range.end = Math.min(Math.max(range.end, this.currentSelectionBounds.end + 1), max);\n        }\n        return range;\n    }\n    /**\n     * Given a stable rendered state, checks every rendered element whether it needs\n     * to be probed for dynamic height. Adjusts scroll height and top if necessary.\n     */\n    _rerender(renderTop, renderHeight, inSmoothScrolling) {\n        const previousRenderRange = this.getRenderRange(renderTop, renderHeight);\n        // Let's remember the second element's position, this helps in scrolling up\n        // and preserving a linear upwards scroll movement\n        let anchorElementIndex;\n        let anchorElementTopDelta;\n        if (renderTop === this.elementTop(previousRenderRange.start)) {\n            anchorElementIndex = previousRenderRange.start;\n            anchorElementTopDelta = 0;\n        }\n        else if (previousRenderRange.end - previousRenderRange.start > 1) {\n            anchorElementIndex = previousRenderRange.start + 1;\n            anchorElementTopDelta = this.elementTop(anchorElementIndex) - renderTop;\n        }\n        let heightDiff = 0;\n        while (true) {\n            const renderRange = this.getRenderRange(renderTop, renderHeight);\n            let didChange = false;\n            for (let i = renderRange.start; i < renderRange.end; i++) {\n                const diff = this.probeDynamicHeight(i);\n                if (diff !== 0) {\n                    this.rangeMap.splice(i, 1, [this.items[i]]);\n                }\n                heightDiff += diff;\n                didChange = didChange || diff !== 0;\n            }\n            if (!didChange) {\n                if (heightDiff !== 0) {\n                    this.eventuallyUpdateScrollDimensions();\n                }\n                const unrenderRanges = Range.relativeComplement(previousRenderRange, renderRange);\n                for (const range of unrenderRanges) {\n                    for (let i = range.start; i < range.end; i++) {\n                        if (this.items[i].row) {\n                            this.removeItemFromDOM(i);\n                        }\n                    }\n                }\n                const renderRanges = Range.relativeComplement(renderRange, previousRenderRange).reverse();\n                for (const range of renderRanges) {\n                    for (let i = range.end - 1; i >= range.start; i--) {\n                        this.insertItemInDOM(i);\n                    }\n                }\n                for (let i = renderRange.start; i < renderRange.end; i++) {\n                    if (this.items[i].row) {\n                        this.updateItemInDOM(this.items[i], i);\n                    }\n                }\n                if (typeof anchorElementIndex === 'number') {\n                    // To compute a destination scroll top, we need to take into account the current smooth scrolling\n                    // animation, and then reuse it with a new target (to avoid prolonging the scroll)\n                    // See https://github.com/microsoft/vscode/issues/104144\n                    // See https://github.com/microsoft/vscode/pull/104284\n                    // See https://github.com/microsoft/vscode/issues/107704\n                    const deltaScrollTop = this.scrollable.getFutureScrollPosition().scrollTop - renderTop;\n                    const newScrollTop = this.elementTop(anchorElementIndex) - anchorElementTopDelta + deltaScrollTop;\n                    this.setScrollTop(newScrollTop, inSmoothScrolling);\n                }\n                this._onDidChangeContentHeight.fire(this.contentHeight);\n                return;\n            }\n        }\n    }\n    probeDynamicHeight(index) {\n        const item = this.items[index];\n        if (!!this.virtualDelegate.getDynamicHeight) {\n            const newSize = this.virtualDelegate.getDynamicHeight(item.element);\n            if (newSize !== null) {\n                const size = item.size;\n                item.size = newSize;\n                item.lastDynamicHeightWidth = this.renderWidth;\n                return newSize - size;\n            }\n        }\n        if (!item.hasDynamicHeight || item.lastDynamicHeightWidth === this.renderWidth) {\n            return 0;\n        }\n        if (!!this.virtualDelegate.hasDynamicHeight && !this.virtualDelegate.hasDynamicHeight(item.element)) {\n            return 0;\n        }\n        const size = item.size;\n        if (item.row) {\n            item.row.domNode.style.height = '';\n            item.size = item.row.domNode.offsetHeight;\n            if (item.size === 0 && !isAncestor(item.row.domNode, getWindow(item.row.domNode).document.body)) {\n                console.warn('Measuring item node that is not in DOM! Add ListView to the DOM before measuring row height!', new Error().stack);\n            }\n            item.lastDynamicHeightWidth = this.renderWidth;\n            return item.size - size;\n        }\n        const { row } = this.cache.alloc(item.templateId);\n        row.domNode.style.height = '';\n        this.rowsContainer.appendChild(row.domNode);\n        const renderer = this.renderers.get(item.templateId);\n        if (!renderer) {\n            throw new BugIndicatingError('Missing renderer for templateId: ' + item.templateId);\n        }\n        renderer.renderElement(item.element, index, row.templateData);\n        item.size = row.domNode.offsetHeight;\n        renderer.disposeElement?.(item.element, index, row.templateData);\n        this.virtualDelegate.setDynamicHeight?.(item.element, item.size);\n        item.lastDynamicHeightWidth = this.renderWidth;\n        row.domNode.remove();\n        this.cache.release(row);\n        return item.size - size;\n    }\n    getElementDomId(index) {\n        return `${this.domId}_${index}`;\n    }\n    // Dispose\n    dispose() {\n        for (const item of this.items) {\n            item.dragStartDisposable.dispose();\n            item.checkedDisposable.dispose();\n            if (item.row) {\n                const renderer = this.renderers.get(item.row.templateId);\n                if (renderer) {\n                    renderer.disposeElement?.(item.element, -1, item.row.templateData, undefined);\n                    renderer.disposeTemplate(item.row.templateData);\n                }\n            }\n        }\n        this.items = [];\n        this.domNode?.remove();\n        this.dragOverAnimationDisposable?.dispose();\n        this.disposables.dispose();\n    }\n}\n__decorate([\n    memoize\n], ListView.prototype, \"onMouseClick\", null);\n__decorate([\n    memoize\n], ListView.prototype, \"onMouseDblClick\", null);\n__decorate([\n    memoize\n], ListView.prototype, \"onMouseMiddleClick\", null);\n__decorate([\n    memoize\n], ListView.prototype, \"onMouseDown\", null);\n__decorate([\n    memoize\n], ListView.prototype, \"onMouseOver\", null);\n__decorate([\n    memoize\n], ListView.prototype, \"onMouseOut\", null);\n__decorate([\n    memoize\n], ListView.prototype, \"onContextMenu\", null);\n__decorate([\n    memoize\n], ListView.prototype, \"onTouchStart\", null);\n__decorate([\n    memoize\n], ListView.prototype, \"onTap\", null);\n\nexport { ElementsDragAndDropData, ExternalElementsDragAndDropData, ListView, NativeDragAndDropData };\n","import { isEditableElement, EventHelper, getWindow, isHTMLElement, getActiveElement, isMouseEvent } from '../../dom.js';\nimport { createStyleSheet } from '../../domStylesheets.js';\nimport { asCssValueWithDefault } from '../../cssValue.js';\nimport { DomEmitter } from '../../event.js';\nimport { StandardKeyboardEvent } from '../../keyboardEvent.js';\nimport { Gesture } from '../../touch.js';\nimport { alert } from '../aria/aria.js';\nimport { CombinedSpliceable } from './splice.js';\nimport { binarySearch, range } from '../../../common/arrays.js';\nimport { timeout } from '../../../common/async.js';\nimport { Color } from '../../../common/color.js';\nimport { memoize } from '../../../common/decorators.js';\nimport { Emitter, Event, EventBufferer } from '../../../common/event.js';\nimport { matchesPrefix, matchesFuzzy2 } from '../../../common/filters.js';\nimport { dispose, DisposableStore } from '../../../common/lifecycle.js';\nimport { clamp } from '../../../common/numbers.js';\nimport { isMacintosh } from '../../../common/platform.js';\nimport { isNumber } from '../../../common/types.js';\nimport './list.css';\nimport { ListError } from './list.js';\nimport { ListView } from './listView.js';\nimport { StandardMouseEvent } from '../../mouseEvent.js';\nimport '../../../common/observableInternal/index.js';\nimport { constObservable } from '../../../common/observableInternal/observables/constObservable.js';\nimport { autorun } from '../../../common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nclass TraitRenderer {\n    constructor(trait) {\n        this.trait = trait;\n        this.renderedElements = [];\n    }\n    get templateId() {\n        return `template:${this.trait.name}`;\n    }\n    renderTemplate(container) {\n        return container;\n    }\n    renderElement(element, index, templateData) {\n        const renderedElementIndex = this.renderedElements.findIndex(el => el.templateData === templateData);\n        if (renderedElementIndex >= 0) {\n            const rendered = this.renderedElements[renderedElementIndex];\n            this.trait.unrender(templateData);\n            rendered.index = index;\n        }\n        else {\n            const rendered = { index, templateData };\n            this.renderedElements.push(rendered);\n        }\n        this.trait.renderIndex(index, templateData);\n    }\n    splice(start, deleteCount, insertCount) {\n        const rendered = [];\n        for (const renderedElement of this.renderedElements) {\n            if (renderedElement.index < start) {\n                rendered.push(renderedElement);\n            }\n            else if (renderedElement.index >= start + deleteCount) {\n                rendered.push({\n                    index: renderedElement.index + insertCount - deleteCount,\n                    templateData: renderedElement.templateData\n                });\n            }\n        }\n        this.renderedElements = rendered;\n    }\n    renderIndexes(indexes) {\n        for (const { index, templateData } of this.renderedElements) {\n            if (indexes.indexOf(index) > -1) {\n                this.trait.renderIndex(index, templateData);\n            }\n        }\n    }\n    disposeTemplate(templateData) {\n        const index = this.renderedElements.findIndex(el => el.templateData === templateData);\n        if (index < 0) {\n            return;\n        }\n        this.renderedElements.splice(index, 1);\n    }\n}\nclass Trait {\n    get onChange() { return this._onChange.event; }\n    get name() { return this._trait; }\n    get renderer() {\n        return new TraitRenderer(this);\n    }\n    constructor(_trait) {\n        this._trait = _trait;\n        this.indexes = [];\n        this.sortedIndexes = [];\n        this._onChange = new Emitter();\n    }\n    splice(start, deleteCount, elements) {\n        const diff = elements.length - deleteCount;\n        const end = start + deleteCount;\n        const sortedIndexes = [];\n        let i = 0;\n        while (i < this.sortedIndexes.length && this.sortedIndexes[i] < start) {\n            sortedIndexes.push(this.sortedIndexes[i++]);\n        }\n        for (let j = 0; j < elements.length; j++) {\n            if (elements[j]) {\n                sortedIndexes.push(j + start);\n            }\n        }\n        while (i < this.sortedIndexes.length && this.sortedIndexes[i] >= end) {\n            sortedIndexes.push(this.sortedIndexes[i++] + diff);\n        }\n        this.renderer.splice(start, deleteCount, elements.length);\n        this._set(sortedIndexes, sortedIndexes);\n    }\n    renderIndex(index, container) {\n        container.classList.toggle(this._trait, this.contains(index));\n    }\n    unrender(container) {\n        container.classList.remove(this._trait);\n    }\n    /**\n     * Sets the indexes which should have this trait.\n     *\n     * @param indexes Indexes which should have this trait.\n     * @return The old indexes which had this trait.\n     */\n    set(indexes, browserEvent) {\n        return this._set(indexes, [...indexes].sort(numericSort), browserEvent);\n    }\n    _set(indexes, sortedIndexes, browserEvent) {\n        const result = this.indexes;\n        const sortedResult = this.sortedIndexes;\n        this.indexes = indexes;\n        this.sortedIndexes = sortedIndexes;\n        const toRender = disjunction(sortedResult, indexes);\n        this.renderer.renderIndexes(toRender);\n        this._onChange.fire({ indexes, browserEvent });\n        return result;\n    }\n    get() {\n        return this.indexes;\n    }\n    contains(index) {\n        return binarySearch(this.sortedIndexes, index, numericSort) >= 0;\n    }\n    dispose() {\n        dispose(this._onChange);\n    }\n}\n__decorate([\n    memoize\n], Trait.prototype, \"renderer\", null);\nclass SelectionTrait extends Trait {\n    constructor(setAriaSelected) {\n        super('selected');\n        this.setAriaSelected = setAriaSelected;\n    }\n    renderIndex(index, container) {\n        super.renderIndex(index, container);\n        if (this.setAriaSelected) {\n            if (this.contains(index)) {\n                container.setAttribute('aria-selected', 'true');\n            }\n            else {\n                container.setAttribute('aria-selected', 'false');\n            }\n        }\n    }\n}\n/**\n * The TraitSpliceable is used as a util class to be able\n * to preserve traits across splice calls, given an identity\n * provider.\n */\nclass TraitSpliceable {\n    constructor(trait, view, identityProvider) {\n        this.trait = trait;\n        this.view = view;\n        this.identityProvider = identityProvider;\n    }\n    splice(start, deleteCount, elements) {\n        if (!this.identityProvider) {\n            return this.trait.splice(start, deleteCount, new Array(elements.length).fill(false));\n        }\n        const pastElementsWithTrait = this.trait.get().map(i => this.identityProvider.getId(this.view.element(i)).toString());\n        if (pastElementsWithTrait.length === 0) {\n            return this.trait.splice(start, deleteCount, new Array(elements.length).fill(false));\n        }\n        const pastElementsWithTraitSet = new Set(pastElementsWithTrait);\n        const elementsWithTrait = elements.map(e => pastElementsWithTraitSet.has(this.identityProvider.getId(e).toString()));\n        this.trait.splice(start, deleteCount, elementsWithTrait);\n    }\n}\nfunction isListElementDescendantOfClass(e, className) {\n    if (e.classList.contains(className)) {\n        return true;\n    }\n    if (e.classList.contains('monaco-list')) {\n        return false;\n    }\n    if (!e.parentElement) {\n        return false;\n    }\n    return isListElementDescendantOfClass(e.parentElement, className);\n}\nfunction isMonacoEditor(e) {\n    return isListElementDescendantOfClass(e, 'monaco-editor');\n}\nfunction isMonacoCustomToggle(e) {\n    return isListElementDescendantOfClass(e, 'monaco-custom-toggle');\n}\nfunction isActionItem(e) {\n    return isListElementDescendantOfClass(e, 'action-item');\n}\nfunction isStickyScrollElement(e) {\n    return isListElementDescendantOfClass(e, 'monaco-tree-sticky-row');\n}\nfunction isStickyScrollContainer(e) {\n    return e.classList.contains('monaco-tree-sticky-container');\n}\nfunction isButton(e) {\n    if ((e.tagName === 'A' && e.classList.contains('monaco-button')) ||\n        (e.tagName === 'DIV' && e.classList.contains('monaco-button-dropdown'))) {\n        return true;\n    }\n    if (e.classList.contains('monaco-list')) {\n        return false;\n    }\n    if (!e.parentElement) {\n        return false;\n    }\n    return isButton(e.parentElement);\n}\nclass KeyboardController {\n    get onKeyDown() {\n        return Event.chain(this.disposables.add(new DomEmitter(this.view.domNode, 'keydown')).event, $ => $.filter(e => !isEditableElement(e.target))\n            .map(e => new StandardKeyboardEvent(e)));\n    }\n    constructor(list, view, options) {\n        this.list = list;\n        this.view = view;\n        this.disposables = new DisposableStore();\n        this.multipleSelectionDisposables = new DisposableStore();\n        this.multipleSelectionSupport = options.multipleSelectionSupport;\n        this.disposables.add(this.onKeyDown(e => {\n            switch (e.keyCode) {\n                case 3 /* KeyCode.Enter */:\n                    return this.onEnter(e);\n                case 16 /* KeyCode.UpArrow */:\n                    return this.onUpArrow(e);\n                case 18 /* KeyCode.DownArrow */:\n                    return this.onDownArrow(e);\n                case 11 /* KeyCode.PageUp */:\n                    return this.onPageUpArrow(e);\n                case 12 /* KeyCode.PageDown */:\n                    return this.onPageDownArrow(e);\n                case 9 /* KeyCode.Escape */:\n                    return this.onEscape(e);\n                case 31 /* KeyCode.KeyA */:\n                    if (this.multipleSelectionSupport && (isMacintosh ? e.metaKey : e.ctrlKey)) {\n                        this.onCtrlA(e);\n                    }\n            }\n        }));\n    }\n    updateOptions(optionsUpdate) {\n        if (optionsUpdate.multipleSelectionSupport !== undefined) {\n            this.multipleSelectionSupport = optionsUpdate.multipleSelectionSupport;\n        }\n    }\n    onEnter(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        this.list.setSelection(this.list.getFocus(), e.browserEvent);\n    }\n    onUpArrow(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        this.list.focusPrevious(1, false, e.browserEvent);\n        const el = this.list.getFocus()[0];\n        this.list.setAnchor(el);\n        this.list.reveal(el);\n        this.view.domNode.focus();\n    }\n    onDownArrow(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        this.list.focusNext(1, false, e.browserEvent);\n        const el = this.list.getFocus()[0];\n        this.list.setAnchor(el);\n        this.list.reveal(el);\n        this.view.domNode.focus();\n    }\n    onPageUpArrow(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        this.list.focusPreviousPage(e.browserEvent);\n        const el = this.list.getFocus()[0];\n        this.list.setAnchor(el);\n        this.list.reveal(el);\n        this.view.domNode.focus();\n    }\n    onPageDownArrow(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        this.list.focusNextPage(e.browserEvent);\n        const el = this.list.getFocus()[0];\n        this.list.setAnchor(el);\n        this.list.reveal(el);\n        this.view.domNode.focus();\n    }\n    onCtrlA(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        this.list.setSelection(range(this.list.length), e.browserEvent);\n        this.list.setAnchor(undefined);\n        this.view.domNode.focus();\n    }\n    onEscape(e) {\n        if (this.list.getSelection().length) {\n            e.preventDefault();\n            e.stopPropagation();\n            this.list.setSelection([], e.browserEvent);\n            this.list.setAnchor(undefined);\n            this.view.domNode.focus();\n        }\n    }\n    dispose() {\n        this.disposables.dispose();\n        this.multipleSelectionDisposables.dispose();\n    }\n}\n__decorate([\n    memoize\n], KeyboardController.prototype, \"onKeyDown\", null);\nvar TypeNavigationMode;\n(function (TypeNavigationMode) {\n    TypeNavigationMode[TypeNavigationMode[\"Automatic\"] = 0] = \"Automatic\";\n    TypeNavigationMode[TypeNavigationMode[\"Trigger\"] = 1] = \"Trigger\";\n})(TypeNavigationMode || (TypeNavigationMode = {}));\nvar TypeNavigationControllerState;\n(function (TypeNavigationControllerState) {\n    TypeNavigationControllerState[TypeNavigationControllerState[\"Idle\"] = 0] = \"Idle\";\n    TypeNavigationControllerState[TypeNavigationControllerState[\"Typing\"] = 1] = \"Typing\";\n})(TypeNavigationControllerState || (TypeNavigationControllerState = {}));\nconst DefaultKeyboardNavigationDelegate = new class {\n    mightProducePrintableCharacter(event) {\n        if (event.ctrlKey || event.metaKey || event.altKey) {\n            return false;\n        }\n        return (event.keyCode >= 31 /* KeyCode.KeyA */ && event.keyCode <= 56 /* KeyCode.KeyZ */)\n            || (event.keyCode >= 21 /* KeyCode.Digit0 */ && event.keyCode <= 30 /* KeyCode.Digit9 */)\n            || (event.keyCode >= 98 /* KeyCode.Numpad0 */ && event.keyCode <= 107 /* KeyCode.Numpad9 */)\n            || (event.keyCode >= 85 /* KeyCode.Semicolon */ && event.keyCode <= 95 /* KeyCode.Quote */);\n    }\n};\nclass TypeNavigationController {\n    constructor(list, view, keyboardNavigationLabelProvider, keyboardNavigationEventFilter, delegate) {\n        this.list = list;\n        this.view = view;\n        this.keyboardNavigationLabelProvider = keyboardNavigationLabelProvider;\n        this.keyboardNavigationEventFilter = keyboardNavigationEventFilter;\n        this.delegate = delegate;\n        this.enabled = false;\n        this.state = TypeNavigationControllerState.Idle;\n        this.mode = TypeNavigationMode.Automatic;\n        this.triggered = false;\n        this.previouslyFocused = -1;\n        this.enabledDisposables = new DisposableStore();\n        this.disposables = new DisposableStore();\n        this.updateOptions(list.options);\n    }\n    updateOptions(options) {\n        if (options.typeNavigationEnabled ?? true) {\n            this.enable();\n        }\n        else {\n            this.disable();\n        }\n        this.mode = options.typeNavigationMode ?? TypeNavigationMode.Automatic;\n    }\n    enable() {\n        if (this.enabled) {\n            return;\n        }\n        let typing = false;\n        const onChar = Event.chain(this.enabledDisposables.add(new DomEmitter(this.view.domNode, 'keydown')).event, $ => $.filter(e => !isEditableElement(e.target))\n            .filter(() => this.mode === TypeNavigationMode.Automatic || this.triggered)\n            .map(event => new StandardKeyboardEvent(event))\n            .filter(e => typing || this.keyboardNavigationEventFilter(e))\n            .filter(e => this.delegate.mightProducePrintableCharacter(e))\n            .forEach(e => EventHelper.stop(e, true))\n            .map(event => event.browserEvent.key));\n        const onClear = Event.debounce(onChar, () => null, 800, undefined, undefined, undefined, this.enabledDisposables);\n        const onInput = Event.reduce(Event.any(onChar, onClear), (r, i) => i === null ? null : ((r || '') + i), undefined, this.enabledDisposables);\n        onInput(this.onInput, this, this.enabledDisposables);\n        onClear(this.onClear, this, this.enabledDisposables);\n        onChar(() => typing = true, undefined, this.enabledDisposables);\n        onClear(() => typing = false, undefined, this.enabledDisposables);\n        this.enabled = true;\n        this.triggered = false;\n    }\n    disable() {\n        if (!this.enabled) {\n            return;\n        }\n        this.enabledDisposables.clear();\n        this.enabled = false;\n        this.triggered = false;\n    }\n    onClear() {\n        const focus = this.list.getFocus();\n        if (focus.length > 0 && focus[0] === this.previouslyFocused) {\n            // List: re-announce element on typing end since typed keys will interrupt aria label of focused element\n            // Do not announce if there was a focus change at the end to prevent duplication https://github.com/microsoft/vscode/issues/95961\n            const ariaLabel = this.list.options.accessibilityProvider?.getAriaLabel(this.list.element(focus[0]));\n            if (typeof ariaLabel === 'string') {\n                alert(ariaLabel);\n            }\n            else if (ariaLabel) {\n                alert(ariaLabel.get());\n            }\n        }\n        this.previouslyFocused = -1;\n    }\n    onInput(word) {\n        if (!word) {\n            this.state = TypeNavigationControllerState.Idle;\n            this.triggered = false;\n            return;\n        }\n        const focus = this.list.getFocus();\n        const start = focus.length > 0 ? focus[0] : 0;\n        const delta = this.state === TypeNavigationControllerState.Idle ? 1 : 0;\n        this.state = TypeNavigationControllerState.Typing;\n        for (let i = 0; i < this.list.length; i++) {\n            const index = (start + i + delta) % this.list.length;\n            const label = this.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(this.view.element(index));\n            const labelStr = label && label.toString();\n            if (this.list.options.typeNavigationEnabled) {\n                if (typeof labelStr !== 'undefined') {\n                    // If prefix is found, focus and return early\n                    if (matchesPrefix(word, labelStr)) {\n                        this.previouslyFocused = start;\n                        this.list.setFocus([index]);\n                        this.list.reveal(index);\n                        return;\n                    }\n                    const fuzzy = matchesFuzzy2(word, labelStr);\n                    if (fuzzy) {\n                        const fuzzyScore = fuzzy[0].end - fuzzy[0].start;\n                        // ensures that when fuzzy matching, doesn't clash with prefix matching (1 input vs 1+ should be prefix and fuzzy respecitvely). Also makes sure that exact matches are prioritized.\n                        if (fuzzyScore > 1 && fuzzy.length === 1) {\n                            this.previouslyFocused = start;\n                            this.list.setFocus([index]);\n                            this.list.reveal(index);\n                            return;\n                        }\n                    }\n                }\n            }\n            else if (typeof labelStr === 'undefined' || matchesPrefix(word, labelStr)) {\n                this.previouslyFocused = start;\n                this.list.setFocus([index]);\n                this.list.reveal(index);\n                return;\n            }\n        }\n    }\n    dispose() {\n        this.disable();\n        this.enabledDisposables.dispose();\n        this.disposables.dispose();\n    }\n}\nclass DOMFocusController {\n    constructor(list, view) {\n        this.list = list;\n        this.view = view;\n        this.disposables = new DisposableStore();\n        const onKeyDown = Event.chain(this.disposables.add(new DomEmitter(view.domNode, 'keydown')).event, $ => $\n            .filter(e => !isEditableElement(e.target))\n            .map(e => new StandardKeyboardEvent(e)));\n        const onTab = Event.chain(onKeyDown, $ => $.filter(e => e.keyCode === 2 /* KeyCode.Tab */ && !e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey));\n        onTab(this.onTab, this, this.disposables);\n    }\n    onTab(e) {\n        if (e.target !== this.view.domNode) {\n            return;\n        }\n        const focus = this.list.getFocus();\n        if (focus.length === 0) {\n            return;\n        }\n        const focusedDomElement = this.view.domElement(focus[0]);\n        if (!focusedDomElement) {\n            return;\n        }\n        // eslint-disable-next-line no-restricted-syntax\n        const tabIndexElement = focusedDomElement.querySelector('[tabIndex]');\n        if (!tabIndexElement || !(isHTMLElement(tabIndexElement)) || tabIndexElement.tabIndex === -1) {\n            return;\n        }\n        const style = getWindow(tabIndexElement).getComputedStyle(tabIndexElement);\n        if (style.visibility === 'hidden' || style.display === 'none') {\n            return;\n        }\n        e.preventDefault();\n        e.stopPropagation();\n        tabIndexElement.focus();\n    }\n    dispose() {\n        this.disposables.dispose();\n    }\n}\nfunction isSelectionSingleChangeEvent(event) {\n    return isMacintosh ? event.browserEvent.metaKey : event.browserEvent.ctrlKey;\n}\nfunction isSelectionRangeChangeEvent(event) {\n    return event.browserEvent.shiftKey;\n}\nfunction isMouseRightClick(event) {\n    return isMouseEvent(event) && event.button === 2;\n}\nconst DefaultMultipleSelectionController = {\n    isSelectionSingleChangeEvent,\n    isSelectionRangeChangeEvent\n};\nclass MouseController {\n    get onPointer() { return this._onPointer.event; }\n    constructor(list) {\n        this.list = list;\n        this.disposables = new DisposableStore();\n        this._onPointer = this.disposables.add(new Emitter());\n        if (list.options.multipleSelectionSupport !== false) {\n            this.multipleSelectionController = this.list.options.multipleSelectionController || DefaultMultipleSelectionController;\n        }\n        this.mouseSupport = typeof list.options.mouseSupport === 'undefined' || !!list.options.mouseSupport;\n        if (this.mouseSupport) {\n            list.onMouseDown(this.onMouseDown, this, this.disposables);\n            list.onContextMenu(this.onContextMenu, this, this.disposables);\n            list.onMouseDblClick(this.onDoubleClick, this, this.disposables);\n            list.onTouchStart(this.onMouseDown, this, this.disposables);\n            this.disposables.add(Gesture.addTarget(list.getHTMLElement()));\n        }\n        Event.any(list.onMouseClick, list.onMouseMiddleClick, list.onTap)(this.onViewPointer, this, this.disposables);\n    }\n    updateOptions(optionsUpdate) {\n        if (optionsUpdate.multipleSelectionSupport !== undefined) {\n            this.multipleSelectionController = undefined;\n            if (optionsUpdate.multipleSelectionSupport) {\n                this.multipleSelectionController = this.list.options.multipleSelectionController || DefaultMultipleSelectionController;\n            }\n        }\n    }\n    isSelectionSingleChangeEvent(event) {\n        if (!this.multipleSelectionController) {\n            return false;\n        }\n        return this.multipleSelectionController.isSelectionSingleChangeEvent(event);\n    }\n    isSelectionRangeChangeEvent(event) {\n        if (!this.multipleSelectionController) {\n            return false;\n        }\n        return this.multipleSelectionController.isSelectionRangeChangeEvent(event);\n    }\n    isSelectionChangeEvent(event) {\n        return this.isSelectionSingleChangeEvent(event) || this.isSelectionRangeChangeEvent(event);\n    }\n    onMouseDown(e) {\n        if (isMonacoEditor(e.browserEvent.target)) {\n            return;\n        }\n        if (getActiveElement() !== e.browserEvent.target) {\n            this.list.domFocus();\n        }\n    }\n    onContextMenu(e) {\n        if (isEditableElement(e.browserEvent.target) || isMonacoEditor(e.browserEvent.target)) {\n            return;\n        }\n        const focus = typeof e.index === 'undefined' ? [] : [e.index];\n        this.list.setFocus(focus, e.browserEvent);\n    }\n    onViewPointer(e) {\n        if (!this.mouseSupport) {\n            return;\n        }\n        if (isEditableElement(e.browserEvent.target) || isMonacoEditor(e.browserEvent.target)) {\n            return;\n        }\n        if (e.browserEvent.isHandledByList) {\n            return;\n        }\n        e.browserEvent.isHandledByList = true;\n        const focus = e.index;\n        if (typeof focus === 'undefined') {\n            this.list.setFocus([], e.browserEvent);\n            this.list.setSelection([], e.browserEvent);\n            this.list.setAnchor(undefined);\n            return;\n        }\n        if (this.isSelectionChangeEvent(e)) {\n            return this.changeSelection(e);\n        }\n        this.list.setFocus([focus], e.browserEvent);\n        this.list.setAnchor(focus);\n        if (!isMouseRightClick(e.browserEvent)) {\n            this.list.setSelection([focus], e.browserEvent);\n        }\n        this._onPointer.fire(e);\n    }\n    onDoubleClick(e) {\n        if (isEditableElement(e.browserEvent.target) || isMonacoEditor(e.browserEvent.target)) {\n            return;\n        }\n        if (this.isSelectionChangeEvent(e)) {\n            return;\n        }\n        if (e.browserEvent.isHandledByList) {\n            return;\n        }\n        e.browserEvent.isHandledByList = true;\n        const focus = this.list.getFocus();\n        this.list.setSelection(focus, e.browserEvent);\n    }\n    changeSelection(e) {\n        const focus = e.index;\n        let anchor = this.list.getAnchor();\n        if (this.isSelectionRangeChangeEvent(e)) {\n            if (typeof anchor === 'undefined') {\n                const currentFocus = this.list.getFocus()[0];\n                anchor = currentFocus ?? focus;\n                this.list.setAnchor(anchor);\n            }\n            const min = Math.min(anchor, focus);\n            const max = Math.max(anchor, focus);\n            const rangeSelection = range(min, max + 1);\n            const selection = this.list.getSelection();\n            const contiguousRange = getContiguousRangeContaining(disjunction(selection, [anchor]), anchor);\n            if (contiguousRange.length === 0) {\n                return;\n            }\n            const newSelection = disjunction(rangeSelection, relativeComplement(selection, contiguousRange));\n            this.list.setSelection(newSelection, e.browserEvent);\n            this.list.setFocus([focus], e.browserEvent);\n        }\n        else if (this.isSelectionSingleChangeEvent(e)) {\n            const selection = this.list.getSelection();\n            const newSelection = selection.filter(i => i !== focus);\n            this.list.setFocus([focus]);\n            this.list.setAnchor(focus);\n            if (selection.length === newSelection.length) {\n                this.list.setSelection([...newSelection, focus], e.browserEvent);\n            }\n            else {\n                this.list.setSelection(newSelection, e.browserEvent);\n            }\n        }\n    }\n    dispose() {\n        this.disposables.dispose();\n    }\n}\nclass DefaultStyleController {\n    constructor(styleElement, selectorSuffix) {\n        this.styleElement = styleElement;\n        this.selectorSuffix = selectorSuffix;\n    }\n    style(styles) {\n        const suffix = this.selectorSuffix && `.${this.selectorSuffix}`;\n        const content = [];\n        if (styles.listBackground) {\n            content.push(`.monaco-list${suffix} .monaco-list-rows { background: ${styles.listBackground}; }`);\n        }\n        if (styles.listFocusBackground) {\n            content.push(`.monaco-list${suffix}:focus .monaco-list-row.focused { background-color: ${styles.listFocusBackground}; }`);\n            content.push(`.monaco-list${suffix}:focus .monaco-list-row.focused:hover { background-color: ${styles.listFocusBackground}; }`); // overwrite :hover style in this case!\n        }\n        if (styles.listFocusForeground) {\n            content.push(`.monaco-list${suffix}:focus .monaco-list-row.focused { color: ${styles.listFocusForeground}; }`);\n        }\n        if (styles.listActiveSelectionBackground) {\n            content.push(`.monaco-list${suffix}:focus .monaco-list-row.selected { background-color: ${styles.listActiveSelectionBackground}; }`);\n            content.push(`.monaco-list${suffix}:focus .monaco-list-row.selected:hover { background-color: ${styles.listActiveSelectionBackground}; }`); // overwrite :hover style in this case!\n        }\n        if (styles.listActiveSelectionForeground) {\n            content.push(`.monaco-list${suffix}:focus .monaco-list-row.selected { color: ${styles.listActiveSelectionForeground}; }`);\n        }\n        if (styles.listActiveSelectionIconForeground) {\n            content.push(`.monaco-list${suffix}:focus .monaco-list-row.selected .codicon { color: ${styles.listActiveSelectionIconForeground}; }`);\n        }\n        if (styles.listFocusAndSelectionBackground) {\n            content.push(`\n\t\t\t\t.monaco-drag-image${suffix},\n\t\t\t\t.monaco-list${suffix}:focus .monaco-list-row.selected.focused { background-color: ${styles.listFocusAndSelectionBackground}; }\n\t\t\t`);\n        }\n        if (styles.listFocusAndSelectionForeground) {\n            content.push(`\n\t\t\t\t.monaco-drag-image${suffix},\n\t\t\t\t.monaco-list${suffix}:focus .monaco-list-row.selected.focused { color: ${styles.listFocusAndSelectionForeground}; }\n\t\t\t`);\n        }\n        if (styles.listInactiveFocusForeground) {\n            content.push(`.monaco-list${suffix} .monaco-list-row.focused { color:  ${styles.listInactiveFocusForeground}; }`);\n            content.push(`.monaco-list${suffix} .monaco-list-row.focused:hover { color:  ${styles.listInactiveFocusForeground}; }`); // overwrite :hover style in this case!\n        }\n        if (styles.listInactiveSelectionIconForeground) {\n            content.push(`.monaco-list${suffix} .monaco-list-row.focused .codicon { color:  ${styles.listInactiveSelectionIconForeground}; }`);\n        }\n        if (styles.listInactiveFocusBackground) {\n            content.push(`.monaco-list${suffix} .monaco-list-row.focused { background-color:  ${styles.listInactiveFocusBackground}; }`);\n            content.push(`.monaco-list${suffix} .monaco-list-row.focused:hover { background-color:  ${styles.listInactiveFocusBackground}; }`); // overwrite :hover style in this case!\n        }\n        if (styles.listInactiveSelectionBackground) {\n            content.push(`.monaco-list${suffix} .monaco-list-row.selected { background-color:  ${styles.listInactiveSelectionBackground}; }`);\n            content.push(`.monaco-list${suffix} .monaco-list-row.selected:hover { background-color:  ${styles.listInactiveSelectionBackground}; }`); // overwrite :hover style in this case!\n        }\n        if (styles.listInactiveSelectionForeground) {\n            content.push(`.monaco-list${suffix} .monaco-list-row.selected { color: ${styles.listInactiveSelectionForeground}; }`);\n        }\n        if (styles.listHoverBackground) {\n            content.push(`.monaco-list${suffix}:not(.drop-target):not(.dragging) .monaco-list-row:hover:not(.selected):not(.focused) { background-color: ${styles.listHoverBackground}; }`);\n        }\n        if (styles.listHoverForeground) {\n            content.push(`.monaco-list${suffix}:not(.drop-target):not(.dragging) .monaco-list-row:hover:not(.selected):not(.focused) { color:  ${styles.listHoverForeground}; }`);\n        }\n        /**\n         * Outlines\n         */\n        const focusAndSelectionOutline = asCssValueWithDefault(styles.listFocusAndSelectionOutline, asCssValueWithDefault(styles.listSelectionOutline, styles.listFocusOutline ?? ''));\n        if (focusAndSelectionOutline) { // default: listFocusOutline\n            content.push(`.monaco-list${suffix}:focus .monaco-list-row.focused.selected { outline: 1px solid ${focusAndSelectionOutline}; outline-offset: -1px;}`);\n        }\n        if (styles.listFocusOutline) { // default: set\n            content.push(`\n\t\t\t\t.monaco-drag-image${suffix},\n\t\t\t\t.monaco-list${suffix}:focus .monaco-list-row.focused,\n\t\t\t\t.context-menu-visible .monaco-list${suffix}.last-focused .monaco-list-row.focused { outline: 1px solid ${styles.listFocusOutline}; outline-offset: -1px; }\n\t\t\t`);\n        }\n        const inactiveFocusAndSelectionOutline = asCssValueWithDefault(styles.listSelectionOutline, styles.listInactiveFocusOutline ?? '');\n        if (inactiveFocusAndSelectionOutline) {\n            content.push(`.monaco-list${suffix} .monaco-list-row.focused.selected { outline: 1px dotted ${inactiveFocusAndSelectionOutline}; outline-offset: -1px; }`);\n        }\n        if (styles.listSelectionOutline) { // default: activeContrastBorder\n            content.push(`.monaco-list${suffix} .monaco-list-row.selected { outline: 1px dotted ${styles.listSelectionOutline}; outline-offset: -1px; }`);\n        }\n        if (styles.listInactiveFocusOutline) { // default: null\n            content.push(`.monaco-list${suffix} .monaco-list-row.focused { outline: 1px dotted ${styles.listInactiveFocusOutline}; outline-offset: -1px; }`);\n        }\n        if (styles.listHoverOutline) { // default: activeContrastBorder\n            content.push(`.monaco-list${suffix} .monaco-list-row:hover { outline: 1px dashed ${styles.listHoverOutline}; outline-offset: -1px; }`);\n        }\n        if (styles.listDropOverBackground) {\n            content.push(`\n\t\t\t\t.monaco-list${suffix}.drop-target,\n\t\t\t\t.monaco-list${suffix} .monaco-list-rows.drop-target,\n\t\t\t\t.monaco-list${suffix} .monaco-list-row.drop-target { background-color: ${styles.listDropOverBackground} !important; color: inherit !important; }\n\t\t\t`);\n        }\n        if (styles.listDropBetweenBackground) {\n            content.push(`\n\t\t\t.monaco-list${suffix} .monaco-list-rows.drop-target-before .monaco-list-row:first-child::before,\n\t\t\t.monaco-list${suffix} .monaco-list-row.drop-target-before::before {\n\t\t\t\tcontent: \"\"; position: absolute; top: 0px; left: 0px; width: 100%; height: 1px;\n\t\t\t\tbackground-color: ${styles.listDropBetweenBackground};\n\t\t\t}`);\n            content.push(`\n\t\t\t.monaco-list${suffix} .monaco-list-rows.drop-target-after .monaco-list-row:last-child::after,\n\t\t\t.monaco-list${suffix} .monaco-list-row.drop-target-after::after {\n\t\t\t\tcontent: \"\"; position: absolute; bottom: 0px; left: 0px; width: 100%; height: 1px;\n\t\t\t\tbackground-color: ${styles.listDropBetweenBackground};\n\t\t\t}`);\n        }\n        if (styles.tableColumnsBorder) {\n            content.push(`\n\t\t\t\t.monaco-table > .monaco-split-view2,\n\t\t\t\t.monaco-table > .monaco-split-view2 .monaco-sash.vertical::before,\n\t\t\t\t.monaco-enable-motion .monaco-table:hover > .monaco-split-view2,\n\t\t\t\t.monaco-enable-motion .monaco-table:hover > .monaco-split-view2 .monaco-sash.vertical::before {\n\t\t\t\t\tborder-color: ${styles.tableColumnsBorder};\n\t\t\t\t}\n\n\t\t\t\t.monaco-enable-motion .monaco-table > .monaco-split-view2,\n\t\t\t\t.monaco-enable-motion .monaco-table > .monaco-split-view2 .monaco-sash.vertical::before {\n\t\t\t\t\tborder-color: transparent;\n\t\t\t\t}\n\t\t\t`);\n        }\n        if (styles.tableOddRowsBackgroundColor) {\n            content.push(`\n\t\t\t\t.monaco-table .monaco-list-row[data-parity=odd]:not(.focused):not(.selected):not(:hover) .monaco-table-tr,\n\t\t\t\t.monaco-table .monaco-list:not(:focus) .monaco-list-row[data-parity=odd].focused:not(.selected):not(:hover) .monaco-table-tr,\n\t\t\t\t.monaco-table .monaco-list:not(.focused) .monaco-list-row[data-parity=odd].focused:not(.selected):not(:hover) .monaco-table-tr {\n\t\t\t\t\tbackground-color: ${styles.tableOddRowsBackgroundColor};\n\t\t\t\t}\n\t\t\t`);\n        }\n        this.styleElement.textContent = content.join('\\n');\n    }\n}\nconst unthemedListStyles = {\n    listFocusBackground: '#7FB0D0',\n    listActiveSelectionBackground: '#0E639C',\n    listActiveSelectionForeground: '#FFFFFF',\n    listActiveSelectionIconForeground: '#FFFFFF',\n    listFocusAndSelectionOutline: '#90C2F9',\n    listFocusAndSelectionBackground: '#094771',\n    listFocusAndSelectionForeground: '#FFFFFF',\n    listInactiveSelectionBackground: '#3F3F46',\n    listInactiveSelectionIconForeground: '#FFFFFF',\n    listHoverBackground: '#2A2D2E',\n    listDropOverBackground: '#383B3D',\n    listDropBetweenBackground: '#EEEEEE',\n    treeIndentGuidesStroke: '#a9a9a9',\n    treeInactiveIndentGuidesStroke: Color.fromHex('#a9a9a9').transparent(0.4).toString(),\n    tableColumnsBorder: Color.fromHex('#cccccc').transparent(0.2).toString(),\n    tableOddRowsBackgroundColor: Color.fromHex('#cccccc').transparent(0.04).toString(),\n    listBackground: undefined,\n    listFocusForeground: undefined,\n    listInactiveSelectionForeground: undefined,\n    listInactiveFocusForeground: undefined,\n    listInactiveFocusBackground: undefined,\n    listHoverForeground: undefined,\n    listFocusOutline: undefined,\n    listInactiveFocusOutline: undefined,\n    listSelectionOutline: undefined,\n    listHoverOutline: undefined,\n    treeStickyScrollBackground: undefined,\n    treeStickyScrollBorder: undefined,\n    treeStickyScrollShadow: undefined\n};\nconst DefaultOptions = {\n    keyboardSupport: true,\n    mouseSupport: true,\n    multipleSelectionSupport: true,\n    dnd: {\n        getDragURI() { return null; },\n        onDragStart() { },\n        onDragOver() { return false; },\n        drop() { },\n        dispose() { }\n    }\n};\n// TODO@Joao: move these utils into a SortedArray class\nfunction getContiguousRangeContaining(range, value) {\n    const index = range.indexOf(value);\n    if (index === -1) {\n        return [];\n    }\n    const result = [];\n    let i = index - 1;\n    while (i >= 0 && range[i] === value - (index - i)) {\n        result.push(range[i--]);\n    }\n    result.reverse();\n    i = index;\n    while (i < range.length && range[i] === value + (i - index)) {\n        result.push(range[i++]);\n    }\n    return result;\n}\n/**\n * Given two sorted collections of numbers, returns the intersection\n * between them (OR).\n */\nfunction disjunction(one, other) {\n    const result = [];\n    let i = 0, j = 0;\n    while (i < one.length || j < other.length) {\n        if (i >= one.length) {\n            result.push(other[j++]);\n        }\n        else if (j >= other.length) {\n            result.push(one[i++]);\n        }\n        else if (one[i] === other[j]) {\n            result.push(one[i]);\n            i++;\n            j++;\n            continue;\n        }\n        else if (one[i] < other[j]) {\n            result.push(one[i++]);\n        }\n        else {\n            result.push(other[j++]);\n        }\n    }\n    return result;\n}\n/**\n * Given two sorted collections of numbers, returns the relative\n * complement between them (XOR).\n */\nfunction relativeComplement(one, other) {\n    const result = [];\n    let i = 0, j = 0;\n    while (i < one.length || j < other.length) {\n        if (i >= one.length) {\n            result.push(other[j++]);\n        }\n        else if (j >= other.length) {\n            result.push(one[i++]);\n        }\n        else if (one[i] === other[j]) {\n            i++;\n            j++;\n            continue;\n        }\n        else if (one[i] < other[j]) {\n            result.push(one[i++]);\n        }\n        else {\n            j++;\n        }\n    }\n    return result;\n}\nconst numericSort = (a, b) => a - b;\nclass PipelineRenderer {\n    constructor(_templateId, renderers) {\n        this._templateId = _templateId;\n        this.renderers = renderers;\n    }\n    get templateId() {\n        return this._templateId;\n    }\n    renderTemplate(container) {\n        return this.renderers.map(r => r.renderTemplate(container));\n    }\n    renderElement(element, index, templateData, renderDetails) {\n        let i = 0;\n        for (const renderer of this.renderers) {\n            renderer.renderElement(element, index, templateData[i++], renderDetails);\n        }\n    }\n    disposeElement(element, index, templateData, renderDetails) {\n        let i = 0;\n        for (const renderer of this.renderers) {\n            renderer.disposeElement?.(element, index, templateData[i], renderDetails);\n            i += 1;\n        }\n    }\n    disposeTemplate(templateData) {\n        let i = 0;\n        for (const renderer of this.renderers) {\n            renderer.disposeTemplate(templateData[i++]);\n        }\n    }\n}\nclass AccessibiltyRenderer {\n    constructor(accessibilityProvider) {\n        this.accessibilityProvider = accessibilityProvider;\n        this.templateId = 'a18n';\n    }\n    renderTemplate(container) {\n        return { container, disposables: new DisposableStore() };\n    }\n    renderElement(element, index, data) {\n        const ariaLabel = this.accessibilityProvider.getAriaLabel(element);\n        const observable = (ariaLabel && typeof ariaLabel !== 'string') ? ariaLabel : constObservable(ariaLabel);\n        data.disposables.add(autorun(reader => {\n            this.setAriaLabel(reader.readObservable(observable), data.container);\n        }));\n        const ariaLevel = this.accessibilityProvider.getAriaLevel && this.accessibilityProvider.getAriaLevel(element);\n        if (typeof ariaLevel === 'number') {\n            data.container.setAttribute('aria-level', `${ariaLevel}`);\n        }\n        else {\n            data.container.removeAttribute('aria-level');\n        }\n    }\n    setAriaLabel(ariaLabel, element) {\n        if (ariaLabel) {\n            element.setAttribute('aria-label', ariaLabel);\n        }\n        else {\n            element.removeAttribute('aria-label');\n        }\n    }\n    disposeElement(element, index, templateData) {\n        templateData.disposables.clear();\n    }\n    disposeTemplate(templateData) {\n        templateData.disposables.dispose();\n    }\n}\nclass ListViewDragAndDrop {\n    constructor(list, dnd) {\n        this.list = list;\n        this.dnd = dnd;\n    }\n    getDragElements(element) {\n        const selection = this.list.getSelectedElements();\n        const elements = selection.indexOf(element) > -1 ? selection : [element];\n        return elements;\n    }\n    getDragURI(element) {\n        return this.dnd.getDragURI(element);\n    }\n    getDragLabel(elements, originalEvent) {\n        if (this.dnd.getDragLabel) {\n            return this.dnd.getDragLabel(elements, originalEvent);\n        }\n        return undefined;\n    }\n    onDragStart(data, originalEvent) {\n        this.dnd.onDragStart?.(data, originalEvent);\n    }\n    onDragOver(data, targetElement, targetIndex, targetSector, originalEvent) {\n        return this.dnd.onDragOver(data, targetElement, targetIndex, targetSector, originalEvent);\n    }\n    onDragLeave(data, targetElement, targetIndex, originalEvent) {\n        this.dnd.onDragLeave?.(data, targetElement, targetIndex, originalEvent);\n    }\n    onDragEnd(originalEvent) {\n        this.dnd.onDragEnd?.(originalEvent);\n    }\n    drop(data, targetElement, targetIndex, targetSector, originalEvent) {\n        this.dnd.drop(data, targetElement, targetIndex, targetSector, originalEvent);\n    }\n    dispose() {\n        this.dnd.dispose();\n    }\n}\n/**\n * The {@link List} is a virtual scrolling widget, built on top of the {@link ListView}\n * widget.\n *\n * Features:\n * - Customizable keyboard and mouse support\n * - Element traits: focus, selection, achor\n * - Accessibility support\n * - Touch support\n * - Performant template-based rendering\n * - Horizontal scrolling\n * - Variable element height support\n * - Dynamic element height support\n * - Drag-and-drop support\n */\nclass List {\n    get onDidChangeFocus() {\n        return Event.map(this.eventBufferer.wrapEvent(this.focus.onChange), e => this.toListEvent(e), this.disposables);\n    }\n    get onDidChangeSelection() {\n        return Event.map(this.eventBufferer.wrapEvent(this.selection.onChange), e => this.toListEvent(e), this.disposables);\n    }\n    get domId() { return this.view.domId; }\n    get onDidScroll() { return this.view.onDidScroll; }\n    get onMouseClick() { return this.view.onMouseClick; }\n    get onMouseDblClick() { return this.view.onMouseDblClick; }\n    get onMouseMiddleClick() { return this.view.onMouseMiddleClick; }\n    get onPointer() { return this.mouseController.onPointer; }\n    get onMouseDown() { return this.view.onMouseDown; }\n    get onMouseOver() { return this.view.onMouseOver; }\n    get onMouseOut() { return this.view.onMouseOut; }\n    get onTouchStart() { return this.view.onTouchStart; }\n    get onTap() { return this.view.onTap; }\n    /**\n     * Possible context menu trigger events:\n     * - ContextMenu key\n     * - Shift F10\n     * - Ctrl Option Shift M (macOS with VoiceOver)\n     * - Mouse right click\n     */\n    get onContextMenu() {\n        let didJustPressContextMenuKey = false;\n        const fromKeyDown = Event.chain(this.disposables.add(new DomEmitter(this.view.domNode, 'keydown')).event, $ => $.map(e => new StandardKeyboardEvent(e))\n            .filter(e => didJustPressContextMenuKey = e.keyCode === 58 /* KeyCode.ContextMenu */ || (e.shiftKey && e.keyCode === 68 /* KeyCode.F10 */))\n            .map(e => EventHelper.stop(e, true))\n            .filter(() => false));\n        const fromKeyUp = Event.chain(this.disposables.add(new DomEmitter(this.view.domNode, 'keyup')).event, $ => $.forEach(() => didJustPressContextMenuKey = false)\n            .map(e => new StandardKeyboardEvent(e))\n            .filter(e => e.keyCode === 58 /* KeyCode.ContextMenu */ || (e.shiftKey && e.keyCode === 68 /* KeyCode.F10 */))\n            .map(e => EventHelper.stop(e, true))\n            .map(({ browserEvent }) => {\n            const focus = this.getFocus();\n            const index = focus.length ? focus[0] : undefined;\n            const element = typeof index !== 'undefined' ? this.view.element(index) : undefined;\n            const anchor = typeof index !== 'undefined' ? this.view.domElement(index) : this.view.domNode;\n            return { index, element, anchor, browserEvent };\n        }));\n        const fromMouse = Event.chain(this.view.onContextMenu, $ => $.filter(_ => !didJustPressContextMenuKey)\n            .map(({ element, index, browserEvent }) => ({ element, index, anchor: new StandardMouseEvent(getWindow(this.view.domNode), browserEvent), browserEvent })));\n        return Event.any(fromKeyDown, fromKeyUp, fromMouse);\n    }\n    get onKeyDown() { return this.disposables.add(new DomEmitter(this.view.domNode, 'keydown')).event; }\n    get onDidFocus() { return Event.signal(this.disposables.add(new DomEmitter(this.view.domNode, 'focus', true)).event); }\n    get onDidBlur() { return Event.signal(this.disposables.add(new DomEmitter(this.view.domNode, 'blur', true)).event); }\n    constructor(user, container, virtualDelegate, renderers, _options = DefaultOptions) {\n        this.user = user;\n        this._options = _options;\n        this.focus = new Trait('focused');\n        this.anchor = new Trait('anchor');\n        this.eventBufferer = new EventBufferer();\n        this._ariaLabel = '';\n        this.disposables = new DisposableStore();\n        this._onDidDispose = new Emitter();\n        this.onDidDispose = this._onDidDispose.event;\n        const role = this._options.accessibilityProvider && this._options.accessibilityProvider.getWidgetRole ? this._options.accessibilityProvider?.getWidgetRole() : 'list';\n        this.selection = new SelectionTrait(role !== 'listbox');\n        const baseRenderers = [this.focus.renderer, this.selection.renderer];\n        this.accessibilityProvider = _options.accessibilityProvider;\n        if (this.accessibilityProvider) {\n            baseRenderers.push(new AccessibiltyRenderer(this.accessibilityProvider));\n            this.accessibilityProvider.onDidChangeActiveDescendant?.(this.onDidChangeActiveDescendant, this, this.disposables);\n        }\n        renderers = renderers.map(r => new PipelineRenderer(r.templateId, [...baseRenderers, r]));\n        const viewOptions = {\n            ..._options,\n            dnd: _options.dnd && new ListViewDragAndDrop(this, _options.dnd)\n        };\n        this.view = this.createListView(container, virtualDelegate, renderers, viewOptions);\n        this.view.domNode.setAttribute('role', role);\n        if (_options.styleController) {\n            this.styleController = _options.styleController(this.view.domId);\n        }\n        else {\n            const styleElement = createStyleSheet(this.view.domNode);\n            this.styleController = new DefaultStyleController(styleElement, this.view.domId);\n        }\n        this.spliceable = new CombinedSpliceable([\n            new TraitSpliceable(this.focus, this.view, _options.identityProvider),\n            new TraitSpliceable(this.selection, this.view, _options.identityProvider),\n            new TraitSpliceable(this.anchor, this.view, _options.identityProvider),\n            this.view\n        ]);\n        this.disposables.add(this.focus);\n        this.disposables.add(this.selection);\n        this.disposables.add(this.anchor);\n        this.disposables.add(this.view);\n        this.disposables.add(this._onDidDispose);\n        this.disposables.add(new DOMFocusController(this, this.view));\n        if (typeof _options.keyboardSupport !== 'boolean' || _options.keyboardSupport) {\n            this.keyboardController = new KeyboardController(this, this.view, _options);\n            this.disposables.add(this.keyboardController);\n        }\n        if (_options.keyboardNavigationLabelProvider) {\n            const delegate = _options.keyboardNavigationDelegate || DefaultKeyboardNavigationDelegate;\n            this.typeNavigationController = new TypeNavigationController(this, this.view, _options.keyboardNavigationLabelProvider, _options.keyboardNavigationEventFilter ?? (() => true), delegate);\n            this.disposables.add(this.typeNavigationController);\n        }\n        this.mouseController = this.createMouseController(_options);\n        this.disposables.add(this.mouseController);\n        this.onDidChangeFocus(this._onFocusChange, this, this.disposables);\n        this.onDidChangeSelection(this._onSelectionChange, this, this.disposables);\n        if (this.accessibilityProvider) {\n            const ariaLabel = this.accessibilityProvider.getWidgetAriaLabel();\n            const observable = (ariaLabel && typeof ariaLabel !== 'string') ? ariaLabel : constObservable(ariaLabel);\n            this.disposables.add(autorun(reader => {\n                this.ariaLabel = reader.readObservable(observable);\n            }));\n        }\n        if (this._options.multipleSelectionSupport !== false) {\n            this.view.domNode.setAttribute('aria-multiselectable', 'true');\n        }\n    }\n    createListView(container, virtualDelegate, renderers, viewOptions) {\n        return new ListView(container, virtualDelegate, renderers, viewOptions);\n    }\n    createMouseController(options) {\n        return new MouseController(this);\n    }\n    updateOptions(optionsUpdate = {}) {\n        this._options = { ...this._options, ...optionsUpdate };\n        this.typeNavigationController?.updateOptions(this._options);\n        if (this._options.multipleSelectionController !== undefined) {\n            if (this._options.multipleSelectionSupport) {\n                this.view.domNode.setAttribute('aria-multiselectable', 'true');\n            }\n            else {\n                this.view.domNode.removeAttribute('aria-multiselectable');\n            }\n        }\n        this.mouseController.updateOptions(optionsUpdate);\n        this.keyboardController?.updateOptions(optionsUpdate);\n        this.view.updateOptions(optionsUpdate);\n    }\n    get options() {\n        return this._options;\n    }\n    splice(start, deleteCount, elements = []) {\n        if (start < 0 || start > this.view.length) {\n            throw new ListError(this.user, `Invalid start index: ${start}`);\n        }\n        if (deleteCount < 0) {\n            throw new ListError(this.user, `Invalid delete count: ${deleteCount}`);\n        }\n        if (deleteCount === 0 && elements.length === 0) {\n            return;\n        }\n        this.eventBufferer.bufferEvents(() => this.spliceable.splice(start, deleteCount, elements));\n    }\n    rerender() {\n        this.view.rerender();\n    }\n    element(index) {\n        return this.view.element(index);\n    }\n    indexOf(element) {\n        return this.view.indexOf(element);\n    }\n    indexAt(position) {\n        return this.view.indexAt(position);\n    }\n    get length() {\n        return this.view.length;\n    }\n    get contentHeight() {\n        return this.view.contentHeight;\n    }\n    get onDidChangeContentHeight() {\n        return this.view.onDidChangeContentHeight;\n    }\n    get scrollTop() {\n        return this.view.getScrollTop();\n    }\n    set scrollTop(scrollTop) {\n        this.view.setScrollTop(scrollTop);\n    }\n    get scrollHeight() {\n        return this.view.scrollHeight;\n    }\n    get renderHeight() {\n        return this.view.renderHeight;\n    }\n    get firstVisibleIndex() {\n        return this.view.firstVisibleIndex;\n    }\n    get ariaLabel() {\n        return this._ariaLabel;\n    }\n    set ariaLabel(value) {\n        this._ariaLabel = value;\n        this.view.domNode.setAttribute('aria-label', value);\n    }\n    domFocus() {\n        this.view.domNode.focus({ preventScroll: true });\n    }\n    layout(height, width) {\n        this.view.layout(height, width);\n    }\n    setSelection(indexes, browserEvent) {\n        for (const index of indexes) {\n            if (index < 0 || index >= this.length) {\n                throw new ListError(this.user, `Invalid index ${index}`);\n            }\n        }\n        this.selection.set(indexes, browserEvent);\n    }\n    getSelection() {\n        return this.selection.get();\n    }\n    getSelectedElements() {\n        return this.getSelection().map(i => this.view.element(i));\n    }\n    setAnchor(index) {\n        if (typeof index === 'undefined') {\n            this.anchor.set([]);\n            return;\n        }\n        if (index < 0 || index >= this.length) {\n            throw new ListError(this.user, `Invalid index ${index}`);\n        }\n        this.anchor.set([index]);\n    }\n    getAnchor() {\n        return this.anchor.get().at(0);\n    }\n    getAnchorElement() {\n        const anchor = this.getAnchor();\n        return typeof anchor === 'undefined' ? undefined : this.element(anchor);\n    }\n    setFocus(indexes, browserEvent) {\n        for (const index of indexes) {\n            if (index < 0 || index >= this.length) {\n                throw new ListError(this.user, `Invalid index ${index}`);\n            }\n        }\n        this.focus.set(indexes, browserEvent);\n    }\n    focusNext(n = 1, loop = false, browserEvent, filter) {\n        if (this.length === 0) {\n            return;\n        }\n        const focus = this.focus.get();\n        const index = this.findNextIndex(focus.length > 0 ? focus[0] + n : 0, loop, filter);\n        if (index > -1) {\n            this.setFocus([index], browserEvent);\n        }\n    }\n    focusPrevious(n = 1, loop = false, browserEvent, filter) {\n        if (this.length === 0) {\n            return;\n        }\n        const focus = this.focus.get();\n        const index = this.findPreviousIndex(focus.length > 0 ? focus[0] - n : 0, loop, filter);\n        if (index > -1) {\n            this.setFocus([index], browserEvent);\n        }\n    }\n    async focusNextPage(browserEvent, filter) {\n        let lastPageIndex = this.view.indexAt(this.view.getScrollTop() + this.view.renderHeight);\n        lastPageIndex = lastPageIndex === 0 ? 0 : lastPageIndex - 1;\n        const currentlyFocusedElementIndex = this.getFocus()[0];\n        if (currentlyFocusedElementIndex !== lastPageIndex && (currentlyFocusedElementIndex === undefined || lastPageIndex > currentlyFocusedElementIndex)) {\n            const lastGoodPageIndex = this.findPreviousIndex(lastPageIndex, false, filter);\n            if (lastGoodPageIndex > -1 && currentlyFocusedElementIndex !== lastGoodPageIndex) {\n                this.setFocus([lastGoodPageIndex], browserEvent);\n            }\n            else {\n                this.setFocus([lastPageIndex], browserEvent);\n            }\n        }\n        else {\n            const previousScrollTop = this.view.getScrollTop();\n            let nextpageScrollTop = previousScrollTop + this.view.renderHeight;\n            if (lastPageIndex > currentlyFocusedElementIndex) {\n                // scroll last page element to the top only if the last page element is below the focused element\n                nextpageScrollTop -= this.view.elementHeight(lastPageIndex);\n            }\n            this.view.setScrollTop(nextpageScrollTop);\n            if (this.view.getScrollTop() !== previousScrollTop) {\n                this.setFocus([]);\n                // Let the scroll event listener run\n                await timeout(0);\n                await this.focusNextPage(browserEvent, filter);\n            }\n        }\n    }\n    async focusPreviousPage(browserEvent, filter, getPaddingTop = () => 0) {\n        let firstPageIndex;\n        const paddingTop = getPaddingTop();\n        const scrollTop = this.view.getScrollTop() + paddingTop;\n        if (scrollTop === 0) {\n            firstPageIndex = this.view.indexAt(scrollTop);\n        }\n        else {\n            firstPageIndex = this.view.indexAfter(scrollTop - 1);\n        }\n        const currentlyFocusedElementIndex = this.getFocus()[0];\n        if (currentlyFocusedElementIndex !== firstPageIndex && (currentlyFocusedElementIndex === undefined || currentlyFocusedElementIndex >= firstPageIndex)) {\n            const firstGoodPageIndex = this.findNextIndex(firstPageIndex, false, filter);\n            if (firstGoodPageIndex > -1 && currentlyFocusedElementIndex !== firstGoodPageIndex) {\n                this.setFocus([firstGoodPageIndex], browserEvent);\n            }\n            else {\n                this.setFocus([firstPageIndex], browserEvent);\n            }\n        }\n        else {\n            const previousScrollTop = scrollTop;\n            this.view.setScrollTop(scrollTop - this.view.renderHeight - paddingTop);\n            if (this.view.getScrollTop() + getPaddingTop() !== previousScrollTop) {\n                this.setFocus([]);\n                // Let the scroll event listener run\n                await timeout(0);\n                await this.focusPreviousPage(browserEvent, filter, getPaddingTop);\n            }\n        }\n    }\n    focusLast(browserEvent, filter) {\n        if (this.length === 0) {\n            return;\n        }\n        const index = this.findPreviousIndex(this.length - 1, false, filter);\n        if (index > -1) {\n            this.setFocus([index], browserEvent);\n        }\n    }\n    focusFirst(browserEvent, filter) {\n        this.focusNth(0, browserEvent, filter);\n    }\n    focusNth(n, browserEvent, filter) {\n        if (this.length === 0) {\n            return;\n        }\n        const index = this.findNextIndex(n, false, filter);\n        if (index > -1) {\n            this.setFocus([index], browserEvent);\n        }\n    }\n    findNextIndex(index, loop = false, filter) {\n        for (let i = 0; i < this.length; i++) {\n            if (index >= this.length && !loop) {\n                return -1;\n            }\n            index = index % this.length;\n            if (!filter || filter(this.element(index))) {\n                return index;\n            }\n            index++;\n        }\n        return -1;\n    }\n    findPreviousIndex(index, loop = false, filter) {\n        for (let i = 0; i < this.length; i++) {\n            if (index < 0 && !loop) {\n                return -1;\n            }\n            index = (this.length + (index % this.length)) % this.length;\n            if (!filter || filter(this.element(index))) {\n                return index;\n            }\n            index--;\n        }\n        return -1;\n    }\n    getFocus() {\n        return this.focus.get();\n    }\n    getFocusedElements() {\n        return this.getFocus().map(i => this.view.element(i));\n    }\n    reveal(index, relativeTop, paddingTop = 0) {\n        if (index < 0 || index >= this.length) {\n            throw new ListError(this.user, `Invalid index ${index}`);\n        }\n        const scrollTop = this.view.getScrollTop();\n        const elementTop = this.view.elementTop(index);\n        const elementHeight = this.view.elementHeight(index);\n        if (isNumber(relativeTop)) {\n            // y = mx + b\n            const m = elementHeight - this.view.renderHeight + paddingTop;\n            this.view.setScrollTop(m * clamp(relativeTop, 0, 1) + elementTop - paddingTop);\n        }\n        else {\n            const viewItemBottom = elementTop + elementHeight;\n            const scrollBottom = scrollTop + this.view.renderHeight;\n            if (elementTop < scrollTop + paddingTop && viewItemBottom >= scrollBottom) ;\n            else if (elementTop < scrollTop + paddingTop || (viewItemBottom >= scrollBottom && elementHeight >= this.view.renderHeight)) {\n                this.view.setScrollTop(elementTop - paddingTop);\n            }\n            else if (viewItemBottom >= scrollBottom) {\n                this.view.setScrollTop(viewItemBottom - this.view.renderHeight);\n            }\n        }\n    }\n    /**\n     * Returns the relative position of an element rendered in the list.\n     * Returns `null` if the element isn't *entirely* in the visible viewport.\n     */\n    getRelativeTop(index, paddingTop = 0) {\n        if (index < 0 || index >= this.length) {\n            throw new ListError(this.user, `Invalid index ${index}`);\n        }\n        const scrollTop = this.view.getScrollTop();\n        const elementTop = this.view.elementTop(index);\n        const elementHeight = this.view.elementHeight(index);\n        if (elementTop < scrollTop + paddingTop || elementTop + elementHeight > scrollTop + this.view.renderHeight) {\n            return null;\n        }\n        // y = mx + b\n        const m = elementHeight - this.view.renderHeight + paddingTop;\n        return Math.abs((scrollTop + paddingTop - elementTop) / m);\n    }\n    getHTMLElement() {\n        return this.view.domNode;\n    }\n    getScrollableElement() {\n        return this.view.scrollableElementDomNode;\n    }\n    getElementID(index) {\n        return this.view.getElementDomId(index);\n    }\n    getElementTop(index) {\n        return this.view.elementTop(index);\n    }\n    style(styles) {\n        this.styleController.style(styles);\n    }\n    toListEvent({ indexes, browserEvent }) {\n        return { indexes, elements: indexes.map(i => this.view.element(i)), browserEvent };\n    }\n    _onFocusChange() {\n        const focus = this.focus.get();\n        this.view.domNode.classList.toggle('element-focused', focus.length > 0);\n        this.onDidChangeActiveDescendant();\n    }\n    onDidChangeActiveDescendant() {\n        const focus = this.focus.get();\n        if (focus.length > 0) {\n            let id;\n            if (this.accessibilityProvider?.getActiveDescendantId) {\n                id = this.accessibilityProvider.getActiveDescendantId(this.view.element(focus[0]));\n            }\n            this.view.domNode.setAttribute('aria-activedescendant', id || this.view.getElementDomId(focus[0]));\n        }\n        else {\n            this.view.domNode.removeAttribute('aria-activedescendant');\n        }\n    }\n    _onSelectionChange() {\n        const selection = this.selection.get();\n        this.view.domNode.classList.toggle('selection-none', selection.length === 0);\n        this.view.domNode.classList.toggle('selection-single', selection.length === 1);\n        this.view.domNode.classList.toggle('selection-multiple', selection.length > 1);\n    }\n    dispose() {\n        this._onDidDispose.fire();\n        this.disposables.dispose();\n        this._onDidDispose.dispose();\n    }\n}\n__decorate([\n    memoize\n], List.prototype, \"onDidChangeFocus\", null);\n__decorate([\n    memoize\n], List.prototype, \"onDidChangeSelection\", null);\n__decorate([\n    memoize\n], List.prototype, \"onContextMenu\", null);\n__decorate([\n    memoize\n], List.prototype, \"onKeyDown\", null);\n__decorate([\n    memoize\n], List.prototype, \"onDidFocus\", null);\n__decorate([\n    memoize\n], List.prototype, \"onDidBlur\", null);\n\nexport { DefaultKeyboardNavigationDelegate, DefaultStyleController, List, MouseController, TypeNavigationMode, isActionItem, isButton, isMonacoCustomToggle, isMonacoEditor, isSelectionRangeChangeEvent, isSelectionSingleChangeEvent, isStickyScrollContainer, isStickyScrollElement, unthemedListStyles };\n","import { localize } from '../../../../nls.js';\nimport { equals } from '../../../common/arrays.js';\nimport { Emitter, Event } from '../../../common/event.js';\nimport { KeyCodeUtils } from '../../../common/keyCodes.js';\nimport { Disposable, DisposableStore } from '../../../common/lifecycle.js';\nimport { isMacintosh } from '../../../common/platform.js';\nimport { asCssValueWithDefault } from '../../cssValue.js';\nimport { $ as $$1, append, addDisposableListener, EventHelper, EventType, addStandardDisposableListener, getWindow, getDomNodePagePosition, getTotalWidth, isAncestor } from '../../dom.js';\nimport { createStyleSheet } from '../../domStylesheets.js';\nimport { DomEmitter } from '../../event.js';\nimport { StandardKeyboardEvent } from '../../keyboardEvent.js';\nimport { renderMarkdown } from '../../markdownRenderer.js';\nimport { getBaseLayerHoverDelegate } from '../hover/hoverDelegate2.js';\nimport { getDefaultHoverDelegate } from '../hover/hoverDelegateFactory.js';\nimport { List } from '../list/listWidget.js';\nimport './selectBoxCustom.css';\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 *--------------------------------------------------------------------------------------------*/\nconst $ = $$1;\nconst SELECT_OPTION_ENTRY_TEMPLATE_ID = 'selectOption.entry.template';\nclass SelectListRenderer {\n    get templateId() { return SELECT_OPTION_ENTRY_TEMPLATE_ID; }\n    renderTemplate(container) {\n        const data = Object.create(null);\n        data.root = container;\n        data.text = append(container, $('.option-text'));\n        data.detail = append(container, $('.option-detail'));\n        data.decoratorRight = append(container, $('.option-decorator-right'));\n        return data;\n    }\n    renderElement(element, index, templateData) {\n        const data = templateData;\n        const text = element.text;\n        const detail = element.detail;\n        const decoratorRight = element.decoratorRight;\n        const isDisabled = element.isDisabled;\n        data.text.textContent = text;\n        data.detail.textContent = !!detail ? detail : '';\n        data.decoratorRight.textContent = !!decoratorRight ? decoratorRight : '';\n        // pseudo-select disabled option\n        if (isDisabled) {\n            data.root.classList.add('option-disabled');\n        }\n        else {\n            // Make sure we do class removal from prior template rendering\n            data.root.classList.remove('option-disabled');\n        }\n    }\n    disposeTemplate(_templateData) {\n        // noop\n    }\n}\nclass SelectBoxList extends Disposable {\n    static { this.DEFAULT_DROPDOWN_MINIMUM_BOTTOM_MARGIN = 32; }\n    static { this.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN = 2; }\n    static { this.DEFAULT_MINIMUM_VISIBLE_OPTIONS = 3; }\n    constructor(options, selected, contextViewProvider, styles, selectBoxOptions) {\n        super();\n        this.options = [];\n        this._currentSelection = 0;\n        this._hasDetails = false;\n        this._selectionDetailsDisposables = this._register(new DisposableStore());\n        this._skipLayout = false;\n        this._sticky = false; // for dev purposes only\n        this._isVisible = false;\n        this.styles = styles;\n        this.selectBoxOptions = selectBoxOptions || Object.create(null);\n        if (typeof this.selectBoxOptions.minBottomMargin !== 'number') {\n            this.selectBoxOptions.minBottomMargin = SelectBoxList.DEFAULT_DROPDOWN_MINIMUM_BOTTOM_MARGIN;\n        }\n        else if (this.selectBoxOptions.minBottomMargin < 0) {\n            this.selectBoxOptions.minBottomMargin = 0;\n        }\n        this.selectElement = document.createElement('select');\n        // Use custom CSS vars for padding calculation\n        this.selectElement.className = 'monaco-select-box monaco-select-box-dropdown-padding';\n        if (typeof this.selectBoxOptions.ariaLabel === 'string') {\n            this.selectElement.setAttribute('aria-label', this.selectBoxOptions.ariaLabel);\n        }\n        if (typeof this.selectBoxOptions.ariaDescription === 'string') {\n            this.selectElement.setAttribute('aria-description', this.selectBoxOptions.ariaDescription);\n        }\n        this._onDidSelect = new Emitter();\n        this._register(this._onDidSelect);\n        this.registerListeners();\n        this.constructSelectDropDown(contextViewProvider);\n        this.selected = selected || 0;\n        if (options) {\n            this.setOptions(options, selected);\n        }\n        this.initStyleSheet();\n    }\n    setTitle(title) {\n        if (!this._hover && title) {\n            this._hover = this._register(getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate('mouse'), this.selectElement, title));\n        }\n        else if (this._hover) {\n            this._hover.update(title);\n        }\n    }\n    // IDelegate - List renderer\n    getHeight() {\n        return 22;\n    }\n    getTemplateId() {\n        return SELECT_OPTION_ENTRY_TEMPLATE_ID;\n    }\n    constructSelectDropDown(contextViewProvider) {\n        // SetUp ContextView container to hold select Dropdown\n        this.contextViewProvider = contextViewProvider;\n        this.selectDropDownContainer = $$1('.monaco-select-box-dropdown-container');\n        // Use custom CSS vars for padding calculation (shared with parent select)\n        this.selectDropDownContainer.classList.add('monaco-select-box-dropdown-padding');\n        // Setup container for select option details\n        this.selectionDetailsPane = append(this.selectDropDownContainer, $('.select-box-details-pane'));\n        // Create span flex box item/div we can measure and control\n        const widthControlOuterDiv = append(this.selectDropDownContainer, $('.select-box-dropdown-container-width-control'));\n        const widthControlInnerDiv = append(widthControlOuterDiv, $('.width-control-div'));\n        this.widthControlElement = document.createElement('span');\n        this.widthControlElement.className = 'option-text-width-control';\n        append(widthControlInnerDiv, this.widthControlElement);\n        // Always default to below position\n        this._dropDownPosition = 0 /* AnchorPosition.BELOW */;\n        // Inline stylesheet for themes\n        this.styleElement = createStyleSheet(this.selectDropDownContainer);\n        // Prevent dragging of dropdown #114329\n        this.selectDropDownContainer.setAttribute('draggable', 'true');\n        this._register(addDisposableListener(this.selectDropDownContainer, EventType.DRAG_START, (e) => {\n            EventHelper.stop(e, true);\n        }));\n    }\n    registerListeners() {\n        // Parent native select keyboard listeners\n        this._register(addStandardDisposableListener(this.selectElement, 'change', (e) => {\n            this.selected = e.target.selectedIndex;\n            this._onDidSelect.fire({\n                index: e.target.selectedIndex,\n                selected: e.target.value\n            });\n            if (!!this.options[this.selected] && !!this.options[this.selected].text) {\n                this.setTitle(this.options[this.selected].text);\n            }\n        }));\n        // Have to implement both keyboard and mouse controllers to handle disabled options\n        // Intercept mouse events to override normal select actions on parents\n        this._register(addDisposableListener(this.selectElement, EventType.CLICK, (e) => {\n            EventHelper.stop(e);\n            if (this._isVisible) {\n                this.hideSelectDropDown(true);\n            }\n            else {\n                this.showSelectDropDown();\n            }\n        }));\n        this._register(addDisposableListener(this.selectElement, EventType.MOUSE_DOWN, (e) => {\n            EventHelper.stop(e);\n        }));\n        // Intercept touch events\n        // The following implementation is slightly different from the mouse event handlers above.\n        // Use the following helper variable, otherwise the list flickers.\n        let listIsVisibleOnTouchStart;\n        this._register(addDisposableListener(this.selectElement, 'touchstart', (e) => {\n            listIsVisibleOnTouchStart = this._isVisible;\n        }));\n        this._register(addDisposableListener(this.selectElement, 'touchend', (e) => {\n            EventHelper.stop(e);\n            if (listIsVisibleOnTouchStart) {\n                this.hideSelectDropDown(true);\n            }\n            else {\n                this.showSelectDropDown();\n            }\n        }));\n        // Intercept keyboard handling\n        this._register(addDisposableListener(this.selectElement, EventType.KEY_DOWN, (e) => {\n            const event = new StandardKeyboardEvent(e);\n            let showDropDown = false;\n            // Create and drop down select list on keyboard select\n            if (isMacintosh) {\n                if (event.keyCode === 18 /* KeyCode.DownArrow */ || event.keyCode === 16 /* KeyCode.UpArrow */ || event.keyCode === 10 /* KeyCode.Space */ || event.keyCode === 3 /* KeyCode.Enter */) {\n                    showDropDown = true;\n                }\n            }\n            else {\n                if (event.keyCode === 18 /* KeyCode.DownArrow */ && event.altKey || event.keyCode === 16 /* KeyCode.UpArrow */ && event.altKey || event.keyCode === 10 /* KeyCode.Space */ || event.keyCode === 3 /* KeyCode.Enter */) {\n                    showDropDown = true;\n                }\n            }\n            if (showDropDown) {\n                this.showSelectDropDown();\n                EventHelper.stop(e, true);\n            }\n        }));\n    }\n    get onDidSelect() {\n        return this._onDidSelect.event;\n    }\n    setOptions(options, selected) {\n        if (!equals(this.options, options)) {\n            this.options = options;\n            this.selectElement.options.length = 0;\n            this._hasDetails = false;\n            this._cachedMaxDetailsHeight = undefined;\n            this.options.forEach((option, index) => {\n                this.selectElement.add(this.createOption(option.text, index, option.isDisabled));\n                if (typeof option.description === 'string') {\n                    this._hasDetails = true;\n                }\n            });\n        }\n        if (selected !== undefined) {\n            this.select(selected);\n            // Set current = selected since this is not necessarily a user exit\n            this._currentSelection = this.selected;\n        }\n    }\n    setOptionsList() {\n        // Mirror options in drop-down\n        // Populate select list for non-native select mode\n        this.selectList?.splice(0, this.selectList.length, this.options);\n    }\n    select(index) {\n        if (index >= 0 && index < this.options.length) {\n            this.selected = index;\n        }\n        else if (index > this.options.length - 1) {\n            // Adjust index to end of list\n            // This could make client out of sync with the select\n            this.select(this.options.length - 1);\n        }\n        else if (this.selected < 0) {\n            this.selected = 0;\n        }\n        this.selectElement.selectedIndex = this.selected;\n        if (!!this.options[this.selected] && !!this.options[this.selected].text) {\n            this.setTitle(this.options[this.selected].text);\n        }\n    }\n    focus() {\n        if (this.selectElement) {\n            this.selectElement.tabIndex = 0;\n            this.selectElement.focus();\n        }\n    }\n    blur() {\n        if (this.selectElement) {\n            this.selectElement.tabIndex = -1;\n            this.selectElement.blur();\n        }\n    }\n    setFocusable(focusable) {\n        this.selectElement.tabIndex = focusable ? 0 : -1;\n    }\n    render(container) {\n        this.container = container;\n        container.classList.add('select-container');\n        container.appendChild(this.selectElement);\n        this.styleSelectElement();\n    }\n    initStyleSheet() {\n        const content = [];\n        // Style non-native select mode\n        if (this.styles.listFocusBackground) {\n            content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.focused { background-color: ${this.styles.listFocusBackground} !important; }`);\n        }\n        if (this.styles.listFocusForeground) {\n            content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.focused { color: ${this.styles.listFocusForeground} !important; }`);\n        }\n        if (this.styles.decoratorRightForeground) {\n            content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.focused) .option-decorator-right { color: ${this.styles.decoratorRightForeground}; }`);\n        }\n        if (this.styles.selectBackground && this.styles.selectBorder && this.styles.selectBorder !== this.styles.selectBackground) {\n            content.push(`.monaco-select-box-dropdown-container { border: 1px solid ${this.styles.selectBorder} } `);\n            content.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-top { border-top: 1px solid ${this.styles.selectBorder} } `);\n            content.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-bottom { border-bottom: 1px solid ${this.styles.selectBorder} } `);\n        }\n        else if (this.styles.selectListBorder) {\n            content.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-top { border-top: 1px solid ${this.styles.selectListBorder} } `);\n            content.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-bottom { border-bottom: 1px solid ${this.styles.selectListBorder} } `);\n        }\n        // Hover foreground - ignore for disabled options\n        if (this.styles.listHoverForeground) {\n            content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.option-disabled):not(.focused):hover { color: ${this.styles.listHoverForeground} !important; }`);\n        }\n        // Hover background - ignore for disabled options\n        if (this.styles.listHoverBackground) {\n            content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.option-disabled):not(.focused):hover { background-color: ${this.styles.listHoverBackground} !important; }`);\n        }\n        // Match quick input outline styles - ignore for disabled options\n        if (this.styles.listFocusOutline) {\n            content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.focused { outline: 1.6px dotted ${this.styles.listFocusOutline} !important; outline-offset: -1.6px !important; }`);\n        }\n        if (this.styles.listHoverOutline) {\n            content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.option-disabled):not(.focused):hover { outline: 1.6px dashed ${this.styles.listHoverOutline} !important; outline-offset: -1.6px !important; }`);\n        }\n        // Clear list styles on focus and on hover for disabled options\n        content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.option-disabled.focused { background-color: transparent !important; color: inherit !important; outline: none !important; }`);\n        content.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.option-disabled:hover { background-color: transparent !important; color: inherit !important; outline: none !important; }`);\n        this.styleElement.textContent = content.join('\\n');\n    }\n    styleSelectElement() {\n        const background = this.styles.selectBackground ?? '';\n        const foreground = this.styles.selectForeground ?? '';\n        const border = this.styles.selectBorder ?? '';\n        this.selectElement.style.backgroundColor = background;\n        this.selectElement.style.color = foreground;\n        this.selectElement.style.borderColor = border;\n    }\n    styleList() {\n        const background = this.styles.selectBackground ?? '';\n        const listBackground = asCssValueWithDefault(this.styles.selectListBackground, background);\n        this.selectDropDownListContainer.style.backgroundColor = listBackground;\n        this.selectionDetailsPane.style.backgroundColor = listBackground;\n        const optionsBorder = this.styles.focusBorder ?? '';\n        this.selectDropDownContainer.style.outlineColor = optionsBorder;\n        this.selectDropDownContainer.style.outlineOffset = '-1px';\n        this.selectList.style(this.styles);\n    }\n    createOption(value, index, disabled) {\n        const option = document.createElement('option');\n        option.value = value;\n        option.text = value;\n        option.disabled = !!disabled;\n        return option;\n    }\n    // ContextView dropdown methods\n    showSelectDropDown() {\n        this.selectionDetailsPane.textContent = '';\n        if (!this.contextViewProvider || this._isVisible) {\n            return;\n        }\n        // Lazily create and populate list only at open, moved from constructor\n        this.createSelectList(this.selectDropDownContainer);\n        this.setOptionsList();\n        // This allows us to flip the position based on measurement\n        // Set drop-down position above/below from required height and margins\n        // If pre-layout cannot fit at least one option do not show drop-down\n        this.contextViewProvider.showContextView({\n            getAnchor: () => this.selectElement,\n            render: (container) => this.renderSelectDropDown(container, true),\n            layout: () => {\n                this.layoutSelectDropDown();\n            },\n            onHide: () => {\n                this.selectDropDownContainer.classList.remove('visible');\n                this.selectElement.classList.remove('synthetic-focus');\n            },\n            anchorPosition: this._dropDownPosition\n        }, this.selectBoxOptions.optionsAsChildren ? this.container : undefined);\n        // Hide so we can relay out\n        this._isVisible = true;\n        this.hideSelectDropDown(false);\n        this.contextViewProvider.showContextView({\n            getAnchor: () => this.selectElement,\n            render: (container) => this.renderSelectDropDown(container),\n            layout: () => this.layoutSelectDropDown(),\n            onHide: () => {\n                this.selectDropDownContainer.classList.remove('visible');\n                this.selectElement.classList.remove('synthetic-focus');\n            },\n            anchorPosition: this._dropDownPosition\n        }, this.selectBoxOptions.optionsAsChildren ? this.container : undefined);\n        // Track initial selection the case user escape, blur\n        this._currentSelection = this.selected;\n        this._isVisible = true;\n        this.selectElement.setAttribute('aria-expanded', 'true');\n    }\n    hideSelectDropDown(focusSelect) {\n        if (!this.contextViewProvider || !this._isVisible) {\n            return;\n        }\n        this._isVisible = false;\n        this.selectElement.setAttribute('aria-expanded', 'false');\n        if (focusSelect) {\n            this.selectElement.focus();\n        }\n        this.contextViewProvider.hideContextView();\n    }\n    renderSelectDropDown(container, preLayoutPosition) {\n        container.appendChild(this.selectDropDownContainer);\n        // Pre-Layout allows us to change position\n        this.layoutSelectDropDown(preLayoutPosition);\n        return {\n            dispose: () => {\n                // contextView will dispose itself if moving from one View to another\n                this.selectDropDownContainer.remove(); // remove to take out the CSS rules we add\n            }\n        };\n    }\n    // Iterate over detailed descriptions, find max height\n    measureMaxDetailsHeight() {\n        let maxDetailsPaneHeight = 0;\n        this.options.forEach((_option, index) => {\n            this.updateDetail(index);\n            if (this.selectionDetailsPane.offsetHeight > maxDetailsPaneHeight) {\n                maxDetailsPaneHeight = this.selectionDetailsPane.offsetHeight;\n            }\n        });\n        return maxDetailsPaneHeight;\n    }\n    layoutSelectDropDown(preLayoutPosition) {\n        // Avoid recursion from layout called in onListFocus\n        if (this._skipLayout) {\n            return false;\n        }\n        // Layout ContextView drop down select list and container\n        // Have to manage our vertical overflow, sizing, position below or above\n        // Position has to be determined and set prior to contextView instantiation\n        if (this.selectList) {\n            // Make visible to enable measurements\n            this.selectDropDownContainer.classList.add('visible');\n            const window = getWindow(this.selectElement);\n            const selectPosition = getDomNodePagePosition(this.selectElement);\n            const styles = getWindow(this.selectElement).getComputedStyle(this.selectElement);\n            const verticalPadding = parseFloat(styles.getPropertyValue('--dropdown-padding-top')) + parseFloat(styles.getPropertyValue('--dropdown-padding-bottom'));\n            const maxSelectDropDownHeightBelow = (window.innerHeight - selectPosition.top - selectPosition.height - (this.selectBoxOptions.minBottomMargin || 0));\n            const maxSelectDropDownHeightAbove = (selectPosition.top - SelectBoxList.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN);\n            // Determine optimal width - min(longest option), opt(parent select, excluding margins), max(ContextView controlled)\n            const selectWidth = this.selectElement.offsetWidth;\n            const selectMinWidth = this.setWidthControlElement(this.widthControlElement);\n            const selectOptimalWidth = Math.max(selectMinWidth, Math.round(selectWidth)).toString() + 'px';\n            this.selectDropDownContainer.style.width = selectOptimalWidth;\n            // Get initial list height and determine space above and below\n            this.selectList.getHTMLElement().style.height = '';\n            this.selectList.layout();\n            let listHeight = this.selectList.contentHeight;\n            if (this._hasDetails && this._cachedMaxDetailsHeight === undefined) {\n                this._cachedMaxDetailsHeight = this.measureMaxDetailsHeight();\n            }\n            const maxDetailsPaneHeight = this._hasDetails ? this._cachedMaxDetailsHeight : 0;\n            const minRequiredDropDownHeight = listHeight + verticalPadding + maxDetailsPaneHeight;\n            const maxVisibleOptionsBelow = ((Math.floor((maxSelectDropDownHeightBelow - verticalPadding - maxDetailsPaneHeight) / this.getHeight())));\n            const maxVisibleOptionsAbove = ((Math.floor((maxSelectDropDownHeightAbove - verticalPadding - maxDetailsPaneHeight) / this.getHeight())));\n            // If we are only doing pre-layout check/adjust position only\n            // Calculate vertical space available, flip up if insufficient\n            // Use reflected padding on parent select, ContextView style\n            // properties not available before DOM attachment\n            if (preLayoutPosition) {\n                // Check if select moved out of viewport , do not open\n                // If at least one option cannot be shown, don't open the drop-down or hide/remove if open\n                if ((selectPosition.top + selectPosition.height) > (window.innerHeight - 22)\n                    || selectPosition.top < SelectBoxList.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN\n                    || ((maxVisibleOptionsBelow < 1) && (maxVisibleOptionsAbove < 1))) {\n                    // Indicate we cannot open\n                    return false;\n                }\n                // Determine if we have to flip up\n                // Always show complete list items - never more than Max available vertical height\n                if (maxVisibleOptionsBelow < SelectBoxList.DEFAULT_MINIMUM_VISIBLE_OPTIONS\n                    && maxVisibleOptionsAbove > maxVisibleOptionsBelow\n                    && this.options.length > maxVisibleOptionsBelow) {\n                    this._dropDownPosition = 1 /* AnchorPosition.ABOVE */;\n                    this.selectDropDownListContainer.remove();\n                    this.selectionDetailsPane.remove();\n                    this.selectDropDownContainer.appendChild(this.selectionDetailsPane);\n                    this.selectDropDownContainer.appendChild(this.selectDropDownListContainer);\n                    this.selectionDetailsPane.classList.remove('border-top');\n                    this.selectionDetailsPane.classList.add('border-bottom');\n                }\n                else {\n                    this._dropDownPosition = 0 /* AnchorPosition.BELOW */;\n                    this.selectDropDownListContainer.remove();\n                    this.selectionDetailsPane.remove();\n                    this.selectDropDownContainer.appendChild(this.selectDropDownListContainer);\n                    this.selectDropDownContainer.appendChild(this.selectionDetailsPane);\n                    this.selectionDetailsPane.classList.remove('border-bottom');\n                    this.selectionDetailsPane.classList.add('border-top');\n                }\n                // Do full layout on showSelectDropDown only\n                return true;\n            }\n            // Check if select out of viewport or cutting into status bar\n            if ((selectPosition.top + selectPosition.height) > (window.innerHeight - 22)\n                || selectPosition.top < SelectBoxList.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN\n                || (this._dropDownPosition === 0 /* AnchorPosition.BELOW */ && maxVisibleOptionsBelow < 1)\n                || (this._dropDownPosition === 1 /* AnchorPosition.ABOVE */ && maxVisibleOptionsAbove < 1)) {\n                // Cannot properly layout, close and hide\n                this.hideSelectDropDown(true);\n                return false;\n            }\n            // SetUp list dimensions and layout - account for container padding\n            // Use position to check above or below available space\n            if (this._dropDownPosition === 0 /* AnchorPosition.BELOW */) {\n                if (this._isVisible && maxVisibleOptionsBelow + maxVisibleOptionsAbove < 1) {\n                    // If drop-down is visible, must be doing a DOM re-layout, hide since we don't fit\n                    // Hide drop-down, hide contextview, focus on parent select\n                    this.hideSelectDropDown(true);\n                    return false;\n                }\n                // Adjust list height to max from select bottom to margin (default/minBottomMargin)\n                if (minRequiredDropDownHeight > maxSelectDropDownHeightBelow) {\n                    listHeight = (maxVisibleOptionsBelow * this.getHeight());\n                }\n            }\n            else {\n                if (minRequiredDropDownHeight > maxSelectDropDownHeightAbove) {\n                    listHeight = (maxVisibleOptionsAbove * this.getHeight());\n                }\n            }\n            // Set adjusted list height and relayout\n            this.selectList.layout(listHeight);\n            this.selectList.domFocus();\n            // Finally set focus on selected item\n            if (this.selectList.length > 0) {\n                this.selectList.setFocus([this.selected || 0]);\n                this.selectList.reveal(this.selectList.getFocus()[0] || 0);\n            }\n            if (this._hasDetails) {\n                // Leave the selectDropDownContainer to size itself according to children (list + details) - #57447\n                this.selectList.getHTMLElement().style.height = (listHeight + verticalPadding) + 'px';\n                this.selectDropDownContainer.style.height = '';\n            }\n            else {\n                this.selectDropDownContainer.style.height = (listHeight + verticalPadding) + 'px';\n            }\n            this.updateDetail(this.selected);\n            this.selectDropDownContainer.style.width = selectOptimalWidth;\n            // Maintain focus outline on parent select as well as list container - tabindex for focus\n            this.selectDropDownListContainer.setAttribute('tabindex', '0');\n            this.selectElement.classList.add('synthetic-focus');\n            this.selectDropDownContainer.classList.add('synthetic-focus');\n            return true;\n        }\n        else {\n            return false;\n        }\n    }\n    setWidthControlElement(container) {\n        let elementWidth = 0;\n        if (container) {\n            let longest = 0;\n            let longestLength = 0;\n            this.options.forEach((option, index) => {\n                const detailLength = !!option.detail ? option.detail.length : 0;\n                const rightDecoratorLength = !!option.decoratorRight ? option.decoratorRight.length : 0;\n                const len = option.text.length + detailLength + rightDecoratorLength;\n                if (len > longestLength) {\n                    longest = index;\n                    longestLength = len;\n                }\n            });\n            container.textContent = this.options[longest].text + (!!this.options[longest].decoratorRight ? (this.options[longest].decoratorRight + ' ') : '');\n            elementWidth = getTotalWidth(container);\n        }\n        return elementWidth;\n    }\n    createSelectList(parent) {\n        // If we have already constructive list on open, skip\n        if (this.selectList) {\n            return;\n        }\n        // SetUp container for list\n        this.selectDropDownListContainer = append(parent, $('.select-box-dropdown-list-container'));\n        this.listRenderer = new SelectListRenderer();\n        this.selectList = this._register(new List('SelectBoxCustom', this.selectDropDownListContainer, this, [this.listRenderer], {\n            useShadows: false,\n            verticalScrollMode: 3 /* ScrollbarVisibility.Visible */,\n            keyboardSupport: false,\n            mouseSupport: false,\n            accessibilityProvider: {\n                getAriaLabel: element => {\n                    let label = element.text;\n                    if (element.detail) {\n                        label += `. ${element.detail}`;\n                    }\n                    if (element.decoratorRight) {\n                        label += `. ${element.decoratorRight}`;\n                    }\n                    if (element.description) {\n                        label += `. ${element.description}`;\n                    }\n                    return label;\n                },\n                getWidgetAriaLabel: () => localize(16, \"Select Box\"),\n                getRole: () => isMacintosh ? '' : 'option',\n                getWidgetRole: () => 'listbox'\n            }\n        }));\n        if (this.selectBoxOptions.ariaLabel) {\n            this.selectList.ariaLabel = this.selectBoxOptions.ariaLabel;\n        }\n        // SetUp list keyboard controller - control navigation, disabled items, focus\n        const onKeyDown = this._register(new DomEmitter(this.selectDropDownListContainer, 'keydown'));\n        const onSelectDropDownKeyDown = Event.chain(onKeyDown.event, $ => $.filter(() => this.selectList.length > 0)\n            .map(e => new StandardKeyboardEvent(e)));\n        this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === 3 /* KeyCode.Enter */))(this.onEnter, this));\n        this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === 2 /* KeyCode.Tab */))(this.onEnter, this)); // Tab should behave the same as enter, #79339\n        this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === 9 /* KeyCode.Escape */))(this.onEscape, this));\n        this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === 16 /* KeyCode.UpArrow */))(this.onUpArrow, this));\n        this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === 18 /* KeyCode.DownArrow */))(this.onDownArrow, this));\n        this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === 12 /* KeyCode.PageDown */))(this.onPageDown, this));\n        this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === 11 /* KeyCode.PageUp */))(this.onPageUp, this));\n        this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === 14 /* KeyCode.Home */))(this.onHome, this));\n        this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === 13 /* KeyCode.End */))(this.onEnd, this));\n        this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => (e.keyCode >= 21 /* KeyCode.Digit0 */ && e.keyCode <= 56 /* KeyCode.KeyZ */) || (e.keyCode >= 85 /* KeyCode.Semicolon */ && e.keyCode <= 113 /* KeyCode.NumpadDivide */)))(this.onCharacter, this));\n        // SetUp list mouse controller - control navigation, disabled items, focus\n        this._register(addDisposableListener(this.selectList.getHTMLElement(), EventType.POINTER_UP, e => this.onPointerUp(e)));\n        this._register(this.selectList.onMouseOver(e => typeof e.index !== 'undefined' && this.selectList.setFocus([e.index])));\n        this._register(this.selectList.onDidChangeFocus(e => this.onListFocus(e)));\n        this._register(addDisposableListener(this.selectDropDownContainer, EventType.FOCUS_OUT, e => {\n            if (!this._isVisible || isAncestor(e.relatedTarget, this.selectDropDownContainer)) {\n                return;\n            }\n            this.onListBlur();\n        }));\n        this.selectList.getHTMLElement().setAttribute('aria-label', this.selectBoxOptions.ariaLabel || '');\n        this.selectList.getHTMLElement().setAttribute('aria-expanded', 'true');\n        this.styleList();\n    }\n    // List methods\n    // List mouse controller - active exit, select option, fire onDidSelect if change, return focus to parent select\n    // Also takes in touchend events\n    onPointerUp(e) {\n        if (!this.selectList.length) {\n            return;\n        }\n        EventHelper.stop(e);\n        const target = e.target;\n        if (!target) {\n            return;\n        }\n        // Check our mouse event is on an option (not scrollbar)\n        if (target.classList.contains('slider')) {\n            return;\n        }\n        const listRowElement = target.closest('.monaco-list-row');\n        if (!listRowElement) {\n            return;\n        }\n        const index = Number(listRowElement.getAttribute('data-index'));\n        const disabled = listRowElement.classList.contains('option-disabled');\n        // Ignore mouse selection of disabled options\n        if (index >= 0 && index < this.options.length && !disabled) {\n            this.selected = index;\n            this.select(this.selected);\n            this.selectList.setFocus([this.selected]);\n            this.selectList.reveal(this.selectList.getFocus()[0]);\n            // Only fire if selection change\n            if (this.selected !== this._currentSelection) {\n                // Set current = selected\n                this._currentSelection = this.selected;\n                this._onDidSelect.fire({\n                    index: this.selectElement.selectedIndex,\n                    selected: this.options[this.selected].text\n                });\n                if (!!this.options[this.selected] && !!this.options[this.selected].text) {\n                    this.setTitle(this.options[this.selected].text);\n                }\n            }\n            this.hideSelectDropDown(true);\n        }\n    }\n    // List Exit - passive - implicit no selection change, hide drop-down\n    onListBlur() {\n        if (this._sticky) {\n            return;\n        }\n        if (this.selected !== this._currentSelection) {\n            // Reset selected to current if no change\n            this.select(this._currentSelection);\n        }\n        this.hideSelectDropDown(false);\n    }\n    renderDescriptionMarkdown(text, actionHandler) {\n        const cleanRenderedMarkdown = (element) => {\n            for (let i = 0; i < element.childNodes.length; i++) {\n                const child = element.childNodes.item(i);\n                const tagName = child.tagName && child.tagName.toLowerCase();\n                if (tagName === 'img') {\n                    child.remove();\n                }\n                else {\n                    cleanRenderedMarkdown(child);\n                }\n            }\n        };\n        const rendered = renderMarkdown({ value: text, supportThemeIcons: true }, { actionHandler });\n        rendered.element.classList.add('select-box-description-markdown');\n        cleanRenderedMarkdown(rendered.element);\n        return rendered;\n    }\n    // List Focus Change - passive - update details pane with newly focused element's data\n    onListFocus(e) {\n        // Skip during initial layout\n        if (!this._isVisible || !this._hasDetails) {\n            return;\n        }\n        this.updateDetail(e.indexes[0]);\n    }\n    updateDetail(selectedIndex) {\n        // Reset\n        this._selectionDetailsDisposables.clear();\n        this.selectionDetailsPane.textContent = '';\n        const option = this.options[selectedIndex];\n        const description = option?.description ?? '';\n        const descriptionIsMarkdown = option?.descriptionIsMarkdown ?? false;\n        if (description) {\n            if (descriptionIsMarkdown) {\n                const actionHandler = option.descriptionMarkdownActionHandler;\n                const result = this._selectionDetailsDisposables.add(this.renderDescriptionMarkdown(description, actionHandler));\n                this.selectionDetailsPane.appendChild(result.element);\n            }\n            else {\n                this.selectionDetailsPane.textContent = description;\n            }\n            this.selectionDetailsPane.style.display = 'block';\n        }\n        else {\n            this.selectionDetailsPane.style.display = 'none';\n        }\n        // Avoid recursion\n        this._skipLayout = true;\n        this.contextViewProvider.layout();\n        this._skipLayout = false;\n    }\n    // List keyboard controller\n    // List exit - active - hide ContextView dropdown, reset selection, return focus to parent select\n    onEscape(e) {\n        EventHelper.stop(e);\n        // Reset selection to value when opened\n        this.select(this._currentSelection);\n        this.hideSelectDropDown(true);\n    }\n    // List exit - active - hide ContextView dropdown, return focus to parent select, fire onDidSelect if change\n    onEnter(e) {\n        EventHelper.stop(e);\n        // Only fire if selection change\n        if (this.selected !== this._currentSelection) {\n            this._currentSelection = this.selected;\n            this._onDidSelect.fire({\n                index: this.selectElement.selectedIndex,\n                selected: this.options[this.selected].text\n            });\n            if (!!this.options[this.selected] && !!this.options[this.selected].text) {\n                this.setTitle(this.options[this.selected].text);\n            }\n        }\n        this.hideSelectDropDown(true);\n    }\n    // List navigation - have to handle a disabled option (jump over)\n    onDownArrow(e) {\n        if (this.selected < this.options.length - 1) {\n            EventHelper.stop(e, true);\n            // Skip disabled options\n            const nextOptionDisabled = this.options[this.selected + 1].isDisabled;\n            if (nextOptionDisabled && this.options.length > this.selected + 2) {\n                this.selected += 2;\n            }\n            else if (nextOptionDisabled) {\n                return;\n            }\n            else {\n                this.selected++;\n            }\n            // Set focus/selection - only fire event when closing drop-down or on blur\n            this.select(this.selected);\n            this.selectList.setFocus([this.selected]);\n            this.selectList.reveal(this.selectList.getFocus()[0]);\n        }\n    }\n    onUpArrow(e) {\n        if (this.selected > 0) {\n            EventHelper.stop(e, true);\n            // Skip disabled options\n            const previousOptionDisabled = this.options[this.selected - 1].isDisabled;\n            if (previousOptionDisabled && this.selected > 1) {\n                this.selected -= 2;\n            }\n            else {\n                this.selected--;\n            }\n            // Set focus/selection - only fire event when closing drop-down or on blur\n            this.select(this.selected);\n            this.selectList.setFocus([this.selected]);\n            this.selectList.reveal(this.selectList.getFocus()[0]);\n        }\n    }\n    onPageUp(e) {\n        EventHelper.stop(e);\n        this.selectList.focusPreviousPage();\n        // Allow scrolling to settle\n        setTimeout(() => {\n            this.selected = this.selectList.getFocus()[0];\n            // Shift selection down if we land on a disabled option\n            if (this.options[this.selected].isDisabled && this.selected < this.options.length - 1) {\n                this.selected++;\n                this.selectList.setFocus([this.selected]);\n            }\n            this.selectList.reveal(this.selected);\n            this.select(this.selected);\n        }, 1);\n    }\n    onPageDown(e) {\n        EventHelper.stop(e);\n        this.selectList.focusNextPage();\n        // Allow scrolling to settle\n        setTimeout(() => {\n            this.selected = this.selectList.getFocus()[0];\n            // Shift selection up if we land on a disabled option\n            if (this.options[this.selected].isDisabled && this.selected > 0) {\n                this.selected--;\n                this.selectList.setFocus([this.selected]);\n            }\n            this.selectList.reveal(this.selected);\n            this.select(this.selected);\n        }, 1);\n    }\n    onHome(e) {\n        EventHelper.stop(e);\n        if (this.options.length < 2) {\n            return;\n        }\n        this.selected = 0;\n        if (this.options[this.selected].isDisabled && this.selected > 1) {\n            this.selected++;\n        }\n        this.selectList.setFocus([this.selected]);\n        this.selectList.reveal(this.selected);\n        this.select(this.selected);\n    }\n    onEnd(e) {\n        EventHelper.stop(e);\n        if (this.options.length < 2) {\n            return;\n        }\n        this.selected = this.options.length - 1;\n        if (this.options[this.selected].isDisabled && this.selected > 1) {\n            this.selected--;\n        }\n        this.selectList.setFocus([this.selected]);\n        this.selectList.reveal(this.selected);\n        this.select(this.selected);\n    }\n    // Mimic option first character navigation of native select\n    onCharacter(e) {\n        const ch = KeyCodeUtils.toString(e.keyCode);\n        let optionIndex = -1;\n        for (let i = 0; i < this.options.length - 1; i++) {\n            optionIndex = (i + this.selected + 1) % this.options.length;\n            if (this.options[optionIndex].text.charAt(0).toUpperCase() === ch && !this.options[optionIndex].isDisabled) {\n                this.select(optionIndex);\n                this.selectList.setFocus([optionIndex]);\n                this.selectList.reveal(this.selectList.getFocus()[0]);\n                EventHelper.stop(e);\n                break;\n            }\n        }\n    }\n    dispose() {\n        this.hideSelectDropDown(false);\n        super.dispose();\n    }\n}\n\nexport { SelectBoxList };\n","import { addDisposableListener, addStandardDisposableListener, EventHelper } from '../../dom.js';\nimport { Gesture, EventType } from '../../touch.js';\nimport { equals } from '../../../common/arrays.js';\nimport { Emitter } from '../../../common/event.js';\nimport { Disposable } from '../../../common/lifecycle.js';\nimport { isMacintosh } from '../../../common/platform.js';\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 *--------------------------------------------------------------------------------------------*/\nclass SelectBoxNative extends Disposable {\n    constructor(options, selected, styles, selectBoxOptions) {\n        super();\n        this.selected = 0;\n        this.selectBoxOptions = selectBoxOptions || Object.create(null);\n        this.options = [];\n        this.selectElement = document.createElement('select');\n        this.selectElement.className = 'monaco-select-box';\n        if (typeof this.selectBoxOptions.ariaLabel === 'string') {\n            this.selectElement.setAttribute('aria-label', this.selectBoxOptions.ariaLabel);\n        }\n        if (typeof this.selectBoxOptions.ariaDescription === 'string') {\n            this.selectElement.setAttribute('aria-description', this.selectBoxOptions.ariaDescription);\n        }\n        this._onDidSelect = this._register(new Emitter());\n        this.styles = styles;\n        this.registerListeners();\n        this.setOptions(options, selected);\n    }\n    registerListeners() {\n        this._register(Gesture.addTarget(this.selectElement));\n        [EventType.Tap].forEach(eventType => {\n            this._register(addDisposableListener(this.selectElement, eventType, (e) => {\n                this.selectElement.focus();\n            }));\n        });\n        this._register(addStandardDisposableListener(this.selectElement, 'click', (e) => {\n            EventHelper.stop(e, true);\n        }));\n        this._register(addStandardDisposableListener(this.selectElement, 'change', (e) => {\n            this.selectElement.title = e.target.value;\n            this._onDidSelect.fire({\n                index: e.target.selectedIndex,\n                selected: e.target.value\n            });\n        }));\n        this._register(addStandardDisposableListener(this.selectElement, 'keydown', (e) => {\n            let showSelect = false;\n            if (isMacintosh) {\n                if (e.keyCode === 18 /* KeyCode.DownArrow */ || e.keyCode === 16 /* KeyCode.UpArrow */ || e.keyCode === 10 /* KeyCode.Space */) {\n                    showSelect = true;\n                }\n            }\n            else {\n                if (e.keyCode === 18 /* KeyCode.DownArrow */ && e.altKey || e.keyCode === 10 /* KeyCode.Space */ || e.keyCode === 3 /* KeyCode.Enter */) {\n                    showSelect = true;\n                }\n            }\n            if (showSelect) {\n                // Space, Enter, is used to expand select box, do not propagate it (prevent action bar action run)\n                e.stopPropagation();\n            }\n        }));\n    }\n    get onDidSelect() {\n        return this._onDidSelect.event;\n    }\n    setOptions(options, selected) {\n        if (!this.options || !equals(this.options, options)) {\n            this.options = options;\n            this.selectElement.options.length = 0;\n            this.options.forEach((option, index) => {\n                this.selectElement.add(this.createOption(option.text, index, option.isDisabled));\n            });\n        }\n        if (selected !== undefined) {\n            this.select(selected);\n        }\n    }\n    select(index) {\n        if (this.options.length === 0) {\n            this.selected = 0;\n        }\n        else if (index >= 0 && index < this.options.length) {\n            this.selected = index;\n        }\n        else if (index > this.options.length - 1) {\n            // Adjust index to end of list\n            // This could make client out of sync with the select\n            this.select(this.options.length - 1);\n        }\n        else if (this.selected < 0) {\n            this.selected = 0;\n        }\n        this.selectElement.selectedIndex = this.selected;\n        if ((this.selected < this.options.length) && typeof this.options[this.selected].text === 'string') {\n            this.selectElement.title = this.options[this.selected].text;\n        }\n        else {\n            this.selectElement.title = '';\n        }\n    }\n    focus() {\n        if (this.selectElement) {\n            this.selectElement.tabIndex = 0;\n            this.selectElement.focus();\n        }\n    }\n    blur() {\n        if (this.selectElement) {\n            this.selectElement.tabIndex = -1;\n            this.selectElement.blur();\n        }\n    }\n    setFocusable(focusable) {\n        this.selectElement.tabIndex = focusable ? 0 : -1;\n    }\n    render(container) {\n        container.classList.add('select-container');\n        container.appendChild(this.selectElement);\n        this.setOptions(this.options, this.selected);\n        this.applyStyles();\n    }\n    applyStyles() {\n        // Style native select\n        if (this.selectElement) {\n            this.selectElement.style.backgroundColor = this.styles.selectBackground ?? '';\n            this.selectElement.style.color = this.styles.selectForeground ?? '';\n            this.selectElement.style.borderColor = this.styles.selectBorder ?? '';\n        }\n    }\n    createOption(value, index, disabled) {\n        const option = document.createElement('option');\n        option.value = value;\n        option.text = value;\n        option.disabled = !!disabled;\n        return option;\n    }\n}\n\nexport { SelectBoxNative };\n","import { isMacintosh } from '../../../common/platform.js';\nimport { Widget } from '../widget.js';\nimport './selectBox.css';\nimport { SelectBoxList } from './selectBoxCustom.js';\nimport { SelectBoxNative } from './selectBoxNative.js';\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 *--------------------------------------------------------------------------------------------*/\nclass SelectBox extends Widget {\n    constructor(options, selected, contextViewProvider, styles, selectBoxOptions) {\n        super();\n        // Default to native SelectBox for OSX unless overridden\n        if (isMacintosh && !selectBoxOptions?.useCustomDrawn) {\n            this.selectBoxDelegate = new SelectBoxNative(options, selected, styles, selectBoxOptions);\n        }\n        else {\n            this.selectBoxDelegate = new SelectBoxList(options, selected, contextViewProvider, styles, selectBoxOptions);\n        }\n        this._register(this.selectBoxDelegate);\n    }\n    // Public SelectBox Methods - routed through delegate interface\n    get onDidSelect() {\n        return this.selectBoxDelegate.onDidSelect;\n    }\n    setOptions(options, selected) {\n        this.selectBoxDelegate.setOptions(options, selected);\n    }\n    select(index) {\n        this.selectBoxDelegate.select(index);\n    }\n    focus() {\n        this.selectBoxDelegate.focus();\n    }\n    blur() {\n        this.selectBoxDelegate.blur();\n    }\n    setFocusable(focusable) {\n        this.selectBoxDelegate.setFocusable(focusable);\n    }\n    render(container) {\n        this.selectBoxDelegate.render(container);\n    }\n}\n\nexport { SelectBox };\n","import { isFirefox } from '../../browser.js';\nimport { DataTransfers } from '../../dnd.js';\nimport { addDisposableListener, EventType, EventHelper } from '../../dom.js';\nimport { Gesture, EventType as EventType$1 } from '../../touch.js';\nimport { getDefaultHoverDelegate } from '../hover/hoverDelegateFactory.js';\nimport { SelectBox } from '../selectBox/selectBox.js';\nimport { Action, ActionRunner, Separator } from '../../../common/actions.js';\nimport { Disposable } from '../../../common/lifecycle.js';\nimport { isMacintosh } from '../../../common/platform.js';\nimport { isUndefinedOrNull, assertType } from '../../../common/types.js';\nimport './actionbar.css';\nimport { localize } from '../../../../nls.js';\nimport { getBaseLayerHoverDelegate } from '../hover/hoverDelegate2.js';\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 *--------------------------------------------------------------------------------------------*/\nclass BaseActionViewItem extends Disposable {\n    get action() {\n        return this._action;\n    }\n    constructor(context, action, options = {}) {\n        super();\n        this.options = options;\n        this._context = context || this;\n        this._action = action;\n        if (action instanceof Action) {\n            this._register(action.onDidChange(event => {\n                if (!this.element) {\n                    // we have not been rendered yet, so there\n                    // is no point in updating the UI\n                    return;\n                }\n                this.handleActionChangeEvent(event);\n            }));\n        }\n    }\n    handleActionChangeEvent(event) {\n        if (event.enabled !== undefined) {\n            this.updateEnabled();\n        }\n        if (event.checked !== undefined) {\n            this.updateChecked();\n        }\n        if (event.class !== undefined) {\n            this.updateClass();\n        }\n        if (event.label !== undefined) {\n            this.updateLabel();\n            this.updateTooltip();\n        }\n        if (event.tooltip !== undefined) {\n            this.updateTooltip();\n        }\n    }\n    get actionRunner() {\n        if (!this._actionRunner) {\n            this._actionRunner = this._register(new ActionRunner());\n        }\n        return this._actionRunner;\n    }\n    set actionRunner(actionRunner) {\n        this._actionRunner = actionRunner;\n    }\n    isEnabled() {\n        return this._action.enabled;\n    }\n    setActionContext(newContext) {\n        this._context = newContext;\n    }\n    render(container) {\n        const element = this.element = container;\n        this._register(Gesture.addTarget(container));\n        const enableDragging = this.options && this.options.draggable;\n        if (enableDragging) {\n            container.draggable = true;\n            if (isFirefox) {\n                // Firefox: requires to set a text data transfer to get going\n                this._register(addDisposableListener(container, EventType.DRAG_START, e => e.dataTransfer?.setData(DataTransfers.TEXT, this._action.label)));\n            }\n        }\n        this._register(addDisposableListener(element, EventType$1.Tap, e => this.onClick(e, true))); // Preserve focus on tap #125470\n        this._register(addDisposableListener(element, EventType.MOUSE_DOWN, e => {\n            if (!enableDragging) {\n                EventHelper.stop(e, true); // do not run when dragging is on because that would disable it\n            }\n            if (this._action.enabled && e.button === 0) {\n                element.classList.add('active');\n            }\n        }));\n        if (isMacintosh) {\n            // macOS: allow to trigger the button when holding Ctrl+key and pressing the\n            // main mouse button. This is for scenarios where e.g. some interaction forces\n            // the Ctrl+key to be pressed and hold but the user still wants to interact\n            // with the actions (for example quick access in quick navigation mode).\n            this._register(addDisposableListener(element, EventType.CONTEXT_MENU, e => {\n                if (e.button === 0 && e.ctrlKey === true) {\n                    this.onClick(e);\n                }\n            }));\n        }\n        this._register(addDisposableListener(element, EventType.CLICK, e => {\n            EventHelper.stop(e, true);\n            // menus do not use the click event\n            if (!(this.options && this.options.isMenu)) {\n                this.onClick(e);\n            }\n        }));\n        this._register(addDisposableListener(element, EventType.DBLCLICK, e => {\n            EventHelper.stop(e, true);\n        }));\n        [EventType.MOUSE_UP, EventType.MOUSE_OUT].forEach(event => {\n            this._register(addDisposableListener(element, event, e => {\n                EventHelper.stop(e);\n                element.classList.remove('active');\n            }));\n        });\n    }\n    onClick(event, preserveFocus = false) {\n        EventHelper.stop(event, true);\n        const context = isUndefinedOrNull(this._context) ? this.options?.useEventAsContext ? event : { preserveFocus } : this._context;\n        this.actionRunner.run(this._action, context);\n    }\n    // Only set the tabIndex on the element once it is about to get focused\n    // That way this element wont be a tab stop when it is not needed #106441\n    focus() {\n        if (this.element) {\n            this.element.tabIndex = 0;\n            this.element.focus();\n            this.element.classList.add('focused');\n        }\n    }\n    blur() {\n        if (this.element) {\n            this.element.blur();\n            this.element.tabIndex = -1;\n            this.element.classList.remove('focused');\n        }\n    }\n    setFocusable(focusable) {\n        if (this.element) {\n            this.element.tabIndex = focusable ? 0 : -1;\n        }\n    }\n    get trapsArrowNavigation() {\n        return false;\n    }\n    updateEnabled() {\n        // implement in subclass\n    }\n    updateLabel() {\n        // implement in subclass\n    }\n    getClass() {\n        return this.action.class;\n    }\n    getTooltip() {\n        return this.action.tooltip;\n    }\n    getHoverContents() {\n        return this.getTooltip();\n    }\n    updateTooltip() {\n        if (!this.element) {\n            return;\n        }\n        const title = this.getHoverContents() ?? '';\n        this.updateAriaLabel();\n        if (!this.customHover && title !== '') {\n            const hoverDelegate = this.options.hoverDelegate ?? getDefaultHoverDelegate('element');\n            this.customHover = this._store.add(getBaseLayerHoverDelegate().setupManagedHover(hoverDelegate, this.element, title));\n        }\n        else if (this.customHover) {\n            this.customHover.update(title);\n        }\n    }\n    updateAriaLabel() {\n        if (this.element) {\n            const title = this.getTooltip() ?? '';\n            this.element.setAttribute('aria-label', title);\n        }\n    }\n    updateClass() {\n        // implement in subclass\n    }\n    updateChecked() {\n        // implement in subclass\n    }\n    dispose() {\n        if (this.element) {\n            this.element.remove();\n            this.element = undefined;\n        }\n        this._context = undefined;\n        super.dispose();\n    }\n}\nclass ActionViewItem extends BaseActionViewItem {\n    constructor(context, action, options) {\n        options = {\n            ...options,\n            icon: options.icon !== undefined ? options.icon : false,\n            label: options.label !== undefined ? options.label : true,\n        };\n        super(context, action, options);\n        this.options = options;\n        this.cssClass = '';\n    }\n    render(container) {\n        super.render(container);\n        assertType(this.element);\n        const label = document.createElement('a');\n        label.classList.add('action-label');\n        label.setAttribute('role', this.getDefaultAriaRole());\n        this.label = label;\n        this.element.appendChild(label);\n        if (this.options.label && this.options.keybinding && !this.options.keybindingNotRenderedWithLabel) {\n            const kbLabel = document.createElement('span');\n            kbLabel.classList.add('keybinding');\n            kbLabel.textContent = this.options.keybinding;\n            this.element.appendChild(kbLabel);\n        }\n        this.updateClass();\n        this.updateLabel();\n        this.updateTooltip();\n        this.updateEnabled();\n        this.updateChecked();\n    }\n    getDefaultAriaRole() {\n        if (this._action.id === Separator.ID) {\n            return 'presentation'; // A separator is a presentation item\n        }\n        else {\n            if (this.options.isMenu) {\n                return 'menuitem';\n            }\n            else if (this.options.isTabList) {\n                return 'tab';\n            }\n            else {\n                return 'button';\n            }\n        }\n    }\n    // Only set the tabIndex on the element once it is about to get focused\n    // That way this element wont be a tab stop when it is not needed #106441\n    focus() {\n        if (this.label) {\n            this.label.tabIndex = 0;\n            this.label.focus();\n        }\n    }\n    blur() {\n        if (this.label) {\n            this.label.tabIndex = -1;\n        }\n    }\n    setFocusable(focusable) {\n        if (this.label) {\n            this.label.tabIndex = focusable ? 0 : -1;\n        }\n    }\n    updateLabel() {\n        if (this.options.label && this.label) {\n            this.label.textContent = this.action.label;\n        }\n    }\n    getTooltip() {\n        let title = null;\n        if (this.action.tooltip) {\n            title = this.action.tooltip;\n        }\n        else if (this.action.label) {\n            title = this.action.label;\n            if (this.options.keybinding) {\n                title = localize(0, \"{0} ({1})\", title, this.options.keybinding);\n            }\n        }\n        return title ?? undefined;\n    }\n    updateClass() {\n        if (this.cssClass && this.label) {\n            this.label.classList.remove(...this.cssClass.split(' '));\n        }\n        if (this.options.icon) {\n            this.cssClass = this.getClass();\n            if (this.label) {\n                this.label.classList.add('codicon');\n                if (this.cssClass) {\n                    this.label.classList.add(...this.cssClass.split(' '));\n                }\n            }\n            this.updateEnabled();\n        }\n        else {\n            this.label?.classList.remove('codicon');\n        }\n    }\n    updateEnabled() {\n        if (this.action.enabled) {\n            if (this.label) {\n                this.label.removeAttribute('aria-disabled');\n                this.label.classList.remove('disabled');\n            }\n            this.element?.classList.remove('disabled');\n        }\n        else {\n            if (this.label) {\n                this.label.setAttribute('aria-disabled', 'true');\n                this.label.classList.add('disabled');\n            }\n            this.element?.classList.add('disabled');\n        }\n    }\n    updateAriaLabel() {\n        if (this.label) {\n            const title = this.getTooltip() ?? '';\n            this.label.setAttribute('aria-label', title);\n        }\n    }\n    updateChecked() {\n        if (this.label) {\n            if (this.action.checked !== undefined) {\n                this.label.classList.toggle('checked', this.action.checked);\n                if (this.options.isTabList) {\n                    this.label.setAttribute('aria-selected', this.action.checked ? 'true' : 'false');\n                }\n                else {\n                    this.label.setAttribute('aria-checked', this.action.checked ? 'true' : 'false');\n                    this.label.setAttribute('role', 'checkbox');\n                }\n            }\n            else {\n                this.label.classList.remove('checked');\n                this.label.removeAttribute(this.options.isTabList ? 'aria-selected' : 'aria-checked');\n                this.label.setAttribute('role', this.getDefaultAriaRole());\n            }\n        }\n    }\n}\nclass SelectActionViewItem extends BaseActionViewItem {\n    constructor(ctx, action, options, selected, contextViewProvider, styles, selectBoxOptions) {\n        super(ctx, action);\n        this.selectBox = new SelectBox(options, selected, contextViewProvider, styles, selectBoxOptions);\n        this.selectBox.setFocusable(false);\n        this._register(this.selectBox);\n        this.registerListeners();\n    }\n    select(index) {\n        this.selectBox.select(index);\n    }\n    registerListeners() {\n        this._register(this.selectBox.onDidSelect(e => this.runAction(e.selected, e.index)));\n    }\n    runAction(option, index) {\n        this.actionRunner.run(this._action, this.getActionContext(option, index));\n    }\n    getActionContext(option, index) {\n        return option;\n    }\n    setFocusable(focusable) {\n        this.selectBox.setFocusable(focusable);\n    }\n    focus() {\n        this.selectBox?.focus();\n    }\n    blur() {\n        this.selectBox?.blur();\n    }\n    render(container) {\n        this.selectBox.render(container);\n    }\n}\n\nexport { ActionViewItem, BaseActionViewItem, SelectActionViewItem };\n","import { addDisposableListener, EventType, trackFocus, getActiveElement, isAncestor, isHTMLElement, EventHelper, clearNode } from '../../dom.js';\nimport { StandardKeyboardEvent } from '../../keyboardEvent.js';\nimport { BaseActionViewItem, ActionViewItem } from './actionViewItems.js';\nimport { createInstantHoverDelegate } from '../hover/hoverDelegateFactory.js';\nimport { ActionRunner, Separator } from '../../../common/actions.js';\nimport { Emitter } from '../../../common/event.js';\nimport { Disposable, DisposableStore, DisposableMap, dispose } from '../../../common/lifecycle.js';\nimport { isNumber, isFunction } from '../../../common/types.js';\nimport './actionbar.css';\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 *--------------------------------------------------------------------------------------------*/\nclass ActionBar extends Disposable {\n    get onDidBlur() { return this._onDidBlur.event; }\n    get onDidCancel() { return this._onDidCancel.event; }\n    get onDidRun() { return this._onDidRun.event; }\n    get onWillRun() { return this._onWillRun.event; }\n    constructor(container, options = {}) {\n        super();\n        this._actionRunnerDisposables = this._register(new DisposableStore());\n        this.viewItemDisposables = this._register(new DisposableMap());\n        // Trigger Key Tracking\n        this.triggerKeyDown = false;\n        this.focusable = true;\n        this._onDidBlur = this._register(new Emitter());\n        this._onDidCancel = this._register(new Emitter({ onWillAddFirstListener: () => this.cancelHasListener = true }));\n        this.cancelHasListener = false;\n        this._onDidRun = this._register(new Emitter());\n        this._onWillRun = this._register(new Emitter());\n        this.options = options;\n        this._context = options.context ?? null;\n        this._orientation = this.options.orientation ?? 0 /* ActionsOrientation.HORIZONTAL */;\n        this._triggerKeys = {\n            keyDown: this.options.triggerKeys?.keyDown ?? false,\n            keys: this.options.triggerKeys?.keys ?? [3 /* KeyCode.Enter */, 10 /* KeyCode.Space */]\n        };\n        this._hoverDelegate = options.hoverDelegate ?? this._register(createInstantHoverDelegate());\n        if (this.options.actionRunner) {\n            this._actionRunner = this.options.actionRunner;\n        }\n        else {\n            this._actionRunner = new ActionRunner();\n            this._actionRunnerDisposables.add(this._actionRunner);\n        }\n        this._actionRunnerDisposables.add(this._actionRunner.onDidRun(e => this._onDidRun.fire(e)));\n        this._actionRunnerDisposables.add(this._actionRunner.onWillRun(e => this._onWillRun.fire(e)));\n        this.viewItems = [];\n        this.focusedItem = undefined;\n        this.domNode = document.createElement('div');\n        this.domNode.className = 'monaco-action-bar';\n        let previousKeys;\n        let nextKeys;\n        switch (this._orientation) {\n            case 0 /* ActionsOrientation.HORIZONTAL */:\n                previousKeys = [15 /* KeyCode.LeftArrow */];\n                nextKeys = [17 /* KeyCode.RightArrow */];\n                break;\n            case 1 /* ActionsOrientation.VERTICAL */:\n                previousKeys = [16 /* KeyCode.UpArrow */];\n                nextKeys = [18 /* KeyCode.DownArrow */];\n                this.domNode.className += ' vertical';\n                break;\n        }\n        this._register(addDisposableListener(this.domNode, EventType.KEY_DOWN, e => {\n            const event = new StandardKeyboardEvent(e);\n            let eventHandled = true;\n            const focusedItem = typeof this.focusedItem === 'number' ? this.viewItems[this.focusedItem] : undefined;\n            if (previousKeys && (event.equals(previousKeys[0]) || event.equals(previousKeys[1]))) {\n                eventHandled = this.focusPrevious();\n            }\n            else if (nextKeys && (event.equals(nextKeys[0]) || event.equals(nextKeys[1]))) {\n                eventHandled = this.focusNext();\n            }\n            else if (event.equals(9 /* KeyCode.Escape */) && this.cancelHasListener) {\n                this._onDidCancel.fire();\n            }\n            else if (event.equals(14 /* KeyCode.Home */)) {\n                eventHandled = this.focusFirst();\n            }\n            else if (event.equals(13 /* KeyCode.End */)) {\n                eventHandled = this.focusLast();\n            }\n            else if (event.equals(2 /* KeyCode.Tab */) && focusedItem instanceof BaseActionViewItem && focusedItem.trapsArrowNavigation) {\n                // Tab, so forcibly focus next #219199\n                eventHandled = this.focusNext(undefined, true);\n            }\n            else if (this.isTriggerKeyEvent(event)) {\n                // Staying out of the else branch even if not triggered\n                if (this._triggerKeys.keyDown) {\n                    this.doTrigger(event);\n                }\n                else {\n                    this.triggerKeyDown = true;\n                }\n            }\n            else {\n                eventHandled = false;\n            }\n            if (eventHandled) {\n                event.preventDefault();\n                event.stopPropagation();\n            }\n        }));\n        this._register(addDisposableListener(this.domNode, EventType.KEY_UP, e => {\n            const event = new StandardKeyboardEvent(e);\n            // Run action on Enter/Space\n            if (this.isTriggerKeyEvent(event)) {\n                if (!this._triggerKeys.keyDown && this.triggerKeyDown) {\n                    this.triggerKeyDown = false;\n                    this.doTrigger(event);\n                }\n                event.preventDefault();\n                event.stopPropagation();\n            }\n            // Recompute focused item\n            else if (event.equals(2 /* KeyCode.Tab */) || event.equals(1024 /* KeyMod.Shift */ | 2 /* KeyCode.Tab */) || event.equals(16 /* KeyCode.UpArrow */) || event.equals(18 /* KeyCode.DownArrow */) || event.equals(15 /* KeyCode.LeftArrow */) || event.equals(17 /* KeyCode.RightArrow */)) {\n                this.updateFocusedItem();\n            }\n        }));\n        this.focusTracker = this._register(trackFocus(this.domNode));\n        this._register(this.focusTracker.onDidBlur(() => {\n            if (getActiveElement() === this.domNode || !isAncestor(getActiveElement(), this.domNode)) {\n                this._onDidBlur.fire();\n                this.previouslyFocusedItem = this.focusedItem;\n                this.focusedItem = undefined;\n                this.triggerKeyDown = false;\n            }\n        }));\n        this._register(this.focusTracker.onDidFocus(() => this.updateFocusedItem()));\n        this.actionsList = document.createElement('ul');\n        this.actionsList.className = 'actions-container';\n        if (this.options.highlightToggledItems) {\n            this.actionsList.classList.add('highlight-toggled');\n        }\n        this.actionsList.setAttribute('role', this.options.ariaRole || 'toolbar');\n        if (this.options.ariaLabel) {\n            this.actionsList.setAttribute('aria-label', this.options.ariaLabel);\n        }\n        this.domNode.appendChild(this.actionsList);\n        container.appendChild(this.domNode);\n    }\n    refreshRole() {\n        if (this.length() >= 1) {\n            this.actionsList.setAttribute('role', this.options.ariaRole || 'toolbar');\n        }\n        else {\n            this.actionsList.setAttribute('role', 'presentation');\n        }\n    }\n    // Some action bars should not be focusable at times\n    // When an action bar is not focusable make sure to make all the elements inside it not focusable\n    // When an action bar is focusable again, make sure the first item can be focused\n    setFocusable(focusable) {\n        this.focusable = focusable;\n        if (this.focusable) {\n            const firstEnabled = this.viewItems.find(vi => vi instanceof BaseActionViewItem && vi.isEnabled());\n            if (firstEnabled instanceof BaseActionViewItem) {\n                firstEnabled.setFocusable(true);\n            }\n        }\n        else {\n            this.viewItems.forEach(vi => {\n                if (vi instanceof BaseActionViewItem) {\n                    vi.setFocusable(false);\n                }\n            });\n        }\n    }\n    isTriggerKeyEvent(event) {\n        let ret = false;\n        this._triggerKeys.keys.forEach(keyCode => {\n            ret = ret || event.equals(keyCode);\n        });\n        return ret;\n    }\n    updateFocusedItem() {\n        for (let i = 0; i < this.actionsList.children.length; i++) {\n            const elem = this.actionsList.children[i];\n            if (isAncestor(getActiveElement(), elem)) {\n                this.focusedItem = i;\n                this.viewItems[this.focusedItem]?.showHover?.();\n                break;\n            }\n        }\n    }\n    get context() {\n        return this._context;\n    }\n    set context(context) {\n        this._context = context;\n        this.viewItems.forEach(i => i.setActionContext(context));\n    }\n    get actionRunner() {\n        return this._actionRunner;\n    }\n    set actionRunner(actionRunner) {\n        this._actionRunner = actionRunner;\n        // when setting a new `IActionRunner` make sure to dispose old listeners and\n        // start to forward events from the new listener\n        this._actionRunnerDisposables.clear();\n        this._actionRunnerDisposables.add(this._actionRunner.onDidRun(e => this._onDidRun.fire(e)));\n        this._actionRunnerDisposables.add(this._actionRunner.onWillRun(e => this._onWillRun.fire(e)));\n        this.viewItems.forEach(item => item.actionRunner = actionRunner);\n    }\n    getContainer() {\n        return this.domNode;\n    }\n    getAction(indexOrElement) {\n        // by index\n        if (typeof indexOrElement === 'number') {\n            return this.viewItems[indexOrElement]?.action;\n        }\n        // by element\n        if (isHTMLElement(indexOrElement)) {\n            while (indexOrElement.parentElement !== this.actionsList) {\n                if (!indexOrElement.parentElement) {\n                    return undefined;\n                }\n                indexOrElement = indexOrElement.parentElement;\n            }\n            for (let i = 0; i < this.actionsList.childNodes.length; i++) {\n                if (this.actionsList.childNodes[i] === indexOrElement) {\n                    return this.viewItems[i].action;\n                }\n            }\n        }\n        return undefined;\n    }\n    push(arg, options = {}) {\n        const actions = Array.isArray(arg) ? arg : [arg];\n        let index = isNumber(options.index) ? options.index : null;\n        actions.forEach((action) => {\n            const actionViewItemElement = document.createElement('li');\n            actionViewItemElement.className = 'action-item';\n            actionViewItemElement.setAttribute('role', 'presentation');\n            let item;\n            const viewItemOptions = { hoverDelegate: this._hoverDelegate, ...options, isTabList: this.options.ariaRole === 'tablist' };\n            if (this.options.actionViewItemProvider) {\n                item = this.options.actionViewItemProvider(action, viewItemOptions);\n            }\n            if (!item) {\n                item = new ActionViewItem(this.context, action, viewItemOptions);\n            }\n            // Prevent native context menu on actions\n            if (!this.options.allowContextMenu) {\n                this.viewItemDisposables.set(item, addDisposableListener(actionViewItemElement, EventType.CONTEXT_MENU, (e) => {\n                    EventHelper.stop(e, true);\n                }));\n            }\n            item.actionRunner = this._actionRunner;\n            item.setActionContext(this.context);\n            item.render(actionViewItemElement);\n            if (index === null || index < 0 || index >= this.actionsList.children.length) {\n                this.actionsList.appendChild(actionViewItemElement);\n                this.viewItems.push(item);\n            }\n            else {\n                this.actionsList.insertBefore(actionViewItemElement, this.actionsList.children[index]);\n                this.viewItems.splice(index, 0, item);\n                index++;\n            }\n        });\n        // We need to allow for the first enabled item to be focused on using tab navigation #106441\n        if (this.focusable) {\n            let didFocus = false;\n            for (const item of this.viewItems) {\n                if (!(item instanceof BaseActionViewItem)) {\n                    continue;\n                }\n                let focus;\n                if (didFocus) {\n                    focus = false; // already focused an item\n                }\n                else if (item.action.id === Separator.ID) {\n                    focus = false; // never focus a separator\n                }\n                else if (!item.isEnabled() && this.options.focusOnlyEnabledItems) {\n                    focus = false; // never focus a disabled item\n                }\n                else {\n                    focus = true;\n                }\n                if (focus) {\n                    item.setFocusable(true);\n                    didFocus = true;\n                }\n                else {\n                    item.setFocusable(false);\n                }\n            }\n        }\n        if (typeof this.focusedItem === 'number') {\n            // After a clear actions might be re-added to simply toggle some actions. We should preserve focus #97128\n            this.focus(this.focusedItem);\n        }\n        this.refreshRole();\n    }\n    getWidth(index) {\n        if (index >= 0 && index < this.actionsList.children.length) {\n            const item = this.actionsList.children.item(index);\n            if (item) {\n                return item.clientWidth;\n            }\n        }\n        return 0;\n    }\n    pull(index) {\n        if (index >= 0 && index < this.viewItems.length) {\n            this.actionsList.childNodes[index].remove();\n            this.viewItemDisposables.deleteAndDispose(this.viewItems[index]);\n            dispose(this.viewItems.splice(index, 1));\n            this.refreshRole();\n        }\n    }\n    clear() {\n        if (this.isEmpty()) {\n            return;\n        }\n        this.viewItems = dispose(this.viewItems);\n        this.viewItemDisposables.clearAndDisposeAll();\n        clearNode(this.actionsList);\n        this.refreshRole();\n    }\n    length() {\n        return this.viewItems.length;\n    }\n    isEmpty() {\n        return this.viewItems.length === 0;\n    }\n    focus(arg) {\n        let selectFirst = false;\n        let index = undefined;\n        if (arg === undefined) {\n            selectFirst = true;\n        }\n        else if (typeof arg === 'number') {\n            index = arg;\n        }\n        else if (typeof arg === 'boolean') {\n            selectFirst = arg;\n        }\n        if (selectFirst && typeof this.focusedItem === 'undefined') {\n            const firstEnabled = this.viewItems.findIndex(item => item.isEnabled());\n            // Focus the first enabled item\n            this.focusedItem = firstEnabled === -1 ? undefined : firstEnabled;\n            this.updateFocus(undefined, undefined, true);\n        }\n        else {\n            if (index !== undefined) {\n                this.focusedItem = index;\n            }\n            this.updateFocus(undefined, undefined, true);\n        }\n    }\n    focusFirst() {\n        this.focusedItem = this.length() - 1;\n        return this.focusNext(true);\n    }\n    focusLast() {\n        this.focusedItem = 0;\n        return this.focusPrevious(true);\n    }\n    focusNext(forceLoop, forceFocus) {\n        if (typeof this.focusedItem === 'undefined') {\n            this.focusedItem = this.viewItems.length - 1;\n        }\n        else if (this.viewItems.length <= 1) {\n            return false;\n        }\n        const startIndex = this.focusedItem;\n        let item;\n        do {\n            if (!forceLoop && this.options.preventLoopNavigation && this.focusedItem + 1 >= this.viewItems.length) {\n                this.focusedItem = startIndex;\n                return false;\n            }\n            this.focusedItem = (this.focusedItem + 1) % this.viewItems.length;\n            item = this.viewItems[this.focusedItem];\n        } while (this.focusedItem !== startIndex && ((this.options.focusOnlyEnabledItems && !item.isEnabled()) || item.action.id === Separator.ID));\n        this.updateFocus(undefined, undefined, forceFocus);\n        return true;\n    }\n    focusPrevious(forceLoop) {\n        if (typeof this.focusedItem === 'undefined') {\n            this.focusedItem = 0;\n        }\n        else if (this.viewItems.length <= 1) {\n            return false;\n        }\n        const startIndex = this.focusedItem;\n        let item;\n        do {\n            this.focusedItem = this.focusedItem - 1;\n            if (this.focusedItem < 0) {\n                if (!forceLoop && this.options.preventLoopNavigation) {\n                    this.focusedItem = startIndex;\n                    return false;\n                }\n                this.focusedItem = this.viewItems.length - 1;\n            }\n            item = this.viewItems[this.focusedItem];\n        } while (this.focusedItem !== startIndex && ((this.options.focusOnlyEnabledItems && !item.isEnabled()) || item.action.id === Separator.ID));\n        this.updateFocus(true);\n        return true;\n    }\n    updateFocus(fromRight, preventScroll, forceFocus = false) {\n        if (typeof this.focusedItem === 'undefined') {\n            this.actionsList.focus({ preventScroll });\n        }\n        if (this.previouslyFocusedItem !== undefined && this.previouslyFocusedItem !== this.focusedItem) {\n            this.viewItems[this.previouslyFocusedItem]?.blur();\n        }\n        const actionViewItem = this.focusedItem !== undefined ? this.viewItems[this.focusedItem] : undefined;\n        if (actionViewItem) {\n            let focusItem = true;\n            if (!isFunction(actionViewItem.focus)) {\n                focusItem = false;\n            }\n            if (this.options.focusOnlyEnabledItems && isFunction(actionViewItem.isEnabled) && !actionViewItem.isEnabled()) {\n                focusItem = false;\n            }\n            if (actionViewItem.action.id === Separator.ID) {\n                focusItem = false;\n            }\n            if (!focusItem) {\n                this.actionsList.focus({ preventScroll });\n                this.previouslyFocusedItem = undefined;\n            }\n            else if (forceFocus || this.previouslyFocusedItem !== this.focusedItem) {\n                actionViewItem.focus(fromRight);\n                this.previouslyFocusedItem = this.focusedItem;\n            }\n            if (focusItem) {\n                actionViewItem.showHover?.();\n            }\n        }\n    }\n    doTrigger(event) {\n        if (typeof this.focusedItem === 'undefined') {\n            return; //nothing to focus\n        }\n        // trigger action\n        const actionViewItem = this.viewItems[this.focusedItem];\n        if (actionViewItem instanceof BaseActionViewItem) {\n            const context = (actionViewItem._context === null || actionViewItem._context === undefined) ? event : actionViewItem._context;\n            this.run(actionViewItem._action, context);\n        }\n    }\n    async run(action, context) {\n        await this._actionRunner.run(action, context);\n    }\n    dispose() {\n        this._context = undefined;\n        this.viewItems = dispose(this.viewItems);\n        this.getContainer().remove();\n        super.dispose();\n    }\n}\n\nexport { ActionBar };\n","import { findLast } from '../../../../base/common/arraysFind.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { DisposableStore, Disposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { ElementSizeObserver } from '../../config/elementSizeObserver.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { TextLength } from '../../../common/core/text/textLength.js';\nimport { autorun, autorunHandleChanges, autorunWithStore, autorunOpts } from '../../../../base/common/observableInternal/reactions/autorun.js';\nimport { observableValue } from '../../../../base/common/observableInternal/observables/observableValue.js';\nimport { transaction } from '../../../../base/common/observableInternal/transaction.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction joinCombine(arr1, arr2, keySelector, combine) {\n    if (arr1.length === 0) {\n        return arr2;\n    }\n    if (arr2.length === 0) {\n        return arr1;\n    }\n    const result = [];\n    let i = 0;\n    let j = 0;\n    while (i < arr1.length && j < arr2.length) {\n        const val1 = arr1[i];\n        const val2 = arr2[j];\n        const key1 = keySelector(val1);\n        const key2 = keySelector(val2);\n        if (key1 < key2) {\n            result.push(val1);\n            i++;\n        }\n        else if (key1 > key2) {\n            result.push(val2);\n            j++;\n        }\n        else {\n            result.push(combine(val1, val2));\n            i++;\n            j++;\n        }\n    }\n    while (i < arr1.length) {\n        result.push(arr1[i]);\n        i++;\n    }\n    while (j < arr2.length) {\n        result.push(arr2[j]);\n        j++;\n    }\n    return result;\n}\n// TODO make utility\nfunction applyObservableDecorations(editor, decorations) {\n    const d = new DisposableStore();\n    const decorationsCollection = editor.createDecorationsCollection();\n    d.add(autorunOpts({ debugName: () => `Apply decorations from ${decorations.debugName}` }, reader => {\n        const d = decorations.read(reader);\n        decorationsCollection.set(d);\n    }));\n    d.add({\n        dispose: () => {\n            decorationsCollection.clear();\n        }\n    });\n    return d;\n}\nfunction appendRemoveOnDispose(parent, child) {\n    parent.appendChild(child);\n    return toDisposable(() => {\n        child.remove();\n    });\n}\nfunction prependRemoveOnDispose(parent, child) {\n    parent.prepend(child);\n    return toDisposable(() => {\n        child.remove();\n    });\n}\nclass ObservableElementSizeObserver extends Disposable {\n    get width() { return this._width; }\n    get height() { return this._height; }\n    get automaticLayout() { return this._automaticLayout; }\n    constructor(element, dimension) {\n        super();\n        this._automaticLayout = false;\n        this.elementSizeObserver = this._register(new ElementSizeObserver(element, dimension));\n        this._width = observableValue(this, this.elementSizeObserver.getWidth());\n        this._height = observableValue(this, this.elementSizeObserver.getHeight());\n        this._register(this.elementSizeObserver.onDidChange(e => transaction(tx => {\n            /** @description Set width/height from elementSizeObserver */\n            this._width.set(this.elementSizeObserver.getWidth(), tx);\n            this._height.set(this.elementSizeObserver.getHeight(), tx);\n        })));\n    }\n    observe(dimension) {\n        this.elementSizeObserver.observe(dimension);\n    }\n    setAutomaticLayout(automaticLayout) {\n        this._automaticLayout = automaticLayout;\n        if (automaticLayout) {\n            this.elementSizeObserver.startObserving();\n        }\n        else {\n            this.elementSizeObserver.stopObserving();\n        }\n    }\n}\nfunction animatedObservable(targetWindow, base, store) {\n    let targetVal = base.get();\n    let startVal = targetVal;\n    let curVal = targetVal;\n    const result = observableValue('animatedValue', targetVal);\n    let animationStartMs = -1;\n    const durationMs = 300;\n    let animationFrame = undefined;\n    store.add(autorunHandleChanges({\n        changeTracker: {\n            createChangeSummary: () => ({ animate: false }),\n            handleChange: (ctx, s) => {\n                if (ctx.didChange(base)) {\n                    s.animate = s.animate || ctx.change;\n                }\n                return true;\n            }\n        }\n    }, (reader, s) => {\n        /** @description update value */\n        if (animationFrame !== undefined) {\n            targetWindow.cancelAnimationFrame(animationFrame);\n            animationFrame = undefined;\n        }\n        startVal = curVal;\n        targetVal = base.read(reader);\n        animationStartMs = Date.now() - (s.animate ? 0 : durationMs);\n        update();\n    }));\n    function update() {\n        const passedMs = Date.now() - animationStartMs;\n        curVal = Math.floor(easeOutExpo(passedMs, startVal, targetVal - startVal, durationMs));\n        if (passedMs < durationMs) {\n            animationFrame = targetWindow.requestAnimationFrame(update);\n        }\n        else {\n            curVal = targetVal;\n        }\n        result.set(curVal, undefined);\n    }\n    return result;\n}\nfunction easeOutExpo(t, b, c, d) {\n    return t === d ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n}\nclass ViewZoneOverlayWidget extends Disposable {\n    constructor(editor, viewZone, htmlElement) {\n        super();\n        this._register(new ManagedOverlayWidget(editor, htmlElement));\n        this._register(applyStyle(htmlElement, {\n            height: viewZone.actualHeight,\n            top: viewZone.actualTop,\n        }));\n    }\n}\nclass PlaceholderViewZone {\n    get afterLineNumber() { return this._afterLineNumber.get(); }\n    constructor(_afterLineNumber, heightInPx) {\n        this._afterLineNumber = _afterLineNumber;\n        this.heightInPx = heightInPx;\n        this.domNode = document.createElement('div');\n        this._actualTop = observableValue(this, undefined);\n        this._actualHeight = observableValue(this, undefined);\n        this.actualTop = this._actualTop;\n        this.actualHeight = this._actualHeight;\n        this.showInHiddenAreas = true;\n        this.onChange = this._afterLineNumber;\n        this.onDomNodeTop = (top) => {\n            this._actualTop.set(top, undefined);\n        };\n        this.onComputedHeight = (height) => {\n            this._actualHeight.set(height, undefined);\n        };\n    }\n}\nclass ManagedOverlayWidget {\n    static { this._counter = 0; }\n    constructor(_editor, _domElement) {\n        this._editor = _editor;\n        this._domElement = _domElement;\n        this._overlayWidgetId = `managedOverlayWidget-${ManagedOverlayWidget._counter++}`;\n        this._overlayWidget = {\n            getId: () => this._overlayWidgetId,\n            getDomNode: () => this._domElement,\n            getPosition: () => null\n        };\n        this._editor.addOverlayWidget(this._overlayWidget);\n    }\n    dispose() {\n        this._editor.removeOverlayWidget(this._overlayWidget);\n    }\n}\nfunction applyStyle(domNode, style) {\n    return autorun(reader => {\n        /** @description applyStyle */\n        for (let [key, val] of Object.entries(style)) {\n            if (val && typeof val === 'object' && 'read' in val) {\n                // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n                val = val.read(reader);\n            }\n            if (typeof val === 'number') {\n                val = `${val}px`;\n            }\n            key = key.replace(/[A-Z]/g, m => '-' + m.toLowerCase());\n            // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n            domNode.style[key] = val;\n        }\n    });\n}\nfunction applyViewZones(editor, viewZones, setIsUpdating, zoneIds) {\n    const store = new DisposableStore();\n    const lastViewZoneIds = [];\n    store.add(autorunWithStore((reader, store) => {\n        /** @description applyViewZones */\n        const curViewZones = viewZones.read(reader);\n        const viewZonIdsPerViewZone = new Map();\n        const viewZoneIdPerOnChangeObservable = new Map();\n        // Add/remove view zones\n        if (setIsUpdating) {\n            setIsUpdating(true);\n        }\n        editor.changeViewZones(a => {\n            for (const id of lastViewZoneIds) {\n                a.removeZone(id);\n                zoneIds?.delete(id);\n            }\n            lastViewZoneIds.length = 0;\n            for (const z of curViewZones) {\n                const id = a.addZone(z);\n                if (z.setZoneId) {\n                    z.setZoneId(id);\n                }\n                lastViewZoneIds.push(id);\n                zoneIds?.add(id);\n                viewZonIdsPerViewZone.set(z, id);\n            }\n        });\n        if (setIsUpdating) {\n            setIsUpdating(false);\n        }\n        // Layout zone on change\n        store.add(autorunHandleChanges({\n            changeTracker: {\n                createChangeSummary() {\n                    return { zoneIds: [] };\n                },\n                handleChange(context, changeSummary) {\n                    const id = viewZoneIdPerOnChangeObservable.get(context.changedObservable);\n                    if (id !== undefined) {\n                        changeSummary.zoneIds.push(id);\n                    }\n                    return true;\n                },\n            }\n        }, (reader, changeSummary) => {\n            /** @description layoutZone on change */\n            for (const vz of curViewZones) {\n                if (vz.onChange) {\n                    viewZoneIdPerOnChangeObservable.set(vz.onChange, viewZonIdsPerViewZone.get(vz));\n                    vz.onChange.read(reader);\n                }\n            }\n            if (setIsUpdating) {\n                setIsUpdating(true);\n            }\n            editor.changeViewZones(a => { for (const id of changeSummary.zoneIds) {\n                a.layoutZone(id);\n            } });\n            if (setIsUpdating) {\n                setIsUpdating(false);\n            }\n        }));\n    }));\n    store.add({\n        dispose() {\n            if (setIsUpdating) {\n                setIsUpdating(true);\n            }\n            editor.changeViewZones(a => { for (const id of lastViewZoneIds) {\n                a.removeZone(id);\n            } });\n            zoneIds?.clear();\n            if (setIsUpdating) {\n                setIsUpdating(false);\n            }\n        }\n    });\n    return store;\n}\nclass DisposableCancellationTokenSource extends CancellationTokenSource {\n    dispose() {\n        super.dispose(true);\n    }\n}\nfunction translatePosition(posInOriginal, mappings) {\n    const mapping = findLast(mappings, m => m.original.startLineNumber <= posInOriginal.lineNumber);\n    if (!mapping) {\n        // No changes before the position\n        return Range.fromPositions(posInOriginal);\n    }\n    if (mapping.original.endLineNumberExclusive <= posInOriginal.lineNumber) {\n        const newLineNumber = posInOriginal.lineNumber - mapping.original.endLineNumberExclusive + mapping.modified.endLineNumberExclusive;\n        return Range.fromPositions(new Position(newLineNumber, posInOriginal.column));\n    }\n    if (!mapping.innerChanges) {\n        // Only for legacy algorithm\n        return Range.fromPositions(new Position(mapping.modified.startLineNumber, 1));\n    }\n    const innerMapping = findLast(mapping.innerChanges, m => m.originalRange.getStartPosition().isBeforeOrEqual(posInOriginal));\n    if (!innerMapping) {\n        const newLineNumber = posInOriginal.lineNumber - mapping.original.startLineNumber + mapping.modified.startLineNumber;\n        return Range.fromPositions(new Position(newLineNumber, posInOriginal.column));\n    }\n    if (innerMapping.originalRange.containsPosition(posInOriginal)) {\n        return innerMapping.modifiedRange;\n    }\n    else {\n        const l = lengthBetweenPositions(innerMapping.originalRange.getEndPosition(), posInOriginal);\n        return Range.fromPositions(l.addToPosition(innerMapping.modifiedRange.getEndPosition()));\n    }\n}\nfunction lengthBetweenPositions(position1, position2) {\n    if (position1.lineNumber === position2.lineNumber) {\n        return new TextLength(0, position2.column - position1.column);\n    }\n    else {\n        return new TextLength(position2.lineNumber - position1.lineNumber, position2.column - 1);\n    }\n}\nfunction filterWithPrevious(arr, filter) {\n    let prev;\n    return arr.filter(cur => {\n        const result = filter(cur, prev);\n        prev = cur;\n        return result;\n    });\n}\nclass RefCounted {\n    static create(value, debugOwner = undefined) {\n        return new BaseRefCounted(value, value, debugOwner);\n    }\n    static createWithDisposable(value, disposable, debugOwner = undefined) {\n        const store = new DisposableStore();\n        store.add(disposable);\n        store.add(value);\n        return new BaseRefCounted(value, store, debugOwner);\n    }\n}\nclass BaseRefCounted extends RefCounted {\n    constructor(object, _disposable, _debugOwner) {\n        super();\n        this.object = object;\n        this._disposable = _disposable;\n        this._debugOwner = _debugOwner;\n        this._refCount = 1;\n        this._isDisposed = false;\n        this._owners = [];\n        if (_debugOwner) {\n            this._addOwner(_debugOwner);\n        }\n    }\n    _addOwner(debugOwner) {\n        if (debugOwner) {\n            this._owners.push(debugOwner);\n        }\n    }\n    createNewRef(debugOwner) {\n        this._refCount++;\n        if (debugOwner) {\n            this._addOwner(debugOwner);\n        }\n        return new ClonedRefCounted(this, debugOwner);\n    }\n    dispose() {\n        if (this._isDisposed) {\n            return;\n        }\n        this._isDisposed = true;\n        this._decreaseRefCount(this._debugOwner);\n    }\n    _decreaseRefCount(debugOwner) {\n        this._refCount--;\n        if (this._refCount === 0) {\n            this._disposable.dispose();\n        }\n        if (debugOwner) {\n            const idx = this._owners.indexOf(debugOwner);\n            if (idx !== -1) {\n                this._owners.splice(idx, 1);\n            }\n        }\n    }\n}\nclass ClonedRefCounted extends RefCounted {\n    constructor(_base, _debugOwner) {\n        super();\n        this._base = _base;\n        this._debugOwner = _debugOwner;\n        this._isDisposed = false;\n    }\n    get object() { return this._base.object; }\n    createNewRef(debugOwner) {\n        return this._base.createNewRef(debugOwner);\n    }\n    dispose() {\n        if (this._isDisposed) {\n            return;\n        }\n        this._isDisposed = true;\n        this._base._decreaseRefCount(this._debugOwner);\n    }\n}\n\nexport { DisposableCancellationTokenSource, ManagedOverlayWidget, ObservableElementSizeObserver, PlaceholderViewZone, RefCounted, ViewZoneOverlayWidget, animatedObservable, appendRemoveOnDispose, applyObservableDecorations, applyStyle, applyViewZones, filterWithPrevious, joinCombine, prependRemoveOnDispose, translatePosition };\n","import { groupAdjacentBy } from '../../../base/common/arrays.js';\nimport { assertFn, checkAdjacentItems } from '../../../base/common/assert.js';\nimport { BugIndicatingError } from '../../../base/common/errors.js';\nimport { LineRange } from '../core/ranges/lineRange.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { TextReplacement } from '../core/edits/textEdit.js';\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/**\n * Maps a line range in the original text model to a line range in the modified text model.\n */\nclass LineRangeMapping {\n    static inverse(mapping, originalLineCount, modifiedLineCount) {\n        const result = [];\n        let lastOriginalEndLineNumber = 1;\n        let lastModifiedEndLineNumber = 1;\n        for (const m of mapping) {\n            const r = new LineRangeMapping(new LineRange(lastOriginalEndLineNumber, m.original.startLineNumber), new LineRange(lastModifiedEndLineNumber, m.modified.startLineNumber));\n            if (!r.modified.isEmpty) {\n                result.push(r);\n            }\n            lastOriginalEndLineNumber = m.original.endLineNumberExclusive;\n            lastModifiedEndLineNumber = m.modified.endLineNumberExclusive;\n        }\n        const r = new LineRangeMapping(new LineRange(lastOriginalEndLineNumber, originalLineCount + 1), new LineRange(lastModifiedEndLineNumber, modifiedLineCount + 1));\n        if (!r.modified.isEmpty) {\n            result.push(r);\n        }\n        return result;\n    }\n    static clip(mapping, originalRange, modifiedRange) {\n        const result = [];\n        for (const m of mapping) {\n            const original = m.original.intersect(originalRange);\n            const modified = m.modified.intersect(modifiedRange);\n            if (original && !original.isEmpty && modified && !modified.isEmpty) {\n                result.push(new LineRangeMapping(original, modified));\n            }\n        }\n        return result;\n    }\n    constructor(originalRange, modifiedRange) {\n        this.original = originalRange;\n        this.modified = modifiedRange;\n    }\n    toString() {\n        return `{${this.original.toString()}->${this.modified.toString()}}`;\n    }\n    flip() {\n        return new LineRangeMapping(this.modified, this.original);\n    }\n    join(other) {\n        return new LineRangeMapping(this.original.join(other.original), this.modified.join(other.modified));\n    }\n    /**\n     * This method assumes that the LineRangeMapping describes a valid diff!\n     * I.e. if one range is empty, the other range cannot be the entire document.\n     * It avoids various problems when the line range points to non-existing line-numbers.\n    */\n    toRangeMapping() {\n        const origInclusiveRange = this.original.toInclusiveRange();\n        const modInclusiveRange = this.modified.toInclusiveRange();\n        if (origInclusiveRange && modInclusiveRange) {\n            return new RangeMapping(origInclusiveRange, modInclusiveRange);\n        }\n        else if (this.original.startLineNumber === 1 || this.modified.startLineNumber === 1) {\n            if (!(this.modified.startLineNumber === 1 && this.original.startLineNumber === 1)) {\n                // If one line range starts at 1, the other one must start at 1 as well.\n                throw new BugIndicatingError('not a valid diff');\n            }\n            // Because one range is empty and both ranges start at line 1, none of the ranges can cover all lines.\n            // Thus, `endLineNumberExclusive` is a valid line number.\n            return new RangeMapping(new Range(this.original.startLineNumber, 1, this.original.endLineNumberExclusive, 1), new Range(this.modified.startLineNumber, 1, this.modified.endLineNumberExclusive, 1));\n        }\n        else {\n            // We can assume here that both startLineNumbers are greater than 1.\n            return new RangeMapping(new Range(this.original.startLineNumber - 1, Number.MAX_SAFE_INTEGER, this.original.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), new Range(this.modified.startLineNumber - 1, Number.MAX_SAFE_INTEGER, this.modified.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER));\n        }\n    }\n    /**\n     * This method assumes that the LineRangeMapping describes a valid diff!\n     * I.e. if one range is empty, the other range cannot be the entire document.\n     * It avoids various problems when the line range points to non-existing line-numbers.\n    */\n    toRangeMapping2(original, modified) {\n        if (isValidLineNumber(this.original.endLineNumberExclusive, original)\n            && isValidLineNumber(this.modified.endLineNumberExclusive, modified)) {\n            return new RangeMapping(new Range(this.original.startLineNumber, 1, this.original.endLineNumberExclusive, 1), new Range(this.modified.startLineNumber, 1, this.modified.endLineNumberExclusive, 1));\n        }\n        if (!this.original.isEmpty && !this.modified.isEmpty) {\n            return new RangeMapping(Range.fromPositions(new Position(this.original.startLineNumber, 1), normalizePosition(new Position(this.original.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), original)), Range.fromPositions(new Position(this.modified.startLineNumber, 1), normalizePosition(new Position(this.modified.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), modified)));\n        }\n        if (this.original.startLineNumber > 1 && this.modified.startLineNumber > 1) {\n            return new RangeMapping(Range.fromPositions(normalizePosition(new Position(this.original.startLineNumber - 1, Number.MAX_SAFE_INTEGER), original), normalizePosition(new Position(this.original.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), original)), Range.fromPositions(normalizePosition(new Position(this.modified.startLineNumber - 1, Number.MAX_SAFE_INTEGER), modified), normalizePosition(new Position(this.modified.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), modified)));\n        }\n        // Situation now: one range is empty and one range touches the last line and one range starts at line 1.\n        // I don't think this can happen.\n        throw new BugIndicatingError();\n    }\n}\nfunction normalizePosition(position, content) {\n    if (position.lineNumber < 1) {\n        return new Position(1, 1);\n    }\n    if (position.lineNumber > content.length) {\n        return new Position(content.length, content[content.length - 1].length + 1);\n    }\n    const line = content[position.lineNumber - 1];\n    if (position.column > line.length + 1) {\n        return new Position(position.lineNumber, line.length + 1);\n    }\n    return position;\n}\nfunction isValidLineNumber(lineNumber, lines) {\n    return lineNumber >= 1 && lineNumber <= lines.length;\n}\n/**\n * Maps a line range in the original text model to a line range in the modified text model.\n * Also contains inner range mappings.\n */\nclass DetailedLineRangeMapping extends LineRangeMapping {\n    static fromRangeMappings(rangeMappings) {\n        const originalRange = LineRange.join(rangeMappings.map(r => LineRange.fromRangeInclusive(r.originalRange)));\n        const modifiedRange = LineRange.join(rangeMappings.map(r => LineRange.fromRangeInclusive(r.modifiedRange)));\n        return new DetailedLineRangeMapping(originalRange, modifiedRange, rangeMappings);\n    }\n    constructor(originalRange, modifiedRange, innerChanges) {\n        super(originalRange, modifiedRange);\n        this.innerChanges = innerChanges;\n    }\n    flip() {\n        return new DetailedLineRangeMapping(this.modified, this.original, this.innerChanges?.map(c => c.flip()));\n    }\n    withInnerChangesFromLineRanges() {\n        return new DetailedLineRangeMapping(this.original, this.modified, [this.toRangeMapping()]);\n    }\n}\n/**\n * Maps a range in the original text model to a range in the modified text model.\n */\nclass RangeMapping {\n    static fromEdit(edit) {\n        const newRanges = edit.getNewRanges();\n        const result = edit.replacements.map((e, idx) => new RangeMapping(e.range, newRanges[idx]));\n        return result;\n    }\n    static assertSorted(rangeMappings) {\n        for (let i = 1; i < rangeMappings.length; i++) {\n            const previous = rangeMappings[i - 1];\n            const current = rangeMappings[i];\n            if (!(previous.originalRange.getEndPosition().isBeforeOrEqual(current.originalRange.getStartPosition())\n                && previous.modifiedRange.getEndPosition().isBeforeOrEqual(current.modifiedRange.getStartPosition()))) {\n                throw new BugIndicatingError('Range mappings must be sorted');\n            }\n        }\n    }\n    constructor(originalRange, modifiedRange) {\n        this.originalRange = originalRange;\n        this.modifiedRange = modifiedRange;\n    }\n    toString() {\n        return `{${this.originalRange.toString()}->${this.modifiedRange.toString()}}`;\n    }\n    flip() {\n        return new RangeMapping(this.modifiedRange, this.originalRange);\n    }\n    /**\n     * Creates a single text edit that describes the change from the original to the modified text.\n    */\n    toTextEdit(modified) {\n        const newText = modified.getValueOfRange(this.modifiedRange);\n        return new TextReplacement(this.originalRange, newText);\n    }\n}\nfunction lineRangeMappingFromRangeMappings(alignments, originalLines, modifiedLines, dontAssertStartLine = false) {\n    const changes = [];\n    for (const g of groupAdjacentBy(alignments.map(a => getLineRangeMapping(a, originalLines, modifiedLines)), (a1, a2) => a1.original.intersectsOrTouches(a2.original)\n        || a1.modified.intersectsOrTouches(a2.modified))) {\n        const first = g[0];\n        const last = g[g.length - 1];\n        changes.push(new DetailedLineRangeMapping(first.original.join(last.original), first.modified.join(last.modified), g.map(a => a.innerChanges[0])));\n    }\n    assertFn(() => {\n        if (!dontAssertStartLine && changes.length > 0) {\n            if (changes[0].modified.startLineNumber !== changes[0].original.startLineNumber) {\n                return false;\n            }\n            if (modifiedLines.length.lineCount - changes[changes.length - 1].modified.endLineNumberExclusive !== originalLines.length.lineCount - changes[changes.length - 1].original.endLineNumberExclusive) {\n                return false;\n            }\n        }\n        return checkAdjacentItems(changes, (m1, m2) => m2.original.startLineNumber - m1.original.endLineNumberExclusive === m2.modified.startLineNumber - m1.modified.endLineNumberExclusive &&\n            // There has to be an unchanged line in between (otherwise both diffs should have been joined)\n            m1.original.endLineNumberExclusive < m2.original.startLineNumber &&\n            m1.modified.endLineNumberExclusive < m2.modified.startLineNumber);\n    });\n    return changes;\n}\nfunction getLineRangeMapping(rangeMapping, originalLines, modifiedLines) {\n    let lineStartDelta = 0;\n    let lineEndDelta = 0;\n    // rangeMapping describes the edit that replaces `rangeMapping.originalRange` with `newText := getText(modifiedLines, rangeMapping.modifiedRange)`.\n    // original: ]xxx \\n <- this line is not modified\n    // modified: ]xx  \\n\n    if (rangeMapping.modifiedRange.endColumn === 1 && rangeMapping.originalRange.endColumn === 1\n        && rangeMapping.originalRange.startLineNumber + lineStartDelta <= rangeMapping.originalRange.endLineNumber\n        && rangeMapping.modifiedRange.startLineNumber + lineStartDelta <= rangeMapping.modifiedRange.endLineNumber) {\n        // We can only do this if the range is not empty yet\n        lineEndDelta = -1;\n    }\n    // original: xxx[ \\n <- this line is not modified\n    // modified: xxx[ \\n\n    if (rangeMapping.modifiedRange.startColumn - 1 >= modifiedLines.getLineLength(rangeMapping.modifiedRange.startLineNumber)\n        && rangeMapping.originalRange.startColumn - 1 >= originalLines.getLineLength(rangeMapping.originalRange.startLineNumber)\n        && rangeMapping.originalRange.startLineNumber <= rangeMapping.originalRange.endLineNumber + lineEndDelta\n        && rangeMapping.modifiedRange.startLineNumber <= rangeMapping.modifiedRange.endLineNumber + lineEndDelta) {\n        // We can only do this if the range is not empty yet\n        lineStartDelta = 1;\n    }\n    const originalLineRange = new LineRange(rangeMapping.originalRange.startLineNumber + lineStartDelta, rangeMapping.originalRange.endLineNumber + 1 + lineEndDelta);\n    const modifiedLineRange = new LineRange(rangeMapping.modifiedRange.startLineNumber + lineStartDelta, rangeMapping.modifiedRange.endLineNumber + 1 + lineEndDelta);\n    return new DetailedLineRangeMapping(originalLineRange, modifiedLineRange, [rangeMapping]);\n}\n\nexport { DetailedLineRangeMapping, LineRangeMapping, RangeMapping, getLineRangeMapping, lineRangeMappingFromRangeMappings };\n","import { RunOnceScheduler } from '../../../base/common/async.js';\nimport { Codicon } from '../../../base/common/codicons.js';\nimport { getCodiconFontCharacters } from '../../../base/common/codiconsUtil.js';\nimport { ThemeIcon } from '../../../base/common/themables.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { isString } from '../../../base/common/types.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { localize } from '../../../nls.js';\nimport { Extensions as Extensions$1 } from '../../jsonschemas/common/jsonContributionRegistry.js';\nimport { Registry } from '../../registry/common/platform.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\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//  ------ API types\n// icon registry\nconst Extensions = {\n    IconContribution: 'base.contributions.icons'\n};\nvar IconContribution;\n(function (IconContribution) {\n    function getDefinition(contribution, registry) {\n        let definition = contribution.defaults;\n        while (ThemeIcon.isThemeIcon(definition)) {\n            const c = iconRegistry.getIcon(definition.id);\n            if (!c) {\n                return undefined;\n            }\n            definition = c.defaults;\n        }\n        return definition;\n    }\n    IconContribution.getDefinition = getDefinition;\n})(IconContribution || (IconContribution = {}));\nvar IconFontDefinition;\n(function (IconFontDefinition) {\n    function toJSONObject(iconFont) {\n        return {\n            weight: iconFont.weight,\n            style: iconFont.style,\n            src: iconFont.src.map(s => ({ format: s.format, location: s.location.toString() }))\n        };\n    }\n    IconFontDefinition.toJSONObject = toJSONObject;\n    function fromJSONObject(json) {\n        const stringOrUndef = (s) => isString(s) ? s : undefined;\n        if (json && Array.isArray(json.src) && json.src.every((s) => isString(s.format) && isString(s.location))) {\n            return {\n                weight: stringOrUndef(json.weight),\n                style: stringOrUndef(json.style),\n                src: json.src.map((s) => ({ format: s.format, location: URI.parse(s.location) }))\n            };\n        }\n        return undefined;\n    }\n    IconFontDefinition.fromJSONObject = fromJSONObject;\n})(IconFontDefinition || (IconFontDefinition = {}));\n// regexes for validation of font properties\nconst fontIdRegex = /^([\\w_-]+)$/;\nconst fontIdErrorMessage = localize(2024, 'The font ID must only contain letters, numbers, underscores and dashes.');\nclass IconRegistry extends Disposable {\n    constructor() {\n        super();\n        this._onDidChange = this._register(new Emitter());\n        this.onDidChange = this._onDidChange.event;\n        this.iconSchema = {\n            definitions: {\n                icons: {\n                    type: 'object',\n                    properties: {\n                        fontId: { type: 'string', description: localize(2025, 'The id of the font to use. If not set, the font that is defined first is used.'), pattern: fontIdRegex.source, patternErrorMessage: fontIdErrorMessage },\n                        fontCharacter: { type: 'string', description: localize(2026, 'The font character associated with the icon definition.') }\n                    },\n                    additionalProperties: false,\n                    defaultSnippets: [{ body: { fontCharacter: '\\\\\\\\e030' } }]\n                }\n            },\n            type: 'object',\n            properties: {}\n        };\n        this.iconReferenceSchema = { type: 'string', pattern: `^${ThemeIcon.iconNameExpression}$`, enum: [], enumDescriptions: [] };\n        this.iconsById = {};\n        this.iconFontsById = {};\n    }\n    registerIcon(id, defaults, description, deprecationMessage) {\n        const existing = this.iconsById[id];\n        if (existing) {\n            if (description && !existing.description) {\n                existing.description = description;\n                this.iconSchema.properties[id].markdownDescription = `${description} $(${id})`;\n                const enumIndex = this.iconReferenceSchema.enum.indexOf(id);\n                if (enumIndex !== -1) {\n                    this.iconReferenceSchema.enumDescriptions[enumIndex] = description;\n                }\n                this._onDidChange.fire();\n            }\n            return existing;\n        }\n        const iconContribution = { id, description, defaults, deprecationMessage };\n        this.iconsById[id] = iconContribution;\n        const propertySchema = { $ref: '#/definitions/icons' };\n        if (deprecationMessage) {\n            propertySchema.deprecationMessage = deprecationMessage;\n        }\n        if (description) {\n            propertySchema.markdownDescription = `${description}: $(${id})`;\n        }\n        this.iconSchema.properties[id] = propertySchema;\n        this.iconReferenceSchema.enum.push(id);\n        this.iconReferenceSchema.enumDescriptions.push(description || '');\n        this._onDidChange.fire();\n        return { id };\n    }\n    getIcons() {\n        return Object.keys(this.iconsById).map(id => this.iconsById[id]);\n    }\n    getIcon(id) {\n        return this.iconsById[id];\n    }\n    getIconSchema() {\n        return this.iconSchema;\n    }\n    toString() {\n        const sorter = (i1, i2) => {\n            return i1.id.localeCompare(i2.id);\n        };\n        const classNames = (i) => {\n            while (ThemeIcon.isThemeIcon(i.defaults)) {\n                i = this.iconsById[i.defaults.id];\n            }\n            return `codicon codicon-${i ? i.id : ''}`;\n        };\n        const reference = [];\n        reference.push(`| preview     | identifier                        | default codicon ID                | description`);\n        reference.push(`| ----------- | --------------------------------- | --------------------------------- | --------------------------------- |`);\n        const contributions = Object.keys(this.iconsById).map(key => this.iconsById[key]);\n        for (const i of contributions.filter(i => !!i.description).sort(sorter)) {\n            reference.push(`|<i class=\"${classNames(i)}\"></i>|${i.id}|${ThemeIcon.isThemeIcon(i.defaults) ? i.defaults.id : i.id}|${i.description || ''}|`);\n        }\n        reference.push(`| preview     | identifier                        `);\n        reference.push(`| ----------- | --------------------------------- |`);\n        for (const i of contributions.filter(i => !ThemeIcon.isThemeIcon(i.defaults)).sort(sorter)) {\n            reference.push(`|<i class=\"${classNames(i)}\"></i>|${i.id}|`);\n        }\n        return reference.join('\\n');\n    }\n}\nconst iconRegistry = new IconRegistry();\nRegistry.add(Extensions.IconContribution, iconRegistry);\nfunction registerIcon(id, defaults, description, deprecationMessage) {\n    return iconRegistry.registerIcon(id, defaults, description, deprecationMessage);\n}\nfunction getIconRegistry() {\n    return iconRegistry;\n}\nfunction initialize() {\n    const codiconFontCharacters = getCodiconFontCharacters();\n    for (const icon in codiconFontCharacters) {\n        const fontCharacter = '\\\\' + codiconFontCharacters[icon].toString(16);\n        iconRegistry.registerIcon(icon, { fontCharacter });\n    }\n}\ninitialize();\nconst iconsSchemaId = 'vscode://schemas/icons';\nconst schemaRegistry = Registry.as(Extensions$1.JSONContribution);\nschemaRegistry.registerSchema(iconsSchemaId, iconRegistry.getIconSchema());\nconst delayer = new RunOnceScheduler(() => schemaRegistry.notifySchemaChanged(iconsSchemaId), 200);\niconRegistry.onDidChange(() => {\n    if (!delayer.isScheduled()) {\n        delayer.schedule();\n    }\n});\n//setTimeout(_ => console.log(iconRegistry.toString()), 5000);\n// common icons\nconst widgetClose = registerIcon('widget-close', Codicon.close, localize(2027, 'Icon for the close action in widgets.'));\nregisterIcon('goto-previous-location', Codicon.arrowUp, localize(2028, 'Icon for goto previous editor location.'));\nregisterIcon('goto-next-location', Codicon.arrowDown, localize(2029, 'Icon for goto next editor location.'));\nThemeIcon.modify(Codicon.sync, 'spin');\nThemeIcon.modify(Codicon.loading, 'spin');\n\nexport { Extensions, IconContribution, IconFontDefinition, fontIdErrorMessage, fontIdRegex, getIconRegistry, iconsSchemaId, registerIcon, widgetClose };\n","import { reset, addStandardDisposableListener, addDisposableListener } from '../../../../../base/browser/dom.js';\nimport { createTrustedTypesPolicy } from '../../../../../base/browser/trustedTypes.js';\nimport { ActionBar } from '../../../../../base/browser/ui/actionbar/actionbar.js';\nimport { DomScrollableElement } from '../../../../../base/browser/ui/scrollbar/scrollableElement.js';\nimport { groupAdjacentBy, forEachAdjacent } from '../../../../../base/common/arrays.js';\nimport { Codicon } from '../../../../../base/common/codicons.js';\nimport { Disposable, toDisposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { ThemeIcon } from '../../../../../base/common/themables.js';\nimport { applyFontInfo } from '../../../config/domFontInfo.js';\nimport { applyStyle } from '../utils.js';\nimport { EditorFontLigatures } from '../../../../common/config/editorOptions.js';\nimport { LineRange } from '../../../../common/core/ranges/lineRange.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { LineRangeMapping } from '../../../../common/diff/rangeMapping.js';\nimport { ILanguageService } from '../../../../common/languages/language.js';\nimport { LineTokens } from '../../../../common/tokens/lineTokens.js';\nimport { renderViewLine2, RenderLineInput } from '../../../../common/viewLayout/viewLineRenderer.js';\nimport { ViewLineRenderingData } from '../../../../common/viewModel.js';\nimport { localize } from '../../../../../nls.js';\nimport { AccessibilitySignal, IAccessibilitySignalService } from '../../../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { registerIcon } from '../../../../../platform/theme/common/iconRegistry.js';\nimport './accessibleDiffViewer.css';\nimport { toAction } from '../../../../../base/common/actions.js';\nimport { transaction, subtransaction } from '../../../../../base/common/observableInternal/transaction.js';\nimport { derived } from '../../../../../base/common/observableInternal/observables/derived.js';\nimport { observableValue } from '../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { autorun, autorunWithStore } from '../../../../../base/common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst accessibleDiffViewerInsertIcon = registerIcon('diff-review-insert', Codicon.add, localize(97, 'Icon for \\'Insert\\' in accessible diff viewer.'));\nconst accessibleDiffViewerRemoveIcon = registerIcon('diff-review-remove', Codicon.remove, localize(98, 'Icon for \\'Remove\\' in accessible diff viewer.'));\nconst accessibleDiffViewerCloseIcon = registerIcon('diff-review-close', Codicon.close, localize(99, 'Icon for \\'Close\\' in accessible diff viewer.'));\nlet AccessibleDiffViewer = class AccessibleDiffViewer extends Disposable {\n    static { this._ttPolicy = createTrustedTypesPolicy('diffReview', { createHTML: value => value }); }\n    constructor(_parentNode, _visible, _setVisible, _canClose, _width, _height, _diffs, _models, _instantiationService) {\n        super();\n        this._parentNode = _parentNode;\n        this._visible = _visible;\n        this._setVisible = _setVisible;\n        this._canClose = _canClose;\n        this._width = _width;\n        this._height = _height;\n        this._diffs = _diffs;\n        this._models = _models;\n        this._instantiationService = _instantiationService;\n        this._state = derived(this, (reader) => {\n            const visible = this._visible.read(reader);\n            this._parentNode.style.visibility = visible ? 'visible' : 'hidden';\n            if (!visible) {\n                return null;\n            }\n            const model = reader.store.add(this._instantiationService.createInstance(ViewModel, this._diffs, this._models, this._setVisible, this._canClose));\n            const view = reader.store.add(this._instantiationService.createInstance(View, this._parentNode, model, this._width, this._height, this._models));\n            return { model, view, };\n        }).recomputeInitiallyAndOnChange(this._store);\n    }\n    next() {\n        transaction(tx => {\n            const isVisible = this._visible.get();\n            this._setVisible(true, tx);\n            if (isVisible) {\n                this._state.get().model.nextGroup(tx);\n            }\n        });\n    }\n    prev() {\n        transaction(tx => {\n            this._setVisible(true, tx);\n            this._state.get().model.previousGroup(tx);\n        });\n    }\n    close() {\n        transaction(tx => {\n            this._setVisible(false, tx);\n        });\n    }\n};\nAccessibleDiffViewer = __decorate([\n    __param(8, IInstantiationService)\n], AccessibleDiffViewer);\nlet ViewModel = class ViewModel extends Disposable {\n    constructor(_diffs, _models, _setVisible, canClose, _accessibilitySignalService) {\n        super();\n        this._diffs = _diffs;\n        this._models = _models;\n        this._setVisible = _setVisible;\n        this.canClose = canClose;\n        this._accessibilitySignalService = _accessibilitySignalService;\n        this._groups = observableValue(this, []);\n        this._currentGroupIdx = observableValue(this, 0);\n        this._currentElementIdx = observableValue(this, 0);\n        this.groups = this._groups;\n        this.currentGroup = this._currentGroupIdx.map((idx, r) => this._groups.read(r)[idx]);\n        this.currentGroupIndex = this._currentGroupIdx;\n        this.currentElement = this._currentElementIdx.map((idx, r) => this.currentGroup.read(r)?.lines[idx]);\n        this._register(autorun(reader => {\n            /** @description update groups */\n            const diffs = this._diffs.read(reader);\n            if (!diffs) {\n                this._groups.set([], undefined);\n                return;\n            }\n            const groups = computeViewElementGroups(diffs, this._models.getOriginalModel().getLineCount(), this._models.getModifiedModel().getLineCount());\n            transaction(tx => {\n                const p = this._models.getModifiedPosition();\n                if (p) {\n                    const nextGroup = groups.findIndex(g => p?.lineNumber < g.range.modified.endLineNumberExclusive);\n                    if (nextGroup !== -1) {\n                        this._currentGroupIdx.set(nextGroup, tx);\n                    }\n                }\n                this._groups.set(groups, tx);\n            });\n        }));\n        this._register(autorun(reader => {\n            /** @description play audio-cue for diff */\n            const currentViewItem = this.currentElement.read(reader);\n            if (currentViewItem?.type === LineType.Deleted) {\n                this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineDeleted, { source: 'accessibleDiffViewer.currentElementChanged' });\n            }\n            else if (currentViewItem?.type === LineType.Added) {\n                this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineInserted, { source: 'accessibleDiffViewer.currentElementChanged' });\n            }\n        }));\n        this._register(autorun(reader => {\n            /** @description select lines in editor */\n            // This ensures editor commands (like revert/stage) work\n            const currentViewItem = this.currentElement.read(reader);\n            if (currentViewItem && currentViewItem.type !== LineType.Header) {\n                const lineNumber = currentViewItem.modifiedLineNumber ?? currentViewItem.diff.modified.startLineNumber;\n                this._models.modifiedSetSelection(Range.fromPositions(new Position(lineNumber, 1)));\n            }\n        }));\n    }\n    _goToGroupDelta(delta, tx) {\n        const groups = this.groups.get();\n        if (!groups || groups.length <= 1) {\n            return;\n        }\n        subtransaction(tx, tx => {\n            this._currentGroupIdx.set(OffsetRange.ofLength(groups.length).clipCyclic(this._currentGroupIdx.get() + delta), tx);\n            this._currentElementIdx.set(0, tx);\n        });\n    }\n    nextGroup(tx) { this._goToGroupDelta(1, tx); }\n    previousGroup(tx) { this._goToGroupDelta(-1, tx); }\n    _goToLineDelta(delta) {\n        const group = this.currentGroup.get();\n        if (!group || group.lines.length <= 1) {\n            return;\n        }\n        transaction(tx => {\n            this._currentElementIdx.set(OffsetRange.ofLength(group.lines.length).clip(this._currentElementIdx.get() + delta), tx);\n        });\n    }\n    goToNextLine() { this._goToLineDelta(1); }\n    goToPreviousLine() { this._goToLineDelta(-1); }\n    goToLine(line) {\n        const group = this.currentGroup.get();\n        if (!group) {\n            return;\n        }\n        const idx = group.lines.indexOf(line);\n        if (idx === -1) {\n            return;\n        }\n        transaction(tx => {\n            this._currentElementIdx.set(idx, tx);\n        });\n    }\n    revealCurrentElementInEditor() {\n        if (!this.canClose.get()) {\n            return;\n        }\n        this._setVisible(false, undefined);\n        const curElem = this.currentElement.get();\n        if (curElem) {\n            if (curElem.type === LineType.Deleted) {\n                this._models.originalReveal(Range.fromPositions(new Position(curElem.originalLineNumber, 1)));\n            }\n            else {\n                this._models.modifiedReveal(curElem.type !== LineType.Header\n                    ? Range.fromPositions(new Position(curElem.modifiedLineNumber, 1))\n                    : undefined);\n            }\n        }\n    }\n    close() {\n        if (!this.canClose.get()) {\n            return;\n        }\n        this._setVisible(false, undefined);\n        this._models.modifiedFocus();\n    }\n};\nViewModel = __decorate([\n    __param(4, IAccessibilitySignalService)\n], ViewModel);\nconst viewElementGroupLineMargin = 3;\nfunction computeViewElementGroups(diffs, originalLineCount, modifiedLineCount) {\n    const result = [];\n    for (const g of groupAdjacentBy(diffs, (a, b) => (b.modified.startLineNumber - a.modified.endLineNumberExclusive < 2 * viewElementGroupLineMargin))) {\n        const viewElements = [];\n        viewElements.push(new HeaderViewElement());\n        const origFullRange = new LineRange(Math.max(1, g[0].original.startLineNumber - viewElementGroupLineMargin), Math.min(g[g.length - 1].original.endLineNumberExclusive + viewElementGroupLineMargin, originalLineCount + 1));\n        const modifiedFullRange = new LineRange(Math.max(1, g[0].modified.startLineNumber - viewElementGroupLineMargin), Math.min(g[g.length - 1].modified.endLineNumberExclusive + viewElementGroupLineMargin, modifiedLineCount + 1));\n        forEachAdjacent(g, (a, b) => {\n            const origRange = new LineRange(a ? a.original.endLineNumberExclusive : origFullRange.startLineNumber, b ? b.original.startLineNumber : origFullRange.endLineNumberExclusive);\n            const modifiedRange = new LineRange(a ? a.modified.endLineNumberExclusive : modifiedFullRange.startLineNumber, b ? b.modified.startLineNumber : modifiedFullRange.endLineNumberExclusive);\n            origRange.forEach(origLineNumber => {\n                viewElements.push(new UnchangedLineViewElement(origLineNumber, modifiedRange.startLineNumber + (origLineNumber - origRange.startLineNumber)));\n            });\n            if (b) {\n                b.original.forEach(origLineNumber => {\n                    viewElements.push(new DeletedLineViewElement(b, origLineNumber));\n                });\n                b.modified.forEach(modifiedLineNumber => {\n                    viewElements.push(new AddedLineViewElement(b, modifiedLineNumber));\n                });\n            }\n        });\n        const modifiedRange = g[0].modified.join(g[g.length - 1].modified);\n        const originalRange = g[0].original.join(g[g.length - 1].original);\n        result.push(new ViewElementGroup(new LineRangeMapping(modifiedRange, originalRange), viewElements));\n    }\n    return result;\n}\nvar LineType;\n(function (LineType) {\n    LineType[LineType[\"Header\"] = 0] = \"Header\";\n    LineType[LineType[\"Unchanged\"] = 1] = \"Unchanged\";\n    LineType[LineType[\"Deleted\"] = 2] = \"Deleted\";\n    LineType[LineType[\"Added\"] = 3] = \"Added\";\n})(LineType || (LineType = {}));\nclass ViewElementGroup {\n    constructor(range, lines) {\n        this.range = range;\n        this.lines = lines;\n    }\n}\nclass HeaderViewElement {\n    constructor() {\n        this.type = LineType.Header;\n    }\n}\nclass DeletedLineViewElement {\n    constructor(diff, originalLineNumber) {\n        this.diff = diff;\n        this.originalLineNumber = originalLineNumber;\n        this.type = LineType.Deleted;\n        this.modifiedLineNumber = undefined;\n    }\n}\nclass AddedLineViewElement {\n    constructor(diff, modifiedLineNumber) {\n        this.diff = diff;\n        this.modifiedLineNumber = modifiedLineNumber;\n        this.type = LineType.Added;\n        this.originalLineNumber = undefined;\n    }\n}\nclass UnchangedLineViewElement {\n    constructor(originalLineNumber, modifiedLineNumber) {\n        this.originalLineNumber = originalLineNumber;\n        this.modifiedLineNumber = modifiedLineNumber;\n        this.type = LineType.Unchanged;\n    }\n}\nlet View = class View extends Disposable {\n    constructor(_element, _model, _width, _height, _models, _languageService) {\n        super();\n        this._element = _element;\n        this._model = _model;\n        this._width = _width;\n        this._height = _height;\n        this._models = _models;\n        this._languageService = _languageService;\n        this.domNode = this._element;\n        this.domNode.className = 'monaco-component diff-review monaco-editor-background';\n        const actionBarContainer = document.createElement('div');\n        actionBarContainer.className = 'diff-review-actions';\n        this._actionBar = this._register(new ActionBar(actionBarContainer));\n        this._register(autorun(reader => {\n            /** @description update actions */\n            this._actionBar.clear();\n            if (this._model.canClose.read(reader)) {\n                this._actionBar.push(toAction({\n                    id: 'diffreview.close',\n                    label: localize(100, \"Close\"),\n                    class: 'close-diff-review ' + ThemeIcon.asClassName(accessibleDiffViewerCloseIcon),\n                    enabled: true,\n                    run: async () => _model.close()\n                }), { label: false, icon: true });\n            }\n        }));\n        this._content = document.createElement('div');\n        this._content.className = 'diff-review-content';\n        this._content.setAttribute('role', 'code');\n        this._scrollbar = this._register(new DomScrollableElement(this._content, {}));\n        reset(this.domNode, this._scrollbar.getDomNode(), actionBarContainer);\n        this._register(autorun(r => {\n            this._height.read(r);\n            this._width.read(r);\n            this._scrollbar.scanDomNode();\n        }));\n        this._register(toDisposable(() => { reset(this.domNode); }));\n        this._register(applyStyle(this.domNode, { width: this._width, height: this._height }));\n        this._register(applyStyle(this._content, { width: this._width, height: this._height }));\n        this._register(autorunWithStore((reader, store) => {\n            /** @description render */\n            this._model.currentGroup.read(reader);\n            this._render(store);\n        }));\n        // TODO@hediet use commands\n        this._register(addStandardDisposableListener(this.domNode, 'keydown', (e) => {\n            if (e.equals(18 /* KeyCode.DownArrow */)\n                || e.equals(2048 /* KeyMod.CtrlCmd */ | 18 /* KeyCode.DownArrow */)\n                || e.equals(512 /* KeyMod.Alt */ | 18 /* KeyCode.DownArrow */)) {\n                e.preventDefault();\n                this._model.goToNextLine();\n            }\n            if (e.equals(16 /* KeyCode.UpArrow */)\n                || e.equals(2048 /* KeyMod.CtrlCmd */ | 16 /* KeyCode.UpArrow */)\n                || e.equals(512 /* KeyMod.Alt */ | 16 /* KeyCode.UpArrow */)) {\n                e.preventDefault();\n                this._model.goToPreviousLine();\n            }\n            if (e.equals(9 /* KeyCode.Escape */)\n                || e.equals(2048 /* KeyMod.CtrlCmd */ | 9 /* KeyCode.Escape */)\n                || e.equals(512 /* KeyMod.Alt */ | 9 /* KeyCode.Escape */)\n                || e.equals(1024 /* KeyMod.Shift */ | 9 /* KeyCode.Escape */)) {\n                e.preventDefault();\n                this._model.close();\n            }\n            if (e.equals(10 /* KeyCode.Space */)\n                || e.equals(3 /* KeyCode.Enter */)) {\n                e.preventDefault();\n                this._model.revealCurrentElementInEditor();\n            }\n        }));\n    }\n    _render(store) {\n        const originalOptions = this._models.getOriginalOptions();\n        const modifiedOptions = this._models.getModifiedOptions();\n        const container = document.createElement('div');\n        container.className = 'diff-review-table';\n        container.setAttribute('role', 'list');\n        container.setAttribute('aria-label', localize(101, 'Accessible Diff Viewer. Use arrow up and down to navigate.'));\n        applyFontInfo(container, modifiedOptions.get(59 /* EditorOption.fontInfo */));\n        reset(this._content, container);\n        const originalModel = this._models.getOriginalModel();\n        const modifiedModel = this._models.getModifiedModel();\n        if (!originalModel || !modifiedModel) {\n            return;\n        }\n        const originalModelOpts = originalModel.getOptions();\n        const modifiedModelOpts = modifiedModel.getOptions();\n        const lineHeight = modifiedOptions.get(75 /* EditorOption.lineHeight */);\n        const group = this._model.currentGroup.get();\n        for (const viewItem of group?.lines || []) {\n            if (!group) {\n                break;\n            }\n            let row;\n            if (viewItem.type === LineType.Header) {\n                const header = document.createElement('div');\n                header.className = 'diff-review-row';\n                header.setAttribute('role', 'listitem');\n                const r = group.range;\n                const diffIndex = this._model.currentGroupIndex.get();\n                const diffsLength = this._model.groups.get().length;\n                const getAriaLines = (lines) => lines === 0 ? localize(102, \"no lines changed\")\n                    : lines === 1 ? localize(103, \"1 line changed\")\n                        : localize(104, \"{0} lines changed\", lines);\n                const originalChangedLinesCntAria = getAriaLines(r.original.length);\n                const modifiedChangedLinesCntAria = getAriaLines(r.modified.length);\n                header.setAttribute('aria-label', localize(105, \"Difference {0} of {1}: original line {2}, {3}, modified line {4}, {5}\", (diffIndex + 1), diffsLength, r.original.startLineNumber, originalChangedLinesCntAria, r.modified.startLineNumber, modifiedChangedLinesCntAria));\n\n\n\n\n\n\n\n\n\n\n                const cell = document.createElement('div');\n                cell.className = 'diff-review-cell diff-review-summary';\n                // e.g.: `1/10: @@ -504,7 +517,7 @@`\n                cell.appendChild(document.createTextNode(`${diffIndex + 1}/${diffsLength}: @@ -${r.original.startLineNumber},${r.original.length} +${r.modified.startLineNumber},${r.modified.length} @@`));\n                header.appendChild(cell);\n                row = header;\n            }\n            else {\n                row = this._createRow(viewItem, lineHeight, this._width.get(), originalOptions, originalModel, originalModelOpts, modifiedOptions, modifiedModel, modifiedModelOpts);\n            }\n            container.appendChild(row);\n            const isSelectedObs = derived(reader => /** @description isSelected */ this._model.currentElement.read(reader) === viewItem);\n            store.add(autorun(reader => {\n                /** @description update tab index */\n                const isSelected = isSelectedObs.read(reader);\n                row.tabIndex = isSelected ? 0 : -1;\n                if (isSelected) {\n                    row.focus();\n                }\n            }));\n            store.add(addDisposableListener(row, 'focus', () => {\n                this._model.goToLine(viewItem);\n            }));\n        }\n        this._scrollbar.scanDomNode();\n    }\n    _createRow(item, lineHeight, width, originalOptions, originalModel, originalModelOpts, modifiedOptions, modifiedModel, modifiedModelOpts) {\n        const originalLayoutInfo = originalOptions.get(165 /* EditorOption.layoutInfo */);\n        const originalLineNumbersWidth = originalLayoutInfo.glyphMarginWidth + originalLayoutInfo.lineNumbersWidth;\n        const modifiedLayoutInfo = modifiedOptions.get(165 /* EditorOption.layoutInfo */);\n        const modifiedLineNumbersWidth = 10 + modifiedLayoutInfo.glyphMarginWidth + modifiedLayoutInfo.lineNumbersWidth;\n        let rowClassName = 'diff-review-row';\n        let lineNumbersExtraClassName = '';\n        const spacerClassName = 'diff-review-spacer';\n        let spacerIcon = null;\n        switch (item.type) {\n            case LineType.Added:\n                rowClassName = 'diff-review-row line-insert';\n                lineNumbersExtraClassName = ' char-insert';\n                spacerIcon = accessibleDiffViewerInsertIcon;\n                break;\n            case LineType.Deleted:\n                rowClassName = 'diff-review-row line-delete';\n                lineNumbersExtraClassName = ' char-delete';\n                spacerIcon = accessibleDiffViewerRemoveIcon;\n                break;\n        }\n        const row = document.createElement('div');\n        row.style.minWidth = width + 'px';\n        row.className = rowClassName;\n        row.setAttribute('role', 'listitem');\n        row.ariaLevel = '';\n        const cell = document.createElement('div');\n        cell.className = 'diff-review-cell';\n        cell.style.height = `${lineHeight}px`;\n        row.appendChild(cell);\n        const originalLineNumber = document.createElement('span');\n        originalLineNumber.style.width = (originalLineNumbersWidth + 'px');\n        originalLineNumber.style.minWidth = (originalLineNumbersWidth + 'px');\n        originalLineNumber.className = 'diff-review-line-number' + lineNumbersExtraClassName;\n        if (item.originalLineNumber !== undefined) {\n            originalLineNumber.appendChild(document.createTextNode(String(item.originalLineNumber)));\n        }\n        else {\n            originalLineNumber.innerText = '\\u00a0';\n        }\n        cell.appendChild(originalLineNumber);\n        const modifiedLineNumber = document.createElement('span');\n        modifiedLineNumber.style.width = (modifiedLineNumbersWidth + 'px');\n        modifiedLineNumber.style.minWidth = (modifiedLineNumbersWidth + 'px');\n        modifiedLineNumber.style.paddingRight = '10px';\n        modifiedLineNumber.className = 'diff-review-line-number' + lineNumbersExtraClassName;\n        if (item.modifiedLineNumber !== undefined) {\n            modifiedLineNumber.appendChild(document.createTextNode(String(item.modifiedLineNumber)));\n        }\n        else {\n            modifiedLineNumber.innerText = '\\u00a0';\n        }\n        cell.appendChild(modifiedLineNumber);\n        const spacer = document.createElement('span');\n        spacer.className = spacerClassName;\n        if (spacerIcon) {\n            const spacerCodicon = document.createElement('span');\n            spacerCodicon.className = ThemeIcon.asClassName(spacerIcon);\n            spacerCodicon.innerText = '\\u00a0\\u00a0';\n            spacer.appendChild(spacerCodicon);\n        }\n        else {\n            spacer.innerText = '\\u00a0\\u00a0';\n        }\n        cell.appendChild(spacer);\n        let lineContent;\n        if (item.modifiedLineNumber !== undefined) {\n            let html = this._getLineHtml(modifiedModel, modifiedOptions, modifiedModelOpts.tabSize, item.modifiedLineNumber, this._languageService.languageIdCodec);\n            if (AccessibleDiffViewer._ttPolicy) {\n                html = AccessibleDiffViewer._ttPolicy.createHTML(html);\n            }\n            cell.insertAdjacentHTML('beforeend', html);\n            lineContent = modifiedModel.getLineContent(item.modifiedLineNumber);\n        }\n        else {\n            let html = this._getLineHtml(originalModel, originalOptions, originalModelOpts.tabSize, item.originalLineNumber, this._languageService.languageIdCodec);\n            if (AccessibleDiffViewer._ttPolicy) {\n                html = AccessibleDiffViewer._ttPolicy.createHTML(html);\n            }\n            cell.insertAdjacentHTML('beforeend', html);\n            lineContent = originalModel.getLineContent(item.originalLineNumber);\n        }\n        if (lineContent.length === 0) {\n            lineContent = localize(106, \"blank\");\n        }\n        let ariaLabel = '';\n        switch (item.type) {\n            case LineType.Unchanged:\n                if (item.originalLineNumber === item.modifiedLineNumber) {\n                    ariaLabel = localize(107, \"{0} unchanged line {1}\", lineContent, item.originalLineNumber);\n                }\n                else {\n                    ariaLabel = localize(108, \"{0} original line {1} modified line {2}\", lineContent, item.originalLineNumber, item.modifiedLineNumber);\n                }\n                break;\n            case LineType.Added:\n                ariaLabel = localize(109, \"+ {0} modified line {1}\", lineContent, item.modifiedLineNumber);\n                break;\n            case LineType.Deleted:\n                ariaLabel = localize(110, \"- {0} original line {1}\", lineContent, item.originalLineNumber);\n                break;\n        }\n        row.setAttribute('aria-label', ariaLabel);\n        return row;\n    }\n    _getLineHtml(model, options, tabSize, lineNumber, languageIdCodec) {\n        const lineContent = model.getLineContent(lineNumber);\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        const verticalScrollbarSize = options.get(117 /* EditorOption.scrollbar */).verticalScrollbarSize;\n        const lineTokens = LineTokens.createEmpty(lineContent, languageIdCodec);\n        const isBasicASCII = ViewLineRenderingData.isBasicASCII(lineContent, model.mightContainNonBasicASCII());\n        const containsRTL = ViewLineRenderingData.containsRTL(lineContent, isBasicASCII, model.mightContainRTL());\n        const r = renderViewLine2(new RenderLineInput((fontInfo.isMonospace && !options.get(40 /* EditorOption.disableMonospaceOptimizations */)), fontInfo.canUseHalfwidthRightwardsArrow, lineContent, false, isBasicASCII, containsRTL, 0, lineTokens, [], tabSize, 0, fontInfo.spaceWidth, fontInfo.middotWidth, fontInfo.wsmiddotWidth, options.get(133 /* EditorOption.stopRenderingLineAfter */), options.get(113 /* EditorOption.renderWhitespace */), options.get(108 /* EditorOption.renderControlCharacters */), options.get(60 /* EditorOption.fontLigatures */) !== EditorFontLigatures.OFF, null, null, verticalScrollbarSize));\n        return r.html;\n    }\n};\nView = __decorate([\n    __param(5, ILanguageService)\n], View);\nclass AccessibleDiffViewerModelFromEditors {\n    constructor(editors) {\n        this.editors = editors;\n    }\n    getOriginalModel() {\n        return this.editors.original.getModel();\n    }\n    getOriginalOptions() {\n        return this.editors.original.getOptions();\n    }\n    originalReveal(range) {\n        this.editors.original.revealRange(range);\n        this.editors.original.setSelection(range);\n        this.editors.original.focus();\n    }\n    getModifiedModel() {\n        return this.editors.modified.getModel();\n    }\n    getModifiedOptions() {\n        return this.editors.modified.getOptions();\n    }\n    modifiedReveal(range) {\n        if (range) {\n            this.editors.modified.revealRange(range);\n            this.editors.modified.setSelection(range);\n        }\n        this.editors.modified.focus();\n    }\n    modifiedSetSelection(range) {\n        this.editors.modified.setSelection(range);\n    }\n    modifiedFocus() {\n        this.editors.modified.focus();\n    }\n    getModifiedPosition() {\n        return this.editors.modified.getPosition() ?? undefined;\n    }\n}\n\nexport { AccessibleDiffViewer, AccessibleDiffViewerModelFromEditors };\n","import { Codicon } from '../../../../base/common/codicons.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { localize } from '../../../../nls.js';\nimport { registerColor } from '../../../../platform/theme/common/colorUtils.js';\nimport '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { registerIcon } from '../../../../platform/theme/common/iconRegistry.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterColor('diffEditor.move.border', '#8b8b8b9c', localize(137, 'The border color for text that got moved in the diff editor.'));\nregisterColor('diffEditor.moveActive.border', '#FFA500', localize(138, 'The active border color for text that got moved in the diff editor.'));\nregisterColor('diffEditor.unchangedRegionShadow', { dark: '#000000', light: '#737373BF', hcDark: '#000000', hcLight: '#737373BF', }, localize(139, 'The color of the shadow around unchanged region widgets.'));\nconst diffInsertIcon = registerIcon('diff-insert', Codicon.add, localize(140, 'Line decoration for inserts in the diff editor.'));\nconst diffRemoveIcon = registerIcon('diff-remove', Codicon.remove, localize(141, 'Line decoration for removals in the diff editor.'));\nconst diffLineAddDecorationBackgroundWithIndicator = ModelDecorationOptions.register({\n    className: 'line-insert',\n    description: 'line-insert',\n    isWholeLine: true,\n    linesDecorationsClassName: 'insert-sign ' + ThemeIcon.asClassName(diffInsertIcon),\n    marginClassName: 'gutter-insert',\n});\nconst diffLineDeleteDecorationBackgroundWithIndicator = ModelDecorationOptions.register({\n    className: 'line-delete',\n    description: 'line-delete',\n    isWholeLine: true,\n    linesDecorationsClassName: 'delete-sign ' + ThemeIcon.asClassName(diffRemoveIcon),\n    marginClassName: 'gutter-delete',\n});\nconst diffLineAddDecorationBackground = ModelDecorationOptions.register({\n    className: 'line-insert',\n    description: 'line-insert',\n    isWholeLine: true,\n    marginClassName: 'gutter-insert',\n});\nconst diffLineDeleteDecorationBackground = ModelDecorationOptions.register({\n    className: 'line-delete',\n    description: 'line-delete',\n    isWholeLine: true,\n    marginClassName: 'gutter-delete',\n});\nconst diffAddDecoration = ModelDecorationOptions.register({\n    className: 'char-insert',\n    description: 'char-insert',\n    shouldFillLineOnLineBreak: true,\n});\nconst diffWholeLineAddDecoration = ModelDecorationOptions.register({\n    className: 'char-insert',\n    description: 'char-insert',\n    isWholeLine: true,\n});\nconst diffAddDecorationEmpty = ModelDecorationOptions.register({\n    className: 'char-insert diff-range-empty',\n    description: 'char-insert diff-range-empty',\n});\nconst diffDeleteDecoration = ModelDecorationOptions.register({\n    className: 'char-delete',\n    description: 'char-delete',\n    shouldFillLineOnLineBreak: true,\n});\nconst diffWholeLineDeleteDecoration = ModelDecorationOptions.register({\n    className: 'char-delete',\n    description: 'char-delete',\n    isWholeLine: true,\n});\nconst diffDeleteDecorationEmpty = ModelDecorationOptions.register({\n    className: 'char-delete diff-range-empty',\n    description: 'char-delete diff-range-empty',\n});\n\nexport { diffAddDecoration, diffAddDecorationEmpty, diffDeleteDecoration, diffDeleteDecorationEmpty, diffInsertIcon, diffLineAddDecorationBackground, diffLineAddDecorationBackgroundWithIndicator, diffLineDeleteDecorationBackground, diffLineDeleteDecorationBackgroundWithIndicator, diffRemoveIcon, diffWholeLineAddDecoration, diffWholeLineDeleteDecoration };\n","import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IEditorWorkerService = createDecorator('editorWorkerService');\n\nexport { IEditorWorkerService };\n","import { registerSingleton } from '../../../../platform/instantiation/common/extensions.js';\nimport { createDecorator, IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { StopWatch } from '../../../../base/common/stopwatch.js';\nimport { LineRange } from '../../../common/core/ranges/lineRange.js';\nimport { DetailedLineRangeMapping, RangeMapping } from '../../../common/diff/rangeMapping.js';\nimport { IEditorWorkerService } from '../../../common/services/editorWorker.js';\nimport { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar WorkerBasedDocumentDiffProvider_1;\nconst IDiffProviderFactoryService = createDecorator('diffProviderFactoryService');\nlet WorkerBasedDiffProviderFactoryService = class WorkerBasedDiffProviderFactoryService {\n    constructor(instantiationService) {\n        this.instantiationService = instantiationService;\n    }\n    createDiffProvider(options) {\n        return this.instantiationService.createInstance(WorkerBasedDocumentDiffProvider, options);\n    }\n};\nWorkerBasedDiffProviderFactoryService = __decorate([\n    __param(0, IInstantiationService)\n], WorkerBasedDiffProviderFactoryService);\nregisterSingleton(IDiffProviderFactoryService, WorkerBasedDiffProviderFactoryService, 1 /* InstantiationType.Delayed */);\nlet WorkerBasedDocumentDiffProvider = class WorkerBasedDocumentDiffProvider {\n    static { WorkerBasedDocumentDiffProvider_1 = this; }\n    static { this.diffCache = new Map(); }\n    constructor(options, editorWorkerService, telemetryService) {\n        this.editorWorkerService = editorWorkerService;\n        this.telemetryService = telemetryService;\n        this.onDidChangeEventEmitter = new Emitter();\n        this.onDidChange = this.onDidChangeEventEmitter.event;\n        this.diffAlgorithm = 'advanced';\n        this.diffAlgorithmOnDidChangeSubscription = undefined;\n        this.setOptions(options);\n    }\n    dispose() {\n        this.diffAlgorithmOnDidChangeSubscription?.dispose();\n    }\n    async computeDiff(original, modified, options, cancellationToken) {\n        if (typeof this.diffAlgorithm !== 'string') {\n            return this.diffAlgorithm.computeDiff(original, modified, options, cancellationToken);\n        }\n        if (original.isDisposed() || modified.isDisposed()) {\n            // TODO@hediet\n            return {\n                changes: [],\n                identical: true,\n                quitEarly: false,\n                moves: [],\n            };\n        }\n        // This significantly speeds up the case when the original file is empty\n        if (original.getLineCount() === 1 && original.getLineMaxColumn(1) === 1) {\n            if (modified.getLineCount() === 1 && modified.getLineMaxColumn(1) === 1) {\n                return {\n                    changes: [],\n                    identical: true,\n                    quitEarly: false,\n                    moves: [],\n                };\n            }\n            return {\n                changes: [\n                    new DetailedLineRangeMapping(new LineRange(1, 2), new LineRange(1, modified.getLineCount() + 1), [\n                        new RangeMapping(original.getFullModelRange(), modified.getFullModelRange())\n                    ])\n                ],\n                identical: false,\n                quitEarly: false,\n                moves: [],\n            };\n        }\n        const uriKey = JSON.stringify([original.uri.toString(), modified.uri.toString()]);\n        const context = JSON.stringify([original.id, modified.id, original.getAlternativeVersionId(), modified.getAlternativeVersionId(), JSON.stringify(options)]);\n        const c = WorkerBasedDocumentDiffProvider_1.diffCache.get(uriKey);\n        if (c && c.context === context) {\n            return c.result;\n        }\n        const sw = StopWatch.create();\n        const result = await this.editorWorkerService.computeDiff(original.uri, modified.uri, options, this.diffAlgorithm);\n        const timeMs = sw.elapsed();\n        this.telemetryService.publicLog2('diffEditor.computeDiff', {\n            timeMs,\n            timedOut: result?.quitEarly ?? true,\n            detectedMoves: options.computeMoves ? (result?.moves.length ?? 0) : -1,\n        });\n        if (cancellationToken.isCancellationRequested) {\n            // Text models might be disposed!\n            return {\n                changes: [],\n                identical: false,\n                quitEarly: true,\n                moves: [],\n            };\n        }\n        if (!result) {\n            throw new Error('no diff result available');\n        }\n        // max 10 items in cache\n        if (WorkerBasedDocumentDiffProvider_1.diffCache.size > 10) {\n            WorkerBasedDocumentDiffProvider_1.diffCache.delete(WorkerBasedDocumentDiffProvider_1.diffCache.keys().next().value);\n        }\n        WorkerBasedDocumentDiffProvider_1.diffCache.set(uriKey, { result, context });\n        return result;\n    }\n    setOptions(newOptions) {\n        let didChange = false;\n        if (newOptions.diffAlgorithm) {\n            if (this.diffAlgorithm !== newOptions.diffAlgorithm) {\n                this.diffAlgorithmOnDidChangeSubscription?.dispose();\n                this.diffAlgorithmOnDidChangeSubscription = undefined;\n                this.diffAlgorithm = newOptions.diffAlgorithm;\n                if (typeof newOptions.diffAlgorithm !== 'string') {\n                    this.diffAlgorithmOnDidChangeSubscription = newOptions.diffAlgorithm.onDidChange(() => this.onDidChangeEventEmitter.fire());\n                }\n                didChange = true;\n            }\n        }\n        if (didChange) {\n            this.onDidChangeEventEmitter.fire();\n        }\n    }\n};\nWorkerBasedDocumentDiffProvider = WorkerBasedDocumentDiffProvider_1 = __decorate([\n    __param(1, IEditorWorkerService),\n    __param(2, ITelemetryService)\n], WorkerBasedDocumentDiffProvider);\n\nexport { IDiffProviderFactoryService, WorkerBasedDiffProviderFactoryService, WorkerBasedDocumentDiffProvider };\n","import { forEachAdjacent } from '../../../../../base/common/arrays.js';\nimport { BugIndicatingError } from '../../../../../base/common/errors.js';\nimport { OffsetRange } from '../../../core/ranges/offsetRange.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DiffAlgorithmResult {\n    static trivial(seq1, seq2) {\n        return new DiffAlgorithmResult([new SequenceDiff(OffsetRange.ofLength(seq1.length), OffsetRange.ofLength(seq2.length))], false);\n    }\n    static trivialTimedOut(seq1, seq2) {\n        return new DiffAlgorithmResult([new SequenceDiff(OffsetRange.ofLength(seq1.length), OffsetRange.ofLength(seq2.length))], true);\n    }\n    constructor(diffs, \n    /**\n     * Indicates if the time out was reached.\n     * In that case, the diffs might be an approximation and the user should be asked to rerun the diff with more time.\n     */\n    hitTimeout) {\n        this.diffs = diffs;\n        this.hitTimeout = hitTimeout;\n    }\n}\nclass SequenceDiff {\n    static invert(sequenceDiffs, doc1Length) {\n        const result = [];\n        forEachAdjacent(sequenceDiffs, (a, b) => {\n            result.push(SequenceDiff.fromOffsetPairs(a ? a.getEndExclusives() : OffsetPair.zero, b ? b.getStarts() : new OffsetPair(doc1Length, (a ? a.seq2Range.endExclusive - a.seq1Range.endExclusive : 0) + doc1Length)));\n        });\n        return result;\n    }\n    static fromOffsetPairs(start, endExclusive) {\n        return new SequenceDiff(new OffsetRange(start.offset1, endExclusive.offset1), new OffsetRange(start.offset2, endExclusive.offset2));\n    }\n    static assertSorted(sequenceDiffs) {\n        let last = undefined;\n        for (const cur of sequenceDiffs) {\n            if (last) {\n                if (!(last.seq1Range.endExclusive <= cur.seq1Range.start && last.seq2Range.endExclusive <= cur.seq2Range.start)) {\n                    throw new BugIndicatingError('Sequence diffs must be sorted');\n                }\n            }\n            last = cur;\n        }\n    }\n    constructor(seq1Range, seq2Range) {\n        this.seq1Range = seq1Range;\n        this.seq2Range = seq2Range;\n    }\n    swap() {\n        return new SequenceDiff(this.seq2Range, this.seq1Range);\n    }\n    toString() {\n        return `${this.seq1Range} <-> ${this.seq2Range}`;\n    }\n    join(other) {\n        return new SequenceDiff(this.seq1Range.join(other.seq1Range), this.seq2Range.join(other.seq2Range));\n    }\n    delta(offset) {\n        if (offset === 0) {\n            return this;\n        }\n        return new SequenceDiff(this.seq1Range.delta(offset), this.seq2Range.delta(offset));\n    }\n    deltaStart(offset) {\n        if (offset === 0) {\n            return this;\n        }\n        return new SequenceDiff(this.seq1Range.deltaStart(offset), this.seq2Range.deltaStart(offset));\n    }\n    deltaEnd(offset) {\n        if (offset === 0) {\n            return this;\n        }\n        return new SequenceDiff(this.seq1Range.deltaEnd(offset), this.seq2Range.deltaEnd(offset));\n    }\n    intersect(other) {\n        const i1 = this.seq1Range.intersect(other.seq1Range);\n        const i2 = this.seq2Range.intersect(other.seq2Range);\n        if (!i1 || !i2) {\n            return undefined;\n        }\n        return new SequenceDiff(i1, i2);\n    }\n    getStarts() {\n        return new OffsetPair(this.seq1Range.start, this.seq2Range.start);\n    }\n    getEndExclusives() {\n        return new OffsetPair(this.seq1Range.endExclusive, this.seq2Range.endExclusive);\n    }\n}\nclass OffsetPair {\n    static { this.zero = new OffsetPair(0, 0); }\n    static { this.max = new OffsetPair(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER); }\n    constructor(offset1, offset2) {\n        this.offset1 = offset1;\n        this.offset2 = offset2;\n    }\n    toString() {\n        return `${this.offset1} <-> ${this.offset2}`;\n    }\n    delta(offset) {\n        if (offset === 0) {\n            return this;\n        }\n        return new OffsetPair(this.offset1 + offset, this.offset2 + offset);\n    }\n    equals(other) {\n        return this.offset1 === other.offset1 && this.offset2 === other.offset2;\n    }\n}\nclass InfiniteTimeout {\n    static { this.instance = new InfiniteTimeout(); }\n    isValid() {\n        return true;\n    }\n}\nclass DateTimeout {\n    constructor(timeout) {\n        this.timeout = timeout;\n        this.startTime = Date.now();\n        this.valid = true;\n        if (timeout <= 0) {\n            throw new BugIndicatingError('timeout must be positive');\n        }\n    }\n    // Recommendation: Set a log-point `{this.disable()}` in the body\n    isValid() {\n        const valid = Date.now() - this.startTime < this.timeout;\n        if (!valid && this.valid) {\n            this.valid = false; // timeout reached\n        }\n        return this.valid;\n    }\n}\n\nexport { DateTimeout, DiffAlgorithmResult, InfiniteTimeout, OffsetPair, SequenceDiff };\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 *--------------------------------------------------------------------------------------------*/\nclass Array2D {\n    constructor(width, height) {\n        this.width = width;\n        this.height = height;\n        this.array = [];\n        this.array = new Array(width * height);\n    }\n    get(x, y) {\n        return this.array[x + y * this.width];\n    }\n    set(x, y, value) {\n        this.array[x + y * this.width] = value;\n    }\n}\nfunction isSpace(charCode) {\n    return charCode === 32 /* CharCode.Space */ || charCode === 9 /* CharCode.Tab */;\n}\nclass LineRangeFragment {\n    static { this.chrKeys = new Map(); }\n    static getKey(chr) {\n        let key = this.chrKeys.get(chr);\n        if (key === undefined) {\n            key = this.chrKeys.size;\n            this.chrKeys.set(chr, key);\n        }\n        return key;\n    }\n    constructor(range, lines, source) {\n        this.range = range;\n        this.lines = lines;\n        this.source = source;\n        this.histogram = [];\n        let counter = 0;\n        for (let i = range.startLineNumber - 1; i < range.endLineNumberExclusive - 1; i++) {\n            const line = lines[i];\n            for (let j = 0; j < line.length; j++) {\n                counter++;\n                const chr = line[j];\n                const key = LineRangeFragment.getKey(chr);\n                this.histogram[key] = (this.histogram[key] || 0) + 1;\n            }\n            counter++;\n            const key = LineRangeFragment.getKey('\\n');\n            this.histogram[key] = (this.histogram[key] || 0) + 1;\n        }\n        this.totalCount = counter;\n    }\n    computeSimilarity(other) {\n        let sumDifferences = 0;\n        const maxLength = Math.max(this.histogram.length, other.histogram.length);\n        for (let i = 0; i < maxLength; i++) {\n            sumDifferences += Math.abs((this.histogram[i] ?? 0) - (other.histogram[i] ?? 0));\n        }\n        return 1 - (sumDifferences / (this.totalCount + other.totalCount));\n    }\n}\n\nexport { Array2D, LineRangeFragment, isSpace };\n","import { CancellationError } from '../../errors.js';\nimport '../../cancellation.js';\nimport { autorun } from '../reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction waitForState(observable, predicate, isError, cancellationToken) {\n    if (!predicate) {\n        predicate = state => state !== null && state !== undefined;\n    }\n    return new Promise((resolve, reject) => {\n        let isImmediateRun = true;\n        let shouldDispose = false;\n        const stateObs = observable.map(state => {\n            /** @description waitForState.state */\n            return {\n                isFinished: predicate(state),\n                error: isError ? isError(state) : false,\n                state\n            };\n        });\n        const d = autorun(reader => {\n            /** @description waitForState */\n            const { isFinished, error, state } = stateObs.read(reader);\n            if (isFinished || error) {\n                if (isImmediateRun) {\n                    // The variable `d` is not initialized yet\n                    shouldDispose = true;\n                }\n                else {\n                    d.dispose();\n                }\n                if (error) {\n                    reject(error === true ? state : error);\n                }\n                else {\n                    resolve(state);\n                }\n            }\n        });\n        if (cancellationToken) {\n            const dc = cancellationToken.onCancellationRequested(() => {\n                d.dispose();\n                dc.dispose();\n                reject(new CancellationError());\n            });\n            if (cancellationToken.isCancellationRequested) {\n                d.dispose();\n                dc.dispose();\n                reject(new CancellationError());\n                return;\n            }\n        }\n        isImmediateRun = false;\n        if (shouldDispose) {\n            d.dispose();\n        }\n    });\n}\n\nexport { waitForState };\n","import { transaction } from '../transaction.js';\nimport { DebugNameData } from '../debugName.js';\nimport { BaseObservable } from './baseObservable.js';\nimport { DebugLocation } from '../debugLocation.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction observableSignalFromEvent(owner, event, debugLocation = DebugLocation.ofCaller()) {\n    return new FromEventObservableSignal(typeof owner === 'string' ? owner : new DebugNameData(owner, undefined, undefined), event, debugLocation);\n}\nclass FromEventObservableSignal extends BaseObservable {\n    constructor(debugNameDataOrName, event, debugLocation) {\n        super(debugLocation);\n        this.event = event;\n        this.handleEvent = () => {\n            transaction((tx) => {\n                for (const o of this._observers) {\n                    tx.updateObserver(o, this);\n                    o.handleChange(this, undefined);\n                }\n            }, () => this.debugName);\n        };\n        this.debugName = typeof debugNameDataOrName === 'string'\n            ? debugNameDataOrName\n            : debugNameDataOrName.getDebugName(this) ?? 'Observable Signal From Event';\n    }\n    onFirstObserverAdded() {\n        this.subscription = this.event(this.handleEvent);\n    }\n    onLastObserverRemoved() {\n        this.subscription.dispose();\n        this.subscription = undefined;\n    }\n    get() {\n        // NO OP\n    }\n}\n\nexport { observableSignalFromEvent };\n","import { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { Disposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { IDiffProviderFactoryService } from './diffProviderFactoryService.js';\nimport { filterWithPrevious } from './utils.js';\nimport { LineRange, LineRangeSet } from '../../../common/core/ranges/lineRange.js';\nimport { groupAdjacentBy } from '../../../../base/common/arrays.js';\nimport { softAssert } from '../../../../base/common/assert.js';\nimport '../../../common/core/text/textLength.js';\nimport '../../../common/core/text/positionToOffsetImpl.js';\nimport { LineRangeMapping, DetailedLineRangeMapping, RangeMapping } from '../../../common/diff/rangeMapping.js';\nimport '../../../common/diff/defaultLinesDiffComputer/algorithms/diffAlgorithm.js';\nimport '../../../common/diff/defaultLinesDiffComputer/utils.js';\nimport '../../../../base/common/arraysFind.js';\nimport '../../../../base/common/map.js';\nimport { TextEditInfo } from '../../../common/model/bracketPairsTextModelPart/bracketPairsTree/beforeEditPositionMapper.js';\nimport { combineTextEditInfos } from '../../../common/model/bracketPairsTextModelPart/bracketPairsTree/combineTextEditInfos.js';\nimport { isDefined } from '../../../../base/common/types.js';\nimport { waitForState } from '../../../../base/common/observableInternal/utils/utilsCancellation.js';\nimport { observableValue } from '../../../../base/common/observableInternal/observables/observableValue.js';\nimport { derived } from '../../../../base/common/observableInternal/observables/derived.js';\nimport { transaction } from '../../../../base/common/observableInternal/transaction.js';\nimport { observableSignalFromEvent } from '../../../../base/common/observableInternal/observables/observableSignalFromEvent.js';\nimport { observableSignal } from '../../../../base/common/observableInternal/observables/observableSignal.js';\nimport { autorun, autorunWithStore } from '../../../../base/common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet DiffEditorViewModel = class DiffEditorViewModel extends Disposable {\n    setActiveMovedText(movedText) {\n        this._activeMovedText.set(movedText, undefined);\n    }\n    constructor(model, _options, _diffProviderFactoryService) {\n        super();\n        this.model = model;\n        this._options = _options;\n        this._diffProviderFactoryService = _diffProviderFactoryService;\n        this._isDiffUpToDate = observableValue(this, false);\n        this.isDiffUpToDate = this._isDiffUpToDate;\n        this._diff = observableValue(this, undefined);\n        this.diff = this._diff;\n        this._unchangedRegions = observableValue(this, undefined);\n        this.unchangedRegions = derived(this, r => {\n            if (this._options.hideUnchangedRegions.read(r)) {\n                return this._unchangedRegions.read(r)?.regions ?? [];\n            }\n            else {\n                // Reset state\n                transaction(tx => {\n                    for (const r of this._unchangedRegions.read(undefined)?.regions || []) {\n                        r.collapseAll(tx);\n                    }\n                });\n                return [];\n            }\n        });\n        this.movedTextToCompare = observableValue(this, undefined);\n        this._activeMovedText = observableValue(this, undefined);\n        this._hoveredMovedText = observableValue(this, undefined);\n        this.activeMovedText = derived(this, r => this.movedTextToCompare.read(r) ?? this._hoveredMovedText.read(r) ?? this._activeMovedText.read(r));\n        this._cancellationTokenSource = new CancellationTokenSource();\n        this._diffProvider = derived(this, reader => {\n            const diffProvider = this._diffProviderFactoryService.createDiffProvider({\n                diffAlgorithm: this._options.diffAlgorithm.read(reader)\n            });\n            const onChangeSignal = observableSignalFromEvent('onDidChange', diffProvider.onDidChange);\n            return {\n                diffProvider,\n                onChangeSignal,\n            };\n        });\n        this._register(toDisposable(() => this._cancellationTokenSource.cancel()));\n        const contentChangedSignal = observableSignal('contentChangedSignal');\n        const debouncer = this._register(new RunOnceScheduler(() => contentChangedSignal.trigger(undefined), 200));\n        this._register(autorun(reader => {\n            /** @description collapse touching unchanged ranges */\n            const lastUnchangedRegions = this._unchangedRegions.read(reader);\n            if (!lastUnchangedRegions || lastUnchangedRegions.regions.some(r => r.isDragged.read(reader))) {\n                return;\n            }\n            const lastUnchangedRegionsOrigRanges = lastUnchangedRegions.originalDecorationIds\n                .map(id => model.original.getDecorationRange(id))\n                .map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n            const lastUnchangedRegionsModRanges = lastUnchangedRegions.modifiedDecorationIds\n                .map(id => model.modified.getDecorationRange(id))\n                .map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n            const updatedLastUnchangedRegions = lastUnchangedRegions.regions.map((r, idx) => (!lastUnchangedRegionsOrigRanges[idx] || !lastUnchangedRegionsModRanges[idx]) ? undefined :\n                new UnchangedRegion(lastUnchangedRegionsOrigRanges[idx].startLineNumber, lastUnchangedRegionsModRanges[idx].startLineNumber, lastUnchangedRegionsOrigRanges[idx].length, r.visibleLineCountTop.read(reader), r.visibleLineCountBottom.read(reader))).filter(isDefined);\n            const newRanges = [];\n            let didChange = false;\n            for (const touching of groupAdjacentBy(updatedLastUnchangedRegions, (a, b) => a.getHiddenModifiedRange(reader).endLineNumberExclusive === b.getHiddenModifiedRange(reader).startLineNumber)) {\n                if (touching.length > 1) {\n                    didChange = true;\n                    const sumLineCount = touching.reduce((sum, r) => sum + r.lineCount, 0);\n                    const r = new UnchangedRegion(touching[0].originalLineNumber, touching[0].modifiedLineNumber, sumLineCount, touching[0].visibleLineCountTop.read(undefined), touching[touching.length - 1].visibleLineCountBottom.read(undefined));\n                    newRanges.push(r);\n                }\n                else {\n                    newRanges.push(touching[0]);\n                }\n            }\n            if (didChange) {\n                const originalDecorationIds = model.original.deltaDecorations(lastUnchangedRegions.originalDecorationIds, newRanges.map(r => ({ range: r.originalUnchangedRange.toInclusiveRange(), options: { description: 'unchanged' } })));\n                const modifiedDecorationIds = model.modified.deltaDecorations(lastUnchangedRegions.modifiedDecorationIds, newRanges.map(r => ({ range: r.modifiedUnchangedRange.toInclusiveRange(), options: { description: 'unchanged' } })));\n                transaction(tx => {\n                    this._unchangedRegions.set({\n                        regions: newRanges,\n                        originalDecorationIds,\n                        modifiedDecorationIds\n                    }, tx);\n                });\n            }\n        }));\n        const updateUnchangedRegions = (result, tx, reader) => {\n            const newUnchangedRegions = UnchangedRegion.fromDiffs(result.changes, model.original.getLineCount(), model.modified.getLineCount(), this._options.hideUnchangedRegionsMinimumLineCount.read(reader), this._options.hideUnchangedRegionsContextLineCount.read(reader));\n            // Transfer state from cur state\n            let visibleRegions = undefined;\n            const lastUnchangedRegions = this._unchangedRegions.get();\n            if (lastUnchangedRegions) {\n                const lastUnchangedRegionsOrigRanges = lastUnchangedRegions.originalDecorationIds\n                    .map(id => model.original.getDecorationRange(id))\n                    .map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n                const lastUnchangedRegionsModRanges = lastUnchangedRegions.modifiedDecorationIds\n                    .map(id => model.modified.getDecorationRange(id))\n                    .map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n                const updatedLastUnchangedRegions = filterWithPrevious(lastUnchangedRegions.regions\n                    .map((r, idx) => {\n                    if (!lastUnchangedRegionsOrigRanges[idx] || !lastUnchangedRegionsModRanges[idx]) {\n                        return undefined;\n                    }\n                    const length = lastUnchangedRegionsOrigRanges[idx].length;\n                    return new UnchangedRegion(lastUnchangedRegionsOrigRanges[idx].startLineNumber, lastUnchangedRegionsModRanges[idx].startLineNumber, length, \n                    // The visible area can shrink by edits -> we have to account for this\n                    Math.min(r.visibleLineCountTop.get(), length), Math.min(r.visibleLineCountBottom.get(), length - r.visibleLineCountTop.get()));\n                }).filter(isDefined), (cur, prev) => !prev || (cur.modifiedLineNumber >= prev.modifiedLineNumber + prev.lineCount && cur.originalLineNumber >= prev.originalLineNumber + prev.lineCount));\n                let hiddenRegions = updatedLastUnchangedRegions.map(r => new LineRangeMapping(r.getHiddenOriginalRange(reader), r.getHiddenModifiedRange(reader)));\n                hiddenRegions = LineRangeMapping.clip(hiddenRegions, LineRange.ofLength(1, model.original.getLineCount()), LineRange.ofLength(1, model.modified.getLineCount()));\n                visibleRegions = LineRangeMapping.inverse(hiddenRegions, model.original.getLineCount(), model.modified.getLineCount());\n            }\n            const newUnchangedRegions2 = [];\n            if (visibleRegions) {\n                for (const r of newUnchangedRegions) {\n                    const intersecting = visibleRegions.filter(f => f.original.intersectsStrict(r.originalUnchangedRange) && f.modified.intersectsStrict(r.modifiedUnchangedRange));\n                    newUnchangedRegions2.push(...r.setVisibleRanges(intersecting, tx));\n                }\n            }\n            else {\n                newUnchangedRegions2.push(...newUnchangedRegions);\n            }\n            const originalDecorationIds = model.original.deltaDecorations(lastUnchangedRegions?.originalDecorationIds || [], newUnchangedRegions2.map(r => ({ range: r.originalUnchangedRange.toInclusiveRange(), options: { description: 'unchanged' } })));\n            const modifiedDecorationIds = model.modified.deltaDecorations(lastUnchangedRegions?.modifiedDecorationIds || [], newUnchangedRegions2.map(r => ({ range: r.modifiedUnchangedRange.toInclusiveRange(), options: { description: 'unchanged' } })));\n            this._unchangedRegions.set({\n                regions: newUnchangedRegions2,\n                originalDecorationIds,\n                modifiedDecorationIds\n            }, tx);\n        };\n        this._register(model.modified.onDidChangeContent((e) => {\n            const diff = this._diff.get();\n            if (diff) {\n                const textEdits = TextEditInfo.fromModelContentChanges(e.changes);\n                applyModifiedEdits(this._lastDiff, textEdits, model.original, model.modified);\n            }\n            this._isDiffUpToDate.set(false, undefined);\n            debouncer.schedule();\n        }));\n        this._register(model.original.onDidChangeContent((e) => {\n            const diff = this._diff.get();\n            if (diff) {\n                const textEdits = TextEditInfo.fromModelContentChanges(e.changes);\n                applyOriginalEdits(this._lastDiff, textEdits, model.original, model.modified);\n            }\n            this._isDiffUpToDate.set(false, undefined);\n            debouncer.schedule();\n        }));\n        this._register(autorunWithStore(async (reader, store) => {\n            /** @description compute diff */\n            // So that they get recomputed when these settings change\n            this._options.hideUnchangedRegionsMinimumLineCount.read(reader);\n            this._options.hideUnchangedRegionsContextLineCount.read(reader);\n            debouncer.cancel();\n            contentChangedSignal.read(reader);\n            const documentDiffProvider = this._diffProvider.read(reader);\n            documentDiffProvider.onChangeSignal.read(reader);\n            this._isDiffUpToDate.set(false, undefined);\n            let originalTextEditInfos = [];\n            store.add(model.original.onDidChangeContent((e) => {\n                const edits = TextEditInfo.fromModelContentChanges(e.changes);\n                originalTextEditInfos = combineTextEditInfos(originalTextEditInfos, edits);\n            }));\n            let modifiedTextEditInfos = [];\n            store.add(model.modified.onDidChangeContent((e) => {\n                const edits = TextEditInfo.fromModelContentChanges(e.changes);\n                modifiedTextEditInfos = combineTextEditInfos(modifiedTextEditInfos, edits);\n            }));\n            let result = await documentDiffProvider.diffProvider.computeDiff(model.original, model.modified, {\n                ignoreTrimWhitespace: this._options.ignoreTrimWhitespace.read(reader),\n                maxComputationTimeMs: this._options.maxComputationTimeMs.read(reader),\n                computeMoves: this._options.showMoves.read(reader),\n            }, this._cancellationTokenSource.token);\n            if (this._cancellationTokenSource.token.isCancellationRequested) {\n                return;\n            }\n            if (model.original.isDisposed() || model.modified.isDisposed()) {\n                // TODO@hediet fishy?\n                return;\n            }\n            result = normalizeDocumentDiff(result, model.original, model.modified);\n            result = applyOriginalEdits(result, originalTextEditInfos, model.original, model.modified) ?? result;\n            result = applyModifiedEdits(result, modifiedTextEditInfos, model.original, model.modified) ?? result;\n            transaction(tx => {\n                /** @description write diff result */\n                updateUnchangedRegions(result, tx);\n                this._lastDiff = result;\n                const state = DiffState.fromDiffResult(result);\n                this._diff.set(state, tx);\n                this._isDiffUpToDate.set(true, tx);\n                const currentSyncedMovedText = this.movedTextToCompare.read(undefined);\n                this.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff.moves.find(m => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : undefined, tx);\n            });\n        }));\n    }\n    ensureModifiedLineIsVisible(lineNumber, preference, tx) {\n        if (this.diff.get()?.mappings.length === 0) {\n            return;\n        }\n        const unchangedRegions = this._unchangedRegions.get()?.regions || [];\n        for (const r of unchangedRegions) {\n            if (r.getHiddenModifiedRange(undefined).contains(lineNumber)) {\n                r.showModifiedLine(lineNumber, preference, tx);\n                return;\n            }\n        }\n    }\n    ensureOriginalLineIsVisible(lineNumber, preference, tx) {\n        if (this.diff.get()?.mappings.length === 0) {\n            return;\n        }\n        const unchangedRegions = this._unchangedRegions.get()?.regions || [];\n        for (const r of unchangedRegions) {\n            if (r.getHiddenOriginalRange(undefined).contains(lineNumber)) {\n                r.showOriginalLine(lineNumber, preference, tx);\n                return;\n            }\n        }\n    }\n    async waitForDiff() {\n        await waitForState(this.isDiffUpToDate, s => s);\n    }\n    serializeState() {\n        const regions = this._unchangedRegions.get();\n        return {\n            collapsedRegions: regions?.regions.map(r => ({ range: r.getHiddenModifiedRange(undefined).serialize() }))\n        };\n    }\n    restoreSerializedState(state) {\n        const ranges = state.collapsedRegions?.map(r => LineRange.deserialize(r.range));\n        const regions = this._unchangedRegions.get();\n        if (!regions || !ranges) {\n            return;\n        }\n        transaction(tx => {\n            for (const r of regions.regions) {\n                for (const range of ranges) {\n                    if (r.modifiedUnchangedRange.intersect(range)) {\n                        r.setHiddenModifiedRange(range, tx);\n                        break;\n                    }\n                }\n            }\n        });\n    }\n};\nDiffEditorViewModel = __decorate([\n    __param(2, IDiffProviderFactoryService)\n], DiffEditorViewModel);\nfunction normalizeDocumentDiff(diff, original, modified) {\n    return {\n        changes: diff.changes.map(c => new DetailedLineRangeMapping(c.original, c.modified, c.innerChanges ? c.innerChanges.map(i => normalizeRangeMapping(i, original, modified)) : undefined)),\n        moves: diff.moves,\n        identical: diff.identical,\n        quitEarly: diff.quitEarly,\n    };\n}\nfunction normalizeRangeMapping(rangeMapping, original, modified) {\n    let originalRange = rangeMapping.originalRange;\n    let modifiedRange = rangeMapping.modifiedRange;\n    if (originalRange.startColumn === 1 && modifiedRange.startColumn === 1 &&\n        (originalRange.endColumn !== 1 || modifiedRange.endColumn !== 1) &&\n        originalRange.endColumn === original.getLineMaxColumn(originalRange.endLineNumber)\n        && modifiedRange.endColumn === modified.getLineMaxColumn(modifiedRange.endLineNumber)\n        && originalRange.endLineNumber < original.getLineCount()\n        && modifiedRange.endLineNumber < modified.getLineCount()) {\n        originalRange = originalRange.setEndPosition(originalRange.endLineNumber + 1, 1);\n        modifiedRange = modifiedRange.setEndPosition(modifiedRange.endLineNumber + 1, 1);\n    }\n    return new RangeMapping(originalRange, modifiedRange);\n}\nclass DiffState {\n    static fromDiffResult(result) {\n        return new DiffState(result.changes.map(c => new DiffMapping(c)), result.moves || [], result.identical, result.quitEarly);\n    }\n    constructor(mappings, movedTexts, identical, quitEarly) {\n        this.mappings = mappings;\n        this.movedTexts = movedTexts;\n        this.identical = identical;\n        this.quitEarly = quitEarly;\n    }\n}\nclass DiffMapping {\n    constructor(lineRangeMapping) {\n        this.lineRangeMapping = lineRangeMapping;\n        /*\n        readonly movedTo: MovedText | undefined,\n        readonly movedFrom: MovedText | undefined,\n\n        if (movedTo) {\n            assertFn(() =>\n                movedTo.lineRangeMapping.modifiedRange.equals(lineRangeMapping.modifiedRange)\n                && lineRangeMapping.originalRange.isEmpty\n                && !movedFrom\n            );\n        } else if (movedFrom) {\n            assertFn(() =>\n                movedFrom.lineRangeMapping.originalRange.equals(lineRangeMapping.originalRange)\n                && lineRangeMapping.modifiedRange.isEmpty\n                && !movedTo\n            );\n        }\n        */\n    }\n}\nclass UnchangedRegion {\n    static fromDiffs(changes, originalLineCount, modifiedLineCount, minHiddenLineCount, minContext) {\n        const inversedMappings = DetailedLineRangeMapping.inverse(changes, originalLineCount, modifiedLineCount);\n        const result = [];\n        for (const mapping of inversedMappings) {\n            let origStart = mapping.original.startLineNumber;\n            let modStart = mapping.modified.startLineNumber;\n            let length = mapping.original.length;\n            const atStart = origStart === 1 && modStart === 1;\n            const atEnd = origStart + length === originalLineCount + 1 && modStart + length === modifiedLineCount + 1;\n            if ((atStart || atEnd) && length >= minContext + minHiddenLineCount) {\n                if (atStart && !atEnd) {\n                    length -= minContext;\n                }\n                if (atEnd && !atStart) {\n                    origStart += minContext;\n                    modStart += minContext;\n                    length -= minContext;\n                }\n                result.push(new UnchangedRegion(origStart, modStart, length, 0, 0));\n            }\n            else if (length >= minContext * 2 + minHiddenLineCount) {\n                origStart += minContext;\n                modStart += minContext;\n                length -= minContext * 2;\n                result.push(new UnchangedRegion(origStart, modStart, length, 0, 0));\n            }\n        }\n        return result;\n    }\n    get originalUnchangedRange() {\n        return LineRange.ofLength(this.originalLineNumber, this.lineCount);\n    }\n    get modifiedUnchangedRange() {\n        return LineRange.ofLength(this.modifiedLineNumber, this.lineCount);\n    }\n    constructor(originalLineNumber, modifiedLineNumber, lineCount, visibleLineCountTop, visibleLineCountBottom) {\n        this.originalLineNumber = originalLineNumber;\n        this.modifiedLineNumber = modifiedLineNumber;\n        this.lineCount = lineCount;\n        this._visibleLineCountTop = observableValue(this, 0);\n        this.visibleLineCountTop = this._visibleLineCountTop;\n        this._visibleLineCountBottom = observableValue(this, 0);\n        this.visibleLineCountBottom = this._visibleLineCountBottom;\n        this._shouldHideControls = derived(this, reader => /** @description isVisible */ this.visibleLineCountTop.read(reader) + this.visibleLineCountBottom.read(reader) === this.lineCount && !this.isDragged.read(reader));\n        this.isDragged = observableValue(this, undefined);\n        const visibleLineCountTop2 = Math.max(Math.min(visibleLineCountTop, this.lineCount), 0);\n        const visibleLineCountBottom2 = Math.max(Math.min(visibleLineCountBottom, this.lineCount - visibleLineCountTop), 0);\n        softAssert(visibleLineCountTop === visibleLineCountTop2);\n        softAssert(visibleLineCountBottom === visibleLineCountBottom2);\n        this._visibleLineCountTop.set(visibleLineCountTop2, undefined);\n        this._visibleLineCountBottom.set(visibleLineCountBottom2, undefined);\n    }\n    setVisibleRanges(visibleRanges, tx) {\n        const result = [];\n        const hiddenModified = new LineRangeSet(visibleRanges.map(r => r.modified)).subtractFrom(this.modifiedUnchangedRange);\n        let originalStartLineNumber = this.originalLineNumber;\n        let modifiedStartLineNumber = this.modifiedLineNumber;\n        const modifiedEndLineNumberEx = this.modifiedLineNumber + this.lineCount;\n        if (hiddenModified.ranges.length === 0) {\n            this.showAll(tx);\n            result.push(this);\n        }\n        else {\n            let i = 0;\n            for (const r of hiddenModified.ranges) {\n                const isLast = i === hiddenModified.ranges.length - 1;\n                i++;\n                const length = (isLast ? modifiedEndLineNumberEx : r.endLineNumberExclusive) - modifiedStartLineNumber;\n                const newR = new UnchangedRegion(originalStartLineNumber, modifiedStartLineNumber, length, 0, 0);\n                newR.setHiddenModifiedRange(r, tx);\n                result.push(newR);\n                originalStartLineNumber = newR.originalUnchangedRange.endLineNumberExclusive;\n                modifiedStartLineNumber = newR.modifiedUnchangedRange.endLineNumberExclusive;\n            }\n        }\n        return result;\n    }\n    shouldHideControls(reader) {\n        return this._shouldHideControls.read(reader);\n    }\n    getHiddenOriginalRange(reader) {\n        return LineRange.ofLength(this.originalLineNumber + this._visibleLineCountTop.read(reader), this.lineCount - this._visibleLineCountTop.read(reader) - this._visibleLineCountBottom.read(reader));\n    }\n    getHiddenModifiedRange(reader) {\n        return LineRange.ofLength(this.modifiedLineNumber + this._visibleLineCountTop.read(reader), this.lineCount - this._visibleLineCountTop.read(reader) - this._visibleLineCountBottom.read(reader));\n    }\n    setHiddenModifiedRange(range, tx) {\n        const visibleLineCountTop = range.startLineNumber - this.modifiedLineNumber;\n        const visibleLineCountBottom = (this.modifiedLineNumber + this.lineCount) - range.endLineNumberExclusive;\n        this.setState(visibleLineCountTop, visibleLineCountBottom, tx);\n    }\n    getMaxVisibleLineCountTop() {\n        return this.lineCount - this._visibleLineCountBottom.get();\n    }\n    getMaxVisibleLineCountBottom() {\n        return this.lineCount - this._visibleLineCountTop.get();\n    }\n    showMoreAbove(count = 10, tx) {\n        const maxVisibleLineCountTop = this.getMaxVisibleLineCountTop();\n        this._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get() + count, maxVisibleLineCountTop), tx);\n    }\n    showMoreBelow(count = 10, tx) {\n        const maxVisibleLineCountBottom = this.lineCount - this._visibleLineCountTop.get();\n        this._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get() + count, maxVisibleLineCountBottom), tx);\n    }\n    showAll(tx) {\n        this._visibleLineCountBottom.set(this.lineCount - this._visibleLineCountTop.get(), tx);\n    }\n    showModifiedLine(lineNumber, preference, tx) {\n        const top = lineNumber + 1 - (this.modifiedLineNumber + this._visibleLineCountTop.get());\n        const bottom = (this.modifiedLineNumber - this._visibleLineCountBottom.get() + this.lineCount) - lineNumber;\n        if (preference === 0 /* RevealPreference.FromCloserSide */ && top < bottom || preference === 1 /* RevealPreference.FromTop */) {\n            this._visibleLineCountTop.set(this._visibleLineCountTop.get() + top, tx);\n        }\n        else {\n            this._visibleLineCountBottom.set(this._visibleLineCountBottom.get() + bottom, tx);\n        }\n    }\n    showOriginalLine(lineNumber, preference, tx) {\n        const top = lineNumber - this.originalLineNumber;\n        const bottom = (this.originalLineNumber + this.lineCount) - lineNumber;\n        if (preference === 0 /* RevealPreference.FromCloserSide */ && top < bottom || preference === 1 /* RevealPreference.FromTop */) {\n            this._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get() + bottom - top, this.getMaxVisibleLineCountTop()), tx);\n        }\n        else {\n            this._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get() + top - bottom, this.getMaxVisibleLineCountBottom()), tx);\n        }\n    }\n    collapseAll(tx) {\n        this._visibleLineCountTop.set(0, tx);\n        this._visibleLineCountBottom.set(0, tx);\n    }\n    setState(visibleLineCountTop, visibleLineCountBottom, tx) {\n        visibleLineCountTop = Math.max(Math.min(visibleLineCountTop, this.lineCount), 0);\n        visibleLineCountBottom = Math.max(Math.min(visibleLineCountBottom, this.lineCount - visibleLineCountTop), 0);\n        this._visibleLineCountTop.set(visibleLineCountTop, tx);\n        this._visibleLineCountBottom.set(visibleLineCountBottom, tx);\n    }\n}\nfunction applyOriginalEdits(diff, textEdits, originalTextModel, modifiedTextModel) {\n    return undefined;\n    /*\n    TODO@hediet\n    if (textEdits.length === 0) {\n        return diff;\n    }\n\n    const diff2 = flip(diff);\n    const diff3 = applyModifiedEdits(diff2, textEdits, modifiedTextModel, originalTextModel);\n    if (!diff3) {\n        return undefined;\n    }\n    return flip(diff3);*/\n}\n/*\nfunction flip(diff: IDocumentDiff): IDocumentDiff {\n    return {\n        changes: diff.changes.map(c => c.flip()),\n        moves: diff.moves.map(m => m.flip()),\n        identical: diff.identical,\n        quitEarly: diff.quitEarly,\n    };\n}\n*/\nfunction applyModifiedEdits(diff, textEdits, originalTextModel, modifiedTextModel) {\n    return undefined;\n    /*\n    TODO@hediet\n    if (textEdits.length === 0) {\n        return diff;\n    }\n    if (diff.changes.some(c => !c.innerChanges) || diff.moves.length > 0) {\n        // TODO support these cases\n        return undefined;\n    }\n\n    const changes = applyModifiedEditsToLineRangeMappings(diff.changes, textEdits, originalTextModel, modifiedTextModel);\n\n    const moves = diff.moves.map(m => {\n        const newModifiedRange = applyEditToLineRange(m.lineRangeMapping.modified, textEdits);\n        return newModifiedRange ? new MovedText(\n            new SimpleLineRangeMapping(m.lineRangeMapping.original, newModifiedRange),\n            applyModifiedEditsToLineRangeMappings(m.changes, textEdits, originalTextModel, modifiedTextModel),\n        ) : undefined;\n    }).filter(isDefined);\n\n    return {\n        identical: false,\n        quitEarly: false,\n        changes,\n        moves,\n    };*/\n}\n/*\nfunction applyEditToLineRange(range: LineRange, textEdits: TextEditInfo[]): LineRange | undefined {\n    let rangeStartLineNumber = range.startLineNumber;\n    let rangeEndLineNumberEx = range.endLineNumberExclusive;\n\n    for (let i = textEdits.length - 1; i >= 0; i--) {\n        const textEdit = textEdits[i];\n        const textEditStartLineNumber = lengthGetLineCount(textEdit.startOffset) + 1;\n        const textEditEndLineNumber = lengthGetLineCount(textEdit.endOffset) + 1;\n        const newLengthLineCount = lengthGetLineCount(textEdit.newLength);\n        const delta = newLengthLineCount - (textEditEndLineNumber - textEditStartLineNumber);\n\n        if (textEditEndLineNumber < rangeStartLineNumber) {\n            // the text edit is before us\n            rangeStartLineNumber += delta;\n            rangeEndLineNumberEx += delta;\n        } else if (textEditStartLineNumber > rangeEndLineNumberEx) {\n            // the text edit is after us\n            // NOOP\n        } else if (textEditStartLineNumber < rangeStartLineNumber && rangeEndLineNumberEx < textEditEndLineNumber) {\n            // the range is fully contained in the text edit\n            return undefined;\n        } else if (textEditStartLineNumber < rangeStartLineNumber && textEditEndLineNumber <= rangeEndLineNumberEx) {\n            // the text edit ends inside our range\n            rangeStartLineNumber = textEditEndLineNumber + 1;\n            rangeStartLineNumber += delta;\n            rangeEndLineNumberEx += delta;\n        } else if (rangeStartLineNumber <= textEditStartLineNumber && textEditEndLineNumber < rangeStartLineNumber) {\n            // the text edit starts inside our range\n            rangeEndLineNumberEx = textEditStartLineNumber;\n        } else {\n            rangeEndLineNumberEx += delta;\n        }\n    }\n\n    return new LineRange(rangeStartLineNumber, rangeEndLineNumberEx);\n}\n\nfunction applyModifiedEditsToLineRangeMappings(changes: readonly LineRangeMapping[], textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): LineRangeMapping[] {\n    const diffTextEdits = changes.flatMap(c => c.innerChanges!.map(c => new TextEditInfo(\n        positionToLength(c.originalRange.getStartPosition()),\n        positionToLength(c.originalRange.getEndPosition()),\n        lengthOfRange(c.modifiedRange).toLength(),\n    )));\n\n    const combined = combineTextEditInfos(diffTextEdits, textEdits);\n\n    let lastOriginalEndOffset = lengthZero;\n    let lastModifiedEndOffset = lengthZero;\n    const rangeMappings = combined.map(c => {\n        const modifiedStartOffset = lengthAdd(lastModifiedEndOffset, lengthDiffNonNegative(lastOriginalEndOffset, c.startOffset));\n        lastOriginalEndOffset = c.endOffset;\n        lastModifiedEndOffset = lengthAdd(modifiedStartOffset, c.newLength);\n\n        return new RangeMapping(\n            Range.fromPositions(lengthToPosition(c.startOffset), lengthToPosition(c.endOffset)),\n            Range.fromPositions(lengthToPosition(modifiedStartOffset), lengthToPosition(lastModifiedEndOffset)),\n        );\n    });\n\n    const newChanges = lineRangeMappingFromRangeMappings(\n        rangeMappings,\n        originalTextModel.getLinesContent(),\n        modifiedTextModel.getLinesContent(),\n    );\n    return newChanges;\n}\n*/\n\nexport { DiffEditorViewModel, DiffMapping, DiffState, UnchangedRegion };\n","import { addDisposableListener } from '../../../../../../base/browser/dom.js';\nimport { DisposableStore } from '../../../../../../base/common/lifecycle.js';\nimport { Range } from '../../../../../common/core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction enableCopySelection(options) {\n    const { domNode, renderLinesResult, diffEntry, originalModel, clipboardService } = options;\n    const viewZoneDisposable = new DisposableStore();\n    viewZoneDisposable.add(addDisposableListener(domNode, 'copy', (e) => {\n        e.preventDefault();\n        const selection = domNode.ownerDocument.getSelection();\n        if (!selection || selection.rangeCount === 0) {\n            return;\n        }\n        const domRange = selection.getRangeAt(0);\n        if (!domRange || domRange.collapsed) {\n            return;\n        }\n        const startElement = domRange.startContainer.nodeType === Node.TEXT_NODE\n            ? domRange.startContainer.parentElement\n            : domRange.startContainer;\n        const endElement = domRange.endContainer.nodeType === Node.TEXT_NODE\n            ? domRange.endContainer.parentElement\n            : domRange.endContainer;\n        if (!startElement || !endElement) {\n            return;\n        }\n        const startPosition = renderLinesResult.getModelPositionAt(startElement, domRange.startOffset);\n        const endPosition = renderLinesResult.getModelPositionAt(endElement, domRange.endOffset);\n        if (!startPosition || !endPosition) {\n            return;\n        }\n        const adjustedStart = startPosition.delta(diffEntry.original.startLineNumber - 1);\n        const adjustedEnd = endPosition.delta(diffEntry.original.startLineNumber - 1);\n        const range = adjustedEnd.isBefore(adjustedStart) ?\n            Range.fromPositions(adjustedEnd, adjustedStart) :\n            Range.fromPositions(adjustedStart, adjustedEnd);\n        const selectedText = originalModel.getValueInRange(range);\n        clipboardService.writeText(selectedText);\n    }));\n    return viewZoneDisposable;\n}\n\nexport { enableCopySelection };\n","import { addStandardDisposableListener, getDomNodePagePosition } from '../../../../../../base/browser/dom.js';\nimport { Action } from '../../../../../../base/common/actions.js';\nimport { Codicon } from '../../../../../../base/common/codicons.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { isIOS } from '../../../../../../base/common/platform.js';\nimport { ThemeIcon } from '../../../../../../base/common/themables.js';\nimport { localize } from '../../../../../../nls.js';\nimport { enableCopySelection } from './copySelection.js';\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 *--------------------------------------------------------------------------------------------*/\nclass InlineDiffDeletedCodeMargin extends Disposable {\n    get visibility() {\n        return this._visibility;\n    }\n    set visibility(_visibility) {\n        if (this._visibility !== _visibility) {\n            this._visibility = _visibility;\n            this._diffActions.style.visibility = _visibility ? 'visible' : 'hidden';\n        }\n    }\n    constructor(_getViewZoneId, _marginDomNode, _deletedCodeDomNode, _modifiedEditor, _diff, _editor, _renderLinesResult, _originalTextModel, _contextMenuService, _clipboardService) {\n        super();\n        this._getViewZoneId = _getViewZoneId;\n        this._marginDomNode = _marginDomNode;\n        this._deletedCodeDomNode = _deletedCodeDomNode;\n        this._modifiedEditor = _modifiedEditor;\n        this._diff = _diff;\n        this._editor = _editor;\n        this._renderLinesResult = _renderLinesResult;\n        this._originalTextModel = _originalTextModel;\n        this._contextMenuService = _contextMenuService;\n        this._clipboardService = _clipboardService;\n        this._visibility = false;\n        // make sure the diff margin shows above overlay.\n        this._marginDomNode.style.zIndex = '10';\n        this._diffActions = document.createElement('div');\n        this._diffActions.className = ThemeIcon.asClassName(Codicon.lightBulb) + ' lightbulb-glyph';\n        this._diffActions.style.position = 'absolute';\n        const lineHeight = this._modifiedEditor.getOption(75 /* EditorOption.lineHeight */);\n        this._diffActions.style.right = '0px';\n        this._diffActions.style.visibility = 'hidden';\n        this._diffActions.style.height = `${lineHeight}px`;\n        this._diffActions.style.lineHeight = `${lineHeight}px`;\n        this._marginDomNode.appendChild(this._diffActions);\n        let currentLineNumberOffset = 0;\n        const useShadowDOM = _modifiedEditor.getOption(144 /* EditorOption.useShadowDOM */) && !isIOS; // Do not use shadow dom on IOS #122035\n        const showContextMenu = (anchor, baseActions, onHide) => {\n            this._contextMenuService.showContextMenu({\n                domForShadowRoot: useShadowDOM ? _modifiedEditor.getDomNode() ?? undefined : undefined,\n                getAnchor: () => anchor,\n                onHide,\n                getActions: () => {\n                    const actions = [];\n                    const isDeletion = _diff.modified.isEmpty;\n                    // default action\n                    actions.push(new Action('diff.clipboard.copyDeletedContent', isDeletion\n                        ? (_diff.original.length > 1\n                            ? localize(112, \"Copy deleted lines\")\n                            : localize(113, \"Copy deleted line\"))\n                        : (_diff.original.length > 1\n                            ? localize(114, \"Copy changed lines\")\n                            : localize(115, \"Copy changed line\")), undefined, true, async () => {\n                        const originalText = this._originalTextModel.getValueInRange(_diff.original.toExclusiveRange());\n                        await this._clipboardService.writeText(originalText);\n                    }));\n                    if (_diff.original.length > 1) {\n                        actions.push(new Action('diff.clipboard.copyDeletedLineContent', isDeletion\n                            ? localize(116, \"Copy deleted line ({0})\", _diff.original.startLineNumber + currentLineNumberOffset)\n                            : localize(117, \"Copy changed line ({0})\", _diff.original.startLineNumber + currentLineNumberOffset), undefined, true, async () => {\n                            let lineContent = this._originalTextModel.getLineContent(_diff.original.startLineNumber + currentLineNumberOffset);\n                            if (lineContent === '') {\n                                // empty line -> new line\n                                const eof = this._originalTextModel.getEndOfLineSequence();\n                                lineContent = eof === 0 /* EndOfLineSequence.LF */ ? '\\n' : '\\r\\n';\n                            }\n                            await this._clipboardService.writeText(lineContent);\n                        }));\n                    }\n                    const readOnly = _modifiedEditor.getOption(104 /* EditorOption.readOnly */);\n                    if (!readOnly) {\n                        actions.push(new Action('diff.inline.revertChange', localize(118, \"Revert this change\"), undefined, true, async () => {\n                            this._editor.revert(this._diff);\n                        }));\n                    }\n                    return actions;\n                },\n                autoSelectFirstItem: true\n            });\n        };\n        this._register(addStandardDisposableListener(this._diffActions, 'mousedown', e => {\n            if (!e.leftButton) {\n                return;\n            }\n            const { top, height } = getDomNodePagePosition(this._diffActions);\n            const pad = Math.floor(lineHeight / 3);\n            e.preventDefault();\n            showContextMenu({ x: e.posx, y: top + height + pad });\n        }));\n        this._register(_modifiedEditor.onMouseMove((e) => {\n            if ((e.target.type === 8 /* MouseTargetType.CONTENT_VIEW_ZONE */ || e.target.type === 5 /* MouseTargetType.GUTTER_VIEW_ZONE */) && e.target.detail.viewZoneId === this._getViewZoneId()) {\n                currentLineNumberOffset = this._updateLightBulbPosition(this._marginDomNode, e.event.browserEvent.y, lineHeight);\n                this.visibility = true;\n            }\n            else {\n                this.visibility = false;\n            }\n        }));\n        this._register(enableCopySelection({\n            domNode: this._deletedCodeDomNode,\n            diffEntry: _diff,\n            originalModel: this._originalTextModel,\n            renderLinesResult: this._renderLinesResult,\n            clipboardService: _clipboardService,\n        }));\n    }\n    _updateLightBulbPosition(marginDomNode, y, lineHeight) {\n        const { top } = getDomNodePagePosition(marginDomNode);\n        const offset = y - top;\n        const lineNumberOffset = Math.floor(offset / lineHeight);\n        const newTop = lineNumberOffset * lineHeight;\n        this._diffActions.style.top = `${newTop}px`;\n        if (this._renderLinesResult.viewLineCounts) {\n            let acc = 0;\n            for (let i = 0; i < this._renderLinesResult.viewLineCounts.length; i++) {\n                acc += this._renderLinesResult.viewLineCounts[i];\n                if (lineNumberOffset < acc) {\n                    return i;\n                }\n            }\n        }\n        return lineNumberOffset;\n    }\n}\n\nexport { InlineDiffDeletedCodeMargin };\n","import { createTrustedTypesPolicy } from '../../../../../../base/browser/trustedTypes.js';\nimport { applyFontInfo } from '../../../../config/domFontInfo.js';\nimport { EditorFontLigatures } from '../../../../../common/config/editorOptions.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { StringBuilder } from '../../../../../common/core/stringBuilder.js';\nimport { LineDecoration } from '../../../../../common/viewLayout/lineDecorations.js';\nimport { renderViewLine, RenderLineInput, RenderLineOutput } from '../../../../../common/viewLayout/viewLineRenderer.js';\nimport { ViewLineRenderingData } from '../../../../../common/viewModel.js';\nimport { getColumnOfNodeOffset } from '../../../../viewParts/viewLines/viewLine.js';\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 *--------------------------------------------------------------------------------------------*/\nconst ttPolicy = createTrustedTypesPolicy('diffEditorWidget', { createHTML: value => value });\nfunction renderLines(source, options, decorations, domNode, noExtra = false) {\n    applyFontInfo(domNode, options.fontInfo);\n    const hasCharChanges = (decorations.length > 0);\n    const sb = new StringBuilder(10000);\n    let maxCharsPerLine = 0;\n    let renderedLineCount = 0;\n    const viewLineCounts = [];\n    const renderOutputs = [];\n    for (let lineIndex = 0; lineIndex < source.lineTokens.length; lineIndex++) {\n        const lineNumber = lineIndex + 1;\n        const lineTokens = source.lineTokens[lineIndex];\n        const lineBreakData = source.lineBreakData[lineIndex];\n        const actualDecorations = LineDecoration.filter(decorations, lineNumber, 1, Number.MAX_SAFE_INTEGER);\n        if (lineBreakData) {\n            let lastBreakOffset = 0;\n            for (const breakOffset of lineBreakData.breakOffsets) {\n                const viewLineTokens = lineTokens.sliceAndInflate(lastBreakOffset, breakOffset, 0);\n                const result = renderOriginalLine(renderedLineCount, viewLineTokens, LineDecoration.extractWrapped(actualDecorations, lastBreakOffset, breakOffset), hasCharChanges, source.mightContainNonBasicASCII, source.mightContainRTL, options, sb, noExtra);\n                maxCharsPerLine = Math.max(maxCharsPerLine, result.maxCharWidth);\n                renderOutputs.push(new RenderLineOutputWithOffset(result.output.characterMapping, result.output.containsForeignElements, lastBreakOffset));\n                renderedLineCount++;\n                lastBreakOffset = breakOffset;\n            }\n            viewLineCounts.push(lineBreakData.breakOffsets.length);\n        }\n        else {\n            viewLineCounts.push(1);\n            const result = renderOriginalLine(renderedLineCount, lineTokens, actualDecorations, hasCharChanges, source.mightContainNonBasicASCII, source.mightContainRTL, options, sb, noExtra);\n            maxCharsPerLine = Math.max(maxCharsPerLine, result.maxCharWidth);\n            renderOutputs.push(new RenderLineOutputWithOffset(result.output.characterMapping, result.output.containsForeignElements, 0));\n            renderedLineCount++;\n        }\n    }\n    maxCharsPerLine += options.scrollBeyondLastColumn;\n    const html = sb.build();\n    const trustedhtml = ttPolicy ? ttPolicy.createHTML(html) : html;\n    domNode.innerHTML = trustedhtml;\n    const minWidthInPx = (maxCharsPerLine * options.typicalHalfwidthCharacterWidth);\n    return new RenderLinesResult(renderedLineCount, minWidthInPx, viewLineCounts, renderOutputs, source);\n}\nclass LineSource {\n    constructor(lineTokens, lineBreakData = lineTokens.map(t => null), mightContainNonBasicASCII = true, mightContainRTL = true) {\n        this.lineTokens = lineTokens;\n        this.lineBreakData = lineBreakData;\n        this.mightContainNonBasicASCII = mightContainNonBasicASCII;\n        this.mightContainRTL = mightContainRTL;\n    }\n}\nclass RenderOptions {\n    static fromEditor(editor) {\n        const modifiedEditorOptions = editor.getOptions();\n        const fontInfo = modifiedEditorOptions.get(59 /* EditorOption.fontInfo */);\n        const layoutInfo = modifiedEditorOptions.get(165 /* EditorOption.layoutInfo */);\n        return new RenderOptions(editor.getModel()?.getOptions().tabSize || 0, fontInfo, modifiedEditorOptions.get(40 /* EditorOption.disableMonospaceOptimizations */), fontInfo.typicalHalfwidthCharacterWidth, modifiedEditorOptions.get(118 /* EditorOption.scrollBeyondLastColumn */), modifiedEditorOptions.get(75 /* EditorOption.lineHeight */), layoutInfo.decorationsWidth, modifiedEditorOptions.get(133 /* EditorOption.stopRenderingLineAfter */), modifiedEditorOptions.get(113 /* EditorOption.renderWhitespace */), modifiedEditorOptions.get(108 /* EditorOption.renderControlCharacters */), modifiedEditorOptions.get(60 /* EditorOption.fontLigatures */), modifiedEditorOptions.get(117 /* EditorOption.scrollbar */).verticalScrollbarSize);\n    }\n    constructor(tabSize, fontInfo, disableMonospaceOptimizations, typicalHalfwidthCharacterWidth, scrollBeyondLastColumn, lineHeight, lineDecorationsWidth, stopRenderingLineAfter, renderWhitespace, renderControlCharacters, fontLigatures, verticalScrollbarSize, setWidth = true) {\n        this.tabSize = tabSize;\n        this.fontInfo = fontInfo;\n        this.disableMonospaceOptimizations = disableMonospaceOptimizations;\n        this.typicalHalfwidthCharacterWidth = typicalHalfwidthCharacterWidth;\n        this.scrollBeyondLastColumn = scrollBeyondLastColumn;\n        this.lineHeight = lineHeight;\n        this.lineDecorationsWidth = lineDecorationsWidth;\n        this.stopRenderingLineAfter = stopRenderingLineAfter;\n        this.renderWhitespace = renderWhitespace;\n        this.renderControlCharacters = renderControlCharacters;\n        this.fontLigatures = fontLigatures;\n        this.verticalScrollbarSize = verticalScrollbarSize;\n        this.setWidth = setWidth;\n    }\n    withSetWidth(setWidth) {\n        return new RenderOptions(this.tabSize, this.fontInfo, this.disableMonospaceOptimizations, this.typicalHalfwidthCharacterWidth, this.scrollBeyondLastColumn, this.lineHeight, this.lineDecorationsWidth, this.stopRenderingLineAfter, this.renderWhitespace, this.renderControlCharacters, this.fontLigatures, this.verticalScrollbarSize, setWidth);\n    }\n    withScrollBeyondLastColumn(scrollBeyondLastColumn) {\n        return new RenderOptions(this.tabSize, this.fontInfo, this.disableMonospaceOptimizations, this.typicalHalfwidthCharacterWidth, scrollBeyondLastColumn, this.lineHeight, this.lineDecorationsWidth, this.stopRenderingLineAfter, this.renderWhitespace, this.renderControlCharacters, this.fontLigatures, this.verticalScrollbarSize, this.setWidth);\n    }\n}\nclass RenderLinesResult {\n    constructor(heightInLines, minWidthInPx, viewLineCounts, _renderOutputs, _source) {\n        this.heightInLines = heightInLines;\n        this.minWidthInPx = minWidthInPx;\n        this.viewLineCounts = viewLineCounts;\n        this._renderOutputs = _renderOutputs;\n        this._source = _source;\n    }\n    /**\n     * Returns the model position for a given DOM node and offset within that node.\n     * @param domNode The span node within a view-line where the offset is located\n     * @param offset The offset within the span node\n     * @returns The Position in the model, or undefined if the position cannot be determined\n     */\n    getModelPositionAt(domNode, offset) {\n        // Find the view-line element that contains this span\n        let viewLineElement = domNode;\n        while (viewLineElement && !viewLineElement.classList.contains('view-line')) {\n            viewLineElement = viewLineElement.parentElement;\n        }\n        if (!viewLineElement) {\n            return undefined;\n        }\n        // Find the container that has all view lines\n        const container = viewLineElement.parentElement;\n        if (!container) {\n            return undefined;\n        }\n        // Find the view line index based on the element\n        // eslint-disable-next-line no-restricted-syntax\n        const viewLines = container.querySelectorAll('.view-line');\n        let viewLineIndex = -1;\n        for (let i = 0; i < viewLines.length; i++) {\n            if (viewLines[i] === viewLineElement) {\n                viewLineIndex = i;\n                break;\n            }\n        }\n        if (viewLineIndex === -1 || viewLineIndex >= this._renderOutputs.length) {\n            return undefined;\n        }\n        // Map view line index back to model line\n        let modelLineNumber = 1;\n        let remainingViewLines = viewLineIndex;\n        for (let i = 0; i < this.viewLineCounts.length; i++) {\n            if (remainingViewLines < this.viewLineCounts[i]) {\n                modelLineNumber = i + 1;\n                break;\n            }\n            remainingViewLines -= this.viewLineCounts[i];\n        }\n        if (modelLineNumber > this._source.lineTokens.length) {\n            return undefined;\n        }\n        const renderOutput = this._renderOutputs[viewLineIndex];\n        if (!renderOutput) {\n            return undefined;\n        }\n        const column = getColumnOfNodeOffset(renderOutput.characterMapping, domNode, offset) + renderOutput.offset;\n        return new Position(modelLineNumber, column);\n    }\n}\nclass RenderLineOutputWithOffset extends RenderLineOutput {\n    constructor(characterMapping, containsForeignElements, offset) {\n        super(characterMapping, containsForeignElements);\n        this.offset = offset;\n    }\n}\nfunction renderOriginalLine(viewLineIdx, lineTokens, decorations, hasCharChanges, mightContainNonBasicASCII, mightContainRTL, options, sb, noExtra) {\n    sb.appendString('<div class=\"view-line');\n    if (!noExtra && !hasCharChanges) {\n        // No char changes\n        sb.appendString(' char-delete');\n    }\n    sb.appendString('\" style=\"top:');\n    sb.appendString(String(viewLineIdx * options.lineHeight));\n    if (options.setWidth) {\n        sb.appendString('px;width:1000000px;\">');\n    }\n    else {\n        sb.appendString('px;\">');\n    }\n    const lineContent = lineTokens.getLineContent();\n    const isBasicASCII = ViewLineRenderingData.isBasicASCII(lineContent, mightContainNonBasicASCII);\n    const containsRTL = ViewLineRenderingData.containsRTL(lineContent, isBasicASCII, mightContainRTL);\n    const output = renderViewLine(new RenderLineInput((options.fontInfo.isMonospace && !options.disableMonospaceOptimizations), options.fontInfo.canUseHalfwidthRightwardsArrow, lineContent, false, isBasicASCII, containsRTL, 0, lineTokens, decorations, options.tabSize, 0, options.fontInfo.spaceWidth, options.fontInfo.middotWidth, options.fontInfo.wsmiddotWidth, options.stopRenderingLineAfter, options.renderWhitespace, options.renderControlCharacters, options.fontLigatures !== EditorFontLigatures.OFF, null, // Send no selections, original line cannot be selected\n    null, options.verticalScrollbarSize), sb);\n    sb.appendString('</div>');\n    const maxCharWidth = output.characterMapping.getHorizontalOffset(output.characterMapping.length);\n    return { output, maxCharWidth };\n}\n\nexport { LineSource, RenderLinesResult, RenderOptions, renderLines };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IClipboardService = createDecorator('clipboardService');\n\nexport { IClipboardService };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IContextViewService = createDecorator('contextViewService');\nconst IContextMenuService = createDecorator('contextMenuService');\n\nexport { IContextMenuService, IContextViewService };\n","import { addDisposableListener, $ } from '../../../../../../base/browser/dom.js';\nimport { ArrayQueue } from '../../../../../../base/common/arrays.js';\nimport { RunOnceScheduler } from '../../../../../../base/common/async.js';\nimport { Codicon } from '../../../../../../base/common/codicons.js';\nimport { Disposable, DisposableStore } from '../../../../../../base/common/lifecycle.js';\nimport '../../../../../../base/common/observableInternal/index.js';\nimport { ThemeIcon } from '../../../../../../base/common/themables.js';\nimport { assertReturnsDefined } from '../../../../../../base/common/types.js';\nimport { applyFontInfo } from '../../../../config/domFontInfo.js';\nimport { diffDeleteDecoration, diffRemoveIcon } from '../../registrations.contribution.js';\nimport { DiffMapping } from '../../diffEditorViewModel.js';\nimport { InlineDiffDeletedCodeMargin } from './inlineDiffDeletedCodeMargin.js';\nimport { RenderOptions, LineSource, renderLines } from './renderLines.js';\nimport { animatedObservable, joinCombine } from '../../utils.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { IClipboardService } from '../../../../../../platform/clipboard/common/clipboardService.js';\nimport { IContextMenuService } from '../../../../../../platform/contextview/browser/contextView.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { InlineDecoration } from '../../../../../common/viewModel/inlineDecorations.js';\nimport { observableFromEvent } from '../../../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { observableValue } from '../../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { derived } from '../../../../../../base/common/observableInternal/observables/derived.js';\nimport { autorun } from '../../../../../../base/common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/**\n * Ensures both editors have the same height by aligning unchanged lines.\n * In inline view mode, inserts viewzones to show deleted code from the original text model in the modified code editor.\n * Synchronizes scrolling.\n *\n * Make sure to add the view zones!\n */\nlet DiffEditorViewZones = class DiffEditorViewZones extends Disposable {\n    constructor(_targetWindow, _editors, _diffModel, _options, _diffEditorWidget, _canIgnoreViewZoneUpdateEvent, _origViewZonesToIgnore, _modViewZonesToIgnore, _clipboardService, _contextMenuService) {\n        super();\n        this._targetWindow = _targetWindow;\n        this._editors = _editors;\n        this._diffModel = _diffModel;\n        this._options = _options;\n        this._diffEditorWidget = _diffEditorWidget;\n        this._canIgnoreViewZoneUpdateEvent = _canIgnoreViewZoneUpdateEvent;\n        this._origViewZonesToIgnore = _origViewZonesToIgnore;\n        this._modViewZonesToIgnore = _modViewZonesToIgnore;\n        this._clipboardService = _clipboardService;\n        this._contextMenuService = _contextMenuService;\n        this._originalTopPadding = observableValue(this, 0);\n        this._originalScrollOffset = observableValue(this, 0);\n        this._originalScrollOffsetAnimated = animatedObservable(this._targetWindow, this._originalScrollOffset, this._store);\n        this._modifiedTopPadding = observableValue(this, 0);\n        this._modifiedScrollOffset = observableValue(this, 0);\n        this._modifiedScrollOffsetAnimated = animatedObservable(this._targetWindow, this._modifiedScrollOffset, this._store);\n        const state = observableValue('invalidateAlignmentsState', 0);\n        const updateImmediately = this._register(new RunOnceScheduler(() => {\n            state.set(state.get() + 1, undefined);\n        }, 0));\n        this._register(this._editors.original.onDidChangeViewZones((_args) => { if (!this._canIgnoreViewZoneUpdateEvent()) {\n            updateImmediately.schedule();\n        } }));\n        this._register(this._editors.modified.onDidChangeViewZones((_args) => { if (!this._canIgnoreViewZoneUpdateEvent()) {\n            updateImmediately.schedule();\n        } }));\n        this._register(this._editors.original.onDidChangeConfiguration((args) => {\n            if (args.hasChanged(166 /* EditorOption.wrappingInfo */) || args.hasChanged(75 /* EditorOption.lineHeight */)) {\n                updateImmediately.schedule();\n            }\n        }));\n        this._register(this._editors.modified.onDidChangeConfiguration((args) => {\n            if (args.hasChanged(166 /* EditorOption.wrappingInfo */) || args.hasChanged(75 /* EditorOption.lineHeight */)) {\n                updateImmediately.schedule();\n            }\n        }));\n        const originalModelTokenizationCompleted = this._diffModel.map(m => m ? observableFromEvent(this, m.model.original.onDidChangeTokens, () => m.model.original.tokenization.backgroundTokenizationState === 2 /* BackgroundTokenizationState.Completed */) : undefined).map((m, reader) => m?.read(reader));\n        const alignments = derived((reader) => {\n            /** @description alignments */\n            const diffModel = this._diffModel.read(reader);\n            const diff = diffModel?.diff.read(reader);\n            if (!diffModel || !diff) {\n                return null;\n            }\n            state.read(reader);\n            const renderSideBySide = this._options.renderSideBySide.read(reader);\n            const innerHunkAlignment = renderSideBySide;\n            return computeRangeAlignment(this._editors.original, this._editors.modified, diff.mappings, this._origViewZonesToIgnore, this._modViewZonesToIgnore, innerHunkAlignment);\n        });\n        const alignmentsSyncedMovedText = derived((reader) => {\n            /** @description alignmentsSyncedMovedText */\n            const syncedMovedText = this._diffModel.read(reader)?.movedTextToCompare.read(reader);\n            if (!syncedMovedText) {\n                return null;\n            }\n            state.read(reader);\n            const mappings = syncedMovedText.changes.map(c => new DiffMapping(c));\n            // TODO dont include alignments outside syncedMovedText\n            return computeRangeAlignment(this._editors.original, this._editors.modified, mappings, this._origViewZonesToIgnore, this._modViewZonesToIgnore, true);\n        });\n        function createFakeLinesDiv() {\n            const r = document.createElement('div');\n            r.className = 'diagonal-fill';\n            return r;\n        }\n        const alignmentViewZonesDisposables = this._register(new DisposableStore());\n        this.viewZones = derived(this, (reader) => {\n            alignmentViewZonesDisposables.clear();\n            const alignmentsVal = alignments.read(reader) || [];\n            const origViewZones = [];\n            const modViewZones = [];\n            const modifiedTopPaddingVal = this._modifiedTopPadding.read(reader);\n            if (modifiedTopPaddingVal > 0) {\n                modViewZones.push({\n                    afterLineNumber: 0,\n                    domNode: document.createElement('div'),\n                    heightInPx: modifiedTopPaddingVal,\n                    showInHiddenAreas: true,\n                    suppressMouseDown: true,\n                });\n            }\n            const originalTopPaddingVal = this._originalTopPadding.read(reader);\n            if (originalTopPaddingVal > 0) {\n                origViewZones.push({\n                    afterLineNumber: 0,\n                    domNode: document.createElement('div'),\n                    heightInPx: originalTopPaddingVal,\n                    showInHiddenAreas: true,\n                    suppressMouseDown: true,\n                });\n            }\n            const renderSideBySide = this._options.renderSideBySide.read(reader);\n            const deletedCodeLineBreaksComputer = !renderSideBySide ? this._editors.modified._getViewModel()?.createLineBreaksComputer() : undefined;\n            if (deletedCodeLineBreaksComputer) {\n                const originalModel = this._editors.original.getModel();\n                for (const a of alignmentsVal) {\n                    if (a.diff) {\n                        for (let i = a.originalRange.startLineNumber; i < a.originalRange.endLineNumberExclusive; i++) {\n                            // `i` can be out of bound when the diff has not been updated yet.\n                            // In this case, we do an early return.\n                            // TODO@hediet: Fix this by applying the edit directly to the diff model, so that the diff is always valid.\n                            if (i > originalModel.getLineCount()) {\n                                return { orig: origViewZones, mod: modViewZones };\n                            }\n                            deletedCodeLineBreaksComputer?.addRequest(originalModel.getLineContent(i), null, null);\n                        }\n                    }\n                }\n            }\n            const lineBreakData = deletedCodeLineBreaksComputer?.finalize() ?? [];\n            let lineBreakDataIdx = 0;\n            const modLineHeight = this._editors.modified.getOption(75 /* EditorOption.lineHeight */);\n            const syncedMovedText = this._diffModel.read(reader)?.movedTextToCompare.read(reader);\n            const mightContainNonBasicASCII = this._editors.original.getModel()?.mightContainNonBasicASCII() ?? false;\n            const mightContainRTL = this._editors.original.getModel()?.mightContainRTL() ?? false;\n            const renderOptions = RenderOptions.fromEditor(this._editors.modified);\n            for (const a of alignmentsVal) {\n                if (a.diff && !renderSideBySide && (!this._options.useTrueInlineDiffRendering.read(reader) || !allowsTrueInlineDiffRendering(a.diff))) {\n                    if (!a.originalRange.isEmpty) {\n                        originalModelTokenizationCompleted.read(reader); // Update view-zones once tokenization completes\n                        const deletedCodeDomNode = document.createElement('div');\n                        deletedCodeDomNode.classList.add('view-lines', 'line-delete', 'line-delete-selectable', 'monaco-mouse-cursor-text');\n                        const originalModel = this._editors.original.getModel();\n                        // `a.originalRange` can be out of bound when the diff has not been updated yet.\n                        // In this case, we do an early return.\n                        // TODO@hediet: Fix this by applying the edit directly to the diff model, so that the diff is always valid.\n                        if (a.originalRange.endLineNumberExclusive - 1 > originalModel.getLineCount()) {\n                            return { orig: origViewZones, mod: modViewZones };\n                        }\n                        const source = new LineSource(a.originalRange.mapToLineArray(l => originalModel.tokenization.getLineTokens(l)), a.originalRange.mapToLineArray(_ => lineBreakData[lineBreakDataIdx++]), mightContainNonBasicASCII, mightContainRTL);\n                        const decorations = [];\n                        for (const i of a.diff.innerChanges || []) {\n                            decorations.push(new InlineDecoration(i.originalRange.delta(-(a.diff.original.startLineNumber - 1)), diffDeleteDecoration.className, 0 /* InlineDecorationType.Regular */));\n                        }\n                        const result = renderLines(source, renderOptions, decorations, deletedCodeDomNode);\n                        const marginDomNode = document.createElement('div');\n                        marginDomNode.className = 'inline-deleted-margin-view-zone';\n                        applyFontInfo(marginDomNode, renderOptions.fontInfo);\n                        if (this._options.renderIndicators.read(reader)) {\n                            for (let i = 0; i < result.heightInLines; i++) {\n                                const marginElement = document.createElement('div');\n                                marginElement.className = `delete-sign ${ThemeIcon.asClassName(diffRemoveIcon)}`;\n                                marginElement.setAttribute('style', `position:absolute;top:${i * modLineHeight}px;width:${renderOptions.lineDecorationsWidth}px;height:${modLineHeight}px;right:0;`);\n                                marginDomNode.appendChild(marginElement);\n                            }\n                        }\n                        let zoneId = undefined;\n                        alignmentViewZonesDisposables.add(new InlineDiffDeletedCodeMargin(() => assertReturnsDefined(zoneId), marginDomNode, deletedCodeDomNode, this._editors.modified, a.diff, this._diffEditorWidget, result, this._editors.original.getModel(), this._contextMenuService, this._clipboardService));\n                        for (let i = 0; i < result.viewLineCounts.length; i++) {\n                            const count = result.viewLineCounts[i];\n                            // Account for wrapped lines in the (collapsed) original editor (which doesn't wrap lines).\n                            if (count > 1) {\n                                origViewZones.push({\n                                    afterLineNumber: a.originalRange.startLineNumber + i,\n                                    domNode: createFakeLinesDiv(),\n                                    heightInPx: (count - 1) * modLineHeight,\n                                    showInHiddenAreas: true,\n                                    suppressMouseDown: true,\n                                });\n                            }\n                        }\n                        modViewZones.push({\n                            afterLineNumber: a.modifiedRange.startLineNumber - 1,\n                            domNode: deletedCodeDomNode,\n                            heightInPx: result.heightInLines * modLineHeight,\n                            minWidthInPx: result.minWidthInPx,\n                            marginDomNode,\n                            setZoneId(id) { zoneId = id; },\n                            showInHiddenAreas: true,\n                            suppressMouseDown: false,\n                        });\n                    }\n                    const marginDomNode = document.createElement('div');\n                    marginDomNode.className = 'gutter-delete';\n                    origViewZones.push({\n                        afterLineNumber: a.originalRange.endLineNumberExclusive - 1,\n                        domNode: createFakeLinesDiv(),\n                        heightInPx: a.modifiedHeightInPx,\n                        marginDomNode,\n                        showInHiddenAreas: true,\n                        suppressMouseDown: true,\n                    });\n                }\n                else {\n                    const delta = a.modifiedHeightInPx - a.originalHeightInPx;\n                    if (delta > 0) {\n                        if (syncedMovedText?.lineRangeMapping.original.delta(-1).deltaLength(2).contains(a.originalRange.endLineNumberExclusive - 1)) {\n                            continue;\n                        }\n                        origViewZones.push({\n                            afterLineNumber: a.originalRange.endLineNumberExclusive - 1,\n                            domNode: createFakeLinesDiv(),\n                            heightInPx: delta,\n                            showInHiddenAreas: true,\n                            suppressMouseDown: true,\n                        });\n                    }\n                    else {\n                        if (syncedMovedText?.lineRangeMapping.modified.delta(-1).deltaLength(2).contains(a.modifiedRange.endLineNumberExclusive - 1)) {\n                            continue;\n                        }\n                        function createViewZoneMarginArrow() {\n                            const arrow = document.createElement('div');\n                            arrow.className = 'arrow-revert-change ' + ThemeIcon.asClassName(Codicon.arrowRight);\n                            reader.store.add(addDisposableListener(arrow, 'mousedown', e => e.stopPropagation()));\n                            reader.store.add(addDisposableListener(arrow, 'click', e => {\n                                e.stopPropagation();\n                                _diffEditorWidget.revert(a.diff);\n                            }));\n                            return $('div', {}, arrow);\n                        }\n                        let marginDomNode = undefined;\n                        if (a.diff && a.diff.modified.isEmpty && this._options.shouldRenderOldRevertArrows.read(reader)) {\n                            marginDomNode = createViewZoneMarginArrow();\n                        }\n                        modViewZones.push({\n                            afterLineNumber: a.modifiedRange.endLineNumberExclusive - 1,\n                            domNode: createFakeLinesDiv(),\n                            heightInPx: -delta,\n                            marginDomNode,\n                            showInHiddenAreas: true,\n                            suppressMouseDown: true,\n                        });\n                    }\n                }\n            }\n            for (const a of alignmentsSyncedMovedText.read(reader) ?? []) {\n                if (!syncedMovedText?.lineRangeMapping.original.intersect(a.originalRange)\n                    || !syncedMovedText?.lineRangeMapping.modified.intersect(a.modifiedRange)) {\n                    // ignore unrelated alignments outside the synced moved text\n                    continue;\n                }\n                const delta = a.modifiedHeightInPx - a.originalHeightInPx;\n                if (delta > 0) {\n                    origViewZones.push({\n                        afterLineNumber: a.originalRange.endLineNumberExclusive - 1,\n                        domNode: createFakeLinesDiv(),\n                        heightInPx: delta,\n                        showInHiddenAreas: true,\n                        suppressMouseDown: true,\n                    });\n                }\n                else {\n                    modViewZones.push({\n                        afterLineNumber: a.modifiedRange.endLineNumberExclusive - 1,\n                        domNode: createFakeLinesDiv(),\n                        heightInPx: -delta,\n                        showInHiddenAreas: true,\n                        suppressMouseDown: true,\n                    });\n                }\n            }\n            return { orig: origViewZones, mod: modViewZones };\n        });\n        let ignoreChange = false;\n        this._register(this._editors.original.onDidScrollChange(e => {\n            if (e.scrollLeftChanged && !ignoreChange) {\n                ignoreChange = true;\n                this._editors.modified.setScrollLeft(e.scrollLeft);\n                ignoreChange = false;\n            }\n        }));\n        this._register(this._editors.modified.onDidScrollChange(e => {\n            if (e.scrollLeftChanged && !ignoreChange) {\n                ignoreChange = true;\n                this._editors.original.setScrollLeft(e.scrollLeft);\n                ignoreChange = false;\n            }\n        }));\n        this._originalScrollTop = observableFromEvent(this._editors.original.onDidScrollChange, () => /** @description original.getScrollTop */ this._editors.original.getScrollTop());\n        this._modifiedScrollTop = observableFromEvent(this._editors.modified.onDidScrollChange, () => /** @description modified.getScrollTop */ this._editors.modified.getScrollTop());\n        // origExtraHeight + origOffset - origScrollTop = modExtraHeight + modOffset - modScrollTop\n        // origScrollTop = origExtraHeight + origOffset - modExtraHeight - modOffset + modScrollTop\n        // modScrollTop = modExtraHeight + modOffset - origExtraHeight - origOffset + origScrollTop\n        // origOffset - modOffset = heightOfLines(1..Y) - heightOfLines(1..X)\n        // origScrollTop >= 0, modScrollTop >= 0\n        this._register(autorun(reader => {\n            /** @description update scroll modified */\n            const newScrollTopModified = this._originalScrollTop.read(reader)\n                - (this._originalScrollOffsetAnimated.read(undefined) - this._modifiedScrollOffsetAnimated.read(reader))\n                - (this._originalTopPadding.read(undefined) - this._modifiedTopPadding.read(reader));\n            if (newScrollTopModified !== this._editors.modified.getScrollTop()) {\n                this._editors.modified.setScrollTop(newScrollTopModified, 1 /* ScrollType.Immediate */);\n            }\n        }));\n        this._register(autorun(reader => {\n            /** @description update scroll original */\n            const newScrollTopOriginal = this._modifiedScrollTop.read(reader)\n                - (this._modifiedScrollOffsetAnimated.read(undefined) - this._originalScrollOffsetAnimated.read(reader))\n                - (this._modifiedTopPadding.read(undefined) - this._originalTopPadding.read(reader));\n            if (newScrollTopOriginal !== this._editors.original.getScrollTop()) {\n                this._editors.original.setScrollTop(newScrollTopOriginal, 1 /* ScrollType.Immediate */);\n            }\n        }));\n        this._register(autorun(reader => {\n            /** @description update editor top offsets */\n            const m = this._diffModel.read(reader)?.movedTextToCompare.read(reader);\n            let deltaOrigToMod = 0;\n            if (m) {\n                const trueTopOriginal = this._editors.original.getTopForLineNumber(m.lineRangeMapping.original.startLineNumber, true) - this._originalTopPadding.read(undefined);\n                const trueTopModified = this._editors.modified.getTopForLineNumber(m.lineRangeMapping.modified.startLineNumber, true) - this._modifiedTopPadding.read(undefined);\n                deltaOrigToMod = trueTopModified - trueTopOriginal;\n            }\n            if (deltaOrigToMod > 0) {\n                this._modifiedTopPadding.set(0, undefined);\n                this._originalTopPadding.set(deltaOrigToMod, undefined);\n            }\n            else if (deltaOrigToMod < 0) {\n                this._modifiedTopPadding.set(-deltaOrigToMod, undefined);\n                this._originalTopPadding.set(0, undefined);\n            }\n            else {\n                setTimeout(() => {\n                    this._modifiedTopPadding.set(0, undefined);\n                    this._originalTopPadding.set(0, undefined);\n                }, 400);\n            }\n            if (this._editors.modified.hasTextFocus()) {\n                this._originalScrollOffset.set(this._modifiedScrollOffset.read(undefined) - deltaOrigToMod, undefined, true);\n            }\n            else {\n                this._modifiedScrollOffset.set(this._originalScrollOffset.read(undefined) + deltaOrigToMod, undefined, true);\n            }\n        }));\n    }\n};\nDiffEditorViewZones = __decorate([\n    __param(8, IClipboardService),\n    __param(9, IContextMenuService)\n], DiffEditorViewZones);\nfunction computeRangeAlignment(originalEditor, modifiedEditor, diffs, originalEditorAlignmentViewZones, modifiedEditorAlignmentViewZones, innerHunkAlignment) {\n    const originalLineHeightOverrides = new ArrayQueue(getAdditionalLineHeights(originalEditor, originalEditorAlignmentViewZones));\n    const modifiedLineHeightOverrides = new ArrayQueue(getAdditionalLineHeights(modifiedEditor, modifiedEditorAlignmentViewZones));\n    const origLineHeight = originalEditor.getOption(75 /* EditorOption.lineHeight */);\n    const modLineHeight = modifiedEditor.getOption(75 /* EditorOption.lineHeight */);\n    const result = [];\n    let lastOriginalLineNumber = 0;\n    let lastModifiedLineNumber = 0;\n    function handleAlignmentsOutsideOfDiffs(untilOriginalLineNumberExclusive, untilModifiedLineNumberExclusive) {\n        while (true) {\n            let origNext = originalLineHeightOverrides.peek();\n            let modNext = modifiedLineHeightOverrides.peek();\n            if (origNext && origNext.lineNumber >= untilOriginalLineNumberExclusive) {\n                origNext = undefined;\n            }\n            if (modNext && modNext.lineNumber >= untilModifiedLineNumberExclusive) {\n                modNext = undefined;\n            }\n            if (!origNext && !modNext) {\n                break;\n            }\n            const distOrig = origNext ? origNext.lineNumber - lastOriginalLineNumber : Number.MAX_VALUE;\n            const distNext = modNext ? modNext.lineNumber - lastModifiedLineNumber : Number.MAX_VALUE;\n            if (distOrig < distNext) {\n                originalLineHeightOverrides.dequeue();\n                modNext = {\n                    lineNumber: origNext.lineNumber - lastOriginalLineNumber + lastModifiedLineNumber,\n                    heightInPx: 0,\n                };\n            }\n            else if (distOrig > distNext) {\n                modifiedLineHeightOverrides.dequeue();\n                origNext = {\n                    lineNumber: modNext.lineNumber - lastModifiedLineNumber + lastOriginalLineNumber,\n                    heightInPx: 0,\n                };\n            }\n            else {\n                originalLineHeightOverrides.dequeue();\n                modifiedLineHeightOverrides.dequeue();\n            }\n            result.push({\n                originalRange: LineRange.ofLength(origNext.lineNumber, 1),\n                modifiedRange: LineRange.ofLength(modNext.lineNumber, 1),\n                originalHeightInPx: origLineHeight + origNext.heightInPx,\n                modifiedHeightInPx: modLineHeight + modNext.heightInPx,\n                diff: undefined,\n            });\n        }\n    }\n    for (const m of diffs) {\n        const c = m.lineRangeMapping;\n        handleAlignmentsOutsideOfDiffs(c.original.startLineNumber, c.modified.startLineNumber);\n        let first = true;\n        let lastModLineNumber = c.modified.startLineNumber;\n        let lastOrigLineNumber = c.original.startLineNumber;\n        function emitAlignment(origLineNumberExclusive, modLineNumberExclusive, forceAlignment = false) {\n            if (origLineNumberExclusive < lastOrigLineNumber || modLineNumberExclusive < lastModLineNumber) {\n                return;\n            }\n            if (first) {\n                first = false;\n            }\n            else if (!forceAlignment && (origLineNumberExclusive === lastOrigLineNumber || modLineNumberExclusive === lastModLineNumber)) {\n                // This causes a re-alignment of an already aligned line.\n                // However, we don't care for the final alignment.\n                return;\n            }\n            const originalRange = new LineRange(lastOrigLineNumber, origLineNumberExclusive);\n            const modifiedRange = new LineRange(lastModLineNumber, modLineNumberExclusive);\n            if (originalRange.isEmpty && modifiedRange.isEmpty) {\n                return;\n            }\n            const originalAdditionalHeight = originalLineHeightOverrides\n                .takeWhile(v => v.lineNumber < origLineNumberExclusive)\n                ?.reduce((p, c) => p + c.heightInPx, 0) ?? 0;\n            const modifiedAdditionalHeight = modifiedLineHeightOverrides\n                .takeWhile(v => v.lineNumber < modLineNumberExclusive)\n                ?.reduce((p, c) => p + c.heightInPx, 0) ?? 0;\n            result.push({\n                originalRange,\n                modifiedRange,\n                originalHeightInPx: originalRange.length * origLineHeight + originalAdditionalHeight,\n                modifiedHeightInPx: modifiedRange.length * modLineHeight + modifiedAdditionalHeight,\n                diff: m.lineRangeMapping,\n            });\n            lastOrigLineNumber = origLineNumberExclusive;\n            lastModLineNumber = modLineNumberExclusive;\n        }\n        if (innerHunkAlignment) {\n            for (const i of c.innerChanges || []) {\n                if (i.originalRange.startColumn > 1 && i.modifiedRange.startColumn > 1) {\n                    // There is some unmodified text on this line before the diff\n                    emitAlignment(i.originalRange.startLineNumber, i.modifiedRange.startLineNumber);\n                }\n                const originalModel = originalEditor.getModel();\n                // When the diff is invalid, the ranges might be out of bounds (this should be fixed in the diff model by applying edits directly).\n                const maxColumn = i.originalRange.endLineNumber <= originalModel.getLineCount() ? originalModel.getLineMaxColumn(i.originalRange.endLineNumber) : Number.MAX_SAFE_INTEGER;\n                if (i.originalRange.endColumn < maxColumn) {\n                    // // There is some unmodified text on this line after the diff\n                    emitAlignment(i.originalRange.endLineNumber, i.modifiedRange.endLineNumber);\n                }\n            }\n        }\n        emitAlignment(c.original.endLineNumberExclusive, c.modified.endLineNumberExclusive, true);\n        lastOriginalLineNumber = c.original.endLineNumberExclusive;\n        lastModifiedLineNumber = c.modified.endLineNumberExclusive;\n    }\n    handleAlignmentsOutsideOfDiffs(Number.MAX_VALUE, Number.MAX_VALUE);\n    return result;\n}\nfunction getAdditionalLineHeights(editor, viewZonesToIgnore) {\n    const viewZoneHeights = [];\n    const wrappingZoneHeights = [];\n    const hasWrapping = editor.getOption(166 /* EditorOption.wrappingInfo */).wrappingColumn !== -1;\n    const coordinatesConverter = editor._getViewModel().coordinatesConverter;\n    const editorLineHeight = editor.getOption(75 /* EditorOption.lineHeight */);\n    if (hasWrapping) {\n        for (let i = 1; i <= editor.getModel().getLineCount(); i++) {\n            const lineCount = coordinatesConverter.getModelLineViewLineCount(i);\n            if (lineCount > 1) {\n                wrappingZoneHeights.push({ lineNumber: i, heightInPx: editorLineHeight * (lineCount - 1) });\n            }\n        }\n    }\n    for (const w of editor.getWhitespaces()) {\n        if (viewZonesToIgnore.has(w.id)) {\n            continue;\n        }\n        const modelLineNumber = w.afterLineNumber === 0 ? 0 : coordinatesConverter.convertViewPositionToModelPosition(new Position(w.afterLineNumber, 1)).lineNumber;\n        viewZoneHeights.push({ lineNumber: modelLineNumber, heightInPx: w.height });\n    }\n    const result = joinCombine(viewZoneHeights, wrappingZoneHeights, v => v.lineNumber, (v1, v2) => ({ lineNumber: v1.lineNumber, heightInPx: v1.heightInPx + v2.heightInPx }));\n    return result;\n}\nfunction allowsTrueInlineDiffRendering(mapping) {\n    if (!mapping.innerChanges) {\n        return false;\n    }\n    return mapping.innerChanges.every(c => (rangeIsSingleLine(c.modifiedRange) && rangeIsSingleLine(c.originalRange))\n        || c.originalRange.equalsRange(new Range(1, 1, 1, 1)));\n}\nfunction rangeIsSingleLine(range) {\n    return range.startLineNumber === range.endLineNumber;\n}\n\nexport { DiffEditorViewZones, allowsTrueInlineDiffRendering, rangeIsSingleLine };\n","import { h } from '../../../../../base/browser/dom.js';\nimport { ActionBar } from '../../../../../base/browser/ui/actionbar/actionbar.js';\nimport { Action } from '../../../../../base/common/actions.js';\nimport { tieBreakComparators, compareBy, numberComparator, booleanComparator } from '../../../../../base/common/arrays.js';\nimport { findMaxIdx } from '../../../../../base/common/arraysFind.js';\nimport { Codicon } from '../../../../../base/common/codicons.js';\nimport { Disposable, toDisposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { ThemeIcon } from '../../../../../base/common/themables.js';\nimport { PlaceholderViewZone, applyViewZones, ViewZoneOverlayWidget, applyStyle } from '../utils.js';\nimport { OffsetRange, OffsetRangeSet } from '../../../../common/core/ranges/offsetRange.js';\nimport { localize } from '../../../../../nls.js';\nimport { recomputeInitiallyAndOnChange } from '../../../../../base/common/observableInternal/utils/utils.js';\nimport { observableFromEvent } from '../../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { observableSignalFromEvent } from '../../../../../base/common/observableInternal/observables/observableSignalFromEvent.js';\nimport { observableValue } from '../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { derived } from '../../../../../base/common/observableInternal/observables/derived.js';\nimport { autorun, autorunWithStore, autorunHandleChanges } from '../../../../../base/common/observableInternal/reactions/autorun.js';\nimport { constObservable } from '../../../../../base/common/observableInternal/observables/constObservable.js';\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 *--------------------------------------------------------------------------------------------*/\nclass MovedBlocksLinesFeature extends Disposable {\n    static { this.movedCodeBlockPadding = 4; }\n    constructor(_rootElement, _diffModel, _originalEditorLayoutInfo, _modifiedEditorLayoutInfo, _editors) {\n        super();\n        this._rootElement = _rootElement;\n        this._diffModel = _diffModel;\n        this._originalEditorLayoutInfo = _originalEditorLayoutInfo;\n        this._modifiedEditorLayoutInfo = _modifiedEditorLayoutInfo;\n        this._editors = _editors;\n        this._originalScrollTop = observableFromEvent(this, this._editors.original.onDidScrollChange, () => this._editors.original.getScrollTop());\n        this._modifiedScrollTop = observableFromEvent(this, this._editors.modified.onDidScrollChange, () => this._editors.modified.getScrollTop());\n        this._viewZonesChanged = observableSignalFromEvent('onDidChangeViewZones', this._editors.modified.onDidChangeViewZones);\n        this.width = observableValue(this, 0);\n        this._modifiedViewZonesChangedSignal = observableSignalFromEvent('modified.onDidChangeViewZones', this._editors.modified.onDidChangeViewZones);\n        this._originalViewZonesChangedSignal = observableSignalFromEvent('original.onDidChangeViewZones', this._editors.original.onDidChangeViewZones);\n        this._state = derived(this, (reader) => {\n            /** @description state */\n            this._element.replaceChildren();\n            const model = this._diffModel.read(reader);\n            const moves = model?.diff.read(reader)?.movedTexts;\n            if (!moves || moves.length === 0) {\n                this.width.set(0, undefined);\n                return;\n            }\n            this._viewZonesChanged.read(reader);\n            const infoOrig = this._originalEditorLayoutInfo.read(reader);\n            const infoMod = this._modifiedEditorLayoutInfo.read(reader);\n            if (!infoOrig || !infoMod) {\n                this.width.set(0, undefined);\n                return;\n            }\n            this._modifiedViewZonesChangedSignal.read(reader);\n            this._originalViewZonesChangedSignal.read(reader);\n            const lines = moves.map((move) => {\n                function computeLineStart(range, editor) {\n                    const t1 = editor.getTopForLineNumber(range.startLineNumber, true);\n                    const t2 = editor.getTopForLineNumber(range.endLineNumberExclusive, true);\n                    return (t1 + t2) / 2;\n                }\n                const start = computeLineStart(move.lineRangeMapping.original, this._editors.original);\n                const startOffset = this._originalScrollTop.read(reader);\n                const end = computeLineStart(move.lineRangeMapping.modified, this._editors.modified);\n                const endOffset = this._modifiedScrollTop.read(reader);\n                const from = start - startOffset;\n                const to = end - endOffset;\n                const top = Math.min(start, end);\n                const bottom = Math.max(start, end);\n                return { range: new OffsetRange(top, bottom), from, to, fromWithoutScroll: start, toWithoutScroll: end, move };\n            });\n            lines.sort(tieBreakComparators(compareBy(l => l.fromWithoutScroll > l.toWithoutScroll, booleanComparator), compareBy(l => l.fromWithoutScroll > l.toWithoutScroll ? l.fromWithoutScroll : -l.toWithoutScroll, numberComparator)));\n            const layout = LinesLayout.compute(lines.map(l => l.range));\n            const padding = 10;\n            const lineAreaLeft = infoOrig.verticalScrollbarWidth;\n            const lineAreaWidth = (layout.getTrackCount() - 1) * 10 + padding * 2;\n            const width = lineAreaLeft + lineAreaWidth + (infoMod.contentLeft - MovedBlocksLinesFeature.movedCodeBlockPadding);\n            let idx = 0;\n            for (const line of lines) {\n                const track = layout.getTrack(idx);\n                const verticalY = lineAreaLeft + padding + track * 10;\n                const arrowHeight = 15;\n                const arrowWidth = 15;\n                const right = width;\n                const rectWidth = infoMod.glyphMarginWidth + infoMod.lineNumbersWidth;\n                const rectHeight = 18;\n                const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n                rect.classList.add('arrow-rectangle');\n                rect.setAttribute('x', `${right - rectWidth}`);\n                rect.setAttribute('y', `${line.to - rectHeight / 2}`);\n                rect.setAttribute('width', `${rectWidth}`);\n                rect.setAttribute('height', `${rectHeight}`);\n                this._element.appendChild(rect);\n                const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n                const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n                path.setAttribute('d', `M ${0} ${line.from} L ${verticalY} ${line.from} L ${verticalY} ${line.to} L ${right - arrowWidth} ${line.to}`);\n                path.setAttribute('fill', 'none');\n                g.appendChild(path);\n                const arrowRight = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');\n                arrowRight.classList.add('arrow');\n                reader.store.add(autorun(reader => {\n                    path.classList.toggle('currentMove', line.move === model.activeMovedText.read(reader));\n                    arrowRight.classList.toggle('currentMove', line.move === model.activeMovedText.read(reader));\n                }));\n                arrowRight.setAttribute('points', `${right - arrowWidth},${line.to - arrowHeight / 2} ${right},${line.to} ${right - arrowWidth},${line.to + arrowHeight / 2}`);\n                g.appendChild(arrowRight);\n                this._element.appendChild(g);\n                /*\n                TODO@hediet\n                path.addEventListener('mouseenter', () => {\n                    model.setHoveredMovedText(line.move);\n                });\n                path.addEventListener('mouseleave', () => {\n                    model.setHoveredMovedText(undefined);\n                });*/\n                idx++;\n            }\n            this.width.set(lineAreaWidth, undefined);\n        });\n        this._element = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n        this._element.setAttribute('class', 'moved-blocks-lines');\n        this._rootElement.appendChild(this._element);\n        this._register(toDisposable(() => this._element.remove()));\n        this._register(autorun(reader => {\n            /** @description update moved blocks lines positioning */\n            const info = this._originalEditorLayoutInfo.read(reader);\n            const info2 = this._modifiedEditorLayoutInfo.read(reader);\n            if (!info || !info2) {\n                return;\n            }\n            this._element.style.left = `${info.width - info.verticalScrollbarWidth}px`;\n            this._element.style.height = `${info.height}px`;\n            this._element.style.width = `${info.verticalScrollbarWidth + info.contentLeft - MovedBlocksLinesFeature.movedCodeBlockPadding + this.width.read(reader)}px`;\n        }));\n        this._register(recomputeInitiallyAndOnChange(this._state));\n        const movedBlockViewZones = derived(reader => {\n            const model = this._diffModel.read(reader);\n            const d = model?.diff.read(reader);\n            if (!d) {\n                return [];\n            }\n            return d.movedTexts.map(move => ({\n                move,\n                original: new PlaceholderViewZone(constObservable(move.lineRangeMapping.original.startLineNumber - 1), 18),\n                modified: new PlaceholderViewZone(constObservable(move.lineRangeMapping.modified.startLineNumber - 1), 18),\n            }));\n        });\n        this._register(applyViewZones(this._editors.original, movedBlockViewZones.map(zones => /** @description movedBlockViewZones.original */ zones.map(z => z.original))));\n        this._register(applyViewZones(this._editors.modified, movedBlockViewZones.map(zones => /** @description movedBlockViewZones.modified */ zones.map(z => z.modified))));\n        this._register(autorunWithStore((reader, store) => {\n            const blocks = movedBlockViewZones.read(reader);\n            for (const b of blocks) {\n                store.add(new MovedBlockOverlayWidget(this._editors.original, b.original, b.move, 'original', this._diffModel.get()));\n                store.add(new MovedBlockOverlayWidget(this._editors.modified, b.modified, b.move, 'modified', this._diffModel.get()));\n            }\n        }));\n        const originalHasFocus = observableSignalFromEvent('original.onDidFocusEditorWidget', e => this._editors.original.onDidFocusEditorWidget(() => setTimeout(() => e(undefined), 0)));\n        const modifiedHasFocus = observableSignalFromEvent('modified.onDidFocusEditorWidget', e => this._editors.modified.onDidFocusEditorWidget(() => setTimeout(() => e(undefined), 0)));\n        let lastChangedEditor = 'modified';\n        this._register(autorunHandleChanges({\n            changeTracker: {\n                createChangeSummary: () => undefined,\n                handleChange: (ctx, summary) => {\n                    if (ctx.didChange(originalHasFocus)) {\n                        lastChangedEditor = 'original';\n                    }\n                    if (ctx.didChange(modifiedHasFocus)) {\n                        lastChangedEditor = 'modified';\n                    }\n                    return true;\n                }\n            }\n        }, reader => {\n            /** @description MovedBlocksLines.setActiveMovedTextFromCursor */\n            originalHasFocus.read(reader);\n            modifiedHasFocus.read(reader);\n            const m = this._diffModel.read(reader);\n            if (!m) {\n                return;\n            }\n            const diff = m.diff.read(reader);\n            let movedText = undefined;\n            if (diff && lastChangedEditor === 'original') {\n                const originalPos = this._editors.originalCursor.read(reader);\n                if (originalPos) {\n                    movedText = diff.movedTexts.find(m => m.lineRangeMapping.original.contains(originalPos.lineNumber));\n                }\n            }\n            if (diff && lastChangedEditor === 'modified') {\n                const modifiedPos = this._editors.modifiedCursor.read(reader);\n                if (modifiedPos) {\n                    movedText = diff.movedTexts.find(m => m.lineRangeMapping.modified.contains(modifiedPos.lineNumber));\n                }\n            }\n            if (movedText !== m.movedTextToCompare.read(undefined)) {\n                m.movedTextToCompare.set(undefined, undefined);\n            }\n            m.setActiveMovedText(movedText);\n        }));\n    }\n}\nclass LinesLayout {\n    static compute(lines) {\n        const setsPerTrack = [];\n        const trackPerLineIdx = [];\n        for (const line of lines) {\n            let trackIdx = setsPerTrack.findIndex(set => !set.intersectsStrict(line));\n            if (trackIdx === -1) {\n                const maxTrackCount = 6;\n                if (setsPerTrack.length >= maxTrackCount) {\n                    trackIdx = findMaxIdx(setsPerTrack, compareBy(set => set.intersectWithRangeLength(line), numberComparator));\n                }\n                else {\n                    trackIdx = setsPerTrack.length;\n                    setsPerTrack.push(new OffsetRangeSet());\n                }\n            }\n            setsPerTrack[trackIdx].addRange(line);\n            trackPerLineIdx.push(trackIdx);\n        }\n        return new LinesLayout(setsPerTrack.length, trackPerLineIdx);\n    }\n    constructor(_trackCount, trackPerLineIdx) {\n        this._trackCount = _trackCount;\n        this.trackPerLineIdx = trackPerLineIdx;\n    }\n    getTrack(lineIdx) {\n        return this.trackPerLineIdx[lineIdx];\n    }\n    getTrackCount() {\n        return this._trackCount;\n    }\n}\nclass MovedBlockOverlayWidget extends ViewZoneOverlayWidget {\n    constructor(_editor, _viewZone, _move, _kind, _diffModel) {\n        const root = h('div.diff-hidden-lines-widget');\n        super(_editor, _viewZone, root.root);\n        this._editor = _editor;\n        this._move = _move;\n        this._kind = _kind;\n        this._diffModel = _diffModel;\n        this._nodes = h('div.diff-moved-code-block', { style: { marginRight: '4px' } }, [\n            h('div.text-content@textContent'),\n            h('div.action-bar@actionBar'),\n        ]);\n        root.root.appendChild(this._nodes.root);\n        const editorLayout = observableFromEvent(this._editor.onDidLayoutChange, () => this._editor.getLayoutInfo());\n        this._register(applyStyle(this._nodes.root, {\n            paddingRight: editorLayout.map(l => l.verticalScrollbarWidth)\n        }));\n        let text;\n        if (_move.changes.length > 0) {\n            text = this._kind === 'original' ? localize(131, 'Code moved with changes to line {0}-{1}', this._move.lineRangeMapping.modified.startLineNumber, this._move.lineRangeMapping.modified.endLineNumberExclusive - 1) : localize(132, 'Code moved with changes from line {0}-{1}', this._move.lineRangeMapping.original.startLineNumber, this._move.lineRangeMapping.original.endLineNumberExclusive - 1);\n        }\n        else {\n            text = this._kind === 'original' ? localize(133, 'Code moved to line {0}-{1}', this._move.lineRangeMapping.modified.startLineNumber, this._move.lineRangeMapping.modified.endLineNumberExclusive - 1) : localize(134, 'Code moved from line {0}-{1}', this._move.lineRangeMapping.original.startLineNumber, this._move.lineRangeMapping.original.endLineNumberExclusive - 1);\n        }\n        const actionBar = this._register(new ActionBar(this._nodes.actionBar, {\n            highlightToggledItems: true,\n        }));\n        const caption = new Action('', text, '', false);\n        actionBar.push(caption, { icon: false, label: true });\n        const actionCompare = new Action('', 'Compare', ThemeIcon.asClassName(Codicon.compareChanges), true, () => {\n            this._editor.focus();\n            this._diffModel.movedTextToCompare.set(this._diffModel.movedTextToCompare.get() === _move ? undefined : this._move, undefined);\n        });\n        this._register(autorun(reader => {\n            const isActive = this._diffModel.movedTextToCompare.read(reader) === _move;\n            actionCompare.checked = isActive;\n        }));\n        actionBar.push(actionCompare, { icon: false, label: true });\n    }\n}\n\nexport { MovedBlocksLinesFeature };\n","import { Disposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { allowsTrueInlineDiffRendering } from './diffEditorViewZones/diffEditorViewZones.js';\nimport { MovedBlocksLinesFeature } from '../features/movedBlocksLinesFeature.js';\nimport { diffLineDeleteDecorationBackgroundWithIndicator, diffLineDeleteDecorationBackground, diffLineAddDecorationBackgroundWithIndicator, diffLineAddDecorationBackground, diffWholeLineDeleteDecoration, diffWholeLineAddDecoration, diffDeleteDecorationEmpty, diffDeleteDecoration, diffAddDecorationEmpty, diffAddDecoration } from '../registrations.contribution.js';\nimport { applyObservableDecorations } from '../utils.js';\nimport { derived } from '../../../../../base/common/observableInternal/observables/derived.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DiffEditorDecorations extends Disposable {\n    constructor(_editors, _diffModel, _options, widget) {\n        super();\n        this._editors = _editors;\n        this._diffModel = _diffModel;\n        this._options = _options;\n        this._decorations = derived(this, (reader) => {\n            const diffModel = this._diffModel.read(reader);\n            const diff = diffModel?.diff.read(reader);\n            if (!diff) {\n                return null;\n            }\n            const movedTextToCompare = this._diffModel.read(reader).movedTextToCompare.read(reader);\n            const renderIndicators = this._options.renderIndicators.read(reader);\n            const showEmptyDecorations = this._options.showEmptyDecorations.read(reader);\n            const originalDecorations = [];\n            const modifiedDecorations = [];\n            if (!movedTextToCompare) {\n                for (const m of diff.mappings) {\n                    if (!m.lineRangeMapping.original.isEmpty) {\n                        originalDecorations.push({ range: m.lineRangeMapping.original.toInclusiveRange(), options: renderIndicators ? diffLineDeleteDecorationBackgroundWithIndicator : diffLineDeleteDecorationBackground });\n                    }\n                    if (!m.lineRangeMapping.modified.isEmpty) {\n                        modifiedDecorations.push({ range: m.lineRangeMapping.modified.toInclusiveRange(), options: renderIndicators ? diffLineAddDecorationBackgroundWithIndicator : diffLineAddDecorationBackground });\n                    }\n                    if (m.lineRangeMapping.modified.isEmpty || m.lineRangeMapping.original.isEmpty) {\n                        if (!m.lineRangeMapping.original.isEmpty) {\n                            originalDecorations.push({ range: m.lineRangeMapping.original.toInclusiveRange(), options: diffWholeLineDeleteDecoration });\n                        }\n                        if (!m.lineRangeMapping.modified.isEmpty) {\n                            modifiedDecorations.push({ range: m.lineRangeMapping.modified.toInclusiveRange(), options: diffWholeLineAddDecoration });\n                        }\n                    }\n                    else {\n                        const useInlineDiff = this._options.useTrueInlineDiffRendering.read(reader) && allowsTrueInlineDiffRendering(m.lineRangeMapping);\n                        for (const i of m.lineRangeMapping.innerChanges || []) {\n                            // Don't show empty markers outside the line range\n                            if (m.lineRangeMapping.original.contains(i.originalRange.startLineNumber)) {\n                                originalDecorations.push({ range: i.originalRange, options: (i.originalRange.isEmpty() && showEmptyDecorations) ? diffDeleteDecorationEmpty : diffDeleteDecoration });\n                            }\n                            if (m.lineRangeMapping.modified.contains(i.modifiedRange.startLineNumber)) {\n                                modifiedDecorations.push({ range: i.modifiedRange, options: (i.modifiedRange.isEmpty() && showEmptyDecorations && !useInlineDiff) ? diffAddDecorationEmpty : diffAddDecoration });\n                            }\n                            if (useInlineDiff) {\n                                const deletedText = diffModel.model.original.getValueInRange(i.originalRange);\n                                modifiedDecorations.push({\n                                    range: i.modifiedRange,\n                                    options: {\n                                        description: 'deleted-text',\n                                        before: {\n                                            content: deletedText,\n                                            inlineClassName: 'inline-deleted-text',\n                                        },\n                                        zIndex: 100000,\n                                        showIfCollapsed: true,\n                                    }\n                                });\n                            }\n                        }\n                    }\n                }\n            }\n            if (movedTextToCompare) {\n                for (const m of movedTextToCompare.changes) {\n                    const fullRangeOriginal = m.original.toInclusiveRange();\n                    if (fullRangeOriginal) {\n                        originalDecorations.push({ range: fullRangeOriginal, options: renderIndicators ? diffLineDeleteDecorationBackgroundWithIndicator : diffLineDeleteDecorationBackground });\n                    }\n                    const fullRangeModified = m.modified.toInclusiveRange();\n                    if (fullRangeModified) {\n                        modifiedDecorations.push({ range: fullRangeModified, options: renderIndicators ? diffLineAddDecorationBackgroundWithIndicator : diffLineAddDecorationBackground });\n                    }\n                    for (const i of m.innerChanges || []) {\n                        originalDecorations.push({ range: i.originalRange, options: diffDeleteDecoration });\n                        modifiedDecorations.push({ range: i.modifiedRange, options: diffAddDecoration });\n                    }\n                }\n            }\n            const activeMovedText = this._diffModel.read(reader).activeMovedText.read(reader);\n            for (const m of diff.movedTexts) {\n                originalDecorations.push({\n                    range: m.lineRangeMapping.original.toInclusiveRange(), options: {\n                        description: 'moved',\n                        blockClassName: 'movedOriginal' + (m === activeMovedText ? ' currentMove' : ''),\n                        blockPadding: [MovedBlocksLinesFeature.movedCodeBlockPadding, 0, MovedBlocksLinesFeature.movedCodeBlockPadding, MovedBlocksLinesFeature.movedCodeBlockPadding],\n                    }\n                });\n                modifiedDecorations.push({\n                    range: m.lineRangeMapping.modified.toInclusiveRange(), options: {\n                        description: 'moved',\n                        blockClassName: 'movedModified' + (m === activeMovedText ? ' currentMove' : ''),\n                        blockPadding: [4, 0, 4, 4],\n                    }\n                });\n            }\n            return { originalDecorations, modifiedDecorations };\n        });\n        this._register(applyObservableDecorations(this._editors.original, this._decorations.map(d => d?.originalDecorations || [])));\n        this._register(applyObservableDecorations(this._editors.modified, this._decorations.map(d => d?.modifiedDecorations || [])));\n    }\n}\n\nexport { DiffEditorDecorations };\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 *--------------------------------------------------------------------------------------------*/\nclass Point {\n    static equals(a, b) {\n        return a.x === b.x && a.y === b.y;\n    }\n    constructor(x, y) {\n        this.x = x;\n        this.y = y;\n    }\n    add(other) {\n        return new Point(this.x + other.x, this.y + other.y);\n    }\n    deltaX(delta) {\n        return new Point(this.x + delta, this.y);\n    }\n    deltaY(delta) {\n        return new Point(this.x, this.y + delta);\n    }\n    toString() {\n        return `(${this.x},${this.y})`;\n    }\n    subtract(other) {\n        return new Point(this.x - other.x, this.y - other.y);\n    }\n    scale(factor) {\n        return new Point(this.x * factor, this.y * factor);\n    }\n    mapComponents(map) {\n        return new Point(map(this.x), map(this.y));\n    }\n    isZero() {\n        return this.x === 0 && this.y === 0;\n    }\n    withThreshold(threshold) {\n        return this.mapComponents(axisVal => {\n            if (axisVal > threshold) {\n                return axisVal - threshold;\n            }\n            else if (axisVal < -threshold) {\n                return axisVal + threshold;\n            }\n            return 0;\n        });\n    }\n}\n\nexport { Point };\n","import { equalsIfDefined, itemsEquals } from '../../base/common/equals.js';\nimport { Disposable, DisposableStore, toDisposable } from '../../base/common/lifecycle.js';\nimport '../../base/common/observableInternal/index.js';\nimport { LineRange } from '../common/core/ranges/lineRange.js';\nimport { OffsetRange } from '../common/core/ranges/offsetRange.js';\nimport { Position } from '../common/core/position.js';\nimport { Selection } from '../common/core/selection.js';\nimport { Point } from '../common/core/2d/point.js';\nimport { TransactionImpl } from '../../base/common/observableInternal/transaction.js';\nimport { derivedOpts, derivedWithSetter, derived } from '../../base/common/observableInternal/observables/derived.js';\nimport { observableValue } from '../../base/common/observableInternal/observables/observableValue.js';\nimport { observableFromEvent } from '../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { observableValueOpts } from '../../base/common/observableInternal/observables/observableValueOpts.js';\nimport { observableSignal } from '../../base/common/observableInternal/observables/observableSignal.js';\nimport { DebugLocation } from '../../base/common/observableInternal/debugLocation.js';\nimport { autorunOpts, autorun } from '../../base/common/observableInternal/reactions/autorun.js';\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/**\n * Returns a facade for the code editor that provides observables for various states/events.\n*/\nfunction observableCodeEditor(editor) {\n    return ObservableCodeEditor.get(editor);\n}\nclass ObservableCodeEditor extends Disposable {\n    static { this._map = new Map(); }\n    /**\n     * Make sure that editor is not disposed yet!\n    */\n    static get(editor) {\n        let result = ObservableCodeEditor._map.get(editor);\n        if (!result) {\n            result = new ObservableCodeEditor(editor);\n            ObservableCodeEditor._map.set(editor, result);\n            const d = editor.onDidDispose(() => {\n                const item = ObservableCodeEditor._map.get(editor);\n                if (item) {\n                    ObservableCodeEditor._map.delete(editor);\n                    item.dispose();\n                    d.dispose();\n                }\n            });\n        }\n        return result;\n    }\n    _beginUpdate() {\n        this._updateCounter++;\n        if (this._updateCounter === 1) {\n            this._currentTransaction = new TransactionImpl(() => {\n                /** @description Update editor state */\n            });\n        }\n    }\n    _endUpdate() {\n        this._updateCounter--;\n        if (this._updateCounter === 0) {\n            const t = this._currentTransaction;\n            this._currentTransaction = undefined;\n            t.finish();\n        }\n    }\n    constructor(editor) {\n        super();\n        this.editor = editor;\n        this._updateCounter = 0;\n        this._currentTransaction = undefined;\n        this._model = observableValue(this, this.editor.getModel());\n        this.model = this._model;\n        this.isReadonly = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(104 /* EditorOption.readOnly */));\n        this._versionId = observableValueOpts({ owner: this, lazy: true }, this.editor.getModel()?.getVersionId() ?? null);\n        this.versionId = this._versionId;\n        this._selections = observableValueOpts({ owner: this, equalsFn: equalsIfDefined(itemsEquals(Selection.selectionsEqual)), lazy: true }, this.editor.getSelections() ?? null);\n        this.selections = this._selections;\n        this.positions = derivedOpts({ owner: this, equalsFn: equalsIfDefined(itemsEquals(Position.equals)) }, reader => this.selections.read(reader)?.map(s => s.getStartPosition()) ?? null);\n        this.isFocused = observableFromEvent(this, e => {\n            const d1 = this.editor.onDidFocusEditorWidget(e);\n            const d2 = this.editor.onDidBlurEditorWidget(e);\n            return {\n                dispose() {\n                    d1.dispose();\n                    d2.dispose();\n                }\n            };\n        }, () => this.editor.hasWidgetFocus());\n        this.isTextFocused = observableFromEvent(this, e => {\n            const d1 = this.editor.onDidFocusEditorText(e);\n            const d2 = this.editor.onDidBlurEditorText(e);\n            return {\n                dispose() {\n                    d1.dispose();\n                    d2.dispose();\n                }\n            };\n        }, () => this.editor.hasTextFocus());\n        this.inComposition = observableFromEvent(this, e => {\n            const d1 = this.editor.onDidCompositionStart(() => {\n                e(undefined);\n            });\n            const d2 = this.editor.onDidCompositionEnd(() => {\n                e(undefined);\n            });\n            return {\n                dispose() {\n                    d1.dispose();\n                    d2.dispose();\n                }\n            };\n        }, () => this.editor.inComposition);\n        this.value = derivedWithSetter(this, reader => { this.versionId.read(reader); return this.model.read(reader)?.getValue() ?? ''; }, (value, tx) => {\n            const model = this.model.get();\n            if (model !== null) {\n                if (value !== model.getValue()) {\n                    model.setValue(value);\n                }\n            }\n        });\n        this.valueIsEmpty = derived(this, reader => { this.versionId.read(reader); return this.editor.getModel()?.getValueLength() === 0; });\n        this.cursorSelection = derivedOpts({ owner: this, equalsFn: equalsIfDefined(Selection.selectionsEqual) }, reader => this.selections.read(reader)?.[0] ?? null);\n        this.cursorPosition = derivedOpts({ owner: this, equalsFn: Position.equals }, reader => this.selections.read(reader)?.[0]?.getPosition() ?? null);\n        this.cursorLineNumber = derived(this, reader => this.cursorPosition.read(reader)?.lineNumber ?? null);\n        this.onDidType = observableSignal(this);\n        this.onDidPaste = observableSignal(this);\n        this.scrollTop = observableFromEvent(this.editor.onDidScrollChange, () => this.editor.getScrollTop());\n        this.scrollLeft = observableFromEvent(this.editor.onDidScrollChange, () => this.editor.getScrollLeft());\n        this.layoutInfo = observableFromEvent(this.editor.onDidLayoutChange, () => this.editor.getLayoutInfo());\n        this.layoutInfoContentLeft = this.layoutInfo.map(l => l.contentLeft);\n        this.layoutInfoDecorationsLeft = this.layoutInfo.map(l => l.decorationsLeft);\n        this.layoutInfoWidth = this.layoutInfo.map(l => l.width);\n        this.layoutInfoHeight = this.layoutInfo.map(l => l.height);\n        this.layoutInfoMinimap = this.layoutInfo.map(l => l.minimap);\n        this.layoutInfoVerticalScrollbarWidth = this.layoutInfo.map(l => l.verticalScrollbarWidth);\n        this.contentWidth = observableFromEvent(this.editor.onDidContentSizeChange, () => this.editor.getContentWidth());\n        this.contentHeight = observableFromEvent(this.editor.onDidContentSizeChange, () => this.editor.getContentHeight());\n        this._widgetCounter = 0;\n        this.openedPeekWidgets = observableValue(this, 0);\n        this._register(this.editor.onBeginUpdate(() => this._beginUpdate()));\n        this._register(this.editor.onEndUpdate(() => this._endUpdate()));\n        this._register(this.editor.onDidChangeModel(() => {\n            this._beginUpdate();\n            try {\n                this._model.set(this.editor.getModel(), this._currentTransaction);\n                this._forceUpdate();\n            }\n            finally {\n                this._endUpdate();\n            }\n        }));\n        this._register(this.editor.onDidType((e) => {\n            this._beginUpdate();\n            try {\n                this._forceUpdate();\n                this.onDidType.trigger(this._currentTransaction, e);\n            }\n            finally {\n                this._endUpdate();\n            }\n        }));\n        this._register(this.editor.onDidPaste((e) => {\n            this._beginUpdate();\n            try {\n                this._forceUpdate();\n                this.onDidPaste.trigger(this._currentTransaction, e);\n            }\n            finally {\n                this._endUpdate();\n            }\n        }));\n        this._register(this.editor.onDidChangeModelContent(e => {\n            this._beginUpdate();\n            try {\n                this._versionId.set(this.editor.getModel()?.getVersionId() ?? null, this._currentTransaction, e);\n                this._forceUpdate();\n            }\n            finally {\n                this._endUpdate();\n            }\n        }));\n        this._register(this.editor.onDidChangeCursorSelection(e => {\n            this._beginUpdate();\n            try {\n                this._selections.set(this.editor.getSelections(), this._currentTransaction, e);\n                this._forceUpdate();\n            }\n            finally {\n                this._endUpdate();\n            }\n        }));\n        this.domNode = derived(reader => {\n            this.model.read(reader);\n            return this.editor.getDomNode();\n        });\n    }\n    forceUpdate(cb) {\n        this._beginUpdate();\n        try {\n            this._forceUpdate();\n            if (!cb) {\n                return undefined;\n            }\n            return cb(this._currentTransaction);\n        }\n        finally {\n            this._endUpdate();\n        }\n    }\n    _forceUpdate() {\n        this._beginUpdate();\n        try {\n            this._model.set(this.editor.getModel(), this._currentTransaction);\n            this._versionId.set(this.editor.getModel()?.getVersionId() ?? null, this._currentTransaction, undefined);\n            this._selections.set(this.editor.getSelections(), this._currentTransaction, undefined);\n        }\n        finally {\n            this._endUpdate();\n        }\n    }\n    getOption(id, debugLocation = DebugLocation.ofCaller()) {\n        return observableFromEvent(this, cb => this.editor.onDidChangeConfiguration(e => {\n            if (e.hasChanged(id)) {\n                cb(undefined);\n            }\n        }), () => this.editor.getOption(id), debugLocation);\n    }\n    setDecorations(decorations) {\n        const d = new DisposableStore();\n        const decorationsCollection = this.editor.createDecorationsCollection();\n        d.add(autorunOpts({ owner: this, debugName: () => `Apply decorations from ${decorations.debugName}` }, reader => {\n            const d = decorations.read(reader);\n            decorationsCollection.set(d);\n        }));\n        d.add({\n            dispose: () => {\n                decorationsCollection.clear();\n            }\n        });\n        return d;\n    }\n    createOverlayWidget(widget) {\n        const overlayWidgetId = 'observableOverlayWidget' + (this._widgetCounter++);\n        const w = {\n            getDomNode: () => widget.domNode,\n            getPosition: () => widget.position.get(),\n            getId: () => overlayWidgetId,\n            allowEditorOverflow: widget.allowEditorOverflow,\n            getMinContentWidthInPx: () => widget.minContentWidthInPx.get(),\n        };\n        this.editor.addOverlayWidget(w);\n        const d = autorun(reader => {\n            widget.position.read(reader);\n            widget.minContentWidthInPx.read(reader);\n            this.editor.layoutOverlayWidget(w);\n        });\n        return toDisposable(() => {\n            d.dispose();\n            this.editor.removeOverlayWidget(w);\n        });\n    }\n    createContentWidget(widget) {\n        const contentWidgetId = 'observableContentWidget' + (this._widgetCounter++);\n        const w = {\n            getDomNode: () => widget.domNode,\n            getPosition: () => widget.position.get(),\n            getId: () => contentWidgetId,\n            allowEditorOverflow: widget.allowEditorOverflow,\n        };\n        this.editor.addContentWidget(w);\n        const d = autorun(reader => {\n            widget.position.read(reader);\n            this.editor.layoutContentWidget(w);\n        });\n        return toDisposable(() => {\n            d.dispose();\n            this.editor.removeContentWidget(w);\n        });\n    }\n    observeLineOffsetRange(lineRange, store) {\n        const start = this.observePosition(lineRange.map(r => new Position(r.startLineNumber, 1)), store);\n        const end = this.observePosition(lineRange.map(r => new Position(r.endLineNumberExclusive + 1, 1)), store);\n        return derived(reader => {\n            start.read(reader);\n            end.read(reader);\n            const range = lineRange.read(reader);\n            const lineCount = this.model.read(reader)?.getLineCount();\n            const s = ((typeof lineCount !== 'undefined' && range.startLineNumber > lineCount\n                ? this.editor.getBottomForLineNumber(lineCount)\n                : this.editor.getTopForLineNumber(range.startLineNumber))\n                - this.scrollTop.read(reader));\n            const e = range.isEmpty ? s : (this.editor.getBottomForLineNumber(range.endLineNumberExclusive - 1) - this.scrollTop.read(reader));\n            return new OffsetRange(s, e);\n        });\n    }\n    observePosition(position, store) {\n        let pos = position.get();\n        const result = observableValueOpts({ owner: this, debugName: () => `topLeftOfPosition${pos?.toString()}`, equalsFn: equalsIfDefined(Point.equals) }, new Point(0, 0));\n        const contentWidgetId = `observablePositionWidget` + (this._widgetCounter++);\n        const domNode = document.createElement('div');\n        const w = {\n            getDomNode: () => domNode,\n            getPosition: () => {\n                return pos ? { preference: [0 /* ContentWidgetPositionPreference.EXACT */], position: position.get() } : null;\n            },\n            getId: () => contentWidgetId,\n            allowEditorOverflow: false,\n            afterRender: (position, coordinate) => {\n                const model = this._model.get();\n                if (model && pos && pos.lineNumber > model.getLineCount()) {\n                    // the position is after the last line\n                    result.set(new Point(0, this.editor.getBottomForLineNumber(model.getLineCount()) - this.scrollTop.get()), undefined);\n                }\n                else {\n                    result.set(coordinate ? new Point(coordinate.left, coordinate.top) : null, undefined);\n                }\n            },\n        };\n        this.editor.addContentWidget(w);\n        store.add(autorun(reader => {\n            pos = position.read(reader);\n            this.editor.layoutContentWidget(w);\n        }));\n        store.add(toDisposable(() => {\n            this.editor.removeContentWidget(w);\n        }));\n        return result;\n    }\n    isTargetHovered(predicate, store) {\n        const isHovered = observableValue('isInjectedTextHovered', false);\n        store.add(this.editor.onMouseMove(e => {\n            const val = predicate(e);\n            isHovered.set(val, undefined);\n        }));\n        store.add(this.editor.onMouseLeave(E => {\n            isHovered.set(false, undefined);\n        }));\n        return isHovered;\n    }\n    observeLineHeightForPosition(position) {\n        return derived(reader => {\n            const pos = position instanceof Position ? position : position.read(reader);\n            if (pos === null) {\n                return null;\n            }\n            this.getOption(75 /* EditorOption.lineHeight */).read(reader);\n            return this.editor.getLineHeightForPosition(pos);\n        });\n    }\n    observeLineHeightForLine(lineNumber) {\n        if (typeof lineNumber === 'number') {\n            return this.observeLineHeightForPosition(new Position(lineNumber, 1));\n        }\n        return derived(reader => {\n            const line = lineNumber.read(reader);\n            if (line === null) {\n                return null;\n            }\n            return this.observeLineHeightForPosition(new Position(line, 1)).read(reader);\n        });\n    }\n    observeLineHeightsForLineRange(lineNumber) {\n        return derived(reader => {\n            const range = lineNumber instanceof LineRange ? lineNumber : lineNumber.read(reader);\n            const heights = [];\n            for (let i = range.startLineNumber; i < range.endLineNumberExclusive; i++) {\n                heights.push(this.observeLineHeightForLine(i).read(reader));\n            }\n            return heights;\n        });\n    }\n}\n\nexport { ObservableCodeEditor, observableCodeEditor };\n","import { h, addStandardDisposableListener, EventType, addDisposableListener } from '../../../../../base/browser/dom.js';\nimport { createFastDomNode } from '../../../../../base/browser/fastDomNode.js';\nimport { ScrollbarState } from '../../../../../base/browser/ui/scrollbar/scrollbarState.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { appendRemoveOnDispose } from '../utils.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { OverviewRulerZone } from '../../../../common/viewModel/overviewZoneManager.js';\nimport '../../../../../platform/theme/common/colorUtils.js';\nimport '../../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../../platform/theme/common/colors/chartsColors.js';\nimport { diffOverviewRulerInserted, defaultInsertColor, diffInserted, diffOverviewRulerRemoved, defaultRemoveColor, diffRemoved } from '../../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../../platform/theme/common/colors/searchColors.js';\nimport { IThemeService } from '../../../../../platform/theme/common/themeService.js';\nimport { observableFromEvent } from '../../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { derived } from '../../../../../base/common/observableInternal/observables/derived.js';\nimport { autorunWithStore, autorun } from '../../../../../base/common/observableInternal/reactions/autorun.js';\nimport { observableSignalFromEvent } from '../../../../../base/common/observableInternal/observables/observableSignalFromEvent.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar OverviewRulerFeature_1;\nlet OverviewRulerFeature = class OverviewRulerFeature extends Disposable {\n    static { OverviewRulerFeature_1 = this; }\n    static { this.ONE_OVERVIEW_WIDTH = 15; }\n    static { this.ENTIRE_DIFF_OVERVIEW_WIDTH = this.ONE_OVERVIEW_WIDTH * 2; }\n    constructor(_editors, _rootElement, _diffModel, _rootWidth, _rootHeight, _modifiedEditorLayoutInfo, _themeService) {\n        super();\n        this._editors = _editors;\n        this._rootElement = _rootElement;\n        this._diffModel = _diffModel;\n        this._rootWidth = _rootWidth;\n        this._rootHeight = _rootHeight;\n        this._modifiedEditorLayoutInfo = _modifiedEditorLayoutInfo;\n        this._themeService = _themeService;\n        this.width = OverviewRulerFeature_1.ENTIRE_DIFF_OVERVIEW_WIDTH;\n        const currentColorTheme = observableFromEvent(this._themeService.onDidColorThemeChange, () => this._themeService.getColorTheme());\n        const currentColors = derived(reader => {\n            /** @description colors */\n            const theme = currentColorTheme.read(reader);\n            const insertColor = theme.getColor(diffOverviewRulerInserted) || (theme.getColor(diffInserted) || defaultInsertColor).transparent(2);\n            const removeColor = theme.getColor(diffOverviewRulerRemoved) || (theme.getColor(diffRemoved) || defaultRemoveColor).transparent(2);\n            return { insertColor, removeColor };\n        });\n        const viewportDomElement = createFastDomNode(document.createElement('div'));\n        viewportDomElement.setClassName('diffViewport');\n        viewportDomElement.setPosition('absolute');\n        const diffOverviewRoot = h('div.diffOverview', {\n            style: { position: 'absolute', top: '0px', width: OverviewRulerFeature_1.ENTIRE_DIFF_OVERVIEW_WIDTH + 'px' }\n        }).root;\n        this._register(appendRemoveOnDispose(diffOverviewRoot, viewportDomElement.domNode));\n        this._register(addStandardDisposableListener(diffOverviewRoot, EventType.POINTER_DOWN, (e) => {\n            this._editors.modified.delegateVerticalScrollbarPointerDown(e);\n        }));\n        this._register(addDisposableListener(diffOverviewRoot, EventType.MOUSE_WHEEL, (e) => {\n            this._editors.modified.delegateScrollFromMouseWheelEvent(e);\n        }, { passive: false }));\n        this._register(appendRemoveOnDispose(this._rootElement, diffOverviewRoot));\n        this._register(autorunWithStore((reader, store) => {\n            /** @description recreate overview rules when model changes */\n            const m = this._diffModel.read(reader);\n            const originalOverviewRuler = this._editors.original.createOverviewRuler('original diffOverviewRuler');\n            if (originalOverviewRuler) {\n                store.add(originalOverviewRuler);\n                store.add(appendRemoveOnDispose(diffOverviewRoot, originalOverviewRuler.getDomNode()));\n            }\n            const modifiedOverviewRuler = this._editors.modified.createOverviewRuler('modified diffOverviewRuler');\n            if (modifiedOverviewRuler) {\n                store.add(modifiedOverviewRuler);\n                store.add(appendRemoveOnDispose(diffOverviewRoot, modifiedOverviewRuler.getDomNode()));\n            }\n            if (!originalOverviewRuler || !modifiedOverviewRuler) {\n                // probably no model\n                return;\n            }\n            const origViewZonesChanged = observableSignalFromEvent('viewZoneChanged', this._editors.original.onDidChangeViewZones);\n            const modViewZonesChanged = observableSignalFromEvent('viewZoneChanged', this._editors.modified.onDidChangeViewZones);\n            const origHiddenRangesChanged = observableSignalFromEvent('hiddenRangesChanged', this._editors.original.onDidChangeHiddenAreas);\n            const modHiddenRangesChanged = observableSignalFromEvent('hiddenRangesChanged', this._editors.modified.onDidChangeHiddenAreas);\n            store.add(autorun(reader => {\n                /** @description set overview ruler zones */\n                origViewZonesChanged.read(reader);\n                modViewZonesChanged.read(reader);\n                origHiddenRangesChanged.read(reader);\n                modHiddenRangesChanged.read(reader);\n                const colors = currentColors.read(reader);\n                const diff = m?.diff.read(reader)?.mappings;\n                function createZones(ranges, color, editor) {\n                    const vm = editor._getViewModel();\n                    if (!vm) {\n                        return [];\n                    }\n                    return ranges\n                        .filter(d => d.length > 0)\n                        .map(r => {\n                        const start = vm.coordinatesConverter.convertModelPositionToViewPosition(new Position(r.startLineNumber, 1));\n                        const end = vm.coordinatesConverter.convertModelPositionToViewPosition(new Position(r.endLineNumberExclusive, 1));\n                        // By computing the lineCount, we won't ask the view model later for the bottom vertical position.\n                        // (The view model will take into account the alignment viewzones, which will give\n                        // modifications and deletetions always the same height.)\n                        const lineCount = end.lineNumber - start.lineNumber;\n                        return new OverviewRulerZone(start.lineNumber, end.lineNumber, lineCount, color.toString());\n                    });\n                }\n                const originalZones = createZones((diff || []).map(d => d.lineRangeMapping.original), colors.removeColor, this._editors.original);\n                const modifiedZones = createZones((diff || []).map(d => d.lineRangeMapping.modified), colors.insertColor, this._editors.modified);\n                originalOverviewRuler?.setZones(originalZones);\n                modifiedOverviewRuler?.setZones(modifiedZones);\n            }));\n            store.add(autorun(reader => {\n                /** @description layout overview ruler */\n                const height = this._rootHeight.read(reader);\n                const width = this._rootWidth.read(reader);\n                const layoutInfo = this._modifiedEditorLayoutInfo.read(reader);\n                if (layoutInfo) {\n                    const freeSpace = OverviewRulerFeature_1.ENTIRE_DIFF_OVERVIEW_WIDTH - 2 * OverviewRulerFeature_1.ONE_OVERVIEW_WIDTH;\n                    originalOverviewRuler.setLayout({\n                        top: 0,\n                        height: height,\n                        right: freeSpace + OverviewRulerFeature_1.ONE_OVERVIEW_WIDTH,\n                        width: OverviewRulerFeature_1.ONE_OVERVIEW_WIDTH,\n                    });\n                    modifiedOverviewRuler.setLayout({\n                        top: 0,\n                        height: height,\n                        right: 0,\n                        width: OverviewRulerFeature_1.ONE_OVERVIEW_WIDTH,\n                    });\n                    const scrollTop = this._editors.modifiedScrollTop.read(reader);\n                    const scrollHeight = this._editors.modifiedScrollHeight.read(reader);\n                    const scrollBarOptions = this._editors.modified.getOption(117 /* EditorOption.scrollbar */);\n                    const state = new ScrollbarState(scrollBarOptions.verticalHasArrows ? scrollBarOptions.arrowSize : 0, scrollBarOptions.verticalScrollbarSize, 0, layoutInfo.height, scrollHeight, scrollTop);\n                    viewportDomElement.setTop(state.getSliderPosition());\n                    viewportDomElement.setHeight(state.getSliderSize());\n                }\n                else {\n                    viewportDomElement.setTop(0);\n                    viewportDomElement.setHeight(0);\n                }\n                diffOverviewRoot.style.height = height + 'px';\n                diffOverviewRoot.style.left = (width - OverviewRulerFeature_1.ENTIRE_DIFF_OVERVIEW_WIDTH) + 'px';\n                viewportDomElement.setWidth(OverviewRulerFeature_1.ENTIRE_DIFF_OVERVIEW_WIDTH);\n            }));\n        }));\n    }\n};\nOverviewRulerFeature = OverviewRulerFeature_1 = __decorate([\n    __param(6, IThemeService)\n], OverviewRulerFeature);\n\nexport { OverviewRulerFeature };\n","import { Emitter } from '../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { observableCodeEditor } from '../../../observableCodeEditor.js';\nimport { OverviewRulerFeature } from '../features/overviewRulerFeature.js';\nimport { EditorOptions } from '../../../../common/config/editorOptions.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { localize } from '../../../../../nls.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';\nimport { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { observableFromEvent } from '../../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { derivedOpts, derived } from '../../../../../base/common/observableInternal/observables/derived.js';\nimport { autorunHandleChanges } from '../../../../../base/common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet DiffEditorEditors = class DiffEditorEditors extends Disposable {\n    get onDidContentSizeChange() { return this._onDidContentSizeChange.event; }\n    constructor(originalEditorElement, modifiedEditorElement, _options, _argCodeEditorWidgetOptions, _createInnerEditor, _contextKeyService, _instantiationService, _keybindingService) {\n        super();\n        this.originalEditorElement = originalEditorElement;\n        this.modifiedEditorElement = modifiedEditorElement;\n        this._options = _options;\n        this._argCodeEditorWidgetOptions = _argCodeEditorWidgetOptions;\n        this._createInnerEditor = _createInnerEditor;\n        this._contextKeyService = _contextKeyService;\n        this._instantiationService = _instantiationService;\n        this._keybindingService = _keybindingService;\n        this.original = this._register(this._createLeftHandSideEditor(this._options.editorOptions.get(), this._argCodeEditorWidgetOptions.originalEditor || {}));\n        this.modified = this._register(this._createRightHandSideEditor(this._options.editorOptions.get(), this._argCodeEditorWidgetOptions.modifiedEditor || {}));\n        this._onDidContentSizeChange = this._register(new Emitter());\n        this.modifiedScrollTop = observableFromEvent(this, this.modified.onDidScrollChange, () => /** @description modified.getScrollTop */ this.modified.getScrollTop());\n        this.modifiedScrollHeight = observableFromEvent(this, this.modified.onDidScrollChange, () => /** @description modified.getScrollHeight */ this.modified.getScrollHeight());\n        this.modifiedObs = observableCodeEditor(this.modified);\n        this.originalObs = observableCodeEditor(this.original);\n        this.modifiedModel = this.modifiedObs.model;\n        this.modifiedSelections = observableFromEvent(this, this.modified.onDidChangeCursorSelection, () => this.modified.getSelections() ?? []);\n        this.modifiedCursor = derivedOpts({ owner: this, equalsFn: Position.equals }, reader => this.modifiedSelections.read(reader)[0]?.getPosition() ?? new Position(1, 1));\n        this.originalCursor = observableFromEvent(this, this.original.onDidChangeCursorPosition, () => this.original.getPosition() ?? new Position(1, 1));\n        this.isOriginalFocused = observableCodeEditor(this.original).isFocused;\n        this.isModifiedFocused = observableCodeEditor(this.modified).isFocused;\n        this.isFocused = derived(this, reader => this.isOriginalFocused.read(reader) || this.isModifiedFocused.read(reader));\n        // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n        this._argCodeEditorWidgetOptions = null;\n        this._register(autorunHandleChanges({\n            changeTracker: {\n                createChangeSummary: () => ({}),\n                handleChange: (ctx, changeSummary) => {\n                    if (ctx.didChange(_options.editorOptions)) {\n                        Object.assign(changeSummary, ctx.change.changedOptions);\n                    }\n                    return true;\n                }\n            }\n        }, (reader, changeSummary) => {\n            /** @description update editor options */\n            _options.editorOptions.read(reader);\n            this._options.renderSideBySide.read(reader);\n            this.modified.updateOptions(this._adjustOptionsForRightHandSide(reader, changeSummary));\n            this.original.updateOptions(this._adjustOptionsForLeftHandSide(reader, changeSummary));\n        }));\n    }\n    _createLeftHandSideEditor(options, codeEditorWidgetOptions) {\n        const leftHandSideOptions = this._adjustOptionsForLeftHandSide(undefined, options);\n        const editor = this._constructInnerEditor(this._instantiationService, this.originalEditorElement, leftHandSideOptions, codeEditorWidgetOptions);\n        const isInDiffLeftEditorKey = this._contextKeyService.createKey('isInDiffLeftEditor', editor.hasWidgetFocus());\n        this._register(editor.onDidFocusEditorWidget(() => isInDiffLeftEditorKey.set(true)));\n        this._register(editor.onDidBlurEditorWidget(() => isInDiffLeftEditorKey.set(false)));\n        return editor;\n    }\n    _createRightHandSideEditor(options, codeEditorWidgetOptions) {\n        const rightHandSideOptions = this._adjustOptionsForRightHandSide(undefined, options);\n        const editor = this._constructInnerEditor(this._instantiationService, this.modifiedEditorElement, rightHandSideOptions, codeEditorWidgetOptions);\n        const isInDiffRightEditorKey = this._contextKeyService.createKey('isInDiffRightEditor', editor.hasWidgetFocus());\n        this._register(editor.onDidFocusEditorWidget(() => isInDiffRightEditorKey.set(true)));\n        this._register(editor.onDidBlurEditorWidget(() => isInDiffRightEditorKey.set(false)));\n        return editor;\n    }\n    _constructInnerEditor(instantiationService, container, options, editorWidgetOptions) {\n        const editor = this._createInnerEditor(instantiationService, container, options, editorWidgetOptions);\n        this._register(editor.onDidContentSizeChange(e => {\n            const width = this.original.getContentWidth() + this.modified.getContentWidth() + OverviewRulerFeature.ENTIRE_DIFF_OVERVIEW_WIDTH;\n            const height = Math.max(this.modified.getContentHeight(), this.original.getContentHeight());\n            this._onDidContentSizeChange.fire({\n                contentHeight: height,\n                contentWidth: width,\n                contentHeightChanged: e.contentHeightChanged,\n                contentWidthChanged: e.contentWidthChanged\n            });\n        }));\n        return editor;\n    }\n    _adjustOptionsForLeftHandSide(_reader, changedOptions) {\n        const result = this._adjustOptionsForSubEditor(changedOptions);\n        if (!this._options.renderSideBySide.get()) {\n            // never wrap hidden editor\n            result.wordWrapOverride1 = 'off';\n            result.wordWrapOverride2 = 'off';\n            result.stickyScroll = { enabled: false };\n            // Disable unicode highlighting for the original side in inline mode, as they are not shown anyway.\n            result.unicodeHighlight = { nonBasicASCII: false, ambiguousCharacters: false, invisibleCharacters: false };\n        }\n        else {\n            result.unicodeHighlight = this._options.editorOptions.get().unicodeHighlight || {};\n            result.wordWrapOverride1 = this._options.diffWordWrap.get();\n        }\n        result.glyphMargin = this._options.renderSideBySide.get();\n        if (changedOptions.originalAriaLabel) {\n            result.ariaLabel = changedOptions.originalAriaLabel;\n        }\n        result.ariaLabel = this._updateAriaLabel(result.ariaLabel);\n        result.readOnly = !this._options.originalEditable.get();\n        result.dropIntoEditor = { enabled: !result.readOnly };\n        result.extraEditorClassName = 'original-in-monaco-diff-editor';\n        return result;\n    }\n    _adjustOptionsForRightHandSide(reader, changedOptions) {\n        const result = this._adjustOptionsForSubEditor(changedOptions);\n        if (changedOptions.modifiedAriaLabel) {\n            result.ariaLabel = changedOptions.modifiedAriaLabel;\n        }\n        result.ariaLabel = this._updateAriaLabel(result.ariaLabel);\n        result.wordWrapOverride1 = this._options.diffWordWrap.get();\n        result.revealHorizontalRightPadding = EditorOptions.revealHorizontalRightPadding.defaultValue + OverviewRulerFeature.ENTIRE_DIFF_OVERVIEW_WIDTH;\n        result.scrollbar.verticalHasArrows = false;\n        result.extraEditorClassName = 'modified-in-monaco-diff-editor';\n        return result;\n    }\n    _adjustOptionsForSubEditor(options) {\n        const clonedOptions = {\n            ...options,\n            dimension: {\n                height: 0,\n                width: 0\n            },\n        };\n        clonedOptions.inDiffEditor = true;\n        clonedOptions.automaticLayout = false;\n        clonedOptions.allowVariableLineHeights = false;\n        clonedOptions.allowVariableFonts = false;\n        clonedOptions.allowVariableFontsInAccessibilityMode = false;\n        // Clone scrollbar options before changing them\n        clonedOptions.scrollbar = { ...(clonedOptions.scrollbar || {}) };\n        clonedOptions.folding = false;\n        clonedOptions.codeLens = this._options.diffCodeLens.get();\n        clonedOptions.fixedOverflowWidgets = true;\n        // Clone minimap options before changing them\n        clonedOptions.minimap = { ...(clonedOptions.minimap || {}) };\n        clonedOptions.minimap.enabled = false;\n        if (this._options.hideUnchangedRegions.get()) {\n            clonedOptions.stickyScroll = { enabled: false };\n        }\n        else {\n            clonedOptions.stickyScroll = this._options.editorOptions.get().stickyScroll;\n        }\n        return clonedOptions;\n    }\n    _updateAriaLabel(ariaLabel) {\n        if (!ariaLabel) {\n            ariaLabel = '';\n        }\n        const ariaNavigationTip = localize(111, ' use {0} to open the accessibility help.', this._keybindingService.lookupKeybinding('editor.action.accessibilityHelp')?.getAriaLabel());\n        if (this._options.accessibilityVerbose.get()) {\n            return ariaLabel + ariaNavigationTip;\n        }\n        else if (ariaLabel) {\n            return ariaLabel.replaceAll(ariaNavigationTip, '');\n        }\n        return '';\n    }\n};\nDiffEditorEditors = __decorate([\n    __param(5, IContextKeyService),\n    __param(6, IInstantiationService),\n    __param(7, IKeybindingService)\n], DiffEditorEditors);\n\nexport { DiffEditorEditors };\n","import { getWindow, append, $, addDisposableListener, EventHelper, isHTMLElement } from '../../dom.js';\nimport { createStyleSheet } from '../../domStylesheets.js';\nimport { DomEmitter } from '../../event.js';\nimport { EventType, Gesture } from '../../touch.js';\nimport { Delayer } from '../../../common/async.js';\nimport { memoize } from '../../../common/decorators.js';\nimport { Emitter } from '../../../common/event.js';\nimport { DisposableStore, Disposable, toDisposable } from '../../../common/lifecycle.js';\nimport { isMacintosh } from '../../../common/platform.js';\nimport './sash.css';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n/**\n * Allow the sashes to be visible at runtime.\n * @remark Use for development purposes only.\n */\nconst DEBUG = false;\nvar OrthogonalEdge;\n(function (OrthogonalEdge) {\n    OrthogonalEdge[\"North\"] = \"north\";\n    OrthogonalEdge[\"South\"] = \"south\";\n    OrthogonalEdge[\"East\"] = \"east\";\n    OrthogonalEdge[\"West\"] = \"west\";\n})(OrthogonalEdge || (OrthogonalEdge = {}));\nlet globalSize = 4;\nconst onDidChangeGlobalSize = new Emitter();\nlet globalHoverDelay = 300;\nconst onDidChangeHoverDelay = new Emitter();\nclass MouseEventFactory {\n    constructor(el) {\n        this.el = el;\n        this.disposables = new DisposableStore();\n    }\n    get onPointerMove() {\n        return this.disposables.add(new DomEmitter(getWindow(this.el), 'mousemove')).event;\n    }\n    get onPointerUp() {\n        return this.disposables.add(new DomEmitter(getWindow(this.el), 'mouseup')).event;\n    }\n    dispose() {\n        this.disposables.dispose();\n    }\n}\n__decorate([\n    memoize\n], MouseEventFactory.prototype, \"onPointerMove\", null);\n__decorate([\n    memoize\n], MouseEventFactory.prototype, \"onPointerUp\", null);\nclass GestureEventFactory {\n    get onPointerMove() {\n        return this.disposables.add(new DomEmitter(this.el, EventType.Change)).event;\n    }\n    get onPointerUp() {\n        return this.disposables.add(new DomEmitter(this.el, EventType.End)).event;\n    }\n    constructor(el) {\n        this.el = el;\n        this.disposables = new DisposableStore();\n    }\n    dispose() {\n        this.disposables.dispose();\n    }\n}\n__decorate([\n    memoize\n], GestureEventFactory.prototype, \"onPointerMove\", null);\n__decorate([\n    memoize\n], GestureEventFactory.prototype, \"onPointerUp\", null);\nclass OrthogonalPointerEventFactory {\n    get onPointerMove() {\n        return this.factory.onPointerMove;\n    }\n    get onPointerUp() {\n        return this.factory.onPointerUp;\n    }\n    constructor(factory) {\n        this.factory = factory;\n    }\n    dispose() {\n        // noop\n    }\n}\n__decorate([\n    memoize\n], OrthogonalPointerEventFactory.prototype, \"onPointerMove\", null);\n__decorate([\n    memoize\n], OrthogonalPointerEventFactory.prototype, \"onPointerUp\", null);\nconst PointerEventsDisabledCssClass = 'pointer-events-disabled';\n/**\n * The {@link Sash} is the UI component which allows the user to resize other\n * components. It's usually an invisible horizontal or vertical line which, when\n * hovered, becomes highlighted and can be dragged along the perpendicular dimension\n * to its direction.\n *\n * Features:\n * - Touch event handling\n * - Corner sash support\n * - Hover with different mouse cursor support\n * - Configurable hover size\n * - Linked sash support, for 2x2 corner sashes\n */\nclass Sash extends Disposable {\n    get state() { return this._state; }\n    get orthogonalStartSash() { return this._orthogonalStartSash; }\n    get orthogonalEndSash() { return this._orthogonalEndSash; }\n    /**\n     * The state of a sash defines whether it can be interacted with by the user\n     * as well as what mouse cursor to use, when hovered.\n     */\n    set state(state) {\n        if (this._state === state) {\n            return;\n        }\n        this.el.classList.toggle('disabled', state === 0 /* SashState.Disabled */);\n        this.el.classList.toggle('minimum', state === 1 /* SashState.AtMinimum */);\n        this.el.classList.toggle('maximum', state === 2 /* SashState.AtMaximum */);\n        this._state = state;\n        this.onDidEnablementChange.fire(state);\n    }\n    /**\n     * An event which fires whenever the user starts dragging this sash.\n     */\n    get onDidStart() { return this._onDidStart.event; }\n    /**\n     * An event which fires whenever the user moves the mouse while\n     * dragging this sash.\n     */\n    get onDidChange() { return this._onDidChange.event; }\n    /**\n     * An event which fires whenever the user double clicks this sash.\n     */\n    get onDidReset() { return this._onDidReset.event; }\n    /**\n     * An event which fires whenever the user stops dragging this sash.\n     */\n    get onDidEnd() { return this._onDidEnd.event; }\n    /**\n     * A reference to another sash, perpendicular to this one, which\n     * aligns at the start of this one. A corner sash will be created\n     * automatically at that location.\n     *\n     * The start of a horizontal sash is its left-most position.\n     * The start of a vertical sash is its top-most position.\n     */\n    set orthogonalStartSash(sash) {\n        if (this._orthogonalStartSash === sash) {\n            return;\n        }\n        this.orthogonalStartDragHandleDisposables.clear();\n        this.orthogonalStartSashDisposables.clear();\n        if (sash) {\n            const onChange = (state) => {\n                this.orthogonalStartDragHandleDisposables.clear();\n                if (state !== 0 /* SashState.Disabled */) {\n                    this._orthogonalStartDragHandle = append(this.el, $('.orthogonal-drag-handle.start'));\n                    this.orthogonalStartDragHandleDisposables.add(toDisposable(() => this._orthogonalStartDragHandle.remove()));\n                    this.orthogonalStartDragHandleDisposables.add(addDisposableListener(this._orthogonalStartDragHandle, 'mouseenter', () => Sash.onMouseEnter(sash)));\n                    this.orthogonalStartDragHandleDisposables.add(addDisposableListener(this._orthogonalStartDragHandle, 'mouseleave', () => Sash.onMouseLeave(sash)));\n                }\n            };\n            this.orthogonalStartSashDisposables.add(sash.onDidEnablementChange.event(onChange, this));\n            onChange(sash.state);\n        }\n        this._orthogonalStartSash = sash;\n    }\n    /**\n     * A reference to another sash, perpendicular to this one, which\n     * aligns at the end of this one. A corner sash will be created\n     * automatically at that location.\n     *\n     * The end of a horizontal sash is its right-most position.\n     * The end of a vertical sash is its bottom-most position.\n     */\n    set orthogonalEndSash(sash) {\n        if (this._orthogonalEndSash === sash) {\n            return;\n        }\n        this.orthogonalEndDragHandleDisposables.clear();\n        this.orthogonalEndSashDisposables.clear();\n        if (sash) {\n            const onChange = (state) => {\n                this.orthogonalEndDragHandleDisposables.clear();\n                if (state !== 0 /* SashState.Disabled */) {\n                    this._orthogonalEndDragHandle = append(this.el, $('.orthogonal-drag-handle.end'));\n                    this.orthogonalEndDragHandleDisposables.add(toDisposable(() => this._orthogonalEndDragHandle.remove()));\n                    this.orthogonalEndDragHandleDisposables.add(addDisposableListener(this._orthogonalEndDragHandle, 'mouseenter', () => Sash.onMouseEnter(sash)));\n                    this.orthogonalEndDragHandleDisposables.add(addDisposableListener(this._orthogonalEndDragHandle, 'mouseleave', () => Sash.onMouseLeave(sash)));\n                }\n            };\n            this.orthogonalEndSashDisposables.add(sash.onDidEnablementChange.event(onChange, this));\n            onChange(sash.state);\n        }\n        this._orthogonalEndSash = sash;\n    }\n    constructor(container, layoutProvider, options) {\n        super();\n        this.hoverDelay = globalHoverDelay;\n        this.hoverDelayer = this._register(new Delayer(this.hoverDelay));\n        this._state = 3 /* SashState.Enabled */;\n        this.onDidEnablementChange = this._register(new Emitter());\n        this._onDidStart = this._register(new Emitter());\n        this._onDidChange = this._register(new Emitter());\n        this._onDidReset = this._register(new Emitter());\n        this._onDidEnd = this._register(new Emitter());\n        this.orthogonalStartSashDisposables = this._register(new DisposableStore());\n        this.orthogonalStartDragHandleDisposables = this._register(new DisposableStore());\n        this.orthogonalEndSashDisposables = this._register(new DisposableStore());\n        this.orthogonalEndDragHandleDisposables = this._register(new DisposableStore());\n        /**\n         * A linked sash will be forwarded the same user interactions and events\n         * so it moves exactly the same way as this sash.\n         *\n         * Useful in 2x2 grids. Not meant for widespread usage.\n         */\n        this.linkedSash = undefined;\n        this.el = append(container, $('.monaco-sash'));\n        if (options.orthogonalEdge) {\n            this.el.classList.add(`orthogonal-edge-${options.orthogonalEdge}`);\n        }\n        if (isMacintosh) {\n            this.el.classList.add('mac');\n        }\n        this._register(addDisposableListener(this.el, 'mousedown', e => this.onPointerStart(e, new MouseEventFactory(container))));\n        this._register(addDisposableListener(this.el, 'dblclick', e => this.onPointerDoublePress(e)));\n        this._register(addDisposableListener(this.el, 'mouseenter', () => Sash.onMouseEnter(this)));\n        this._register(addDisposableListener(this.el, 'mouseleave', () => Sash.onMouseLeave(this)));\n        this._register(Gesture.addTarget(this.el));\n        this._register(addDisposableListener(this.el, EventType.Start, e => this.onPointerStart(e, new GestureEventFactory(this.el))));\n        let doubleTapTimeout = undefined;\n        this._register(addDisposableListener(this.el, EventType.Tap, event => {\n            if (doubleTapTimeout) {\n                clearTimeout(doubleTapTimeout);\n                doubleTapTimeout = undefined;\n                this.onPointerDoublePress(event);\n                return;\n            }\n            clearTimeout(doubleTapTimeout);\n            doubleTapTimeout = setTimeout(() => doubleTapTimeout = undefined, 250);\n        }));\n        if (typeof options.size === 'number') {\n            this.size = options.size;\n            if (options.orientation === 0 /* Orientation.VERTICAL */) {\n                this.el.style.width = `${this.size}px`;\n            }\n            else {\n                this.el.style.height = `${this.size}px`;\n            }\n        }\n        else {\n            this.size = globalSize;\n            this._register(onDidChangeGlobalSize.event(size => {\n                this.size = size;\n                this.layout();\n            }));\n        }\n        this._register(onDidChangeHoverDelay.event(delay => this.hoverDelay = delay));\n        this.layoutProvider = layoutProvider;\n        this.orthogonalStartSash = options.orthogonalStartSash;\n        this.orthogonalEndSash = options.orthogonalEndSash;\n        this.orientation = options.orientation || 0 /* Orientation.VERTICAL */;\n        if (this.orientation === 1 /* Orientation.HORIZONTAL */) {\n            this.el.classList.add('horizontal');\n            this.el.classList.remove('vertical');\n        }\n        else {\n            this.el.classList.remove('horizontal');\n            this.el.classList.add('vertical');\n        }\n        this.el.classList.toggle('debug', DEBUG);\n        this.layout();\n    }\n    onPointerStart(event, pointerEventFactory) {\n        EventHelper.stop(event);\n        let isMultisashResize = false;\n        // eslint-disable-next-line local/code-no-any-casts\n        if (!event.__orthogonalSashEvent) {\n            const orthogonalSash = this.getOrthogonalSash(event);\n            if (orthogonalSash) {\n                isMultisashResize = true;\n                // eslint-disable-next-line local/code-no-any-casts\n                event.__orthogonalSashEvent = true;\n                orthogonalSash.onPointerStart(event, new OrthogonalPointerEventFactory(pointerEventFactory));\n            }\n        }\n        // eslint-disable-next-line local/code-no-any-casts\n        if (this.linkedSash && !event.__linkedSashEvent) {\n            // eslint-disable-next-line local/code-no-any-casts\n            event.__linkedSashEvent = true;\n            this.linkedSash.onPointerStart(event, new OrthogonalPointerEventFactory(pointerEventFactory));\n        }\n        if (!this.state) {\n            return;\n        }\n        // eslint-disable-next-line no-restricted-syntax\n        const iframes = this.el.ownerDocument.getElementsByTagName('iframe');\n        for (const iframe of iframes) {\n            iframe.classList.add(PointerEventsDisabledCssClass); // disable mouse events on iframes as long as we drag the sash\n        }\n        const startX = event.pageX;\n        const startY = event.pageY;\n        const altKey = event.altKey;\n        const startEvent = { startX, currentX: startX, startY, currentY: startY, altKey };\n        this.el.classList.add('active');\n        this._onDidStart.fire(startEvent);\n        // fix https://github.com/microsoft/vscode/issues/21675\n        const style = createStyleSheet(this.el);\n        const updateStyle = () => {\n            let cursor = '';\n            if (isMultisashResize) {\n                cursor = 'all-scroll';\n            }\n            else if (this.orientation === 1 /* Orientation.HORIZONTAL */) {\n                if (this.state === 1 /* SashState.AtMinimum */) {\n                    cursor = 's-resize';\n                }\n                else if (this.state === 2 /* SashState.AtMaximum */) {\n                    cursor = 'n-resize';\n                }\n                else {\n                    cursor = isMacintosh ? 'row-resize' : 'ns-resize';\n                }\n            }\n            else {\n                if (this.state === 1 /* SashState.AtMinimum */) {\n                    cursor = 'e-resize';\n                }\n                else if (this.state === 2 /* SashState.AtMaximum */) {\n                    cursor = 'w-resize';\n                }\n                else {\n                    cursor = isMacintosh ? 'col-resize' : 'ew-resize';\n                }\n            }\n            style.textContent = `* { cursor: ${cursor} !important; }`;\n        };\n        const disposables = new DisposableStore();\n        updateStyle();\n        if (!isMultisashResize) {\n            this.onDidEnablementChange.event(updateStyle, null, disposables);\n        }\n        const onPointerMove = (e) => {\n            EventHelper.stop(e, false);\n            const event = { startX, currentX: e.pageX, startY, currentY: e.pageY, altKey };\n            this._onDidChange.fire(event);\n        };\n        const onPointerUp = (e) => {\n            EventHelper.stop(e, false);\n            style.remove();\n            this.el.classList.remove('active');\n            this._onDidEnd.fire();\n            disposables.dispose();\n            for (const iframe of iframes) {\n                iframe.classList.remove(PointerEventsDisabledCssClass);\n            }\n        };\n        pointerEventFactory.onPointerMove(onPointerMove, null, disposables);\n        pointerEventFactory.onPointerUp(onPointerUp, null, disposables);\n        disposables.add(pointerEventFactory);\n    }\n    onPointerDoublePress(e) {\n        const orthogonalSash = this.getOrthogonalSash(e);\n        if (orthogonalSash) {\n            orthogonalSash._onDidReset.fire();\n        }\n        if (this.linkedSash) {\n            this.linkedSash._onDidReset.fire();\n        }\n        this._onDidReset.fire();\n    }\n    static onMouseEnter(sash, fromLinkedSash = false) {\n        if (sash.el.classList.contains('active')) {\n            sash.hoverDelayer.cancel();\n            sash.el.classList.add('hover');\n        }\n        else {\n            sash.hoverDelayer.trigger(() => sash.el.classList.add('hover'), sash.hoverDelay).then(undefined, () => { });\n        }\n        if (!fromLinkedSash && sash.linkedSash) {\n            Sash.onMouseEnter(sash.linkedSash, true);\n        }\n    }\n    static onMouseLeave(sash, fromLinkedSash = false) {\n        sash.hoverDelayer.cancel();\n        sash.el.classList.remove('hover');\n        if (!fromLinkedSash && sash.linkedSash) {\n            Sash.onMouseLeave(sash.linkedSash, true);\n        }\n    }\n    /**\n     * Forcefully stop any user interactions with this sash.\n     * Useful when hiding a parent component, while the user is still\n     * interacting with the sash.\n     */\n    clearSashHoverState() {\n        Sash.onMouseLeave(this);\n    }\n    /**\n     * Layout the sash. The sash will size and position itself\n     * based on its provided {@link ISashLayoutProvider layout provider}.\n     */\n    layout() {\n        if (this.orientation === 0 /* Orientation.VERTICAL */) {\n            const verticalProvider = this.layoutProvider;\n            this.el.style.left = verticalProvider.getVerticalSashLeft(this) - (this.size / 2) + 'px';\n            if (verticalProvider.getVerticalSashTop) {\n                this.el.style.top = verticalProvider.getVerticalSashTop(this) + 'px';\n            }\n            if (verticalProvider.getVerticalSashHeight) {\n                this.el.style.height = verticalProvider.getVerticalSashHeight(this) + 'px';\n            }\n        }\n        else {\n            const horizontalProvider = this.layoutProvider;\n            this.el.style.top = horizontalProvider.getHorizontalSashTop(this) - (this.size / 2) + 'px';\n            if (horizontalProvider.getHorizontalSashLeft) {\n                this.el.style.left = horizontalProvider.getHorizontalSashLeft(this) + 'px';\n            }\n            if (horizontalProvider.getHorizontalSashWidth) {\n                this.el.style.width = horizontalProvider.getHorizontalSashWidth(this) + 'px';\n            }\n        }\n    }\n    getOrthogonalSash(e) {\n        const target = e.initialTarget ?? e.target;\n        if (!target || !(isHTMLElement(target))) {\n            return undefined;\n        }\n        if (target.classList.contains('orthogonal-drag-handle')) {\n            return target.classList.contains('start') ? this.orthogonalStartSash : this.orthogonalEndSash;\n        }\n        return undefined;\n    }\n    dispose() {\n        super.dispose();\n        this.el.remove();\n    }\n}\n\nexport { OrthogonalEdge, Sash };\n","import { Sash } from '../../../../../base/browser/ui/sash/sash.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { derivedWithSetter } from '../../../../../base/common/observableInternal/observables/derived.js';\nimport { observableValue } from '../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { autorun } from '../../../../../base/common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nclass SashLayout {\n    resetSash() {\n        this._sashRatio.set(undefined, undefined);\n    }\n    constructor(_options, dimensions) {\n        this._options = _options;\n        this.dimensions = dimensions;\n        this.sashLeft = derivedWithSetter(this, reader => {\n            const ratio = this._sashRatio.read(reader) ?? this._options.splitViewDefaultRatio.read(reader);\n            return this._computeSashLeft(ratio, reader);\n        }, (value, tx) => {\n            const contentWidth = this.dimensions.width.get();\n            this._sashRatio.set(value / contentWidth, tx);\n        });\n        this._sashRatio = observableValue(this, undefined);\n    }\n    /** @pure */\n    _computeSashLeft(desiredRatio, reader) {\n        const contentWidth = this.dimensions.width.read(reader);\n        const midPoint = Math.floor(this._options.splitViewDefaultRatio.read(reader) * contentWidth);\n        const sashLeft = this._options.enableSplitViewResizing.read(reader) ? Math.floor(desiredRatio * contentWidth) : midPoint;\n        const MINIMUM_EDITOR_WIDTH = 100;\n        if (contentWidth <= MINIMUM_EDITOR_WIDTH * 2) {\n            return midPoint;\n        }\n        if (sashLeft < MINIMUM_EDITOR_WIDTH) {\n            return MINIMUM_EDITOR_WIDTH;\n        }\n        if (sashLeft > contentWidth - MINIMUM_EDITOR_WIDTH) {\n            return contentWidth - MINIMUM_EDITOR_WIDTH;\n        }\n        return sashLeft;\n    }\n}\nclass DiffEditorSash extends Disposable {\n    constructor(_domNode, _dimensions, _enabled, _boundarySashes, sashLeft, _resetSash) {\n        super();\n        this._domNode = _domNode;\n        this._dimensions = _dimensions;\n        this._enabled = _enabled;\n        this._boundarySashes = _boundarySashes;\n        this.sashLeft = sashLeft;\n        this._resetSash = _resetSash;\n        this._sash = this._register(new Sash(this._domNode, {\n            getVerticalSashTop: (_sash) => 0,\n            getVerticalSashLeft: (_sash) => this.sashLeft.get(),\n            getVerticalSashHeight: (_sash) => this._dimensions.height.get(),\n        }, { orientation: 0 /* Orientation.VERTICAL */ }));\n        this._startSashPosition = undefined;\n        this._register(this._sash.onDidStart(() => {\n            this._startSashPosition = this.sashLeft.get();\n        }));\n        this._register(this._sash.onDidChange((e) => {\n            this.sashLeft.set(this._startSashPosition + (e.currentX - e.startX), undefined);\n        }));\n        this._register(this._sash.onDidEnd(() => this._sash.layout()));\n        this._register(this._sash.onDidReset(() => this._resetSash()));\n        this._register(autorun(reader => {\n            const sashes = this._boundarySashes.read(reader);\n            if (sashes) {\n                this._sash.orthogonalEndSash = sashes.bottom;\n            }\n        }));\n        this._register(autorun(reader => {\n            /** @description DiffEditorSash.layoutSash */\n            const enabled = this._enabled.read(reader);\n            this._sash.state = enabled ? 3 /* SashState.Enabled */ : 0 /* SashState.Disabled */;\n            this.sashLeft.read(reader);\n            this._dimensions.height.read(reader);\n            this._sash.layout();\n        }));\n    }\n}\n\nexport { DiffEditorSash, SashLayout };\n","import { Emitter } from '../../../../base/common/event.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DelegatingEditor extends Disposable {\n    constructor() {\n        super(...arguments);\n        this._id = ++DelegatingEditor.idCounter;\n        this._onDidDispose = this._register(new Emitter());\n        this.onDidDispose = this._onDidDispose.event;\n        // #endregion\n    }\n    static { this.idCounter = 0; }\n    getId() { return this.getEditorType() + ':v2:' + this._id; }\n    // #region editorBrowser.IDiffEditor: Delegating to modified Editor\n    getVisibleColumnFromPosition(position) {\n        return this._targetEditor.getVisibleColumnFromPosition(position);\n    }\n    getPosition() {\n        return this._targetEditor.getPosition();\n    }\n    setPosition(position, source = 'api') {\n        this._targetEditor.setPosition(position, source);\n    }\n    revealLine(lineNumber, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealLine(lineNumber, scrollType);\n    }\n    revealLineInCenter(lineNumber, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealLineInCenter(lineNumber, scrollType);\n    }\n    revealLineInCenterIfOutsideViewport(lineNumber, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealLineInCenterIfOutsideViewport(lineNumber, scrollType);\n    }\n    revealLineNearTop(lineNumber, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealLineNearTop(lineNumber, scrollType);\n    }\n    revealPosition(position, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealPosition(position, scrollType);\n    }\n    revealPositionInCenter(position, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealPositionInCenter(position, scrollType);\n    }\n    revealPositionInCenterIfOutsideViewport(position, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealPositionInCenterIfOutsideViewport(position, scrollType);\n    }\n    revealPositionNearTop(position, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealPositionNearTop(position, scrollType);\n    }\n    getSelection() {\n        return this._targetEditor.getSelection();\n    }\n    getSelections() {\n        return this._targetEditor.getSelections();\n    }\n    setSelection(something, source = 'api') {\n        this._targetEditor.setSelection(something, source);\n    }\n    setSelections(ranges, source = 'api') {\n        this._targetEditor.setSelections(ranges, source);\n    }\n    revealLines(startLineNumber, endLineNumber, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealLines(startLineNumber, endLineNumber, scrollType);\n    }\n    revealLinesInCenter(startLineNumber, endLineNumber, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealLinesInCenter(startLineNumber, endLineNumber, scrollType);\n    }\n    revealLinesInCenterIfOutsideViewport(startLineNumber, endLineNumber, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealLinesInCenterIfOutsideViewport(startLineNumber, endLineNumber, scrollType);\n    }\n    revealLinesNearTop(startLineNumber, endLineNumber, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealLinesNearTop(startLineNumber, endLineNumber, scrollType);\n    }\n    revealRange(range, scrollType = 0 /* ScrollType.Smooth */, revealVerticalInCenter = false, revealHorizontal = true) {\n        this._targetEditor.revealRange(range, scrollType, revealVerticalInCenter, revealHorizontal);\n    }\n    revealRangeInCenter(range, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealRangeInCenter(range, scrollType);\n    }\n    revealRangeInCenterIfOutsideViewport(range, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealRangeInCenterIfOutsideViewport(range, scrollType);\n    }\n    revealRangeNearTop(range, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealRangeNearTop(range, scrollType);\n    }\n    revealRangeNearTopIfOutsideViewport(range, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealRangeNearTopIfOutsideViewport(range, scrollType);\n    }\n    revealRangeAtTop(range, scrollType = 0 /* ScrollType.Smooth */) {\n        this._targetEditor.revealRangeAtTop(range, scrollType);\n    }\n    getSupportedActions() {\n        return this._targetEditor.getSupportedActions();\n    }\n    focus() {\n        this._targetEditor.focus();\n    }\n    trigger(source, handlerId, payload) {\n        this._targetEditor.trigger(source, handlerId, payload);\n    }\n    createDecorationsCollection(decorations) {\n        return this._targetEditor.createDecorationsCollection(decorations);\n    }\n    changeDecorations(callback) {\n        return this._targetEditor.changeDecorations(callback);\n    }\n}\n\nexport { DelegatingEditor };\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 *--------------------------------------------------------------------------------------------*/\nconst diffEditorDefaultOptions = {\n    enableSplitViewResizing: true,\n    renderSideBySide: true,\n    renderMarginRevertIcon: true,\n    renderGutterMenu: true,\n    maxComputationTime: 5000,\n    maxFileSize: 50,\n    ignoreTrimWhitespace: true,\n    renderIndicators: true,\n    originalEditable: false,\n    diffCodeLens: false,\n    renderOverviewRuler: true,\n    diffWordWrap: 'inherit',\n    diffAlgorithm: 'advanced',\n    accessibilityVerbose: false,\n    experimental: {\n        showMoves: false,\n        showEmptyDecorations: true,\n        useTrueInlineView: false,\n    },\n    hideUnchangedRegions: {\n        enabled: false,\n        contextLineCount: 3,\n        minimumLineCount: 3,\n        revealLineCount: 20,\n    },\n    isInEmbeddedEditor: false,\n    onlyShowAccessibleDiffViewer: false,\n    renderSideBySideInlineBreakpoint: 900,\n    useInlineViewWhenSpaceIsLimited: true,\n    compactMode: false,\n};\n\nexport { diffEditorDefaultOptions };\n","import { derivedObservableWithCache } from '../utils/utils.js';\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/**\n * Works like a derived.\n * However, if the value is not undefined, it is cached and will not be recomputed anymore.\n * In that case, the derived will unsubscribe from its dependencies.\n*/\nfunction derivedConstOnceDefined(owner, fn) {\n    return derivedObservableWithCache(owner, (reader, lastValue) => lastValue ?? fn(reader));\n}\n\nexport { derivedConstOnceDefined };\n","import '../../../../base/common/observableInternal/index.js';\nimport { IAccessibilityService } from '../../../../platform/accessibility/common/accessibility.js';\nimport { diffEditorDefaultOptions } from '../../../common/config/diffEditor.js';\nimport { boolean, clampedInt, stringSet, clampedFloat } from '../../../common/config/editorOptions.js';\nimport { allowsTrueInlineDiffRendering } from './components/diffEditorViewZones/diffEditorViewZones.js';\nimport { derivedConstOnceDefined } from '../../../../base/common/observableInternal/experimental/utils.js';\nimport { observableValue } from '../../../../base/common/observableInternal/observables/observableValue.js';\nimport { observableFromEvent } from '../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { derived } from '../../../../base/common/observableInternal/observables/derived.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet DiffEditorOptions = class DiffEditorOptions {\n    get editorOptions() { return this._options; }\n    constructor(options, _accessibilityService) {\n        this._accessibilityService = _accessibilityService;\n        this._diffEditorWidth = observableValue(this, 0);\n        this._screenReaderMode = observableFromEvent(this, this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized());\n        this.couldShowInlineViewBecauseOfSize = derived(this, reader => this._options.read(reader).renderSideBySide && this._diffEditorWidth.read(reader) <= this._options.read(reader).renderSideBySideInlineBreakpoint);\n        this.renderOverviewRuler = derived(this, reader => this._options.read(reader).renderOverviewRuler);\n        this.renderSideBySide = derived(this, reader => {\n            if (this.compactMode.read(reader)) {\n                if (this.shouldRenderInlineViewInSmartMode.read(reader)) {\n                    return false;\n                }\n            }\n            return this._options.read(reader).renderSideBySide\n                && !(this._options.read(reader).useInlineViewWhenSpaceIsLimited && this.couldShowInlineViewBecauseOfSize.read(reader) && !this._screenReaderMode.read(reader));\n        });\n        this.readOnly = derived(this, reader => this._options.read(reader).readOnly);\n        this.shouldRenderOldRevertArrows = derived(this, reader => {\n            if (!this._options.read(reader).renderMarginRevertIcon) {\n                return false;\n            }\n            if (!this.renderSideBySide.read(reader)) {\n                return false;\n            }\n            if (this.readOnly.read(reader)) {\n                return false;\n            }\n            if (this.shouldRenderGutterMenu.read(reader)) {\n                return false;\n            }\n            return true;\n        });\n        this.shouldRenderGutterMenu = derived(this, reader => this._options.read(reader).renderGutterMenu);\n        this.renderIndicators = derived(this, reader => this._options.read(reader).renderIndicators);\n        this.enableSplitViewResizing = derived(this, reader => this._options.read(reader).enableSplitViewResizing);\n        this.splitViewDefaultRatio = derived(this, reader => this._options.read(reader).splitViewDefaultRatio);\n        this.ignoreTrimWhitespace = derived(this, reader => this._options.read(reader).ignoreTrimWhitespace);\n        this.maxComputationTimeMs = derived(this, reader => this._options.read(reader).maxComputationTime);\n        this.showMoves = derived(this, reader => this._options.read(reader).experimental.showMoves && this.renderSideBySide.read(reader));\n        this.isInEmbeddedEditor = derived(this, reader => this._options.read(reader).isInEmbeddedEditor);\n        this.diffWordWrap = derived(this, reader => this._options.read(reader).diffWordWrap);\n        this.originalEditable = derived(this, reader => this._options.read(reader).originalEditable);\n        this.diffCodeLens = derived(this, reader => this._options.read(reader).diffCodeLens);\n        this.accessibilityVerbose = derived(this, reader => this._options.read(reader).accessibilityVerbose);\n        this.diffAlgorithm = derived(this, reader => this._options.read(reader).diffAlgorithm);\n        this.showEmptyDecorations = derived(this, reader => this._options.read(reader).experimental.showEmptyDecorations);\n        this.onlyShowAccessibleDiffViewer = derived(this, reader => this._options.read(reader).onlyShowAccessibleDiffViewer);\n        this.compactMode = derived(this, reader => this._options.read(reader).compactMode);\n        this.trueInlineDiffRenderingEnabled = derived(this, reader => this._options.read(reader).experimental.useTrueInlineView);\n        this.useTrueInlineDiffRendering = derived(this, reader => !this.renderSideBySide.read(reader) && this.trueInlineDiffRenderingEnabled.read(reader));\n        this.hideUnchangedRegions = derived(this, reader => this._options.read(reader).hideUnchangedRegions.enabled);\n        this.hideUnchangedRegionsRevealLineCount = derived(this, reader => this._options.read(reader).hideUnchangedRegions.revealLineCount);\n        this.hideUnchangedRegionsContextLineCount = derived(this, reader => this._options.read(reader).hideUnchangedRegions.contextLineCount);\n        this.hideUnchangedRegionsMinimumLineCount = derived(this, reader => this._options.read(reader).hideUnchangedRegions.minimumLineCount);\n        this._model = observableValue(this, undefined);\n        this.shouldRenderInlineViewInSmartMode = this._model\n            .map(this, model => derivedConstOnceDefined(this, reader => {\n            const diffs = model?.diff.read(reader);\n            return diffs ? isSimpleDiff(diffs, this.trueInlineDiffRenderingEnabled.read(reader)) : undefined;\n        }))\n            .flatten()\n            .map(this, v => !!v);\n        this.inlineViewHideOriginalLineNumbers = this.compactMode;\n        const optionsCopy = { ...options, ...validateDiffEditorOptions(options, diffEditorDefaultOptions) };\n        this._options = observableValue(this, optionsCopy);\n    }\n    updateOptions(changedOptions) {\n        const newDiffEditorOptions = validateDiffEditorOptions(changedOptions, this._options.get());\n        const newOptions = { ...this._options.get(), ...changedOptions, ...newDiffEditorOptions };\n        this._options.set(newOptions, undefined, { changedOptions: changedOptions });\n    }\n    setWidth(width) {\n        this._diffEditorWidth.set(width, undefined);\n    }\n    setModel(model) {\n        this._model.set(model, undefined);\n    }\n};\nDiffEditorOptions = __decorate([\n    __param(1, IAccessibilityService)\n], DiffEditorOptions);\nfunction isSimpleDiff(diff, supportsTrueDiffRendering) {\n    return diff.mappings.every(m => isInsertion(m.lineRangeMapping) || isDeletion(m.lineRangeMapping) || (supportsTrueDiffRendering && allowsTrueInlineDiffRendering(m.lineRangeMapping)));\n}\nfunction isInsertion(mapping) {\n    return mapping.original.length === 0;\n}\nfunction isDeletion(mapping) {\n    return mapping.modified.length === 0;\n}\nfunction validateDiffEditorOptions(options, defaults) {\n    return {\n        enableSplitViewResizing: boolean(options.enableSplitViewResizing, defaults.enableSplitViewResizing),\n        splitViewDefaultRatio: clampedFloat(options.splitViewDefaultRatio, 0.5, 0.1, 0.9),\n        renderSideBySide: boolean(options.renderSideBySide, defaults.renderSideBySide),\n        renderMarginRevertIcon: boolean(options.renderMarginRevertIcon, defaults.renderMarginRevertIcon),\n        maxComputationTime: clampedInt(options.maxComputationTime, defaults.maxComputationTime, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */),\n        maxFileSize: clampedInt(options.maxFileSize, defaults.maxFileSize, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */),\n        ignoreTrimWhitespace: boolean(options.ignoreTrimWhitespace, defaults.ignoreTrimWhitespace),\n        renderIndicators: boolean(options.renderIndicators, defaults.renderIndicators),\n        originalEditable: boolean(options.originalEditable, defaults.originalEditable),\n        diffCodeLens: boolean(options.diffCodeLens, defaults.diffCodeLens),\n        renderOverviewRuler: boolean(options.renderOverviewRuler, defaults.renderOverviewRuler),\n        diffWordWrap: stringSet(options.diffWordWrap, defaults.diffWordWrap, ['off', 'on', 'inherit']),\n        diffAlgorithm: stringSet(options.diffAlgorithm, defaults.diffAlgorithm, ['legacy', 'advanced'], { 'smart': 'legacy', 'experimental': 'advanced' }),\n        accessibilityVerbose: boolean(options.accessibilityVerbose, defaults.accessibilityVerbose),\n        experimental: {\n            showMoves: boolean(options.experimental?.showMoves, defaults.experimental.showMoves),\n            showEmptyDecorations: boolean(options.experimental?.showEmptyDecorations, defaults.experimental.showEmptyDecorations),\n            useTrueInlineView: boolean(options.experimental?.useTrueInlineView, defaults.experimental.useTrueInlineView),\n        },\n        hideUnchangedRegions: {\n            // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n            enabled: boolean(options.hideUnchangedRegions?.enabled ?? options.experimental?.collapseUnchangedRegions, defaults.hideUnchangedRegions.enabled),\n            contextLineCount: clampedInt(options.hideUnchangedRegions?.contextLineCount, defaults.hideUnchangedRegions.contextLineCount, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */),\n            minimumLineCount: clampedInt(options.hideUnchangedRegions?.minimumLineCount, defaults.hideUnchangedRegions.minimumLineCount, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */),\n            revealLineCount: clampedInt(options.hideUnchangedRegions?.revealLineCount, defaults.hideUnchangedRegions.revealLineCount, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */),\n        },\n        isInEmbeddedEditor: boolean(options.isInEmbeddedEditor, defaults.isInEmbeddedEditor),\n        onlyShowAccessibleDiffViewer: boolean(options.onlyShowAccessibleDiffViewer, defaults.onlyShowAccessibleDiffViewer),\n        renderSideBySideInlineBreakpoint: clampedInt(options.renderSideBySideInlineBreakpoint, defaults.renderSideBySideInlineBreakpoint, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */),\n        useInlineViewWhenSpaceIsLimited: boolean(options.useInlineViewWhenSpaceIsLimited, defaults.useInlineViewWhenSpaceIsLimited),\n        renderGutterMenu: boolean(options.renderGutterMenu, defaults.renderGutterMenu),\n        compactMode: boolean(options.compactMode, defaults.compactMode),\n    };\n}\n\nexport { DiffEditorOptions };\n","import { append, $, EventType, addDisposableListener, EventHelper, isMouseEvent } from '../../dom.js';\nimport { StandardKeyboardEvent } from '../../keyboardEvent.js';\nimport { EventType as EventType$1, Gesture } from '../../touch.js';\nimport { ActionRunner } from '../../../common/actions.js';\nimport { Emitter } from '../../../common/event.js';\nimport './dropdown.css';\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 *--------------------------------------------------------------------------------------------*/\nclass BaseDropdown extends ActionRunner {\n    constructor(container, options) {\n        super();\n        this._onDidChangeVisibility = this._register(new Emitter());\n        this.onDidChangeVisibility = this._onDidChangeVisibility.event;\n        this._element = append(container, $('.monaco-dropdown'));\n        this._label = append(this._element, $('.dropdown-label'));\n        let labelRenderer = options.labelRenderer;\n        if (!labelRenderer) {\n            labelRenderer = (container) => {\n                container.textContent = options.label || '';\n                return null;\n            };\n        }\n        for (const event of [EventType.CLICK, EventType.MOUSE_DOWN, EventType$1.Tap]) {\n            this._register(addDisposableListener(this.element, event, e => EventHelper.stop(e, true))); // prevent default click behaviour to trigger\n        }\n        for (const event of [EventType.MOUSE_DOWN, EventType$1.Tap]) {\n            this._register(addDisposableListener(this._label, event, e => {\n                if (isMouseEvent(e) && e.button !== 0) {\n                    // prevent right click trigger to allow separate context menu (https://github.com/microsoft/vscode/issues/151064)\n                    return;\n                }\n                if (this.visible) {\n                    this.hide();\n                }\n                else {\n                    this.show();\n                }\n            }));\n        }\n        this._register(addDisposableListener(this._label, EventType.KEY_DOWN, e => {\n            const event = new StandardKeyboardEvent(e);\n            if (event.equals(3 /* KeyCode.Enter */) || event.equals(10 /* KeyCode.Space */)) {\n                EventHelper.stop(e, true); // https://github.com/microsoft/vscode/issues/57997\n                if (this.visible) {\n                    this.hide();\n                }\n                else {\n                    this.show();\n                }\n            }\n        }));\n        const cleanupFn = labelRenderer(this._label);\n        if (cleanupFn) {\n            this._register(cleanupFn);\n        }\n        this._register(Gesture.addTarget(this._label));\n    }\n    get element() {\n        return this._element;\n    }\n    show() {\n        if (!this.visible) {\n            this.visible = true;\n            this._onDidChangeVisibility.fire(true);\n        }\n    }\n    hide() {\n        if (this.visible) {\n            this.visible = false;\n            this._onDidChangeVisibility.fire(false);\n        }\n    }\n    dispose() {\n        super.dispose();\n        this.hide();\n        if (this.boxContainer) {\n            this.boxContainer.remove();\n            this.boxContainer = undefined;\n        }\n        if (this.contents) {\n            this.contents.remove();\n            this.contents = undefined;\n        }\n        if (this._label) {\n            this._label.remove();\n            this._label = undefined;\n        }\n    }\n}\nclass DropdownMenu extends BaseDropdown {\n    constructor(container, _options) {\n        super(container, _options);\n        this._options = _options;\n        this._actions = [];\n        this.actions = _options.actions || [];\n    }\n    set menuOptions(options) {\n        this._menuOptions = options;\n    }\n    get menuOptions() {\n        return this._menuOptions;\n    }\n    get actions() {\n        if (this._options.actionProvider) {\n            return this._options.actionProvider.getActions();\n        }\n        return this._actions;\n    }\n    set actions(actions) {\n        this._actions = actions;\n    }\n    show() {\n        super.show();\n        this.element.classList.add('active');\n        this._options.contextMenuProvider.showContextMenu({\n            getAnchor: () => this.element,\n            getActions: () => this.actions,\n            getActionsContext: () => this.menuOptions ? this.menuOptions.context : null,\n            getActionViewItem: (action, options) => this.menuOptions && this.menuOptions.actionViewItemProvider ? this.menuOptions.actionViewItemProvider(action, options) : undefined,\n            getKeyBinding: action => this.menuOptions && this.menuOptions.getKeyBinding ? this.menuOptions.getKeyBinding(action) : undefined,\n            getMenuClassName: () => this._options.menuClassName || '',\n            onHide: () => this.onHide(),\n            actionRunner: this.menuOptions ? this.menuOptions.actionRunner : undefined,\n            anchorAlignment: this.menuOptions ? this.menuOptions.anchorAlignment : 0 /* AnchorAlignment.LEFT */,\n            domForShadowRoot: this._options.menuAsChild ? this.element : undefined,\n            skipTelemetry: this._options.skipTelemetry\n        });\n    }\n    hide() {\n        super.hide();\n    }\n    onHide() {\n        this.hide();\n        this.element.classList.remove('active');\n    }\n}\n\nexport { BaseDropdown, DropdownMenu };\n","import { Emitter } from '../../../common/event.js';\nimport { append, $ } from '../../dom.js';\nimport { BaseActionViewItem } from '../actionbar/actionViewItems.js';\nimport { getBaseLayerHoverDelegate } from '../hover/hoverDelegate2.js';\nimport { getDefaultHoverDelegate } from '../hover/hoverDelegateFactory.js';\nimport './dropdown.css';\nimport { DropdownMenu } from './dropdown.js';\n\nclass DropdownMenuActionViewItem extends BaseActionViewItem {\n    get onDidChangeVisibility() { return this._onDidChangeVisibility.event; }\n    constructor(action, menuActionsOrProvider, contextMenuProvider, options = Object.create(null)) {\n        super(null, action, options);\n        this.actionItem = null;\n        this._onDidChangeVisibility = this._register(new Emitter());\n        this.menuActionsOrProvider = menuActionsOrProvider;\n        this.contextMenuProvider = contextMenuProvider;\n        this.options = options;\n        if (this.options.actionRunner) {\n            this.actionRunner = this.options.actionRunner;\n        }\n    }\n    render(container) {\n        this.actionItem = container;\n        const labelRenderer = (el) => {\n            this.element = append(el, $('a.action-label'));\n            return this.renderLabel(this.element);\n        };\n        const isActionsArray = Array.isArray(this.menuActionsOrProvider);\n        const options = {\n            contextMenuProvider: this.contextMenuProvider,\n            labelRenderer: labelRenderer,\n            menuAsChild: this.options.menuAsChild,\n            actions: isActionsArray ? this.menuActionsOrProvider : undefined,\n            actionProvider: isActionsArray ? undefined : this.menuActionsOrProvider,\n            skipTelemetry: this.options.skipTelemetry\n        };\n        this.dropdownMenu = this._register(new DropdownMenu(container, options));\n        this._register(this.dropdownMenu.onDidChangeVisibility(visible => {\n            this.element?.setAttribute('aria-expanded', `${visible}`);\n            this._onDidChangeVisibility.fire(visible);\n        }));\n        this.dropdownMenu.menuOptions = {\n            actionViewItemProvider: this.options.actionViewItemProvider,\n            actionRunner: this.actionRunner,\n            getKeyBinding: this.options.keybindingProvider,\n            context: this._context\n        };\n        if (this.options.anchorAlignmentProvider) {\n            const that = this;\n            this.dropdownMenu.menuOptions = {\n                ...this.dropdownMenu.menuOptions,\n                get anchorAlignment() {\n                    return that.options.anchorAlignmentProvider();\n                }\n            };\n        }\n        this.updateTooltip();\n        this.updateEnabled();\n    }\n    renderLabel(element) {\n        let classNames = [];\n        if (typeof this.options.classNames === 'string') {\n            classNames = this.options.classNames.split(/\\s+/g).filter(s => !!s);\n        }\n        else if (this.options.classNames) {\n            classNames = this.options.classNames;\n        }\n        // todo@aeschli: remove codicon, should come through `this.options.classNames`\n        if (!classNames.find(c => c === 'icon')) {\n            classNames.push('codicon');\n        }\n        element.classList.add(...classNames);\n        if (this._action.label) {\n            this._register(getBaseLayerHoverDelegate().setupManagedHover(this.options.hoverDelegate ?? getDefaultHoverDelegate('mouse'), element, this._action.label));\n        }\n        return null;\n    }\n    getTooltip() {\n        let title = null;\n        if (this.action.tooltip) {\n            title = this.action.tooltip;\n        }\n        else if (this.action.label) {\n            title = this.action.label;\n        }\n        return title ?? undefined;\n    }\n    setActionContext(newContext) {\n        super.setActionContext(newContext);\n        if (this.dropdownMenu) {\n            if (this.dropdownMenu.menuOptions) {\n                this.dropdownMenu.menuOptions.context = newContext;\n            }\n            else {\n                this.dropdownMenu.menuOptions = { context: newContext };\n            }\n        }\n    }\n    show() {\n        this.dropdownMenu?.show();\n    }\n    updateEnabled() {\n        const disabled = !this.action.enabled;\n        this.actionItem?.classList.toggle('disabled', disabled);\n        this.element?.classList.toggle('disabled', disabled);\n    }\n}\n\nexport { DropdownMenuActionViewItem };\n","import { ActionBar } from '../actionbar/actionbar.js';\nimport { DropdownMenuActionViewItem } from '../dropdown/dropdownActionViewItem.js';\nimport { Action, SubmenuAction, Separator } from '../../../common/actions.js';\nimport { Codicon } from '../../../common/codicons.js';\nimport { ThemeIcon } from '../../../common/themables.js';\nimport { EventMultiplexer } from '../../../common/event.js';\nimport { Disposable, DisposableStore, toDisposable } from '../../../common/lifecycle.js';\nimport './toolbar.css';\nimport { localize } from '../../../../nls.js';\nimport { createInstantHoverDelegate } from '../hover/hoverDelegateFactory.js';\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 *--------------------------------------------------------------------------------------------*/\nconst ACTION_MIN_WIDTH = 24; /* 20px codicon + 4px left padding*/\n/**\n * A widget that combines an action bar for primary actions and a dropdown for secondary actions.\n */\nclass ToolBar extends Disposable {\n    get onDidChangeDropdownVisibility() { return this._onDidChangeDropdownVisibility.event; }\n    constructor(container, contextMenuProvider, options = { orientation: 0 /* ActionsOrientation.HORIZONTAL */ }) {\n        super();\n        this.submenuActionViewItems = [];\n        this.hasSecondaryActions = false;\n        this._onDidChangeDropdownVisibility = this._register(new EventMultiplexer());\n        this.originalPrimaryActions = [];\n        this.originalSecondaryActions = [];\n        this.hiddenActions = [];\n        this.disposables = this._register(new DisposableStore());\n        options.hoverDelegate = options.hoverDelegate ?? this._register(createInstantHoverDelegate());\n        this.options = options;\n        this.toggleMenuAction = this._register(new ToggleMenuAction(() => this.toggleMenuActionViewItem?.show(), options.toggleMenuTitle));\n        this.element = document.createElement('div');\n        this.element.className = 'monaco-toolbar';\n        container.appendChild(this.element);\n        this.actionBar = this._register(new ActionBar(this.element, {\n            orientation: options.orientation,\n            ariaLabel: options.ariaLabel,\n            actionRunner: options.actionRunner,\n            allowContextMenu: options.allowContextMenu,\n            highlightToggledItems: options.highlightToggledItems,\n            hoverDelegate: options.hoverDelegate,\n            actionViewItemProvider: (action, viewItemOptions) => {\n                if (action.id === ToggleMenuAction.ID) {\n                    this.toggleMenuActionViewItem = new DropdownMenuActionViewItem(action, { getActions: () => this.toggleMenuAction.menuActions }, contextMenuProvider, {\n                        actionViewItemProvider: this.options.actionViewItemProvider,\n                        actionRunner: this.actionRunner,\n                        keybindingProvider: this.options.getKeyBinding,\n                        classNames: ThemeIcon.asClassNameArray(options.moreIcon ?? Codicon.toolBarMore),\n                        anchorAlignmentProvider: this.options.anchorAlignmentProvider,\n                        menuAsChild: !!this.options.renderDropdownAsChildElement,\n                        skipTelemetry: this.options.skipTelemetry,\n                        isMenu: true,\n                        hoverDelegate: this.options.hoverDelegate\n                    });\n                    this.toggleMenuActionViewItem.setActionContext(this.actionBar.context);\n                    this.disposables.add(this._onDidChangeDropdownVisibility.add(this.toggleMenuActionViewItem.onDidChangeVisibility));\n                    return this.toggleMenuActionViewItem;\n                }\n                if (options.actionViewItemProvider) {\n                    const result = options.actionViewItemProvider(action, viewItemOptions);\n                    if (result) {\n                        return result;\n                    }\n                }\n                if (action instanceof SubmenuAction) {\n                    const result = new DropdownMenuActionViewItem(action, action.actions, contextMenuProvider, {\n                        actionViewItemProvider: this.options.actionViewItemProvider,\n                        actionRunner: this.actionRunner,\n                        keybindingProvider: this.options.getKeyBinding,\n                        classNames: action.class,\n                        anchorAlignmentProvider: this.options.anchorAlignmentProvider,\n                        menuAsChild: !!this.options.renderDropdownAsChildElement,\n                        skipTelemetry: this.options.skipTelemetry,\n                        hoverDelegate: this.options.hoverDelegate\n                    });\n                    result.setActionContext(this.actionBar.context);\n                    this.submenuActionViewItems.push(result);\n                    this.disposables.add(this._onDidChangeDropdownVisibility.add(result.onDidChangeVisibility));\n                    return result;\n                }\n                return undefined;\n            }\n        }));\n        // Responsive support\n        if (this.options.responsive) {\n            this.element.classList.add('responsive');\n            const observer = new ResizeObserver(() => {\n                this.setToolbarMaxWidth(this.element.getBoundingClientRect().width);\n            });\n            observer.observe(this.element);\n            this._store.add(toDisposable(() => observer.disconnect()));\n        }\n    }\n    set actionRunner(actionRunner) {\n        this.actionBar.actionRunner = actionRunner;\n    }\n    get actionRunner() {\n        return this.actionBar.actionRunner;\n    }\n    set context(context) {\n        this.actionBar.context = context;\n        this.toggleMenuActionViewItem?.setActionContext(context);\n        for (const actionViewItem of this.submenuActionViewItems) {\n            actionViewItem.setActionContext(context);\n        }\n    }\n    getElement() {\n        return this.element;\n    }\n    getItemAction(indexOrElement) {\n        return this.actionBar.getAction(indexOrElement);\n    }\n    getItemWidth(index) {\n        return this.actionBar.getWidth(index);\n    }\n    setActions(primaryActions, secondaryActions) {\n        this.clear();\n        // Store primary and secondary actions as rendered initially\n        this.originalPrimaryActions = primaryActions ? primaryActions.slice(0) : [];\n        this.originalSecondaryActions = secondaryActions ? secondaryActions.slice(0) : [];\n        const primaryActionsToSet = primaryActions ? primaryActions.slice(0) : [];\n        // Inject additional action to open secondary actions if present\n        this.hasSecondaryActions = !!(secondaryActions && secondaryActions.length > 0);\n        if (this.hasSecondaryActions && secondaryActions) {\n            this.toggleMenuAction.menuActions = secondaryActions.slice(0);\n            primaryActionsToSet.push(this.toggleMenuAction);\n        }\n        if (primaryActionsToSet.length > 0 && this.options.trailingSeparator) {\n            primaryActionsToSet.push(new Separator());\n        }\n        primaryActionsToSet.forEach(action => {\n            this.actionBar.push(action, { icon: this.options.icon ?? true, label: this.options.label ?? false, keybinding: this.getKeybindingLabel(action) });\n        });\n        if (this.options.responsive) {\n            // Reset hidden actions\n            this.hiddenActions.length = 0;\n            // Update toolbar to fit with container width\n            this.setToolbarMaxWidth(this.element.getBoundingClientRect().width);\n        }\n    }\n    getKeybindingLabel(action) {\n        const key = this.options.getKeyBinding?.(action);\n        return key?.getLabel() ?? undefined;\n    }\n    getItemsWidthResponsive() {\n        // Each action is assumed to have a minimum width so that actions with a label\n        // can shrink to the action's minimum width. We do this so that action visibility\n        // takes precedence over the action label.\n        return this.actionBar.length() * ACTION_MIN_WIDTH;\n    }\n    setToolbarMaxWidth(maxWidth) {\n        if (this.actionBar.isEmpty() ||\n            (this.getItemsWidthResponsive() <= maxWidth && this.hiddenActions.length === 0)) {\n            return;\n        }\n        if (this.getItemsWidthResponsive() > maxWidth) {\n            // Hide actions from the right\n            while (this.getItemsWidthResponsive() > maxWidth && this.actionBar.length() > 0) {\n                const index = this.originalPrimaryActions.length - this.hiddenActions.length - 1;\n                if (index < 0) {\n                    break;\n                }\n                // Store the action and its size\n                const size = Math.min(ACTION_MIN_WIDTH, this.getItemWidth(index));\n                const action = this.originalPrimaryActions[index];\n                this.hiddenActions.unshift({ action, size });\n                // Remove the action\n                this.actionBar.pull(index);\n                // There are no secondary actions, but we have actions that we need to hide so we\n                // create the overflow menu. This will ensure that another primary action will be\n                // removed making space for the overflow menu.\n                if (this.originalSecondaryActions.length === 0 && this.hiddenActions.length === 1) {\n                    this.actionBar.push(this.toggleMenuAction, {\n                        icon: this.options.icon ?? true,\n                        label: this.options.label ?? false,\n                        keybinding: this.getKeybindingLabel(this.toggleMenuAction),\n                    });\n                }\n            }\n        }\n        else {\n            // Show actions from the top of the toggle menu\n            while (this.hiddenActions.length > 0) {\n                const entry = this.hiddenActions.shift();\n                if (this.getItemsWidthResponsive() + entry.size > maxWidth) {\n                    // Not enough space to show the action\n                    this.hiddenActions.unshift(entry);\n                    break;\n                }\n                // Add the action\n                this.actionBar.push(entry.action, {\n                    icon: this.options.icon ?? true,\n                    label: this.options.label ?? false,\n                    keybinding: this.getKeybindingLabel(entry.action),\n                    index: this.originalPrimaryActions.length - this.hiddenActions.length - 1\n                });\n                // There are no secondary actions, and there is only one hidden item left so we\n                // remove the overflow menu making space for the last hidden action to be shown.\n                if (this.originalSecondaryActions.length === 0 && this.hiddenActions.length === 1) {\n                    this.toggleMenuAction.menuActions = [];\n                    this.actionBar.pull(this.actionBar.length() - 1);\n                }\n            }\n        }\n        // Update overflow menu\n        const hiddenActions = this.hiddenActions.map(entry => entry.action);\n        if (this.originalSecondaryActions.length > 0 || hiddenActions.length > 0) {\n            const secondaryActions = this.originalSecondaryActions.slice(0);\n            this.toggleMenuAction.menuActions = Separator.join(hiddenActions, secondaryActions);\n        }\n    }\n    clear() {\n        this.submenuActionViewItems = [];\n        this.disposables.clear();\n        this.actionBar.clear();\n    }\n    dispose() {\n        this.clear();\n        this.disposables.dispose();\n        super.dispose();\n    }\n}\nclass ToggleMenuAction extends Action {\n    static { this.ID = 'toolbar.toggle.more'; }\n    constructor(toggleDropdownMenu, title) {\n        title = title || localize(17, \"More Actions...\");\n        super(ToggleMenuAction.ID, title, undefined, true);\n        this._menuActions = [];\n        this.toggleDropdownMenu = toggleDropdownMenu;\n    }\n    async run() {\n        this.toggleDropdownMenu();\n    }\n    get menuActions() {\n        return this._menuActions;\n    }\n    set menuActions(actions) {\n        this._menuActions = actions;\n    }\n}\n\nexport { ToggleMenuAction, ToolBar };\n","import { localize } from '../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ModifierLabelProvider {\n    constructor(mac, windows, linux = windows) {\n        this.modifierLabels = [null]; // index 0 will never me accessed.\n        this.modifierLabels[2 /* OperatingSystem.Macintosh */] = mac;\n        this.modifierLabels[1 /* OperatingSystem.Windows */] = windows;\n        this.modifierLabels[3 /* OperatingSystem.Linux */] = linux;\n    }\n    toLabel(OS, chords, keyLabelProvider) {\n        if (chords.length === 0) {\n            return null;\n        }\n        const result = [];\n        for (let i = 0, len = chords.length; i < len; i++) {\n            const chord = chords[i];\n            const keyLabel = keyLabelProvider(chord);\n            if (keyLabel === null) {\n                // this keybinding cannot be expressed...\n                return null;\n            }\n            result[i] = _simpleAsString(chord, keyLabel, this.modifierLabels[OS]);\n        }\n        return result.join(' ');\n    }\n}\n/**\n * A label provider that prints modifiers in a suitable format for displaying in the UI.\n */\nconst UILabelProvider = new ModifierLabelProvider({\n    ctrlKey: '\\u2303',\n    shiftKey: '⇧',\n    altKey: '⌥',\n    metaKey: '⌘',\n    separator: '',\n}, {\n    ctrlKey: localize(35, \"Ctrl\"),\n    shiftKey: localize(36, \"Shift\"),\n    altKey: localize(37, \"Alt\"),\n    metaKey: localize(38, \"Windows\"),\n    separator: '+',\n}, {\n    ctrlKey: localize(39, \"Ctrl\"),\n    shiftKey: localize(40, \"Shift\"),\n    altKey: localize(41, \"Alt\"),\n    metaKey: localize(42, \"Super\"),\n    separator: '+',\n});\n/**\n * A label provider that prints modifiers in a suitable format for ARIA.\n */\nconst AriaLabelProvider = new ModifierLabelProvider({\n    ctrlKey: localize(43, \"Control\"),\n    shiftKey: localize(44, \"Shift\"),\n    altKey: localize(45, \"Option\"),\n    metaKey: localize(46, \"Command\"),\n    separator: '+',\n}, {\n    ctrlKey: localize(47, \"Control\"),\n    shiftKey: localize(48, \"Shift\"),\n    altKey: localize(49, \"Alt\"),\n    metaKey: localize(50, \"Windows\"),\n    separator: '+',\n}, {\n    ctrlKey: localize(51, \"Control\"),\n    shiftKey: localize(52, \"Shift\"),\n    altKey: localize(53, \"Alt\"),\n    metaKey: localize(54, \"Super\"),\n    separator: '+',\n});\n/**\n * A label provider that prints modifiers in a suitable format for Electron Accelerators.\n * See https://github.com/electron/electron/blob/master/docs/api/accelerator.md\n */\nconst ElectronAcceleratorLabelProvider = new ModifierLabelProvider({\n    ctrlKey: 'Ctrl',\n    shiftKey: 'Shift',\n    altKey: 'Alt',\n    metaKey: 'Cmd',\n    separator: '+',\n}, {\n    ctrlKey: 'Ctrl',\n    shiftKey: 'Shift',\n    altKey: 'Alt',\n    metaKey: 'Super',\n    separator: '+',\n});\n/**\n * A label provider that prints modifiers in a suitable format for user settings.\n */\nconst UserSettingsLabelProvider = new ModifierLabelProvider({\n    ctrlKey: 'ctrl',\n    shiftKey: 'shift',\n    altKey: 'alt',\n    metaKey: 'cmd',\n    separator: '+',\n}, {\n    ctrlKey: 'ctrl',\n    shiftKey: 'shift',\n    altKey: 'alt',\n    metaKey: 'win',\n    separator: '+',\n}, {\n    ctrlKey: 'ctrl',\n    shiftKey: 'shift',\n    altKey: 'alt',\n    metaKey: 'meta',\n    separator: '+',\n});\nfunction _simpleAsString(modifiers, key, labels) {\n    if (key === null) {\n        return '';\n    }\n    const result = [];\n    // translate modifier keys: Ctrl-Shift-Alt-Meta\n    if (modifiers.ctrlKey) {\n        result.push(labels.ctrlKey);\n    }\n    if (modifiers.shiftKey) {\n        result.push(labels.shiftKey);\n    }\n    if (modifiers.altKey) {\n        result.push(labels.altKey);\n    }\n    if (modifiers.metaKey) {\n        result.push(labels.metaKey);\n    }\n    // the actual key\n    if (key !== '') {\n        result.push(key);\n    }\n    return result.join(labels.separator);\n}\n\nexport { AriaLabelProvider, ElectronAcceleratorLabelProvider, ModifierLabelProvider, UILabelProvider, UserSettingsLabelProvider };\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 *--------------------------------------------------------------------------------------------*/\nfunction isLocalizedString(thing) {\n    return !!thing\n        && typeof thing === 'object'\n        && typeof thing.original === 'string'\n        && typeof thing.value === 'string';\n}\nfunction isICommandActionToggleInfo(thing) {\n    return thing ? thing.condition !== undefined : false;\n}\n\nexport { isICommandActionToggleInfo, isLocalizedString };\n","import { ThrottledDelayer } from '../../../common/async.js';\nimport { PauseableEmitter, Event } from '../../../common/event.js';\nimport { Disposable } from '../../../common/lifecycle.js';\nimport { stringify } from '../../../common/marshalling.js';\nimport { isUndefinedOrNull, isObject } from '../../../common/types.js';\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 *--------------------------------------------------------------------------------------------*/\nvar StorageHint;\n(function (StorageHint) {\n    // A hint to the storage that the storage\n    // does not exist on disk yet. This allows\n    // the storage library to improve startup\n    // time by not checking the storage for data.\n    StorageHint[StorageHint[\"STORAGE_DOES_NOT_EXIST\"] = 0] = \"STORAGE_DOES_NOT_EXIST\";\n    // A hint to the storage that the storage\n    // is backed by an in-memory storage.\n    StorageHint[StorageHint[\"STORAGE_IN_MEMORY\"] = 1] = \"STORAGE_IN_MEMORY\";\n})(StorageHint || (StorageHint = {}));\nvar StorageState;\n(function (StorageState) {\n    StorageState[StorageState[\"None\"] = 0] = \"None\";\n    StorageState[StorageState[\"Initialized\"] = 1] = \"Initialized\";\n    StorageState[StorageState[\"Closed\"] = 2] = \"Closed\";\n})(StorageState || (StorageState = {}));\nclass Storage extends Disposable {\n    static { this.DEFAULT_FLUSH_DELAY = 100; }\n    constructor(database, options = Object.create(null)) {\n        super();\n        this.database = database;\n        this.options = options;\n        this._onDidChangeStorage = this._register(new PauseableEmitter());\n        this.onDidChangeStorage = this._onDidChangeStorage.event;\n        this.state = StorageState.None;\n        this.cache = new Map();\n        this.flushDelayer = this._register(new ThrottledDelayer(Storage.DEFAULT_FLUSH_DELAY));\n        this.pendingDeletes = new Set();\n        this.pendingInserts = new Map();\n        this.pendingClose = undefined;\n        this.whenFlushedCallbacks = [];\n        this.registerListeners();\n    }\n    registerListeners() {\n        this._register(this.database.onDidChangeItemsExternal(e => this.onDidChangeItemsExternal(e)));\n    }\n    onDidChangeItemsExternal(e) {\n        this._onDidChangeStorage.pause();\n        try {\n            // items that change external require us to update our\n            // caches with the values. we just accept the value and\n            // emit an event if there is a change.\n            e.changed?.forEach((value, key) => this.acceptExternal(key, value));\n            e.deleted?.forEach(key => this.acceptExternal(key, undefined));\n        }\n        finally {\n            this._onDidChangeStorage.resume();\n        }\n    }\n    acceptExternal(key, value) {\n        if (this.state === StorageState.Closed) {\n            return; // Return early if we are already closed\n        }\n        let changed = false;\n        // Item got removed, check for deletion\n        if (isUndefinedOrNull(value)) {\n            changed = this.cache.delete(key);\n        }\n        // Item got updated, check for change\n        else {\n            const currentValue = this.cache.get(key);\n            if (currentValue !== value) {\n                this.cache.set(key, value);\n                changed = true;\n            }\n        }\n        // Signal to outside listeners\n        if (changed) {\n            this._onDidChangeStorage.fire({ key, external: true });\n        }\n    }\n    get(key, fallbackValue) {\n        const value = this.cache.get(key);\n        if (isUndefinedOrNull(value)) {\n            return fallbackValue;\n        }\n        return value;\n    }\n    getBoolean(key, fallbackValue) {\n        const value = this.get(key);\n        if (isUndefinedOrNull(value)) {\n            return fallbackValue;\n        }\n        return value === 'true';\n    }\n    getNumber(key, fallbackValue) {\n        const value = this.get(key);\n        if (isUndefinedOrNull(value)) {\n            return fallbackValue;\n        }\n        return parseInt(value, 10);\n    }\n    async set(key, value, external = false) {\n        if (this.state === StorageState.Closed) {\n            return; // Return early if we are already closed\n        }\n        // We remove the key for undefined/null values\n        if (isUndefinedOrNull(value)) {\n            return this.delete(key, external);\n        }\n        // Otherwise, convert to String and store\n        const valueStr = isObject(value) || Array.isArray(value) ? stringify(value) : String(value);\n        // Return early if value already set\n        const currentValue = this.cache.get(key);\n        if (currentValue === valueStr) {\n            return;\n        }\n        // Update in cache and pending\n        this.cache.set(key, valueStr);\n        this.pendingInserts.set(key, valueStr);\n        this.pendingDeletes.delete(key);\n        // Event\n        this._onDidChangeStorage.fire({ key, external });\n        // Accumulate work by scheduling after timeout\n        return this.doFlush();\n    }\n    async delete(key, external = false) {\n        if (this.state === StorageState.Closed) {\n            return; // Return early if we are already closed\n        }\n        // Remove from cache and add to pending\n        const wasDeleted = this.cache.delete(key);\n        if (!wasDeleted) {\n            return; // Return early if value already deleted\n        }\n        if (!this.pendingDeletes.has(key)) {\n            this.pendingDeletes.add(key);\n        }\n        this.pendingInserts.delete(key);\n        // Event\n        this._onDidChangeStorage.fire({ key, external });\n        // Accumulate work by scheduling after timeout\n        return this.doFlush();\n    }\n    get hasPending() {\n        return this.pendingInserts.size > 0 || this.pendingDeletes.size > 0;\n    }\n    async flushPending() {\n        if (!this.hasPending) {\n            return; // return early if nothing to do\n        }\n        // Get pending data\n        const updateRequest = { insert: this.pendingInserts, delete: this.pendingDeletes };\n        // Reset pending data for next run\n        this.pendingDeletes = new Set();\n        this.pendingInserts = new Map();\n        // Update in storage and release any\n        // waiters we have once done\n        return this.database.updateItems(updateRequest).finally(() => {\n            if (!this.hasPending) {\n                while (this.whenFlushedCallbacks.length) {\n                    this.whenFlushedCallbacks.pop()?.();\n                }\n            }\n        });\n    }\n    async flush(delay) {\n        if (this.state === StorageState.Closed || // Return early if we are already closed\n            this.pendingClose // return early if nothing to do\n        ) {\n            return;\n        }\n        return this.doFlush(delay);\n    }\n    async doFlush(delay) {\n        if (this.options.hint === StorageHint.STORAGE_IN_MEMORY) {\n            return this.flushPending(); // return early if in-memory\n        }\n        return this.flushDelayer.trigger(() => this.flushPending(), delay);\n    }\n    async whenFlushed() {\n        if (!this.hasPending) {\n            return; // return early if nothing to do\n        }\n        return new Promise(resolve => this.whenFlushedCallbacks.push(resolve));\n    }\n}\nclass InMemoryStorageDatabase {\n    constructor() {\n        this.onDidChangeItemsExternal = Event.None;\n        this.items = new Map();\n    }\n    async updateItems(request) {\n        request.insert?.forEach((value, key) => this.items.set(key, value));\n        request.delete?.forEach(key => this.items.delete(key));\n    }\n}\n\nexport { InMemoryStorageDatabase, Storage, StorageHint, StorageState };\n","import { RunOnceScheduler, runWhenGlobalIdle, Promises } from '../../../base/common/async.js';\nimport { PauseableEmitter, Emitter, Event } from '../../../base/common/event.js';\nimport { Disposable, MutableDisposable } from '../../../base/common/lifecycle.js';\nimport { isUndefinedOrNull } from '../../../base/common/types.js';\nimport { Storage, InMemoryStorageDatabase, StorageHint } from '../../../base/parts/storage/common/storage.js';\nimport { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst TARGET_KEY = '__$__targetStorageMarker';\nconst IStorageService = createDecorator('storageService');\nvar WillSaveStateReason;\n(function (WillSaveStateReason) {\n    /**\n     * No specific reason to save state.\n     */\n    WillSaveStateReason[WillSaveStateReason[\"NONE\"] = 0] = \"NONE\";\n    /**\n     * A hint that the workbench is about to shutdown.\n     */\n    WillSaveStateReason[WillSaveStateReason[\"SHUTDOWN\"] = 1] = \"SHUTDOWN\";\n})(WillSaveStateReason || (WillSaveStateReason = {}));\nfunction loadKeyTargets(storage) {\n    const keysRaw = storage.get(TARGET_KEY);\n    if (keysRaw) {\n        try {\n            return JSON.parse(keysRaw);\n        }\n        catch (error) {\n            // Fail gracefully\n        }\n    }\n    return Object.create(null);\n}\nclass AbstractStorageService extends Disposable {\n    static { this.DEFAULT_FLUSH_INTERVAL = 60 * 1000; } // every minute\n    constructor(options = { flushInterval: AbstractStorageService.DEFAULT_FLUSH_INTERVAL }) {\n        super();\n        this._onDidChangeValue = this._register(new PauseableEmitter());\n        this._onDidChangeTarget = this._register(new PauseableEmitter());\n        this._onWillSaveState = this._register(new Emitter());\n        this.onWillSaveState = this._onWillSaveState.event;\n        this.runFlushWhenIdle = this._register(new MutableDisposable());\n        this._workspaceKeyTargets = undefined;\n        this._profileKeyTargets = undefined;\n        this._applicationKeyTargets = undefined;\n        this.flushWhenIdleScheduler = this._register(new RunOnceScheduler(() => this.doFlushWhenIdle(), options.flushInterval));\n    }\n    onDidChangeValue(scope, key, disposable) {\n        return Event.filter(this._onDidChangeValue.event, e => e.scope === scope && (key === undefined || e.key === key), disposable);\n    }\n    doFlushWhenIdle() {\n        this.runFlushWhenIdle.value = runWhenGlobalIdle(() => {\n            if (this.shouldFlushWhenIdle()) {\n                this.flush();\n            }\n            // repeat\n            this.flushWhenIdleScheduler.schedule();\n        });\n    }\n    shouldFlushWhenIdle() {\n        return true;\n    }\n    emitDidChangeValue(scope, event) {\n        const { key, external } = event;\n        // Specially handle `TARGET_KEY`\n        if (key === TARGET_KEY) {\n            // Clear our cached version which is now out of date\n            switch (scope) {\n                case -1 /* StorageScope.APPLICATION */:\n                    this._applicationKeyTargets = undefined;\n                    break;\n                case 0 /* StorageScope.PROFILE */:\n                    this._profileKeyTargets = undefined;\n                    break;\n                case 1 /* StorageScope.WORKSPACE */:\n                    this._workspaceKeyTargets = undefined;\n                    break;\n            }\n            // Emit as `didChangeTarget` event\n            this._onDidChangeTarget.fire({ scope });\n        }\n        // Emit any other key to outside\n        else {\n            this._onDidChangeValue.fire({ scope, key, target: this.getKeyTargets(scope)[key], external });\n        }\n    }\n    get(key, scope, fallbackValue) {\n        return this.getStorage(scope)?.get(key, fallbackValue);\n    }\n    getBoolean(key, scope, fallbackValue) {\n        return this.getStorage(scope)?.getBoolean(key, fallbackValue);\n    }\n    getNumber(key, scope, fallbackValue) {\n        return this.getStorage(scope)?.getNumber(key, fallbackValue);\n    }\n    store(key, value, scope, target, external = false) {\n        // We remove the key for undefined/null values\n        if (isUndefinedOrNull(value)) {\n            this.remove(key, scope, external);\n            return;\n        }\n        // Update our datastructures but send events only after\n        this.withPausedEmitters(() => {\n            // Update key-target map\n            this.updateKeyTarget(key, scope, target);\n            // Store actual value\n            this.getStorage(scope)?.set(key, value, external);\n        });\n    }\n    remove(key, scope, external = false) {\n        // Update our datastructures but send events only after\n        this.withPausedEmitters(() => {\n            // Update key-target map\n            this.updateKeyTarget(key, scope, undefined);\n            // Remove actual key\n            this.getStorage(scope)?.delete(key, external);\n        });\n    }\n    withPausedEmitters(fn) {\n        // Pause emitters\n        this._onDidChangeValue.pause();\n        this._onDidChangeTarget.pause();\n        try {\n            fn();\n        }\n        finally {\n            // Resume emitters\n            this._onDidChangeValue.resume();\n            this._onDidChangeTarget.resume();\n        }\n    }\n    updateKeyTarget(key, scope, target, external = false) {\n        // Add\n        const keyTargets = this.getKeyTargets(scope);\n        if (typeof target === 'number') {\n            if (keyTargets[key] !== target) {\n                keyTargets[key] = target;\n                this.getStorage(scope)?.set(TARGET_KEY, JSON.stringify(keyTargets), external);\n            }\n        }\n        // Remove\n        else {\n            if (typeof keyTargets[key] === 'number') {\n                delete keyTargets[key];\n                this.getStorage(scope)?.set(TARGET_KEY, JSON.stringify(keyTargets), external);\n            }\n        }\n    }\n    get workspaceKeyTargets() {\n        if (!this._workspaceKeyTargets) {\n            this._workspaceKeyTargets = this.loadKeyTargets(1 /* StorageScope.WORKSPACE */);\n        }\n        return this._workspaceKeyTargets;\n    }\n    get profileKeyTargets() {\n        if (!this._profileKeyTargets) {\n            this._profileKeyTargets = this.loadKeyTargets(0 /* StorageScope.PROFILE */);\n        }\n        return this._profileKeyTargets;\n    }\n    get applicationKeyTargets() {\n        if (!this._applicationKeyTargets) {\n            this._applicationKeyTargets = this.loadKeyTargets(-1 /* StorageScope.APPLICATION */);\n        }\n        return this._applicationKeyTargets;\n    }\n    getKeyTargets(scope) {\n        switch (scope) {\n            case -1 /* StorageScope.APPLICATION */:\n                return this.applicationKeyTargets;\n            case 0 /* StorageScope.PROFILE */:\n                return this.profileKeyTargets;\n            default:\n                return this.workspaceKeyTargets;\n        }\n    }\n    loadKeyTargets(scope) {\n        const storage = this.getStorage(scope);\n        return storage ? loadKeyTargets(storage) : Object.create(null);\n    }\n    async flush(reason = WillSaveStateReason.NONE) {\n        // Signal event to collect changes\n        this._onWillSaveState.fire({ reason });\n        const applicationStorage = this.getStorage(-1 /* StorageScope.APPLICATION */);\n        const profileStorage = this.getStorage(0 /* StorageScope.PROFILE */);\n        const workspaceStorage = this.getStorage(1 /* StorageScope.WORKSPACE */);\n        switch (reason) {\n            // Unspecific reason: just wait when data is flushed\n            case WillSaveStateReason.NONE:\n                await Promises.settled([\n                    applicationStorage?.whenFlushed() ?? Promise.resolve(),\n                    profileStorage?.whenFlushed() ?? Promise.resolve(),\n                    workspaceStorage?.whenFlushed() ?? Promise.resolve()\n                ]);\n                break;\n            // Shutdown: we want to flush as soon as possible\n            // and not hit any delays that might be there\n            case WillSaveStateReason.SHUTDOWN:\n                await Promises.settled([\n                    applicationStorage?.flush(0) ?? Promise.resolve(),\n                    profileStorage?.flush(0) ?? Promise.resolve(),\n                    workspaceStorage?.flush(0) ?? Promise.resolve()\n                ]);\n                break;\n        }\n    }\n}\nclass InMemoryStorageService extends AbstractStorageService {\n    constructor() {\n        super();\n        this.applicationStorage = this._register(new Storage(new InMemoryStorageDatabase(), { hint: StorageHint.STORAGE_IN_MEMORY }));\n        this.profileStorage = this._register(new Storage(new InMemoryStorageDatabase(), { hint: StorageHint.STORAGE_IN_MEMORY }));\n        this.workspaceStorage = this._register(new Storage(new InMemoryStorageDatabase(), { hint: StorageHint.STORAGE_IN_MEMORY }));\n        this._register(this.workspaceStorage.onDidChangeStorage(e => this.emitDidChangeValue(1 /* StorageScope.WORKSPACE */, e)));\n        this._register(this.profileStorage.onDidChangeStorage(e => this.emitDidChangeValue(0 /* StorageScope.PROFILE */, e)));\n        this._register(this.applicationStorage.onDidChangeStorage(e => this.emitDidChangeValue(-1 /* StorageScope.APPLICATION */, e)));\n    }\n    getStorage(scope) {\n        switch (scope) {\n            case -1 /* StorageScope.APPLICATION */:\n                return this.applicationStorage;\n            case 0 /* StorageScope.PROFILE */:\n                return this.profileStorage;\n            default:\n                return this.workspaceStorage;\n        }\n    }\n    shouldFlushWhenIdle() {\n        return false;\n    }\n}\n\nexport { AbstractStorageService, IStorageService, InMemoryStorageService, TARGET_KEY, WillSaveStateReason, loadKeyTargets };\n","import { asCssVariable, asCssVariableWithDefault } from '../common/colorUtils.js';\nimport { activeContrastBorder, textLinkForeground, contrastBorder, focusBorder } from '../common/colors/baseColors.js';\nimport '../common/colors/chartsColors.js';\nimport { widgetShadow, problemsInfoIconForeground, problemsWarningIconForeground, problemsErrorIconForeground, widgetBorder, editorWidgetForeground, editorWidgetBackground, breadcrumbsActiveSelectionForeground, breadcrumbsFocusForeground, breadcrumbsForeground, breadcrumbsBackground, editorWidgetBorder } from '../common/colors/editorColors.js';\nimport { keybindingLabelBottomBorder, keybindingLabelBorder, keybindingLabelForeground, keybindingLabelBackground, buttonBorder, buttonSecondaryHoverBackground, buttonSecondaryBackground, buttonSecondaryForeground, buttonHoverBackground, buttonBackground, buttonSeparator, buttonForeground, inputActiveOptionBackground, inputActiveOptionForeground, inputActiveOptionBorder, radioInactiveHoverBackground, radioInactiveBorder, radioInactiveBackground, radioInactiveForeground, radioActiveBorder, radioActiveBackground, radioActiveForeground, checkboxDisabledForeground, checkboxDisabledBackground, checkboxForeground, checkboxBorder, checkboxBackground, inputValidationErrorForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationWarningForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationInfoForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputBorder, inputForeground, inputBackground, selectBorder, selectForeground, selectListBackground, selectBackground } from '../common/colors/inputColors.js';\nimport { listFilterWidgetShadow, listFilterWidgetNoMatchesOutline, listFilterWidgetOutline, listFilterWidgetBackground, tableOddRowsBackgroundColor, tableColumnsBorder, treeInactiveIndentGuidesStroke, treeIndentGuidesStroke, listDropBetweenBackground, listDropOverBackground, listHoverForeground, listHoverBackground, listInactiveFocusOutline, listInactiveFocusBackground, listInactiveSelectionForeground, listInactiveSelectionIconForeground, listInactiveSelectionBackground, listActiveSelectionForeground, listActiveSelectionBackground, listFocusAndSelectionOutline, listActiveSelectionIconForeground, listFocusOutline, listFocusForeground, listFocusBackground } from '../common/colors/listColors.js';\nimport { menuSeparatorBackground, menuSelectionBorder, menuSelectionBackground, menuSelectionForeground, menuBackground, menuForeground, menuBorder } from '../common/colors/menuColors.js';\nimport '../common/colors/minimapColors.js';\nimport { progressBarBackground, badgeForeground, badgeBackground, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderHoverBackground, scrollbarSliderBackground } from '../common/colors/miscColors.js';\nimport { quickInputListFocusForeground, quickInputListFocusIconForeground, quickInputListFocusBackground, pickerGroupForeground } from '../common/colors/quickpickColors.js';\nimport '../common/colors/searchColors.js';\nimport { Color } from '../../../base/common/color.js';\n\nfunction overrideStyles(override, styles) {\n    const result = { ...styles };\n    for (const key in override) {\n        const val = override[key];\n        result[key] = val !== undefined ? asCssVariable(val) : undefined;\n    }\n    return result;\n}\nconst defaultKeybindingLabelStyles = {\n    keybindingLabelBackground: asCssVariable(keybindingLabelBackground),\n    keybindingLabelForeground: asCssVariable(keybindingLabelForeground),\n    keybindingLabelBorder: asCssVariable(keybindingLabelBorder),\n    keybindingLabelBottomBorder: asCssVariable(keybindingLabelBottomBorder),\n    keybindingLabelShadow: asCssVariable(widgetShadow)\n};\nconst defaultButtonStyles = {\n    buttonForeground: asCssVariable(buttonForeground),\n    buttonSeparator: asCssVariable(buttonSeparator),\n    buttonBackground: asCssVariable(buttonBackground),\n    buttonHoverBackground: asCssVariable(buttonHoverBackground),\n    buttonSecondaryForeground: asCssVariable(buttonSecondaryForeground),\n    buttonSecondaryBackground: asCssVariable(buttonSecondaryBackground),\n    buttonSecondaryHoverBackground: asCssVariable(buttonSecondaryHoverBackground),\n    buttonBorder: asCssVariable(buttonBorder),\n};\nconst defaultProgressBarStyles = {\n    progressBarBackground: asCssVariable(progressBarBackground)\n};\nconst defaultToggleStyles = {\n    inputActiveOptionBorder: asCssVariable(inputActiveOptionBorder),\n    inputActiveOptionForeground: asCssVariable(inputActiveOptionForeground),\n    inputActiveOptionBackground: asCssVariable(inputActiveOptionBackground)\n};\n({\n    activeForeground: asCssVariable(radioActiveForeground),\n    activeBackground: asCssVariable(radioActiveBackground),\n    activeBorder: asCssVariable(radioActiveBorder),\n    inactiveForeground: asCssVariable(radioInactiveForeground),\n    inactiveBackground: asCssVariable(radioInactiveBackground),\n    inactiveBorder: asCssVariable(radioInactiveBorder),\n    inactiveHoverBackground: asCssVariable(radioInactiveHoverBackground),\n});\nconst defaultCheckboxStyles = {\n    checkboxBackground: asCssVariable(checkboxBackground),\n    checkboxBorder: asCssVariable(checkboxBorder),\n    checkboxForeground: asCssVariable(checkboxForeground),\n    checkboxDisabledBackground: asCssVariable(checkboxDisabledBackground),\n    checkboxDisabledForeground: asCssVariable(checkboxDisabledForeground),\n};\n({\n    dialogBackground: asCssVariable(editorWidgetBackground),\n    dialogForeground: asCssVariable(editorWidgetForeground),\n    dialogShadow: asCssVariable(widgetShadow),\n    dialogBorder: asCssVariable(widgetBorder),\n    errorIconForeground: asCssVariable(problemsErrorIconForeground),\n    warningIconForeground: asCssVariable(problemsWarningIconForeground),\n    infoIconForeground: asCssVariable(problemsInfoIconForeground),\n    textLinkForeground: asCssVariable(textLinkForeground)\n});\nconst defaultInputBoxStyles = {\n    inputBackground: asCssVariable(inputBackground),\n    inputForeground: asCssVariable(inputForeground),\n    inputBorder: asCssVariable(inputBorder),\n    inputValidationInfoBorder: asCssVariable(inputValidationInfoBorder),\n    inputValidationInfoBackground: asCssVariable(inputValidationInfoBackground),\n    inputValidationInfoForeground: asCssVariable(inputValidationInfoForeground),\n    inputValidationWarningBorder: asCssVariable(inputValidationWarningBorder),\n    inputValidationWarningBackground: asCssVariable(inputValidationWarningBackground),\n    inputValidationWarningForeground: asCssVariable(inputValidationWarningForeground),\n    inputValidationErrorBorder: asCssVariable(inputValidationErrorBorder),\n    inputValidationErrorBackground: asCssVariable(inputValidationErrorBackground),\n    inputValidationErrorForeground: asCssVariable(inputValidationErrorForeground)\n};\nconst defaultFindWidgetStyles = {\n    listFilterWidgetBackground: asCssVariable(listFilterWidgetBackground),\n    listFilterWidgetOutline: asCssVariable(listFilterWidgetOutline),\n    listFilterWidgetNoMatchesOutline: asCssVariable(listFilterWidgetNoMatchesOutline),\n    listFilterWidgetShadow: asCssVariable(listFilterWidgetShadow),\n    inputBoxStyles: defaultInputBoxStyles,\n    toggleStyles: defaultToggleStyles\n};\nconst defaultCountBadgeStyles = {\n    badgeBackground: asCssVariable(badgeBackground),\n    badgeForeground: asCssVariable(badgeForeground),\n    badgeBorder: asCssVariable(contrastBorder)\n};\n({\n    breadcrumbsBackground: asCssVariable(breadcrumbsBackground),\n    breadcrumbsForeground: asCssVariable(breadcrumbsForeground),\n    breadcrumbsHoverForeground: asCssVariable(breadcrumbsFocusForeground),\n    breadcrumbsFocusForeground: asCssVariable(breadcrumbsFocusForeground),\n    breadcrumbsFocusAndSelectionForeground: asCssVariable(breadcrumbsActiveSelectionForeground)\n});\nconst defaultListStyles = {\n    listBackground: undefined,\n    listInactiveFocusForeground: undefined,\n    listFocusBackground: asCssVariable(listFocusBackground),\n    listFocusForeground: asCssVariable(listFocusForeground),\n    listFocusOutline: asCssVariable(listFocusOutline),\n    listActiveSelectionBackground: asCssVariable(listActiveSelectionBackground),\n    listActiveSelectionForeground: asCssVariable(listActiveSelectionForeground),\n    listActiveSelectionIconForeground: asCssVariable(listActiveSelectionIconForeground),\n    listFocusAndSelectionOutline: asCssVariable(listFocusAndSelectionOutline),\n    listFocusAndSelectionBackground: asCssVariable(listActiveSelectionBackground),\n    listFocusAndSelectionForeground: asCssVariable(listActiveSelectionForeground),\n    listInactiveSelectionBackground: asCssVariable(listInactiveSelectionBackground),\n    listInactiveSelectionIconForeground: asCssVariable(listInactiveSelectionIconForeground),\n    listInactiveSelectionForeground: asCssVariable(listInactiveSelectionForeground),\n    listInactiveFocusBackground: asCssVariable(listInactiveFocusBackground),\n    listInactiveFocusOutline: asCssVariable(listInactiveFocusOutline),\n    listHoverBackground: asCssVariable(listHoverBackground),\n    listHoverForeground: asCssVariable(listHoverForeground),\n    listDropOverBackground: asCssVariable(listDropOverBackground),\n    listDropBetweenBackground: asCssVariable(listDropBetweenBackground),\n    listSelectionOutline: asCssVariable(activeContrastBorder),\n    listHoverOutline: asCssVariable(activeContrastBorder),\n    treeIndentGuidesStroke: asCssVariable(treeIndentGuidesStroke),\n    treeInactiveIndentGuidesStroke: asCssVariable(treeInactiveIndentGuidesStroke),\n    treeStickyScrollBackground: undefined,\n    treeStickyScrollBorder: undefined,\n    treeStickyScrollShadow: asCssVariable(scrollbarShadow),\n    tableColumnsBorder: asCssVariable(tableColumnsBorder),\n    tableOddRowsBackgroundColor: asCssVariable(tableOddRowsBackgroundColor),\n};\nfunction getListStyles(override) {\n    return overrideStyles(override, defaultListStyles);\n}\nconst defaultSelectBoxStyles = {\n    selectBackground: asCssVariable(selectBackground),\n    selectListBackground: asCssVariable(selectListBackground),\n    selectForeground: asCssVariable(selectForeground),\n    decoratorRightForeground: asCssVariable(pickerGroupForeground),\n    selectBorder: asCssVariable(selectBorder),\n    focusBorder: asCssVariable(focusBorder),\n    listFocusBackground: asCssVariable(quickInputListFocusBackground),\n    listInactiveSelectionIconForeground: asCssVariable(quickInputListFocusIconForeground),\n    listFocusForeground: asCssVariable(quickInputListFocusForeground),\n    listFocusOutline: asCssVariableWithDefault(activeContrastBorder, Color.transparent.toString()),\n    listHoverBackground: asCssVariable(listHoverBackground),\n    listHoverForeground: asCssVariable(listHoverForeground),\n    listHoverOutline: asCssVariable(activeContrastBorder),\n    selectListBorder: asCssVariable(editorWidgetBorder),\n    listBackground: undefined,\n    listActiveSelectionBackground: undefined,\n    listActiveSelectionForeground: undefined,\n    listActiveSelectionIconForeground: undefined,\n    listFocusAndSelectionBackground: undefined,\n    listDropOverBackground: undefined,\n    listDropBetweenBackground: undefined,\n    listInactiveSelectionBackground: undefined,\n    listInactiveSelectionForeground: undefined,\n    listInactiveFocusBackground: undefined,\n    listInactiveFocusOutline: undefined,\n    listSelectionOutline: undefined,\n    listFocusAndSelectionForeground: undefined,\n    listFocusAndSelectionOutline: undefined,\n    listInactiveFocusForeground: undefined,\n    tableColumnsBorder: undefined,\n    tableOddRowsBackgroundColor: undefined,\n    treeIndentGuidesStroke: undefined,\n    treeInactiveIndentGuidesStroke: undefined,\n    treeStickyScrollBackground: undefined,\n    treeStickyScrollBorder: undefined,\n    treeStickyScrollShadow: undefined\n};\nconst defaultMenuStyles = {\n    shadowColor: asCssVariable(widgetShadow),\n    borderColor: asCssVariable(menuBorder),\n    foregroundColor: asCssVariable(menuForeground),\n    backgroundColor: asCssVariable(menuBackground),\n    selectionForegroundColor: asCssVariable(menuSelectionForeground),\n    selectionBackgroundColor: asCssVariable(menuSelectionBackground),\n    selectionBorderColor: asCssVariable(menuSelectionBorder),\n    separatorColor: asCssVariable(menuSeparatorBackground),\n    scrollbarShadow: asCssVariable(scrollbarShadow),\n    scrollbarSliderBackground: asCssVariable(scrollbarSliderBackground),\n    scrollbarSliderHoverBackground: asCssVariable(scrollbarSliderHoverBackground),\n    scrollbarSliderActiveBackground: asCssVariable(scrollbarSliderActiveBackground)\n};\n\nexport { defaultButtonStyles, defaultCheckboxStyles, defaultCountBadgeStyles, defaultFindWidgetStyles, defaultInputBoxStyles, defaultKeybindingLabelStyles, defaultListStyles, defaultMenuStyles, defaultProgressBarStyles, defaultSelectBoxStyles, defaultToggleStyles, getListStyles };\n","import { isWeb, isMacintosh } from '../../../base/common/platform.js';\n\nfunction hasNativeContextMenu(configurationService, titleBarStyle) {\n    if (isWeb) {\n        return false;\n    }\n    const nativeTitle = hasNativeTitlebar(configurationService, titleBarStyle);\n    const windowConfigurations = configurationService.getValue('window');\n    if (windowConfigurations?.menuStyle === \"native\" /* MenuStyleConfiguration.NATIVE */) {\n        // Do not support native menu with custom title bar\n        if (!isMacintosh && !nativeTitle) {\n            return false;\n        }\n        return true;\n    }\n    if (windowConfigurations?.menuStyle === \"custom\" /* MenuStyleConfiguration.CUSTOM */) {\n        return false;\n    }\n    return nativeTitle; // Default to inherit from title bar style\n}\nfunction hasNativeTitlebar(configurationService, titleBarStyle) {\n    if (!titleBarStyle) {\n        titleBarStyle = getTitleBarStyle(configurationService);\n    }\n    return titleBarStyle === \"native\" /* TitlebarStyle.NATIVE */;\n}\nfunction getTitleBarStyle(configurationService) {\n    if (isWeb) {\n        return \"custom\" /* TitlebarStyle.CUSTOM */;\n    }\n    const configuration = configurationService.getValue('window');\n    if (configuration) {\n        const useNativeTabs = isMacintosh && configuration.nativeTabs === true;\n        if (useNativeTabs) {\n            return \"native\" /* TitlebarStyle.NATIVE */; // native tabs on sierra do not work with custom title style\n        }\n        const useSimpleFullScreen = isMacintosh && configuration.nativeFullScreen === false;\n        if (useSimpleFullScreen) {\n            return \"native\" /* TitlebarStyle.NATIVE */; // simple fullscreen does not work well with custom title style (https://github.com/microsoft/vscode/issues/63291)\n        }\n        const style = configuration.titleBarStyle;\n        if (style === \"native\" /* TitlebarStyle.NATIVE */ || style === \"custom\" /* TitlebarStyle.CUSTOM */) {\n            return style;\n        }\n    }\n    return \"custom\" /* TitlebarStyle.CUSTOM */; // default to custom on all OS\n}\nfunction getWindowControlsStyle(configurationService) {\n    if (isWeb || isMacintosh || getTitleBarStyle(configurationService) === \"native\" /* TitlebarStyle.NATIVE */) {\n        return \"native\" /* WindowControlsStyle.NATIVE */; // only supported on Windows/Linux desktop with custom titlebar\n    }\n    const configuration = configurationService.getValue('window');\n    const style = configuration?.controlsStyle;\n    if (style === \"custom\" /* WindowControlsStyle.CUSTOM */ || style === \"hidden\" /* WindowControlsStyle.HIDDEN */) {\n        return style;\n    }\n    return \"native\" /* WindowControlsStyle.NATIVE */; // default to native on all OS\n}\n\nexport { getTitleBarStyle, getWindowControlsStyle, hasNativeContextMenu, hasNativeTitlebar };\n","import { asCSSUrl } from '../../../base/browser/cssValue.js';\nimport { ModifierKeyEmitter, addDisposableListener, prepend, $, append, EventType } from '../../../base/browser/dom.js';\nimport { StandardKeyboardEvent } from '../../../base/browser/keyboardEvent.js';\nimport { ActionViewItem, BaseActionViewItem, SelectActionViewItem } from '../../../base/browser/ui/actionbar/actionViewItems.js';\nimport { DropdownMenuActionViewItem } from '../../../base/browser/ui/dropdown/dropdownActionViewItem.js';\nimport { ActionRunner, Separator, SubmenuAction } from '../../../base/common/actions.js';\nimport { UILabelProvider } from '../../../base/common/keybindingLabels.js';\nimport { MutableDisposable, toDisposable, combinedDisposable, DisposableStore } from '../../../base/common/lifecycle.js';\nimport { OS, isWindows, isLinux } from '../../../base/common/platform.js';\nimport { ThemeIcon } from '../../../base/common/themables.js';\nimport { assertType } from '../../../base/common/types.js';\nimport { localize } from '../../../nls.js';\nimport { IAccessibilityService } from '../../accessibility/common/accessibility.js';\nimport { isICommandActionToggleInfo } from '../../action/common/action.js';\nimport { IConfigurationService } from '../../configuration/common/configuration.js';\nimport { IContextKeyService } from '../../contextkey/common/contextkey.js';\nimport { IContextMenuService, IContextViewService } from '../../contextview/browser/contextView.js';\nimport { IInstantiationService } from '../../instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../keybinding/common/keybinding.js';\nimport { INotificationService } from '../../notification/common/notification.js';\nimport { IStorageService } from '../../storage/common/storage.js';\nimport { defaultSelectBoxStyles } from '../../theme/browser/defaultStyles.js';\nimport { asCssVariable } from '../../theme/common/colorUtils.js';\nimport '../../theme/common/colors/baseColors.js';\nimport '../../theme/common/colors/chartsColors.js';\nimport '../../theme/common/colors/editorColors.js';\nimport { selectBorder } from '../../theme/common/colors/inputColors.js';\nimport '../../theme/common/colors/listColors.js';\nimport '../../theme/common/colors/menuColors.js';\nimport '../../theme/common/colors/minimapColors.js';\nimport '../../theme/common/colors/miscColors.js';\nimport '../../theme/common/colors/quickpickColors.js';\nimport '../../theme/common/colors/searchColors.js';\nimport { isDark } from '../../theme/common/theme.js';\nimport { IThemeService } from '../../theme/common/themeService.js';\nimport { hasNativeContextMenu } from '../../window/common/window.js';\nimport { IMenuService, MenuItemAction, SubmenuItemAction } from '../common/actions.js';\nimport './menuEntryActionViewItem.css';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nfunction getFlatContextMenuActions(groups, primaryGroup) {\n    const target = [];\n    getContextMenuActionsImpl(groups, target);\n    return target;\n}\nfunction getContextMenuActionsImpl(groups, target, primaryGroup) {\n    const modifierKeyEmitter = ModifierKeyEmitter.getInstance();\n    const useAlternativeActions = modifierKeyEmitter.keyStatus.altKey || ((isWindows || isLinux) && modifierKeyEmitter.keyStatus.shiftKey);\n    fillInActions(groups, target, useAlternativeActions, actionGroup => actionGroup === 'navigation');\n}\nfunction getActionBarActions(groups, primaryGroup, shouldInlineSubmenu, useSeparatorsInPrimaryActions) {\n    const target = { primary: [], secondary: [] };\n    fillInActionBarActions(groups, target, primaryGroup, shouldInlineSubmenu, useSeparatorsInPrimaryActions);\n    return target;\n}\nfunction getFlatActionBarActions(groups, primaryGroup, shouldInlineSubmenu, useSeparatorsInPrimaryActions) {\n    const target = [];\n    fillInActionBarActions(groups, target, primaryGroup, shouldInlineSubmenu, useSeparatorsInPrimaryActions);\n    return target;\n}\nfunction fillInActionBarActions(groups, target, primaryGroup, shouldInlineSubmenu, useSeparatorsInPrimaryActions) {\n    const isPrimaryAction = typeof primaryGroup === 'string' ? (actionGroup) => actionGroup === primaryGroup : primaryGroup;\n    // Action bars handle alternative actions on their own so the alternative actions should be ignored\n    fillInActions(groups, target, false, isPrimaryAction, shouldInlineSubmenu, useSeparatorsInPrimaryActions);\n}\nfunction fillInActions(groups, target, useAlternativeActions, isPrimaryAction = actionGroup => actionGroup === 'navigation', shouldInlineSubmenu = () => false, useSeparatorsInPrimaryActions = false) {\n    let primaryBucket;\n    let secondaryBucket;\n    if (Array.isArray(target)) {\n        primaryBucket = target;\n        secondaryBucket = target;\n    }\n    else {\n        primaryBucket = target.primary;\n        secondaryBucket = target.secondary;\n    }\n    const submenuInfo = new Set();\n    for (const [group, actions] of groups) {\n        let target;\n        if (isPrimaryAction(group)) {\n            target = primaryBucket;\n            if (target.length > 0 && useSeparatorsInPrimaryActions) {\n                target.push(new Separator());\n            }\n        }\n        else {\n            target = secondaryBucket;\n            if (target.length > 0) {\n                target.push(new Separator());\n            }\n        }\n        for (let action of actions) {\n            if (useAlternativeActions) {\n                action = action instanceof MenuItemAction && action.alt ? action.alt : action;\n            }\n            const newLen = target.push(action);\n            // keep submenu info for later inlining\n            if (action instanceof SubmenuAction) {\n                submenuInfo.add({ group, action, index: newLen - 1 });\n            }\n        }\n    }\n    // ask the outside if submenu should be inlined or not. only ask when\n    // there would be enough space\n    for (const { group, action, index } of submenuInfo) {\n        const target = isPrimaryAction(group) ? primaryBucket : secondaryBucket;\n        // inlining submenus with length 0 or 1 is easy,\n        // larger submenus need to be checked with the overall limit\n        const submenuActions = action.actions;\n        if (shouldInlineSubmenu(action, group, target.length)) {\n            target.splice(index, 1, ...submenuActions);\n        }\n    }\n}\nlet MenuEntryActionViewItem = class MenuEntryActionViewItem extends ActionViewItem {\n    constructor(action, _options, _keybindingService, _notificationService, _contextKeyService, _themeService, _contextMenuService, _accessibilityService) {\n        super(undefined, action, { icon: !!(action.class || action.item.icon), label: !action.class && !action.item.icon, draggable: _options?.draggable, keybinding: _options?.keybinding, hoverDelegate: _options?.hoverDelegate, keybindingNotRenderedWithLabel: _options?.keybindingNotRenderedWithLabel });\n        this._options = _options;\n        this._keybindingService = _keybindingService;\n        this._notificationService = _notificationService;\n        this._contextKeyService = _contextKeyService;\n        this._themeService = _themeService;\n        this._contextMenuService = _contextMenuService;\n        this._accessibilityService = _accessibilityService;\n        this._wantsAltCommand = false;\n        this._itemClassDispose = this._register(new MutableDisposable());\n        this._altKey = ModifierKeyEmitter.getInstance();\n    }\n    get _menuItemAction() {\n        return this._action;\n    }\n    get _commandAction() {\n        return this._wantsAltCommand && this._menuItemAction.alt || this._menuItemAction;\n    }\n    async onClick(event) {\n        event.preventDefault();\n        event.stopPropagation();\n        try {\n            await this.actionRunner.run(this._commandAction, this._context);\n        }\n        catch (err) {\n            this._notificationService.error(err);\n        }\n    }\n    render(container) {\n        super.render(container);\n        container.classList.add('menu-entry');\n        if (this.options.icon) {\n            this._updateItemClass(this._menuItemAction.item);\n        }\n        if (this._menuItemAction.alt) {\n            let isMouseOver = false;\n            const updateAltState = () => {\n                const wantsAltCommand = !!this._menuItemAction.alt?.enabled &&\n                    (!this._accessibilityService.isMotionReduced() || isMouseOver) && (this._altKey.keyStatus.altKey ||\n                    (this._altKey.keyStatus.shiftKey && isMouseOver));\n                if (wantsAltCommand !== this._wantsAltCommand) {\n                    this._wantsAltCommand = wantsAltCommand;\n                    this.updateLabel();\n                    this.updateTooltip();\n                    this.updateClass();\n                }\n            };\n            this._register(this._altKey.event(updateAltState));\n            this._register(addDisposableListener(container, 'mouseleave', _ => {\n                isMouseOver = false;\n                updateAltState();\n            }));\n            this._register(addDisposableListener(container, 'mouseenter', _ => {\n                isMouseOver = true;\n                updateAltState();\n            }));\n            updateAltState();\n        }\n    }\n    updateLabel() {\n        if (this.options.label && this.label) {\n            this.label.textContent = this._commandAction.label;\n        }\n    }\n    getTooltip() {\n        const keybinding = this._keybindingService.lookupKeybinding(this._commandAction.id, this._contextKeyService);\n        const keybindingLabel = keybinding && keybinding.getLabel();\n        const tooltip = this._commandAction.tooltip || this._commandAction.label;\n        let title = keybindingLabel\n            ? localize(1644, \"{0} ({1})\", tooltip, keybindingLabel)\n            : tooltip;\n        if (!this._wantsAltCommand && this._menuItemAction.alt?.enabled) {\n            const altTooltip = this._menuItemAction.alt.tooltip || this._menuItemAction.alt.label;\n            const altKeybinding = this._keybindingService.lookupKeybinding(this._menuItemAction.alt.id, this._contextKeyService);\n            const altKeybindingLabel = altKeybinding && altKeybinding.getLabel();\n            const altTitleSection = altKeybindingLabel\n                ? localize(1645, \"{0} ({1})\", altTooltip, altKeybindingLabel)\n                : altTooltip;\n            title = localize(1646, \"{0}\\n[{1}] {2}\", title, UILabelProvider.modifierLabels[OS].altKey, altTitleSection);\n        }\n        return title;\n    }\n    updateClass() {\n        if (this.options.icon) {\n            if (this._commandAction !== this._menuItemAction) {\n                if (this._menuItemAction.alt) {\n                    this._updateItemClass(this._menuItemAction.alt.item);\n                }\n            }\n            else {\n                this._updateItemClass(this._menuItemAction.item);\n            }\n        }\n    }\n    _updateItemClass(item) {\n        this._itemClassDispose.value = undefined;\n        const { element, label } = this;\n        if (!element || !label) {\n            return;\n        }\n        const icon = this._commandAction.checked && isICommandActionToggleInfo(item.toggled) && item.toggled.icon ? item.toggled.icon : item.icon;\n        if (!icon) {\n            return;\n        }\n        if (ThemeIcon.isThemeIcon(icon)) {\n            // theme icons\n            const iconClasses = ThemeIcon.asClassNameArray(icon);\n            label.classList.add(...iconClasses);\n            this._itemClassDispose.value = toDisposable(() => {\n                label.classList.remove(...iconClasses);\n            });\n        }\n        else {\n            // icon path/url\n            label.style.backgroundImage = (isDark(this._themeService.getColorTheme().type)\n                ? asCSSUrl(icon.dark)\n                : asCSSUrl(icon.light));\n            label.classList.add('icon');\n            this._itemClassDispose.value = combinedDisposable(toDisposable(() => {\n                label.style.backgroundImage = '';\n                label.classList.remove('icon');\n            }), this._themeService.onDidColorThemeChange(() => {\n                // refresh when the theme changes in case we go between dark <-> light\n                this.updateClass();\n            }));\n        }\n    }\n};\nMenuEntryActionViewItem = __decorate([\n    __param(2, IKeybindingService),\n    __param(3, INotificationService),\n    __param(4, IContextKeyService),\n    __param(5, IThemeService),\n    __param(6, IContextMenuService),\n    __param(7, IAccessibilityService)\n], MenuEntryActionViewItem);\nclass TextOnlyMenuEntryActionViewItem extends MenuEntryActionViewItem {\n    render(container) {\n        this.options.label = true;\n        this.options.icon = false;\n        super.render(container);\n        container.classList.add('text-only');\n        container.classList.toggle('use-comma', this._options?.useComma ?? false);\n    }\n    updateLabel() {\n        const kb = this._keybindingService.lookupKeybinding(this._action.id, this._contextKeyService);\n        if (!kb) {\n            return super.updateLabel();\n        }\n        if (this.label) {\n            const kb2 = TextOnlyMenuEntryActionViewItem._symbolPrintEnter(kb);\n            if (this._options?.conversational) {\n                this.label.textContent = localize(1647, '{1} to {0}', this._action.label, kb2);\n            }\n            else {\n                this.label.textContent = localize(1648, '{0} ({1})', this._action.label, kb2);\n            }\n        }\n    }\n    static _symbolPrintEnter(kb) {\n        return kb.getLabel()\n            ?.replace(/\\benter\\b/gi, '\\u23CE')\n            .replace(/\\bEscape\\b/gi, 'Esc');\n    }\n}\nlet SubmenuEntryActionViewItem = class SubmenuEntryActionViewItem extends DropdownMenuActionViewItem {\n    constructor(action, options, _keybindingService, _contextMenuService, _themeService) {\n        const dropdownOptions = {\n            ...options,\n            menuAsChild: options?.menuAsChild ?? false,\n            classNames: options?.classNames ?? (ThemeIcon.isThemeIcon(action.item.icon) ? ThemeIcon.asClassName(action.item.icon) : undefined),\n            keybindingProvider: options?.keybindingProvider ?? (action => _keybindingService.lookupKeybinding(action.id))\n        };\n        super(action, { getActions: () => action.actions }, _contextMenuService, dropdownOptions);\n        this._keybindingService = _keybindingService;\n        this._contextMenuService = _contextMenuService;\n        this._themeService = _themeService;\n    }\n    render(container) {\n        super.render(container);\n        assertType(this.element);\n        container.classList.add('menu-entry');\n        const action = this._action;\n        const { icon } = action.item;\n        if (icon && !ThemeIcon.isThemeIcon(icon)) {\n            this.element.classList.add('icon');\n            const setBackgroundImage = () => {\n                if (this.element) {\n                    this.element.style.backgroundImage = (isDark(this._themeService.getColorTheme().type)\n                        ? asCSSUrl(icon.dark)\n                        : asCSSUrl(icon.light));\n                }\n            };\n            setBackgroundImage();\n            this._register(this._themeService.onDidColorThemeChange(() => {\n                // refresh when the theme changes in case we go between dark <-> light\n                setBackgroundImage();\n            }));\n        }\n    }\n};\nSubmenuEntryActionViewItem = __decorate([\n    __param(2, IKeybindingService),\n    __param(3, IContextMenuService),\n    __param(4, IThemeService)\n], SubmenuEntryActionViewItem);\nlet DropdownWithDefaultActionViewItem = class DropdownWithDefaultActionViewItem extends BaseActionViewItem {\n    constructor(submenuAction, options, _keybindingService, _notificationService, _contextMenuService, _menuService, _instaService, _storageService) {\n        super(null, submenuAction);\n        this._keybindingService = _keybindingService;\n        this._notificationService = _notificationService;\n        this._contextMenuService = _contextMenuService;\n        this._menuService = _menuService;\n        this._instaService = _instaService;\n        this._storageService = _storageService;\n        this._defaultActionDisposables = this._register(new DisposableStore());\n        this._container = null;\n        this._options = options;\n        this._storageKey = `${submenuAction.item.submenu.id}_lastActionId`;\n        // determine default action\n        let defaultAction;\n        const defaultActionId = options?.togglePrimaryAction ? _storageService.get(this._storageKey, 1 /* StorageScope.WORKSPACE */) : undefined;\n        if (defaultActionId) {\n            defaultAction = submenuAction.actions.find(a => defaultActionId === a.id);\n        }\n        if (!defaultAction) {\n            defaultAction = submenuAction.actions[0];\n        }\n        this._defaultAction = this._defaultActionDisposables.add(this._instaService.createInstance(MenuEntryActionViewItem, defaultAction, { keybinding: this._getDefaultActionKeybindingLabel(defaultAction) }));\n        const dropdownOptions = {\n            keybindingProvider: action => this._keybindingService.lookupKeybinding(action.id),\n            ...options,\n            menuAsChild: options?.menuAsChild ?? true,\n            classNames: options?.classNames ?? ['codicon', 'codicon-chevron-down'],\n            actionRunner: options?.actionRunner ?? this._register(new ActionRunner()),\n        };\n        this._dropdown = this._register(new DropdownMenuActionViewItem(submenuAction, submenuAction.actions, this._contextMenuService, dropdownOptions));\n        if (options?.togglePrimaryAction) {\n            this._register(this._dropdown.actionRunner.onDidRun((e) => {\n                if (e.action instanceof MenuItemAction) {\n                    this.update(e.action);\n                }\n            }));\n        }\n    }\n    update(lastAction) {\n        if (this._options?.togglePrimaryAction) {\n            this._storageService.store(this._storageKey, lastAction.id, 1 /* StorageScope.WORKSPACE */, 1 /* StorageTarget.MACHINE */);\n        }\n        this._defaultActionDisposables.clear();\n        this._defaultAction = this._defaultActionDisposables.add(this._instaService.createInstance(MenuEntryActionViewItem, lastAction, { keybinding: this._getDefaultActionKeybindingLabel(lastAction) }));\n        this._defaultAction.actionRunner = this._defaultActionDisposables.add(new class extends ActionRunner {\n            async runAction(action, context) {\n                await action.run(undefined);\n            }\n        }());\n        if (this._container) {\n            this._defaultAction.render(prepend(this._container, $('.action-container')));\n        }\n    }\n    _getDefaultActionKeybindingLabel(defaultAction) {\n        let defaultActionKeybinding;\n        if (this._options?.renderKeybindingWithDefaultActionLabel) {\n            const kb = this._keybindingService.lookupKeybinding(defaultAction.id);\n            if (kb) {\n                defaultActionKeybinding = `(${kb.getLabel()})`;\n            }\n        }\n        return defaultActionKeybinding;\n    }\n    setActionContext(newContext) {\n        super.setActionContext(newContext);\n        this._defaultAction.setActionContext(newContext);\n        this._dropdown.setActionContext(newContext);\n    }\n    set actionRunner(actionRunner) {\n        super.actionRunner = actionRunner;\n        this._defaultAction.actionRunner = actionRunner;\n        this._dropdown.actionRunner = actionRunner;\n    }\n    get actionRunner() {\n        return super.actionRunner;\n    }\n    render(container) {\n        this._container = container;\n        super.render(this._container);\n        this._container.classList.add('monaco-dropdown-with-default');\n        const primaryContainer = $('.action-container');\n        this._defaultAction.render(append(this._container, primaryContainer));\n        this._register(addDisposableListener(primaryContainer, EventType.KEY_DOWN, (e) => {\n            const event = new StandardKeyboardEvent(e);\n            if (event.equals(17 /* KeyCode.RightArrow */)) {\n                this._defaultAction.element.tabIndex = -1;\n                this._dropdown.focus();\n                event.stopPropagation();\n            }\n        }));\n        const dropdownContainer = $('.dropdown-action-container');\n        this._dropdown.render(append(this._container, dropdownContainer));\n        this._register(addDisposableListener(dropdownContainer, EventType.KEY_DOWN, (e) => {\n            const event = new StandardKeyboardEvent(e);\n            if (event.equals(15 /* KeyCode.LeftArrow */)) {\n                this._defaultAction.element.tabIndex = 0;\n                this._dropdown.setFocusable(false);\n                this._defaultAction.element?.focus();\n                event.stopPropagation();\n            }\n        }));\n    }\n    focus(fromRight) {\n        if (fromRight) {\n            this._dropdown.focus();\n        }\n        else {\n            this._defaultAction.element.tabIndex = 0;\n            this._defaultAction.element.focus();\n        }\n    }\n    blur() {\n        this._defaultAction.element.tabIndex = -1;\n        this._dropdown.blur();\n        this._container.blur();\n    }\n    setFocusable(focusable) {\n        if (focusable) {\n            this._defaultAction.element.tabIndex = 0;\n        }\n        else {\n            this._defaultAction.element.tabIndex = -1;\n            this._dropdown.setFocusable(false);\n        }\n    }\n};\nDropdownWithDefaultActionViewItem = __decorate([\n    __param(2, IKeybindingService),\n    __param(3, INotificationService),\n    __param(4, IContextMenuService),\n    __param(5, IMenuService),\n    __param(6, IInstantiationService),\n    __param(7, IStorageService)\n], DropdownWithDefaultActionViewItem);\nlet SubmenuEntrySelectActionViewItem = class SubmenuEntrySelectActionViewItem extends SelectActionViewItem {\n    constructor(action, contextViewService, configurationService) {\n        super(null, action, action.actions.map(a => ({\n            text: a.id === Separator.ID ? '\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500' : a.label,\n            isDisabled: !a.enabled,\n        })), 0, contextViewService, defaultSelectBoxStyles, { ariaLabel: action.tooltip, optionsAsChildren: true, useCustomDrawn: !hasNativeContextMenu(configurationService) });\n        this.select(Math.max(0, action.actions.findIndex(a => a.checked)));\n    }\n    render(container) {\n        super.render(container);\n        container.style.borderColor = asCssVariable(selectBorder);\n    }\n    runAction(option, index) {\n        const action = this.action.actions[index];\n        if (action) {\n            this.actionRunner.run(action);\n        }\n    }\n};\nSubmenuEntrySelectActionViewItem = __decorate([\n    __param(1, IContextViewService),\n    __param(2, IConfigurationService)\n], SubmenuEntrySelectActionViewItem);\n/**\n * Creates action view items for menu actions or submenu actions.\n */\nfunction createActionViewItem(instaService, action, options) {\n    if (action instanceof MenuItemAction) {\n        return instaService.createInstance(MenuEntryActionViewItem, action, options);\n    }\n    else if (action instanceof SubmenuItemAction) {\n        if (action.item.isSelection) {\n            return instaService.createInstance(SubmenuEntrySelectActionViewItem, action);\n        }\n        else if (action.item.isSplitButton) {\n            return instaService.createInstance(DropdownWithDefaultActionViewItem, action, {\n                ...options,\n                togglePrimaryAction: typeof action.item.isSplitButton !== 'boolean' ? action.item.isSplitButton.togglePrimaryAction : false,\n            });\n        }\n        else {\n            return instaService.createInstance(SubmenuEntryActionViewItem, action, options);\n        }\n    }\n    else {\n        return undefined;\n    }\n}\n\nexport { DropdownWithDefaultActionViewItem, MenuEntryActionViewItem, SubmenuEntryActionViewItem, TextOnlyMenuEntryActionViewItem, createActionViewItem, fillInActionBarActions, getActionBarActions, getFlatActionBarActions, getFlatContextMenuActions };\n","import { RunOnceScheduler } from '../../../base/common/async.js';\nimport { Emitter, DebounceEmitter } from '../../../base/common/event.js';\nimport { DisposableStore } from '../../../base/common/lifecycle.js';\nimport { isIMenuItem, MenuItemAction, SubmenuItemAction, MenuRegistry, isISubmenuItem } from './actions.js';\nimport { ICommandService } from '../../commands/common/commands.js';\nimport { IContextKeyService } from '../../contextkey/common/contextkey.js';\nimport { Separator, toAction } from '../../../base/common/actions.js';\nimport { IStorageService } from '../../storage/common/storage.js';\nimport { removeFastWithoutKeepingOrder } from '../../../base/common/arrays.js';\nimport { localize } from '../../../nls.js';\nimport { IKeybindingService } from '../../keybinding/common/keybinding.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar PersistedMenuHideState_1, MenuInfo_1;\nlet MenuService = class MenuService {\n    constructor(_commandService, _keybindingService, storageService) {\n        this._commandService = _commandService;\n        this._keybindingService = _keybindingService;\n        this._hiddenStates = new PersistedMenuHideState(storageService);\n    }\n    createMenu(id, contextKeyService, options) {\n        return new MenuImpl(id, this._hiddenStates, { emitEventsForSubmenuChanges: false, eventDebounceDelay: 50, ...options }, this._commandService, this._keybindingService, contextKeyService);\n    }\n    getMenuActions(id, contextKeyService, options) {\n        const menu = new MenuImpl(id, this._hiddenStates, { emitEventsForSubmenuChanges: false, eventDebounceDelay: 50, ...options }, this._commandService, this._keybindingService, contextKeyService);\n        const actions = menu.getActions(options);\n        menu.dispose();\n        return actions;\n    }\n    resetHiddenStates(ids) {\n        this._hiddenStates.reset(ids);\n    }\n};\nMenuService = __decorate([\n    __param(0, ICommandService),\n    __param(1, IKeybindingService),\n    __param(2, IStorageService)\n], MenuService);\nlet PersistedMenuHideState = class PersistedMenuHideState {\n    static { PersistedMenuHideState_1 = this; }\n    static { this._key = 'menu.hiddenCommands'; }\n    constructor(_storageService) {\n        this._storageService = _storageService;\n        this._disposables = new DisposableStore();\n        this._onDidChange = new Emitter();\n        this.onDidChange = this._onDidChange.event;\n        this._ignoreChangeEvent = false;\n        this._hiddenByDefaultCache = new Map();\n        try {\n            const raw = _storageService.get(PersistedMenuHideState_1._key, 0 /* StorageScope.PROFILE */, '{}');\n            this._data = JSON.parse(raw);\n        }\n        catch (err) {\n            this._data = Object.create(null);\n        }\n        this._disposables.add(_storageService.onDidChangeValue(0 /* StorageScope.PROFILE */, PersistedMenuHideState_1._key, this._disposables)(() => {\n            if (!this._ignoreChangeEvent) {\n                try {\n                    const raw = _storageService.get(PersistedMenuHideState_1._key, 0 /* StorageScope.PROFILE */, '{}');\n                    this._data = JSON.parse(raw);\n                }\n                catch (err) {\n                    console.log('FAILED to read storage after UPDATE', err);\n                }\n            }\n            this._onDidChange.fire();\n        }));\n    }\n    dispose() {\n        this._onDidChange.dispose();\n        this._disposables.dispose();\n    }\n    _isHiddenByDefault(menu, commandId) {\n        return this._hiddenByDefaultCache.get(`${menu.id}/${commandId}`) ?? false;\n    }\n    setDefaultState(menu, commandId, hidden) {\n        this._hiddenByDefaultCache.set(`${menu.id}/${commandId}`, hidden);\n    }\n    isHidden(menu, commandId) {\n        const hiddenByDefault = this._isHiddenByDefault(menu, commandId);\n        const state = this._data[menu.id]?.includes(commandId) ?? false;\n        return hiddenByDefault ? !state : state;\n    }\n    updateHidden(menu, commandId, hidden) {\n        const hiddenByDefault = this._isHiddenByDefault(menu, commandId);\n        if (hiddenByDefault) {\n            hidden = !hidden;\n        }\n        const entries = this._data[menu.id];\n        if (!hidden) {\n            // remove and cleanup\n            if (entries) {\n                const idx = entries.indexOf(commandId);\n                if (idx >= 0) {\n                    removeFastWithoutKeepingOrder(entries, idx);\n                }\n                if (entries.length === 0) {\n                    delete this._data[menu.id];\n                }\n            }\n        }\n        else {\n            // add unless already added\n            if (!entries) {\n                this._data[menu.id] = [commandId];\n            }\n            else {\n                const idx = entries.indexOf(commandId);\n                if (idx < 0) {\n                    entries.push(commandId);\n                }\n            }\n        }\n        this._persist();\n    }\n    reset(menus) {\n        if (menus === undefined) {\n            // reset all\n            this._data = Object.create(null);\n            this._persist();\n        }\n        else {\n            // reset only for a specific menu\n            for (const { id } of menus) {\n                if (this._data[id]) {\n                    delete this._data[id];\n                }\n            }\n            this._persist();\n        }\n    }\n    _persist() {\n        try {\n            this._ignoreChangeEvent = true;\n            const raw = JSON.stringify(this._data);\n            this._storageService.store(PersistedMenuHideState_1._key, raw, 0 /* StorageScope.PROFILE */, 0 /* StorageTarget.USER */);\n        }\n        finally {\n            this._ignoreChangeEvent = false;\n        }\n    }\n};\nPersistedMenuHideState = PersistedMenuHideState_1 = __decorate([\n    __param(0, IStorageService)\n], PersistedMenuHideState);\nclass MenuInfoSnapshot {\n    constructor(_id, _collectContextKeysForSubmenus) {\n        this._id = _id;\n        this._collectContextKeysForSubmenus = _collectContextKeysForSubmenus;\n        this._menuGroups = [];\n        this._allMenuIds = new Set();\n        this._structureContextKeys = new Set();\n        this._preconditionContextKeys = new Set();\n        this._toggledContextKeys = new Set();\n        this.refresh();\n    }\n    get allMenuIds() {\n        return this._allMenuIds;\n    }\n    get structureContextKeys() {\n        return this._structureContextKeys;\n    }\n    get preconditionContextKeys() {\n        return this._preconditionContextKeys;\n    }\n    get toggledContextKeys() {\n        return this._toggledContextKeys;\n    }\n    refresh() {\n        // reset\n        this._menuGroups.length = 0;\n        this._allMenuIds.clear();\n        this._structureContextKeys.clear();\n        this._preconditionContextKeys.clear();\n        this._toggledContextKeys.clear();\n        const menuItems = this._sort(MenuRegistry.getMenuItems(this._id));\n        let group;\n        for (const item of menuItems) {\n            // group by groupId\n            const groupName = item.group || '';\n            if (!group || group[0] !== groupName) {\n                group = [groupName, []];\n                this._menuGroups.push(group);\n            }\n            group[1].push(item);\n            // keep keys and submenu ids for eventing\n            this._collectContextKeysAndSubmenuIds(item);\n        }\n        this._allMenuIds.add(this._id);\n    }\n    _sort(menuItems) {\n        // no sorting needed in snapshot\n        return menuItems;\n    }\n    _collectContextKeysAndSubmenuIds(item) {\n        MenuInfoSnapshot._fillInKbExprKeys(item.when, this._structureContextKeys);\n        if (isIMenuItem(item)) {\n            // keep precondition keys for event if applicable\n            if (item.command.precondition) {\n                MenuInfoSnapshot._fillInKbExprKeys(item.command.precondition, this._preconditionContextKeys);\n            }\n            // keep toggled keys for event if applicable\n            if (item.command.toggled) {\n                const toggledExpression = item.command.toggled.condition || item.command.toggled;\n                MenuInfoSnapshot._fillInKbExprKeys(toggledExpression, this._toggledContextKeys);\n            }\n        }\n        else if (this._collectContextKeysForSubmenus) {\n            // recursively collect context keys from submenus so that this\n            // menu fires events when context key changes affect submenus\n            MenuRegistry.getMenuItems(item.submenu).forEach(this._collectContextKeysAndSubmenuIds, this);\n            this._allMenuIds.add(item.submenu);\n        }\n    }\n    static _fillInKbExprKeys(exp, set) {\n        if (exp) {\n            for (const key of exp.keys()) {\n                set.add(key);\n            }\n        }\n    }\n}\nlet MenuInfo = MenuInfo_1 = class MenuInfo extends MenuInfoSnapshot {\n    constructor(_id, _hiddenStates, _collectContextKeysForSubmenus, _commandService, _keybindingService, _contextKeyService) {\n        super(_id, _collectContextKeysForSubmenus);\n        this._hiddenStates = _hiddenStates;\n        this._commandService = _commandService;\n        this._keybindingService = _keybindingService;\n        this._contextKeyService = _contextKeyService;\n        this.refresh();\n    }\n    createActionGroups(options) {\n        const result = [];\n        for (const group of this._menuGroups) {\n            const [id, items] = group;\n            let activeActions;\n            for (const item of items) {\n                if (this._contextKeyService.contextMatchesRules(item.when)) {\n                    const isMenuItem = isIMenuItem(item);\n                    if (isMenuItem) {\n                        this._hiddenStates.setDefaultState(this._id, item.command.id, !!item.isHiddenByDefault);\n                    }\n                    const menuHide = createMenuHide(this._id, isMenuItem ? item.command : item, this._hiddenStates);\n                    if (isMenuItem) {\n                        // MenuItemAction\n                        const menuKeybinding = createConfigureKeybindingAction(this._commandService, this._keybindingService, item.command.id, item.when);\n                        (activeActions ??= []).push(new MenuItemAction(item.command, item.alt, options, menuHide, menuKeybinding, this._contextKeyService, this._commandService));\n                    }\n                    else {\n                        // SubmenuItemAction\n                        const groups = new MenuInfo_1(item.submenu, this._hiddenStates, this._collectContextKeysForSubmenus, this._commandService, this._keybindingService, this._contextKeyService).createActionGroups(options);\n                        const submenuActions = Separator.join(...groups.map(g => g[1]));\n                        if (submenuActions.length > 0) {\n                            (activeActions ??= []).push(new SubmenuItemAction(item, menuHide, submenuActions));\n                        }\n                    }\n                }\n            }\n            if (activeActions && activeActions.length > 0) {\n                result.push([id, activeActions]);\n            }\n        }\n        return result;\n    }\n    _sort(menuItems) {\n        return menuItems.sort(MenuInfo_1._compareMenuItems);\n    }\n    static _compareMenuItems(a, b) {\n        const aGroup = a.group;\n        const bGroup = b.group;\n        if (aGroup !== bGroup) {\n            // Falsy groups come last\n            if (!aGroup) {\n                return 1;\n            }\n            else if (!bGroup) {\n                return -1;\n            }\n            // 'navigation' group comes first\n            if (aGroup === 'navigation') {\n                return -1;\n            }\n            else if (bGroup === 'navigation') {\n                return 1;\n            }\n            // lexical sort for groups\n            const value = aGroup.localeCompare(bGroup);\n            if (value !== 0) {\n                return value;\n            }\n        }\n        // sort on priority - default is 0\n        const aPrio = a.order || 0;\n        const bPrio = b.order || 0;\n        if (aPrio < bPrio) {\n            return -1;\n        }\n        else if (aPrio > bPrio) {\n            return 1;\n        }\n        // sort on titles\n        return MenuInfo_1._compareTitles(isIMenuItem(a) ? a.command.title : a.title, isIMenuItem(b) ? b.command.title : b.title);\n    }\n    static _compareTitles(a, b) {\n        const aStr = typeof a === 'string' ? a : a.original;\n        const bStr = typeof b === 'string' ? b : b.original;\n        return aStr.localeCompare(bStr);\n    }\n};\nMenuInfo = MenuInfo_1 = __decorate([\n    __param(3, ICommandService),\n    __param(4, IKeybindingService),\n    __param(5, IContextKeyService)\n], MenuInfo);\nlet MenuImpl = class MenuImpl {\n    constructor(id, hiddenStates, options, commandService, keybindingService, contextKeyService) {\n        this._disposables = new DisposableStore();\n        this._menuInfo = new MenuInfo(id, hiddenStates, options.emitEventsForSubmenuChanges, commandService, keybindingService, contextKeyService);\n        // Rebuild this menu whenever the menu registry reports an event for this MenuId.\n        // This usually happen while code and extensions are loaded and affects the over\n        // structure of the menu\n        const rebuildMenuSoon = new RunOnceScheduler(() => {\n            this._menuInfo.refresh();\n            this._onDidChange.fire({ menu: this, isStructuralChange: true, isEnablementChange: true, isToggleChange: true });\n        }, options.eventDebounceDelay);\n        this._disposables.add(rebuildMenuSoon);\n        this._disposables.add(MenuRegistry.onDidChangeMenu(e => {\n            for (const id of this._menuInfo.allMenuIds) {\n                if (e.has(id)) {\n                    rebuildMenuSoon.schedule();\n                    break;\n                }\n            }\n        }));\n        // When context keys or storage state changes we need to check if the menu also has changed. However,\n        // we only do that when someone listens on this menu because (1) these events are\n        // firing often and (2) menu are often leaked\n        const lazyListener = this._disposables.add(new DisposableStore());\n        const merge = (events) => {\n            let isStructuralChange = false;\n            let isEnablementChange = false;\n            let isToggleChange = false;\n            for (const item of events) {\n                isStructuralChange = isStructuralChange || item.isStructuralChange;\n                isEnablementChange = isEnablementChange || item.isEnablementChange;\n                isToggleChange = isToggleChange || item.isToggleChange;\n                if (isStructuralChange && isEnablementChange && isToggleChange) {\n                    // everything is TRUE, no need to continue iterating\n                    break;\n                }\n            }\n            return { menu: this, isStructuralChange, isEnablementChange, isToggleChange };\n        };\n        const startLazyListener = () => {\n            lazyListener.add(contextKeyService.onDidChangeContext(e => {\n                const isStructuralChange = e.affectsSome(this._menuInfo.structureContextKeys);\n                const isEnablementChange = e.affectsSome(this._menuInfo.preconditionContextKeys);\n                const isToggleChange = e.affectsSome(this._menuInfo.toggledContextKeys);\n                if (isStructuralChange || isEnablementChange || isToggleChange) {\n                    this._onDidChange.fire({ menu: this, isStructuralChange, isEnablementChange, isToggleChange });\n                }\n            }));\n            lazyListener.add(hiddenStates.onDidChange(e => {\n                this._onDidChange.fire({ menu: this, isStructuralChange: true, isEnablementChange: false, isToggleChange: false });\n            }));\n        };\n        this._onDidChange = new DebounceEmitter({\n            // start/stop context key listener\n            onWillAddFirstListener: startLazyListener,\n            onDidRemoveLastListener: lazyListener.clear.bind(lazyListener),\n            delay: options.eventDebounceDelay,\n            merge\n        });\n        this.onDidChange = this._onDidChange.event;\n    }\n    getActions(options) {\n        return this._menuInfo.createActionGroups(options);\n    }\n    dispose() {\n        this._disposables.dispose();\n        this._onDidChange.dispose();\n    }\n};\nMenuImpl = __decorate([\n    __param(3, ICommandService),\n    __param(4, IKeybindingService),\n    __param(5, IContextKeyService)\n], MenuImpl);\nfunction createMenuHide(menu, command, states) {\n    const id = isISubmenuItem(command) ? command.submenu.id : command.id;\n    const title = typeof command.title === 'string' ? command.title : command.title.value;\n    const hide = toAction({\n        id: `hide/${menu.id}/${id}`,\n        label: localize(1651, 'Hide \\'{0}\\'', title),\n        run() { states.updateHidden(menu, id, true); }\n    });\n    const toggle = toAction({\n        id: `toggle/${menu.id}/${id}`,\n        label: title,\n        get checked() { return !states.isHidden(menu, id); },\n        run() { states.updateHidden(menu, id, !!this.checked); }\n    });\n    return {\n        hide,\n        toggle,\n        get isHidden() { return !toggle.checked; },\n    };\n}\nfunction createConfigureKeybindingAction(commandService, keybindingService, commandId, when = undefined, enabled = true) {\n    return toAction({\n        id: `configureKeybinding/${commandId}`,\n        label: localize(1652, \"Configure Keybinding\"),\n        enabled,\n        run() {\n            // Only set the when clause when there is no keybinding\n            // It is possible that the action and the keybinding have different when clauses\n            const hasKeybinding = !!keybindingService.lookupKeybinding(commandId); // This may only be called inside the `run()` method as it can be expensive on startup. #210529\n            const whenValue = !hasKeybinding && when ? when.serialize() : undefined;\n            commandService.executeCommand('workbench.action.openGlobalKeybindings', `@command:${commandId}` + (whenValue ? ` +when:${whenValue}` : ''));\n        }\n    });\n}\n\nexport { MenuService, createConfigureKeybindingAction };\n","import { Emitter } from '../../../base/common/event.js';\nimport { registerSingleton } from '../../instantiation/common/extensions.js';\nimport { createDecorator } from '../../instantiation/common/instantiation.js';\nimport { MenuId } from '../common/actions.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IActionViewItemService = createDecorator('IActionViewItemService');\nclass ActionViewItemService {\n    constructor() {\n        this._providers = new Map();\n        this._onDidChange = new Emitter();\n        this.onDidChange = this._onDidChange.event;\n    }\n    dispose() {\n        this._onDidChange.dispose();\n    }\n    lookUp(menu, commandOrMenuId) {\n        return this._providers.get(this._makeKey(menu, commandOrMenuId));\n    }\n    _makeKey(menu, commandOrMenuId) {\n        return `${menu.id}/${(commandOrMenuId instanceof MenuId ? commandOrMenuId.id : commandOrMenuId)}`;\n    }\n}\nregisterSingleton(IActionViewItemService, ActionViewItemService, 1 /* InstantiationType.Delayed */);\n\nexport { IActionViewItemService };\n","import { addDisposableListener, getWindow } from '../../../base/browser/dom.js';\nimport { StandardMouseEvent } from '../../../base/browser/mouseEvent.js';\nimport { ToolBar, ToggleMenuAction } from '../../../base/browser/ui/toolbar/toolbar.js';\nimport { Separator, toAction } from '../../../base/common/actions.js';\nimport { coalesceInPlace } from '../../../base/common/arrays.js';\nimport { intersection } from '../../../base/common/collections.js';\nimport { BugIndicatingError } from '../../../base/common/errors.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { Iterable } from '../../../base/common/iterator.js';\nimport { DisposableStore } from '../../../base/common/lifecycle.js';\nimport { localize } from '../../../nls.js';\nimport { createActionViewItem, getActionBarActions } from './menuEntryActionViewItem.js';\nimport { IMenuService, MenuItemAction, SubmenuItemAction } from '../common/actions.js';\nimport { createConfigureKeybindingAction } from '../common/menuService.js';\nimport { ICommandService } from '../../commands/common/commands.js';\nimport { IContextKeyService } from '../../contextkey/common/contextkey.js';\nimport { IContextMenuService } from '../../contextview/browser/contextView.js';\nimport { IKeybindingService } from '../../keybinding/common/keybinding.js';\nimport { ITelemetryService } from '../../telemetry/common/telemetry.js';\nimport { IActionViewItemService } from './actionViewItemService.js';\nimport { IInstantiationService } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/**\n * The `WorkbenchToolBar` does\n * - support hiding of menu items\n * - lookup keybindings for each actions automatically\n * - send `workbenchActionExecuted`-events for each action\n *\n * See {@link MenuWorkbenchToolBar} for a toolbar that is backed by a menu.\n */\nlet WorkbenchToolBar = class WorkbenchToolBar extends ToolBar {\n    constructor(container, _options, _menuService, _contextKeyService, _contextMenuService, _keybindingService, _commandService, telemetryService) {\n        super(container, _contextMenuService, {\n            // defaults\n            getKeyBinding: (action) => _keybindingService.lookupKeybinding(action.id) ?? undefined,\n            // options (override defaults)\n            ..._options,\n            // mandatory (overide options)\n            allowContextMenu: true,\n            skipTelemetry: typeof _options?.telemetrySource === 'string',\n        });\n        this._options = _options;\n        this._menuService = _menuService;\n        this._contextKeyService = _contextKeyService;\n        this._contextMenuService = _contextMenuService;\n        this._keybindingService = _keybindingService;\n        this._commandService = _commandService;\n        this._sessionDisposables = this._store.add(new DisposableStore());\n        // telemetry logic\n        const telemetrySource = _options?.telemetrySource;\n        if (telemetrySource) {\n            this._store.add(this.actionBar.onDidRun(e => telemetryService.publicLog2('workbenchActionExecuted', { id: e.action.id, from: telemetrySource })));\n        }\n    }\n    setActions(_primary, _secondary = [], menuIds) {\n        this._sessionDisposables.clear();\n        const primary = _primary.slice(); // for hiding and overflow we set some items to undefined\n        const secondary = _secondary.slice();\n        const toggleActions = [];\n        let toggleActionsCheckedCount = 0;\n        const extraSecondary = [];\n        let someAreHidden = false;\n        // unless disabled, move all hidden items to secondary group or ignore them\n        if (this._options?.hiddenItemStrategy !== -1 /* HiddenItemStrategy.NoHide */) {\n            for (let i = 0; i < primary.length; i++) {\n                const action = primary[i];\n                if (!(action instanceof MenuItemAction) && !(action instanceof SubmenuItemAction)) {\n                    // console.warn(`Action ${action.id}/${action.label} is not a MenuItemAction`);\n                    continue;\n                }\n                if (!action.hideActions) {\n                    continue;\n                }\n                // collect all toggle actions\n                toggleActions.push(action.hideActions.toggle);\n                if (action.hideActions.toggle.checked) {\n                    toggleActionsCheckedCount++;\n                }\n                // hidden items move into overflow or ignore\n                if (action.hideActions.isHidden) {\n                    someAreHidden = true;\n                    primary[i] = undefined;\n                    if (this._options?.hiddenItemStrategy !== 0 /* HiddenItemStrategy.Ignore */) {\n                        extraSecondary[i] = action;\n                    }\n                }\n            }\n        }\n        // count for max\n        if (this._options?.overflowBehavior !== undefined) {\n            const exemptedIds = intersection(new Set(this._options.overflowBehavior.exempted), Iterable.map(primary, a => a?.id));\n            const maxItems = this._options.overflowBehavior.maxItems - exemptedIds.size;\n            let count = 0;\n            for (let i = 0; i < primary.length; i++) {\n                const action = primary[i];\n                if (!action) {\n                    continue;\n                }\n                count++;\n                if (exemptedIds.has(action.id)) {\n                    continue;\n                }\n                if (count >= maxItems) {\n                    primary[i] = undefined;\n                    extraSecondary[i] = action;\n                }\n            }\n        }\n        // coalesce turns Array<IAction|undefined> into IAction[]\n        coalesceInPlace(primary);\n        coalesceInPlace(extraSecondary);\n        super.setActions(primary, Separator.join(extraSecondary, secondary));\n        // add context menu for toggle and configure keybinding actions\n        if (toggleActions.length > 0 || primary.length > 0) {\n            this._sessionDisposables.add(addDisposableListener(this.getElement(), 'contextmenu', e => {\n                const event = new StandardMouseEvent(getWindow(this.getElement()), e);\n                const action = this.getItemAction(event.target);\n                if (!(action)) {\n                    return;\n                }\n                event.preventDefault();\n                event.stopPropagation();\n                const primaryActions = [];\n                // -- Configure Keybinding Action --\n                if (action instanceof MenuItemAction && action.menuKeybinding) {\n                    primaryActions.push(action.menuKeybinding);\n                }\n                else if (!(action instanceof SubmenuItemAction || action instanceof ToggleMenuAction)) {\n                    // only enable the configure keybinding action for actions that support keybindings\n                    const supportsKeybindings = !!this._keybindingService.lookupKeybinding(action.id);\n                    primaryActions.push(createConfigureKeybindingAction(this._commandService, this._keybindingService, action.id, undefined, supportsKeybindings));\n                }\n                // -- Hide Actions --\n                if (toggleActions.length > 0) {\n                    let noHide = false;\n                    // last item cannot be hidden when using ignore strategy\n                    if (toggleActionsCheckedCount === 1 && this._options?.hiddenItemStrategy === 0 /* HiddenItemStrategy.Ignore */) {\n                        noHide = true;\n                        for (let i = 0; i < toggleActions.length; i++) {\n                            if (toggleActions[i].checked) {\n                                toggleActions[i] = toAction({\n                                    id: action.id,\n                                    label: action.label,\n                                    checked: true,\n                                    enabled: false,\n                                    run() { }\n                                });\n                                break; // there is only one\n                            }\n                        }\n                    }\n                    // add \"hide foo\" actions\n                    if (!noHide && (action instanceof MenuItemAction || action instanceof SubmenuItemAction)) {\n                        if (!action.hideActions) {\n                            // no context menu for MenuItemAction instances that support no hiding\n                            // those are fake actions and need to be cleaned up\n                            return;\n                        }\n                        primaryActions.push(action.hideActions.hide);\n                    }\n                    else {\n                        primaryActions.push(toAction({\n                            id: 'label',\n                            label: localize(1649, \"Hide\"),\n                            enabled: false,\n                            run() { }\n                        }));\n                    }\n                }\n                const actions = Separator.join(primaryActions, toggleActions);\n                // add \"Reset Menu\" action\n                if (this._options?.resetMenu && !menuIds) {\n                    menuIds = [this._options.resetMenu];\n                }\n                if (someAreHidden && menuIds) {\n                    actions.push(new Separator());\n                    actions.push(toAction({\n                        id: 'resetThisMenu',\n                        label: localize(1650, \"Reset Menu\"),\n                        run: () => this._menuService.resetHiddenStates(menuIds)\n                    }));\n                }\n                if (actions.length === 0) {\n                    return;\n                }\n                this._contextMenuService.showContextMenu({\n                    getAnchor: () => event,\n                    getActions: () => actions,\n                    // add context menu actions (iff appicable)\n                    menuId: this._options?.contextMenu,\n                    menuActionOptions: { renderShortTitle: true, ...this._options?.menuOptions },\n                    skipTelemetry: typeof this._options?.telemetrySource === 'string',\n                    contextKeyService: this._contextKeyService,\n                });\n            }));\n        }\n    }\n};\nWorkbenchToolBar = __decorate([\n    __param(2, IMenuService),\n    __param(3, IContextKeyService),\n    __param(4, IContextMenuService),\n    __param(5, IKeybindingService),\n    __param(6, ICommandService),\n    __param(7, ITelemetryService)\n], WorkbenchToolBar);\n/**\n * A {@link WorkbenchToolBar workbench toolbar} that is purely driven from a {@link MenuId menu}-identifier.\n *\n * *Note* that Manual updates via `setActions` are NOT supported.\n */\nlet MenuWorkbenchToolBar = class MenuWorkbenchToolBar extends WorkbenchToolBar {\n    get onDidChangeMenuItems() { return this._onDidChangeMenuItems.event; }\n    constructor(container, menuId, options, menuService, contextKeyService, contextMenuService, keybindingService, commandService, telemetryService, actionViewService, instantiationService) {\n        super(container, {\n            resetMenu: menuId,\n            ...options,\n            actionViewItemProvider: (action, opts) => {\n                let provider = actionViewService.lookUp(menuId, action instanceof SubmenuItemAction ? action.item.submenu.id : action.id);\n                if (!provider) {\n                    provider = options?.actionViewItemProvider;\n                }\n                const viewItem = provider?.(action, opts, instantiationService, getWindow(container).vscodeWindowId);\n                if (viewItem) {\n                    return viewItem;\n                }\n                return createActionViewItem(instantiationService, action, opts);\n            }\n        }, menuService, contextKeyService, contextMenuService, keybindingService, commandService, telemetryService);\n        this._onDidChangeMenuItems = this._store.add(new Emitter());\n        // update logic\n        const menu = this._store.add(menuService.createMenu(menuId, contextKeyService, { emitEventsForSubmenuChanges: true, eventDebounceDelay: options?.eventDebounceDelay }));\n        const updateToolbar = () => {\n            const { primary, secondary } = getActionBarActions(menu.getActions(options?.menuOptions), options?.toolbarOptions?.primaryGroup, options?.toolbarOptions?.shouldInlineSubmenu, options?.toolbarOptions?.useSeparatorsInPrimaryActions);\n            container.classList.toggle('has-no-actions', primary.length === 0 && secondary.length === 0);\n            super.setActions(primary, secondary);\n        };\n        this._store.add(menu.onDidChange(() => {\n            updateToolbar();\n            this._onDidChangeMenuItems.fire(this);\n        }));\n        this._store.add(actionViewService.onDidChange(e => {\n            if (e === menuId) {\n                updateToolbar();\n            }\n        }));\n        updateToolbar();\n    }\n    /**\n     * @deprecated The WorkbenchToolBar does not support this method because it works with menus.\n     */\n    setActions() {\n        throw new BugIndicatingError('This toolbar is populated from a menu.');\n    }\n};\nMenuWorkbenchToolBar = __decorate([\n    __param(3, IMenuService),\n    __param(4, IContextKeyService),\n    __param(5, IContextMenuService),\n    __param(6, IKeybindingService),\n    __param(7, ICommandService),\n    __param(8, ITelemetryService),\n    __param(9, IActionViewItemService),\n    __param(10, IInstantiationService)\n], MenuWorkbenchToolBar);\n\nexport { MenuWorkbenchToolBar, WorkbenchToolBar };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\nimport { Disposable, DisposableStore } from '../../../base/common/lifecycle.js';\nimport { IConfigurationService } from '../../configuration/common/configuration.js';\nimport { isHTMLElement, addStandardDisposableListener } from '../../../base/browser/dom.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst IHoverService = createDecorator('hoverService');\nlet WorkbenchHoverDelegate = class WorkbenchHoverDelegate extends Disposable {\n    get delay() {\n        if (this.isInstantlyHovering()) {\n            return 0; // show instantly when a hover was recently shown\n        }\n        if (this.hoverOptions?.dynamicDelay) {\n            return content => this.hoverOptions?.dynamicDelay?.(content) ?? this._delay;\n        }\n        return this._delay;\n    }\n    constructor(placement, hoverOptions, overrideOptions = {}, configurationService, hoverService) {\n        super();\n        this.placement = placement;\n        this.hoverOptions = hoverOptions;\n        this.overrideOptions = overrideOptions;\n        this.configurationService = configurationService;\n        this.hoverService = hoverService;\n        this.lastHoverHideTime = 0;\n        this.timeLimit = 200;\n        this.hoverDisposables = this._register(new DisposableStore());\n        this._delay = this.configurationService.getValue('workbench.hover.delay');\n        this._register(this.configurationService.onDidChangeConfiguration(e => {\n            if (e.affectsConfiguration('workbench.hover.delay')) {\n                this._delay = this.configurationService.getValue('workbench.hover.delay');\n            }\n        }));\n    }\n    showHover(options, focus) {\n        const overrideOptions = typeof this.overrideOptions === 'function' ? this.overrideOptions(options, focus) : this.overrideOptions;\n        // close hover on escape\n        this.hoverDisposables.clear();\n        const targets = isHTMLElement(options.target) ? [options.target] : options.target.targetElements;\n        for (const target of targets) {\n            this.hoverDisposables.add(addStandardDisposableListener(target, 'keydown', (e) => {\n                if (e.equals(9 /* KeyCode.Escape */)) {\n                    this.hoverService.hideHover();\n                }\n            }));\n        }\n        const id = isHTMLElement(options.content)\n            ? undefined\n            : typeof options.content === 'string'\n                ? options.content.toString()\n                : options.content.value;\n        return this.hoverService.showInstantHover({\n            ...options,\n            ...overrideOptions,\n            persistence: {\n                hideOnKeyDown: true,\n                ...overrideOptions.persistence\n            },\n            id,\n            appearance: {\n                ...options.appearance,\n                compact: true,\n                skipFadeInAnimation: this.isInstantlyHovering(),\n                ...overrideOptions.appearance\n            }\n        }, focus);\n    }\n    isInstantlyHovering() {\n        return !!this.hoverOptions?.instantHover && Date.now() - this.lastHoverHideTime < this.timeLimit;\n    }\n    onDidHideHover() {\n        this.hoverDisposables.clear();\n        if (this.hoverOptions?.instantHover) {\n            this.lastHoverHideTime = Date.now();\n        }\n    }\n};\nWorkbenchHoverDelegate = __decorate([\n    __param(3, IConfigurationService),\n    __param(4, IHoverService)\n], WorkbenchHoverDelegate);\n// TODO@benibenj remove this, only temp fix for contextviews\nconst nativeHoverDelegate = {\n    showHover: function () {\n        throw new Error('Native hover function not implemented.');\n    },\n    delay: 0,\n    showNativeHover: true\n};\n\nexport { IHoverService, WorkbenchHoverDelegate, nativeHoverDelegate };\n","import { AbstractText } from '../core/text/abstractText.js';\nimport { TextLength } from '../core/text/textLength.js';\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 *--------------------------------------------------------------------------------------------*/\nclass TextModelText extends AbstractText {\n    constructor(_textModel) {\n        super();\n        this._textModel = _textModel;\n    }\n    getValueOfRange(range) {\n        return this._textModel.getValueInRange(range);\n    }\n    getLineLength(lineNumber) {\n        return this._textModel.getLineLength(lineNumber);\n    }\n    get length() {\n        const lastLineNumber = this._textModel.getLineCount();\n        const lastLineLen = this._textModel.getLineLength(lastLineNumber);\n        return new TextLength(lastLineNumber - 1, lastLineLen);\n    }\n}\n\nexport { TextModelText };\n","import { ActionRunner } from '../../../../base/common/actions.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ActionRunnerWithContext extends ActionRunner {\n    constructor(_getContext) {\n        super();\n        this._getContext = _getContext;\n    }\n    runAction(action, _context) {\n        const ctx = this._getContext();\n        return super.runAction(action, ctx);\n    }\n}\n\nexport { ActionRunnerWithContext };\n","import { h, reset } from '../../../../../base/browser/dom.js';\nimport { Disposable, toDisposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { LineRange } from '../../../../common/core/ranges/lineRange.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { observableFromEvent } from '../../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { observableSignalFromEvent } from '../../../../../base/common/observableInternal/observables/observableSignalFromEvent.js';\nimport { observableSignal } from '../../../../../base/common/observableInternal/observables/observableSignal.js';\nimport { transaction } from '../../../../../base/common/observableInternal/transaction.js';\nimport { autorun } from '../../../../../base/common/observableInternal/reactions/autorun.js';\nimport { observableValue } from '../../../../../base/common/observableInternal/observables/observableValue.js';\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 *--------------------------------------------------------------------------------------------*/\nclass EditorGutter extends Disposable {\n    constructor(_editor, _domNode, itemProvider) {\n        super();\n        this._editor = _editor;\n        this._domNode = _domNode;\n        this.itemProvider = itemProvider;\n        this.scrollTop = observableFromEvent(this, this._editor.onDidScrollChange, (e) => /** @description editor.onDidScrollChange */ this._editor.getScrollTop());\n        this.isScrollTopZero = this.scrollTop.map((scrollTop) => /** @description isScrollTopZero */ scrollTop === 0);\n        this.modelAttached = observableFromEvent(this, this._editor.onDidChangeModel, (e) => /** @description editor.onDidChangeModel */ this._editor.hasModel());\n        this.editorOnDidChangeViewZones = observableSignalFromEvent('onDidChangeViewZones', this._editor.onDidChangeViewZones);\n        this.editorOnDidContentSizeChange = observableSignalFromEvent('onDidContentSizeChange', this._editor.onDidContentSizeChange);\n        this.domNodeSizeChanged = observableSignal('domNodeSizeChanged');\n        this.views = new Map();\n        this._domNode.className = 'gutter monaco-editor';\n        const scrollDecoration = this._domNode.appendChild(h('div.scroll-decoration', { role: 'presentation', ariaHidden: 'true', style: { width: '100%' } })\n            .root);\n        const o = new ResizeObserver(() => {\n            transaction(tx => {\n                /** @description ResizeObserver: size changed */\n                this.domNodeSizeChanged.trigger(tx);\n            });\n        });\n        o.observe(this._domNode);\n        this._register(toDisposable(() => o.disconnect()));\n        this._register(autorun(reader => {\n            /** @description update scroll decoration */\n            scrollDecoration.className = this.isScrollTopZero.read(reader) ? '' : 'scroll-decoration';\n        }));\n        this._register(autorun(reader => /** @description EditorGutter.Render */ this.render(reader)));\n    }\n    dispose() {\n        super.dispose();\n        reset(this._domNode);\n    }\n    render(reader) {\n        if (!this.modelAttached.read(reader)) {\n            return;\n        }\n        this.domNodeSizeChanged.read(reader);\n        this.editorOnDidChangeViewZones.read(reader);\n        this.editorOnDidContentSizeChange.read(reader);\n        const scrollTop = this.scrollTop.read(reader);\n        const visibleRanges = this._editor.getVisibleRanges();\n        const unusedIds = new Set(this.views.keys());\n        const viewRange = OffsetRange.ofStartAndLength(0, this._domNode.clientHeight);\n        if (!viewRange.isEmpty) {\n            for (const visibleRange of visibleRanges) {\n                const visibleRange2 = new LineRange(visibleRange.startLineNumber, visibleRange.endLineNumber + 1);\n                const gutterItems = this.itemProvider.getIntersectingGutterItems(visibleRange2, reader);\n                transaction(tx => {\n                    /** EditorGutter.render */\n                    for (const gutterItem of gutterItems) {\n                        if (!gutterItem.range.intersect(visibleRange2)) {\n                            continue;\n                        }\n                        unusedIds.delete(gutterItem.id);\n                        let view = this.views.get(gutterItem.id);\n                        if (!view) {\n                            const viewDomNode = document.createElement('div');\n                            this._domNode.appendChild(viewDomNode);\n                            const gutterItemObs = observableValue('item', gutterItem);\n                            const itemView = this.itemProvider.createView(gutterItemObs, viewDomNode);\n                            view = new ManagedGutterItemView(gutterItemObs, itemView, viewDomNode);\n                            this.views.set(gutterItem.id, view);\n                        }\n                        else {\n                            view.item.set(gutterItem, tx);\n                        }\n                        const top = gutterItem.range.startLineNumber <= this._editor.getModel().getLineCount()\n                            ? this._editor.getTopForLineNumber(gutterItem.range.startLineNumber, true) - scrollTop\n                            : gutterItem.range.startLineNumber > 1\n                                ? this._editor.getBottomForLineNumber(gutterItem.range.startLineNumber - 1, false) - scrollTop\n                                : 0;\n                        const bottom = gutterItem.range.endLineNumberExclusive === 1 ?\n                            Math.max(top, this._editor.getTopForLineNumber(gutterItem.range.startLineNumber, false) - scrollTop)\n                            : Math.max(top, this._editor.getBottomForLineNumber(gutterItem.range.endLineNumberExclusive - 1, true) - scrollTop);\n                        const height = bottom - top;\n                        view.domNode.style.top = `${top}px`;\n                        view.domNode.style.height = `${height}px`;\n                        view.gutterItemView.layout(OffsetRange.ofStartAndLength(top, height), viewRange);\n                    }\n                });\n            }\n        }\n        for (const id of unusedIds) {\n            const view = this.views.get(id);\n            view.gutterItemView.dispose();\n            view.domNode.remove();\n            this.views.delete(id);\n        }\n    }\n}\nclass ManagedGutterItemView {\n    constructor(item, gutterItemView, domNode) {\n        this.item = item;\n        this.gutterItemView = gutterItemView;\n        this.domNode = domNode;\n    }\n}\n\nexport { EditorGutter };\n","import { h, addDisposableListener, EventType } from '../../../../../base/browser/dom.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { MenuWorkbenchToolBar } from '../../../../../platform/actions/browser/toolbar.js';\nimport { IMenuService, MenuId } from '../../../../../platform/actions/common/actions.js';\nimport { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { WorkbenchHoverDelegate } from '../../../../../platform/hover/browser/hover.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { LineRangeSet, LineRange } from '../../../../common/core/ranges/lineRange.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { TextEdit } from '../../../../common/core/edits/textEdit.js';\nimport { DetailedLineRangeMapping } from '../../../../common/diff/rangeMapping.js';\nimport { TextModelText } from '../../../../common/model/textModelText.js';\nimport { ActionRunnerWithContext } from '../../multiDiffEditor/utils.js';\nimport { DiffEditorSash } from '../components/diffEditorSash.js';\nimport { prependRemoveOnDispose, applyStyle, appendRemoveOnDispose } from '../utils.js';\nimport { EditorGutter } from '../utils/editorGutter.js';\nimport { derived, derivedDisposable, derivedWithSetter } from '../../../../../base/common/observableInternal/observables/derived.js';\nimport { observableFromEvent } from '../../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { observableValue } from '../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { autorun, autorunWithStore } from '../../../../../base/common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst emptyArr = [];\nconst width = 35;\nlet DiffEditorGutter = class DiffEditorGutter extends Disposable {\n    constructor(diffEditorRoot, _diffModel, _editors, _options, _sashLayout, _boundarySashes, _instantiationService, _contextKeyService, _menuService) {\n        super();\n        this._diffModel = _diffModel;\n        this._editors = _editors;\n        this._options = _options;\n        this._sashLayout = _sashLayout;\n        this._boundarySashes = _boundarySashes;\n        this._instantiationService = _instantiationService;\n        this._contextKeyService = _contextKeyService;\n        this._menuService = _menuService;\n        this._menu = this._register(this._menuService.createMenu(MenuId.DiffEditorHunkToolbar, this._contextKeyService));\n        this._actions = observableFromEvent(this, this._menu.onDidChange, () => this._menu.getActions());\n        this._hasActions = this._actions.map(a => a.length > 0);\n        this._showSash = derived(this, reader => this._options.renderSideBySide.read(reader) && this._hasActions.read(reader));\n        this.width = derived(this, reader => this._hasActions.read(reader) ? width : 0);\n        this.elements = h('div.gutter@gutter', { style: { position: 'absolute', height: '100%', width: width + 'px' } }, []);\n        this._currentDiff = derived(this, (reader) => {\n            const model = this._diffModel.read(reader);\n            if (!model) {\n                return undefined;\n            }\n            const mappings = model.diff.read(reader)?.mappings;\n            const cursorPosition = this._editors.modifiedCursor.read(reader);\n            if (!cursorPosition) {\n                return undefined;\n            }\n            return mappings?.find(m => m.lineRangeMapping.modified.contains(cursorPosition.lineNumber));\n        });\n        this._selectedDiffs = derived(this, (reader) => {\n            /** @description selectedDiffs */\n            const model = this._diffModel.read(reader);\n            const diff = model?.diff.read(reader);\n            // Return `emptyArr` because it is a constant. [] is always a new array and would trigger a change.\n            if (!diff) {\n                return emptyArr;\n            }\n            const selections = this._editors.modifiedSelections.read(reader);\n            if (selections.every(s => s.isEmpty())) {\n                return emptyArr;\n            }\n            const selectedLineNumbers = new LineRangeSet(selections.map(s => LineRange.fromRangeInclusive(s)));\n            const selectedMappings = diff.mappings.filter(m => m.lineRangeMapping.innerChanges && selectedLineNumbers.intersects(m.lineRangeMapping.modified));\n            const result = selectedMappings.map(mapping => ({\n                mapping,\n                rangeMappings: mapping.lineRangeMapping.innerChanges.filter(c => selections.some(s => Range.areIntersecting(c.modifiedRange, s)))\n            }));\n            if (result.length === 0 || result.every(r => r.rangeMappings.length === 0)) {\n                return emptyArr;\n            }\n            return result;\n        });\n        this._register(prependRemoveOnDispose(diffEditorRoot, this.elements.root));\n        this._register(addDisposableListener(this.elements.root, 'click', () => {\n            this._editors.modified.focus();\n        }));\n        this._register(applyStyle(this.elements.root, { display: this._hasActions.map(a => a ? 'block' : 'none') }));\n        derivedDisposable(this, reader => {\n            const showSash = this._showSash.read(reader);\n            return !showSash ? undefined : new DiffEditorSash(diffEditorRoot, this._sashLayout.dimensions, this._options.enableSplitViewResizing, this._boundarySashes, derivedWithSetter(this, reader => this._sashLayout.sashLeft.read(reader) - width, (v, tx) => this._sashLayout.sashLeft.set(v + width, tx)), () => this._sashLayout.resetSash());\n        }).recomputeInitiallyAndOnChange(this._store);\n        const gutterItems = derived(this, reader => {\n            const model = this._diffModel.read(reader);\n            if (!model) {\n                return [];\n            }\n            const diffs = model.diff.read(reader);\n            if (!diffs) {\n                return [];\n            }\n            const selection = this._selectedDiffs.read(reader);\n            if (selection.length > 0) {\n                const m = DetailedLineRangeMapping.fromRangeMappings(selection.flatMap(s => s.rangeMappings));\n                return [\n                    new DiffGutterItem(m, true, MenuId.DiffEditorSelectionToolbar, undefined, model.model.original.uri, model.model.modified.uri)\n                ];\n            }\n            const currentDiff = this._currentDiff.read(reader);\n            return diffs.mappings.map(m => new DiffGutterItem(m.lineRangeMapping.withInnerChangesFromLineRanges(), m.lineRangeMapping === currentDiff?.lineRangeMapping, MenuId.DiffEditorHunkToolbar, undefined, model.model.original.uri, model.model.modified.uri));\n        });\n        this._register(new EditorGutter(this._editors.modified, this.elements.root, {\n            getIntersectingGutterItems: (range, reader) => gutterItems.read(reader),\n            createView: (item, target) => {\n                return this._instantiationService.createInstance(DiffToolBar, item, target, this);\n            },\n        }));\n        this._register(addDisposableListener(this.elements.gutter, EventType.MOUSE_WHEEL, (e) => {\n            if (this._editors.modified.getOption(117 /* EditorOption.scrollbar */).handleMouseWheel) {\n                this._editors.modified.delegateScrollFromMouseWheelEvent(e);\n            }\n        }, { passive: false }));\n    }\n    computeStagedValue(mapping) {\n        const c = mapping.innerChanges ?? [];\n        const modified = new TextModelText(this._editors.modifiedModel.get());\n        const original = new TextModelText(this._editors.original.getModel());\n        const edit = new TextEdit(c.map(c => c.toTextEdit(modified)));\n        const value = edit.apply(original);\n        return value;\n    }\n    layout(left) {\n        this.elements.gutter.style.left = left + 'px';\n    }\n};\nDiffEditorGutter = __decorate([\n    __param(6, IInstantiationService),\n    __param(7, IContextKeyService),\n    __param(8, IMenuService)\n], DiffEditorGutter);\nclass DiffGutterItem {\n    constructor(mapping, showAlways, menuId, rangeOverride, originalUri, modifiedUri) {\n        this.mapping = mapping;\n        this.showAlways = showAlways;\n        this.menuId = menuId;\n        this.rangeOverride = rangeOverride;\n        this.originalUri = originalUri;\n        this.modifiedUri = modifiedUri;\n    }\n    get id() { return this.mapping.modified.toString(); }\n    get range() { return this.rangeOverride ?? this.mapping.modified; }\n}\nlet DiffToolBar = class DiffToolBar extends Disposable {\n    constructor(_item, target, gutter, instantiationService) {\n        super();\n        this._item = _item;\n        this._elements = h('div.gutterItem', { style: { height: '20px', width: '34px' } }, [\n            h('div.background@background', {}, []),\n            h('div.buttons@buttons', {}, []),\n        ]);\n        this._showAlways = this._item.map(this, item => item.showAlways);\n        this._menuId = this._item.map(this, item => item.menuId);\n        this._isSmall = observableValue(this, false);\n        this._lastItemRange = undefined;\n        this._lastViewRange = undefined;\n        const hoverDelegate = this._register(instantiationService.createInstance(WorkbenchHoverDelegate, 'element', { instantHover: true }, { position: { hoverPosition: 1 /* HoverPosition.RIGHT */ } }));\n        this._register(appendRemoveOnDispose(target, this._elements.root));\n        this._register(autorun(reader => {\n            /** @description update showAlways */\n            const showAlways = this._showAlways.read(reader);\n            this._elements.root.classList.toggle('noTransition', true);\n            this._elements.root.classList.toggle('showAlways', showAlways);\n            setTimeout(() => {\n                this._elements.root.classList.toggle('noTransition', false);\n            }, 0);\n        }));\n        this._register(autorunWithStore((reader, store) => {\n            this._elements.buttons.replaceChildren();\n            const i = store.add(instantiationService.createInstance(MenuWorkbenchToolBar, this._elements.buttons, this._menuId.read(reader), {\n                orientation: 1 /* ActionsOrientation.VERTICAL */,\n                hoverDelegate,\n                toolbarOptions: {\n                    primaryGroup: g => g.startsWith('primary'),\n                },\n                overflowBehavior: { maxItems: this._isSmall.read(reader) ? 1 : 3 },\n                hiddenItemStrategy: 0 /* HiddenItemStrategy.Ignore */,\n                actionRunner: store.add(new ActionRunnerWithContext(() => {\n                    const item = this._item.read(undefined);\n                    const mapping = item.mapping;\n                    return {\n                        mapping,\n                        originalWithModifiedChanges: gutter.computeStagedValue(mapping),\n                        originalUri: item.originalUri,\n                        modifiedUri: item.modifiedUri,\n                    };\n                })),\n                menuOptions: {\n                    shouldForwardArgs: true,\n                },\n            }));\n            store.add(i.onDidChangeMenuItems(() => {\n                if (this._lastItemRange) {\n                    this.layout(this._lastItemRange, this._lastViewRange);\n                }\n            }));\n        }));\n    }\n    layout(itemRange, viewRange) {\n        this._lastItemRange = itemRange;\n        this._lastViewRange = viewRange;\n        let itemHeight = this._elements.buttons.clientHeight;\n        this._isSmall.set(this._item.get().mapping.original.startLineNumber === 1 && itemRange.length < 30, undefined);\n        // Item might have changed\n        itemHeight = this._elements.buttons.clientHeight;\n        const middleHeight = itemRange.length / 2 - itemHeight / 2;\n        const margin = itemHeight;\n        let effectiveCheckboxTop = itemRange.start + middleHeight;\n        const preferredViewPortRange = OffsetRange.tryCreate(margin, viewRange.endExclusive - margin - itemHeight);\n        const preferredParentRange = OffsetRange.tryCreate(itemRange.start + margin, itemRange.endExclusive - itemHeight - margin);\n        if (preferredParentRange && preferredViewPortRange && preferredParentRange.start < preferredParentRange.endExclusive) {\n            effectiveCheckboxTop = preferredViewPortRange.clip(effectiveCheckboxTop);\n            effectiveCheckboxTop = preferredParentRange.clip(effectiveCheckboxTop);\n        }\n        this._elements.buttons.style.top = `${effectiveCheckboxTop - itemRange.start}px`;\n    }\n};\nDiffToolBar = __decorate([\n    __param(3, IInstantiationService)\n], DiffToolBar);\n\nexport { DiffEditorGutter };\n","import { h, $, reset, addDisposableListener, getWindow } from '../../../../../base/browser/dom.js';\nimport { renderLabelWithIcons, renderIcon } from '../../../../../base/browser/ui/iconLabel/iconLabels.js';\nimport { Codicon } from '../../../../../base/common/codicons.js';\nimport { MarkdownString } from '../../../../../base/common/htmlContent.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { ThemeIcon } from '../../../../../base/common/themables.js';\nimport { isDefined } from '../../../../../base/common/types.js';\nimport { localize } from '../../../../../nls.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { LineRange } from '../../../../common/core/ranges/lineRange.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { SymbolKinds } from '../../../../common/languages.js';\nimport { observableCodeEditor } from '../../../observableCodeEditor.js';\nimport { PlaceholderViewZone, applyObservableDecorations, ViewZoneOverlayWidget, applyStyle } from '../utils.js';\nimport { observableValue } from '../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { derivedDisposable, derived } from '../../../../../base/common/observableInternal/observables/derived.js';\nimport { transaction } from '../../../../../base/common/observableInternal/transaction.js';\nimport { autorun } from '../../../../../base/common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar HideUnchangedRegionsFeature_1;\n/**\n * Make sure to add the view zones to the editor!\n */\nlet HideUnchangedRegionsFeature = class HideUnchangedRegionsFeature extends Disposable {\n    static { HideUnchangedRegionsFeature_1 = this; }\n    static { this._breadcrumbsSourceFactory = observableValue(this, () => ({\n        dispose() {\n        },\n        getBreadcrumbItems(startRange, reader) {\n            return [];\n        },\n    })); }\n    static setBreadcrumbsSourceFactory(factory) {\n        this._breadcrumbsSourceFactory.set(factory, undefined);\n    }\n    get isUpdatingHiddenAreas() { return this._isUpdatingHiddenAreas; }\n    constructor(_editors, _diffModel, _options, _instantiationService) {\n        super();\n        this._editors = _editors;\n        this._diffModel = _diffModel;\n        this._options = _options;\n        this._instantiationService = _instantiationService;\n        this._modifiedOutlineSource = derivedDisposable(this, (reader) => {\n            const m = this._editors.modifiedModel.read(reader);\n            const factory = HideUnchangedRegionsFeature_1._breadcrumbsSourceFactory.read(reader);\n            return (!m || !factory) ? undefined : factory(m, this._instantiationService);\n        });\n        this._isUpdatingHiddenAreas = false;\n        this._register(this._editors.original.onDidChangeCursorPosition(e => {\n            if (e.reason === 1 /* CursorChangeReason.ContentFlush */) {\n                return;\n            }\n            const m = this._diffModel.get();\n            transaction(tx => {\n                for (const s of this._editors.original.getSelections() || []) {\n                    m?.ensureOriginalLineIsVisible(s.getStartPosition().lineNumber, 0 /* RevealPreference.FromCloserSide */, tx);\n                    m?.ensureOriginalLineIsVisible(s.getEndPosition().lineNumber, 0 /* RevealPreference.FromCloserSide */, tx);\n                }\n            });\n        }));\n        this._register(this._editors.modified.onDidChangeCursorPosition(e => {\n            if (e.reason === 1 /* CursorChangeReason.ContentFlush */) {\n                return;\n            }\n            const m = this._diffModel.get();\n            transaction(tx => {\n                for (const s of this._editors.modified.getSelections() || []) {\n                    m?.ensureModifiedLineIsVisible(s.getStartPosition().lineNumber, 0 /* RevealPreference.FromCloserSide */, tx);\n                    m?.ensureModifiedLineIsVisible(s.getEndPosition().lineNumber, 0 /* RevealPreference.FromCloserSide */, tx);\n                }\n            });\n        }));\n        const unchangedRegions = this._diffModel.map((m, reader) => {\n            const regions = m?.unchangedRegions.read(reader) ?? [];\n            if (regions.length === 1 && regions[0].modifiedLineNumber === 1 && regions[0].lineCount === this._editors.modifiedModel.read(reader)?.getLineCount()) {\n                return [];\n            }\n            return regions;\n        });\n        this.viewZones = derived(this, (reader) => {\n            /** @description view Zones */\n            const modifiedOutlineSource = this._modifiedOutlineSource.read(reader);\n            if (!modifiedOutlineSource) {\n                return { origViewZones: [], modViewZones: [] };\n            }\n            const origViewZones = [];\n            const modViewZones = [];\n            const sideBySide = this._options.renderSideBySide.read(reader);\n            const compactMode = this._options.compactMode.read(reader);\n            const curUnchangedRegions = unchangedRegions.read(reader);\n            for (let i = 0; i < curUnchangedRegions.length; i++) {\n                const r = curUnchangedRegions[i];\n                if (r.shouldHideControls(reader)) {\n                    continue;\n                }\n                if (compactMode && (i === 0 || i === curUnchangedRegions.length - 1)) {\n                    continue;\n                }\n                if (compactMode) {\n                    {\n                        const d = derived(this, reader => /** @description hiddenOriginalRangeStart */ r.getHiddenOriginalRange(reader).startLineNumber - 1);\n                        const origVz = new PlaceholderViewZone(d, 12);\n                        origViewZones.push(origVz);\n                        reader.store.add(new CompactCollapsedCodeOverlayWidget(this._editors.original, origVz, r, !sideBySide));\n                    }\n                    {\n                        const d = derived(this, reader => /** @description hiddenModifiedRangeStart */ r.getHiddenModifiedRange(reader).startLineNumber - 1);\n                        const modViewZone = new PlaceholderViewZone(d, 12);\n                        modViewZones.push(modViewZone);\n                        reader.store.add(new CompactCollapsedCodeOverlayWidget(this._editors.modified, modViewZone, r));\n                    }\n                }\n                else {\n                    {\n                        const d = derived(this, reader => /** @description hiddenOriginalRangeStart */ r.getHiddenOriginalRange(reader).startLineNumber - 1);\n                        const origVz = new PlaceholderViewZone(d, 24);\n                        origViewZones.push(origVz);\n                        reader.store.add(new CollapsedCodeOverlayWidget(this._editors.original, origVz, r, r.originalUnchangedRange, !sideBySide, modifiedOutlineSource, l => this._diffModel.get().ensureModifiedLineIsVisible(l, 2 /* RevealPreference.FromBottom */, undefined), this._options));\n                    }\n                    {\n                        const d = derived(this, reader => /** @description hiddenModifiedRangeStart */ r.getHiddenModifiedRange(reader).startLineNumber - 1);\n                        const modViewZone = new PlaceholderViewZone(d, 24);\n                        modViewZones.push(modViewZone);\n                        reader.store.add(new CollapsedCodeOverlayWidget(this._editors.modified, modViewZone, r, r.modifiedUnchangedRange, false, modifiedOutlineSource, l => this._diffModel.get().ensureModifiedLineIsVisible(l, 2 /* RevealPreference.FromBottom */, undefined), this._options));\n                    }\n                }\n            }\n            return { origViewZones, modViewZones, };\n        });\n        const unchangedLinesDecoration = {\n            description: 'unchanged lines',\n            className: 'diff-unchanged-lines',\n            isWholeLine: true,\n        };\n        const unchangedLinesDecorationShow = {\n            description: 'Fold Unchanged',\n            glyphMarginHoverMessage: new MarkdownString(undefined, { isTrusted: true, supportThemeIcons: true })\n                .appendMarkdown(localize(124, 'Fold Unchanged Region')),\n            glyphMarginClassName: 'fold-unchanged ' + ThemeIcon.asClassName(Codicon.fold),\n            zIndex: 10001,\n        };\n        this._register(applyObservableDecorations(this._editors.original, derived(this, reader => {\n            /** @description decorations */\n            const curUnchangedRegions = unchangedRegions.read(reader);\n            const result = curUnchangedRegions.map(r => ({\n                range: r.originalUnchangedRange.toInclusiveRange(),\n                options: unchangedLinesDecoration,\n            }));\n            for (const r of curUnchangedRegions) {\n                if (r.shouldHideControls(reader)) {\n                    result.push({\n                        range: Range.fromPositions(new Position(r.originalLineNumber, 1)),\n                        options: unchangedLinesDecorationShow,\n                    });\n                }\n            }\n            return result;\n        })));\n        this._register(applyObservableDecorations(this._editors.modified, derived(this, reader => {\n            /** @description decorations */\n            const curUnchangedRegions = unchangedRegions.read(reader);\n            const result = curUnchangedRegions.map(r => ({\n                range: r.modifiedUnchangedRange.toInclusiveRange(),\n                options: unchangedLinesDecoration,\n            }));\n            for (const r of curUnchangedRegions) {\n                if (r.shouldHideControls(reader)) {\n                    result.push({\n                        range: LineRange.ofLength(r.modifiedLineNumber, 1).toInclusiveRange(),\n                        options: unchangedLinesDecorationShow,\n                    });\n                }\n            }\n            return result;\n        })));\n        this._register(autorun((reader) => {\n            /** @description update folded unchanged regions */\n            const curUnchangedRegions = unchangedRegions.read(reader);\n            this._isUpdatingHiddenAreas = true;\n            try {\n                this._editors.original.setHiddenAreas(curUnchangedRegions.map(r => r.getHiddenOriginalRange(reader).toInclusiveRange()).filter(isDefined));\n                this._editors.modified.setHiddenAreas(curUnchangedRegions.map(r => r.getHiddenModifiedRange(reader).toInclusiveRange()).filter(isDefined));\n            }\n            finally {\n                this._isUpdatingHiddenAreas = false;\n            }\n        }));\n        this._register(this._editors.modified.onMouseUp(event => {\n            if (!event.event.rightButton && event.target.position && event.target.element?.className.includes('fold-unchanged')) {\n                const lineNumber = event.target.position.lineNumber;\n                const model = this._diffModel.get();\n                if (!model) {\n                    return;\n                }\n                const region = model.unchangedRegions.get().find(r => r.modifiedUnchangedRange.contains(lineNumber));\n                if (!region) {\n                    return;\n                }\n                region.collapseAll(undefined);\n                event.event.stopPropagation();\n                event.event.preventDefault();\n            }\n        }));\n        this._register(this._editors.original.onMouseUp(event => {\n            if (!event.event.rightButton && event.target.position && event.target.element?.className.includes('fold-unchanged')) {\n                const lineNumber = event.target.position.lineNumber;\n                const model = this._diffModel.get();\n                if (!model) {\n                    return;\n                }\n                const region = model.unchangedRegions.get().find(r => r.originalUnchangedRange.contains(lineNumber));\n                if (!region) {\n                    return;\n                }\n                region.collapseAll(undefined);\n                event.event.stopPropagation();\n                event.event.preventDefault();\n            }\n        }));\n    }\n};\nHideUnchangedRegionsFeature = HideUnchangedRegionsFeature_1 = __decorate([\n    __param(3, IInstantiationService)\n], HideUnchangedRegionsFeature);\nclass CompactCollapsedCodeOverlayWidget extends ViewZoneOverlayWidget {\n    constructor(editor, _viewZone, _unchangedRegion, _hide = false) {\n        const root = h('div.diff-hidden-lines-widget');\n        super(editor, _viewZone, root.root);\n        this._unchangedRegion = _unchangedRegion;\n        this._hide = _hide;\n        this._nodes = h('div.diff-hidden-lines-compact', [\n            h('div.line-left', []),\n            h('div.text@text', []),\n            h('div.line-right', [])\n        ]);\n        root.root.appendChild(this._nodes.root);\n        if (this._hide) {\n            this._nodes.root.replaceChildren();\n        }\n        this._register(autorun(reader => {\n            /** @description update labels */\n            if (!this._hide) {\n                const lineCount = this._unchangedRegion.getHiddenModifiedRange(reader).length;\n                const linesHiddenText = localize(125, '{0} hidden lines', lineCount);\n                this._nodes.text.innerText = linesHiddenText;\n            }\n        }));\n    }\n}\nclass CollapsedCodeOverlayWidget extends ViewZoneOverlayWidget {\n    constructor(_editor, _viewZone, _unchangedRegion, _unchangedRegionRange, _hide, _modifiedOutlineSource, _revealModifiedHiddenLine, _options) {\n        const root = h('div.diff-hidden-lines-widget');\n        super(_editor, _viewZone, root.root);\n        this._editor = _editor;\n        this._unchangedRegion = _unchangedRegion;\n        this._unchangedRegionRange = _unchangedRegionRange;\n        this._hide = _hide;\n        this._modifiedOutlineSource = _modifiedOutlineSource;\n        this._revealModifiedHiddenLine = _revealModifiedHiddenLine;\n        this._options = _options;\n        this._nodes = h('div.diff-hidden-lines', [\n            h('div.top@top', { title: localize(126, 'Click or drag to show more above') }),\n            h('div.center@content', { style: { display: 'flex' } }, [\n                h('div@first', { style: { display: 'flex', justifyContent: 'center', alignItems: 'center', flexShrink: '0' } }, [$('a', { title: localize(127, 'Show Unchanged Region'), role: 'button', onclick: () => { this._unchangedRegion.showAll(undefined); } }, ...renderLabelWithIcons('$(unfold)'))]),\n                h('div@others', { style: { display: 'flex', justifyContent: 'center', alignItems: 'center' } }),\n            ]),\n            h('div.bottom@bottom', { title: localize(128, 'Click or drag to show more below'), role: 'button' }),\n        ]);\n        root.root.appendChild(this._nodes.root);\n        if (!this._hide) {\n            this._register(applyStyle(this._nodes.first, { width: observableCodeEditor(this._editor).layoutInfoContentLeft }));\n        }\n        else {\n            reset(this._nodes.first);\n        }\n        this._register(autorun(reader => {\n            /** @description Update CollapsedCodeOverlayWidget canMove* css classes */\n            const isFullyRevealed = this._unchangedRegion.visibleLineCountTop.read(reader) + this._unchangedRegion.visibleLineCountBottom.read(reader) === this._unchangedRegion.lineCount;\n            this._nodes.bottom.classList.toggle('canMoveTop', !isFullyRevealed);\n            this._nodes.bottom.classList.toggle('canMoveBottom', this._unchangedRegion.visibleLineCountBottom.read(reader) > 0);\n            this._nodes.top.classList.toggle('canMoveTop', this._unchangedRegion.visibleLineCountTop.read(reader) > 0);\n            this._nodes.top.classList.toggle('canMoveBottom', !isFullyRevealed);\n            const isDragged = this._unchangedRegion.isDragged.read(reader);\n            const domNode = this._editor.getDomNode();\n            if (domNode) {\n                domNode.classList.toggle('draggingUnchangedRegion', !!isDragged);\n                if (isDragged === 'top') {\n                    domNode.classList.toggle('canMoveTop', this._unchangedRegion.visibleLineCountTop.read(reader) > 0);\n                    domNode.classList.toggle('canMoveBottom', !isFullyRevealed);\n                }\n                else if (isDragged === 'bottom') {\n                    domNode.classList.toggle('canMoveTop', !isFullyRevealed);\n                    domNode.classList.toggle('canMoveBottom', this._unchangedRegion.visibleLineCountBottom.read(reader) > 0);\n                }\n                else {\n                    domNode.classList.toggle('canMoveTop', false);\n                    domNode.classList.toggle('canMoveBottom', false);\n                }\n            }\n        }));\n        const editor = this._editor;\n        this._register(addDisposableListener(this._nodes.top, 'mousedown', e => {\n            if (e.button !== 0) {\n                return;\n            }\n            this._nodes.top.classList.toggle('dragging', true);\n            this._nodes.root.classList.toggle('dragging', true);\n            e.preventDefault();\n            const startTop = e.clientY;\n            let didMove = false;\n            const cur = this._unchangedRegion.visibleLineCountTop.get();\n            this._unchangedRegion.isDragged.set('top', undefined);\n            const window = getWindow(this._nodes.top);\n            const mouseMoveListener = addDisposableListener(window, 'mousemove', e => {\n                const currentTop = e.clientY;\n                const delta = currentTop - startTop;\n                didMove = didMove || Math.abs(delta) > 2;\n                const lineDelta = Math.round(delta / editor.getOption(75 /* EditorOption.lineHeight */));\n                const newVal = Math.max(0, Math.min(cur + lineDelta, this._unchangedRegion.getMaxVisibleLineCountTop()));\n                this._unchangedRegion.visibleLineCountTop.set(newVal, undefined);\n            });\n            const mouseUpListener = addDisposableListener(window, 'mouseup', e => {\n                if (!didMove) {\n                    this._unchangedRegion.showMoreAbove(this._options.hideUnchangedRegionsRevealLineCount.get(), undefined);\n                }\n                this._nodes.top.classList.toggle('dragging', false);\n                this._nodes.root.classList.toggle('dragging', false);\n                this._unchangedRegion.isDragged.set(undefined, undefined);\n                mouseMoveListener.dispose();\n                mouseUpListener.dispose();\n            });\n        }));\n        this._register(addDisposableListener(this._nodes.bottom, 'mousedown', e => {\n            if (e.button !== 0) {\n                return;\n            }\n            this._nodes.bottom.classList.toggle('dragging', true);\n            this._nodes.root.classList.toggle('dragging', true);\n            e.preventDefault();\n            const startTop = e.clientY;\n            let didMove = false;\n            const cur = this._unchangedRegion.visibleLineCountBottom.get();\n            this._unchangedRegion.isDragged.set('bottom', undefined);\n            const window = getWindow(this._nodes.bottom);\n            const mouseMoveListener = addDisposableListener(window, 'mousemove', e => {\n                const currentTop = e.clientY;\n                const delta = currentTop - startTop;\n                didMove = didMove || Math.abs(delta) > 2;\n                const lineDelta = Math.round(delta / editor.getOption(75 /* EditorOption.lineHeight */));\n                const newVal = Math.max(0, Math.min(cur - lineDelta, this._unchangedRegion.getMaxVisibleLineCountBottom()));\n                const top = this._unchangedRegionRange.endLineNumberExclusive > editor.getModel().getLineCount()\n                    ? editor.getContentHeight()\n                    : editor.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);\n                this._unchangedRegion.visibleLineCountBottom.set(newVal, undefined);\n                const top2 = this._unchangedRegionRange.endLineNumberExclusive > editor.getModel().getLineCount()\n                    ? editor.getContentHeight()\n                    : editor.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);\n                editor.setScrollTop(editor.getScrollTop() + (top2 - top));\n            });\n            const mouseUpListener = addDisposableListener(window, 'mouseup', e => {\n                this._unchangedRegion.isDragged.set(undefined, undefined);\n                if (!didMove) {\n                    const top = editor.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);\n                    this._unchangedRegion.showMoreBelow(this._options.hideUnchangedRegionsRevealLineCount.get(), undefined);\n                    const top2 = editor.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);\n                    editor.setScrollTop(editor.getScrollTop() + (top2 - top));\n                }\n                this._nodes.bottom.classList.toggle('dragging', false);\n                this._nodes.root.classList.toggle('dragging', false);\n                mouseMoveListener.dispose();\n                mouseUpListener.dispose();\n            });\n        }));\n        this._register(autorun(reader => {\n            /** @description update labels */\n            const children = [];\n            if (!this._hide) {\n                const lineCount = _unchangedRegion.getHiddenModifiedRange(reader).length;\n                const linesHiddenText = localize(129, '{0} hidden lines', lineCount);\n                const span = $('span', { title: localize(130, 'Double click to unfold') }, linesHiddenText);\n                span.addEventListener('dblclick', e => {\n                    if (e.button !== 0) {\n                        return;\n                    }\n                    e.preventDefault();\n                    this._unchangedRegion.showAll(undefined);\n                });\n                children.push(span);\n                const range = this._unchangedRegion.getHiddenModifiedRange(reader);\n                const items = this._modifiedOutlineSource.getBreadcrumbItems(range, reader);\n                if (items.length > 0) {\n                    children.push($('span', undefined, '\\u00a0\\u00a0|\\u00a0\\u00a0'));\n                    for (let i = 0; i < items.length; i++) {\n                        const item = items[i];\n                        const icon = SymbolKinds.toIcon(item.kind);\n                        const divItem = h('div.breadcrumb-item', {\n                            style: { display: 'flex', alignItems: 'center' },\n                        }, [\n                            renderIcon(icon),\n                            '\\u00a0',\n                            item.name,\n                            ...(i === items.length - 1\n                                ? []\n                                : [renderIcon(Codicon.chevronRight)])\n                        ]).root;\n                        children.push(divItem);\n                        divItem.onclick = () => {\n                            this._revealModifiedHiddenLine(item.startLineNumber);\n                        };\n                    }\n                }\n            }\n            reset(this._nodes.others, ...children);\n        }));\n    }\n}\n\nexport { HideUnchangedRegionsFeature };\n","import { h, addDisposableListener, EventType } from '../../../../../base/browser/dom.js';\nimport { renderIcon } from '../../../../../base/browser/ui/iconLabel/iconLabels.js';\nimport { Codicon } from '../../../../../base/common/codicons.js';\nimport { Disposable, toDisposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { LineRangeSet, LineRange } from '../../../../common/core/ranges/lineRange.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { LineRangeMapping } from '../../../../common/diff/rangeMapping.js';\nimport { GlyphMarginLane } from '../../../../common/model.js';\nimport { localize } from '../../../../../nls.js';\nimport { derived } from '../../../../../base/common/observableInternal/observables/derived.js';\nimport { autorunWithStore } from '../../../../../base/common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nconst emptyArr = [];\nclass RevertButtonsFeature extends Disposable {\n    constructor(_editors, _diffModel, _options, _widget) {\n        super();\n        this._editors = _editors;\n        this._diffModel = _diffModel;\n        this._options = _options;\n        this._widget = _widget;\n        this._selectedDiffs = derived(this, (reader) => {\n            /** @description selectedDiffs */\n            const model = this._diffModel.read(reader);\n            const diff = model?.diff.read(reader);\n            // Return `emptyArr` because it is a constant. [] is always a new array and would trigger a change.\n            if (!diff) {\n                return emptyArr;\n            }\n            const selections = this._editors.modifiedSelections.read(reader);\n            if (selections.every(s => s.isEmpty())) {\n                return emptyArr;\n            }\n            const selectedLineNumbers = new LineRangeSet(selections.map(s => LineRange.fromRangeInclusive(s)));\n            const selectedMappings = diff.mappings.filter(m => m.lineRangeMapping.innerChanges && selectedLineNumbers.intersects(m.lineRangeMapping.modified));\n            const result = selectedMappings.map(mapping => ({\n                mapping,\n                rangeMappings: mapping.lineRangeMapping.innerChanges.filter(c => selections.some(s => Range.areIntersecting(c.modifiedRange, s)))\n            }));\n            if (result.length === 0 || result.every(r => r.rangeMappings.length === 0)) {\n                return emptyArr;\n            }\n            return result;\n        });\n        this._register(autorunWithStore((reader, store) => {\n            if (!this._options.shouldRenderOldRevertArrows.read(reader)) {\n                return;\n            }\n            const model = this._diffModel.read(reader);\n            const diff = model?.diff.read(reader);\n            if (!model || !diff) {\n                return;\n            }\n            if (model.movedTextToCompare.read(reader)) {\n                return;\n            }\n            const glyphWidgetsModified = [];\n            const selectedDiffs = this._selectedDiffs.read(reader);\n            const selectedDiffsSet = new Set(selectedDiffs.map(d => d.mapping));\n            if (selectedDiffs.length > 0) {\n                // The button to revert the selection\n                const selections = this._editors.modifiedSelections.read(reader);\n                const btn = store.add(new RevertButton(selections[selections.length - 1].positionLineNumber, this._widget, selectedDiffs.flatMap(d => d.rangeMappings), true));\n                this._editors.modified.addGlyphMarginWidget(btn);\n                glyphWidgetsModified.push(btn);\n            }\n            for (const m of diff.mappings) {\n                if (selectedDiffsSet.has(m)) {\n                    continue;\n                }\n                if (!m.lineRangeMapping.modified.isEmpty && m.lineRangeMapping.innerChanges) {\n                    const btn = store.add(new RevertButton(m.lineRangeMapping.modified.startLineNumber, this._widget, m.lineRangeMapping, false));\n                    this._editors.modified.addGlyphMarginWidget(btn);\n                    glyphWidgetsModified.push(btn);\n                }\n            }\n            store.add(toDisposable(() => {\n                for (const w of glyphWidgetsModified) {\n                    this._editors.modified.removeGlyphMarginWidget(w);\n                }\n            }));\n        }));\n    }\n}\nclass RevertButton extends Disposable {\n    static { this.counter = 0; }\n    getId() { return this._id; }\n    constructor(_lineNumber, _widget, _diffs, _revertSelection) {\n        super();\n        this._lineNumber = _lineNumber;\n        this._widget = _widget;\n        this._diffs = _diffs;\n        this._revertSelection = _revertSelection;\n        this._id = `revertButton${RevertButton.counter++}`;\n        this._domNode = h('div.revertButton', {\n            title: this._revertSelection\n                ? localize(135, 'Revert Selected Changes')\n                : localize(136, 'Revert Change')\n        }, [renderIcon(Codicon.arrowRight)]).root;\n        this._register(addDisposableListener(this._domNode, EventType.MOUSE_DOWN, e => {\n            // don't prevent context menu from showing up\n            if (e.button !== 2) {\n                e.stopPropagation();\n                e.preventDefault();\n            }\n        }));\n        this._register(addDisposableListener(this._domNode, EventType.MOUSE_UP, e => {\n            e.stopPropagation();\n            e.preventDefault();\n        }));\n        this._register(addDisposableListener(this._domNode, EventType.CLICK, (e) => {\n            if (this._diffs instanceof LineRangeMapping) {\n                this._widget.revert(this._diffs);\n            }\n            else {\n                this._widget.revertRangeMappings(this._diffs);\n            }\n            e.stopPropagation();\n            e.preventDefault();\n        }));\n    }\n    /**\n     * Get the dom node of the glyph widget.\n     */\n    getDomNode() {\n        return this._domNode;\n    }\n    /**\n     * Get the placement of the glyph widget.\n     */\n    getPosition() {\n        return {\n            lane: GlyphMarginLane.Right,\n            range: {\n                startColumn: 1,\n                startLineNumber: this._lineNumber,\n                endColumn: 1,\n                endLineNumber: this._lineNumber,\n            },\n            zIndex: 10001,\n        };\n    }\n}\n\nexport { RevertButton, RevertButtonsFeature };\n","import { h, getWindow } from '../../../../base/browser/dom.js';\nimport { findLast } from '../../../../base/common/arraysFind.js';\nimport { onUnexpectedError, BugIndicatingError } from '../../../../base/common/errors.js';\nimport { Event } from '../../../../base/common/event.js';\nimport { readHotReloadableExport } from '../../../../base/common/hotReloadHelpers.js';\nimport { toDisposable } from '../../../../base/common/lifecycle.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { IAccessibilitySignalService, AccessibilitySignal } from '../../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { ServiceCollection } from '../../../../platform/instantiation/common/serviceCollection.js';\nimport { bindContextKey } from '../../../../platform/observable/common/platformObservableUtils.js';\nimport { IEditorProgressService } from '../../../../platform/progress/common/progress.js';\nimport { LineRange } from '../../../common/core/ranges/lineRange.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { EditorType } from '../../../common/editorCommon.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { EditorExtensionsRegistry } from '../../editorExtensions.js';\nimport { ICodeEditorService } from '../../services/codeEditorService.js';\nimport { StableEditorScrollState } from '../../stableEditorScroll.js';\nimport { CodeEditorWidget } from '../codeEditor/codeEditorWidget.js';\nimport { AccessibleDiffViewer, AccessibleDiffViewerModelFromEditors } from './components/accessibleDiffViewer.js';\nimport { DiffEditorDecorations } from './components/diffEditorDecorations.js';\nimport { DiffEditorEditors } from './components/diffEditorEditors.js';\nimport { SashLayout, DiffEditorSash } from './components/diffEditorSash.js';\nimport { DiffEditorViewZones } from './components/diffEditorViewZones/diffEditorViewZones.js';\nimport { DelegatingEditor } from './delegatingEditorImpl.js';\nimport { DiffEditorOptions } from './diffEditorOptions.js';\nimport { DiffEditorViewModel } from './diffEditorViewModel.js';\nimport { DiffEditorGutter } from './features/gutterFeature.js';\nimport { HideUnchangedRegionsFeature } from './features/hideUnchangedRegionsFeature.js';\nimport { MovedBlocksLinesFeature } from './features/movedBlocksLinesFeature.js';\nimport { OverviewRulerFeature } from './features/overviewRulerFeature.js';\nimport { RevertButtonsFeature } from './features/revertButtonsFeature.js';\nimport './style.css';\nimport { ObservableElementSizeObserver, applyViewZones, applyStyle, RefCounted, translatePosition } from './utils.js';\nimport { disposableObservableValue, observableValue } from '../../../../base/common/observableInternal/observables/observableValue.js';\nimport { derived, derivedDisposable } from '../../../../base/common/observableInternal/observables/derived.js';\nimport { autorun, autorunWithStore } from '../../../../base/common/observableInternal/reactions/autorun.js';\nimport { recomputeInitiallyAndOnChange } from '../../../../base/common/observableInternal/utils/utils.js';\nimport { subtransaction, transaction } from '../../../../base/common/observableInternal/transaction.js';\nimport { observableFromEvent } from '../../../../base/common/observableInternal/observables/observableFromEvent.js';\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet DiffEditorWidget = class DiffEditorWidget extends DelegatingEditor {\n    get onDidContentSizeChange() { return this._editors.onDidContentSizeChange; }\n    constructor(_domElement, options, codeEditorWidgetOptions, _parentContextKeyService, _parentInstantiationService, _codeEditorService, _accessibilitySignalService, _editorProgressService) {\n        super();\n        this._domElement = _domElement;\n        this._parentContextKeyService = _parentContextKeyService;\n        this._parentInstantiationService = _parentInstantiationService;\n        this._codeEditorService = _codeEditorService;\n        this._accessibilitySignalService = _accessibilitySignalService;\n        this._editorProgressService = _editorProgressService;\n        this.elements = h('div.monaco-diff-editor.side-by-side', { style: { position: 'relative', height: '100%' } }, [\n            h('div.editor.original@original', { style: { position: 'absolute', height: '100%', } }),\n            h('div.editor.modified@modified', { style: { position: 'absolute', height: '100%', } }),\n            h('div.accessibleDiffViewer@accessibleDiffViewer', { style: { position: 'absolute', height: '100%' } }),\n        ]);\n        this._diffModelSrc = this._register(disposableObservableValue(this, undefined));\n        this._diffModel = derived(this, reader => this._diffModelSrc.read(reader)?.object);\n        this.onDidChangeModel = Event.fromObservableLight(this._diffModel);\n        this._contextKeyService = this._register(this._parentContextKeyService.createScoped(this._domElement));\n        this._instantiationService = this._register(this._parentInstantiationService.createChild(new ServiceCollection([IContextKeyService, this._contextKeyService])));\n        this._boundarySashes = observableValue(this, undefined);\n        this._accessibleDiffViewerShouldBeVisible = observableValue(this, false);\n        this._accessibleDiffViewerVisible = derived(this, reader => this._options.onlyShowAccessibleDiffViewer.read(reader)\n            ? true\n            : this._accessibleDiffViewerShouldBeVisible.read(reader));\n        this._movedBlocksLinesPart = observableValue(this, undefined);\n        this._layoutInfo = derived(this, reader => {\n            const fullWidth = this._rootSizeObserver.width.read(reader);\n            const fullHeight = this._rootSizeObserver.height.read(reader);\n            if (this._rootSizeObserver.automaticLayout) {\n                this.elements.root.style.height = '100%';\n            }\n            else {\n                this.elements.root.style.height = fullHeight + 'px';\n            }\n            const sash = this._sash.read(reader);\n            const gutter = this._gutter.read(reader);\n            const gutterWidth = gutter?.width.read(reader) ?? 0;\n            const overviewRulerPartWidth = this._overviewRulerPart.read(reader)?.width ?? 0;\n            let originalLeft, originalWidth, modifiedLeft, modifiedWidth, gutterLeft;\n            const sideBySide = !!sash;\n            if (sideBySide) {\n                const sashLeft = sash.sashLeft.read(reader);\n                const movedBlocksLinesWidth = this._movedBlocksLinesPart.read(reader)?.width.read(reader) ?? 0;\n                originalLeft = 0;\n                originalWidth = sashLeft - gutterWidth - movedBlocksLinesWidth;\n                gutterLeft = sashLeft - gutterWidth;\n                modifiedLeft = sashLeft;\n                modifiedWidth = fullWidth - modifiedLeft - overviewRulerPartWidth;\n            }\n            else {\n                gutterLeft = 0;\n                const shouldHideOriginalLineNumbers = this._options.inlineViewHideOriginalLineNumbers.read(reader);\n                originalLeft = gutterWidth;\n                if (shouldHideOriginalLineNumbers) {\n                    originalWidth = 0;\n                }\n                else {\n                    originalWidth = Math.max(5, this._editors.originalObs.layoutInfoDecorationsLeft.read(reader));\n                }\n                modifiedLeft = gutterWidth + originalWidth;\n                modifiedWidth = fullWidth - modifiedLeft - overviewRulerPartWidth;\n            }\n            this.elements.original.style.left = originalLeft + 'px';\n            this.elements.original.style.width = originalWidth + 'px';\n            this._editors.original.layout({ width: originalWidth, height: fullHeight }, true);\n            gutter?.layout(gutterLeft);\n            this.elements.modified.style.left = modifiedLeft + 'px';\n            this.elements.modified.style.width = modifiedWidth + 'px';\n            this._editors.modified.layout({ width: modifiedWidth, height: fullHeight }, true);\n            return {\n                modifiedEditor: this._editors.modified.getLayoutInfo(),\n                originalEditor: this._editors.original.getLayoutInfo(),\n            };\n        });\n        this._diffValue = this._diffModel.map((m, r) => m?.diff.read(r));\n        this.onDidUpdateDiff = Event.fromObservableLight(this._diffValue);\n        this._codeEditorService.willCreateDiffEditor();\n        this._contextKeyService.createKey('isInDiffEditor', true);\n        this._domElement.appendChild(this.elements.root);\n        this._register(toDisposable(() => this.elements.root.remove()));\n        this._rootSizeObserver = this._register(new ObservableElementSizeObserver(this.elements.root, options.dimension));\n        this._rootSizeObserver.setAutomaticLayout(options.automaticLayout ?? false);\n        this._options = this._instantiationService.createInstance(DiffEditorOptions, options);\n        this._register(autorun(reader => {\n            this._options.setWidth(this._rootSizeObserver.width.read(reader));\n        }));\n        this._contextKeyService.createKey(EditorContextKeys.isEmbeddedDiffEditor.key, false);\n        this._register(bindContextKey(EditorContextKeys.isEmbeddedDiffEditor, this._contextKeyService, reader => this._options.isInEmbeddedEditor.read(reader)));\n        this._register(bindContextKey(EditorContextKeys.comparingMovedCode, this._contextKeyService, reader => !!this._diffModel.read(reader)?.movedTextToCompare.read(reader)));\n        this._register(bindContextKey(EditorContextKeys.diffEditorRenderSideBySideInlineBreakpointReached, this._contextKeyService, reader => this._options.couldShowInlineViewBecauseOfSize.read(reader)));\n        this._register(bindContextKey(EditorContextKeys.diffEditorInlineMode, this._contextKeyService, reader => !this._options.renderSideBySide.read(reader)));\n        this._register(bindContextKey(EditorContextKeys.hasChanges, this._contextKeyService, reader => (this._diffModel.read(reader)?.diff.read(reader)?.mappings.length ?? 0) > 0));\n        this._editors = this._register(this._instantiationService.createInstance(DiffEditorEditors, this.elements.original, this.elements.modified, this._options, codeEditorWidgetOptions, (i, c, o, o2) => this._createInnerEditor(i, c, o, o2)));\n        this._register(bindContextKey(EditorContextKeys.diffEditorOriginalWritable, this._contextKeyService, reader => this._options.originalEditable.read(reader)));\n        this._register(bindContextKey(EditorContextKeys.diffEditorModifiedWritable, this._contextKeyService, reader => !this._options.readOnly.read(reader)));\n        this._register(bindContextKey(EditorContextKeys.diffEditorOriginalUri, this._contextKeyService, reader => this._diffModel.read(reader)?.model.original.uri.toString() ?? ''));\n        this._register(bindContextKey(EditorContextKeys.diffEditorModifiedUri, this._contextKeyService, reader => this._diffModel.read(reader)?.model.modified.uri.toString() ?? ''));\n        this._overviewRulerPart = derivedDisposable(this, reader => !this._options.renderOverviewRuler.read(reader)\n            ? undefined\n            : this._instantiationService.createInstance(readHotReloadableExport(OverviewRulerFeature), this._editors, this.elements.root, this._diffModel, this._rootSizeObserver.width, this._rootSizeObserver.height, this._layoutInfo.map(i => i.modifiedEditor))).recomputeInitiallyAndOnChange(this._store);\n        const dimensions = {\n            height: this._rootSizeObserver.height,\n            width: this._rootSizeObserver.width.map((w, reader) => w - (this._overviewRulerPart.read(reader)?.width ?? 0)),\n        };\n        this._sashLayout = new SashLayout(this._options, dimensions);\n        this._sash = derivedDisposable(this, reader => {\n            const showSash = this._options.renderSideBySide.read(reader);\n            this.elements.root.classList.toggle('side-by-side', showSash);\n            return !showSash ? undefined : new DiffEditorSash(this.elements.root, dimensions, this._options.enableSplitViewResizing, this._boundarySashes, this._sashLayout.sashLeft, () => this._sashLayout.resetSash());\n        }).recomputeInitiallyAndOnChange(this._store);\n        const unchangedRangesFeature = derivedDisposable(this, reader => /** @description UnchangedRangesFeature */ this._instantiationService.createInstance(readHotReloadableExport(HideUnchangedRegionsFeature), this._editors, this._diffModel, this._options)).recomputeInitiallyAndOnChange(this._store);\n        derivedDisposable(this, reader => /** @description DiffEditorDecorations */ this._instantiationService.createInstance(readHotReloadableExport(DiffEditorDecorations), this._editors, this._diffModel, this._options, this)).recomputeInitiallyAndOnChange(this._store);\n        const origViewZoneIdsToIgnore = new Set();\n        const modViewZoneIdsToIgnore = new Set();\n        let isUpdatingViewZones = false;\n        const viewZoneManager = derivedDisposable(this, reader => /** @description ViewZoneManager */ this._instantiationService.createInstance(readHotReloadableExport(DiffEditorViewZones), getWindow(this._domElement), this._editors, this._diffModel, this._options, this, () => isUpdatingViewZones || unchangedRangesFeature.read(undefined).isUpdatingHiddenAreas, origViewZoneIdsToIgnore, modViewZoneIdsToIgnore)).recomputeInitiallyAndOnChange(this._store);\n        const originalViewZones = derived(this, (reader) => {\n            const orig = viewZoneManager.read(reader).viewZones.read(reader).orig;\n            const orig2 = unchangedRangesFeature.read(reader).viewZones.read(reader).origViewZones;\n            return orig.concat(orig2);\n        });\n        const modifiedViewZones = derived(this, (reader) => {\n            const mod = viewZoneManager.read(reader).viewZones.read(reader).mod;\n            const mod2 = unchangedRangesFeature.read(reader).viewZones.read(reader).modViewZones;\n            return mod.concat(mod2);\n        });\n        this._register(applyViewZones(this._editors.original, originalViewZones, isUpdatingOrigViewZones => {\n            isUpdatingViewZones = isUpdatingOrigViewZones;\n        }, origViewZoneIdsToIgnore));\n        let scrollState;\n        this._register(applyViewZones(this._editors.modified, modifiedViewZones, isUpdatingModViewZones => {\n            isUpdatingViewZones = isUpdatingModViewZones;\n            if (isUpdatingViewZones) {\n                scrollState = StableEditorScrollState.capture(this._editors.modified);\n            }\n            else {\n                scrollState?.restore(this._editors.modified);\n                scrollState = undefined;\n            }\n        }, modViewZoneIdsToIgnore));\n        this._accessibleDiffViewer = derivedDisposable(this, reader => this._instantiationService.createInstance(readHotReloadableExport(AccessibleDiffViewer), this.elements.accessibleDiffViewer, this._accessibleDiffViewerVisible, (visible, tx) => this._accessibleDiffViewerShouldBeVisible.set(visible, tx), this._options.onlyShowAccessibleDiffViewer.map(v => !v), this._rootSizeObserver.width, this._rootSizeObserver.height, this._diffModel.map((m, r) => m?.diff.read(r)?.mappings.map(m => m.lineRangeMapping)), new AccessibleDiffViewerModelFromEditors(this._editors))).recomputeInitiallyAndOnChange(this._store);\n        const visibility = this._accessibleDiffViewerVisible.map(v => v ? 'hidden' : 'visible');\n        this._register(applyStyle(this.elements.modified, { visibility }));\n        this._register(applyStyle(this.elements.original, { visibility }));\n        this._createDiffEditorContributions();\n        this._codeEditorService.addDiffEditor(this);\n        this._register(toDisposable(() => {\n            this._codeEditorService.removeDiffEditor(this);\n        }));\n        this._gutter = derivedDisposable(this, reader => {\n            return this._options.shouldRenderGutterMenu.read(reader)\n                ? this._instantiationService.createInstance(readHotReloadableExport(DiffEditorGutter), this.elements.root, this._diffModel, this._editors, this._options, this._sashLayout, this._boundarySashes)\n                : undefined;\n        });\n        this._register(recomputeInitiallyAndOnChange(this._layoutInfo));\n        derivedDisposable(this, reader => /** @description MovedBlocksLinesPart */ new (readHotReloadableExport(MovedBlocksLinesFeature))(this.elements.root, this._diffModel, this._layoutInfo.map(i => i.originalEditor), this._layoutInfo.map(i => i.modifiedEditor), this._editors)).recomputeInitiallyAndOnChange(this._store, value => {\n            // This is to break the layout info <-> moved blocks lines part dependency cycle.\n            this._movedBlocksLinesPart.set(value, undefined);\n        });\n        this._register(Event.runAndSubscribe(this._editors.modified.onDidChangeCursorPosition, e => this._handleCursorPositionChange(e, true)));\n        this._register(Event.runAndSubscribe(this._editors.original.onDidChangeCursorPosition, e => this._handleCursorPositionChange(e, false)));\n        const isInitializingDiff = this._diffModel.map(this, (m, reader) => {\n            /** @isInitializingDiff isDiffUpToDate */\n            if (!m) {\n                return undefined;\n            }\n            return m.diff.read(reader) === undefined && !m.isDiffUpToDate.read(reader);\n        });\n        this._register(autorunWithStore((reader, store) => {\n            /** @description DiffEditorWidgetHelper.ShowProgress */\n            if (isInitializingDiff.read(reader) === true) {\n                const r = this._editorProgressService.show(true, 1000);\n                store.add(toDisposable(() => r.done()));\n            }\n        }));\n        this._register(autorunWithStore((reader, store) => {\n            store.add(new (readHotReloadableExport(RevertButtonsFeature))(this._editors, this._diffModel, this._options, this));\n        }));\n        this._register(autorunWithStore((reader, store) => {\n            const model = this._diffModel.read(reader);\n            if (!model) {\n                return;\n            }\n            for (const m of [model.model.original, model.model.modified]) {\n                store.add(m.onWillDispose(e => {\n                    onUnexpectedError(new BugIndicatingError('TextModel got disposed before DiffEditorWidget model got reset'));\n                    this.setModel(null);\n                }));\n            }\n        }));\n        this._register(autorun(reader => {\n            this._options.setModel(this._diffModel.read(reader));\n        }));\n    }\n    _createInnerEditor(instantiationService, container, options, editorWidgetOptions) {\n        const editor = instantiationService.createInstance(CodeEditorWidget, container, options, editorWidgetOptions);\n        return editor;\n    }\n    _createDiffEditorContributions() {\n        const contributions = EditorExtensionsRegistry.getDiffEditorContributions();\n        for (const desc of contributions) {\n            try {\n                this._register(this._instantiationService.createInstance(desc.ctor, this));\n            }\n            catch (err) {\n                onUnexpectedError(err);\n            }\n        }\n    }\n    get _targetEditor() { return this._editors.modified; }\n    getEditorType() { return EditorType.IDiffEditor; }\n    layout(dimension) {\n        this._rootSizeObserver.observe(dimension);\n    }\n    hasTextFocus() { return this._editors.original.hasTextFocus() || this._editors.modified.hasTextFocus(); }\n    saveViewState() {\n        const originalViewState = this._editors.original.saveViewState();\n        const modifiedViewState = this._editors.modified.saveViewState();\n        return {\n            original: originalViewState,\n            modified: modifiedViewState,\n            modelState: this._diffModel.get()?.serializeState(),\n        };\n    }\n    restoreViewState(s) {\n        if (s && s.original && s.modified) {\n            const diffEditorState = s;\n            this._editors.original.restoreViewState(diffEditorState.original);\n            this._editors.modified.restoreViewState(diffEditorState.modified);\n            if (diffEditorState.modelState) {\n                // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n                this._diffModel.get()?.restoreSerializedState(diffEditorState.modelState);\n            }\n        }\n    }\n    handleInitialized() {\n        this._editors.original.handleInitialized();\n        this._editors.modified.handleInitialized();\n    }\n    createViewModel(model) {\n        return this._instantiationService.createInstance(DiffEditorViewModel, model, this._options);\n    }\n    getModel() { return this._diffModel.get()?.model ?? null; }\n    setModel(model) {\n        const vm = !model ? null\n            : ('model' in model) ? RefCounted.create(model).createNewRef(this)\n                : RefCounted.create(this.createViewModel(model), this);\n        this.setDiffModel(vm);\n    }\n    setDiffModel(viewModel, tx) {\n        const currentModel = this._diffModel.get();\n        if (!viewModel && currentModel) {\n            // Transitioning from a model to no-model\n            this._accessibleDiffViewer.get().close();\n        }\n        if (this._diffModel.get() !== viewModel?.object) {\n            subtransaction(tx, tx => {\n                const vm = viewModel?.object;\n                /** @description DiffEditorWidget.setModel */\n                observableFromEvent.batchEventsGlobally(tx, () => {\n                    this._editors.original.setModel(vm ? vm.model.original : null);\n                    this._editors.modified.setModel(vm ? vm.model.modified : null);\n                });\n                const prevValueRef = this._diffModelSrc.get()?.createNewRef(this);\n                this._diffModelSrc.set(viewModel?.createNewRef(this), tx);\n                setTimeout(() => {\n                    // async, so that this runs after the transaction finished.\n                    // TODO: use the transaction to schedule disposal\n                    prevValueRef?.dispose();\n                }, 0);\n            });\n        }\n    }\n    /**\n     * @param changedOptions Only has values for top-level options that have actually changed.\n     */\n    updateOptions(changedOptions) {\n        this._options.updateOptions(changedOptions);\n    }\n    getContainerDomNode() { return this._domElement; }\n    getOriginalEditor() { return this._editors.original; }\n    getModifiedEditor() { return this._editors.modified; }\n    /**\n     * @deprecated Use `this.getDiffComputationResult().changes2` instead.\n     */\n    getLineChanges() {\n        const diffState = this._diffModel.get()?.diff.get();\n        if (!diffState) {\n            return null;\n        }\n        return toLineChanges(diffState);\n    }\n    getDiffComputationResult() {\n        const diffState = this._diffModel.get()?.diff.get();\n        if (!diffState) {\n            return null;\n        }\n        return {\n            changes: this.getLineChanges(),\n            changes2: diffState.mappings.map(m => m.lineRangeMapping),\n            identical: diffState.identical,\n            quitEarly: diffState.quitEarly,\n        };\n    }\n    revert(diff) {\n        const model = this._diffModel.get();\n        if (!model || !model.isDiffUpToDate.get()) {\n            return;\n        }\n        this._editors.modified.pushUndoStop();\n        this._editors.modified.executeEdits('diffEditor', [\n            {\n                range: diff.modified.toExclusiveRange(),\n                text: model.model.original.getValueInRange(diff.original.toExclusiveRange())\n            }\n        ]);\n        this._editors.modified.pushUndoStop();\n    }\n    revertRangeMappings(diffs) {\n        const model = this._diffModel.get();\n        if (!model || !model.isDiffUpToDate.get()) {\n            return;\n        }\n        const changes = diffs.map(c => ({\n            range: c.modifiedRange,\n            text: model.model.original.getValueInRange(c.originalRange)\n        }));\n        this._editors.modified.pushUndoStop();\n        this._editors.modified.executeEdits('diffEditor', changes);\n        this._editors.modified.pushUndoStop();\n    }\n    revertFocusedRangeMappings() {\n        const model = this._diffModel.get();\n        if (!model || !model.isDiffUpToDate.get()) {\n            return;\n        }\n        const diffs = this._diffModel.get()?.diff.get()?.mappings;\n        if (!diffs || diffs.length === 0) {\n            return;\n        }\n        const modifiedEditor = this._editors.modified;\n        if (!modifiedEditor.hasTextFocus()) {\n            return;\n        }\n        const curLineNumber = modifiedEditor.getPosition().lineNumber;\n        const selection = modifiedEditor.getSelection();\n        const selectedRange = LineRange.fromRange(selection || new Range(curLineNumber, 0, curLineNumber, 0));\n        const diffsToRevert = diffs.filter(d => {\n            return d.lineRangeMapping.modified.intersect(selectedRange);\n        });\n        modifiedEditor.pushUndoStop();\n        modifiedEditor.executeEdits('diffEditor', diffsToRevert.map(d => ({\n            range: d.lineRangeMapping.modified.toExclusiveRange(),\n            text: model.model.original.getValueInRange(d.lineRangeMapping.original.toExclusiveRange())\n        })));\n        modifiedEditor.pushUndoStop();\n    }\n    _goTo(diff) {\n        this._editors.modified.setPosition(new Position(diff.lineRangeMapping.modified.startLineNumber, 1));\n        this._editors.modified.revealRangeInCenter(diff.lineRangeMapping.modified.toExclusiveRange());\n    }\n    goToDiff(target) {\n        const diffs = this._diffModel.get()?.diff.get()?.mappings;\n        if (!diffs || diffs.length === 0) {\n            return;\n        }\n        const curLineNumber = this._editors.modified.getPosition().lineNumber;\n        let diff;\n        if (target === 'next') {\n            const modifiedLineCount = this._editors.modified.getModel().getLineCount();\n            if (modifiedLineCount === curLineNumber) {\n                diff = diffs[0];\n            }\n            else {\n                diff = diffs.find(d => d.lineRangeMapping.modified.startLineNumber > curLineNumber) ?? diffs[0];\n            }\n        }\n        else {\n            diff = findLast(diffs, d => d.lineRangeMapping.modified.startLineNumber < curLineNumber) ?? diffs[diffs.length - 1];\n        }\n        this._goTo(diff);\n        if (diff.lineRangeMapping.modified.isEmpty) {\n            this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineDeleted, { source: 'diffEditor.goToDiff' });\n        }\n        else if (diff.lineRangeMapping.original.isEmpty) {\n            this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineInserted, { source: 'diffEditor.goToDiff' });\n        }\n        else if (diff) {\n            this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineModified, { source: 'diffEditor.goToDiff' });\n        }\n    }\n    revealFirstDiff() {\n        const diffModel = this._diffModel.get();\n        if (!diffModel) {\n            return;\n        }\n        // wait for the diff computation to finish\n        this.waitForDiff().then(() => {\n            const diffs = diffModel.diff.get()?.mappings;\n            if (!diffs || diffs.length === 0) {\n                return;\n            }\n            this._goTo(diffs[0]);\n        });\n    }\n    accessibleDiffViewerNext() { this._accessibleDiffViewer.get().next(); }\n    accessibleDiffViewerPrev() { this._accessibleDiffViewer.get().prev(); }\n    async waitForDiff() {\n        const diffModel = this._diffModel.get();\n        if (!diffModel) {\n            return;\n        }\n        await diffModel.waitForDiff();\n    }\n    mapToOtherSide() {\n        const isModifiedFocus = this._editors.modified.hasWidgetFocus();\n        const source = isModifiedFocus ? this._editors.modified : this._editors.original;\n        const destination = isModifiedFocus ? this._editors.original : this._editors.modified;\n        let destinationSelection;\n        const sourceSelection = source.getSelection();\n        if (sourceSelection) {\n            const mappings = this._diffModel.get()?.diff.get()?.mappings.map(m => isModifiedFocus ? m.lineRangeMapping.flip() : m.lineRangeMapping);\n            if (mappings) {\n                const newRange1 = translatePosition(sourceSelection.getStartPosition(), mappings);\n                const newRange2 = translatePosition(sourceSelection.getEndPosition(), mappings);\n                destinationSelection = Range.plusRange(newRange1, newRange2);\n            }\n        }\n        return { destination, destinationSelection };\n    }\n    switchSide() {\n        const { destination, destinationSelection } = this.mapToOtherSide();\n        destination.focus();\n        if (destinationSelection) {\n            destination.setSelection(destinationSelection);\n        }\n    }\n    exitCompareMove() {\n        const model = this._diffModel.get();\n        if (!model) {\n            return;\n        }\n        model.movedTextToCompare.set(undefined, undefined);\n    }\n    collapseAllUnchangedRegions() {\n        const unchangedRegions = this._diffModel.get()?.unchangedRegions.get();\n        if (!unchangedRegions) {\n            return;\n        }\n        transaction(tx => {\n            for (const region of unchangedRegions) {\n                region.collapseAll(tx);\n            }\n        });\n    }\n    showAllUnchangedRegions() {\n        const unchangedRegions = this._diffModel.get()?.unchangedRegions.get();\n        if (!unchangedRegions) {\n            return;\n        }\n        transaction(tx => {\n            for (const region of unchangedRegions) {\n                region.showAll(tx);\n            }\n        });\n    }\n    _handleCursorPositionChange(e, isModifiedEditor) {\n        if (e?.reason === 3 /* CursorChangeReason.Explicit */) {\n            const diff = this._diffModel.get()?.diff.get()?.mappings.find(m => isModifiedEditor ? m.lineRangeMapping.modified.contains(e.position.lineNumber) : m.lineRangeMapping.original.contains(e.position.lineNumber));\n            if (diff?.lineRangeMapping.modified.isEmpty) {\n                this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineDeleted, { source: 'diffEditor.cursorPositionChanged' });\n            }\n            else if (diff?.lineRangeMapping.original.isEmpty) {\n                this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineInserted, { source: 'diffEditor.cursorPositionChanged' });\n            }\n            else if (diff) {\n                this._accessibilitySignalService.playSignal(AccessibilitySignal.diffLineModified, { source: 'diffEditor.cursorPositionChanged' });\n            }\n        }\n    }\n};\nDiffEditorWidget = __decorate([\n    __param(3, IContextKeyService),\n    __param(4, IInstantiationService),\n    __param(5, ICodeEditorService),\n    __param(6, IAccessibilitySignalService),\n    __param(7, IEditorProgressService)\n], DiffEditorWidget);\nfunction toLineChanges(state) {\n    return state.mappings.map(x => {\n        const m = x.lineRangeMapping;\n        let originalStartLineNumber;\n        let originalEndLineNumber;\n        let modifiedStartLineNumber;\n        let modifiedEndLineNumber;\n        let innerChanges = m.innerChanges;\n        if (m.original.isEmpty) {\n            // Insertion\n            originalStartLineNumber = m.original.startLineNumber - 1;\n            originalEndLineNumber = 0;\n            innerChanges = undefined;\n        }\n        else {\n            originalStartLineNumber = m.original.startLineNumber;\n            originalEndLineNumber = m.original.endLineNumberExclusive - 1;\n        }\n        if (m.modified.isEmpty) {\n            // Deletion\n            modifiedStartLineNumber = m.modified.startLineNumber - 1;\n            modifiedEndLineNumber = 0;\n            innerChanges = undefined;\n        }\n        else {\n            modifiedStartLineNumber = m.modified.startLineNumber;\n            modifiedEndLineNumber = m.modified.endLineNumberExclusive - 1;\n        }\n        return {\n            originalStartLineNumber,\n            originalEndLineNumber,\n            modifiedStartLineNumber,\n            modifiedEndLineNumber,\n            charChanges: innerChanges?.map(m => ({\n                originalStartLineNumber: m.originalRange.startLineNumber,\n                originalStartColumn: m.originalRange.startColumn,\n                originalEndLineNumber: m.originalRange.endLineNumber,\n                originalEndColumn: m.originalRange.endColumn,\n                modifiedStartLineNumber: m.modifiedRange.startLineNumber,\n                modifiedStartColumn: m.modifiedRange.startColumn,\n                modifiedEndLineNumber: m.modifiedRange.endLineNumber,\n                modifiedEndColumn: m.modifiedRange.endColumn,\n            }))\n        };\n    });\n}\n\nexport { DiffEditorWidget, toLineChanges };\n","import { getActiveElement } from '../../../../base/browser/dom.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { EditorAction2 } from '../../editorExtensions.js';\nimport { ICodeEditorService } from '../../services/codeEditorService.js';\nimport { DiffEditorWidget } from './diffEditorWidget.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { localize2 } from '../../../../nls.js';\nimport { Action2, MenuId } from '../../../../platform/actions/common/actions.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport './registrations.contribution.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ToggleCollapseUnchangedRegions extends Action2 {\n    constructor() {\n        super({\n            id: 'diffEditor.toggleCollapseUnchangedRegions',\n            title: localize2(85, 'Toggle Collapse Unchanged Regions'),\n            icon: Codicon.map,\n            toggled: ContextKeyExpr.has('config.diffEditor.hideUnchangedRegions.enabled'),\n            precondition: ContextKeyExpr.has('isInDiffEditor'),\n            menu: {\n                when: ContextKeyExpr.has('isInDiffEditor'),\n                id: MenuId.EditorTitle,\n                order: 22,\n                group: 'navigation',\n            },\n        });\n    }\n    run(accessor, ...args) {\n        const configurationService = accessor.get(IConfigurationService);\n        const newValue = !configurationService.getValue('diffEditor.hideUnchangedRegions.enabled');\n        configurationService.updateValue('diffEditor.hideUnchangedRegions.enabled', newValue);\n    }\n}\nclass ToggleShowMovedCodeBlocks extends Action2 {\n    constructor() {\n        super({\n            id: 'diffEditor.toggleShowMovedCodeBlocks',\n            title: localize2(86, 'Toggle Show Moved Code Blocks'),\n            precondition: ContextKeyExpr.has('isInDiffEditor'),\n        });\n    }\n    run(accessor, ...args) {\n        const configurationService = accessor.get(IConfigurationService);\n        const newValue = !configurationService.getValue('diffEditor.experimental.showMoves');\n        configurationService.updateValue('diffEditor.experimental.showMoves', newValue);\n    }\n}\nclass ToggleUseInlineViewWhenSpaceIsLimited extends Action2 {\n    constructor() {\n        super({\n            id: 'diffEditor.toggleUseInlineViewWhenSpaceIsLimited',\n            title: localize2(87, 'Toggle Use Inline View When Space Is Limited'),\n            precondition: ContextKeyExpr.has('isInDiffEditor'),\n        });\n    }\n    run(accessor, ...args) {\n        const configurationService = accessor.get(IConfigurationService);\n        const newValue = !configurationService.getValue('diffEditor.useInlineViewWhenSpaceIsLimited');\n        configurationService.updateValue('diffEditor.useInlineViewWhenSpaceIsLimited', newValue);\n    }\n}\nconst diffEditorCategory = localize2(88, \"Diff Editor\");\nclass SwitchSide extends EditorAction2 {\n    constructor() {\n        super({\n            id: 'diffEditor.switchSide',\n            title: localize2(89, 'Switch Side'),\n            icon: Codicon.arrowSwap,\n            precondition: ContextKeyExpr.has('isInDiffEditor'),\n            f1: true,\n            category: diffEditorCategory,\n        });\n    }\n    runEditorCommand(accessor, editor, arg) {\n        const diffEditor = findFocusedDiffEditor(accessor);\n        if (diffEditor instanceof DiffEditorWidget) {\n            if (arg && arg.dryRun) {\n                return { destinationSelection: diffEditor.mapToOtherSide().destinationSelection };\n            }\n            else {\n                diffEditor.switchSide();\n            }\n        }\n        return undefined;\n    }\n}\nclass ExitCompareMove extends EditorAction2 {\n    constructor() {\n        super({\n            id: 'diffEditor.exitCompareMove',\n            title: localize2(90, 'Exit Compare Move'),\n            icon: Codicon.close,\n            precondition: EditorContextKeys.comparingMovedCode,\n            f1: false,\n            category: diffEditorCategory,\n            keybinding: {\n                weight: 10000,\n                primary: 9 /* KeyCode.Escape */,\n            }\n        });\n    }\n    runEditorCommand(accessor, editor, ...args) {\n        const diffEditor = findFocusedDiffEditor(accessor);\n        if (diffEditor instanceof DiffEditorWidget) {\n            diffEditor.exitCompareMove();\n        }\n    }\n}\nclass CollapseAllUnchangedRegions extends EditorAction2 {\n    constructor() {\n        super({\n            id: 'diffEditor.collapseAllUnchangedRegions',\n            title: localize2(91, 'Collapse All Unchanged Regions'),\n            icon: Codicon.fold,\n            precondition: ContextKeyExpr.has('isInDiffEditor'),\n            f1: true,\n            category: diffEditorCategory,\n        });\n    }\n    runEditorCommand(accessor, editor, ...args) {\n        const diffEditor = findFocusedDiffEditor(accessor);\n        if (diffEditor instanceof DiffEditorWidget) {\n            diffEditor.collapseAllUnchangedRegions();\n        }\n    }\n}\nclass ShowAllUnchangedRegions extends EditorAction2 {\n    constructor() {\n        super({\n            id: 'diffEditor.showAllUnchangedRegions',\n            title: localize2(92, 'Show All Unchanged Regions'),\n            icon: Codicon.unfold,\n            precondition: ContextKeyExpr.has('isInDiffEditor'),\n            f1: true,\n            category: diffEditorCategory,\n        });\n    }\n    runEditorCommand(accessor, editor, ...args) {\n        const diffEditor = findFocusedDiffEditor(accessor);\n        if (diffEditor instanceof DiffEditorWidget) {\n            diffEditor.showAllUnchangedRegions();\n        }\n    }\n}\nclass RevertHunkOrSelection extends Action2 {\n    constructor() {\n        super({\n            id: 'diffEditor.revert',\n            title: localize2(93, 'Revert'),\n            f1: true,\n            category: diffEditorCategory,\n            precondition: ContextKeyExpr.has('isInDiffEditor'),\n        });\n    }\n    run(accessor, arg) {\n        return arg ? this.runViaToolbarContext(accessor, arg) : this.runViaCursorOrSelection(accessor);\n    }\n    runViaCursorOrSelection(accessor) {\n        const diffEditor = findFocusedDiffEditor(accessor);\n        if (diffEditor instanceof DiffEditorWidget) {\n            diffEditor.revertFocusedRangeMappings();\n        }\n        return undefined;\n    }\n    runViaToolbarContext(accessor, arg) {\n        const diffEditor = findDiffEditor(accessor, arg.originalUri, arg.modifiedUri);\n        if (diffEditor instanceof DiffEditorWidget) {\n            diffEditor.revertRangeMappings(arg.mapping.innerChanges ?? []);\n        }\n        return undefined;\n    }\n}\nconst accessibleDiffViewerCategory = localize2(94, \"Accessible Diff Viewer\");\nclass AccessibleDiffViewerNext extends Action2 {\n    static { this.id = 'editor.action.accessibleDiffViewer.next'; }\n    constructor() {\n        super({\n            id: AccessibleDiffViewerNext.id,\n            title: localize2(95, 'Go to Next Difference'),\n            category: accessibleDiffViewerCategory,\n            precondition: ContextKeyExpr.has('isInDiffEditor'),\n            keybinding: {\n                primary: 65 /* KeyCode.F7 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            f1: true,\n        });\n    }\n    run(accessor) {\n        const diffEditor = findFocusedDiffEditor(accessor);\n        diffEditor?.accessibleDiffViewerNext();\n    }\n}\nclass AccessibleDiffViewerPrev extends Action2 {\n    static { this.id = 'editor.action.accessibleDiffViewer.prev'; }\n    constructor() {\n        super({\n            id: AccessibleDiffViewerPrev.id,\n            title: localize2(96, 'Go to Previous Difference'),\n            category: accessibleDiffViewerCategory,\n            precondition: ContextKeyExpr.has('isInDiffEditor'),\n            keybinding: {\n                primary: 1024 /* KeyMod.Shift */ | 65 /* KeyCode.F7 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            f1: true,\n        });\n    }\n    run(accessor) {\n        const diffEditor = findFocusedDiffEditor(accessor);\n        diffEditor?.accessibleDiffViewerPrev();\n    }\n}\nfunction findDiffEditor(accessor, originalUri, modifiedUri) {\n    const codeEditorService = accessor.get(ICodeEditorService);\n    const diffEditors = codeEditorService.listDiffEditors();\n    return diffEditors.find(diffEditor => {\n        const modified = diffEditor.getModifiedEditor();\n        const original = diffEditor.getOriginalEditor();\n        return modified && modified.getModel()?.uri.toString() === modifiedUri.toString()\n            && original && original.getModel()?.uri.toString() === originalUri.toString();\n    }) || null;\n}\nfunction findFocusedDiffEditor(accessor) {\n    const codeEditorService = accessor.get(ICodeEditorService);\n    const diffEditors = codeEditorService.listDiffEditors();\n    const activeElement = getActiveElement();\n    if (activeElement) {\n        for (const d of diffEditors) {\n            const container = d.getContainerDomNode();\n            if (container.contains(activeElement)) {\n                return d;\n            }\n        }\n    }\n    return null;\n}\n\nexport { AccessibleDiffViewerNext, AccessibleDiffViewerPrev, CollapseAllUnchangedRegions, ExitCompareMove, RevertHunkOrSelection, ShowAllUnchangedRegions, SwitchSide, ToggleCollapseUnchangedRegions, ToggleShowMovedCodeBlocks, ToggleUseInlineViewWhenSpaceIsLimited, findDiffEditor, findFocusedDiffEditor };\n","import { Codicon } from '../../../../base/common/codicons.js';\nimport { ToggleUseInlineViewWhenSpaceIsLimited, ToggleShowMovedCodeBlocks, RevertHunkOrSelection, AccessibleDiffViewerNext, AccessibleDiffViewerPrev, ToggleCollapseUnchangedRegions, SwitchSide, ExitCompareMove, CollapseAllUnchangedRegions, ShowAllUnchangedRegions } from './commands.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { localize } from '../../../../nls.js';\nimport { registerAction2, MenuRegistry, MenuId } from '../../../../platform/actions/common/actions.js';\nimport { CommandsRegistry } from '../../../../platform/commands/common/commands.js';\nimport { ContextKeyExpr, ContextKeyEqualsExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport './registrations.contribution.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterAction2(ToggleCollapseUnchangedRegions);\nregisterAction2(ToggleShowMovedCodeBlocks);\nregisterAction2(ToggleUseInlineViewWhenSpaceIsLimited);\nMenuRegistry.appendMenuItem(MenuId.EditorTitle, {\n    command: {\n        id: new ToggleUseInlineViewWhenSpaceIsLimited().desc.id,\n        title: localize(119, \"Use Inline View When Space Is Limited\"),\n        toggled: ContextKeyExpr.has('config.diffEditor.useInlineViewWhenSpaceIsLimited'),\n        precondition: ContextKeyExpr.has('isInDiffEditor'),\n    },\n    order: 11,\n    group: '1_diff',\n    when: ContextKeyExpr.and(EditorContextKeys.diffEditorRenderSideBySideInlineBreakpointReached, ContextKeyExpr.has('isInDiffEditor')),\n});\nMenuRegistry.appendMenuItem(MenuId.EditorTitle, {\n    command: {\n        id: new ToggleShowMovedCodeBlocks().desc.id,\n        title: localize(120, \"Show Moved Code Blocks\"),\n        icon: Codicon.move,\n        toggled: ContextKeyEqualsExpr.create('config.diffEditor.experimental.showMoves', true),\n        precondition: ContextKeyExpr.has('isInDiffEditor'),\n    },\n    order: 10,\n    group: '1_diff',\n    when: ContextKeyExpr.has('isInDiffEditor'),\n});\nregisterAction2(RevertHunkOrSelection);\nfor (const ctx of [\n    { icon: Codicon.arrowRight, key: EditorContextKeys.diffEditorInlineMode.toNegated() },\n    { icon: Codicon.discard, key: EditorContextKeys.diffEditorInlineMode }\n]) {\n    MenuRegistry.appendMenuItem(MenuId.DiffEditorHunkToolbar, {\n        command: {\n            id: new RevertHunkOrSelection().desc.id,\n            title: localize(121, \"Revert Block\"),\n            icon: ctx.icon,\n        },\n        when: ContextKeyExpr.and(EditorContextKeys.diffEditorModifiedWritable, ctx.key),\n        order: 5,\n        group: 'primary',\n    });\n    MenuRegistry.appendMenuItem(MenuId.DiffEditorSelectionToolbar, {\n        command: {\n            id: new RevertHunkOrSelection().desc.id,\n            title: localize(122, \"Revert Selection\"),\n            icon: ctx.icon,\n        },\n        when: ContextKeyExpr.and(EditorContextKeys.diffEditorModifiedWritable, ctx.key),\n        order: 5,\n        group: 'primary',\n    });\n}\nregisterAction2(SwitchSide);\nregisterAction2(ExitCompareMove);\nregisterAction2(CollapseAllUnchangedRegions);\nregisterAction2(ShowAllUnchangedRegions);\nMenuRegistry.appendMenuItem(MenuId.EditorTitle, {\n    command: {\n        id: AccessibleDiffViewerNext.id,\n        title: localize(123, \"Open Accessible Diff Viewer\"),\n        precondition: ContextKeyExpr.has('isInDiffEditor'),\n    },\n    order: 10,\n    group: '2_diff',\n    when: ContextKeyExpr.and(EditorContextKeys.accessibleDiffViewerVisible.negate(), ContextKeyExpr.has('isInDiffEditor')),\n});\nCommandsRegistry.registerCommandAlias('editor.action.diffReview.next', AccessibleDiffViewerNext.id);\nregisterAction2(AccessibleDiffViewerNext);\nCommandsRegistry.registerCommandAlias('editor.action.diffReview.prev', AccessibleDiffViewerPrev.id);\nregisterAction2(AccessibleDiffViewerPrev);\n","import { alert } from '../../../../base/browser/ui/aria/aria.js';\nimport { MarkdownString } from '../../../../base/common/htmlContent.js';\nimport { KeyChord } from '../../../../base/common/keyCodes.js';\nimport './anchorSelect.css';\nimport { registerEditorContribution, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { RawContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar SelectionAnchorController_1;\nconst SelectionAnchorSet = new RawContextKey('selectionAnchorSet', false);\nlet SelectionAnchorController = class SelectionAnchorController {\n    static { SelectionAnchorController_1 = this; }\n    static { this.ID = 'editor.contrib.selectionAnchorController'; }\n    static get(editor) {\n        return editor.getContribution(SelectionAnchorController_1.ID);\n    }\n    constructor(editor, contextKeyService) {\n        this.editor = editor;\n        this.selectionAnchorSetContextKey = SelectionAnchorSet.bindTo(contextKeyService);\n        this.modelChangeListener = editor.onDidChangeModel(() => this.selectionAnchorSetContextKey.reset());\n    }\n    setSelectionAnchor() {\n        if (this.editor.hasModel()) {\n            const position = this.editor.getPosition();\n            this.editor.changeDecorations((accessor) => {\n                if (this.decorationId) {\n                    accessor.removeDecoration(this.decorationId);\n                }\n                this.decorationId = accessor.addDecoration(Selection.fromPositions(position, position), {\n                    description: 'selection-anchor',\n                    stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n                    hoverMessage: new MarkdownString().appendText(localize(798, \"Selection Anchor\")),\n                    className: 'selection-anchor'\n                });\n            });\n            this.selectionAnchorSetContextKey.set(!!this.decorationId);\n            alert(localize(799, \"Anchor set at {0}:{1}\", position.lineNumber, position.column));\n        }\n    }\n    goToSelectionAnchor() {\n        if (this.editor.hasModel() && this.decorationId) {\n            const anchorPosition = this.editor.getModel().getDecorationRange(this.decorationId);\n            if (anchorPosition) {\n                this.editor.setPosition(anchorPosition.getStartPosition());\n            }\n        }\n    }\n    selectFromAnchorToCursor() {\n        if (this.editor.hasModel() && this.decorationId) {\n            const start = this.editor.getModel().getDecorationRange(this.decorationId);\n            if (start) {\n                const end = this.editor.getPosition();\n                this.editor.setSelection(Selection.fromPositions(start.getStartPosition(), end));\n                this.cancelSelectionAnchor();\n            }\n        }\n    }\n    cancelSelectionAnchor() {\n        if (this.decorationId) {\n            const decorationId = this.decorationId;\n            this.editor.changeDecorations((accessor) => {\n                accessor.removeDecoration(decorationId);\n                this.decorationId = undefined;\n            });\n            this.selectionAnchorSetContextKey.set(false);\n        }\n    }\n    dispose() {\n        this.cancelSelectionAnchor();\n        this.modelChangeListener.dispose();\n    }\n};\nSelectionAnchorController = SelectionAnchorController_1 = __decorate([\n    __param(1, IContextKeyService)\n], SelectionAnchorController);\nclass SetSelectionAnchor extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.setSelectionAnchor',\n            label: localize2(800, \"Set Selection Anchor\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 32 /* KeyCode.KeyB */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    async run(_accessor, editor) {\n        SelectionAnchorController.get(editor)?.setSelectionAnchor();\n    }\n}\nclass GoToSelectionAnchor extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.goToSelectionAnchor',\n            label: localize2(801, \"Go to Selection Anchor\"),\n            precondition: SelectionAnchorSet,\n        });\n    }\n    async run(_accessor, editor) {\n        SelectionAnchorController.get(editor)?.goToSelectionAnchor();\n    }\n}\nclass SelectFromAnchorToCursor extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.selectFromAnchorToCursor',\n            label: localize2(802, \"Select from Anchor to Cursor\"),\n            precondition: SelectionAnchorSet,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    async run(_accessor, editor) {\n        SelectionAnchorController.get(editor)?.selectFromAnchorToCursor();\n    }\n}\nclass CancelSelectionAnchor extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.cancelSelectionAnchor',\n            label: localize2(803, \"Cancel Selection Anchor\"),\n            precondition: SelectionAnchorSet,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 9 /* KeyCode.Escape */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    async run(_accessor, editor) {\n        SelectionAnchorController.get(editor)?.cancelSelectionAnchor();\n    }\n}\nregisterEditorContribution(SelectionAnchorController.ID, SelectionAnchorController, 4 /* EditorContributionInstantiation.Lazy */);\nregisterEditorAction(SetSelectionAnchor);\nregisterEditorAction(GoToSelectionAnchor);\nregisterEditorAction(SelectFromAnchorToCursor);\nregisterEditorAction(CancelSelectionAnchor);\n\nexport { SelectionAnchorSet };\n","import { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport './bracketMatching.css';\nimport { registerEditorContribution, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { OverviewRulerLane } from '../../../common/model.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { MenuRegistry, MenuId } from '../../../../platform/actions/common/actions.js';\nimport { registerColor } from '../../../../platform/theme/common/colorUtils.js';\nimport '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { themeColorFromId } from '../../../../platform/theme/common/themeService.js';\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 *--------------------------------------------------------------------------------------------*/\nconst overviewRulerBracketMatchForeground = registerColor('editorOverviewRuler.bracketMatchForeground', '#A0A0A0', localize(804, 'Overview ruler marker color for matching brackets.'));\nclass JumpToBracketAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.jumpToBracket',\n            label: localize2(806, \"Go to Bracket\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 93 /* KeyCode.Backslash */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(accessor, editor) {\n        BracketMatchingController.get(editor)?.jumpToBracket();\n    }\n}\nclass SelectToBracketAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.selectToBracket',\n            label: localize2(807, \"Select to Bracket\"),\n            precondition: undefined,\n            metadata: {\n                description: localize2(808, \"Select the text inside and including the brackets or curly braces\"),\n                args: [{\n                        name: 'args',\n                        schema: {\n                            type: 'object',\n                            properties: {\n                                'selectBrackets': {\n                                    type: 'boolean',\n                                    default: true\n                                }\n                            },\n                        }\n                    }]\n            }\n        });\n    }\n    run(accessor, editor, args) {\n        let selectBrackets = true;\n        if (args && args.selectBrackets === false) {\n            selectBrackets = false;\n        }\n        BracketMatchingController.get(editor)?.selectToBracket(selectBrackets);\n    }\n}\nclass RemoveBracketsAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.removeBrackets',\n            label: localize2(809, \"Remove Brackets\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 1 /* KeyCode.Backspace */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(accessor, editor) {\n        BracketMatchingController.get(editor)?.removeBrackets(this.id);\n    }\n}\nclass BracketsData {\n    constructor(position, brackets, options) {\n        this.position = position;\n        this.brackets = brackets;\n        this.options = options;\n    }\n}\nclass BracketMatchingController extends Disposable {\n    static { this.ID = 'editor.contrib.bracketMatchingController'; }\n    static get(editor) {\n        return editor.getContribution(BracketMatchingController.ID);\n    }\n    constructor(editor) {\n        super();\n        this._editor = editor;\n        this._lastBracketsData = [];\n        this._lastVersionId = 0;\n        this._decorations = this._editor.createDecorationsCollection();\n        this._updateBracketsSoon = this._register(new RunOnceScheduler(() => this._updateBrackets(), 50));\n        this._matchBrackets = this._editor.getOption(80 /* EditorOption.matchBrackets */);\n        this._updateBracketsSoon.schedule();\n        this._register(editor.onDidChangeCursorPosition((e) => {\n            if (this._matchBrackets === 'never') {\n                // Early exit if nothing needs to be done!\n                // Leave some form of early exit check here if you wish to continue being a cursor position change listener ;)\n                return;\n            }\n            this._updateBracketsSoon.schedule();\n        }));\n        this._register(editor.onDidChangeModelContent((e) => {\n            this._updateBracketsSoon.schedule();\n        }));\n        this._register(editor.onDidChangeModel((e) => {\n            this._lastBracketsData = [];\n            this._updateBracketsSoon.schedule();\n        }));\n        this._register(editor.onDidChangeModelLanguageConfiguration((e) => {\n            this._lastBracketsData = [];\n            this._updateBracketsSoon.schedule();\n        }));\n        this._register(editor.onDidChangeConfiguration((e) => {\n            if (e.hasChanged(80 /* EditorOption.matchBrackets */)) {\n                this._matchBrackets = this._editor.getOption(80 /* EditorOption.matchBrackets */);\n                this._decorations.clear();\n                this._lastBracketsData = [];\n                this._lastVersionId = 0;\n                this._updateBracketsSoon.schedule();\n            }\n        }));\n        this._register(editor.onDidBlurEditorWidget(() => {\n            this._updateBracketsSoon.schedule();\n        }));\n        this._register(editor.onDidFocusEditorWidget(() => {\n            this._updateBracketsSoon.schedule();\n        }));\n    }\n    jumpToBracket() {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        const model = this._editor.getModel();\n        const newSelections = this._editor.getSelections().map(selection => {\n            const position = selection.getStartPosition();\n            // find matching brackets if position is on a bracket\n            const brackets = model.bracketPairs.matchBracket(position);\n            let newCursorPosition = null;\n            if (brackets) {\n                if (brackets[0].containsPosition(position) && !brackets[1].containsPosition(position)) {\n                    newCursorPosition = brackets[1].getStartPosition();\n                }\n                else if (brackets[1].containsPosition(position)) {\n                    newCursorPosition = brackets[0].getStartPosition();\n                }\n            }\n            else {\n                // find the enclosing brackets if the position isn't on a matching bracket\n                const enclosingBrackets = model.bracketPairs.findEnclosingBrackets(position);\n                if (enclosingBrackets) {\n                    newCursorPosition = enclosingBrackets[1].getStartPosition();\n                }\n                else {\n                    // no enclosing brackets, try the very first next bracket\n                    const nextBracket = model.bracketPairs.findNextBracket(position);\n                    if (nextBracket && nextBracket.range) {\n                        newCursorPosition = nextBracket.range.getStartPosition();\n                    }\n                }\n            }\n            if (newCursorPosition) {\n                return new Selection(newCursorPosition.lineNumber, newCursorPosition.column, newCursorPosition.lineNumber, newCursorPosition.column);\n            }\n            return new Selection(position.lineNumber, position.column, position.lineNumber, position.column);\n        });\n        this._editor.setSelections(newSelections);\n        this._editor.revealRange(newSelections[0]);\n    }\n    selectToBracket(selectBrackets) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        const model = this._editor.getModel();\n        const newSelections = [];\n        this._editor.getSelections().forEach(selection => {\n            const position = selection.getStartPosition();\n            let brackets = model.bracketPairs.matchBracket(position);\n            if (!brackets) {\n                brackets = model.bracketPairs.findEnclosingBrackets(position);\n                if (!brackets) {\n                    const nextBracket = model.bracketPairs.findNextBracket(position);\n                    if (nextBracket && nextBracket.range) {\n                        brackets = model.bracketPairs.matchBracket(nextBracket.range.getStartPosition());\n                    }\n                }\n            }\n            let selectFrom = null;\n            let selectTo = null;\n            if (brackets) {\n                brackets.sort(Range.compareRangesUsingStarts);\n                const [open, close] = brackets;\n                selectFrom = selectBrackets ? open.getStartPosition() : open.getEndPosition();\n                selectTo = selectBrackets ? close.getEndPosition() : close.getStartPosition();\n                if (close.containsPosition(position)) {\n                    // select backwards if the cursor was on the closing bracket\n                    const tmp = selectFrom;\n                    selectFrom = selectTo;\n                    selectTo = tmp;\n                }\n            }\n            if (selectFrom && selectTo) {\n                newSelections.push(new Selection(selectFrom.lineNumber, selectFrom.column, selectTo.lineNumber, selectTo.column));\n            }\n        });\n        if (newSelections.length > 0) {\n            this._editor.setSelections(newSelections);\n            this._editor.revealRange(newSelections[0]);\n        }\n    }\n    removeBrackets(editSource) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        const model = this._editor.getModel();\n        this._editor.getSelections().forEach((selection) => {\n            const position = selection.getPosition();\n            let brackets = model.bracketPairs.matchBracket(position);\n            if (!brackets) {\n                brackets = model.bracketPairs.findEnclosingBrackets(position);\n            }\n            if (brackets) {\n                this._editor.pushUndoStop();\n                this._editor.executeEdits(editSource, [\n                    { range: brackets[0], text: '' },\n                    { range: brackets[1], text: '' }\n                ]);\n                this._editor.pushUndoStop();\n            }\n        });\n    }\n    static { this._DECORATION_OPTIONS_WITH_OVERVIEW_RULER = ModelDecorationOptions.register({\n        description: 'bracket-match-overview',\n        stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n        className: 'bracket-match',\n        overviewRuler: {\n            color: themeColorFromId(overviewRulerBracketMatchForeground),\n            position: OverviewRulerLane.Center\n        }\n    }); }\n    static { this._DECORATION_OPTIONS_WITHOUT_OVERVIEW_RULER = ModelDecorationOptions.register({\n        description: 'bracket-match-no-overview',\n        stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n        className: 'bracket-match'\n    }); }\n    _updateBrackets() {\n        if (this._matchBrackets === 'never') {\n            return;\n        }\n        this._recomputeBrackets();\n        const newDecorations = [];\n        let newDecorationsLen = 0;\n        for (const bracketData of this._lastBracketsData) {\n            const brackets = bracketData.brackets;\n            if (brackets) {\n                newDecorations[newDecorationsLen++] = { range: brackets[0], options: bracketData.options };\n                newDecorations[newDecorationsLen++] = { range: brackets[1], options: bracketData.options };\n            }\n        }\n        this._decorations.set(newDecorations);\n    }\n    _recomputeBrackets() {\n        if (!this._editor.hasModel() || !this._editor.hasWidgetFocus()) {\n            // no model or no focus => no brackets!\n            this._lastBracketsData = [];\n            this._lastVersionId = 0;\n            return;\n        }\n        const selections = this._editor.getSelections();\n        if (selections.length > 100) {\n            // no bracket matching for high numbers of selections\n            this._lastBracketsData = [];\n            this._lastVersionId = 0;\n            return;\n        }\n        const model = this._editor.getModel();\n        const versionId = model.getVersionId();\n        let previousData = [];\n        if (this._lastVersionId === versionId) {\n            // use the previous data only if the model is at the same version id\n            previousData = this._lastBracketsData;\n        }\n        const positions = [];\n        let positionsLen = 0;\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const selection = selections[i];\n            if (selection.isEmpty()) {\n                // will bracket match a cursor only if the selection is collapsed\n                positions[positionsLen++] = selection.getStartPosition();\n            }\n        }\n        // sort positions for `previousData` cache hits\n        if (positions.length > 1) {\n            positions.sort(Position.compare);\n        }\n        const newData = [];\n        let newDataLen = 0;\n        let previousIndex = 0;\n        const previousLen = previousData.length;\n        for (let i = 0, len = positions.length; i < len; i++) {\n            const position = positions[i];\n            while (previousIndex < previousLen && previousData[previousIndex].position.isBefore(position)) {\n                previousIndex++;\n            }\n            if (previousIndex < previousLen && previousData[previousIndex].position.equals(position)) {\n                newData[newDataLen++] = previousData[previousIndex];\n            }\n            else {\n                let brackets = model.bracketPairs.matchBracket(position, 20 /* give at most 20ms to compute */);\n                let options = BracketMatchingController._DECORATION_OPTIONS_WITH_OVERVIEW_RULER;\n                if (!brackets && this._matchBrackets === 'always') {\n                    brackets = model.bracketPairs.findEnclosingBrackets(position, 20 /* give at most 20ms to compute */);\n                    options = BracketMatchingController._DECORATION_OPTIONS_WITHOUT_OVERVIEW_RULER;\n                }\n                newData[newDataLen++] = new BracketsData(position, brackets, options);\n            }\n        }\n        this._lastBracketsData = newData;\n        this._lastVersionId = versionId;\n    }\n}\nregisterEditorContribution(BracketMatchingController.ID, BracketMatchingController, 1 /* EditorContributionInstantiation.AfterFirstRender */);\nregisterEditorAction(SelectToBracketAction);\nregisterEditorAction(JumpToBracketAction);\nregisterEditorAction(RemoveBracketsAction);\n// Go to menu\nMenuRegistry.appendMenuItem(MenuId.MenubarGoMenu, {\n    group: '5_infile_nav',\n    command: {\n        id: 'editor.action.jumpToBracket',\n        title: localize(805, \"Go to &&Bracket\")\n    },\n    order: 2\n});\n\nexport { BracketMatchingController };\n","import { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\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 *--------------------------------------------------------------------------------------------*/\nclass MoveCaretCommand {\n    constructor(selection, isMovingLeft) {\n        this._selection = selection;\n        this._isMovingLeft = isMovingLeft;\n    }\n    getEditOperations(model, builder) {\n        if (this._selection.startLineNumber !== this._selection.endLineNumber || this._selection.isEmpty()) {\n            return;\n        }\n        const lineNumber = this._selection.startLineNumber;\n        const startColumn = this._selection.startColumn;\n        const endColumn = this._selection.endColumn;\n        if (this._isMovingLeft && startColumn === 1) {\n            return;\n        }\n        if (!this._isMovingLeft && endColumn === model.getLineMaxColumn(lineNumber)) {\n            return;\n        }\n        if (this._isMovingLeft) {\n            const rangeBefore = new Range(lineNumber, startColumn - 1, lineNumber, startColumn);\n            const charBefore = model.getValueInRange(rangeBefore);\n            builder.addEditOperation(rangeBefore, null);\n            builder.addEditOperation(new Range(lineNumber, endColumn, lineNumber, endColumn), charBefore);\n        }\n        else {\n            const rangeAfter = new Range(lineNumber, endColumn, lineNumber, endColumn + 1);\n            const charAfter = model.getValueInRange(rangeAfter);\n            builder.addEditOperation(rangeAfter, null);\n            builder.addEditOperation(new Range(lineNumber, startColumn, lineNumber, startColumn), charAfter);\n        }\n    }\n    computeCursorState(model, helper) {\n        if (this._isMovingLeft) {\n            return new Selection(this._selection.startLineNumber, this._selection.startColumn - 1, this._selection.endLineNumber, this._selection.endColumn - 1);\n        }\n        else {\n            return new Selection(this._selection.startLineNumber, this._selection.startColumn + 1, this._selection.endLineNumber, this._selection.endColumn + 1);\n        }\n    }\n}\n\nexport { MoveCaretCommand };\n","import { registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { MoveCaretCommand } from './moveCaretCommand.js';\nimport { localize2 } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nclass MoveCaretAction extends EditorAction {\n    constructor(left, opts) {\n        super(opts);\n        this.left = left;\n    }\n    run(accessor, editor) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const commands = [];\n        const selections = editor.getSelections();\n        for (const selection of selections) {\n            commands.push(new MoveCaretCommand(selection, this.left));\n        }\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, commands);\n        editor.pushUndoStop();\n    }\n}\nclass MoveCaretLeftAction extends MoveCaretAction {\n    constructor() {\n        super(true, {\n            id: 'editor.action.moveCarretLeftAction',\n            label: localize2(810, \"Move Selected Text Left\"),\n            precondition: EditorContextKeys.writable\n        });\n    }\n}\nclass MoveCaretRightAction extends MoveCaretAction {\n    constructor() {\n        super(false, {\n            id: 'editor.action.moveCarretRightAction',\n            label: localize2(811, \"Move Selected Text Right\"),\n            precondition: EditorContextKeys.writable\n        });\n    }\n}\nregisterEditorAction(MoveCaretLeftAction);\nregisterEditorAction(MoveCaretRightAction);\n","import { registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { ReplaceCommand } from '../../../common/commands/replaceCommand.js';\nimport { MoveOperations } from '../../../common/cursor/cursorMoveOperations.js';\nimport { Range } from '../../../common/core/range.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { localize2 } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nclass TransposeLettersAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.transposeLetters',\n            label: localize2(812, \"Transpose Letters\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 0,\n                mac: {\n                    primary: 256 /* KeyMod.WinCtrl */ | 50 /* KeyCode.KeyT */\n                },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(accessor, editor) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const model = editor.getModel();\n        const commands = [];\n        const selections = editor.getSelections();\n        for (const selection of selections) {\n            if (!selection.isEmpty()) {\n                continue;\n            }\n            const lineNumber = selection.startLineNumber;\n            const column = selection.startColumn;\n            const lastColumn = model.getLineMaxColumn(lineNumber);\n            if (lineNumber === 1 && (column === 1 || (column === 2 && lastColumn === 2))) {\n                // at beginning of file, nothing to do\n                continue;\n            }\n            // handle special case: when at end of line, transpose left two chars\n            // otherwise, transpose left and right chars\n            const endPosition = (column === lastColumn) ?\n                selection.getPosition() :\n                MoveOperations.rightPosition(model, selection.getPosition().lineNumber, selection.getPosition().column);\n            const middlePosition = MoveOperations.leftPosition(model, endPosition);\n            const beginPosition = MoveOperations.leftPosition(model, middlePosition);\n            const leftChar = model.getValueInRange(Range.fromPositions(beginPosition, middlePosition));\n            const rightChar = model.getValueInRange(Range.fromPositions(middlePosition, endPosition));\n            const replaceRange = Range.fromPositions(beginPosition, endPosition);\n            commands.push(new ReplaceCommand(replaceRange, rightChar + leftChar));\n        }\n        if (commands.length > 0) {\n            editor.pushUndoStop();\n            editor.executeCommands(this.id, commands);\n            editor.pushUndoStop();\n        }\n    }\n}\nregisterEditorAction(TransposeLettersAction);\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IProductService = createDecorator('productService');\n\nexport { IProductService };\n","import { distinct } from './arrays.js';\nimport { Iterable } from './iterator.js';\nimport { generateUuid } from './uuid.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction createStringDataTransferItem(stringOrPromise, id) {\n    return {\n        id,\n        asString: async () => stringOrPromise,\n        asFile: () => undefined,\n        value: typeof stringOrPromise === 'string' ? stringOrPromise : undefined,\n    };\n}\nfunction createFileDataTransferItem(fileName, uri, data, id) {\n    const file = { id: generateUuid(), name: fileName, uri, data };\n    return {\n        id,\n        asString: async () => '',\n        asFile: () => file,\n        value: undefined,\n    };\n}\nclass VSDataTransfer {\n    constructor() {\n        this._entries = new Map();\n    }\n    get size() {\n        let size = 0;\n        for (const _ of this._entries) {\n            size++;\n        }\n        return size;\n    }\n    has(mimeType) {\n        return this._entries.has(this.toKey(mimeType));\n    }\n    matches(pattern) {\n        const mimes = [...this._entries.keys()];\n        if (Iterable.some(this, ([_, item]) => item.asFile())) {\n            mimes.push('files');\n        }\n        return matchesMimeType_normalized(normalizeMimeType(pattern), mimes);\n    }\n    get(mimeType) {\n        return this._entries.get(this.toKey(mimeType))?.[0];\n    }\n    /**\n     * Add a new entry to this data transfer.\n     *\n     * This does not replace existing entries for `mimeType`.\n     */\n    append(mimeType, value) {\n        const existing = this._entries.get(mimeType);\n        if (existing) {\n            existing.push(value);\n        }\n        else {\n            this._entries.set(this.toKey(mimeType), [value]);\n        }\n    }\n    /**\n     * Set the entry for a given mime type.\n     *\n     * This replaces all existing entries for `mimeType`.\n     */\n    replace(mimeType, value) {\n        this._entries.set(this.toKey(mimeType), [value]);\n    }\n    /**\n     * Remove all entries for `mimeType`.\n     */\n    delete(mimeType) {\n        this._entries.delete(this.toKey(mimeType));\n    }\n    /**\n     * Iterate over all `[mime, item]` pairs in this data transfer.\n     *\n     * There may be multiple entries for each mime type.\n     */\n    *[Symbol.iterator]() {\n        for (const [mine, items] of this._entries) {\n            for (const item of items) {\n                yield [mine, item];\n            }\n        }\n    }\n    toKey(mimeType) {\n        return normalizeMimeType(mimeType);\n    }\n}\nfunction normalizeMimeType(mimeType) {\n    return mimeType.toLowerCase();\n}\nfunction matchesMimeType(pattern, mimeTypes) {\n    return matchesMimeType_normalized(normalizeMimeType(pattern), mimeTypes.map(normalizeMimeType));\n}\nfunction matchesMimeType_normalized(normalizedPattern, normalizedMimeTypes) {\n    // Anything wildcard\n    if (normalizedPattern === '*/*') {\n        return normalizedMimeTypes.length > 0;\n    }\n    // Exact match\n    if (normalizedMimeTypes.includes(normalizedPattern)) {\n        return true;\n    }\n    // Wildcard, such as `image/*`\n    const wildcard = normalizedPattern.match(/^([a-z]+)\\/([a-z]+|\\*)$/i);\n    if (!wildcard) {\n        return false;\n    }\n    const [_, type, subtype] = wildcard;\n    if (subtype === '*') {\n        return normalizedMimeTypes.some(mime => mime.startsWith(type + '/'));\n    }\n    return false;\n}\nconst UriList = Object.freeze({\n    // http://amundsen.com/hypermedia/urilist/\n    create: (entries) => {\n        return distinct(entries.map(x => x.toString())).join('\\r\\n');\n    },\n    split: (str) => {\n        return str.split('\\r\\n');\n    },\n    parse: (str) => {\n        return UriList.split(str).filter(value => !value.startsWith('#'));\n    }\n});\n\nexport { UriList, VSDataTransfer, createFileDataTransferItem, createStringDataTransferItem, matchesMimeType };\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 *--------------------------------------------------------------------------------------------*/\nclass HierarchicalKind {\n    static { this.sep = '.'; }\n    static { this.None = new HierarchicalKind('@@none@@'); } // Special kind that matches nothing\n    static { this.Empty = new HierarchicalKind(''); }\n    constructor(value) {\n        this.value = value;\n    }\n    equals(other) {\n        return this.value === other.value;\n    }\n    contains(other) {\n        return this.equals(other) || this.value === '' || other.value.startsWith(this.value + HierarchicalKind.sep);\n    }\n    intersects(other) {\n        return this.contains(other) || other.contains(this);\n    }\n    append(...parts) {\n        return new HierarchicalKind((this.value ? [this.value, ...parts] : parts).join(HierarchicalKind.sep));\n    }\n}\n\nexport { HierarchicalKind };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst NO_KEY_MODS = { ctrlCmd: false, alt: false };\nvar QuickInputHideReason;\n(function (QuickInputHideReason) {\n    /**\n     * Focus moved away from the quick input.\n     */\n    QuickInputHideReason[QuickInputHideReason[\"Blur\"] = 1] = \"Blur\";\n    /**\n     * An explicit user gesture, e.g. pressing Escape key.\n     */\n    QuickInputHideReason[QuickInputHideReason[\"Gesture\"] = 2] = \"Gesture\";\n    /**\n     * Anything else.\n     */\n    QuickInputHideReason[QuickInputHideReason[\"Other\"] = 3] = \"Other\";\n})(QuickInputHideReason || (QuickInputHideReason = {}));\n/**\n * Represents the activation behavior for items in a quick input. This means which item will be\n * \"active\" (aka focused).\n */\nvar ItemActivation;\n(function (ItemActivation) {\n    /**\n     * No item will be active.\n     */\n    ItemActivation[ItemActivation[\"NONE\"] = 0] = \"NONE\";\n    /**\n     * First item will be active.\n     */\n    ItemActivation[ItemActivation[\"FIRST\"] = 1] = \"FIRST\";\n    /**\n     * Second item will be active.\n     */\n    ItemActivation[ItemActivation[\"SECOND\"] = 2] = \"SECOND\";\n    /**\n     * Last item will be active.\n     */\n    ItemActivation[ItemActivation[\"LAST\"] = 3] = \"LAST\";\n})(ItemActivation || (ItemActivation = {}));\n/**\n * Represents the focus options for a quick pick.\n */\nvar QuickPickFocus;\n(function (QuickPickFocus) {\n    /**\n     * Focus the first item in the list.\n     */\n    QuickPickFocus[QuickPickFocus[\"First\"] = 1] = \"First\";\n    /**\n     * Focus the second item in the list.\n     */\n    QuickPickFocus[QuickPickFocus[\"Second\"] = 2] = \"Second\";\n    /**\n     * Focus the last item in the list.\n     */\n    QuickPickFocus[QuickPickFocus[\"Last\"] = 3] = \"Last\";\n    /**\n     * Focus the next item in the list.\n     */\n    QuickPickFocus[QuickPickFocus[\"Next\"] = 4] = \"Next\";\n    /**\n     * Focus the previous item in the list.\n     */\n    QuickPickFocus[QuickPickFocus[\"Previous\"] = 5] = \"Previous\";\n    /**\n     * Focus the next page in the list.\n     */\n    QuickPickFocus[QuickPickFocus[\"NextPage\"] = 6] = \"NextPage\";\n    /**\n     * Focus the previous page in the list.\n     */\n    QuickPickFocus[QuickPickFocus[\"PreviousPage\"] = 7] = \"PreviousPage\";\n    /**\n     * Focus the first item under the next separator.\n     */\n    QuickPickFocus[QuickPickFocus[\"NextSeparator\"] = 8] = \"NextSeparator\";\n    /**\n     * Focus the first item under the current separator.\n     */\n    QuickPickFocus[QuickPickFocus[\"PreviousSeparator\"] = 9] = \"PreviousSeparator\";\n})(QuickPickFocus || (QuickPickFocus = {}));\nvar QuickInputButtonLocation;\n(function (QuickInputButtonLocation) {\n    /**\n     * In the title bar.\n     */\n    QuickInputButtonLocation[QuickInputButtonLocation[\"Title\"] = 1] = \"Title\";\n    /**\n     * To the right of the input box.\n     */\n    QuickInputButtonLocation[QuickInputButtonLocation[\"Inline\"] = 2] = \"Inline\";\n    /**\n     * At the far end inside the input box.\n     * Used by the public API to create toggles.\n     */\n    QuickInputButtonLocation[QuickInputButtonLocation[\"Input\"] = 3] = \"Input\";\n})(QuickInputButtonLocation || (QuickInputButtonLocation = {}));\n//#endregion\nconst IQuickInputService = createDecorator('quickInputService');\n//#endregion\n\nexport { IQuickInputService, ItemActivation, NO_KEY_MODS, QuickInputButtonLocation, QuickInputHideReason, QuickPickFocus };\n","import { isNative } from '../../../base/common/platform.js';\nimport { Registry } from '../../registry/common/platform.js';\n\n//#region Editor / Resources DND\nconst CodeDataTransfers = {\n    EDITORS: 'CodeEditors',\n    FILES: 'CodeFiles'};\nclass DragAndDropContributionRegistry {\n}\nconst Extensions = {\n    DragAndDropContribution: 'workbench.contributions.dragAndDrop'\n};\nRegistry.add(Extensions.DragAndDropContribution, new DragAndDropContributionRegistry());\n//#endregion\n//#region DND Utilities\n/**\n * A singleton to store transfer data during drag & drop operations that are only valid within the application.\n */\nclass LocalSelectionTransfer {\n    static { this.INSTANCE = new LocalSelectionTransfer(); }\n    constructor() {\n        // protect against external instantiation\n    }\n    static getInstance() {\n        return LocalSelectionTransfer.INSTANCE;\n    }\n    hasData(proto) {\n        return proto && proto === this.proto;\n    }\n    getData(proto) {\n        if (this.hasData(proto)) {\n            return this.data;\n        }\n        return undefined;\n    }\n}\n/**\n * A helper to get access to Electrons `webUtils.getPathForFile` function\n * in a safe way without crashing the application when running in the web.\n */\nfunction getPathForFile(file) {\n    if (isNative && typeof globalThis.vscode?.webUtils?.getPathForFile === 'function') {\n        return globalThis.vscode?.webUtils?.getPathForFile(file);\n    }\n    return undefined;\n}\n//#endregion\n\nexport { CodeDataTransfers, Extensions, LocalSelectionTransfer, getPathForFile };\n","import { DataTransfers } from '../../base/browser/dnd.js';\nimport { VSDataTransfer, createStringDataTransferItem, UriList, createFileDataTransferItem } from '../../base/common/dataTransfer.js';\nimport { Mimes } from '../../base/common/mime.js';\nimport { URI } from '../../base/common/uri.js';\nimport { getPathForFile, CodeDataTransfers } from '../../platform/dnd/browser/dnd.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction toVSDataTransfer(dataTransfer) {\n    const vsDataTransfer = new VSDataTransfer();\n    for (const item of dataTransfer.items) {\n        const type = item.type;\n        if (item.kind === 'string') {\n            const asStringValue = new Promise(resolve => item.getAsString(resolve));\n            vsDataTransfer.append(type, createStringDataTransferItem(asStringValue));\n        }\n        else if (item.kind === 'file') {\n            const file = item.getAsFile();\n            if (file) {\n                vsDataTransfer.append(type, createFileDataTransferItemFromFile(file));\n            }\n        }\n    }\n    return vsDataTransfer;\n}\nfunction createFileDataTransferItemFromFile(file) {\n    const path = getPathForFile(file);\n    const uri = path ? URI.parse(path) : undefined;\n    return createFileDataTransferItem(file.name, uri, async () => {\n        return new Uint8Array(await file.arrayBuffer());\n    });\n}\nconst INTERNAL_DND_MIME_TYPES = Object.freeze([\n    CodeDataTransfers.EDITORS,\n    CodeDataTransfers.FILES,\n    DataTransfers.RESOURCES,\n    DataTransfers.INTERNAL_URI_LIST,\n]);\nfunction toExternalVSDataTransfer(sourceDataTransfer, overwriteUriList = false) {\n    const vsDataTransfer = toVSDataTransfer(sourceDataTransfer);\n    // Try to expose the internal uri-list type as the standard type\n    const uriList = vsDataTransfer.get(DataTransfers.INTERNAL_URI_LIST);\n    if (uriList) {\n        vsDataTransfer.replace(Mimes.uriList, uriList);\n    }\n    else {\n        if (overwriteUriList || !vsDataTransfer.has(Mimes.uriList)) {\n            // Otherwise, fallback to adding dragged resources to the uri list\n            const editorData = [];\n            for (const item of sourceDataTransfer.items) {\n                const file = item.getAsFile();\n                if (file) {\n                    const path = getPathForFile(file);\n                    try {\n                        if (path) {\n                            editorData.push(URI.file(path).toString());\n                        }\n                        else {\n                            editorData.push(URI.parse(file.name, true).toString());\n                        }\n                    }\n                    catch {\n                        // Parsing failed. Leave out from list\n                    }\n                }\n            }\n            if (editorData.length) {\n                vsDataTransfer.replace(Mimes.uriList, createStringDataTransferItem(UriList.create(editorData)));\n            }\n        }\n    }\n    for (const internal of INTERNAL_DND_MIME_TYPES) {\n        vsDataTransfer.delete(internal);\n    }\n    return vsDataTransfer;\n}\n\nexport { toExternalVSDataTransfer, toVSDataTransfer };\n","import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { isObject } from '../../../base/common/types.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IBulkEditService = createDecorator('IWorkspaceEditService');\nclass ResourceEdit {\n    constructor(metadata) {\n        this.metadata = metadata;\n    }\n    static convert(edit) {\n        return edit.edits.map(edit => {\n            if (ResourceTextEdit.is(edit)) {\n                return ResourceTextEdit.lift(edit);\n            }\n            if (ResourceFileEdit.is(edit)) {\n                return ResourceFileEdit.lift(edit);\n            }\n            throw new Error('Unsupported edit');\n        });\n    }\n}\nclass ResourceTextEdit extends ResourceEdit {\n    static is(candidate) {\n        if (candidate instanceof ResourceTextEdit) {\n            return true;\n        }\n        return isObject(candidate)\n            && URI.isUri(candidate.resource)\n            && isObject(candidate.textEdit);\n    }\n    static lift(edit) {\n        if (edit instanceof ResourceTextEdit) {\n            return edit;\n        }\n        else {\n            return new ResourceTextEdit(edit.resource, edit.textEdit, edit.versionId, edit.metadata);\n        }\n    }\n    constructor(resource, textEdit, versionId = undefined, metadata) {\n        super(metadata);\n        this.resource = resource;\n        this.textEdit = textEdit;\n        this.versionId = versionId;\n    }\n}\nclass ResourceFileEdit extends ResourceEdit {\n    static is(candidate) {\n        if (candidate instanceof ResourceFileEdit) {\n            return true;\n        }\n        else {\n            return isObject(candidate)\n                && (Boolean(candidate.newResource) || Boolean(candidate.oldResource));\n        }\n    }\n    static lift(edit) {\n        if (edit instanceof ResourceFileEdit) {\n            return edit;\n        }\n        else {\n            return new ResourceFileEdit(edit.oldResource, edit.newResource, edit.options, edit.metadata);\n        }\n    }\n    constructor(oldResource, newResource, options = {}, metadata) {\n        super(metadata);\n        this.oldResource = oldResource;\n        this.newResource = newResource;\n        this.options = options;\n    }\n}\n\nexport { IBulkEditService, ResourceEdit, ResourceFileEdit, ResourceTextEdit };\n","import { registerEditorCommand, EditorCommand } from '../../../browser/editorExtensions.js';\nimport { RawContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { LinkedList } from '../../../../base/common/linkedList.js';\nimport { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';\nimport { registerSingleton } from '../../../../platform/instantiation/common/extensions.js';\nimport { localize } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IEditorCancellationTokens = createDecorator('IEditorCancelService');\nconst ctxCancellableOperation = new RawContextKey('cancellableOperation', false, localize(939, 'Whether the editor runs a cancellable operation, e.g. like \\'Peek References\\''));\nregisterSingleton(IEditorCancellationTokens, class {\n    constructor() {\n        this._tokens = new WeakMap();\n    }\n    add(editor, cts) {\n        let data = this._tokens.get(editor);\n        if (!data) {\n            data = editor.invokeWithinContext(accessor => {\n                const key = ctxCancellableOperation.bindTo(accessor.get(IContextKeyService));\n                const tokens = new LinkedList();\n                return { key, tokens };\n            });\n            this._tokens.set(editor, data);\n        }\n        let removeFn;\n        data.key.set(true);\n        removeFn = data.tokens.push(cts);\n        return () => {\n            // remove w/o cancellation\n            if (removeFn) {\n                removeFn();\n                data.key.set(!data.tokens.isEmpty());\n                removeFn = undefined;\n            }\n        };\n    }\n    cancel(editor) {\n        const data = this._tokens.get(editor);\n        if (!data) {\n            return;\n        }\n        // remove with cancellation\n        const cts = data.tokens.pop();\n        if (cts) {\n            cts.cancel();\n            data.key.set(!data.tokens.isEmpty());\n        }\n    }\n}, 1 /* InstantiationType.Delayed */);\nclass EditorKeybindingCancellationTokenSource extends CancellationTokenSource {\n    constructor(editor, parent) {\n        super(parent);\n        this.editor = editor;\n        this._unregister = editor.invokeWithinContext(accessor => accessor.get(IEditorCancellationTokens).add(editor, this));\n    }\n    dispose() {\n        this._unregister();\n        super.dispose();\n    }\n}\nregisterEditorCommand(new class extends EditorCommand {\n    constructor() {\n        super({\n            id: 'editor.cancelOperation',\n            kbOpts: {\n                weight: 100 /* KeybindingWeight.EditorContrib */,\n                primary: 9 /* KeyCode.Escape */\n            },\n            precondition: ctxCancellableOperation\n        });\n    }\n    runEditorCommand(accessor, editor) {\n        accessor.get(IEditorCancellationTokens).cancel(editor);\n    }\n});\n\nexport { EditorKeybindingCancellationTokenSource };\n","import { format } from '../../../../base/common/strings.js';\nimport { Range } from '../../../common/core/range.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { EditorKeybindingCancellationTokenSource } from './keybindingCancellation.js';\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 *--------------------------------------------------------------------------------------------*/\nclass EditorState {\n    constructor(editor, flags) {\n        this.flags = flags;\n        if ((this.flags & 1 /* CodeEditorStateFlag.Value */) !== 0) {\n            const model = editor.getModel();\n            this.modelVersionId = model ? format('{0}#{1}', model.uri.toString(), model.getVersionId()) : null;\n        }\n        else {\n            this.modelVersionId = null;\n        }\n        if ((this.flags & 4 /* CodeEditorStateFlag.Position */) !== 0) {\n            this.position = editor.getPosition();\n        }\n        else {\n            this.position = null;\n        }\n        if ((this.flags & 2 /* CodeEditorStateFlag.Selection */) !== 0) {\n            this.selection = editor.getSelection();\n        }\n        else {\n            this.selection = null;\n        }\n        if ((this.flags & 8 /* CodeEditorStateFlag.Scroll */) !== 0) {\n            this.scrollLeft = editor.getScrollLeft();\n            this.scrollTop = editor.getScrollTop();\n        }\n        else {\n            this.scrollLeft = -1;\n            this.scrollTop = -1;\n        }\n    }\n    _equals(other) {\n        if (!(other instanceof EditorState)) {\n            return false;\n        }\n        const state = other;\n        if (this.modelVersionId !== state.modelVersionId) {\n            return false;\n        }\n        if (this.scrollLeft !== state.scrollLeft || this.scrollTop !== state.scrollTop) {\n            return false;\n        }\n        if (!this.position && state.position || this.position && !state.position || this.position && state.position && !this.position.equals(state.position)) {\n            return false;\n        }\n        if (!this.selection && state.selection || this.selection && !state.selection || this.selection && state.selection && !this.selection.equalsRange(state.selection)) {\n            return false;\n        }\n        return true;\n    }\n    validate(editor) {\n        return this._equals(new EditorState(editor, this.flags));\n    }\n}\n/**\n * A cancellation token source that cancels when the editor changes as expressed\n * by the provided flags\n * @param range If provided, changes in position and selection within this range will not trigger cancellation\n */\nclass EditorStateCancellationTokenSource extends EditorKeybindingCancellationTokenSource {\n    constructor(editor, flags, range, parent) {\n        super(editor, parent);\n        this._listener = new DisposableStore();\n        if (flags & 4 /* CodeEditorStateFlag.Position */) {\n            this._listener.add(editor.onDidChangeCursorPosition(e => {\n                if (!range || !Range.containsPosition(range, e.position)) {\n                    this.cancel();\n                }\n            }));\n        }\n        if (flags & 2 /* CodeEditorStateFlag.Selection */) {\n            this._listener.add(editor.onDidChangeCursorSelection(e => {\n                if (!range || !Range.containsRange(range, e.selection)) {\n                    this.cancel();\n                }\n            }));\n        }\n        if (flags & 8 /* CodeEditorStateFlag.Scroll */) {\n            this._listener.add(editor.onDidScrollChange(_ => this.cancel()));\n        }\n        if (flags & 1 /* CodeEditorStateFlag.Value */) {\n            this._listener.add(editor.onDidChangeModel(_ => this.cancel()));\n            this._listener.add(editor.onDidChangeModelContent(_ => this.cancel()));\n        }\n    }\n    dispose() {\n        this._listener.dispose();\n        super.dispose();\n    }\n}\n/**\n * A cancellation token source that cancels when the provided model changes\n */\nclass TextModelCancellationTokenSource extends CancellationTokenSource {\n    constructor(model, parent) {\n        super(parent);\n        this._listener = model.onDidChangeContent(() => this.cancel());\n    }\n    dispose() {\n        this._listener.dispose();\n        super.dispose();\n    }\n}\n\nexport { EditorState, EditorStateCancellationTokenSource, TextModelCancellationTokenSource };\n","import { $, addDisposableListener, EventType } from '../../../../base/browser/dom.js';\nimport { disposableTimeout } from '../../../../base/common/async.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { Disposable, MutableDisposable } from '../../../../base/common/lifecycle.js';\nimport { noBreakWhitespace } from '../../../../base/common/strings.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\nimport './inlineProgressWidget.css';\nimport { Range } from '../../../common/core/range.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst inlineProgressDecoration = ModelDecorationOptions.register({\n    description: 'inline-progress-widget',\n    stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n    showIfCollapsed: true,\n    after: {\n        content: noBreakWhitespace,\n        inlineClassName: 'inline-editor-progress-decoration',\n        inlineClassNameAffectsLetterSpacing: true,\n    }\n});\nclass InlineProgressWidget extends Disposable {\n    static { this.baseId = 'editor.widget.inlineProgressWidget'; }\n    constructor(typeId, editor, range, title, delegate) {\n        super();\n        this.typeId = typeId;\n        this.editor = editor;\n        this.range = range;\n        this.delegate = delegate;\n        this.allowEditorOverflow = false;\n        this.suppressMouseDown = true;\n        this.create(title);\n        this.editor.addContentWidget(this);\n        this.editor.layoutContentWidget(this);\n    }\n    create(title) {\n        this.domNode = $('.inline-progress-widget');\n        this.domNode.role = 'button';\n        this.domNode.title = title;\n        const iconElement = $('span.icon');\n        this.domNode.append(iconElement);\n        iconElement.classList.add(...ThemeIcon.asClassNameArray(Codicon.loading), 'codicon-modifier-spin');\n        const updateSize = () => {\n            const lineHeight = this.editor.getOption(75 /* EditorOption.lineHeight */);\n            this.domNode.style.height = `${lineHeight}px`;\n            this.domNode.style.width = `${Math.ceil(0.8 * lineHeight)}px`;\n        };\n        updateSize();\n        this._register(this.editor.onDidChangeConfiguration(c => {\n            if (c.hasChanged(61 /* EditorOption.fontSize */) || c.hasChanged(75 /* EditorOption.lineHeight */)) {\n                updateSize();\n            }\n        }));\n        this._register(addDisposableListener(this.domNode, EventType.CLICK, e => {\n            this.delegate.cancel();\n        }));\n    }\n    getId() {\n        return InlineProgressWidget.baseId + '.' + this.typeId;\n    }\n    getDomNode() {\n        return this.domNode;\n    }\n    getPosition() {\n        return {\n            position: { lineNumber: this.range.startLineNumber, column: this.range.startColumn },\n            preference: [0 /* ContentWidgetPositionPreference.EXACT */]\n        };\n    }\n    dispose() {\n        super.dispose();\n        this.editor.removeContentWidget(this);\n    }\n}\nlet InlineProgressManager = class InlineProgressManager extends Disposable {\n    constructor(id, _editor, _instantiationService) {\n        super();\n        this.id = id;\n        this._editor = _editor;\n        this._instantiationService = _instantiationService;\n        /** Delay before showing the progress widget */\n        this._showDelay = 500; // ms\n        this._showPromise = this._register(new MutableDisposable());\n        this._currentWidget = this._register(new MutableDisposable());\n        this._operationIdPool = 0;\n        this._currentDecorations = _editor.createDecorationsCollection();\n    }\n    dispose() {\n        super.dispose();\n        this._currentDecorations.clear();\n    }\n    async showWhile(position, title, promise, delegate, delayOverride) {\n        const operationId = this._operationIdPool++;\n        this._currentOperation = operationId;\n        this.clear();\n        this._showPromise.value = disposableTimeout(() => {\n            const range = Range.fromPositions(position);\n            const decorationIds = this._currentDecorations.set([{\n                    range: range,\n                    options: inlineProgressDecoration,\n                }]);\n            if (decorationIds.length > 0) {\n                this._currentWidget.value = this._instantiationService.createInstance(InlineProgressWidget, this.id, this._editor, range, title, delegate);\n            }\n        }, delayOverride ?? this._showDelay);\n        try {\n            return await promise;\n        }\n        finally {\n            if (this._currentOperation === operationId) {\n                this.clear();\n                this._currentOperation = undefined;\n            }\n        }\n    }\n    clear() {\n        this._showPromise.clear();\n        this._currentDecorations.clear();\n        this._currentWidget.clear();\n    }\n};\nInlineProgressManager = __decorate([\n    __param(2, IInstantiationService)\n], InlineProgressManager);\n\nexport { InlineProgressManager };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IOpenerService = createDecorator('openerService');\n/**\n * Encodes selection into the `URI`.\n *\n * IMPORTANT: you MUST use `extractSelection` to separate the selection\n * again from the original `URI` before passing the `URI` into any\n * component that is not aware of selections.\n */\nfunction withSelection(uri, selection) {\n    return uri.with({ fragment: `${selection.startLineNumber},${selection.startColumn}${selection.endLineNumber ? `-${selection.endLineNumber}${selection.endColumn ? `,${selection.endColumn}` : ''}` : ''}` });\n}\n/**\n * file:///some/file.js#73\n * file:///some/file.js#L73\n * file:///some/file.js#73,84\n * file:///some/file.js#L73,84\n * file:///some/file.js#73-83\n * file:///some/file.js#L73-L83\n * file:///some/file.js#73,84-83,52\n * file:///some/file.js#L73,84-L83,52\n */\nfunction extractSelection(uri) {\n    let selection = undefined;\n    const match = /^L?(\\d+)(?:,(\\d+))?(-L?(\\d+)(?:,(\\d+))?)?/.exec(uri.fragment);\n    if (match) {\n        selection = {\n            startLineNumber: parseInt(match[1]),\n            startColumn: match[2] ? parseInt(match[2]) : 1,\n            endLineNumber: match[4] ? parseInt(match[4]) : undefined,\n            endColumn: match[4] ? (match[5] ? parseInt(match[5]) : 1) : undefined\n        };\n        uri = uri.with({ fragment: '' });\n    }\n    return { selection, uri };\n}\n\nexport { IOpenerService, extractSelection, withSelection };\n","import { renderMarkdown } from '../../../base/browser/markdownRenderer.js';\nimport { onUnexpectedError } from '../../../base/common/errors.js';\nimport { registerSingleton } from '../../instantiation/common/extensions.js';\nimport { createDecorator } from '../../instantiation/common/instantiation.js';\nimport { IOpenerService } from '../../opener/common/opener.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst IMarkdownRendererService = createDecorator('markdownRendererService');\nlet MarkdownRendererService = class MarkdownRendererService {\n    constructor(_openerService) {\n        this._openerService = _openerService;\n    }\n    render(markdown, options, outElement) {\n        const resolvedOptions = { ...options };\n        if (!resolvedOptions.actionHandler) {\n            resolvedOptions.actionHandler = (link, mdStr) => {\n                return openLinkFromMarkdown(this._openerService, link, mdStr.isTrusted);\n            };\n        }\n        if (!resolvedOptions.codeBlockRenderer) {\n            resolvedOptions.codeBlockRenderer = (alias, value) => {\n                return this._defaultCodeBlockRenderer?.renderCodeBlock(alias, value, resolvedOptions ?? {}) ?? Promise.resolve(document.createElement('span'));\n            };\n        }\n        const rendered = renderMarkdown(markdown, resolvedOptions, outElement);\n        rendered.element.classList.add('rendered-markdown');\n        return rendered;\n    }\n    setDefaultCodeBlockRenderer(renderer) {\n        this._defaultCodeBlockRenderer = renderer;\n    }\n};\nMarkdownRendererService = __decorate([\n    __param(0, IOpenerService)\n], MarkdownRendererService);\nasync function openLinkFromMarkdown(openerService, link, isTrusted, skipValidation) {\n    try {\n        return await openerService.open(link, {\n            fromUserGesture: true,\n            allowContributedOpeners: true,\n            allowCommands: toAllowCommandsOption(isTrusted),\n            skipValidation\n        });\n    }\n    catch (e) {\n        onUnexpectedError(e);\n        return false;\n    }\n}\nfunction toAllowCommandsOption(isTrusted) {\n    if (isTrusted === true) {\n        return true; // Allow all commands\n    }\n    if (isTrusted && Array.isArray(isTrusted.enabledCommands)) {\n        return isTrusted.enabledCommands; // Allow subset of commands\n    }\n    return false; // Block commands\n}\nregisterSingleton(IMarkdownRendererService, MarkdownRendererService, 1 /* InstantiationType.Delayed */);\n\nexport { IMarkdownRendererService, MarkdownRendererService, openLinkFromMarkdown };\n","import { renderMarkdown } from '../../../../base/browser/markdownRenderer.js';\nimport { alert } from '../../../../base/browser/ui/aria/aria.js';\nimport { Event } from '../../../../base/common/event.js';\nimport { isMarkdownString } from '../../../../base/common/htmlContent.js';\nimport { MutableDisposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport './messageController.css';\nimport { EditorCommand, registerEditorCommand, registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { Range } from '../../../common/core/range.js';\nimport { openLinkFromMarkdown } from '../../../../platform/markdown/browser/markdownRenderer.js';\nimport { localize } from '../../../../nls.js';\nimport { RawContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IOpenerService } from '../../../../platform/opener/common/opener.js';\nimport { isAncestor, getActiveElement, addDisposableListener, EventType } from '../../../../base/browser/dom.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar MessageController_1;\nlet MessageController = class MessageController {\n    static { MessageController_1 = this; }\n    static { this.ID = 'editor.contrib.messageController'; }\n    static { this.MESSAGE_VISIBLE = new RawContextKey('messageVisible', false, localize(1287, 'Whether the editor is currently showing an inline message')); }\n    static get(editor) {\n        return editor.getContribution(MessageController_1.ID);\n    }\n    constructor(editor, contextKeyService, _openerService) {\n        this._openerService = _openerService;\n        this._messageWidget = new MutableDisposable();\n        this._messageListeners = new DisposableStore();\n        this._mouseOverMessage = false;\n        this._editor = editor;\n        this._visible = MessageController_1.MESSAGE_VISIBLE.bindTo(contextKeyService);\n    }\n    dispose() {\n        this._messageListeners.dispose();\n        this._messageWidget.dispose();\n        this._visible.reset();\n    }\n    showMessage(message, position) {\n        alert(isMarkdownString(message) ? message.value : message);\n        this._visible.set(true);\n        this._messageWidget.clear();\n        this._messageListeners.clear();\n        if (isMarkdownString(message)) {\n            const renderedMessage = this._messageListeners.add(renderMarkdown(message, {\n                actionHandler: (url, mdStr) => {\n                    this.closeMessage();\n                    openLinkFromMarkdown(this._openerService, url, mdStr.isTrusted);\n                },\n            }));\n            this._messageWidget.value = new MessageWidget(this._editor, position, renderedMessage.element);\n        }\n        else {\n            this._messageWidget.value = new MessageWidget(this._editor, position, message);\n        }\n        // close on blur (debounced to allow to tab into the message), cursor, model change, dispose\n        this._messageListeners.add(Event.debounce(this._editor.onDidBlurEditorText, (last, event) => event, 0)(() => {\n            if (this._mouseOverMessage) {\n                return; // override when mouse over message\n            }\n            if (this._messageWidget.value && isAncestor(getActiveElement(), this._messageWidget.value.getDomNode())) {\n                return; // override when focus is inside the message\n            }\n            this.closeMessage();\n        }));\n        this._messageListeners.add(this._editor.onDidChangeCursorPosition(() => this.closeMessage()));\n        this._messageListeners.add(this._editor.onDidDispose(() => this.closeMessage()));\n        this._messageListeners.add(this._editor.onDidChangeModel(() => this.closeMessage()));\n        this._messageListeners.add(addDisposableListener(this._messageWidget.value.getDomNode(), EventType.MOUSE_ENTER, () => this._mouseOverMessage = true, true));\n        this._messageListeners.add(addDisposableListener(this._messageWidget.value.getDomNode(), EventType.MOUSE_LEAVE, () => this._mouseOverMessage = false, true));\n        // close on mouse move\n        let bounds;\n        this._messageListeners.add(this._editor.onMouseMove(e => {\n            // outside the text area\n            if (!e.target.position) {\n                return;\n            }\n            if (!bounds) {\n                // define bounding box around position and first mouse occurance\n                bounds = new Range(position.lineNumber - 3, 1, e.target.position.lineNumber + 3, 1);\n            }\n            else if (!bounds.containsPosition(e.target.position)) {\n                // check if position is still in bounds\n                this.closeMessage();\n            }\n        }));\n    }\n    closeMessage() {\n        this._visible.reset();\n        this._messageListeners.clear();\n        if (this._messageWidget.value) {\n            this._messageListeners.add(MessageWidget.fadeOut(this._messageWidget.value));\n        }\n    }\n};\nMessageController = MessageController_1 = __decorate([\n    __param(1, IContextKeyService),\n    __param(2, IOpenerService)\n], MessageController);\nconst MessageCommand = EditorCommand.bindToContribution(MessageController.get);\nregisterEditorCommand(new MessageCommand({\n    id: 'leaveEditorMessage',\n    precondition: MessageController.MESSAGE_VISIBLE,\n    handler: c => c.closeMessage(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 30,\n        primary: 9 /* KeyCode.Escape */\n    }\n}));\nclass MessageWidget {\n    static fadeOut(messageWidget) {\n        const dispose = () => {\n            messageWidget.dispose();\n            clearTimeout(handle);\n            messageWidget.getDomNode().removeEventListener('animationend', dispose);\n        };\n        const handle = setTimeout(dispose, 110);\n        messageWidget.getDomNode().addEventListener('animationend', dispose);\n        messageWidget.getDomNode().classList.add('fadeOut');\n        return { dispose };\n    }\n    constructor(editor, { lineNumber, column }, text) {\n        // Editor.IContentWidget.allowEditorOverflow\n        this.allowEditorOverflow = true;\n        this.suppressMouseDown = false;\n        this._editor = editor;\n        this._editor.revealLinesInCenterIfOutsideViewport(lineNumber, lineNumber, 0 /* ScrollType.Smooth */);\n        this._position = { lineNumber, column };\n        this._domNode = document.createElement('div');\n        this._domNode.classList.add('monaco-editor-overlaymessage');\n        this._domNode.style.marginLeft = '-6px';\n        const anchorTop = document.createElement('div');\n        anchorTop.classList.add('anchor', 'top');\n        this._domNode.appendChild(anchorTop);\n        const message = document.createElement('div');\n        if (typeof text === 'string') {\n            message.classList.add('message');\n            message.textContent = text;\n        }\n        else {\n            text.classList.add('message');\n            message.appendChild(text);\n        }\n        this._domNode.appendChild(message);\n        const anchorBottom = document.createElement('div');\n        anchorBottom.classList.add('anchor', 'below');\n        this._domNode.appendChild(anchorBottom);\n        this._editor.addContentWidget(this);\n        this._domNode.classList.add('fadeIn');\n    }\n    dispose() {\n        this._editor.removeContentWidget(this);\n    }\n    getId() {\n        return 'messageoverlay';\n    }\n    getDomNode() {\n        return this._domNode;\n    }\n    getPosition() {\n        return {\n            position: this._position,\n            preference: [\n                1 /* ContentWidgetPositionPreference.ABOVE */,\n                2 /* ContentWidgetPositionPreference.BELOW */,\n            ],\n            positionAffinity: 1 /* PositionAffinity.Right */,\n        };\n    }\n    afterRender(position) {\n        this._domNode.classList.toggle('below', position === 2 /* ContentWidgetPositionPreference.BELOW */);\n    }\n}\nregisterEditorContribution(MessageController.ID, MessageController, 4 /* EditorContributionInstantiation.Lazy */);\n\nexport { MessageController };\n","import { assert } from './assert.js';\nimport { compareIgnoreCase, compare, compareSubstring, compareSubstringIgnoreCase } from './strings.js';\n\nclass StringIterator {\n    constructor() {\n        this._value = '';\n        this._pos = 0;\n    }\n    reset(key) {\n        this._value = key;\n        this._pos = 0;\n        return this;\n    }\n    next() {\n        this._pos += 1;\n        return this;\n    }\n    hasNext() {\n        return this._pos < this._value.length - 1;\n    }\n    cmp(a) {\n        const aCode = a.charCodeAt(0);\n        const thisCode = this._value.charCodeAt(this._pos);\n        return aCode - thisCode;\n    }\n    value() {\n        return this._value[this._pos];\n    }\n}\nclass ConfigKeysIterator {\n    constructor(_caseSensitive = true) {\n        this._caseSensitive = _caseSensitive;\n    }\n    reset(key) {\n        this._value = key;\n        this._from = 0;\n        this._to = 0;\n        return this.next();\n    }\n    hasNext() {\n        return this._to < this._value.length;\n    }\n    next() {\n        // this._data = key.split(/[\\\\/]/).filter(s => !!s);\n        this._from = this._to;\n        let justSeps = true;\n        for (; this._to < this._value.length; this._to++) {\n            const ch = this._value.charCodeAt(this._to);\n            if (ch === 46 /* CharCode.Period */) {\n                if (justSeps) {\n                    this._from++;\n                }\n                else {\n                    break;\n                }\n            }\n            else {\n                justSeps = false;\n            }\n        }\n        return this;\n    }\n    cmp(a) {\n        return this._caseSensitive\n            ? compareSubstring(a, this._value, 0, a.length, this._from, this._to)\n            : compareSubstringIgnoreCase(a, this._value, 0, a.length, this._from, this._to);\n    }\n    value() {\n        return this._value.substring(this._from, this._to);\n    }\n}\nclass PathIterator {\n    constructor(_splitOnBackslash = true, _caseSensitive = true) {\n        this._splitOnBackslash = _splitOnBackslash;\n        this._caseSensitive = _caseSensitive;\n    }\n    reset(key) {\n        this._from = 0;\n        this._to = 0;\n        this._value = key;\n        this._valueLen = key.length;\n        for (let pos = key.length - 1; pos >= 0; pos--, this._valueLen--) {\n            const ch = this._value.charCodeAt(pos);\n            if (!(ch === 47 /* CharCode.Slash */ || this._splitOnBackslash && ch === 92 /* CharCode.Backslash */)) {\n                break;\n            }\n        }\n        return this.next();\n    }\n    hasNext() {\n        return this._to < this._valueLen;\n    }\n    next() {\n        // this._data = key.split(/[\\\\/]/).filter(s => !!s);\n        this._from = this._to;\n        let justSeps = true;\n        for (; this._to < this._valueLen; this._to++) {\n            const ch = this._value.charCodeAt(this._to);\n            if (ch === 47 /* CharCode.Slash */ || this._splitOnBackslash && ch === 92 /* CharCode.Backslash */) {\n                if (justSeps) {\n                    this._from++;\n                }\n                else {\n                    break;\n                }\n            }\n            else {\n                justSeps = false;\n            }\n        }\n        return this;\n    }\n    cmp(a) {\n        return this._caseSensitive\n            ? compareSubstring(a, this._value, 0, a.length, this._from, this._to)\n            : compareSubstringIgnoreCase(a, this._value, 0, a.length, this._from, this._to);\n    }\n    value() {\n        return this._value.substring(this._from, this._to);\n    }\n}\nclass UriIterator {\n    constructor(_ignorePathCasing, _ignoreQueryAndFragment) {\n        this._ignorePathCasing = _ignorePathCasing;\n        this._ignoreQueryAndFragment = _ignoreQueryAndFragment;\n        this._states = [];\n        this._stateIdx = 0;\n    }\n    reset(key) {\n        this._value = key;\n        this._states = [];\n        if (this._value.scheme) {\n            this._states.push(1 /* UriIteratorState.Scheme */);\n        }\n        if (this._value.authority) {\n            this._states.push(2 /* UriIteratorState.Authority */);\n        }\n        if (this._value.path) {\n            this._pathIterator = new PathIterator(false, !this._ignorePathCasing(key));\n            this._pathIterator.reset(key.path);\n            if (this._pathIterator.value()) {\n                this._states.push(3 /* UriIteratorState.Path */);\n            }\n        }\n        if (!this._ignoreQueryAndFragment(key)) {\n            if (this._value.query) {\n                this._states.push(4 /* UriIteratorState.Query */);\n            }\n            if (this._value.fragment) {\n                this._states.push(5 /* UriIteratorState.Fragment */);\n            }\n        }\n        this._stateIdx = 0;\n        return this;\n    }\n    next() {\n        if (this._states[this._stateIdx] === 3 /* UriIteratorState.Path */ && this._pathIterator.hasNext()) {\n            this._pathIterator.next();\n        }\n        else {\n            this._stateIdx += 1;\n        }\n        return this;\n    }\n    hasNext() {\n        return (this._states[this._stateIdx] === 3 /* UriIteratorState.Path */ && this._pathIterator.hasNext())\n            || this._stateIdx < this._states.length - 1;\n    }\n    cmp(a) {\n        if (this._states[this._stateIdx] === 1 /* UriIteratorState.Scheme */) {\n            return compareIgnoreCase(a, this._value.scheme);\n        }\n        else if (this._states[this._stateIdx] === 2 /* UriIteratorState.Authority */) {\n            return compareIgnoreCase(a, this._value.authority);\n        }\n        else if (this._states[this._stateIdx] === 3 /* UriIteratorState.Path */) {\n            return this._pathIterator.cmp(a);\n        }\n        else if (this._states[this._stateIdx] === 4 /* UriIteratorState.Query */) {\n            return compare(a, this._value.query);\n        }\n        else if (this._states[this._stateIdx] === 5 /* UriIteratorState.Fragment */) {\n            return compare(a, this._value.fragment);\n        }\n        throw new Error();\n    }\n    value() {\n        if (this._states[this._stateIdx] === 1 /* UriIteratorState.Scheme */) {\n            return this._value.scheme;\n        }\n        else if (this._states[this._stateIdx] === 2 /* UriIteratorState.Authority */) {\n            return this._value.authority;\n        }\n        else if (this._states[this._stateIdx] === 3 /* UriIteratorState.Path */) {\n            return this._pathIterator.value();\n        }\n        else if (this._states[this._stateIdx] === 4 /* UriIteratorState.Query */) {\n            return this._value.query;\n        }\n        else if (this._states[this._stateIdx] === 5 /* UriIteratorState.Fragment */) {\n            return this._value.fragment;\n        }\n        throw new Error();\n    }\n}\nclass Undef {\n    static { this.Val = Symbol('undefined_placeholder'); }\n    static wrap(value) {\n        return value === undefined ? Undef.Val : value;\n    }\n    static unwrap(value) {\n        return value === Undef.Val ? undefined : value;\n    }\n}\nclass TernarySearchTreeNode {\n    constructor() {\n        this.height = 1;\n        this.value = undefined;\n        this.key = undefined;\n        this.left = undefined;\n        this.mid = undefined;\n        this.right = undefined;\n    }\n    rotateLeft() {\n        const tmp = this.right;\n        this.right = tmp.left;\n        tmp.left = this;\n        this.updateHeight();\n        tmp.updateHeight();\n        return tmp;\n    }\n    rotateRight() {\n        const tmp = this.left;\n        this.left = tmp.right;\n        tmp.right = this;\n        this.updateHeight();\n        tmp.updateHeight();\n        return tmp;\n    }\n    updateHeight() {\n        this.height = 1 + Math.max(this.heightLeft, this.heightRight);\n    }\n    balanceFactor() {\n        return this.heightRight - this.heightLeft;\n    }\n    get heightLeft() {\n        return this.left?.height ?? 0;\n    }\n    get heightRight() {\n        return this.right?.height ?? 0;\n    }\n}\nclass TernarySearchTree {\n    static forUris(ignorePathCasing = () => false, ignoreQueryAndFragment = () => false) {\n        return new TernarySearchTree(new UriIterator(ignorePathCasing, ignoreQueryAndFragment));\n    }\n    static forStrings() {\n        return new TernarySearchTree(new StringIterator());\n    }\n    static forConfigKeys() {\n        return new TernarySearchTree(new ConfigKeysIterator());\n    }\n    constructor(segments) {\n        this._iter = segments;\n    }\n    clear() {\n        this._root = undefined;\n    }\n    set(key, element) {\n        const iter = this._iter.reset(key);\n        let node;\n        if (!this._root) {\n            this._root = new TernarySearchTreeNode();\n            this._root.segment = iter.value();\n        }\n        const stack = [];\n        // find insert_node\n        node = this._root;\n        while (true) {\n            const val = iter.cmp(node.segment);\n            if (val > 0) {\n                // left\n                if (!node.left) {\n                    node.left = new TernarySearchTreeNode();\n                    node.left.segment = iter.value();\n                }\n                stack.push([-1 /* Dir.Left */, node]);\n                node = node.left;\n            }\n            else if (val < 0) {\n                // right\n                if (!node.right) {\n                    node.right = new TernarySearchTreeNode();\n                    node.right.segment = iter.value();\n                }\n                stack.push([1 /* Dir.Right */, node]);\n                node = node.right;\n            }\n            else if (iter.hasNext()) {\n                // mid\n                iter.next();\n                if (!node.mid) {\n                    node.mid = new TernarySearchTreeNode();\n                    node.mid.segment = iter.value();\n                }\n                stack.push([0 /* Dir.Mid */, node]);\n                node = node.mid;\n            }\n            else {\n                break;\n            }\n        }\n        // set value\n        const oldElement = Undef.unwrap(node.value);\n        node.value = Undef.wrap(element);\n        node.key = key;\n        // balance\n        for (let i = stack.length - 1; i >= 0; i--) {\n            const node = stack[i][1];\n            node.updateHeight();\n            const bf = node.balanceFactor();\n            if (bf < -1 || bf > 1) {\n                // needs rotate\n                const d1 = stack[i][0];\n                const d2 = stack[i + 1][0];\n                if (d1 === 1 /* Dir.Right */ && d2 === 1 /* Dir.Right */) {\n                    //right, right -> rotate left\n                    stack[i][1] = node.rotateLeft();\n                }\n                else if (d1 === -1 /* Dir.Left */ && d2 === -1 /* Dir.Left */) {\n                    // left, left -> rotate right\n                    stack[i][1] = node.rotateRight();\n                }\n                else if (d1 === 1 /* Dir.Right */ && d2 === -1 /* Dir.Left */) {\n                    // right, left -> double rotate right, left\n                    node.right = stack[i + 1][1] = stack[i + 1][1].rotateRight();\n                    stack[i][1] = node.rotateLeft();\n                }\n                else if (d1 === -1 /* Dir.Left */ && d2 === 1 /* Dir.Right */) {\n                    // left, right -> double rotate left, right\n                    node.left = stack[i + 1][1] = stack[i + 1][1].rotateLeft();\n                    stack[i][1] = node.rotateRight();\n                }\n                else {\n                    throw new Error();\n                }\n                // patch path to parent\n                if (i > 0) {\n                    switch (stack[i - 1][0]) {\n                        case -1 /* Dir.Left */:\n                            stack[i - 1][1].left = stack[i][1];\n                            break;\n                        case 1 /* Dir.Right */:\n                            stack[i - 1][1].right = stack[i][1];\n                            break;\n                        case 0 /* Dir.Mid */:\n                            stack[i - 1][1].mid = stack[i][1];\n                            break;\n                    }\n                }\n                else {\n                    this._root = stack[0][1];\n                }\n            }\n        }\n        return oldElement;\n    }\n    get(key) {\n        return Undef.unwrap(this._getNode(key)?.value);\n    }\n    _getNode(key) {\n        const iter = this._iter.reset(key);\n        let node = this._root;\n        while (node) {\n            const val = iter.cmp(node.segment);\n            if (val > 0) {\n                // left\n                node = node.left;\n            }\n            else if (val < 0) {\n                // right\n                node = node.right;\n            }\n            else if (iter.hasNext()) {\n                // mid\n                iter.next();\n                node = node.mid;\n            }\n            else {\n                break;\n            }\n        }\n        return node;\n    }\n    has(key) {\n        const node = this._getNode(key);\n        return !(node?.value === undefined && node?.mid === undefined);\n    }\n    delete(key) {\n        return this._delete(key, false);\n    }\n    deleteSuperstr(key) {\n        return this._delete(key, true);\n    }\n    _delete(key, superStr) {\n        const iter = this._iter.reset(key);\n        const stack = [];\n        let node = this._root;\n        // find node\n        while (node) {\n            const val = iter.cmp(node.segment);\n            if (val > 0) {\n                // left\n                stack.push([-1 /* Dir.Left */, node]);\n                node = node.left;\n            }\n            else if (val < 0) {\n                // right\n                stack.push([1 /* Dir.Right */, node]);\n                node = node.right;\n            }\n            else if (iter.hasNext()) {\n                // mid\n                iter.next();\n                stack.push([0 /* Dir.Mid */, node]);\n                node = node.mid;\n            }\n            else {\n                break;\n            }\n        }\n        if (!node) {\n            // node not found\n            return;\n        }\n        if (superStr) {\n            // removing children, reset height\n            node.left = undefined;\n            node.mid = undefined;\n            node.right = undefined;\n            node.height = 1;\n        }\n        else {\n            // removing element\n            node.key = undefined;\n            node.value = undefined;\n        }\n        // BST node removal\n        if (!node.mid && !node.value) {\n            if (node.left && node.right) {\n                // full node\n                // replace deleted-node with the min-node of the right branch.\n                // If there is no true min-node leave things as they are\n                const stack2 = [[1 /* Dir.Right */, node]];\n                const min = this._min(node.right, stack2);\n                if (min.key) {\n                    node.key = min.key;\n                    node.value = min.value;\n                    node.segment = min.segment;\n                    // remove NODE (inorder successor can only have right child)\n                    const newChild = min.right;\n                    if (stack2.length > 1) {\n                        const [dir, parent] = stack2[stack2.length - 1];\n                        switch (dir) {\n                            case -1 /* Dir.Left */:\n                                parent.left = newChild;\n                                break;\n                            case 0 /* Dir.Mid */: assert(false);\n                            case 1 /* Dir.Right */: assert(false);\n                        }\n                    }\n                    else {\n                        node.right = newChild;\n                    }\n                    // balance right branch and UPDATE parent pointer for stack\n                    const newChild2 = this._balanceByStack(stack2);\n                    if (stack.length > 0) {\n                        const [dir, parent] = stack[stack.length - 1];\n                        switch (dir) {\n                            case -1 /* Dir.Left */:\n                                parent.left = newChild2;\n                                break;\n                            case 0 /* Dir.Mid */:\n                                parent.mid = newChild2;\n                                break;\n                            case 1 /* Dir.Right */:\n                                parent.right = newChild2;\n                                break;\n                        }\n                    }\n                    else {\n                        this._root = newChild2;\n                    }\n                }\n            }\n            else {\n                // empty or half empty\n                const newChild = node.left ?? node.right;\n                if (stack.length > 0) {\n                    const [dir, parent] = stack[stack.length - 1];\n                    switch (dir) {\n                        case -1 /* Dir.Left */:\n                            parent.left = newChild;\n                            break;\n                        case 0 /* Dir.Mid */:\n                            parent.mid = newChild;\n                            break;\n                        case 1 /* Dir.Right */:\n                            parent.right = newChild;\n                            break;\n                    }\n                }\n                else {\n                    this._root = newChild;\n                }\n            }\n        }\n        // AVL balance\n        this._root = this._balanceByStack(stack) ?? this._root;\n    }\n    _min(node, stack) {\n        while (node.left) {\n            stack.push([-1 /* Dir.Left */, node]);\n            node = node.left;\n        }\n        return node;\n    }\n    _balanceByStack(stack) {\n        for (let i = stack.length - 1; i >= 0; i--) {\n            const node = stack[i][1];\n            node.updateHeight();\n            const bf = node.balanceFactor();\n            if (bf > 1) {\n                // right heavy\n                if (node.right.balanceFactor() >= 0) {\n                    // right, right -> rotate left\n                    stack[i][1] = node.rotateLeft();\n                }\n                else {\n                    // right, left -> double rotate\n                    node.right = node.right.rotateRight();\n                    stack[i][1] = node.rotateLeft();\n                }\n            }\n            else if (bf < -1) {\n                // left heavy\n                if (node.left.balanceFactor() <= 0) {\n                    // left, left -> rotate right\n                    stack[i][1] = node.rotateRight();\n                }\n                else {\n                    // left, right -> double rotate\n                    node.left = node.left.rotateLeft();\n                    stack[i][1] = node.rotateRight();\n                }\n            }\n            // patch path to parent\n            if (i > 0) {\n                switch (stack[i - 1][0]) {\n                    case -1 /* Dir.Left */:\n                        stack[i - 1][1].left = stack[i][1];\n                        break;\n                    case 1 /* Dir.Right */:\n                        stack[i - 1][1].right = stack[i][1];\n                        break;\n                    case 0 /* Dir.Mid */:\n                        stack[i - 1][1].mid = stack[i][1];\n                        break;\n                }\n            }\n            else {\n                return stack[0][1];\n            }\n        }\n        return undefined;\n    }\n    findSubstr(key) {\n        const iter = this._iter.reset(key);\n        let node = this._root;\n        let candidate = undefined;\n        while (node) {\n            const val = iter.cmp(node.segment);\n            if (val > 0) {\n                // left\n                node = node.left;\n            }\n            else if (val < 0) {\n                // right\n                node = node.right;\n            }\n            else if (iter.hasNext()) {\n                // mid\n                iter.next();\n                candidate = Undef.unwrap(node.value) || candidate;\n                node = node.mid;\n            }\n            else {\n                break;\n            }\n        }\n        return node && Undef.unwrap(node.value) || candidate;\n    }\n    findSuperstr(key) {\n        return this._findSuperstrOrElement(key, false);\n    }\n    _findSuperstrOrElement(key, allowValue) {\n        const iter = this._iter.reset(key);\n        let node = this._root;\n        while (node) {\n            const val = iter.cmp(node.segment);\n            if (val > 0) {\n                // left\n                node = node.left;\n            }\n            else if (val < 0) {\n                // right\n                node = node.right;\n            }\n            else if (iter.hasNext()) {\n                // mid\n                iter.next();\n                node = node.mid;\n            }\n            else {\n                // collect\n                if (!node.mid) {\n                    if (allowValue) {\n                        return Undef.unwrap(node.value);\n                    }\n                    else {\n                        return undefined;\n                    }\n                }\n                else {\n                    return this._entries(node.mid);\n                }\n            }\n        }\n        return undefined;\n    }\n    forEach(callback) {\n        for (const [key, value] of this) {\n            callback(value, key);\n        }\n    }\n    *[Symbol.iterator]() {\n        yield* this._entries(this._root);\n    }\n    _entries(node) {\n        const result = [];\n        this._dfsEntries(node, result);\n        return result[Symbol.iterator]();\n    }\n    _dfsEntries(node, bucket) {\n        // DFS\n        if (!node) {\n            return;\n        }\n        if (node.left) {\n            this._dfsEntries(node.left, bucket);\n        }\n        if (node.value !== undefined) {\n            bucket.push([node.key, Undef.unwrap(node.value)]);\n        }\n        if (node.mid) {\n            this._dfsEntries(node.mid, bucket);\n        }\n        if (node.right) {\n            this._dfsEntries(node.right, bucket);\n        }\n    }\n}\n\nexport { ConfigKeysIterator, PathIterator, StringIterator, TernarySearchTree, UriIterator };\n","import { localize } from '../../../nls.js';\nimport { basename } from '../../../base/common/path.js';\nimport '../../../base/common/ternarySearchTree.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IWorkspaceContextService = createDecorator('contextService');\nfunction isSingleFolderWorkspaceIdentifier(obj) {\n    const singleFolderIdentifier = obj;\n    return typeof singleFolderIdentifier?.id === 'string' && URI.isUri(singleFolderIdentifier.uri);\n}\nfunction isEmptyWorkspaceIdentifier(obj) {\n    const emptyWorkspaceIdentifier = obj;\n    return typeof emptyWorkspaceIdentifier?.id === 'string'\n        && !isSingleFolderWorkspaceIdentifier(obj)\n        && !isWorkspaceIdentifier(obj);\n}\nconst UNKNOWN_EMPTY_WINDOW_WORKSPACE = { id: 'empty-window' };\nfunction toWorkspaceIdentifier(arg0, isExtensionDevelopment) {\n    // Empty workspace\n    if (typeof arg0 === 'string' || typeof arg0 === 'undefined') {\n        // With a backupPath, the basename is the empty workspace identifier\n        if (typeof arg0 === 'string') {\n            return {\n                id: basename(arg0)\n            };\n        }\n        return UNKNOWN_EMPTY_WINDOW_WORKSPACE;\n    }\n    // Multi root\n    const workspace = arg0;\n    if (workspace.configuration) {\n        return {\n            id: workspace.id,\n            configPath: workspace.configuration\n        };\n    }\n    // Single folder\n    if (workspace.folders.length === 1) {\n        return {\n            id: workspace.id,\n            uri: workspace.folders[0].uri\n        };\n    }\n    // Empty window\n    return {\n        id: workspace.id\n    };\n}\nfunction isWorkspaceIdentifier(obj) {\n    const workspaceIdentifier = obj;\n    return typeof workspaceIdentifier?.id === 'string' && URI.isUri(workspaceIdentifier.configPath);\n}\nclass WorkspaceFolder {\n    constructor(data, \n    /**\n     * Provides access to the original metadata for this workspace\n     * folder. This can be different from the metadata provided in\n     * this class:\n     * - raw paths can be relative\n     * - raw paths are not normalized\n     */\n    raw) {\n        this.raw = raw;\n        this.uri = data.uri;\n        this.index = data.index;\n        this.name = data.name;\n    }\n    toJSON() {\n        return { uri: this.uri, name: this.name, index: this.index };\n    }\n}\nconst WORKSPACE_EXTENSION = 'code-workspace';\n[{ name: localize(2050, \"Code Workspace\"), extensions: [WORKSPACE_EXTENSION] }];\nconst STANDALONE_EDITOR_WORKSPACE_ID = '4064f6ec-cb38-4ad0-af64-ee6467e63c82';\nfunction isStandaloneEditorWorkspace(workspace) {\n    return workspace.id === STANDALONE_EDITOR_WORKSPACE_ID;\n}\n\nexport { IWorkspaceContextService, STANDALONE_EDITOR_WORKSPACE_ID, UNKNOWN_EMPTY_WINDOW_WORKSPACE, WORKSPACE_EXTENSION, WorkspaceFolder, isEmptyWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isStandaloneEditorWorkspace, isWorkspaceIdentifier, toWorkspaceIdentifier };\n","import { coalesce } from '../../../../base/common/arrays.js';\nimport { UriList } from '../../../../base/common/dataTransfer.js';\nimport { HierarchicalKind } from '../../../../base/common/hierarchicalKind.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { Mimes } from '../../../../base/common/mime.js';\nimport { Schemas } from '../../../../base/common/network.js';\nimport { relativePath } from '../../../../base/common/resources.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { localize } from '../../../../nls.js';\nimport { IWorkspaceContextService } from '../../../../platform/workspace/common/workspace.js';\nimport { DocumentPasteTriggerKind } from '../../../common/languages.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass SimplePasteAndDropProvider {\n    constructor(kind) {\n        this.copyMimeTypes = [];\n        this.kind = kind;\n        this.providedDropEditKinds = [this.kind];\n        this.providedPasteEditKinds = [this.kind];\n    }\n    async provideDocumentPasteEdits(_model, _ranges, dataTransfer, context, token) {\n        const edit = await this.getEdit(dataTransfer, token);\n        if (!edit) {\n            return undefined;\n        }\n        return {\n            edits: [{ insertText: edit.insertText, title: edit.title, kind: edit.kind, handledMimeType: edit.handledMimeType, yieldTo: edit.yieldTo }],\n            dispose() { },\n        };\n    }\n    async provideDocumentDropEdits(_model, _position, dataTransfer, token) {\n        const edit = await this.getEdit(dataTransfer, token);\n        if (!edit) {\n            return;\n        }\n        return {\n            edits: [{ insertText: edit.insertText, title: edit.title, kind: edit.kind, handledMimeType: edit.handledMimeType, yieldTo: edit.yieldTo }],\n            dispose() { },\n        };\n    }\n}\nclass DefaultTextPasteOrDropEditProvider extends SimplePasteAndDropProvider {\n    static { this.id = 'text'; }\n    constructor() {\n        super(HierarchicalKind.Empty.append('text', 'plain'));\n        this.id = DefaultTextPasteOrDropEditProvider.id;\n        this.dropMimeTypes = [Mimes.text];\n        this.pasteMimeTypes = [Mimes.text];\n    }\n    async getEdit(dataTransfer, _token) {\n        const textEntry = dataTransfer.get(Mimes.text);\n        if (!textEntry) {\n            return;\n        }\n        // Suppress if there's also a uriList entry.\n        // Typically the uri-list contains the same text as the text entry so showing both is confusing.\n        if (dataTransfer.has(Mimes.uriList)) {\n            return;\n        }\n        const insertText = await textEntry.asString();\n        return {\n            handledMimeType: Mimes.text,\n            title: localize(926, \"Insert Plain Text\"),\n            insertText,\n            kind: this.kind,\n        };\n    }\n}\nclass PathProvider extends SimplePasteAndDropProvider {\n    constructor() {\n        super(HierarchicalKind.Empty.append('uri', 'path', 'absolute'));\n        this.dropMimeTypes = [Mimes.uriList];\n        this.pasteMimeTypes = [Mimes.uriList];\n    }\n    async getEdit(dataTransfer, token) {\n        const entries = await extractUriList(dataTransfer);\n        if (!entries.length || token.isCancellationRequested) {\n            return;\n        }\n        let uriCount = 0;\n        const insertText = entries\n            .map(({ uri, originalText }) => {\n            if (uri.scheme === Schemas.file) {\n                return uri.fsPath;\n            }\n            else {\n                uriCount++;\n                return originalText;\n            }\n        })\n            .join(' ');\n        let label;\n        if (uriCount > 0) {\n            // Dropping at least one generic uri (such as https) so use most generic label\n            label = entries.length > 1\n                ? localize(927, \"Insert Uris\")\n                : localize(928, \"Insert Uri\");\n        }\n        else {\n            // All the paths are file paths\n            label = entries.length > 1\n                ? localize(929, \"Insert Paths\")\n                : localize(930, \"Insert Path\");\n        }\n        return {\n            handledMimeType: Mimes.uriList,\n            insertText,\n            title: label,\n            kind: this.kind,\n        };\n    }\n}\nlet RelativePathProvider = class RelativePathProvider extends SimplePasteAndDropProvider {\n    constructor(_workspaceContextService) {\n        super(HierarchicalKind.Empty.append('uri', 'path', 'relative'));\n        this._workspaceContextService = _workspaceContextService;\n        this.dropMimeTypes = [Mimes.uriList];\n        this.pasteMimeTypes = [Mimes.uriList];\n    }\n    async getEdit(dataTransfer, token) {\n        const entries = await extractUriList(dataTransfer);\n        if (!entries.length || token.isCancellationRequested) {\n            return;\n        }\n        const relativeUris = coalesce(entries.map(({ uri }) => {\n            const root = this._workspaceContextService.getWorkspaceFolder(uri);\n            return root ? relativePath(root.uri, uri) : undefined;\n        }));\n        if (!relativeUris.length) {\n            return;\n        }\n        return {\n            handledMimeType: Mimes.uriList,\n            insertText: relativeUris.join(' '),\n            title: entries.length > 1\n                ? localize(931, \"Insert Relative Paths\")\n                : localize(932, \"Insert Relative Path\"),\n            kind: this.kind,\n        };\n    }\n};\nRelativePathProvider = __decorate([\n    __param(0, IWorkspaceContextService)\n], RelativePathProvider);\nclass PasteHtmlProvider {\n    constructor() {\n        this.kind = new HierarchicalKind('html');\n        this.providedPasteEditKinds = [this.kind];\n        this.copyMimeTypes = [];\n        this.pasteMimeTypes = ['text/html'];\n        this._yieldTo = [{ mimeType: Mimes.text }];\n    }\n    async provideDocumentPasteEdits(_model, _ranges, dataTransfer, context, token) {\n        if (context.triggerKind !== DocumentPasteTriggerKind.PasteAs && !context.only?.contains(this.kind)) {\n            return;\n        }\n        const entry = dataTransfer.get('text/html');\n        const htmlText = await entry?.asString();\n        if (!htmlText || token.isCancellationRequested) {\n            return;\n        }\n        return {\n            dispose() { },\n            edits: [{\n                    insertText: htmlText,\n                    yieldTo: this._yieldTo,\n                    title: localize(933, 'Insert HTML'),\n                    kind: this.kind,\n                }],\n        };\n    }\n}\nasync function extractUriList(dataTransfer) {\n    const urlListEntry = dataTransfer.get(Mimes.uriList);\n    if (!urlListEntry) {\n        return [];\n    }\n    const strUriList = await urlListEntry.asString();\n    const entries = [];\n    for (const entry of UriList.parse(strUriList)) {\n        try {\n            entries.push({ uri: URI.parse(entry), originalText: entry });\n        }\n        catch {\n            // noop\n        }\n    }\n    return entries;\n}\nconst genericLanguageSelector = { scheme: '*', hasAccessToAllModels: true };\nlet DefaultDropProvidersFeature = class DefaultDropProvidersFeature extends Disposable {\n    constructor(languageFeaturesService, workspaceContextService) {\n        super();\n        this._register(languageFeaturesService.documentDropEditProvider.register(genericLanguageSelector, new DefaultTextPasteOrDropEditProvider()));\n        this._register(languageFeaturesService.documentDropEditProvider.register(genericLanguageSelector, new PathProvider()));\n        this._register(languageFeaturesService.documentDropEditProvider.register(genericLanguageSelector, new RelativePathProvider(workspaceContextService)));\n    }\n};\nDefaultDropProvidersFeature = __decorate([\n    __param(0, ILanguageFeaturesService),\n    __param(1, IWorkspaceContextService)\n], DefaultDropProvidersFeature);\nlet DefaultPasteProvidersFeature = class DefaultPasteProvidersFeature extends Disposable {\n    constructor(languageFeaturesService, workspaceContextService) {\n        super();\n        this._register(languageFeaturesService.documentPasteEditProvider.register(genericLanguageSelector, new DefaultTextPasteOrDropEditProvider()));\n        this._register(languageFeaturesService.documentPasteEditProvider.register(genericLanguageSelector, new PathProvider()));\n        this._register(languageFeaturesService.documentPasteEditProvider.register(genericLanguageSelector, new RelativePathProvider(workspaceContextService)));\n        this._register(languageFeaturesService.documentPasteEditProvider.register(genericLanguageSelector, new PasteHtmlProvider()));\n    }\n};\nDefaultPasteProvidersFeature = __decorate([\n    __param(0, ILanguageFeaturesService),\n    __param(1, IWorkspaceContextService)\n], DefaultPasteProvidersFeature);\n\nexport { DefaultDropProvidersFeature, DefaultPasteProvidersFeature, DefaultTextPasteOrDropEditProvider };\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 *--------------------------------------------------------------------------------------------*/\nclass Scanner {\n    constructor() {\n        this.value = '';\n        this.pos = 0;\n    }\n    static { this._table = {\n        [36 /* CharCode.DollarSign */]: 0 /* TokenType.Dollar */,\n        [58 /* CharCode.Colon */]: 1 /* TokenType.Colon */,\n        [44 /* CharCode.Comma */]: 2 /* TokenType.Comma */,\n        [123 /* CharCode.OpenCurlyBrace */]: 3 /* TokenType.CurlyOpen */,\n        [125 /* CharCode.CloseCurlyBrace */]: 4 /* TokenType.CurlyClose */,\n        [92 /* CharCode.Backslash */]: 5 /* TokenType.Backslash */,\n        [47 /* CharCode.Slash */]: 6 /* TokenType.Forwardslash */,\n        [124 /* CharCode.Pipe */]: 7 /* TokenType.Pipe */,\n        [43 /* CharCode.Plus */]: 11 /* TokenType.Plus */,\n        [45 /* CharCode.Dash */]: 12 /* TokenType.Dash */,\n        [63 /* CharCode.QuestionMark */]: 13 /* TokenType.QuestionMark */,\n    }; }\n    static isDigitCharacter(ch) {\n        return ch >= 48 /* CharCode.Digit0 */ && ch <= 57 /* CharCode.Digit9 */;\n    }\n    static isVariableCharacter(ch) {\n        return ch === 95 /* CharCode.Underline */\n            || (ch >= 97 /* CharCode.a */ && ch <= 122 /* CharCode.z */)\n            || (ch >= 65 /* CharCode.A */ && ch <= 90 /* CharCode.Z */);\n    }\n    text(value) {\n        this.value = value;\n        this.pos = 0;\n    }\n    tokenText(token) {\n        return this.value.substr(token.pos, token.len);\n    }\n    next() {\n        if (this.pos >= this.value.length) {\n            return { type: 14 /* TokenType.EOF */, pos: this.pos, len: 0 };\n        }\n        const pos = this.pos;\n        let len = 0;\n        let ch = this.value.charCodeAt(pos);\n        let type;\n        // static types\n        type = Scanner._table[ch];\n        if (typeof type === 'number') {\n            this.pos += 1;\n            return { type, pos, len: 1 };\n        }\n        // number\n        if (Scanner.isDigitCharacter(ch)) {\n            type = 8 /* TokenType.Int */;\n            do {\n                len += 1;\n                ch = this.value.charCodeAt(pos + len);\n            } while (Scanner.isDigitCharacter(ch));\n            this.pos += len;\n            return { type, pos, len };\n        }\n        // variable name\n        if (Scanner.isVariableCharacter(ch)) {\n            type = 9 /* TokenType.VariableName */;\n            do {\n                ch = this.value.charCodeAt(pos + (++len));\n            } while (Scanner.isVariableCharacter(ch) || Scanner.isDigitCharacter(ch));\n            this.pos += len;\n            return { type, pos, len };\n        }\n        // format\n        type = 10 /* TokenType.Format */;\n        do {\n            len += 1;\n            ch = this.value.charCodeAt(pos + len);\n        } while (!isNaN(ch)\n            && typeof Scanner._table[ch] === 'undefined' // not static token\n            && !Scanner.isDigitCharacter(ch) // not number\n            && !Scanner.isVariableCharacter(ch) // not variable\n        );\n        this.pos += len;\n        return { type, pos, len };\n    }\n}\nclass Marker {\n    constructor() {\n        this._children = [];\n    }\n    appendChild(child) {\n        if (child instanceof Text && this._children[this._children.length - 1] instanceof Text) {\n            // this and previous child are text -> merge them\n            this._children[this._children.length - 1].value += child.value;\n        }\n        else {\n            // normal adoption of child\n            child.parent = this;\n            this._children.push(child);\n        }\n        return this;\n    }\n    replace(child, others) {\n        const { parent } = child;\n        const idx = parent.children.indexOf(child);\n        const newChildren = parent.children.slice(0);\n        newChildren.splice(idx, 1, ...others);\n        parent._children = newChildren;\n        (function _fixParent(children, parent) {\n            for (const child of children) {\n                child.parent = parent;\n                _fixParent(child.children, child);\n            }\n        })(others, parent);\n    }\n    get children() {\n        return this._children;\n    }\n    get rightMostDescendant() {\n        if (this._children.length > 0) {\n            return this._children[this._children.length - 1].rightMostDescendant;\n        }\n        return this;\n    }\n    get snippet() {\n        let candidate = this;\n        while (true) {\n            if (!candidate) {\n                return undefined;\n            }\n            if (candidate instanceof TextmateSnippet) {\n                return candidate;\n            }\n            candidate = candidate.parent;\n        }\n    }\n    toString() {\n        return this.children.reduce((prev, cur) => prev + cur.toString(), '');\n    }\n    len() {\n        return 0;\n    }\n}\nclass Text extends Marker {\n    constructor(value) {\n        super();\n        this.value = value;\n    }\n    toString() {\n        return this.value;\n    }\n    len() {\n        return this.value.length;\n    }\n    clone() {\n        return new Text(this.value);\n    }\n}\nclass TransformableMarker extends Marker {\n}\nclass Placeholder extends TransformableMarker {\n    static compareByIndex(a, b) {\n        if (a.index === b.index) {\n            return 0;\n        }\n        else if (a.isFinalTabstop) {\n            return 1;\n        }\n        else if (b.isFinalTabstop) {\n            return -1;\n        }\n        else if (a.index < b.index) {\n            return -1;\n        }\n        else if (a.index > b.index) {\n            return 1;\n        }\n        else {\n            return 0;\n        }\n    }\n    constructor(index) {\n        super();\n        this.index = index;\n    }\n    get isFinalTabstop() {\n        return this.index === 0;\n    }\n    get choice() {\n        return this._children.length === 1 && this._children[0] instanceof Choice\n            ? this._children[0]\n            : undefined;\n    }\n    clone() {\n        const ret = new Placeholder(this.index);\n        if (this.transform) {\n            ret.transform = this.transform.clone();\n        }\n        ret._children = this.children.map(child => child.clone());\n        return ret;\n    }\n}\nclass Choice extends Marker {\n    constructor() {\n        super(...arguments);\n        this.options = [];\n    }\n    appendChild(marker) {\n        if (marker instanceof Text) {\n            marker.parent = this;\n            this.options.push(marker);\n        }\n        return this;\n    }\n    toString() {\n        return this.options[0].value;\n    }\n    len() {\n        return this.options[0].len();\n    }\n    clone() {\n        const ret = new Choice();\n        this.options.forEach(ret.appendChild, ret);\n        return ret;\n    }\n}\nclass Transform extends Marker {\n    constructor() {\n        super(...arguments);\n        this.regexp = new RegExp('');\n    }\n    resolve(value) {\n        const _this = this;\n        let didMatch = false;\n        let ret = value.replace(this.regexp, function () {\n            didMatch = true;\n            return _this._replace(Array.prototype.slice.call(arguments, 0, -2));\n        });\n        // when the regex didn't match and when the transform has\n        // else branches, then run those\n        if (!didMatch && this._children.some(child => child instanceof FormatString && Boolean(child.elseValue))) {\n            ret = this._replace([]);\n        }\n        return ret;\n    }\n    _replace(groups) {\n        let ret = '';\n        for (const marker of this._children) {\n            if (marker instanceof FormatString) {\n                let value = groups[marker.index] || '';\n                value = marker.resolve(value);\n                ret += value;\n            }\n            else {\n                ret += marker.toString();\n            }\n        }\n        return ret;\n    }\n    toString() {\n        return '';\n    }\n    clone() {\n        const ret = new Transform();\n        ret.regexp = new RegExp(this.regexp.source, '' + (this.regexp.ignoreCase ? 'i' : '') + (this.regexp.global ? 'g' : ''));\n        ret._children = this.children.map(child => child.clone());\n        return ret;\n    }\n}\nclass FormatString extends Marker {\n    constructor(index, shorthandName, ifValue, elseValue) {\n        super();\n        this.index = index;\n        this.shorthandName = shorthandName;\n        this.ifValue = ifValue;\n        this.elseValue = elseValue;\n    }\n    resolve(value) {\n        if (this.shorthandName === 'upcase') {\n            return !value ? '' : value.toLocaleUpperCase();\n        }\n        else if (this.shorthandName === 'downcase') {\n            return !value ? '' : value.toLocaleLowerCase();\n        }\n        else if (this.shorthandName === 'capitalize') {\n            return !value ? '' : (value[0].toLocaleUpperCase() + value.substr(1));\n        }\n        else if (this.shorthandName === 'pascalcase') {\n            return !value ? '' : this._toPascalCase(value);\n        }\n        else if (this.shorthandName === 'camelcase') {\n            return !value ? '' : this._toCamelCase(value);\n        }\n        else if (Boolean(value) && typeof this.ifValue === 'string') {\n            return this.ifValue;\n        }\n        else if (!Boolean(value) && typeof this.elseValue === 'string') {\n            return this.elseValue;\n        }\n        else {\n            return value || '';\n        }\n    }\n    _toPascalCase(value) {\n        const match = value.match(/[a-z0-9]+/gi);\n        if (!match) {\n            return value;\n        }\n        return match.map(word => {\n            return word.charAt(0).toUpperCase() + word.substr(1);\n        })\n            .join('');\n    }\n    _toCamelCase(value) {\n        const match = value.match(/[a-z0-9]+/gi);\n        if (!match) {\n            return value;\n        }\n        return match.map((word, index) => {\n            if (index === 0) {\n                return word.charAt(0).toLowerCase() + word.substr(1);\n            }\n            return word.charAt(0).toUpperCase() + word.substr(1);\n        })\n            .join('');\n    }\n    clone() {\n        const ret = new FormatString(this.index, this.shorthandName, this.ifValue, this.elseValue);\n        return ret;\n    }\n}\nclass Variable extends TransformableMarker {\n    constructor(name) {\n        super();\n        this.name = name;\n    }\n    resolve(resolver) {\n        let value = resolver.resolve(this);\n        if (this.transform) {\n            value = this.transform.resolve(value || '');\n        }\n        if (value !== undefined) {\n            this._children = [new Text(value)];\n            return true;\n        }\n        return false;\n    }\n    clone() {\n        const ret = new Variable(this.name);\n        if (this.transform) {\n            ret.transform = this.transform.clone();\n        }\n        ret._children = this.children.map(child => child.clone());\n        return ret;\n    }\n}\nfunction walk(marker, visitor) {\n    const stack = [...marker];\n    while (stack.length > 0) {\n        const marker = stack.shift();\n        const recurse = visitor(marker);\n        if (!recurse) {\n            break;\n        }\n        stack.unshift(...marker.children);\n    }\n}\nclass TextmateSnippet extends Marker {\n    get placeholderInfo() {\n        if (!this._placeholders) {\n            // fill in placeholders\n            const all = [];\n            let last;\n            this.walk(function (candidate) {\n                if (candidate instanceof Placeholder) {\n                    all.push(candidate);\n                    last = !last || last.index < candidate.index ? candidate : last;\n                }\n                return true;\n            });\n            this._placeholders = { all, last };\n        }\n        return this._placeholders;\n    }\n    get placeholders() {\n        const { all } = this.placeholderInfo;\n        return all;\n    }\n    offset(marker) {\n        let pos = 0;\n        let found = false;\n        this.walk(candidate => {\n            if (candidate === marker) {\n                found = true;\n                return false;\n            }\n            pos += candidate.len();\n            return true;\n        });\n        if (!found) {\n            return -1;\n        }\n        return pos;\n    }\n    fullLen(marker) {\n        let ret = 0;\n        walk([marker], marker => {\n            ret += marker.len();\n            return true;\n        });\n        return ret;\n    }\n    enclosingPlaceholders(placeholder) {\n        const ret = [];\n        let { parent } = placeholder;\n        while (parent) {\n            if (parent instanceof Placeholder) {\n                ret.push(parent);\n            }\n            parent = parent.parent;\n        }\n        return ret;\n    }\n    resolveVariables(resolver) {\n        this.walk(candidate => {\n            if (candidate instanceof Variable) {\n                if (candidate.resolve(resolver)) {\n                    this._placeholders = undefined;\n                }\n            }\n            return true;\n        });\n        return this;\n    }\n    appendChild(child) {\n        this._placeholders = undefined;\n        return super.appendChild(child);\n    }\n    replace(child, others) {\n        this._placeholders = undefined;\n        return super.replace(child, others);\n    }\n    clone() {\n        const ret = new TextmateSnippet();\n        this._children = this.children.map(child => child.clone());\n        return ret;\n    }\n    walk(visitor) {\n        walk(this.children, visitor);\n    }\n}\nclass SnippetParser {\n    constructor() {\n        this._scanner = new Scanner();\n        this._token = { type: 14 /* TokenType.EOF */, pos: 0, len: 0 };\n    }\n    static escape(value) {\n        return value.replace(/\\$|}|\\\\/g, '\\\\$&');\n    }\n    static guessNeedsClipboard(template) {\n        return /\\${?CLIPBOARD/.test(template);\n    }\n    parse(value, insertFinalTabstop, enforceFinalTabstop) {\n        const snippet = new TextmateSnippet();\n        this.parseFragment(value, snippet);\n        this.ensureFinalTabstop(snippet, enforceFinalTabstop ?? false, insertFinalTabstop ?? false);\n        return snippet;\n    }\n    parseFragment(value, snippet) {\n        const offset = snippet.children.length;\n        this._scanner.text(value);\n        this._token = this._scanner.next();\n        while (this._parse(snippet)) {\n            // nothing\n        }\n        // fill in values for placeholders. the first placeholder of an index\n        // that has a value defines the value for all placeholders with that index\n        const placeholderDefaultValues = new Map();\n        const incompletePlaceholders = [];\n        snippet.walk(marker => {\n            if (marker instanceof Placeholder) {\n                if (marker.isFinalTabstop) {\n                    placeholderDefaultValues.set(0, undefined);\n                }\n                else if (!placeholderDefaultValues.has(marker.index) && marker.children.length > 0) {\n                    placeholderDefaultValues.set(marker.index, marker.children);\n                }\n                else {\n                    incompletePlaceholders.push(marker);\n                }\n            }\n            return true;\n        });\n        const fillInIncompletePlaceholder = (placeholder, stack) => {\n            const defaultValues = placeholderDefaultValues.get(placeholder.index);\n            if (!defaultValues) {\n                return;\n            }\n            const clone = new Placeholder(placeholder.index);\n            clone.transform = placeholder.transform;\n            for (const child of defaultValues) {\n                const newChild = child.clone();\n                clone.appendChild(newChild);\n                // \"recurse\" on children that are again placeholders\n                if (newChild instanceof Placeholder && placeholderDefaultValues.has(newChild.index) && !stack.has(newChild.index)) {\n                    stack.add(newChild.index);\n                    fillInIncompletePlaceholder(newChild, stack);\n                    stack.delete(newChild.index);\n                }\n            }\n            snippet.replace(placeholder, [clone]);\n        };\n        const stack = new Set();\n        for (const placeholder of incompletePlaceholders) {\n            fillInIncompletePlaceholder(placeholder, stack);\n        }\n        return snippet.children.slice(offset);\n    }\n    ensureFinalTabstop(snippet, enforceFinalTabstop, insertFinalTabstop) {\n        if (enforceFinalTabstop || insertFinalTabstop && snippet.placeholders.length > 0) {\n            const finalTabstop = snippet.placeholders.find(p => p.index === 0);\n            if (!finalTabstop) {\n                // the snippet uses placeholders but has no\n                // final tabstop defined -> insert at the end\n                snippet.appendChild(new Placeholder(0));\n            }\n        }\n    }\n    _accept(type, value) {\n        if (type === undefined || this._token.type === type) {\n            const ret = !value ? true : this._scanner.tokenText(this._token);\n            this._token = this._scanner.next();\n            return ret;\n        }\n        return false;\n    }\n    _backTo(token) {\n        this._scanner.pos = token.pos + token.len;\n        this._token = token;\n        return false;\n    }\n    _until(type) {\n        const start = this._token;\n        while (this._token.type !== type) {\n            if (this._token.type === 14 /* TokenType.EOF */) {\n                return false;\n            }\n            else if (this._token.type === 5 /* TokenType.Backslash */) {\n                const nextToken = this._scanner.next();\n                if (nextToken.type !== 0 /* TokenType.Dollar */\n                    && nextToken.type !== 4 /* TokenType.CurlyClose */\n                    && nextToken.type !== 5 /* TokenType.Backslash */) {\n                    return false;\n                }\n            }\n            this._token = this._scanner.next();\n        }\n        const value = this._scanner.value.substring(start.pos, this._token.pos).replace(/\\\\(\\$|}|\\\\)/g, '$1');\n        this._token = this._scanner.next();\n        return value;\n    }\n    _parse(marker) {\n        return this._parseEscaped(marker)\n            || this._parseTabstopOrVariableName(marker)\n            || this._parseComplexPlaceholder(marker)\n            || this._parseComplexVariable(marker)\n            || this._parseAnything(marker);\n    }\n    // \\$, \\\\, \\} -> just text\n    _parseEscaped(marker) {\n        let value;\n        if (value = this._accept(5 /* TokenType.Backslash */, true)) {\n            // saw a backslash, append escaped token or that backslash\n            value = this._accept(0 /* TokenType.Dollar */, true)\n                || this._accept(4 /* TokenType.CurlyClose */, true)\n                || this._accept(5 /* TokenType.Backslash */, true)\n                || value;\n            marker.appendChild(new Text(value));\n            return true;\n        }\n        return false;\n    }\n    // $foo -> variable, $1 -> tabstop\n    _parseTabstopOrVariableName(parent) {\n        let value;\n        const token = this._token;\n        const match = this._accept(0 /* TokenType.Dollar */)\n            && (value = this._accept(9 /* TokenType.VariableName */, true) || this._accept(8 /* TokenType.Int */, true));\n        if (!match) {\n            return this._backTo(token);\n        }\n        parent.appendChild(/^\\d+$/.test(value)\n            ? new Placeholder(Number(value))\n            : new Variable(value));\n        return true;\n    }\n    // ${1:<children>}, ${1} -> placeholder\n    _parseComplexPlaceholder(parent) {\n        let index;\n        const token = this._token;\n        const match = this._accept(0 /* TokenType.Dollar */)\n            && this._accept(3 /* TokenType.CurlyOpen */)\n            && (index = this._accept(8 /* TokenType.Int */, true));\n        if (!match) {\n            return this._backTo(token);\n        }\n        const placeholder = new Placeholder(Number(index));\n        if (this._accept(1 /* TokenType.Colon */)) {\n            // ${1:<children>}\n            while (true) {\n                // ...} -> done\n                if (this._accept(4 /* TokenType.CurlyClose */)) {\n                    parent.appendChild(placeholder);\n                    return true;\n                }\n                if (this._parse(placeholder)) {\n                    continue;\n                }\n                // fallback\n                parent.appendChild(new Text('${' + index + ':'));\n                placeholder.children.forEach(parent.appendChild, parent);\n                return true;\n            }\n        }\n        else if (placeholder.index > 0 && this._accept(7 /* TokenType.Pipe */)) {\n            // ${1|one,two,three|}\n            const choice = new Choice();\n            while (true) {\n                if (this._parseChoiceElement(choice)) {\n                    if (this._accept(2 /* TokenType.Comma */)) {\n                        // opt, -> more\n                        continue;\n                    }\n                    if (this._accept(7 /* TokenType.Pipe */)) {\n                        placeholder.appendChild(choice);\n                        if (this._accept(4 /* TokenType.CurlyClose */)) {\n                            // ..|} -> done\n                            parent.appendChild(placeholder);\n                            return true;\n                        }\n                    }\n                }\n                this._backTo(token);\n                return false;\n            }\n        }\n        else if (this._accept(6 /* TokenType.Forwardslash */)) {\n            // ${1/<regex>/<format>/<options>}\n            if (this._parseTransform(placeholder)) {\n                parent.appendChild(placeholder);\n                return true;\n            }\n            this._backTo(token);\n            return false;\n        }\n        else if (this._accept(4 /* TokenType.CurlyClose */)) {\n            // ${1}\n            parent.appendChild(placeholder);\n            return true;\n        }\n        else {\n            // ${1 <- missing curly or colon\n            return this._backTo(token);\n        }\n    }\n    _parseChoiceElement(parent) {\n        const token = this._token;\n        const values = [];\n        while (true) {\n            if (this._token.type === 2 /* TokenType.Comma */ || this._token.type === 7 /* TokenType.Pipe */) {\n                break;\n            }\n            let value;\n            if (value = this._accept(5 /* TokenType.Backslash */, true)) {\n                // \\, \\|, or \\\\\n                value = this._accept(2 /* TokenType.Comma */, true)\n                    || this._accept(7 /* TokenType.Pipe */, true)\n                    || this._accept(5 /* TokenType.Backslash */, true)\n                    || value;\n            }\n            else {\n                value = this._accept(undefined, true);\n            }\n            if (!value) {\n                // EOF\n                this._backTo(token);\n                return false;\n            }\n            values.push(value);\n        }\n        if (values.length === 0) {\n            this._backTo(token);\n            return false;\n        }\n        parent.appendChild(new Text(values.join('')));\n        return true;\n    }\n    // ${foo:<children>}, ${foo} -> variable\n    _parseComplexVariable(parent) {\n        let name;\n        const token = this._token;\n        const match = this._accept(0 /* TokenType.Dollar */)\n            && this._accept(3 /* TokenType.CurlyOpen */)\n            && (name = this._accept(9 /* TokenType.VariableName */, true));\n        if (!match) {\n            return this._backTo(token);\n        }\n        const variable = new Variable(name);\n        if (this._accept(1 /* TokenType.Colon */)) {\n            // ${foo:<children>}\n            while (true) {\n                // ...} -> done\n                if (this._accept(4 /* TokenType.CurlyClose */)) {\n                    parent.appendChild(variable);\n                    return true;\n                }\n                if (this._parse(variable)) {\n                    continue;\n                }\n                // fallback\n                parent.appendChild(new Text('${' + name + ':'));\n                variable.children.forEach(parent.appendChild, parent);\n                return true;\n            }\n        }\n        else if (this._accept(6 /* TokenType.Forwardslash */)) {\n            // ${foo/<regex>/<format>/<options>}\n            if (this._parseTransform(variable)) {\n                parent.appendChild(variable);\n                return true;\n            }\n            this._backTo(token);\n            return false;\n        }\n        else if (this._accept(4 /* TokenType.CurlyClose */)) {\n            // ${foo}\n            parent.appendChild(variable);\n            return true;\n        }\n        else {\n            // ${foo <- missing curly or colon\n            return this._backTo(token);\n        }\n    }\n    _parseTransform(parent) {\n        // ...<regex>/<format>/<options>}\n        const transform = new Transform();\n        let regexValue = '';\n        let regexOptions = '';\n        // (1) /regex\n        while (true) {\n            if (this._accept(6 /* TokenType.Forwardslash */)) {\n                break;\n            }\n            let escaped;\n            if (escaped = this._accept(5 /* TokenType.Backslash */, true)) {\n                escaped = this._accept(6 /* TokenType.Forwardslash */, true) || escaped;\n                regexValue += escaped;\n                continue;\n            }\n            if (this._token.type !== 14 /* TokenType.EOF */) {\n                regexValue += this._accept(undefined, true);\n                continue;\n            }\n            return false;\n        }\n        // (2) /format\n        while (true) {\n            if (this._accept(6 /* TokenType.Forwardslash */)) {\n                break;\n            }\n            let escaped;\n            if (escaped = this._accept(5 /* TokenType.Backslash */, true)) {\n                escaped = this._accept(5 /* TokenType.Backslash */, true) || this._accept(6 /* TokenType.Forwardslash */, true) || escaped;\n                transform.appendChild(new Text(escaped));\n                continue;\n            }\n            if (this._parseFormatString(transform) || this._parseAnything(transform)) {\n                continue;\n            }\n            return false;\n        }\n        // (3) /option\n        while (true) {\n            if (this._accept(4 /* TokenType.CurlyClose */)) {\n                break;\n            }\n            if (this._token.type !== 14 /* TokenType.EOF */) {\n                regexOptions += this._accept(undefined, true);\n                continue;\n            }\n            return false;\n        }\n        try {\n            transform.regexp = new RegExp(regexValue, regexOptions);\n        }\n        catch (e) {\n            // invalid regexp\n            return false;\n        }\n        parent.transform = transform;\n        return true;\n    }\n    _parseFormatString(parent) {\n        const token = this._token;\n        if (!this._accept(0 /* TokenType.Dollar */)) {\n            return false;\n        }\n        let complex = false;\n        if (this._accept(3 /* TokenType.CurlyOpen */)) {\n            complex = true;\n        }\n        const index = this._accept(8 /* TokenType.Int */, true);\n        if (!index) {\n            this._backTo(token);\n            return false;\n        }\n        else if (!complex) {\n            // $1\n            parent.appendChild(new FormatString(Number(index)));\n            return true;\n        }\n        else if (this._accept(4 /* TokenType.CurlyClose */)) {\n            // ${1}\n            parent.appendChild(new FormatString(Number(index)));\n            return true;\n        }\n        else if (!this._accept(1 /* TokenType.Colon */)) {\n            this._backTo(token);\n            return false;\n        }\n        if (this._accept(6 /* TokenType.Forwardslash */)) {\n            // ${1:/upcase}\n            const shorthand = this._accept(9 /* TokenType.VariableName */, true);\n            if (!shorthand || !this._accept(4 /* TokenType.CurlyClose */)) {\n                this._backTo(token);\n                return false;\n            }\n            else {\n                parent.appendChild(new FormatString(Number(index), shorthand));\n                return true;\n            }\n        }\n        else if (this._accept(11 /* TokenType.Plus */)) {\n            // ${1:+<if>}\n            const ifValue = this._until(4 /* TokenType.CurlyClose */);\n            if (ifValue) {\n                parent.appendChild(new FormatString(Number(index), undefined, ifValue, undefined));\n                return true;\n            }\n        }\n        else if (this._accept(12 /* TokenType.Dash */)) {\n            // ${2:-<else>}\n            const elseValue = this._until(4 /* TokenType.CurlyClose */);\n            if (elseValue) {\n                parent.appendChild(new FormatString(Number(index), undefined, undefined, elseValue));\n                return true;\n            }\n        }\n        else if (this._accept(13 /* TokenType.QuestionMark */)) {\n            // ${2:?<if>:<else>}\n            const ifValue = this._until(1 /* TokenType.Colon */);\n            if (ifValue) {\n                const elseValue = this._until(4 /* TokenType.CurlyClose */);\n                if (elseValue) {\n                    parent.appendChild(new FormatString(Number(index), undefined, ifValue, elseValue));\n                    return true;\n                }\n            }\n        }\n        else {\n            // ${1:<else>}\n            const elseValue = this._until(4 /* TokenType.CurlyClose */);\n            if (elseValue) {\n                parent.appendChild(new FormatString(Number(index), undefined, undefined, elseValue));\n                return true;\n            }\n        }\n        this._backTo(token);\n        return false;\n    }\n    _parseAnything(marker) {\n        if (this._token.type !== 14 /* TokenType.EOF */) {\n            marker.appendChild(new Text(this._scanner.tokenText(this._token)));\n            this._accept(undefined);\n            return true;\n        }\n        return false;\n    }\n}\n\nexport { Choice, FormatString, Marker, Placeholder, Scanner, SnippetParser, Text, TextmateSnippet, Transform, TransformableMarker, Variable };\n","import { ResourceTextEdit } from '../../../browser/services/bulkEditService.js';\nimport { SnippetParser } from '../../snippet/browser/snippetParser.js';\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/**\n * Given a {@link DropOrPasteEdit} and set of ranges, creates a {@link WorkspaceEdit} that applies the insert text from\n * the {@link DropOrPasteEdit} at each range plus any additional edits.\n */\nfunction createCombinedWorkspaceEdit(uri, ranges, edit) {\n    // If the edit insert text is empty, skip applying at each range\n    if (typeof edit.insertText === 'string' ? edit.insertText === '' : edit.insertText.snippet === '') {\n        return {\n            edits: edit.additionalEdit?.edits ?? []\n        };\n    }\n    return {\n        edits: [\n            ...ranges.map(range => new ResourceTextEdit(uri, { range, text: typeof edit.insertText === 'string' ? SnippetParser.escape(edit.insertText) + '$0' : edit.insertText.snippet, insertAsSnippet: true })),\n            ...(edit.additionalEdit?.edits ?? [])\n        ]\n    };\n}\nfunction sortEditsByYieldTo(edits) {\n    function yieldsTo(yTo, other) {\n        if ('mimeType' in yTo) {\n            return yTo.mimeType === other.handledMimeType;\n        }\n        return !!other.kind && yTo.kind.contains(other.kind);\n    }\n    // Build list of nodes each node yields to\n    const yieldsToMap = new Map();\n    for (const edit of edits) {\n        for (const yTo of edit.yieldTo ?? []) {\n            for (const other of edits) {\n                if (other === edit) {\n                    continue;\n                }\n                if (yieldsTo(yTo, other)) {\n                    let arr = yieldsToMap.get(edit);\n                    if (!arr) {\n                        arr = [];\n                        yieldsToMap.set(edit, arr);\n                    }\n                    arr.push(other);\n                }\n            }\n        }\n    }\n    if (!yieldsToMap.size) {\n        return Array.from(edits);\n    }\n    // Topological sort\n    const visited = new Set();\n    const tempStack = [];\n    function visit(nodes) {\n        if (!nodes.length) {\n            return [];\n        }\n        const node = nodes[0];\n        if (tempStack.includes(node)) {\n            console.warn('Yield to cycle detected', node);\n            return nodes;\n        }\n        if (visited.has(node)) {\n            return visit(nodes.slice(1));\n        }\n        let pre = [];\n        const yTo = yieldsToMap.get(node);\n        if (yTo) {\n            tempStack.push(node);\n            pre = visit(yTo);\n            tempStack.pop();\n        }\n        visited.add(node);\n        return [...pre, node, ...visit(nodes.slice(1))];\n    }\n    return visit(Array.from(edits));\n}\n\nexport { createCombinedWorkspaceEdit, sortEditsByYieldTo };\n","import { EventType, addDisposableListener, EventHelper, trackFocus, reset } from '../../dom.js';\nimport { StandardKeyboardEvent } from '../../keyboardEvent.js';\nimport { renderMarkdown, renderAsPlaintext } from '../../markdownRenderer.js';\nimport { Gesture, EventType as EventType$1 } from '../../touch.js';\nimport { getDefaultHoverDelegate } from '../hover/hoverDelegateFactory.js';\nimport { renderLabelWithIcons } from '../iconLabel/iconLabels.js';\nimport { Color } from '../../../common/color.js';\nimport { Emitter } from '../../../common/event.js';\nimport { isMarkdownString, markdownStringEqual } from '../../../common/htmlContent.js';\nimport { Disposable } from '../../../common/lifecycle.js';\nimport { ThemeIcon } from '../../../common/themables.js';\nimport './button.css';\nimport { getBaseLayerHoverDelegate } from '../hover/hoverDelegate2.js';\nimport { safeSetInnerHtml } from '../../domSanitize.js';\n\n({\n    buttonSeparator: Color.white.toString(),\n    buttonForeground: Color.white.toString()});\n// Only allow a very limited set of inline html tags\nconst buttonSanitizerConfig = Object.freeze({\n    allowedTags: {\n        override: ['b', 'i', 'u', 'code', 'span'],\n    },\n    allowedAttributes: {\n        override: ['class'],\n    },\n});\nclass Button extends Disposable {\n    get onDidClick() { return this._onDidClick.event; }\n    constructor(container, options) {\n        super();\n        this._label = '';\n        this._onDidClick = this._register(new Emitter());\n        this._onDidEscape = this._register(new Emitter());\n        this.options = options;\n        this._element = document.createElement('a');\n        this._element.classList.add('monaco-button');\n        this._element.tabIndex = 0;\n        this._element.setAttribute('role', 'button');\n        this._element.classList.toggle('secondary', !!options.secondary);\n        const background = options.secondary ? options.buttonSecondaryBackground : options.buttonBackground;\n        const foreground = options.secondary ? options.buttonSecondaryForeground : options.buttonForeground;\n        this._element.style.color = foreground || '';\n        this._element.style.backgroundColor = background || '';\n        if (options.supportShortLabel) {\n            this._labelShortElement = document.createElement('div');\n            this._labelShortElement.classList.add('monaco-button-label-short');\n            this._element.appendChild(this._labelShortElement);\n            this._labelElement = document.createElement('div');\n            this._labelElement.classList.add('monaco-button-label');\n            this._element.appendChild(this._labelElement);\n            this._element.classList.add('monaco-text-button-with-short-label');\n        }\n        if (typeof options.title === 'string') {\n            this.setTitle(options.title);\n        }\n        if (typeof options.ariaLabel === 'string') {\n            this._element.setAttribute('aria-label', options.ariaLabel);\n        }\n        container.appendChild(this._element);\n        this.enabled = !options.disabled;\n        this._register(Gesture.addTarget(this._element));\n        [EventType.CLICK, EventType$1.Tap].forEach(eventType => {\n            this._register(addDisposableListener(this._element, eventType, e => {\n                if (!this.enabled) {\n                    EventHelper.stop(e);\n                    return;\n                }\n                this._onDidClick.fire(e);\n            }));\n        });\n        this._register(addDisposableListener(this._element, EventType.KEY_DOWN, e => {\n            const event = new StandardKeyboardEvent(e);\n            let eventHandled = false;\n            if (this.enabled && (event.equals(3 /* KeyCode.Enter */) || event.equals(10 /* KeyCode.Space */))) {\n                this._onDidClick.fire(e);\n                eventHandled = true;\n            }\n            else if (event.equals(9 /* KeyCode.Escape */)) {\n                this._onDidEscape.fire(e);\n                this._element.blur();\n                eventHandled = true;\n            }\n            if (eventHandled) {\n                EventHelper.stop(event, true);\n            }\n        }));\n        this._register(addDisposableListener(this._element, EventType.MOUSE_OVER, e => {\n            if (!this._element.classList.contains('disabled')) {\n                this.updateBackground(true);\n            }\n        }));\n        this._register(addDisposableListener(this._element, EventType.MOUSE_OUT, e => {\n            this.updateBackground(false); // restore standard styles\n        }));\n        // Also set hover background when button is focused for feedback\n        this.focusTracker = this._register(trackFocus(this._element));\n        this._register(this.focusTracker.onDidFocus(() => { if (this.enabled) {\n            this.updateBackground(true);\n        } }));\n        this._register(this.focusTracker.onDidBlur(() => { if (this.enabled) {\n            this.updateBackground(false);\n        } }));\n    }\n    dispose() {\n        super.dispose();\n        this._element.remove();\n    }\n    getContentElements(content) {\n        const elements = [];\n        for (let segment of renderLabelWithIcons(content)) {\n            if (typeof (segment) === 'string') {\n                segment = segment.trim();\n                // Ignore empty segment\n                if (segment === '') {\n                    continue;\n                }\n                // Convert string segments to <span> nodes\n                const node = document.createElement('span');\n                node.textContent = segment;\n                elements.push(node);\n            }\n            else {\n                elements.push(segment);\n            }\n        }\n        return elements;\n    }\n    updateBackground(hover) {\n        let background;\n        if (this.options.secondary) {\n            background = hover ? this.options.buttonSecondaryHoverBackground : this.options.buttonSecondaryBackground;\n        }\n        else {\n            background = hover ? this.options.buttonHoverBackground : this.options.buttonBackground;\n        }\n        if (background) {\n            this._element.style.backgroundColor = background;\n        }\n    }\n    get element() {\n        return this._element;\n    }\n    set label(value) {\n        if (this._label === value) {\n            return;\n        }\n        if (isMarkdownString(this._label) && isMarkdownString(value) && markdownStringEqual(this._label, value)) {\n            return;\n        }\n        this._element.classList.add('monaco-text-button');\n        const labelElement = this.options.supportShortLabel ? this._labelElement : this._element;\n        if (isMarkdownString(value)) {\n            const rendered = renderMarkdown(value, undefined, document.createElement('span'));\n            rendered.dispose();\n            // Don't include outer `<p>`\n            // eslint-disable-next-line no-restricted-syntax\n            const root = rendered.element.querySelector('p')?.innerHTML;\n            if (root) {\n                safeSetInnerHtml(labelElement, root, buttonSanitizerConfig);\n            }\n            else {\n                reset(labelElement);\n            }\n        }\n        else {\n            if (this.options.supportIcons) {\n                reset(labelElement, ...this.getContentElements(value));\n            }\n            else {\n                labelElement.textContent = value;\n            }\n        }\n        let title = '';\n        if (typeof this.options.title === 'string') {\n            title = this.options.title;\n        }\n        else if (this.options.title) {\n            title = renderAsPlaintext(value);\n        }\n        this.setTitle(title);\n        this._setAriaLabel();\n        this._label = value;\n    }\n    get label() {\n        return this._label;\n    }\n    _setAriaLabel() {\n        if (typeof this.options.ariaLabel === 'string') {\n            this._element.setAttribute('aria-label', this.options.ariaLabel);\n        }\n        else if (typeof this.options.title === 'string') {\n            this._element.setAttribute('aria-label', this.options.title);\n        }\n    }\n    set icon(icon) {\n        this._setAriaLabel();\n        const oldIcons = Array.from(this._element.classList).filter(item => item.startsWith('codicon-'));\n        this._element.classList.remove(...oldIcons);\n        this._element.classList.add(...ThemeIcon.asClassNameArray(icon));\n    }\n    set enabled(value) {\n        if (value) {\n            this._element.classList.remove('disabled');\n            this._element.setAttribute('aria-disabled', String(false));\n            this._element.tabIndex = 0;\n        }\n        else {\n            this._element.classList.add('disabled');\n            this._element.setAttribute('aria-disabled', String(true));\n        }\n    }\n    get enabled() {\n        return !this._element.classList.contains('disabled');\n    }\n    setTitle(title) {\n        if (!this._hover && title !== '') {\n            this._hover = this._register(getBaseLayerHoverDelegate().setupManagedHover(this.options.hoverDelegate ?? getDefaultHoverDelegate('element'), this._element, title));\n        }\n        else if (this._hover) {\n            this._hover.update(title);\n        }\n    }\n}\n\nexport { Button };\n","import { coalesce } from './arrays.js';\nimport { isString } from './types.js';\nimport { localize } from '../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction exceptionToErrorMessage(exception, verbose) {\n    if (verbose && (exception.stack || exception.stacktrace)) {\n        return localize(29, \"{0}: {1}\", detectSystemErrorMessage(exception), stackToString(exception.stack) || stackToString(exception.stacktrace));\n    }\n    return detectSystemErrorMessage(exception);\n}\nfunction stackToString(stack) {\n    if (Array.isArray(stack)) {\n        return stack.join('\\n');\n    }\n    return stack;\n}\nfunction detectSystemErrorMessage(exception) {\n    // Custom node.js error from us\n    if (exception.code === 'ERR_UNC_HOST_NOT_ALLOWED') {\n        return `${exception.message}. Please update the 'security.allowedUNCHosts' setting if you want to allow this host.`;\n    }\n    // See https://nodejs.org/api/errors.html#errors_class_system_error\n    if (typeof exception.code === 'string' && typeof exception.errno === 'number' && typeof exception.syscall === 'string') {\n        return localize(30, \"A system error occurred ({0})\", exception.message);\n    }\n    return exception.message || localize(31, \"An unknown error occurred. Please consult the log for more details.\");\n}\n/**\n * Tries to generate a human readable error message out of the error. If the verbose parameter\n * is set to true, the error message will include stacktrace details if provided.\n *\n * @returns A string containing the error message.\n */\nfunction toErrorMessage(error = null, verbose = false) {\n    if (!error) {\n        return localize(32, \"An unknown error occurred. Please consult the log for more details.\");\n    }\n    if (Array.isArray(error)) {\n        const errors = coalesce(error);\n        const msg = toErrorMessage(errors[0], verbose);\n        if (errors.length > 1) {\n            return localize(33, \"{0} ({1} errors in total)\", msg, errors.length);\n        }\n        return msg;\n    }\n    if (isString(error)) {\n        return error;\n    }\n    if (error.detail) {\n        const detail = error.detail;\n        if (detail.error) {\n            return exceptionToErrorMessage(detail.error, verbose);\n        }\n        if (detail.exception) {\n            return exceptionToErrorMessage(detail.exception, verbose);\n        }\n    }\n    if (error.stack) {\n        return exceptionToErrorMessage(error, verbose);\n    }\n    if (error.message) {\n        return error.message;\n    }\n    return localize(34, \"An unknown error occurred. Please consult the log for more details.\");\n}\n\nexport { toErrorMessage };\n","import { append, $ as $$1, clearNode } from '../../dom.js';\nimport { getBaseLayerHoverDelegate } from '../hover/hoverDelegate2.js';\nimport { getDefaultHoverDelegate } from '../hover/hoverDelegateFactory.js';\nimport { UILabelProvider } from '../../../common/keybindingLabels.js';\nimport { Disposable } from '../../../common/lifecycle.js';\nimport { equals } from '../../../common/objects.js';\nimport './keybindingLabel.css';\nimport { localize } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nconst $ = $$1;\nconst unthemedKeybindingLabelOptions = {\n    keybindingLabelBackground: undefined,\n    keybindingLabelForeground: undefined,\n    keybindingLabelBorder: undefined,\n    keybindingLabelBottomBorder: undefined,\n    keybindingLabelShadow: undefined\n};\nclass KeybindingLabel extends Disposable {\n    constructor(container, os, options) {\n        super();\n        this.os = os;\n        this.keyElements = new Set();\n        this.options = options || Object.create(null);\n        const labelForeground = this.options.keybindingLabelForeground;\n        this.domNode = append(container, $('.monaco-keybinding'));\n        if (labelForeground) {\n            this.domNode.style.color = labelForeground;\n        }\n        this.hover = this._register(getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate('mouse'), this.domNode, ''));\n        this.didEverRender = false;\n        container.appendChild(this.domNode);\n    }\n    set(keybinding, matches) {\n        if (this.didEverRender && this.keybinding === keybinding && KeybindingLabel.areSame(this.matches, matches)) {\n            return;\n        }\n        this.keybinding = keybinding;\n        this.matches = matches;\n        this.render();\n    }\n    render() {\n        this.clear();\n        if (this.keybinding) {\n            const chords = this.keybinding.getChords();\n            if (chords[0]) {\n                this.renderChord(this.domNode, chords[0], this.matches ? this.matches.firstPart : null);\n            }\n            for (let i = 1; i < chords.length; i++) {\n                append(this.domNode, $('span.monaco-keybinding-key-chord-separator', undefined, ' '));\n                this.renderChord(this.domNode, chords[i], this.matches ? this.matches.chordPart : null);\n            }\n            const title = (this.options.disableTitle ?? false) ? undefined : this.keybinding.getAriaLabel() || undefined;\n            this.hover.update(title);\n            this.domNode.setAttribute('aria-label', title || '');\n        }\n        else if (this.options && this.options.renderUnboundKeybindings) {\n            this.renderUnbound(this.domNode);\n        }\n        this.didEverRender = true;\n    }\n    clear() {\n        clearNode(this.domNode);\n        this.keyElements.clear();\n    }\n    renderChord(parent, chord, match) {\n        const modifierLabels = UILabelProvider.modifierLabels[this.os];\n        if (chord.ctrlKey) {\n            this.renderKey(parent, modifierLabels.ctrlKey, Boolean(match?.ctrlKey), modifierLabels.separator);\n        }\n        if (chord.shiftKey) {\n            this.renderKey(parent, modifierLabels.shiftKey, Boolean(match?.shiftKey), modifierLabels.separator);\n        }\n        if (chord.altKey) {\n            this.renderKey(parent, modifierLabels.altKey, Boolean(match?.altKey), modifierLabels.separator);\n        }\n        if (chord.metaKey) {\n            this.renderKey(parent, modifierLabels.metaKey, Boolean(match?.metaKey), modifierLabels.separator);\n        }\n        const keyLabel = chord.keyLabel;\n        if (keyLabel) {\n            this.renderKey(parent, keyLabel, Boolean(match?.keyCode), '');\n        }\n    }\n    renderKey(parent, label, highlight, separator) {\n        append(parent, this.createKeyElement(label, highlight ? '.highlight' : ''));\n        if (separator) {\n            append(parent, $('span.monaco-keybinding-key-separator', undefined, separator));\n        }\n    }\n    renderUnbound(parent) {\n        append(parent, this.createKeyElement(localize(15, \"Unbound\")));\n    }\n    createKeyElement(label, extraClass = '') {\n        const keyElement = $('span.monaco-keybinding-key' + extraClass, undefined, label);\n        this.keyElements.add(keyElement);\n        if (this.options.keybindingLabelBackground) {\n            keyElement.style.backgroundColor = this.options.keybindingLabelBackground;\n        }\n        if (this.options.keybindingLabelBorder) {\n            keyElement.style.borderColor = this.options.keybindingLabelBorder;\n        }\n        if (this.options.keybindingLabelBottomBorder) {\n            keyElement.style.borderBottomColor = this.options.keybindingLabelBottomBorder;\n        }\n        if (this.options.keybindingLabelShadow) {\n            keyElement.style.boxShadow = `inset 0 -1px 0 ${this.options.keybindingLabelShadow}`;\n        }\n        return keyElement;\n    }\n    static areSame(a, b) {\n        if (a === b || (!a && !b)) {\n            return true;\n        }\n        return !!a && !!b && equals(a.firstPart, b.firstPart) && equals(a.chordPart, b.chordPart);\n    }\n}\n\nexport { KeybindingLabel, unthemedKeybindingLabelOptions };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst ILayoutService = createDecorator('layoutService');\n\nexport { ILayoutService };\n","import { setVisibility, getWindow } from '../../../base/browser/dom.js';\nimport { KeybindingLabel } from '../../../base/browser/ui/keybindingLabel/keybindingLabel.js';\nimport { List } from '../../../base/browser/ui/list/listWidget.js';\nimport { CancellationTokenSource } from '../../../base/common/cancellation.js';\nimport { Codicon } from '../../../base/common/codicons.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { OS } from '../../../base/common/platform.js';\nimport { ThemeIcon } from '../../../base/common/themables.js';\nimport './actionWidget.css';\nimport { localize } from '../../../nls.js';\nimport { IContextViewService } from '../../contextview/browser/contextView.js';\nimport { IKeybindingService } from '../../keybinding/common/keybinding.js';\nimport { defaultListStyles } from '../../theme/browser/defaultStyles.js';\nimport { asCssVariable } from '../../theme/common/colorUtils.js';\nimport '../../theme/common/colors/baseColors.js';\nimport '../../theme/common/colors/chartsColors.js';\nimport '../../theme/common/colors/editorColors.js';\nimport '../../theme/common/colors/inputColors.js';\nimport '../../theme/common/colors/listColors.js';\nimport '../../theme/common/colors/menuColors.js';\nimport '../../theme/common/colors/minimapColors.js';\nimport '../../theme/common/colors/miscColors.js';\nimport '../../theme/common/colors/quickpickColors.js';\nimport '../../theme/common/colors/searchColors.js';\nimport { ILayoutService } from '../../layout/browser/layoutService.js';\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst acceptSelectedActionCommand = 'acceptSelectedCodeAction';\nconst previewSelectedActionCommand = 'previewSelectedCodeAction';\nclass HeaderRenderer {\n    get templateId() { return \"header\" /* ActionListItemKind.Header */; }\n    renderTemplate(container) {\n        container.classList.add('group-header');\n        const text = document.createElement('span');\n        container.append(text);\n        return { container, text };\n    }\n    renderElement(element, _index, templateData) {\n        templateData.text.textContent = element.group?.title ?? element.label ?? '';\n    }\n    disposeTemplate(_templateData) {\n        // noop\n    }\n}\nclass SeparatorRenderer {\n    get templateId() { return \"separator\" /* ActionListItemKind.Separator */; }\n    renderTemplate(container) {\n        container.classList.add('separator');\n        const text = document.createElement('span');\n        container.append(text);\n        return { container, text };\n    }\n    renderElement(element, _index, templateData) {\n        templateData.text.textContent = element.label ?? '';\n    }\n    disposeTemplate(_templateData) {\n        // noop\n    }\n}\nlet ActionItemRenderer = class ActionItemRenderer {\n    get templateId() { return \"action\" /* ActionListItemKind.Action */; }\n    constructor(_supportsPreview, _keybindingService) {\n        this._supportsPreview = _supportsPreview;\n        this._keybindingService = _keybindingService;\n    }\n    renderTemplate(container) {\n        container.classList.add(this.templateId);\n        const icon = document.createElement('div');\n        icon.className = 'icon';\n        container.append(icon);\n        const text = document.createElement('span');\n        text.className = 'title';\n        container.append(text);\n        const description = document.createElement('span');\n        description.className = 'description';\n        container.append(description);\n        const keybinding = new KeybindingLabel(container, OS);\n        return { container, icon, text, description, keybinding };\n    }\n    renderElement(element, _index, data) {\n        if (element.group?.icon) {\n            data.icon.className = ThemeIcon.asClassName(element.group.icon);\n            if (element.group.icon.color) {\n                data.icon.style.color = asCssVariable(element.group.icon.color.id);\n            }\n        }\n        else {\n            data.icon.className = ThemeIcon.asClassName(Codicon.lightBulb);\n            data.icon.style.color = 'var(--vscode-editorLightBulb-foreground)';\n        }\n        if (!element.item || !element.label) {\n            return;\n        }\n        setVisibility(!element.hideIcon, data.icon);\n        data.text.textContent = stripNewlines(element.label);\n        // if there is a keybinding, prioritize over description for now\n        if (element.keybinding) {\n            data.description.textContent = element.keybinding.getLabel();\n            data.description.style.display = 'inline';\n            data.description.style.letterSpacing = '0.5px';\n        }\n        else if (element.description) {\n            data.description.textContent = stripNewlines(element.description);\n            data.description.style.display = 'inline';\n        }\n        else {\n            data.description.textContent = '';\n            data.description.style.display = 'none';\n        }\n        const actionTitle = this._keybindingService.lookupKeybinding(acceptSelectedActionCommand)?.getLabel();\n        const previewTitle = this._keybindingService.lookupKeybinding(previewSelectedActionCommand)?.getLabel();\n        data.container.classList.toggle('option-disabled', element.disabled);\n        if (element.tooltip) {\n            data.container.title = element.tooltip;\n        }\n        else if (element.disabled) {\n            data.container.title = element.label;\n        }\n        else if (actionTitle && previewTitle) {\n            if (this._supportsPreview && element.canPreview) {\n                data.container.title = localize(1653, \"{0} to Apply, {1} to Preview\", actionTitle, previewTitle);\n            }\n            else {\n                data.container.title = localize(1654, \"{0} to Apply\", actionTitle);\n            }\n        }\n        else {\n            data.container.title = '';\n        }\n    }\n    disposeTemplate(templateData) {\n        templateData.keybinding.dispose();\n    }\n};\nActionItemRenderer = __decorate([\n    __param(1, IKeybindingService)\n], ActionItemRenderer);\nclass AcceptSelectedEvent extends UIEvent {\n    constructor() { super('acceptSelectedAction'); }\n}\nclass PreviewSelectedEvent extends UIEvent {\n    constructor() { super('previewSelectedAction'); }\n}\nfunction getKeyboardNavigationLabel(item) {\n    // Filter out header vs. action vs. separator\n    if (item.kind === 'action') {\n        return item.label;\n    }\n    return undefined;\n}\nlet ActionList = class ActionList extends Disposable {\n    constructor(user, preview, items, _delegate, accessibilityProvider, _contextViewService, _keybindingService, _layoutService) {\n        super();\n        this._delegate = _delegate;\n        this._contextViewService = _contextViewService;\n        this._keybindingService = _keybindingService;\n        this._layoutService = _layoutService;\n        this._actionLineHeight = 28;\n        this._headerLineHeight = 28;\n        this._separatorLineHeight = 8;\n        this.cts = this._register(new CancellationTokenSource());\n        this.domNode = document.createElement('div');\n        this.domNode.classList.add('actionList');\n        const virtualDelegate = {\n            getHeight: element => {\n                switch (element.kind) {\n                    case \"header\" /* ActionListItemKind.Header */:\n                        return this._headerLineHeight;\n                    case \"separator\" /* ActionListItemKind.Separator */:\n                        return this._separatorLineHeight;\n                    default:\n                        return this._actionLineHeight;\n                }\n            },\n            getTemplateId: element => element.kind\n        };\n        this._list = this._register(new List(user, this.domNode, virtualDelegate, [\n            new ActionItemRenderer(preview, this._keybindingService),\n            new HeaderRenderer(),\n            new SeparatorRenderer(),\n        ], {\n            keyboardSupport: false,\n            typeNavigationEnabled: true,\n            keyboardNavigationLabelProvider: { getKeyboardNavigationLabel },\n            accessibilityProvider: {\n                getAriaLabel: element => {\n                    if (element.kind === \"action\" /* ActionListItemKind.Action */) {\n                        let label = element.label ? stripNewlines(element?.label) : '';\n                        if (element.description) {\n                            label = label + ', ' + stripNewlines(element.description);\n                        }\n                        if (element.disabled) {\n                            label = localize(1655, \"{0}, Disabled Reason: {1}\", label, element.disabled);\n                        }\n                        return label;\n                    }\n                    return null;\n                },\n                getWidgetAriaLabel: () => localize(1656, \"Action Widget\"),\n                getRole: (e) => {\n                    switch (e.kind) {\n                        case \"action\" /* ActionListItemKind.Action */:\n                            return 'option';\n                        case \"separator\" /* ActionListItemKind.Separator */:\n                            return 'separator';\n                        default:\n                            return 'separator';\n                    }\n                },\n                getWidgetRole: () => 'listbox',\n                ...accessibilityProvider\n            },\n        }));\n        this._list.style(defaultListStyles);\n        this._register(this._list.onMouseClick(e => this.onListClick(e)));\n        this._register(this._list.onMouseOver(e => this.onListHover(e)));\n        this._register(this._list.onDidChangeFocus(() => this.onFocus()));\n        this._register(this._list.onDidChangeSelection(e => this.onListSelection(e)));\n        this._allMenuItems = items;\n        this._list.splice(0, this._list.length, this._allMenuItems);\n        if (this._list.length) {\n            this.focusNext();\n        }\n    }\n    focusCondition(element) {\n        return !element.disabled && element.kind === \"action\" /* ActionListItemKind.Action */;\n    }\n    hide(didCancel) {\n        this._delegate.onHide(didCancel);\n        this.cts.cancel();\n        this._contextViewService.hideContextView();\n    }\n    layout(minWidth) {\n        // Updating list height, depending on how many separators and headers there are.\n        const numHeaders = this._allMenuItems.filter(item => item.kind === 'header').length;\n        const numSeparators = this._allMenuItems.filter(item => item.kind === 'separator').length;\n        const itemsHeight = this._allMenuItems.length * this._actionLineHeight;\n        const heightWithHeaders = itemsHeight + numHeaders * this._headerLineHeight - numHeaders * this._actionLineHeight;\n        const heightWithSeparators = heightWithHeaders + numSeparators * this._separatorLineHeight - numSeparators * this._actionLineHeight;\n        this._list.layout(heightWithSeparators);\n        let maxWidth = minWidth;\n        if (this._allMenuItems.length >= 50) {\n            maxWidth = 380;\n        }\n        else {\n            // For finding width dynamically (not using resize observer)\n            const itemWidths = this._allMenuItems.map((_, index) => {\n                // eslint-disable-next-line no-restricted-syntax\n                const element = this.domNode.ownerDocument.getElementById(this._list.getElementID(index));\n                if (element) {\n                    element.style.width = 'auto';\n                    const width = element.getBoundingClientRect().width;\n                    element.style.width = '';\n                    return width;\n                }\n                return 0;\n            });\n            // resize observer - can be used in the future since list widget supports dynamic height but not width\n            maxWidth = Math.max(...itemWidths, minWidth);\n        }\n        const maxVhPrecentage = 0.7;\n        const height = Math.min(heightWithSeparators, this._layoutService.getContainer(getWindow(this.domNode)).clientHeight * maxVhPrecentage);\n        this._list.layout(height, maxWidth);\n        this.domNode.style.height = `${height}px`;\n        this._list.domFocus();\n        return maxWidth;\n    }\n    focusPrevious() {\n        this._list.focusPrevious(1, true, undefined, this.focusCondition);\n    }\n    focusNext() {\n        this._list.focusNext(1, true, undefined, this.focusCondition);\n    }\n    acceptSelected(preview) {\n        const focused = this._list.getFocus();\n        if (focused.length === 0) {\n            return;\n        }\n        const focusIndex = focused[0];\n        const element = this._list.element(focusIndex);\n        if (!this.focusCondition(element)) {\n            return;\n        }\n        const event = preview ? new PreviewSelectedEvent() : new AcceptSelectedEvent();\n        this._list.setSelection([focusIndex], event);\n    }\n    onListSelection(e) {\n        if (!e.elements.length) {\n            return;\n        }\n        const element = e.elements[0];\n        if (element.item && this.focusCondition(element)) {\n            this._delegate.onSelect(element.item, e.browserEvent instanceof PreviewSelectedEvent);\n        }\n        else {\n            this._list.setSelection([]);\n        }\n    }\n    onFocus() {\n        const focused = this._list.getFocus();\n        if (focused.length === 0) {\n            return;\n        }\n        const focusIndex = focused[0];\n        const element = this._list.element(focusIndex);\n        this._delegate.onFocus?.(element.item);\n    }\n    async onListHover(e) {\n        const element = e.element;\n        if (element && element.item && this.focusCondition(element)) {\n            if (this._delegate.onHover && !element.disabled && element.kind === \"action\" /* ActionListItemKind.Action */) {\n                const result = await this._delegate.onHover(element.item, this.cts.token);\n                element.canPreview = result ? result.canPreview : undefined;\n            }\n            if (e.index) {\n                this._list.splice(e.index, 1, [element]);\n            }\n        }\n        this._list.setFocus(typeof e.index === 'number' ? [e.index] : []);\n    }\n    onListClick(e) {\n        if (e.element && this.focusCondition(e.element)) {\n            this._list.setFocus([]);\n        }\n    }\n};\nActionList = __decorate([\n    __param(5, IContextViewService),\n    __param(6, IKeybindingService),\n    __param(7, ILayoutService)\n], ActionList);\nfunction stripNewlines(str) {\n    return str.replace(/\\r\\n|\\r|\\n/g, ' ');\n}\n\nexport { ActionList, acceptSelectedActionCommand, previewSelectedActionCommand };\n","import { addDisposableListener, EventType, trackFocus, $ } from '../../../base/browser/dom.js';\nimport { ActionBar } from '../../../base/browser/ui/actionbar/actionbar.js';\nimport { Disposable, MutableDisposable, DisposableStore } from '../../../base/common/lifecycle.js';\nimport './actionWidget.css';\nimport { localize, localize2 } from '../../../nls.js';\nimport { acceptSelectedActionCommand, previewSelectedActionCommand, ActionList } from './actionList.js';\nimport { registerAction2, Action2 } from '../../actions/common/actions.js';\nimport { RawContextKey, IContextKeyService } from '../../contextkey/common/contextkey.js';\nimport { IContextViewService } from '../../contextview/browser/contextView.js';\nimport { registerSingleton } from '../../instantiation/common/extensions.js';\nimport { createDecorator, IInstantiationService } from '../../instantiation/common/instantiation.js';\nimport { registerColor } from '../../theme/common/colorUtils.js';\nimport '../../theme/common/colors/baseColors.js';\nimport '../../theme/common/colors/chartsColors.js';\nimport '../../theme/common/colors/editorColors.js';\nimport { inputActiveOptionBackground } from '../../theme/common/colors/inputColors.js';\nimport '../../theme/common/colors/listColors.js';\nimport '../../theme/common/colors/menuColors.js';\nimport '../../theme/common/colors/minimapColors.js';\nimport '../../theme/common/colors/miscColors.js';\nimport '../../theme/common/colors/quickpickColors.js';\nimport '../../theme/common/colors/searchColors.js';\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nregisterColor('actionBar.toggledBackground', inputActiveOptionBackground, localize(1657, 'Background color for toggled action items in action bar.'));\nconst ActionWidgetContextKeys = {\n    Visible: new RawContextKey('codeActionMenuVisible', false, localize(1658, \"Whether the action widget list is visible\"))\n};\nconst IActionWidgetService = createDecorator('actionWidgetService');\nlet ActionWidgetService = class ActionWidgetService extends Disposable {\n    get isVisible() {\n        return ActionWidgetContextKeys.Visible.getValue(this._contextKeyService) || false;\n    }\n    constructor(_contextViewService, _contextKeyService, _instantiationService) {\n        super();\n        this._contextViewService = _contextViewService;\n        this._contextKeyService = _contextKeyService;\n        this._instantiationService = _instantiationService;\n        this._list = this._register(new MutableDisposable());\n    }\n    show(user, supportsPreview, items, delegate, anchor, container, actionBarActions, accessibilityProvider) {\n        const visibleContext = ActionWidgetContextKeys.Visible.bindTo(this._contextKeyService);\n        const list = this._instantiationService.createInstance(ActionList, user, supportsPreview, items, delegate, accessibilityProvider);\n        this._contextViewService.showContextView({\n            getAnchor: () => anchor,\n            render: (container) => {\n                visibleContext.set(true);\n                return this._renderWidget(container, list, actionBarActions ?? []);\n            },\n            onHide: (didCancel) => {\n                visibleContext.reset();\n                this._onWidgetClosed(didCancel);\n            },\n        }, container, false);\n    }\n    acceptSelected(preview) {\n        this._list.value?.acceptSelected(preview);\n    }\n    focusPrevious() {\n        this._list?.value?.focusPrevious();\n    }\n    focusNext() {\n        this._list?.value?.focusNext();\n    }\n    hide(didCancel) {\n        this._list.value?.hide(didCancel);\n        this._list.clear();\n    }\n    _renderWidget(element, list, actionBarActions) {\n        const widget = document.createElement('div');\n        widget.classList.add('action-widget');\n        element.appendChild(widget);\n        this._list.value = list;\n        if (this._list.value) {\n            widget.appendChild(this._list.value.domNode);\n        }\n        else {\n            throw new Error('List has no value');\n        }\n        const renderDisposables = new DisposableStore();\n        // Invisible div to block mouse interaction in the rest of the UI\n        const menuBlock = document.createElement('div');\n        const block = element.appendChild(menuBlock);\n        block.classList.add('context-view-block');\n        renderDisposables.add(addDisposableListener(block, EventType.MOUSE_DOWN, e => e.stopPropagation()));\n        // Invisible div to block mouse interaction with the menu\n        const pointerBlockDiv = document.createElement('div');\n        const pointerBlock = element.appendChild(pointerBlockDiv);\n        pointerBlock.classList.add('context-view-pointerBlock');\n        // Removes block on click INSIDE widget or ANY mouse movement\n        renderDisposables.add(addDisposableListener(pointerBlock, EventType.POINTER_MOVE, () => pointerBlock.remove()));\n        renderDisposables.add(addDisposableListener(pointerBlock, EventType.MOUSE_DOWN, () => pointerBlock.remove()));\n        // Action bar\n        let actionBarWidth = 0;\n        if (actionBarActions.length) {\n            const actionBar = this._createActionBar('.action-widget-action-bar', actionBarActions);\n            if (actionBar) {\n                widget.appendChild(actionBar.getContainer().parentElement);\n                renderDisposables.add(actionBar);\n                actionBarWidth = actionBar.getContainer().offsetWidth;\n            }\n        }\n        const width = this._list.value?.layout(actionBarWidth);\n        widget.style.width = `${width}px`;\n        const focusTracker = renderDisposables.add(trackFocus(element));\n        renderDisposables.add(focusTracker.onDidBlur(() => this.hide(true)));\n        return renderDisposables;\n    }\n    _createActionBar(className, actions) {\n        if (!actions.length) {\n            return undefined;\n        }\n        const container = $(className);\n        const actionBar = new ActionBar(container);\n        actionBar.push(actions, { icon: false, label: true });\n        return actionBar;\n    }\n    _onWidgetClosed(didCancel) {\n        this._list.value?.hide(didCancel);\n    }\n};\nActionWidgetService = __decorate([\n    __param(0, IContextViewService),\n    __param(1, IContextKeyService),\n    __param(2, IInstantiationService)\n], ActionWidgetService);\nregisterSingleton(IActionWidgetService, ActionWidgetService, 1 /* InstantiationType.Delayed */);\nconst weight = 100 /* KeybindingWeight.EditorContrib */ + 1000;\nregisterAction2(class extends Action2 {\n    constructor() {\n        super({\n            id: 'hideCodeActionWidget',\n            title: localize2(1659, \"Hide action widget\"),\n            precondition: ActionWidgetContextKeys.Visible,\n            keybinding: {\n                weight,\n                primary: 9 /* KeyCode.Escape */,\n                secondary: [1024 /* KeyMod.Shift */ | 9 /* KeyCode.Escape */]\n            },\n        });\n    }\n    run(accessor) {\n        accessor.get(IActionWidgetService).hide(true);\n    }\n});\nregisterAction2(class extends Action2 {\n    constructor() {\n        super({\n            id: 'selectPrevCodeAction',\n            title: localize2(1660, \"Select previous action\"),\n            precondition: ActionWidgetContextKeys.Visible,\n            keybinding: {\n                weight,\n                primary: 16 /* KeyCode.UpArrow */,\n                secondary: [2048 /* KeyMod.CtrlCmd */ | 16 /* KeyCode.UpArrow */],\n                mac: { primary: 16 /* KeyCode.UpArrow */, secondary: [2048 /* KeyMod.CtrlCmd */ | 16 /* KeyCode.UpArrow */, 256 /* KeyMod.WinCtrl */ | 46 /* KeyCode.KeyP */] },\n            }\n        });\n    }\n    run(accessor) {\n        const widgetService = accessor.get(IActionWidgetService);\n        if (widgetService instanceof ActionWidgetService) {\n            widgetService.focusPrevious();\n        }\n    }\n});\nregisterAction2(class extends Action2 {\n    constructor() {\n        super({\n            id: 'selectNextCodeAction',\n            title: localize2(1661, \"Select next action\"),\n            precondition: ActionWidgetContextKeys.Visible,\n            keybinding: {\n                weight,\n                primary: 18 /* KeyCode.DownArrow */,\n                secondary: [2048 /* KeyMod.CtrlCmd */ | 18 /* KeyCode.DownArrow */],\n                mac: { primary: 18 /* KeyCode.DownArrow */, secondary: [2048 /* KeyMod.CtrlCmd */ | 18 /* KeyCode.DownArrow */, 256 /* KeyMod.WinCtrl */ | 44 /* KeyCode.KeyN */] }\n            }\n        });\n    }\n    run(accessor) {\n        const widgetService = accessor.get(IActionWidgetService);\n        if (widgetService instanceof ActionWidgetService) {\n            widgetService.focusNext();\n        }\n    }\n});\nregisterAction2(class extends Action2 {\n    constructor() {\n        super({\n            id: acceptSelectedActionCommand,\n            title: localize2(1662, \"Accept selected action\"),\n            precondition: ActionWidgetContextKeys.Visible,\n            keybinding: {\n                weight,\n                primary: 3 /* KeyCode.Enter */,\n                secondary: [2048 /* KeyMod.CtrlCmd */ | 89 /* KeyCode.Period */],\n            }\n        });\n    }\n    run(accessor) {\n        const widgetService = accessor.get(IActionWidgetService);\n        if (widgetService instanceof ActionWidgetService) {\n            widgetService.acceptSelected();\n        }\n    }\n});\nregisterAction2(class extends Action2 {\n    constructor() {\n        super({\n            id: previewSelectedActionCommand,\n            title: localize2(1663, \"Preview selected action\"),\n            precondition: ActionWidgetContextKeys.Visible,\n            keybinding: {\n                weight,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 3 /* KeyCode.Enter */,\n            }\n        });\n    }\n    run(accessor) {\n        const widgetService = accessor.get(IActionWidgetService);\n        if (widgetService instanceof ActionWidgetService) {\n            widgetService.acceptSelected(true);\n        }\n    }\n});\n\nexport { IActionWidgetService };\n","import { $, addDisposableListener, EventType, getDomNodePagePosition } from '../../../../base/browser/dom.js';\nimport { Button } from '../../../../base/browser/ui/button/button.js';\nimport { raceCancellationError } from '../../../../base/common/async.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { toErrorMessage } from '../../../../base/common/errorMessage.js';\nimport { isCancellationError } from '../../../../base/common/errors.js';\nimport { Event } from '../../../../base/common/event.js';\nimport { Disposable, toDisposable, MutableDisposable } from '../../../../base/common/lifecycle.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\nimport { localize } from '../../../../nls.js';\nimport { IActionWidgetService } from '../../../../platform/actionWidget/browser/actionWidget.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { INotificationService } from '../../../../platform/notification/common/notification.js';\nimport { IBulkEditService } from '../../../browser/services/bulkEditService.js';\nimport { EditorStateCancellationTokenSource } from '../../editorState/browser/editorState.js';\nimport { createCombinedWorkspaceEdit } from './edit.js';\nimport './postEditWidget.css';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar PostEditWidget_1;\nlet PostEditWidget = class PostEditWidget extends Disposable {\n    static { PostEditWidget_1 = this; }\n    static { this.baseId = 'editor.widget.postEditWidget'; }\n    constructor(typeId, editor, visibleContext, showCommand, range, edits, onSelectNewEdit, additionalActions, contextKeyService, _keybindingService, _actionWidgetService) {\n        super();\n        this.typeId = typeId;\n        this.editor = editor;\n        this.showCommand = showCommand;\n        this.range = range;\n        this.edits = edits;\n        this.onSelectNewEdit = onSelectNewEdit;\n        this.additionalActions = additionalActions;\n        this._keybindingService = _keybindingService;\n        this._actionWidgetService = _actionWidgetService;\n        this.allowEditorOverflow = true;\n        this.suppressMouseDown = true;\n        this.create();\n        this.visibleContext = visibleContext.bindTo(contextKeyService);\n        this.visibleContext.set(true);\n        this._register(toDisposable(() => this.visibleContext.reset()));\n        this.editor.addContentWidget(this);\n        this.editor.layoutContentWidget(this);\n        this._register(toDisposable((() => this.editor.removeContentWidget(this))));\n        this._register(this.editor.onDidChangeCursorPosition(e => {\n            this.dispose();\n        }));\n        this._register(Event.runAndSubscribe(_keybindingService.onDidUpdateKeybindings, () => {\n            this._updateButtonTitle();\n        }));\n    }\n    _updateButtonTitle() {\n        const binding = this._keybindingService.lookupKeybinding(this.showCommand.id)?.getLabel();\n        this.button.element.title = this.showCommand.label + (binding ? ` (${binding})` : '');\n    }\n    create() {\n        this.domNode = $('.post-edit-widget');\n        this.button = this._register(new Button(this.domNode, {\n            supportIcons: true,\n        }));\n        this.button.label = '$(insert)';\n        this._register(addDisposableListener(this.domNode, EventType.CLICK, () => this.showSelector()));\n    }\n    getId() {\n        return PostEditWidget_1.baseId + '.' + this.typeId;\n    }\n    getDomNode() {\n        return this.domNode;\n    }\n    getPosition() {\n        return {\n            position: this.range.getEndPosition(),\n            preference: [2 /* ContentWidgetPositionPreference.BELOW */]\n        };\n    }\n    showSelector() {\n        const pos = getDomNodePagePosition(this.button.element);\n        const anchor = { x: pos.left + pos.width, y: pos.top + pos.height };\n        this._actionWidgetService.show('postEditWidget', false, this.edits.allEdits.map((edit, i) => {\n            return {\n                kind: \"action\" /* ActionListItemKind.Action */,\n                item: edit,\n                label: edit.title,\n                disabled: false,\n                canPreview: false,\n                group: { title: '', icon: ThemeIcon.fromId(i === this.edits.activeEditIndex ? Codicon.check.id : Codicon.blank.id) },\n            };\n        }), {\n            onHide: () => {\n                this.editor.focus();\n            },\n            onSelect: (item) => {\n                this._actionWidgetService.hide(false);\n                const i = this.edits.allEdits.findIndex(edit => edit === item);\n                if (i !== this.edits.activeEditIndex) {\n                    return this.onSelectNewEdit(i);\n                }\n            },\n        }, anchor, this.editor.getDomNode() ?? undefined, this.additionalActions);\n    }\n};\nPostEditWidget = PostEditWidget_1 = __decorate([\n    __param(8, IContextKeyService),\n    __param(9, IKeybindingService),\n    __param(10, IActionWidgetService)\n], PostEditWidget);\nlet PostEditWidgetManager = class PostEditWidgetManager extends Disposable {\n    constructor(_id, _editor, _visibleContext, _showCommand, _getAdditionalActions, _instantiationService, _bulkEditService, _notificationService) {\n        super();\n        this._id = _id;\n        this._editor = _editor;\n        this._visibleContext = _visibleContext;\n        this._showCommand = _showCommand;\n        this._getAdditionalActions = _getAdditionalActions;\n        this._instantiationService = _instantiationService;\n        this._bulkEditService = _bulkEditService;\n        this._notificationService = _notificationService;\n        this._currentWidget = this._register(new MutableDisposable());\n        this._register(Event.any(_editor.onDidChangeModel, _editor.onDidChangeModelContent)(() => this.clear()));\n    }\n    async applyEditAndShowIfNeeded(ranges, edits, canShowWidget, resolve, token) {\n        if (!ranges.length || !this._editor.hasModel()) {\n            return;\n        }\n        const model = this._editor.getModel();\n        const edit = edits.allEdits.at(edits.activeEditIndex);\n        if (!edit) {\n            return;\n        }\n        const onDidSelectEdit = async (newEditIndex) => {\n            const model = this._editor.getModel();\n            if (!model) {\n                return;\n            }\n            await model.undo();\n            this.applyEditAndShowIfNeeded(ranges, { activeEditIndex: newEditIndex, allEdits: edits.allEdits }, canShowWidget, resolve, token);\n        };\n        const handleError = (e, message) => {\n            if (isCancellationError(e)) {\n                return;\n            }\n            this._notificationService.error(message);\n            if (canShowWidget) {\n                this.show(ranges[0], edits, onDidSelectEdit);\n            }\n        };\n        const editorStateCts = new EditorStateCancellationTokenSource(this._editor, 1 /* CodeEditorStateFlag.Value */ | 2 /* CodeEditorStateFlag.Selection */, undefined, token);\n        let resolvedEdit;\n        try {\n            resolvedEdit = await raceCancellationError(resolve(edit, editorStateCts.token), editorStateCts.token);\n        }\n        catch (e) {\n            return handleError(e, localize(937, \"Error resolving edit '{0}':\\n{1}\", edit.title, toErrorMessage(e)));\n        }\n        finally {\n            editorStateCts.dispose();\n        }\n        if (token.isCancellationRequested) {\n            return;\n        }\n        const combinedWorkspaceEdit = createCombinedWorkspaceEdit(model.uri, ranges, resolvedEdit);\n        // Use a decoration to track edits around the trigger range\n        const primaryRange = ranges[0];\n        const editTrackingDecoration = model.deltaDecorations([], [{\n                range: primaryRange,\n                options: { description: 'paste-line-suffix', stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */ }\n            }]);\n        this._editor.focus();\n        let editResult;\n        let editRange;\n        try {\n            editResult = await this._bulkEditService.apply(combinedWorkspaceEdit, { editor: this._editor, token });\n            editRange = model.getDecorationRange(editTrackingDecoration[0]);\n        }\n        catch (e) {\n            return handleError(e, localize(938, \"Error applying edit '{0}':\\n{1}\", edit.title, toErrorMessage(e)));\n        }\n        finally {\n            model.deltaDecorations(editTrackingDecoration, []);\n        }\n        if (token.isCancellationRequested) {\n            return;\n        }\n        if (canShowWidget && editResult.isApplied && edits.allEdits.length > 1) {\n            this.show(editRange ?? primaryRange, edits, onDidSelectEdit);\n        }\n    }\n    show(range, edits, onDidSelectEdit) {\n        this.clear();\n        if (this._editor.hasModel()) {\n            this._currentWidget.value = this._instantiationService.createInstance((PostEditWidget), this._id, this._editor, this._visibleContext, this._showCommand, range, edits, onDidSelectEdit, this._getAdditionalActions());\n        }\n    }\n    clear() {\n        this._currentWidget.clear();\n    }\n    tryShowSelector() {\n        this._currentWidget.value?.showSelector();\n    }\n};\nPostEditWidgetManager = __decorate([\n    __param(5, IInstantiationService),\n    __param(6, IBulkEditService),\n    __param(7, INotificationService)\n], PostEditWidgetManager);\n\nexport { PostEditWidgetManager };\n","import { addDisposableListener } from '../../../../base/browser/dom.js';\nimport { coalesce } from '../../../../base/common/arrays.js';\nimport { createCancelablePromise, DeferredPromise, raceCancellation } from '../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { matchesMimeType, createStringDataTransferItem, UriList } from '../../../../base/common/dataTransfer.js';\nimport { isCancellationError } from '../../../../base/common/errors.js';\nimport { HierarchicalKind } from '../../../../base/common/hierarchicalKind.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { Mimes } from '../../../../base/common/mime.js';\nimport { isWindows } from '../../../../base/common/platform.js';\nimport { upcast } from '../../../../base/common/types.js';\nimport { generateUuid } from '../../../../base/common/uuid.js';\nimport { localize } from '../../../../nls.js';\nimport { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';\nimport { ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { RawContextKey } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { ILogService } from '../../../../platform/log/common/log.js';\nimport { IProgressService } from '../../../../platform/progress/common/progress.js';\nimport { IQuickInputService } from '../../../../platform/quickinput/common/quickInput.js';\nimport { ClipboardEventUtils, InMemoryClipboardMetadataManager } from '../../../browser/controller/editContext/clipboardUtils.js';\nimport { toVSDataTransfer, toExternalVSDataTransfer } from '../../../browser/dataTransfer.js';\nimport { IBulkEditService } from '../../../browser/services/bulkEditService.js';\nimport { Range } from '../../../common/core/range.js';\nimport { DocumentPasteTriggerKind } from '../../../common/languages.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { EditorStateCancellationTokenSource } from '../../editorState/browser/editorState.js';\nimport { InlineProgressManager } from '../../inlineProgress/browser/inlineProgress.js';\nimport { MessageController } from '../../message/browser/messageController.js';\nimport { DefaultTextPasteOrDropEditProvider } from './defaultProviders.js';\nimport { createCombinedWorkspaceEdit, sortEditsByYieldTo } from './edit.js';\nimport { PostEditWidgetManager } from './postEditWidget.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar CopyPasteController_1;\nconst changePasteTypeCommandId = 'editor.changePasteType';\nconst pasteAsPreferenceConfig = 'editor.pasteAs.preferences';\nconst pasteWidgetVisibleCtx = new RawContextKey('pasteWidgetVisible', false, localize(917, \"Whether the paste widget is showing\"));\nconst vscodeClipboardMime = 'application/vnd.code.copymetadata';\nlet CopyPasteController = class CopyPasteController extends Disposable {\n    static { CopyPasteController_1 = this; }\n    static { this.ID = 'editor.contrib.copyPasteActionController'; }\n    static get(editor) {\n        return editor.getContribution(CopyPasteController_1.ID);\n    }\n    constructor(editor, instantiationService, _logService, _bulkEditService, _clipboardService, _commandService, _configService, _languageFeaturesService, _quickInputService, _progressService) {\n        super();\n        this._logService = _logService;\n        this._bulkEditService = _bulkEditService;\n        this._clipboardService = _clipboardService;\n        this._commandService = _commandService;\n        this._configService = _configService;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._quickInputService = _quickInputService;\n        this._progressService = _progressService;\n        this._editor = editor;\n        const container = editor.getContainerDomNode();\n        this._register(addDisposableListener(container, 'copy', e => this.handleCopy(e)));\n        this._register(addDisposableListener(container, 'cut', e => this.handleCopy(e)));\n        this._register(addDisposableListener(container, 'paste', e => this.handlePaste(e), true));\n        this._pasteProgressManager = this._register(new InlineProgressManager('pasteIntoEditor', editor, instantiationService));\n        this._postPasteWidgetManager = this._register(instantiationService.createInstance(PostEditWidgetManager, 'pasteIntoEditor', editor, pasteWidgetVisibleCtx, { id: changePasteTypeCommandId, label: localize(918, \"Show paste options...\") }, () => CopyPasteController_1._configureDefaultAction ? [CopyPasteController_1._configureDefaultAction] : []));\n    }\n    changePasteType() {\n        this._postPasteWidgetManager.tryShowSelector();\n    }\n    async pasteAs(preferred) {\n        this._logService.trace('CopyPasteController.pasteAs');\n        this._editor.focus();\n        try {\n            this._logService.trace('Before calling editor.action.clipboardPasteAction');\n            this._pasteAsActionContext = { preferred };\n            await this._commandService.executeCommand('editor.action.clipboardPasteAction');\n        }\n        finally {\n            this._pasteAsActionContext = undefined;\n        }\n    }\n    clearWidgets() {\n        this._postPasteWidgetManager.clear();\n    }\n    isPasteAsEnabled() {\n        return this._editor.getOption(97 /* EditorOption.pasteAs */).enabled;\n    }\n    async finishedPaste() {\n        await this._currentPasteOperation;\n    }\n    handleCopy(e) {\n        let id = null;\n        if (e.clipboardData) {\n            const [text, metadata] = ClipboardEventUtils.getTextData(e.clipboardData);\n            const storedMetadata = metadata || InMemoryClipboardMetadataManager.INSTANCE.get(text);\n            id = storedMetadata?.id || null;\n            this._logService.trace('CopyPasteController#handleCopy for id : ', id, ' with text.length : ', text.length);\n        }\n        else {\n            this._logService.trace('CopyPasteController#handleCopy');\n        }\n        if (!this._editor.hasTextFocus()) {\n            return;\n        }\n        // Explicitly clear the clipboard internal state.\n        // This is needed because on web, the browser clipboard is faked out using an in-memory store.\n        // This means the resources clipboard is not properly updated when copying from the editor.\n        this._clipboardService.clearInternalState?.();\n        if (!e.clipboardData || !this.isPasteAsEnabled()) {\n            return;\n        }\n        const model = this._editor.getModel();\n        const selections = this._editor.getSelections();\n        if (!model || !selections?.length) {\n            return;\n        }\n        const enableEmptySelectionClipboard = this._editor.getOption(45 /* EditorOption.emptySelectionClipboard */);\n        let ranges = selections;\n        const wasFromEmptySelection = selections.length === 1 && selections[0].isEmpty();\n        if (wasFromEmptySelection) {\n            if (!enableEmptySelectionClipboard) {\n                return;\n            }\n            ranges = [new Range(ranges[0].startLineNumber, 1, ranges[0].startLineNumber, 1 + model.getLineLength(ranges[0].startLineNumber))];\n        }\n        const toCopy = this._editor._getViewModel()?.getPlainTextToCopy(selections, enableEmptySelectionClipboard, isWindows);\n        const multicursorText = Array.isArray(toCopy) ? toCopy : null;\n        const defaultPastePayload = {\n            multicursorText,\n            pasteOnNewLine: wasFromEmptySelection,\n            mode: null\n        };\n        const providers = this._languageFeaturesService.documentPasteEditProvider\n            .ordered(model)\n            .filter(x => !!x.prepareDocumentPaste);\n        if (!providers.length) {\n            this.setCopyMetadata(e.clipboardData, { defaultPastePayload });\n            return;\n        }\n        const dataTransfer = toVSDataTransfer(e.clipboardData);\n        const providerCopyMimeTypes = providers.flatMap(x => x.copyMimeTypes ?? []);\n        // Save off a handle pointing to data that VS Code maintains.\n        const handle = id ?? generateUuid();\n        this.setCopyMetadata(e.clipboardData, {\n            id: handle,\n            providerCopyMimeTypes,\n            defaultPastePayload\n        });\n        const operations = providers.map((provider) => {\n            return {\n                providerMimeTypes: provider.copyMimeTypes,\n                operation: createCancelablePromise(token => provider.prepareDocumentPaste(model, ranges, dataTransfer, token)\n                    .catch(err => {\n                    console.error(err);\n                    return undefined;\n                }))\n            };\n        });\n        CopyPasteController_1._currentCopyOperation?.operations.forEach(entry => entry.operation.cancel());\n        CopyPasteController_1._currentCopyOperation = { handle, operations };\n    }\n    async handlePaste(e) {\n        if (e.clipboardData) {\n            const [text, metadata] = ClipboardEventUtils.getTextData(e.clipboardData);\n            const metadataComputed = metadata || InMemoryClipboardMetadataManager.INSTANCE.get(text);\n            this._logService.trace('CopyPasteController#handlePaste for id : ', metadataComputed?.id);\n        }\n        else {\n            this._logService.trace('CopyPasteController#handlePaste');\n        }\n        if (!e.clipboardData || !this._editor.hasTextFocus()) {\n            return;\n        }\n        MessageController.get(this._editor)?.closeMessage();\n        this._currentPasteOperation?.cancel();\n        this._currentPasteOperation = undefined;\n        const model = this._editor.getModel();\n        const selections = this._editor.getSelections();\n        if (!selections?.length || !model) {\n            return;\n        }\n        if (this._editor.getOption(104 /* EditorOption.readOnly */) // Never enabled if editor is readonly.\n            || (!this.isPasteAsEnabled() && !this._pasteAsActionContext) // Or feature disabled (but still enable if paste was explicitly requested)\n        ) {\n            return;\n        }\n        const metadata = this.fetchCopyMetadata(e);\n        this._logService.trace('CopyPasteController#handlePaste with metadata : ', metadata?.id, ' and text.length : ', e.clipboardData.getData('text/plain').length);\n        const dataTransfer = toExternalVSDataTransfer(e.clipboardData);\n        dataTransfer.delete(vscodeClipboardMime);\n        const fileTypes = Array.from(e.clipboardData.files).map(file => file.type);\n        const allPotentialMimeTypes = [\n            ...e.clipboardData.types,\n            ...fileTypes,\n            ...metadata?.providerCopyMimeTypes ?? [],\n            // TODO: always adds `uri-list` because this get set if there are resources in the system clipboard.\n            // However we can only check the system clipboard async. For this early check, just add it in.\n            // We filter providers again once we have the final dataTransfer we will use.\n            Mimes.uriList,\n        ];\n        const allProviders = this._languageFeaturesService.documentPasteEditProvider\n            .ordered(model)\n            .filter(provider => {\n            // Filter out providers that don't match the requested paste types\n            const preference = this._pasteAsActionContext?.preferred;\n            if (preference) {\n                if (!this.providerMatchesPreference(provider, preference)) {\n                    return false;\n                }\n            }\n            // And providers that don't handle any of mime types in the clipboard\n            return provider.pasteMimeTypes?.some(type => matchesMimeType(type, allPotentialMimeTypes));\n        });\n        if (!allProviders.length) {\n            if (this._pasteAsActionContext?.preferred) {\n                this.showPasteAsNoEditMessage(selections, this._pasteAsActionContext.preferred);\n                // Also prevent default paste from applying\n                e.preventDefault();\n                e.stopImmediatePropagation();\n            }\n            return;\n        }\n        // Prevent the editor's default paste handler from running.\n        // Note that after this point, we are fully responsible for handling paste.\n        // If we can't provider a paste for any reason, we need to explicitly delegate pasting back to the editor.\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        if (this._pasteAsActionContext) {\n            this.showPasteAsPick(this._pasteAsActionContext.preferred, allProviders, selections, dataTransfer, metadata);\n        }\n        else {\n            this.doPasteInline(allProviders, selections, dataTransfer, metadata, e);\n        }\n    }\n    showPasteAsNoEditMessage(selections, preference) {\n        const kindLabel = 'only' in preference\n            ? preference.only.value\n            : 'preferences' in preference\n                ? (preference.preferences.length ? preference.preferences.map(preference => preference.value).join(', ') : localize(919, \"empty\"))\n                : preference.providerId;\n        MessageController.get(this._editor)?.showMessage(localize(920, \"No paste edits for '{0}' found\", kindLabel), selections[0].getStartPosition());\n    }\n    doPasteInline(allProviders, selections, dataTransfer, metadata, clipboardEvent) {\n        this._logService.trace('CopyPasteController#doPasteInline');\n        const editor = this._editor;\n        if (!editor.hasModel()) {\n            return;\n        }\n        const editorStateCts = new EditorStateCancellationTokenSource(editor, 1 /* CodeEditorStateFlag.Value */ | 2 /* CodeEditorStateFlag.Selection */, undefined);\n        const p = createCancelablePromise(async (pToken) => {\n            const editor = this._editor;\n            if (!editor.hasModel()) {\n                return;\n            }\n            const model = editor.getModel();\n            const disposables = new DisposableStore();\n            const cts = disposables.add(new CancellationTokenSource(pToken));\n            disposables.add(editorStateCts.token.onCancellationRequested(() => cts.cancel()));\n            const token = cts.token;\n            try {\n                await this.mergeInDataFromCopy(allProviders, dataTransfer, metadata, token);\n                if (token.isCancellationRequested) {\n                    return;\n                }\n                const supportedProviders = allProviders.filter(provider => this.isSupportedPasteProvider(provider, dataTransfer));\n                if (!supportedProviders.length\n                    || (supportedProviders.length === 1 && supportedProviders[0] instanceof DefaultTextPasteOrDropEditProvider) // Only our default text provider is active\n                ) {\n                    return this.applyDefaultPasteHandler(dataTransfer, metadata, token, clipboardEvent);\n                }\n                const context = {\n                    triggerKind: DocumentPasteTriggerKind.Automatic,\n                };\n                const editSession = await this.getPasteEdits(supportedProviders, dataTransfer, model, selections, context, token);\n                disposables.add(editSession);\n                if (token.isCancellationRequested) {\n                    return;\n                }\n                // If the only edit returned is our default text edit, use the default paste handler\n                if (editSession.edits.length === 1 && editSession.edits[0].provider instanceof DefaultTextPasteOrDropEditProvider) {\n                    return this.applyDefaultPasteHandler(dataTransfer, metadata, token, clipboardEvent);\n                }\n                if (editSession.edits.length) {\n                    const canShowWidget = editor.getOption(97 /* EditorOption.pasteAs */).showPasteSelector === 'afterPaste';\n                    return this._postPasteWidgetManager.applyEditAndShowIfNeeded(selections, { activeEditIndex: this.getInitialActiveEditIndex(model, editSession.edits), allEdits: editSession.edits }, canShowWidget, async (edit, resolveToken) => {\n                        if (!edit.provider.resolveDocumentPasteEdit) {\n                            return edit;\n                        }\n                        const resolveP = edit.provider.resolveDocumentPasteEdit(edit, resolveToken);\n                        const showP = new DeferredPromise();\n                        const resolved = await this._pasteProgressManager.showWhile(selections[0].getEndPosition(), localize(921, \"Resolving paste edit for '{0}'. Click to cancel\", edit.title), raceCancellation(Promise.race([showP.p, resolveP]), resolveToken), {\n                            cancel: () => showP.cancel()\n                        }, 0);\n                        if (resolved) {\n                            edit.insertText = resolved.insertText;\n                            edit.additionalEdit = resolved.additionalEdit;\n                        }\n                        return edit;\n                    }, token);\n                }\n                await this.applyDefaultPasteHandler(dataTransfer, metadata, token, clipboardEvent);\n            }\n            finally {\n                disposables.dispose();\n                if (this._currentPasteOperation === p) {\n                    this._currentPasteOperation = undefined;\n                }\n            }\n        });\n        this._pasteProgressManager.showWhile(selections[0].getEndPosition(), localize(922, \"Running paste handlers. Click to cancel and do basic paste\"), p, {\n            cancel: async () => {\n                p.cancel();\n                if (editorStateCts.token.isCancellationRequested) {\n                    return;\n                }\n                await this.applyDefaultPasteHandler(dataTransfer, metadata, editorStateCts.token, clipboardEvent);\n            }\n        }).finally(() => {\n            editorStateCts.dispose();\n        });\n        this._currentPasteOperation = p;\n    }\n    showPasteAsPick(preference, allProviders, selections, dataTransfer, metadata) {\n        this._logService.trace('CopyPasteController#showPasteAsPick');\n        const p = createCancelablePromise(async (token) => {\n            const editor = this._editor;\n            if (!editor.hasModel()) {\n                return;\n            }\n            const model = editor.getModel();\n            const disposables = new DisposableStore();\n            const tokenSource = disposables.add(new EditorStateCancellationTokenSource(editor, 1 /* CodeEditorStateFlag.Value */ | 2 /* CodeEditorStateFlag.Selection */, undefined, token));\n            try {\n                await this.mergeInDataFromCopy(allProviders, dataTransfer, metadata, tokenSource.token);\n                if (tokenSource.token.isCancellationRequested) {\n                    return;\n                }\n                // Filter out any providers the don't match the full data transfer we will send them.\n                let supportedProviders = allProviders.filter(provider => this.isSupportedPasteProvider(provider, dataTransfer, preference));\n                if (preference) {\n                    // We are looking for a specific edit\n                    supportedProviders = supportedProviders.filter(provider => this.providerMatchesPreference(provider, preference));\n                }\n                const context = {\n                    triggerKind: DocumentPasteTriggerKind.PasteAs,\n                    only: preference && 'only' in preference ? preference.only : undefined,\n                };\n                let editSession = disposables.add(await this.getPasteEdits(supportedProviders, dataTransfer, model, selections, context, tokenSource.token));\n                if (tokenSource.token.isCancellationRequested) {\n                    return;\n                }\n                // Filter out any edits that don't match the requested kind\n                if (preference) {\n                    editSession = {\n                        edits: editSession.edits.filter(edit => {\n                            if ('only' in preference) {\n                                return preference.only.contains(edit.kind);\n                            }\n                            else if ('preferences' in preference) {\n                                return preference.preferences.some(preference => preference.contains(edit.kind));\n                            }\n                            else {\n                                return preference.providerId === edit.provider.id;\n                            }\n                        }),\n                        dispose: editSession.dispose\n                    };\n                }\n                if (!editSession.edits.length) {\n                    if (preference) {\n                        this.showPasteAsNoEditMessage(selections, preference);\n                    }\n                    return;\n                }\n                let pickedEdit;\n                if (preference) {\n                    pickedEdit = editSession.edits.at(0);\n                }\n                else {\n                    const configureDefaultItem = {\n                        id: 'editor.pasteAs.default',\n                        label: localize(923, \"Configure default paste action\"),\n                        edit: undefined,\n                    };\n                    const selected = await this._quickInputService.pick([\n                        ...editSession.edits.map((edit) => ({\n                            label: edit.title,\n                            description: edit.kind?.value,\n                            edit,\n                        })),\n                        ...(CopyPasteController_1._configureDefaultAction ? [\n                            upcast({ type: 'separator' }),\n                            {\n                                label: CopyPasteController_1._configureDefaultAction.label,\n                                edit: undefined,\n                            }\n                        ] : [])\n                    ], {\n                        placeHolder: localize(924, \"Select Paste Action\"),\n                    });\n                    if (selected === configureDefaultItem) {\n                        CopyPasteController_1._configureDefaultAction?.run();\n                        return;\n                    }\n                    pickedEdit = selected?.edit;\n                }\n                if (!pickedEdit) {\n                    return;\n                }\n                const combinedWorkspaceEdit = createCombinedWorkspaceEdit(model.uri, selections, pickedEdit);\n                await this._bulkEditService.apply(combinedWorkspaceEdit, { editor: this._editor });\n            }\n            finally {\n                disposables.dispose();\n                if (this._currentPasteOperation === p) {\n                    this._currentPasteOperation = undefined;\n                }\n            }\n        });\n        this._progressService.withProgress({\n            location: 10 /* ProgressLocation.Window */,\n            title: localize(925, \"Running paste handlers\"),\n        }, () => p);\n    }\n    setCopyMetadata(dataTransfer, metadata) {\n        this._logService.trace('CopyPasteController#setCopyMetadata new id : ', metadata.id);\n        dataTransfer.setData(vscodeClipboardMime, JSON.stringify(metadata));\n    }\n    fetchCopyMetadata(e) {\n        this._logService.trace('CopyPasteController#fetchCopyMetadata');\n        if (!e.clipboardData) {\n            return;\n        }\n        // Prefer using the clipboard data we saved off\n        const rawMetadata = e.clipboardData.getData(vscodeClipboardMime);\n        if (rawMetadata) {\n            try {\n                return JSON.parse(rawMetadata);\n            }\n            catch {\n                return undefined;\n            }\n        }\n        // Otherwise try to extract the generic text editor metadata\n        const [_, metadata] = ClipboardEventUtils.getTextData(e.clipboardData);\n        if (metadata) {\n            return {\n                defaultPastePayload: {\n                    mode: metadata.mode,\n                    multicursorText: metadata.multicursorText ?? null,\n                    pasteOnNewLine: !!metadata.isFromEmptySelection,\n                },\n            };\n        }\n        return undefined;\n    }\n    async mergeInDataFromCopy(allProviders, dataTransfer, metadata, token) {\n        this._logService.trace('CopyPasteController#mergeInDataFromCopy with metadata : ', metadata?.id);\n        if (metadata?.id && CopyPasteController_1._currentCopyOperation?.handle === metadata.id) {\n            // Only resolve providers that have data we may care about\n            const toResolve = CopyPasteController_1._currentCopyOperation.operations\n                .filter(op => allProviders.some(provider => provider.pasteMimeTypes.some(type => matchesMimeType(type, op.providerMimeTypes))))\n                .map(op => op.operation);\n            const toMergeResults = await Promise.all(toResolve);\n            if (token.isCancellationRequested) {\n                return;\n            }\n            // Values from higher priority providers should overwrite values from lower priority ones.\n            // Reverse the array to so that the calls to `DataTransfer.replace` later will do this\n            for (const toMergeData of toMergeResults.reverse()) {\n                if (toMergeData) {\n                    for (const [key, value] of toMergeData) {\n                        dataTransfer.replace(key, value);\n                    }\n                }\n            }\n        }\n        if (!dataTransfer.has(Mimes.uriList)) {\n            const resources = await this._clipboardService.readResources();\n            if (token.isCancellationRequested) {\n                return;\n            }\n            if (resources.length) {\n                dataTransfer.append(Mimes.uriList, createStringDataTransferItem(UriList.create(resources)));\n            }\n        }\n    }\n    async getPasteEdits(providers, dataTransfer, model, selections, context, token) {\n        const disposables = new DisposableStore();\n        const results = await raceCancellation(Promise.all(providers.map(async (provider) => {\n            try {\n                const edits = await provider.provideDocumentPasteEdits?.(model, selections, dataTransfer, context, token);\n                if (edits) {\n                    disposables.add(edits);\n                }\n                return edits?.edits?.map(edit => ({ ...edit, provider }));\n            }\n            catch (err) {\n                if (!isCancellationError(err)) {\n                    console.error(err);\n                }\n                return undefined;\n            }\n        })), token);\n        const edits = coalesce(results ?? []).flat().filter(edit => {\n            return !context.only || context.only.contains(edit.kind);\n        });\n        return {\n            edits: sortEditsByYieldTo(edits),\n            dispose: () => disposables.dispose()\n        };\n    }\n    async applyDefaultPasteHandler(dataTransfer, metadata, token, clipboardEvent) {\n        const textDataTransfer = dataTransfer.get(Mimes.text) ?? dataTransfer.get('text');\n        const text = (await textDataTransfer?.asString()) ?? '';\n        if (token.isCancellationRequested) {\n            return;\n        }\n        const payload = {\n            clipboardEvent,\n            text,\n            pasteOnNewLine: metadata?.defaultPastePayload.pasteOnNewLine ?? false,\n            multicursorText: metadata?.defaultPastePayload.multicursorText ?? null,\n            mode: null,\n        };\n        this._logService.trace('CopyPasteController#applyDefaultPasteHandler for id : ', metadata?.id);\n        this._editor.trigger('keyboard', \"paste\" /* Handler.Paste */, payload);\n    }\n    /**\n     * Filter out providers if they:\n     * - Don't handle any of the data transfer types we have\n     * - Don't match the preferred paste kind\n     */\n    isSupportedPasteProvider(provider, dataTransfer, preference) {\n        if (!provider.pasteMimeTypes?.some(type => dataTransfer.matches(type))) {\n            return false;\n        }\n        return !preference || this.providerMatchesPreference(provider, preference);\n    }\n    providerMatchesPreference(provider, preference) {\n        if ('only' in preference) {\n            return provider.providedPasteEditKinds.some(providedKind => preference.only.contains(providedKind));\n        }\n        else if ('preferences' in preference) {\n            return preference.preferences.some(providedKind => preference.preferences.some(preferredKind => preferredKind.contains(providedKind)));\n        }\n        else {\n            return provider.id === preference.providerId;\n        }\n    }\n    getInitialActiveEditIndex(model, edits) {\n        const preferredProviders = this._configService.getValue(pasteAsPreferenceConfig, { resource: model.uri });\n        for (const config of Array.isArray(preferredProviders) ? preferredProviders : []) {\n            const desiredKind = new HierarchicalKind(config);\n            const editIndex = edits.findIndex(edit => desiredKind.contains(edit.kind));\n            if (editIndex >= 0) {\n                return editIndex;\n            }\n        }\n        return 0;\n    }\n};\nCopyPasteController = CopyPasteController_1 = __decorate([\n    __param(1, IInstantiationService),\n    __param(2, ILogService),\n    __param(3, IBulkEditService),\n    __param(4, IClipboardService),\n    __param(5, ICommandService),\n    __param(6, IConfigurationService),\n    __param(7, ILanguageFeaturesService),\n    __param(8, IQuickInputService),\n    __param(9, IProgressService)\n], CopyPasteController);\n\nexport { CopyPasteController, changePasteTypeCommandId, pasteAsPreferenceConfig, pasteWidgetVisibleCtx };\n","import { isFirefox } from '../../../../base/browser/browser.js';\nimport { getActiveWindow, getActiveDocument } from '../../../../base/browser/dom.js';\nimport { isNative, isWeb } from '../../../../base/common/platform.js';\nimport { StopWatch } from '../../../../base/common/stopwatch.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { MenuId, MenuRegistry } from '../../../../platform/actions/common/actions.js';\nimport { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';\nimport { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport { ILogService } from '../../../../platform/log/common/log.js';\nimport { IProductService } from '../../../../platform/product/common/productService.js';\nimport { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js';\nimport { InMemoryClipboardMetadataManager, CopyOptions } from '../../../browser/controller/editContext/clipboardUtils.js';\nimport { NativeEditContextRegistry } from '../../../browser/controller/editContext/native/nativeEditContextRegistry.js';\nimport { MultiCommand, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { CopyPasteController } from '../../dropOrPasteInto/browser/copyPasteController.js';\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 *--------------------------------------------------------------------------------------------*/\nconst CLIPBOARD_CONTEXT_MENU_GROUP = '9_cutcopypaste';\nconst supportsCut = (isNative || document.queryCommandSupported('cut'));\nconst supportsCopy = (isNative || document.queryCommandSupported('copy'));\n// Firefox only supports navigator.clipboard.readText() in browser extensions.\n// See https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/readText#Browser_compatibility\n// When loading over http, navigator.clipboard can be undefined. See https://github.com/microsoft/monaco-editor/issues/2313\nconst supportsPaste = (typeof navigator.clipboard === 'undefined' || isFirefox) ? document.queryCommandSupported('paste') : true;\nfunction registerCommand(command) {\n    command.register();\n    return command;\n}\nconst CutAction = supportsCut ? registerCommand(new MultiCommand({\n    id: 'editor.action.clipboardCutAction',\n    precondition: undefined,\n    kbOpts: (\n    // Do not bind cut keybindings in the browser,\n    // since browsers do that for us and it avoids security prompts\n    isNative ? {\n        primary: 2048 /* KeyMod.CtrlCmd */ | 54 /* KeyCode.KeyX */,\n        win: { primary: 2048 /* KeyMod.CtrlCmd */ | 54 /* KeyCode.KeyX */, secondary: [1024 /* KeyMod.Shift */ | 20 /* KeyCode.Delete */] },\n        weight: 100 /* KeybindingWeight.EditorContrib */\n    } : undefined),\n    menuOpts: [{\n            menuId: MenuId.MenubarEditMenu,\n            group: '2_ccp',\n            title: localize(813, \"Cu&&t\"),\n            order: 1\n        }, {\n            menuId: MenuId.EditorContext,\n            group: CLIPBOARD_CONTEXT_MENU_GROUP,\n            title: localize(814, \"Cut\"),\n            when: EditorContextKeys.writable,\n            order: 1,\n        }, {\n            menuId: MenuId.CommandPalette,\n            group: '',\n            title: localize(815, \"Cut\"),\n            order: 1\n        }, {\n            menuId: MenuId.SimpleEditorContext,\n            group: CLIPBOARD_CONTEXT_MENU_GROUP,\n            title: localize(816, \"Cut\"),\n            when: EditorContextKeys.writable,\n            order: 1,\n        }]\n})) : undefined;\nconst CopyAction = supportsCopy ? registerCommand(new MultiCommand({\n    id: 'editor.action.clipboardCopyAction',\n    precondition: undefined,\n    kbOpts: (\n    // Do not bind copy keybindings in the browser,\n    // since browsers do that for us and it avoids security prompts\n    isNative ? {\n        primary: 2048 /* KeyMod.CtrlCmd */ | 33 /* KeyCode.KeyC */,\n        win: { primary: 2048 /* KeyMod.CtrlCmd */ | 33 /* KeyCode.KeyC */, secondary: [2048 /* KeyMod.CtrlCmd */ | 19 /* KeyCode.Insert */] },\n        weight: 100 /* KeybindingWeight.EditorContrib */\n    } : undefined),\n    menuOpts: [{\n            menuId: MenuId.MenubarEditMenu,\n            group: '2_ccp',\n            title: localize(817, \"&&Copy\"),\n            order: 2\n        }, {\n            menuId: MenuId.EditorContext,\n            group: CLIPBOARD_CONTEXT_MENU_GROUP,\n            title: localize(818, \"Copy\"),\n            order: 2,\n        }, {\n            menuId: MenuId.CommandPalette,\n            group: '',\n            title: localize(819, \"Copy\"),\n            order: 1\n        }, {\n            menuId: MenuId.SimpleEditorContext,\n            group: CLIPBOARD_CONTEXT_MENU_GROUP,\n            title: localize(820, \"Copy\"),\n            order: 2,\n        }]\n})) : undefined;\nMenuRegistry.appendMenuItem(MenuId.MenubarEditMenu, { submenu: MenuId.MenubarCopy, title: localize2(825, \"Copy As\"), group: '2_ccp', order: 3 });\nMenuRegistry.appendMenuItem(MenuId.EditorContext, { submenu: MenuId.EditorContextCopy, title: localize2(826, \"Copy As\"), group: CLIPBOARD_CONTEXT_MENU_GROUP, order: 3 });\nMenuRegistry.appendMenuItem(MenuId.EditorContext, { submenu: MenuId.EditorContextShare, title: localize2(827, \"Share\"), group: '11_share', order: -1, when: ContextKeyExpr.and(ContextKeyExpr.notEquals('resourceScheme', 'output'), EditorContextKeys.editorTextFocus) });\nMenuRegistry.appendMenuItem(MenuId.ExplorerContext, { submenu: MenuId.ExplorerContextShare, title: localize2(828, \"Share\"), group: '11_share', order: -1 });\nconst PasteAction = supportsPaste ? registerCommand(new MultiCommand({\n    id: 'editor.action.clipboardPasteAction',\n    precondition: undefined,\n    kbOpts: (\n    // Do not bind paste keybindings in the browser,\n    // since browsers do that for us and it avoids security prompts\n    isNative ? {\n        primary: 2048 /* KeyMod.CtrlCmd */ | 52 /* KeyCode.KeyV */,\n        win: { primary: 2048 /* KeyMod.CtrlCmd */ | 52 /* KeyCode.KeyV */, secondary: [1024 /* KeyMod.Shift */ | 19 /* KeyCode.Insert */] },\n        linux: { primary: 2048 /* KeyMod.CtrlCmd */ | 52 /* KeyCode.KeyV */, secondary: [1024 /* KeyMod.Shift */ | 19 /* KeyCode.Insert */] },\n        weight: 100 /* KeybindingWeight.EditorContrib */\n    } : undefined),\n    menuOpts: [{\n            menuId: MenuId.MenubarEditMenu,\n            group: '2_ccp',\n            title: localize(821, \"&&Paste\"),\n            order: 4\n        }, {\n            menuId: MenuId.EditorContext,\n            group: CLIPBOARD_CONTEXT_MENU_GROUP,\n            title: localize(822, \"Paste\"),\n            when: EditorContextKeys.writable,\n            order: 4,\n        }, {\n            menuId: MenuId.CommandPalette,\n            group: '',\n            title: localize(823, \"Paste\"),\n            order: 1\n        }, {\n            menuId: MenuId.SimpleEditorContext,\n            group: CLIPBOARD_CONTEXT_MENU_GROUP,\n            title: localize(824, \"Paste\"),\n            when: EditorContextKeys.writable,\n            order: 4,\n        }]\n})) : undefined;\nclass ExecCommandCopyWithSyntaxHighlightingAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.clipboardCopyWithSyntaxHighlightingAction',\n            label: localize2(829, \"Copy with Syntax Highlighting\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 0,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(accessor, editor) {\n        const logService = accessor.get(ILogService);\n        logService.trace('ExecCommandCopyWithSyntaxHighlightingAction#run');\n        if (!editor.hasModel()) {\n            return;\n        }\n        const emptySelectionClipboard = editor.getOption(45 /* EditorOption.emptySelectionClipboard */);\n        if (!emptySelectionClipboard && editor.getSelection().isEmpty()) {\n            return;\n        }\n        CopyOptions.forceCopyWithSyntaxHighlighting = true;\n        editor.focus();\n        logService.trace('ExecCommandCopyWithSyntaxHighlightingAction (before execCommand copy)');\n        editor.getContainerDomNode().ownerDocument.execCommand('copy');\n        logService.trace('ExecCommandCopyWithSyntaxHighlightingAction (after execCommand copy)');\n        CopyOptions.forceCopyWithSyntaxHighlighting = false;\n    }\n}\nfunction registerExecCommandImpl(target, browserCommand) {\n    if (!target) {\n        return;\n    }\n    // 1. handle case when focus is in editor.\n    target.addImplementation(10000, 'code-editor', (accessor, args) => {\n        const logService = accessor.get(ILogService);\n        logService.trace('registerExecCommandImpl (addImplementation code-editor for : ', browserCommand, ')');\n        // Only if editor text focus (i.e. not if editor has widget focus).\n        const focusedEditor = accessor.get(ICodeEditorService).getFocusedCodeEditor();\n        if (focusedEditor && focusedEditor.hasTextFocus()) {\n            // Do not execute if there is no selection and empty selection clipboard is off\n            const emptySelectionClipboard = focusedEditor.getOption(45 /* EditorOption.emptySelectionClipboard */);\n            const selection = focusedEditor.getSelection();\n            if (selection && selection.isEmpty() && !emptySelectionClipboard) {\n                return true;\n            }\n            // TODO this is very ugly. The entire copy/paste/cut system needs a complete refactoring.\n            if (focusedEditor.getOption(170 /* EditorOption.effectiveEditContext */) && browserCommand === 'cut') {\n                logCopyCommand(focusedEditor);\n                // execCommand(copy) works for edit context, but not execCommand(cut).\n                logService.trace('registerExecCommandImpl (before execCommand copy)');\n                focusedEditor.getContainerDomNode().ownerDocument.execCommand('copy');\n                focusedEditor.trigger(undefined, \"cut\" /* Handler.Cut */, undefined);\n                logService.trace('registerExecCommandImpl (after execCommand copy)');\n            }\n            else {\n                logCopyCommand(focusedEditor);\n                logService.trace('registerExecCommandImpl (before execCommand ' + browserCommand + ')');\n                focusedEditor.getContainerDomNode().ownerDocument.execCommand(browserCommand);\n                logService.trace('registerExecCommandImpl (after execCommand ' + browserCommand + ')');\n            }\n            return true;\n        }\n        return false;\n    });\n    // 2. (default) handle case when focus is somewhere else.\n    target.addImplementation(0, 'generic-dom', (accessor, args) => {\n        const logService = accessor.get(ILogService);\n        logService.trace('registerExecCommandImpl (addImplementation generic-dom for : ', browserCommand, ')');\n        logService.trace('registerExecCommandImpl (before execCommand ' + browserCommand + ')');\n        getActiveDocument().execCommand(browserCommand);\n        logService.trace('registerExecCommandImpl (after execCommand ' + browserCommand + ')');\n        return true;\n    });\n}\nfunction logCopyCommand(editor) {\n    const editContextEnabled = editor.getOption(170 /* EditorOption.effectiveEditContext */);\n    if (editContextEnabled) {\n        const nativeEditContext = NativeEditContextRegistry.get(editor.getId());\n        if (nativeEditContext) {\n            nativeEditContext.onWillCopy();\n        }\n    }\n}\nregisterExecCommandImpl(CutAction, 'cut');\nregisterExecCommandImpl(CopyAction, 'copy');\nif (PasteAction) {\n    // 1. Paste: handle case when focus is in editor.\n    PasteAction.addImplementation(10000, 'code-editor', (accessor, args) => {\n        const logService = accessor.get(ILogService);\n        logService.trace('registerExecCommandImpl (addImplementation code-editor for : paste)');\n        const codeEditorService = accessor.get(ICodeEditorService);\n        const clipboardService = accessor.get(IClipboardService);\n        const telemetryService = accessor.get(ITelemetryService);\n        const productService = accessor.get(IProductService);\n        // Only if editor text focus (i.e. not if editor has widget focus).\n        const focusedEditor = codeEditorService.getFocusedCodeEditor();\n        if (focusedEditor && focusedEditor.hasModel() && focusedEditor.hasTextFocus()) {\n            // execCommand(paste) does not work with edit context\n            const editContextEnabled = focusedEditor.getOption(170 /* EditorOption.effectiveEditContext */);\n            if (editContextEnabled) {\n                const nativeEditContext = NativeEditContextRegistry.get(focusedEditor.getId());\n                if (nativeEditContext) {\n                    nativeEditContext.onWillPaste();\n                }\n            }\n            const sw = StopWatch.create(true);\n            logService.trace('registerExecCommandImpl (before triggerPaste)');\n            const triggerPaste = clipboardService.triggerPaste(getActiveWindow().vscodeWindowId);\n            if (triggerPaste) {\n                logService.trace('registerExecCommandImpl (triggerPaste defined)');\n                return triggerPaste.then(async () => {\n                    logService.trace('registerExecCommandImpl (after triggerPaste)');\n                    if (productService.quality !== 'stable') {\n                        const duration = sw.elapsed();\n                        telemetryService.publicLog2('editorAsyncPaste', { duration });\n                    }\n                    return CopyPasteController.get(focusedEditor)?.finishedPaste() ?? Promise.resolve();\n                });\n            }\n            else {\n                logService.trace('registerExecCommandImpl (triggerPaste undefined)');\n            }\n            if (isWeb) {\n                logService.trace('registerExecCommandImpl (Paste handling on web)');\n                // Use the clipboard service if document.execCommand('paste') was not successful\n                return (async () => {\n                    const clipboardText = await clipboardService.readText();\n                    if (clipboardText !== '') {\n                        const metadata = InMemoryClipboardMetadataManager.INSTANCE.get(clipboardText);\n                        let pasteOnNewLine = false;\n                        let multicursorText = null;\n                        let mode = null;\n                        if (metadata) {\n                            pasteOnNewLine = (focusedEditor.getOption(45 /* EditorOption.emptySelectionClipboard */) && !!metadata.isFromEmptySelection);\n                            multicursorText = (typeof metadata.multicursorText !== 'undefined' ? metadata.multicursorText : null);\n                            mode = metadata.mode;\n                        }\n                        logService.trace('registerExecCommandImpl (clipboardText.length : ', clipboardText.length, ' id : ', metadata?.id, ')');\n                        focusedEditor.trigger('keyboard', \"paste\" /* Handler.Paste */, {\n                            text: clipboardText,\n                            pasteOnNewLine,\n                            multicursorText,\n                            mode\n                        });\n                    }\n                })();\n            }\n            return true;\n        }\n        return false;\n    });\n    // 2. Paste: (default) handle case when focus is somewhere else.\n    PasteAction.addImplementation(0, 'generic-dom', (accessor, args) => {\n        const logService = accessor.get(ILogService);\n        logService.trace('registerExecCommandImpl (addImplementation generic-dom for : paste)');\n        const triggerPaste = accessor.get(IClipboardService).triggerPaste(getActiveWindow().vscodeWindowId);\n        return triggerPaste ?? false;\n    });\n}\nif (supportsCopy) {\n    registerEditorAction(ExecCommandCopyWithSyntaxHighlightingAction);\n}\n\nexport { CopyAction, CutAction, PasteAction };\n","import { diffEditorDefaultOptions } from './diffEditor.js';\nimport { editorOptionsRegistry } from './editorOptions.js';\nimport { EDITOR_MODEL_DEFAULTS } from '../core/misc/textModelDefaults.js';\nimport { localize } from '../../../nls.js';\nimport { Extensions } from '../../../platform/configuration/common/configurationRegistry.js';\nimport { Registry } from '../../../platform/registry/common/platform.js';\n\nconst editorConfigurationBaseNode = Object.freeze({\n    id: 'editor',\n    order: 5,\n    type: 'object',\n    title: localize(147, \"Editor\"),\n    scope: 6 /* ConfigurationScope.LANGUAGE_OVERRIDABLE */,\n});\nconst editorConfiguration = {\n    ...editorConfigurationBaseNode,\n    properties: {\n        'editor.tabSize': {\n            type: 'number',\n            default: EDITOR_MODEL_DEFAULTS.tabSize,\n            minimum: 1,\n            maximum: 100,\n            markdownDescription: localize(148, \"The number of spaces a tab is equal to. This setting is overridden based on the file contents when {0} is on.\", '`#editor.detectIndentation#`')\n        },\n        'editor.indentSize': {\n            'anyOf': [\n                {\n                    type: 'string',\n                    enum: ['tabSize']\n                },\n                {\n                    type: 'number',\n                    minimum: 1\n                }\n            ],\n            default: 'tabSize',\n            markdownDescription: localize(149, \"The number of spaces used for indentation or `\\\"tabSize\\\"` to use the value from `#editor.tabSize#`. This setting is overridden based on the file contents when `#editor.detectIndentation#` is on.\")\n        },\n        'editor.insertSpaces': {\n            type: 'boolean',\n            default: EDITOR_MODEL_DEFAULTS.insertSpaces,\n            markdownDescription: localize(150, \"Insert spaces when pressing `Tab`. This setting is overridden based on the file contents when {0} is on.\", '`#editor.detectIndentation#`')\n        },\n        'editor.detectIndentation': {\n            type: 'boolean',\n            default: EDITOR_MODEL_DEFAULTS.detectIndentation,\n            markdownDescription: localize(151, \"Controls whether {0} and {1} will be automatically detected when a file is opened based on the file contents.\", '`#editor.tabSize#`', '`#editor.insertSpaces#`')\n        },\n        'editor.trimAutoWhitespace': {\n            type: 'boolean',\n            default: EDITOR_MODEL_DEFAULTS.trimAutoWhitespace,\n            description: localize(152, \"Remove trailing auto inserted whitespace.\")\n        },\n        'editor.largeFileOptimizations': {\n            type: 'boolean',\n            default: EDITOR_MODEL_DEFAULTS.largeFileOptimizations,\n            description: localize(153, \"Special handling for large files to disable certain memory intensive features.\")\n        },\n        'editor.wordBasedSuggestions': {\n            enum: ['off', 'currentDocument', 'matchingDocuments', 'allDocuments'],\n            default: 'matchingDocuments',\n            enumDescriptions: [\n                localize(154, 'Turn off Word Based Suggestions.'),\n                localize(155, 'Only suggest words from the active document.'),\n                localize(156, 'Suggest words from all open documents of the same language.'),\n                localize(157, 'Suggest words from all open documents.')\n            ],\n            description: localize(158, \"Controls whether completions should be computed based on words in the document and from which documents they are computed.\")\n        },\n        'editor.semanticHighlighting.enabled': {\n            enum: [true, false, 'configuredByTheme'],\n            enumDescriptions: [\n                localize(159, 'Semantic highlighting enabled for all color themes.'),\n                localize(160, 'Semantic highlighting disabled for all color themes.'),\n                localize(161, 'Semantic highlighting is configured by the current color theme\\'s `semanticHighlighting` setting.')\n            ],\n            default: 'configuredByTheme',\n            description: localize(162, \"Controls whether the semanticHighlighting is shown for the languages that support it.\")\n        },\n        'editor.stablePeek': {\n            type: 'boolean',\n            default: false,\n            markdownDescription: localize(163, \"Keep peek editors open even when double-clicking their content or when hitting `Escape`.\")\n        },\n        'editor.maxTokenizationLineLength': {\n            type: 'integer',\n            default: 20_000,\n            description: localize(164, \"Lines above this length will not be tokenized for performance reasons\")\n        },\n        'editor.experimental.asyncTokenization': {\n            type: 'boolean',\n            default: true,\n            description: localize(165, \"Controls whether the tokenization should happen asynchronously on a web worker.\"),\n            tags: ['experimental'],\n        },\n        'editor.experimental.asyncTokenizationLogging': {\n            type: 'boolean',\n            default: false,\n            description: localize(166, \"Controls whether async tokenization should be logged. For debugging only.\"),\n        },\n        'editor.experimental.asyncTokenizationVerification': {\n            type: 'boolean',\n            default: false,\n            description: localize(167, \"Controls whether async tokenization should be verified against legacy background tokenization. Might slow down tokenization. For debugging only.\"),\n            tags: ['experimental'],\n        },\n        'editor.experimental.treeSitterTelemetry': {\n            type: 'boolean',\n            default: false,\n            markdownDescription: localize(168, \"Controls whether tree sitter parsing should be turned on and telemetry collected. Setting `#editor.experimental.preferTreeSitter#` for specific languages will take precedence.\"),\n            tags: ['experimental'],\n            experiment: {\n                mode: 'auto'\n            }\n        },\n        'editor.experimental.preferTreeSitter.css': {\n            type: 'boolean',\n            default: false,\n            markdownDescription: localize(169, \"Controls whether tree sitter parsing should be turned on for css. This will take precedence over `#editor.experimental.treeSitterTelemetry#` for css.\"),\n            tags: ['experimental'],\n            experiment: {\n                mode: 'auto'\n            }\n        },\n        'editor.experimental.preferTreeSitter.typescript': {\n            type: 'boolean',\n            default: false,\n            markdownDescription: localize(170, \"Controls whether tree sitter parsing should be turned on for typescript. This will take precedence over `#editor.experimental.treeSitterTelemetry#` for typescript.\"),\n            tags: ['experimental'],\n            experiment: {\n                mode: 'auto'\n            }\n        },\n        'editor.experimental.preferTreeSitter.ini': {\n            type: 'boolean',\n            default: false,\n            markdownDescription: localize(171, \"Controls whether tree sitter parsing should be turned on for ini. This will take precedence over `#editor.experimental.treeSitterTelemetry#` for ini.\"),\n            tags: ['experimental'],\n            experiment: {\n                mode: 'auto'\n            }\n        },\n        'editor.experimental.preferTreeSitter.regex': {\n            type: 'boolean',\n            default: false,\n            markdownDescription: localize(172, \"Controls whether tree sitter parsing should be turned on for regex. This will take precedence over `#editor.experimental.treeSitterTelemetry#` for regex.\"),\n            tags: ['experimental'],\n            experiment: {\n                mode: 'auto'\n            }\n        },\n        'editor.language.brackets': {\n            type: ['array', 'null'],\n            default: null, // We want to distinguish the empty array from not configured.\n            description: localize(173, 'Defines the bracket symbols that increase or decrease the indentation.'),\n            items: {\n                type: 'array',\n                items: [\n                    {\n                        type: 'string',\n                        description: localize(174, 'The opening bracket character or string sequence.')\n                    },\n                    {\n                        type: 'string',\n                        description: localize(175, 'The closing bracket character or string sequence.')\n                    }\n                ]\n            }\n        },\n        'editor.language.colorizedBracketPairs': {\n            type: ['array', 'null'],\n            default: null, // We want to distinguish the empty array from not configured.\n            description: localize(176, 'Defines the bracket pairs that are colorized by their nesting level if bracket pair colorization is enabled.'),\n            items: {\n                type: 'array',\n                items: [\n                    {\n                        type: 'string',\n                        description: localize(177, 'The opening bracket character or string sequence.')\n                    },\n                    {\n                        type: 'string',\n                        description: localize(178, 'The closing bracket character or string sequence.')\n                    }\n                ]\n            }\n        },\n        'diffEditor.maxComputationTime': {\n            type: 'number',\n            default: diffEditorDefaultOptions.maxComputationTime,\n            description: localize(179, \"Timeout in milliseconds after which diff computation is cancelled. Use 0 for no timeout.\")\n        },\n        'diffEditor.maxFileSize': {\n            type: 'number',\n            default: diffEditorDefaultOptions.maxFileSize,\n            description: localize(180, \"Maximum file size in MB for which to compute diffs. Use 0 for no limit.\")\n        },\n        'diffEditor.renderSideBySide': {\n            type: 'boolean',\n            default: diffEditorDefaultOptions.renderSideBySide,\n            description: localize(181, \"Controls whether the diff editor shows the diff side by side or inline.\")\n        },\n        'diffEditor.renderSideBySideInlineBreakpoint': {\n            type: 'number',\n            default: diffEditorDefaultOptions.renderSideBySideInlineBreakpoint,\n            description: localize(182, \"If the diff editor width is smaller than this value, the inline view is used.\")\n        },\n        'diffEditor.useInlineViewWhenSpaceIsLimited': {\n            type: 'boolean',\n            default: diffEditorDefaultOptions.useInlineViewWhenSpaceIsLimited,\n            description: localize(183, \"If enabled and the editor width is too small, the inline view is used.\")\n        },\n        'diffEditor.renderMarginRevertIcon': {\n            type: 'boolean',\n            default: diffEditorDefaultOptions.renderMarginRevertIcon,\n            description: localize(184, \"When enabled, the diff editor shows arrows in its glyph margin to revert changes.\")\n        },\n        'diffEditor.renderGutterMenu': {\n            type: 'boolean',\n            default: diffEditorDefaultOptions.renderGutterMenu,\n            description: localize(185, \"When enabled, the diff editor shows a special gutter for revert and stage actions.\")\n        },\n        'diffEditor.ignoreTrimWhitespace': {\n            type: 'boolean',\n            default: diffEditorDefaultOptions.ignoreTrimWhitespace,\n            description: localize(186, \"When enabled, the diff editor ignores changes in leading or trailing whitespace.\")\n        },\n        'diffEditor.renderIndicators': {\n            type: 'boolean',\n            default: diffEditorDefaultOptions.renderIndicators,\n            description: localize(187, \"Controls whether the diff editor shows +/- indicators for added/removed changes.\")\n        },\n        'diffEditor.codeLens': {\n            type: 'boolean',\n            default: diffEditorDefaultOptions.diffCodeLens,\n            description: localize(188, \"Controls whether the editor shows CodeLens.\")\n        },\n        'diffEditor.wordWrap': {\n            type: 'string',\n            enum: ['off', 'on', 'inherit'],\n            default: diffEditorDefaultOptions.diffWordWrap,\n            markdownEnumDescriptions: [\n                localize(189, \"Lines will never wrap.\"),\n                localize(190, \"Lines will wrap at the viewport width.\"),\n                localize(191, \"Lines will wrap according to the {0} setting.\", '`#editor.wordWrap#`'),\n            ]\n        },\n        'diffEditor.diffAlgorithm': {\n            type: 'string',\n            enum: ['legacy', 'advanced'],\n            default: diffEditorDefaultOptions.diffAlgorithm,\n            markdownEnumDescriptions: [\n                localize(192, \"Uses the legacy diffing algorithm.\"),\n                localize(193, \"Uses the advanced diffing algorithm.\"),\n            ]\n        },\n        'diffEditor.hideUnchangedRegions.enabled': {\n            type: 'boolean',\n            default: diffEditorDefaultOptions.hideUnchangedRegions.enabled,\n            markdownDescription: localize(194, \"Controls whether the diff editor shows unchanged regions.\"),\n        },\n        'diffEditor.hideUnchangedRegions.revealLineCount': {\n            type: 'integer',\n            default: diffEditorDefaultOptions.hideUnchangedRegions.revealLineCount,\n            markdownDescription: localize(195, \"Controls how many lines are used for unchanged regions.\"),\n            minimum: 1,\n        },\n        'diffEditor.hideUnchangedRegions.minimumLineCount': {\n            type: 'integer',\n            default: diffEditorDefaultOptions.hideUnchangedRegions.minimumLineCount,\n            markdownDescription: localize(196, \"Controls how many lines are used as a minimum for unchanged regions.\"),\n            minimum: 1,\n        },\n        'diffEditor.hideUnchangedRegions.contextLineCount': {\n            type: 'integer',\n            default: diffEditorDefaultOptions.hideUnchangedRegions.contextLineCount,\n            markdownDescription: localize(197, \"Controls how many lines are used as context when comparing unchanged regions.\"),\n            minimum: 1,\n        },\n        'diffEditor.experimental.showMoves': {\n            type: 'boolean',\n            default: diffEditorDefaultOptions.experimental.showMoves,\n            markdownDescription: localize(198, \"Controls whether the diff editor should show detected code moves.\")\n        },\n        'diffEditor.experimental.showEmptyDecorations': {\n            type: 'boolean',\n            default: diffEditorDefaultOptions.experimental.showEmptyDecorations,\n            description: localize(199, \"Controls whether the diff editor shows empty decorations to see where characters got inserted or deleted.\"),\n        },\n        'diffEditor.experimental.useTrueInlineView': {\n            type: 'boolean',\n            default: diffEditorDefaultOptions.experimental.useTrueInlineView,\n            description: localize(200, \"If enabled and the editor uses the inline view, word changes are rendered inline.\"),\n        },\n    }\n};\nfunction isConfigurationPropertySchema(x) {\n    return (typeof x.type !== 'undefined' || typeof x.anyOf !== 'undefined');\n}\n// Add properties from the Editor Option Registry\nfor (const editorOption of editorOptionsRegistry) {\n    const schema = editorOption.schema;\n    if (typeof schema !== 'undefined') {\n        if (isConfigurationPropertySchema(schema)) {\n            // This is a single schema contribution\n            editorConfiguration.properties[`editor.${editorOption.name}`] = schema;\n        }\n        else {\n            for (const key in schema) {\n                if (Object.hasOwnProperty.call(schema, key)) {\n                    editorConfiguration.properties[key] = schema[key];\n                }\n            }\n        }\n    }\n}\nlet cachedEditorConfigurationKeys = null;\nfunction getEditorConfigurationKeys() {\n    if (cachedEditorConfigurationKeys === null) {\n        cachedEditorConfigurationKeys = Object.create(null);\n        Object.keys(editorConfiguration.properties).forEach((prop) => {\n            cachedEditorConfigurationKeys[prop] = true;\n        });\n    }\n    return cachedEditorConfigurationKeys;\n}\nfunction isEditorConfigurationKey(key) {\n    const editorConfigurationKeys = getEditorConfigurationKeys();\n    return (editorConfigurationKeys[`editor.${key}`] || false);\n}\nfunction isDiffEditorConfigurationKey(key) {\n    const editorConfigurationKeys = getEditorConfigurationKeys();\n    return (editorConfigurationKeys[`diffEditor.${key}`] || false);\n}\nconst configurationRegistry = Registry.as(Extensions.Configuration);\nconfigurationRegistry.registerConfiguration(editorConfiguration);\n\nexport { editorConfigurationBaseNode, isDiffEditorConfigurationKey, isEditorConfigurationKey };\n","import { onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { HierarchicalKind } from '../../../../base/common/hierarchicalKind.js';\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 *--------------------------------------------------------------------------------------------*/\nconst CodeActionKind = new class {\n    constructor() {\n        this.QuickFix = new HierarchicalKind('quickfix');\n        this.Refactor = new HierarchicalKind('refactor');\n        this.RefactorExtract = this.Refactor.append('extract');\n        this.RefactorInline = this.Refactor.append('inline');\n        this.RefactorMove = this.Refactor.append('move');\n        this.RefactorRewrite = this.Refactor.append('rewrite');\n        this.Notebook = new HierarchicalKind('notebook');\n        this.Source = new HierarchicalKind('source');\n        this.SourceOrganizeImports = this.Source.append('organizeImports');\n        this.SourceFixAll = this.Source.append('fixAll');\n        this.SurroundWith = this.Refactor.append('surround');\n    }\n};\nvar CodeActionTriggerSource;\n(function (CodeActionTriggerSource) {\n    CodeActionTriggerSource[\"Refactor\"] = \"refactor\";\n    CodeActionTriggerSource[\"RefactorPreview\"] = \"refactor preview\";\n    CodeActionTriggerSource[\"Lightbulb\"] = \"lightbulb\";\n    CodeActionTriggerSource[\"Default\"] = \"other (default)\";\n    CodeActionTriggerSource[\"SourceAction\"] = \"source action\";\n    CodeActionTriggerSource[\"QuickFix\"] = \"quick fix action\";\n    CodeActionTriggerSource[\"FixAll\"] = \"fix all\";\n    CodeActionTriggerSource[\"OrganizeImports\"] = \"organize imports\";\n    CodeActionTriggerSource[\"AutoFix\"] = \"auto fix\";\n    CodeActionTriggerSource[\"QuickFixHover\"] = \"quick fix hover window\";\n    CodeActionTriggerSource[\"OnSave\"] = \"save participants\";\n    CodeActionTriggerSource[\"ProblemsView\"] = \"problems view\";\n})(CodeActionTriggerSource || (CodeActionTriggerSource = {}));\nfunction mayIncludeActionsOfKind(filter, providedKind) {\n    // A provided kind may be a subset or superset of our filtered kind.\n    if (filter.include && !filter.include.intersects(providedKind)) {\n        return false;\n    }\n    if (filter.excludes) {\n        if (filter.excludes.some(exclude => excludesAction(providedKind, exclude, filter.include))) {\n            return false;\n        }\n    }\n    // Don't return source actions unless they are explicitly requested\n    if (!filter.includeSourceActions && CodeActionKind.Source.contains(providedKind)) {\n        return false;\n    }\n    return true;\n}\nfunction filtersAction(filter, action) {\n    const actionKind = action.kind ? new HierarchicalKind(action.kind) : undefined;\n    // Filter out actions by kind\n    if (filter.include) {\n        if (!actionKind || !filter.include.contains(actionKind)) {\n            return false;\n        }\n    }\n    if (filter.excludes) {\n        if (actionKind && filter.excludes.some(exclude => excludesAction(actionKind, exclude, filter.include))) {\n            return false;\n        }\n    }\n    // Don't return source actions unless they are explicitly requested\n    if (!filter.includeSourceActions) {\n        if (actionKind && CodeActionKind.Source.contains(actionKind)) {\n            return false;\n        }\n    }\n    if (filter.onlyIncludePreferredActions) {\n        if (!action.isPreferred) {\n            return false;\n        }\n    }\n    return true;\n}\nfunction excludesAction(providedKind, exclude, include) {\n    if (!exclude.contains(providedKind)) {\n        return false;\n    }\n    if (include && exclude.contains(include)) {\n        // The include is more specific, don't filter out\n        return false;\n    }\n    return true;\n}\nclass CodeActionCommandArgs {\n    static fromUser(arg, defaults) {\n        if (!arg || typeof arg !== 'object') {\n            return new CodeActionCommandArgs(defaults.kind, defaults.apply, false);\n        }\n        return new CodeActionCommandArgs(CodeActionCommandArgs.getKindFromUser(arg, defaults.kind), CodeActionCommandArgs.getApplyFromUser(arg, defaults.apply), CodeActionCommandArgs.getPreferredUser(arg));\n    }\n    static getApplyFromUser(arg, defaultAutoApply) {\n        switch (typeof arg.apply === 'string' ? arg.apply.toLowerCase() : '') {\n            case 'first': return \"first\" /* CodeActionAutoApply.First */;\n            case 'never': return \"never\" /* CodeActionAutoApply.Never */;\n            case 'ifsingle': return \"ifSingle\" /* CodeActionAutoApply.IfSingle */;\n            default: return defaultAutoApply;\n        }\n    }\n    static getKindFromUser(arg, defaultKind) {\n        return typeof arg.kind === 'string'\n            ? new HierarchicalKind(arg.kind)\n            : defaultKind;\n    }\n    static getPreferredUser(arg) {\n        return typeof arg.preferred === 'boolean'\n            ? arg.preferred\n            : false;\n    }\n    constructor(kind, apply, preferred) {\n        this.kind = kind;\n        this.apply = apply;\n        this.preferred = preferred;\n    }\n}\nclass CodeActionItem {\n    constructor(action, provider, highlightRange) {\n        this.action = action;\n        this.provider = provider;\n        this.highlightRange = highlightRange;\n    }\n    async resolve(token) {\n        if (this.provider?.resolveCodeAction && !this.action.edit) {\n            let action;\n            try {\n                action = await this.provider.resolveCodeAction(this.action, token);\n            }\n            catch (err) {\n                onUnexpectedExternalError(err);\n            }\n            if (action) {\n                this.action.edit = action.edit;\n            }\n        }\n        return this;\n    }\n}\n\nexport { CodeActionCommandArgs, CodeActionItem, CodeActionKind, CodeActionTriggerSource, filtersAction, mayIncludeActionsOfKind };\n","import { equals, coalesce, isNonEmptyArray } from '../../../../base/common/arrays.js';\nimport { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { illegalArgument, isCancellationError, onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { HierarchicalKind } from '../../../../base/common/hierarchicalKind.js';\nimport { DisposableStore, Disposable } from '../../../../base/common/lifecycle.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { localize } from '../../../../nls.js';\nimport { IAccessibilitySignalService, AccessibilitySignal } from '../../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';\nimport { CommandsRegistry, ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { INotificationService } from '../../../../platform/notification/common/notification.js';\nimport { Progress } from '../../../../platform/progress/common/progress.js';\nimport { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js';\nimport { IBulkEditService } from '../../../browser/services/bulkEditService.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { ProviderId } from '../../../common/languages.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { IModelService } from '../../../common/services/model.js';\nimport { EditSources } from '../../../common/textModelEditSource.js';\nimport { TextModelCancellationTokenSource } from '../../editorState/browser/editorState.js';\nimport { CodeActionTriggerSource, CodeActionKind, filtersAction, CodeActionItem, mayIncludeActionsOfKind } from '../common/types.js';\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 *--------------------------------------------------------------------------------------------*/\nconst codeActionCommandId = 'editor.action.codeAction';\nconst quickFixCommandId = 'editor.action.quickFix';\nconst autoFixCommandId = 'editor.action.autoFix';\nconst refactorCommandId = 'editor.action.refactor';\nconst sourceActionCommandId = 'editor.action.sourceAction';\nconst organizeImportsCommandId = 'editor.action.organizeImports';\nconst fixAllCommandId = 'editor.action.fixAll';\nconst CODE_ACTION_SOUND_APPLIED_DURATION = 1000;\nclass ManagedCodeActionSet extends Disposable {\n    static codeActionsPreferredComparator(a, b) {\n        if (a.isPreferred && !b.isPreferred) {\n            return -1;\n        }\n        else if (!a.isPreferred && b.isPreferred) {\n            return 1;\n        }\n        else {\n            return 0;\n        }\n    }\n    static codeActionsComparator({ action: a }, { action: b }) {\n        if (a.isAI && !b.isAI) {\n            return 1;\n        }\n        else if (!a.isAI && b.isAI) {\n            return -1;\n        }\n        if (isNonEmptyArray(a.diagnostics)) {\n            return isNonEmptyArray(b.diagnostics) ? ManagedCodeActionSet.codeActionsPreferredComparator(a, b) : -1;\n        }\n        else if (isNonEmptyArray(b.diagnostics)) {\n            return 1;\n        }\n        else {\n            return ManagedCodeActionSet.codeActionsPreferredComparator(a, b); // both have no diagnostics\n        }\n    }\n    constructor(actions, documentation, disposables) {\n        super();\n        this.documentation = documentation;\n        this._register(disposables);\n        this.allActions = [...actions].sort(ManagedCodeActionSet.codeActionsComparator);\n        this.validActions = this.allActions.filter(({ action }) => !action.disabled);\n    }\n    get hasAutoFix() {\n        return this.validActions.some(({ action: fix }) => !!fix.kind && CodeActionKind.QuickFix.contains(new HierarchicalKind(fix.kind)) && !!fix.isPreferred);\n    }\n    get hasAIFix() {\n        return this.validActions.some(({ action: fix }) => !!fix.isAI);\n    }\n    get allAIFixes() {\n        return this.validActions.every(({ action: fix }) => !!fix.isAI);\n    }\n}\nconst emptyCodeActionsResponse = { actions: [], documentation: undefined };\nasync function getCodeActions(registry, model, rangeOrSelection, trigger, progress, token) {\n    const filter = trigger.filter || {};\n    const notebookFilter = {\n        ...filter,\n        excludes: [...(filter.excludes || []), CodeActionKind.Notebook],\n    };\n    const codeActionContext = {\n        only: filter.include?.value,\n        trigger: trigger.type,\n    };\n    const cts = new TextModelCancellationTokenSource(model, token);\n    // if the trigger is auto (autosave, lightbulb, etc), we should exclude notebook codeActions\n    const excludeNotebookCodeActions = (trigger.type === 2 /* languages.CodeActionTriggerType.Auto */);\n    const providers = getCodeActionProviders(registry, model, (excludeNotebookCodeActions) ? notebookFilter : filter);\n    const disposables = new DisposableStore();\n    const promises = providers.map(async (provider) => {\n        const handle = setTimeout(() => progress.report(provider), 1250);\n        try {\n            const providedCodeActions = await provider.provideCodeActions(model, rangeOrSelection, codeActionContext, cts.token);\n            if (cts.token.isCancellationRequested) {\n                providedCodeActions?.dispose();\n                return emptyCodeActionsResponse;\n            }\n            if (providedCodeActions) {\n                disposables.add(providedCodeActions);\n            }\n            const filteredActions = (providedCodeActions?.actions || []).filter(action => action && filtersAction(filter, action));\n            const documentation = getDocumentationFromProvider(provider, filteredActions, filter.include);\n            return {\n                actions: filteredActions.map(action => new CodeActionItem(action, provider)),\n                documentation\n            };\n        }\n        catch (err) {\n            if (isCancellationError(err)) {\n                throw err;\n            }\n            onUnexpectedExternalError(err);\n            return emptyCodeActionsResponse;\n        }\n        finally {\n            clearTimeout(handle);\n        }\n    });\n    const listener = registry.onDidChange(() => {\n        const newProviders = registry.all(model);\n        if (!equals(newProviders, providers)) {\n            cts.cancel();\n        }\n    });\n    try {\n        const actions = await Promise.all(promises);\n        const allActions = actions.map(x => x.actions).flat();\n        const allDocumentation = [\n            ...coalesce(actions.map(x => x.documentation)),\n            ...getAdditionalDocumentationForShowingActions(registry, model, trigger, allActions)\n        ];\n        const managedCodeActionSet = new ManagedCodeActionSet(allActions, allDocumentation, disposables);\n        disposables.add(managedCodeActionSet);\n        return managedCodeActionSet;\n    }\n    catch (err) {\n        disposables.dispose();\n        throw err;\n    }\n    finally {\n        listener.dispose();\n        cts.dispose();\n    }\n}\nfunction getCodeActionProviders(registry, model, filter) {\n    return registry.all(model)\n        // Don't include providers that we know will not return code actions of interest\n        .filter(provider => {\n        if (!provider.providedCodeActionKinds) {\n            // We don't know what type of actions this provider will return.\n            return true;\n        }\n        return provider.providedCodeActionKinds.some(kind => mayIncludeActionsOfKind(filter, new HierarchicalKind(kind)));\n    });\n}\nfunction* getAdditionalDocumentationForShowingActions(registry, model, trigger, actionsToShow) {\n    if (model && actionsToShow.length) {\n        for (const provider of registry.all(model)) {\n            if (provider._getAdditionalMenuItems) {\n                yield* provider._getAdditionalMenuItems?.({ trigger: trigger.type, only: trigger.filter?.include?.value }, actionsToShow.map(item => item.action));\n            }\n        }\n    }\n}\nfunction getDocumentationFromProvider(provider, providedCodeActions, only) {\n    if (!provider.documentation) {\n        return undefined;\n    }\n    const documentation = provider.documentation.map(entry => ({ kind: new HierarchicalKind(entry.kind), command: entry.command }));\n    if (only) {\n        let currentBest;\n        for (const entry of documentation) {\n            if (entry.kind.contains(only)) {\n                if (!currentBest) {\n                    currentBest = entry;\n                }\n                else {\n                    // Take best match\n                    if (currentBest.kind.contains(entry.kind)) {\n                        currentBest = entry;\n                    }\n                }\n            }\n        }\n        if (currentBest) {\n            return currentBest?.command;\n        }\n    }\n    // Otherwise, check to see if any of the provided actions match.\n    for (const action of providedCodeActions) {\n        if (!action.kind) {\n            continue;\n        }\n        for (const entry of documentation) {\n            if (entry.kind.contains(new HierarchicalKind(action.kind))) {\n                return entry.command;\n            }\n        }\n    }\n    return undefined;\n}\nvar ApplyCodeActionReason;\n(function (ApplyCodeActionReason) {\n    ApplyCodeActionReason[\"OnSave\"] = \"onSave\";\n    ApplyCodeActionReason[\"FromProblemsView\"] = \"fromProblemsView\";\n    ApplyCodeActionReason[\"FromCodeActions\"] = \"fromCodeActions\";\n    ApplyCodeActionReason[\"FromAILightbulb\"] = \"fromAILightbulb\";\n    ApplyCodeActionReason[\"FromProblemsHover\"] = \"fromProblemsHover\";\n})(ApplyCodeActionReason || (ApplyCodeActionReason = {}));\nasync function applyCodeAction(accessor, item, codeActionReason, options, token = CancellationToken.None) {\n    const bulkEditService = accessor.get(IBulkEditService);\n    const commandService = accessor.get(ICommandService);\n    const telemetryService = accessor.get(ITelemetryService);\n    const notificationService = accessor.get(INotificationService);\n    const accessibilitySignalService = accessor.get(IAccessibilitySignalService);\n    telemetryService.publicLog2('codeAction.applyCodeAction', {\n        codeActionTitle: item.action.title,\n        codeActionKind: item.action.kind,\n        codeActionIsPreferred: !!item.action.isPreferred,\n        reason: codeActionReason,\n    });\n    accessibilitySignalService.playSignal(AccessibilitySignal.codeActionTriggered);\n    await item.resolve(token);\n    if (token.isCancellationRequested) {\n        return;\n    }\n    if (item.action.edit?.edits.length) {\n        const result = await bulkEditService.apply(item.action.edit, {\n            editor: options?.editor,\n            label: item.action.title,\n            quotableLabel: item.action.title,\n            code: 'undoredo.codeAction',\n            respectAutoSaveConfig: codeActionReason !== ApplyCodeActionReason.OnSave,\n            showPreview: options?.preview,\n            reason: EditSources.codeAction({ kind: item.action.kind, providerId: ProviderId.fromExtensionId(item.provider?.extensionId) }),\n        });\n        if (!result.isApplied) {\n            return;\n        }\n    }\n    if (item.action.command) {\n        try {\n            await commandService.executeCommand(item.action.command.id, ...(item.action.command.arguments || []));\n        }\n        catch (err) {\n            const message = asMessage(err);\n            notificationService.error(typeof message === 'string'\n                ? message\n                : localize(830, \"An unknown error occurred while applying the code action\"));\n        }\n    }\n    // ensure the start sound and end sound do not overlap\n    setTimeout(() => accessibilitySignalService.playSignal(AccessibilitySignal.codeActionApplied), CODE_ACTION_SOUND_APPLIED_DURATION);\n}\nfunction asMessage(err) {\n    if (typeof err === 'string') {\n        return err;\n    }\n    else if (err instanceof Error && typeof err.message === 'string') {\n        return err.message;\n    }\n    else {\n        return undefined;\n    }\n}\nCommandsRegistry.registerCommand('_executeCodeActionProvider', async function (accessor, resource, rangeOrSelection, kind, itemResolveCount) {\n    if (!(resource instanceof URI)) {\n        throw illegalArgument();\n    }\n    const { codeActionProvider } = accessor.get(ILanguageFeaturesService);\n    const model = accessor.get(IModelService).getModel(resource);\n    if (!model) {\n        throw illegalArgument();\n    }\n    const validatedRangeOrSelection = Selection.isISelection(rangeOrSelection)\n        ? Selection.liftSelection(rangeOrSelection)\n        : Range.isIRange(rangeOrSelection)\n            ? model.validateRange(rangeOrSelection)\n            : undefined;\n    if (!validatedRangeOrSelection) {\n        throw illegalArgument();\n    }\n    const include = typeof kind === 'string' ? new HierarchicalKind(kind) : undefined;\n    const codeActionSet = await getCodeActions(codeActionProvider, model, validatedRangeOrSelection, { type: 1 /* languages.CodeActionTriggerType.Invoke */, triggerAction: CodeActionTriggerSource.Default, filter: { includeSourceActions: true, include } }, Progress.None, CancellationToken.None);\n    const resolving = [];\n    const resolveCount = Math.min(codeActionSet.validActions.length, typeof itemResolveCount === 'number' ? itemResolveCount : 0);\n    for (let i = 0; i < resolveCount; i++) {\n        resolving.push(codeActionSet.validActions[i].resolve(CancellationToken.None));\n    }\n    try {\n        await Promise.all(resolving);\n        return codeActionSet.validActions.map(item => item.action);\n    }\n    finally {\n        setTimeout(() => codeActionSet.dispose(), 100);\n    }\n});\n\nexport { ApplyCodeActionReason, applyCodeAction, autoFixCommandId, codeActionCommandId, fixAllCommandId, getCodeActions, organizeImportsCommandId, quickFixCommandId, refactorCommandId, sourceActionCommandId };\n","import Severity from '../../../base/common/severity.js';\nimport { localize } from '../../../nls.js';\nimport { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nvar MarkerSeverity;\n(function (MarkerSeverity) {\n    MarkerSeverity[MarkerSeverity[\"Hint\"] = 1] = \"Hint\";\n    MarkerSeverity[MarkerSeverity[\"Info\"] = 2] = \"Info\";\n    MarkerSeverity[MarkerSeverity[\"Warning\"] = 4] = \"Warning\";\n    MarkerSeverity[MarkerSeverity[\"Error\"] = 8] = \"Error\";\n})(MarkerSeverity || (MarkerSeverity = {}));\n(function (MarkerSeverity) {\n    function compare(a, b) {\n        return b - a;\n    }\n    MarkerSeverity.compare = compare;\n    const _displayStrings = Object.create(null);\n    _displayStrings[MarkerSeverity.Error] = localize(1732, \"Error\");\n    _displayStrings[MarkerSeverity.Warning] = localize(1733, \"Warning\");\n    _displayStrings[MarkerSeverity.Info] = localize(1734, \"Info\");\n    function toString(a) {\n        return _displayStrings[a] || '';\n    }\n    MarkerSeverity.toString = toString;\n    const _displayStringsPlural = Object.create(null);\n    _displayStringsPlural[MarkerSeverity.Error] = localize(1735, \"Errors\");\n    _displayStringsPlural[MarkerSeverity.Warning] = localize(1736, \"Warnings\");\n    _displayStringsPlural[MarkerSeverity.Info] = localize(1737, \"Infos\");\n    function toStringPlural(a) {\n        return _displayStringsPlural[a] || '';\n    }\n    MarkerSeverity.toStringPlural = toStringPlural;\n    function fromSeverity(severity) {\n        switch (severity) {\n            case Severity.Error: return MarkerSeverity.Error;\n            case Severity.Warning: return MarkerSeverity.Warning;\n            case Severity.Info: return MarkerSeverity.Info;\n            case Severity.Ignore: return MarkerSeverity.Hint;\n        }\n    }\n    MarkerSeverity.fromSeverity = fromSeverity;\n    function toSeverity(severity) {\n        switch (severity) {\n            case MarkerSeverity.Error: return Severity.Error;\n            case MarkerSeverity.Warning: return Severity.Warning;\n            case MarkerSeverity.Info: return Severity.Info;\n            case MarkerSeverity.Hint: return Severity.Ignore;\n        }\n    }\n    MarkerSeverity.toSeverity = toSeverity;\n})(MarkerSeverity || (MarkerSeverity = {}));\nvar IMarkerData;\n(function (IMarkerData) {\n    const emptyString = '';\n    function makeKey(markerData) {\n        return makeKeyOptionalMessage(markerData, true);\n    }\n    IMarkerData.makeKey = makeKey;\n    function makeKeyOptionalMessage(markerData, useMessage) {\n        const result = [emptyString];\n        if (markerData.source) {\n            result.push(markerData.source.replace('¦', '\\\\¦'));\n        }\n        else {\n            result.push(emptyString);\n        }\n        if (markerData.code) {\n            if (typeof markerData.code === 'string') {\n                result.push(markerData.code.replace('¦', '\\\\¦'));\n            }\n            else {\n                result.push(markerData.code.value.replace('¦', '\\\\¦'));\n            }\n        }\n        else {\n            result.push(emptyString);\n        }\n        if (markerData.severity !== undefined && markerData.severity !== null) {\n            result.push(MarkerSeverity.toString(markerData.severity));\n        }\n        else {\n            result.push(emptyString);\n        }\n        // Modifed to not include the message as part of the marker key to work around\n        // https://github.com/microsoft/vscode/issues/77475\n        if (markerData.message && useMessage) {\n            result.push(markerData.message.replace('¦', '\\\\¦'));\n        }\n        else {\n            result.push(emptyString);\n        }\n        if (markerData.startLineNumber !== undefined && markerData.startLineNumber !== null) {\n            result.push(markerData.startLineNumber.toString());\n        }\n        else {\n            result.push(emptyString);\n        }\n        if (markerData.startColumn !== undefined && markerData.startColumn !== null) {\n            result.push(markerData.startColumn.toString());\n        }\n        else {\n            result.push(emptyString);\n        }\n        if (markerData.endLineNumber !== undefined && markerData.endLineNumber !== null) {\n            result.push(markerData.endLineNumber.toString());\n        }\n        else {\n            result.push(emptyString);\n        }\n        if (markerData.endColumn !== undefined && markerData.endColumn !== null) {\n            result.push(markerData.endColumn.toString());\n        }\n        else {\n            result.push(emptyString);\n        }\n        result.push(emptyString);\n        return result.join('¦');\n    }\n    IMarkerData.makeKeyOptionalMessage = makeKeyOptionalMessage;\n})(IMarkerData || (IMarkerData = {}));\nconst IMarkerService = createDecorator('markerService');\n\nexport { IMarkerData, IMarkerService, MarkerSeverity };\n","import { HierarchicalKind } from '../../../../base/common/hierarchicalKind.js';\nimport { Lazy } from '../../../../base/common/lazy.js';\nimport { refactorCommandId, codeActionCommandId, sourceActionCommandId, organizeImportsCommandId, fixAllCommandId } from './codeAction.js';\nimport { CodeActionKind, CodeActionCommandArgs } from '../common/types.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar CodeActionKeybindingResolver_1;\nlet CodeActionKeybindingResolver = class CodeActionKeybindingResolver {\n    static { CodeActionKeybindingResolver_1 = this; }\n    static { this.codeActionCommands = [\n        refactorCommandId,\n        codeActionCommandId,\n        sourceActionCommandId,\n        organizeImportsCommandId,\n        fixAllCommandId\n    ]; }\n    constructor(keybindingService) {\n        this.keybindingService = keybindingService;\n    }\n    getResolver() {\n        // Lazy since we may not actually ever read the value\n        const allCodeActionBindings = new Lazy(() => this.keybindingService.getKeybindings()\n            .filter(item => CodeActionKeybindingResolver_1.codeActionCommands.indexOf(item.command) >= 0)\n            .filter(item => item.resolvedKeybinding)\n            .map((item) => {\n            // Special case these commands since they come built-in with VS Code and don't use 'commandArgs'\n            let commandArgs = item.commandArgs;\n            if (item.command === organizeImportsCommandId) {\n                commandArgs = { kind: CodeActionKind.SourceOrganizeImports.value };\n            }\n            else if (item.command === fixAllCommandId) {\n                commandArgs = { kind: CodeActionKind.SourceFixAll.value };\n            }\n            return {\n                resolvedKeybinding: item.resolvedKeybinding,\n                ...CodeActionCommandArgs.fromUser(commandArgs, {\n                    kind: HierarchicalKind.None,\n                    apply: \"never\" /* CodeActionAutoApply.Never */\n                })\n            };\n        }));\n        return (action) => {\n            if (action.kind) {\n                const binding = this.bestKeybindingForCodeAction(action, allCodeActionBindings.value);\n                return binding?.resolvedKeybinding;\n            }\n            return undefined;\n        };\n    }\n    bestKeybindingForCodeAction(action, candidates) {\n        if (!action.kind) {\n            return undefined;\n        }\n        const kind = new HierarchicalKind(action.kind);\n        return candidates\n            .filter(candidate => candidate.kind.contains(kind))\n            .filter(candidate => {\n            if (candidate.preferred) {\n                // If the candidate keybinding only applies to preferred actions, the this action must also be preferred\n                return action.isPreferred;\n            }\n            return true;\n        })\n            .reduceRight((currentBest, candidate) => {\n            if (!currentBest) {\n                return candidate;\n            }\n            // Select the more specific binding\n            return currentBest.kind.contains(candidate.kind) ? candidate : currentBest;\n        }, undefined);\n    }\n};\nCodeActionKeybindingResolver = CodeActionKeybindingResolver_1 = __decorate([\n    __param(0, IKeybindingService)\n], CodeActionKeybindingResolver);\n\nexport { CodeActionKeybindingResolver };\n","import './symbolIcons.css';\nimport { localize } from '../../../../nls.js';\nimport { registerColor } from '../../../../platform/theme/common/colorUtils.js';\nimport { foreground } from '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterColor('symbolIcon.arrayForeground', foreground, localize(1495, 'The foreground color for array symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.booleanForeground', foreground, localize(1496, 'The foreground color for boolean symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.classForeground', {\n    dark: '#EE9D28',\n    light: '#D67E00',\n    hcDark: '#EE9D28',\n    hcLight: '#D67E00'\n}, localize(1497, 'The foreground color for class symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.colorForeground', foreground, localize(1498, 'The foreground color for color symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.constantForeground', foreground, localize(1499, 'The foreground color for constant symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.constructorForeground', {\n    dark: '#B180D7',\n    light: '#652D90',\n    hcDark: '#B180D7',\n    hcLight: '#652D90'\n}, localize(1500, 'The foreground color for constructor symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.enumeratorForeground', {\n    dark: '#EE9D28',\n    light: '#D67E00',\n    hcDark: '#EE9D28',\n    hcLight: '#D67E00'\n}, localize(1501, 'The foreground color for enumerator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.enumeratorMemberForeground', {\n    dark: '#75BEFF',\n    light: '#007ACC',\n    hcDark: '#75BEFF',\n    hcLight: '#007ACC'\n}, localize(1502, 'The foreground color for enumerator member symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.eventForeground', {\n    dark: '#EE9D28',\n    light: '#D67E00',\n    hcDark: '#EE9D28',\n    hcLight: '#D67E00'\n}, localize(1503, 'The foreground color for event symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.fieldForeground', {\n    dark: '#75BEFF',\n    light: '#007ACC',\n    hcDark: '#75BEFF',\n    hcLight: '#007ACC'\n}, localize(1504, 'The foreground color for field symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.fileForeground', foreground, localize(1505, 'The foreground color for file symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.folderForeground', foreground, localize(1506, 'The foreground color for folder symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.functionForeground', {\n    dark: '#B180D7',\n    light: '#652D90',\n    hcDark: '#B180D7',\n    hcLight: '#652D90'\n}, localize(1507, 'The foreground color for function symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.interfaceForeground', {\n    dark: '#75BEFF',\n    light: '#007ACC',\n    hcDark: '#75BEFF',\n    hcLight: '#007ACC'\n}, localize(1508, 'The foreground color for interface symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.keyForeground', foreground, localize(1509, 'The foreground color for key symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.keywordForeground', foreground, localize(1510, 'The foreground color for keyword symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.methodForeground', {\n    dark: '#B180D7',\n    light: '#652D90',\n    hcDark: '#B180D7',\n    hcLight: '#652D90'\n}, localize(1511, 'The foreground color for method symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.moduleForeground', foreground, localize(1512, 'The foreground color for module symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.namespaceForeground', foreground, localize(1513, 'The foreground color for namespace symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.nullForeground', foreground, localize(1514, 'The foreground color for null symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.numberForeground', foreground, localize(1515, 'The foreground color for number symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.objectForeground', foreground, localize(1516, 'The foreground color for object symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.operatorForeground', foreground, localize(1517, 'The foreground color for operator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.packageForeground', foreground, localize(1518, 'The foreground color for package symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.propertyForeground', foreground, localize(1519, 'The foreground color for property symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.referenceForeground', foreground, localize(1520, 'The foreground color for reference symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.snippetForeground', foreground, localize(1521, 'The foreground color for snippet symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.stringForeground', foreground, localize(1522, 'The foreground color for string symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.structForeground', foreground, localize(1523, 'The foreground color for struct symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.textForeground', foreground, localize(1524, 'The foreground color for text symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.typeParameterForeground', foreground, localize(1525, 'The foreground color for type parameter symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.unitForeground', foreground, localize(1526, 'The foreground color for unit symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\nregisterColor('symbolIcon.variableForeground', {\n    dark: '#75BEFF',\n    light: '#007ACC',\n    hcDark: '#75BEFF',\n    hcLight: '#007ACC',\n}, localize(1527, 'The foreground color for variable symbols. These symbols appear in the outline, breadcrumb, and suggest widget.'));\n","import '../../../../base/browser/ui/codicons/codicon/codicon.css';\nimport '../../../../base/browser/ui/codicons/codicon/codicon-modifiers.css';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { CodeActionKind } from '../common/types.js';\nimport '../../symbolIcons/browser/symbolIcons.js';\nimport { localize } from '../../../../nls.js';\nimport { HierarchicalKind } from '../../../../base/common/hierarchicalKind.js';\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 *--------------------------------------------------------------------------------------------*/\nconst uncategorizedCodeActionGroup = Object.freeze({ kind: HierarchicalKind.Empty, title: localize(866, 'More Actions...') });\nconst codeActionGroups = Object.freeze([\n    { kind: CodeActionKind.QuickFix, title: localize(867, 'Quick Fix') },\n    { kind: CodeActionKind.RefactorExtract, title: localize(868, 'Extract'), icon: Codicon.wrench },\n    { kind: CodeActionKind.RefactorInline, title: localize(869, 'Inline'), icon: Codicon.wrench },\n    { kind: CodeActionKind.RefactorRewrite, title: localize(870, 'Rewrite'), icon: Codicon.wrench },\n    { kind: CodeActionKind.RefactorMove, title: localize(871, 'Move'), icon: Codicon.wrench },\n    { kind: CodeActionKind.SurroundWith, title: localize(872, 'Surround With'), icon: Codicon.surroundWith },\n    { kind: CodeActionKind.Source, title: localize(873, 'Source Action'), icon: Codicon.symbolFile },\n    uncategorizedCodeActionGroup,\n]);\nfunction toMenuItems(inputCodeActions, showHeaders, keybindingResolver) {\n    if (!showHeaders) {\n        return inputCodeActions.map((action) => {\n            return {\n                kind: \"action\" /* ActionListItemKind.Action */,\n                item: action,\n                group: uncategorizedCodeActionGroup,\n                disabled: !!action.action.disabled,\n                label: action.action.disabled || action.action.title,\n                canPreview: !!action.action.edit?.edits.length,\n            };\n        });\n    }\n    // Group code actions\n    const menuEntries = codeActionGroups.map(group => ({ group, actions: [] }));\n    for (const action of inputCodeActions) {\n        const kind = action.action.kind ? new HierarchicalKind(action.action.kind) : HierarchicalKind.None;\n        for (const menuEntry of menuEntries) {\n            if (menuEntry.group.kind.contains(kind)) {\n                menuEntry.actions.push(action);\n                break;\n            }\n        }\n    }\n    const allMenuItems = [];\n    for (const menuEntry of menuEntries) {\n        if (menuEntry.actions.length) {\n            allMenuItems.push({ kind: \"header\" /* ActionListItemKind.Header */, group: menuEntry.group });\n            for (const action of menuEntry.actions) {\n                const group = menuEntry.group;\n                allMenuItems.push({\n                    kind: \"action\" /* ActionListItemKind.Action */,\n                    item: action,\n                    group: action.action.isAI ? { title: group.title, kind: group.kind, icon: Codicon.sparkle } : group,\n                    label: action.action.title,\n                    disabled: !!action.action.disabled,\n                    keybinding: keybindingResolver(action.action),\n                });\n            }\n        }\n    }\n    return allMenuItems;\n}\n\nexport { toMenuItems };\n","import { createCancelablePromise, TimeoutTimer } from '../../../../base/common/async.js';\nimport { isCancellationError } from '../../../../base/common/errors.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { HierarchicalKind } from '../../../../base/common/hierarchicalKind.js';\nimport { Disposable, MutableDisposable } from '../../../../base/common/lifecycle.js';\nimport { isEqual } from '../../../../base/common/resources.js';\nimport { RawContextKey } from '../../../../platform/contextkey/common/contextkey.js';\nimport { Progress } from '../../../../platform/progress/common/progress.js';\nimport { ShowLightbulbIconMode } from '../../../common/config/editorOptions.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { CodeActionTriggerSource, CodeActionKind } from '../common/types.js';\nimport { getCodeActions } from './codeAction.js';\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 *--------------------------------------------------------------------------------------------*/\nconst SUPPORTED_CODE_ACTIONS = new RawContextKey('supportedCodeAction', '');\nconst APPLY_FIX_ALL_COMMAND_ID = '_typescript.applyFixAllCodeAction';\nclass CodeActionOracle extends Disposable {\n    constructor(_editor, _markerService, _signalChange, _delay = 250) {\n        super();\n        this._editor = _editor;\n        this._markerService = _markerService;\n        this._signalChange = _signalChange;\n        this._delay = _delay;\n        this._autoTriggerTimer = this._register(new TimeoutTimer());\n        this._register(this._markerService.onMarkerChanged(e => this._onMarkerChanges(e)));\n        this._register(this._editor.onDidChangeCursorPosition(() => this._tryAutoTrigger()));\n    }\n    trigger(trigger) {\n        const selection = this._getRangeOfSelectionUnlessWhitespaceEnclosed(trigger);\n        this._signalChange(selection ? { trigger, selection } : undefined);\n    }\n    _onMarkerChanges(resources) {\n        const model = this._editor.getModel();\n        if (model && resources.some(resource => isEqual(resource, model.uri))) {\n            this._tryAutoTrigger();\n        }\n    }\n    _tryAutoTrigger() {\n        this._autoTriggerTimer.cancelAndSet(() => {\n            this.trigger({ type: 2 /* CodeActionTriggerType.Auto */, triggerAction: CodeActionTriggerSource.Default });\n        }, this._delay);\n    }\n    _getRangeOfSelectionUnlessWhitespaceEnclosed(trigger) {\n        if (!this._editor.hasModel()) {\n            return undefined;\n        }\n        const selection = this._editor.getSelection();\n        if (trigger.type === 1 /* CodeActionTriggerType.Invoke */) {\n            return selection;\n        }\n        const enabled = this._editor.getOption(73 /* EditorOption.lightbulb */).enabled;\n        if (enabled === ShowLightbulbIconMode.Off) {\n            return undefined;\n        }\n        else if (enabled === ShowLightbulbIconMode.On) {\n            return selection;\n        }\n        else if (enabled === ShowLightbulbIconMode.OnCode) {\n            const isSelectionEmpty = selection.isEmpty();\n            if (!isSelectionEmpty) {\n                return selection;\n            }\n            const model = this._editor.getModel();\n            const { lineNumber, column } = selection.getPosition();\n            const line = model.getLineContent(lineNumber);\n            if (line.length === 0) {\n                // empty line\n                return undefined;\n            }\n            else if (column === 1) {\n                // look only right\n                if (/\\s/.test(line[0])) {\n                    return undefined;\n                }\n            }\n            else if (column === model.getLineMaxColumn(lineNumber)) {\n                // look only left\n                if (/\\s/.test(line[line.length - 1])) {\n                    return undefined;\n                }\n            }\n            else {\n                // look left and right\n                if (/\\s/.test(line[column - 2]) && /\\s/.test(line[column - 1])) {\n                    return undefined;\n                }\n            }\n        }\n        return selection;\n    }\n}\nvar CodeActionsState;\n(function (CodeActionsState) {\n    CodeActionsState.Empty = { type: 0 /* Type.Empty */ };\n    class Triggered {\n        constructor(trigger, position, _cancellablePromise) {\n            this.trigger = trigger;\n            this.position = position;\n            this._cancellablePromise = _cancellablePromise;\n            this.type = 1 /* Type.Triggered */;\n            this.actions = _cancellablePromise.catch((e) => {\n                if (isCancellationError(e)) {\n                    return emptyCodeActionSet;\n                }\n                throw e;\n            });\n        }\n        cancel() {\n            this._cancellablePromise.cancel();\n        }\n    }\n    CodeActionsState.Triggered = Triggered;\n})(CodeActionsState || (CodeActionsState = {}));\nconst emptyCodeActionSet = Object.freeze({\n    allActions: [],\n    validActions: [],\n    dispose: () => { },\n    documentation: [],\n    hasAutoFix: false,\n    hasAIFix: false,\n    allAIFixes: false,\n});\nclass CodeActionModel extends Disposable {\n    constructor(_editor, _registry, _markerService, contextKeyService, _progressService, _configurationService) {\n        super();\n        this._editor = _editor;\n        this._registry = _registry;\n        this._markerService = _markerService;\n        this._progressService = _progressService;\n        this._configurationService = _configurationService;\n        this._codeActionOracle = this._register(new MutableDisposable());\n        this._state = CodeActionsState.Empty;\n        this._onDidChangeState = this._register(new Emitter());\n        this.onDidChangeState = this._onDidChangeState.event;\n        this.codeActionsDisposable = this._register(new MutableDisposable());\n        this._disposed = false;\n        this._supportedCodeActions = SUPPORTED_CODE_ACTIONS.bindTo(contextKeyService);\n        this._register(this._editor.onDidChangeModel(() => this._update()));\n        this._register(this._editor.onDidChangeModelLanguage(() => this._update()));\n        this._register(this._registry.onDidChange(() => this._update()));\n        this._register(this._editor.onDidChangeConfiguration((e) => {\n            if (e.hasChanged(73 /* EditorOption.lightbulb */)) {\n                this._update();\n            }\n        }));\n        this._update();\n    }\n    dispose() {\n        if (this._disposed) {\n            return;\n        }\n        this._disposed = true;\n        super.dispose();\n        this.setState(CodeActionsState.Empty, true);\n    }\n    _settingEnabledNearbyQuickfixes() {\n        const model = this._editor?.getModel();\n        return this._configurationService ? this._configurationService.getValue('editor.codeActionWidget.includeNearbyQuickFixes', { resource: model?.uri }) : false;\n    }\n    _update() {\n        if (this._disposed) {\n            return;\n        }\n        this._codeActionOracle.value = undefined;\n        this.setState(CodeActionsState.Empty);\n        const model = this._editor.getModel();\n        if (model\n            && this._registry.has(model)\n            && !this._editor.getOption(104 /* EditorOption.readOnly */)) {\n            const supportedActions = this._registry.all(model).flatMap(provider => provider.providedCodeActionKinds ?? []);\n            this._supportedCodeActions.set(supportedActions.join(' '));\n            this._codeActionOracle.value = new CodeActionOracle(this._editor, this._markerService, trigger => {\n                if (!trigger) {\n                    this.setState(CodeActionsState.Empty);\n                    return;\n                }\n                const startPosition = trigger.selection.getStartPosition();\n                const actions = createCancelablePromise(async (token) => {\n                    if (this._settingEnabledNearbyQuickfixes() && trigger.trigger.type === 1 /* CodeActionTriggerType.Invoke */ && (trigger.trigger.triggerAction === CodeActionTriggerSource.QuickFix || trigger.trigger.filter?.include?.contains(CodeActionKind.QuickFix))) {\n                        const codeActionSet = await getCodeActions(this._registry, model, trigger.selection, trigger.trigger, Progress.None, token);\n                        this.codeActionsDisposable.value = codeActionSet;\n                        const allCodeActions = [...codeActionSet.allActions];\n                        if (token.isCancellationRequested) {\n                            codeActionSet.dispose();\n                            return emptyCodeActionSet;\n                        }\n                        // Search for non-AI quickfixes in the current code action set - if AI code actions are the only thing found, continue searching for diagnostics in line.\n                        const foundQuickfix = codeActionSet.validActions?.some(action => {\n                            return action.action.kind &&\n                                CodeActionKind.QuickFix.contains(new HierarchicalKind(action.action.kind)) &&\n                                !action.action.isAI;\n                        });\n                        const allMarkers = this._markerService.read({ resource: model.uri });\n                        if (foundQuickfix) {\n                            for (const action of codeActionSet.validActions) {\n                                if (action.action.command?.arguments?.some(arg => typeof arg === 'string' && arg.includes(APPLY_FIX_ALL_COMMAND_ID))) {\n                                    action.action.diagnostics = [...allMarkers.filter(marker => marker.relatedInformation)];\n                                }\n                            }\n                            return { validActions: codeActionSet.validActions, allActions: allCodeActions, documentation: codeActionSet.documentation, hasAutoFix: codeActionSet.hasAutoFix, hasAIFix: codeActionSet.hasAIFix, allAIFixes: codeActionSet.allAIFixes, dispose: () => { this.codeActionsDisposable.value = codeActionSet; } };\n                        }\n                        else if (!foundQuickfix) {\n                            // If markers exist, and there are no quickfixes found or length is zero, check for quickfixes on that line.\n                            if (allMarkers.length > 0) {\n                                const currPosition = trigger.selection.getPosition();\n                                let trackedPosition = currPosition;\n                                let distance = Number.MAX_VALUE;\n                                const currentActions = [...codeActionSet.validActions];\n                                for (const marker of allMarkers) {\n                                    const col = marker.endColumn;\n                                    const row = marker.endLineNumber;\n                                    const startRow = marker.startLineNumber;\n                                    // Found quickfix on the same line and check relative distance to other markers\n                                    if ((row === currPosition.lineNumber || startRow === currPosition.lineNumber)) {\n                                        trackedPosition = new Position(row, col);\n                                        const newCodeActionTrigger = {\n                                            type: trigger.trigger.type,\n                                            triggerAction: trigger.trigger.triggerAction,\n                                            filter: { include: trigger.trigger.filter?.include ? trigger.trigger.filter?.include : CodeActionKind.QuickFix },\n                                            autoApply: trigger.trigger.autoApply,\n                                            context: { notAvailableMessage: trigger.trigger.context?.notAvailableMessage || '', position: trackedPosition }\n                                        };\n                                        const selectionAsPosition = new Selection(trackedPosition.lineNumber, trackedPosition.column, trackedPosition.lineNumber, trackedPosition.column);\n                                        const actionsAtMarker = await getCodeActions(this._registry, model, selectionAsPosition, newCodeActionTrigger, Progress.None, token);\n                                        if (token.isCancellationRequested) {\n                                            actionsAtMarker.dispose();\n                                            return emptyCodeActionSet;\n                                        }\n                                        if (actionsAtMarker.validActions.length !== 0) {\n                                            for (const action of actionsAtMarker.validActions) {\n                                                if (action.action.command?.arguments?.some(arg => typeof arg === 'string' && arg.includes(APPLY_FIX_ALL_COMMAND_ID))) {\n                                                    action.action.diagnostics = [...allMarkers.filter(marker => marker.relatedInformation)];\n                                                }\n                                            }\n                                            if (codeActionSet.allActions.length === 0) {\n                                                allCodeActions.push(...actionsAtMarker.allActions);\n                                            }\n                                            // Already filtered through to only get quickfixes, so no need to filter again.\n                                            if (Math.abs(currPosition.column - col) < distance) {\n                                                currentActions.unshift(...actionsAtMarker.validActions);\n                                            }\n                                            else {\n                                                currentActions.push(...actionsAtMarker.validActions);\n                                            }\n                                        }\n                                        distance = Math.abs(currPosition.column - col);\n                                    }\n                                }\n                                const filteredActions = currentActions.filter((action, index, self) => self.findIndex((a) => a.action.title === action.action.title) === index);\n                                filteredActions.sort((a, b) => {\n                                    if (a.action.isPreferred && !b.action.isPreferred) {\n                                        return -1;\n                                    }\n                                    else if (!a.action.isPreferred && b.action.isPreferred) {\n                                        return 1;\n                                    }\n                                    else if (a.action.isAI && !b.action.isAI) {\n                                        return 1;\n                                    }\n                                    else if (!a.action.isAI && b.action.isAI) {\n                                        return -1;\n                                    }\n                                    else {\n                                        return 0;\n                                    }\n                                });\n                                // Only retriggers if actually found quickfix on the same line as cursor\n                                return { validActions: filteredActions, allActions: allCodeActions, documentation: codeActionSet.documentation, hasAutoFix: codeActionSet.hasAutoFix, hasAIFix: codeActionSet.hasAIFix, allAIFixes: codeActionSet.allAIFixes, dispose: () => { this.codeActionsDisposable.value = codeActionSet; } };\n                            }\n                        }\n                    }\n                    // Case for manual triggers - specifically Source Actions and Refactors\n                    if (trigger.trigger.type === 1 /* CodeActionTriggerType.Invoke */) {\n                        const codeActions = await getCodeActions(this._registry, model, trigger.selection, trigger.trigger, Progress.None, token);\n                        this.codeActionsDisposable.value = codeActions;\n                        return codeActions;\n                    }\n                    const codeActionSet = await getCodeActions(this._registry, model, trigger.selection, trigger.trigger, Progress.None, token);\n                    this.codeActionsDisposable.value = codeActionSet;\n                    return codeActionSet;\n                });\n                if (trigger.trigger.type === 1 /* CodeActionTriggerType.Invoke */) {\n                    this._progressService?.showWhile(actions, 250);\n                }\n                const newState = new CodeActionsState.Triggered(trigger.trigger, startPosition, actions);\n                let isManualToAutoTransition = false;\n                if (this._state.type === 1 /* CodeActionsState.Type.Triggered */) {\n                    // Check if the current state is manual and the new state is automatic\n                    isManualToAutoTransition = this._state.trigger.type === 1 /* CodeActionTriggerType.Invoke */ &&\n                        newState.type === 1 /* CodeActionsState.Type.Triggered */ &&\n                        newState.trigger.type === 2 /* CodeActionTriggerType.Auto */ &&\n                        this._state.position !== newState.position;\n                }\n                // Do not trigger state if current state is manual and incoming state is automatic\n                if (!isManualToAutoTransition) {\n                    this.setState(newState);\n                }\n                else {\n                    // Reset the new state after getting code actions back.\n                    setTimeout(() => {\n                        this.setState(newState);\n                    }, 500);\n                }\n            }, undefined);\n            this._codeActionOracle.value.trigger({ type: 2 /* CodeActionTriggerType.Auto */, triggerAction: CodeActionTriggerSource.Default });\n        }\n        else {\n            this._supportedCodeActions.reset();\n        }\n    }\n    trigger(trigger) {\n        this._codeActionOracle.value?.trigger(trigger);\n        this.codeActionsDisposable.dispose();\n    }\n    setState(newState, skipNotify) {\n        if (newState === this._state) {\n            return;\n        }\n        // Cancel old request\n        if (this._state.type === 1 /* CodeActionsState.Type.Triggered */) {\n            this._state.cancel();\n        }\n        this._state = newState;\n        if (!skipNotify && !this._disposed) {\n            this._onDidChangeState.fire(newState);\n        }\n    }\n}\n\nexport { APPLY_FIX_ALL_COMMAND_ID, CodeActionModel, CodeActionsState, SUPPORTED_CODE_ACTIONS };\n","import { $, addStandardDisposableGenericMouseDownListener, addDisposableListener, getDomNodePagePosition } from '../../../../base/browser/dom.js';\nimport { Gesture } from '../../../../base/browser/touch.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { Emitter, Event } from '../../../../base/common/event.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\nimport './lightBulbWidget.css';\nimport { GlyphMarginLane } from '../../../common/model.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { computeIndentLevel } from '../../../common/model/utils.js';\nimport { autoFixCommandId, quickFixCommandId } from './codeAction.js';\nimport { localize } from '../../../../nls.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { registerIcon } from '../../../../platform/theme/common/iconRegistry.js';\nimport { Range } from '../../../common/core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar LightBulbWidget_1;\nconst GUTTER_LIGHTBULB_ICON = registerIcon('gutter-lightbulb', Codicon.lightBulb, localize(874, 'Icon which spawns code actions menu from the gutter when there is no space in the editor.'));\nconst GUTTER_LIGHTBULB_AUTO_FIX_ICON = registerIcon('gutter-lightbulb-auto-fix', Codicon.lightbulbAutofix, localize(875, 'Icon which spawns code actions menu from the gutter when there is no space in the editor and a quick fix is available.'));\nconst GUTTER_LIGHTBULB_AIFIX_ICON = registerIcon('gutter-lightbulb-sparkle', Codicon.lightbulbSparkle, localize(876, 'Icon which spawns code actions menu from the gutter when there is no space in the editor and an AI fix is available.'));\nconst GUTTER_LIGHTBULB_AIFIX_AUTO_FIX_ICON = registerIcon('gutter-lightbulb-aifix-auto-fix', Codicon.lightbulbSparkleAutofix, localize(877, 'Icon which spawns code actions menu from the gutter when there is no space in the editor and an AI fix and a quick fix is available.'));\nconst GUTTER_SPARKLE_FILLED_ICON = registerIcon('gutter-lightbulb-sparkle-filled', Codicon.sparkleFilled, localize(878, 'Icon which spawns code actions menu from the gutter when there is no space in the editor and an AI fix and a quick fix is available.'));\nvar LightBulbState;\n(function (LightBulbState) {\n    LightBulbState.Hidden = { type: 0 /* Type.Hidden */ };\n    class Showing {\n        constructor(actions, trigger, editorPosition, widgetPosition) {\n            this.actions = actions;\n            this.trigger = trigger;\n            this.editorPosition = editorPosition;\n            this.widgetPosition = widgetPosition;\n            this.type = 1 /* Type.Showing */;\n        }\n    }\n    LightBulbState.Showing = Showing;\n})(LightBulbState || (LightBulbState = {}));\nlet LightBulbWidget = class LightBulbWidget extends Disposable {\n    static { LightBulbWidget_1 = this; }\n    static { this.GUTTER_DECORATION = ModelDecorationOptions.register({\n        description: 'codicon-gutter-lightbulb-decoration',\n        glyphMarginClassName: ThemeIcon.asClassName(Codicon.lightBulb),\n        glyphMargin: { position: GlyphMarginLane.Left },\n        stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n    }); }\n    static { this.ID = 'editor.contrib.lightbulbWidget'; }\n    static { this._posPref = [0 /* ContentWidgetPositionPreference.EXACT */]; }\n    constructor(_editor, _keybindingService) {\n        super();\n        this._editor = _editor;\n        this._keybindingService = _keybindingService;\n        this._onClick = this._register(new Emitter());\n        this.onClick = this._onClick.event;\n        this._state = LightBulbState.Hidden;\n        this._gutterState = LightBulbState.Hidden;\n        this._iconClasses = [];\n        this.lightbulbClasses = [\n            'codicon-' + GUTTER_LIGHTBULB_ICON.id,\n            'codicon-' + GUTTER_LIGHTBULB_AIFIX_AUTO_FIX_ICON.id,\n            'codicon-' + GUTTER_LIGHTBULB_AUTO_FIX_ICON.id,\n            'codicon-' + GUTTER_LIGHTBULB_AIFIX_ICON.id,\n            'codicon-' + GUTTER_SPARKLE_FILLED_ICON.id\n        ];\n        this.gutterDecoration = LightBulbWidget_1.GUTTER_DECORATION;\n        this._domNode = $('div.lightBulbWidget');\n        this._domNode.role = 'listbox';\n        this._register(Gesture.ignoreTarget(this._domNode));\n        this._editor.addContentWidget(this);\n        this._register(this._editor.onDidChangeModelContent(_ => {\n            // cancel when the line in question has been removed\n            const editorModel = this._editor.getModel();\n            if (this.state.type !== 1 /* LightBulbState.Type.Showing */ || !editorModel || this.state.editorPosition.lineNumber >= editorModel.getLineCount()) {\n                this.hide();\n            }\n            if (this.gutterState.type !== 1 /* LightBulbState.Type.Showing */ || !editorModel || this.gutterState.editorPosition.lineNumber >= editorModel.getLineCount()) {\n                this.gutterHide();\n            }\n        }));\n        this._register(addStandardDisposableGenericMouseDownListener(this._domNode, e => {\n            if (this.state.type !== 1 /* LightBulbState.Type.Showing */) {\n                return;\n            }\n            // Make sure that focus / cursor location is not lost when clicking widget icon\n            this._editor.focus();\n            e.preventDefault();\n            // a bit of extra work to make sure the menu\n            // doesn't cover the line-text\n            const { top, height } = getDomNodePagePosition(this._domNode);\n            const lineHeight = this._editor.getOption(75 /* EditorOption.lineHeight */);\n            let pad = Math.floor(lineHeight / 3);\n            if (this.state.widgetPosition.position !== null && this.state.widgetPosition.position.lineNumber < this.state.editorPosition.lineNumber) {\n                pad += lineHeight;\n            }\n            this._onClick.fire({\n                x: e.posx,\n                y: top + height + pad,\n                actions: this.state.actions,\n                trigger: this.state.trigger,\n            });\n        }));\n        this._register(addDisposableListener(this._domNode, 'mouseenter', (e) => {\n            if ((e.buttons & 1) !== 1) {\n                return;\n            }\n            // mouse enters lightbulb while the primary/left button\n            // is being pressed -> hide the lightbulb\n            this.hide();\n        }));\n        this._register(Event.runAndSubscribe(this._keybindingService.onDidUpdateKeybindings, () => {\n            this._preferredKbLabel = this._keybindingService.lookupKeybinding(autoFixCommandId)?.getLabel() ?? undefined;\n            this._quickFixKbLabel = this._keybindingService.lookupKeybinding(quickFixCommandId)?.getLabel() ?? undefined;\n            this._updateLightBulbTitleAndIcon();\n        }));\n        this._register(this._editor.onMouseDown(async (e) => {\n            if (!e.target.element || !this.lightbulbClasses.some(cls => e.target.element && e.target.element.classList.contains(cls))) {\n                return;\n            }\n            if (this.gutterState.type !== 1 /* LightBulbState.Type.Showing */) {\n                return;\n            }\n            // Make sure that focus / cursor location is not lost when clicking widget icon\n            this._editor.focus();\n            // a bit of extra work to make sure the menu\n            // doesn't cover the line-text\n            const { top, height } = getDomNodePagePosition(e.target.element);\n            const lineHeight = this._editor.getOption(75 /* EditorOption.lineHeight */);\n            let pad = Math.floor(lineHeight / 3);\n            if (this.gutterState.widgetPosition.position !== null && this.gutterState.widgetPosition.position.lineNumber < this.gutterState.editorPosition.lineNumber) {\n                pad += lineHeight;\n            }\n            this._onClick.fire({\n                x: e.event.posx,\n                y: top + height + pad,\n                actions: this.gutterState.actions,\n                trigger: this.gutterState.trigger,\n            });\n        }));\n    }\n    dispose() {\n        super.dispose();\n        this._editor.removeContentWidget(this);\n        if (this._gutterDecorationID) {\n            this._removeGutterDecoration(this._gutterDecorationID);\n        }\n    }\n    getId() {\n        return 'LightBulbWidget';\n    }\n    getDomNode() {\n        return this._domNode;\n    }\n    getPosition() {\n        return this._state.type === 1 /* LightBulbState.Type.Showing */ ? this._state.widgetPosition : null;\n    }\n    update(actions, trigger, atPosition) {\n        if (actions.validActions.length <= 0) {\n            this.gutterHide();\n            return this.hide();\n        }\n        const hasTextFocus = this._editor.hasTextFocus();\n        if (!hasTextFocus) {\n            this.gutterHide();\n            return this.hide();\n        }\n        const options = this._editor.getOptions();\n        if (!options.get(73 /* EditorOption.lightbulb */).enabled) {\n            this.gutterHide();\n            return this.hide();\n        }\n        const model = this._editor.getModel();\n        if (!model) {\n            this.gutterHide();\n            return this.hide();\n        }\n        const { lineNumber, column } = model.validatePosition(atPosition);\n        const tabSize = model.getOptions().tabSize;\n        const fontInfo = this._editor.getOptions().get(59 /* EditorOption.fontInfo */);\n        const lineContent = model.getLineContent(lineNumber);\n        const indent = computeIndentLevel(lineContent, tabSize);\n        const lineHasSpace = fontInfo.spaceWidth * indent > 22;\n        const isFolded = (lineNumber) => {\n            return lineNumber > 2 && this._editor.getTopForLineNumber(lineNumber) === this._editor.getTopForLineNumber(lineNumber - 1);\n        };\n        // Check for glyph margin decorations of any kind\n        const currLineDecorations = this._editor.getLineDecorations(lineNumber);\n        let hasDecoration = false;\n        if (currLineDecorations) {\n            for (const decoration of currLineDecorations) {\n                const glyphClass = decoration.options.glyphMarginClassName;\n                if (glyphClass && !this.lightbulbClasses.some(className => glyphClass.includes(className))) {\n                    hasDecoration = true;\n                    break;\n                }\n            }\n        }\n        let effectiveLineNumber = lineNumber;\n        let effectiveColumnNumber = 1;\n        if (!lineHasSpace) {\n            // Checks if line is empty or starts with any amount of whitespace\n            const isLineEmptyOrIndented = (lineNumber) => {\n                const lineContent = model.getLineContent(lineNumber);\n                return /^\\s*$|^\\s+/.test(lineContent) || lineContent.length <= effectiveColumnNumber;\n            };\n            if (lineNumber > 1 && !isFolded(lineNumber - 1)) {\n                const lineCount = model.getLineCount();\n                const endLine = lineNumber === lineCount;\n                const prevLineEmptyOrIndented = lineNumber > 1 && isLineEmptyOrIndented(lineNumber - 1);\n                const nextLineEmptyOrIndented = !endLine && isLineEmptyOrIndented(lineNumber + 1);\n                const currLineEmptyOrIndented = isLineEmptyOrIndented(lineNumber);\n                const notEmpty = !nextLineEmptyOrIndented && !prevLineEmptyOrIndented;\n                // check above and below. if both are blocked, display lightbulb in the gutter.\n                if (!nextLineEmptyOrIndented && !prevLineEmptyOrIndented && !hasDecoration) {\n                    this.gutterState = new LightBulbState.Showing(actions, trigger, atPosition, {\n                        position: { lineNumber: effectiveLineNumber, column: effectiveColumnNumber },\n                        preference: LightBulbWidget_1._posPref\n                    });\n                    this.renderGutterLightbub();\n                    return this.hide();\n                }\n                else if (prevLineEmptyOrIndented || endLine || (prevLineEmptyOrIndented && !currLineEmptyOrIndented)) {\n                    effectiveLineNumber -= 1;\n                }\n                else if (nextLineEmptyOrIndented || (notEmpty && currLineEmptyOrIndented)) {\n                    effectiveLineNumber += 1;\n                }\n            }\n            else if (lineNumber === 1 && (lineNumber === model.getLineCount() || !isLineEmptyOrIndented(lineNumber + 1) && !isLineEmptyOrIndented(lineNumber))) {\n                // special checks for first line blocked vs. not blocked.\n                this.gutterState = new LightBulbState.Showing(actions, trigger, atPosition, {\n                    position: { lineNumber: effectiveLineNumber, column: effectiveColumnNumber },\n                    preference: LightBulbWidget_1._posPref\n                });\n                if (hasDecoration) {\n                    this.gutterHide();\n                }\n                else {\n                    this.renderGutterLightbub();\n                    return this.hide();\n                }\n            }\n            else if ((lineNumber < model.getLineCount()) && !isFolded(lineNumber + 1)) {\n                effectiveLineNumber += 1;\n            }\n            else if (column * fontInfo.spaceWidth < 22) {\n                // cannot show lightbulb above/below and showing\n                // it inline would overlay the cursor...\n                return this.hide();\n            }\n            effectiveColumnNumber = /^\\S\\s*$/.test(model.getLineContent(effectiveLineNumber)) ? 2 : 1;\n        }\n        this.state = new LightBulbState.Showing(actions, trigger, atPosition, {\n            position: { lineNumber: effectiveLineNumber, column: effectiveColumnNumber },\n            preference: LightBulbWidget_1._posPref\n        });\n        if (this._gutterDecorationID) {\n            this._removeGutterDecoration(this._gutterDecorationID);\n            this.gutterHide();\n        }\n        const validActions = actions.validActions;\n        const actionKind = actions.validActions[0].action.kind;\n        if (validActions.length !== 1 || !actionKind) {\n            this._editor.layoutContentWidget(this);\n            return;\n        }\n        this._editor.layoutContentWidget(this);\n    }\n    hide() {\n        if (this.state === LightBulbState.Hidden) {\n            return;\n        }\n        this.state = LightBulbState.Hidden;\n        this._editor.layoutContentWidget(this);\n    }\n    gutterHide() {\n        if (this.gutterState === LightBulbState.Hidden) {\n            return;\n        }\n        if (this._gutterDecorationID) {\n            this._removeGutterDecoration(this._gutterDecorationID);\n        }\n        this.gutterState = LightBulbState.Hidden;\n    }\n    get state() { return this._state; }\n    set state(value) {\n        this._state = value;\n        this._updateLightBulbTitleAndIcon();\n    }\n    get gutterState() { return this._gutterState; }\n    set gutterState(value) {\n        this._gutterState = value;\n        this._updateGutterLightBulbTitleAndIcon();\n    }\n    _updateLightBulbTitleAndIcon() {\n        this._domNode.classList.remove(...this._iconClasses);\n        this._iconClasses = [];\n        if (this.state.type !== 1 /* LightBulbState.Type.Showing */) {\n            return;\n        }\n        let icon;\n        let autoRun = false;\n        if (this.state.actions.allAIFixes) {\n            icon = Codicon.sparkleFilled;\n            if (this.state.actions.validActions.length === 1) {\n                autoRun = true;\n            }\n        }\n        else if (this.state.actions.hasAutoFix) {\n            if (this.state.actions.hasAIFix) {\n                icon = Codicon.lightbulbSparkleAutofix;\n            }\n            else {\n                icon = Codicon.lightbulbAutofix;\n            }\n        }\n        else if (this.state.actions.hasAIFix) {\n            icon = Codicon.lightbulbSparkle;\n        }\n        else {\n            icon = Codicon.lightBulb;\n        }\n        this._updateLightbulbTitle(this.state.actions.hasAutoFix, autoRun);\n        this._iconClasses = ThemeIcon.asClassNameArray(icon);\n        this._domNode.classList.add(...this._iconClasses);\n    }\n    _updateGutterLightBulbTitleAndIcon() {\n        if (this.gutterState.type !== 1 /* LightBulbState.Type.Showing */) {\n            return;\n        }\n        let icon;\n        let autoRun = false;\n        if (this.gutterState.actions.allAIFixes) {\n            icon = GUTTER_SPARKLE_FILLED_ICON;\n            if (this.gutterState.actions.validActions.length === 1) {\n                autoRun = true;\n            }\n        }\n        else if (this.gutterState.actions.hasAutoFix) {\n            if (this.gutterState.actions.hasAIFix) {\n                icon = GUTTER_LIGHTBULB_AIFIX_AUTO_FIX_ICON;\n            }\n            else {\n                icon = GUTTER_LIGHTBULB_AUTO_FIX_ICON;\n            }\n        }\n        else if (this.gutterState.actions.hasAIFix) {\n            icon = GUTTER_LIGHTBULB_AIFIX_ICON;\n        }\n        else {\n            icon = GUTTER_LIGHTBULB_ICON;\n        }\n        this._updateLightbulbTitle(this.gutterState.actions.hasAutoFix, autoRun);\n        const GUTTER_DECORATION = ModelDecorationOptions.register({\n            description: 'codicon-gutter-lightbulb-decoration',\n            glyphMarginClassName: ThemeIcon.asClassName(icon),\n            glyphMargin: { position: GlyphMarginLane.Left },\n            stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n        });\n        this.gutterDecoration = GUTTER_DECORATION;\n    }\n    /* Gutter Helper Functions */\n    renderGutterLightbub() {\n        const selection = this._editor.getSelection();\n        if (!selection) {\n            return;\n        }\n        if (this._gutterDecorationID === undefined) {\n            this._addGutterDecoration(selection.startLineNumber);\n        }\n        else {\n            this._updateGutterDecoration(this._gutterDecorationID, selection.startLineNumber);\n        }\n    }\n    _addGutterDecoration(lineNumber) {\n        this._editor.changeDecorations((accessor) => {\n            this._gutterDecorationID = accessor.addDecoration(new Range(lineNumber, 0, lineNumber, 0), this.gutterDecoration);\n        });\n    }\n    _removeGutterDecoration(decorationId) {\n        this._editor.changeDecorations((accessor) => {\n            accessor.removeDecoration(decorationId);\n            this._gutterDecorationID = undefined;\n        });\n    }\n    _updateGutterDecoration(decorationId, lineNumber) {\n        this._editor.changeDecorations((accessor) => {\n            accessor.changeDecoration(decorationId, new Range(lineNumber, 0, lineNumber, 0));\n            accessor.changeDecorationOptions(decorationId, this.gutterDecoration);\n        });\n    }\n    _updateLightbulbTitle(autoFix, autoRun) {\n        if (this.state.type !== 1 /* LightBulbState.Type.Showing */) {\n            return;\n        }\n        if (autoRun) {\n            this.title = localize(879, \"Run: {0}\", this.state.actions.validActions[0].action.title);\n        }\n        else if (autoFix && this._preferredKbLabel) {\n            this.title = localize(880, \"Show Code Actions. Preferred Quick Fix Available ({0})\", this._preferredKbLabel);\n        }\n        else if (!autoFix && this._quickFixKbLabel) {\n            this.title = localize(881, \"Show Code Actions ({0})\", this._quickFixKbLabel);\n        }\n        else if (!autoFix) {\n            this.title = localize(882, \"Show Code Actions\");\n        }\n    }\n    set title(value) {\n        this._domNode.title = value;\n    }\n};\nLightBulbWidget = LightBulbWidget_1 = __decorate([\n    __param(1, IKeybindingService)\n], LightBulbWidget);\n\nexport { LightBulbWidget };\n","import { getDomNodePagePosition } from '../../../../base/browser/dom.js';\nimport { status } from '../../../../base/browser/ui/aria/aria.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { HierarchicalKind } from '../../../../base/common/hierarchicalKind.js';\nimport { Lazy } from '../../../../base/common/lazy.js';\nimport { Disposable, MutableDisposable } from '../../../../base/common/lifecycle.js';\nimport { localize } from '../../../../nls.js';\nimport { IActionWidgetService } from '../../../../platform/actionWidget/browser/actionWidget.js';\nimport { ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IMarkerService } from '../../../../platform/markers/common/markers.js';\nimport { IEditorProgressService } from '../../../../platform/progress/common/progress.js';\nimport '../../../../platform/theme/common/colorUtils.js';\nimport '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorFindMatchHighlight, editorFindMatchHighlightBorder } from '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { isHighContrast } from '../../../../platform/theme/common/theme.js';\nimport { registerThemingParticipant } from '../../../../platform/theme/common/themeService.js';\nimport { Position } from '../../../common/core/position.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { MessageController } from '../../message/browser/messageController.js';\nimport { CodeActionTriggerSource, CodeActionKind } from '../common/types.js';\nimport { ApplyCodeActionReason, applyCodeAction } from './codeAction.js';\nimport { CodeActionKeybindingResolver } from './codeActionKeybindingResolver.js';\nimport { toMenuItems } from './codeActionMenu.js';\nimport { CodeActionModel } from './codeActionModel.js';\nimport { LightBulbWidget } from './lightBulbWidget.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar CodeActionController_1;\nconst DECORATION_CLASS_NAME = 'quickfix-edit-highlight';\nlet CodeActionController = class CodeActionController extends Disposable {\n    static { CodeActionController_1 = this; }\n    static { this.ID = 'editor.contrib.codeActionController'; }\n    static get(editor) {\n        return editor.getContribution(CodeActionController_1.ID);\n    }\n    constructor(editor, markerService, contextKeyService, instantiationService, languageFeaturesService, progressService, _commandService, _configurationService, _actionWidgetService, _instantiationService, _progressService) {\n        super();\n        this._commandService = _commandService;\n        this._configurationService = _configurationService;\n        this._actionWidgetService = _actionWidgetService;\n        this._instantiationService = _instantiationService;\n        this._progressService = _progressService;\n        this._activeCodeActions = this._register(new MutableDisposable());\n        this._showDisabled = false;\n        this._disposed = false;\n        this._editor = editor;\n        this._model = this._register(new CodeActionModel(this._editor, languageFeaturesService.codeActionProvider, markerService, contextKeyService, progressService, _configurationService));\n        this._register(this._model.onDidChangeState(newState => this.update(newState)));\n        this._lightBulbWidget = new Lazy(() => {\n            const widget = this._editor.getContribution(LightBulbWidget.ID);\n            if (widget) {\n                this._register(widget.onClick(e => this.showCodeActionsFromLightbulb(e.actions, e)));\n            }\n            return widget;\n        });\n        this._resolver = instantiationService.createInstance(CodeActionKeybindingResolver);\n        this._register(this._editor.onDidLayoutChange(() => this._actionWidgetService.hide()));\n    }\n    dispose() {\n        this._disposed = true;\n        super.dispose();\n    }\n    async showCodeActionsFromLightbulb(actions, at) {\n        if (actions.allAIFixes && actions.validActions.length === 1) {\n            const actionItem = actions.validActions[0];\n            const command = actionItem.action.command;\n            if (command && command.id === 'inlineChat.start') {\n                if (command.arguments && command.arguments.length >= 1 && command.arguments[0]) {\n                    command.arguments[0] = { ...command.arguments[0], autoSend: false };\n                }\n            }\n            await this.applyCodeAction(actionItem, false, false, ApplyCodeActionReason.FromAILightbulb);\n            return;\n        }\n        await this.showCodeActionList(actions, at, { includeDisabledActions: false, fromLightbulb: true });\n    }\n    showCodeActions(_trigger, actions, at) {\n        return this.showCodeActionList(actions, at, { includeDisabledActions: false, fromLightbulb: false });\n    }\n    manualTriggerAtCurrentPosition(notAvailableMessage, triggerAction, filter, autoApply) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        MessageController.get(this._editor)?.closeMessage();\n        const triggerPosition = this._editor.getPosition();\n        this._trigger({ type: 1 /* CodeActionTriggerType.Invoke */, triggerAction, filter, autoApply, context: { notAvailableMessage, position: triggerPosition } });\n    }\n    _trigger(trigger) {\n        return this._model.trigger(trigger);\n    }\n    async applyCodeAction(action, retrigger, preview, actionReason) {\n        const progress = this._progressService.show(true, 500);\n        try {\n            await this._instantiationService.invokeFunction(applyCodeAction, action, actionReason, { preview, editor: this._editor });\n        }\n        finally {\n            if (retrigger) {\n                this._trigger({ type: 2 /* CodeActionTriggerType.Auto */, triggerAction: CodeActionTriggerSource.QuickFix, filter: {} });\n            }\n            progress.done();\n        }\n    }\n    hideLightBulbWidget() {\n        this._lightBulbWidget.rawValue?.hide();\n        this._lightBulbWidget.rawValue?.gutterHide();\n    }\n    async update(newState) {\n        if (newState.type !== 1 /* CodeActionsState.Type.Triggered */) {\n            this.hideLightBulbWidget();\n            return;\n        }\n        let actions;\n        try {\n            actions = await newState.actions;\n        }\n        catch (e) {\n            onUnexpectedError(e);\n            return;\n        }\n        if (this._disposed) {\n            return;\n        }\n        const selection = this._editor.getSelection();\n        if (selection?.startLineNumber !== newState.position.lineNumber) {\n            return;\n        }\n        this._lightBulbWidget.value?.update(actions, newState.trigger, newState.position);\n        if (newState.trigger.type === 1 /* CodeActionTriggerType.Invoke */) {\n            if (newState.trigger.filter?.include) { // Triggered for specific scope\n                // Check to see if we want to auto apply.\n                const validActionToApply = this.tryGetValidActionToApply(newState.trigger, actions);\n                if (validActionToApply) {\n                    try {\n                        this.hideLightBulbWidget();\n                        await this.applyCodeAction(validActionToApply, false, false, ApplyCodeActionReason.FromCodeActions);\n                    }\n                    finally {\n                        actions.dispose();\n                    }\n                    return;\n                }\n                // Check to see if there is an action that we would have applied were it not invalid\n                if (newState.trigger.context) {\n                    const invalidAction = this.getInvalidActionThatWouldHaveBeenApplied(newState.trigger, actions);\n                    if (invalidAction && invalidAction.action.disabled) {\n                        MessageController.get(this._editor)?.showMessage(invalidAction.action.disabled, newState.trigger.context.position);\n                        actions.dispose();\n                        return;\n                    }\n                }\n            }\n            const includeDisabledActions = !!newState.trigger.filter?.include;\n            if (newState.trigger.context) {\n                if (!actions.allActions.length || !includeDisabledActions && !actions.validActions.length) {\n                    MessageController.get(this._editor)?.showMessage(newState.trigger.context.notAvailableMessage, newState.trigger.context.position);\n                    this._activeCodeActions.value = actions;\n                    actions.dispose();\n                    return;\n                }\n            }\n            this._activeCodeActions.value = actions;\n            this.showCodeActionList(actions, this.toCoords(newState.position), { includeDisabledActions, fromLightbulb: false });\n        }\n        else {\n            // auto magically triggered\n            if (this._actionWidgetService.isVisible) {\n                // TODO: Figure out if we should update the showing menu?\n                actions.dispose();\n            }\n            else {\n                this._activeCodeActions.value = actions;\n            }\n        }\n    }\n    getInvalidActionThatWouldHaveBeenApplied(trigger, actions) {\n        if (!actions.allActions.length) {\n            return undefined;\n        }\n        if ((trigger.autoApply === \"first\" /* CodeActionAutoApply.First */ && actions.validActions.length === 0)\n            || (trigger.autoApply === \"ifSingle\" /* CodeActionAutoApply.IfSingle */ && actions.allActions.length === 1)) {\n            return actions.allActions.find(({ action }) => action.disabled);\n        }\n        return undefined;\n    }\n    tryGetValidActionToApply(trigger, actions) {\n        if (!actions.validActions.length) {\n            return undefined;\n        }\n        if ((trigger.autoApply === \"first\" /* CodeActionAutoApply.First */ && actions.validActions.length > 0)\n            || (trigger.autoApply === \"ifSingle\" /* CodeActionAutoApply.IfSingle */ && actions.validActions.length === 1)) {\n            return actions.validActions[0];\n        }\n        return undefined;\n    }\n    static { this.DECORATION = ModelDecorationOptions.register({\n        description: 'quickfix-highlight',\n        className: DECORATION_CLASS_NAME\n    }); }\n    async showCodeActionList(actions, at, options) {\n        const currentDecorations = this._editor.createDecorationsCollection();\n        const editorDom = this._editor.getDomNode();\n        if (!editorDom) {\n            return;\n        }\n        const actionsToShow = options.includeDisabledActions && (this._showDisabled || actions.validActions.length === 0) ? actions.allActions : actions.validActions;\n        if (!actionsToShow.length) {\n            return;\n        }\n        const anchor = Position.isIPosition(at) ? this.toCoords(at) : at;\n        const delegate = {\n            onSelect: async (action, preview) => {\n                this.applyCodeAction(action, /* retrigger */ true, !!preview, options.fromLightbulb ? ApplyCodeActionReason.FromAILightbulb : ApplyCodeActionReason.FromCodeActions);\n                this._actionWidgetService.hide(false);\n                currentDecorations.clear();\n            },\n            onHide: (didCancel) => {\n                this._editor?.focus();\n                currentDecorations.clear();\n            },\n            onHover: async (action, token) => {\n                if (token.isCancellationRequested) {\n                    return;\n                }\n                let canPreview = false;\n                const actionKind = action.action.kind;\n                if (actionKind) {\n                    const hierarchicalKind = new HierarchicalKind(actionKind);\n                    const refactorKinds = [\n                        CodeActionKind.RefactorExtract,\n                        CodeActionKind.RefactorInline,\n                        CodeActionKind.RefactorRewrite,\n                        CodeActionKind.RefactorMove,\n                        CodeActionKind.Source\n                    ];\n                    canPreview = refactorKinds.some(refactorKind => refactorKind.contains(hierarchicalKind));\n                }\n                return { canPreview: canPreview || !!action.action.edit?.edits.length };\n            },\n            onFocus: (action) => {\n                if (action && action.action) {\n                    const ranges = action.action.ranges;\n                    const diagnostics = action.action.diagnostics;\n                    currentDecorations.clear();\n                    if (ranges && ranges.length > 0) {\n                        // Handles case for `fix all` where there are multiple diagnostics.\n                        const decorations = (diagnostics && diagnostics?.length > 1)\n                            ? diagnostics.map(diagnostic => ({ range: diagnostic, options: CodeActionController_1.DECORATION }))\n                            : ranges.map(range => ({ range, options: CodeActionController_1.DECORATION }));\n                        currentDecorations.set(decorations);\n                    }\n                    else if (diagnostics && diagnostics.length > 0) {\n                        const decorations = diagnostics.map(diagnostic => ({ range: diagnostic, options: CodeActionController_1.DECORATION }));\n                        currentDecorations.set(decorations);\n                        const diagnostic = diagnostics[0];\n                        if (diagnostic.startLineNumber && diagnostic.startColumn) {\n                            const selectionText = this._editor.getModel()?.getWordAtPosition({ lineNumber: diagnostic.startLineNumber, column: diagnostic.startColumn })?.word;\n                            status(localize(863, \"Context: {0} at line {1} and column {2}.\", selectionText, diagnostic.startLineNumber, diagnostic.startColumn));\n                        }\n                    }\n                }\n                else {\n                    currentDecorations.clear();\n                }\n            }\n        };\n        this._actionWidgetService.show('codeActionWidget', true, toMenuItems(actionsToShow, this._shouldShowHeaders(), this._resolver.getResolver()), delegate, anchor, editorDom, this._getActionBarActions(actions, at, options));\n    }\n    toCoords(position) {\n        if (!this._editor.hasModel()) {\n            return { x: 0, y: 0 };\n        }\n        this._editor.revealPosition(position, 1 /* ScrollType.Immediate */);\n        this._editor.render();\n        // Translate to absolute editor position\n        const cursorCoords = this._editor.getScrolledVisiblePosition(position);\n        const editorCoords = getDomNodePagePosition(this._editor.getDomNode());\n        const x = editorCoords.left + cursorCoords.left;\n        const y = editorCoords.top + cursorCoords.top + cursorCoords.height;\n        return { x, y };\n    }\n    _shouldShowHeaders() {\n        const model = this._editor?.getModel();\n        return this._configurationService.getValue('editor.codeActionWidget.showHeaders', { resource: model?.uri });\n    }\n    _getActionBarActions(actions, at, options) {\n        if (options.fromLightbulb) {\n            return [];\n        }\n        const resultActions = actions.documentation.map((command) => ({\n            id: command.id,\n            label: command.title,\n            tooltip: command.tooltip ?? '',\n            class: undefined,\n            enabled: true,\n            run: () => this._commandService.executeCommand(command.id, ...(command.arguments ?? [])),\n        }));\n        if (options.includeDisabledActions && actions.validActions.length > 0 && actions.allActions.length !== actions.validActions.length) {\n            resultActions.push(this._showDisabled ? {\n                id: 'hideMoreActions',\n                label: localize(864, 'Hide Disabled'),\n                enabled: true,\n                tooltip: '',\n                class: undefined,\n                run: () => {\n                    this._showDisabled = false;\n                    return this.showCodeActionList(actions, at, options);\n                }\n            } : {\n                id: 'showMoreActions',\n                label: localize(865, 'Show Disabled'),\n                enabled: true,\n                tooltip: '',\n                class: undefined,\n                run: () => {\n                    this._showDisabled = true;\n                    return this.showCodeActionList(actions, at, options);\n                }\n            });\n        }\n        return resultActions;\n    }\n};\nCodeActionController = CodeActionController_1 = __decorate([\n    __param(1, IMarkerService),\n    __param(2, IContextKeyService),\n    __param(3, IInstantiationService),\n    __param(4, ILanguageFeaturesService),\n    __param(5, IEditorProgressService),\n    __param(6, ICommandService),\n    __param(7, IConfigurationService),\n    __param(8, IActionWidgetService),\n    __param(9, IInstantiationService),\n    __param(10, IEditorProgressService)\n], CodeActionController);\nregisterThemingParticipant((theme, collector) => {\n    const addBackgroundColorRule = (selector, color) => {\n        if (color) {\n            collector.addRule(`.monaco-editor ${selector} { background-color: ${color}; }`);\n        }\n    };\n    addBackgroundColorRule('.quickfix-edit-highlight', theme.getColor(editorFindMatchHighlight));\n    const findMatchHighlightBorder = theme.getColor(editorFindMatchHighlightBorder);\n    if (findMatchHighlightBorder) {\n        collector.addRule(`.monaco-editor .quickfix-edit-highlight { border: 1px ${isHighContrast(theme.type) ? 'dotted' : 'solid'} ${findMatchHighlightBorder}; box-sizing: border-box; }`);\n    }\n});\n\nexport { CodeActionController };\n","import { HierarchicalKind } from '../../../../base/common/hierarchicalKind.js';\nimport { escapeRegExpCharacters } from '../../../../base/common/strings.js';\nimport { EditorAction, EditorCommand } from '../../../browser/editorExtensions.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { quickFixCommandId, refactorCommandId, sourceActionCommandId, organizeImportsCommandId, autoFixCommandId, fixAllCommandId, codeActionCommandId } from './codeAction.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport { CodeActionTriggerSource, CodeActionKind, CodeActionCommandArgs } from '../common/types.js';\nimport { CodeActionController } from './codeActionController.js';\nimport { SUPPORTED_CODE_ACTIONS } from './codeActionModel.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction contextKeyForSupportedActions(kind) {\n    return ContextKeyExpr.regex(SUPPORTED_CODE_ACTIONS.keys()[0], new RegExp('(\\\\s|^)' + escapeRegExpCharacters(kind.value) + '\\\\b'));\n}\nconst argsSchema = {\n    type: 'object',\n    defaultSnippets: [{ body: { kind: '' } }],\n    properties: {\n        'kind': {\n            type: 'string',\n            description: localize(831, \"Kind of the code action to run.\"),\n        },\n        'apply': {\n            type: 'string',\n            description: localize(832, \"Controls when the returned actions are applied.\"),\n            default: \"ifSingle\" /* CodeActionAutoApply.IfSingle */,\n            enum: [\"first\" /* CodeActionAutoApply.First */, \"ifSingle\" /* CodeActionAutoApply.IfSingle */, \"never\" /* CodeActionAutoApply.Never */],\n            enumDescriptions: [\n                localize(833, \"Always apply the first returned code action.\"),\n                localize(834, \"Apply the first returned code action if it is the only one.\"),\n                localize(835, \"Do not apply the returned code actions.\"),\n            ]\n        },\n        'preferred': {\n            type: 'boolean',\n            default: false,\n            description: localize(836, \"Controls if only preferred code actions should be returned.\"),\n        }\n    }\n};\nfunction triggerCodeActionsForEditorSelection(editor, notAvailableMessage, filter, autoApply, triggerAction = CodeActionTriggerSource.Default) {\n    if (editor.hasModel()) {\n        const controller = CodeActionController.get(editor);\n        controller?.manualTriggerAtCurrentPosition(notAvailableMessage, triggerAction, filter, autoApply);\n    }\n}\nclass QuickFixAction extends EditorAction {\n    constructor() {\n        super({\n            id: quickFixCommandId,\n            label: localize2(853, \"Quick Fix...\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, EditorContextKeys.hasCodeActionsProvider),\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 89 /* KeyCode.Period */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(_accessor, editor) {\n        return triggerCodeActionsForEditorSelection(editor, localize(837, \"No code actions available\"), undefined, undefined, CodeActionTriggerSource.QuickFix);\n    }\n}\nclass CodeActionCommand extends EditorCommand {\n    constructor() {\n        super({\n            id: codeActionCommandId,\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, EditorContextKeys.hasCodeActionsProvider),\n            metadata: {\n                description: 'Trigger a code action',\n                args: [{ name: 'args', schema: argsSchema, }]\n            }\n        });\n    }\n    runEditorCommand(_accessor, editor, userArgs) {\n        const args = CodeActionCommandArgs.fromUser(userArgs, {\n            kind: HierarchicalKind.Empty,\n            apply: \"ifSingle\" /* CodeActionAutoApply.IfSingle */,\n        });\n        return triggerCodeActionsForEditorSelection(editor, typeof userArgs?.kind === 'string'\n            ? args.preferred\n                ? localize(838, \"No preferred code actions for '{0}' available\", userArgs.kind)\n                : localize(839, \"No code actions for '{0}' available\", userArgs.kind)\n            : args.preferred\n                ? localize(840, \"No preferred code actions available\")\n                : localize(841, \"No code actions available\"), {\n            include: args.kind,\n            includeSourceActions: true,\n            onlyIncludePreferredActions: args.preferred,\n        }, args.apply);\n    }\n}\nclass RefactorAction extends EditorAction {\n    constructor() {\n        super({\n            id: refactorCommandId,\n            label: localize2(854, \"Refactor...\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, EditorContextKeys.hasCodeActionsProvider),\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 48 /* KeyCode.KeyR */,\n                mac: {\n                    primary: 256 /* KeyMod.WinCtrl */ | 1024 /* KeyMod.Shift */ | 48 /* KeyCode.KeyR */\n                },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            contextMenuOpts: {\n                group: '1_modification',\n                order: 2,\n                when: ContextKeyExpr.and(EditorContextKeys.writable, contextKeyForSupportedActions(CodeActionKind.Refactor)),\n            },\n            metadata: {\n                description: 'Refactor...',\n                args: [{ name: 'args', schema: argsSchema }]\n            }\n        });\n    }\n    run(_accessor, editor, userArgs) {\n        const args = CodeActionCommandArgs.fromUser(userArgs, {\n            kind: CodeActionKind.Refactor,\n            apply: \"never\" /* CodeActionAutoApply.Never */\n        });\n        return triggerCodeActionsForEditorSelection(editor, typeof userArgs?.kind === 'string'\n            ? args.preferred\n                ? localize(842, \"No preferred refactorings for '{0}' available\", userArgs.kind)\n                : localize(843, \"No refactorings for '{0}' available\", userArgs.kind)\n            : args.preferred\n                ? localize(844, \"No preferred refactorings available\")\n                : localize(845, \"No refactorings available\"), {\n            include: CodeActionKind.Refactor.contains(args.kind) ? args.kind : HierarchicalKind.None,\n            onlyIncludePreferredActions: args.preferred\n        }, args.apply, CodeActionTriggerSource.Refactor);\n    }\n}\nclass SourceAction extends EditorAction {\n    constructor() {\n        super({\n            id: sourceActionCommandId,\n            label: localize2(855, \"Source Action...\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, EditorContextKeys.hasCodeActionsProvider),\n            contextMenuOpts: {\n                group: '1_modification',\n                order: 2.1,\n                when: ContextKeyExpr.and(EditorContextKeys.writable, contextKeyForSupportedActions(CodeActionKind.Source)),\n            },\n            metadata: {\n                description: 'Source Action...',\n                args: [{ name: 'args', schema: argsSchema }]\n            }\n        });\n    }\n    run(_accessor, editor, userArgs) {\n        const args = CodeActionCommandArgs.fromUser(userArgs, {\n            kind: CodeActionKind.Source,\n            apply: \"never\" /* CodeActionAutoApply.Never */\n        });\n        return triggerCodeActionsForEditorSelection(editor, typeof userArgs?.kind === 'string'\n            ? args.preferred\n                ? localize(846, \"No preferred source actions for '{0}' available\", userArgs.kind)\n                : localize(847, \"No source actions for '{0}' available\", userArgs.kind)\n            : args.preferred\n                ? localize(848, \"No preferred source actions available\")\n                : localize(849, \"No source actions available\"), {\n            include: CodeActionKind.Source.contains(args.kind) ? args.kind : HierarchicalKind.None,\n            includeSourceActions: true,\n            onlyIncludePreferredActions: args.preferred,\n        }, args.apply, CodeActionTriggerSource.SourceAction);\n    }\n}\nclass OrganizeImportsAction extends EditorAction {\n    constructor() {\n        super({\n            id: organizeImportsCommandId,\n            label: localize2(856, \"Organize Imports\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, contextKeyForSupportedActions(CodeActionKind.SourceOrganizeImports)),\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 45 /* KeyCode.KeyO */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: {\n                description: localize2(857, \"Organize imports in the current file. Also called 'Optimize Imports' by some tools\")\n            }\n        });\n    }\n    run(_accessor, editor) {\n        return triggerCodeActionsForEditorSelection(editor, localize(850, \"No organize imports action available\"), { include: CodeActionKind.SourceOrganizeImports, includeSourceActions: true }, \"ifSingle\" /* CodeActionAutoApply.IfSingle */, CodeActionTriggerSource.OrganizeImports);\n    }\n}\nclass FixAllAction extends EditorAction {\n    constructor() {\n        super({\n            id: fixAllCommandId,\n            label: localize2(858, \"Fix All\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, contextKeyForSupportedActions(CodeActionKind.SourceFixAll))\n        });\n    }\n    run(_accessor, editor) {\n        return triggerCodeActionsForEditorSelection(editor, localize(851, \"No fix all action available\"), { include: CodeActionKind.SourceFixAll, includeSourceActions: true }, \"ifSingle\" /* CodeActionAutoApply.IfSingle */, CodeActionTriggerSource.FixAll);\n    }\n}\nclass AutoFixAction extends EditorAction {\n    constructor() {\n        super({\n            id: autoFixCommandId,\n            label: localize2(859, \"Auto Fix...\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, contextKeyForSupportedActions(CodeActionKind.QuickFix)),\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 512 /* KeyMod.Alt */ | 1024 /* KeyMod.Shift */ | 89 /* KeyCode.Period */,\n                mac: {\n                    primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 89 /* KeyCode.Period */\n                },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(_accessor, editor) {\n        return triggerCodeActionsForEditorSelection(editor, localize(852, \"No auto fixes available\"), {\n            include: CodeActionKind.QuickFix,\n            onlyIncludePreferredActions: true\n        }, \"ifSingle\" /* CodeActionAutoApply.IfSingle */, CodeActionTriggerSource.AutoFix);\n    }\n}\n\nexport { AutoFixAction, CodeActionCommand, FixAllAction, OrganizeImportsAction, QuickFixAction, RefactorAction, SourceAction };\n","import { registerEditorContribution, registerEditorAction, registerEditorCommand } from '../../../browser/editorExtensions.js';\nimport { editorConfigurationBaseNode } from '../../../common/config/editorConfigurationSchema.js';\nimport { QuickFixAction, RefactorAction, SourceAction, OrganizeImportsAction, AutoFixAction, FixAllAction, CodeActionCommand } from './codeActionCommands.js';\nimport { CodeActionController } from './codeActionController.js';\nimport { LightBulbWidget } from './lightBulbWidget.js';\nimport { localize } from '../../../../nls.js';\nimport { Extensions } from '../../../../platform/configuration/common/configurationRegistry.js';\nimport { Registry } from '../../../../platform/registry/common/platform.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterEditorContribution(CodeActionController.ID, CodeActionController, 3 /* EditorContributionInstantiation.Eventually */);\nregisterEditorContribution(LightBulbWidget.ID, LightBulbWidget, 4 /* EditorContributionInstantiation.Lazy */);\nregisterEditorAction(QuickFixAction);\nregisterEditorAction(RefactorAction);\nregisterEditorAction(SourceAction);\nregisterEditorAction(OrganizeImportsAction);\nregisterEditorAction(AutoFixAction);\nregisterEditorAction(FixAllAction);\nregisterEditorCommand(new CodeActionCommand());\nRegistry.as(Extensions.Configuration).registerConfiguration({\n    ...editorConfigurationBaseNode,\n    properties: {\n        'editor.codeActionWidget.showHeaders': {\n            type: 'boolean',\n            scope: 6 /* ConfigurationScope.LANGUAGE_OVERRIDABLE */,\n            description: localize(860, \"Enable/disable showing group headers in the Code Action menu.\"),\n            default: true,\n        },\n    }\n});\nRegistry.as(Extensions.Configuration).registerConfiguration({\n    ...editorConfigurationBaseNode,\n    properties: {\n        'editor.codeActionWidget.includeNearbyQuickFixes': {\n            type: 'boolean',\n            scope: 6 /* ConfigurationScope.LANGUAGE_OVERRIDABLE */,\n            description: localize(861, \"Enable/disable showing nearest Quick Fix within a line when not currently on a diagnostic.\"),\n            default: true,\n        },\n    }\n});\nRegistry.as(Extensions.Configuration).registerConfiguration({\n    ...editorConfigurationBaseNode,\n    properties: {\n        'editor.codeActions.triggerOnFocusChange': {\n            type: 'boolean',\n            scope: 6 /* ConfigurationScope.LANGUAGE_OVERRIDABLE */,\n            markdownDescription: localize(862, 'Enable triggering {0} when {1} is set to {2}. Code Actions must be set to {3} to be triggered for window and focus changes.', '`#editor.codeActionsOnSave#`', '`#files.autoSave#`', '`afterDelay`', '`always`'),\n            default: false,\n        },\n    }\n});\n","import { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { illegalArgument, onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { isDisposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { IModelService } from '../../../common/services/model.js';\nimport { CommandsRegistry } from '../../../../platform/commands/common/commands.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CodeLensModel {\n    constructor() {\n        this.lenses = [];\n    }\n    static { this.Empty = new CodeLensModel(); }\n    dispose() {\n        this._store?.dispose();\n    }\n    get isDisposed() {\n        return this._store?.isDisposed ?? false;\n    }\n    add(list, provider) {\n        if (isDisposable(list)) {\n            this._store ??= new DisposableStore();\n            this._store.add(list);\n        }\n        for (const symbol of list.lenses) {\n            this.lenses.push({ symbol, provider });\n        }\n    }\n}\nasync function getCodeLensModel(registry, model, token) {\n    const provider = registry.ordered(model);\n    const providerRanks = new Map();\n    const result = new CodeLensModel();\n    const promises = provider.map(async (provider, i) => {\n        providerRanks.set(provider, i);\n        try {\n            const list = await Promise.resolve(provider.provideCodeLenses(model, token));\n            if (list) {\n                result.add(list, provider);\n            }\n        }\n        catch (err) {\n            onUnexpectedExternalError(err);\n        }\n    });\n    await Promise.all(promises);\n    if (token.isCancellationRequested) {\n        result.dispose();\n        return CodeLensModel.Empty;\n    }\n    result.lenses = result.lenses.sort((a, b) => {\n        // sort by lineNumber, provider-rank, and column\n        if (a.symbol.range.startLineNumber < b.symbol.range.startLineNumber) {\n            return -1;\n        }\n        else if (a.symbol.range.startLineNumber > b.symbol.range.startLineNumber) {\n            return 1;\n        }\n        else if ((providerRanks.get(a.provider)) < (providerRanks.get(b.provider))) {\n            return -1;\n        }\n        else if ((providerRanks.get(a.provider)) > (providerRanks.get(b.provider))) {\n            return 1;\n        }\n        else if (a.symbol.range.startColumn < b.symbol.range.startColumn) {\n            return -1;\n        }\n        else if (a.symbol.range.startColumn > b.symbol.range.startColumn) {\n            return 1;\n        }\n        else {\n            return 0;\n        }\n    });\n    return result;\n}\nCommandsRegistry.registerCommand('_executeCodeLensProvider', function (accessor, ...args) {\n    let [uri, itemResolveCount] = args;\n    assertType(URI.isUri(uri));\n    assertType(typeof itemResolveCount === 'number' || !itemResolveCount);\n    const { codeLensProvider } = accessor.get(ILanguageFeaturesService);\n    const model = accessor.get(IModelService).getModel(uri);\n    if (!model) {\n        throw illegalArgument();\n    }\n    const result = [];\n    const disposables = new DisposableStore();\n    return getCodeLensModel(codeLensProvider, model, CancellationToken.None).then(value => {\n        disposables.add(value);\n        const resolve = [];\n        for (const item of value.lenses) {\n            if (itemResolveCount === undefined || itemResolveCount === null || Boolean(item.symbol.command)) {\n                result.push(item.symbol);\n            }\n            else if (itemResolveCount-- > 0 && item.provider.resolveCodeLens) {\n                resolve.push(Promise.resolve(item.provider.resolveCodeLens(model, item.symbol, CancellationToken.None)).then(symbol => result.push(symbol || item.symbol)));\n            }\n        }\n        return Promise.all(resolve);\n    }).then(() => {\n        return result;\n    }).finally(() => {\n        // make sure to return results, then (on next tick)\n        // dispose the results\n        setTimeout(() => disposables.dispose(), 100);\n    });\n});\n\nexport { CodeLensModel, getCodeLensModel };\n","import { Event } from '../../../../base/common/event.js';\nimport { LRUCache } from '../../../../base/common/map.js';\nimport { Range } from '../../../common/core/range.js';\nimport { CodeLensModel } from './codelens.js';\nimport { registerSingleton } from '../../../../platform/instantiation/common/extensions.js';\nimport { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IStorageService, WillSaveStateReason } from '../../../../platform/storage/common/storage.js';\nimport { mainWindow } from '../../../../base/browser/window.js';\nimport { runWhenWindowIdle } from '../../../../base/browser/dom.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst ICodeLensCache = createDecorator('ICodeLensCache');\nclass CacheItem {\n    constructor(lineCount, data) {\n        this.lineCount = lineCount;\n        this.data = data;\n    }\n}\nlet CodeLensCache = class CodeLensCache {\n    constructor(storageService) {\n        this._fakeProvider = new class {\n            provideCodeLenses() {\n                throw new Error('not supported');\n            }\n        };\n        this._cache = new LRUCache(20, 0.75);\n        // remove old data\n        const oldkey = 'codelens/cache';\n        runWhenWindowIdle(mainWindow, () => storageService.remove(oldkey, 1 /* StorageScope.WORKSPACE */));\n        // restore lens data on start\n        const key = 'codelens/cache2';\n        const raw = storageService.get(key, 1 /* StorageScope.WORKSPACE */, '{}');\n        this._deserialize(raw);\n        // store lens data on shutdown\n        const onWillSaveStateBecauseOfShutdown = Event.filter(storageService.onWillSaveState, e => e.reason === WillSaveStateReason.SHUTDOWN);\n        Event.once(onWillSaveStateBecauseOfShutdown)(e => {\n            storageService.store(key, this._serialize(), 1 /* StorageScope.WORKSPACE */, 1 /* StorageTarget.MACHINE */);\n        });\n    }\n    put(model, data) {\n        // create a copy of the model that is without command-ids\n        // but with comand-labels\n        const copyItems = data.lenses.map((item) => {\n            return {\n                range: item.symbol.range,\n                command: item.symbol.command && { id: '', title: item.symbol.command?.title },\n            };\n        });\n        const copyModel = new CodeLensModel();\n        copyModel.add({ lenses: copyItems }, this._fakeProvider);\n        const item = new CacheItem(model.getLineCount(), copyModel);\n        this._cache.set(model.uri.toString(), item);\n    }\n    get(model) {\n        const item = this._cache.get(model.uri.toString());\n        return item && item.lineCount === model.getLineCount() ? item.data : undefined;\n    }\n    delete(model) {\n        this._cache.delete(model.uri.toString());\n    }\n    // --- persistence\n    _serialize() {\n        const data = Object.create(null);\n        for (const [key, value] of this._cache) {\n            const lines = new Set();\n            for (const d of value.data.lenses) {\n                lines.add(d.symbol.range.startLineNumber);\n            }\n            data[key] = {\n                lineCount: value.lineCount,\n                lines: [...lines.values()]\n            };\n        }\n        return JSON.stringify(data);\n    }\n    _deserialize(raw) {\n        try {\n            const data = JSON.parse(raw);\n            for (const key in data) {\n                const element = data[key];\n                const lenses = [];\n                for (const line of element.lines) {\n                    lenses.push({ range: new Range(line, 1, line, 11) });\n                }\n                const model = new CodeLensModel();\n                model.add({ lenses }, this._fakeProvider);\n                this._cache.set(key, new CacheItem(element.lineCount, model));\n            }\n        }\n        catch {\n            // ignore...\n        }\n    }\n};\nCodeLensCache = __decorate([\n    __param(0, IStorageService)\n], CodeLensCache);\nregisterSingleton(ICodeLensCache, CodeLensCache, 1 /* InstantiationType.Delayed */);\n\nexport { CodeLensCache, ICodeLensCache };\n","import { $, reset } from '../../../../base/browser/dom.js';\nimport { renderLabelWithIcons } from '../../../../base/browser/ui/iconLabel/iconLabels.js';\nimport './codelensWidget.css';\nimport { Range } from '../../../common/core/range.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CodeLensViewZone {\n    constructor(afterLineNumber, heightInPx, onHeight) {\n        /**\n         * We want that this view zone, which reserves space for a code lens appears\n         * as close as possible to the next line, so we use a very large value here.\n         */\n        this.afterColumn = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n        this.afterLineNumber = afterLineNumber;\n        this.heightInPx = heightInPx;\n        this._onHeight = onHeight;\n        this.suppressMouseDown = true;\n        this.domNode = document.createElement('div');\n    }\n    onComputedHeight(height) {\n        if (this._lastHeight === undefined) {\n            this._lastHeight = height;\n        }\n        else if (this._lastHeight !== height) {\n            this._lastHeight = height;\n            this._onHeight();\n        }\n    }\n    isVisible() {\n        return this._lastHeight !== 0\n            && this.domNode.hasAttribute('monaco-visible-view-zone');\n    }\n}\nclass CodeLensContentWidget {\n    static { this._idPool = 0; }\n    constructor(editor, line) {\n        // Editor.IContentWidget.allowEditorOverflow\n        this.allowEditorOverflow = false;\n        this.suppressMouseDown = true;\n        this._commands = new Map();\n        this._isEmpty = true;\n        this._editor = editor;\n        this._id = `codelens.widget-${(CodeLensContentWidget._idPool++)}`;\n        this.updatePosition(line);\n        this._domNode = document.createElement('span');\n        this._domNode.className = `codelens-decoration`;\n    }\n    withCommands(lenses, animate) {\n        this._commands.clear();\n        const children = [];\n        let hasSymbol = false;\n        for (let i = 0; i < lenses.length; i++) {\n            const lens = lenses[i];\n            if (!lens) {\n                continue;\n            }\n            hasSymbol = true;\n            if (lens.command) {\n                const title = renderLabelWithIcons(lens.command.title.trim());\n                if (lens.command.id) {\n                    const id = `c${(CodeLensContentWidget._idPool++)}`;\n                    children.push($('a', { id, title: lens.command.tooltip, role: 'button' }, ...title));\n                    this._commands.set(id, lens.command);\n                }\n                else {\n                    children.push($('span', { title: lens.command.tooltip }, ...title));\n                }\n                if (i + 1 < lenses.length) {\n                    children.push($('span', undefined, '\\u00a0|\\u00a0'));\n                }\n            }\n        }\n        if (!hasSymbol) {\n            // symbols but no commands\n            reset(this._domNode, $('span', undefined, 'no commands'));\n        }\n        else {\n            // symbols and commands\n            reset(this._domNode, ...children);\n            if (this._isEmpty && animate) {\n                this._domNode.classList.add('fadein');\n            }\n            this._isEmpty = false;\n        }\n    }\n    getCommand(link) {\n        return link.parentElement === this._domNode\n            ? this._commands.get(link.id)\n            : undefined;\n    }\n    getId() {\n        return this._id;\n    }\n    getDomNode() {\n        return this._domNode;\n    }\n    updatePosition(line) {\n        const column = this._editor.getModel().getLineFirstNonWhitespaceColumn(line);\n        this._widgetPosition = {\n            position: { lineNumber: line, column: column },\n            preference: [1 /* ContentWidgetPositionPreference.ABOVE */]\n        };\n    }\n    getPosition() {\n        return this._widgetPosition || null;\n    }\n}\nclass CodeLensHelper {\n    constructor() {\n        this._removeDecorations = [];\n        this._addDecorations = [];\n        this._addDecorationsCallbacks = [];\n    }\n    addDecoration(decoration, callback) {\n        this._addDecorations.push(decoration);\n        this._addDecorationsCallbacks.push(callback);\n    }\n    removeDecoration(decorationId) {\n        this._removeDecorations.push(decorationId);\n    }\n    commit(changeAccessor) {\n        const resultingDecorations = changeAccessor.deltaDecorations(this._removeDecorations, this._addDecorations);\n        for (let i = 0, len = resultingDecorations.length; i < len; i++) {\n            this._addDecorationsCallbacks[i](resultingDecorations[i]);\n        }\n    }\n}\nconst codeLensDecorationOptions = ModelDecorationOptions.register({\n    collapseOnReplaceEdit: true,\n    description: 'codelens'\n});\nclass CodeLensWidget {\n    constructor(data, editor, helper, viewZoneChangeAccessor, heightInPx, updateCallback) {\n        this._isDisposed = false;\n        this._editor = editor;\n        this._data = data;\n        // create combined range, track all ranges with decorations,\n        // check if there is already something to render\n        this._decorationIds = [];\n        let range;\n        const lenses = [];\n        this._data.forEach((codeLensData, i) => {\n            if (codeLensData.symbol.command) {\n                lenses.push(codeLensData.symbol);\n            }\n            helper.addDecoration({\n                range: codeLensData.symbol.range,\n                options: codeLensDecorationOptions\n            }, id => this._decorationIds[i] = id);\n            // the range contains all lenses on this line\n            if (!range) {\n                range = Range.lift(codeLensData.symbol.range);\n            }\n            else {\n                range = Range.plusRange(range, codeLensData.symbol.range);\n            }\n        });\n        this._viewZone = new CodeLensViewZone(range.startLineNumber - 1, heightInPx, updateCallback);\n        this._viewZoneId = viewZoneChangeAccessor.addZone(this._viewZone);\n        if (lenses.length > 0) {\n            this._createContentWidgetIfNecessary();\n            this._contentWidget.withCommands(lenses, false);\n        }\n    }\n    _createContentWidgetIfNecessary() {\n        if (!this._contentWidget) {\n            this._contentWidget = new CodeLensContentWidget(this._editor, this._viewZone.afterLineNumber + 1);\n            this._editor.addContentWidget(this._contentWidget);\n        }\n        else {\n            this._editor.layoutContentWidget(this._contentWidget);\n        }\n    }\n    dispose(helper, viewZoneChangeAccessor) {\n        this._decorationIds.forEach(helper.removeDecoration, helper);\n        this._decorationIds = [];\n        viewZoneChangeAccessor?.removeZone(this._viewZoneId);\n        if (this._contentWidget) {\n            this._editor.removeContentWidget(this._contentWidget);\n            this._contentWidget = undefined;\n        }\n        this._isDisposed = true;\n    }\n    isDisposed() {\n        return this._isDisposed;\n    }\n    isValid() {\n        return this._decorationIds.some((id, i) => {\n            const range = this._editor.getModel().getDecorationRange(id);\n            const symbol = this._data[i].symbol;\n            return !!(range && Range.isEmpty(symbol.range) === range.isEmpty());\n        });\n    }\n    updateCodeLensSymbols(data, helper) {\n        this._decorationIds.forEach(helper.removeDecoration, helper);\n        this._decorationIds = [];\n        this._data = data;\n        this._data.forEach((codeLensData, i) => {\n            helper.addDecoration({\n                range: codeLensData.symbol.range,\n                options: codeLensDecorationOptions\n            }, id => this._decorationIds[i] = id);\n        });\n    }\n    updateHeight(height, viewZoneChangeAccessor) {\n        this._viewZone.heightInPx = height;\n        viewZoneChangeAccessor.layoutZone(this._viewZoneId);\n        if (this._contentWidget) {\n            this._editor.layoutContentWidget(this._contentWidget);\n        }\n    }\n    computeIfNecessary(model) {\n        if (!this._viewZone.isVisible()) {\n            return null;\n        }\n        // Read editor current state\n        for (let i = 0; i < this._decorationIds.length; i++) {\n            const range = model.getDecorationRange(this._decorationIds[i]);\n            if (range) {\n                this._data[i].symbol.range = range;\n            }\n        }\n        return this._data;\n    }\n    updateCommands(symbols) {\n        this._createContentWidgetIfNecessary();\n        this._contentWidget.withCommands(symbols, true);\n        for (let i = 0; i < this._data.length; i++) {\n            const resolved = symbols[i];\n            if (resolved) {\n                const { symbol } = this._data[i];\n                symbol.command = resolved.command || symbol.command;\n            }\n        }\n    }\n    getCommand(link) {\n        return this._contentWidget?.getCommand(link);\n    }\n    getLineNumber() {\n        const range = this._editor.getModel().getDecorationRange(this._decorationIds[0]);\n        if (range) {\n            return range.startLineNumber;\n        }\n        return -1;\n    }\n    update(viewZoneChangeAccessor) {\n        if (this.isValid()) {\n            const range = this._editor.getModel().getDecorationRange(this._decorationIds[0]);\n            if (range) {\n                this._viewZone.afterLineNumber = range.startLineNumber - 1;\n                viewZoneChangeAccessor.layoutZone(this._viewZoneId);\n                if (this._contentWidget) {\n                    this._contentWidget.updatePosition(range.startLineNumber);\n                    this._editor.layoutContentWidget(this._contentWidget);\n                }\n            }\n        }\n    }\n}\n\nexport { CodeLensHelper, CodeLensWidget };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\n\nconst IEnvironmentService = createDecorator('environmentService');\n\nexport { IEnvironmentService };\n","import { doHash } from '../../../base/common/hash.js';\nimport { LRUCache } from '../../../base/common/map.js';\nimport { MovingAverage, clamp, SlidingWindowAverage } from '../../../base/common/numbers.js';\nimport { IEnvironmentService } from '../../../platform/environment/common/environment.js';\nimport { registerSingleton } from '../../../platform/instantiation/common/extensions.js';\nimport { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\nimport { ILogService } from '../../../platform/log/common/log.js';\nimport { matchesScheme } from '../../../base/common/network.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst ILanguageFeatureDebounceService = createDecorator('ILanguageFeatureDebounceService');\nvar IdentityHash;\n(function (IdentityHash) {\n    const _hashes = new WeakMap();\n    let pool = 0;\n    function of(obj) {\n        let value = _hashes.get(obj);\n        if (value === undefined) {\n            value = ++pool;\n            _hashes.set(obj, value);\n        }\n        return value;\n    }\n    IdentityHash.of = of;\n})(IdentityHash || (IdentityHash = {}));\nclass NullDebounceInformation {\n    constructor(_default) {\n        this._default = _default;\n    }\n    get(_model) {\n        return this._default;\n    }\n    update(_model, _value) {\n        return this._default;\n    }\n    default() {\n        return this._default;\n    }\n}\nclass FeatureDebounceInformation {\n    constructor(_logService, _name, _registry, _default, _min, _max) {\n        this._logService = _logService;\n        this._name = _name;\n        this._registry = _registry;\n        this._default = _default;\n        this._min = _min;\n        this._max = _max;\n        this._cache = new LRUCache(50, 0.7);\n    }\n    _key(model) {\n        return model.id + this._registry.all(model).reduce((hashVal, obj) => doHash(IdentityHash.of(obj), hashVal), 0);\n    }\n    get(model) {\n        const key = this._key(model);\n        const avg = this._cache.get(key);\n        return avg\n            ? clamp(avg.value, this._min, this._max)\n            : this.default();\n    }\n    update(model, value) {\n        const key = this._key(model);\n        let avg = this._cache.get(key);\n        if (!avg) {\n            avg = new SlidingWindowAverage(6);\n            this._cache.set(key, avg);\n        }\n        const newValue = clamp(avg.update(value), this._min, this._max);\n        if (!matchesScheme(model.uri, 'output')) {\n            this._logService.trace(`[DEBOUNCE: ${this._name}] for ${model.uri.toString()} is ${newValue}ms`);\n        }\n        return newValue;\n    }\n    _overall() {\n        const result = new MovingAverage();\n        for (const [, avg] of this._cache) {\n            result.update(avg.value);\n        }\n        return result.value;\n    }\n    default() {\n        const value = (this._overall() | 0) || this._default;\n        return clamp(value, this._min, this._max);\n    }\n}\nlet LanguageFeatureDebounceService = class LanguageFeatureDebounceService {\n    constructor(_logService, envService) {\n        this._logService = _logService;\n        this._data = new Map();\n        this._isDev = envService.isExtensionDevelopment || !envService.isBuilt;\n    }\n    for(feature, name, config) {\n        const min = config?.min ?? 50;\n        const max = config?.max ?? min ** 2;\n        const extra = config?.key ?? undefined;\n        const key = `${IdentityHash.of(feature)},${min}${extra ? ',' + extra : ''}`;\n        let info = this._data.get(key);\n        if (!info) {\n            if (this._isDev) {\n                this._logService.debug(`[DEBOUNCE: ${name}] is disabled in developed mode`);\n                info = new NullDebounceInformation(min * 1.5);\n            }\n            else {\n                info = new FeatureDebounceInformation(this._logService, name, feature, (this._overallAverage() | 0) || (min * 1.5), // default is overall default or derived from min-value\n                min, max);\n            }\n            this._data.set(key, info);\n        }\n        return info;\n    }\n    _overallAverage() {\n        // Average of all language features. Not a great value but an approximation\n        const result = new MovingAverage();\n        for (const info of this._data.values()) {\n            result.update(info.default());\n        }\n        return result.value;\n    }\n};\nLanguageFeatureDebounceService = __decorate([\n    __param(0, ILogService),\n    __param(1, IEnvironmentService)\n], LanguageFeatureDebounceService);\nregisterSingleton(ILanguageFeatureDebounceService, LanguageFeatureDebounceService, 1 /* InstantiationType.Delayed */);\n\nexport { ILanguageFeatureDebounceService, LanguageFeatureDebounceService };\n","import { RunOnceScheduler, disposableTimeout, createCancelablePromise } from '../../../../base/common/async.js';\nimport { onUnexpectedError, onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { DisposableStore, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { StableEditorScrollState } from '../../../browser/stableEditorScroll.js';\nimport { registerEditorContribution, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { EDITOR_FONT_DEFAULTS } from '../../../common/config/fontInfo.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { getCodeLensModel } from './codelens.js';\nimport { ICodeLensCache } from './codeLensCache.js';\nimport { CodeLensHelper, CodeLensWidget } from './codelensWidget.js';\nimport { localize2, localize } from '../../../../nls.js';\nimport { ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { INotificationService } from '../../../../platform/notification/common/notification.js';\nimport { IQuickInputService } from '../../../../platform/quickinput/common/quickInput.js';\nimport { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet CodeLensContribution = class CodeLensContribution {\n    static { this.ID = 'css.editor.codeLens'; }\n    constructor(_editor, _languageFeaturesService, debounceService, _commandService, _notificationService, _codeLensCache) {\n        this._editor = _editor;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._commandService = _commandService;\n        this._notificationService = _notificationService;\n        this._codeLensCache = _codeLensCache;\n        this._disposables = new DisposableStore();\n        this._localToDispose = new DisposableStore();\n        this._lenses = [];\n        this._oldCodeLensModels = new DisposableStore();\n        this._provideCodeLensDebounce = debounceService.for(_languageFeaturesService.codeLensProvider, 'CodeLensProvide', { min: 250 });\n        this._resolveCodeLensesDebounce = debounceService.for(_languageFeaturesService.codeLensProvider, 'CodeLensResolve', { min: 250, salt: 'resolve' });\n        this._resolveCodeLensesScheduler = new RunOnceScheduler(() => this._resolveCodeLensesInViewport(), this._resolveCodeLensesDebounce.default());\n        this._disposables.add(this._editor.onDidChangeModel(() => this._onModelChange()));\n        this._disposables.add(this._editor.onDidChangeModelLanguage(() => this._onModelChange()));\n        this._disposables.add(this._editor.onDidChangeConfiguration((e) => {\n            if (e.hasChanged(59 /* EditorOption.fontInfo */) || e.hasChanged(25 /* EditorOption.codeLensFontSize */) || e.hasChanged(24 /* EditorOption.codeLensFontFamily */)) {\n                this._updateLensStyle();\n            }\n            if (e.hasChanged(23 /* EditorOption.codeLens */)) {\n                this._onModelChange();\n            }\n        }));\n        this._disposables.add(_languageFeaturesService.codeLensProvider.onDidChange(this._onModelChange, this));\n        this._onModelChange();\n        this._updateLensStyle();\n    }\n    dispose() {\n        this._localDispose();\n        this._localToDispose.dispose();\n        this._disposables.dispose();\n        this._oldCodeLensModels.dispose();\n        this._currentCodeLensModel?.dispose();\n    }\n    _getLayoutInfo() {\n        const lineHeightFactor = Math.max(1.3, this._editor.getOption(75 /* EditorOption.lineHeight */) / this._editor.getOption(61 /* EditorOption.fontSize */));\n        let fontSize = this._editor.getOption(25 /* EditorOption.codeLensFontSize */);\n        if (!fontSize || fontSize < 5) {\n            fontSize = (this._editor.getOption(61 /* EditorOption.fontSize */) * .9) | 0;\n        }\n        return {\n            fontSize,\n            codeLensHeight: (fontSize * lineHeightFactor) | 0,\n        };\n    }\n    _updateLensStyle() {\n        const { codeLensHeight, fontSize } = this._getLayoutInfo();\n        const fontFamily = this._editor.getOption(24 /* EditorOption.codeLensFontFamily */);\n        const editorFontInfo = this._editor.getOption(59 /* EditorOption.fontInfo */);\n        const { style } = this._editor.getContainerDomNode();\n        style.setProperty('--vscode-editorCodeLens-lineHeight', `${codeLensHeight}px`);\n        style.setProperty('--vscode-editorCodeLens-fontSize', `${fontSize}px`);\n        style.setProperty('--vscode-editorCodeLens-fontFeatureSettings', editorFontInfo.fontFeatureSettings);\n        if (fontFamily) {\n            style.setProperty('--vscode-editorCodeLens-fontFamily', fontFamily);\n            style.setProperty('--vscode-editorCodeLens-fontFamilyDefault', EDITOR_FONT_DEFAULTS.fontFamily);\n        }\n        //\n        this._editor.changeViewZones(accessor => {\n            for (const lens of this._lenses) {\n                lens.updateHeight(codeLensHeight, accessor);\n            }\n        });\n    }\n    _localDispose() {\n        this._getCodeLensModelPromise?.cancel();\n        this._getCodeLensModelPromise = undefined;\n        this._resolveCodeLensesPromise?.cancel();\n        this._resolveCodeLensesPromise = undefined;\n        this._localToDispose.clear();\n        this._oldCodeLensModels.clear();\n        this._currentCodeLensModel?.dispose();\n    }\n    _onModelChange() {\n        this._localDispose();\n        const model = this._editor.getModel();\n        if (!model) {\n            return;\n        }\n        if (!this._editor.getOption(23 /* EditorOption.codeLens */) || model.isTooLargeForTokenization()) {\n            return;\n        }\n        const cachedLenses = this._codeLensCache.get(model);\n        if (cachedLenses) {\n            this._renderCodeLensSymbols(cachedLenses);\n        }\n        if (!this._languageFeaturesService.codeLensProvider.has(model)) {\n            // no provider -> return but check with\n            // cached lenses. they expire after 30 seconds\n            if (cachedLenses) {\n                disposableTimeout(() => {\n                    const cachedLensesNow = this._codeLensCache.get(model);\n                    if (cachedLenses === cachedLensesNow) {\n                        this._codeLensCache.delete(model);\n                        this._onModelChange();\n                    }\n                }, 30 * 1000, this._localToDispose);\n            }\n            return;\n        }\n        for (const provider of this._languageFeaturesService.codeLensProvider.all(model)) {\n            if (typeof provider.onDidChange === 'function') {\n                const registration = provider.onDidChange(() => scheduler.schedule());\n                this._localToDispose.add(registration);\n            }\n        }\n        const scheduler = new RunOnceScheduler(() => {\n            const t1 = Date.now();\n            this._getCodeLensModelPromise?.cancel();\n            this._getCodeLensModelPromise = createCancelablePromise(token => getCodeLensModel(this._languageFeaturesService.codeLensProvider, model, token));\n            this._getCodeLensModelPromise.then(result => {\n                if (this._currentCodeLensModel) {\n                    this._oldCodeLensModels.add(this._currentCodeLensModel);\n                }\n                this._currentCodeLensModel = result;\n                // cache model to reduce flicker\n                this._codeLensCache.put(model, result);\n                // update moving average\n                const newDelay = this._provideCodeLensDebounce.update(model, Date.now() - t1);\n                scheduler.delay = newDelay;\n                // render lenses\n                this._renderCodeLensSymbols(result);\n                // dom.scheduleAtNextAnimationFrame(() => this._resolveCodeLensesInViewport());\n                this._resolveCodeLensesInViewportSoon();\n            }, onUnexpectedError);\n        }, this._provideCodeLensDebounce.get(model));\n        this._localToDispose.add(scheduler);\n        this._localToDispose.add(toDisposable(() => this._resolveCodeLensesScheduler.cancel()));\n        this._localToDispose.add(this._editor.onDidChangeModelContent(() => {\n            this._editor.changeDecorations(decorationsAccessor => {\n                this._editor.changeViewZones(viewZonesAccessor => {\n                    const toDispose = [];\n                    let lastLensLineNumber = -1;\n                    this._lenses.forEach((lens) => {\n                        if (!lens.isValid() || lastLensLineNumber === lens.getLineNumber()) {\n                            // invalid -> lens collapsed, attach range doesn't exist anymore\n                            // line_number -> lenses should never be on the same line\n                            toDispose.push(lens);\n                        }\n                        else {\n                            lens.update(viewZonesAccessor);\n                            lastLensLineNumber = lens.getLineNumber();\n                        }\n                    });\n                    const helper = new CodeLensHelper();\n                    toDispose.forEach((l) => {\n                        l.dispose(helper, viewZonesAccessor);\n                        this._lenses.splice(this._lenses.indexOf(l), 1);\n                    });\n                    helper.commit(decorationsAccessor);\n                });\n            });\n            // Ask for all references again\n            scheduler.schedule();\n            // Cancel pending and active resolve requests\n            this._resolveCodeLensesScheduler.cancel();\n            this._resolveCodeLensesPromise?.cancel();\n            this._resolveCodeLensesPromise = undefined;\n        }));\n        this._localToDispose.add(this._editor.onDidFocusEditorText(() => {\n            scheduler.schedule();\n        }));\n        this._localToDispose.add(this._editor.onDidBlurEditorText(() => {\n            scheduler.cancel();\n        }));\n        this._localToDispose.add(this._editor.onDidScrollChange(e => {\n            if (e.scrollTopChanged && this._lenses.length > 0) {\n                this._resolveCodeLensesInViewportSoon();\n            }\n        }));\n        this._localToDispose.add(this._editor.onDidLayoutChange(() => {\n            this._resolveCodeLensesInViewportSoon();\n        }));\n        this._localToDispose.add(toDisposable(() => {\n            if (this._editor.getModel()) {\n                const scrollState = StableEditorScrollState.capture(this._editor);\n                this._editor.changeDecorations(decorationsAccessor => {\n                    this._editor.changeViewZones(viewZonesAccessor => {\n                        this._disposeAllLenses(decorationsAccessor, viewZonesAccessor);\n                    });\n                });\n                scrollState.restore(this._editor);\n            }\n            else {\n                // No accessors available\n                this._disposeAllLenses(undefined, undefined);\n            }\n        }));\n        this._localToDispose.add(this._editor.onMouseDown(e => {\n            if (e.target.type !== 9 /* MouseTargetType.CONTENT_WIDGET */) {\n                return;\n            }\n            let target = e.target.element;\n            if (target?.tagName === 'SPAN') {\n                target = target.parentElement;\n            }\n            if (target?.tagName === 'A') {\n                for (const lens of this._lenses) {\n                    const command = lens.getCommand(target);\n                    if (command) {\n                        this._commandService.executeCommand(command.id, ...(command.arguments || [])).catch(err => this._notificationService.error(err));\n                        break;\n                    }\n                }\n            }\n        }));\n        scheduler.schedule();\n    }\n    _disposeAllLenses(decChangeAccessor, viewZoneChangeAccessor) {\n        const helper = new CodeLensHelper();\n        for (const lens of this._lenses) {\n            lens.dispose(helper, viewZoneChangeAccessor);\n        }\n        if (decChangeAccessor) {\n            helper.commit(decChangeAccessor);\n        }\n        this._lenses.length = 0;\n    }\n    _renderCodeLensSymbols(symbols) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        const maxLineNumber = this._editor.getModel().getLineCount();\n        const groups = [];\n        let lastGroup;\n        for (const symbol of symbols.lenses) {\n            const line = symbol.symbol.range.startLineNumber;\n            if (line < 1 || line > maxLineNumber) {\n                // invalid code lens\n                continue;\n            }\n            else if (lastGroup && lastGroup[lastGroup.length - 1].symbol.range.startLineNumber === line) {\n                // on same line as previous\n                lastGroup.push(symbol);\n            }\n            else {\n                // on later line as previous\n                lastGroup = [symbol];\n                groups.push(lastGroup);\n            }\n        }\n        if (!groups.length && !this._lenses.length) {\n            // Nothing to change\n            return;\n        }\n        const scrollState = StableEditorScrollState.capture(this._editor);\n        const layoutInfo = this._getLayoutInfo();\n        this._editor.changeDecorations(decorationsAccessor => {\n            this._editor.changeViewZones(viewZoneAccessor => {\n                const helper = new CodeLensHelper();\n                let codeLensIndex = 0;\n                let groupsIndex = 0;\n                while (groupsIndex < groups.length && codeLensIndex < this._lenses.length) {\n                    const symbolsLineNumber = groups[groupsIndex][0].symbol.range.startLineNumber;\n                    const codeLensLineNumber = this._lenses[codeLensIndex].getLineNumber();\n                    if (codeLensLineNumber < symbolsLineNumber) {\n                        this._lenses[codeLensIndex].dispose(helper, viewZoneAccessor);\n                        this._lenses.splice(codeLensIndex, 1);\n                    }\n                    else if (codeLensLineNumber === symbolsLineNumber) {\n                        this._lenses[codeLensIndex].updateCodeLensSymbols(groups[groupsIndex], helper);\n                        groupsIndex++;\n                        codeLensIndex++;\n                    }\n                    else {\n                        this._lenses.splice(codeLensIndex, 0, new CodeLensWidget(groups[groupsIndex], this._editor, helper, viewZoneAccessor, layoutInfo.codeLensHeight, () => this._resolveCodeLensesInViewportSoon()));\n                        codeLensIndex++;\n                        groupsIndex++;\n                    }\n                }\n                // Delete extra code lenses\n                while (codeLensIndex < this._lenses.length) {\n                    this._lenses[codeLensIndex].dispose(helper, viewZoneAccessor);\n                    this._lenses.splice(codeLensIndex, 1);\n                }\n                // Create extra symbols\n                while (groupsIndex < groups.length) {\n                    this._lenses.push(new CodeLensWidget(groups[groupsIndex], this._editor, helper, viewZoneAccessor, layoutInfo.codeLensHeight, () => this._resolveCodeLensesInViewportSoon()));\n                    groupsIndex++;\n                }\n                helper.commit(decorationsAccessor);\n            });\n        });\n        scrollState.restore(this._editor);\n    }\n    _resolveCodeLensesInViewportSoon() {\n        const model = this._editor.getModel();\n        if (model) {\n            this._resolveCodeLensesScheduler.schedule();\n        }\n    }\n    _resolveCodeLensesInViewport() {\n        this._resolveCodeLensesPromise?.cancel();\n        this._resolveCodeLensesPromise = undefined;\n        const model = this._editor.getModel();\n        if (!model) {\n            return;\n        }\n        const toResolve = [];\n        const lenses = [];\n        this._lenses.forEach((lens) => {\n            const request = lens.computeIfNecessary(model);\n            if (request) {\n                toResolve.push(request);\n                lenses.push(lens);\n            }\n        });\n        if (toResolve.length === 0) {\n            this._oldCodeLensModels.clear();\n            return;\n        }\n        const t1 = Date.now();\n        const resolvePromise = createCancelablePromise(token => {\n            const promises = toResolve.map((request, i) => {\n                const resolvedSymbols = new Array(request.length);\n                const promises = request.map((request, i) => {\n                    if (!request.symbol.command && typeof request.provider.resolveCodeLens === 'function') {\n                        return Promise.resolve(request.provider.resolveCodeLens(model, request.symbol, token)).then(symbol => {\n                            resolvedSymbols[i] = symbol;\n                        }, onUnexpectedExternalError);\n                    }\n                    else {\n                        resolvedSymbols[i] = request.symbol;\n                        return Promise.resolve(undefined);\n                    }\n                });\n                return Promise.all(promises).then(() => {\n                    if (!token.isCancellationRequested && !lenses[i].isDisposed()) {\n                        lenses[i].updateCommands(resolvedSymbols);\n                    }\n                });\n            });\n            return Promise.all(promises);\n        });\n        this._resolveCodeLensesPromise = resolvePromise;\n        this._resolveCodeLensesPromise.then(() => {\n            // update moving average\n            const newDelay = this._resolveCodeLensesDebounce.update(model, Date.now() - t1);\n            this._resolveCodeLensesScheduler.delay = newDelay;\n            if (this._currentCodeLensModel) { // update the cached state with new resolved items\n                this._codeLensCache.put(model, this._currentCodeLensModel);\n            }\n            this._oldCodeLensModels.clear(); // dispose old models once we have updated the UI with the current model\n            if (resolvePromise === this._resolveCodeLensesPromise) {\n                this._resolveCodeLensesPromise = undefined;\n            }\n        }, err => {\n            onUnexpectedError(err); // can also be cancellation!\n            if (resolvePromise === this._resolveCodeLensesPromise) {\n                this._resolveCodeLensesPromise = undefined;\n            }\n        });\n    }\n    async getModel() {\n        await this._getCodeLensModelPromise;\n        await this._resolveCodeLensesPromise;\n        return !this._currentCodeLensModel?.isDisposed\n            ? this._currentCodeLensModel\n            : undefined;\n    }\n};\nCodeLensContribution = __decorate([\n    __param(1, ILanguageFeaturesService),\n    __param(2, ILanguageFeatureDebounceService),\n    __param(3, ICommandService),\n    __param(4, INotificationService),\n    __param(5, ICodeLensCache)\n], CodeLensContribution);\nregisterEditorContribution(CodeLensContribution.ID, CodeLensContribution, 1 /* EditorContributionInstantiation.AfterFirstRender */);\nregisterEditorAction(class ShowLensesInCurrentLine extends EditorAction {\n    constructor() {\n        super({\n            id: 'codelens.showLensesInCurrentLine',\n            precondition: EditorContextKeys.hasCodeLensProvider,\n            label: localize2(884, \"Show CodeLens Commands for Current Line\"),\n        });\n    }\n    async run(accessor, editor) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const quickInputService = accessor.get(IQuickInputService);\n        const commandService = accessor.get(ICommandService);\n        const notificationService = accessor.get(INotificationService);\n        const lineNumber = editor.getSelection().positionLineNumber;\n        const codelensController = editor.getContribution(CodeLensContribution.ID);\n        if (!codelensController) {\n            return;\n        }\n        const model = await codelensController.getModel();\n        if (!model) {\n            // nothing\n            return;\n        }\n        const items = [];\n        for (const lens of model.lenses) {\n            if (lens.symbol.command && lens.symbol.range.startLineNumber === lineNumber) {\n                items.push({\n                    label: lens.symbol.command.title,\n                    command: lens.symbol.command\n                });\n            }\n        }\n        if (items.length === 0) {\n            // We dont want an empty picker\n            return;\n        }\n        const item = await quickInputService.pick(items, {\n            canPickMany: false,\n            placeHolder: localize(883, \"Select a command\")\n        });\n        if (!item) {\n            // Nothing picked\n            return;\n        }\n        let command = item.command;\n        if (model.isDisposed) {\n            // try to find the same command again in-case the model has been re-created in the meantime\n            // this is a best attempt approach which shouldn't be needed because eager model re-creates\n            // shouldn't happen due to focus in/out anymore\n            const newModel = await codelensController.getModel();\n            const newLens = newModel?.lenses.find(lens => lens.symbol.range.startLineNumber === lineNumber && lens.symbol.command?.title === command.title);\n            if (!newLens || !newLens.symbol.command) {\n                return;\n            }\n            command = newLens.symbol.command;\n        }\n        try {\n            await commandService.executeCommand(command.id, ...(command.arguments || []));\n        }\n        catch (err) {\n            notificationService.error(err);\n        }\n    }\n});\n\nexport { CodeLensContribution };\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 *--------------------------------------------------------------------------------------------*/\nconst editorFeatures = [];\n/**\n * Registers an editor feature. Editor features will be instantiated only once, as soon as\n * the first code editor is instantiated.\n */\nfunction registerEditorFeature(ctor) {\n    editorFeatures.push(ctor);\n}\nfunction getEditorFeatures() {\n    return editorFeatures.slice(0);\n}\n\nexport { getEditorFeatures, registerEditorFeature };\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 *--------------------------------------------------------------------------------------------*/\nclass HoverRangeAnchor {\n    constructor(priority, range, initialMousePosX, initialMousePosY) {\n        this.priority = priority;\n        this.range = range;\n        this.initialMousePosX = initialMousePosX;\n        this.initialMousePosY = initialMousePosY;\n        this.type = 1 /* HoverAnchorType.Range */;\n    }\n    equals(other) {\n        return (other.type === 1 /* HoverAnchorType.Range */ && this.range.equalsRange(other.range));\n    }\n    canAdoptVisibleHover(lastAnchor, showAtPosition) {\n        return (lastAnchor.type === 1 /* HoverAnchorType.Range */ && showAtPosition.lineNumber === this.range.startLineNumber);\n    }\n}\nclass HoverForeignElementAnchor {\n    constructor(priority, owner, range, initialMousePosX, initialMousePosY, supportsMarkerHover) {\n        this.priority = priority;\n        this.owner = owner;\n        this.range = range;\n        this.initialMousePosX = initialMousePosX;\n        this.initialMousePosY = initialMousePosY;\n        this.supportsMarkerHover = supportsMarkerHover;\n        this.type = 2 /* HoverAnchorType.ForeignElement */;\n    }\n    equals(other) {\n        return (other.type === 2 /* HoverAnchorType.ForeignElement */ && this.owner === other.owner);\n    }\n    canAdoptVisibleHover(lastAnchor, showAtPosition) {\n        return (lastAnchor.type === 2 /* HoverAnchorType.ForeignElement */ && this.owner === lastAnchor.owner);\n    }\n}\n/**\n * Default implementation of IRenderedHoverParts.\n */\nclass RenderedHoverParts {\n    constructor(renderedHoverParts, disposables) {\n        this.renderedHoverParts = renderedHoverParts;\n        this.disposables = disposables;\n    }\n    dispose() {\n        for (const part of this.renderedHoverParts) {\n            part.dispose();\n        }\n        this.disposables?.dispose();\n    }\n}\nconst HoverParticipantRegistry = (new class HoverParticipantRegistry {\n    constructor() {\n        this._participants = [];\n    }\n    register(ctor) {\n        this._participants.push(ctor);\n    }\n    getAll() {\n        return this._participants;\n    }\n}());\n\nexport { HoverForeignElementAnchor, HoverParticipantRegistry, HoverRangeAnchor, RenderedHoverParts };\n","import { Color, RGBA } from '../../../../base/common/color.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { IEditorWorkerService } from '../../../common/services/editorWorker.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet DefaultDocumentColorProvider = class DefaultDocumentColorProvider {\n    constructor(_editorWorkerService) {\n        this._editorWorkerService = _editorWorkerService;\n    }\n    async provideDocumentColors(model, _token) {\n        return this._editorWorkerService.computeDefaultDocumentColors(model.uri);\n    }\n    provideColorPresentations(_model, colorInfo, _token) {\n        const range = colorInfo.range;\n        const colorFromInfo = colorInfo.color;\n        const alpha = colorFromInfo.alpha;\n        const color = new Color(new RGBA(Math.round(255 * colorFromInfo.red), Math.round(255 * colorFromInfo.green), Math.round(255 * colorFromInfo.blue), alpha));\n        const rgb = alpha ? Color.Format.CSS.formatRGBA(color) : Color.Format.CSS.formatRGB(color);\n        const hsl = alpha ? Color.Format.CSS.formatHSLA(color) : Color.Format.CSS.formatHSL(color);\n        const hex = alpha ? Color.Format.CSS.formatHexA(color) : Color.Format.CSS.formatHex(color);\n        const colorPresentations = [];\n        colorPresentations.push({ label: rgb, textEdit: { range: range, text: rgb } });\n        colorPresentations.push({ label: hsl, textEdit: { range: range, text: hsl } });\n        colorPresentations.push({ label: hex, textEdit: { range: range, text: hex } });\n        return colorPresentations;\n    }\n};\nDefaultDocumentColorProvider = __decorate([\n    __param(0, IEditorWorkerService)\n], DefaultDocumentColorProvider);\nlet DefaultDocumentColorProviderFeature = class DefaultDocumentColorProviderFeature extends Disposable {\n    constructor(_languageFeaturesService, editorWorkerService) {\n        super();\n        this._register(_languageFeaturesService.colorProvider.register('*', new DefaultDocumentColorProvider(editorWorkerService)));\n    }\n};\nDefaultDocumentColorProviderFeature = __decorate([\n    __param(0, ILanguageFeaturesService),\n    __param(1, IEditorWorkerService)\n], DefaultDocumentColorProviderFeature);\n\nexport { DefaultDocumentColorProvider, DefaultDocumentColorProviderFeature };\n","import { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError, illegalArgument } from '../../../../base/common/errors.js';\nimport { IModelService } from '../../../common/services/model.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { DefaultDocumentColorProvider } from './defaultDocumentColorProvider.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\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 *--------------------------------------------------------------------------------------------*/\nasync function getColors(colorProviderRegistry, model, token, defaultColorDecoratorsEnablement = 'auto') {\n    return _findColorData(new ColorDataCollector(), colorProviderRegistry, model, token, defaultColorDecoratorsEnablement);\n}\nfunction getColorPresentations(model, colorInfo, provider, token) {\n    return Promise.resolve(provider.provideColorPresentations(model, colorInfo, token));\n}\nclass ColorDataCollector {\n    constructor() { }\n    async compute(provider, model, token, colors) {\n        const documentColors = await provider.provideDocumentColors(model, token);\n        if (Array.isArray(documentColors)) {\n            for (const colorInfo of documentColors) {\n                colors.push({ colorInfo, provider });\n            }\n        }\n        return Array.isArray(documentColors);\n    }\n}\nclass ExtColorDataCollector {\n    constructor() { }\n    async compute(provider, model, token, colors) {\n        const documentColors = await provider.provideDocumentColors(model, token);\n        if (Array.isArray(documentColors)) {\n            for (const colorInfo of documentColors) {\n                colors.push({ range: colorInfo.range, color: [colorInfo.color.red, colorInfo.color.green, colorInfo.color.blue, colorInfo.color.alpha] });\n            }\n        }\n        return Array.isArray(documentColors);\n    }\n}\nclass ColorPresentationsCollector {\n    constructor(colorInfo) {\n        this.colorInfo = colorInfo;\n    }\n    async compute(provider, model, _token, colors) {\n        const documentColors = await provider.provideColorPresentations(model, this.colorInfo, CancellationToken.None);\n        if (Array.isArray(documentColors)) {\n            colors.push(...documentColors);\n        }\n        return Array.isArray(documentColors);\n    }\n}\nasync function _findColorData(collector, colorProviderRegistry, model, token, defaultColorDecoratorsEnablement) {\n    let validDocumentColorProviderFound = false;\n    let defaultProvider;\n    const colorData = [];\n    const documentColorProviders = colorProviderRegistry.ordered(model);\n    for (let i = documentColorProviders.length - 1; i >= 0; i--) {\n        const provider = documentColorProviders[i];\n        if (defaultColorDecoratorsEnablement !== 'always' && provider instanceof DefaultDocumentColorProvider) {\n            defaultProvider = provider;\n        }\n        else {\n            try {\n                if (await collector.compute(provider, model, token, colorData)) {\n                    validDocumentColorProviderFound = true;\n                }\n            }\n            catch (e) {\n                onUnexpectedExternalError(e);\n            }\n        }\n    }\n    if (validDocumentColorProviderFound) {\n        return colorData;\n    }\n    if (defaultProvider && defaultColorDecoratorsEnablement !== 'never') {\n        await collector.compute(defaultProvider, model, token, colorData);\n        return colorData;\n    }\n    return [];\n}\nfunction _setupColorCommand(accessor, resource) {\n    const { colorProvider: colorProviderRegistry } = accessor.get(ILanguageFeaturesService);\n    const model = accessor.get(IModelService).getModel(resource);\n    if (!model) {\n        throw illegalArgument();\n    }\n    const defaultColorDecoratorsEnablement = accessor.get(IConfigurationService).getValue('editor.defaultColorDecorators', { resource });\n    return { model, colorProviderRegistry, defaultColorDecoratorsEnablement };\n}\n\nexport { ColorPresentationsCollector, ExtColorDataCollector, _findColorData, _setupColorCommand, getColorPresentations, getColors };\n","import { TimeoutTimer, createCancelablePromise } from '../../../../base/common/async.js';\nimport { RGBA } from '../../../../base/common/color.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { StopWatch } from '../../../../base/common/stopwatch.js';\nimport { noBreakWhitespace } from '../../../../base/common/strings.js';\nimport { DynamicCssRules } from '../../../browser/editorDom.js';\nimport { Range } from '../../../common/core/range.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { getColors } from './color.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ColorDetector_1;\nconst ColorDecorationInjectedTextMarker = Object.create({});\nlet ColorDetector = class ColorDetector extends Disposable {\n    static { ColorDetector_1 = this; }\n    static { this.ID = 'editor.contrib.colorDetector'; }\n    static { this.RECOMPUTE_TIME = 1000; } // ms\n    constructor(_editor, _configurationService, _languageFeaturesService, languageFeatureDebounceService) {\n        super();\n        this._editor = _editor;\n        this._configurationService = _configurationService;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._localToDispose = this._register(new DisposableStore());\n        this._decorationsIds = [];\n        this._colorDatas = new Map();\n        this._decoratorLimitReporter = this._register(new DecoratorLimitReporter());\n        this._colorDecorationClassRefs = this._register(new DisposableStore());\n        this._colorDecoratorIds = this._editor.createDecorationsCollection();\n        this._ruleFactory = this._register(new DynamicCssRules(this._editor));\n        this._debounceInformation = languageFeatureDebounceService.for(_languageFeaturesService.colorProvider, 'Document Colors', { min: ColorDetector_1.RECOMPUTE_TIME });\n        this._register(_editor.onDidChangeModel(() => {\n            this._isColorDecoratorsEnabled = this.isEnabled();\n            this.updateColors();\n        }));\n        this._register(_editor.onDidChangeModelLanguage(() => this.updateColors()));\n        this._register(_languageFeaturesService.colorProvider.onDidChange(() => this.updateColors()));\n        this._register(_editor.onDidChangeConfiguration((e) => {\n            const prevIsEnabled = this._isColorDecoratorsEnabled;\n            this._isColorDecoratorsEnabled = this.isEnabled();\n            this._defaultColorDecoratorsEnablement = this._editor.getOption(167 /* EditorOption.defaultColorDecorators */);\n            const updatedColorDecoratorsSetting = prevIsEnabled !== this._isColorDecoratorsEnabled || e.hasChanged(27 /* EditorOption.colorDecoratorsLimit */);\n            const updatedDefaultColorDecoratorsSetting = e.hasChanged(167 /* EditorOption.defaultColorDecorators */);\n            if (updatedColorDecoratorsSetting || updatedDefaultColorDecoratorsSetting) {\n                if (this._isColorDecoratorsEnabled) {\n                    this.updateColors();\n                }\n                else {\n                    this.removeAllDecorations();\n                }\n            }\n        }));\n        this._timeoutTimer = null;\n        this._computePromise = null;\n        this._isColorDecoratorsEnabled = this.isEnabled();\n        this._defaultColorDecoratorsEnablement = this._editor.getOption(167 /* EditorOption.defaultColorDecorators */);\n        this.updateColors();\n    }\n    isEnabled() {\n        const model = this._editor.getModel();\n        if (!model) {\n            return false;\n        }\n        const languageId = model.getLanguageId();\n        // handle deprecated settings. [languageId].colorDecorators.enable\n        const deprecatedConfig = this._configurationService.getValue(languageId);\n        if (deprecatedConfig && typeof deprecatedConfig === 'object') {\n            // eslint-disable-next-line local/code-no-any-casts\n            const colorDecorators = deprecatedConfig['colorDecorators']; // deprecatedConfig.valueOf('.colorDecorators.enable');\n            if (colorDecorators && colorDecorators['enable'] !== undefined && !colorDecorators['enable']) {\n                return colorDecorators['enable'];\n            }\n        }\n        return this._editor.getOption(26 /* EditorOption.colorDecorators */);\n    }\n    static get(editor) {\n        return editor.getContribution(this.ID);\n    }\n    dispose() {\n        this.stop();\n        this.removeAllDecorations();\n        super.dispose();\n    }\n    updateColors() {\n        this.stop();\n        if (!this._isColorDecoratorsEnabled) {\n            return;\n        }\n        const model = this._editor.getModel();\n        if (!model || !this._languageFeaturesService.colorProvider.has(model)) {\n            return;\n        }\n        this._localToDispose.add(this._editor.onDidChangeModelContent(() => {\n            if (!this._timeoutTimer) {\n                this._timeoutTimer = new TimeoutTimer();\n                this._timeoutTimer.cancelAndSet(() => {\n                    this._timeoutTimer = null;\n                    this.beginCompute();\n                }, this._debounceInformation.get(model));\n            }\n        }));\n        this.beginCompute();\n    }\n    async beginCompute() {\n        this._computePromise = createCancelablePromise(async (token) => {\n            const model = this._editor.getModel();\n            if (!model) {\n                return [];\n            }\n            const sw = new StopWatch(false);\n            const colors = await getColors(this._languageFeaturesService.colorProvider, model, token, this._defaultColorDecoratorsEnablement);\n            this._debounceInformation.update(model, sw.elapsed());\n            return colors;\n        });\n        try {\n            const colors = await this._computePromise;\n            this.updateDecorations(colors);\n            this.updateColorDecorators(colors);\n            this._computePromise = null;\n        }\n        catch (e) {\n            onUnexpectedError(e);\n        }\n    }\n    stop() {\n        if (this._timeoutTimer) {\n            this._timeoutTimer.cancel();\n            this._timeoutTimer = null;\n        }\n        if (this._computePromise) {\n            this._computePromise.cancel();\n            this._computePromise = null;\n        }\n        this._localToDispose.clear();\n    }\n    updateDecorations(colorDatas) {\n        const decorations = colorDatas.map(c => ({\n            range: {\n                startLineNumber: c.colorInfo.range.startLineNumber,\n                startColumn: c.colorInfo.range.startColumn,\n                endLineNumber: c.colorInfo.range.endLineNumber,\n                endColumn: c.colorInfo.range.endColumn\n            },\n            options: ModelDecorationOptions.EMPTY\n        }));\n        this._editor.changeDecorations((changeAccessor) => {\n            this._decorationsIds = changeAccessor.deltaDecorations(this._decorationsIds, decorations);\n            this._colorDatas = new Map();\n            this._decorationsIds.forEach((id, i) => this._colorDatas.set(id, colorDatas[i]));\n        });\n    }\n    updateColorDecorators(colorData) {\n        this._colorDecorationClassRefs.clear();\n        const decorations = [];\n        const limit = this._editor.getOption(27 /* EditorOption.colorDecoratorsLimit */);\n        for (let i = 0; i < colorData.length && decorations.length < limit; i++) {\n            const { red, green, blue, alpha } = colorData[i].colorInfo.color;\n            const rgba = new RGBA(Math.round(red * 255), Math.round(green * 255), Math.round(blue * 255), alpha);\n            const color = `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n            const ref = this._colorDecorationClassRefs.add(this._ruleFactory.createClassNameRef({\n                backgroundColor: color\n            }));\n            decorations.push({\n                range: {\n                    startLineNumber: colorData[i].colorInfo.range.startLineNumber,\n                    startColumn: colorData[i].colorInfo.range.startColumn,\n                    endLineNumber: colorData[i].colorInfo.range.endLineNumber,\n                    endColumn: colorData[i].colorInfo.range.endColumn\n                },\n                options: {\n                    description: 'colorDetector',\n                    before: {\n                        content: noBreakWhitespace,\n                        inlineClassName: `${ref.className} colorpicker-color-decoration`,\n                        inlineClassNameAffectsLetterSpacing: true,\n                        attachedData: ColorDecorationInjectedTextMarker\n                    }\n                }\n            });\n        }\n        const limited = limit < colorData.length ? limit : false;\n        this._decoratorLimitReporter.update(colorData.length, limited);\n        this._colorDecoratorIds.set(decorations);\n    }\n    removeAllDecorations() {\n        this._editor.removeDecorations(this._decorationsIds);\n        this._decorationsIds = [];\n        this._colorDecoratorIds.clear();\n        this._colorDecorationClassRefs.clear();\n    }\n    getColorData(position) {\n        const model = this._editor.getModel();\n        if (!model) {\n            return null;\n        }\n        const decorations = model\n            .getDecorationsInRange(Range.fromPositions(position, position))\n            .filter(d => this._colorDatas.has(d.id));\n        if (decorations.length === 0) {\n            return null;\n        }\n        return this._colorDatas.get(decorations[0].id);\n    }\n    isColorDecoration(decoration) {\n        return this._colorDecoratorIds.has(decoration);\n    }\n};\nColorDetector = ColorDetector_1 = __decorate([\n    __param(1, IConfigurationService),\n    __param(2, ILanguageFeaturesService),\n    __param(3, ILanguageFeatureDebounceService)\n], ColorDetector);\nclass DecoratorLimitReporter extends Disposable {\n    constructor() {\n        super(...arguments);\n        this._onDidChange = this._register(new Emitter());\n        this._computed = 0;\n        this._limited = false;\n    }\n    update(computed, limited) {\n        if (computed !== this._computed || limited !== this._limited) {\n            this._computed = computed;\n            this._limited = limited;\n            this._onDidChange.fire();\n        }\n    }\n}\n\nexport { ColorDecorationInjectedTextMarker, ColorDetector, DecoratorLimitReporter };\n","import { localize } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nconst SHOW_OR_FOCUS_HOVER_ACTION_ID = 'editor.action.showHover';\nconst SHOW_DEFINITION_PREVIEW_HOVER_ACTION_ID = 'editor.action.showDefinitionPreviewHover';\nconst HIDE_HOVER_ACTION_ID = 'editor.action.hideHover';\nconst SCROLL_UP_HOVER_ACTION_ID = 'editor.action.scrollUpHover';\nconst SCROLL_DOWN_HOVER_ACTION_ID = 'editor.action.scrollDownHover';\nconst SCROLL_LEFT_HOVER_ACTION_ID = 'editor.action.scrollLeftHover';\nconst SCROLL_RIGHT_HOVER_ACTION_ID = 'editor.action.scrollRightHover';\nconst PAGE_UP_HOVER_ACTION_ID = 'editor.action.pageUpHover';\nconst PAGE_DOWN_HOVER_ACTION_ID = 'editor.action.pageDownHover';\nconst GO_TO_TOP_HOVER_ACTION_ID = 'editor.action.goToTopHover';\nconst GO_TO_BOTTOM_HOVER_ACTION_ID = 'editor.action.goToBottomHover';\nconst INCREASE_HOVER_VERBOSITY_ACTION_ID = 'editor.action.increaseHoverVerbosityLevel';\nconst INCREASE_HOVER_VERBOSITY_ACTION_LABEL = localize(1102, \"Increase Hover Verbosity Level\");\nconst DECREASE_HOVER_VERBOSITY_ACTION_ID = 'editor.action.decreaseHoverVerbosityLevel';\nconst DECREASE_HOVER_VERBOSITY_ACTION_LABEL = localize(1103, \"Decrease Hover Verbosity Level\");\n\nexport { DECREASE_HOVER_VERBOSITY_ACTION_ID, DECREASE_HOVER_VERBOSITY_ACTION_LABEL, GO_TO_BOTTOM_HOVER_ACTION_ID, GO_TO_TOP_HOVER_ACTION_ID, HIDE_HOVER_ACTION_ID, INCREASE_HOVER_VERBOSITY_ACTION_ID, INCREASE_HOVER_VERBOSITY_ACTION_LABEL, PAGE_DOWN_HOVER_ACTION_ID, PAGE_UP_HOVER_ACTION_ID, SCROLL_DOWN_HOVER_ACTION_ID, SCROLL_LEFT_HOVER_ACTION_ID, SCROLL_RIGHT_HOVER_ACTION_ID, SCROLL_UP_HOVER_ACTION_ID, SHOW_DEFINITION_PREVIEW_HOVER_ACTION_ID, SHOW_OR_FOCUS_HOVER_ACTION_ID };\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 *--------------------------------------------------------------------------------------------*/\nconst inlineSuggestCommitId = 'editor.action.inlineSuggest.commit';\nconst showPreviousInlineSuggestionActionId = 'editor.action.inlineSuggest.showPrevious';\nconst showNextInlineSuggestionActionId = 'editor.action.inlineSuggest.showNext';\nconst jumpToNextInlineEditId = 'editor.action.inlineSuggest.jump';\nconst hideInlineCompletionId = 'editor.action.inlineSuggest.hide';\nconst toggleShowCollapsedId = 'editor.action.inlineSuggest.toggleShowCollapsed';\n\nexport { hideInlineCompletionId, inlineSuggestCommitId, jumpToNextInlineEditId, showNextInlineSuggestionActionId, showPreviousInlineSuggestionActionId, toggleShowCollapsedId };\n","import { n, h } from '../../../../../base/browser/dom.js';\nimport { renderMarkdown } from '../../../../../base/browser/markdownRenderer.js';\nimport { ActionViewItem } from '../../../../../base/browser/ui/actionbar/actionViewItems.js';\nimport { KeybindingLabel, unthemedKeybindingLabelOptions } from '../../../../../base/browser/ui/keybindingLabel/keybindingLabel.js';\nimport { Action, Separator } from '../../../../../base/common/actions.js';\nimport { equals } from '../../../../../base/common/arrays.js';\nimport { RunOnceScheduler } from '../../../../../base/common/async.js';\nimport { Codicon } from '../../../../../base/common/codicons.js';\nimport { createHotClass } from '../../../../../base/common/hotReloadHelpers.js';\nimport { Disposable, toDisposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { OS } from '../../../../../base/common/platform.js';\nimport { ThemeIcon } from '../../../../../base/common/themables.js';\nimport { localize } from '../../../../../nls.js';\nimport { MenuEntryActionViewItem, getActionBarActions } from '../../../../../platform/actions/browser/menuEntryActionViewItem.js';\nimport { WorkbenchToolBar } from '../../../../../platform/actions/browser/toolbar.js';\nimport { MenuId, MenuItemAction, IMenuService } from '../../../../../platform/actions/common/actions.js';\nimport { ICommandService } from '../../../../../platform/commands/common/commands.js';\nimport { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { IContextMenuService } from '../../../../../platform/contextview/browser/contextView.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';\nimport { ITelemetryService } from '../../../../../platform/telemetry/common/telemetry.js';\nimport { registerIcon } from '../../../../../platform/theme/common/iconRegistry.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { InlineCompletionTriggerKind } from '../../../../common/languages.js';\nimport { showPreviousInlineSuggestionActionId, showNextInlineSuggestionActionId } from '../controller/commandIds.js';\nimport './inlineCompletionsHintsWidget.css';\nimport { derivedObservableWithCache } from '../../../../../base/common/observableInternal/utils/utils.js';\nimport { derived } from '../../../../../base/common/observableInternal/observables/derived.js';\nimport { autorun, autorunWithStore } from '../../../../../base/common/observableInternal/reactions/autorun.js';\nimport { observableFromEvent } from '../../../../../base/common/observableInternal/observables/observableFromEvent.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar InlineSuggestionHintsContentWidget_1;\nlet InlineCompletionsHintsWidget = class InlineCompletionsHintsWidget extends Disposable {\n    constructor(editor, model, instantiationService) {\n        super();\n        this.editor = editor;\n        this.model = model;\n        this.instantiationService = instantiationService;\n        this.alwaysShowToolbar = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(71 /* EditorOption.inlineSuggest */).showToolbar === 'always');\n        this.sessionPosition = undefined;\n        this.position = derived(this, reader => {\n            const ghostText = this.model.read(reader)?.primaryGhostText.read(reader);\n            if (!this.alwaysShowToolbar.read(reader) || !ghostText || ghostText.parts.length === 0) {\n                this.sessionPosition = undefined;\n                return null;\n            }\n            const firstColumn = ghostText.parts[0].column;\n            if (this.sessionPosition && this.sessionPosition.lineNumber !== ghostText.lineNumber) {\n                this.sessionPosition = undefined;\n            }\n            const position = new Position(ghostText.lineNumber, Math.min(firstColumn, this.sessionPosition?.column ?? Number.MAX_SAFE_INTEGER));\n            this.sessionPosition = position;\n            return position;\n        });\n        this._register(autorunWithStore((reader, store) => {\n            /** @description setup content widget */\n            const model = this.model.read(reader);\n            if (!model || !this.alwaysShowToolbar.read(reader)) {\n                return;\n            }\n            const contentWidgetValue = derived((reader) => {\n                const contentWidget = reader.store.add(this.instantiationService.createInstance(InlineSuggestionHintsContentWidget.hot.read(reader), this.editor, true, this.position, model.selectedInlineCompletionIndex, model.inlineCompletionsCount, model.activeCommands, model.warning, () => { }));\n                editor.addContentWidget(contentWidget);\n                reader.store.add(toDisposable(() => editor.removeContentWidget(contentWidget)));\n                reader.store.add(autorun(reader => {\n                    /** @description request explicit */\n                    const position = this.position.read(reader);\n                    if (!position) {\n                        return;\n                    }\n                    if (model.lastTriggerKind.read(reader) !== InlineCompletionTriggerKind.Explicit) {\n                        model.triggerExplicitly();\n                    }\n                }));\n                return contentWidget;\n            });\n            const hadPosition = derivedObservableWithCache(this, (reader, lastValue) => !!this.position.read(reader) || !!lastValue);\n            store.add(autorun(reader => {\n                if (hadPosition.read(reader)) {\n                    contentWidgetValue.read(reader);\n                }\n            }));\n        }));\n    }\n};\nInlineCompletionsHintsWidget = __decorate([\n    __param(2, IInstantiationService)\n], InlineCompletionsHintsWidget);\nconst inlineSuggestionHintsNextIcon = registerIcon('inline-suggestion-hints-next', Codicon.chevronRight, localize(1207, 'Icon for show next parameter hint.'));\nconst inlineSuggestionHintsPreviousIcon = registerIcon('inline-suggestion-hints-previous', Codicon.chevronLeft, localize(1208, 'Icon for show previous parameter hint.'));\nlet InlineSuggestionHintsContentWidget = class InlineSuggestionHintsContentWidget extends Disposable {\n    static { InlineSuggestionHintsContentWidget_1 = this; }\n    static { this.hot = createHotClass(this); }\n    static { this._dropDownVisible = false; }\n    static get dropDownVisible() { return this._dropDownVisible; }\n    static { this.id = 0; }\n    createCommandAction(commandId, label, iconClassName) {\n        const action = new Action(commandId, label, iconClassName, true, () => this._commandService.executeCommand(commandId));\n        const kb = this.keybindingService.lookupKeybinding(commandId, this._contextKeyService);\n        let tooltip = label;\n        if (kb) {\n            tooltip = localize(1209, '{0} ({1})', label, kb.getLabel());\n        }\n        action.tooltip = tooltip;\n        return action;\n    }\n    constructor(editor, withBorder, _position, _currentSuggestionIdx, _suggestionCount, _extraCommands, _warning, _relayout, _commandService, instantiationService, keybindingService, _contextKeyService, _menuService) {\n        super();\n        this.editor = editor;\n        this.withBorder = withBorder;\n        this._position = _position;\n        this._currentSuggestionIdx = _currentSuggestionIdx;\n        this._suggestionCount = _suggestionCount;\n        this._extraCommands = _extraCommands;\n        this._warning = _warning;\n        this._relayout = _relayout;\n        this._commandService = _commandService;\n        this.keybindingService = keybindingService;\n        this._contextKeyService = _contextKeyService;\n        this._menuService = _menuService;\n        this.id = `InlineSuggestionHintsContentWidget${InlineSuggestionHintsContentWidget_1.id++}`;\n        this.allowEditorOverflow = true;\n        this.suppressMouseDown = false;\n        this._warningMessageContentNode = derived((reader) => {\n            const warning = this._warning.read(reader);\n            if (!warning) {\n                return undefined;\n            }\n            if (typeof warning.message === 'string') {\n                return warning.message;\n            }\n            const markdownElement = reader.store.add(renderMarkdown(warning.message));\n            return markdownElement.element;\n        });\n        this._warningMessageNode = n.div({\n            class: 'warningMessage',\n            style: {\n                maxWidth: 400,\n                margin: 4,\n                marginBottom: 4,\n                display: derived(reader => this._warning.read(reader) ? 'block' : 'none'),\n            }\n        }, [\n            this._warningMessageContentNode,\n        ]).keepUpdated(this._store);\n        this.nodes = h('div.inlineSuggestionsHints', { className: this.withBorder ? 'monaco-hover monaco-hover-content' : '' }, [\n            this._warningMessageNode.element,\n            h('div@toolBar'),\n        ]);\n        this.previousAction = this._register(this.createCommandAction(showPreviousInlineSuggestionActionId, localize(1210, 'Previous'), ThemeIcon.asClassName(inlineSuggestionHintsPreviousIcon)));\n        this.availableSuggestionCountAction = this._register(new Action('inlineSuggestionHints.availableSuggestionCount', '', undefined, false));\n        this.nextAction = this._register(this.createCommandAction(showNextInlineSuggestionActionId, localize(1211, 'Next'), ThemeIcon.asClassName(inlineSuggestionHintsNextIcon)));\n        this.inlineCompletionsActionsMenus = this._register(this._menuService.createMenu(MenuId.InlineCompletionsActions, this._contextKeyService));\n        this.clearAvailableSuggestionCountLabelDebounced = this._register(new RunOnceScheduler(() => {\n            this.availableSuggestionCountAction.label = '';\n        }, 100));\n        this.disableButtonsDebounced = this._register(new RunOnceScheduler(() => {\n            this.previousAction.enabled = this.nextAction.enabled = false;\n        }, 100));\n        this._register(autorun(reader => {\n            this._warningMessageContentNode.read(reader);\n            this._warningMessageNode.readEffect(reader);\n            // Only update after the warning message node has been rendered\n            this._relayout();\n        }));\n        this.toolBar = this._register(instantiationService.createInstance(CustomizedMenuWorkbenchToolBar, this.nodes.toolBar, MenuId.InlineSuggestionToolbar, {\n            menuOptions: { renderShortTitle: true },\n            toolbarOptions: { primaryGroup: g => g.startsWith('primary') },\n            actionViewItemProvider: (action, options) => {\n                if (action instanceof MenuItemAction) {\n                    return instantiationService.createInstance(StatusBarViewItem, action, undefined);\n                }\n                if (action === this.availableSuggestionCountAction) {\n                    const a = new ActionViewItemWithClassName(undefined, action, { label: true, icon: false });\n                    a.setClass('availableSuggestionCount');\n                    return a;\n                }\n                return undefined;\n            },\n            telemetrySource: 'InlineSuggestionToolbar',\n        }));\n        this.toolBar.setPrependedPrimaryActions([\n            this.previousAction,\n            this.availableSuggestionCountAction,\n            this.nextAction,\n        ]);\n        this._register(this.toolBar.onDidChangeDropdownVisibility(e => {\n            InlineSuggestionHintsContentWidget_1._dropDownVisible = e;\n        }));\n        this._register(autorun(reader => {\n            /** @description update position */\n            this._position.read(reader);\n            this.editor.layoutContentWidget(this);\n        }));\n        this._register(autorun(reader => {\n            /** @description counts */\n            const suggestionCount = this._suggestionCount.read(reader);\n            const currentSuggestionIdx = this._currentSuggestionIdx.read(reader);\n            if (suggestionCount !== undefined) {\n                this.clearAvailableSuggestionCountLabelDebounced.cancel();\n                this.availableSuggestionCountAction.label = `${currentSuggestionIdx + 1}/${suggestionCount}`;\n            }\n            else {\n                this.clearAvailableSuggestionCountLabelDebounced.schedule();\n            }\n            if (suggestionCount !== undefined && suggestionCount > 1) {\n                this.disableButtonsDebounced.cancel();\n                this.previousAction.enabled = this.nextAction.enabled = true;\n            }\n            else {\n                this.disableButtonsDebounced.schedule();\n            }\n        }));\n        this._register(autorun(reader => {\n            /** @description extra commands */\n            const extraCommands = this._extraCommands.read(reader);\n            const extraActions = extraCommands.map(c => ({\n                class: undefined,\n                id: c.command.id,\n                enabled: true,\n                tooltip: c.command.tooltip || '',\n                label: c.command.title,\n                run: (event) => {\n                    return this._commandService.executeCommand(c.command.id);\n                },\n            }));\n            for (const [_, group] of this.inlineCompletionsActionsMenus.getActions()) {\n                for (const action of group) {\n                    if (action instanceof MenuItemAction) {\n                        extraActions.push(action);\n                    }\n                }\n            }\n            if (extraActions.length > 0) {\n                extraActions.unshift(new Separator());\n            }\n            this.toolBar.setAdditionalSecondaryActions(extraActions);\n        }));\n    }\n    getId() { return this.id; }\n    getDomNode() {\n        return this.nodes.root;\n    }\n    getPosition() {\n        return {\n            position: this._position.get(),\n            preference: [1 /* ContentWidgetPositionPreference.ABOVE */, 2 /* ContentWidgetPositionPreference.BELOW */],\n            positionAffinity: 3 /* PositionAffinity.LeftOfInjectedText */,\n        };\n    }\n};\nInlineSuggestionHintsContentWidget = InlineSuggestionHintsContentWidget_1 = __decorate([\n    __param(8, ICommandService),\n    __param(9, IInstantiationService),\n    __param(10, IKeybindingService),\n    __param(11, IContextKeyService),\n    __param(12, IMenuService)\n], InlineSuggestionHintsContentWidget);\nclass ActionViewItemWithClassName extends ActionViewItem {\n    constructor() {\n        super(...arguments);\n        this._className = undefined;\n    }\n    setClass(className) {\n        this._className = className;\n    }\n    render(container) {\n        super.render(container);\n        if (this._className) {\n            container.classList.add(this._className);\n        }\n    }\n    updateTooltip() {\n        // NOOP, disable tooltip\n    }\n}\nclass StatusBarViewItem extends MenuEntryActionViewItem {\n    updateLabel() {\n        const kb = this._keybindingService.lookupKeybinding(this._action.id, this._contextKeyService, true);\n        if (!kb) {\n            return super.updateLabel();\n        }\n        if (this.label) {\n            const div = h('div.keybinding').root;\n            const k = this._register(new KeybindingLabel(div, OS, { disableTitle: true, ...unthemedKeybindingLabelOptions }));\n            k.set(kb);\n            this.label.textContent = this._action.label;\n            this.label.appendChild(div);\n            this.label.classList.add('inlineSuggestionStatusBarItemLabel');\n        }\n    }\n    updateTooltip() {\n        // NOOP, disable tooltip\n    }\n}\nlet CustomizedMenuWorkbenchToolBar = class CustomizedMenuWorkbenchToolBar extends WorkbenchToolBar {\n    constructor(container, menuId, options2, menuService, contextKeyService, contextMenuService, keybindingService, commandService, telemetryService) {\n        super(container, { resetMenu: menuId, ...options2 }, menuService, contextKeyService, contextMenuService, keybindingService, commandService, telemetryService);\n        this.menuId = menuId;\n        this.options2 = options2;\n        this.menuService = menuService;\n        this.contextKeyService = contextKeyService;\n        this.menu = this._store.add(this.menuService.createMenu(this.menuId, this.contextKeyService, { emitEventsForSubmenuChanges: true }));\n        this.additionalActions = [];\n        this.prependedPrimaryActions = [];\n        this.additionalPrimaryActions = [];\n        this._store.add(this.menu.onDidChange(() => this.updateToolbar()));\n        this.updateToolbar();\n    }\n    updateToolbar() {\n        const { primary, secondary } = getActionBarActions(this.menu.getActions(this.options2?.menuOptions), this.options2?.toolbarOptions?.primaryGroup, this.options2?.toolbarOptions?.shouldInlineSubmenu, this.options2?.toolbarOptions?.useSeparatorsInPrimaryActions);\n        secondary.push(...this.additionalActions);\n        primary.unshift(...this.prependedPrimaryActions);\n        primary.push(...this.additionalPrimaryActions);\n        this.setActions(primary, secondary);\n    }\n    setPrependedPrimaryActions(actions) {\n        if (equals(this.prependedPrimaryActions, actions, (a, b) => a === b)) {\n            return;\n        }\n        this.prependedPrimaryActions = actions;\n        this.updateToolbar();\n    }\n    setAdditionalSecondaryActions(actions) {\n        if (equals(this.additionalActions, actions, (a, b) => a === b)) {\n            return;\n        }\n        this.additionalActions = actions;\n        this.updateToolbar();\n    }\n};\nCustomizedMenuWorkbenchToolBar = __decorate([\n    __param(3, IMenuService),\n    __param(4, IContextKeyService),\n    __param(5, IContextMenuService),\n    __param(6, IKeybindingService),\n    __param(7, ICommandService),\n    __param(8, ITelemetryService)\n], CustomizedMenuWorkbenchToolBar);\n\nexport { CustomizedMenuWorkbenchToolBar, InlineCompletionsHintsWidget, InlineSuggestionHintsContentWidget };\n","import { getDomNodePagePosition } from '../../../../base/browser/dom.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction isMousePositionWithinElement(element, posx, posy) {\n    const elementRect = getDomNodePagePosition(element);\n    if (posx < elementRect.left\n        || posx > elementRect.left + elementRect.width\n        || posy < elementRect.top\n        || posy > elementRect.top + elementRect.height) {\n        return false;\n    }\n    return true;\n}\n\nexport { isMousePositionWithinElement };\n","import { createCancelableAsyncIterableProducer, RunOnceScheduler } from '../../../../base/common/async.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass HoverResult {\n    constructor(value, isComplete, hasLoadingMessage, options) {\n        this.value = value;\n        this.isComplete = isComplete;\n        this.hasLoadingMessage = hasLoadingMessage;\n        this.options = options;\n    }\n}\n/**\n * Computing the hover is very fine tuned.\n *\n * Suppose the hover delay is 300ms (the default). Then, when resting the mouse at an anchor:\n * - at 150ms, the async computation is triggered (i.e. semantic hover)\n *   - if async results already come in, they are not rendered yet.\n * - at 300ms, the sync computation is triggered (i.e. decorations, markers)\n *   - if there are sync or async results, they are rendered.\n * - at 900ms, if the async computation hasn't finished, a \"Loading...\" result is added.\n */\nclass HoverOperation extends Disposable {\n    constructor(_editor, _computer) {\n        super();\n        this._editor = _editor;\n        this._computer = _computer;\n        this._onResult = this._register(new Emitter());\n        this.onResult = this._onResult.event;\n        this._asyncComputationScheduler = this._register(new Debouncer((options) => this._triggerAsyncComputation(options), 0));\n        this._syncComputationScheduler = this._register(new Debouncer((options) => this._triggerSyncComputation(options), 0));\n        this._loadingMessageScheduler = this._register(new Debouncer((options) => this._triggerLoadingMessage(options), 0));\n        this._state = 0 /* HoverOperationState.Idle */;\n        this._asyncIterable = null;\n        this._asyncIterableDone = false;\n        this._result = [];\n    }\n    dispose() {\n        if (this._asyncIterable) {\n            this._asyncIterable.cancel();\n            this._asyncIterable = null;\n        }\n        this._options = undefined;\n        super.dispose();\n    }\n    get _hoverTime() {\n        return this._editor.getOption(69 /* EditorOption.hover */).delay;\n    }\n    get _firstWaitTime() {\n        return this._hoverTime / 2;\n    }\n    get _secondWaitTime() {\n        return this._hoverTime - this._firstWaitTime;\n    }\n    get _loadingMessageTime() {\n        return 3 * this._hoverTime;\n    }\n    _setState(state, options) {\n        this._options = options;\n        this._state = state;\n        this._fireResult(options);\n    }\n    _triggerAsyncComputation(options) {\n        this._setState(2 /* HoverOperationState.SecondWait */, options);\n        this._syncComputationScheduler.schedule(options, this._secondWaitTime);\n        if (this._computer.computeAsync) {\n            this._asyncIterableDone = false;\n            this._asyncIterable = createCancelableAsyncIterableProducer(token => this._computer.computeAsync(options, token));\n            (async () => {\n                try {\n                    for await (const item of this._asyncIterable) {\n                        if (item) {\n                            this._result.push(item);\n                            this._fireResult(options);\n                        }\n                    }\n                    this._asyncIterableDone = true;\n                    if (this._state === 3 /* HoverOperationState.WaitingForAsync */ || this._state === 4 /* HoverOperationState.WaitingForAsyncShowingLoading */) {\n                        this._setState(0 /* HoverOperationState.Idle */, options);\n                    }\n                }\n                catch (e) {\n                    onUnexpectedError(e);\n                }\n            })();\n        }\n        else {\n            this._asyncIterableDone = true;\n        }\n    }\n    _triggerSyncComputation(options) {\n        if (this._computer.computeSync) {\n            this._result = this._result.concat(this._computer.computeSync(options));\n        }\n        this._setState(this._asyncIterableDone ? 0 /* HoverOperationState.Idle */ : 3 /* HoverOperationState.WaitingForAsync */, options);\n    }\n    _triggerLoadingMessage(options) {\n        if (this._state === 3 /* HoverOperationState.WaitingForAsync */) {\n            this._setState(4 /* HoverOperationState.WaitingForAsyncShowingLoading */, options);\n        }\n    }\n    _fireResult(options) {\n        if (this._state === 1 /* HoverOperationState.FirstWait */ || this._state === 2 /* HoverOperationState.SecondWait */) {\n            // Do not send out results before the hover time\n            return;\n        }\n        const isComplete = (this._state === 0 /* HoverOperationState.Idle */);\n        const hasLoadingMessage = (this._state === 4 /* HoverOperationState.WaitingForAsyncShowingLoading */);\n        this._onResult.fire(new HoverResult(this._result.slice(0), isComplete, hasLoadingMessage, options));\n    }\n    start(mode, options) {\n        if (mode === 0 /* HoverStartMode.Delayed */) {\n            if (this._state === 0 /* HoverOperationState.Idle */) {\n                this._setState(1 /* HoverOperationState.FirstWait */, options);\n                this._asyncComputationScheduler.schedule(options, this._firstWaitTime);\n                this._loadingMessageScheduler.schedule(options, this._loadingMessageTime);\n            }\n        }\n        else {\n            switch (this._state) {\n                case 0 /* HoverOperationState.Idle */:\n                    this._triggerAsyncComputation(options);\n                    this._syncComputationScheduler.cancel();\n                    this._triggerSyncComputation(options);\n                    break;\n                case 2 /* HoverOperationState.SecondWait */:\n                    this._syncComputationScheduler.cancel();\n                    this._triggerSyncComputation(options);\n                    break;\n            }\n        }\n    }\n    cancel() {\n        this._asyncComputationScheduler.cancel();\n        this._syncComputationScheduler.cancel();\n        this._loadingMessageScheduler.cancel();\n        if (this._asyncIterable) {\n            this._asyncIterable.cancel();\n            this._asyncIterable = null;\n        }\n        this._result = [];\n        this._options = undefined;\n        this._state = 0 /* HoverOperationState.Idle */;\n    }\n    get options() {\n        return this._options;\n    }\n}\nclass Debouncer extends Disposable {\n    constructor(runner, debounceTimeMs) {\n        super();\n        this._scheduler = this._register(new RunOnceScheduler(() => runner(this._options), debounceTimeMs));\n    }\n    schedule(options, debounceTimeMs) {\n        this._options = options;\n        this._scheduler.schedule(debounceTimeMs);\n    }\n    cancel() {\n        this._scheduler.cancel();\n    }\n}\n\nexport { HoverOperation, HoverResult };\n","import { Dimension } from '../../dom.js';\nimport { Sash, OrthogonalEdge } from '../sash/sash.js';\nimport { Emitter, Event } from '../../../common/event.js';\nimport { DisposableStore } from '../../../common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ResizableHTMLElement {\n    get onDidWillResize() { return this._onDidWillResize.event; }\n    get onDidResize() { return this._onDidResize.event; }\n    constructor() {\n        this._onDidWillResize = new Emitter();\n        this._onDidResize = new Emitter();\n        this._sashListener = new DisposableStore();\n        this._size = new Dimension(0, 0);\n        this._minSize = new Dimension(0, 0);\n        this._maxSize = new Dimension(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER);\n        this.domNode = document.createElement('div');\n        this._eastSash = new Sash(this.domNode, { getVerticalSashLeft: () => this._size.width }, { orientation: 0 /* Orientation.VERTICAL */ });\n        this._westSash = new Sash(this.domNode, { getVerticalSashLeft: () => 0 }, { orientation: 0 /* Orientation.VERTICAL */ });\n        this._northSash = new Sash(this.domNode, { getHorizontalSashTop: () => 0 }, { orientation: 1 /* Orientation.HORIZONTAL */, orthogonalEdge: OrthogonalEdge.North });\n        this._southSash = new Sash(this.domNode, { getHorizontalSashTop: () => this._size.height }, { orientation: 1 /* Orientation.HORIZONTAL */, orthogonalEdge: OrthogonalEdge.South });\n        this._northSash.orthogonalStartSash = this._westSash;\n        this._northSash.orthogonalEndSash = this._eastSash;\n        this._southSash.orthogonalStartSash = this._westSash;\n        this._southSash.orthogonalEndSash = this._eastSash;\n        let currentSize;\n        let deltaY = 0;\n        let deltaX = 0;\n        this._sashListener.add(Event.any(this._northSash.onDidStart, this._eastSash.onDidStart, this._southSash.onDidStart, this._westSash.onDidStart)(() => {\n            if (currentSize === undefined) {\n                this._onDidWillResize.fire();\n                currentSize = this._size;\n                deltaY = 0;\n                deltaX = 0;\n            }\n        }));\n        this._sashListener.add(Event.any(this._northSash.onDidEnd, this._eastSash.onDidEnd, this._southSash.onDidEnd, this._westSash.onDidEnd)(() => {\n            if (currentSize !== undefined) {\n                currentSize = undefined;\n                deltaY = 0;\n                deltaX = 0;\n                this._onDidResize.fire({ dimension: this._size, done: true });\n            }\n        }));\n        this._sashListener.add(this._eastSash.onDidChange(e => {\n            if (currentSize) {\n                deltaX = e.currentX - e.startX;\n                this.layout(currentSize.height + deltaY, currentSize.width + deltaX);\n                this._onDidResize.fire({ dimension: this._size, done: false, east: true });\n            }\n        }));\n        this._sashListener.add(this._westSash.onDidChange(e => {\n            if (currentSize) {\n                deltaX = -(e.currentX - e.startX);\n                this.layout(currentSize.height + deltaY, currentSize.width + deltaX);\n                this._onDidResize.fire({ dimension: this._size, done: false, west: true });\n            }\n        }));\n        this._sashListener.add(this._northSash.onDidChange(e => {\n            if (currentSize) {\n                deltaY = -(e.currentY - e.startY);\n                this.layout(currentSize.height + deltaY, currentSize.width + deltaX);\n                this._onDidResize.fire({ dimension: this._size, done: false, north: true });\n            }\n        }));\n        this._sashListener.add(this._southSash.onDidChange(e => {\n            if (currentSize) {\n                deltaY = e.currentY - e.startY;\n                this.layout(currentSize.height + deltaY, currentSize.width + deltaX);\n                this._onDidResize.fire({ dimension: this._size, done: false, south: true });\n            }\n        }));\n        this._sashListener.add(Event.any(this._eastSash.onDidReset, this._westSash.onDidReset)(e => {\n            if (this._preferredSize) {\n                this.layout(this._size.height, this._preferredSize.width);\n                this._onDidResize.fire({ dimension: this._size, done: true });\n            }\n        }));\n        this._sashListener.add(Event.any(this._northSash.onDidReset, this._southSash.onDidReset)(e => {\n            if (this._preferredSize) {\n                this.layout(this._preferredSize.height, this._size.width);\n                this._onDidResize.fire({ dimension: this._size, done: true });\n            }\n        }));\n    }\n    dispose() {\n        this._northSash.dispose();\n        this._southSash.dispose();\n        this._eastSash.dispose();\n        this._westSash.dispose();\n        this._sashListener.dispose();\n        this._onDidResize.dispose();\n        this._onDidWillResize.dispose();\n        this.domNode.remove();\n    }\n    enableSashes(north, east, south, west) {\n        this._northSash.state = north ? 3 /* SashState.Enabled */ : 0 /* SashState.Disabled */;\n        this._eastSash.state = east ? 3 /* SashState.Enabled */ : 0 /* SashState.Disabled */;\n        this._southSash.state = south ? 3 /* SashState.Enabled */ : 0 /* SashState.Disabled */;\n        this._westSash.state = west ? 3 /* SashState.Enabled */ : 0 /* SashState.Disabled */;\n    }\n    layout(height = this.size.height, width = this.size.width) {\n        const { height: minHeight, width: minWidth } = this._minSize;\n        const { height: maxHeight, width: maxWidth } = this._maxSize;\n        height = Math.max(minHeight, Math.min(maxHeight, height));\n        width = Math.max(minWidth, Math.min(maxWidth, width));\n        const newSize = new Dimension(width, height);\n        if (!Dimension.equals(newSize, this._size)) {\n            this.domNode.style.height = height + 'px';\n            this.domNode.style.width = width + 'px';\n            this._size = newSize;\n            this._northSash.layout();\n            this._eastSash.layout();\n            this._southSash.layout();\n            this._westSash.layout();\n        }\n    }\n    clearSashHoverState() {\n        this._eastSash.clearSashHoverState();\n        this._westSash.clearSashHoverState();\n        this._northSash.clearSashHoverState();\n        this._southSash.clearSashHoverState();\n    }\n    get size() {\n        return this._size;\n    }\n    set maxSize(value) {\n        this._maxSize = value;\n    }\n    get maxSize() {\n        return this._maxSize;\n    }\n    set minSize(value) {\n        this._minSize = value;\n    }\n    get minSize() {\n        return this._minSize;\n    }\n    set preferredSize(value) {\n        this._preferredSize = value;\n    }\n    get preferredSize() {\n        return this._preferredSize;\n    }\n}\n\nexport { ResizableHTMLElement };\n","import { ResizableHTMLElement } from '../../../../base/browser/ui/resizable/resizable.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Dimension, getDomNodePagePosition, getClientArea } from '../../../../base/browser/dom.js';\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 *--------------------------------------------------------------------------------------------*/\nconst TOP_HEIGHT = 30;\nconst BOTTOM_HEIGHT = 24;\nclass ResizableContentWidget extends Disposable {\n    constructor(_editor, minimumSize = new Dimension(10, 10)) {\n        super();\n        this._editor = _editor;\n        this.allowEditorOverflow = true;\n        this.suppressMouseDown = false;\n        this._resizableNode = this._register(new ResizableHTMLElement());\n        this._contentPosition = null;\n        this._isResizing = false;\n        this._resizableNode.domNode.style.position = 'absolute';\n        this._resizableNode.minSize = Dimension.lift(minimumSize);\n        this._resizableNode.layout(minimumSize.height, minimumSize.width);\n        this._resizableNode.enableSashes(true, true, true, true);\n        this._register(this._resizableNode.onDidResize(e => {\n            this._resize(new Dimension(e.dimension.width, e.dimension.height));\n            if (e.done) {\n                this._isResizing = false;\n            }\n        }));\n        this._register(this._resizableNode.onDidWillResize(() => {\n            this._isResizing = true;\n        }));\n    }\n    get isResizing() {\n        return this._isResizing;\n    }\n    getDomNode() {\n        return this._resizableNode.domNode;\n    }\n    getPosition() {\n        return this._contentPosition;\n    }\n    get position() {\n        return this._contentPosition?.position ? Position.lift(this._contentPosition.position) : undefined;\n    }\n    _availableVerticalSpaceAbove(position) {\n        const editorDomNode = this._editor.getDomNode();\n        const mouseBox = this._editor.getScrolledVisiblePosition(position);\n        if (!editorDomNode || !mouseBox) {\n            return;\n        }\n        const editorBox = getDomNodePagePosition(editorDomNode);\n        return editorBox.top + mouseBox.top - TOP_HEIGHT;\n    }\n    _availableVerticalSpaceBelow(position) {\n        const editorDomNode = this._editor.getDomNode();\n        const mouseBox = this._editor.getScrolledVisiblePosition(position);\n        if (!editorDomNode || !mouseBox) {\n            return;\n        }\n        const editorBox = getDomNodePagePosition(editorDomNode);\n        const bodyBox = getClientArea(editorDomNode.ownerDocument.body);\n        const mouseBottom = editorBox.top + mouseBox.top + mouseBox.height;\n        return bodyBox.height - mouseBottom - BOTTOM_HEIGHT;\n    }\n    _findPositionPreference(widgetHeight, showAtPosition) {\n        const maxHeightBelow = Math.min(this._availableVerticalSpaceBelow(showAtPosition) ?? Infinity, widgetHeight);\n        const maxHeightAbove = Math.min(this._availableVerticalSpaceAbove(showAtPosition) ?? Infinity, widgetHeight);\n        const maxHeight = Math.min(Math.max(maxHeightAbove, maxHeightBelow), widgetHeight);\n        const height = Math.min(widgetHeight, maxHeight);\n        let renderingAbove;\n        if (this._editor.getOption(69 /* EditorOption.hover */).above) {\n            renderingAbove = height <= maxHeightAbove ? 1 /* ContentWidgetPositionPreference.ABOVE */ : 2 /* ContentWidgetPositionPreference.BELOW */;\n        }\n        else {\n            renderingAbove = height <= maxHeightBelow ? 2 /* ContentWidgetPositionPreference.BELOW */ : 1 /* ContentWidgetPositionPreference.ABOVE */;\n        }\n        if (renderingAbove === 1 /* ContentWidgetPositionPreference.ABOVE */) {\n            this._resizableNode.enableSashes(true, true, false, false);\n        }\n        else {\n            this._resizableNode.enableSashes(false, true, true, false);\n        }\n        return renderingAbove;\n    }\n    _resize(dimension) {\n        this._resizableNode.layout(dimension.height, dimension.width);\n    }\n}\n\nexport { ResizableContentWidget };\n","import { append, $ as $$1, addDisposableListener, EventType } from '../../dom.js';\nimport { StandardKeyboardEvent } from '../../keyboardEvent.js';\nimport { DomScrollableElement } from '../scrollbar/scrollableElement.js';\nimport { Disposable } from '../../../common/lifecycle.js';\nimport './hoverWidget.css';\nimport { localize } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nconst $ = $$1;\nclass HoverWidget extends Disposable {\n    constructor(fadeIn) {\n        super();\n        this.containerDomNode = document.createElement('div');\n        this.containerDomNode.className = 'monaco-hover';\n        this.containerDomNode.classList.toggle('fade-in', !!fadeIn);\n        this.containerDomNode.tabIndex = 0;\n        this.containerDomNode.setAttribute('role', 'tooltip');\n        this.contentsDomNode = document.createElement('div');\n        this.contentsDomNode.className = 'monaco-hover-content';\n        this.scrollbar = this._register(new DomScrollableElement(this.contentsDomNode, {\n            consumeMouseWheelIfScrollbarIsNeeded: true\n        }));\n        this.containerDomNode.appendChild(this.scrollbar.getDomNode());\n    }\n    onContentsChanged() {\n        this.scrollbar.scanDomNode();\n    }\n}\nclass HoverAction extends Disposable {\n    static render(parent, actionOptions, keybindingLabel) {\n        return new HoverAction(parent, actionOptions, keybindingLabel);\n    }\n    constructor(parent, actionOptions, keybindingLabel) {\n        super();\n        this.actionLabel = actionOptions.label;\n        this.actionKeybindingLabel = keybindingLabel;\n        this.actionContainer = append(parent, $('div.action-container'));\n        this.actionContainer.setAttribute('tabindex', '0');\n        this.action = append(this.actionContainer, $('a.action'));\n        this.action.setAttribute('role', 'button');\n        if (actionOptions.iconClass) {\n            const iconElement = append(this.action, $(`span.icon`));\n            iconElement.classList.add(...actionOptions.iconClass.split(' '));\n        }\n        this.actionRenderedLabel = keybindingLabel ? `${actionOptions.label} (${keybindingLabel})` : actionOptions.label;\n        const label = append(this.action, $('span'));\n        label.textContent = this.actionRenderedLabel;\n        this._store.add(new ClickAction(this.actionContainer, actionOptions.run));\n        this._store.add(new KeyDownAction(this.actionContainer, actionOptions.run, [3 /* KeyCode.Enter */, 10 /* KeyCode.Space */]));\n        this.setEnabled(true);\n    }\n    setEnabled(enabled) {\n        if (enabled) {\n            this.actionContainer.classList.remove('disabled');\n            this.actionContainer.removeAttribute('aria-disabled');\n        }\n        else {\n            this.actionContainer.classList.add('disabled');\n            this.actionContainer.setAttribute('aria-disabled', 'true');\n        }\n    }\n}\nfunction getHoverAccessibleViewHint(shouldHaveHint, keybinding) {\n    return shouldHaveHint && keybinding ? localize(7, \"Inspect this in the accessible view with {0}.\", keybinding) : shouldHaveHint ? localize(8, \"Inspect this in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding.\") : '';\n}\nclass ClickAction extends Disposable {\n    constructor(container, run) {\n        super();\n        this._register(addDisposableListener(container, EventType.CLICK, e => {\n            e.stopPropagation();\n            e.preventDefault();\n            run(container);\n        }));\n    }\n}\nclass KeyDownAction extends Disposable {\n    constructor(container, run, keyCodes) {\n        super();\n        this._register(addDisposableListener(container, EventType.KEY_DOWN, e => {\n            const event = new StandardKeyboardEvent(e);\n            if (keyCodes.some(keyCode => event.equals(keyCode))) {\n                e.stopPropagation();\n                e.preventDefault();\n                run(container);\n            }\n        }));\n    }\n}\n\nexport { ClickAction, HoverAction, HoverWidget, KeyDownAction, getHoverAccessibleViewHint };\n","import { Dimension, append, trackFocus, getClientArea, getDomNodePagePosition, getTotalHeight, getTotalWidth } from '../../../../base/browser/dom.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { ResizableContentWidget } from './resizableContentWidget.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { IAccessibilityService } from '../../../../platform/accessibility/common/accessibility.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { HoverWidget, getHoverAccessibleViewHint } from '../../../../base/browser/ui/hover/hoverWidget.js';\nimport { Emitter } from '../../../../base/common/event.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ContentHoverWidget_1;\nconst HORIZONTAL_SCROLLING_BY = 30;\nlet ContentHoverWidget = class ContentHoverWidget extends ResizableContentWidget {\n    static { ContentHoverWidget_1 = this; }\n    static { this.ID = 'editor.contrib.resizableContentHoverWidget'; }\n    static { this._lastDimensions = new Dimension(0, 0); }\n    get isVisibleFromKeyboard() {\n        return (this._renderedHover?.source === 2 /* HoverStartSource.Keyboard */);\n    }\n    get isVisible() {\n        return this._hoverVisibleKey.get() ?? false;\n    }\n    get isFocused() {\n        return this._hoverFocusedKey.get() ?? false;\n    }\n    constructor(editor, contextKeyService, _configurationService, _accessibilityService, _keybindingService) {\n        const minimumHeight = editor.getOption(75 /* EditorOption.lineHeight */) + 8;\n        const minimumWidth = 150;\n        const minimumSize = new Dimension(minimumWidth, minimumHeight);\n        super(editor, minimumSize);\n        this._configurationService = _configurationService;\n        this._accessibilityService = _accessibilityService;\n        this._keybindingService = _keybindingService;\n        this._hover = this._register(new HoverWidget(true));\n        this._onDidResize = this._register(new Emitter());\n        this.onDidResize = this._onDidResize.event;\n        this._onDidScroll = this._register(new Emitter());\n        this.onDidScroll = this._onDidScroll.event;\n        this._onContentsChanged = this._register(new Emitter());\n        this.onContentsChanged = this._onContentsChanged.event;\n        this._minimumSize = minimumSize;\n        this._hoverVisibleKey = EditorContextKeys.hoverVisible.bindTo(contextKeyService);\n        this._hoverFocusedKey = EditorContextKeys.hoverFocused.bindTo(contextKeyService);\n        append(this._resizableNode.domNode, this._hover.containerDomNode);\n        this._resizableNode.domNode.style.zIndex = '50';\n        this._resizableNode.domNode.className = 'monaco-resizable-hover';\n        this._register(this._editor.onDidLayoutChange(() => {\n            if (this.isVisible) {\n                this._updateMaxDimensions();\n            }\n        }));\n        this._register(this._editor.onDidChangeConfiguration((e) => {\n            if (e.hasChanged(59 /* EditorOption.fontInfo */)) {\n                this._updateFont();\n            }\n        }));\n        const focusTracker = this._register(trackFocus(this._resizableNode.domNode));\n        this._register(focusTracker.onDidFocus(() => {\n            this._hoverFocusedKey.set(true);\n        }));\n        this._register(focusTracker.onDidBlur(() => {\n            this._hoverFocusedKey.set(false);\n        }));\n        this._register(this._hover.scrollbar.onScroll((e) => {\n            this._onDidScroll.fire(e);\n        }));\n        this._setRenderedHover(undefined);\n        this._editor.addContentWidget(this);\n    }\n    dispose() {\n        super.dispose();\n        this._renderedHover?.dispose();\n        this._editor.removeContentWidget(this);\n    }\n    getId() {\n        return ContentHoverWidget_1.ID;\n    }\n    static _applyDimensions(container, width, height) {\n        const transformedWidth = typeof width === 'number' ? `${width}px` : width;\n        const transformedHeight = typeof height === 'number' ? `${height}px` : height;\n        container.style.width = transformedWidth;\n        container.style.height = transformedHeight;\n    }\n    _setContentsDomNodeDimensions(width, height) {\n        const contentsDomNode = this._hover.contentsDomNode;\n        return ContentHoverWidget_1._applyDimensions(contentsDomNode, width, height);\n    }\n    _setContainerDomNodeDimensions(width, height) {\n        const containerDomNode = this._hover.containerDomNode;\n        return ContentHoverWidget_1._applyDimensions(containerDomNode, width, height);\n    }\n    _setScrollableElementDimensions(width, height) {\n        const scrollbarDomElement = this._hover.scrollbar.getDomNode();\n        return ContentHoverWidget_1._applyDimensions(scrollbarDomElement, width, height);\n    }\n    _setHoverWidgetDimensions(width, height) {\n        this._setContainerDomNodeDimensions(width, height);\n        this._setScrollableElementDimensions(width, height);\n        this._setContentsDomNodeDimensions(width, height);\n        this._layoutContentWidget();\n    }\n    static _applyMaxDimensions(container, width, height) {\n        const transformedWidth = typeof width === 'number' ? `${width}px` : width;\n        const transformedHeight = typeof height === 'number' ? `${height}px` : height;\n        container.style.maxWidth = transformedWidth;\n        container.style.maxHeight = transformedHeight;\n    }\n    _setHoverWidgetMaxDimensions(width, height) {\n        ContentHoverWidget_1._applyMaxDimensions(this._hover.contentsDomNode, width, height);\n        ContentHoverWidget_1._applyMaxDimensions(this._hover.scrollbar.getDomNode(), width, height);\n        ContentHoverWidget_1._applyMaxDimensions(this._hover.containerDomNode, width, height);\n        this._hover.containerDomNode.style.setProperty('--vscode-hover-maxWidth', typeof width === 'number' ? `${width}px` : width);\n        this._layoutContentWidget();\n    }\n    _setAdjustedHoverWidgetDimensions(size) {\n        this._setHoverWidgetMaxDimensions('none', 'none');\n        this._setHoverWidgetDimensions(size.width, size.height);\n    }\n    _updateResizableNodeMaxDimensions() {\n        const maxRenderingWidth = this._findMaximumRenderingWidth() ?? Infinity;\n        const maxRenderingHeight = this._findMaximumRenderingHeight() ?? Infinity;\n        this._resizableNode.maxSize = new Dimension(maxRenderingWidth, maxRenderingHeight);\n        this._setHoverWidgetMaxDimensions(maxRenderingWidth, maxRenderingHeight);\n    }\n    _resize(size) {\n        ContentHoverWidget_1._lastDimensions = new Dimension(size.width, size.height);\n        this._setAdjustedHoverWidgetDimensions(size);\n        this._resizableNode.layout(size.height, size.width);\n        this._updateResizableNodeMaxDimensions();\n        this._hover.scrollbar.scanDomNode();\n        this._editor.layoutContentWidget(this);\n        this._onDidResize.fire();\n    }\n    _findAvailableSpaceVertically() {\n        const position = this._renderedHover?.showAtPosition;\n        if (!position) {\n            return;\n        }\n        return this._positionPreference === 1 /* ContentWidgetPositionPreference.ABOVE */ ?\n            this._availableVerticalSpaceAbove(position)\n            : this._availableVerticalSpaceBelow(position);\n    }\n    _findMaximumRenderingHeight() {\n        const availableSpace = this._findAvailableSpaceVertically();\n        if (!availableSpace) {\n            return;\n        }\n        const children = this._hover.contentsDomNode.children;\n        let maximumHeight = children.length - 1;\n        Array.from(this._hover.contentsDomNode.children).forEach((hoverPart) => {\n            maximumHeight += hoverPart.clientHeight;\n        });\n        return Math.min(availableSpace, maximumHeight);\n    }\n    _isHoverTextOverflowing() {\n        // To find out if the text is overflowing, we will disable wrapping, check the widths, and then re-enable wrapping\n        this._hover.containerDomNode.style.setProperty('--vscode-hover-whiteSpace', 'nowrap');\n        this._hover.containerDomNode.style.setProperty('--vscode-hover-sourceWhiteSpace', 'nowrap');\n        const overflowing = Array.from(this._hover.contentsDomNode.children).some((hoverElement) => {\n            return hoverElement.scrollWidth > hoverElement.clientWidth;\n        });\n        this._hover.containerDomNode.style.removeProperty('--vscode-hover-whiteSpace');\n        this._hover.containerDomNode.style.removeProperty('--vscode-hover-sourceWhiteSpace');\n        return overflowing;\n    }\n    _findMaximumRenderingWidth() {\n        if (!this._editor || !this._editor.hasModel()) {\n            return;\n        }\n        const overflowing = this._isHoverTextOverflowing();\n        const initialWidth = (typeof this._contentWidth === 'undefined'\n            ? 0\n            : this._contentWidth);\n        if (overflowing || this._hover.containerDomNode.clientWidth < initialWidth) {\n            const bodyBoxWidth = getClientArea(this._hover.containerDomNode.ownerDocument.body).width;\n            const horizontalPadding = 14;\n            return bodyBoxWidth - horizontalPadding;\n        }\n        else {\n            return this._hover.containerDomNode.clientWidth;\n        }\n    }\n    isMouseGettingCloser(posx, posy) {\n        if (!this._renderedHover) {\n            return false;\n        }\n        if (this._renderedHover.initialMousePosX === undefined || this._renderedHover.initialMousePosY === undefined) {\n            this._renderedHover.initialMousePosX = posx;\n            this._renderedHover.initialMousePosY = posy;\n            return false;\n        }\n        const widgetRect = getDomNodePagePosition(this.getDomNode());\n        if (this._renderedHover.closestMouseDistance === undefined) {\n            this._renderedHover.closestMouseDistance = computeDistanceFromPointToRectangle(this._renderedHover.initialMousePosX, this._renderedHover.initialMousePosY, widgetRect.left, widgetRect.top, widgetRect.width, widgetRect.height);\n        }\n        const distance = computeDistanceFromPointToRectangle(posx, posy, widgetRect.left, widgetRect.top, widgetRect.width, widgetRect.height);\n        if (distance > this._renderedHover.closestMouseDistance + 4 /* tolerance of 4 pixels */) {\n            // The mouse is getting farther away\n            return false;\n        }\n        this._renderedHover.closestMouseDistance = Math.min(this._renderedHover.closestMouseDistance, distance);\n        return true;\n    }\n    _setRenderedHover(renderedHover) {\n        this._renderedHover?.dispose();\n        this._renderedHover = renderedHover;\n        this._hoverVisibleKey.set(!!renderedHover);\n        this._hover.containerDomNode.classList.toggle('hidden', !renderedHover);\n    }\n    _updateFont() {\n        const { fontSize, lineHeight } = this._editor.getOption(59 /* EditorOption.fontInfo */);\n        const contentsDomNode = this._hover.contentsDomNode;\n        contentsDomNode.style.fontSize = `${fontSize}px`;\n        contentsDomNode.style.lineHeight = `${lineHeight / fontSize}`;\n        // eslint-disable-next-line no-restricted-syntax\n        const codeClasses = Array.prototype.slice.call(this._hover.contentsDomNode.getElementsByClassName('code'));\n        codeClasses.forEach(node => this._editor.applyFontInfo(node));\n    }\n    _updateContent(node) {\n        const contentsDomNode = this._hover.contentsDomNode;\n        contentsDomNode.style.paddingBottom = '';\n        contentsDomNode.textContent = '';\n        contentsDomNode.appendChild(node);\n    }\n    _layoutContentWidget() {\n        this._editor.layoutContentWidget(this);\n        this._hover.onContentsChanged();\n    }\n    _updateMaxDimensions() {\n        const height = Math.max(this._editor.getLayoutInfo().height / 4, 250, ContentHoverWidget_1._lastDimensions.height);\n        const width = Math.max(this._editor.getLayoutInfo().width * 0.66, 750, ContentHoverWidget_1._lastDimensions.width);\n        this._resizableNode.maxSize = new Dimension(width, height);\n        this._setHoverWidgetMaxDimensions(width, height);\n    }\n    _render(renderedHover) {\n        this._setRenderedHover(renderedHover);\n        this._updateFont();\n        this._updateContent(renderedHover.domNode);\n        this.handleContentsChanged();\n        // Simply force a synchronous render on the editor\n        // such that the widget does not really render with left = '0px'\n        this._editor.render();\n    }\n    getPosition() {\n        if (!this._renderedHover) {\n            return null;\n        }\n        return {\n            position: this._renderedHover.showAtPosition,\n            secondaryPosition: this._renderedHover.showAtSecondaryPosition,\n            positionAffinity: this._renderedHover.shouldAppearBeforeContent ? 3 /* PositionAffinity.LeftOfInjectedText */ : undefined,\n            preference: [this._positionPreference ?? 1 /* ContentWidgetPositionPreference.ABOVE */]\n        };\n    }\n    show(renderedHover) {\n        if (!this._editor || !this._editor.hasModel()) {\n            return;\n        }\n        this._render(renderedHover);\n        const widgetHeight = getTotalHeight(this._hover.containerDomNode);\n        const widgetPosition = renderedHover.showAtPosition;\n        this._positionPreference = this._findPositionPreference(widgetHeight, widgetPosition) ?? 1 /* ContentWidgetPositionPreference.ABOVE */;\n        // See https://github.com/microsoft/vscode/issues/140339\n        // TODO: Doing a second layout of the hover after force rendering the editor\n        this.handleContentsChanged();\n        if (renderedHover.shouldFocus) {\n            this._hover.containerDomNode.focus();\n        }\n        this._onDidResize.fire();\n        // The aria label overrides the label, so if we add to it, add the contents of the hover\n        const hoverFocused = this._hover.containerDomNode.ownerDocument.activeElement === this._hover.containerDomNode;\n        const accessibleViewHint = hoverFocused && getHoverAccessibleViewHint(this._configurationService.getValue('accessibility.verbosity.hover') === true && this._accessibilityService.isScreenReaderOptimized(), this._keybindingService.lookupKeybinding('editor.action.accessibleView')?.getAriaLabel() ?? '');\n        if (accessibleViewHint) {\n            this._hover.contentsDomNode.ariaLabel = this._hover.contentsDomNode.textContent + ', ' + accessibleViewHint;\n        }\n    }\n    hide() {\n        if (!this._renderedHover) {\n            return;\n        }\n        const hoverStoleFocus = this._renderedHover.shouldFocus || this._hoverFocusedKey.get();\n        this._setRenderedHover(undefined);\n        this._resizableNode.maxSize = new Dimension(Infinity, Infinity);\n        this._resizableNode.clearSashHoverState();\n        this._hoverFocusedKey.set(false);\n        this._editor.layoutContentWidget(this);\n        if (hoverStoleFocus) {\n            this._editor.focus();\n        }\n    }\n    _removeConstraintsRenderNormally() {\n        // Added because otherwise the initial size of the hover content is smaller than should be\n        const layoutInfo = this._editor.getLayoutInfo();\n        this._resizableNode.layout(layoutInfo.height, layoutInfo.width);\n        this._setHoverWidgetDimensions('auto', 'auto');\n        this._updateMaxDimensions();\n    }\n    setMinimumDimensions(dimensions) {\n        // We combine the new minimum dimensions with the previous ones\n        this._minimumSize = new Dimension(Math.max(this._minimumSize.width, dimensions.width), Math.max(this._minimumSize.height, dimensions.height));\n        this._updateMinimumWidth();\n    }\n    _updateMinimumWidth() {\n        const width = (typeof this._contentWidth === 'undefined'\n            ? this._minimumSize.width\n            : Math.min(this._contentWidth, this._minimumSize.width));\n        // We want to avoid that the hover is artificially large, so we use the content width as minimum width\n        this._resizableNode.minSize = new Dimension(width, this._minimumSize.height);\n    }\n    handleContentsChanged() {\n        this._removeConstraintsRenderNormally();\n        const contentsDomNode = this._hover.contentsDomNode;\n        let height = getTotalHeight(contentsDomNode);\n        let width = getTotalWidth(contentsDomNode) + 2;\n        this._resizableNode.layout(height, width);\n        this._setHoverWidgetDimensions(width, height);\n        height = getTotalHeight(contentsDomNode);\n        width = getTotalWidth(contentsDomNode);\n        this._contentWidth = width;\n        this._updateMinimumWidth();\n        this._resizableNode.layout(height, width);\n        if (this._renderedHover?.showAtPosition) {\n            const widgetHeight = getTotalHeight(this._hover.containerDomNode);\n            this._positionPreference = this._findPositionPreference(widgetHeight, this._renderedHover.showAtPosition);\n        }\n        this._layoutContentWidget();\n        this._onContentsChanged.fire();\n    }\n    focus() {\n        this._hover.containerDomNode.focus();\n    }\n    scrollUp() {\n        const scrollTop = this._hover.scrollbar.getScrollPosition().scrollTop;\n        const fontInfo = this._editor.getOption(59 /* EditorOption.fontInfo */);\n        this._hover.scrollbar.setScrollPosition({ scrollTop: scrollTop - fontInfo.lineHeight });\n    }\n    scrollDown() {\n        const scrollTop = this._hover.scrollbar.getScrollPosition().scrollTop;\n        const fontInfo = this._editor.getOption(59 /* EditorOption.fontInfo */);\n        this._hover.scrollbar.setScrollPosition({ scrollTop: scrollTop + fontInfo.lineHeight });\n    }\n    scrollLeft() {\n        const scrollLeft = this._hover.scrollbar.getScrollPosition().scrollLeft;\n        this._hover.scrollbar.setScrollPosition({ scrollLeft: scrollLeft - HORIZONTAL_SCROLLING_BY });\n    }\n    scrollRight() {\n        const scrollLeft = this._hover.scrollbar.getScrollPosition().scrollLeft;\n        this._hover.scrollbar.setScrollPosition({ scrollLeft: scrollLeft + HORIZONTAL_SCROLLING_BY });\n    }\n    pageUp() {\n        const scrollTop = this._hover.scrollbar.getScrollPosition().scrollTop;\n        const scrollHeight = this._hover.scrollbar.getScrollDimensions().height;\n        this._hover.scrollbar.setScrollPosition({ scrollTop: scrollTop - scrollHeight });\n    }\n    pageDown() {\n        const scrollTop = this._hover.scrollbar.getScrollPosition().scrollTop;\n        const scrollHeight = this._hover.scrollbar.getScrollDimensions().height;\n        this._hover.scrollbar.setScrollPosition({ scrollTop: scrollTop + scrollHeight });\n    }\n    goToTop() {\n        this._hover.scrollbar.setScrollPosition({ scrollTop: 0 });\n    }\n    goToBottom() {\n        this._hover.scrollbar.setScrollPosition({ scrollTop: this._hover.scrollbar.getScrollDimensions().scrollHeight });\n    }\n};\nContentHoverWidget = ContentHoverWidget_1 = __decorate([\n    __param(1, IContextKeyService),\n    __param(2, IConfigurationService),\n    __param(3, IAccessibilityService),\n    __param(4, IKeybindingService)\n], ContentHoverWidget);\nfunction computeDistanceFromPointToRectangle(pointX, pointY, left, top, width, height) {\n    const x = (left + width / 2); // x center of rectangle\n    const y = (top + height / 2); // y center of rectangle\n    const dx = Math.max(Math.abs(pointX - x) - width / 2, 0);\n    const dy = Math.max(Math.abs(pointY - y) - height / 2, 0);\n    return Math.sqrt(dx * dx + dy * dy);\n}\n\nexport { ContentHoverWidget };\n","import { coalesce } from '../../../../base/common/arrays.js';\nimport { AsyncIterableProducer } from '../../../../base/common/async.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ContentHoverComputer {\n    constructor(_editor, _participants) {\n        this._editor = _editor;\n        this._participants = _participants;\n    }\n    static _getLineDecorations(editor, anchor) {\n        if (anchor.type !== 1 /* HoverAnchorType.Range */ && !anchor.supportsMarkerHover) {\n            return [];\n        }\n        const model = editor.getModel();\n        const lineNumber = anchor.range.startLineNumber;\n        if (lineNumber > model.getLineCount()) {\n            // invalid line\n            return [];\n        }\n        const maxColumn = model.getLineMaxColumn(lineNumber);\n        return editor.getLineDecorations(lineNumber).filter((d) => {\n            if (d.options.isWholeLine) {\n                return true;\n            }\n            const startColumn = (d.range.startLineNumber === lineNumber) ? d.range.startColumn : 1;\n            const endColumn = (d.range.endLineNumber === lineNumber) ? d.range.endColumn : maxColumn;\n            if (d.options.showIfCollapsed) {\n                // Relax check around `showIfCollapsed` decorations to also include +/- 1 character\n                if (startColumn > anchor.range.startColumn + 1 || anchor.range.endColumn - 1 > endColumn) {\n                    return false;\n                }\n            }\n            else {\n                if (startColumn > anchor.range.startColumn || anchor.range.endColumn > endColumn) {\n                    return false;\n                }\n            }\n            return true;\n        });\n    }\n    computeAsync(options, token) {\n        const anchor = options.anchor;\n        if (!this._editor.hasModel() || !anchor) {\n            return AsyncIterableProducer.EMPTY;\n        }\n        const lineDecorations = ContentHoverComputer._getLineDecorations(this._editor, anchor);\n        return AsyncIterableProducer.merge(this._participants.map((participant) => {\n            if (!participant.computeAsync) {\n                return AsyncIterableProducer.EMPTY;\n            }\n            return participant.computeAsync(anchor, lineDecorations, options.source, token);\n        }));\n    }\n    computeSync(options) {\n        if (!this._editor.hasModel()) {\n            return [];\n        }\n        const anchor = options.anchor;\n        const lineDecorations = ContentHoverComputer._getLineDecorations(this._editor, anchor);\n        let result = [];\n        for (const participant of this._participants) {\n            result = result.concat(participant.computeSync(anchor, lineDecorations, options.source));\n        }\n        return coalesce(result);\n    }\n}\n\nexport { ContentHoverComputer };\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 *--------------------------------------------------------------------------------------------*/\nclass ContentHoverResult {\n    constructor(hoverParts, isComplete, options) {\n        this.hoverParts = hoverParts;\n        this.isComplete = isComplete;\n        this.options = options;\n    }\n    filter(anchor) {\n        const filteredHoverParts = this.hoverParts.filter((m) => m.isValidForHoverAnchor(anchor));\n        if (filteredHoverParts.length === this.hoverParts.length) {\n            return this;\n        }\n        return new FilteredContentHoverResult(this, filteredHoverParts, this.isComplete, this.options);\n    }\n}\nclass FilteredContentHoverResult extends ContentHoverResult {\n    constructor(original, messages, isComplete, options) {\n        super(messages, isComplete, options);\n        this.original = original;\n    }\n    filter(anchor) {\n        return this.original.filter(anchor);\n    }\n}\n\nexport { ContentHoverResult, FilteredContentHoverResult };\n","import { $ as $$1, append } from '../../../../base/browser/dom.js';\nimport { HoverAction } from '../../../../base/browser/ui/hover/hoverWidget.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { IHoverService } from '../../../../platform/hover/browser/hover.js';\nimport { getDefaultHoverDelegate } from '../../../../base/browser/ui/hover/hoverDelegateFactory.js';\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst $ = $$1;\nlet EditorHoverStatusBar = class EditorHoverStatusBar extends Disposable {\n    get hasContent() {\n        return this._hasContent;\n    }\n    constructor(_keybindingService, _hoverService) {\n        super();\n        this._keybindingService = _keybindingService;\n        this._hoverService = _hoverService;\n        this.actions = [];\n        this._hasContent = false;\n        this.hoverElement = $('div.hover-row.status-bar');\n        this.hoverElement.tabIndex = 0;\n        this.actionsElement = append(this.hoverElement, $('div.actions'));\n    }\n    addAction(actionOptions) {\n        const keybinding = this._keybindingService.lookupKeybinding(actionOptions.commandId);\n        const keybindingLabel = keybinding ? keybinding.getLabel() : null;\n        this._hasContent = true;\n        const action = this._register(HoverAction.render(this.actionsElement, actionOptions, keybindingLabel));\n        this._register(this._hoverService.setupManagedHover(getDefaultHoverDelegate('element'), action.actionContainer, action.actionRenderedLabel));\n        this.actions.push(action);\n        return action;\n    }\n    append(element) {\n        const result = append(this.actionsElement, element);\n        this._hasContent = true;\n        return result;\n    }\n};\nEditorHoverStatusBar = __decorate([\n    __param(0, IKeybindingService),\n    __param(1, IHoverService)\n], EditorHoverStatusBar);\n\nexport { EditorHoverStatusBar };\n","import { Codicon } from '../../../common/codicons.js';\nimport { Emitter } from '../../../common/event.js';\nimport { ThemeIcon } from '../../../common/themables.js';\nimport { getBaseLayerHoverDelegate } from '../hover/hoverDelegate2.js';\nimport { Widget } from '../widget.js';\nimport './toggle.css';\n\nconst unthemedToggleStyles = {\n    inputActiveOptionBorder: '#007ACC00',\n    inputActiveOptionForeground: '#FFFFFF',\n    inputActiveOptionBackground: '#0E639C50'\n};\nclass Toggle extends Widget {\n    get onChange() { return this._onChange.event; }\n    get onKeyDown() { return this._onKeyDown.event; }\n    constructor(opts) {\n        super();\n        this._onChange = this._register(new Emitter());\n        this._onKeyDown = this._register(new Emitter());\n        this._opts = opts;\n        this._title = this._opts.title;\n        this._checked = this._opts.isChecked;\n        const classes = ['monaco-custom-toggle'];\n        if (this._opts.icon) {\n            this._icon = this._opts.icon;\n            classes.push(...ThemeIcon.asClassNameArray(this._icon));\n        }\n        if (this._opts.actionClassName) {\n            classes.push(...this._opts.actionClassName.split(' '));\n        }\n        if (this._checked) {\n            classes.push('checked');\n        }\n        this.domNode = document.createElement('div');\n        this._register(getBaseLayerHoverDelegate().setupDelayedHover(this.domNode, () => ({\n            content: this._title,\n            style: 1 /* HoverStyle.Pointer */,\n        }), this._opts.hoverLifecycleOptions));\n        this.domNode.classList.add(...classes);\n        if (!this._opts.notFocusable) {\n            this.domNode.tabIndex = 0;\n        }\n        this.domNode.setAttribute('role', 'checkbox');\n        this.domNode.setAttribute('aria-checked', String(this._checked));\n        this.setTitle(this._opts.title);\n        this.applyStyles();\n        this.onclick(this.domNode, (ev) => {\n            if (this.enabled) {\n                this.checked = !this._checked;\n                this._onChange.fire(false);\n                ev.preventDefault();\n            }\n        });\n        this._register(this.ignoreGesture(this.domNode));\n        this.onkeydown(this.domNode, (keyboardEvent) => {\n            if (!this.enabled) {\n                return;\n            }\n            if (keyboardEvent.keyCode === 10 /* KeyCode.Space */ || keyboardEvent.keyCode === 3 /* KeyCode.Enter */) {\n                this.checked = !this._checked;\n                this._onChange.fire(true);\n                keyboardEvent.preventDefault();\n                keyboardEvent.stopPropagation();\n                return;\n            }\n            this._onKeyDown.fire(keyboardEvent);\n        });\n    }\n    get enabled() {\n        return this.domNode.getAttribute('aria-disabled') !== 'true';\n    }\n    focus() {\n        this.domNode.focus();\n    }\n    get checked() {\n        return this._checked;\n    }\n    set checked(newIsChecked) {\n        this._checked = newIsChecked;\n        this.domNode.setAttribute('aria-checked', String(this._checked));\n        this.domNode.classList.toggle('checked', this._checked);\n        this.applyStyles();\n    }\n    setIcon(icon) {\n        if (this._icon) {\n            this.domNode.classList.remove(...ThemeIcon.asClassNameArray(this._icon));\n        }\n        this._icon = icon;\n        if (this._icon) {\n            this.domNode.classList.add(...ThemeIcon.asClassNameArray(this._icon));\n        }\n    }\n    width() {\n        return 2 /*margin left*/ + 2 /*border*/ + 2 /*padding*/ + 16 /* icon width */;\n    }\n    applyStyles() {\n        if (this.domNode) {\n            this.domNode.style.borderColor = (this._checked && this._opts.inputActiveOptionBorder) || '';\n            this.domNode.style.color = (this._checked && this._opts.inputActiveOptionForeground) || 'inherit';\n            this.domNode.style.backgroundColor = (this._checked && this._opts.inputActiveOptionBackground) || '';\n        }\n    }\n    enable() {\n        this.domNode.setAttribute('aria-disabled', String(false));\n        this.domNode.classList.remove('disabled');\n    }\n    disable() {\n        this.domNode.setAttribute('aria-disabled', String(true));\n        this.domNode.classList.add('disabled');\n    }\n    setTitle(newTitle) {\n        this._title = newTitle;\n        this.domNode.setAttribute('aria-label', newTitle);\n    }\n    set visible(visible) {\n        this.domNode.style.display = visible ? '' : 'none';\n    }\n    get visible() {\n        return this.domNode.style.display !== 'none';\n    }\n}\nclass BaseCheckbox extends Widget {\n    static { this.CLASS_NAME = 'monaco-checkbox'; }\n    constructor(checkbox, domNode, styles) {\n        super();\n        this.checkbox = checkbox;\n        this.domNode = domNode;\n        this.styles = styles;\n        this._onChange = this._register(new Emitter());\n        this.onChange = this._onChange.event;\n        this.applyStyles();\n    }\n    get enabled() {\n        return this.checkbox.enabled;\n    }\n    enable() {\n        this.checkbox.enable();\n        this.applyStyles(true);\n    }\n    disable() {\n        this.checkbox.disable();\n        this.applyStyles(false);\n    }\n    setTitle(newTitle) {\n        this.checkbox.setTitle(newTitle);\n    }\n    applyStyles(enabled = this.enabled) {\n        this.domNode.style.color = (enabled ? this.styles.checkboxForeground : this.styles.checkboxDisabledForeground) || '';\n        this.domNode.style.backgroundColor = (enabled ? this.styles.checkboxBackground : this.styles.checkboxDisabledBackground) || '';\n        this.domNode.style.borderColor = (enabled ? this.styles.checkboxBorder : this.styles.checkboxDisabledBackground) || '';\n        const size = this.styles.size || 18;\n        this.domNode.style.width =\n            this.domNode.style.height =\n                this.domNode.style.fontSize = `${size}px`;\n        this.domNode.style.fontSize = `${size - 2}px`;\n    }\n}\nclass Checkbox extends BaseCheckbox {\n    constructor(title, isChecked, styles) {\n        const toggle = new Toggle({ title, isChecked, icon: Codicon.check, actionClassName: BaseCheckbox.CLASS_NAME, hoverLifecycleOptions: styles.hoverLifecycleOptions, ...unthemedToggleStyles });\n        super(toggle, toggle.domNode, styles);\n        this._register(toggle);\n        this._register(this.checkbox.onChange(keyboard => {\n            this.applyStyles();\n            this._onChange.fire(keyboard);\n        }));\n    }\n    get checked() {\n        return this.checkbox.checked;\n    }\n    set checked(newIsChecked) {\n        this.checkbox.checked = newIsChecked;\n        this.applyStyles();\n    }\n    applyStyles(enabled) {\n        if (this.checkbox.checked) {\n            this.checkbox.setIcon(Codicon.check);\n        }\n        else {\n            this.checkbox.setIcon(undefined);\n        }\n        super.applyStyles(enabled);\n    }\n}\nclass TriStateCheckbox extends BaseCheckbox {\n    constructor(title, _state, styles) {\n        let icon;\n        switch (_state) {\n            case true:\n                icon = Codicon.check;\n                break;\n            case 'mixed':\n                icon = Codicon.dash;\n                break;\n            case false:\n                icon = undefined;\n                break;\n        }\n        const checkbox = new Toggle({\n            title,\n            isChecked: _state === true,\n            icon,\n            actionClassName: Checkbox.CLASS_NAME,\n            hoverLifecycleOptions: styles.hoverLifecycleOptions,\n            ...unthemedToggleStyles\n        });\n        super(checkbox, checkbox.domNode, styles);\n        this._state = _state;\n        this._register(checkbox);\n        this._register(this.checkbox.onChange(keyboard => {\n            this._state = this.checkbox.checked;\n            this.applyStyles();\n            this._onChange.fire(keyboard);\n        }));\n    }\n    get checked() {\n        return this._state;\n    }\n    set checked(newState) {\n        if (this._state !== newState) {\n            this._state = newState;\n            this.checkbox.checked = newState === true;\n            this.applyStyles();\n        }\n    }\n    applyStyles(enabled) {\n        switch (this._state) {\n            case true:\n                this.checkbox.setIcon(Codicon.check);\n                break;\n            case 'mixed':\n                this.checkbox.setIcon(Codicon.dash);\n                break;\n            case false:\n                this.checkbox.setIcon(undefined);\n                break;\n        }\n        super.applyStyles(enabled);\n    }\n}\n\nexport { Checkbox, Toggle, TriStateCheckbox, unthemedToggleStyles };\n","import { Range } from '../../../common/core/range.js';\nimport { OverviewRulerLane } from '../../../common/model.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport '../../../../platform/theme/common/colorUtils.js';\nimport '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { overviewRulerFindMatchForeground } from '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport { minimapFindMatch } from '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { themeColorFromId } from '../../../../platform/theme/common/themeService.js';\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 *--------------------------------------------------------------------------------------------*/\nclass FindDecorations {\n    constructor(editor) {\n        this._editor = editor;\n        this._decorations = [];\n        this._overviewRulerApproximateDecorations = [];\n        this._findScopeDecorationIds = [];\n        this._rangeHighlightDecorationId = null;\n        this._highlightedDecorationId = null;\n        this._startPosition = this._editor.getPosition();\n    }\n    dispose() {\n        this._editor.removeDecorations(this._allDecorations());\n        this._decorations = [];\n        this._overviewRulerApproximateDecorations = [];\n        this._findScopeDecorationIds = [];\n        this._rangeHighlightDecorationId = null;\n        this._highlightedDecorationId = null;\n    }\n    reset() {\n        this._decorations = [];\n        this._overviewRulerApproximateDecorations = [];\n        this._findScopeDecorationIds = [];\n        this._rangeHighlightDecorationId = null;\n        this._highlightedDecorationId = null;\n    }\n    getCount() {\n        return this._decorations.length;\n    }\n    /** @deprecated use getFindScopes to support multiple selections */\n    getFindScope() {\n        if (this._findScopeDecorationIds[0]) {\n            return this._editor.getModel().getDecorationRange(this._findScopeDecorationIds[0]);\n        }\n        return null;\n    }\n    getFindScopes() {\n        if (this._findScopeDecorationIds.length) {\n            const scopes = this._findScopeDecorationIds.map(findScopeDecorationId => this._editor.getModel().getDecorationRange(findScopeDecorationId)).filter(element => !!element);\n            if (scopes.length) {\n                return scopes;\n            }\n        }\n        return null;\n    }\n    getStartPosition() {\n        return this._startPosition;\n    }\n    setStartPosition(newStartPosition) {\n        this._startPosition = newStartPosition;\n        this.setCurrentFindMatch(null);\n    }\n    _getDecorationIndex(decorationId) {\n        const index = this._decorations.indexOf(decorationId);\n        if (index >= 0) {\n            return index + 1;\n        }\n        return 1;\n    }\n    getDecorationRangeAt(index) {\n        const decorationId = index < this._decorations.length ? this._decorations[index] : null;\n        if (decorationId) {\n            return this._editor.getModel().getDecorationRange(decorationId);\n        }\n        return null;\n    }\n    getCurrentMatchesPosition(desiredRange) {\n        const candidates = this._editor.getModel().getDecorationsInRange(desiredRange);\n        for (const candidate of candidates) {\n            const candidateOpts = candidate.options;\n            if (candidateOpts === FindDecorations._FIND_MATCH_DECORATION || candidateOpts === FindDecorations._CURRENT_FIND_MATCH_DECORATION) {\n                return this._getDecorationIndex(candidate.id);\n            }\n        }\n        // We don't know the current match position, so returns zero to show '?' in find widget\n        return 0;\n    }\n    setCurrentFindMatch(nextMatch) {\n        let newCurrentDecorationId = null;\n        let matchPosition = 0;\n        if (nextMatch) {\n            for (let i = 0, len = this._decorations.length; i < len; i++) {\n                const range = this._editor.getModel().getDecorationRange(this._decorations[i]);\n                if (nextMatch.equalsRange(range)) {\n                    newCurrentDecorationId = this._decorations[i];\n                    matchPosition = (i + 1);\n                    break;\n                }\n            }\n        }\n        if (this._highlightedDecorationId !== null || newCurrentDecorationId !== null) {\n            this._editor.changeDecorations((changeAccessor) => {\n                if (this._highlightedDecorationId !== null) {\n                    changeAccessor.changeDecorationOptions(this._highlightedDecorationId, FindDecorations._FIND_MATCH_DECORATION);\n                    this._highlightedDecorationId = null;\n                }\n                if (newCurrentDecorationId !== null) {\n                    this._highlightedDecorationId = newCurrentDecorationId;\n                    changeAccessor.changeDecorationOptions(this._highlightedDecorationId, FindDecorations._CURRENT_FIND_MATCH_DECORATION);\n                }\n                if (this._rangeHighlightDecorationId !== null) {\n                    changeAccessor.removeDecoration(this._rangeHighlightDecorationId);\n                    this._rangeHighlightDecorationId = null;\n                }\n                if (newCurrentDecorationId !== null) {\n                    let rng = this._editor.getModel().getDecorationRange(newCurrentDecorationId);\n                    if (rng.startLineNumber !== rng.endLineNumber && rng.endColumn === 1) {\n                        const lineBeforeEnd = rng.endLineNumber - 1;\n                        const lineBeforeEndMaxColumn = this._editor.getModel().getLineMaxColumn(lineBeforeEnd);\n                        rng = new Range(rng.startLineNumber, rng.startColumn, lineBeforeEnd, lineBeforeEndMaxColumn);\n                    }\n                    this._rangeHighlightDecorationId = changeAccessor.addDecoration(rng, FindDecorations._RANGE_HIGHLIGHT_DECORATION);\n                }\n            });\n        }\n        return matchPosition;\n    }\n    set(findMatches, findScopes) {\n        this._editor.changeDecorations((accessor) => {\n            let findMatchesOptions = FindDecorations._FIND_MATCH_DECORATION;\n            const newOverviewRulerApproximateDecorations = [];\n            if (findMatches.length > 1000) {\n                // we go into a mode where the overview ruler gets \"approximate\" decorations\n                // the reason is that the overview ruler paints all the decorations in the file and we don't want to cause freezes\n                findMatchesOptions = FindDecorations._FIND_MATCH_NO_OVERVIEW_DECORATION;\n                // approximate a distance in lines where matches should be merged\n                const lineCount = this._editor.getModel().getLineCount();\n                const height = this._editor.getLayoutInfo().height;\n                const approxPixelsPerLine = height / lineCount;\n                const mergeLinesDelta = Math.max(2, Math.ceil(3 / approxPixelsPerLine));\n                // merge decorations as much as possible\n                let prevStartLineNumber = findMatches[0].range.startLineNumber;\n                let prevEndLineNumber = findMatches[0].range.endLineNumber;\n                for (let i = 1, len = findMatches.length; i < len; i++) {\n                    const range = findMatches[i].range;\n                    if (prevEndLineNumber + mergeLinesDelta >= range.startLineNumber) {\n                        if (range.endLineNumber > prevEndLineNumber) {\n                            prevEndLineNumber = range.endLineNumber;\n                        }\n                    }\n                    else {\n                        newOverviewRulerApproximateDecorations.push({\n                            range: new Range(prevStartLineNumber, 1, prevEndLineNumber, 1),\n                            options: FindDecorations._FIND_MATCH_ONLY_OVERVIEW_DECORATION\n                        });\n                        prevStartLineNumber = range.startLineNumber;\n                        prevEndLineNumber = range.endLineNumber;\n                    }\n                }\n                newOverviewRulerApproximateDecorations.push({\n                    range: new Range(prevStartLineNumber, 1, prevEndLineNumber, 1),\n                    options: FindDecorations._FIND_MATCH_ONLY_OVERVIEW_DECORATION\n                });\n            }\n            // Find matches\n            const newFindMatchesDecorations = new Array(findMatches.length);\n            for (let i = 0, len = findMatches.length; i < len; i++) {\n                newFindMatchesDecorations[i] = {\n                    range: findMatches[i].range,\n                    options: findMatchesOptions\n                };\n            }\n            this._decorations = accessor.deltaDecorations(this._decorations, newFindMatchesDecorations);\n            // Overview ruler approximate decorations\n            this._overviewRulerApproximateDecorations = accessor.deltaDecorations(this._overviewRulerApproximateDecorations, newOverviewRulerApproximateDecorations);\n            // Range highlight\n            if (this._rangeHighlightDecorationId) {\n                accessor.removeDecoration(this._rangeHighlightDecorationId);\n                this._rangeHighlightDecorationId = null;\n            }\n            // Find scope\n            if (this._findScopeDecorationIds.length) {\n                this._findScopeDecorationIds.forEach(findScopeDecorationId => accessor.removeDecoration(findScopeDecorationId));\n                this._findScopeDecorationIds = [];\n            }\n            if (findScopes?.length) {\n                this._findScopeDecorationIds = findScopes.map(findScope => accessor.addDecoration(findScope, FindDecorations._FIND_SCOPE_DECORATION));\n            }\n        });\n    }\n    matchBeforePosition(position) {\n        if (this._decorations.length === 0) {\n            return null;\n        }\n        for (let i = this._decorations.length - 1; i >= 0; i--) {\n            const decorationId = this._decorations[i];\n            const r = this._editor.getModel().getDecorationRange(decorationId);\n            if (!r || r.endLineNumber > position.lineNumber) {\n                continue;\n            }\n            if (r.endLineNumber < position.lineNumber) {\n                return r;\n            }\n            if (r.endColumn > position.column) {\n                continue;\n            }\n            return r;\n        }\n        return this._editor.getModel().getDecorationRange(this._decorations[this._decorations.length - 1]);\n    }\n    matchAfterPosition(position) {\n        if (this._decorations.length === 0) {\n            return null;\n        }\n        for (let i = 0, len = this._decorations.length; i < len; i++) {\n            const decorationId = this._decorations[i];\n            const r = this._editor.getModel().getDecorationRange(decorationId);\n            if (!r || r.startLineNumber < position.lineNumber) {\n                continue;\n            }\n            if (r.startLineNumber > position.lineNumber) {\n                return r;\n            }\n            if (r.startColumn < position.column) {\n                continue;\n            }\n            return r;\n        }\n        return this._editor.getModel().getDecorationRange(this._decorations[0]);\n    }\n    _allDecorations() {\n        let result = [];\n        result = result.concat(this._decorations);\n        result = result.concat(this._overviewRulerApproximateDecorations);\n        if (this._findScopeDecorationIds.length) {\n            result.push(...this._findScopeDecorationIds);\n        }\n        if (this._rangeHighlightDecorationId) {\n            result.push(this._rangeHighlightDecorationId);\n        }\n        return result;\n    }\n    static { this._CURRENT_FIND_MATCH_DECORATION = ModelDecorationOptions.register({\n        description: 'current-find-match',\n        stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n        zIndex: 13,\n        className: 'currentFindMatch',\n        inlineClassName: 'currentFindMatchInline',\n        showIfCollapsed: true,\n        overviewRuler: {\n            color: themeColorFromId(overviewRulerFindMatchForeground),\n            position: OverviewRulerLane.Center\n        },\n        minimap: {\n            color: themeColorFromId(minimapFindMatch),\n            position: 1 /* MinimapPosition.Inline */\n        }\n    }); }\n    static { this._FIND_MATCH_DECORATION = ModelDecorationOptions.register({\n        description: 'find-match',\n        stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n        zIndex: 10,\n        className: 'findMatch',\n        inlineClassName: 'findMatchInline',\n        showIfCollapsed: true,\n        overviewRuler: {\n            color: themeColorFromId(overviewRulerFindMatchForeground),\n            position: OverviewRulerLane.Center\n        },\n        minimap: {\n            color: themeColorFromId(minimapFindMatch),\n            position: 1 /* MinimapPosition.Inline */\n        }\n    }); }\n    static { this._FIND_MATCH_NO_OVERVIEW_DECORATION = ModelDecorationOptions.register({\n        description: 'find-match-no-overview',\n        stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n        className: 'findMatch',\n        showIfCollapsed: true\n    }); }\n    static { this._FIND_MATCH_ONLY_OVERVIEW_DECORATION = ModelDecorationOptions.register({\n        description: 'find-match-only-overview',\n        stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n        overviewRuler: {\n            color: themeColorFromId(overviewRulerFindMatchForeground),\n            position: OverviewRulerLane.Center\n        }\n    }); }\n    static { this._RANGE_HIGHLIGHT_DECORATION = ModelDecorationOptions.register({\n        description: 'find-range-highlight',\n        stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n        className: 'rangeHighlight',\n        isWholeLine: true\n    }); }\n    static { this._FIND_SCOPE_DECORATION = ModelDecorationOptions.register({\n        description: 'find-scope',\n        className: 'findScope',\n        isWholeLine: true\n    }); }\n}\n\nexport { FindDecorations };\n","import { Range } from '../../../common/core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ReplaceAllCommand {\n    constructor(editorSelection, ranges, replaceStrings) {\n        this._editorSelection = editorSelection;\n        this._ranges = ranges;\n        this._replaceStrings = replaceStrings;\n        this._trackedEditorSelectionId = null;\n    }\n    getEditOperations(model, builder) {\n        if (this._ranges.length > 0) {\n            // Collect all edit operations\n            const ops = [];\n            for (let i = 0; i < this._ranges.length; i++) {\n                ops.push({\n                    range: this._ranges[i],\n                    text: this._replaceStrings[i]\n                });\n            }\n            // Sort them in ascending order by range starts\n            ops.sort((o1, o2) => {\n                return Range.compareRangesUsingStarts(o1.range, o2.range);\n            });\n            // Merge operations that touch each other\n            const resultOps = [];\n            let previousOp = ops[0];\n            for (let i = 1; i < ops.length; i++) {\n                if (previousOp.range.endLineNumber === ops[i].range.startLineNumber && previousOp.range.endColumn === ops[i].range.startColumn) {\n                    // These operations are one after another and can be merged\n                    previousOp.range = previousOp.range.plusRange(ops[i].range);\n                    previousOp.text = previousOp.text + ops[i].text;\n                }\n                else {\n                    resultOps.push(previousOp);\n                    previousOp = ops[i];\n                }\n            }\n            resultOps.push(previousOp);\n            for (const op of resultOps) {\n                builder.addEditOperation(op.range, op.text);\n            }\n        }\n        this._trackedEditorSelectionId = builder.trackSelection(this._editorSelection);\n    }\n    computeCursorState(model, helper) {\n        return helper.getTrackedSelection(this._trackedEditorSelectionId);\n    }\n}\n\nexport { ReplaceAllCommand };\n","import { containsUppercaseCharacter } from './strings.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction buildReplaceStringWithCasePreserved(matches, pattern) {\n    if (matches && (matches[0] !== '')) {\n        const containsHyphens = validateSpecificSpecialCharacter(matches, pattern, '-');\n        const containsUnderscores = validateSpecificSpecialCharacter(matches, pattern, '_');\n        if (containsHyphens && !containsUnderscores) {\n            return buildReplaceStringForSpecificSpecialCharacter(matches, pattern, '-');\n        }\n        else if (!containsHyphens && containsUnderscores) {\n            return buildReplaceStringForSpecificSpecialCharacter(matches, pattern, '_');\n        }\n        if (matches[0].toUpperCase() === matches[0]) {\n            return pattern.toUpperCase();\n        }\n        else if (matches[0].toLowerCase() === matches[0]) {\n            return pattern.toLowerCase();\n        }\n        else if (containsUppercaseCharacter(matches[0][0]) && pattern.length > 0) {\n            return pattern[0].toUpperCase() + pattern.substr(1);\n        }\n        else if (matches[0][0].toUpperCase() !== matches[0][0] && pattern.length > 0) {\n            return pattern[0].toLowerCase() + pattern.substr(1);\n        }\n        else {\n            // we don't understand its pattern yet.\n            return pattern;\n        }\n    }\n    else {\n        return pattern;\n    }\n}\nfunction validateSpecificSpecialCharacter(matches, pattern, specialCharacter) {\n    const doesContainSpecialCharacter = matches[0].indexOf(specialCharacter) !== -1 && pattern.indexOf(specialCharacter) !== -1;\n    return doesContainSpecialCharacter && matches[0].split(specialCharacter).length === pattern.split(specialCharacter).length;\n}\nfunction buildReplaceStringForSpecificSpecialCharacter(matches, pattern, specialCharacter) {\n    const splitPatternAtSpecialCharacter = pattern.split(specialCharacter);\n    const splitMatchAtSpecialCharacter = matches[0].split(specialCharacter);\n    let replaceString = '';\n    splitPatternAtSpecialCharacter.forEach((splitValue, index) => {\n        replaceString += buildReplaceStringWithCasePreserved([splitMatchAtSpecialCharacter[index]], splitValue) + specialCharacter;\n    });\n    return replaceString.slice(0, -1);\n}\n\nexport { buildReplaceStringWithCasePreserved };\n","import { buildReplaceStringWithCasePreserved } from '../../../../base/common/search.js';\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/**\n * Assigned when the replace pattern is entirely static.\n */\nclass StaticValueReplacePattern {\n    constructor(staticValue) {\n        this.staticValue = staticValue;\n        this.kind = 0 /* ReplacePatternKind.StaticValue */;\n    }\n}\n/**\n * Assigned when the replace pattern has replacement patterns.\n */\nclass DynamicPiecesReplacePattern {\n    constructor(pieces) {\n        this.pieces = pieces;\n        this.kind = 1 /* ReplacePatternKind.DynamicPieces */;\n    }\n}\nclass ReplacePattern {\n    static fromStaticValue(value) {\n        return new ReplacePattern([ReplacePiece.staticValue(value)]);\n    }\n    get hasReplacementPatterns() {\n        return (this._state.kind === 1 /* ReplacePatternKind.DynamicPieces */);\n    }\n    constructor(pieces) {\n        if (!pieces || pieces.length === 0) {\n            this._state = new StaticValueReplacePattern('');\n        }\n        else if (pieces.length === 1 && pieces[0].staticValue !== null) {\n            this._state = new StaticValueReplacePattern(pieces[0].staticValue);\n        }\n        else {\n            this._state = new DynamicPiecesReplacePattern(pieces);\n        }\n    }\n    buildReplaceString(matches, preserveCase) {\n        if (this._state.kind === 0 /* ReplacePatternKind.StaticValue */) {\n            if (preserveCase) {\n                return buildReplaceStringWithCasePreserved(matches, this._state.staticValue);\n            }\n            else {\n                return this._state.staticValue;\n            }\n        }\n        let result = '';\n        for (let i = 0, len = this._state.pieces.length; i < len; i++) {\n            const piece = this._state.pieces[i];\n            if (piece.staticValue !== null) {\n                // static value ReplacePiece\n                result += piece.staticValue;\n                continue;\n            }\n            // match index ReplacePiece\n            let match = ReplacePattern._substitute(piece.matchIndex, matches);\n            if (piece.caseOps !== null && piece.caseOps.length > 0) {\n                const repl = [];\n                const lenOps = piece.caseOps.length;\n                let opIdx = 0;\n                for (let idx = 0, len = match.length; idx < len; idx++) {\n                    if (opIdx >= lenOps) {\n                        repl.push(match.slice(idx));\n                        break;\n                    }\n                    switch (piece.caseOps[opIdx]) {\n                        case 'U':\n                            repl.push(match[idx].toUpperCase());\n                            break;\n                        case 'u':\n                            repl.push(match[idx].toUpperCase());\n                            opIdx++;\n                            break;\n                        case 'L':\n                            repl.push(match[idx].toLowerCase());\n                            break;\n                        case 'l':\n                            repl.push(match[idx].toLowerCase());\n                            opIdx++;\n                            break;\n                        default:\n                            repl.push(match[idx]);\n                    }\n                }\n                match = repl.join('');\n            }\n            result += match;\n        }\n        return result;\n    }\n    static _substitute(matchIndex, matches) {\n        if (matches === null) {\n            return '';\n        }\n        if (matchIndex === 0) {\n            return matches[0];\n        }\n        let remainder = '';\n        while (matchIndex > 0) {\n            if (matchIndex < matches.length) {\n                // A match can be undefined\n                const match = (matches[matchIndex] || '');\n                return match + remainder;\n            }\n            remainder = String(matchIndex % 10) + remainder;\n            matchIndex = Math.floor(matchIndex / 10);\n        }\n        return '$' + remainder;\n    }\n}\n/**\n * A replace piece can either be a static string or an index to a specific match.\n */\nclass ReplacePiece {\n    static staticValue(value) {\n        return new ReplacePiece(value, -1, null);\n    }\n    static caseOps(index, caseOps) {\n        return new ReplacePiece(null, index, caseOps);\n    }\n    constructor(staticValue, matchIndex, caseOps) {\n        this.staticValue = staticValue;\n        this.matchIndex = matchIndex;\n        if (!caseOps || caseOps.length === 0) {\n            this.caseOps = null;\n        }\n        else {\n            this.caseOps = caseOps.slice(0);\n        }\n    }\n}\nclass ReplacePieceBuilder {\n    constructor(source) {\n        this._source = source;\n        this._lastCharIndex = 0;\n        this._result = [];\n        this._resultLen = 0;\n        this._currentStaticPiece = '';\n    }\n    emitUnchanged(toCharIndex) {\n        this._emitStatic(this._source.substring(this._lastCharIndex, toCharIndex));\n        this._lastCharIndex = toCharIndex;\n    }\n    emitStatic(value, toCharIndex) {\n        this._emitStatic(value);\n        this._lastCharIndex = toCharIndex;\n    }\n    _emitStatic(value) {\n        if (value.length === 0) {\n            return;\n        }\n        this._currentStaticPiece += value;\n    }\n    emitMatchIndex(index, toCharIndex, caseOps) {\n        if (this._currentStaticPiece.length !== 0) {\n            this._result[this._resultLen++] = ReplacePiece.staticValue(this._currentStaticPiece);\n            this._currentStaticPiece = '';\n        }\n        this._result[this._resultLen++] = ReplacePiece.caseOps(index, caseOps);\n        this._lastCharIndex = toCharIndex;\n    }\n    finalize() {\n        this.emitUnchanged(this._source.length);\n        if (this._currentStaticPiece.length !== 0) {\n            this._result[this._resultLen++] = ReplacePiece.staticValue(this._currentStaticPiece);\n            this._currentStaticPiece = '';\n        }\n        return new ReplacePattern(this._result);\n    }\n}\n/**\n * \\n\t\t\t=> inserts a LF\n * \\t\t\t\t=> inserts a TAB\n * \\\\\t\t\t=> inserts a \"\\\".\n * \\u\t\t\t=> upper-cases one character in a match.\n * \\U\t\t\t=> upper-cases ALL remaining characters in a match.\n * \\l\t\t\t=> lower-cases one character in a match.\n * \\L\t\t\t=> lower-cases ALL remaining characters in a match.\n * $$\t\t\t=> inserts a \"$\".\n * $& and $0\t=> inserts the matched substring.\n * $n\t\t\t=> Where n is a non-negative integer lesser than 100, inserts the nth parenthesized submatch string\n * everything else stays untouched\n *\n * Also see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter\n */\nfunction parseReplaceString(replaceString) {\n    if (!replaceString || replaceString.length === 0) {\n        return new ReplacePattern(null);\n    }\n    const caseOps = [];\n    const result = new ReplacePieceBuilder(replaceString);\n    for (let i = 0, len = replaceString.length; i < len; i++) {\n        const chCode = replaceString.charCodeAt(i);\n        if (chCode === 92 /* CharCode.Backslash */) {\n            // move to next char\n            i++;\n            if (i >= len) {\n                // string ends with a \\\n                break;\n            }\n            const nextChCode = replaceString.charCodeAt(i);\n            // let replaceWithCharacter: string | null = null;\n            switch (nextChCode) {\n                case 92 /* CharCode.Backslash */:\n                    // \\\\ => inserts a \"\\\"\n                    result.emitUnchanged(i - 1);\n                    result.emitStatic('\\\\', i + 1);\n                    break;\n                case 110 /* CharCode.n */:\n                    // \\n => inserts a LF\n                    result.emitUnchanged(i - 1);\n                    result.emitStatic('\\n', i + 1);\n                    break;\n                case 116 /* CharCode.t */:\n                    // \\t => inserts a TAB\n                    result.emitUnchanged(i - 1);\n                    result.emitStatic('\\t', i + 1);\n                    break;\n                // Case modification of string replacements, patterned after Boost, but only applied\n                // to the replacement text, not subsequent content.\n                case 117 /* CharCode.u */:\n                // \\u => upper-cases one character.\n                case 85 /* CharCode.U */:\n                // \\U => upper-cases ALL following characters.\n                case 108 /* CharCode.l */:\n                // \\l => lower-cases one character.\n                case 76 /* CharCode.L */:\n                    // \\L => lower-cases ALL following characters.\n                    result.emitUnchanged(i - 1);\n                    result.emitStatic('', i + 1);\n                    caseOps.push(String.fromCharCode(nextChCode));\n                    break;\n            }\n            continue;\n        }\n        if (chCode === 36 /* CharCode.DollarSign */) {\n            // move to next char\n            i++;\n            if (i >= len) {\n                // string ends with a $\n                break;\n            }\n            const nextChCode = replaceString.charCodeAt(i);\n            if (nextChCode === 36 /* CharCode.DollarSign */) {\n                // $$ => inserts a \"$\"\n                result.emitUnchanged(i - 1);\n                result.emitStatic('$', i + 1);\n                continue;\n            }\n            if (nextChCode === 48 /* CharCode.Digit0 */ || nextChCode === 38 /* CharCode.Ampersand */) {\n                // $& and $0 => inserts the matched substring.\n                result.emitUnchanged(i - 1);\n                result.emitMatchIndex(0, i + 1, caseOps);\n                caseOps.length = 0;\n                continue;\n            }\n            if (49 /* CharCode.Digit1 */ <= nextChCode && nextChCode <= 57 /* CharCode.Digit9 */) {\n                // $n\n                let matchIndex = nextChCode - 48 /* CharCode.Digit0 */;\n                // peek next char to probe for $nn\n                if (i + 1 < len) {\n                    const nextNextChCode = replaceString.charCodeAt(i + 1);\n                    if (48 /* CharCode.Digit0 */ <= nextNextChCode && nextNextChCode <= 57 /* CharCode.Digit9 */) {\n                        // $nn\n                        // move to next char\n                        i++;\n                        matchIndex = matchIndex * 10 + (nextNextChCode - 48 /* CharCode.Digit0 */);\n                        result.emitUnchanged(i - 2);\n                        result.emitMatchIndex(matchIndex, i + 1, caseOps);\n                        caseOps.length = 0;\n                        continue;\n                    }\n                }\n                result.emitUnchanged(i - 1);\n                result.emitMatchIndex(matchIndex, i + 1, caseOps);\n                caseOps.length = 0;\n                continue;\n            }\n        }\n    }\n    return result.finalize();\n}\n\nexport { ReplacePattern, ReplacePiece, parseReplaceString };\n","import { findFirstIdxMonotonousOrArrLen } from '../../../../base/common/arraysFind.js';\nimport { TimeoutTimer, RunOnceScheduler } from '../../../../base/common/async.js';\nimport { DisposableStore, dispose } from '../../../../base/common/lifecycle.js';\nimport { ReplaceCommand, ReplaceCommandThatPreservesSelection } from '../../../common/commands/replaceCommand.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { SearchParams } from '../../../common/model/textModelSearch.js';\nimport { FindDecorations } from './findDecorations.js';\nimport { ReplaceAllCommand } from './replaceAllCommand.js';\nimport { parseReplaceString, ReplacePattern } from './replacePattern.js';\nimport { RawContextKey } from '../../../../platform/contextkey/common/contextkey.js';\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 *--------------------------------------------------------------------------------------------*/\nconst CONTEXT_FIND_WIDGET_VISIBLE = new RawContextKey('findWidgetVisible', false);\nCONTEXT_FIND_WIDGET_VISIBLE.toNegated();\n// Keep ContextKey use of 'Focussed' to not break when clauses\nconst CONTEXT_FIND_INPUT_FOCUSED = new RawContextKey('findInputFocussed', false);\nconst CONTEXT_REPLACE_INPUT_FOCUSED = new RawContextKey('replaceInputFocussed', false);\nconst ToggleCaseSensitiveKeybinding = {\n    primary: 512 /* KeyMod.Alt */ | 33 /* KeyCode.KeyC */,\n    mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 33 /* KeyCode.KeyC */ }\n};\nconst ToggleWholeWordKeybinding = {\n    primary: 512 /* KeyMod.Alt */ | 53 /* KeyCode.KeyW */,\n    mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 53 /* KeyCode.KeyW */ }\n};\nconst ToggleRegexKeybinding = {\n    primary: 512 /* KeyMod.Alt */ | 48 /* KeyCode.KeyR */,\n    mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 48 /* KeyCode.KeyR */ }\n};\nconst ToggleSearchScopeKeybinding = {\n    primary: 512 /* KeyMod.Alt */ | 42 /* KeyCode.KeyL */,\n    mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 42 /* KeyCode.KeyL */ }\n};\nconst TogglePreserveCaseKeybinding = {\n    primary: 512 /* KeyMod.Alt */ | 46 /* KeyCode.KeyP */,\n    mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 46 /* KeyCode.KeyP */ }\n};\nconst FIND_IDS = {\n    StartFindAction: 'actions.find',\n    StartFindWithSelection: 'actions.findWithSelection',\n    StartFindWithArgs: 'editor.actions.findWithArgs',\n    NextMatchFindAction: 'editor.action.nextMatchFindAction',\n    PreviousMatchFindAction: 'editor.action.previousMatchFindAction',\n    GoToMatchFindAction: 'editor.action.goToMatchFindAction',\n    NextSelectionMatchFindAction: 'editor.action.nextSelectionMatchFindAction',\n    PreviousSelectionMatchFindAction: 'editor.action.previousSelectionMatchFindAction',\n    StartFindReplaceAction: 'editor.action.startFindReplaceAction',\n    CloseFindWidgetCommand: 'closeFindWidget',\n    ToggleCaseSensitiveCommand: 'toggleFindCaseSensitive',\n    ToggleWholeWordCommand: 'toggleFindWholeWord',\n    ToggleRegexCommand: 'toggleFindRegex',\n    ToggleSearchScopeCommand: 'toggleFindInSelection',\n    TogglePreserveCaseCommand: 'togglePreserveCase',\n    ReplaceOneAction: 'editor.action.replaceOne',\n    ReplaceAllAction: 'editor.action.replaceAll',\n    SelectAllMatchesAction: 'editor.action.selectAllMatches'\n};\nconst MATCHES_LIMIT = 19999;\nconst RESEARCH_DELAY = 240;\nclass FindModelBoundToEditorModel {\n    constructor(editor, state) {\n        this._toDispose = new DisposableStore();\n        this._editor = editor;\n        this._state = state;\n        this._isDisposed = false;\n        this._startSearchingTimer = new TimeoutTimer();\n        this._decorations = new FindDecorations(editor);\n        this._toDispose.add(this._decorations);\n        this._updateDecorationsScheduler = new RunOnceScheduler(() => {\n            if (!this._editor.hasModel()) {\n                return;\n            }\n            return this.research(false);\n        }, 100);\n        this._toDispose.add(this._updateDecorationsScheduler);\n        this._toDispose.add(this._editor.onDidChangeCursorPosition((e) => {\n            if (e.reason === 3 /* CursorChangeReason.Explicit */\n                || e.reason === 5 /* CursorChangeReason.Undo */\n                || e.reason === 6 /* CursorChangeReason.Redo */) {\n                this._decorations.setStartPosition(this._editor.getPosition());\n            }\n        }));\n        this._ignoreModelContentChanged = false;\n        this._toDispose.add(this._editor.onDidChangeModelContent((e) => {\n            if (this._ignoreModelContentChanged) {\n                return;\n            }\n            if (e.isFlush) {\n                // a model.setValue() was called\n                this._decorations.reset();\n            }\n            this._decorations.setStartPosition(this._editor.getPosition());\n            this._updateDecorationsScheduler.schedule();\n        }));\n        this._toDispose.add(this._state.onFindReplaceStateChange((e) => this._onStateChanged(e)));\n        this.research(false, this._state.searchScope);\n    }\n    dispose() {\n        this._isDisposed = true;\n        dispose(this._startSearchingTimer);\n        this._toDispose.dispose();\n    }\n    _onStateChanged(e) {\n        if (this._isDisposed) {\n            // The find model is disposed during a find state changed event\n            return;\n        }\n        if (!this._editor.hasModel()) {\n            // The find model will be disposed momentarily\n            return;\n        }\n        if (e.searchString || e.isReplaceRevealed || e.isRegex || e.wholeWord || e.matchCase || e.searchScope) {\n            const model = this._editor.getModel();\n            if (model.isTooLargeForSyncing()) {\n                this._startSearchingTimer.cancel();\n                this._startSearchingTimer.setIfNotSet(() => {\n                    if (e.searchScope) {\n                        this.research(e.moveCursor, this._state.searchScope);\n                    }\n                    else {\n                        this.research(e.moveCursor);\n                    }\n                }, RESEARCH_DELAY);\n            }\n            else {\n                if (e.searchScope) {\n                    this.research(e.moveCursor, this._state.searchScope);\n                }\n                else {\n                    this.research(e.moveCursor);\n                }\n            }\n        }\n    }\n    static _getSearchRange(model, findScope) {\n        // If we have set now or before a find scope, use it for computing the search range\n        if (findScope) {\n            return findScope;\n        }\n        return model.getFullModelRange();\n    }\n    research(moveCursor, newFindScope) {\n        let findScopes = null;\n        if (typeof newFindScope !== 'undefined') {\n            if (newFindScope !== null) {\n                if (!Array.isArray(newFindScope)) {\n                    findScopes = [newFindScope];\n                }\n                else {\n                    findScopes = newFindScope;\n                }\n            }\n        }\n        else {\n            findScopes = this._decorations.getFindScopes();\n        }\n        if (findScopes !== null) {\n            findScopes = findScopes.map(findScope => {\n                if (findScope.startLineNumber !== findScope.endLineNumber) {\n                    let endLineNumber = findScope.endLineNumber;\n                    if (findScope.endColumn === 1) {\n                        endLineNumber = endLineNumber - 1;\n                    }\n                    return new Range(findScope.startLineNumber, 1, endLineNumber, this._editor.getModel().getLineMaxColumn(endLineNumber));\n                }\n                return findScope;\n            });\n        }\n        const findMatches = this._findMatches(findScopes, false, MATCHES_LIMIT);\n        this._decorations.set(findMatches, findScopes);\n        const editorSelection = this._editor.getSelection();\n        let currentMatchesPosition = this._decorations.getCurrentMatchesPosition(editorSelection);\n        if (currentMatchesPosition === 0 && findMatches.length > 0) {\n            // current selection is not on top of a match\n            // try to find its nearest result from the top of the document\n            const matchAfterSelection = findFirstIdxMonotonousOrArrLen(findMatches.map(match => match.range), range => Range.compareRangesUsingStarts(range, editorSelection) >= 0);\n            currentMatchesPosition = matchAfterSelection > 0 ? matchAfterSelection - 1 + 1 /** match position is one based */ : currentMatchesPosition;\n        }\n        this._state.changeMatchInfo(currentMatchesPosition, this._decorations.getCount(), undefined);\n        if (moveCursor && this._editor.getOption(50 /* EditorOption.find */).cursorMoveOnType) {\n            this._moveToNextMatch(this._decorations.getStartPosition());\n        }\n    }\n    _hasMatches() {\n        return (this._state.matchesCount > 0);\n    }\n    _cannotFind() {\n        if (!this._hasMatches()) {\n            const findScope = this._decorations.getFindScope();\n            if (findScope) {\n                // Reveal the selection so user is reminded that 'selection find' is on.\n                this._editor.revealRangeInCenterIfOutsideViewport(findScope, 0 /* ScrollType.Smooth */);\n            }\n            return true;\n        }\n        return false;\n    }\n    _setCurrentFindMatch(match) {\n        const matchesPosition = this._decorations.setCurrentFindMatch(match);\n        this._state.changeMatchInfo(matchesPosition, this._decorations.getCount(), match);\n        this._editor.setSelection(match);\n        this._editor.revealRangeInCenterIfOutsideViewport(match, 0 /* ScrollType.Smooth */);\n    }\n    _prevSearchPosition(before) {\n        const isUsingLineStops = this._state.isRegex && (this._state.searchString.indexOf('^') >= 0\n            || this._state.searchString.indexOf('$') >= 0);\n        let { lineNumber, column } = before;\n        const model = this._editor.getModel();\n        if (isUsingLineStops || column === 1) {\n            if (lineNumber === 1) {\n                lineNumber = model.getLineCount();\n            }\n            else {\n                lineNumber--;\n            }\n            column = model.getLineMaxColumn(lineNumber);\n        }\n        else {\n            column--;\n        }\n        return new Position(lineNumber, column);\n    }\n    _moveToPrevMatch(before, isRecursed = false) {\n        if (!this._state.canNavigateBack()) {\n            // we are beyond the first matched find result\n            // instead of doing nothing, we should refocus the first item\n            const nextMatchRange = this._decorations.matchAfterPosition(before);\n            if (nextMatchRange) {\n                this._setCurrentFindMatch(nextMatchRange);\n            }\n            return;\n        }\n        if (this._decorations.getCount() < MATCHES_LIMIT) {\n            let prevMatchRange = this._decorations.matchBeforePosition(before);\n            if (prevMatchRange && prevMatchRange.isEmpty() && prevMatchRange.getStartPosition().equals(before)) {\n                before = this._prevSearchPosition(before);\n                prevMatchRange = this._decorations.matchBeforePosition(before);\n            }\n            if (prevMatchRange) {\n                this._setCurrentFindMatch(prevMatchRange);\n            }\n            return;\n        }\n        if (this._cannotFind()) {\n            return;\n        }\n        const findScope = this._decorations.getFindScope();\n        const searchRange = FindModelBoundToEditorModel._getSearchRange(this._editor.getModel(), findScope);\n        // ...(----)...|...\n        if (searchRange.getEndPosition().isBefore(before)) {\n            before = searchRange.getEndPosition();\n        }\n        // ...|...(----)...\n        if (before.isBefore(searchRange.getStartPosition())) {\n            before = searchRange.getEndPosition();\n        }\n        const { lineNumber, column } = before;\n        const model = this._editor.getModel();\n        let position = new Position(lineNumber, column);\n        let prevMatch = model.findPreviousMatch(this._state.searchString, position, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption(148 /* EditorOption.wordSeparators */) : null, false);\n        if (prevMatch && prevMatch.range.isEmpty() && prevMatch.range.getStartPosition().equals(position)) {\n            // Looks like we're stuck at this position, unacceptable!\n            position = this._prevSearchPosition(position);\n            prevMatch = model.findPreviousMatch(this._state.searchString, position, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption(148 /* EditorOption.wordSeparators */) : null, false);\n        }\n        if (!prevMatch) {\n            // there is precisely one match and selection is on top of it\n            return;\n        }\n        if (!isRecursed && !searchRange.containsRange(prevMatch.range)) {\n            return this._moveToPrevMatch(prevMatch.range.getStartPosition(), true);\n        }\n        this._setCurrentFindMatch(prevMatch.range);\n    }\n    moveToPrevMatch() {\n        this._moveToPrevMatch(this._editor.getSelection().getStartPosition());\n    }\n    _nextSearchPosition(after) {\n        const isUsingLineStops = this._state.isRegex && (this._state.searchString.indexOf('^') >= 0\n            || this._state.searchString.indexOf('$') >= 0);\n        let { lineNumber, column } = after;\n        const model = this._editor.getModel();\n        if (isUsingLineStops || column === model.getLineMaxColumn(lineNumber)) {\n            if (lineNumber === model.getLineCount()) {\n                lineNumber = 1;\n            }\n            else {\n                lineNumber++;\n            }\n            column = 1;\n        }\n        else {\n            column++;\n        }\n        return new Position(lineNumber, column);\n    }\n    _moveToNextMatch(after) {\n        if (!this._state.canNavigateForward()) {\n            // we are beyond the last matched find result\n            // instead of doing nothing, we should refocus the last item\n            const prevMatchRange = this._decorations.matchBeforePosition(after);\n            if (prevMatchRange) {\n                this._setCurrentFindMatch(prevMatchRange);\n            }\n            return;\n        }\n        if (this._decorations.getCount() < MATCHES_LIMIT) {\n            let nextMatchRange = this._decorations.matchAfterPosition(after);\n            if (nextMatchRange && nextMatchRange.isEmpty() && nextMatchRange.getStartPosition().equals(after)) {\n                // Looks like we're stuck at this position, unacceptable!\n                after = this._nextSearchPosition(after);\n                nextMatchRange = this._decorations.matchAfterPosition(after);\n            }\n            if (nextMatchRange) {\n                this._setCurrentFindMatch(nextMatchRange);\n            }\n            return;\n        }\n        const nextMatch = this._getNextMatch(after, false, true);\n        if (nextMatch) {\n            this._setCurrentFindMatch(nextMatch.range);\n        }\n    }\n    _getNextMatch(after, captureMatches, forceMove, isRecursed = false) {\n        if (this._cannotFind()) {\n            return null;\n        }\n        const findScope = this._decorations.getFindScope();\n        const searchRange = FindModelBoundToEditorModel._getSearchRange(this._editor.getModel(), findScope);\n        // ...(----)...|...\n        if (searchRange.getEndPosition().isBefore(after)) {\n            after = searchRange.getStartPosition();\n        }\n        // ...|...(----)...\n        if (after.isBefore(searchRange.getStartPosition())) {\n            after = searchRange.getStartPosition();\n        }\n        const { lineNumber, column } = after;\n        const model = this._editor.getModel();\n        let position = new Position(lineNumber, column);\n        let nextMatch = model.findNextMatch(this._state.searchString, position, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption(148 /* EditorOption.wordSeparators */) : null, captureMatches);\n        if (forceMove && nextMatch && nextMatch.range.isEmpty() && nextMatch.range.getStartPosition().equals(position)) {\n            // Looks like we're stuck at this position, unacceptable!\n            position = this._nextSearchPosition(position);\n            nextMatch = model.findNextMatch(this._state.searchString, position, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption(148 /* EditorOption.wordSeparators */) : null, captureMatches);\n        }\n        if (!nextMatch) {\n            // there is precisely one match and selection is on top of it\n            return null;\n        }\n        if (!isRecursed && !searchRange.containsRange(nextMatch.range)) {\n            return this._getNextMatch(nextMatch.range.getEndPosition(), captureMatches, forceMove, true);\n        }\n        return nextMatch;\n    }\n    moveToNextMatch() {\n        this._moveToNextMatch(this._editor.getSelection().getEndPosition());\n    }\n    _moveToMatch(index) {\n        const decorationRange = this._decorations.getDecorationRangeAt(index);\n        if (decorationRange) {\n            this._setCurrentFindMatch(decorationRange);\n        }\n    }\n    moveToMatch(index) {\n        this._moveToMatch(index);\n    }\n    _getReplacePattern() {\n        if (this._state.isRegex) {\n            return parseReplaceString(this._state.replaceString);\n        }\n        return ReplacePattern.fromStaticValue(this._state.replaceString);\n    }\n    replace() {\n        if (!this._hasMatches()) {\n            return;\n        }\n        const replacePattern = this._getReplacePattern();\n        const selection = this._editor.getSelection();\n        const nextMatch = this._getNextMatch(selection.getStartPosition(), true, false);\n        if (nextMatch) {\n            if (selection.equalsRange(nextMatch.range)) {\n                // selection sits on a find match => replace it!\n                const replaceString = replacePattern.buildReplaceString(nextMatch.matches, this._state.preserveCase);\n                const command = new ReplaceCommand(selection, replaceString);\n                this._executeEditorCommand('replace', command);\n                this._decorations.setStartPosition(new Position(selection.startLineNumber, selection.startColumn + replaceString.length));\n                this.research(true);\n            }\n            else {\n                this._decorations.setStartPosition(this._editor.getPosition());\n                this._setCurrentFindMatch(nextMatch.range);\n            }\n        }\n    }\n    _findMatches(findScopes, captureMatches, limitResultCount) {\n        const searchRanges = (findScopes || [null]).map((scope) => FindModelBoundToEditorModel._getSearchRange(this._editor.getModel(), scope));\n        return this._editor.getModel().findMatches(this._state.searchString, searchRanges, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption(148 /* EditorOption.wordSeparators */) : null, captureMatches, limitResultCount);\n    }\n    replaceAll() {\n        if (!this._hasMatches()) {\n            return;\n        }\n        const findScopes = this._decorations.getFindScopes();\n        if (findScopes === null && this._state.matchesCount >= MATCHES_LIMIT) {\n            // Doing a replace on the entire file that is over ${MATCHES_LIMIT} matches\n            this._largeReplaceAll();\n        }\n        else {\n            this._regularReplaceAll(findScopes);\n        }\n        this.research(false);\n    }\n    _largeReplaceAll() {\n        const searchParams = new SearchParams(this._state.searchString, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption(148 /* EditorOption.wordSeparators */) : null);\n        const searchData = searchParams.parseSearchRequest();\n        if (!searchData) {\n            return;\n        }\n        let searchRegex = searchData.regex;\n        if (!searchRegex.multiline) {\n            let mod = 'mu';\n            if (searchRegex.ignoreCase) {\n                mod += 'i';\n            }\n            if (searchRegex.global) {\n                mod += 'g';\n            }\n            searchRegex = new RegExp(searchRegex.source, mod);\n        }\n        const model = this._editor.getModel();\n        const modelText = model.getValue(1 /* EndOfLinePreference.LF */);\n        const fullModelRange = model.getFullModelRange();\n        const replacePattern = this._getReplacePattern();\n        let resultText;\n        const preserveCase = this._state.preserveCase;\n        if (replacePattern.hasReplacementPatterns || preserveCase) {\n            resultText = modelText.replace(searchRegex, function () {\n                // eslint-disable-next-line local/code-no-any-casts\n                return replacePattern.buildReplaceString(arguments, preserveCase);\n            });\n        }\n        else {\n            resultText = modelText.replace(searchRegex, replacePattern.buildReplaceString(null, preserveCase));\n        }\n        const command = new ReplaceCommandThatPreservesSelection(fullModelRange, resultText, this._editor.getSelection());\n        this._executeEditorCommand('replaceAll', command);\n    }\n    _regularReplaceAll(findScopes) {\n        const replacePattern = this._getReplacePattern();\n        // Get all the ranges (even more than the highlighted ones)\n        const matches = this._findMatches(findScopes, replacePattern.hasReplacementPatterns || this._state.preserveCase, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */);\n        const replaceStrings = [];\n        for (let i = 0, len = matches.length; i < len; i++) {\n            replaceStrings[i] = replacePattern.buildReplaceString(matches[i].matches, this._state.preserveCase);\n        }\n        const command = new ReplaceAllCommand(this._editor.getSelection(), matches.map(m => m.range), replaceStrings);\n        this._executeEditorCommand('replaceAll', command);\n    }\n    selectAllMatches() {\n        if (!this._hasMatches()) {\n            return;\n        }\n        const findScopes = this._decorations.getFindScopes();\n        // Get all the ranges (even more than the highlighted ones)\n        const matches = this._findMatches(findScopes, false, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */);\n        let selections = matches.map(m => new Selection(m.range.startLineNumber, m.range.startColumn, m.range.endLineNumber, m.range.endColumn));\n        // If one of the ranges is the editor selection, then maintain it as primary\n        const editorSelection = this._editor.getSelection();\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const sel = selections[i];\n            if (sel.equalsRange(editorSelection)) {\n                selections = [editorSelection].concat(selections.slice(0, i)).concat(selections.slice(i + 1));\n                break;\n            }\n        }\n        this._editor.setSelections(selections);\n    }\n    _executeEditorCommand(source, command) {\n        try {\n            this._ignoreModelContentChanged = true;\n            this._editor.pushUndoStop();\n            this._editor.executeCommand(source, command);\n            this._editor.pushUndoStop();\n        }\n        finally {\n            this._ignoreModelContentChanged = false;\n        }\n    }\n}\n\nexport { CONTEXT_FIND_INPUT_FOCUSED, CONTEXT_FIND_WIDGET_VISIBLE, CONTEXT_REPLACE_INPUT_FOCUSED, FIND_IDS, FindModelBoundToEditorModel, MATCHES_LIMIT, ToggleCaseSensitiveKeybinding, TogglePreserveCaseKeybinding, ToggleRegexKeybinding, ToggleSearchScopeKeybinding, ToggleWholeWordKeybinding };\n","import { Toggle } from '../toggle/toggle.js';\nimport { Codicon } from '../../../common/codicons.js';\nimport { localize } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nconst NLS_CASE_SENSITIVE_TOGGLE_LABEL = localize(2, \"Match Case\");\nconst NLS_WHOLE_WORD_TOGGLE_LABEL = localize(3, \"Match Whole Word\");\nconst NLS_REGEX_TOGGLE_LABEL = localize(4, \"Use Regular Expression\");\nclass CaseSensitiveToggle extends Toggle {\n    constructor(opts) {\n        super({\n            icon: Codicon.caseSensitive,\n            title: NLS_CASE_SENSITIVE_TOGGLE_LABEL + opts.appendTitle,\n            isChecked: opts.isChecked,\n            hoverLifecycleOptions: opts.hoverLifecycleOptions,\n            inputActiveOptionBorder: opts.inputActiveOptionBorder,\n            inputActiveOptionForeground: opts.inputActiveOptionForeground,\n            inputActiveOptionBackground: opts.inputActiveOptionBackground\n        });\n    }\n}\nclass WholeWordsToggle extends Toggle {\n    constructor(opts) {\n        super({\n            icon: Codicon.wholeWord,\n            title: NLS_WHOLE_WORD_TOGGLE_LABEL + opts.appendTitle,\n            isChecked: opts.isChecked,\n            hoverLifecycleOptions: opts.hoverLifecycleOptions,\n            inputActiveOptionBorder: opts.inputActiveOptionBorder,\n            inputActiveOptionForeground: opts.inputActiveOptionForeground,\n            inputActiveOptionBackground: opts.inputActiveOptionBackground\n        });\n    }\n}\nclass RegexToggle extends Toggle {\n    constructor(opts) {\n        super({\n            icon: Codicon.regex,\n            title: NLS_REGEX_TOGGLE_LABEL + opts.appendTitle,\n            isChecked: opts.isChecked,\n            hoverLifecycleOptions: opts.hoverLifecycleOptions,\n            inputActiveOptionBorder: opts.inputActiveOptionBorder,\n            inputActiveOptionForeground: opts.inputActiveOptionForeground,\n            inputActiveOptionBackground: opts.inputActiveOptionBackground\n        });\n    }\n}\n\nexport { CaseSensitiveToggle, RegexToggle, WholeWordsToggle };\n","import { addStandardDisposableListener } from './dom.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction renderText(text, _options, target) {\n    const element = target ?? document.createElement('div');\n    element.textContent = text;\n    return element;\n}\nfunction renderFormattedText(formattedText, options, target) {\n    const element = target ?? document.createElement('div');\n    element.textContent = '';\n    _renderFormattedText(element, parseFormattedText(formattedText), options?.actionHandler, options?.renderCodeSegments);\n    return element;\n}\nclass StringStream {\n    constructor(source) {\n        this.source = source;\n        this.index = 0;\n    }\n    eos() {\n        return this.index >= this.source.length;\n    }\n    next() {\n        const next = this.peek();\n        this.advance();\n        return next;\n    }\n    peek() {\n        return this.source[this.index];\n    }\n    advance() {\n        this.index++;\n    }\n}\nfunction _renderFormattedText(element, treeNode, actionHandler, renderCodeSegments) {\n    let child;\n    if (treeNode.type === 2 /* FormatType.Text */) {\n        child = document.createTextNode(treeNode.content || '');\n    }\n    else if (treeNode.type === 3 /* FormatType.Bold */) {\n        child = document.createElement('b');\n    }\n    else if (treeNode.type === 4 /* FormatType.Italics */) {\n        child = document.createElement('i');\n    }\n    else if (treeNode.type === 7 /* FormatType.Code */ && renderCodeSegments) {\n        child = document.createElement('code');\n    }\n    else if (treeNode.type === 5 /* FormatType.Action */ && actionHandler) {\n        const a = document.createElement('a');\n        actionHandler.disposables.add(addStandardDisposableListener(a, 'click', (event) => {\n            actionHandler.callback(String(treeNode.index), event);\n        }));\n        child = a;\n    }\n    else if (treeNode.type === 8 /* FormatType.NewLine */) {\n        child = document.createElement('br');\n    }\n    else if (treeNode.type === 1 /* FormatType.Root */) {\n        child = element;\n    }\n    if (child && element !== child) {\n        element.appendChild(child);\n    }\n    if (child && Array.isArray(treeNode.children)) {\n        treeNode.children.forEach((nodeChild) => {\n            _renderFormattedText(child, nodeChild, actionHandler, renderCodeSegments);\n        });\n    }\n}\nfunction parseFormattedText(content, parseCodeSegments) {\n    const root = {\n        type: 1 /* FormatType.Root */,\n        children: []\n    };\n    let actionViewItemIndex = 0;\n    let current = root;\n    const stack = [];\n    const stream = new StringStream(content);\n    while (!stream.eos()) {\n        let next = stream.next();\n        const isEscapedFormatType = (next === '\\\\' && formatTagType(stream.peek()) !== 0 /* FormatType.Invalid */);\n        if (isEscapedFormatType) {\n            next = stream.next(); // unread the backslash if it escapes a format tag type\n        }\n        if (!isEscapedFormatType && isFormatTag(next) && next === stream.peek()) {\n            stream.advance();\n            if (current.type === 2 /* FormatType.Text */) {\n                current = stack.pop();\n            }\n            const type = formatTagType(next);\n            if (current.type === type || (current.type === 5 /* FormatType.Action */ && type === 6 /* FormatType.ActionClose */)) {\n                current = stack.pop();\n            }\n            else {\n                const newCurrent = {\n                    type: type,\n                    children: []\n                };\n                if (type === 5 /* FormatType.Action */) {\n                    newCurrent.index = actionViewItemIndex;\n                    actionViewItemIndex++;\n                }\n                current.children.push(newCurrent);\n                stack.push(current);\n                current = newCurrent;\n            }\n        }\n        else if (next === '\\n') {\n            if (current.type === 2 /* FormatType.Text */) {\n                current = stack.pop();\n            }\n            current.children.push({\n                type: 8 /* FormatType.NewLine */\n            });\n        }\n        else {\n            if (current.type !== 2 /* FormatType.Text */) {\n                const textCurrent = {\n                    type: 2 /* FormatType.Text */,\n                    content: next\n                };\n                current.children.push(textCurrent);\n                stack.push(current);\n                current = textCurrent;\n            }\n            else {\n                current.content += next;\n            }\n        }\n    }\n    if (current.type === 2 /* FormatType.Text */) {\n        current = stack.pop();\n    }\n    return root;\n}\nfunction isFormatTag(char, supportCodeSegments) {\n    return formatTagType(char) !== 0 /* FormatType.Invalid */;\n}\nfunction formatTagType(char, supportCodeSegments) {\n    switch (char) {\n        case '*':\n            return 3 /* FormatType.Bold */;\n        case '_':\n            return 4 /* FormatType.Italics */;\n        case '[':\n            return 5 /* FormatType.Action */;\n        case ']':\n            return 6 /* FormatType.ActionClose */;\n        case '`':\n            return 0 /* FormatType.Invalid */;\n        default:\n            return 0 /* FormatType.Invalid */;\n    }\n}\n\nexport { renderFormattedText, renderText };\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 *--------------------------------------------------------------------------------------------*/\nclass ArrayNavigator {\n    constructor(items, start = 0, end = items.length, index = start - 1) {\n        this.items = items;\n        this.start = start;\n        this.end = end;\n        this.index = index;\n    }\n    current() {\n        if (this.index === this.start - 1 || this.index === this.end) {\n            return null;\n        }\n        return this.items[this.index];\n    }\n    next() {\n        this.index = Math.min(this.index + 1, this.end);\n        return this.current();\n    }\n    previous() {\n        this.index = Math.max(this.index - 1, this.start - 1);\n        return this.current();\n    }\n    first() {\n        this.index = this.start;\n        return this.current();\n    }\n    last() {\n        this.index = this.end - 1;\n        return this.current();\n    }\n}\n\nexport { ArrayNavigator };\n","import { ArrayNavigator } from './navigator.js';\n\nclass HistoryNavigator {\n    constructor(_history = new Set(), limit = 10) {\n        this._history = _history;\n        this._limit = limit;\n        this._onChange();\n        if (this._history.onDidChange) {\n            this._disposable = this._history.onDidChange(() => this._onChange());\n        }\n    }\n    getHistory() {\n        return this._elements;\n    }\n    add(t) {\n        this._history.delete(t);\n        this._history.add(t);\n        this._onChange();\n    }\n    next() {\n        // This will navigate past the end of the last element, and in that case the input should be cleared\n        return this._navigator.next();\n    }\n    previous() {\n        if (this._currentPosition() !== 0) {\n            return this._navigator.previous();\n        }\n        return null;\n    }\n    current() {\n        return this._navigator.current();\n    }\n    first() {\n        return this._navigator.first();\n    }\n    last() {\n        return this._navigator.last();\n    }\n    isLast() {\n        return this._currentPosition() >= this._elements.length - 1;\n    }\n    isNowhere() {\n        return this._navigator.current() === null;\n    }\n    has(t) {\n        return this._history.has(t);\n    }\n    _onChange() {\n        this._reduceToLimit();\n        const elements = this._elements;\n        this._navigator = new ArrayNavigator(elements, 0, elements.length, elements.length);\n    }\n    _reduceToLimit() {\n        const data = this._elements;\n        if (data.length > this._limit) {\n            const replaceValue = data.slice(data.length - this._limit);\n            if (this._history.replace) {\n                this._history.replace(replaceValue);\n            }\n            else {\n                this._history = new Set(replaceValue);\n            }\n        }\n    }\n    _currentPosition() {\n        const currentElement = this._navigator.current();\n        if (!currentElement) {\n            return -1;\n        }\n        return this._elements.indexOf(currentElement);\n    }\n    get _elements() {\n        const elements = [];\n        this._history.forEach(e => elements.push(e));\n        return elements;\n    }\n    dispose() {\n        if (this._disposable) {\n            this._disposable.dispose();\n            this._disposable = undefined;\n        }\n    }\n}\n\nexport { HistoryNavigator };\n","import { append, $ as $$1, getTotalHeight, isActiveElement, getTotalWidth } from '../../dom.js';\nimport { asCssValueWithDefault } from '../../cssValue.js';\nimport { DomEmitter } from '../../event.js';\nimport { renderFormattedText, renderText } from '../../formattedTextRenderer.js';\nimport { ActionBar } from '../actionbar/actionbar.js';\nimport { status, alert } from '../aria/aria.js';\nimport { getBaseLayerHoverDelegate } from '../hover/hoverDelegate2.js';\nimport { ScrollableElement } from '../scrollbar/scrollableElement.js';\nimport { Widget } from '../widget.js';\nimport { Emitter, Event } from '../../../common/event.js';\nimport { HistoryNavigator } from '../../../common/history.js';\nimport { equals } from '../../../common/objects.js';\nimport './inputBox.css';\nimport { localize } from '../../../../nls.js';\nimport { MutableDisposable } from '../../../common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nconst $ = $$1;\nclass InputBox extends Widget {\n    get onDidChange() { return this._onDidChange.event; }\n    get onDidHeightChange() { return this._onDidHeightChange.event; }\n    constructor(container, contextViewProvider, options) {\n        super();\n        this.state = 'idle';\n        this.maxHeight = Number.POSITIVE_INFINITY;\n        this.hover = this._register(new MutableDisposable());\n        this._onDidChange = this._register(new Emitter());\n        this._onDidHeightChange = this._register(new Emitter());\n        this.contextViewProvider = contextViewProvider;\n        this.options = options;\n        this.message = null;\n        this.placeholder = this.options.placeholder || '';\n        this.tooltip = this.options.tooltip ?? (this.placeholder || '');\n        this.ariaLabel = this.options.ariaLabel || '';\n        if (this.options.validationOptions) {\n            this.validation = this.options.validationOptions.validation;\n        }\n        this.element = append(container, $('.monaco-inputbox.idle'));\n        const tagName = this.options.flexibleHeight ? 'textarea' : 'input';\n        const wrapper = append(this.element, $('.ibwrapper'));\n        this.input = append(wrapper, $(tagName + '.input.empty'));\n        this.input.setAttribute('autocorrect', 'off');\n        this.input.setAttribute('autocapitalize', 'off');\n        this.input.setAttribute('spellcheck', 'false');\n        this.onfocus(this.input, () => this.element.classList.add('synthetic-focus'));\n        this.onblur(this.input, () => this.element.classList.remove('synthetic-focus'));\n        if (this.options.flexibleHeight) {\n            this.maxHeight = typeof this.options.flexibleMaxHeight === 'number' ? this.options.flexibleMaxHeight : Number.POSITIVE_INFINITY;\n            this.mirror = append(wrapper, $('div.mirror'));\n            this.mirror.innerText = '\\u00a0';\n            this.scrollableElement = new ScrollableElement(this.element, { vertical: 1 /* ScrollbarVisibility.Auto */ });\n            if (this.options.flexibleWidth) {\n                this.input.setAttribute('wrap', 'off');\n                this.mirror.style.whiteSpace = 'pre';\n                this.mirror.style.wordWrap = 'initial';\n            }\n            append(container, this.scrollableElement.getDomNode());\n            this._register(this.scrollableElement);\n            // from ScrollableElement to DOM\n            this._register(this.scrollableElement.onScroll(e => this.input.scrollTop = e.scrollTop));\n            const onSelectionChange = this._register(new DomEmitter(container.ownerDocument, 'selectionchange'));\n            const onAnchoredSelectionChange = Event.filter(onSelectionChange.event, () => {\n                const selection = container.ownerDocument.getSelection();\n                return selection?.anchorNode === wrapper;\n            });\n            // from DOM to ScrollableElement\n            this._register(onAnchoredSelectionChange(this.updateScrollDimensions, this));\n            this._register(this.onDidHeightChange(this.updateScrollDimensions, this));\n        }\n        else {\n            this.input.type = this.options.type || 'text';\n            this.input.setAttribute('wrap', 'off');\n        }\n        if (this.ariaLabel) {\n            this.input.setAttribute('aria-label', this.ariaLabel);\n        }\n        if (this.placeholder && !this.options.showPlaceholderOnFocus) {\n            this.setPlaceHolder(this.placeholder);\n        }\n        if (this.tooltip) {\n            this.setTooltip(this.tooltip);\n        }\n        this.oninput(this.input, () => this.onValueChange());\n        this.onblur(this.input, () => this.onBlur());\n        this.onfocus(this.input, () => this.onFocus());\n        this._register(this.ignoreGesture(this.input));\n        setTimeout(() => this.updateMirror(), 0);\n        // Support actions\n        if (this.options.actions) {\n            this.actionbar = this._register(new ActionBar(this.element));\n            this.actionbar.push(this.options.actions, { icon: true, label: false });\n        }\n        this.applyStyles();\n    }\n    onBlur() {\n        this._hideMessage();\n        if (this.options.showPlaceholderOnFocus) {\n            this.input.setAttribute('placeholder', '');\n        }\n    }\n    onFocus() {\n        this._showMessage();\n        if (this.options.showPlaceholderOnFocus) {\n            this.input.setAttribute('placeholder', this.placeholder || '');\n        }\n    }\n    setPlaceHolder(placeHolder) {\n        this.placeholder = placeHolder;\n        this.input.setAttribute('placeholder', placeHolder);\n    }\n    setTooltip(tooltip) {\n        this.tooltip = tooltip;\n        if (!this.hover.value) {\n            this.hover.value = this._register(getBaseLayerHoverDelegate().setupDelayedHoverAtMouse(this.input, () => ({\n                content: this.tooltip,\n                appearance: {\n                    compact: true,\n                }\n            })));\n        }\n    }\n    get inputElement() {\n        return this.input;\n    }\n    get value() {\n        return this.input.value;\n    }\n    set value(newValue) {\n        if (this.input.value !== newValue) {\n            this.input.value = newValue;\n            this.onValueChange();\n        }\n    }\n    get height() {\n        return typeof this.cachedHeight === 'number' ? this.cachedHeight : getTotalHeight(this.element);\n    }\n    focus() {\n        this.input.focus();\n    }\n    blur() {\n        this.input.blur();\n    }\n    hasFocus() {\n        return isActiveElement(this.input);\n    }\n    select(range = null) {\n        this.input.select();\n        if (range) {\n            this.input.setSelectionRange(range.start, range.end);\n            if (range.end === this.input.value.length) {\n                this.input.scrollLeft = this.input.scrollWidth;\n            }\n        }\n    }\n    isSelectionAtEnd() {\n        return this.input.selectionEnd === this.input.value.length && this.input.selectionStart === this.input.selectionEnd;\n    }\n    getSelection() {\n        const selectionStart = this.input.selectionStart;\n        if (selectionStart === null) {\n            return null;\n        }\n        const selectionEnd = this.input.selectionEnd ?? selectionStart;\n        return {\n            start: selectionStart,\n            end: selectionEnd,\n        };\n    }\n    enable() {\n        this.input.removeAttribute('disabled');\n    }\n    disable() {\n        this.blur();\n        this.input.disabled = true;\n        this._hideMessage();\n    }\n    set paddingRight(paddingRight) {\n        // Set width to avoid hint text overlapping buttons\n        this.input.style.width = `calc(100% - ${paddingRight}px)`;\n        if (this.mirror) {\n            this.mirror.style.paddingRight = paddingRight + 'px';\n        }\n    }\n    updateScrollDimensions() {\n        if (typeof this.cachedContentHeight !== 'number' || typeof this.cachedHeight !== 'number' || !this.scrollableElement) {\n            return;\n        }\n        const scrollHeight = this.cachedContentHeight;\n        const height = this.cachedHeight;\n        const scrollTop = this.input.scrollTop;\n        this.scrollableElement.setScrollDimensions({ scrollHeight, height });\n        this.scrollableElement.setScrollPosition({ scrollTop });\n    }\n    showMessage(message, force) {\n        if (this.state === 'open' && equals(this.message, message)) {\n            // Already showing\n            return;\n        }\n        this.message = message;\n        this.element.classList.remove('idle');\n        this.element.classList.remove('info');\n        this.element.classList.remove('warning');\n        this.element.classList.remove('error');\n        this.element.classList.add(this.classForType(message.type));\n        const styles = this.stylesForType(this.message.type);\n        this.element.style.border = `1px solid ${asCssValueWithDefault(styles.border, 'transparent')}`;\n        if (this.message.content && (this.hasFocus() || force)) {\n            this._showMessage();\n        }\n    }\n    hideMessage() {\n        this.message = null;\n        this.element.classList.remove('info');\n        this.element.classList.remove('warning');\n        this.element.classList.remove('error');\n        this.element.classList.add('idle');\n        this._hideMessage();\n        this.applyStyles();\n    }\n    validate() {\n        let errorMsg = null;\n        if (this.validation) {\n            errorMsg = this.validation(this.value);\n            if (errorMsg) {\n                this.inputElement.setAttribute('aria-invalid', 'true');\n                this.showMessage(errorMsg);\n            }\n            else if (this.inputElement.hasAttribute('aria-invalid')) {\n                this.inputElement.removeAttribute('aria-invalid');\n                this.hideMessage();\n            }\n        }\n        return errorMsg?.type;\n    }\n    stylesForType(type) {\n        const styles = this.options.inputBoxStyles;\n        switch (type) {\n            case 1 /* MessageType.INFO */: return { border: styles.inputValidationInfoBorder, background: styles.inputValidationInfoBackground, foreground: styles.inputValidationInfoForeground };\n            case 2 /* MessageType.WARNING */: return { border: styles.inputValidationWarningBorder, background: styles.inputValidationWarningBackground, foreground: styles.inputValidationWarningForeground };\n            default: return { border: styles.inputValidationErrorBorder, background: styles.inputValidationErrorBackground, foreground: styles.inputValidationErrorForeground };\n        }\n    }\n    classForType(type) {\n        switch (type) {\n            case 1 /* MessageType.INFO */: return 'info';\n            case 2 /* MessageType.WARNING */: return 'warning';\n            default: return 'error';\n        }\n    }\n    _showMessage() {\n        if (!this.contextViewProvider || !this.message) {\n            return;\n        }\n        let div;\n        const layout = () => div.style.width = getTotalWidth(this.element) + 'px';\n        this.contextViewProvider.showContextView({\n            getAnchor: () => this.element,\n            anchorAlignment: 1 /* AnchorAlignment.RIGHT */,\n            render: (container) => {\n                if (!this.message) {\n                    return null;\n                }\n                div = append(container, $('.monaco-inputbox-container'));\n                layout();\n                const spanElement = $('span.monaco-inputbox-message');\n                if (this.message.formatContent) {\n                    renderFormattedText(this.message.content, undefined, spanElement);\n                }\n                else {\n                    renderText(this.message.content, undefined, spanElement);\n                }\n                spanElement.classList.add(this.classForType(this.message.type));\n                const styles = this.stylesForType(this.message.type);\n                spanElement.style.backgroundColor = styles.background ?? '';\n                spanElement.style.color = styles.foreground ?? '';\n                spanElement.style.border = styles.border ? `1px solid ${styles.border}` : '';\n                append(div, spanElement);\n                return null;\n            },\n            onHide: () => {\n                this.state = 'closed';\n            },\n            layout: layout\n        });\n        // ARIA Support\n        let alertText;\n        if (this.message.type === 3 /* MessageType.ERROR */) {\n            alertText = localize(9, \"Error: {0}\", this.message.content);\n        }\n        else if (this.message.type === 2 /* MessageType.WARNING */) {\n            alertText = localize(10, \"Warning: {0}\", this.message.content);\n        }\n        else {\n            alertText = localize(11, \"Info: {0}\", this.message.content);\n        }\n        alert(alertText);\n        this.state = 'open';\n    }\n    _hideMessage() {\n        if (!this.contextViewProvider) {\n            return;\n        }\n        if (this.state === 'open') {\n            this.contextViewProvider.hideContextView();\n        }\n        this.state = 'idle';\n    }\n    onValueChange() {\n        this._onDidChange.fire(this.value);\n        this.validate();\n        this.updateMirror();\n        this.input.classList.toggle('empty', !this.value);\n        if (this.state === 'open' && this.contextViewProvider) {\n            this.contextViewProvider.layout();\n        }\n    }\n    updateMirror() {\n        if (!this.mirror) {\n            return;\n        }\n        const value = this.value;\n        const lastCharCode = value.charCodeAt(value.length - 1);\n        const suffix = lastCharCode === 10 ? ' ' : '';\n        const mirrorTextContent = (value + suffix)\n            .replace(/\\u000c/g, ''); // Don't measure with the form feed character, which messes up sizing\n        if (mirrorTextContent) {\n            this.mirror.textContent = value + suffix;\n        }\n        else {\n            this.mirror.innerText = '\\u00a0';\n        }\n        this.layout();\n    }\n    applyStyles() {\n        const styles = this.options.inputBoxStyles;\n        const background = styles.inputBackground ?? '';\n        const foreground = styles.inputForeground ?? '';\n        const border = styles.inputBorder ?? '';\n        this.element.style.backgroundColor = background;\n        this.element.style.color = foreground;\n        this.input.style.backgroundColor = 'inherit';\n        this.input.style.color = foreground;\n        // there's always a border, even if the color is not set.\n        this.element.style.border = `1px solid ${asCssValueWithDefault(border, 'transparent')}`;\n    }\n    layout() {\n        if (!this.mirror) {\n            return;\n        }\n        const previousHeight = this.cachedContentHeight;\n        this.cachedContentHeight = getTotalHeight(this.mirror);\n        if (previousHeight !== this.cachedContentHeight) {\n            this.cachedHeight = Math.min(this.cachedContentHeight, this.maxHeight);\n            this.input.style.height = this.cachedHeight + 'px';\n            this._onDidHeightChange.fire(this.cachedContentHeight);\n        }\n    }\n    insertAtCursor(text) {\n        const inputElement = this.inputElement;\n        const start = inputElement.selectionStart;\n        const end = inputElement.selectionEnd;\n        const content = inputElement.value;\n        if (start !== null && end !== null) {\n            this.value = content.substr(0, start) + text + content.substr(end);\n            inputElement.setSelectionRange(start + 1, start + 1);\n            this.layout();\n        }\n    }\n    dispose() {\n        this._hideMessage();\n        this.message = null;\n        this.actionbar?.dispose();\n        super.dispose();\n    }\n}\nclass HistoryInputBox extends InputBox {\n    constructor(container, contextViewProvider, options) {\n        const NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_NO_PARENS = localize(12, ' or {0} for history', `\\u21C5`);\n\n\n\n        const NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_IN_PARENS = localize(13, ' ({0} for history)', `\\u21C5`);\n\n\n\n        super(container, contextViewProvider, options);\n        this._onDidFocus = this._register(new Emitter());\n        this.onDidFocus = this._onDidFocus.event;\n        this._onDidBlur = this._register(new Emitter());\n        this.onDidBlur = this._onDidBlur.event;\n        this.history = this._register(new HistoryNavigator(options.history, 100));\n        // Function to append the history suffix to the placeholder if necessary\n        const addSuffix = () => {\n            if (options.showHistoryHint && options.showHistoryHint() && !this.placeholder.endsWith(NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_NO_PARENS) && !this.placeholder.endsWith(NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_IN_PARENS) && this.history.getHistory().length) {\n                const suffix = this.placeholder.endsWith(')') ? NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_NO_PARENS : NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_IN_PARENS;\n                const suffixedPlaceholder = this.placeholder + suffix;\n                if (options.showPlaceholderOnFocus && !isActiveElement(this.input)) {\n                    this.placeholder = suffixedPlaceholder;\n                }\n                else {\n                    this.setPlaceHolder(suffixedPlaceholder);\n                }\n            }\n        };\n        // Spot the change to the textarea class attribute which occurs when it changes between non-empty and empty,\n        // and add the history suffix to the placeholder if not yet present\n        this.observer = new MutationObserver((mutationList, observer) => {\n            mutationList.forEach((mutation) => {\n                if (!mutation.target.textContent) {\n                    addSuffix();\n                }\n            });\n        });\n        this.observer.observe(this.input, { attributeFilter: ['class'] });\n        this.onfocus(this.input, () => addSuffix());\n        this.onblur(this.input, () => {\n            const resetPlaceholder = (historyHint) => {\n                if (!this.placeholder.endsWith(historyHint)) {\n                    return false;\n                }\n                else {\n                    const revertedPlaceholder = this.placeholder.slice(0, this.placeholder.length - historyHint.length);\n                    if (options.showPlaceholderOnFocus) {\n                        this.placeholder = revertedPlaceholder;\n                    }\n                    else {\n                        this.setPlaceHolder(revertedPlaceholder);\n                    }\n                    return true;\n                }\n            };\n            if (!resetPlaceholder(NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_IN_PARENS)) {\n                resetPlaceholder(NLS_PLACEHOLDER_HISTORY_HINT_SUFFIX_NO_PARENS);\n            }\n        });\n    }\n    dispose() {\n        super.dispose();\n        if (this.observer) {\n            this.observer.disconnect();\n            this.observer = undefined;\n        }\n    }\n    addToHistory(always) {\n        if (this.value && (always || this.value !== this.getCurrentValue())) {\n            this.history.add(this.value);\n        }\n    }\n    isAtLastInHistory() {\n        return this.history.isLast();\n    }\n    isNowhereInHistory() {\n        return this.history.isNowhere();\n    }\n    showNextValue() {\n        if (!this.history.has(this.value)) {\n            this.addToHistory();\n        }\n        let next = this.getNextValue();\n        if (next) {\n            next = next === this.value ? this.getNextValue() : next;\n        }\n        this.value = next ?? '';\n        status(this.value ? this.value : localize(14, \"Cleared Input\"));\n    }\n    showPreviousValue() {\n        if (!this.history.has(this.value)) {\n            this.addToHistory();\n        }\n        let previous = this.getPreviousValue();\n        if (previous) {\n            previous = previous === this.value ? this.getPreviousValue() : previous;\n        }\n        if (previous) {\n            this.value = previous;\n            status(this.value);\n        }\n    }\n    setPlaceHolder(placeHolder) {\n        super.setPlaceHolder(placeHolder);\n        this.setTooltip(placeHolder);\n    }\n    onBlur() {\n        super.onBlur();\n        this._onDidBlur.fire();\n    }\n    onFocus() {\n        super.onFocus();\n        this._onDidFocus.fire();\n    }\n    getCurrentValue() {\n        let currentValue = this.history.current();\n        if (!currentValue) {\n            currentValue = this.history.last();\n            this.history.next();\n        }\n        return currentValue;\n    }\n    getPreviousValue() {\n        return this.history.previous() || this.history.first();\n    }\n    getNextValue() {\n        return this.history.next();\n    }\n}\n\nexport { HistoryInputBox, InputBox };\n","import { EventHelper, addDisposableListener } from '../../dom.js';\nimport { RegexToggle, WholeWordsToggle, CaseSensitiveToggle } from './findInputToggles.js';\nimport { HistoryInputBox } from '../inputbox/inputBox.js';\nimport { Widget } from '../widget.js';\nimport { Emitter } from '../../../common/event.js';\nimport './findInput.css';\nimport { localize } from '../../../../nls.js';\nimport { MutableDisposable, DisposableStore } from '../../../common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nconst NLS_DEFAULT_LABEL = localize(1, \"input\");\nclass FindInput extends Widget {\n    get onDidOptionChange() { return this._onDidOptionChange.event; }\n    get onKeyDown() { return this._onKeyDown.event; }\n    get onMouseDown() { return this._onMouseDown.event; }\n    get onCaseSensitiveKeyDown() { return this._onCaseSensitiveKeyDown.event; }\n    get onRegexKeyDown() { return this._onRegexKeyDown.event; }\n    constructor(parent, contextViewProvider, options) {\n        super();\n        this.fixFocusOnOptionClickEnabled = true;\n        this.imeSessionInProgress = false;\n        this.additionalTogglesDisposables = this._register(new MutableDisposable());\n        this.additionalToggles = [];\n        this._onDidOptionChange = this._register(new Emitter());\n        this._onKeyDown = this._register(new Emitter());\n        this._onMouseDown = this._register(new Emitter());\n        this._onInput = this._register(new Emitter());\n        this._onKeyUp = this._register(new Emitter());\n        this._onCaseSensitiveKeyDown = this._register(new Emitter());\n        this._onRegexKeyDown = this._register(new Emitter());\n        this._lastHighlightFindOptions = 0;\n        this.placeholder = options.placeholder || '';\n        this.validation = options.validation;\n        this.label = options.label || NLS_DEFAULT_LABEL;\n        this.showCommonFindToggles = !!options.showCommonFindToggles;\n        const appendCaseSensitiveLabel = options.appendCaseSensitiveLabel || '';\n        const appendWholeWordsLabel = options.appendWholeWordsLabel || '';\n        const appendRegexLabel = options.appendRegexLabel || '';\n        const flexibleHeight = !!options.flexibleHeight;\n        const flexibleWidth = !!options.flexibleWidth;\n        const flexibleMaxHeight = options.flexibleMaxHeight;\n        this.domNode = document.createElement('div');\n        this.domNode.classList.add('monaco-findInput');\n        this.inputBox = this._register(new HistoryInputBox(this.domNode, contextViewProvider, {\n            placeholder: this.placeholder || '',\n            ariaLabel: this.label || '',\n            validationOptions: {\n                validation: this.validation\n            },\n            showHistoryHint: options.showHistoryHint,\n            flexibleHeight,\n            flexibleWidth,\n            flexibleMaxHeight,\n            inputBoxStyles: options.inputBoxStyles,\n            history: options.history\n        }));\n        if (this.showCommonFindToggles) {\n            const hoverLifecycleOptions = options?.hoverLifecycleOptions || { groupId: 'find-input' };\n            this.regex = this._register(new RegexToggle({\n                appendTitle: appendRegexLabel,\n                isChecked: false,\n                hoverLifecycleOptions,\n                ...options.toggleStyles\n            }));\n            this._register(this.regex.onChange(viaKeyboard => {\n                this._onDidOptionChange.fire(viaKeyboard);\n                if (!viaKeyboard && this.fixFocusOnOptionClickEnabled) {\n                    this.inputBox.focus();\n                }\n                this.validate();\n            }));\n            this._register(this.regex.onKeyDown(e => {\n                this._onRegexKeyDown.fire(e);\n            }));\n            this.wholeWords = this._register(new WholeWordsToggle({\n                appendTitle: appendWholeWordsLabel,\n                isChecked: false,\n                hoverLifecycleOptions,\n                ...options.toggleStyles\n            }));\n            this._register(this.wholeWords.onChange(viaKeyboard => {\n                this._onDidOptionChange.fire(viaKeyboard);\n                if (!viaKeyboard && this.fixFocusOnOptionClickEnabled) {\n                    this.inputBox.focus();\n                }\n                this.validate();\n            }));\n            this.caseSensitive = this._register(new CaseSensitiveToggle({\n                appendTitle: appendCaseSensitiveLabel,\n                isChecked: false,\n                hoverLifecycleOptions,\n                ...options.toggleStyles\n            }));\n            this._register(this.caseSensitive.onChange(viaKeyboard => {\n                this._onDidOptionChange.fire(viaKeyboard);\n                if (!viaKeyboard && this.fixFocusOnOptionClickEnabled) {\n                    this.inputBox.focus();\n                }\n                this.validate();\n            }));\n            this._register(this.caseSensitive.onKeyDown(e => {\n                this._onCaseSensitiveKeyDown.fire(e);\n            }));\n            // Arrow-Key support to navigate between options\n            const indexes = [this.caseSensitive.domNode, this.wholeWords.domNode, this.regex.domNode];\n            this.onkeydown(this.domNode, (event) => {\n                if (event.equals(15 /* KeyCode.LeftArrow */) || event.equals(17 /* KeyCode.RightArrow */) || event.equals(9 /* KeyCode.Escape */)) {\n                    const index = indexes.indexOf(this.domNode.ownerDocument.activeElement);\n                    if (index >= 0) {\n                        let newIndex = -1;\n                        if (event.equals(17 /* KeyCode.RightArrow */)) {\n                            newIndex = (index + 1) % indexes.length;\n                        }\n                        else if (event.equals(15 /* KeyCode.LeftArrow */)) {\n                            if (index === 0) {\n                                newIndex = indexes.length - 1;\n                            }\n                            else {\n                                newIndex = index - 1;\n                            }\n                        }\n                        if (event.equals(9 /* KeyCode.Escape */)) {\n                            indexes[index].blur();\n                            this.inputBox.focus();\n                        }\n                        else if (newIndex >= 0) {\n                            indexes[newIndex].focus();\n                        }\n                        EventHelper.stop(event, true);\n                    }\n                }\n            });\n        }\n        this.controls = document.createElement('div');\n        this.controls.className = 'controls';\n        this.controls.style.display = this.showCommonFindToggles ? '' : 'none';\n        if (this.caseSensitive) {\n            this.controls.append(this.caseSensitive.domNode);\n        }\n        if (this.wholeWords) {\n            this.controls.appendChild(this.wholeWords.domNode);\n        }\n        if (this.regex) {\n            this.controls.appendChild(this.regex.domNode);\n        }\n        this.setAdditionalToggles(options?.additionalToggles);\n        if (this.controls) {\n            this.domNode.appendChild(this.controls);\n        }\n        parent?.appendChild(this.domNode);\n        this._register(addDisposableListener(this.inputBox.inputElement, 'compositionstart', (e) => {\n            this.imeSessionInProgress = true;\n        }));\n        this._register(addDisposableListener(this.inputBox.inputElement, 'compositionend', (e) => {\n            this.imeSessionInProgress = false;\n            this._onInput.fire();\n        }));\n        this.onkeydown(this.inputBox.inputElement, (e) => this._onKeyDown.fire(e));\n        this.onkeyup(this.inputBox.inputElement, (e) => this._onKeyUp.fire(e));\n        this.oninput(this.inputBox.inputElement, (e) => this._onInput.fire());\n        this.onmousedown(this.inputBox.inputElement, (e) => this._onMouseDown.fire(e));\n    }\n    get onDidChange() {\n        return this.inputBox.onDidChange;\n    }\n    layout(style) {\n        this.inputBox.layout();\n        this.updateInputBoxPadding(style.collapsedFindWidget);\n    }\n    enable() {\n        this.domNode.classList.remove('disabled');\n        this.inputBox.enable();\n        this.regex?.enable();\n        this.wholeWords?.enable();\n        this.caseSensitive?.enable();\n        for (const toggle of this.additionalToggles) {\n            toggle.enable();\n        }\n    }\n    disable() {\n        this.domNode.classList.add('disabled');\n        this.inputBox.disable();\n        this.regex?.disable();\n        this.wholeWords?.disable();\n        this.caseSensitive?.disable();\n        for (const toggle of this.additionalToggles) {\n            toggle.disable();\n        }\n    }\n    setFocusInputOnOptionClick(value) {\n        this.fixFocusOnOptionClickEnabled = value;\n    }\n    setEnabled(enabled) {\n        if (enabled) {\n            this.enable();\n        }\n        else {\n            this.disable();\n        }\n    }\n    setAdditionalToggles(toggles) {\n        for (const currentToggle of this.additionalToggles) {\n            currentToggle.domNode.remove();\n        }\n        this.additionalToggles = [];\n        this.additionalTogglesDisposables.value = new DisposableStore();\n        for (const toggle of toggles ?? []) {\n            this.additionalTogglesDisposables.value.add(toggle);\n            this.controls.appendChild(toggle.domNode);\n            this.additionalTogglesDisposables.value.add(toggle.onChange(viaKeyboard => {\n                this._onDidOptionChange.fire(viaKeyboard);\n                if (!viaKeyboard && this.fixFocusOnOptionClickEnabled) {\n                    this.inputBox.focus();\n                }\n            }));\n            this.additionalToggles.push(toggle);\n        }\n        if (this.additionalToggles.length > 0) {\n            this.controls.style.display = '';\n        }\n        this.updateInputBoxPadding();\n    }\n    updateInputBoxPadding(controlsHidden = false) {\n        if (controlsHidden) {\n            this.inputBox.paddingRight = 0;\n        }\n        else {\n            this.inputBox.paddingRight =\n                ((this.caseSensitive?.width() ?? 0) + (this.wholeWords?.width() ?? 0) + (this.regex?.width() ?? 0))\n                    + this.additionalToggles.reduce((r, t) => r + t.width(), 0);\n        }\n    }\n    getValue() {\n        return this.inputBox.value;\n    }\n    setValue(value) {\n        if (this.inputBox.value !== value) {\n            this.inputBox.value = value;\n        }\n    }\n    select() {\n        this.inputBox.select();\n    }\n    focus() {\n        this.inputBox.focus();\n    }\n    getCaseSensitive() {\n        return this.caseSensitive?.checked ?? false;\n    }\n    setCaseSensitive(value) {\n        if (this.caseSensitive) {\n            this.caseSensitive.checked = value;\n        }\n    }\n    getWholeWords() {\n        return this.wholeWords?.checked ?? false;\n    }\n    setWholeWords(value) {\n        if (this.wholeWords) {\n            this.wholeWords.checked = value;\n        }\n    }\n    getRegex() {\n        return this.regex?.checked ?? false;\n    }\n    setRegex(value) {\n        if (this.regex) {\n            this.regex.checked = value;\n            this.validate();\n        }\n    }\n    focusOnCaseSensitive() {\n        this.caseSensitive?.focus();\n    }\n    highlightFindOptions() {\n        this.domNode.classList.remove('highlight-' + (this._lastHighlightFindOptions));\n        this._lastHighlightFindOptions = 1 - this._lastHighlightFindOptions;\n        this.domNode.classList.add('highlight-' + (this._lastHighlightFindOptions));\n    }\n    validate() {\n        this.inputBox.validate();\n    }\n    showMessage(message) {\n        this.inputBox.showMessage(message);\n    }\n    clearMessage() {\n        this.inputBox.hideMessage();\n    }\n}\n\nexport { FindInput };\n","import { EventHelper } from '../../dom.js';\nimport { Toggle } from '../toggle/toggle.js';\nimport { HistoryInputBox } from '../inputbox/inputBox.js';\nimport { Widget } from '../widget.js';\nimport { Codicon } from '../../../common/codicons.js';\nimport { Emitter } from '../../../common/event.js';\nimport './findInput.css';\nimport { localize } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nconst NLS_DEFAULT_LABEL = localize(5, \"input\");\nconst NLS_PRESERVE_CASE_LABEL = localize(6, \"Preserve Case\");\nclass PreserveCaseToggle extends Toggle {\n    constructor(opts) {\n        super({\n            // TODO: does this need its own icon?\n            icon: Codicon.preserveCase,\n            title: NLS_PRESERVE_CASE_LABEL + opts.appendTitle,\n            isChecked: opts.isChecked,\n            hoverLifecycleOptions: opts.hoverLifecycleOptions,\n            inputActiveOptionBorder: opts.inputActiveOptionBorder,\n            inputActiveOptionForeground: opts.inputActiveOptionForeground,\n            inputActiveOptionBackground: opts.inputActiveOptionBackground,\n        });\n    }\n}\nclass ReplaceInput extends Widget {\n    get onDidOptionChange() { return this._onDidOptionChange.event; }\n    get onKeyDown() { return this._onKeyDown.event; }\n    get onPreserveCaseKeyDown() { return this._onPreserveCaseKeyDown.event; }\n    constructor(parent, contextViewProvider, _showOptionButtons, options) {\n        super();\n        this._showOptionButtons = _showOptionButtons;\n        this.fixFocusOnOptionClickEnabled = true;\n        this.cachedOptionsWidth = 0;\n        this._onDidOptionChange = this._register(new Emitter());\n        this._onKeyDown = this._register(new Emitter());\n        this._onMouseDown = this._register(new Emitter());\n        this._onInput = this._register(new Emitter());\n        this._onKeyUp = this._register(new Emitter());\n        this._onPreserveCaseKeyDown = this._register(new Emitter());\n        this.contextViewProvider = contextViewProvider;\n        this.placeholder = options.placeholder || '';\n        this.validation = options.validation;\n        this.label = options.label || NLS_DEFAULT_LABEL;\n        const appendPreserveCaseLabel = options.appendPreserveCaseLabel || '';\n        const history = options.history || new Set([]);\n        const flexibleHeight = !!options.flexibleHeight;\n        const flexibleWidth = !!options.flexibleWidth;\n        const flexibleMaxHeight = options.flexibleMaxHeight;\n        this.domNode = document.createElement('div');\n        this.domNode.classList.add('monaco-findInput');\n        this.inputBox = this._register(new HistoryInputBox(this.domNode, this.contextViewProvider, {\n            ariaLabel: this.label || '',\n            placeholder: this.placeholder || '',\n            validationOptions: {\n                validation: this.validation\n            },\n            history,\n            showHistoryHint: options.showHistoryHint,\n            flexibleHeight,\n            flexibleWidth,\n            flexibleMaxHeight,\n            inputBoxStyles: options.inputBoxStyles\n        }));\n        this.preserveCase = this._register(new PreserveCaseToggle({\n            appendTitle: appendPreserveCaseLabel,\n            isChecked: false,\n            hoverLifecycleOptions: options.hoverLifecycleOptions,\n            ...options.toggleStyles\n        }));\n        this._register(this.preserveCase.onChange(viaKeyboard => {\n            this._onDidOptionChange.fire(viaKeyboard);\n            if (!viaKeyboard && this.fixFocusOnOptionClickEnabled) {\n                this.inputBox.focus();\n            }\n            this.validate();\n        }));\n        this._register(this.preserveCase.onKeyDown(e => {\n            this._onPreserveCaseKeyDown.fire(e);\n        }));\n        if (this._showOptionButtons) {\n            this.cachedOptionsWidth = this.preserveCase.width();\n        }\n        else {\n            this.cachedOptionsWidth = 0;\n        }\n        // Arrow-Key support to navigate between options\n        const indexes = [this.preserveCase.domNode];\n        this.onkeydown(this.domNode, (event) => {\n            if (event.equals(15 /* KeyCode.LeftArrow */) || event.equals(17 /* KeyCode.RightArrow */) || event.equals(9 /* KeyCode.Escape */)) {\n                const index = indexes.indexOf(this.domNode.ownerDocument.activeElement);\n                if (index >= 0) {\n                    let newIndex = -1;\n                    if (event.equals(17 /* KeyCode.RightArrow */)) {\n                        newIndex = (index + 1) % indexes.length;\n                    }\n                    else if (event.equals(15 /* KeyCode.LeftArrow */)) {\n                        if (index === 0) {\n                            newIndex = indexes.length - 1;\n                        }\n                        else {\n                            newIndex = index - 1;\n                        }\n                    }\n                    if (event.equals(9 /* KeyCode.Escape */)) {\n                        indexes[index].blur();\n                        this.inputBox.focus();\n                    }\n                    else if (newIndex >= 0) {\n                        indexes[newIndex].focus();\n                    }\n                    EventHelper.stop(event, true);\n                }\n            }\n        });\n        const controls = document.createElement('div');\n        controls.className = 'controls';\n        controls.style.display = this._showOptionButtons ? 'block' : 'none';\n        controls.appendChild(this.preserveCase.domNode);\n        this.domNode.appendChild(controls);\n        parent?.appendChild(this.domNode);\n        this.onkeydown(this.inputBox.inputElement, (e) => this._onKeyDown.fire(e));\n        this.onkeyup(this.inputBox.inputElement, (e) => this._onKeyUp.fire(e));\n        this.oninput(this.inputBox.inputElement, (e) => this._onInput.fire());\n        this.onmousedown(this.inputBox.inputElement, (e) => this._onMouseDown.fire(e));\n    }\n    enable() {\n        this.domNode.classList.remove('disabled');\n        this.inputBox.enable();\n        this.preserveCase.enable();\n    }\n    disable() {\n        this.domNode.classList.add('disabled');\n        this.inputBox.disable();\n        this.preserveCase.disable();\n    }\n    setEnabled(enabled) {\n        if (enabled) {\n            this.enable();\n        }\n        else {\n            this.disable();\n        }\n    }\n    select() {\n        this.inputBox.select();\n    }\n    focus() {\n        this.inputBox.focus();\n    }\n    getPreserveCase() {\n        return this.preserveCase.checked;\n    }\n    setPreserveCase(value) {\n        this.preserveCase.checked = value;\n    }\n    focusOnPreserve() {\n        this.preserveCase.focus();\n    }\n    validate() {\n        this.inputBox?.validate();\n    }\n    set width(newWidth) {\n        this.inputBox.paddingRight = this.cachedOptionsWidth;\n        this.domNode.style.width = newWidth + 'px';\n    }\n    dispose() {\n        super.dispose();\n    }\n}\n\nexport { ReplaceInput };\n","import { FindInput } from '../../../base/browser/ui/findinput/findInput.js';\nimport { ReplaceInput } from '../../../base/browser/ui/findinput/replaceInput.js';\nimport { RawContextKey, IContextKeyService, ContextKeyExpr } from '../../contextkey/common/contextkey.js';\nimport { KeybindingsRegistry } from '../../keybinding/common/keybindingsRegistry.js';\nimport { localize } from '../../../nls.js';\nimport { DisposableStore, toDisposable } from '../../../base/common/lifecycle.js';\nimport { isActiveElement } from '../../../base/browser/dom.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst historyNavigationVisible = new RawContextKey('suggestWidgetVisible', false, localize(1698, \"Whether suggestion are visible\"));\nconst HistoryNavigationWidgetFocusContext = 'historyNavigationWidgetFocus';\nconst HistoryNavigationForwardsEnablementContext = 'historyNavigationForwardsEnabled';\nconst HistoryNavigationBackwardsEnablementContext = 'historyNavigationBackwardsEnabled';\nlet lastFocusedWidget = undefined;\nconst widgets = [];\nfunction registerAndCreateHistoryNavigationContext(scopedContextKeyService, widget) {\n    if (widgets.includes(widget)) {\n        throw new Error('Cannot register the same widget multiple times');\n    }\n    widgets.push(widget);\n    const disposableStore = new DisposableStore();\n    const historyNavigationWidgetFocus = new RawContextKey(HistoryNavigationWidgetFocusContext, false).bindTo(scopedContextKeyService);\n    const historyNavigationForwardsEnablement = new RawContextKey(HistoryNavigationForwardsEnablementContext, true).bindTo(scopedContextKeyService);\n    const historyNavigationBackwardsEnablement = new RawContextKey(HistoryNavigationBackwardsEnablementContext, true).bindTo(scopedContextKeyService);\n    const onDidFocus = () => {\n        historyNavigationWidgetFocus.set(true);\n        lastFocusedWidget = widget;\n    };\n    const onDidBlur = () => {\n        historyNavigationWidgetFocus.set(false);\n        if (lastFocusedWidget === widget) {\n            lastFocusedWidget = undefined;\n        }\n    };\n    // Check for currently being focused\n    if (isActiveElement(widget.element)) {\n        onDidFocus();\n    }\n    disposableStore.add(widget.onDidFocus(() => onDidFocus()));\n    disposableStore.add(widget.onDidBlur(() => onDidBlur()));\n    disposableStore.add(toDisposable(() => {\n        widgets.splice(widgets.indexOf(widget), 1);\n        onDidBlur();\n    }));\n    return {\n        historyNavigationForwardsEnablement,\n        historyNavigationBackwardsEnablement,\n        dispose() {\n            disposableStore.dispose();\n        }\n    };\n}\nlet ContextScopedFindInput = class ContextScopedFindInput extends FindInput {\n    constructor(container, contextViewProvider, options, contextKeyService) {\n        super(container, contextViewProvider, options);\n        const scopedContextKeyService = this._register(contextKeyService.createScoped(this.inputBox.element));\n        this._register(registerAndCreateHistoryNavigationContext(scopedContextKeyService, this.inputBox));\n    }\n};\nContextScopedFindInput = __decorate([\n    __param(3, IContextKeyService)\n], ContextScopedFindInput);\nlet ContextScopedReplaceInput = class ContextScopedReplaceInput extends ReplaceInput {\n    constructor(container, contextViewProvider, options, contextKeyService, showReplaceOptions = false) {\n        super(container, contextViewProvider, showReplaceOptions, options);\n        const scopedContextKeyService = this._register(contextKeyService.createScoped(this.inputBox.element));\n        this._register(registerAndCreateHistoryNavigationContext(scopedContextKeyService, this.inputBox));\n    }\n};\nContextScopedReplaceInput = __decorate([\n    __param(3, IContextKeyService)\n], ContextScopedReplaceInput);\nKeybindingsRegistry.registerCommandAndKeybindingRule({\n    id: 'history.showPrevious',\n    weight: 200 /* KeybindingWeight.WorkbenchContrib */,\n    when: ContextKeyExpr.and(ContextKeyExpr.has(HistoryNavigationWidgetFocusContext), ContextKeyExpr.equals(HistoryNavigationBackwardsEnablementContext, true), ContextKeyExpr.not('isComposing'), historyNavigationVisible.isEqualTo(false)),\n    primary: 16 /* KeyCode.UpArrow */,\n    secondary: [512 /* KeyMod.Alt */ | 16 /* KeyCode.UpArrow */],\n    handler: (accessor) => {\n        lastFocusedWidget?.showPreviousValue();\n    }\n});\nKeybindingsRegistry.registerCommandAndKeybindingRule({\n    id: 'history.showNext',\n    weight: 200 /* KeybindingWeight.WorkbenchContrib */,\n    when: ContextKeyExpr.and(ContextKeyExpr.has(HistoryNavigationWidgetFocusContext), ContextKeyExpr.equals(HistoryNavigationForwardsEnablementContext, true), ContextKeyExpr.not('isComposing'), historyNavigationVisible.isEqualTo(false)),\n    primary: 18 /* KeyCode.DownArrow */,\n    secondary: [512 /* KeyMod.Alt */ | 18 /* KeyCode.DownArrow */],\n    handler: (accessor) => {\n        lastFocusedWidget?.showNextValue();\n    }\n});\n\nexport { ContextScopedFindInput, ContextScopedReplaceInput, historyNavigationVisible, registerAndCreateHistoryNavigationContext };\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 *--------------------------------------------------------------------------------------------*/\nfunction showHistoryKeybindingHint(keybindingService) {\n    return keybindingService.lookupKeybinding('history.showPrevious')?.getElectronAccelerator() === 'Up' && keybindingService.lookupKeybinding('history.showNext')?.getElectronAccelerator() === 'Down';\n}\n\nexport { showHistoryKeybindingHint };\n","import { trackFocus, getTotalWidth, getDomNodePagePosition, getTopLeftOffset, getComputedStyle } from '../../../../base/browser/dom.js';\nimport { alert } from '../../../../base/browser/ui/aria/aria.js';\nimport { Toggle } from '../../../../base/browser/ui/toggle/toggle.js';\nimport { Sash } from '../../../../base/browser/ui/sash/sash.js';\nimport { Widget } from '../../../../base/browser/ui/widget.js';\nimport { Delayer } from '../../../../base/common/async.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { toDisposable } from '../../../../base/common/lifecycle.js';\nimport { isLinux, isMacintosh } from '../../../../base/common/platform.js';\nimport { format } from '../../../../base/common/strings.js';\nimport './findWidget.css';\nimport { Range } from '../../../common/core/range.js';\nimport { MATCHES_LIMIT, CONTEXT_FIND_INPUT_FOCUSED, CONTEXT_REPLACE_INPUT_FOCUSED, FIND_IDS } from './findModel.js';\nimport { localize } from '../../../../nls.js';\nimport { ContextScopedFindInput, ContextScopedReplaceInput } from '../../../../platform/history/browser/contextScopedHistoryWidget.js';\nimport { showHistoryKeybindingHint } from '../../../../platform/history/browser/historyWidgetKeybindingHint.js';\nimport { asCssVariable } from '../../../../platform/theme/common/colorUtils.js';\nimport { contrastBorder } from '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorFindMatchHighlightBorder, editorFindRangeHighlightBorder, editorFindMatchForeground, editorFindMatchHighlightForeground } from '../../../../platform/theme/common/colors/editorColors.js';\nimport { inputActiveOptionForeground, inputActiveOptionBorder, inputActiveOptionBackground } from '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { registerIcon, widgetClose } from '../../../../platform/theme/common/iconRegistry.js';\nimport { registerThemingParticipant } from '../../../../platform/theme/common/themeService.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\nimport { isHighContrast } from '../../../../platform/theme/common/theme.js';\nimport { assertReturnsDefined } from '../../../../base/common/types.js';\nimport { defaultToggleStyles, defaultInputBoxStyles } from '../../../../platform/theme/browser/defaultStyles.js';\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 *--------------------------------------------------------------------------------------------*/\nconst findCollapsedIcon = registerIcon('find-collapsed', Codicon.chevronRight, localize(956, 'Icon to indicate that the editor find widget is collapsed.'));\nconst findExpandedIcon = registerIcon('find-expanded', Codicon.chevronDown, localize(957, 'Icon to indicate that the editor find widget is expanded.'));\nconst findSelectionIcon = registerIcon('find-selection', Codicon.selection, localize(958, 'Icon for \\'Find in Selection\\' in the editor find widget.'));\nconst findReplaceIcon = registerIcon('find-replace', Codicon.replace, localize(959, 'Icon for \\'Replace\\' in the editor find widget.'));\nconst findReplaceAllIcon = registerIcon('find-replace-all', Codicon.replaceAll, localize(960, 'Icon for \\'Replace All\\' in the editor find widget.'));\nconst findPreviousMatchIcon = registerIcon('find-previous-match', Codicon.arrowUp, localize(961, 'Icon for \\'Find Previous\\' in the editor find widget.'));\nconst findNextMatchIcon = registerIcon('find-next-match', Codicon.arrowDown, localize(962, 'Icon for \\'Find Next\\' in the editor find widget.'));\nconst NLS_FIND_DIALOG_LABEL = localize(963, \"Find / Replace\");\nconst NLS_FIND_INPUT_LABEL = localize(964, \"Find\");\nconst NLS_FIND_INPUT_PLACEHOLDER = localize(965, \"Find\");\nconst NLS_PREVIOUS_MATCH_BTN_LABEL = localize(966, \"Previous Match\");\nconst NLS_NEXT_MATCH_BTN_LABEL = localize(967, \"Next Match\");\nconst NLS_TOGGLE_SELECTION_FIND_TITLE = localize(968, \"Find in Selection\");\nconst NLS_CLOSE_BTN_LABEL = localize(969, \"Close\");\nconst NLS_REPLACE_INPUT_LABEL = localize(970, \"Replace\");\nconst NLS_REPLACE_INPUT_PLACEHOLDER = localize(971, \"Replace\");\nconst NLS_REPLACE_BTN_LABEL = localize(972, \"Replace\");\nconst NLS_REPLACE_ALL_BTN_LABEL = localize(973, \"Replace All\");\nconst NLS_TOGGLE_REPLACE_MODE_BTN_LABEL = localize(974, \"Toggle Replace\");\nconst NLS_MATCHES_COUNT_LIMIT_TITLE = localize(975, \"Only the first {0} results are highlighted, but all find operations work on the entire text.\", MATCHES_LIMIT);\nconst NLS_MATCHES_LOCATION = localize(976, \"{0} of {1}\");\nconst NLS_NO_RESULTS = localize(977, \"No results\");\nconst FIND_WIDGET_INITIAL_WIDTH = 419;\nconst PART_WIDTH = 275;\nconst FIND_INPUT_AREA_WIDTH = PART_WIDTH - 54;\nlet MAX_MATCHES_COUNT_WIDTH = 69;\n// let FIND_ALL_CONTROLS_WIDTH = 17/** Find Input margin-left */ + (MAX_MATCHES_COUNT_WIDTH + 3 + 1) /** Match Results */ + 23 /** Button */ * 4 + 2/** sash */;\nconst FIND_INPUT_AREA_HEIGHT = 33; // The height of Find Widget when Replace Input is not visible.\nconst ctrlKeyMod = (isMacintosh ? 256 /* KeyMod.WinCtrl */ : 2048 /* KeyMod.CtrlCmd */);\nclass FindWidgetViewZone {\n    constructor(afterLineNumber) {\n        this.afterLineNumber = afterLineNumber;\n        this.heightInPx = FIND_INPUT_AREA_HEIGHT;\n        this.suppressMouseDown = false;\n        this.domNode = document.createElement('div');\n        this.domNode.className = 'dock-find-viewzone';\n    }\n}\nfunction stopPropagationForMultiLineUpwards(event, value, textarea) {\n    const isMultiline = !!value.match(/\\n/);\n    if (textarea && isMultiline && textarea.selectionStart > 0) {\n        event.stopPropagation();\n        return;\n    }\n}\nfunction stopPropagationForMultiLineDownwards(event, value, textarea) {\n    const isMultiline = !!value.match(/\\n/);\n    if (textarea && isMultiline && textarea.selectionEnd < textarea.value.length) {\n        event.stopPropagation();\n        return;\n    }\n}\nclass FindWidget extends Widget {\n    static { this.ID = 'editor.contrib.findWidget'; }\n    constructor(codeEditor, controller, state, contextViewProvider, keybindingService, contextKeyService, _hoverService, _findWidgetSearchHistory, _replaceWidgetHistory) {\n        super();\n        this._hoverService = _hoverService;\n        this._findWidgetSearchHistory = _findWidgetSearchHistory;\n        this._replaceWidgetHistory = _replaceWidgetHistory;\n        this._cachedHeight = null;\n        this._revealTimeouts = [];\n        this._codeEditor = codeEditor;\n        this._controller = controller;\n        this._state = state;\n        this._contextViewProvider = contextViewProvider;\n        this._keybindingService = keybindingService;\n        this._contextKeyService = contextKeyService;\n        this._isVisible = false;\n        this._isReplaceVisible = false;\n        this._ignoreChangeEvent = false;\n        this._updateHistoryDelayer = new Delayer(500);\n        this._register(toDisposable(() => this._updateHistoryDelayer.cancel()));\n        this._register(this._state.onFindReplaceStateChange((e) => this._onStateChanged(e)));\n        this._buildDomNode();\n        this._updateButtons();\n        this._tryUpdateWidgetWidth();\n        this._findInput.inputBox.layout();\n        this._register(this._codeEditor.onDidChangeConfiguration((e) => {\n            if (e.hasChanged(104 /* EditorOption.readOnly */)) {\n                if (this._codeEditor.getOption(104 /* EditorOption.readOnly */)) {\n                    // Hide replace part if editor becomes read only\n                    this._state.change({ isReplaceRevealed: false }, false);\n                }\n                this._updateButtons();\n            }\n            if (e.hasChanged(165 /* EditorOption.layoutInfo */)) {\n                this._tryUpdateWidgetWidth();\n            }\n            if (e.hasChanged(2 /* EditorOption.accessibilitySupport */)) {\n                this.updateAccessibilitySupport();\n            }\n            if (e.hasChanged(50 /* EditorOption.find */)) {\n                const supportLoop = this._codeEditor.getOption(50 /* EditorOption.find */).loop;\n                this._state.change({ loop: supportLoop }, false);\n                const addExtraSpaceOnTop = this._codeEditor.getOption(50 /* EditorOption.find */).addExtraSpaceOnTop;\n                if (addExtraSpaceOnTop && !this._viewZone) {\n                    this._viewZone = new FindWidgetViewZone(0);\n                    this._showViewZone();\n                }\n                if (!addExtraSpaceOnTop && this._viewZone) {\n                    this._removeViewZone();\n                }\n            }\n        }));\n        this.updateAccessibilitySupport();\n        this._register(this._codeEditor.onDidChangeCursorSelection(() => {\n            if (this._isVisible) {\n                this._updateToggleSelectionFindButton();\n            }\n        }));\n        this._register(this._codeEditor.onDidFocusEditorWidget(async () => {\n            if (this._isVisible) {\n                const globalBufferTerm = await this._controller.getGlobalBufferTerm();\n                if (globalBufferTerm && globalBufferTerm !== this._state.searchString) {\n                    this._state.change({ searchString: globalBufferTerm }, false);\n                    this._findInput.select();\n                }\n            }\n        }));\n        this._findInputFocused = CONTEXT_FIND_INPUT_FOCUSED.bindTo(contextKeyService);\n        this._findFocusTracker = this._register(trackFocus(this._findInput.inputBox.inputElement));\n        this._register(this._findFocusTracker.onDidFocus(() => {\n            this._findInputFocused.set(true);\n            this._updateSearchScope();\n        }));\n        this._register(this._findFocusTracker.onDidBlur(() => {\n            this._findInputFocused.set(false);\n        }));\n        this._replaceInputFocused = CONTEXT_REPLACE_INPUT_FOCUSED.bindTo(contextKeyService);\n        this._replaceFocusTracker = this._register(trackFocus(this._replaceInput.inputBox.inputElement));\n        this._register(this._replaceFocusTracker.onDidFocus(() => {\n            this._replaceInputFocused.set(true);\n            this._updateSearchScope();\n        }));\n        this._register(this._replaceFocusTracker.onDidBlur(() => {\n            this._replaceInputFocused.set(false);\n        }));\n        this._codeEditor.addOverlayWidget(this);\n        if (this._codeEditor.getOption(50 /* EditorOption.find */).addExtraSpaceOnTop) {\n            this._viewZone = new FindWidgetViewZone(0); // Put it before the first line then users can scroll beyond the first line.\n        }\n        this._register(this._codeEditor.onDidChangeModel(() => {\n            if (!this._isVisible) {\n                return;\n            }\n            this._viewZoneId = undefined;\n        }));\n        this._register(this._codeEditor.onDidScrollChange((e) => {\n            if (e.scrollTopChanged) {\n                this._layoutViewZone();\n                return;\n            }\n            // for other scroll changes, layout the viewzone in next tick to avoid ruining current rendering.\n            setTimeout(() => {\n                this._layoutViewZone();\n            }, 0);\n        }));\n    }\n    // ----- IOverlayWidget API\n    getId() {\n        return FindWidget.ID;\n    }\n    getDomNode() {\n        return this._domNode;\n    }\n    getPosition() {\n        if (this._isVisible) {\n            return {\n                preference: 0 /* OverlayWidgetPositionPreference.TOP_RIGHT_CORNER */\n            };\n        }\n        return null;\n    }\n    // ----- React to state changes\n    _onStateChanged(e) {\n        if (e.searchString) {\n            try {\n                this._ignoreChangeEvent = true;\n                this._findInput.setValue(this._state.searchString);\n            }\n            finally {\n                this._ignoreChangeEvent = false;\n            }\n            this._updateButtons();\n        }\n        if (e.replaceString) {\n            this._replaceInput.inputBox.value = this._state.replaceString;\n        }\n        if (e.isRevealed) {\n            if (this._state.isRevealed) {\n                this._reveal();\n            }\n            else {\n                this._hide(true);\n            }\n        }\n        if (e.isReplaceRevealed) {\n            if (this._state.isReplaceRevealed) {\n                if (!this._codeEditor.getOption(104 /* EditorOption.readOnly */) && !this._isReplaceVisible) {\n                    this._isReplaceVisible = true;\n                    this._replaceInput.width = getTotalWidth(this._findInput.domNode);\n                    this._updateButtons();\n                    this._replaceInput.inputBox.layout();\n                }\n            }\n            else {\n                if (this._isReplaceVisible) {\n                    this._isReplaceVisible = false;\n                    this._updateButtons();\n                }\n            }\n        }\n        if ((e.isRevealed || e.isReplaceRevealed) && (this._state.isRevealed || this._state.isReplaceRevealed)) {\n            if (this._tryUpdateHeight()) {\n                this._showViewZone();\n            }\n        }\n        if (e.isRegex) {\n            this._findInput.setRegex(this._state.isRegex);\n        }\n        if (e.wholeWord) {\n            this._findInput.setWholeWords(this._state.wholeWord);\n        }\n        if (e.matchCase) {\n            this._findInput.setCaseSensitive(this._state.matchCase);\n        }\n        if (e.preserveCase) {\n            this._replaceInput.setPreserveCase(this._state.preserveCase);\n        }\n        if (e.searchScope) {\n            if (this._state.searchScope) {\n                this._toggleSelectionFind.checked = true;\n            }\n            else {\n                this._toggleSelectionFind.checked = false;\n            }\n            this._updateToggleSelectionFindButton();\n        }\n        if (e.searchString || e.matchesCount || e.matchesPosition) {\n            const showRedOutline = (this._state.searchString.length > 0 && this._state.matchesCount === 0);\n            this._domNode.classList.toggle('no-results', showRedOutline);\n            this._updateMatchesCount();\n            this._updateButtons();\n        }\n        if (e.searchString || e.currentMatch) {\n            this._layoutViewZone();\n        }\n        if (e.updateHistory) {\n            this._delayedUpdateHistory();\n        }\n        if (e.loop) {\n            this._updateButtons();\n        }\n    }\n    _delayedUpdateHistory() {\n        this._updateHistoryDelayer.trigger(this._updateHistory.bind(this)).then(undefined, onUnexpectedError);\n    }\n    _updateHistory() {\n        if (this._state.searchString) {\n            this._findInput.inputBox.addToHistory();\n        }\n        if (this._state.replaceString) {\n            this._replaceInput.inputBox.addToHistory();\n        }\n    }\n    _updateMatchesCount() {\n        this._matchesCount.style.minWidth = MAX_MATCHES_COUNT_WIDTH + 'px';\n        if (this._state.matchesCount >= MATCHES_LIMIT) {\n            this._matchesCount.title = NLS_MATCHES_COUNT_LIMIT_TITLE;\n        }\n        else {\n            this._matchesCount.title = '';\n        }\n        // remove previous content\n        this._matchesCount.firstChild?.remove();\n        let label;\n        if (this._state.matchesCount > 0) {\n            let matchesCount = String(this._state.matchesCount);\n            if (this._state.matchesCount >= MATCHES_LIMIT) {\n                matchesCount += '+';\n            }\n            let matchesPosition = String(this._state.matchesPosition);\n            if (matchesPosition === '0') {\n                matchesPosition = '?';\n            }\n            label = format(NLS_MATCHES_LOCATION, matchesPosition, matchesCount);\n        }\n        else {\n            label = NLS_NO_RESULTS;\n        }\n        this._matchesCount.appendChild(document.createTextNode(label));\n        alert(this._getAriaLabel(label, this._state.currentMatch, this._state.searchString));\n        MAX_MATCHES_COUNT_WIDTH = Math.max(MAX_MATCHES_COUNT_WIDTH, this._matchesCount.clientWidth);\n    }\n    // ----- actions\n    _getAriaLabel(label, currentMatch, searchString) {\n        if (label === NLS_NO_RESULTS) {\n            return searchString === ''\n                ? localize(978, \"{0} found\", label)\n                : localize(979, \"{0} found for '{1}'\", label, searchString);\n        }\n        if (currentMatch) {\n            const ariaLabel = localize(980, \"{0} found for '{1}', at {2}\", label, searchString, currentMatch.startLineNumber + ':' + currentMatch.startColumn);\n            const model = this._codeEditor.getModel();\n            if (model && (currentMatch.startLineNumber <= model.getLineCount()) && (currentMatch.startLineNumber >= 1)) {\n                const lineContent = model.getLineContent(currentMatch.startLineNumber);\n                return `${lineContent}, ${ariaLabel}`;\n            }\n            return ariaLabel;\n        }\n        return localize(981, \"{0} found for '{1}'\", label, searchString);\n    }\n    /**\n     * If 'selection find' is ON we should not disable the button (its function is to cancel 'selection find').\n     * If 'selection find' is OFF we enable the button only if there is a selection.\n     */\n    _updateToggleSelectionFindButton() {\n        const selection = this._codeEditor.getSelection();\n        const isSelection = selection ? (selection.startLineNumber !== selection.endLineNumber || selection.startColumn !== selection.endColumn) : false;\n        const isChecked = this._toggleSelectionFind.checked;\n        if (this._isVisible && (isChecked || isSelection)) {\n            this._toggleSelectionFind.enable();\n        }\n        else {\n            this._toggleSelectionFind.disable();\n        }\n    }\n    _updateButtons() {\n        this._findInput.setEnabled(this._isVisible);\n        this._replaceInput.setEnabled(this._isVisible && this._isReplaceVisible);\n        this._updateToggleSelectionFindButton();\n        this._closeBtn.setEnabled(this._isVisible);\n        const findInputIsNonEmpty = (this._state.searchString.length > 0);\n        const matchesCount = this._state.matchesCount ? true : false;\n        this._prevBtn.setEnabled(this._isVisible && findInputIsNonEmpty && matchesCount && this._state.canNavigateBack());\n        this._nextBtn.setEnabled(this._isVisible && findInputIsNonEmpty && matchesCount && this._state.canNavigateForward());\n        this._replaceBtn.setEnabled(this._isVisible && this._isReplaceVisible && findInputIsNonEmpty);\n        this._replaceAllBtn.setEnabled(this._isVisible && this._isReplaceVisible && findInputIsNonEmpty);\n        this._domNode.classList.toggle('replaceToggled', this._isReplaceVisible);\n        this._toggleReplaceBtn.setExpanded(this._isReplaceVisible);\n        const canReplace = !this._codeEditor.getOption(104 /* EditorOption.readOnly */);\n        this._toggleReplaceBtn.setEnabled(this._isVisible && canReplace);\n    }\n    _reveal() {\n        this._revealTimeouts.forEach(e => {\n            clearTimeout(e);\n        });\n        this._revealTimeouts = [];\n        if (!this._isVisible) {\n            this._isVisible = true;\n            const selection = this._codeEditor.getSelection();\n            switch (this._codeEditor.getOption(50 /* EditorOption.find */).autoFindInSelection) {\n                case 'always':\n                    this._toggleSelectionFind.checked = true;\n                    break;\n                case 'never':\n                    this._toggleSelectionFind.checked = false;\n                    break;\n                case 'multiline': {\n                    const isSelectionMultipleLine = !!selection && selection.startLineNumber !== selection.endLineNumber;\n                    this._toggleSelectionFind.checked = isSelectionMultipleLine;\n                    break;\n                }\n            }\n            this._tryUpdateWidgetWidth();\n            this._updateButtons();\n            this._revealTimeouts.push(setTimeout(() => {\n                this._domNode.classList.add('visible');\n                this._domNode.setAttribute('aria-hidden', 'false');\n            }, 0));\n            // validate query again as it's being dismissed when we hide the find widget.\n            this._revealTimeouts.push(setTimeout(() => {\n                this._findInput.validate();\n            }, 200));\n            this._codeEditor.layoutOverlayWidget(this);\n            let adjustEditorScrollTop = true;\n            if (this._codeEditor.getOption(50 /* EditorOption.find */).seedSearchStringFromSelection && selection) {\n                const domNode = this._codeEditor.getDomNode();\n                if (domNode) {\n                    const editorCoords = getDomNodePagePosition(domNode);\n                    const startCoords = this._codeEditor.getScrolledVisiblePosition(selection.getStartPosition());\n                    const startLeft = editorCoords.left + (startCoords ? startCoords.left : 0);\n                    const startTop = startCoords ? startCoords.top : 0;\n                    if (this._viewZone && startTop < this._viewZone.heightInPx) {\n                        if (selection.endLineNumber > selection.startLineNumber) {\n                            adjustEditorScrollTop = false;\n                        }\n                        const leftOfFindWidget = getTopLeftOffset(this._domNode).left;\n                        if (startLeft > leftOfFindWidget) {\n                            adjustEditorScrollTop = false;\n                        }\n                        const endCoords = this._codeEditor.getScrolledVisiblePosition(selection.getEndPosition());\n                        const endLeft = editorCoords.left + (endCoords ? endCoords.left : 0);\n                        if (endLeft > leftOfFindWidget) {\n                            adjustEditorScrollTop = false;\n                        }\n                    }\n                }\n            }\n            this._showViewZone(adjustEditorScrollTop);\n        }\n    }\n    _hide(focusTheEditor) {\n        this._revealTimeouts.forEach(e => {\n            clearTimeout(e);\n        });\n        this._revealTimeouts = [];\n        if (this._isVisible) {\n            this._isVisible = false;\n            this._updateButtons();\n            this._domNode.classList.remove('visible');\n            this._domNode.setAttribute('aria-hidden', 'true');\n            this._findInput.clearMessage();\n            if (focusTheEditor) {\n                this._codeEditor.focus();\n            }\n            this._codeEditor.layoutOverlayWidget(this);\n            this._removeViewZone();\n        }\n    }\n    _layoutViewZone(targetScrollTop) {\n        const addExtraSpaceOnTop = this._codeEditor.getOption(50 /* EditorOption.find */).addExtraSpaceOnTop;\n        if (!addExtraSpaceOnTop) {\n            this._removeViewZone();\n            return;\n        }\n        if (!this._isVisible) {\n            return;\n        }\n        const viewZone = this._viewZone;\n        if (this._viewZoneId !== undefined || !viewZone) {\n            return;\n        }\n        this._codeEditor.changeViewZones((accessor) => {\n            viewZone.heightInPx = this._getHeight();\n            this._viewZoneId = accessor.addZone(viewZone);\n            // scroll top adjust to make sure the editor doesn't scroll when adding viewzone at the beginning.\n            this._codeEditor.setScrollTop(targetScrollTop || this._codeEditor.getScrollTop() + viewZone.heightInPx);\n        });\n    }\n    _showViewZone(adjustScroll = true) {\n        if (!this._isVisible) {\n            return;\n        }\n        const addExtraSpaceOnTop = this._codeEditor.getOption(50 /* EditorOption.find */).addExtraSpaceOnTop;\n        if (!addExtraSpaceOnTop) {\n            return;\n        }\n        if (this._viewZone === undefined) {\n            this._viewZone = new FindWidgetViewZone(0);\n        }\n        const viewZone = this._viewZone;\n        this._codeEditor.changeViewZones((accessor) => {\n            if (this._viewZoneId !== undefined) {\n                // the view zone already exists, we need to update the height\n                const newHeight = this._getHeight();\n                if (newHeight === viewZone.heightInPx) {\n                    return;\n                }\n                const scrollAdjustment = newHeight - viewZone.heightInPx;\n                viewZone.heightInPx = newHeight;\n                accessor.layoutZone(this._viewZoneId);\n                if (adjustScroll) {\n                    this._codeEditor.setScrollTop(this._codeEditor.getScrollTop() + scrollAdjustment);\n                }\n                return;\n            }\n            else {\n                let scrollAdjustment = this._getHeight();\n                // if the editor has top padding, factor that into the zone height\n                scrollAdjustment -= this._codeEditor.getOption(96 /* EditorOption.padding */).top;\n                if (scrollAdjustment <= 0) {\n                    return;\n                }\n                viewZone.heightInPx = scrollAdjustment;\n                this._viewZoneId = accessor.addZone(viewZone);\n                if (adjustScroll) {\n                    this._codeEditor.setScrollTop(this._codeEditor.getScrollTop() + scrollAdjustment);\n                }\n            }\n        });\n    }\n    _removeViewZone() {\n        this._codeEditor.changeViewZones((accessor) => {\n            if (this._viewZoneId !== undefined) {\n                accessor.removeZone(this._viewZoneId);\n                this._viewZoneId = undefined;\n                if (this._viewZone) {\n                    this._codeEditor.setScrollTop(this._codeEditor.getScrollTop() - this._viewZone.heightInPx);\n                    this._viewZone = undefined;\n                }\n            }\n        });\n    }\n    _tryUpdateWidgetWidth() {\n        if (!this._isVisible) {\n            return;\n        }\n        if (!this._domNode.isConnected) {\n            // the widget is not in the DOM\n            return;\n        }\n        const layoutInfo = this._codeEditor.getLayoutInfo();\n        const editorContentWidth = layoutInfo.contentWidth;\n        if (editorContentWidth <= 0) {\n            // for example, diff view original editor\n            this._domNode.classList.add('hiddenEditor');\n            return;\n        }\n        else if (this._domNode.classList.contains('hiddenEditor')) {\n            this._domNode.classList.remove('hiddenEditor');\n        }\n        const editorWidth = layoutInfo.width;\n        const minimapWidth = layoutInfo.minimap.minimapWidth;\n        let collapsedFindWidget = false;\n        let reducedFindWidget = false;\n        let narrowFindWidget = false;\n        if (this._resized) {\n            const widgetWidth = getTotalWidth(this._domNode);\n            if (widgetWidth > FIND_WIDGET_INITIAL_WIDTH) {\n                // as the widget is resized by users, we may need to change the max width of the widget as the editor width changes.\n                this._domNode.style.maxWidth = `${editorWidth - 28 - minimapWidth - 15}px`;\n                this._replaceInput.width = getTotalWidth(this._findInput.domNode);\n                return;\n            }\n        }\n        if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth >= editorWidth) {\n            reducedFindWidget = true;\n        }\n        if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth - MAX_MATCHES_COUNT_WIDTH >= editorWidth) {\n            narrowFindWidget = true;\n        }\n        if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth - MAX_MATCHES_COUNT_WIDTH >= editorWidth + 50) {\n            collapsedFindWidget = true;\n        }\n        this._domNode.classList.toggle('collapsed-find-widget', collapsedFindWidget);\n        this._domNode.classList.toggle('narrow-find-widget', narrowFindWidget);\n        this._domNode.classList.toggle('reduced-find-widget', reducedFindWidget);\n        if (!narrowFindWidget && !collapsedFindWidget) {\n            // the minimal left offset of findwidget is 15px.\n            this._domNode.style.maxWidth = `${editorWidth - 28 - minimapWidth - 15}px`;\n        }\n        this._findInput.layout({ collapsedFindWidget, narrowFindWidget, reducedFindWidget });\n        if (this._resized) {\n            const findInputWidth = this._findInput.inputBox.element.clientWidth;\n            if (findInputWidth > 0) {\n                this._replaceInput.width = findInputWidth;\n            }\n        }\n        else if (this._isReplaceVisible) {\n            this._replaceInput.width = getTotalWidth(this._findInput.domNode);\n        }\n    }\n    _getHeight() {\n        let totalheight = 0;\n        // find input margin top\n        totalheight += 4;\n        // find input height\n        totalheight += this._findInput.inputBox.height + 2 /** input box border */;\n        if (this._isReplaceVisible) {\n            // replace input margin\n            totalheight += 4;\n            totalheight += this._replaceInput.inputBox.height + 2 /** input box border */;\n        }\n        // margin bottom\n        totalheight += 4;\n        return totalheight;\n    }\n    _tryUpdateHeight() {\n        const totalHeight = this._getHeight();\n        if (this._cachedHeight !== null && this._cachedHeight === totalHeight) {\n            return false;\n        }\n        this._cachedHeight = totalHeight;\n        this._domNode.style.height = `${totalHeight}px`;\n        return true;\n    }\n    // ----- Public\n    focusFindInput() {\n        this._findInput.select();\n        // Edge browser requires focus() in addition to select()\n        this._findInput.focus();\n    }\n    focusReplaceInput() {\n        this._replaceInput.select();\n        // Edge browser requires focus() in addition to select()\n        this._replaceInput.focus();\n    }\n    highlightFindOptions() {\n        this._findInput.highlightFindOptions();\n    }\n    _updateSearchScope() {\n        if (!this._codeEditor.hasModel()) {\n            return;\n        }\n        if (this._toggleSelectionFind.checked) {\n            const selections = this._codeEditor.getSelections();\n            selections.map(selection => {\n                if (selection.endColumn === 1 && selection.endLineNumber > selection.startLineNumber) {\n                    selection = selection.setEndPosition(selection.endLineNumber - 1, this._codeEditor.getModel().getLineMaxColumn(selection.endLineNumber - 1));\n                }\n                const currentMatch = this._state.currentMatch;\n                if (selection.startLineNumber !== selection.endLineNumber) {\n                    if (!Range.equalsRange(selection, currentMatch)) {\n                        return selection;\n                    }\n                }\n                return null;\n            }).filter(element => !!element);\n            if (selections.length) {\n                this._state.change({ searchScope: selections }, true);\n            }\n        }\n    }\n    _onFindInputMouseDown(e) {\n        // on linux, middle key does pasting.\n        if (e.middleButton) {\n            e.stopPropagation();\n        }\n    }\n    _onFindInputKeyDown(e) {\n        if (e.equals(ctrlKeyMod | 3 /* KeyCode.Enter */)) {\n            if (this._keybindingService.dispatchEvent(e, e.target)) {\n                e.preventDefault();\n                return;\n            }\n            else {\n                this._findInput.inputBox.insertAtCursor('\\n');\n                e.preventDefault();\n                return;\n            }\n        }\n        if (e.equals(2 /* KeyCode.Tab */)) {\n            if (this._isReplaceVisible) {\n                this._replaceInput.focus();\n            }\n            else {\n                this._findInput.focusOnCaseSensitive();\n            }\n            e.preventDefault();\n            return;\n        }\n        if (e.equals(2048 /* KeyMod.CtrlCmd */ | 18 /* KeyCode.DownArrow */)) {\n            this._codeEditor.focus();\n            e.preventDefault();\n            return;\n        }\n        if (e.equals(16 /* KeyCode.UpArrow */)) {\n            // eslint-disable-next-line no-restricted-syntax\n            return stopPropagationForMultiLineUpwards(e, this._findInput.getValue(), this._findInput.domNode.querySelector('textarea'));\n        }\n        if (e.equals(18 /* KeyCode.DownArrow */)) {\n            // eslint-disable-next-line no-restricted-syntax\n            return stopPropagationForMultiLineDownwards(e, this._findInput.getValue(), this._findInput.domNode.querySelector('textarea'));\n        }\n    }\n    _onReplaceInputKeyDown(e) {\n        if (e.equals(ctrlKeyMod | 3 /* KeyCode.Enter */)) {\n            if (this._keybindingService.dispatchEvent(e, e.target)) {\n                e.preventDefault();\n                return;\n            }\n            else {\n                this._replaceInput.inputBox.insertAtCursor('\\n');\n                e.preventDefault();\n                return;\n            }\n        }\n        if (e.equals(2 /* KeyCode.Tab */)) {\n            this._findInput.focusOnCaseSensitive();\n            e.preventDefault();\n            return;\n        }\n        if (e.equals(1024 /* KeyMod.Shift */ | 2 /* KeyCode.Tab */)) {\n            this._findInput.focus();\n            e.preventDefault();\n            return;\n        }\n        if (e.equals(2048 /* KeyMod.CtrlCmd */ | 18 /* KeyCode.DownArrow */)) {\n            this._codeEditor.focus();\n            e.preventDefault();\n            return;\n        }\n        if (e.equals(16 /* KeyCode.UpArrow */)) {\n            // eslint-disable-next-line no-restricted-syntax\n            return stopPropagationForMultiLineUpwards(e, this._replaceInput.inputBox.value, this._replaceInput.inputBox.element.querySelector('textarea'));\n        }\n        if (e.equals(18 /* KeyCode.DownArrow */)) {\n            // eslint-disable-next-line no-restricted-syntax\n            return stopPropagationForMultiLineDownwards(e, this._replaceInput.inputBox.value, this._replaceInput.inputBox.element.querySelector('textarea'));\n        }\n    }\n    // ----- sash\n    getVerticalSashLeft(_sash) {\n        return 0;\n    }\n    // ----- initialization\n    _keybindingLabelFor(actionId) {\n        const kb = this._keybindingService.lookupKeybinding(actionId);\n        if (!kb) {\n            return '';\n        }\n        return ` (${kb.getLabel()})`;\n    }\n    _buildDomNode() {\n        const flexibleHeight = true;\n        const flexibleWidth = true;\n        // Find input\n        const findSearchHistoryConfig = this._codeEditor.getOption(50 /* EditorOption.find */).history;\n        const replaceHistoryConfig = this._codeEditor.getOption(50 /* EditorOption.find */).replaceHistory;\n        this._findInput = this._register(new ContextScopedFindInput(null, this._contextViewProvider, {\n            width: FIND_INPUT_AREA_WIDTH,\n            label: NLS_FIND_INPUT_LABEL,\n            placeholder: NLS_FIND_INPUT_PLACEHOLDER,\n            appendCaseSensitiveLabel: this._keybindingLabelFor(FIND_IDS.ToggleCaseSensitiveCommand),\n            appendWholeWordsLabel: this._keybindingLabelFor(FIND_IDS.ToggleWholeWordCommand),\n            appendRegexLabel: this._keybindingLabelFor(FIND_IDS.ToggleRegexCommand),\n            validation: (value) => {\n                if (value.length === 0 || !this._findInput.getRegex()) {\n                    return null;\n                }\n                try {\n                    // use `g` and `u` which are also used by the TextModel search\n                    new RegExp(value, 'gu');\n                    return null;\n                }\n                catch (e) {\n                    return { content: e.message };\n                }\n            },\n            flexibleHeight,\n            flexibleWidth,\n            flexibleMaxHeight: 118,\n            showCommonFindToggles: true,\n            showHistoryHint: () => showHistoryKeybindingHint(this._keybindingService),\n            inputBoxStyles: defaultInputBoxStyles,\n            toggleStyles: defaultToggleStyles,\n            history: findSearchHistoryConfig === 'workspace' ? this._findWidgetSearchHistory : new Set([]),\n        }, this._contextKeyService));\n        this._findInput.setRegex(!!this._state.isRegex);\n        this._findInput.setCaseSensitive(!!this._state.matchCase);\n        this._findInput.setWholeWords(!!this._state.wholeWord);\n        this._register(this._findInput.onKeyDown((e) => {\n            if (e.equals(3 /* KeyCode.Enter */) && !this._codeEditor.getOption(50 /* EditorOption.find */).findOnType) {\n                this._state.change({ searchString: this._findInput.getValue() }, true);\n            }\n            this._onFindInputKeyDown(e);\n        }));\n        this._register(this._findInput.inputBox.onDidChange(() => {\n            if (this._ignoreChangeEvent || !this._codeEditor.getOption(50 /* EditorOption.find */).findOnType) {\n                return;\n            }\n            this._state.change({ searchString: this._findInput.getValue() }, true);\n        }));\n        this._register(this._findInput.onDidOptionChange(() => {\n            this._state.change({\n                isRegex: this._findInput.getRegex(),\n                wholeWord: this._findInput.getWholeWords(),\n                matchCase: this._findInput.getCaseSensitive()\n            }, true);\n        }));\n        this._register(this._findInput.onCaseSensitiveKeyDown((e) => {\n            if (e.equals(1024 /* KeyMod.Shift */ | 2 /* KeyCode.Tab */)) {\n                if (this._isReplaceVisible) {\n                    this._replaceInput.focus();\n                    e.preventDefault();\n                }\n            }\n        }));\n        this._register(this._findInput.onRegexKeyDown((e) => {\n            if (e.equals(2 /* KeyCode.Tab */)) {\n                if (this._isReplaceVisible) {\n                    this._replaceInput.focusOnPreserve();\n                    e.preventDefault();\n                }\n            }\n        }));\n        this._register(this._findInput.inputBox.onDidHeightChange((e) => {\n            if (this._tryUpdateHeight()) {\n                this._showViewZone();\n            }\n        }));\n        if (isLinux) {\n            this._register(this._findInput.onMouseDown((e) => this._onFindInputMouseDown(e)));\n        }\n        this._matchesCount = document.createElement('div');\n        this._matchesCount.className = 'matchesCount';\n        this._updateMatchesCount();\n        const hoverLifecycleOptions = { groupId: 'find-widget' };\n        // Previous button\n        this._prevBtn = this._register(new SimpleButton({\n            label: NLS_PREVIOUS_MATCH_BTN_LABEL + this._keybindingLabelFor(FIND_IDS.PreviousMatchFindAction),\n            icon: findPreviousMatchIcon,\n            hoverLifecycleOptions,\n            onTrigger: () => {\n                assertReturnsDefined(this._codeEditor.getAction(FIND_IDS.PreviousMatchFindAction)).run().then(undefined, onUnexpectedError);\n            }\n        }, this._hoverService));\n        // Next button\n        this._nextBtn = this._register(new SimpleButton({\n            label: NLS_NEXT_MATCH_BTN_LABEL + this._keybindingLabelFor(FIND_IDS.NextMatchFindAction),\n            icon: findNextMatchIcon,\n            hoverLifecycleOptions,\n            onTrigger: () => {\n                assertReturnsDefined(this._codeEditor.getAction(FIND_IDS.NextMatchFindAction)).run().then(undefined, onUnexpectedError);\n            }\n        }, this._hoverService));\n        const findPart = document.createElement('div');\n        findPart.className = 'find-part';\n        findPart.appendChild(this._findInput.domNode);\n        const actionsContainer = document.createElement('div');\n        actionsContainer.className = 'find-actions';\n        findPart.appendChild(actionsContainer);\n        actionsContainer.appendChild(this._matchesCount);\n        actionsContainer.appendChild(this._prevBtn.domNode);\n        actionsContainer.appendChild(this._nextBtn.domNode);\n        // Toggle selection button\n        this._toggleSelectionFind = this._register(new Toggle({\n            icon: findSelectionIcon,\n            title: NLS_TOGGLE_SELECTION_FIND_TITLE + this._keybindingLabelFor(FIND_IDS.ToggleSearchScopeCommand),\n            isChecked: false,\n            hoverLifecycleOptions,\n            inputActiveOptionBackground: asCssVariable(inputActiveOptionBackground),\n            inputActiveOptionBorder: asCssVariable(inputActiveOptionBorder),\n            inputActiveOptionForeground: asCssVariable(inputActiveOptionForeground),\n        }));\n        this._register(this._toggleSelectionFind.onChange(() => {\n            if (this._toggleSelectionFind.checked) {\n                if (this._codeEditor.hasModel()) {\n                    let selections = this._codeEditor.getSelections();\n                    selections = selections.map(selection => {\n                        if (selection.endColumn === 1 && selection.endLineNumber > selection.startLineNumber) {\n                            selection = selection.setEndPosition(selection.endLineNumber - 1, this._codeEditor.getModel().getLineMaxColumn(selection.endLineNumber - 1));\n                        }\n                        if (!selection.isEmpty()) {\n                            return selection;\n                        }\n                        return null;\n                    }).filter((element) => !!element);\n                    if (selections.length) {\n                        this._state.change({ searchScope: selections }, true);\n                    }\n                }\n            }\n            else {\n                this._state.change({ searchScope: null }, true);\n            }\n        }));\n        actionsContainer.appendChild(this._toggleSelectionFind.domNode);\n        // Close button\n        this._closeBtn = this._register(new SimpleButton({\n            label: NLS_CLOSE_BTN_LABEL + this._keybindingLabelFor(FIND_IDS.CloseFindWidgetCommand),\n            icon: widgetClose,\n            hoverLifecycleOptions,\n            onTrigger: () => {\n                this._state.change({ isRevealed: false, searchScope: null }, false);\n            },\n            onKeyDown: (e) => {\n                if (e.equals(2 /* KeyCode.Tab */)) {\n                    if (this._isReplaceVisible) {\n                        if (this._replaceBtn.isEnabled()) {\n                            this._replaceBtn.focus();\n                        }\n                        else {\n                            this._codeEditor.focus();\n                        }\n                        e.preventDefault();\n                    }\n                }\n            }\n        }, this._hoverService));\n        // Replace input\n        this._replaceInput = this._register(new ContextScopedReplaceInput(null, undefined, {\n            label: NLS_REPLACE_INPUT_LABEL,\n            placeholder: NLS_REPLACE_INPUT_PLACEHOLDER,\n            appendPreserveCaseLabel: this._keybindingLabelFor(FIND_IDS.TogglePreserveCaseCommand),\n            history: replaceHistoryConfig === 'workspace' ? this._replaceWidgetHistory : new Set([]),\n            flexibleHeight,\n            flexibleWidth,\n            flexibleMaxHeight: 118,\n            showHistoryHint: () => showHistoryKeybindingHint(this._keybindingService),\n            inputBoxStyles: defaultInputBoxStyles,\n            toggleStyles: defaultToggleStyles,\n            hoverLifecycleOptions,\n        }, this._contextKeyService, true));\n        this._replaceInput.setPreserveCase(!!this._state.preserveCase);\n        this._register(this._replaceInput.onKeyDown((e) => this._onReplaceInputKeyDown(e)));\n        this._register(this._replaceInput.inputBox.onDidChange(() => {\n            this._state.change({ replaceString: this._replaceInput.inputBox.value }, false);\n        }));\n        this._register(this._replaceInput.inputBox.onDidHeightChange((e) => {\n            if (this._isReplaceVisible && this._tryUpdateHeight()) {\n                this._showViewZone();\n            }\n        }));\n        this._register(this._replaceInput.onDidOptionChange(() => {\n            this._state.change({\n                preserveCase: this._replaceInput.getPreserveCase()\n            }, true);\n        }));\n        this._register(this._replaceInput.onPreserveCaseKeyDown((e) => {\n            if (e.equals(2 /* KeyCode.Tab */)) {\n                if (this._prevBtn.isEnabled()) {\n                    this._prevBtn.focus();\n                }\n                else if (this._nextBtn.isEnabled()) {\n                    this._nextBtn.focus();\n                }\n                else if (this._toggleSelectionFind.enabled) {\n                    this._toggleSelectionFind.focus();\n                }\n                else if (this._closeBtn.isEnabled()) {\n                    this._closeBtn.focus();\n                }\n                e.preventDefault();\n            }\n        }));\n        // Replace one button\n        this._replaceBtn = this._register(new SimpleButton({\n            label: NLS_REPLACE_BTN_LABEL + this._keybindingLabelFor(FIND_IDS.ReplaceOneAction),\n            icon: findReplaceIcon,\n            hoverLifecycleOptions,\n            onTrigger: () => {\n                this._controller.replace();\n            },\n            onKeyDown: (e) => {\n                if (e.equals(1024 /* KeyMod.Shift */ | 2 /* KeyCode.Tab */)) {\n                    this._closeBtn.focus();\n                    e.preventDefault();\n                }\n            }\n        }, this._hoverService));\n        // Replace all button\n        this._replaceAllBtn = this._register(new SimpleButton({\n            label: NLS_REPLACE_ALL_BTN_LABEL + this._keybindingLabelFor(FIND_IDS.ReplaceAllAction),\n            icon: findReplaceAllIcon,\n            hoverLifecycleOptions,\n            onTrigger: () => {\n                this._controller.replaceAll();\n            }\n        }, this._hoverService));\n        const replacePart = document.createElement('div');\n        replacePart.className = 'replace-part';\n        replacePart.appendChild(this._replaceInput.domNode);\n        const replaceActionsContainer = document.createElement('div');\n        replaceActionsContainer.className = 'replace-actions';\n        replacePart.appendChild(replaceActionsContainer);\n        replaceActionsContainer.appendChild(this._replaceBtn.domNode);\n        replaceActionsContainer.appendChild(this._replaceAllBtn.domNode);\n        // Toggle replace button\n        this._toggleReplaceBtn = this._register(new SimpleButton({\n            label: NLS_TOGGLE_REPLACE_MODE_BTN_LABEL,\n            className: 'codicon toggle left',\n            onTrigger: () => {\n                this._state.change({ isReplaceRevealed: !this._isReplaceVisible }, false);\n                if (this._isReplaceVisible) {\n                    this._replaceInput.width = getTotalWidth(this._findInput.domNode);\n                    this._replaceInput.inputBox.layout();\n                }\n                this._showViewZone();\n            }\n        }, this._hoverService));\n        this._toggleReplaceBtn.setExpanded(this._isReplaceVisible);\n        // Widget\n        this._domNode = document.createElement('div');\n        this._domNode.className = 'editor-widget find-widget';\n        this._domNode.setAttribute('aria-hidden', 'true');\n        this._domNode.ariaLabel = NLS_FIND_DIALOG_LABEL;\n        this._domNode.role = 'dialog';\n        // We need to set this explicitly, otherwise on IE11, the width inheritence of flex doesn't work.\n        this._domNode.style.width = `${FIND_WIDGET_INITIAL_WIDTH}px`;\n        this._domNode.appendChild(this._toggleReplaceBtn.domNode);\n        this._domNode.appendChild(findPart);\n        this._domNode.appendChild(this._closeBtn.domNode);\n        this._domNode.appendChild(replacePart);\n        this._resizeSash = this._register(new Sash(this._domNode, this, { orientation: 0 /* Orientation.VERTICAL */, size: 2 }));\n        this._resized = false;\n        let originalWidth = FIND_WIDGET_INITIAL_WIDTH;\n        this._register(this._resizeSash.onDidStart(() => {\n            originalWidth = getTotalWidth(this._domNode);\n        }));\n        this._register(this._resizeSash.onDidChange((evt) => {\n            this._resized = true;\n            const width = originalWidth + evt.startX - evt.currentX;\n            if (width < FIND_WIDGET_INITIAL_WIDTH) {\n                // narrow down the find widget should be handled by CSS.\n                return;\n            }\n            const maxWidth = parseFloat(getComputedStyle(this._domNode).maxWidth) || 0;\n            if (width > maxWidth) {\n                return;\n            }\n            this._domNode.style.width = `${width}px`;\n            if (this._isReplaceVisible) {\n                this._replaceInput.width = getTotalWidth(this._findInput.domNode);\n            }\n            this._findInput.inputBox.layout();\n            this._tryUpdateHeight();\n        }));\n        this._register(this._resizeSash.onDidReset(() => {\n            // users double click on the sash\n            const currentWidth = getTotalWidth(this._domNode);\n            if (currentWidth < FIND_WIDGET_INITIAL_WIDTH) {\n                // The editor is narrow and the width of the find widget is controlled fully by CSS.\n                return;\n            }\n            let width = FIND_WIDGET_INITIAL_WIDTH;\n            if (!this._resized || currentWidth === FIND_WIDGET_INITIAL_WIDTH) {\n                // 1. never resized before, double click should maximizes it\n                // 2. users resized it already but its width is the same as default\n                const layoutInfo = this._codeEditor.getLayoutInfo();\n                width = layoutInfo.width - 28 - layoutInfo.minimap.minimapWidth - 15;\n                this._resized = true;\n            }\n            this._domNode.style.width = `${width}px`;\n            if (this._isReplaceVisible) {\n                this._replaceInput.width = getTotalWidth(this._findInput.domNode);\n            }\n            this._findInput.inputBox.layout();\n        }));\n    }\n    updateAccessibilitySupport() {\n        const value = this._codeEditor.getOption(2 /* EditorOption.accessibilitySupport */);\n        this._findInput.setFocusInputOnOptionClick(value !== 2 /* AccessibilitySupport.Enabled */);\n    }\n    getViewState() {\n        let widgetViewZoneVisible = false;\n        if (this._viewZone && this._viewZoneId) {\n            widgetViewZoneVisible = this._viewZone.heightInPx > this._codeEditor.getScrollTop();\n        }\n        return {\n            widgetViewZoneVisible,\n            scrollTop: this._codeEditor.getScrollTop()\n        };\n    }\n    setViewState(state) {\n        if (!state) {\n            return;\n        }\n        if (state.widgetViewZoneVisible) {\n            // we should add the view zone\n            this._layoutViewZone(state.scrollTop);\n        }\n    }\n}\nclass SimpleButton extends Widget {\n    constructor(opts, hoverService) {\n        super();\n        this._opts = opts;\n        let className = 'button';\n        if (this._opts.className) {\n            className = className + ' ' + this._opts.className;\n        }\n        if (this._opts.icon) {\n            className = className + ' ' + ThemeIcon.asClassName(this._opts.icon);\n        }\n        this._domNode = document.createElement('div');\n        this._domNode.tabIndex = 0;\n        this._domNode.className = className;\n        this._domNode.setAttribute('role', 'button');\n        this._domNode.setAttribute('aria-label', this._opts.label);\n        this._register(hoverService.setupDelayedHover(this._domNode, {\n            content: this._opts.label,\n            style: 1 /* HoverStyle.Pointer */,\n        }, opts.hoverLifecycleOptions));\n        this.onclick(this._domNode, (e) => {\n            this._opts.onTrigger();\n            e.preventDefault();\n        });\n        this.onkeydown(this._domNode, (e) => {\n            if (e.equals(10 /* KeyCode.Space */) || e.equals(3 /* KeyCode.Enter */)) {\n                this._opts.onTrigger();\n                e.preventDefault();\n                return;\n            }\n            this._opts.onKeyDown?.(e);\n        });\n    }\n    get domNode() {\n        return this._domNode;\n    }\n    isEnabled() {\n        return (this._domNode.tabIndex >= 0);\n    }\n    focus() {\n        this._domNode.focus();\n    }\n    setEnabled(enabled) {\n        this._domNode.classList.toggle('disabled', !enabled);\n        this._domNode.setAttribute('aria-disabled', String(!enabled));\n        this._domNode.tabIndex = enabled ? 0 : -1;\n    }\n    setExpanded(expanded) {\n        this._domNode.setAttribute('aria-expanded', String(!!expanded));\n        if (expanded) {\n            this._domNode.classList.remove(...ThemeIcon.asClassNameArray(findCollapsedIcon));\n            this._domNode.classList.add(...ThemeIcon.asClassNameArray(findExpandedIcon));\n        }\n        else {\n            this._domNode.classList.remove(...ThemeIcon.asClassNameArray(findExpandedIcon));\n            this._domNode.classList.add(...ThemeIcon.asClassNameArray(findCollapsedIcon));\n        }\n    }\n}\n// theming\nregisterThemingParticipant((theme, collector) => {\n    const findMatchHighlightBorder = theme.getColor(editorFindMatchHighlightBorder);\n    if (findMatchHighlightBorder) {\n        collector.addRule(`.monaco-editor .findMatch { border: 1px ${isHighContrast(theme.type) ? 'dotted' : 'solid'} ${findMatchHighlightBorder}; box-sizing: border-box; }`);\n    }\n    const findRangeHighlightBorder = theme.getColor(editorFindRangeHighlightBorder);\n    if (findRangeHighlightBorder) {\n        collector.addRule(`.monaco-editor .findScope { border: 1px ${isHighContrast(theme.type) ? 'dashed' : 'solid'} ${findRangeHighlightBorder}; }`);\n    }\n    const hcBorder = theme.getColor(contrastBorder);\n    if (hcBorder) {\n        collector.addRule(`.monaco-editor .find-widget { border: 1px solid ${hcBorder}; }`);\n    }\n    const findMatchForeground = theme.getColor(editorFindMatchForeground);\n    if (findMatchForeground) {\n        collector.addRule(`.monaco-editor .findMatchInline { color: ${findMatchForeground}; }`);\n    }\n    const findMatchHighlightForeground = theme.getColor(editorFindMatchHighlightForeground);\n    if (findMatchHighlightForeground) {\n        collector.addRule(`.monaco-editor .currentFindMatchInline { color: ${findMatchHighlightForeground}; }`);\n    }\n});\n\nexport { FindWidget, FindWidgetViewZone, NLS_MATCHES_LOCATION, NLS_NO_RESULTS, SimpleButton, findNextMatchIcon, findPreviousMatchIcon, findReplaceAllIcon, findReplaceIcon, findSelectionIcon };\n","import { Disposable } from '../../../../base/common/lifecycle.js';\nimport { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';\nimport { IHoverService } from '../../../../platform/hover/browser/hover.js';\nimport { localize } from '../../../../nls.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { SimpleButton } from '../../find/browser/findWidget.js';\nimport { status } from '../../../../base/browser/ui/aria/aria.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/**\n * A button that appears in hover parts to copy their content to the clipboard.\n */\nlet HoverCopyButton = class HoverCopyButton extends Disposable {\n    constructor(_container, _getContent, _clipboardService, _hoverService) {\n        super();\n        this._container = _container;\n        this._getContent = _getContent;\n        this._clipboardService = _clipboardService;\n        this._hoverService = _hoverService;\n        this._container.classList.add('hover-row-with-copy');\n        this._button = this._register(new SimpleButton({\n            label: localize(1128, \"Copy\"),\n            icon: Codicon.copy,\n            onTrigger: () => this._copyContent(),\n            className: 'hover-copy-button',\n        }, this._hoverService));\n        this._container.appendChild(this._button.domNode);\n    }\n    async _copyContent() {\n        const content = this._getContent();\n        if (content) {\n            await this._clipboardService.writeText(content);\n            status(localize(1129, \"Copied to clipboard\"));\n        }\n    }\n};\nHoverCopyButton = __decorate([\n    __param(2, IClipboardService),\n    __param(3, IHoverService)\n], HoverCopyButton);\n\nexport { HoverCopyButton };\n","import { AsyncIterableProducer } from '../../../../base/common/async.js';\nimport { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { registerModelAndPositionCommand } from '../../../browser/editorExtensions.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\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 *--------------------------------------------------------------------------------------------*/\nclass HoverProviderResult {\n    constructor(provider, hover, ordinal) {\n        this.provider = provider;\n        this.hover = hover;\n        this.ordinal = ordinal;\n    }\n}\n/**\n * Does not throw or return a rejected promise (returns undefined instead).\n */\nasync function executeProvider(provider, ordinal, model, position, token) {\n    const result = await Promise\n        .resolve(provider.provideHover(model, position, token))\n        .catch(onUnexpectedExternalError);\n    if (!result || !isValid(result)) {\n        return undefined;\n    }\n    return new HoverProviderResult(provider, result, ordinal);\n}\nfunction getHoverProviderResultsAsAsyncIterable(registry, model, position, token, recursive = false) {\n    const providers = registry.ordered(model, recursive);\n    const promises = providers.map((provider, index) => executeProvider(provider, index, model, position, token));\n    return AsyncIterableProducer.fromPromisesResolveOrder(promises).coalesce();\n}\nasync function getHoversPromise(registry, model, position, token, recursive = false) {\n    const out = [];\n    for await (const item of getHoverProviderResultsAsAsyncIterable(registry, model, position, token, recursive)) {\n        out.push(item.hover);\n    }\n    return out;\n}\nregisterModelAndPositionCommand('_executeHoverProvider', (accessor, model, position) => {\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    return getHoversPromise(languageFeaturesService.hoverProvider, model, position, CancellationToken.None);\n});\nregisterModelAndPositionCommand('_executeHoverProvider_recursive', (accessor, model, position) => {\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    return getHoversPromise(languageFeaturesService.hoverProvider, model, position, CancellationToken.None, true);\n});\nfunction isValid(result) {\n    const hasRange = (typeof result.range !== 'undefined');\n    const hasHtmlContent = typeof result.contents !== 'undefined' && result.contents && result.contents.length > 0;\n    return hasRange && hasHtmlContent;\n}\n\nexport { HoverProviderResult, getHoverProviderResultsAsAsyncIterable, getHoversPromise };\n","import { $ as $$1, append } from '../../../../base/browser/dom.js';\nimport { asArray, compareBy, numberComparator } from '../../../../base/common/arrays.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { MarkdownString, isEmptyMarkdownString } from '../../../../base/common/htmlContent.js';\nimport { DisposableStore, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { IMarkdownRendererService } from '../../../../platform/markdown/browser/markdownRenderer.js';\nimport { INCREASE_HOVER_VERBOSITY_ACTION_ID, DECREASE_HOVER_VERBOSITY_ACTION_ID } from './hoverActionIds.js';\nimport { Range } from '../../../common/core/range.js';\nimport { RenderedHoverParts } from './hoverTypes.js';\nimport { localize } from '../../../../nls.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { HoverVerbosityAction } from '../../../common/languages.js';\nimport { registerIcon } from '../../../../platform/theme/common/iconRegistry.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\nimport { onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { ClickAction, KeyDownAction } from '../../../../base/browser/ui/hover/hoverWidget.js';\nimport { IHoverService, WorkbenchHoverDelegate } from '../../../../platform/hover/browser/hover.js';\nimport { AsyncIterableProducer } from '../../../../base/common/async.js';\nimport { getHoverProviderResultsAsAsyncIterable } from './getHover.js';\nimport { ICommandService } from '../../../../platform/commands/common/commands.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst $ = $$1;\nconst increaseHoverVerbosityIcon = registerIcon('hover-increase-verbosity', Codicon.add, localize(1130, 'Icon for increaseing hover verbosity.'));\nconst decreaseHoverVerbosityIcon = registerIcon('hover-decrease-verbosity', Codicon.remove, localize(1131, 'Icon for decreasing hover verbosity.'));\nclass MarkdownHover {\n    constructor(owner, range, contents, isBeforeContent, ordinal, source = undefined) {\n        this.owner = owner;\n        this.range = range;\n        this.contents = contents;\n        this.isBeforeContent = isBeforeContent;\n        this.ordinal = ordinal;\n        this.source = source;\n    }\n    isValidForHoverAnchor(anchor) {\n        return (anchor.type === 1 /* HoverAnchorType.Range */\n            && this.range.startColumn <= anchor.range.startColumn\n            && this.range.endColumn >= anchor.range.endColumn);\n    }\n}\nclass HoverSource {\n    constructor(hover, hoverProvider, hoverPosition) {\n        this.hover = hover;\n        this.hoverProvider = hoverProvider;\n        this.hoverPosition = hoverPosition;\n    }\n    supportsVerbosityAction(hoverVerbosityAction) {\n        switch (hoverVerbosityAction) {\n            case HoverVerbosityAction.Increase:\n                return this.hover.canIncreaseVerbosity ?? false;\n            case HoverVerbosityAction.Decrease:\n                return this.hover.canDecreaseVerbosity ?? false;\n        }\n    }\n}\nlet MarkdownHoverParticipant = class MarkdownHoverParticipant {\n    constructor(_editor, _markdownRendererService, _configurationService, _languageFeaturesService, _keybindingService, _hoverService, _commandService) {\n        this._editor = _editor;\n        this._markdownRendererService = _markdownRendererService;\n        this._configurationService = _configurationService;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._keybindingService = _keybindingService;\n        this._hoverService = _hoverService;\n        this._commandService = _commandService;\n        this.hoverOrdinal = 3;\n    }\n    createLoadingMessage(anchor) {\n        return new MarkdownHover(this, anchor.range, [new MarkdownString().appendText(localize(1132, \"Loading...\"))], false, 2000);\n    }\n    computeSync(anchor, lineDecorations) {\n        if (!this._editor.hasModel() || anchor.type !== 1 /* HoverAnchorType.Range */) {\n            return [];\n        }\n        const model = this._editor.getModel();\n        const lineNumber = anchor.range.startLineNumber;\n        const maxColumn = model.getLineMaxColumn(lineNumber);\n        const result = [];\n        let index = 1000;\n        const lineLength = model.getLineLength(lineNumber);\n        const languageId = model.getLanguageIdAtPosition(anchor.range.startLineNumber, anchor.range.startColumn);\n        const stopRenderingLineAfter = this._editor.getOption(133 /* EditorOption.stopRenderingLineAfter */);\n        const maxTokenizationLineLength = this._configurationService.getValue('editor.maxTokenizationLineLength', {\n            overrideIdentifier: languageId\n        });\n        let stopRenderingMessage = false;\n        if (stopRenderingLineAfter >= 0 && lineLength > stopRenderingLineAfter && anchor.range.startColumn >= stopRenderingLineAfter) {\n            stopRenderingMessage = true;\n            result.push(new MarkdownHover(this, anchor.range, [{\n                    value: localize(1133, \"Rendering paused for long line for performance reasons. This can be configured via `editor.stopRenderingLineAfter`.\")\n                }], false, index++));\n        }\n        if (!stopRenderingMessage && typeof maxTokenizationLineLength === 'number' && lineLength >= maxTokenizationLineLength) {\n            result.push(new MarkdownHover(this, anchor.range, [{\n                    value: localize(1134, \"Tokenization is skipped for long lines for performance reasons. This can be configured via `editor.maxTokenizationLineLength`.\")\n                }], false, index++));\n        }\n        let isBeforeContent = false;\n        for (const d of lineDecorations) {\n            const startColumn = (d.range.startLineNumber === lineNumber) ? d.range.startColumn : 1;\n            const endColumn = (d.range.endLineNumber === lineNumber) ? d.range.endColumn : maxColumn;\n            const hoverMessage = d.options.hoverMessage;\n            if (!hoverMessage || isEmptyMarkdownString(hoverMessage)) {\n                continue;\n            }\n            if (d.options.beforeContentClassName) {\n                isBeforeContent = true;\n            }\n            const range = new Range(anchor.range.startLineNumber, startColumn, anchor.range.startLineNumber, endColumn);\n            result.push(new MarkdownHover(this, range, asArray(hoverMessage), isBeforeContent, index++));\n        }\n        return result;\n    }\n    computeAsync(anchor, lineDecorations, source, token) {\n        if (!this._editor.hasModel() || anchor.type !== 1 /* HoverAnchorType.Range */) {\n            return AsyncIterableProducer.EMPTY;\n        }\n        const model = this._editor.getModel();\n        const hoverProviderRegistry = this._languageFeaturesService.hoverProvider;\n        if (!hoverProviderRegistry.has(model)) {\n            return AsyncIterableProducer.EMPTY;\n        }\n        return this._getMarkdownHovers(hoverProviderRegistry, model, anchor, token);\n    }\n    async *_getMarkdownHovers(hoverProviderRegistry, model, anchor, token) {\n        const position = anchor.range.getStartPosition();\n        const hoverProviderResults = getHoverProviderResultsAsAsyncIterable(hoverProviderRegistry, model, position, token);\n        for await (const item of hoverProviderResults) {\n            if (!isEmptyMarkdownString(item.hover.contents)) {\n                const range = item.hover.range ? Range.lift(item.hover.range) : anchor.range;\n                const hoverSource = new HoverSource(item.hover, item.provider, position);\n                yield new MarkdownHover(this, range, item.hover.contents, false, item.ordinal, hoverSource);\n            }\n        }\n    }\n    renderHoverParts(context, hoverParts) {\n        this._renderedHoverParts = new MarkdownRenderedHoverParts(hoverParts, context.fragment, this, this._editor, this._commandService, this._keybindingService, this._hoverService, this._configurationService, this._markdownRendererService, context.onContentsChanged);\n        return this._renderedHoverParts;\n    }\n    handleScroll(e) {\n        this._renderedHoverParts?.handleScroll(e);\n    }\n    getAccessibleContent(hoverPart) {\n        return this._renderedHoverParts?.getAccessibleContent(hoverPart) ?? '';\n    }\n    updateMarkdownHoverVerbosityLevel(action, index) {\n        return Promise.resolve(this._renderedHoverParts?.updateMarkdownHoverPartVerbosityLevel(action, index));\n    }\n};\nMarkdownHoverParticipant = __decorate([\n    __param(1, IMarkdownRendererService),\n    __param(2, IConfigurationService),\n    __param(3, ILanguageFeaturesService),\n    __param(4, IKeybindingService),\n    __param(5, IHoverService),\n    __param(6, ICommandService)\n], MarkdownHoverParticipant);\nclass RenderedMarkdownHoverPart {\n    constructor(hoverPart, hoverElement, disposables, actionsContainer) {\n        this.hoverPart = hoverPart;\n        this.hoverElement = hoverElement;\n        this.disposables = disposables;\n        this.actionsContainer = actionsContainer;\n    }\n    dispose() {\n        this.disposables.dispose();\n    }\n}\nclass MarkdownRenderedHoverParts {\n    constructor(hoverParts, hoverPartsContainer, _hoverParticipant, _editor, _commandService, _keybindingService, _hoverService, _configurationService, _markdownRendererService, _onFinishedRendering) {\n        this._hoverParticipant = _hoverParticipant;\n        this._editor = _editor;\n        this._commandService = _commandService;\n        this._keybindingService = _keybindingService;\n        this._hoverService = _hoverService;\n        this._configurationService = _configurationService;\n        this._markdownRendererService = _markdownRendererService;\n        this._onFinishedRendering = _onFinishedRendering;\n        this._ongoingHoverOperations = new Map();\n        this._disposables = new DisposableStore();\n        this.renderedHoverParts = this._renderHoverParts(hoverParts, hoverPartsContainer, this._onFinishedRendering);\n        this._disposables.add(toDisposable(() => {\n            this.renderedHoverParts.forEach(renderedHoverPart => {\n                renderedHoverPart.dispose();\n            });\n            this._ongoingHoverOperations.forEach(operation => {\n                operation.tokenSource.dispose(true);\n            });\n        }));\n    }\n    _renderHoverParts(hoverParts, hoverPartsContainer, onFinishedRendering) {\n        hoverParts.sort(compareBy(hover => hover.ordinal, numberComparator));\n        return hoverParts.map(hoverPart => {\n            const renderedHoverPart = this._renderHoverPart(hoverPart, onFinishedRendering);\n            hoverPartsContainer.appendChild(renderedHoverPart.hoverElement);\n            return renderedHoverPart;\n        });\n    }\n    _renderHoverPart(hoverPart, onFinishedRendering) {\n        const renderedMarkdownPart = this._renderMarkdownHover(hoverPart, onFinishedRendering);\n        const renderedMarkdownElement = renderedMarkdownPart.hoverElement;\n        const hoverSource = hoverPart.source;\n        const disposables = new DisposableStore();\n        disposables.add(renderedMarkdownPart);\n        if (!hoverSource) {\n            return new RenderedMarkdownHoverPart(hoverPart, renderedMarkdownElement, disposables);\n        }\n        const canIncreaseVerbosity = hoverSource.supportsVerbosityAction(HoverVerbosityAction.Increase);\n        const canDecreaseVerbosity = hoverSource.supportsVerbosityAction(HoverVerbosityAction.Decrease);\n        if (!canIncreaseVerbosity && !canDecreaseVerbosity) {\n            return new RenderedMarkdownHoverPart(hoverPart, renderedMarkdownElement, disposables);\n        }\n        const actionsContainer = $('div.verbosity-actions');\n        renderedMarkdownElement.prepend(actionsContainer);\n        const actionsContainerInner = $('div.verbosity-actions-inner');\n        actionsContainer.append(actionsContainerInner);\n        disposables.add(this._renderHoverExpansionAction(actionsContainerInner, HoverVerbosityAction.Increase, canIncreaseVerbosity));\n        disposables.add(this._renderHoverExpansionAction(actionsContainerInner, HoverVerbosityAction.Decrease, canDecreaseVerbosity));\n        return new RenderedMarkdownHoverPart(hoverPart, renderedMarkdownElement, disposables, actionsContainerInner);\n    }\n    _renderMarkdownHover(markdownHover, onFinishedRendering) {\n        const renderedMarkdownHover = renderMarkdown(this._editor, markdownHover, this._markdownRendererService, onFinishedRendering);\n        return renderedMarkdownHover;\n    }\n    _renderHoverExpansionAction(container, action, actionEnabled) {\n        const store = new DisposableStore();\n        const isActionIncrease = action === HoverVerbosityAction.Increase;\n        const actionElement = append(container, $(ThemeIcon.asCSSSelector(isActionIncrease ? increaseHoverVerbosityIcon : decreaseHoverVerbosityIcon)));\n        actionElement.tabIndex = 0;\n        const hoverDelegate = new WorkbenchHoverDelegate('mouse', undefined, { target: container, position: { hoverPosition: 0 /* HoverPosition.LEFT */ } }, this._configurationService, this._hoverService);\n        store.add(this._hoverService.setupManagedHover(hoverDelegate, actionElement, labelForHoverVerbosityAction(this._keybindingService, action)));\n        if (!actionEnabled) {\n            actionElement.classList.add('disabled');\n            return store;\n        }\n        actionElement.classList.add('enabled');\n        const actionFunction = () => this._commandService.executeCommand(action === HoverVerbosityAction.Increase ? INCREASE_HOVER_VERBOSITY_ACTION_ID : DECREASE_HOVER_VERBOSITY_ACTION_ID, { focus: true });\n        store.add(new ClickAction(actionElement, actionFunction));\n        store.add(new KeyDownAction(actionElement, actionFunction, [3 /* KeyCode.Enter */, 10 /* KeyCode.Space */]));\n        return store;\n    }\n    handleScroll(e) {\n        this.renderedHoverParts.forEach(renderedHoverPart => {\n            const actionsContainerInner = renderedHoverPart.actionsContainer;\n            if (!actionsContainerInner) {\n                return;\n            }\n            const hoverElement = renderedHoverPart.hoverElement;\n            const topOfHoverScrollPosition = e.scrollTop;\n            const bottomOfHoverScrollPosition = topOfHoverScrollPosition + e.height;\n            const topOfRenderedPart = hoverElement.offsetTop;\n            const hoverElementHeight = hoverElement.clientHeight;\n            const bottomOfRenderedPart = topOfRenderedPart + hoverElementHeight;\n            const iconsHeight = 22;\n            let top;\n            if (bottomOfRenderedPart <= bottomOfHoverScrollPosition || topOfRenderedPart >= bottomOfHoverScrollPosition) {\n                top = hoverElementHeight - iconsHeight;\n            }\n            else {\n                top = bottomOfHoverScrollPosition - topOfRenderedPart - iconsHeight;\n            }\n            actionsContainerInner.style.top = `${top}px`;\n        });\n    }\n    async updateMarkdownHoverPartVerbosityLevel(action, index) {\n        const model = this._editor.getModel();\n        if (!model) {\n            return undefined;\n        }\n        const hoverRenderedPart = this._getRenderedHoverPartAtIndex(index);\n        const hoverSource = hoverRenderedPart?.hoverPart.source;\n        if (!hoverRenderedPart || !hoverSource?.supportsVerbosityAction(action)) {\n            return undefined;\n        }\n        const newHover = await this._fetchHover(hoverSource, model, action);\n        if (!newHover) {\n            return undefined;\n        }\n        const newHoverSource = new HoverSource(newHover, hoverSource.hoverProvider, hoverSource.hoverPosition);\n        const initialHoverPart = hoverRenderedPart.hoverPart;\n        const newHoverPart = new MarkdownHover(this._hoverParticipant, initialHoverPart.range, newHover.contents, initialHoverPart.isBeforeContent, initialHoverPart.ordinal, newHoverSource);\n        const newHoverRenderedPart = this._updateRenderedHoverPart(index, newHoverPart);\n        if (!newHoverRenderedPart) {\n            return undefined;\n        }\n        return {\n            hoverPart: newHoverPart,\n            hoverElement: newHoverRenderedPart.hoverElement\n        };\n    }\n    getAccessibleContent(hoverPart) {\n        const renderedHoverPartIndex = this.renderedHoverParts.findIndex(renderedHoverPart => renderedHoverPart.hoverPart === hoverPart);\n        if (renderedHoverPartIndex === -1) {\n            return undefined;\n        }\n        const renderedHoverPart = this._getRenderedHoverPartAtIndex(renderedHoverPartIndex);\n        if (!renderedHoverPart) {\n            return undefined;\n        }\n        const hoverElementInnerText = renderedHoverPart.hoverElement.innerText;\n        const accessibleContent = hoverElementInnerText.replace(/[^\\S\\n\\r]+/gu, ' ');\n        return accessibleContent;\n    }\n    async _fetchHover(hoverSource, model, action) {\n        let verbosityDelta = action === HoverVerbosityAction.Increase ? 1 : -1;\n        const provider = hoverSource.hoverProvider;\n        const ongoingHoverOperation = this._ongoingHoverOperations.get(provider);\n        if (ongoingHoverOperation) {\n            ongoingHoverOperation.tokenSource.cancel();\n            verbosityDelta += ongoingHoverOperation.verbosityDelta;\n        }\n        const tokenSource = new CancellationTokenSource();\n        this._ongoingHoverOperations.set(provider, { verbosityDelta, tokenSource });\n        const context = { verbosityRequest: { verbosityDelta, previousHover: hoverSource.hover } };\n        let hover;\n        try {\n            hover = await Promise.resolve(provider.provideHover(model, hoverSource.hoverPosition, tokenSource.token, context));\n        }\n        catch (e) {\n            onUnexpectedExternalError(e);\n        }\n        tokenSource.dispose();\n        this._ongoingHoverOperations.delete(provider);\n        return hover;\n    }\n    _updateRenderedHoverPart(index, hoverPart) {\n        if (index >= this.renderedHoverParts.length || index < 0) {\n            return undefined;\n        }\n        const renderedHoverPart = this._renderHoverPart(hoverPart, this._onFinishedRendering);\n        const currentRenderedHoverPart = this.renderedHoverParts[index];\n        const currentRenderedMarkdown = currentRenderedHoverPart.hoverElement;\n        const renderedMarkdown = renderedHoverPart.hoverElement;\n        const renderedChildrenElements = Array.from(renderedMarkdown.children);\n        currentRenderedMarkdown.replaceChildren(...renderedChildrenElements);\n        const newRenderedHoverPart = new RenderedMarkdownHoverPart(hoverPart, currentRenderedMarkdown, renderedHoverPart.disposables, renderedHoverPart.actionsContainer);\n        currentRenderedHoverPart.dispose();\n        this.renderedHoverParts[index] = newRenderedHoverPart;\n        return newRenderedHoverPart;\n    }\n    _getRenderedHoverPartAtIndex(index) {\n        return this.renderedHoverParts[index];\n    }\n    dispose() {\n        this._disposables.dispose();\n    }\n}\nfunction renderMarkdownHovers(context, markdownHovers, editor, markdownRendererService) {\n    // Sort hover parts to keep them stable since they might come in async, out-of-order\n    markdownHovers.sort(compareBy(hover => hover.ordinal, numberComparator));\n    const renderedHoverParts = [];\n    for (const markdownHover of markdownHovers) {\n        const renderedHoverPart = renderMarkdown(editor, markdownHover, markdownRendererService, context.onContentsChanged);\n        context.fragment.appendChild(renderedHoverPart.hoverElement);\n        renderedHoverParts.push(renderedHoverPart);\n    }\n    return new RenderedHoverParts(renderedHoverParts);\n}\nfunction renderMarkdown(editor, markdownHover, markdownRendererService, onFinishedRendering) {\n    const disposables = new DisposableStore();\n    const renderedMarkdown = $('div.hover-row');\n    const renderedMarkdownContents = $('div.hover-row-contents');\n    renderedMarkdown.appendChild(renderedMarkdownContents);\n    const markdownStrings = markdownHover.contents;\n    for (const markdownString of markdownStrings) {\n        if (isEmptyMarkdownString(markdownString)) {\n            continue;\n        }\n        const markdownHoverElement = $('div.markdown-hover');\n        const hoverContentsElement = append(markdownHoverElement, $('div.hover-contents'));\n        const renderedContents = disposables.add(markdownRendererService.render(markdownString, {\n            context: editor,\n            asyncRenderCallback: () => {\n                hoverContentsElement.className = 'hover-contents code-hover-contents';\n                onFinishedRendering();\n            }\n        }));\n        hoverContentsElement.appendChild(renderedContents.element);\n        renderedMarkdownContents.appendChild(markdownHoverElement);\n    }\n    const renderedHoverPart = {\n        hoverPart: markdownHover,\n        hoverElement: renderedMarkdown,\n        dispose() { disposables.dispose(); }\n    };\n    return renderedHoverPart;\n}\nfunction labelForHoverVerbosityAction(keybindingService, action) {\n    switch (action) {\n        case HoverVerbosityAction.Increase: {\n            const kb = keybindingService.lookupKeybinding(INCREASE_HOVER_VERBOSITY_ACTION_ID);\n            return kb ?\n                localize(1135, \"Increase Hover Verbosity ({0})\", kb.getLabel()) :\n                localize(1136, \"Increase Hover Verbosity\");\n        }\n        case HoverVerbosityAction.Decrease: {\n            const kb = keybindingService.lookupKeybinding(DECREASE_HOVER_VERBOSITY_ACTION_ID);\n            return kb ?\n                localize(1137, \"Decrease Hover Verbosity ({0})\", kb.getLabel()) :\n                localize(1138, \"Decrease Hover Verbosity\");\n        }\n    }\n}\n\nexport { MarkdownHover, MarkdownHoverParticipant, labelForHoverVerbosityAction, renderMarkdownHovers };\n","import '../colorPicker.css';\nimport { $ as $$1, append, addDisposableListener, EventType, getDomNodePagePosition } from '../../../../../base/browser/dom.js';\nimport { GlobalPointerMoveMonitor } from '../../../../../base/browser/globalPointerMoveMonitor.js';\nimport { Color, HSVA } from '../../../../../base/common/color.js';\nimport { Emitter } from '../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nconst $ = $$1;\nclass SaturationBox extends Disposable {\n    constructor(container, model, pixelRatio) {\n        super();\n        this.model = model;\n        this.pixelRatio = pixelRatio;\n        this._onDidChange = new Emitter();\n        this.onDidChange = this._onDidChange.event;\n        this._onColorFlushed = new Emitter();\n        this.onColorFlushed = this._onColorFlushed.event;\n        this._domNode = $('.saturation-wrap');\n        append(container, this._domNode);\n        // Create canvas, draw selected color\n        this._canvas = document.createElement('canvas');\n        this._canvas.className = 'saturation-box';\n        append(this._domNode, this._canvas);\n        // Add selection circle\n        this.selection = $('.saturation-selection');\n        append(this._domNode, this.selection);\n        this.layout();\n        this._register(addDisposableListener(this._domNode, EventType.POINTER_DOWN, e => this.onPointerDown(e)));\n        this._register(this.model.onDidChangeColor(this.onDidChangeColor, this));\n        this.monitor = null;\n    }\n    get domNode() {\n        return this._domNode;\n    }\n    onPointerDown(e) {\n        if (!e.target || !(e.target instanceof Element)) {\n            return;\n        }\n        this.monitor = this._register(new GlobalPointerMoveMonitor());\n        const origin = getDomNodePagePosition(this._domNode);\n        if (e.target !== this.selection) {\n            this.onDidChangePosition(e.offsetX, e.offsetY);\n        }\n        this.monitor.startMonitoring(e.target, e.pointerId, e.buttons, event => this.onDidChangePosition(event.pageX - origin.left, event.pageY - origin.top), () => null);\n        const pointerUpListener = addDisposableListener(e.target.ownerDocument, EventType.POINTER_UP, () => {\n            this._onColorFlushed.fire();\n            pointerUpListener.dispose();\n            if (this.monitor) {\n                this.monitor.stopMonitoring(true);\n                this.monitor = null;\n            }\n        }, true);\n    }\n    onDidChangePosition(left, top) {\n        const s = Math.max(0, Math.min(1, left / this.width));\n        const v = Math.max(0, Math.min(1, 1 - (top / this.height)));\n        this.paintSelection(s, v);\n        this._onDidChange.fire({ s, v });\n    }\n    layout() {\n        this.width = this._domNode.offsetWidth;\n        this.height = this._domNode.offsetHeight;\n        this._canvas.width = this.width * this.pixelRatio;\n        this._canvas.height = this.height * this.pixelRatio;\n        this.paint();\n        const hsva = this.model.color.hsva;\n        this.paintSelection(hsva.s, hsva.v);\n    }\n    paint() {\n        const hsva = this.model.color.hsva;\n        const saturatedColor = new Color(new HSVA(hsva.h, 1, 1, 1));\n        const ctx = this._canvas.getContext('2d');\n        const whiteGradient = ctx.createLinearGradient(0, 0, this._canvas.width, 0);\n        whiteGradient.addColorStop(0, 'rgba(255, 255, 255, 1)');\n        whiteGradient.addColorStop(0.5, 'rgba(255, 255, 255, 0.5)');\n        whiteGradient.addColorStop(1, 'rgba(255, 255, 255, 0)');\n        const blackGradient = ctx.createLinearGradient(0, 0, 0, this._canvas.height);\n        blackGradient.addColorStop(0, 'rgba(0, 0, 0, 0)');\n        blackGradient.addColorStop(1, 'rgba(0, 0, 0, 1)');\n        ctx.rect(0, 0, this._canvas.width, this._canvas.height);\n        ctx.fillStyle = Color.Format.CSS.format(saturatedColor);\n        ctx.fill();\n        ctx.fillStyle = whiteGradient;\n        ctx.fill();\n        ctx.fillStyle = blackGradient;\n        ctx.fill();\n    }\n    paintSelection(s, v) {\n        this.selection.style.left = `${s * this.width}px`;\n        this.selection.style.top = `${this.height - v * this.height}px`;\n    }\n    onDidChangeColor(color) {\n        if (this.monitor && this.monitor.isMonitoring()) {\n            return;\n        }\n        this.paint();\n        const hsva = color.hsva;\n        this.paintSelection(hsva.s, hsva.v);\n    }\n}\n\nexport { SaturationBox };\n","import '../colorPicker.css';\nimport { append, addDisposableListener, EventType } from '../../../../../base/browser/dom.js';\nimport { Emitter } from '../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass InsertButton extends Disposable {\n    constructor(container) {\n        super();\n        this._onClicked = this._register(new Emitter());\n        this.onClicked = this._onClicked.event;\n        this._button = append(container, document.createElement('button'));\n        this._button.classList.add('insert-button');\n        this._button.textContent = 'Insert';\n        this._register(addDisposableListener(this._button, EventType.CLICK, () => {\n            this._onClicked.fire();\n        }));\n    }\n    get button() {\n        return this._button;\n    }\n}\n\nexport { InsertButton };\n","import '../colorPicker.css';\nimport { append, $ as $$1, addDisposableListener, EventType, getDomNodePagePosition } from '../../../../../base/browser/dom.js';\nimport { GlobalPointerMoveMonitor } from '../../../../../base/browser/globalPointerMoveMonitor.js';\nimport { Color, RGBA } from '../../../../../base/common/color.js';\nimport { Emitter } from '../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nconst $ = $$1;\nclass Strip extends Disposable {\n    constructor(container, model, type) {\n        super();\n        this.model = model;\n        this._onDidChange = new Emitter();\n        this.onDidChange = this._onDidChange.event;\n        this._onColorFlushed = new Emitter();\n        this.onColorFlushed = this._onColorFlushed.event;\n        if (type === \"standalone\" /* ColorPickerWidgetType.Standalone */) {\n            this.domNode = append(container, $('.standalone-strip'));\n            this.overlay = append(this.domNode, $('.standalone-overlay'));\n        }\n        else {\n            this.domNode = append(container, $('.strip'));\n            this.overlay = append(this.domNode, $('.overlay'));\n        }\n        this.slider = append(this.domNode, $('.slider'));\n        this.slider.style.top = `0px`;\n        this._register(addDisposableListener(this.domNode, EventType.POINTER_DOWN, e => this.onPointerDown(e)));\n        this._register(model.onDidChangeColor(this.onDidChangeColor, this));\n        this.layout();\n    }\n    layout() {\n        this.height = this.domNode.offsetHeight - this.slider.offsetHeight;\n        const value = this.getValue(this.model.color);\n        this.updateSliderPosition(value);\n    }\n    onDidChangeColor(color) {\n        const value = this.getValue(color);\n        this.updateSliderPosition(value);\n    }\n    onPointerDown(e) {\n        if (!e.target || !(e.target instanceof Element)) {\n            return;\n        }\n        const monitor = this._register(new GlobalPointerMoveMonitor());\n        const origin = getDomNodePagePosition(this.domNode);\n        this.domNode.classList.add('grabbing');\n        if (e.target !== this.slider) {\n            this.onDidChangeTop(e.offsetY);\n        }\n        monitor.startMonitoring(e.target, e.pointerId, e.buttons, event => this.onDidChangeTop(event.pageY - origin.top), () => null);\n        const pointerUpListener = addDisposableListener(e.target.ownerDocument, EventType.POINTER_UP, () => {\n            this._onColorFlushed.fire();\n            pointerUpListener.dispose();\n            monitor.stopMonitoring(true);\n            this.domNode.classList.remove('grabbing');\n        }, true);\n    }\n    onDidChangeTop(top) {\n        const value = Math.max(0, Math.min(1, 1 - (top / this.height)));\n        this.updateSliderPosition(value);\n        this._onDidChange.fire(value);\n    }\n    updateSliderPosition(value) {\n        this.slider.style.top = `${(1 - value) * this.height}px`;\n    }\n}\nclass OpacityStrip extends Strip {\n    constructor(container, model, type) {\n        super(container, model, type);\n        this.domNode.classList.add('opacity-strip');\n        this.onDidChangeColor(this.model.color);\n    }\n    onDidChangeColor(color) {\n        super.onDidChangeColor(color);\n        const { r, g, b } = color.rgba;\n        const opaque = new Color(new RGBA(r, g, b, 1));\n        const transparent = new Color(new RGBA(r, g, b, 0));\n        this.overlay.style.background = `linear-gradient(to bottom, ${opaque} 0%, ${transparent} 100%)`;\n    }\n    getValue(color) {\n        return color.hsva.a;\n    }\n}\nclass HueStrip extends Strip {\n    constructor(container, model, type) {\n        super(container, model, type);\n        this.domNode.classList.add('hue-strip');\n    }\n    getValue(color) {\n        return 1 - (color.hsva.h / 360);\n    }\n}\n\nexport { HueStrip, OpacityStrip, Strip };\n","import '../colorPicker.css';\nimport { $ as $$1, append } from '../../../../../base/browser/dom.js';\nimport { Color, HSVA } from '../../../../../base/common/color.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport { SaturationBox } from './colorPickerSaturationBox.js';\nimport { InsertButton } from './colorPickerInsertButton.js';\nimport { OpacityStrip, HueStrip } from './colorPickerStrip.js';\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 *--------------------------------------------------------------------------------------------*/\nconst $ = $$1;\nclass ColorPickerBody extends Disposable {\n    constructor(container, model, pixelRatio, type) {\n        super();\n        this.model = model;\n        this.pixelRatio = pixelRatio;\n        this._insertButton = null;\n        this._domNode = $('.colorpicker-body');\n        append(container, this._domNode);\n        this._saturationBox = new SaturationBox(this._domNode, this.model, this.pixelRatio);\n        this._register(this._saturationBox);\n        this._register(this._saturationBox.onDidChange(this.onDidSaturationValueChange, this));\n        this._register(this._saturationBox.onColorFlushed(this.flushColor, this));\n        this._opacityStrip = new OpacityStrip(this._domNode, this.model, type);\n        this._register(this._opacityStrip);\n        this._register(this._opacityStrip.onDidChange(this.onDidOpacityChange, this));\n        this._register(this._opacityStrip.onColorFlushed(this.flushColor, this));\n        this._hueStrip = new HueStrip(this._domNode, this.model, type);\n        this._register(this._hueStrip);\n        this._register(this._hueStrip.onDidChange(this.onDidHueChange, this));\n        this._register(this._hueStrip.onColorFlushed(this.flushColor, this));\n        if (type === \"standalone\" /* ColorPickerWidgetType.Standalone */) {\n            this._insertButton = this._register(new InsertButton(this._domNode));\n            this._domNode.classList.add('standalone-colorpicker');\n        }\n    }\n    flushColor() {\n        this.model.flushColor();\n    }\n    onDidSaturationValueChange({ s, v }) {\n        const hsva = this.model.color.hsva;\n        this.model.color = new Color(new HSVA(hsva.h, s, v, hsva.a));\n    }\n    onDidOpacityChange(a) {\n        const hsva = this.model.color.hsva;\n        this.model.color = new Color(new HSVA(hsva.h, hsva.s, hsva.v, a));\n    }\n    onDidHueChange(value) {\n        const hsva = this.model.color.hsva;\n        const h = (1 - value) * 360;\n        this.model.color = new Color(new HSVA(h === 360 ? 0 : h, hsva.s, hsva.v, hsva.a));\n    }\n    get domNode() {\n        return this._domNode;\n    }\n    get saturationBox() {\n        return this._saturationBox;\n    }\n    get enterButton() {\n        return this._insertButton;\n    }\n    layout() {\n        this._saturationBox.layout();\n        this._opacityStrip.layout();\n        this._hueStrip.layout();\n    }\n}\n\nexport { ColorPickerBody };\n","import '../colorPicker.css';\nimport { append, $ as $$1, addDisposableListener, EventType } from '../../../../../base/browser/dom.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport { localize } from '../../../../../nls.js';\nimport { Emitter } from '../../../../../base/common/event.js';\nimport { registerIcon } from '../../../../../platform/theme/common/iconRegistry.js';\nimport { ThemeIcon } from '../../../../../base/common/themables.js';\nimport { Codicon } from '../../../../../base/common/codicons.js';\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 *--------------------------------------------------------------------------------------------*/\nconst $ = $$1;\nclass CloseButton extends Disposable {\n    constructor(container) {\n        super();\n        this._onClicked = this._register(new Emitter());\n        this.onClicked = this._onClicked.event;\n        this._button = document.createElement('div');\n        this._button.classList.add('close-button');\n        append(container, this._button);\n        const innerDiv = document.createElement('div');\n        innerDiv.classList.add('close-button-inner-div');\n        append(this._button, innerDiv);\n        const closeButton = append(innerDiv, $('.button' + ThemeIcon.asCSSSelector(registerIcon('color-picker-close', Codicon.close, localize(885, 'Icon to close the color picker')))));\n        closeButton.classList.add('close-icon');\n        this._register(addDisposableListener(this._button, EventType.CLICK, () => {\n            this._onClicked.fire();\n        }));\n    }\n}\n\nexport { CloseButton };\n","import '../colorPicker.css';\nimport { $ as $$1, append, addDisposableListener, EventType } from '../../../../../base/browser/dom.js';\nimport { Color } from '../../../../../base/common/color.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport { localize } from '../../../../../nls.js';\nimport '../../../../../platform/theme/common/colorUtils.js';\nimport '../../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorHoverBackground } from '../../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../../platform/theme/common/colors/searchColors.js';\nimport { CloseButton } from './colorPickerCloseButton.js';\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 *--------------------------------------------------------------------------------------------*/\nconst $ = $$1;\nclass ColorPickerHeader extends Disposable {\n    constructor(container, model, themeService, type) {\n        super();\n        this.model = model;\n        this.type = type;\n        this._closeButton = null;\n        this._domNode = $('.colorpicker-header');\n        append(container, this._domNode);\n        this._pickedColorNode = append(this._domNode, $('.picked-color'));\n        append(this._pickedColorNode, $('span.codicon.codicon-color-mode'));\n        this._pickedColorPresentation = append(this._pickedColorNode, document.createElement('span'));\n        this._pickedColorPresentation.classList.add('picked-color-presentation');\n        const tooltip = localize(886, \"Click to toggle color options (rgb/hsl/hex)\");\n        this._pickedColorNode.setAttribute('title', tooltip);\n        this._originalColorNode = append(this._domNode, $('.original-color'));\n        this._originalColorNode.style.backgroundColor = Color.Format.CSS.format(this.model.originalColor) || '';\n        this.backgroundColor = themeService.getColorTheme().getColor(editorHoverBackground) || Color.white;\n        this._register(themeService.onDidColorThemeChange(theme => {\n            this.backgroundColor = theme.getColor(editorHoverBackground) || Color.white;\n        }));\n        this._register(addDisposableListener(this._pickedColorNode, EventType.CLICK, () => this.model.selectNextColorPresentation()));\n        this._register(addDisposableListener(this._originalColorNode, EventType.CLICK, () => {\n            this.model.color = this.model.originalColor;\n            this.model.flushColor();\n        }));\n        this._register(model.onDidChangeColor(this.onDidChangeColor, this));\n        this._register(model.onDidChangePresentation(this.onDidChangePresentation, this));\n        this._pickedColorNode.style.backgroundColor = Color.Format.CSS.format(model.color) || '';\n        this._pickedColorNode.classList.toggle('light', model.color.rgba.a < 0.5 ? this.backgroundColor.isLighter() : model.color.isLighter());\n        this.onDidChangeColor(this.model.color);\n        // When the color picker widget is a standalone color picker widget, then add a close button\n        if (this.type === \"standalone\" /* ColorPickerWidgetType.Standalone */) {\n            this._domNode.classList.add('standalone-colorpicker');\n            this._closeButton = this._register(new CloseButton(this._domNode));\n        }\n    }\n    get closeButton() {\n        return this._closeButton;\n    }\n    get pickedColorNode() {\n        return this._pickedColorNode;\n    }\n    get originalColorNode() {\n        return this._originalColorNode;\n    }\n    onDidChangeColor(color) {\n        this._pickedColorNode.style.backgroundColor = Color.Format.CSS.format(color) || '';\n        this._pickedColorNode.classList.toggle('light', color.rgba.a < 0.5 ? this.backgroundColor.isLighter() : color.isLighter());\n        this.onDidChangePresentation();\n    }\n    onDidChangePresentation() {\n        this._pickedColorPresentation.textContent = this.model.presentation ? this.model.presentation.label : '';\n    }\n}\n\nexport { ColorPickerHeader };\n","import './colorPicker.css';\nimport { PixelRatio } from '../../../../base/browser/pixelRatio.js';\nimport { getWindow, $ as $$1 } from '../../../../base/browser/dom.js';\nimport { Widget } from '../../../../base/browser/ui/widget.js';\nimport { ColorPickerBody } from './colorPickerParts/colorPickerBody.js';\nimport { ColorPickerHeader } from './colorPickerParts/colorPickerHeader.js';\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 *--------------------------------------------------------------------------------------------*/\nconst $ = $$1;\nclass ColorPickerWidget extends Widget {\n    constructor(container, model, pixelRatio, themeService, type) {\n        super();\n        this.model = model;\n        this.pixelRatio = pixelRatio;\n        this._register(PixelRatio.getInstance(getWindow(container)).onDidChange(() => this.layout()));\n        this._domNode = $('.colorpicker-widget');\n        container.appendChild(this._domNode);\n        this.header = this._register(new ColorPickerHeader(this._domNode, this.model, themeService, type));\n        this.body = this._register(new ColorPickerBody(this._domNode, this.model, this.pixelRatio, type));\n    }\n    layout() {\n        this.body.layout();\n    }\n    get domNode() {\n        return this._domNode;\n    }\n}\n\nexport { ColorPickerWidget };\n","import { Emitter } from '../../../../base/common/event.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ColorPickerModel {\n    get color() {\n        return this._color;\n    }\n    set color(color) {\n        if (this._color.equals(color)) {\n            return;\n        }\n        this._color = color;\n        this._onDidChangeColor.fire(color);\n    }\n    get presentation() { return this.colorPresentations[this.presentationIndex]; }\n    get colorPresentations() {\n        return this._colorPresentations;\n    }\n    set colorPresentations(colorPresentations) {\n        this._colorPresentations = colorPresentations;\n        if (this.presentationIndex > colorPresentations.length - 1) {\n            this.presentationIndex = 0;\n        }\n        this._onDidChangePresentation.fire(this.presentation);\n    }\n    constructor(color, availableColorPresentations, presentationIndex) {\n        this.presentationIndex = presentationIndex;\n        this._onColorFlushed = new Emitter();\n        this.onColorFlushed = this._onColorFlushed.event;\n        this._onDidChangeColor = new Emitter();\n        this.onDidChangeColor = this._onDidChangeColor.event;\n        this._onDidChangePresentation = new Emitter();\n        this.onDidChangePresentation = this._onDidChangePresentation.event;\n        this.originalColor = color;\n        this._color = color;\n        this._colorPresentations = availableColorPresentations;\n    }\n    selectNextColorPresentation() {\n        this.presentationIndex = (this.presentationIndex + 1) % this.colorPresentations.length;\n        this.flushColor();\n        this._onDidChangePresentation.fire(this.presentation);\n    }\n    guessColorPresentation(color, originalText) {\n        let presentationIndex = -1;\n        for (let i = 0; i < this.colorPresentations.length; i++) {\n            if (originalText.toLowerCase() === this.colorPresentations[i].label) {\n                presentationIndex = i;\n                break;\n            }\n        }\n        if (presentationIndex === -1) {\n            // check which color presentation text has same prefix as original text's prefix\n            const originalTextPrefix = originalText.split('(')[0].toLowerCase();\n            for (let i = 0; i < this.colorPresentations.length; i++) {\n                if (this.colorPresentations[i].label.toLowerCase().startsWith(originalTextPrefix)) {\n                    presentationIndex = i;\n                    break;\n                }\n            }\n        }\n        if (presentationIndex !== -1 && presentationIndex !== this.presentationIndex) {\n            this.presentationIndex = presentationIndex;\n            this._onDidChangePresentation.fire(this.presentation);\n        }\n    }\n    flushColor() {\n        this._onColorFlushed.fire(this._color);\n    }\n}\n\nexport { ColorPickerModel };\n","import { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { Color, RGBA } from '../../../../base/common/color.js';\nimport { getColorPresentations } from './color.js';\nimport { ColorPickerModel } from './colorPickerModel.js';\nimport { Range } from '../../../common/core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nasync function createColorHover(editorModel, colorInfo, provider) {\n    const originalText = editorModel.getValueInRange(colorInfo.range);\n    const { red, green, blue, alpha } = colorInfo.color;\n    const rgba = new RGBA(Math.round(red * 255), Math.round(green * 255), Math.round(blue * 255), alpha);\n    const color = new Color(rgba);\n    const colorPresentations = await getColorPresentations(editorModel, colorInfo, provider, CancellationToken.None);\n    const model = new ColorPickerModel(color, [], 0);\n    model.colorPresentations = colorPresentations || [];\n    model.guessColorPresentation(color, originalText);\n    return {\n        range: Range.lift(colorInfo.range),\n        model,\n        provider\n    };\n}\nfunction updateEditorModel(editor, range, model) {\n    const textEdits = [];\n    const edit = model.presentation.textEdit ?? { range, text: model.presentation.label, forceMoveMarkers: false };\n    textEdits.push(edit);\n    if (model.presentation.additionalTextEdits) {\n        textEdits.push(...model.presentation.additionalTextEdits);\n    }\n    const replaceRange = Range.lift(edit.range);\n    const trackedRange = editor.getModel()._setTrackedRange(null, replaceRange, 3 /* TrackedRangeStickiness.GrowsOnlyWhenTypingAfter */);\n    editor.executeEdits('colorpicker', textEdits);\n    editor.pushUndoStop();\n    return editor.getModel()._getTrackedRange(trackedRange) ?? replaceRange;\n}\nasync function updateColorPresentations(editorModel, colorPickerModel, color, range, colorHover) {\n    const colorPresentations = await getColorPresentations(editorModel, {\n        range: range,\n        color: {\n            red: color.rgba.r / 255,\n            green: color.rgba.g / 255,\n            blue: color.rgba.b / 255,\n            alpha: color.rgba.a\n        }\n    }, colorHover.provider, CancellationToken.None);\n    colorPickerModel.colorPresentations = colorPresentations || [];\n}\n\nexport { createColorHover, updateColorPresentations, updateEditorModel };\n","import { AsyncIterableProducer } from '../../../../../base/common/async.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { ColorDetector } from '../colorDetector.js';\nimport { ColorPickerWidget } from '../colorPickerWidget.js';\nimport { RenderedHoverParts } from '../../../hover/browser/hoverTypes.js';\nimport { IThemeService } from '../../../../../platform/theme/common/themeService.js';\nimport { localize } from '../../../../../nls.js';\nimport { createColorHover, updateColorPresentations, updateEditorModel } from '../colorPickerParticipantUtils.js';\nimport { Dimension } from '../../../../../base/browser/dom.js';\nimport { DisposableStore } from '../../../../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass ColorHover {\n    constructor(owner, range, model, provider) {\n        this.owner = owner;\n        this.range = range;\n        this.model = model;\n        this.provider = provider;\n        /**\n         * Force the hover to always be rendered at this specific range,\n         * even in the case of multiple hover parts.\n         */\n        this.forceShowAtRange = true;\n    }\n    isValidForHoverAnchor(anchor) {\n        return (anchor.type === 1 /* HoverAnchorType.Range */\n            && this.range.startColumn <= anchor.range.startColumn\n            && this.range.endColumn >= anchor.range.endColumn);\n    }\n    static fromBaseColor(owner, color) {\n        return new ColorHover(owner, color.range, color.model, color.provider);\n    }\n}\nlet HoverColorPickerParticipant = class HoverColorPickerParticipant {\n    constructor(_editor, _themeService) {\n        this._editor = _editor;\n        this._themeService = _themeService;\n        this.hoverOrdinal = 2;\n    }\n    computeSync(_anchor, _lineDecorations, source) {\n        return [];\n    }\n    computeAsync(anchor, lineDecorations, source, token) {\n        return AsyncIterableProducer.fromPromise(this._computeAsync(anchor, lineDecorations, source));\n    }\n    async _computeAsync(_anchor, lineDecorations, source) {\n        if (!this._editor.hasModel()) {\n            return [];\n        }\n        if (!this._isValidRequest(source)) {\n            return [];\n        }\n        const colorDetector = ColorDetector.get(this._editor);\n        if (!colorDetector) {\n            return [];\n        }\n        for (const d of lineDecorations) {\n            if (!colorDetector.isColorDecoration(d)) {\n                continue;\n            }\n            const colorData = colorDetector.getColorData(d.range.getStartPosition());\n            if (colorData) {\n                const colorHover = ColorHover.fromBaseColor(this, await createColorHover(this._editor.getModel(), colorData.colorInfo, colorData.provider));\n                return [colorHover];\n            }\n        }\n        return [];\n    }\n    _isValidRequest(source) {\n        const decoratorActivatedOn = this._editor.getOption(168 /* EditorOption.colorDecoratorsActivatedOn */);\n        switch (source) {\n            case 0 /* HoverStartSource.Mouse */:\n                return decoratorActivatedOn === 'hover' || decoratorActivatedOn === 'clickAndHover';\n            case 1 /* HoverStartSource.Click */:\n                return decoratorActivatedOn === 'click' || decoratorActivatedOn === 'clickAndHover';\n            case 2 /* HoverStartSource.Keyboard */:\n                return true;\n        }\n    }\n    renderHoverParts(context, hoverParts) {\n        const editor = this._editor;\n        if (hoverParts.length === 0 || !editor.hasModel()) {\n            return new RenderedHoverParts([]);\n        }\n        const minimumHeight = editor.getOption(75 /* EditorOption.lineHeight */) + 8;\n        context.setMinimumDimensions(new Dimension(302, minimumHeight));\n        const disposables = new DisposableStore();\n        const colorHover = hoverParts[0];\n        const editorModel = editor.getModel();\n        const model = colorHover.model;\n        this._colorPicker = disposables.add(new ColorPickerWidget(context.fragment, model, editor.getOption(163 /* EditorOption.pixelRatio */), this._themeService, \"hover\" /* ColorPickerWidgetType.Hover */));\n        let editorUpdatedByColorPicker = false;\n        let range = new Range(colorHover.range.startLineNumber, colorHover.range.startColumn, colorHover.range.endLineNumber, colorHover.range.endColumn);\n        disposables.add(model.onColorFlushed(async (color) => {\n            await updateColorPresentations(editorModel, model, color, range, colorHover);\n            editorUpdatedByColorPicker = true;\n            range = updateEditorModel(editor, range, model);\n        }));\n        disposables.add(model.onDidChangeColor((color) => {\n            updateColorPresentations(editorModel, model, color, range, colorHover);\n        }));\n        disposables.add(editor.onDidChangeModelContent((e) => {\n            if (editorUpdatedByColorPicker) {\n                editorUpdatedByColorPicker = false;\n            }\n            else {\n                context.hide();\n                editor.focus();\n            }\n        }));\n        const renderedHoverPart = {\n            hoverPart: ColorHover.fromBaseColor(this, colorHover),\n            hoverElement: this._colorPicker.domNode,\n            dispose() { disposables.dispose(); }\n        };\n        return new RenderedHoverParts([renderedHoverPart]);\n    }\n    getAccessibleContent(hoverPart) {\n        return localize(887, 'There is a color picker here.');\n    }\n    handleResize() {\n        this._colorPicker?.layout();\n    }\n    handleContentsChanged() {\n        this._colorPicker?.layout();\n    }\n    handleHide() {\n        this._colorPicker?.dispose();\n        this._colorPicker = undefined;\n    }\n    isColorPickerVisible() {\n        return !!this._colorPicker;\n    }\n};\nHoverColorPickerParticipant = __decorate([\n    __param(1, IThemeService)\n], HoverColorPickerParticipant);\n\nexport { ColorHover, HoverColorPickerParticipant };\n","import { Range } from './range.js';\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 *--------------------------------------------------------------------------------------------*/\nclass EditOperation {\n    static insert(position, text) {\n        return {\n            range: new Range(position.lineNumber, position.column, position.lineNumber, position.column),\n            text: text,\n            forceMoveMarkers: true\n        };\n    }\n    static delete(range) {\n        return {\n            range: range,\n            text: null\n        };\n    }\n    static replace(range, text) {\n        return {\n            range: range,\n            text: text\n        };\n    }\n    static replaceMove(range, text) {\n        return {\n            range: range,\n            text: text,\n            forceMoveMarkers: true\n        };\n    }\n}\n\nexport { EditOperation };\n","import { Emitter } from '../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport { isMacintosh } from '../../../../../base/common/platform.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction hasModifier(e, modifier) {\n    return !!e[modifier];\n}\n/**\n * An event that encapsulates the various trigger modifiers logic needed for go to definition.\n */\nclass ClickLinkMouseEvent {\n    constructor(source, opts) {\n        this.target = source.target;\n        this.isLeftClick = source.event.leftButton;\n        this.isMiddleClick = source.event.middleButton;\n        this.isRightClick = source.event.rightButton;\n        this.mouseMiddleClickAction = opts.mouseMiddleClickAction;\n        this.hasTriggerModifier = hasModifier(source.event, opts.triggerModifier);\n        if (this.isMiddleClick && opts.mouseMiddleClickAction === 'ctrlLeftClick') {\n            // Redirect middle click to left click with modifier\n            this.isMiddleClick = false;\n            this.isLeftClick = true;\n            this.hasTriggerModifier = true;\n        }\n        this.hasSideBySideModifier = hasModifier(source.event, opts.triggerSideBySideModifier);\n        this.isNoneOrSingleMouseDown = (source.event.detail <= 1);\n    }\n}\n/**\n * An event that encapsulates the various trigger modifiers logic needed for go to definition.\n */\nclass ClickLinkKeyboardEvent {\n    constructor(source, opts) {\n        this.keyCodeIsTriggerKey = (source.keyCode === opts.triggerKey);\n        this.keyCodeIsSideBySideKey = (source.keyCode === opts.triggerSideBySideKey);\n        this.hasTriggerModifier = hasModifier(source, opts.triggerModifier);\n    }\n}\nclass ClickLinkOptions {\n    constructor(triggerKey, triggerModifier, triggerSideBySideKey, triggerSideBySideModifier, mouseMiddleClickAction) {\n        this.mouseMiddleClickAction = mouseMiddleClickAction;\n        this.triggerKey = triggerKey;\n        this.triggerModifier = triggerModifier;\n        this.triggerSideBySideKey = triggerSideBySideKey;\n        this.triggerSideBySideModifier = triggerSideBySideModifier;\n    }\n    equals(other) {\n        return (this.triggerKey === other.triggerKey\n            && this.triggerModifier === other.triggerModifier\n            && this.triggerSideBySideKey === other.triggerSideBySideKey\n            && this.triggerSideBySideModifier === other.triggerSideBySideModifier\n            && this.mouseMiddleClickAction === other.mouseMiddleClickAction);\n    }\n}\nfunction createOptions(multiCursorModifier, mouseMiddleClickAction) {\n    if (multiCursorModifier === 'altKey') {\n        if (isMacintosh) {\n            return new ClickLinkOptions(57 /* KeyCode.Meta */, 'metaKey', 6 /* KeyCode.Alt */, 'altKey', mouseMiddleClickAction);\n        }\n        return new ClickLinkOptions(5 /* KeyCode.Ctrl */, 'ctrlKey', 6 /* KeyCode.Alt */, 'altKey', mouseMiddleClickAction);\n    }\n    if (isMacintosh) {\n        return new ClickLinkOptions(6 /* KeyCode.Alt */, 'altKey', 57 /* KeyCode.Meta */, 'metaKey', mouseMiddleClickAction);\n    }\n    return new ClickLinkOptions(6 /* KeyCode.Alt */, 'altKey', 5 /* KeyCode.Ctrl */, 'ctrlKey', mouseMiddleClickAction);\n}\nclass ClickLinkGesture extends Disposable {\n    constructor(editor, opts) {\n        super();\n        this._onMouseMoveOrRelevantKeyDown = this._register(new Emitter());\n        this.onMouseMoveOrRelevantKeyDown = this._onMouseMoveOrRelevantKeyDown.event;\n        this._onExecute = this._register(new Emitter());\n        this.onExecute = this._onExecute.event;\n        this._onCancel = this._register(new Emitter());\n        this.onCancel = this._onCancel.event;\n        this._editor = editor;\n        this._extractLineNumberFromMouseEvent = opts?.extractLineNumberFromMouseEvent ?? ((e) => e.target.position ? e.target.position.lineNumber : 0);\n        this._opts = createOptions(this._editor.getOption(86 /* EditorOption.multiCursorModifier */), this._editor.getOption(87 /* EditorOption.mouseMiddleClickAction */));\n        this._lastMouseMoveEvent = null;\n        this._hasTriggerKeyOnMouseDown = false;\n        this._lineNumberOnMouseDown = 0;\n        this._register(this._editor.onDidChangeConfiguration((e) => {\n            if (e.hasChanged(86 /* EditorOption.multiCursorModifier */) || e.hasChanged(87 /* EditorOption.mouseMiddleClickAction */)) {\n                const newOpts = createOptions(this._editor.getOption(86 /* EditorOption.multiCursorModifier */), this._editor.getOption(87 /* EditorOption.mouseMiddleClickAction */));\n                if (this._opts.equals(newOpts)) {\n                    return;\n                }\n                this._opts = newOpts;\n                this._lastMouseMoveEvent = null;\n                this._hasTriggerKeyOnMouseDown = false;\n                this._lineNumberOnMouseDown = 0;\n                this._onCancel.fire();\n            }\n        }));\n        this._register(this._editor.onMouseMove((e) => this._onEditorMouseMove(new ClickLinkMouseEvent(e, this._opts))));\n        this._register(this._editor.onMouseDown((e) => this._onEditorMouseDown(new ClickLinkMouseEvent(e, this._opts))));\n        this._register(this._editor.onMouseUp((e) => this._onEditorMouseUp(new ClickLinkMouseEvent(e, this._opts))));\n        this._register(this._editor.onKeyDown((e) => this._onEditorKeyDown(new ClickLinkKeyboardEvent(e, this._opts))));\n        this._register(this._editor.onKeyUp((e) => this._onEditorKeyUp(new ClickLinkKeyboardEvent(e, this._opts))));\n        this._register(this._editor.onMouseDrag(() => this._resetHandler()));\n        this._register(this._editor.onDidChangeCursorSelection((e) => this._onDidChangeCursorSelection(e)));\n        this._register(this._editor.onDidChangeModel((e) => this._resetHandler()));\n        this._register(this._editor.onDidChangeModelContent(() => this._resetHandler()));\n        this._register(this._editor.onDidScrollChange((e) => {\n            if (e.scrollTopChanged || e.scrollLeftChanged) {\n                this._resetHandler();\n            }\n        }));\n    }\n    _onDidChangeCursorSelection(e) {\n        if (e.selection && e.selection.startColumn !== e.selection.endColumn) {\n            this._resetHandler(); // immediately stop this feature if the user starts to select (https://github.com/microsoft/vscode/issues/7827)\n        }\n    }\n    _onEditorMouseMove(mouseEvent) {\n        this._lastMouseMoveEvent = mouseEvent;\n        this._onMouseMoveOrRelevantKeyDown.fire([mouseEvent, null]);\n    }\n    _onEditorMouseDown(mouseEvent) {\n        // We need to record if we had the trigger key on mouse down because someone might select something in the editor\n        // holding the mouse down and then while mouse is down start to press Ctrl/Cmd to start a copy operation and then\n        // release the mouse button without wanting to do the navigation.\n        // With this flag we prevent goto definition if the mouse was down before the trigger key was pressed.\n        this._hasTriggerKeyOnMouseDown = mouseEvent.hasTriggerModifier;\n        this._lineNumberOnMouseDown = this._extractLineNumberFromMouseEvent(mouseEvent);\n    }\n    _onEditorMouseUp(mouseEvent) {\n        const currentLineNumber = this._extractLineNumberFromMouseEvent(mouseEvent);\n        const lineNumbersCorrect = !!this._lineNumberOnMouseDown && this._lineNumberOnMouseDown === currentLineNumber;\n        if (lineNumbersCorrect && (this._hasTriggerKeyOnMouseDown || (mouseEvent.isMiddleClick && mouseEvent.mouseMiddleClickAction === 'openLink'))) {\n            this._onExecute.fire(mouseEvent);\n        }\n    }\n    _onEditorKeyDown(e) {\n        if (this._lastMouseMoveEvent\n            && (e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition)\n                || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side)\n            )) {\n            this._onMouseMoveOrRelevantKeyDown.fire([this._lastMouseMoveEvent, e]);\n        }\n        else if (e.hasTriggerModifier) {\n            this._onCancel.fire(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration\n        }\n    }\n    _onEditorKeyUp(e) {\n        if (e.keyCodeIsTriggerKey) {\n            this._onCancel.fire();\n        }\n    }\n    _resetHandler() {\n        this._lastMouseMoveEvent = null;\n        this._hasTriggerKeyOnMouseDown = false;\n        this._onCancel.fire();\n    }\n}\n\nexport { ClickLinkGesture, ClickLinkKeyboardEvent, ClickLinkMouseEvent, ClickLinkOptions };\n","import { onUnexpectedExternalError, CancellationError } from '../../../../base/common/errors.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { createCommandUri } from '../../../../base/common/htmlContent.js';\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 *--------------------------------------------------------------------------------------------*/\nclass InlayHintAnchor {\n    constructor(range, direction) {\n        this.range = range;\n        this.direction = direction;\n    }\n}\nclass InlayHintItem {\n    constructor(hint, anchor, provider) {\n        this.hint = hint;\n        this.anchor = anchor;\n        this.provider = provider;\n        this._isResolved = false;\n    }\n    with(delta) {\n        const result = new InlayHintItem(this.hint, delta.anchor, this.provider);\n        result._isResolved = this._isResolved;\n        result._currentResolve = this._currentResolve;\n        return result;\n    }\n    async resolve(token) {\n        if (typeof this.provider.resolveInlayHint !== 'function') {\n            return;\n        }\n        if (this._currentResolve) {\n            // wait for an active resolve operation and try again\n            // when that's done.\n            await this._currentResolve;\n            if (token.isCancellationRequested) {\n                return;\n            }\n            return this.resolve(token);\n        }\n        if (!this._isResolved) {\n            this._currentResolve = this._doResolve(token)\n                .finally(() => this._currentResolve = undefined);\n        }\n        await this._currentResolve;\n    }\n    async _doResolve(token) {\n        try {\n            const newHint = await Promise.resolve(this.provider.resolveInlayHint(this.hint, token));\n            this.hint.tooltip = newHint?.tooltip ?? this.hint.tooltip;\n            this.hint.label = newHint?.label ?? this.hint.label;\n            this.hint.textEdits = newHint?.textEdits ?? this.hint.textEdits;\n            this._isResolved = true;\n        }\n        catch (err) {\n            onUnexpectedExternalError(err);\n            this._isResolved = false;\n        }\n    }\n}\nclass InlayHintsFragments {\n    static { this._emptyInlayHintList = Object.freeze({ dispose() { }, hints: [] }); }\n    static async create(registry, model, ranges, token) {\n        const data = [];\n        const promises = registry.ordered(model).reverse().map(provider => ranges.map(async (range) => {\n            try {\n                const result = await provider.provideInlayHints(model, range, token);\n                if (result?.hints.length || provider.onDidChangeInlayHints) {\n                    data.push([result ?? InlayHintsFragments._emptyInlayHintList, provider]);\n                }\n            }\n            catch (err) {\n                onUnexpectedExternalError(err);\n            }\n        }));\n        await Promise.all(promises.flat());\n        if (token.isCancellationRequested || model.isDisposed()) {\n            throw new CancellationError();\n        }\n        return new InlayHintsFragments(ranges, data, model);\n    }\n    constructor(ranges, data, model) {\n        this._disposables = new DisposableStore();\n        this.ranges = ranges;\n        this.provider = new Set();\n        const items = [];\n        for (const [list, provider] of data) {\n            this._disposables.add(list);\n            this.provider.add(provider);\n            for (const hint of list.hints) {\n                // compute the range to which the item should be attached to\n                const position = model.validatePosition(hint.position);\n                let direction = 'before';\n                const wordRange = InlayHintsFragments._getRangeAtPosition(model, position);\n                let range;\n                if (wordRange.getStartPosition().isBefore(position)) {\n                    range = Range.fromPositions(wordRange.getStartPosition(), position);\n                    direction = 'after';\n                }\n                else {\n                    range = Range.fromPositions(position, wordRange.getEndPosition());\n                    direction = 'before';\n                }\n                items.push(new InlayHintItem(hint, new InlayHintAnchor(range, direction), provider));\n            }\n        }\n        this.items = items.sort((a, b) => Position.compare(a.hint.position, b.hint.position));\n    }\n    dispose() {\n        this._disposables.dispose();\n    }\n    static _getRangeAtPosition(model, position) {\n        const line = position.lineNumber;\n        const word = model.getWordAtPosition(position);\n        if (word) {\n            // always prefer the word range\n            return new Range(line, word.startColumn, line, word.endColumn);\n        }\n        model.tokenization.tokenizeIfCheap(line);\n        const tokens = model.tokenization.getLineTokens(line);\n        const offset = position.column - 1;\n        const idx = tokens.findTokenIndexAtOffset(offset);\n        let start = tokens.getStartOffset(idx);\n        let end = tokens.getEndOffset(idx);\n        if (end - start === 1) {\n            // single character token, when at its end try leading/trailing token instead\n            if (start === offset && idx > 1) {\n                // leading token\n                start = tokens.getStartOffset(idx - 1);\n                end = tokens.getEndOffset(idx - 1);\n            }\n            else if (end === offset && idx < tokens.getCount() - 1) {\n                // trailing token\n                start = tokens.getStartOffset(idx + 1);\n                end = tokens.getEndOffset(idx + 1);\n            }\n        }\n        return new Range(line, start + 1, line, end + 1);\n    }\n}\nfunction asCommandLink(command) {\n    return createCommandUri(command.id, ...(command.arguments ?? [])).toString();\n}\n\nexport { InlayHintAnchor, InlayHintItem, InlayHintsFragments, asCommandLink };\n","import { EditorType } from '../common/editorCommon.js';\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/**\n *@internal\n */\nfunction isCodeEditor(thing) {\n    if (thing && typeof thing.getEditorType === 'function') {\n        return thing.getEditorType() === EditorType.ICodeEditor;\n    }\n    else {\n        return false;\n    }\n}\n/**\n *@internal\n */\nfunction isDiffEditor(thing) {\n    if (thing && typeof thing.getEditorType === 'function') {\n        return thing.getEditorType() === EditorType.IDiffEditor;\n    }\n    else {\n        return false;\n    }\n}\n/**\n *@internal\n */\nfunction isCompositeEditor(thing) {\n    return !!thing\n        && typeof thing === 'object'\n        && typeof thing.onDidChangeActiveEditor === 'function';\n}\n/**\n *@internal\n */\nfunction getCodeEditor(thing) {\n    if (isCodeEditor(thing)) {\n        return thing;\n    }\n    if (isDiffEditor(thing)) {\n        return thing.getModifiedEditor();\n    }\n    if (isCompositeEditor(thing) && isCodeEditor(thing.activeCodeEditor)) {\n        return thing.activeCodeEditor;\n    }\n    return null;\n}\n\nexport { getCodeEditor, isCodeEditor, isCompositeEditor, isDiffEditor };\n","import { mixin } from '../../../../base/common/objects.js';\nimport { ICodeEditorService } from '../../services/codeEditorService.js';\nimport { CodeEditorWidget } from './codeEditorWidget.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { IAccessibilityService } from '../../../../platform/accessibility/common/accessibility.js';\nimport { ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { INotificationService } from '../../../../platform/notification/common/notification.js';\nimport { IThemeService } from '../../../../platform/theme/common/themeService.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet EmbeddedCodeEditorWidget = class EmbeddedCodeEditorWidget extends CodeEditorWidget {\n    constructor(domElement, options, codeEditorWidgetOptions, parentEditor, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService) {\n        super(domElement, { ...parentEditor.getRawOptions(), overflowWidgetsDomNode: parentEditor.getOverflowWidgetsDomNode() }, codeEditorWidgetOptions, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService);\n        this._parentEditor = parentEditor;\n        this._overwriteOptions = options;\n        // Overwrite parent's options\n        super.updateOptions(this._overwriteOptions);\n        this._register(parentEditor.onDidChangeConfiguration((e) => this._onParentConfigurationChanged(e)));\n    }\n    getParentEditor() {\n        return this._parentEditor;\n    }\n    _onParentConfigurationChanged(e) {\n        super.updateOptions(this._parentEditor.getRawOptions());\n        super.updateOptions(this._overwriteOptions);\n    }\n    updateOptions(newOptions) {\n        mixin(this._overwriteOptions, newOptions, true);\n        super.updateOptions(this._overwriteOptions);\n    }\n};\nEmbeddedCodeEditorWidget = __decorate([\n    __param(4, IInstantiationService),\n    __param(5, ICodeEditorService),\n    __param(6, ICommandService),\n    __param(7, IContextKeyService),\n    __param(8, IThemeService),\n    __param(9, INotificationService),\n    __param(10, IAccessibilityService),\n    __param(11, ILanguageConfigurationService),\n    __param(12, ILanguageFeaturesService)\n], EmbeddedCodeEditorWidget);\nfunction getOuterEditor(accessor) {\n    const editor = accessor.get(ICodeEditorService).getFocusedCodeEditor();\n    if (editor instanceof EmbeddedCodeEditorWidget) {\n        return editor.getParentEditor();\n    }\n    return editor;\n}\n\nexport { EmbeddedCodeEditorWidget, getOuterEditor };\n","import { removeCSSRulesContainingSelector, createCSSRule } from '../../../../base/browser/domStylesheets.js';\nimport { Sash } from '../../../../base/browser/ui/sash/sash.js';\nimport { Color, RGBA } from '../../../../base/common/color.js';\nimport { IdGenerator } from '../../../../base/common/idGenerator.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { deepClone, mixin } from '../../../../base/common/objects.js';\nimport './zoneWidget.css';\nimport { Range } from '../../../common/core/range.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\n\nconst defaultColor = new Color(new RGBA(0, 122, 204));\nconst defaultOptions = {\n    showArrow: true,\n    showFrame: true,\n    className: '',\n    frameColor: defaultColor,\n    arrowColor: defaultColor,\n    keepEditorSelection: false\n};\nconst WIDGET_ID = 'vs.editor.contrib.zoneWidget';\nclass ViewZoneDelegate {\n    constructor(domNode, afterLineNumber, afterColumn, heightInLines, onDomNodeTop, onComputedHeight, showInHiddenAreas, ordinal) {\n        this.id = ''; // A valid zone id should be greater than 0\n        this.domNode = domNode;\n        this.afterLineNumber = afterLineNumber;\n        this.afterColumn = afterColumn;\n        this.heightInLines = heightInLines;\n        this.showInHiddenAreas = showInHiddenAreas;\n        this.ordinal = ordinal;\n        this._onDomNodeTop = onDomNodeTop;\n        this._onComputedHeight = onComputedHeight;\n    }\n    onDomNodeTop(top) {\n        this._onDomNodeTop(top);\n    }\n    onComputedHeight(height) {\n        this._onComputedHeight(height);\n    }\n}\nclass OverlayWidgetDelegate {\n    constructor(id, domNode) {\n        this._id = id;\n        this._domNode = domNode;\n    }\n    getId() {\n        return this._id;\n    }\n    getDomNode() {\n        return this._domNode;\n    }\n    getPosition() {\n        return null;\n    }\n}\nclass Arrow {\n    static { this._IdGenerator = new IdGenerator('.arrow-decoration-'); }\n    constructor(_editor) {\n        this._editor = _editor;\n        this._ruleName = Arrow._IdGenerator.nextId();\n        this._color = null;\n        this._height = -1;\n        this._decorations = this._editor.createDecorationsCollection();\n    }\n    dispose() {\n        this.hide();\n        removeCSSRulesContainingSelector(this._ruleName);\n    }\n    set color(value) {\n        if (this._color !== value) {\n            this._color = value;\n            this._updateStyle();\n        }\n    }\n    set height(value) {\n        if (this._height !== value) {\n            this._height = value;\n            this._updateStyle();\n        }\n    }\n    _updateStyle() {\n        removeCSSRulesContainingSelector(this._ruleName);\n        createCSSRule(`.monaco-editor ${this._ruleName}`, `border-style: solid; border-color: transparent; border-bottom-color: ${this._color}; border-width: ${this._height}px; bottom: -${this._height}px !important; margin-left: -${this._height}px; `);\n    }\n    show(where) {\n        if (where.column === 1) {\n            // the arrow isn't pretty at column 1 and we need to push it out a little\n            where = { lineNumber: where.lineNumber, column: 2 };\n        }\n        this._decorations.set([{\n                range: Range.fromPositions(where),\n                options: {\n                    description: 'zone-widget-arrow',\n                    className: this._ruleName,\n                    stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */\n                }\n            }]);\n    }\n    hide() {\n        this._decorations.clear();\n    }\n}\nclass ZoneWidget {\n    constructor(editor, options = {}) {\n        this._arrow = null;\n        this._overlayWidget = null;\n        this._resizeSash = null;\n        this._isSashResizeHeight = false;\n        this._viewZone = null;\n        this._disposables = new DisposableStore();\n        this.container = null;\n        this._isShowing = false;\n        this.editor = editor;\n        this._positionMarkerId = this.editor.createDecorationsCollection();\n        this.options = deepClone(options);\n        mixin(this.options, defaultOptions, false);\n        this.domNode = document.createElement('div');\n        if (!this.options.isAccessible) {\n            this.domNode.setAttribute('aria-hidden', 'true');\n            this.domNode.setAttribute('role', 'presentation');\n        }\n        this._disposables.add(this.editor.onDidLayoutChange((info) => {\n            const width = this._getWidth(info);\n            this.domNode.style.width = width + 'px';\n            this.domNode.style.left = this._getLeft(info) + 'px';\n            this._onWidth(width);\n        }));\n    }\n    dispose() {\n        if (this._overlayWidget) {\n            this.editor.removeOverlayWidget(this._overlayWidget);\n            this._overlayWidget = null;\n        }\n        if (this._viewZone) {\n            this.editor.changeViewZones(accessor => {\n                if (this._viewZone) {\n                    accessor.removeZone(this._viewZone.id);\n                }\n                this._viewZone = null;\n            });\n        }\n        this._positionMarkerId.clear();\n        this._disposables.dispose();\n    }\n    create() {\n        this.domNode.classList.add('zone-widget');\n        if (this.options.className) {\n            this.domNode.classList.add(this.options.className);\n        }\n        this.container = document.createElement('div');\n        this.container.classList.add('zone-widget-container');\n        this.domNode.appendChild(this.container);\n        if (this.options.showArrow) {\n            this._arrow = new Arrow(this.editor);\n            this._disposables.add(this._arrow);\n        }\n        this._fillContainer(this.container);\n        this._initSash();\n        this._applyStyles();\n    }\n    style(styles) {\n        if (styles.frameColor) {\n            this.options.frameColor = styles.frameColor;\n        }\n        if (styles.arrowColor) {\n            this.options.arrowColor = styles.arrowColor;\n        }\n        this._applyStyles();\n    }\n    _applyStyles() {\n        if (this.container && this.options.frameColor) {\n            const frameColor = this.options.frameColor.toString();\n            this.container.style.borderTopColor = frameColor;\n            this.container.style.borderBottomColor = frameColor;\n        }\n        if (this._arrow && this.options.arrowColor) {\n            const arrowColor = this.options.arrowColor.toString();\n            this._arrow.color = arrowColor;\n        }\n    }\n    _getWidth(info) {\n        return info.width - info.minimap.minimapWidth - info.verticalScrollbarWidth;\n    }\n    _getLeft(info) {\n        // If minimap is to the left, we move beyond it\n        if (info.minimap.minimapWidth > 0 && info.minimap.minimapLeft === 0) {\n            return info.minimap.minimapWidth;\n        }\n        return 0;\n    }\n    _onViewZoneTop(top) {\n        this.domNode.style.top = top + 'px';\n    }\n    _onViewZoneHeight(height) {\n        this.domNode.style.height = `${height}px`;\n        if (this.container) {\n            const containerHeight = height - this._decoratingElementsHeight();\n            this.container.style.height = `${containerHeight}px`;\n            const layoutInfo = this.editor.getLayoutInfo();\n            this._doLayout(containerHeight, this._getWidth(layoutInfo));\n        }\n        this._resizeSash?.layout();\n    }\n    get position() {\n        const range = this._positionMarkerId.getRange(0);\n        if (!range) {\n            return undefined;\n        }\n        return range.getStartPosition();\n    }\n    show(rangeOrPos, heightInLines) {\n        const range = Range.isIRange(rangeOrPos) ? Range.lift(rangeOrPos) : Range.fromPositions(rangeOrPos);\n        this._isShowing = true;\n        this._showImpl(range, heightInLines);\n        this._isShowing = false;\n        this._positionMarkerId.set([{ range, options: ModelDecorationOptions.EMPTY }]);\n    }\n    hide() {\n        if (this._viewZone) {\n            this.editor.changeViewZones(accessor => {\n                if (this._viewZone) {\n                    accessor.removeZone(this._viewZone.id);\n                }\n            });\n            this._viewZone = null;\n        }\n        if (this._overlayWidget) {\n            this.editor.removeOverlayWidget(this._overlayWidget);\n            this._overlayWidget = null;\n        }\n        this._arrow?.hide();\n        this._positionMarkerId.clear();\n        this._isSashResizeHeight = false;\n    }\n    _decoratingElementsHeight() {\n        const lineHeight = this.editor.getOption(75 /* EditorOption.lineHeight */);\n        let result = 0;\n        if (this.options.showArrow) {\n            const arrowHeight = Math.round(lineHeight / 3);\n            result += 2 * arrowHeight;\n        }\n        if (this.options.showFrame) {\n            const frameThickness = this.options.frameWidth ?? Math.round(lineHeight / 9);\n            result += 2 * frameThickness;\n        }\n        return result;\n    }\n    /** Gets the maximum widget height in lines. */\n    _getMaximumHeightInLines() {\n        return Math.max(12, (this.editor.getLayoutInfo().height / this.editor.getOption(75 /* EditorOption.lineHeight */)) * 0.8);\n    }\n    _showImpl(where, heightInLines) {\n        const position = where.getStartPosition();\n        const layoutInfo = this.editor.getLayoutInfo();\n        const width = this._getWidth(layoutInfo);\n        this.domNode.style.width = `${width}px`;\n        this.domNode.style.left = this._getLeft(layoutInfo) + 'px';\n        // Render the widget as zone (rendering) and widget (lifecycle)\n        const viewZoneDomNode = document.createElement('div');\n        viewZoneDomNode.style.overflow = 'hidden';\n        const lineHeight = this.editor.getOption(75 /* EditorOption.lineHeight */);\n        // adjust heightInLines to viewport\n        const maxHeightInLines = this._getMaximumHeightInLines();\n        if (maxHeightInLines !== undefined) {\n            heightInLines = Math.min(heightInLines, maxHeightInLines);\n        }\n        let arrowHeight = 0;\n        let frameThickness = 0;\n        // Render the arrow one 1/3 of an editor line height\n        if (this._arrow && this.options.showArrow) {\n            arrowHeight = Math.round(lineHeight / 3);\n            this._arrow.height = arrowHeight;\n            this._arrow.show(position);\n        }\n        // Render the frame as 1/9 of an editor line height\n        if (this.options.showFrame) {\n            frameThickness = Math.round(lineHeight / 9);\n        }\n        // insert zone widget\n        this.editor.changeViewZones((accessor) => {\n            if (this._viewZone) {\n                accessor.removeZone(this._viewZone.id);\n            }\n            if (this._overlayWidget) {\n                this.editor.removeOverlayWidget(this._overlayWidget);\n                this._overlayWidget = null;\n            }\n            this.domNode.style.top = '-1000px';\n            this._viewZone = new ViewZoneDelegate(viewZoneDomNode, position.lineNumber, position.column, heightInLines, (top) => this._onViewZoneTop(top), (height) => this._onViewZoneHeight(height), this.options.showInHiddenAreas, this.options.ordinal);\n            this._viewZone.id = accessor.addZone(this._viewZone);\n            this._overlayWidget = new OverlayWidgetDelegate(WIDGET_ID + this._viewZone.id, this.domNode);\n            this.editor.addOverlayWidget(this._overlayWidget);\n        });\n        this._updateSashEnablement();\n        if (this.container && this.options.showFrame) {\n            const width = this.options.frameWidth ? this.options.frameWidth : frameThickness;\n            this.container.style.borderTopWidth = width + 'px';\n            this.container.style.borderBottomWidth = width + 'px';\n        }\n        const containerHeight = heightInLines * lineHeight - this._decoratingElementsHeight();\n        if (this.container) {\n            this.container.style.top = arrowHeight + 'px';\n            this.container.style.height = containerHeight + 'px';\n            this.container.style.overflow = 'hidden';\n        }\n        this._doLayout(containerHeight, width);\n        if (!this.options.keepEditorSelection) {\n            this.editor.setSelection(where);\n        }\n        const model = this.editor.getModel();\n        if (model) {\n            const range = model.validateRange(new Range(where.startLineNumber, 1, where.endLineNumber + 1, 1));\n            this.revealRange(range, range.startLineNumber === model.getLineCount());\n        }\n    }\n    revealRange(range, isLastLine) {\n        if (isLastLine) {\n            this.editor.revealLineNearTop(range.endLineNumber, 0 /* ScrollType.Smooth */);\n        }\n        else {\n            this.editor.revealRange(range, 0 /* ScrollType.Smooth */);\n        }\n    }\n    setCssClass(className, classToReplace) {\n        if (!this.container) {\n            return;\n        }\n        if (classToReplace) {\n            this.container.classList.remove(classToReplace);\n        }\n        this.container.classList.add(className);\n    }\n    _onWidth(widthInPixel) {\n        // implement in subclass\n    }\n    _doLayout(heightInPixel, widthInPixel) {\n        // implement in subclass\n    }\n    _relayout(_newHeightInLines, useMax) {\n        const maxHeightInLines = this._getMaximumHeightInLines();\n        const newHeightInLines = (useMax && (maxHeightInLines !== undefined)) ? Math.min(maxHeightInLines, _newHeightInLines) : _newHeightInLines;\n        if (this._viewZone && this._viewZone.heightInLines !== newHeightInLines) {\n            this.editor.changeViewZones(accessor => {\n                if (this._viewZone) {\n                    this._viewZone.heightInLines = newHeightInLines;\n                    accessor.layoutZone(this._viewZone.id);\n                }\n            });\n            this._updateSashEnablement();\n        }\n    }\n    // --- sash\n    _initSash() {\n        if (this._resizeSash) {\n            return;\n        }\n        this._resizeSash = this._disposables.add(new Sash(this.domNode, this, { orientation: 1 /* Orientation.HORIZONTAL */ }));\n        if (!this.options.isResizeable) {\n            this._resizeSash.state = 0 /* SashState.Disabled */;\n        }\n        let data;\n        this._disposables.add(this._resizeSash.onDidStart((e) => {\n            if (this._viewZone) {\n                data = {\n                    startY: e.startY,\n                    heightInLines: this._viewZone.heightInLines,\n                    ...this._getResizeBounds()\n                };\n            }\n        }));\n        this._disposables.add(this._resizeSash.onDidEnd(() => {\n            data = undefined;\n        }));\n        this._disposables.add(this._resizeSash.onDidChange((evt) => {\n            if (data) {\n                const lineDelta = (evt.currentY - data.startY) / this.editor.getOption(75 /* EditorOption.lineHeight */);\n                const roundedLineDelta = lineDelta < 0 ? Math.ceil(lineDelta) : Math.floor(lineDelta);\n                const newHeightInLines = data.heightInLines + roundedLineDelta;\n                if (newHeightInLines > data.minLines && newHeightInLines < data.maxLines) {\n                    this._isSashResizeHeight = true;\n                    this._relayout(newHeightInLines);\n                }\n            }\n        }));\n    }\n    _updateSashEnablement() {\n        if (this._resizeSash) {\n            const { minLines, maxLines } = this._getResizeBounds();\n            this._resizeSash.state = minLines === maxLines ? 0 /* SashState.Disabled */ : 3 /* SashState.Enabled */;\n        }\n    }\n    _getResizeBounds() {\n        return { minLines: 5, maxLines: 35 };\n    }\n    getHorizontalSashLeft() {\n        return 0;\n    }\n    getHorizontalSashTop() {\n        return (this.domNode.style.height === null ? 0 : parseInt(this.domNode.style.height)) - (this._decoratingElementsHeight() / 2);\n    }\n    getHorizontalSashWidth() {\n        const layoutInfo = this.editor.getLayoutInfo();\n        return layoutInfo.width - layoutInfo.minimap.minimapWidth;\n    }\n}\n\nexport { OverlayWidgetDelegate, ZoneWidget };\n","import { $, addStandardDisposableListener, append, clearNode, show, hide } from '../../../../base/browser/dom.js';\nimport { ActionBar } from '../../../../base/browser/ui/actionbar/actionbar.js';\nimport { Action } from '../../../../base/common/actions.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\nimport { Color } from '../../../../base/common/color.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { mixin } from '../../../../base/common/objects.js';\nimport './media/peekViewWidget.css';\nimport { registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { EmbeddedCodeEditorWidget } from '../../../browser/widget/codeEditor/embeddedCodeEditorWidget.js';\nimport { ZoneWidget } from '../../zoneWidget/browser/zoneWidget.js';\nimport { localize } from '../../../../nls.js';\nimport { createActionViewItem } from '../../../../platform/actions/browser/menuEntryActionViewItem.js';\nimport { RawContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { registerSingleton } from '../../../../platform/instantiation/common/extensions.js';\nimport { createDecorator, IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { registerColor } from '../../../../platform/theme/common/colorUtils.js';\nimport { contrastBorder, activeContrastBorder } from '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorForeground, editorInfoForeground } from '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { observableCodeEditor } from '../../../browser/observableCodeEditor.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst IPeekViewService = createDecorator('IPeekViewService');\nregisterSingleton(IPeekViewService, class {\n    constructor() {\n        this._widgets = new Map();\n    }\n    addExclusiveWidget(editor, widget) {\n        const existing = this._widgets.get(editor);\n        if (existing) {\n            existing.listener.dispose();\n            existing.widget.dispose();\n        }\n        const remove = () => {\n            const data = this._widgets.get(editor);\n            if (data && data.widget === widget) {\n                data.listener.dispose();\n                this._widgets.delete(editor);\n            }\n        };\n        this._widgets.set(editor, { widget, listener: widget.onDidClose(remove) });\n    }\n}, 1 /* InstantiationType.Delayed */);\nvar PeekContext;\n(function (PeekContext) {\n    PeekContext.inPeekEditor = new RawContextKey('inReferenceSearchEditor', true, localize(1316, \"Whether the current code editor is embedded inside peek\"));\n    PeekContext.notInPeekEditor = PeekContext.inPeekEditor.toNegated();\n})(PeekContext || (PeekContext = {}));\nlet PeekContextController = class PeekContextController {\n    static { this.ID = 'editor.contrib.referenceController'; }\n    constructor(editor, contextKeyService) {\n        if (editor instanceof EmbeddedCodeEditorWidget) {\n            PeekContext.inPeekEditor.bindTo(contextKeyService);\n        }\n    }\n    dispose() { }\n};\nPeekContextController = __decorate([\n    __param(1, IContextKeyService)\n], PeekContextController);\nregisterEditorContribution(PeekContextController.ID, PeekContextController, 0 /* EditorContributionInstantiation.Eager */); // eager because it needs to define a context key\nconst defaultOptions = {\n    headerBackgroundColor: Color.white,\n    primaryHeadingColor: Color.fromHex('#333333'),\n    secondaryHeadingColor: Color.fromHex('#6c6c6cb3')\n};\nlet PeekViewWidget = class PeekViewWidget extends ZoneWidget {\n    constructor(editor, options, instantiationService) {\n        super(editor, options);\n        this.instantiationService = instantiationService;\n        this._onDidClose = new Emitter();\n        this.onDidClose = this._onDidClose.event;\n        mixin(this.options, defaultOptions, false);\n        const e = observableCodeEditor(this.editor);\n        e.openedPeekWidgets.set(e.openedPeekWidgets.get() + 1, undefined);\n    }\n    dispose() {\n        if (!this.disposed) {\n            this.disposed = true; // prevent consumers who dispose on onDidClose from looping\n            super.dispose();\n            this._onDidClose.fire(this);\n            const e = observableCodeEditor(this.editor);\n            e.openedPeekWidgets.set(e.openedPeekWidgets.get() - 1, undefined);\n        }\n    }\n    style(styles) {\n        const options = this.options;\n        if (styles.headerBackgroundColor) {\n            options.headerBackgroundColor = styles.headerBackgroundColor;\n        }\n        if (styles.primaryHeadingColor) {\n            options.primaryHeadingColor = styles.primaryHeadingColor;\n        }\n        if (styles.secondaryHeadingColor) {\n            options.secondaryHeadingColor = styles.secondaryHeadingColor;\n        }\n        super.style(styles);\n    }\n    _applyStyles() {\n        super._applyStyles();\n        const options = this.options;\n        if (this._headElement && options.headerBackgroundColor) {\n            this._headElement.style.backgroundColor = options.headerBackgroundColor.toString();\n        }\n        if (this._primaryHeading && options.primaryHeadingColor) {\n            this._primaryHeading.style.color = options.primaryHeadingColor.toString();\n        }\n        if (this._secondaryHeading && options.secondaryHeadingColor) {\n            this._secondaryHeading.style.color = options.secondaryHeadingColor.toString();\n        }\n        if (this._bodyElement && options.frameColor) {\n            this._bodyElement.style.borderColor = options.frameColor.toString();\n        }\n    }\n    _fillContainer(container) {\n        this.setCssClass('peekview-widget');\n        this._headElement = $('.head');\n        this._bodyElement = $('.body');\n        this._fillHead(this._headElement);\n        this._fillBody(this._bodyElement);\n        container.appendChild(this._headElement);\n        container.appendChild(this._bodyElement);\n    }\n    _fillHead(container, noCloseAction) {\n        this._titleElement = $('.peekview-title');\n        if (this.options.supportOnTitleClick) {\n            this._titleElement.classList.add('clickable');\n            addStandardDisposableListener(this._titleElement, 'click', event => this._onTitleClick(event));\n        }\n        append(this._headElement, this._titleElement);\n        this._fillTitleIcon(this._titleElement);\n        this._primaryHeading = $('span.filename');\n        this._secondaryHeading = $('span.dirname');\n        this._metaHeading = $('span.meta');\n        append(this._titleElement, this._primaryHeading, this._secondaryHeading, this._metaHeading);\n        const actionsContainer = $('.peekview-actions');\n        append(this._headElement, actionsContainer);\n        const actionBarOptions = this._getActionBarOptions();\n        this._actionbarWidget = new ActionBar(actionsContainer, actionBarOptions);\n        this._disposables.add(this._actionbarWidget);\n        if (!noCloseAction) {\n            this._actionbarWidget.push(this._disposables.add(new Action('peekview.close', localize(1317, \"Close\"), ThemeIcon.asClassName(Codicon.close), true, () => {\n                this.dispose();\n                return Promise.resolve();\n            })), { label: false, icon: true });\n        }\n    }\n    _fillTitleIcon(container) {\n    }\n    _getActionBarOptions() {\n        return {\n            actionViewItemProvider: createActionViewItem.bind(undefined, this.instantiationService),\n            orientation: 0 /* ActionsOrientation.HORIZONTAL */\n        };\n    }\n    _onTitleClick(event) {\n        // implement me if supportOnTitleClick option is set\n    }\n    setTitle(primaryHeading, secondaryHeading) {\n        if (this._primaryHeading && this._secondaryHeading) {\n            this._primaryHeading.innerText = primaryHeading;\n            this._primaryHeading.setAttribute('title', primaryHeading);\n            if (secondaryHeading) {\n                this._secondaryHeading.innerText = secondaryHeading;\n            }\n            else {\n                clearNode(this._secondaryHeading);\n            }\n        }\n    }\n    setMetaTitle(value) {\n        if (this._metaHeading) {\n            if (value) {\n                this._metaHeading.innerText = value;\n                show(this._metaHeading);\n            }\n            else {\n                hide(this._metaHeading);\n            }\n        }\n    }\n    _doLayout(heightInPixel, widthInPixel) {\n        if (!this._isShowing && heightInPixel < 0) {\n            // Looks like the view zone got folded away!\n            this.dispose();\n            return;\n        }\n        const headHeight = Math.ceil(this.editor.getOption(75 /* EditorOption.lineHeight */) * 1.2);\n        const bodyHeight = Math.round(heightInPixel - (headHeight + 1 /* the border-top width */));\n        this._doLayoutHead(headHeight, widthInPixel);\n        this._doLayoutBody(bodyHeight, widthInPixel);\n    }\n    _doLayoutHead(heightInPixel, widthInPixel) {\n        if (this._headElement) {\n            this._headElement.style.height = `${heightInPixel}px`;\n            this._headElement.style.lineHeight = this._headElement.style.height;\n        }\n    }\n    _doLayoutBody(heightInPixel, widthInPixel) {\n        if (this._bodyElement) {\n            this._bodyElement.style.height = `${heightInPixel}px`;\n        }\n    }\n};\nPeekViewWidget = __decorate([\n    __param(2, IInstantiationService)\n], PeekViewWidget);\nconst peekViewTitleBackground = registerColor('peekViewTitle.background', { dark: '#252526', light: '#F3F3F3', hcDark: Color.black, hcLight: Color.white }, localize(1318, 'Background color of the peek view title area.'));\nconst peekViewTitleForeground = registerColor('peekViewTitleLabel.foreground', { dark: Color.white, light: Color.black, hcDark: Color.white, hcLight: editorForeground }, localize(1319, 'Color of the peek view title.'));\nconst peekViewTitleInfoForeground = registerColor('peekViewTitleDescription.foreground', { dark: '#ccccccb3', light: '#616161', hcDark: '#FFFFFF99', hcLight: '#292929' }, localize(1320, 'Color of the peek view title info.'));\nconst peekViewBorder = registerColor('peekView.border', { dark: editorInfoForeground, light: editorInfoForeground, hcDark: contrastBorder, hcLight: contrastBorder }, localize(1321, 'Color of the peek view borders and arrow.'));\nconst peekViewResultsBackground = registerColor('peekViewResult.background', { dark: '#252526', light: '#F3F3F3', hcDark: Color.black, hcLight: Color.white }, localize(1322, 'Background color of the peek view result list.'));\nregisterColor('peekViewResult.lineForeground', { dark: '#bbbbbb', light: '#646465', hcDark: Color.white, hcLight: editorForeground }, localize(1323, 'Foreground color for line nodes in the peek view result list.'));\nregisterColor('peekViewResult.fileForeground', { dark: Color.white, light: '#1E1E1E', hcDark: Color.white, hcLight: editorForeground }, localize(1324, 'Foreground color for file nodes in the peek view result list.'));\nregisterColor('peekViewResult.selectionBackground', { dark: '#3399ff33', light: '#3399ff33', hcDark: null, hcLight: null }, localize(1325, 'Background color of the selected entry in the peek view result list.'));\nregisterColor('peekViewResult.selectionForeground', { dark: Color.white, light: '#6C6C6C', hcDark: Color.white, hcLight: editorForeground }, localize(1326, 'Foreground color of the selected entry in the peek view result list.'));\nconst peekViewEditorBackground = registerColor('peekViewEditor.background', { dark: '#001F33', light: '#F2F8FC', hcDark: Color.black, hcLight: Color.white }, localize(1327, 'Background color of the peek view editor.'));\nregisterColor('peekViewEditorGutter.background', peekViewEditorBackground, localize(1328, 'Background color of the gutter in the peek view editor.'));\nregisterColor('peekViewEditorStickyScroll.background', peekViewEditorBackground, localize(1329, 'Background color of sticky scroll in the peek view editor.'));\nregisterColor('peekViewEditorStickyScrollGutter.background', peekViewEditorBackground, localize(1330, 'Background color of the gutter part of sticky scroll in the peek view editor.'));\nregisterColor('peekViewResult.matchHighlightBackground', { dark: '#ea5c004d', light: '#ea5c004d', hcDark: null, hcLight: null }, localize(1331, 'Match highlight color in the peek view result list.'));\nregisterColor('peekViewEditor.matchHighlightBackground', { dark: '#ff8f0099', light: '#f5d802de', hcDark: null, hcLight: null }, localize(1332, 'Match highlight color in the peek view editor.'));\nregisterColor('peekViewEditor.matchHighlightBorder', { dark: null, light: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize(1333, 'Match highlight border in the peek view editor.'));\n\nexport { IPeekViewService, PeekContext, PeekViewWidget, peekViewBorder, peekViewEditorBackground, peekViewResultsBackground, peekViewTitleBackground, peekViewTitleForeground, peekViewTitleInfoForeground };\n","import { range } from '../../../common/arrays.js';\nimport { CancellationTokenSource } from '../../../common/cancellation.js';\nimport { Event } from '../../../common/event.js';\nimport { DisposableStore, Disposable } from '../../../common/lifecycle.js';\nimport './list.css';\nimport { List } from './listWidget.js';\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 *--------------------------------------------------------------------------------------------*/\nclass PagedRenderer {\n    get templateId() { return this.renderer.templateId; }\n    constructor(renderer, modelProvider) {\n        this.renderer = renderer;\n        this.modelProvider = modelProvider;\n    }\n    renderTemplate(container) {\n        const data = this.renderer.renderTemplate(container);\n        return { data, disposable: Disposable.None };\n    }\n    renderElement(index, _, data, details) {\n        data.disposable?.dispose();\n        if (!data.data) {\n            return;\n        }\n        const model = this.modelProvider();\n        if (model.isResolved(index)) {\n            return this.renderer.renderElement(model.get(index), index, data.data, details);\n        }\n        const cts = new CancellationTokenSource();\n        const promise = model.resolve(index, cts.token);\n        data.disposable = { dispose: () => cts.cancel() };\n        this.renderer.renderPlaceholder(index, data.data);\n        promise.then(entry => this.renderer.renderElement(entry, index, data.data, details));\n    }\n    disposeTemplate(data) {\n        if (data.disposable) {\n            data.disposable.dispose();\n            data.disposable = undefined;\n        }\n        if (data.data) {\n            this.renderer.disposeTemplate(data.data);\n            data.data = undefined;\n        }\n    }\n}\nclass PagedAccessibilityProvider {\n    constructor(modelProvider, accessibilityProvider) {\n        this.modelProvider = modelProvider;\n        this.accessibilityProvider = accessibilityProvider;\n    }\n    getWidgetAriaLabel() {\n        return this.accessibilityProvider.getWidgetAriaLabel();\n    }\n    getAriaLabel(index) {\n        const model = this.modelProvider();\n        if (!model.isResolved(index)) {\n            return null;\n        }\n        return this.accessibilityProvider.getAriaLabel(model.get(index));\n    }\n}\nfunction fromPagedListOptions(modelProvider, options) {\n    return {\n        ...options,\n        accessibilityProvider: options.accessibilityProvider && new PagedAccessibilityProvider(modelProvider, options.accessibilityProvider)\n    };\n}\nclass PagedList {\n    constructor(user, container, virtualDelegate, renderers, options = {}) {\n        this.modelDisposables = new DisposableStore();\n        const modelProvider = () => this.model;\n        const pagedRenderers = renderers.map(r => new PagedRenderer(r, modelProvider));\n        this.list = new List(user, container, virtualDelegate, pagedRenderers, fromPagedListOptions(modelProvider, options));\n    }\n    updateOptions(options) {\n        this.list.updateOptions(options);\n    }\n    getHTMLElement() {\n        return this.list.getHTMLElement();\n    }\n    get onDidFocus() {\n        return this.list.onDidFocus;\n    }\n    get widget() {\n        return this.list;\n    }\n    get onDidDispose() {\n        return this.list.onDidDispose;\n    }\n    get onMouseDblClick() {\n        return Event.map(this.list.onMouseDblClick, ({ element, index, browserEvent }) => ({ element: element === undefined ? undefined : this._model.get(element), index, browserEvent }));\n    }\n    get onPointer() {\n        return Event.map(this.list.onPointer, ({ element, index, browserEvent }) => ({ element: element === undefined ? undefined : this._model.get(element), index, browserEvent }));\n    }\n    get onDidChangeSelection() {\n        return Event.map(this.list.onDidChangeSelection, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent }));\n    }\n    get model() {\n        return this._model;\n    }\n    set model(model) {\n        this.modelDisposables.clear();\n        this._model = model;\n        this.list.splice(0, this.list.length, range(model.length));\n        this.modelDisposables.add(model.onDidIncrementLength(newLength => this.list.splice(this.list.length, 0, range(this.list.length, newLength))));\n    }\n    getFocus() {\n        return this.list.getFocus();\n    }\n    getSelection() {\n        return this.list.getSelection();\n    }\n    getSelectedElements() {\n        return this.getSelection().map(i => this.model.get(i));\n    }\n    style(styles) {\n        this.list.style(styles);\n    }\n    dispose() {\n        this.list.dispose();\n        this.modelDisposables.dispose();\n    }\n}\n\nexport { PagedList };\n","import { append, $, scheduleAtNextAnimationFrame, getWindow, addDisposableListener } from '../../dom.js';\nimport { DomEmitter } from '../../event.js';\nimport { Sash } from '../sash/sash.js';\nimport { SmoothScrollableElement } from '../scrollbar/scrollableElement.js';\nimport { range, pushToStart, pushToEnd } from '../../../common/arrays.js';\nimport { Color } from '../../../common/color.js';\nimport { Emitter, Event } from '../../../common/event.js';\nimport { Disposable, combinedDisposable, toDisposable, dispose } from '../../../common/lifecycle.js';\nimport { clamp } from '../../../common/numbers.js';\nimport { Scrollable } from '../../../common/scrollable.js';\nimport { isUndefined } from '../../../common/types.js';\nimport './splitview.css';\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 *--------------------------------------------------------------------------------------------*/\nconst defaultStyles = {\n    separatorBorder: Color.transparent\n};\nclass ViewItem {\n    set size(size) {\n        this._size = size;\n    }\n    get size() {\n        return this._size;\n    }\n    get visible() {\n        return typeof this._cachedVisibleSize === 'undefined';\n    }\n    setVisible(visible, size) {\n        if (visible === this.visible) {\n            return;\n        }\n        if (visible) {\n            this.size = clamp(this._cachedVisibleSize, this.viewMinimumSize, this.viewMaximumSize);\n            this._cachedVisibleSize = undefined;\n        }\n        else {\n            this._cachedVisibleSize = typeof size === 'number' ? size : this.size;\n            this.size = 0;\n        }\n        this.container.classList.toggle('visible', visible);\n        try {\n            this.view.setVisible?.(visible);\n        }\n        catch (e) {\n            console.error('Splitview: Failed to set visible view');\n            console.error(e);\n        }\n    }\n    get minimumSize() { return this.visible ? this.view.minimumSize : 0; }\n    get viewMinimumSize() { return this.view.minimumSize; }\n    get maximumSize() { return this.visible ? this.view.maximumSize : 0; }\n    get viewMaximumSize() { return this.view.maximumSize; }\n    get priority() { return this.view.priority; }\n    get proportionalLayout() { return this.view.proportionalLayout ?? true; }\n    get snap() { return !!this.view.snap; }\n    set enabled(enabled) {\n        this.container.style.pointerEvents = enabled ? '' : 'none';\n    }\n    constructor(container, view, size, disposable) {\n        this.container = container;\n        this.view = view;\n        this.disposable = disposable;\n        this._cachedVisibleSize = undefined;\n        if (typeof size === 'number') {\n            this._size = size;\n            this._cachedVisibleSize = undefined;\n            container.classList.add('visible');\n        }\n        else {\n            this._size = 0;\n            this._cachedVisibleSize = size.cachedVisibleSize;\n        }\n    }\n    layout(offset, layoutContext) {\n        this.layoutContainer(offset);\n        try {\n            this.view.layout(this.size, offset, layoutContext);\n        }\n        catch (e) {\n            console.error('Splitview: Failed to layout view');\n            console.error(e);\n        }\n    }\n    dispose() {\n        this.disposable.dispose();\n    }\n}\nclass VerticalViewItem extends ViewItem {\n    layoutContainer(offset) {\n        this.container.style.top = `${offset}px`;\n        this.container.style.height = `${this.size}px`;\n    }\n}\nclass HorizontalViewItem extends ViewItem {\n    layoutContainer(offset) {\n        this.container.style.left = `${offset}px`;\n        this.container.style.width = `${this.size}px`;\n    }\n}\nvar State;\n(function (State) {\n    State[State[\"Idle\"] = 0] = \"Idle\";\n    State[State[\"Busy\"] = 1] = \"Busy\";\n})(State || (State = {}));\nvar Sizing;\n(function (Sizing) {\n    /**\n     * When adding or removing views, distribute the delta space among\n     * all other views.\n     */\n    Sizing.Distribute = { type: 'distribute' };\n    /**\n     * When adding or removing views, split the delta space with another\n     * specific view, indexed by the provided `index`.\n     */\n    function Split(index) { return { type: 'split', index }; }\n    Sizing.Split = Split;\n    /**\n     * When adding a view, use DistributeSizing when all pre-existing views are\n     * distributed evenly, otherwise use SplitSizing.\n     */\n    function Auto(index) { return { type: 'auto', index }; }\n    Sizing.Auto = Auto;\n    /**\n     * When adding or removing views, assume the view is invisible.\n     */\n    function Invisible(cachedVisibleSize) { return { type: 'invisible', cachedVisibleSize }; }\n    Sizing.Invisible = Invisible;\n})(Sizing || (Sizing = {}));\n/**\n * The {@link SplitView} is the UI component which implements a one dimensional\n * flex-like layout algorithm for a collection of {@link IView} instances, which\n * are essentially HTMLElement instances with the following size constraints:\n *\n * - {@link IView.minimumSize}\n * - {@link IView.maximumSize}\n * - {@link IView.priority}\n * - {@link IView.snap}\n *\n * In case the SplitView doesn't have enough size to fit all views, it will overflow\n * its content with a scrollbar.\n *\n * In between each pair of views there will be a {@link Sash} allowing the user\n * to resize the views, making sure the constraints are respected.\n *\n * An optional {@link TLayoutContext layout context type} may be used in order to\n * pass along layout contextual data from the {@link SplitView.layout} method down\n * to each view's {@link IView.layout} calls.\n *\n * Features:\n * - Flex-like layout algorithm\n * - Snap support\n * - Orthogonal sash support, for corner sashes\n * - View hide/show support\n * - View swap/move support\n * - Alt key modifier behavior, macOS style\n */\nclass SplitView extends Disposable {\n    get orthogonalStartSash() { return this._orthogonalStartSash; }\n    get orthogonalEndSash() { return this._orthogonalEndSash; }\n    get startSnappingEnabled() { return this._startSnappingEnabled; }\n    get endSnappingEnabled() { return this._endSnappingEnabled; }\n    /**\n     * A reference to a sash, perpendicular to all sashes in this {@link SplitView},\n     * located at the left- or top-most side of the SplitView.\n     * Corner sashes will be created automatically at the intersections.\n     */\n    set orthogonalStartSash(sash) {\n        for (const sashItem of this.sashItems) {\n            sashItem.sash.orthogonalStartSash = sash;\n        }\n        this._orthogonalStartSash = sash;\n    }\n    /**\n     * A reference to a sash, perpendicular to all sashes in this {@link SplitView},\n     * located at the right- or bottom-most side of the SplitView.\n     * Corner sashes will be created automatically at the intersections.\n     */\n    set orthogonalEndSash(sash) {\n        for (const sashItem of this.sashItems) {\n            sashItem.sash.orthogonalEndSash = sash;\n        }\n        this._orthogonalEndSash = sash;\n    }\n    /**\n     * Enable/disable snapping at the beginning of this {@link SplitView}.\n     */\n    set startSnappingEnabled(startSnappingEnabled) {\n        if (this._startSnappingEnabled === startSnappingEnabled) {\n            return;\n        }\n        this._startSnappingEnabled = startSnappingEnabled;\n        this.updateSashEnablement();\n    }\n    /**\n     * Enable/disable snapping at the end of this {@link SplitView}.\n     */\n    set endSnappingEnabled(endSnappingEnabled) {\n        if (this._endSnappingEnabled === endSnappingEnabled) {\n            return;\n        }\n        this._endSnappingEnabled = endSnappingEnabled;\n        this.updateSashEnablement();\n    }\n    /**\n     * Create a new {@link SplitView} instance.\n     */\n    constructor(container, options = {}) {\n        super();\n        this.size = 0;\n        this._contentSize = 0;\n        this.proportions = undefined;\n        this.viewItems = [];\n        this.sashItems = []; // used in tests\n        this.state = State.Idle;\n        this._onDidSashChange = this._register(new Emitter());\n        this._onDidSashReset = this._register(new Emitter());\n        this._startSnappingEnabled = true;\n        this._endSnappingEnabled = true;\n        /**\n         * Fires whenever the user resizes a {@link Sash sash}.\n         */\n        this.onDidSashChange = this._onDidSashChange.event;\n        /**\n         * Fires whenever the user double clicks a {@link Sash sash}.\n         */\n        this.onDidSashReset = this._onDidSashReset.event;\n        this.orientation = options.orientation ?? 0 /* Orientation.VERTICAL */;\n        this.inverseAltBehavior = options.inverseAltBehavior ?? false;\n        this.proportionalLayout = options.proportionalLayout ?? true;\n        this.getSashOrthogonalSize = options.getSashOrthogonalSize;\n        this.el = document.createElement('div');\n        this.el.classList.add('monaco-split-view2');\n        this.el.classList.add(this.orientation === 0 /* Orientation.VERTICAL */ ? 'vertical' : 'horizontal');\n        container.appendChild(this.el);\n        this.sashContainer = append(this.el, $('.sash-container'));\n        this.viewContainer = $('.split-view-container');\n        this.scrollable = this._register(new Scrollable({\n            forceIntegerValues: true,\n            smoothScrollDuration: 125,\n            scheduleAtNextAnimationFrame: callback => scheduleAtNextAnimationFrame(getWindow(this.el), callback),\n        }));\n        this.scrollableElement = this._register(new SmoothScrollableElement(this.viewContainer, {\n            vertical: this.orientation === 0 /* Orientation.VERTICAL */ ? (options.scrollbarVisibility ?? 1 /* ScrollbarVisibility.Auto */) : 2 /* ScrollbarVisibility.Hidden */,\n            horizontal: this.orientation === 1 /* Orientation.HORIZONTAL */ ? (options.scrollbarVisibility ?? 1 /* ScrollbarVisibility.Auto */) : 2 /* ScrollbarVisibility.Hidden */\n        }, this.scrollable));\n        // https://github.com/microsoft/vscode/issues/157737\n        const onDidScrollViewContainer = this._register(new DomEmitter(this.viewContainer, 'scroll')).event;\n        this._register(onDidScrollViewContainer(_ => {\n            const position = this.scrollableElement.getScrollPosition();\n            const scrollLeft = Math.abs(this.viewContainer.scrollLeft - position.scrollLeft) <= 1 ? undefined : this.viewContainer.scrollLeft;\n            const scrollTop = Math.abs(this.viewContainer.scrollTop - position.scrollTop) <= 1 ? undefined : this.viewContainer.scrollTop;\n            if (scrollLeft !== undefined || scrollTop !== undefined) {\n                this.scrollableElement.setScrollPosition({ scrollLeft, scrollTop });\n            }\n        }));\n        this.onDidScroll = this.scrollableElement.onScroll;\n        this._register(this.onDidScroll(e => {\n            if (e.scrollTopChanged) {\n                this.viewContainer.scrollTop = e.scrollTop;\n            }\n            if (e.scrollLeftChanged) {\n                this.viewContainer.scrollLeft = e.scrollLeft;\n            }\n        }));\n        append(this.el, this.scrollableElement.getDomNode());\n        this.style(options.styles || defaultStyles);\n        // We have an existing set of view, add them now\n        if (options.descriptor) {\n            this.size = options.descriptor.size;\n            options.descriptor.views.forEach((viewDescriptor, index) => {\n                const sizing = isUndefined(viewDescriptor.visible) || viewDescriptor.visible ? viewDescriptor.size : { type: 'invisible', cachedVisibleSize: viewDescriptor.size };\n                const view = viewDescriptor.view;\n                this.doAddView(view, sizing, index, true);\n            });\n            // Initialize content size and proportions for first layout\n            this._contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);\n            this.saveProportions();\n        }\n    }\n    style(styles) {\n        if (styles.separatorBorder.isTransparent()) {\n            this.el.classList.remove('separator-border');\n            this.el.style.removeProperty('--separator-border');\n        }\n        else {\n            this.el.classList.add('separator-border');\n            this.el.style.setProperty('--separator-border', styles.separatorBorder.toString());\n        }\n    }\n    /**\n     * Add a {@link IView view} to this {@link SplitView}.\n     *\n     * @param view The view to add.\n     * @param size Either a fixed size, or a dynamic {@link Sizing} strategy.\n     * @param index The index to insert the view on.\n     * @param skipLayout Whether layout should be skipped.\n     */\n    addView(view, size, index = this.viewItems.length, skipLayout) {\n        this.doAddView(view, size, index, skipLayout);\n    }\n    /**\n     * Layout the {@link SplitView}.\n     *\n     * @param size The entire size of the {@link SplitView}.\n     * @param layoutContext An optional layout context to pass along to {@link IView views}.\n     */\n    layout(size, layoutContext) {\n        const previousSize = Math.max(this.size, this._contentSize);\n        this.size = size;\n        this.layoutContext = layoutContext;\n        if (!this.proportions) {\n            const indexes = range(this.viewItems.length);\n            const lowPriorityIndexes = indexes.filter(i => this.viewItems[i].priority === 1 /* LayoutPriority.Low */);\n            const highPriorityIndexes = indexes.filter(i => this.viewItems[i].priority === 2 /* LayoutPriority.High */);\n            this.resize(this.viewItems.length - 1, size - previousSize, undefined, lowPriorityIndexes, highPriorityIndexes);\n        }\n        else {\n            let total = 0;\n            for (let i = 0; i < this.viewItems.length; i++) {\n                const item = this.viewItems[i];\n                const proportion = this.proportions[i];\n                if (typeof proportion === 'number') {\n                    total += proportion;\n                }\n                else {\n                    size -= item.size;\n                }\n            }\n            for (let i = 0; i < this.viewItems.length; i++) {\n                const item = this.viewItems[i];\n                const proportion = this.proportions[i];\n                if (typeof proportion === 'number' && total > 0) {\n                    item.size = clamp(Math.round(proportion * size / total), item.minimumSize, item.maximumSize);\n                }\n            }\n        }\n        this.distributeEmptySpace();\n        this.layoutViews();\n    }\n    saveProportions() {\n        if (this.proportionalLayout && this._contentSize > 0) {\n            this.proportions = this.viewItems.map(v => v.proportionalLayout && v.visible ? v.size / this._contentSize : undefined);\n        }\n    }\n    onSashStart({ sash, start, alt }) {\n        for (const item of this.viewItems) {\n            item.enabled = false;\n        }\n        const index = this.sashItems.findIndex(item => item.sash === sash);\n        // This way, we can press Alt while we resize a sash, macOS style!\n        const disposable = combinedDisposable(addDisposableListener(this.el.ownerDocument.body, 'keydown', e => resetSashDragState(this.sashDragState.current, e.altKey)), addDisposableListener(this.el.ownerDocument.body, 'keyup', () => resetSashDragState(this.sashDragState.current, false)));\n        const resetSashDragState = (start, alt) => {\n            const sizes = this.viewItems.map(i => i.size);\n            let minDelta = Number.NEGATIVE_INFINITY;\n            let maxDelta = Number.POSITIVE_INFINITY;\n            if (this.inverseAltBehavior) {\n                alt = !alt;\n            }\n            if (alt) {\n                // When we're using the last sash with Alt, we're resizing\n                // the view to the left/up, instead of right/down as usual\n                // Thus, we must do the inverse of the usual\n                const isLastSash = index === this.sashItems.length - 1;\n                if (isLastSash) {\n                    const viewItem = this.viewItems[index];\n                    minDelta = (viewItem.minimumSize - viewItem.size) / 2;\n                    maxDelta = (viewItem.maximumSize - viewItem.size) / 2;\n                }\n                else {\n                    const viewItem = this.viewItems[index + 1];\n                    minDelta = (viewItem.size - viewItem.maximumSize) / 2;\n                    maxDelta = (viewItem.size - viewItem.minimumSize) / 2;\n                }\n            }\n            let snapBefore;\n            let snapAfter;\n            if (!alt) {\n                const upIndexes = range(index, -1);\n                const downIndexes = range(index + 1, this.viewItems.length);\n                const minDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].minimumSize - sizes[i]), 0);\n                const maxDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].viewMaximumSize - sizes[i]), 0);\n                const maxDeltaDown = downIndexes.length === 0 ? Number.POSITIVE_INFINITY : downIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].minimumSize), 0);\n                const minDeltaDown = downIndexes.length === 0 ? Number.NEGATIVE_INFINITY : downIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].viewMaximumSize), 0);\n                const minDelta = Math.max(minDeltaUp, minDeltaDown);\n                const maxDelta = Math.min(maxDeltaDown, maxDeltaUp);\n                const snapBeforeIndex = this.findFirstSnapIndex(upIndexes);\n                const snapAfterIndex = this.findFirstSnapIndex(downIndexes);\n                if (typeof snapBeforeIndex === 'number') {\n                    const viewItem = this.viewItems[snapBeforeIndex];\n                    const halfSize = Math.floor(viewItem.viewMinimumSize / 2);\n                    snapBefore = {\n                        index: snapBeforeIndex,\n                        limitDelta: viewItem.visible ? minDelta - halfSize : minDelta + halfSize,\n                        size: viewItem.size\n                    };\n                }\n                if (typeof snapAfterIndex === 'number') {\n                    const viewItem = this.viewItems[snapAfterIndex];\n                    const halfSize = Math.floor(viewItem.viewMinimumSize / 2);\n                    snapAfter = {\n                        index: snapAfterIndex,\n                        limitDelta: viewItem.visible ? maxDelta + halfSize : maxDelta - halfSize,\n                        size: viewItem.size\n                    };\n                }\n            }\n            this.sashDragState = { start, current: start, index, sizes, minDelta, maxDelta, alt, snapBefore, snapAfter, disposable };\n        };\n        resetSashDragState(start, alt);\n    }\n    onSashChange({ current }) {\n        const { index, start, sizes, alt, minDelta, maxDelta, snapBefore, snapAfter } = this.sashDragState;\n        this.sashDragState.current = current;\n        const delta = current - start;\n        const newDelta = this.resize(index, delta, sizes, undefined, undefined, minDelta, maxDelta, snapBefore, snapAfter);\n        if (alt) {\n            const isLastSash = index === this.sashItems.length - 1;\n            const newSizes = this.viewItems.map(i => i.size);\n            const viewItemIndex = isLastSash ? index : index + 1;\n            const viewItem = this.viewItems[viewItemIndex];\n            const newMinDelta = viewItem.size - viewItem.maximumSize;\n            const newMaxDelta = viewItem.size - viewItem.minimumSize;\n            const resizeIndex = isLastSash ? index - 1 : index + 1;\n            this.resize(resizeIndex, -newDelta, newSizes, undefined, undefined, newMinDelta, newMaxDelta);\n        }\n        this.distributeEmptySpace();\n        this.layoutViews();\n    }\n    onSashEnd(index) {\n        this._onDidSashChange.fire(index);\n        this.sashDragState.disposable.dispose();\n        this.saveProportions();\n        for (const item of this.viewItems) {\n            item.enabled = true;\n        }\n    }\n    onViewChange(item, size) {\n        const index = this.viewItems.indexOf(item);\n        if (index < 0 || index >= this.viewItems.length) {\n            return;\n        }\n        size = typeof size === 'number' ? size : item.size;\n        size = clamp(size, item.minimumSize, item.maximumSize);\n        if (this.inverseAltBehavior && index > 0) {\n            // In this case, we want the view to grow or shrink both sides equally\n            // so we just resize the \"left\" side by half and let `resize` do the clamping magic\n            this.resize(index - 1, Math.floor((item.size - size) / 2));\n            this.distributeEmptySpace();\n            this.layoutViews();\n        }\n        else {\n            item.size = size;\n            this.relayout([index], undefined);\n        }\n    }\n    /**\n     * Resize a {@link IView view} within the {@link SplitView}.\n     *\n     * @param index The {@link IView view} index.\n     * @param size The {@link IView view} size.\n     */\n    resizeView(index, size) {\n        if (index < 0 || index >= this.viewItems.length) {\n            return;\n        }\n        if (this.state !== State.Idle) {\n            throw new Error('Cant modify splitview');\n        }\n        this.state = State.Busy;\n        try {\n            const indexes = range(this.viewItems.length).filter(i => i !== index);\n            const lowPriorityIndexes = [...indexes.filter(i => this.viewItems[i].priority === 1 /* LayoutPriority.Low */), index];\n            const highPriorityIndexes = indexes.filter(i => this.viewItems[i].priority === 2 /* LayoutPriority.High */);\n            const item = this.viewItems[index];\n            size = Math.round(size);\n            size = clamp(size, item.minimumSize, Math.min(item.maximumSize, this.size));\n            item.size = size;\n            this.relayout(lowPriorityIndexes, highPriorityIndexes);\n        }\n        finally {\n            this.state = State.Idle;\n        }\n    }\n    /**\n     * Distribute the entire {@link SplitView} size among all {@link IView views}.\n     */\n    distributeViewSizes() {\n        const flexibleViewItems = [];\n        let flexibleSize = 0;\n        for (const item of this.viewItems) {\n            if (item.maximumSize - item.minimumSize > 0) {\n                flexibleViewItems.push(item);\n                flexibleSize += item.size;\n            }\n        }\n        const size = Math.floor(flexibleSize / flexibleViewItems.length);\n        for (const item of flexibleViewItems) {\n            item.size = clamp(size, item.minimumSize, item.maximumSize);\n        }\n        const indexes = range(this.viewItems.length);\n        const lowPriorityIndexes = indexes.filter(i => this.viewItems[i].priority === 1 /* LayoutPriority.Low */);\n        const highPriorityIndexes = indexes.filter(i => this.viewItems[i].priority === 2 /* LayoutPriority.High */);\n        this.relayout(lowPriorityIndexes, highPriorityIndexes);\n    }\n    /**\n     * Returns the size of a {@link IView view}.\n     */\n    getViewSize(index) {\n        if (index < 0 || index >= this.viewItems.length) {\n            return -1;\n        }\n        return this.viewItems[index].size;\n    }\n    doAddView(view, size, index = this.viewItems.length, skipLayout) {\n        if (this.state !== State.Idle) {\n            throw new Error('Cant modify splitview');\n        }\n        this.state = State.Busy;\n        try {\n            // Add view\n            const container = $('.split-view-view');\n            if (index === this.viewItems.length) {\n                this.viewContainer.appendChild(container);\n            }\n            else {\n                this.viewContainer.insertBefore(container, this.viewContainer.children.item(index));\n            }\n            const onChangeDisposable = view.onDidChange(size => this.onViewChange(item, size));\n            const containerDisposable = toDisposable(() => container.remove());\n            const disposable = combinedDisposable(onChangeDisposable, containerDisposable);\n            let viewSize;\n            if (typeof size === 'number') {\n                viewSize = size;\n            }\n            else {\n                if (size.type === 'auto') {\n                    if (this.areViewsDistributed()) {\n                        size = { type: 'distribute' };\n                    }\n                    else {\n                        size = { type: 'split', index: size.index };\n                    }\n                }\n                if (size.type === 'split') {\n                    viewSize = this.getViewSize(size.index) / 2;\n                }\n                else if (size.type === 'invisible') {\n                    viewSize = { cachedVisibleSize: size.cachedVisibleSize };\n                }\n                else {\n                    viewSize = view.minimumSize;\n                }\n            }\n            const item = this.orientation === 0 /* Orientation.VERTICAL */\n                ? new VerticalViewItem(container, view, viewSize, disposable)\n                : new HorizontalViewItem(container, view, viewSize, disposable);\n            this.viewItems.splice(index, 0, item);\n            // Add sash\n            if (this.viewItems.length > 1) {\n                const opts = { orthogonalStartSash: this.orthogonalStartSash, orthogonalEndSash: this.orthogonalEndSash };\n                const sash = this.orientation === 0 /* Orientation.VERTICAL */\n                    ? new Sash(this.sashContainer, { getHorizontalSashTop: s => this.getSashPosition(s), getHorizontalSashWidth: this.getSashOrthogonalSize }, { ...opts, orientation: 1 /* Orientation.HORIZONTAL */ })\n                    : new Sash(this.sashContainer, { getVerticalSashLeft: s => this.getSashPosition(s), getVerticalSashHeight: this.getSashOrthogonalSize }, { ...opts, orientation: 0 /* Orientation.VERTICAL */ });\n                const sashEventMapper = this.orientation === 0 /* Orientation.VERTICAL */\n                    ? (e) => ({ sash, start: e.startY, current: e.currentY, alt: e.altKey })\n                    : (e) => ({ sash, start: e.startX, current: e.currentX, alt: e.altKey });\n                const onStart = Event.map(sash.onDidStart, sashEventMapper);\n                const onStartDisposable = onStart(this.onSashStart, this);\n                const onChange = Event.map(sash.onDidChange, sashEventMapper);\n                const onChangeDisposable = onChange(this.onSashChange, this);\n                const onEnd = Event.map(sash.onDidEnd, () => this.sashItems.findIndex(item => item.sash === sash));\n                const onEndDisposable = onEnd(this.onSashEnd, this);\n                const onDidResetDisposable = sash.onDidReset(() => {\n                    const index = this.sashItems.findIndex(item => item.sash === sash);\n                    const upIndexes = range(index, -1);\n                    const downIndexes = range(index + 1, this.viewItems.length);\n                    const snapBeforeIndex = this.findFirstSnapIndex(upIndexes);\n                    const snapAfterIndex = this.findFirstSnapIndex(downIndexes);\n                    if (typeof snapBeforeIndex === 'number' && !this.viewItems[snapBeforeIndex].visible) {\n                        return;\n                    }\n                    if (typeof snapAfterIndex === 'number' && !this.viewItems[snapAfterIndex].visible) {\n                        return;\n                    }\n                    this._onDidSashReset.fire(index);\n                });\n                const disposable = combinedDisposable(onStartDisposable, onChangeDisposable, onEndDisposable, onDidResetDisposable, sash);\n                const sashItem = { sash, disposable };\n                this.sashItems.splice(index - 1, 0, sashItem);\n            }\n            container.appendChild(view.element);\n            let highPriorityIndexes;\n            if (typeof size !== 'number' && size.type === 'split') {\n                highPriorityIndexes = [size.index];\n            }\n            if (!skipLayout) {\n                this.relayout([index], highPriorityIndexes);\n            }\n            if (!skipLayout && typeof size !== 'number' && size.type === 'distribute') {\n                this.distributeViewSizes();\n            }\n        }\n        finally {\n            this.state = State.Idle;\n        }\n    }\n    relayout(lowPriorityIndexes, highPriorityIndexes) {\n        const contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);\n        this.resize(this.viewItems.length - 1, this.size - contentSize, undefined, lowPriorityIndexes, highPriorityIndexes);\n        this.distributeEmptySpace();\n        this.layoutViews();\n        this.saveProportions();\n    }\n    resize(index, delta, sizes = this.viewItems.map(i => i.size), lowPriorityIndexes, highPriorityIndexes, overloadMinDelta = Number.NEGATIVE_INFINITY, overloadMaxDelta = Number.POSITIVE_INFINITY, snapBefore, snapAfter) {\n        if (index < 0 || index >= this.viewItems.length) {\n            return 0;\n        }\n        const upIndexes = range(index, -1);\n        const downIndexes = range(index + 1, this.viewItems.length);\n        if (highPriorityIndexes) {\n            for (const index of highPriorityIndexes) {\n                pushToStart(upIndexes, index);\n                pushToStart(downIndexes, index);\n            }\n        }\n        if (lowPriorityIndexes) {\n            for (const index of lowPriorityIndexes) {\n                pushToEnd(upIndexes, index);\n                pushToEnd(downIndexes, index);\n            }\n        }\n        const upItems = upIndexes.map(i => this.viewItems[i]);\n        const upSizes = upIndexes.map(i => sizes[i]);\n        const downItems = downIndexes.map(i => this.viewItems[i]);\n        const downSizes = downIndexes.map(i => sizes[i]);\n        const minDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].minimumSize - sizes[i]), 0);\n        const maxDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].maximumSize - sizes[i]), 0);\n        const maxDeltaDown = downIndexes.length === 0 ? Number.POSITIVE_INFINITY : downIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].minimumSize), 0);\n        const minDeltaDown = downIndexes.length === 0 ? Number.NEGATIVE_INFINITY : downIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].maximumSize), 0);\n        const minDelta = Math.max(minDeltaUp, minDeltaDown, overloadMinDelta);\n        const maxDelta = Math.min(maxDeltaDown, maxDeltaUp, overloadMaxDelta);\n        let snapped = false;\n        if (snapBefore) {\n            const snapView = this.viewItems[snapBefore.index];\n            const visible = delta >= snapBefore.limitDelta;\n            snapped = visible !== snapView.visible;\n            snapView.setVisible(visible, snapBefore.size);\n        }\n        if (!snapped && snapAfter) {\n            const snapView = this.viewItems[snapAfter.index];\n            const visible = delta < snapAfter.limitDelta;\n            snapped = visible !== snapView.visible;\n            snapView.setVisible(visible, snapAfter.size);\n        }\n        if (snapped) {\n            return this.resize(index, delta, sizes, lowPriorityIndexes, highPriorityIndexes, overloadMinDelta, overloadMaxDelta);\n        }\n        delta = clamp(delta, minDelta, maxDelta);\n        for (let i = 0, deltaUp = delta; i < upItems.length; i++) {\n            const item = upItems[i];\n            const size = clamp(upSizes[i] + deltaUp, item.minimumSize, item.maximumSize);\n            const viewDelta = size - upSizes[i];\n            deltaUp -= viewDelta;\n            item.size = size;\n        }\n        for (let i = 0, deltaDown = delta; i < downItems.length; i++) {\n            const item = downItems[i];\n            const size = clamp(downSizes[i] - deltaDown, item.minimumSize, item.maximumSize);\n            const viewDelta = size - downSizes[i];\n            deltaDown += viewDelta;\n            item.size = size;\n        }\n        return delta;\n    }\n    distributeEmptySpace(lowPriorityIndex) {\n        const contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);\n        let emptyDelta = this.size - contentSize;\n        const indexes = range(this.viewItems.length - 1, -1);\n        const lowPriorityIndexes = indexes.filter(i => this.viewItems[i].priority === 1 /* LayoutPriority.Low */);\n        const highPriorityIndexes = indexes.filter(i => this.viewItems[i].priority === 2 /* LayoutPriority.High */);\n        for (const index of highPriorityIndexes) {\n            pushToStart(indexes, index);\n        }\n        for (const index of lowPriorityIndexes) {\n            pushToEnd(indexes, index);\n        }\n        if (typeof lowPriorityIndex === 'number') {\n            pushToEnd(indexes, lowPriorityIndex);\n        }\n        for (let i = 0; emptyDelta !== 0 && i < indexes.length; i++) {\n            const item = this.viewItems[indexes[i]];\n            const size = clamp(item.size + emptyDelta, item.minimumSize, item.maximumSize);\n            const viewDelta = size - item.size;\n            emptyDelta -= viewDelta;\n            item.size = size;\n        }\n    }\n    layoutViews() {\n        // Save new content size\n        this._contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);\n        // Layout views\n        let offset = 0;\n        for (const viewItem of this.viewItems) {\n            viewItem.layout(offset, this.layoutContext);\n            offset += viewItem.size;\n        }\n        // Layout sashes\n        this.sashItems.forEach(item => item.sash.layout());\n        this.updateSashEnablement();\n        this.updateScrollableElement();\n    }\n    updateScrollableElement() {\n        if (this.orientation === 0 /* Orientation.VERTICAL */) {\n            this.scrollableElement.setScrollDimensions({\n                height: this.size,\n                scrollHeight: this._contentSize\n            });\n        }\n        else {\n            this.scrollableElement.setScrollDimensions({\n                width: this.size,\n                scrollWidth: this._contentSize\n            });\n        }\n    }\n    updateSashEnablement() {\n        let previous = false;\n        const collapsesDown = this.viewItems.map(i => previous = (i.size - i.minimumSize > 0) || previous);\n        previous = false;\n        const expandsDown = this.viewItems.map(i => previous = (i.maximumSize - i.size > 0) || previous);\n        const reverseViews = [...this.viewItems].reverse();\n        previous = false;\n        const collapsesUp = reverseViews.map(i => previous = (i.size - i.minimumSize > 0) || previous).reverse();\n        previous = false;\n        const expandsUp = reverseViews.map(i => previous = (i.maximumSize - i.size > 0) || previous).reverse();\n        let position = 0;\n        for (let index = 0; index < this.sashItems.length; index++) {\n            const { sash } = this.sashItems[index];\n            const viewItem = this.viewItems[index];\n            position += viewItem.size;\n            const min = !(collapsesDown[index] && expandsUp[index + 1]);\n            const max = !(expandsDown[index] && collapsesUp[index + 1]);\n            if (min && max) {\n                const upIndexes = range(index, -1);\n                const downIndexes = range(index + 1, this.viewItems.length);\n                const snapBeforeIndex = this.findFirstSnapIndex(upIndexes);\n                const snapAfterIndex = this.findFirstSnapIndex(downIndexes);\n                const snappedBefore = typeof snapBeforeIndex === 'number' && !this.viewItems[snapBeforeIndex].visible;\n                const snappedAfter = typeof snapAfterIndex === 'number' && !this.viewItems[snapAfterIndex].visible;\n                if (snappedBefore && collapsesUp[index] && (position > 0 || this.startSnappingEnabled)) {\n                    sash.state = 1 /* SashState.AtMinimum */;\n                }\n                else if (snappedAfter && collapsesDown[index] && (position < this._contentSize || this.endSnappingEnabled)) {\n                    sash.state = 2 /* SashState.AtMaximum */;\n                }\n                else {\n                    sash.state = 0 /* SashState.Disabled */;\n                }\n            }\n            else if (min && !max) {\n                sash.state = 1 /* SashState.AtMinimum */;\n            }\n            else if (!min && max) {\n                sash.state = 2 /* SashState.AtMaximum */;\n            }\n            else {\n                sash.state = 3 /* SashState.Enabled */;\n            }\n        }\n    }\n    getSashPosition(sash) {\n        let position = 0;\n        for (let i = 0; i < this.sashItems.length; i++) {\n            position += this.viewItems[i].size;\n            if (this.sashItems[i].sash === sash) {\n                return position;\n            }\n        }\n        return 0;\n    }\n    findFirstSnapIndex(indexes) {\n        // visible views first\n        for (const index of indexes) {\n            const viewItem = this.viewItems[index];\n            if (!viewItem.visible) {\n                continue;\n            }\n            if (viewItem.snap) {\n                return index;\n            }\n        }\n        // then, hidden views\n        for (const index of indexes) {\n            const viewItem = this.viewItems[index];\n            if (viewItem.visible && viewItem.maximumSize - viewItem.minimumSize > 0) {\n                return undefined;\n            }\n            if (!viewItem.visible && viewItem.snap) {\n                return index;\n            }\n        }\n        return undefined;\n    }\n    areViewsDistributed() {\n        let min = undefined, max = undefined;\n        for (const view of this.viewItems) {\n            min = min === undefined ? view.size : Math.min(min, view.size);\n            max = max === undefined ? view.size : Math.max(max, view.size);\n            if (max - min > 2) {\n                return false;\n            }\n        }\n        return true;\n    }\n    dispose() {\n        this.sashDragState?.disposable.dispose();\n        dispose(this.viewItems);\n        this.viewItems = [];\n        this.sashItems.forEach(i => i.disposable.dispose());\n        this.sashItems = [];\n        super.dispose();\n    }\n}\n\nexport { Sizing, SplitView };\n","import { append, $, clearNode } from '../../dom.js';\nimport { createStyleSheet } from '../../domStylesheets.js';\nimport { getBaseLayerHoverDelegate } from '../hover/hoverDelegate2.js';\nimport { getDefaultHoverDelegate } from '../hover/hoverDelegateFactory.js';\nimport { List, unthemedListStyles } from '../list/listWidget.js';\nimport { SplitView } from '../splitview/splitview.js';\nimport { Event, Emitter } from '../../../common/event.js';\nimport { DisposableStore, Disposable } from '../../../common/lifecycle.js';\nimport './table.css';\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 *--------------------------------------------------------------------------------------------*/\nclass TableListRenderer {\n    static { this.TemplateId = 'row'; }\n    constructor(columns, renderers, getColumnSize) {\n        this.columns = columns;\n        this.getColumnSize = getColumnSize;\n        this.templateId = TableListRenderer.TemplateId;\n        this.renderedTemplates = new Set();\n        const rendererMap = new Map(renderers.map(r => [r.templateId, r]));\n        this.renderers = [];\n        for (const column of columns) {\n            const renderer = rendererMap.get(column.templateId);\n            if (!renderer) {\n                throw new Error(`Table cell renderer for template id ${column.templateId} not found.`);\n            }\n            this.renderers.push(renderer);\n        }\n    }\n    renderTemplate(container) {\n        const rowContainer = append(container, $('.monaco-table-tr'));\n        const cellContainers = [];\n        const cellTemplateData = [];\n        for (let i = 0; i < this.columns.length; i++) {\n            const renderer = this.renderers[i];\n            const cellContainer = append(rowContainer, $('.monaco-table-td', { 'data-col-index': i }));\n            cellContainer.style.width = `${this.getColumnSize(i)}px`;\n            cellContainers.push(cellContainer);\n            cellTemplateData.push(renderer.renderTemplate(cellContainer));\n        }\n        const result = { container, cellContainers, cellTemplateData };\n        this.renderedTemplates.add(result);\n        return result;\n    }\n    renderElement(element, index, templateData, renderDetails) {\n        for (let i = 0; i < this.columns.length; i++) {\n            const column = this.columns[i];\n            const cell = column.project(element);\n            const renderer = this.renderers[i];\n            renderer.renderElement(cell, index, templateData.cellTemplateData[i], renderDetails);\n        }\n    }\n    disposeElement(element, index, templateData, renderDetails) {\n        for (let i = 0; i < this.columns.length; i++) {\n            const renderer = this.renderers[i];\n            if (renderer.disposeElement) {\n                const column = this.columns[i];\n                const cell = column.project(element);\n                renderer.disposeElement(cell, index, templateData.cellTemplateData[i], renderDetails);\n            }\n        }\n    }\n    disposeTemplate(templateData) {\n        for (let i = 0; i < this.columns.length; i++) {\n            const renderer = this.renderers[i];\n            renderer.disposeTemplate(templateData.cellTemplateData[i]);\n        }\n        clearNode(templateData.container);\n        this.renderedTemplates.delete(templateData);\n    }\n    layoutColumn(index, size) {\n        for (const { cellContainers } of this.renderedTemplates) {\n            cellContainers[index].style.width = `${size}px`;\n        }\n    }\n}\nfunction asListVirtualDelegate(delegate) {\n    return {\n        getHeight(row) { return delegate.getHeight(row); },\n        getTemplateId() { return TableListRenderer.TemplateId; },\n    };\n}\nclass ColumnHeader extends Disposable {\n    get minimumSize() { return this.column.minimumWidth ?? 120; }\n    get maximumSize() { return this.column.maximumWidth ?? Number.POSITIVE_INFINITY; }\n    get onDidChange() { return this.column.onDidChangeWidthConstraints ?? Event.None; }\n    constructor(column, index) {\n        super();\n        this.column = column;\n        this.index = index;\n        this._onDidLayout = new Emitter();\n        this.onDidLayout = this._onDidLayout.event;\n        this.element = $('.monaco-table-th', { 'data-col-index': index }, column.label);\n        if (column.tooltip) {\n            this._register(getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate('mouse'), this.element, column.tooltip));\n        }\n    }\n    layout(size) {\n        this._onDidLayout.fire([this.index, size]);\n    }\n}\nclass Table {\n    static { this.InstanceCount = 0; }\n    get onDidChangeFocus() { return this.list.onDidChangeFocus; }\n    get onDidChangeSelection() { return this.list.onDidChangeSelection; }\n    get onDidScroll() { return this.list.onDidScroll; }\n    get onMouseDblClick() { return this.list.onMouseDblClick; }\n    get onPointer() { return this.list.onPointer; }\n    get onDidFocus() { return this.list.onDidFocus; }\n    get scrollTop() { return this.list.scrollTop; }\n    set scrollTop(scrollTop) { this.list.scrollTop = scrollTop; }\n    get scrollHeight() { return this.list.scrollHeight; }\n    get renderHeight() { return this.list.renderHeight; }\n    get onDidDispose() { return this.list.onDidDispose; }\n    constructor(user, container, virtualDelegate, columns, renderers, _options) {\n        this.virtualDelegate = virtualDelegate;\n        this.columns = columns;\n        this.domId = `table_id_${++Table.InstanceCount}`;\n        this.disposables = new DisposableStore();\n        this.cachedWidth = 0;\n        this.cachedHeight = 0;\n        this.domNode = append(container, $(`.monaco-table.${this.domId}`));\n        const headers = columns.map((c, i) => this.disposables.add(new ColumnHeader(c, i)));\n        const descriptor = {\n            size: headers.reduce((a, b) => a + b.column.weight, 0),\n            views: headers.map(view => ({ size: view.column.weight, view }))\n        };\n        this.splitview = this.disposables.add(new SplitView(this.domNode, {\n            orientation: 1 /* Orientation.HORIZONTAL */,\n            scrollbarVisibility: 2 /* ScrollbarVisibility.Hidden */,\n            getSashOrthogonalSize: () => this.cachedHeight,\n            descriptor\n        }));\n        this.splitview.el.style.height = `${virtualDelegate.headerRowHeight}px`;\n        this.splitview.el.style.lineHeight = `${virtualDelegate.headerRowHeight}px`;\n        const renderer = new TableListRenderer(columns, renderers, i => this.splitview.getViewSize(i));\n        this.list = this.disposables.add(new List(user, this.domNode, asListVirtualDelegate(virtualDelegate), [renderer], _options));\n        Event.any(...headers.map(h => h.onDidLayout))(([index, size]) => renderer.layoutColumn(index, size), null, this.disposables);\n        this.splitview.onDidSashReset(index => {\n            const totalWeight = columns.reduce((r, c) => r + c.weight, 0);\n            const size = columns[index].weight / totalWeight * this.cachedWidth;\n            this.splitview.resizeView(index, size);\n        }, null, this.disposables);\n        this.styleElement = createStyleSheet(this.domNode);\n        this.style(unthemedListStyles);\n    }\n    updateOptions(options) {\n        this.list.updateOptions(options);\n    }\n    splice(start, deleteCount, elements = []) {\n        this.list.splice(start, deleteCount, elements);\n    }\n    getHTMLElement() {\n        return this.domNode;\n    }\n    style(styles) {\n        const content = [];\n        content.push(`.monaco-table.${this.domId} > .monaco-split-view2 .monaco-sash.vertical::before {\n\t\t\ttop: ${this.virtualDelegate.headerRowHeight + 1}px;\n\t\t\theight: calc(100% - ${this.virtualDelegate.headerRowHeight}px);\n\t\t}`);\n        this.styleElement.textContent = content.join('\\n');\n        this.list.style(styles);\n    }\n    getSelectedElements() {\n        return this.list.getSelectedElements();\n    }\n    getSelection() {\n        return this.list.getSelection();\n    }\n    getFocus() {\n        return this.list.getFocus();\n    }\n    dispose() {\n        this.disposables.dispose();\n    }\n}\n\nexport { Table };\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 *--------------------------------------------------------------------------------------------*/\nvar ObjectTreeElementCollapseState;\n(function (ObjectTreeElementCollapseState) {\n    ObjectTreeElementCollapseState[ObjectTreeElementCollapseState[\"Expanded\"] = 0] = \"Expanded\";\n    ObjectTreeElementCollapseState[ObjectTreeElementCollapseState[\"Collapsed\"] = 1] = \"Collapsed\";\n    /**\n     * If the element is already in the tree, preserve its current state. Else, expand it.\n     */\n    ObjectTreeElementCollapseState[ObjectTreeElementCollapseState[\"PreserveOrExpanded\"] = 2] = \"PreserveOrExpanded\";\n    /**\n     * If the element is already in the tree, preserve its current state. Else, collapse it.\n     */\n    ObjectTreeElementCollapseState[ObjectTreeElementCollapseState[\"PreserveOrCollapsed\"] = 3] = \"PreserveOrCollapsed\";\n})(ObjectTreeElementCollapseState || (ObjectTreeElementCollapseState = {}));\nvar TreeMouseEventTarget;\n(function (TreeMouseEventTarget) {\n    TreeMouseEventTarget[TreeMouseEventTarget[\"Unknown\"] = 0] = \"Unknown\";\n    TreeMouseEventTarget[TreeMouseEventTarget[\"Twistie\"] = 1] = \"Twistie\";\n    TreeMouseEventTarget[TreeMouseEventTarget[\"Element\"] = 2] = \"Element\";\n    TreeMouseEventTarget[TreeMouseEventTarget[\"Filter\"] = 3] = \"Filter\";\n})(TreeMouseEventTarget || (TreeMouseEventTarget = {}));\nclass TreeError extends Error {\n    constructor(user, message) {\n        super(`TreeError [${user}] ${message}`);\n    }\n}\nclass WeakMapper {\n    constructor(fn) {\n        this.fn = fn;\n        this._map = new WeakMap();\n    }\n    map(key) {\n        let result = this._map.get(key);\n        if (!result) {\n            result = this.fn(key);\n            this._map.set(key, result);\n        }\n        return result;\n    }\n}\n\nexport { ObjectTreeElementCollapseState, TreeError, TreeMouseEventTarget, WeakMapper };\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/**\n * Represents information about a specific difference between two sequences.\n */\nclass DiffChange {\n    /**\n     * Constructs a new DiffChange with the given sequence information\n     * and content.\n     */\n    constructor(originalStart, originalLength, modifiedStart, modifiedLength) {\n        //Debug.Assert(originalLength > 0 || modifiedLength > 0, \"originalLength and modifiedLength cannot both be <= 0\");\n        this.originalStart = originalStart;\n        this.originalLength = originalLength;\n        this.modifiedStart = modifiedStart;\n        this.modifiedLength = modifiedLength;\n    }\n    /**\n     * The end point (exclusive) of the change in the original sequence.\n     */\n    getOriginalEnd() {\n        return this.originalStart + this.originalLength;\n    }\n    /**\n     * The end point (exclusive) of the change in the modified sequence.\n     */\n    getModifiedEnd() {\n        return this.modifiedStart + this.modifiedLength;\n    }\n}\n\nexport { DiffChange };\n","import { DiffChange } from './diffChange.js';\nimport { stringHash } from '../hash.js';\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 *--------------------------------------------------------------------------------------------*/\nclass StringDiffSequence {\n    constructor(source) {\n        this.source = source;\n    }\n    getElements() {\n        const source = this.source;\n        const characters = new Int32Array(source.length);\n        for (let i = 0, len = source.length; i < len; i++) {\n            characters[i] = source.charCodeAt(i);\n        }\n        return characters;\n    }\n}\nfunction stringDiff(original, modified, pretty) {\n    return new LcsDiff(new StringDiffSequence(original), new StringDiffSequence(modified)).ComputeDiff(pretty).changes;\n}\n//\n// The code below has been ported from a C# implementation in VS\n//\nclass Debug {\n    static Assert(condition, message) {\n        if (!condition) {\n            throw new Error(message);\n        }\n    }\n}\nclass MyArray {\n    /**\n     * Copies a range of elements from an Array starting at the specified source index and pastes\n     * them to another Array starting at the specified destination index. The length and the indexes\n     * are specified as 64-bit integers.\n     * sourceArray:\n     *\t\tThe Array that contains the data to copy.\n     * sourceIndex:\n     *\t\tA 64-bit integer that represents the index in the sourceArray at which copying begins.\n     * destinationArray:\n     *\t\tThe Array that receives the data.\n     * destinationIndex:\n     *\t\tA 64-bit integer that represents the index in the destinationArray at which storing begins.\n     * length:\n     *\t\tA 64-bit integer that represents the number of elements to copy.\n     */\n    static Copy(sourceArray, sourceIndex, destinationArray, destinationIndex, length) {\n        for (let i = 0; i < length; i++) {\n            destinationArray[destinationIndex + i] = sourceArray[sourceIndex + i];\n        }\n    }\n    static Copy2(sourceArray, sourceIndex, destinationArray, destinationIndex, length) {\n        for (let i = 0; i < length; i++) {\n            destinationArray[destinationIndex + i] = sourceArray[sourceIndex + i];\n        }\n    }\n}\n/**\n * A utility class which helps to create the set of DiffChanges from\n * a difference operation. This class accepts original DiffElements and\n * modified DiffElements that are involved in a particular change. The\n * MarkNextChange() method can be called to mark the separation between\n * distinct changes. At the end, the Changes property can be called to retrieve\n * the constructed changes.\n */\nclass DiffChangeHelper {\n    /**\n     * Constructs a new DiffChangeHelper for the given DiffSequences.\n     */\n    constructor() {\n        this.m_changes = [];\n        this.m_originalStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n        this.m_modifiedStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n        this.m_originalCount = 0;\n        this.m_modifiedCount = 0;\n    }\n    /**\n     * Marks the beginning of the next change in the set of differences.\n     */\n    MarkNextChange() {\n        // Only add to the list if there is something to add\n        if (this.m_originalCount > 0 || this.m_modifiedCount > 0) {\n            // Add the new change to our list\n            this.m_changes.push(new DiffChange(this.m_originalStart, this.m_originalCount, this.m_modifiedStart, this.m_modifiedCount));\n        }\n        // Reset for the next change\n        this.m_originalCount = 0;\n        this.m_modifiedCount = 0;\n        this.m_originalStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n        this.m_modifiedStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n    }\n    /**\n     * Adds the original element at the given position to the elements\n     * affected by the current change. The modified index gives context\n     * to the change position with respect to the original sequence.\n     * @param originalIndex The index of the original element to add.\n     * @param modifiedIndex The index of the modified element that provides corresponding position in the modified sequence.\n     */\n    AddOriginalElement(originalIndex, modifiedIndex) {\n        // The 'true' start index is the smallest of the ones we've seen\n        this.m_originalStart = Math.min(this.m_originalStart, originalIndex);\n        this.m_modifiedStart = Math.min(this.m_modifiedStart, modifiedIndex);\n        this.m_originalCount++;\n    }\n    /**\n     * Adds the modified element at the given position to the elements\n     * affected by the current change. The original index gives context\n     * to the change position with respect to the modified sequence.\n     * @param originalIndex The index of the original element that provides corresponding position in the original sequence.\n     * @param modifiedIndex The index of the modified element to add.\n     */\n    AddModifiedElement(originalIndex, modifiedIndex) {\n        // The 'true' start index is the smallest of the ones we've seen\n        this.m_originalStart = Math.min(this.m_originalStart, originalIndex);\n        this.m_modifiedStart = Math.min(this.m_modifiedStart, modifiedIndex);\n        this.m_modifiedCount++;\n    }\n    /**\n     * Retrieves all of the changes marked by the class.\n     */\n    getChanges() {\n        if (this.m_originalCount > 0 || this.m_modifiedCount > 0) {\n            // Finish up on whatever is left\n            this.MarkNextChange();\n        }\n        return this.m_changes;\n    }\n    /**\n     * Retrieves all of the changes marked by the class in the reverse order\n     */\n    getReverseChanges() {\n        if (this.m_originalCount > 0 || this.m_modifiedCount > 0) {\n            // Finish up on whatever is left\n            this.MarkNextChange();\n        }\n        this.m_changes.reverse();\n        return this.m_changes;\n    }\n}\n/**\n * An implementation of the difference algorithm described in\n * \"An O(ND) Difference Algorithm and its variations\" by Eugene W. Myers\n */\nclass LcsDiff {\n    /**\n     * Constructs the DiffFinder\n     */\n    constructor(originalSequence, modifiedSequence, continueProcessingPredicate = null) {\n        this.ContinueProcessingPredicate = continueProcessingPredicate;\n        this._originalSequence = originalSequence;\n        this._modifiedSequence = modifiedSequence;\n        const [originalStringElements, originalElementsOrHash, originalHasStrings] = LcsDiff._getElements(originalSequence);\n        const [modifiedStringElements, modifiedElementsOrHash, modifiedHasStrings] = LcsDiff._getElements(modifiedSequence);\n        this._hasStrings = (originalHasStrings && modifiedHasStrings);\n        this._originalStringElements = originalStringElements;\n        this._originalElementsOrHash = originalElementsOrHash;\n        this._modifiedStringElements = modifiedStringElements;\n        this._modifiedElementsOrHash = modifiedElementsOrHash;\n        this.m_forwardHistory = [];\n        this.m_reverseHistory = [];\n    }\n    static _isStringArray(arr) {\n        return (arr.length > 0 && typeof arr[0] === 'string');\n    }\n    static _getElements(sequence) {\n        const elements = sequence.getElements();\n        if (LcsDiff._isStringArray(elements)) {\n            const hashes = new Int32Array(elements.length);\n            for (let i = 0, len = elements.length; i < len; i++) {\n                hashes[i] = stringHash(elements[i], 0);\n            }\n            return [elements, hashes, true];\n        }\n        if (elements instanceof Int32Array) {\n            return [[], elements, false];\n        }\n        return [[], new Int32Array(elements), false];\n    }\n    ElementsAreEqual(originalIndex, newIndex) {\n        if (this._originalElementsOrHash[originalIndex] !== this._modifiedElementsOrHash[newIndex]) {\n            return false;\n        }\n        return (this._hasStrings ? this._originalStringElements[originalIndex] === this._modifiedStringElements[newIndex] : true);\n    }\n    ElementsAreStrictEqual(originalIndex, newIndex) {\n        if (!this.ElementsAreEqual(originalIndex, newIndex)) {\n            return false;\n        }\n        const originalElement = LcsDiff._getStrictElement(this._originalSequence, originalIndex);\n        const modifiedElement = LcsDiff._getStrictElement(this._modifiedSequence, newIndex);\n        return (originalElement === modifiedElement);\n    }\n    static _getStrictElement(sequence, index) {\n        if (typeof sequence.getStrictElement === 'function') {\n            return sequence.getStrictElement(index);\n        }\n        return null;\n    }\n    OriginalElementsAreEqual(index1, index2) {\n        if (this._originalElementsOrHash[index1] !== this._originalElementsOrHash[index2]) {\n            return false;\n        }\n        return (this._hasStrings ? this._originalStringElements[index1] === this._originalStringElements[index2] : true);\n    }\n    ModifiedElementsAreEqual(index1, index2) {\n        if (this._modifiedElementsOrHash[index1] !== this._modifiedElementsOrHash[index2]) {\n            return false;\n        }\n        return (this._hasStrings ? this._modifiedStringElements[index1] === this._modifiedStringElements[index2] : true);\n    }\n    ComputeDiff(pretty) {\n        return this._ComputeDiff(0, this._originalElementsOrHash.length - 1, 0, this._modifiedElementsOrHash.length - 1, pretty);\n    }\n    /**\n     * Computes the differences between the original and modified input\n     * sequences on the bounded range.\n     * @returns An array of the differences between the two input sequences.\n     */\n    _ComputeDiff(originalStart, originalEnd, modifiedStart, modifiedEnd, pretty) {\n        const quitEarlyArr = [false];\n        let changes = this.ComputeDiffRecursive(originalStart, originalEnd, modifiedStart, modifiedEnd, quitEarlyArr);\n        if (pretty) {\n            // We have to clean up the computed diff to be more intuitive\n            // but it turns out this cannot be done correctly until the entire set\n            // of diffs have been computed\n            changes = this.PrettifyChanges(changes);\n        }\n        return {\n            quitEarly: quitEarlyArr[0],\n            changes: changes\n        };\n    }\n    /**\n     * Private helper method which computes the differences on the bounded range\n     * recursively.\n     * @returns An array of the differences between the two input sequences.\n     */\n    ComputeDiffRecursive(originalStart, originalEnd, modifiedStart, modifiedEnd, quitEarlyArr) {\n        quitEarlyArr[0] = false;\n        // Find the start of the differences\n        while (originalStart <= originalEnd && modifiedStart <= modifiedEnd && this.ElementsAreEqual(originalStart, modifiedStart)) {\n            originalStart++;\n            modifiedStart++;\n        }\n        // Find the end of the differences\n        while (originalEnd >= originalStart && modifiedEnd >= modifiedStart && this.ElementsAreEqual(originalEnd, modifiedEnd)) {\n            originalEnd--;\n            modifiedEnd--;\n        }\n        // In the special case where we either have all insertions or all deletions or the sequences are identical\n        if (originalStart > originalEnd || modifiedStart > modifiedEnd) {\n            let changes;\n            if (modifiedStart <= modifiedEnd) {\n                Debug.Assert(originalStart === originalEnd + 1, 'originalStart should only be one more than originalEnd');\n                // All insertions\n                changes = [\n                    new DiffChange(originalStart, 0, modifiedStart, modifiedEnd - modifiedStart + 1)\n                ];\n            }\n            else if (originalStart <= originalEnd) {\n                Debug.Assert(modifiedStart === modifiedEnd + 1, 'modifiedStart should only be one more than modifiedEnd');\n                // All deletions\n                changes = [\n                    new DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, 0)\n                ];\n            }\n            else {\n                Debug.Assert(originalStart === originalEnd + 1, 'originalStart should only be one more than originalEnd');\n                Debug.Assert(modifiedStart === modifiedEnd + 1, 'modifiedStart should only be one more than modifiedEnd');\n                // Identical sequences - No differences\n                changes = [];\n            }\n            return changes;\n        }\n        // This problem can be solved using the Divide-And-Conquer technique.\n        const midOriginalArr = [0];\n        const midModifiedArr = [0];\n        const result = this.ComputeRecursionPoint(originalStart, originalEnd, modifiedStart, modifiedEnd, midOriginalArr, midModifiedArr, quitEarlyArr);\n        const midOriginal = midOriginalArr[0];\n        const midModified = midModifiedArr[0];\n        if (result !== null) {\n            // Result is not-null when there was enough memory to compute the changes while\n            // searching for the recursion point\n            return result;\n        }\n        else if (!quitEarlyArr[0]) {\n            // We can break the problem down recursively by finding the changes in the\n            // First Half:   (originalStart, modifiedStart) to (midOriginal, midModified)\n            // Second Half:  (midOriginal + 1, minModified + 1) to (originalEnd, modifiedEnd)\n            // NOTE: ComputeDiff() is inclusive, therefore the second range starts on the next point\n            const leftChanges = this.ComputeDiffRecursive(originalStart, midOriginal, modifiedStart, midModified, quitEarlyArr);\n            let rightChanges = [];\n            if (!quitEarlyArr[0]) {\n                rightChanges = this.ComputeDiffRecursive(midOriginal + 1, originalEnd, midModified + 1, modifiedEnd, quitEarlyArr);\n            }\n            else {\n                // We didn't have time to finish the first half, so we don't have time to compute this half.\n                // Consider the entire rest of the sequence different.\n                rightChanges = [\n                    new DiffChange(midOriginal + 1, originalEnd - (midOriginal + 1) + 1, midModified + 1, modifiedEnd - (midModified + 1) + 1)\n                ];\n            }\n            return this.ConcatenateChanges(leftChanges, rightChanges);\n        }\n        // If we hit here, we quit early, and so can't return anything meaningful\n        return [\n            new DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, modifiedEnd - modifiedStart + 1)\n        ];\n    }\n    WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr) {\n        let forwardChanges = null;\n        let reverseChanges = null;\n        // First, walk backward through the forward diagonals history\n        let changeHelper = new DiffChangeHelper();\n        let diagonalMin = diagonalForwardStart;\n        let diagonalMax = diagonalForwardEnd;\n        let diagonalRelative = (midOriginalArr[0] - midModifiedArr[0]) - diagonalForwardOffset;\n        let lastOriginalIndex = -1073741824 /* Constants.MIN_SAFE_SMALL_INTEGER */;\n        let historyIndex = this.m_forwardHistory.length - 1;\n        do {\n            // Get the diagonal index from the relative diagonal number\n            const diagonal = diagonalRelative + diagonalForwardBase;\n            // Figure out where we came from\n            if (diagonal === diagonalMin || (diagonal < diagonalMax && forwardPoints[diagonal - 1] < forwardPoints[diagonal + 1])) {\n                // Vertical line (the element is an insert)\n                originalIndex = forwardPoints[diagonal + 1];\n                modifiedIndex = originalIndex - diagonalRelative - diagonalForwardOffset;\n                if (originalIndex < lastOriginalIndex) {\n                    changeHelper.MarkNextChange();\n                }\n                lastOriginalIndex = originalIndex;\n                changeHelper.AddModifiedElement(originalIndex + 1, modifiedIndex);\n                diagonalRelative = (diagonal + 1) - diagonalForwardBase; //Setup for the next iteration\n            }\n            else {\n                // Horizontal line (the element is a deletion)\n                originalIndex = forwardPoints[diagonal - 1] + 1;\n                modifiedIndex = originalIndex - diagonalRelative - diagonalForwardOffset;\n                if (originalIndex < lastOriginalIndex) {\n                    changeHelper.MarkNextChange();\n                }\n                lastOriginalIndex = originalIndex - 1;\n                changeHelper.AddOriginalElement(originalIndex, modifiedIndex + 1);\n                diagonalRelative = (diagonal - 1) - diagonalForwardBase; //Setup for the next iteration\n            }\n            if (historyIndex >= 0) {\n                forwardPoints = this.m_forwardHistory[historyIndex];\n                diagonalForwardBase = forwardPoints[0]; //We stored this in the first spot\n                diagonalMin = 1;\n                diagonalMax = forwardPoints.length - 1;\n            }\n        } while (--historyIndex >= -1);\n        // Ironically, we get the forward changes as the reverse of the\n        // order we added them since we technically added them backwards\n        forwardChanges = changeHelper.getReverseChanges();\n        if (quitEarlyArr[0]) {\n            // TODO: Calculate a partial from the reverse diagonals.\n            //       For now, just assume everything after the midOriginal/midModified point is a diff\n            let originalStartPoint = midOriginalArr[0] + 1;\n            let modifiedStartPoint = midModifiedArr[0] + 1;\n            if (forwardChanges !== null && forwardChanges.length > 0) {\n                const lastForwardChange = forwardChanges[forwardChanges.length - 1];\n                originalStartPoint = Math.max(originalStartPoint, lastForwardChange.getOriginalEnd());\n                modifiedStartPoint = Math.max(modifiedStartPoint, lastForwardChange.getModifiedEnd());\n            }\n            reverseChanges = [\n                new DiffChange(originalStartPoint, originalEnd - originalStartPoint + 1, modifiedStartPoint, modifiedEnd - modifiedStartPoint + 1)\n            ];\n        }\n        else {\n            // Now walk backward through the reverse diagonals history\n            changeHelper = new DiffChangeHelper();\n            diagonalMin = diagonalReverseStart;\n            diagonalMax = diagonalReverseEnd;\n            diagonalRelative = (midOriginalArr[0] - midModifiedArr[0]) - diagonalReverseOffset;\n            lastOriginalIndex = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n            historyIndex = (deltaIsEven) ? this.m_reverseHistory.length - 1 : this.m_reverseHistory.length - 2;\n            do {\n                // Get the diagonal index from the relative diagonal number\n                const diagonal = diagonalRelative + diagonalReverseBase;\n                // Figure out where we came from\n                if (diagonal === diagonalMin || (diagonal < diagonalMax && reversePoints[diagonal - 1] >= reversePoints[diagonal + 1])) {\n                    // Horizontal line (the element is a deletion))\n                    originalIndex = reversePoints[diagonal + 1] - 1;\n                    modifiedIndex = originalIndex - diagonalRelative - diagonalReverseOffset;\n                    if (originalIndex > lastOriginalIndex) {\n                        changeHelper.MarkNextChange();\n                    }\n                    lastOriginalIndex = originalIndex + 1;\n                    changeHelper.AddOriginalElement(originalIndex + 1, modifiedIndex + 1);\n                    diagonalRelative = (diagonal + 1) - diagonalReverseBase; //Setup for the next iteration\n                }\n                else {\n                    // Vertical line (the element is an insertion)\n                    originalIndex = reversePoints[diagonal - 1];\n                    modifiedIndex = originalIndex - diagonalRelative - diagonalReverseOffset;\n                    if (originalIndex > lastOriginalIndex) {\n                        changeHelper.MarkNextChange();\n                    }\n                    lastOriginalIndex = originalIndex;\n                    changeHelper.AddModifiedElement(originalIndex + 1, modifiedIndex + 1);\n                    diagonalRelative = (diagonal - 1) - diagonalReverseBase; //Setup for the next iteration\n                }\n                if (historyIndex >= 0) {\n                    reversePoints = this.m_reverseHistory[historyIndex];\n                    diagonalReverseBase = reversePoints[0]; //We stored this in the first spot\n                    diagonalMin = 1;\n                    diagonalMax = reversePoints.length - 1;\n                }\n            } while (--historyIndex >= -1);\n            // There are cases where the reverse history will find diffs that\n            // are correct, but not intuitive, so we need shift them.\n            reverseChanges = changeHelper.getChanges();\n        }\n        return this.ConcatenateChanges(forwardChanges, reverseChanges);\n    }\n    /**\n     * Given the range to compute the diff on, this method finds the point:\n     * (midOriginal, midModified)\n     * that exists in the middle of the LCS of the two sequences and\n     * is the point at which the LCS problem may be broken down recursively.\n     * This method will try to keep the LCS trace in memory. If the LCS recursion\n     * point is calculated and the full trace is available in memory, then this method\n     * will return the change list.\n     * @param originalStart The start bound of the original sequence range\n     * @param originalEnd The end bound of the original sequence range\n     * @param modifiedStart The start bound of the modified sequence range\n     * @param modifiedEnd The end bound of the modified sequence range\n     * @param midOriginal The middle point of the original sequence range\n     * @param midModified The middle point of the modified sequence range\n     * @returns The diff changes, if available, otherwise null\n     */\n    ComputeRecursionPoint(originalStart, originalEnd, modifiedStart, modifiedEnd, midOriginalArr, midModifiedArr, quitEarlyArr) {\n        let originalIndex = 0, modifiedIndex = 0;\n        let diagonalForwardStart = 0, diagonalForwardEnd = 0;\n        let diagonalReverseStart = 0, diagonalReverseEnd = 0;\n        // To traverse the edit graph and produce the proper LCS, our actual\n        // start position is just outside the given boundary\n        originalStart--;\n        modifiedStart--;\n        // We set these up to make the compiler happy, but they will\n        // be replaced before we return with the actual recursion point\n        midOriginalArr[0] = 0;\n        midModifiedArr[0] = 0;\n        // Clear out the history\n        this.m_forwardHistory = [];\n        this.m_reverseHistory = [];\n        // Each cell in the two arrays corresponds to a diagonal in the edit graph.\n        // The integer value in the cell represents the originalIndex of the furthest\n        // reaching point found so far that ends in that diagonal.\n        // The modifiedIndex can be computed mathematically from the originalIndex and the diagonal number.\n        const maxDifferences = (originalEnd - originalStart) + (modifiedEnd - modifiedStart);\n        const numDiagonals = maxDifferences + 1;\n        const forwardPoints = new Int32Array(numDiagonals);\n        const reversePoints = new Int32Array(numDiagonals);\n        // diagonalForwardBase: Index into forwardPoints of the diagonal which passes through (originalStart, modifiedStart)\n        // diagonalReverseBase: Index into reversePoints of the diagonal which passes through (originalEnd, modifiedEnd)\n        const diagonalForwardBase = (modifiedEnd - modifiedStart);\n        const diagonalReverseBase = (originalEnd - originalStart);\n        // diagonalForwardOffset: Geometric offset which allows modifiedIndex to be computed from originalIndex and the\n        //    diagonal number (relative to diagonalForwardBase)\n        // diagonalReverseOffset: Geometric offset which allows modifiedIndex to be computed from originalIndex and the\n        //    diagonal number (relative to diagonalReverseBase)\n        const diagonalForwardOffset = (originalStart - modifiedStart);\n        const diagonalReverseOffset = (originalEnd - modifiedEnd);\n        // delta: The difference between the end diagonal and the start diagonal. This is used to relate diagonal numbers\n        //   relative to the start diagonal with diagonal numbers relative to the end diagonal.\n        // The Even/Oddn-ness of this delta is important for determining when we should check for overlap\n        const delta = diagonalReverseBase - diagonalForwardBase;\n        const deltaIsEven = (delta % 2 === 0);\n        // Here we set up the start and end points as the furthest points found so far\n        // in both the forward and reverse directions, respectively\n        forwardPoints[diagonalForwardBase] = originalStart;\n        reversePoints[diagonalReverseBase] = originalEnd;\n        // Remember if we quit early, and thus need to do a best-effort result instead of a real result.\n        quitEarlyArr[0] = false;\n        // A couple of points:\n        // --With this method, we iterate on the number of differences between the two sequences.\n        //   The more differences there actually are, the longer this will take.\n        // --Also, as the number of differences increases, we have to search on diagonals further\n        //   away from the reference diagonal (which is diagonalForwardBase for forward, diagonalReverseBase for reverse).\n        // --We extend on even diagonals (relative to the reference diagonal) only when numDifferences\n        //   is even and odd diagonals only when numDifferences is odd.\n        for (let numDifferences = 1; numDifferences <= (maxDifferences / 2) + 1; numDifferences++) {\n            let furthestOriginalIndex = 0;\n            let furthestModifiedIndex = 0;\n            // Run the algorithm in the forward direction\n            diagonalForwardStart = this.ClipDiagonalBound(diagonalForwardBase - numDifferences, numDifferences, diagonalForwardBase, numDiagonals);\n            diagonalForwardEnd = this.ClipDiagonalBound(diagonalForwardBase + numDifferences, numDifferences, diagonalForwardBase, numDiagonals);\n            for (let diagonal = diagonalForwardStart; diagonal <= diagonalForwardEnd; diagonal += 2) {\n                // STEP 1: We extend the furthest reaching point in the present diagonal\n                // by looking at the diagonals above and below and picking the one whose point\n                // is further away from the start point (originalStart, modifiedStart)\n                if (diagonal === diagonalForwardStart || (diagonal < diagonalForwardEnd && forwardPoints[diagonal - 1] < forwardPoints[diagonal + 1])) {\n                    originalIndex = forwardPoints[diagonal + 1];\n                }\n                else {\n                    originalIndex = forwardPoints[diagonal - 1] + 1;\n                }\n                modifiedIndex = originalIndex - (diagonal - diagonalForwardBase) - diagonalForwardOffset;\n                // Save the current originalIndex so we can test for false overlap in step 3\n                const tempOriginalIndex = originalIndex;\n                // STEP 2: We can continue to extend the furthest reaching point in the present diagonal\n                // so long as the elements are equal.\n                while (originalIndex < originalEnd && modifiedIndex < modifiedEnd && this.ElementsAreEqual(originalIndex + 1, modifiedIndex + 1)) {\n                    originalIndex++;\n                    modifiedIndex++;\n                }\n                forwardPoints[diagonal] = originalIndex;\n                if (originalIndex + modifiedIndex > furthestOriginalIndex + furthestModifiedIndex) {\n                    furthestOriginalIndex = originalIndex;\n                    furthestModifiedIndex = modifiedIndex;\n                }\n                // STEP 3: If delta is odd (overlap first happens on forward when delta is odd)\n                // and diagonal is in the range of reverse diagonals computed for numDifferences-1\n                // (the previous iteration; we haven't computed reverse diagonals for numDifferences yet)\n                // then check for overlap.\n                if (!deltaIsEven && Math.abs(diagonal - diagonalReverseBase) <= (numDifferences - 1)) {\n                    if (originalIndex >= reversePoints[diagonal]) {\n                        midOriginalArr[0] = originalIndex;\n                        midModifiedArr[0] = modifiedIndex;\n                        if (tempOriginalIndex <= reversePoints[diagonal] && 1447 /* LocalConstants.MaxDifferencesHistory */ > 0 && numDifferences <= (1447 /* LocalConstants.MaxDifferencesHistory */ + 1)) {\n                            // BINGO! We overlapped, and we have the full trace in memory!\n                            return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr);\n                        }\n                        else {\n                            // Either false overlap, or we didn't have enough memory for the full trace\n                            // Just return the recursion point\n                            return null;\n                        }\n                    }\n                }\n            }\n            // Check to see if we should be quitting early, before moving on to the next iteration.\n            const matchLengthOfLongest = ((furthestOriginalIndex - originalStart) + (furthestModifiedIndex - modifiedStart) - numDifferences) / 2;\n            if (this.ContinueProcessingPredicate !== null && !this.ContinueProcessingPredicate(furthestOriginalIndex, matchLengthOfLongest)) {\n                // We can't finish, so skip ahead to generating a result from what we have.\n                quitEarlyArr[0] = true;\n                // Use the furthest distance we got in the forward direction.\n                midOriginalArr[0] = furthestOriginalIndex;\n                midModifiedArr[0] = furthestModifiedIndex;\n                if (matchLengthOfLongest > 0 && 1447 /* LocalConstants.MaxDifferencesHistory */ > 0 && numDifferences <= (1447 /* LocalConstants.MaxDifferencesHistory */ + 1)) {\n                    // Enough of the history is in memory to walk it backwards\n                    return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr);\n                }\n                else {\n                    // We didn't actually remember enough of the history.\n                    //Since we are quitting the diff early, we need to shift back the originalStart and modified start\n                    //back into the boundary limits since we decremented their value above beyond the boundary limit.\n                    originalStart++;\n                    modifiedStart++;\n                    return [\n                        new DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, modifiedEnd - modifiedStart + 1)\n                    ];\n                }\n            }\n            // Run the algorithm in the reverse direction\n            diagonalReverseStart = this.ClipDiagonalBound(diagonalReverseBase - numDifferences, numDifferences, diagonalReverseBase, numDiagonals);\n            diagonalReverseEnd = this.ClipDiagonalBound(diagonalReverseBase + numDifferences, numDifferences, diagonalReverseBase, numDiagonals);\n            for (let diagonal = diagonalReverseStart; diagonal <= diagonalReverseEnd; diagonal += 2) {\n                // STEP 1: We extend the furthest reaching point in the present diagonal\n                // by looking at the diagonals above and below and picking the one whose point\n                // is further away from the start point (originalEnd, modifiedEnd)\n                if (diagonal === diagonalReverseStart || (diagonal < diagonalReverseEnd && reversePoints[diagonal - 1] >= reversePoints[diagonal + 1])) {\n                    originalIndex = reversePoints[diagonal + 1] - 1;\n                }\n                else {\n                    originalIndex = reversePoints[diagonal - 1];\n                }\n                modifiedIndex = originalIndex - (diagonal - diagonalReverseBase) - diagonalReverseOffset;\n                // Save the current originalIndex so we can test for false overlap\n                const tempOriginalIndex = originalIndex;\n                // STEP 2: We can continue to extend the furthest reaching point in the present diagonal\n                // as long as the elements are equal.\n                while (originalIndex > originalStart && modifiedIndex > modifiedStart && this.ElementsAreEqual(originalIndex, modifiedIndex)) {\n                    originalIndex--;\n                    modifiedIndex--;\n                }\n                reversePoints[diagonal] = originalIndex;\n                // STEP 4: If delta is even (overlap first happens on reverse when delta is even)\n                // and diagonal is in the range of forward diagonals computed for numDifferences\n                // then check for overlap.\n                if (deltaIsEven && Math.abs(diagonal - diagonalForwardBase) <= numDifferences) {\n                    if (originalIndex <= forwardPoints[diagonal]) {\n                        midOriginalArr[0] = originalIndex;\n                        midModifiedArr[0] = modifiedIndex;\n                        if (tempOriginalIndex >= forwardPoints[diagonal] && 1447 /* LocalConstants.MaxDifferencesHistory */ > 0 && numDifferences <= (1447 /* LocalConstants.MaxDifferencesHistory */ + 1)) {\n                            // BINGO! We overlapped, and we have the full trace in memory!\n                            return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr);\n                        }\n                        else {\n                            // Either false overlap, or we didn't have enough memory for the full trace\n                            // Just return the recursion point\n                            return null;\n                        }\n                    }\n                }\n            }\n            // Save current vectors to history before the next iteration\n            if (numDifferences <= 1447 /* LocalConstants.MaxDifferencesHistory */) {\n                // We are allocating space for one extra int, which we fill with\n                // the index of the diagonal base index\n                let temp = new Int32Array(diagonalForwardEnd - diagonalForwardStart + 2);\n                temp[0] = diagonalForwardBase - diagonalForwardStart + 1;\n                MyArray.Copy2(forwardPoints, diagonalForwardStart, temp, 1, diagonalForwardEnd - diagonalForwardStart + 1);\n                this.m_forwardHistory.push(temp);\n                temp = new Int32Array(diagonalReverseEnd - diagonalReverseStart + 2);\n                temp[0] = diagonalReverseBase - diagonalReverseStart + 1;\n                MyArray.Copy2(reversePoints, diagonalReverseStart, temp, 1, diagonalReverseEnd - diagonalReverseStart + 1);\n                this.m_reverseHistory.push(temp);\n            }\n        }\n        // If we got here, then we have the full trace in history. We just have to convert it to a change list\n        // NOTE: This part is a bit messy\n        return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr);\n    }\n    /**\n     * Shifts the given changes to provide a more intuitive diff.\n     * While the first element in a diff matches the first element after the diff,\n     * we shift the diff down.\n     *\n     * @param changes The list of changes to shift\n     * @returns The shifted changes\n     */\n    PrettifyChanges(changes) {\n        // Shift all the changes down first\n        for (let i = 0; i < changes.length; i++) {\n            const change = changes[i];\n            const originalStop = (i < changes.length - 1) ? changes[i + 1].originalStart : this._originalElementsOrHash.length;\n            const modifiedStop = (i < changes.length - 1) ? changes[i + 1].modifiedStart : this._modifiedElementsOrHash.length;\n            const checkOriginal = change.originalLength > 0;\n            const checkModified = change.modifiedLength > 0;\n            while (change.originalStart + change.originalLength < originalStop\n                && change.modifiedStart + change.modifiedLength < modifiedStop\n                && (!checkOriginal || this.OriginalElementsAreEqual(change.originalStart, change.originalStart + change.originalLength))\n                && (!checkModified || this.ModifiedElementsAreEqual(change.modifiedStart, change.modifiedStart + change.modifiedLength))) {\n                const startStrictEqual = this.ElementsAreStrictEqual(change.originalStart, change.modifiedStart);\n                const endStrictEqual = this.ElementsAreStrictEqual(change.originalStart + change.originalLength, change.modifiedStart + change.modifiedLength);\n                if (endStrictEqual && !startStrictEqual) {\n                    // moving the change down would create an equal change, but the elements are not strict equal\n                    break;\n                }\n                change.originalStart++;\n                change.modifiedStart++;\n            }\n            const mergedChangeArr = [null];\n            if (i < changes.length - 1 && this.ChangesOverlap(changes[i], changes[i + 1], mergedChangeArr)) {\n                changes[i] = mergedChangeArr[0];\n                changes.splice(i + 1, 1);\n                i--;\n                continue;\n            }\n        }\n        // Shift changes back up until we hit empty or whitespace-only lines\n        for (let i = changes.length - 1; i >= 0; i--) {\n            const change = changes[i];\n            let originalStop = 0;\n            let modifiedStop = 0;\n            if (i > 0) {\n                const prevChange = changes[i - 1];\n                originalStop = prevChange.originalStart + prevChange.originalLength;\n                modifiedStop = prevChange.modifiedStart + prevChange.modifiedLength;\n            }\n            const checkOriginal = change.originalLength > 0;\n            const checkModified = change.modifiedLength > 0;\n            let bestDelta = 0;\n            let bestScore = this._boundaryScore(change.originalStart, change.originalLength, change.modifiedStart, change.modifiedLength);\n            for (let delta = 1;; delta++) {\n                const originalStart = change.originalStart - delta;\n                const modifiedStart = change.modifiedStart - delta;\n                if (originalStart < originalStop || modifiedStart < modifiedStop) {\n                    break;\n                }\n                if (checkOriginal && !this.OriginalElementsAreEqual(originalStart, originalStart + change.originalLength)) {\n                    break;\n                }\n                if (checkModified && !this.ModifiedElementsAreEqual(modifiedStart, modifiedStart + change.modifiedLength)) {\n                    break;\n                }\n                const touchingPreviousChange = (originalStart === originalStop && modifiedStart === modifiedStop);\n                const score = ((touchingPreviousChange ? 5 : 0)\n                    + this._boundaryScore(originalStart, change.originalLength, modifiedStart, change.modifiedLength));\n                if (score > bestScore) {\n                    bestScore = score;\n                    bestDelta = delta;\n                }\n            }\n            change.originalStart -= bestDelta;\n            change.modifiedStart -= bestDelta;\n            const mergedChangeArr = [null];\n            if (i > 0 && this.ChangesOverlap(changes[i - 1], changes[i], mergedChangeArr)) {\n                changes[i - 1] = mergedChangeArr[0];\n                changes.splice(i, 1);\n                i++;\n                continue;\n            }\n        }\n        // There could be multiple longest common substrings.\n        // Give preference to the ones containing longer lines\n        if (this._hasStrings) {\n            for (let i = 1, len = changes.length; i < len; i++) {\n                const aChange = changes[i - 1];\n                const bChange = changes[i];\n                const matchedLength = bChange.originalStart - aChange.originalStart - aChange.originalLength;\n                const aOriginalStart = aChange.originalStart;\n                const bOriginalEnd = bChange.originalStart + bChange.originalLength;\n                const abOriginalLength = bOriginalEnd - aOriginalStart;\n                const aModifiedStart = aChange.modifiedStart;\n                const bModifiedEnd = bChange.modifiedStart + bChange.modifiedLength;\n                const abModifiedLength = bModifiedEnd - aModifiedStart;\n                // Avoid wasting a lot of time with these searches\n                if (matchedLength < 5 && abOriginalLength < 20 && abModifiedLength < 20) {\n                    const t = this._findBetterContiguousSequence(aOriginalStart, abOriginalLength, aModifiedStart, abModifiedLength, matchedLength);\n                    if (t) {\n                        const [originalMatchStart, modifiedMatchStart] = t;\n                        if (originalMatchStart !== aChange.originalStart + aChange.originalLength || modifiedMatchStart !== aChange.modifiedStart + aChange.modifiedLength) {\n                            // switch to another sequence that has a better score\n                            aChange.originalLength = originalMatchStart - aChange.originalStart;\n                            aChange.modifiedLength = modifiedMatchStart - aChange.modifiedStart;\n                            bChange.originalStart = originalMatchStart + matchedLength;\n                            bChange.modifiedStart = modifiedMatchStart + matchedLength;\n                            bChange.originalLength = bOriginalEnd - bChange.originalStart;\n                            bChange.modifiedLength = bModifiedEnd - bChange.modifiedStart;\n                        }\n                    }\n                }\n            }\n        }\n        return changes;\n    }\n    _findBetterContiguousSequence(originalStart, originalLength, modifiedStart, modifiedLength, desiredLength) {\n        if (originalLength < desiredLength || modifiedLength < desiredLength) {\n            return null;\n        }\n        const originalMax = originalStart + originalLength - desiredLength + 1;\n        const modifiedMax = modifiedStart + modifiedLength - desiredLength + 1;\n        let bestScore = 0;\n        let bestOriginalStart = 0;\n        let bestModifiedStart = 0;\n        for (let i = originalStart; i < originalMax; i++) {\n            for (let j = modifiedStart; j < modifiedMax; j++) {\n                const score = this._contiguousSequenceScore(i, j, desiredLength);\n                if (score > 0 && score > bestScore) {\n                    bestScore = score;\n                    bestOriginalStart = i;\n                    bestModifiedStart = j;\n                }\n            }\n        }\n        if (bestScore > 0) {\n            return [bestOriginalStart, bestModifiedStart];\n        }\n        return null;\n    }\n    _contiguousSequenceScore(originalStart, modifiedStart, length) {\n        let score = 0;\n        for (let l = 0; l < length; l++) {\n            if (!this.ElementsAreEqual(originalStart + l, modifiedStart + l)) {\n                return 0;\n            }\n            score += this._originalStringElements[originalStart + l].length;\n        }\n        return score;\n    }\n    _OriginalIsBoundary(index) {\n        if (index <= 0 || index >= this._originalElementsOrHash.length - 1) {\n            return true;\n        }\n        return (this._hasStrings && /^\\s*$/.test(this._originalStringElements[index]));\n    }\n    _OriginalRegionIsBoundary(originalStart, originalLength) {\n        if (this._OriginalIsBoundary(originalStart) || this._OriginalIsBoundary(originalStart - 1)) {\n            return true;\n        }\n        if (originalLength > 0) {\n            const originalEnd = originalStart + originalLength;\n            if (this._OriginalIsBoundary(originalEnd - 1) || this._OriginalIsBoundary(originalEnd)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    _ModifiedIsBoundary(index) {\n        if (index <= 0 || index >= this._modifiedElementsOrHash.length - 1) {\n            return true;\n        }\n        return (this._hasStrings && /^\\s*$/.test(this._modifiedStringElements[index]));\n    }\n    _ModifiedRegionIsBoundary(modifiedStart, modifiedLength) {\n        if (this._ModifiedIsBoundary(modifiedStart) || this._ModifiedIsBoundary(modifiedStart - 1)) {\n            return true;\n        }\n        if (modifiedLength > 0) {\n            const modifiedEnd = modifiedStart + modifiedLength;\n            if (this._ModifiedIsBoundary(modifiedEnd - 1) || this._ModifiedIsBoundary(modifiedEnd)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    _boundaryScore(originalStart, originalLength, modifiedStart, modifiedLength) {\n        const originalScore = (this._OriginalRegionIsBoundary(originalStart, originalLength) ? 1 : 0);\n        const modifiedScore = (this._ModifiedRegionIsBoundary(modifiedStart, modifiedLength) ? 1 : 0);\n        return (originalScore + modifiedScore);\n    }\n    /**\n     * Concatenates the two input DiffChange lists and returns the resulting\n     * list.\n     * @param The left changes\n     * @param The right changes\n     * @returns The concatenated list\n     */\n    ConcatenateChanges(left, right) {\n        const mergedChangeArr = [];\n        if (left.length === 0 || right.length === 0) {\n            return (right.length > 0) ? right : left;\n        }\n        else if (this.ChangesOverlap(left[left.length - 1], right[0], mergedChangeArr)) {\n            // Since we break the problem down recursively, it is possible that we\n            // might recurse in the middle of a change thereby splitting it into\n            // two changes. Here in the combining stage, we detect and fuse those\n            // changes back together\n            const result = new Array(left.length + right.length - 1);\n            MyArray.Copy(left, 0, result, 0, left.length - 1);\n            result[left.length - 1] = mergedChangeArr[0];\n            MyArray.Copy(right, 1, result, left.length, right.length - 1);\n            return result;\n        }\n        else {\n            const result = new Array(left.length + right.length);\n            MyArray.Copy(left, 0, result, 0, left.length);\n            MyArray.Copy(right, 0, result, left.length, right.length);\n            return result;\n        }\n    }\n    /**\n     * Returns true if the two changes overlap and can be merged into a single\n     * change\n     * @param left The left change\n     * @param right The right change\n     * @param mergedChange The merged change if the two overlap, null otherwise\n     * @returns True if the two changes overlap\n     */\n    ChangesOverlap(left, right, mergedChangeArr) {\n        Debug.Assert(left.originalStart <= right.originalStart, 'Left change is not less than or equal to right change');\n        Debug.Assert(left.modifiedStart <= right.modifiedStart, 'Left change is not less than or equal to right change');\n        if (left.originalStart + left.originalLength >= right.originalStart || left.modifiedStart + left.modifiedLength >= right.modifiedStart) {\n            const originalStart = left.originalStart;\n            let originalLength = left.originalLength;\n            const modifiedStart = left.modifiedStart;\n            let modifiedLength = left.modifiedLength;\n            if (left.originalStart + left.originalLength >= right.originalStart) {\n                originalLength = right.originalStart + right.originalLength - left.originalStart;\n            }\n            if (left.modifiedStart + left.modifiedLength >= right.modifiedStart) {\n                modifiedLength = right.modifiedStart + right.modifiedLength - left.modifiedStart;\n            }\n            mergedChangeArr[0] = new DiffChange(originalStart, originalLength, modifiedStart, modifiedLength);\n            return true;\n        }\n        else {\n            mergedChangeArr[0] = null;\n            return false;\n        }\n    }\n    /**\n     * Helper method used to clip a diagonal index to the range of valid\n     * diagonals. This also decides whether or not the diagonal index,\n     * if it exceeds the boundary, should be clipped to the boundary or clipped\n     * one inside the boundary depending on the Even/Odd status of the boundary\n     * and numDifferences.\n     * @param diagonal The index of the diagonal to clip.\n     * @param numDifferences The current number of differences being iterated upon.\n     * @param diagonalBaseIndex The base reference diagonal.\n     * @param numDiagonals The total number of diagonals.\n     * @returns The clipped diagonal index.\n     */\n    ClipDiagonalBound(diagonal, numDifferences, diagonalBaseIndex, numDiagonals) {\n        if (diagonal >= 0 && diagonal < numDiagonals) {\n            // Nothing to clip, its in range\n            return diagonal;\n        }\n        // diagonalsBelow: The number of diagonals below the reference diagonal\n        // diagonalsAbove: The number of diagonals above the reference diagonal\n        const diagonalsBelow = diagonalBaseIndex;\n        const diagonalsAbove = numDiagonals - diagonalBaseIndex - 1;\n        const diffEven = (numDifferences % 2 === 0);\n        if (diagonal < 0) {\n            const lowerBoundEven = (diagonalsBelow % 2 === 0);\n            return (diffEven === lowerBoundEven) ? 0 : 1;\n        }\n        else {\n            const upperBoundEven = (diagonalsAbove % 2 === 0);\n            return (diffEven === upperBoundEven) ? numDiagonals - 1 : numDiagonals - 2;\n        }\n    }\n}\n\nexport { LcsDiff, StringDiffSequence, stringDiff };\n","import { TreeError } from './tree.js';\nimport { splice, tail } from '../../../common/arrays.js';\nimport { Delayer } from '../../../common/async.js';\nimport { MicrotaskDelay } from '../../../common/symbols.js';\nimport { LcsDiff } from '../../../common/diff/diff.js';\nimport { EventBufferer, Emitter } from '../../../common/event.js';\nimport { Iterable } from '../../../common/iterator.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction isFilterResult(obj) {\n    return !!obj && obj.visibility !== undefined;\n}\nfunction getVisibleState(visibility) {\n    switch (visibility) {\n        case true: return 1 /* TreeVisibility.Visible */;\n        case false: return 0 /* TreeVisibility.Hidden */;\n        default: return visibility;\n    }\n}\nfunction isCollapsibleStateUpdate(update) {\n    return 'collapsible' in update;\n}\nclass IndexTreeModel {\n    constructor(user, rootElement, options = {}) {\n        this.user = user;\n        this.rootRef = [];\n        this.eventBufferer = new EventBufferer();\n        this._onDidSpliceModel = new Emitter();\n        this.onDidSpliceModel = this._onDidSpliceModel.event;\n        this._onDidSpliceRenderedNodes = new Emitter();\n        this.onDidSpliceRenderedNodes = this._onDidSpliceRenderedNodes.event;\n        this._onDidChangeCollapseState = new Emitter();\n        this.onDidChangeCollapseState = this.eventBufferer.wrapEvent(this._onDidChangeCollapseState.event);\n        this._onDidChangeRenderNodeCount = new Emitter();\n        this.onDidChangeRenderNodeCount = this.eventBufferer.wrapEvent(this._onDidChangeRenderNodeCount.event);\n        this.refilterDelayer = new Delayer(MicrotaskDelay);\n        this.collapseByDefault = typeof options.collapseByDefault === 'undefined' ? false : options.collapseByDefault;\n        this.allowNonCollapsibleParents = options.allowNonCollapsibleParents ?? false;\n        this.filter = options.filter;\n        this.autoExpandSingleChildren = typeof options.autoExpandSingleChildren === 'undefined' ? false : options.autoExpandSingleChildren;\n        this.root = {\n            parent: undefined,\n            element: rootElement,\n            children: [],\n            depth: 0,\n            visibleChildrenCount: 0,\n            visibleChildIndex: -1,\n            collapsible: false,\n            collapsed: false,\n            renderNodeCount: 0,\n            visibility: 1 /* TreeVisibility.Visible */,\n            visible: true,\n            filterData: undefined\n        };\n    }\n    splice(location, deleteCount, toInsert = Iterable.empty(), options = {}) {\n        if (location.length === 0) {\n            throw new TreeError(this.user, 'Invalid tree location');\n        }\n        if (options.diffIdentityProvider) {\n            this.spliceSmart(options.diffIdentityProvider, location, deleteCount, toInsert, options);\n        }\n        else {\n            this.spliceSimple(location, deleteCount, toInsert, options);\n        }\n    }\n    spliceSmart(identity, location, deleteCount, toInsertIterable = Iterable.empty(), options, recurseLevels = options.diffDepth ?? 0) {\n        const { parentNode } = this.getParentNodeWithListIndex(location);\n        if (!parentNode.lastDiffIds) {\n            return this.spliceSimple(location, deleteCount, toInsertIterable, options);\n        }\n        const toInsert = [...toInsertIterable];\n        const index = location[location.length - 1];\n        const diff = new LcsDiff({ getElements: () => parentNode.lastDiffIds }, {\n            getElements: () => [\n                ...parentNode.children.slice(0, index),\n                ...toInsert,\n                ...parentNode.children.slice(index + deleteCount),\n            ].map(e => identity.getId(e.element).toString())\n        }).ComputeDiff(false);\n        // if we were given a 'best effort' diff, use default behavior\n        if (diff.quitEarly) {\n            parentNode.lastDiffIds = undefined;\n            return this.spliceSimple(location, deleteCount, toInsert, options);\n        }\n        const locationPrefix = location.slice(0, -1);\n        const recurseSplice = (fromOriginal, fromModified, count) => {\n            if (recurseLevels > 0) {\n                for (let i = 0; i < count; i++) {\n                    fromOriginal--;\n                    fromModified--;\n                    this.spliceSmart(identity, [...locationPrefix, fromOriginal, 0], Number.MAX_SAFE_INTEGER, toInsert[fromModified].children, options, recurseLevels - 1);\n                }\n            }\n        };\n        let lastStartO = Math.min(parentNode.children.length, index + deleteCount);\n        let lastStartM = toInsert.length;\n        for (const change of diff.changes.sort((a, b) => b.originalStart - a.originalStart)) {\n            recurseSplice(lastStartO, lastStartM, lastStartO - (change.originalStart + change.originalLength));\n            lastStartO = change.originalStart;\n            lastStartM = change.modifiedStart - index;\n            this.spliceSimple([...locationPrefix, lastStartO], change.originalLength, Iterable.slice(toInsert, lastStartM, lastStartM + change.modifiedLength), options);\n        }\n        // at this point, startO === startM === count since any remaining prefix should match\n        recurseSplice(lastStartO, lastStartM, lastStartO);\n    }\n    spliceSimple(location, deleteCount, toInsert = Iterable.empty(), { onDidCreateNode, onDidDeleteNode, diffIdentityProvider }) {\n        const { parentNode, listIndex, revealed, visible } = this.getParentNodeWithListIndex(location);\n        const treeListElementsToInsert = [];\n        const nodesToInsertIterator = Iterable.map(toInsert, el => this.createTreeNode(el, parentNode, parentNode.visible ? 1 /* TreeVisibility.Visible */ : 0 /* TreeVisibility.Hidden */, revealed, treeListElementsToInsert, onDidCreateNode));\n        const lastIndex = location[location.length - 1];\n        // figure out what's the visible child start index right before the\n        // splice point\n        let visibleChildStartIndex = 0;\n        for (let i = lastIndex; i >= 0 && i < parentNode.children.length; i--) {\n            const child = parentNode.children[i];\n            if (child.visible) {\n                visibleChildStartIndex = child.visibleChildIndex;\n                break;\n            }\n        }\n        const nodesToInsert = [];\n        let insertedVisibleChildrenCount = 0;\n        let renderNodeCount = 0;\n        for (const child of nodesToInsertIterator) {\n            nodesToInsert.push(child);\n            renderNodeCount += child.renderNodeCount;\n            if (child.visible) {\n                child.visibleChildIndex = visibleChildStartIndex + insertedVisibleChildrenCount++;\n            }\n        }\n        const deletedNodes = splice(parentNode.children, lastIndex, deleteCount, nodesToInsert);\n        if (!diffIdentityProvider) {\n            parentNode.lastDiffIds = undefined;\n        }\n        else if (parentNode.lastDiffIds) {\n            splice(parentNode.lastDiffIds, lastIndex, deleteCount, nodesToInsert.map(n => diffIdentityProvider.getId(n.element).toString()));\n        }\n        else {\n            parentNode.lastDiffIds = parentNode.children.map(n => diffIdentityProvider.getId(n.element).toString());\n        }\n        // figure out what is the count of deleted visible children\n        let deletedVisibleChildrenCount = 0;\n        for (const child of deletedNodes) {\n            if (child.visible) {\n                deletedVisibleChildrenCount++;\n            }\n        }\n        // and adjust for all visible children after the splice point\n        if (deletedVisibleChildrenCount !== 0) {\n            for (let i = lastIndex + nodesToInsert.length; i < parentNode.children.length; i++) {\n                const child = parentNode.children[i];\n                if (child.visible) {\n                    child.visibleChildIndex -= deletedVisibleChildrenCount;\n                }\n            }\n        }\n        // update parent's visible children count\n        parentNode.visibleChildrenCount += insertedVisibleChildrenCount - deletedVisibleChildrenCount;\n        if (deletedNodes.length > 0 && onDidDeleteNode) {\n            const visit = (node) => {\n                onDidDeleteNode(node);\n                node.children.forEach(visit);\n            };\n            deletedNodes.forEach(visit);\n        }\n        if (revealed && visible) {\n            const visibleDeleteCount = deletedNodes.reduce((r, node) => r + (node.visible ? node.renderNodeCount : 0), 0);\n            this._updateAncestorsRenderNodeCount(parentNode, renderNodeCount - visibleDeleteCount);\n            this._onDidSpliceRenderedNodes.fire({ start: listIndex, deleteCount: visibleDeleteCount, elements: treeListElementsToInsert });\n        }\n        this._onDidSpliceModel.fire({ insertedNodes: nodesToInsert, deletedNodes });\n        let node = parentNode;\n        while (node) {\n            if (node.visibility === 2 /* TreeVisibility.Recurse */) {\n                // delayed to avoid excessive refiltering, see #135941\n                this.refilterDelayer.trigger(() => this.refilter());\n                break;\n            }\n            node = node.parent;\n        }\n    }\n    rerender(location) {\n        if (location.length === 0) {\n            throw new TreeError(this.user, 'Invalid tree location');\n        }\n        const { node, listIndex, revealed } = this.getTreeNodeWithListIndex(location);\n        if (node.visible && revealed) {\n            this._onDidSpliceRenderedNodes.fire({ start: listIndex, deleteCount: 1, elements: [node] });\n        }\n    }\n    has(location) {\n        return this.hasTreeNode(location);\n    }\n    getListIndex(location) {\n        const { listIndex, visible, revealed } = this.getTreeNodeWithListIndex(location);\n        return visible && revealed ? listIndex : -1;\n    }\n    getListRenderCount(location) {\n        return this.getTreeNode(location).renderNodeCount;\n    }\n    isCollapsible(location) {\n        return this.getTreeNode(location).collapsible;\n    }\n    setCollapsible(location, collapsible) {\n        const node = this.getTreeNode(location);\n        if (typeof collapsible === 'undefined') {\n            collapsible = !node.collapsible;\n        }\n        const update = { collapsible };\n        return this.eventBufferer.bufferEvents(() => this._setCollapseState(location, update));\n    }\n    isCollapsed(location) {\n        return this.getTreeNode(location).collapsed;\n    }\n    setCollapsed(location, collapsed, recursive) {\n        const node = this.getTreeNode(location);\n        if (typeof collapsed === 'undefined') {\n            collapsed = !node.collapsed;\n        }\n        const update = { collapsed, recursive: recursive || false };\n        return this.eventBufferer.bufferEvents(() => this._setCollapseState(location, update));\n    }\n    _setCollapseState(location, update) {\n        const { node, listIndex, revealed } = this.getTreeNodeWithListIndex(location);\n        const result = this._setListNodeCollapseState(node, listIndex, revealed, update);\n        if (node !== this.root && this.autoExpandSingleChildren && result && !isCollapsibleStateUpdate(update) && node.collapsible && !node.collapsed && !update.recursive) {\n            let onlyVisibleChildIndex = -1;\n            for (let i = 0; i < node.children.length; i++) {\n                const child = node.children[i];\n                if (child.visible) {\n                    if (onlyVisibleChildIndex > -1) {\n                        onlyVisibleChildIndex = -1;\n                        break;\n                    }\n                    else {\n                        onlyVisibleChildIndex = i;\n                    }\n                }\n            }\n            if (onlyVisibleChildIndex > -1) {\n                this._setCollapseState([...location, onlyVisibleChildIndex], update);\n            }\n        }\n        return result;\n    }\n    _setListNodeCollapseState(node, listIndex, revealed, update) {\n        const result = this._setNodeCollapseState(node, update, false);\n        if (!revealed || !node.visible || !result) {\n            return result;\n        }\n        const previousRenderNodeCount = node.renderNodeCount;\n        const toInsert = this.updateNodeAfterCollapseChange(node);\n        const deleteCount = previousRenderNodeCount - (listIndex === -1 ? 0 : 1);\n        this._onDidSpliceRenderedNodes.fire({ start: listIndex + 1, deleteCount: deleteCount, elements: toInsert.slice(1) });\n        return result;\n    }\n    _setNodeCollapseState(node, update, deep) {\n        let result;\n        if (node === this.root) {\n            result = false;\n        }\n        else {\n            if (isCollapsibleStateUpdate(update)) {\n                result = node.collapsible !== update.collapsible;\n                node.collapsible = update.collapsible;\n            }\n            else if (!node.collapsible) {\n                result = false;\n            }\n            else {\n                result = node.collapsed !== update.collapsed;\n                node.collapsed = update.collapsed;\n            }\n            if (result) {\n                this._onDidChangeCollapseState.fire({ node, deep });\n            }\n        }\n        if (!isCollapsibleStateUpdate(update) && update.recursive) {\n            for (const child of node.children) {\n                result = this._setNodeCollapseState(child, update, true) || result;\n            }\n        }\n        return result;\n    }\n    expandTo(location) {\n        this.eventBufferer.bufferEvents(() => {\n            let node = this.getTreeNode(location);\n            while (node.parent) {\n                node = node.parent;\n                location = location.slice(0, location.length - 1);\n                if (node.collapsed) {\n                    this._setCollapseState(location, { collapsed: false, recursive: false });\n                }\n            }\n        });\n    }\n    refilter() {\n        const previousRenderNodeCount = this.root.renderNodeCount;\n        const toInsert = this.updateNodeAfterFilterChange(this.root);\n        this._onDidSpliceRenderedNodes.fire({ start: 0, deleteCount: previousRenderNodeCount, elements: toInsert });\n        this.refilterDelayer.cancel();\n    }\n    createTreeNode(treeElement, parent, parentVisibility, revealed, treeListElements, onDidCreateNode) {\n        const node = {\n            parent,\n            element: treeElement.element,\n            children: [],\n            depth: parent.depth + 1,\n            visibleChildrenCount: 0,\n            visibleChildIndex: -1,\n            collapsible: typeof treeElement.collapsible === 'boolean' ? treeElement.collapsible : (typeof treeElement.collapsed !== 'undefined'),\n            collapsed: typeof treeElement.collapsed === 'undefined' ? this.collapseByDefault : treeElement.collapsed,\n            renderNodeCount: 1,\n            visibility: 1 /* TreeVisibility.Visible */,\n            visible: true,\n            filterData: undefined\n        };\n        const visibility = this._filterNode(node, parentVisibility);\n        node.visibility = visibility;\n        if (revealed) {\n            treeListElements.push(node);\n        }\n        const childElements = treeElement.children || Iterable.empty();\n        const childRevealed = revealed && visibility !== 0 /* TreeVisibility.Hidden */ && !node.collapsed;\n        let visibleChildrenCount = 0;\n        let renderNodeCount = 1;\n        for (const el of childElements) {\n            const child = this.createTreeNode(el, node, visibility, childRevealed, treeListElements, onDidCreateNode);\n            node.children.push(child);\n            renderNodeCount += child.renderNodeCount;\n            if (child.visible) {\n                child.visibleChildIndex = visibleChildrenCount++;\n            }\n        }\n        if (!this.allowNonCollapsibleParents) {\n            node.collapsible = node.collapsible || node.children.length > 0;\n        }\n        node.visibleChildrenCount = visibleChildrenCount;\n        node.visible = visibility === 2 /* TreeVisibility.Recurse */ ? visibleChildrenCount > 0 : (visibility === 1 /* TreeVisibility.Visible */);\n        if (!node.visible) {\n            node.renderNodeCount = 0;\n            if (revealed) {\n                treeListElements.pop();\n            }\n        }\n        else if (!node.collapsed) {\n            node.renderNodeCount = renderNodeCount;\n        }\n        onDidCreateNode?.(node);\n        return node;\n    }\n    updateNodeAfterCollapseChange(node) {\n        const previousRenderNodeCount = node.renderNodeCount;\n        const result = [];\n        this._updateNodeAfterCollapseChange(node, result);\n        this._updateAncestorsRenderNodeCount(node.parent, result.length - previousRenderNodeCount);\n        return result;\n    }\n    _updateNodeAfterCollapseChange(node, result) {\n        if (node.visible === false) {\n            return 0;\n        }\n        result.push(node);\n        node.renderNodeCount = 1;\n        if (!node.collapsed) {\n            for (const child of node.children) {\n                node.renderNodeCount += this._updateNodeAfterCollapseChange(child, result);\n            }\n        }\n        this._onDidChangeRenderNodeCount.fire(node);\n        return node.renderNodeCount;\n    }\n    updateNodeAfterFilterChange(node) {\n        const previousRenderNodeCount = node.renderNodeCount;\n        const result = [];\n        this._updateNodeAfterFilterChange(node, node.visible ? 1 /* TreeVisibility.Visible */ : 0 /* TreeVisibility.Hidden */, result);\n        this._updateAncestorsRenderNodeCount(node.parent, result.length - previousRenderNodeCount);\n        return result;\n    }\n    _updateNodeAfterFilterChange(node, parentVisibility, result, revealed = true) {\n        let visibility;\n        if (node !== this.root) {\n            visibility = this._filterNode(node, parentVisibility);\n            if (visibility === 0 /* TreeVisibility.Hidden */) {\n                node.visible = false;\n                node.renderNodeCount = 0;\n                return false;\n            }\n            if (revealed) {\n                result.push(node);\n            }\n        }\n        const resultStartLength = result.length;\n        node.renderNodeCount = node === this.root ? 0 : 1;\n        let hasVisibleDescendants = false;\n        if (!node.collapsed || visibility !== 0 /* TreeVisibility.Hidden */) {\n            let visibleChildIndex = 0;\n            for (const child of node.children) {\n                hasVisibleDescendants = this._updateNodeAfterFilterChange(child, visibility, result, revealed && !node.collapsed) || hasVisibleDescendants;\n                if (child.visible) {\n                    child.visibleChildIndex = visibleChildIndex++;\n                }\n            }\n            node.visibleChildrenCount = visibleChildIndex;\n        }\n        else {\n            node.visibleChildrenCount = 0;\n        }\n        if (node !== this.root) {\n            node.visible = visibility === 2 /* TreeVisibility.Recurse */ ? hasVisibleDescendants : (visibility === 1 /* TreeVisibility.Visible */);\n            node.visibility = visibility;\n        }\n        if (!node.visible) {\n            node.renderNodeCount = 0;\n            if (revealed) {\n                result.pop();\n            }\n        }\n        else if (!node.collapsed) {\n            node.renderNodeCount += result.length - resultStartLength;\n        }\n        this._onDidChangeRenderNodeCount.fire(node);\n        return node.visible;\n    }\n    _updateAncestorsRenderNodeCount(node, diff) {\n        if (diff === 0) {\n            return;\n        }\n        while (node) {\n            node.renderNodeCount += diff;\n            this._onDidChangeRenderNodeCount.fire(node);\n            node = node.parent;\n        }\n    }\n    _filterNode(node, parentVisibility) {\n        const result = this.filter ? this.filter.filter(node.element, parentVisibility) : 1 /* TreeVisibility.Visible */;\n        if (typeof result === 'boolean') {\n            node.filterData = undefined;\n            return result ? 1 /* TreeVisibility.Visible */ : 0 /* TreeVisibility.Hidden */;\n        }\n        else if (isFilterResult(result)) {\n            node.filterData = result.data;\n            return getVisibleState(result.visibility);\n        }\n        else {\n            node.filterData = undefined;\n            return getVisibleState(result);\n        }\n    }\n    // cheap\n    hasTreeNode(location, node = this.root) {\n        if (!location || location.length === 0) {\n            return true;\n        }\n        const [index, ...rest] = location;\n        if (index < 0 || index > node.children.length) {\n            return false;\n        }\n        return this.hasTreeNode(rest, node.children[index]);\n    }\n    // cheap\n    getTreeNode(location, node = this.root) {\n        if (!location || location.length === 0) {\n            return node;\n        }\n        const [index, ...rest] = location;\n        if (index < 0 || index > node.children.length) {\n            throw new TreeError(this.user, 'Invalid tree location');\n        }\n        return this.getTreeNode(rest, node.children[index]);\n    }\n    // expensive\n    getTreeNodeWithListIndex(location) {\n        if (location.length === 0) {\n            return { node: this.root, listIndex: -1, revealed: true, visible: false };\n        }\n        const { parentNode, listIndex, revealed, visible } = this.getParentNodeWithListIndex(location);\n        const index = location[location.length - 1];\n        if (index < 0 || index > parentNode.children.length) {\n            throw new TreeError(this.user, 'Invalid tree location');\n        }\n        const node = parentNode.children[index];\n        return { node, listIndex, revealed, visible: visible && node.visible };\n    }\n    getParentNodeWithListIndex(location, node = this.root, listIndex = 0, revealed = true, visible = true) {\n        const [index, ...rest] = location;\n        if (index < 0 || index > node.children.length) {\n            throw new TreeError(this.user, 'Invalid tree location');\n        }\n        // TODO@joao perf!\n        for (let i = 0; i < index; i++) {\n            listIndex += node.children[i].renderNodeCount;\n        }\n        revealed = revealed && !node.collapsed;\n        visible = visible && node.visible;\n        if (rest.length === 0) {\n            return { parentNode: node, listIndex, revealed, visible };\n        }\n        return this.getParentNodeWithListIndex(rest, node.children[index], listIndex + 1, revealed, visible);\n    }\n    getNode(location = []) {\n        return this.getTreeNode(location);\n    }\n    // TODO@joao perf!\n    getNodeLocation(node) {\n        const location = [];\n        let indexTreeNode = node; // typing woes\n        while (indexTreeNode.parent) {\n            location.push(indexTreeNode.parent.children.indexOf(indexTreeNode));\n            indexTreeNode = indexTreeNode.parent;\n        }\n        return location.reverse();\n    }\n    getParentNodeLocation(location) {\n        if (location.length === 0) {\n            return undefined;\n        }\n        else if (location.length === 1) {\n            return [];\n        }\n        else {\n            return tail(location)[0];\n        }\n    }\n    getFirstElementChild(location) {\n        const node = this.getTreeNode(location);\n        if (node.children.length === 0) {\n            return undefined;\n        }\n        return node.children[0].element;\n    }\n}\n\nexport { IndexTreeModel, getVisibleState, isFilterResult };\n","import { isEditableElement, isKeyboardEvent, hasParentWithClass, append, $, clearNode, addDisposableListener } from '../../dom.js';\nimport { createStyleSheet } from '../../domStylesheets.js';\nimport { asCssValueWithDefault } from '../../cssValue.js';\nimport { Event, EventBufferer, Emitter, Relay } from '../../../common/event.js';\nimport { StandardKeyboardEvent } from '../../keyboardEvent.js';\nimport '../../browser.js';\nimport '../../dnd.js';\nimport '../../touch.js';\nimport '../hover/hoverDelegateFactory.js';\nimport '../../../common/platform.js';\nimport { DisposableStore, dispose, Disposable, toDisposable } from '../../../common/lifecycle.js';\nimport '../selectBox/selectBox.css';\nimport '../selectBox/selectBoxCustom.js';\nimport { equals, distinct, range } from '../../../common/arrays.js';\nimport '../../../common/actions.js';\nimport '../actionbar/actionbar.css';\nimport { localize } from '../../../../nls.js';\nimport '../findinput/findInput.js';\nimport { alert } from '../aria/aria.js';\nimport '../scrollbar/scrollableElement.js';\nimport '../inputbox/inputBox.css';\nimport { ElementsDragAndDropData } from '../list/listView.js';\nimport { isStickyScrollContainer, List, MouseController, isButton, isMonacoEditor, isStickyScrollElement, isMonacoCustomToggle, isActionItem } from '../list/listWidget.js';\nimport '../toggle/toggle.js';\nimport { isFilterResult, getVisibleState } from './indexTreeModel.js';\nimport { TreeMouseEventTarget } from './tree.js';\nimport { Delayer, disposableTimeout } from '../../../common/async.js';\nimport { Codicon } from '../../../common/codicons.js';\nimport { ThemeIcon } from '../../../common/themables.js';\nimport { SetMap } from '../../../common/map.js';\nimport { FuzzyScore, fuzzyScore } from '../../../common/filters.js';\nimport { clamp } from '../../../common/numbers.js';\nimport './media/tree.css';\nimport '../../../common/observableInternal/index.js';\nimport { constObservable } from '../../../common/observableInternal/observables/constObservable.js';\nimport { autorun } from '../../../common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nclass TreeElementsDragAndDropData extends ElementsDragAndDropData {\n    constructor(data) {\n        super(data.elements.map(node => node.element));\n        this.data = data;\n    }\n}\nfunction asTreeDragAndDropData(data) {\n    if (data instanceof ElementsDragAndDropData) {\n        return new TreeElementsDragAndDropData(data);\n    }\n    return data;\n}\nclass TreeNodeListDragAndDrop {\n    constructor(modelProvider, dnd) {\n        this.modelProvider = modelProvider;\n        this.dnd = dnd;\n        this.autoExpandDisposable = Disposable.None;\n        this.disposables = new DisposableStore();\n    }\n    getDragURI(node) {\n        return this.dnd.getDragURI(node.element);\n    }\n    getDragLabel(nodes, originalEvent) {\n        if (this.dnd.getDragLabel) {\n            return this.dnd.getDragLabel(nodes.map(node => node.element), originalEvent);\n        }\n        return undefined;\n    }\n    onDragStart(data, originalEvent) {\n        this.dnd.onDragStart?.(asTreeDragAndDropData(data), originalEvent);\n    }\n    onDragOver(data, targetNode, targetIndex, targetSector, originalEvent, raw = true) {\n        const result = this.dnd.onDragOver(asTreeDragAndDropData(data), targetNode && targetNode.element, targetIndex, targetSector, originalEvent);\n        const didChangeAutoExpandNode = this.autoExpandNode !== targetNode;\n        if (didChangeAutoExpandNode) {\n            this.autoExpandDisposable.dispose();\n            this.autoExpandNode = targetNode;\n        }\n        if (typeof targetNode === 'undefined') {\n            return result;\n        }\n        if (didChangeAutoExpandNode && typeof result !== 'boolean' && result.autoExpand) {\n            this.autoExpandDisposable = disposableTimeout(() => {\n                const model = this.modelProvider();\n                const ref = model.getNodeLocation(targetNode);\n                if (model.isCollapsed(ref)) {\n                    model.setCollapsed(ref, false);\n                }\n                this.autoExpandNode = undefined;\n            }, 500, this.disposables);\n        }\n        if (typeof result === 'boolean' || !result.accept || typeof result.bubble === 'undefined' || result.feedback) {\n            if (!raw) {\n                const accept = typeof result === 'boolean' ? result : result.accept;\n                const effect = typeof result === 'boolean' ? undefined : result.effect;\n                return { accept, effect, feedback: [targetIndex] };\n            }\n            return result;\n        }\n        if (result.bubble === 1 /* TreeDragOverBubble.Up */) {\n            const model = this.modelProvider();\n            const ref = model.getNodeLocation(targetNode);\n            const parentRef = model.getParentNodeLocation(ref);\n            const parentNode = model.getNode(parentRef);\n            const parentIndex = parentRef && model.getListIndex(parentRef);\n            return this.onDragOver(data, parentNode, parentIndex, targetSector, originalEvent, false);\n        }\n        const model = this.modelProvider();\n        const ref = model.getNodeLocation(targetNode);\n        const start = model.getListIndex(ref);\n        const length = model.getListRenderCount(ref);\n        return { ...result, feedback: range(start, start + length) };\n    }\n    drop(data, targetNode, targetIndex, targetSector, originalEvent) {\n        this.autoExpandDisposable.dispose();\n        this.autoExpandNode = undefined;\n        this.dnd.drop(asTreeDragAndDropData(data), targetNode && targetNode.element, targetIndex, targetSector, originalEvent);\n    }\n    onDragEnd(originalEvent) {\n        this.dnd.onDragEnd?.(originalEvent);\n    }\n    dispose() {\n        this.disposables.dispose();\n        this.dnd.dispose();\n    }\n}\nfunction asListOptions(modelProvider, disposableStore, options) {\n    return options && {\n        ...options,\n        identityProvider: options.identityProvider && {\n            getId(el) {\n                return options.identityProvider.getId(el.element);\n            }\n        },\n        dnd: options.dnd && disposableStore.add(new TreeNodeListDragAndDrop(modelProvider, options.dnd)),\n        multipleSelectionController: options.multipleSelectionController && {\n            isSelectionSingleChangeEvent(e) {\n                // eslint-disable-next-line local/code-no-dangerous-type-assertions\n                return options.multipleSelectionController.isSelectionSingleChangeEvent({ ...e, element: e.element });\n            },\n            isSelectionRangeChangeEvent(e) {\n                // eslint-disable-next-line local/code-no-dangerous-type-assertions\n                return options.multipleSelectionController.isSelectionRangeChangeEvent({ ...e, element: e.element });\n            }\n        },\n        accessibilityProvider: options.accessibilityProvider && {\n            ...options.accessibilityProvider,\n            getSetSize(node) {\n                const model = modelProvider();\n                const ref = model.getNodeLocation(node);\n                const parentRef = model.getParentNodeLocation(ref);\n                const parentNode = model.getNode(parentRef);\n                return parentNode.visibleChildrenCount;\n            },\n            getPosInSet(node) {\n                return node.visibleChildIndex + 1;\n            },\n            isChecked: options.accessibilityProvider && options.accessibilityProvider.isChecked ? (node) => {\n                return options.accessibilityProvider.isChecked(node.element);\n            } : undefined,\n            getRole: options.accessibilityProvider && options.accessibilityProvider.getRole ? (node) => {\n                return options.accessibilityProvider.getRole(node.element);\n            } : () => 'treeitem',\n            getAriaLabel(e) {\n                return options.accessibilityProvider.getAriaLabel(e.element);\n            },\n            getWidgetAriaLabel() {\n                return options.accessibilityProvider.getWidgetAriaLabel();\n            },\n            getWidgetRole: options.accessibilityProvider && options.accessibilityProvider.getWidgetRole ? () => options.accessibilityProvider.getWidgetRole() : () => 'tree',\n            getAriaLevel: options.accessibilityProvider && options.accessibilityProvider.getAriaLevel ? (node) => options.accessibilityProvider.getAriaLevel(node.element) : (node) => {\n                return node.depth;\n            },\n            getActiveDescendantId: options.accessibilityProvider.getActiveDescendantId && (node => {\n                return options.accessibilityProvider.getActiveDescendantId(node.element);\n            })\n        },\n        keyboardNavigationLabelProvider: options.keyboardNavigationLabelProvider && {\n            ...options.keyboardNavigationLabelProvider,\n            getKeyboardNavigationLabel(node) {\n                return options.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(node.element);\n            }\n        }\n    };\n}\nclass ComposedTreeDelegate {\n    constructor(delegate) {\n        this.delegate = delegate;\n    }\n    getHeight(element) {\n        return this.delegate.getHeight(element.element);\n    }\n    getTemplateId(element) {\n        return this.delegate.getTemplateId(element.element);\n    }\n    hasDynamicHeight(element) {\n        return !!this.delegate.hasDynamicHeight && this.delegate.hasDynamicHeight(element.element);\n    }\n    setDynamicHeight(element, height) {\n        this.delegate.setDynamicHeight?.(element.element, height);\n    }\n}\nvar RenderIndentGuides;\n(function (RenderIndentGuides) {\n    RenderIndentGuides[\"None\"] = \"none\";\n    RenderIndentGuides[\"OnHover\"] = \"onHover\";\n    RenderIndentGuides[\"Always\"] = \"always\";\n})(RenderIndentGuides || (RenderIndentGuides = {}));\nclass EventCollection {\n    get elements() {\n        return this._elements;\n    }\n    constructor(onDidChange, _elements = []) {\n        this._elements = _elements;\n        this.disposables = new DisposableStore();\n        this.onDidChange = Event.forEach(onDidChange, elements => this._elements = elements, this.disposables);\n    }\n    dispose() {\n        this.disposables.dispose();\n    }\n}\nclass TreeRenderer {\n    static { this.DefaultIndent = 8; }\n    constructor(renderer, model, onDidChangeCollapseState, activeNodes, renderedIndentGuides, options = {}) {\n        this.renderer = renderer;\n        this.model = model;\n        this.activeNodes = activeNodes;\n        this.renderedIndentGuides = renderedIndentGuides;\n        this.renderedElements = new Map();\n        this.renderedNodes = new Map();\n        this.indent = TreeRenderer.DefaultIndent;\n        this.hideTwistiesOfChildlessElements = false;\n        this.shouldRenderIndentGuides = false;\n        this.activeIndentNodes = new Set();\n        this.indentGuidesDisposable = Disposable.None;\n        this.disposables = new DisposableStore();\n        this.templateId = renderer.templateId;\n        this.updateOptions(options);\n        Event.map(onDidChangeCollapseState, e => e.node)(this.onDidChangeNodeTwistieState, this, this.disposables);\n        renderer.onDidChangeTwistieState?.(this.onDidChangeTwistieState, this, this.disposables);\n    }\n    updateOptions(options = {}) {\n        if (typeof options.indent !== 'undefined') {\n            const indent = clamp(options.indent, 0, 40);\n            if (indent !== this.indent) {\n                this.indent = indent;\n                for (const [node, templateData] of this.renderedNodes) {\n                    templateData.indentSize = TreeRenderer.DefaultIndent + (node.depth - 1) * this.indent;\n                    this.renderTreeElement(node, templateData);\n                }\n            }\n        }\n        if (typeof options.renderIndentGuides !== 'undefined') {\n            const shouldRenderIndentGuides = options.renderIndentGuides !== RenderIndentGuides.None;\n            if (shouldRenderIndentGuides !== this.shouldRenderIndentGuides) {\n                this.shouldRenderIndentGuides = shouldRenderIndentGuides;\n                for (const [node, templateData] of this.renderedNodes) {\n                    this._renderIndentGuides(node, templateData);\n                }\n                this.indentGuidesDisposable.dispose();\n                if (shouldRenderIndentGuides) {\n                    const disposables = new DisposableStore();\n                    this.activeNodes.onDidChange(this._onDidChangeActiveNodes, this, disposables);\n                    this.indentGuidesDisposable = disposables;\n                    this._onDidChangeActiveNodes(this.activeNodes.elements);\n                }\n            }\n        }\n        if (typeof options.hideTwistiesOfChildlessElements !== 'undefined') {\n            this.hideTwistiesOfChildlessElements = options.hideTwistiesOfChildlessElements;\n        }\n    }\n    renderTemplate(container) {\n        const el = append(container, $('.monaco-tl-row'));\n        const indent = append(el, $('.monaco-tl-indent'));\n        const twistie = append(el, $('.monaco-tl-twistie'));\n        const contents = append(el, $('.monaco-tl-contents'));\n        const templateData = this.renderer.renderTemplate(contents);\n        return { container, indent, twistie, indentGuidesDisposable: Disposable.None, indentSize: 0, templateData };\n    }\n    renderElement(node, index, templateData, details) {\n        templateData.indentSize = TreeRenderer.DefaultIndent + (node.depth - 1) * this.indent;\n        this.renderedNodes.set(node, templateData);\n        this.renderedElements.set(node.element, node);\n        this.renderTreeElement(node, templateData);\n        this.renderer.renderElement(node, index, templateData.templateData, { ...details, indent: templateData.indentSize });\n    }\n    disposeElement(node, index, templateData, details) {\n        templateData.indentGuidesDisposable.dispose();\n        this.renderer.disposeElement?.(node, index, templateData.templateData, { ...details, indent: templateData.indentSize });\n        if (typeof details?.height === 'number') {\n            this.renderedNodes.delete(node);\n            this.renderedElements.delete(node.element);\n        }\n    }\n    disposeTemplate(templateData) {\n        this.renderer.disposeTemplate(templateData.templateData);\n    }\n    onDidChangeTwistieState(element) {\n        const node = this.renderedElements.get(element);\n        if (!node) {\n            return;\n        }\n        this.onDidChangeNodeTwistieState(node);\n    }\n    onDidChangeNodeTwistieState(node) {\n        const templateData = this.renderedNodes.get(node);\n        if (!templateData) {\n            return;\n        }\n        this._onDidChangeActiveNodes(this.activeNodes.elements);\n        this.renderTreeElement(node, templateData);\n    }\n    renderTreeElement(node, templateData) {\n        templateData.twistie.style.paddingLeft = `${templateData.indentSize}px`;\n        templateData.indent.style.width = `${templateData.indentSize + this.indent - 16}px`;\n        if (node.collapsible) {\n            templateData.container.setAttribute('aria-expanded', String(!node.collapsed));\n        }\n        else {\n            templateData.container.removeAttribute('aria-expanded');\n        }\n        templateData.twistie.classList.remove(...ThemeIcon.asClassNameArray(Codicon.treeItemExpanded));\n        let twistieRendered = false;\n        if (this.renderer.renderTwistie) {\n            twistieRendered = this.renderer.renderTwistie(node.element, templateData.twistie);\n        }\n        if (node.collapsible && (!this.hideTwistiesOfChildlessElements || node.visibleChildrenCount > 0)) {\n            if (!twistieRendered) {\n                templateData.twistie.classList.add(...ThemeIcon.asClassNameArray(Codicon.treeItemExpanded));\n            }\n            templateData.twistie.classList.add('collapsible');\n            templateData.twistie.classList.toggle('collapsed', node.collapsed);\n        }\n        else {\n            templateData.twistie.classList.remove('collapsible', 'collapsed');\n        }\n        this._renderIndentGuides(node, templateData);\n    }\n    _renderIndentGuides(node, templateData) {\n        clearNode(templateData.indent);\n        templateData.indentGuidesDisposable.dispose();\n        if (!this.shouldRenderIndentGuides) {\n            return;\n        }\n        const disposableStore = new DisposableStore();\n        while (true) {\n            const ref = this.model.getNodeLocation(node);\n            const parentRef = this.model.getParentNodeLocation(ref);\n            if (!parentRef) {\n                break;\n            }\n            const parent = this.model.getNode(parentRef);\n            const guide = $('.indent-guide', { style: `width: ${this.indent}px` });\n            if (this.activeIndentNodes.has(parent)) {\n                guide.classList.add('active');\n            }\n            if (templateData.indent.childElementCount === 0) {\n                templateData.indent.appendChild(guide);\n            }\n            else {\n                templateData.indent.insertBefore(guide, templateData.indent.firstElementChild);\n            }\n            this.renderedIndentGuides.add(parent, guide);\n            disposableStore.add(toDisposable(() => this.renderedIndentGuides.delete(parent, guide)));\n            node = parent;\n        }\n        templateData.indentGuidesDisposable = disposableStore;\n    }\n    _onDidChangeActiveNodes(nodes) {\n        if (!this.shouldRenderIndentGuides) {\n            return;\n        }\n        const set = new Set();\n        nodes.forEach(node => {\n            const ref = this.model.getNodeLocation(node);\n            try {\n                const parentRef = this.model.getParentNodeLocation(ref);\n                if (node.collapsible && node.children.length > 0 && !node.collapsed) {\n                    set.add(node);\n                }\n                else if (parentRef) {\n                    set.add(this.model.getNode(parentRef));\n                }\n            }\n            catch {\n                // noop\n            }\n        });\n        this.activeIndentNodes.forEach(node => {\n            if (!set.has(node)) {\n                this.renderedIndentGuides.forEach(node, line => line.classList.remove('active'));\n            }\n        });\n        set.forEach(node => {\n            if (!this.activeIndentNodes.has(node)) {\n                this.renderedIndentGuides.forEach(node, line => line.classList.add('active'));\n            }\n        });\n        this.activeIndentNodes = set;\n    }\n    dispose() {\n        this.renderedNodes.clear();\n        this.renderedElements.clear();\n        this.indentGuidesDisposable.dispose();\n        dispose(this.disposables);\n    }\n}\nfunction contiguousFuzzyScore(patternLower, wordLower) {\n    const index = wordLower.toLowerCase().indexOf(patternLower);\n    let score;\n    if (index > -1) {\n        score = [Number.MAX_SAFE_INTEGER, 0];\n        for (let i = patternLower.length; i > 0; i--) {\n            score.push(index + i - 1);\n        }\n    }\n    return score;\n}\nclass FindFilter {\n    get totalCount() { return this._totalCount; }\n    get matchCount() { return this._matchCount; }\n    set findMatchType(type) { this._findMatchType = type; }\n    get findMatchType() { return this._findMatchType; }\n    set findMode(mode) { this._findMode = mode; }\n    get findMode() { return this._findMode; }\n    constructor(_keyboardNavigationLabelProvider, _filter, _defaultFindVisibility) {\n        this._keyboardNavigationLabelProvider = _keyboardNavigationLabelProvider;\n        this._filter = _filter;\n        this._defaultFindVisibility = _defaultFindVisibility;\n        this._totalCount = 0;\n        this._matchCount = 0;\n        this._findMatchType = TreeFindMatchType.Fuzzy;\n        this._findMode = TreeFindMode.Highlight;\n        this._pattern = '';\n        this._lowercasePattern = '';\n        this.disposables = new DisposableStore();\n    }\n    filter(element, parentVisibility) {\n        let visibility = 1 /* TreeVisibility.Visible */;\n        if (this._filter) {\n            const result = this._filter.filter(element, parentVisibility);\n            if (typeof result === 'boolean') {\n                visibility = result ? 1 /* TreeVisibility.Visible */ : 0 /* TreeVisibility.Hidden */;\n            }\n            else if (isFilterResult(result)) {\n                visibility = getVisibleState(result.visibility);\n            }\n            else {\n                visibility = result;\n            }\n            if (visibility === 0 /* TreeVisibility.Hidden */) {\n                return false;\n            }\n        }\n        this._totalCount++;\n        if (!this._pattern) {\n            this._matchCount++;\n            return { data: FuzzyScore.Default, visibility };\n        }\n        const label = this._keyboardNavigationLabelProvider.getKeyboardNavigationLabel(element);\n        const labels = Array.isArray(label) ? label : [label];\n        for (const l of labels) {\n            const labelStr = l && l.toString();\n            if (typeof labelStr === 'undefined') {\n                return { data: FuzzyScore.Default, visibility };\n            }\n            let score;\n            if (this._findMatchType === TreeFindMatchType.Contiguous) {\n                score = contiguousFuzzyScore(this._lowercasePattern, labelStr.toLowerCase());\n            }\n            else {\n                score = fuzzyScore(this._pattern, this._lowercasePattern, 0, labelStr, labelStr.toLowerCase(), 0, { firstMatchCanBeWeak: true, boostFullMatch: true });\n            }\n            if (score) {\n                this._matchCount++;\n                return labels.length === 1 ?\n                    { data: score, visibility } :\n                    { data: { label: labelStr, score: score }, visibility };\n            }\n        }\n        if (this._findMode === TreeFindMode.Filter) {\n            if (typeof this._defaultFindVisibility === 'number') {\n                return this._defaultFindVisibility;\n            }\n            else if (this._defaultFindVisibility) {\n                return this._defaultFindVisibility(element);\n            }\n            else {\n                return 2 /* TreeVisibility.Recurse */;\n            }\n        }\n        else {\n            return { data: FuzzyScore.Default, visibility };\n        }\n    }\n    reset() {\n        this._totalCount = 0;\n        this._matchCount = 0;\n    }\n    dispose() {\n        dispose(this.disposables);\n    }\n}\nclass FindToggles {\n    constructor(startStates) {\n        this.stateMap = new Map(startStates.map(state => [state.id, { ...state }]));\n    }\n    get(id) {\n        const state = this.stateMap.get(id);\n        if (state === undefined) {\n            throw new Error(`No state found for toggle id ${id}`);\n        }\n        return state.isChecked;\n    }\n    set(id, value) {\n        const state = this.stateMap.get(id);\n        if (state === undefined) {\n            throw new Error(`No state found for toggle id ${id}`);\n        }\n        if (state.isChecked === value) {\n            return false;\n        }\n        state.isChecked = value;\n        return true;\n    }\n}\nvar TreeFindMode;\n(function (TreeFindMode) {\n    TreeFindMode[TreeFindMode[\"Highlight\"] = 0] = \"Highlight\";\n    TreeFindMode[TreeFindMode[\"Filter\"] = 1] = \"Filter\";\n})(TreeFindMode || (TreeFindMode = {}));\nvar TreeFindMatchType;\n(function (TreeFindMatchType) {\n    TreeFindMatchType[TreeFindMatchType[\"Fuzzy\"] = 0] = \"Fuzzy\";\n    TreeFindMatchType[TreeFindMatchType[\"Contiguous\"] = 1] = \"Contiguous\";\n})(TreeFindMatchType || (TreeFindMatchType = {}));\nvar DefaultTreeToggles;\n(function (DefaultTreeToggles) {\n    DefaultTreeToggles[\"Mode\"] = \"mode\";\n    DefaultTreeToggles[\"MatchType\"] = \"matchType\";\n})(DefaultTreeToggles || (DefaultTreeToggles = {}));\nclass AbstractFindController {\n    get pattern() { return this._pattern; }\n    get placeholder() { return this._placeholder; }\n    set placeholder(value) {\n        this._placeholder = value;\n        this.widget?.setPlaceHolder(value);\n    }\n    constructor(tree, filter, contextViewProvider, options = {}) {\n        this.tree = tree;\n        this.filter = filter;\n        this.contextViewProvider = contextViewProvider;\n        this.options = options;\n        this._pattern = '';\n        this._onDidChangePattern = new Emitter();\n        this._onDidChangeOpenState = new Emitter();\n        this.onDidChangeOpenState = this._onDidChangeOpenState.event;\n        this.enabledDisposables = new DisposableStore();\n        this.disposables = new DisposableStore();\n        this.toggles = new FindToggles(options.toggles ?? []);\n        this._placeholder = options.placeholder ?? localize(20, \"Type to search\");\n    }\n    isOpened() {\n        return !!this.widget;\n    }\n    updateToggleState(id, checked) {\n        this.toggles.set(id, checked);\n        this.widget?.setToggleState(id, checked);\n    }\n    renderMessage(showNotFound, warningMessage) {\n        if (showNotFound) {\n            if (this.tree.options.showNotFoundMessage ?? true) {\n                this.widget?.showMessage({ type: 2 /* MessageType.WARNING */, content: warningMessage ?? localize(21, \"No results found.\") });\n            }\n            else {\n                this.widget?.showMessage({ type: 2 /* MessageType.WARNING */ });\n            }\n        }\n        else {\n            this.widget?.clearMessage();\n        }\n    }\n    alertResults(results) {\n        if (!results) {\n            alert(localize(22, \"No results\"));\n        }\n        else {\n            alert(localize(23, \"{0} results\", results));\n        }\n    }\n    dispose() {\n        this._history = undefined;\n        this._onDidChangePattern.dispose();\n        this.enabledDisposables.dispose();\n        this.disposables.dispose();\n    }\n}\nclass FindController extends AbstractFindController {\n    get mode() { return this.toggles.get(DefaultTreeToggles.Mode) ? TreeFindMode.Filter : TreeFindMode.Highlight; }\n    set mode(mode) {\n        if (mode === this.mode) {\n            return;\n        }\n        const isFilterMode = mode === TreeFindMode.Filter;\n        this.updateToggleState(DefaultTreeToggles.Mode, isFilterMode);\n        this.placeholder = isFilterMode ? localize(24, \"Type to filter\") : localize(25, \"Type to search\");\n        this.filter.findMode = mode;\n        this.tree.refilter();\n        this.render();\n        this._onDidChangeMode.fire(mode);\n    }\n    get matchType() { return this.toggles.get(DefaultTreeToggles.MatchType) ? TreeFindMatchType.Fuzzy : TreeFindMatchType.Contiguous; }\n    set matchType(matchType) {\n        if (matchType === this.matchType) {\n            return;\n        }\n        this.updateToggleState(DefaultTreeToggles.MatchType, matchType === TreeFindMatchType.Fuzzy);\n        this.filter.findMatchType = matchType;\n        this.tree.refilter();\n        this.render();\n        this._onDidChangeMatchType.fire(matchType);\n    }\n    constructor(tree, filter, contextViewProvider, options = {}) {\n        const defaultFindMode = options.defaultFindMode ?? TreeFindMode.Highlight;\n        const defaultFindMatchType = options.defaultFindMatchType ?? TreeFindMatchType.Fuzzy;\n        const toggleContributions = [{\n                id: DefaultTreeToggles.Mode,\n                icon: Codicon.listFilter,\n                title: localize(26, \"Filter\"),\n                isChecked: defaultFindMode === TreeFindMode.Filter,\n            }, {\n                id: DefaultTreeToggles.MatchType,\n                icon: Codicon.searchFuzzy,\n                title: localize(27, \"Fuzzy Match\"),\n                isChecked: defaultFindMatchType === TreeFindMatchType.Fuzzy,\n            }];\n        filter.findMatchType = defaultFindMatchType;\n        filter.findMode = defaultFindMode;\n        super(tree, filter, contextViewProvider, { ...options, toggles: toggleContributions });\n        this.filter = filter;\n        this._onDidChangeMode = new Emitter();\n        this.onDidChangeMode = this._onDidChangeMode.event;\n        this._onDidChangeMatchType = new Emitter();\n        this.onDidChangeMatchType = this._onDidChangeMatchType.event;\n        this.disposables.add(this.tree.onDidChangeModel(() => {\n            if (!this.isOpened()) {\n                return;\n            }\n            if (this.pattern.length !== 0) {\n                this.tree.refilter();\n            }\n            this.render();\n        }));\n        this.disposables.add(this.tree.onWillRefilter(() => this.filter.reset()));\n    }\n    updateOptions(optionsUpdate = {}) {\n        if (optionsUpdate.defaultFindMode !== undefined) {\n            this.mode = optionsUpdate.defaultFindMode;\n        }\n        if (optionsUpdate.defaultFindMatchType !== undefined) {\n            this.matchType = optionsUpdate.defaultFindMatchType;\n        }\n    }\n    shouldAllowFocus(node) {\n        if (!this.isOpened() || !this.pattern) {\n            return true;\n        }\n        if (this.filter.totalCount > 0 && this.filter.matchCount <= 1) {\n            return true;\n        }\n        return !FuzzyScore.isDefault(node.filterData);\n    }\n    render() {\n        const noMatches = this.filter.matchCount === 0 && this.filter.totalCount > 0;\n        const showNotFound = noMatches && this.pattern.length > 0;\n        this.renderMessage(showNotFound);\n        if (this.pattern.length) {\n            this.alertResults(this.filter.matchCount);\n        }\n    }\n}\nfunction stickyScrollNodeStateEquals(node1, node2) {\n    return node1.position === node2.position && stickyScrollNodeEquals(node1, node2);\n}\nfunction stickyScrollNodeEquals(node1, node2) {\n    return node1.node.element === node2.node.element &&\n        node1.startIndex === node2.startIndex &&\n        node1.height === node2.height &&\n        node1.endIndex === node2.endIndex;\n}\nclass StickyScrollState {\n    constructor(stickyNodes = []) {\n        this.stickyNodes = stickyNodes;\n    }\n    get count() { return this.stickyNodes.length; }\n    equal(state) {\n        return equals(this.stickyNodes, state.stickyNodes, stickyScrollNodeStateEquals);\n    }\n    contains(element) {\n        return this.stickyNodes.some(node => node.node.element === element.element);\n    }\n    lastNodePartiallyVisible() {\n        if (this.count === 0) {\n            return false;\n        }\n        const lastStickyNode = this.stickyNodes[this.count - 1];\n        if (this.count === 1) {\n            return lastStickyNode.position !== 0;\n        }\n        const secondLastStickyNode = this.stickyNodes[this.count - 2];\n        return secondLastStickyNode.position + secondLastStickyNode.height !== lastStickyNode.position;\n    }\n    animationStateChanged(previousState) {\n        if (!equals(this.stickyNodes, previousState.stickyNodes, stickyScrollNodeEquals)) {\n            return false;\n        }\n        if (this.count === 0) {\n            return false;\n        }\n        const lastStickyNode = this.stickyNodes[this.count - 1];\n        const previousLastStickyNode = previousState.stickyNodes[previousState.count - 1];\n        return lastStickyNode.position !== previousLastStickyNode.position;\n    }\n}\nclass DefaultStickyScrollDelegate {\n    constrainStickyScrollNodes(stickyNodes, stickyScrollMaxItemCount, maxWidgetHeight) {\n        for (let i = 0; i < stickyNodes.length; i++) {\n            const stickyNode = stickyNodes[i];\n            const stickyNodeBottom = stickyNode.position + stickyNode.height;\n            if (stickyNodeBottom > maxWidgetHeight || i >= stickyScrollMaxItemCount) {\n                return stickyNodes.slice(0, i);\n            }\n        }\n        return stickyNodes;\n    }\n}\nclass StickyScrollController extends Disposable {\n    constructor(tree, model, view, renderers, treeDelegate, options = {}) {\n        super();\n        this.tree = tree;\n        this.model = model;\n        this.view = view;\n        this.treeDelegate = treeDelegate;\n        this.maxWidgetViewRatio = 0.4;\n        const stickyScrollOptions = this.validateStickySettings(options);\n        this.stickyScrollMaxItemCount = stickyScrollOptions.stickyScrollMaxItemCount;\n        this.stickyScrollDelegate = options.stickyScrollDelegate ?? new DefaultStickyScrollDelegate();\n        this.paddingTop = options.paddingTop ?? 0;\n        this._widget = this._register(new StickyScrollWidget(view.getScrollableElement(), view, tree, renderers, treeDelegate, options.accessibilityProvider));\n        this.onDidChangeHasFocus = this._widget.onDidChangeHasFocus;\n        this.onContextMenu = this._widget.onContextMenu;\n        this._register(view.onDidScroll(() => this.update()));\n        this._register(view.onDidChangeContentHeight(() => this.update()));\n        this._register(tree.onDidChangeCollapseState(() => this.update()));\n        this._register(model.onDidSpliceRenderedNodes((e) => {\n            const state = this._widget.state;\n            if (!state) {\n                return;\n            }\n            // If a sticky node is removed, recompute the state\n            const hasRemovedStickyNode = e.deleteCount > 0 && state.stickyNodes.some(stickyNode => !this.model.has(this.model.getNodeLocation(stickyNode.node)));\n            if (hasRemovedStickyNode) {\n                this.update();\n                return;\n            }\n            // If a sticky node is updated, rerender the widget\n            const shouldRerenderStickyNodes = state.stickyNodes.some(stickyNode => {\n                const listIndex = this.model.getListIndex(this.model.getNodeLocation(stickyNode.node));\n                return listIndex >= e.start && listIndex < e.start + e.deleteCount && state.contains(stickyNode.node);\n            });\n            if (shouldRerenderStickyNodes) {\n                this._widget.rerender();\n            }\n        }));\n        this.update();\n    }\n    get height() {\n        return this._widget.height;\n    }\n    getNodeAtHeight(height) {\n        let index;\n        if (height === 0) {\n            index = this.view.firstVisibleIndex;\n        }\n        else {\n            index = this.view.indexAt(height + this.view.scrollTop);\n        }\n        if (index < 0 || index >= this.view.length) {\n            return undefined;\n        }\n        return this.view.element(index);\n    }\n    update() {\n        const firstVisibleNode = this.getNodeAtHeight(this.paddingTop);\n        // Don't render anything if there are no elements\n        if (!firstVisibleNode || this.tree.scrollTop <= this.paddingTop) {\n            this._widget.setState(undefined);\n            return;\n        }\n        const stickyState = this.findStickyState(firstVisibleNode);\n        this._widget.setState(stickyState);\n    }\n    findStickyState(firstVisibleNode) {\n        const stickyNodes = [];\n        let firstVisibleNodeUnderWidget = firstVisibleNode;\n        let stickyNodesHeight = 0;\n        let nextStickyNode = this.getNextStickyNode(firstVisibleNodeUnderWidget, undefined, stickyNodesHeight);\n        while (nextStickyNode) {\n            stickyNodes.push(nextStickyNode);\n            stickyNodesHeight += nextStickyNode.height;\n            if (stickyNodes.length <= this.stickyScrollMaxItemCount) {\n                firstVisibleNodeUnderWidget = this.getNextVisibleNode(nextStickyNode);\n                if (!firstVisibleNodeUnderWidget) {\n                    break;\n                }\n            }\n            nextStickyNode = this.getNextStickyNode(firstVisibleNodeUnderWidget, nextStickyNode.node, stickyNodesHeight);\n        }\n        const contrainedStickyNodes = this.constrainStickyNodes(stickyNodes);\n        return contrainedStickyNodes.length ? new StickyScrollState(contrainedStickyNodes) : undefined;\n    }\n    getNextVisibleNode(previousStickyNode) {\n        return this.getNodeAtHeight(previousStickyNode.position + previousStickyNode.height);\n    }\n    getNextStickyNode(firstVisibleNodeUnderWidget, previousStickyNode, stickyNodesHeight) {\n        const nextStickyNode = this.getAncestorUnderPrevious(firstVisibleNodeUnderWidget, previousStickyNode);\n        if (!nextStickyNode) {\n            return undefined;\n        }\n        if (nextStickyNode === firstVisibleNodeUnderWidget) {\n            if (!this.nodeIsUncollapsedParent(firstVisibleNodeUnderWidget)) {\n                return undefined;\n            }\n            if (this.nodeTopAlignsWithStickyNodesBottom(firstVisibleNodeUnderWidget, stickyNodesHeight)) {\n                return undefined;\n            }\n        }\n        return this.createStickyScrollNode(nextStickyNode, stickyNodesHeight);\n    }\n    nodeTopAlignsWithStickyNodesBottom(node, stickyNodesHeight) {\n        const nodeIndex = this.getNodeIndex(node);\n        const elementTop = this.view.getElementTop(nodeIndex);\n        const stickyPosition = stickyNodesHeight;\n        return this.view.scrollTop === elementTop - stickyPosition;\n    }\n    createStickyScrollNode(node, currentStickyNodesHeight) {\n        const height = this.treeDelegate.getHeight(node);\n        const { startIndex, endIndex } = this.getNodeRange(node);\n        const position = this.calculateStickyNodePosition(endIndex, currentStickyNodesHeight, height);\n        return { node, position, height, startIndex, endIndex };\n    }\n    getAncestorUnderPrevious(node, previousAncestor = undefined) {\n        let currentAncestor = node;\n        let parentOfcurrentAncestor = this.getParentNode(currentAncestor);\n        while (parentOfcurrentAncestor) {\n            if (parentOfcurrentAncestor === previousAncestor) {\n                return currentAncestor;\n            }\n            currentAncestor = parentOfcurrentAncestor;\n            parentOfcurrentAncestor = this.getParentNode(currentAncestor);\n        }\n        if (previousAncestor === undefined) {\n            return currentAncestor;\n        }\n        return undefined;\n    }\n    calculateStickyNodePosition(lastDescendantIndex, stickyRowPositionTop, stickyNodeHeight) {\n        let lastChildRelativeTop = this.view.getRelativeTop(lastDescendantIndex);\n        // If the last descendant is only partially visible at the top of the view, getRelativeTop() returns null\n        // In that case, utilize the next node's relative top to calculate the sticky node's position\n        if (lastChildRelativeTop === null && this.view.firstVisibleIndex === lastDescendantIndex && lastDescendantIndex + 1 < this.view.length) {\n            const nodeHeight = this.treeDelegate.getHeight(this.view.element(lastDescendantIndex));\n            const nextNodeRelativeTop = this.view.getRelativeTop(lastDescendantIndex + 1);\n            lastChildRelativeTop = nextNodeRelativeTop ? nextNodeRelativeTop - nodeHeight / this.view.renderHeight : null;\n        }\n        if (lastChildRelativeTop === null) {\n            return stickyRowPositionTop;\n        }\n        const lastChildNode = this.view.element(lastDescendantIndex);\n        const lastChildHeight = this.treeDelegate.getHeight(lastChildNode);\n        const topOfLastChild = lastChildRelativeTop * this.view.renderHeight;\n        const bottomOfLastChild = topOfLastChild + lastChildHeight;\n        if (stickyRowPositionTop + stickyNodeHeight > bottomOfLastChild && stickyRowPositionTop <= bottomOfLastChild) {\n            return bottomOfLastChild - stickyNodeHeight;\n        }\n        return stickyRowPositionTop;\n    }\n    constrainStickyNodes(stickyNodes) {\n        if (stickyNodes.length === 0) {\n            return [];\n        }\n        // Check if sticky nodes need to be constrained\n        const maximumStickyWidgetHeight = this.view.renderHeight * this.maxWidgetViewRatio;\n        const lastStickyNode = stickyNodes[stickyNodes.length - 1];\n        if (stickyNodes.length <= this.stickyScrollMaxItemCount && lastStickyNode.position + lastStickyNode.height <= maximumStickyWidgetHeight) {\n            return stickyNodes;\n        }\n        // constrain sticky nodes\n        const constrainedStickyNodes = this.stickyScrollDelegate.constrainStickyScrollNodes(stickyNodes, this.stickyScrollMaxItemCount, maximumStickyWidgetHeight);\n        if (!constrainedStickyNodes.length) {\n            return [];\n        }\n        // Validate constraints\n        const lastConstrainedStickyNode = constrainedStickyNodes[constrainedStickyNodes.length - 1];\n        if (constrainedStickyNodes.length > this.stickyScrollMaxItemCount || lastConstrainedStickyNode.position + lastConstrainedStickyNode.height > maximumStickyWidgetHeight) {\n            throw new Error('stickyScrollDelegate violates constraints');\n        }\n        return constrainedStickyNodes;\n    }\n    getParentNode(node) {\n        const nodeLocation = this.model.getNodeLocation(node);\n        const parentLocation = this.model.getParentNodeLocation(nodeLocation);\n        return parentLocation ? this.model.getNode(parentLocation) : undefined;\n    }\n    nodeIsUncollapsedParent(node) {\n        const nodeLocation = this.model.getNodeLocation(node);\n        return this.model.getListRenderCount(nodeLocation) > 1;\n    }\n    getNodeIndex(node) {\n        const nodeLocation = this.model.getNodeLocation(node);\n        const nodeIndex = this.model.getListIndex(nodeLocation);\n        return nodeIndex;\n    }\n    getNodeRange(node) {\n        const nodeLocation = this.model.getNodeLocation(node);\n        const startIndex = this.model.getListIndex(nodeLocation);\n        if (startIndex < 0) {\n            throw new Error('Node not found in tree');\n        }\n        const renderCount = this.model.getListRenderCount(nodeLocation);\n        const endIndex = startIndex + renderCount - 1;\n        return { startIndex, endIndex };\n    }\n    nodePositionTopBelowWidget(node) {\n        const ancestors = [];\n        let currentAncestor = this.getParentNode(node);\n        while (currentAncestor) {\n            ancestors.push(currentAncestor);\n            currentAncestor = this.getParentNode(currentAncestor);\n        }\n        let widgetHeight = 0;\n        for (let i = 0; i < ancestors.length && i < this.stickyScrollMaxItemCount; i++) {\n            widgetHeight += this.treeDelegate.getHeight(ancestors[i]);\n        }\n        return widgetHeight;\n    }\n    domFocus() {\n        this._widget.domFocus();\n    }\n    // Whether sticky scroll was the last focused part in the tree or not\n    focusedLast() {\n        return this._widget.focusedLast();\n    }\n    updateOptions(optionsUpdate = {}) {\n        if (optionsUpdate.paddingTop !== undefined) {\n            this.paddingTop = optionsUpdate.paddingTop;\n        }\n        if (optionsUpdate.stickyScrollMaxItemCount !== undefined) {\n            const validatedOptions = this.validateStickySettings(optionsUpdate);\n            if (this.stickyScrollMaxItemCount !== validatedOptions.stickyScrollMaxItemCount) {\n                this.stickyScrollMaxItemCount = validatedOptions.stickyScrollMaxItemCount;\n                this.update();\n            }\n        }\n    }\n    validateStickySettings(options) {\n        let stickyScrollMaxItemCount = 7;\n        if (typeof options.stickyScrollMaxItemCount === 'number') {\n            stickyScrollMaxItemCount = Math.max(options.stickyScrollMaxItemCount, 1);\n        }\n        return { stickyScrollMaxItemCount };\n    }\n}\nclass StickyScrollWidget {\n    get state() { return this._previousState; }\n    constructor(container, view, tree, treeRenderers, treeDelegate, accessibilityProvider) {\n        this.view = view;\n        this.tree = tree;\n        this.treeRenderers = treeRenderers;\n        this.treeDelegate = treeDelegate;\n        this.accessibilityProvider = accessibilityProvider;\n        this._previousElements = [];\n        this._previousStateDisposables = new DisposableStore();\n        this._rootDomNode = $('.monaco-tree-sticky-container.empty');\n        container.appendChild(this._rootDomNode);\n        const shadow = $('.monaco-tree-sticky-container-shadow');\n        this._rootDomNode.appendChild(shadow);\n        this.stickyScrollFocus = new StickyScrollFocus(this._rootDomNode, view);\n        this.onDidChangeHasFocus = this.stickyScrollFocus.onDidChangeHasFocus;\n        this.onContextMenu = this.stickyScrollFocus.onContextMenu;\n    }\n    get height() {\n        if (!this._previousState) {\n            return 0;\n        }\n        const lastElement = this._previousState.stickyNodes[this._previousState.count - 1];\n        return lastElement.position + lastElement.height;\n    }\n    setState(state) {\n        const wasVisible = !!this._previousState && this._previousState.count > 0;\n        const isVisible = !!state && state.count > 0;\n        // If state has not changed, do nothing\n        if ((!wasVisible && !isVisible) || (wasVisible && isVisible && this._previousState.equal(state))) {\n            return;\n        }\n        // Update visibility of the widget if changed\n        if (wasVisible !== isVisible) {\n            this.setVisible(isVisible);\n        }\n        if (!isVisible) {\n            this._previousState = undefined;\n            this._previousElements = [];\n            this._previousStateDisposables.clear();\n            return;\n        }\n        const lastStickyNode = state.stickyNodes[state.count - 1];\n        // If the new state is only a change in the last node's position, update the position of the last element\n        if (this._previousState && state.animationStateChanged(this._previousState)) {\n            this._previousElements[this._previousState.count - 1].style.top = `${lastStickyNode.position}px`;\n        }\n        // create new dom elements\n        else {\n            this.renderState(state);\n        }\n        this._previousState = state;\n        // Set the height of the widget to the bottom of the last sticky node\n        this._rootDomNode.style.height = `${lastStickyNode.position + lastStickyNode.height}px`;\n    }\n    renderState(state) {\n        this._previousStateDisposables.clear();\n        const elements = Array(state.count);\n        for (let stickyIndex = state.count - 1; stickyIndex >= 0; stickyIndex--) {\n            const stickyNode = state.stickyNodes[stickyIndex];\n            const { element, disposable } = this.createElement(stickyNode, stickyIndex, state.count);\n            elements[stickyIndex] = element;\n            this._rootDomNode.appendChild(element);\n            this._previousStateDisposables.add(disposable);\n        }\n        this.stickyScrollFocus.updateElements(elements, state);\n        this._previousElements = elements;\n    }\n    rerender() {\n        if (this._previousState) {\n            this.renderState(this._previousState);\n        }\n    }\n    createElement(stickyNode, stickyIndex, stickyNodesTotal) {\n        const nodeIndex = stickyNode.startIndex;\n        // Sticky element container\n        const stickyElement = document.createElement('div');\n        stickyElement.style.top = `${stickyNode.position}px`;\n        if (this.tree.options.setRowHeight !== false) {\n            stickyElement.style.height = `${stickyNode.height}px`;\n        }\n        if (this.tree.options.setRowLineHeight !== false) {\n            stickyElement.style.lineHeight = `${stickyNode.height}px`;\n        }\n        stickyElement.classList.add('monaco-tree-sticky-row');\n        stickyElement.classList.add('monaco-list-row');\n        stickyElement.setAttribute('data-index', `${nodeIndex}`);\n        stickyElement.setAttribute('data-parity', nodeIndex % 2 === 0 ? 'even' : 'odd');\n        stickyElement.setAttribute('id', this.view.getElementID(nodeIndex));\n        const accessibilityDisposable = this.setAccessibilityAttributes(stickyElement, stickyNode.node.element, stickyIndex, stickyNodesTotal);\n        // Get the renderer for the node\n        const nodeTemplateId = this.treeDelegate.getTemplateId(stickyNode.node);\n        const renderer = this.treeRenderers.find((renderer) => renderer.templateId === nodeTemplateId);\n        if (!renderer) {\n            throw new Error(`No renderer found for template id ${nodeTemplateId}`);\n        }\n        // To make sure we do not influence the original node, we create a copy of the node\n        // We need to check if it is already a unique instance of the node by the delegate\n        let nodeCopy = stickyNode.node;\n        if (nodeCopy === this.tree.getNode(this.tree.getNodeLocation(stickyNode.node))) {\n            nodeCopy = new Proxy(stickyNode.node, {});\n        }\n        // Render the element\n        const templateData = renderer.renderTemplate(stickyElement);\n        renderer.renderElement(nodeCopy, stickyNode.startIndex, templateData, { height: stickyNode.height });\n        // Remove the element from the DOM when state is disposed\n        const disposable = toDisposable(() => {\n            accessibilityDisposable.dispose();\n            renderer.disposeElement(nodeCopy, stickyNode.startIndex, templateData, { height: stickyNode.height });\n            renderer.disposeTemplate(templateData);\n            stickyElement.remove();\n        });\n        return { element: stickyElement, disposable };\n    }\n    setAccessibilityAttributes(container, element, stickyIndex, stickyNodesTotal) {\n        if (!this.accessibilityProvider) {\n            return Disposable.None;\n        }\n        if (this.accessibilityProvider.getSetSize) {\n            container.setAttribute('aria-setsize', String(this.accessibilityProvider.getSetSize(element, stickyIndex, stickyNodesTotal)));\n        }\n        if (this.accessibilityProvider.getPosInSet) {\n            container.setAttribute('aria-posinset', String(this.accessibilityProvider.getPosInSet(element, stickyIndex)));\n        }\n        if (this.accessibilityProvider.getRole) {\n            container.setAttribute('role', this.accessibilityProvider.getRole(element) ?? 'treeitem');\n        }\n        const ariaLabel = this.accessibilityProvider.getAriaLabel(element);\n        const observable = (ariaLabel && typeof ariaLabel !== 'string') ? ariaLabel : constObservable(ariaLabel);\n        const result = autorun(reader => {\n            const value = reader.readObservable(observable);\n            if (value) {\n                container.setAttribute('aria-label', value);\n            }\n            else {\n                container.removeAttribute('aria-label');\n            }\n        });\n        if (typeof ariaLabel === 'string') ;\n        else if (ariaLabel) {\n            container.setAttribute('aria-label', ariaLabel.get());\n        }\n        const ariaLevel = this.accessibilityProvider.getAriaLevel && this.accessibilityProvider.getAriaLevel(element);\n        if (typeof ariaLevel === 'number') {\n            container.setAttribute('aria-level', `${ariaLevel}`);\n        }\n        // Sticky Scroll elements can not be selected\n        container.setAttribute('aria-selected', String(false));\n        return result;\n    }\n    setVisible(visible) {\n        this._rootDomNode.classList.toggle('empty', !visible);\n        if (!visible) {\n            this.stickyScrollFocus.updateElements([], undefined);\n        }\n    }\n    domFocus() {\n        this.stickyScrollFocus.domFocus();\n    }\n    focusedLast() {\n        return this.stickyScrollFocus.focusedLast();\n    }\n    dispose() {\n        this.stickyScrollFocus.dispose();\n        this._previousStateDisposables.dispose();\n        this._rootDomNode.remove();\n    }\n}\nclass StickyScrollFocus extends Disposable {\n    get domHasFocus() { return this._domHasFocus; }\n    set domHasFocus(hasFocus) {\n        if (hasFocus !== this._domHasFocus) {\n            this._onDidChangeHasFocus.fire(hasFocus);\n            this._domHasFocus = hasFocus;\n        }\n    }\n    constructor(container, view) {\n        super();\n        this.container = container;\n        this.view = view;\n        this.focusedIndex = -1;\n        this.elements = [];\n        this._onDidChangeHasFocus = new Emitter();\n        this.onDidChangeHasFocus = this._onDidChangeHasFocus.event;\n        this._onContextMenu = new Emitter();\n        this.onContextMenu = this._onContextMenu.event;\n        this._domHasFocus = false;\n        this._register(addDisposableListener(this.container, 'focus', () => this.onFocus()));\n        this._register(addDisposableListener(this.container, 'blur', () => this.onBlur()));\n        this._register(this.view.onDidFocus(() => this.toggleStickyScrollFocused(false)));\n        this._register(this.view.onKeyDown((e) => this.onKeyDown(e)));\n        this._register(this.view.onMouseDown((e) => this.onMouseDown(e)));\n        this._register(this.view.onContextMenu((e) => this.handleContextMenu(e)));\n    }\n    handleContextMenu(e) {\n        const target = e.browserEvent.target;\n        if (!isStickyScrollContainer(target) && !isStickyScrollElement(target)) {\n            if (this.focusedLast()) {\n                this.view.domFocus();\n            }\n            return;\n        }\n        // The list handles the context menu triggered by a mouse event\n        // In that case only set the focus of the element clicked and leave the rest to the list to handle\n        if (!isKeyboardEvent(e.browserEvent)) {\n            if (!this.state) {\n                throw new Error('Context menu should not be triggered when state is undefined');\n            }\n            const stickyIndex = this.state.stickyNodes.findIndex(stickyNode => stickyNode.node.element === e.element?.element);\n            if (stickyIndex === -1) {\n                throw new Error('Context menu should not be triggered when element is not in sticky scroll widget');\n            }\n            this.container.focus();\n            this.setFocus(stickyIndex);\n            return;\n        }\n        if (!this.state || this.focusedIndex < 0) {\n            throw new Error('Context menu key should not be triggered when focus is not in sticky scroll widget');\n        }\n        const stickyNode = this.state.stickyNodes[this.focusedIndex];\n        const element = stickyNode.node.element;\n        const anchor = this.elements[this.focusedIndex];\n        this._onContextMenu.fire({ element, anchor, browserEvent: e.browserEvent, isStickyScroll: true });\n    }\n    onKeyDown(e) {\n        // Sticky Scroll Navigation\n        if (this.domHasFocus && this.state) {\n            // Move up\n            if (e.key === 'ArrowUp') {\n                this.setFocusedElement(Math.max(0, this.focusedIndex - 1));\n                e.preventDefault();\n                e.stopPropagation();\n            }\n            // Move down, if last sticky node is focused, move focus into first child of last sticky node\n            else if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n                if (this.focusedIndex >= this.state.count - 1) {\n                    const nodeIndexToFocus = this.state.stickyNodes[this.state.count - 1].startIndex + 1;\n                    this.view.domFocus();\n                    this.view.setFocus([nodeIndexToFocus]);\n                    this.scrollNodeUnderWidget(nodeIndexToFocus, this.state);\n                }\n                else {\n                    this.setFocusedElement(this.focusedIndex + 1);\n                }\n                e.preventDefault();\n                e.stopPropagation();\n            }\n        }\n    }\n    onMouseDown(e) {\n        const target = e.browserEvent.target;\n        if (!isStickyScrollContainer(target) && !isStickyScrollElement(target)) {\n            return;\n        }\n        e.browserEvent.preventDefault();\n        e.browserEvent.stopPropagation();\n    }\n    updateElements(elements, state) {\n        if (state && state.count === 0) {\n            throw new Error('Sticky scroll state must be undefined when there are no sticky nodes');\n        }\n        if (state && state.count !== elements.length) {\n            throw new Error('Sticky scroll focus received illigel state');\n        }\n        const previousIndex = this.focusedIndex;\n        this.removeFocus();\n        this.elements = elements;\n        this.state = state;\n        if (state) {\n            const newFocusedIndex = clamp(previousIndex, 0, state.count - 1);\n            this.setFocus(newFocusedIndex);\n        }\n        else {\n            if (this.domHasFocus) {\n                this.view.domFocus();\n            }\n        }\n        // must come last as it calls blur()\n        this.container.tabIndex = state ? 0 : -1;\n    }\n    setFocusedElement(stickyIndex) {\n        // doesn't imply that the widget has (or will have) focus\n        const state = this.state;\n        if (!state) {\n            throw new Error('Cannot set focus when state is undefined');\n        }\n        this.setFocus(stickyIndex);\n        if (stickyIndex < state.count - 1) {\n            return;\n        }\n        // If the last sticky node is not fully visible, scroll it into view\n        if (state.lastNodePartiallyVisible()) {\n            const lastStickyNode = state.stickyNodes[stickyIndex];\n            this.scrollNodeUnderWidget(lastStickyNode.endIndex + 1, state);\n        }\n    }\n    scrollNodeUnderWidget(nodeIndex, state) {\n        const lastStickyNode = state.stickyNodes[state.count - 1];\n        const secondLastStickyNode = state.count > 1 ? state.stickyNodes[state.count - 2] : undefined;\n        const elementScrollTop = this.view.getElementTop(nodeIndex);\n        const elementTargetViewTop = secondLastStickyNode ? secondLastStickyNode.position + secondLastStickyNode.height + lastStickyNode.height : lastStickyNode.height;\n        this.view.scrollTop = elementScrollTop - elementTargetViewTop;\n    }\n    domFocus() {\n        if (!this.state) {\n            throw new Error('Cannot focus when state is undefined');\n        }\n        this.container.focus();\n    }\n    focusedLast() {\n        if (!this.state) {\n            return false;\n        }\n        return this.view.getHTMLElement().classList.contains('sticky-scroll-focused');\n    }\n    removeFocus() {\n        if (this.focusedIndex === -1) {\n            return;\n        }\n        this.toggleElementFocus(this.elements[this.focusedIndex], false);\n        this.focusedIndex = -1;\n    }\n    setFocus(newFocusIndex) {\n        if (0 > newFocusIndex) {\n            throw new Error('addFocus() can not remove focus');\n        }\n        if (!this.state && newFocusIndex >= 0) {\n            throw new Error('Cannot set focus index when state is undefined');\n        }\n        if (this.state && newFocusIndex >= this.state.count) {\n            throw new Error('Cannot set focus index to an index that does not exist');\n        }\n        const oldIndex = this.focusedIndex;\n        if (oldIndex >= 0) {\n            this.toggleElementFocus(this.elements[oldIndex], false);\n        }\n        if (newFocusIndex >= 0) {\n            this.toggleElementFocus(this.elements[newFocusIndex], true);\n        }\n        this.focusedIndex = newFocusIndex;\n    }\n    toggleElementFocus(element, focused) {\n        this.toggleElementActiveFocus(element, focused && this.domHasFocus);\n        this.toggleElementPassiveFocus(element, focused);\n    }\n    toggleCurrentElementActiveFocus(focused) {\n        if (this.focusedIndex === -1) {\n            return;\n        }\n        this.toggleElementActiveFocus(this.elements[this.focusedIndex], focused);\n    }\n    toggleElementActiveFocus(element, focused) {\n        // active focus is set when sticky scroll has focus\n        element.classList.toggle('focused', focused);\n    }\n    toggleElementPassiveFocus(element, focused) {\n        // passive focus allows to show focus when sticky scroll does not have focus\n        // for example when the context menu has focus\n        element.classList.toggle('passive-focused', focused);\n    }\n    toggleStickyScrollFocused(focused) {\n        // Weather the last focus in the view was sticky scroll and not the list\n        // Is only removed when the focus is back in the tree an no longer in sticky scroll\n        this.view.getHTMLElement().classList.toggle('sticky-scroll-focused', focused);\n    }\n    onFocus() {\n        if (!this.state || this.elements.length === 0) {\n            throw new Error('Cannot focus when state is undefined or elements are empty');\n        }\n        this.domHasFocus = true;\n        this.toggleStickyScrollFocused(true);\n        this.toggleCurrentElementActiveFocus(true);\n        if (this.focusedIndex === -1) {\n            this.setFocus(0);\n        }\n    }\n    onBlur() {\n        this.domHasFocus = false;\n        this.toggleCurrentElementActiveFocus(false);\n    }\n    dispose() {\n        this.toggleStickyScrollFocused(false);\n        this._onDidChangeHasFocus.fire(false);\n        super.dispose();\n    }\n}\nfunction asTreeMouseEvent(event) {\n    let target = TreeMouseEventTarget.Unknown;\n    if (hasParentWithClass(event.browserEvent.target, 'monaco-tl-twistie', 'monaco-tl-row')) {\n        target = TreeMouseEventTarget.Twistie;\n    }\n    else if (hasParentWithClass(event.browserEvent.target, 'monaco-tl-contents', 'monaco-tl-row')) {\n        target = TreeMouseEventTarget.Element;\n    }\n    else if (hasParentWithClass(event.browserEvent.target, 'monaco-tree-type-filter', 'monaco-list')) {\n        target = TreeMouseEventTarget.Filter;\n    }\n    return {\n        browserEvent: event.browserEvent,\n        element: event.element ? event.element.element : null,\n        target\n    };\n}\nfunction asTreeContextMenuEvent(event) {\n    const isStickyScroll = isStickyScrollContainer(event.browserEvent.target);\n    return {\n        element: event.element ? event.element.element : null,\n        browserEvent: event.browserEvent,\n        anchor: event.anchor,\n        isStickyScroll\n    };\n}\nfunction dfs(node, fn) {\n    fn(node);\n    node.children.forEach(child => dfs(child, fn));\n}\n/**\n * The trait concept needs to exist at the tree level, because collapsed\n * tree nodes will not be known by the list.\n */\nclass Trait {\n    get nodeSet() {\n        if (!this._nodeSet) {\n            this._nodeSet = this.createNodeSet();\n        }\n        return this._nodeSet;\n    }\n    constructor(getFirstViewElementWithTrait, identityProvider) {\n        this.getFirstViewElementWithTrait = getFirstViewElementWithTrait;\n        this.identityProvider = identityProvider;\n        this.nodes = [];\n        this._onDidChange = new Emitter();\n        this.onDidChange = this._onDidChange.event;\n    }\n    set(nodes, browserEvent) {\n        const event = browserEvent;\n        if (!(event?.__forceEvent) && equals(this.nodes, nodes)) {\n            return;\n        }\n        this._set(nodes, false, browserEvent);\n    }\n    _set(nodes, silent, browserEvent) {\n        this.nodes = [...nodes];\n        this.elements = undefined;\n        this._nodeSet = undefined;\n        if (!silent) {\n            const that = this;\n            this._onDidChange.fire({ get elements() { return that.get(); }, browserEvent });\n        }\n    }\n    get() {\n        if (!this.elements) {\n            this.elements = this.nodes.map(node => node.element);\n        }\n        return [...this.elements];\n    }\n    getNodes() {\n        return this.nodes;\n    }\n    has(node) {\n        return this.nodeSet.has(node);\n    }\n    onDidModelSplice({ insertedNodes, deletedNodes }) {\n        if (!this.identityProvider) {\n            const set = this.createNodeSet();\n            const visit = (node) => set.delete(node);\n            deletedNodes.forEach(node => dfs(node, visit));\n            this.set([...set.values()]);\n            return;\n        }\n        const deletedNodesIdSet = new Set();\n        const deletedNodesVisitor = (node) => deletedNodesIdSet.add(this.identityProvider.getId(node.element).toString());\n        deletedNodes.forEach(node => dfs(node, deletedNodesVisitor));\n        const insertedNodesMap = new Map();\n        const insertedNodesVisitor = (node) => insertedNodesMap.set(this.identityProvider.getId(node.element).toString(), node);\n        insertedNodes.forEach(node => dfs(node, insertedNodesVisitor));\n        const nodes = [];\n        for (const node of this.nodes) {\n            const id = this.identityProvider.getId(node.element).toString();\n            const wasDeleted = deletedNodesIdSet.has(id);\n            if (!wasDeleted) {\n                nodes.push(node);\n            }\n            else {\n                const insertedNode = insertedNodesMap.get(id);\n                if (insertedNode && insertedNode.visible) {\n                    nodes.push(insertedNode);\n                }\n            }\n        }\n        if (this.nodes.length > 0 && nodes.length === 0) {\n            const node = this.getFirstViewElementWithTrait();\n            if (node) {\n                nodes.push(node);\n            }\n        }\n        this._set(nodes, true);\n    }\n    createNodeSet() {\n        const set = new Set();\n        for (const node of this.nodes) {\n            set.add(node);\n        }\n        return set;\n    }\n}\nclass TreeNodeListMouseController extends MouseController {\n    constructor(list, tree, stickyScrollProvider) {\n        super(list);\n        this.tree = tree;\n        this.stickyScrollProvider = stickyScrollProvider;\n    }\n    onViewPointer(e) {\n        if (isButton(e.browserEvent.target) ||\n            isEditableElement(e.browserEvent.target) ||\n            isMonacoEditor(e.browserEvent.target)) {\n            return;\n        }\n        if (e.browserEvent.isHandledByList) {\n            return;\n        }\n        const node = e.element;\n        if (!node) {\n            return super.onViewPointer(e);\n        }\n        if (this.isSelectionRangeChangeEvent(e) || this.isSelectionSingleChangeEvent(e)) {\n            return super.onViewPointer(e);\n        }\n        const target = e.browserEvent.target;\n        const onTwistie = target.classList.contains('monaco-tl-twistie')\n            || (target.classList.contains('monaco-icon-label') && target.classList.contains('folder-icon') && e.browserEvent.offsetX < 16);\n        const isStickyElement = isStickyScrollElement(e.browserEvent.target);\n        let expandOnlyOnTwistieClick = false;\n        if (isStickyElement) {\n            expandOnlyOnTwistieClick = true;\n        }\n        else if (typeof this.tree.expandOnlyOnTwistieClick === 'function') {\n            expandOnlyOnTwistieClick = this.tree.expandOnlyOnTwistieClick(node.element);\n        }\n        else {\n            expandOnlyOnTwistieClick = !!this.tree.expandOnlyOnTwistieClick;\n        }\n        if (!isStickyElement) {\n            if (expandOnlyOnTwistieClick && !onTwistie && e.browserEvent.detail !== 2) {\n                return super.onViewPointer(e);\n            }\n            if (!this.tree.expandOnDoubleClick && e.browserEvent.detail === 2) {\n                return super.onViewPointer(e);\n            }\n        }\n        else {\n            this.handleStickyScrollMouseEvent(e, node);\n        }\n        if (node.collapsible && (!isStickyElement || onTwistie)) {\n            const location = this.tree.getNodeLocation(node);\n            const recursive = e.browserEvent.altKey;\n            this.tree.setFocus([location]);\n            this.tree.toggleCollapsed(location, recursive);\n            if (onTwistie) {\n                // Do not set this before calling a handler on the super class, because it will reject it as handled\n                e.browserEvent.isHandledByList = true;\n                return;\n            }\n        }\n        if (!isStickyElement) {\n            super.onViewPointer(e);\n        }\n    }\n    handleStickyScrollMouseEvent(e, node) {\n        if (isMonacoCustomToggle(e.browserEvent.target) || isActionItem(e.browserEvent.target)) {\n            return;\n        }\n        const stickyScrollController = this.stickyScrollProvider();\n        if (!stickyScrollController) {\n            throw new Error('Sticky scroll controller not found');\n        }\n        const nodeIndex = this.list.indexOf(node);\n        const elementScrollTop = this.list.getElementTop(nodeIndex);\n        const elementTargetViewTop = stickyScrollController.nodePositionTopBelowWidget(node);\n        this.tree.scrollTop = elementScrollTop - elementTargetViewTop;\n        this.list.domFocus();\n        this.list.setFocus([nodeIndex]);\n        this.list.setSelection([nodeIndex]);\n    }\n    onDoubleClick(e) {\n        const onTwistie = e.browserEvent.target.classList.contains('monaco-tl-twistie');\n        if (onTwistie || !this.tree.expandOnDoubleClick) {\n            return;\n        }\n        if (e.browserEvent.isHandledByList) {\n            return;\n        }\n        super.onDoubleClick(e);\n    }\n    // to make sure dom focus is not stolen (for example with context menu)\n    onMouseDown(e) {\n        const target = e.browserEvent.target;\n        if (!isStickyScrollContainer(target) && !isStickyScrollElement(target)) {\n            super.onMouseDown(e);\n            return;\n        }\n    }\n    onContextMenu(e) {\n        const target = e.browserEvent.target;\n        if (!isStickyScrollContainer(target) && !isStickyScrollElement(target)) {\n            super.onContextMenu(e);\n            return;\n        }\n    }\n}\n/**\n * We use this List subclass to restore selection and focus as nodes\n * get rendered in the list, possibly due to a node expand() call.\n */\nclass TreeNodeList extends List {\n    constructor(user, container, virtualDelegate, renderers, focusTrait, selectionTrait, anchorTrait, options) {\n        super(user, container, virtualDelegate, renderers, options);\n        this.focusTrait = focusTrait;\n        this.selectionTrait = selectionTrait;\n        this.anchorTrait = anchorTrait;\n    }\n    createMouseController(options) {\n        return new TreeNodeListMouseController(this, options.tree, options.stickyScrollProvider);\n    }\n    splice(start, deleteCount, elements = []) {\n        super.splice(start, deleteCount, elements);\n        if (elements.length === 0) {\n            return;\n        }\n        const additionalFocus = [];\n        const additionalSelection = [];\n        let anchor;\n        elements.forEach((node, index) => {\n            if (this.focusTrait.has(node)) {\n                additionalFocus.push(start + index);\n            }\n            if (this.selectionTrait.has(node)) {\n                additionalSelection.push(start + index);\n            }\n            if (this.anchorTrait.has(node)) {\n                anchor = start + index;\n            }\n        });\n        if (additionalFocus.length > 0) {\n            super.setFocus(distinct([...super.getFocus(), ...additionalFocus]));\n        }\n        if (additionalSelection.length > 0) {\n            super.setSelection(distinct([...super.getSelection(), ...additionalSelection]));\n        }\n        if (typeof anchor === 'number') {\n            super.setAnchor(anchor);\n        }\n    }\n    setFocus(indexes, browserEvent, fromAPI = false) {\n        super.setFocus(indexes, browserEvent);\n        if (!fromAPI) {\n            this.focusTrait.set(indexes.map(i => this.element(i)), browserEvent);\n        }\n    }\n    setSelection(indexes, browserEvent, fromAPI = false) {\n        super.setSelection(indexes, browserEvent);\n        if (!fromAPI) {\n            this.selectionTrait.set(indexes.map(i => this.element(i)), browserEvent);\n        }\n    }\n    setAnchor(index, fromAPI = false) {\n        super.setAnchor(index);\n        if (!fromAPI) {\n            if (typeof index === 'undefined') {\n                this.anchorTrait.set([]);\n            }\n            else {\n                this.anchorTrait.set([this.element(index)]);\n            }\n        }\n    }\n}\nclass AbstractTree {\n    get onDidScroll() { return this.view.onDidScroll; }\n    get onDidChangeFocus() { return this.eventBufferer.wrapEvent(this.focus.onDidChange); }\n    get onDidChangeSelection() { return this.eventBufferer.wrapEvent(this.selection.onDidChange); }\n    get onMouseDblClick() { return Event.filter(Event.map(this.view.onMouseDblClick, asTreeMouseEvent), e => e.target !== TreeMouseEventTarget.Filter); }\n    get onMouseOver() { return Event.map(this.view.onMouseOver, asTreeMouseEvent); }\n    get onMouseOut() { return Event.map(this.view.onMouseOut, asTreeMouseEvent); }\n    get onContextMenu() { return Event.any(Event.filter(Event.map(this.view.onContextMenu, asTreeContextMenuEvent), e => !e.isStickyScroll), this.stickyScrollController?.onContextMenu ?? Event.None); }\n    get onPointer() { return Event.map(this.view.onPointer, asTreeMouseEvent); }\n    get onKeyDown() { return this.view.onKeyDown; }\n    get onDidFocus() { return this.view.onDidFocus; }\n    get onDidChangeModel() { return Event.any(this.onDidChangeModelRelay.event, this.onDidSwapModel.event); }\n    get onDidChangeCollapseState() { return this.onDidChangeCollapseStateRelay.event; }\n    get expandOnDoubleClick() { return typeof this._options.expandOnDoubleClick === 'undefined' ? true : this._options.expandOnDoubleClick; }\n    get expandOnlyOnTwistieClick() { return typeof this._options.expandOnlyOnTwistieClick === 'undefined' ? true : this._options.expandOnlyOnTwistieClick; }\n    get onDidDispose() { return this.view.onDidDispose; }\n    constructor(_user, container, delegate, renderers, _options = {}) {\n        this._user = _user;\n        this._options = _options;\n        this.eventBufferer = new EventBufferer();\n        this.onDidChangeFindOpenState = Event.None;\n        this.onDidChangeStickyScrollFocused = Event.None;\n        this.disposables = new DisposableStore();\n        this.onDidSwapModel = this.disposables.add(new Emitter());\n        this.onDidChangeModelRelay = this.disposables.add(new Relay());\n        this.onDidSpliceModelRelay = this.disposables.add(new Relay());\n        this.onDidChangeCollapseStateRelay = this.disposables.add(new Relay());\n        this.onDidChangeRenderNodeCountRelay = this.disposables.add(new Relay());\n        this.onDidChangeActiveNodesRelay = this.disposables.add(new Relay());\n        this._onWillRefilter = new Emitter();\n        this.onWillRefilter = this._onWillRefilter.event;\n        this._onDidUpdateOptions = new Emitter();\n        this.modelDisposables = new DisposableStore();\n        if (_options.keyboardNavigationLabelProvider && (_options.findWidgetEnabled ?? true)) {\n            this.findFilter = new FindFilter(_options.keyboardNavigationLabelProvider, _options.filter, _options.defaultFindVisibility);\n            _options = { ..._options, filter: this.findFilter }; // TODO need typescript help here\n            this.disposables.add(this.findFilter);\n        }\n        this.model = this.createModel(_user, _options);\n        this.treeDelegate = new ComposedTreeDelegate(delegate);\n        const activeNodes = this.disposables.add(new EventCollection(this.onDidChangeActiveNodesRelay.event));\n        const renderedIndentGuides = new SetMap();\n        this.renderers = renderers.map(r => new TreeRenderer(r, this.model, this.onDidChangeCollapseStateRelay.event, activeNodes, renderedIndentGuides, _options));\n        for (const r of this.renderers) {\n            this.disposables.add(r);\n        }\n        this.focus = new Trait(() => this.view.getFocusedElements()[0], _options.identityProvider);\n        this.selection = new Trait(() => this.view.getSelectedElements()[0], _options.identityProvider);\n        this.anchor = new Trait(() => this.view.getAnchorElement(), _options.identityProvider);\n        this.view = new TreeNodeList(_user, container, this.treeDelegate, this.renderers, this.focus, this.selection, this.anchor, { ...asListOptions(() => this.model, this.disposables, _options), tree: this, stickyScrollProvider: () => this.stickyScrollController });\n        this.setupModel(this.model); // model needs to be setup after the traits have been created\n        if (_options.keyboardSupport !== false) {\n            const onKeyDown = Event.chain(this.view.onKeyDown, $ => $.filter(e => !isEditableElement(e.target))\n                .map(e => new StandardKeyboardEvent(e)));\n            Event.chain(onKeyDown, $ => $.filter(e => e.keyCode === 15 /* KeyCode.LeftArrow */))(this.onLeftArrow, this, this.disposables);\n            Event.chain(onKeyDown, $ => $.filter(e => e.keyCode === 17 /* KeyCode.RightArrow */))(this.onRightArrow, this, this.disposables);\n            Event.chain(onKeyDown, $ => $.filter(e => e.keyCode === 10 /* KeyCode.Space */))(this.onSpace, this, this.disposables);\n        }\n        if ((_options.findWidgetEnabled ?? true) && _options.keyboardNavigationLabelProvider && _options.contextViewProvider) {\n            const findOptions = {\n                styles: _options.findWidgetStyles,\n                defaultFindMode: _options.defaultFindMode,\n                defaultFindMatchType: _options.defaultFindMatchType,\n                showNotFoundMessage: _options.showNotFoundMessage,\n            };\n            this.findController = this.disposables.add(new FindController(this, this.findFilter, _options.contextViewProvider, findOptions));\n            this.focusNavigationFilter = node => this.findController.shouldAllowFocus(node);\n            this.onDidChangeFindOpenState = this.findController.onDidChangeOpenState;\n            this.onDidChangeFindMode = this.findController.onDidChangeMode;\n            this.onDidChangeFindMatchType = this.findController.onDidChangeMatchType;\n        }\n        else {\n            this.onDidChangeFindMode = Event.None;\n            this.onDidChangeFindMatchType = Event.None;\n        }\n        if (_options.enableStickyScroll) {\n            this.stickyScrollController = new StickyScrollController(this, this.model, this.view, this.renderers, this.treeDelegate, _options);\n            this.onDidChangeStickyScrollFocused = this.stickyScrollController.onDidChangeHasFocus;\n        }\n        this.styleElement = createStyleSheet(this.view.getHTMLElement());\n        this.getHTMLElement().classList.toggle('always', this._options.renderIndentGuides === RenderIndentGuides.Always);\n    }\n    updateOptions(optionsUpdate = {}) {\n        this._options = { ...this._options, ...optionsUpdate };\n        for (const renderer of this.renderers) {\n            renderer.updateOptions(optionsUpdate);\n        }\n        this.view.updateOptions(this._options);\n        this.findController?.updateOptions(optionsUpdate);\n        this.updateStickyScroll(optionsUpdate);\n        this._onDidUpdateOptions.fire(this._options);\n        this.getHTMLElement().classList.toggle('always', this._options.renderIndentGuides === RenderIndentGuides.Always);\n    }\n    get options() {\n        return this._options;\n    }\n    updateStickyScroll(optionsUpdate) {\n        if (!this.stickyScrollController && this._options.enableStickyScroll) {\n            this.stickyScrollController = new StickyScrollController(this, this.model, this.view, this.renderers, this.treeDelegate, this._options);\n            this.onDidChangeStickyScrollFocused = this.stickyScrollController.onDidChangeHasFocus;\n        }\n        else if (this.stickyScrollController && !this._options.enableStickyScroll) {\n            this.onDidChangeStickyScrollFocused = Event.None;\n            this.stickyScrollController.dispose();\n            this.stickyScrollController = undefined;\n        }\n        this.stickyScrollController?.updateOptions(optionsUpdate);\n    }\n    // Widget\n    getHTMLElement() {\n        return this.view.getHTMLElement();\n    }\n    get onDidChangeContentHeight() {\n        return this.view.onDidChangeContentHeight;\n    }\n    get scrollTop() {\n        return this.view.scrollTop;\n    }\n    set scrollTop(scrollTop) {\n        this.view.scrollTop = scrollTop;\n    }\n    get scrollHeight() {\n        return this.view.scrollHeight;\n    }\n    get renderHeight() {\n        return this.view.renderHeight;\n    }\n    get ariaLabel() {\n        return this.view.ariaLabel;\n    }\n    set ariaLabel(value) {\n        this.view.ariaLabel = value;\n    }\n    domFocus() {\n        if (this.stickyScrollController?.focusedLast()) {\n            this.stickyScrollController.domFocus();\n        }\n        else {\n            this.view.domFocus();\n        }\n    }\n    layout(height, width) {\n        this.view.layout(height, width);\n    }\n    style(styles) {\n        const suffix = `.${this.view.domId}`;\n        const content = [];\n        if (styles.treeIndentGuidesStroke) {\n            content.push(`.monaco-list${suffix}:hover .monaco-tl-indent > .indent-guide, .monaco-list${suffix}.always .monaco-tl-indent > .indent-guide  { opacity: 1; border-color: ${styles.treeInactiveIndentGuidesStroke}; }`);\n            content.push(`.monaco-list${suffix} .monaco-tl-indent > .indent-guide.active { opacity: 1; border-color: ${styles.treeIndentGuidesStroke}; }`);\n        }\n        // Sticky Scroll Background\n        const stickyScrollBackground = styles.treeStickyScrollBackground ?? styles.listBackground;\n        if (stickyScrollBackground) {\n            content.push(`.monaco-list${suffix} .monaco-scrollable-element .monaco-tree-sticky-container { background-color: ${stickyScrollBackground}; }`);\n            content.push(`.monaco-list${suffix} .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-row { background-color: ${stickyScrollBackground}; }`);\n        }\n        // Sticky Scroll Border\n        if (styles.treeStickyScrollBorder) {\n            content.push(`.monaco-list${suffix} .monaco-scrollable-element .monaco-tree-sticky-container { border-bottom: 1px solid ${styles.treeStickyScrollBorder}; }`);\n        }\n        // Sticky Scroll Shadow\n        if (styles.treeStickyScrollShadow) {\n            content.push(`.monaco-list${suffix} .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-container-shadow { box-shadow: ${styles.treeStickyScrollShadow} 0 6px 6px -6px inset; height: 3px; }`);\n        }\n        // Sticky Scroll Focus\n        if (styles.listFocusForeground) {\n            content.push(`.monaco-list${suffix}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused { color: ${styles.listFocusForeground}; }`);\n            content.push(`.monaco-list${suffix}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused { color: inherit; }`);\n        }\n        // Sticky Scroll Focus Outlines\n        const focusAndSelectionOutline = asCssValueWithDefault(styles.listFocusAndSelectionOutline, asCssValueWithDefault(styles.listSelectionOutline, styles.listFocusOutline ?? ''));\n        if (focusAndSelectionOutline) { // default: listFocusOutline\n            content.push(`.monaco-list${suffix}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused.selected { outline: 1px solid ${focusAndSelectionOutline}; outline-offset: -1px;}`);\n            content.push(`.monaco-list${suffix}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused.selected { outline: inherit;}`);\n        }\n        if (styles.listFocusOutline) { // default: set\n            content.push(`.monaco-list${suffix}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused { outline: 1px solid ${styles.listFocusOutline}; outline-offset: -1px; }`);\n            content.push(`.monaco-list${suffix}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused { outline: inherit; }`);\n            content.push(`.context-menu-visible .monaco-list${suffix}.last-focused.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.passive-focused { outline: 1px solid ${styles.listFocusOutline}; outline-offset: -1px; }`);\n            content.push(`.context-menu-visible .monaco-list${suffix}.last-focused.sticky-scroll-focused .monaco-list-rows .monaco-list-row.focused { outline: inherit; }`);\n            content.push(`.context-menu-visible .monaco-list${suffix}.last-focused:not(.sticky-scroll-focused) .monaco-tree-sticky-container .monaco-list-rows .monaco-list-row.focused { outline: inherit; }`);\n        }\n        this.styleElement.textContent = content.join('\\n');\n        this.view.style(styles);\n    }\n    // Tree navigation\n    getParentElement(location) {\n        const parentRef = this.model.getParentNodeLocation(location);\n        const parentNode = this.model.getNode(parentRef);\n        return parentNode.element;\n    }\n    getFirstElementChild(location) {\n        return this.model.getFirstElementChild(location);\n    }\n    // Tree\n    getNode(location) {\n        return this.model.getNode(location);\n    }\n    getNodeLocation(node) {\n        return this.model.getNodeLocation(node);\n    }\n    collapse(location, recursive = false) {\n        return this.model.setCollapsed(location, true, recursive);\n    }\n    expand(location, recursive = false) {\n        return this.model.setCollapsed(location, false, recursive);\n    }\n    toggleCollapsed(location, recursive = false) {\n        return this.model.setCollapsed(location, undefined, recursive);\n    }\n    isCollapsible(location) {\n        return this.model.isCollapsible(location);\n    }\n    setCollapsible(location, collapsible) {\n        return this.model.setCollapsible(location, collapsible);\n    }\n    isCollapsed(location) {\n        return this.model.isCollapsed(location);\n    }\n    refilter() {\n        this._onWillRefilter.fire(undefined);\n        this.model.refilter();\n    }\n    setSelection(elements, browserEvent) {\n        this.eventBufferer.bufferEvents(() => {\n            const nodes = elements.map(e => this.model.getNode(e));\n            this.selection.set(nodes, browserEvent);\n            const indexes = elements.map(e => this.model.getListIndex(e)).filter(i => i > -1);\n            this.view.setSelection(indexes, browserEvent, true);\n        });\n    }\n    getSelection() {\n        return this.selection.get();\n    }\n    setFocus(elements, browserEvent) {\n        this.eventBufferer.bufferEvents(() => {\n            const nodes = elements.map(e => this.model.getNode(e));\n            this.focus.set(nodes, browserEvent);\n            const indexes = elements.map(e => this.model.getListIndex(e)).filter(i => i > -1);\n            this.view.setFocus(indexes, browserEvent, true);\n        });\n    }\n    focusNext(n = 1, loop = false, browserEvent, filter = (isKeyboardEvent(browserEvent) && browserEvent.altKey) ? undefined : this.focusNavigationFilter) {\n        this.view.focusNext(n, loop, browserEvent, filter);\n    }\n    focusPrevious(n = 1, loop = false, browserEvent, filter = (isKeyboardEvent(browserEvent) && browserEvent.altKey) ? undefined : this.focusNavigationFilter) {\n        this.view.focusPrevious(n, loop, browserEvent, filter);\n    }\n    focusNextPage(browserEvent, filter = (isKeyboardEvent(browserEvent) && browserEvent.altKey) ? undefined : this.focusNavigationFilter) {\n        return this.view.focusNextPage(browserEvent, filter);\n    }\n    focusPreviousPage(browserEvent, filter = (isKeyboardEvent(browserEvent) && browserEvent.altKey) ? undefined : this.focusNavigationFilter) {\n        return this.view.focusPreviousPage(browserEvent, filter, () => this.stickyScrollController?.height ?? 0);\n    }\n    focusLast(browserEvent, filter = (isKeyboardEvent(browserEvent) && browserEvent.altKey) ? undefined : this.focusNavigationFilter) {\n        this.view.focusLast(browserEvent, filter);\n    }\n    focusFirst(browserEvent, filter = (isKeyboardEvent(browserEvent) && browserEvent.altKey) ? undefined : this.focusNavigationFilter) {\n        this.view.focusFirst(browserEvent, filter);\n    }\n    getFocus() {\n        return this.focus.get();\n    }\n    reveal(location, relativeTop) {\n        this.model.expandTo(location);\n        const index = this.model.getListIndex(location);\n        if (index === -1) {\n            return;\n        }\n        if (!this.stickyScrollController) {\n            this.view.reveal(index, relativeTop);\n        }\n        else {\n            const paddingTop = this.stickyScrollController.nodePositionTopBelowWidget(this.getNode(location));\n            this.view.reveal(index, relativeTop, paddingTop);\n        }\n    }\n    // List\n    onLeftArrow(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        const nodes = this.view.getFocusedElements();\n        if (nodes.length === 0) {\n            return;\n        }\n        const node = nodes[0];\n        const location = this.model.getNodeLocation(node);\n        const didChange = this.model.setCollapsed(location, true);\n        if (!didChange) {\n            const parentLocation = this.model.getParentNodeLocation(location);\n            if (!parentLocation) {\n                return;\n            }\n            const parentListIndex = this.model.getListIndex(parentLocation);\n            this.view.reveal(parentListIndex);\n            this.view.setFocus([parentListIndex]);\n        }\n    }\n    onRightArrow(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        const nodes = this.view.getFocusedElements();\n        if (nodes.length === 0) {\n            return;\n        }\n        const node = nodes[0];\n        const location = this.model.getNodeLocation(node);\n        const didChange = this.model.setCollapsed(location, false);\n        if (!didChange) {\n            if (!node.children.some(child => child.visible)) {\n                return;\n            }\n            const [focusedIndex] = this.view.getFocus();\n            const firstChildIndex = focusedIndex + 1;\n            this.view.reveal(firstChildIndex);\n            this.view.setFocus([firstChildIndex]);\n        }\n    }\n    onSpace(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        const nodes = this.view.getFocusedElements();\n        if (nodes.length === 0) {\n            return;\n        }\n        const node = nodes[0];\n        const location = this.model.getNodeLocation(node);\n        const recursive = e.browserEvent.altKey;\n        this.model.setCollapsed(location, undefined, recursive);\n    }\n    setupModel(model) {\n        this.modelDisposables.clear();\n        this.modelDisposables.add(model.onDidSpliceRenderedNodes(({ start, deleteCount, elements }) => this.view.splice(start, deleteCount, elements)));\n        const onDidModelSplice = Event.forEach(model.onDidSpliceModel, e => {\n            this.eventBufferer.bufferEvents(() => {\n                this.focus.onDidModelSplice(e);\n                this.selection.onDidModelSplice(e);\n            });\n        }, this.modelDisposables);\n        // Make sure the `forEach` always runs\n        onDidModelSplice(() => null, null, this.modelDisposables);\n        // Active nodes can change when the model changes or when focus or selection change.\n        // We debounce it with 0 delay since these events may fire in the same stack and we only\n        // want to run this once. It also doesn't matter if it runs on the next tick since it's only\n        // a nice to have UI feature.\n        const activeNodesEmitter = this.modelDisposables.add(new Emitter());\n        const activeNodesDebounce = this.modelDisposables.add(new Delayer(0));\n        this.modelDisposables.add(Event.any(onDidModelSplice, this.focus.onDidChange, this.selection.onDidChange)(() => {\n            activeNodesDebounce.trigger(() => {\n                const set = new Set();\n                for (const node of this.focus.getNodes()) {\n                    set.add(node);\n                }\n                for (const node of this.selection.getNodes()) {\n                    set.add(node);\n                }\n                activeNodesEmitter.fire([...set.values()]);\n            });\n        }));\n        this.onDidChangeActiveNodesRelay.input = activeNodesEmitter.event;\n        this.onDidChangeModelRelay.input = Event.signal(model.onDidSpliceModel);\n        this.onDidChangeCollapseStateRelay.input = model.onDidChangeCollapseState;\n        this.onDidChangeRenderNodeCountRelay.input = model.onDidChangeRenderNodeCount;\n        this.onDidSpliceModelRelay.input = model.onDidSpliceModel;\n    }\n    dispose() {\n        dispose(this.disposables);\n        this.stickyScrollController?.dispose();\n        this.view.dispose();\n        this.modelDisposables.dispose();\n    }\n}\n\nexport { AbstractFindController, AbstractTree, ComposedTreeDelegate, FindController, FindFilter, FindToggles, RenderIndentGuides, TreeFindMatchType, TreeFindMode, TreeRenderer, contiguousFuzzyScore };\n","import { IndexTreeModel } from './indexTreeModel.js';\nimport { ObjectTreeElementCollapseState, TreeError } from './tree.js';\nimport { Iterable } from '../../../common/iterator.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ObjectTreeModel {\n    constructor(user, options = {}) {\n        this.user = user;\n        this.rootRef = null;\n        this.nodes = new Map();\n        this.nodesByIdentity = new Map();\n        this.model = new IndexTreeModel(user, null, options);\n        this.onDidSpliceModel = this.model.onDidSpliceModel;\n        this.onDidSpliceRenderedNodes = this.model.onDidSpliceRenderedNodes;\n        this.onDidChangeCollapseState = this.model.onDidChangeCollapseState;\n        this.onDidChangeRenderNodeCount = this.model.onDidChangeRenderNodeCount;\n        if (options.sorter) {\n            this.sorter = {\n                compare(a, b) {\n                    return options.sorter.compare(a.element, b.element);\n                }\n            };\n        }\n        this.identityProvider = options.identityProvider;\n    }\n    setChildren(element, children = Iterable.empty(), options = {}) {\n        const location = this.getElementLocation(element);\n        this._setChildren(location, this.preserveCollapseState(children), options);\n    }\n    _setChildren(location, children = Iterable.empty(), options) {\n        const insertedElements = new Set();\n        const insertedElementIds = new Set();\n        const onDidCreateNode = (node) => {\n            if (node.element === null) {\n                return;\n            }\n            const tnode = node;\n            insertedElements.add(tnode.element);\n            this.nodes.set(tnode.element, tnode);\n            if (this.identityProvider) {\n                const id = this.identityProvider.getId(tnode.element).toString();\n                insertedElementIds.add(id);\n                this.nodesByIdentity.set(id, tnode);\n            }\n            options.onDidCreateNode?.(tnode);\n        };\n        const onDidDeleteNode = (node) => {\n            if (node.element === null) {\n                return;\n            }\n            const tnode = node;\n            if (!insertedElements.has(tnode.element)) {\n                this.nodes.delete(tnode.element);\n            }\n            if (this.identityProvider) {\n                const id = this.identityProvider.getId(tnode.element).toString();\n                if (!insertedElementIds.has(id)) {\n                    this.nodesByIdentity.delete(id);\n                }\n            }\n            options.onDidDeleteNode?.(tnode);\n        };\n        this.model.splice([...location, 0], Number.MAX_VALUE, children, { ...options, onDidCreateNode, onDidDeleteNode });\n    }\n    preserveCollapseState(elements = Iterable.empty()) {\n        if (this.sorter) {\n            elements = [...elements].sort(this.sorter.compare.bind(this.sorter));\n        }\n        return Iterable.map(elements, treeElement => {\n            let node = this.nodes.get(treeElement.element);\n            if (!node && this.identityProvider) {\n                const id = this.identityProvider.getId(treeElement.element).toString();\n                node = this.nodesByIdentity.get(id);\n            }\n            if (!node) {\n                let collapsed;\n                if (typeof treeElement.collapsed === 'undefined') {\n                    collapsed = undefined;\n                }\n                else if (treeElement.collapsed === ObjectTreeElementCollapseState.Collapsed || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrCollapsed) {\n                    collapsed = true;\n                }\n                else if (treeElement.collapsed === ObjectTreeElementCollapseState.Expanded || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrExpanded) {\n                    collapsed = false;\n                }\n                else {\n                    collapsed = Boolean(treeElement.collapsed);\n                }\n                return {\n                    ...treeElement,\n                    children: this.preserveCollapseState(treeElement.children),\n                    collapsed\n                };\n            }\n            const collapsible = typeof treeElement.collapsible === 'boolean' ? treeElement.collapsible : node.collapsible;\n            let collapsed;\n            if (typeof treeElement.collapsed === 'undefined' || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrCollapsed || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrExpanded) {\n                collapsed = node.collapsed;\n            }\n            else if (treeElement.collapsed === ObjectTreeElementCollapseState.Collapsed) {\n                collapsed = true;\n            }\n            else if (treeElement.collapsed === ObjectTreeElementCollapseState.Expanded) {\n                collapsed = false;\n            }\n            else {\n                collapsed = Boolean(treeElement.collapsed);\n            }\n            return {\n                ...treeElement,\n                collapsible,\n                collapsed,\n                children: this.preserveCollapseState(treeElement.children)\n            };\n        });\n    }\n    rerender(element) {\n        const location = this.getElementLocation(element);\n        this.model.rerender(location);\n    }\n    resort(element = null, recursive = true) {\n        if (!this.sorter) {\n            return;\n        }\n        const location = this.getElementLocation(element);\n        const node = this.model.getNode(location);\n        this._setChildren(location, this.resortChildren(node, recursive), {});\n    }\n    resortChildren(node, recursive, first = true) {\n        let childrenNodes = [...node.children];\n        if (recursive || first) {\n            childrenNodes = childrenNodes.sort(this.sorter.compare.bind(this.sorter));\n        }\n        return Iterable.map(childrenNodes, node => ({\n            element: node.element,\n            collapsible: node.collapsible,\n            collapsed: node.collapsed,\n            children: this.resortChildren(node, recursive, false)\n        }));\n    }\n    getFirstElementChild(ref = null) {\n        const location = this.getElementLocation(ref);\n        return this.model.getFirstElementChild(location);\n    }\n    has(element) {\n        return this.nodes.has(element);\n    }\n    getListIndex(element) {\n        const location = this.getElementLocation(element);\n        return this.model.getListIndex(location);\n    }\n    getListRenderCount(element) {\n        const location = this.getElementLocation(element);\n        return this.model.getListRenderCount(location);\n    }\n    isCollapsible(element) {\n        const location = this.getElementLocation(element);\n        return this.model.isCollapsible(location);\n    }\n    setCollapsible(element, collapsible) {\n        const location = this.getElementLocation(element);\n        return this.model.setCollapsible(location, collapsible);\n    }\n    isCollapsed(element) {\n        const location = this.getElementLocation(element);\n        return this.model.isCollapsed(location);\n    }\n    setCollapsed(element, collapsed, recursive) {\n        const location = this.getElementLocation(element);\n        return this.model.setCollapsed(location, collapsed, recursive);\n    }\n    expandTo(element) {\n        const location = this.getElementLocation(element);\n        this.model.expandTo(location);\n    }\n    refilter() {\n        this.model.refilter();\n    }\n    getNode(element = null) {\n        if (element === null) {\n            return this.model.getNode(this.model.rootRef);\n        }\n        const node = this.nodes.get(element);\n        if (!node) {\n            throw new TreeError(this.user, `Tree element not found: ${element}`);\n        }\n        return node;\n    }\n    getNodeLocation(node) {\n        return node.element;\n    }\n    getParentNodeLocation(element) {\n        if (element === null) {\n            throw new TreeError(this.user, `Invalid getParentNodeLocation call`);\n        }\n        const node = this.nodes.get(element);\n        if (!node) {\n            throw new TreeError(this.user, `Tree element not found: ${element}`);\n        }\n        const location = this.model.getNodeLocation(node);\n        const parentLocation = this.model.getParentNodeLocation(location);\n        const parent = this.model.getNode(parentLocation);\n        return parent.element;\n    }\n    getElementLocation(element) {\n        if (element === null) {\n            return [];\n        }\n        const node = this.nodes.get(element);\n        if (!node) {\n            throw new TreeError(this.user, `Tree element not found: ${element}`);\n        }\n        return this.model.getNodeLocation(node);\n    }\n}\n\nexport { ObjectTreeModel };\n","import { getVisibleState, isFilterResult } from './indexTreeModel.js';\nimport { ObjectTreeModel } from './objectTreeModel.js';\nimport { WeakMapper, TreeError } from './tree.js';\nimport { equals } from '../../../common/arrays.js';\nimport { Event } from '../../../common/event.js';\nimport { Iterable } from '../../../common/iterator.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction noCompress(element) {\n    const elements = [element.element];\n    const incompressible = element.incompressible || false;\n    return {\n        element: { elements, incompressible },\n        children: Iterable.map(Iterable.from(element.children), noCompress),\n        collapsible: element.collapsible,\n        collapsed: element.collapsed\n    };\n}\n// Exported only for test reasons, do not use directly\nfunction compress(element) {\n    const elements = [element.element];\n    const incompressible = element.incompressible || false;\n    let childrenIterator;\n    let children;\n    while (true) {\n        [children, childrenIterator] = Iterable.consume(Iterable.from(element.children), 2);\n        if (children.length !== 1) {\n            break;\n        }\n        if (children[0].incompressible) {\n            break;\n        }\n        element = children[0];\n        elements.push(element.element);\n    }\n    return {\n        element: { elements, incompressible },\n        children: Iterable.map(Iterable.concat(children, childrenIterator), compress),\n        collapsible: element.collapsible,\n        collapsed: element.collapsed\n    };\n}\nfunction _decompress(element, index = 0) {\n    let children;\n    if (index < element.element.elements.length - 1) {\n        children = [_decompress(element, index + 1)];\n    }\n    else {\n        children = Iterable.map(Iterable.from(element.children), el => _decompress(el, 0));\n    }\n    if (index === 0 && element.element.incompressible) {\n        return {\n            element: element.element.elements[index],\n            children,\n            incompressible: true,\n            collapsible: element.collapsible,\n            collapsed: element.collapsed\n        };\n    }\n    return {\n        element: element.element.elements[index],\n        children,\n        collapsible: element.collapsible,\n        collapsed: element.collapsed\n    };\n}\n// Exported only for test reasons, do not use directly\nfunction decompress(element) {\n    return _decompress(element, 0);\n}\nfunction splice(treeElement, element, children) {\n    if (treeElement.element === element) {\n        return { ...treeElement, children };\n    }\n    return { ...treeElement, children: Iterable.map(Iterable.from(treeElement.children), e => splice(e, element, children)) };\n}\nconst wrapIdentityProvider = (base) => ({\n    getId(node) {\n        return node.elements.map(e => base.getId(e).toString()).join('\\0');\n    }\n});\n// Exported only for test reasons, do not use directly\nclass CompressedObjectTreeModel {\n    get onDidSpliceRenderedNodes() { return this.model.onDidSpliceRenderedNodes; }\n    get onDidSpliceModel() { return this.model.onDidSpliceModel; }\n    get onDidChangeCollapseState() { return this.model.onDidChangeCollapseState; }\n    get onDidChangeRenderNodeCount() { return this.model.onDidChangeRenderNodeCount; }\n    constructor(user, options = {}) {\n        this.user = user;\n        this.rootRef = null;\n        this.nodes = new Map();\n        this.model = new ObjectTreeModel(user, options);\n        this.enabled = typeof options.compressionEnabled === 'undefined' ? true : options.compressionEnabled;\n        this.identityProvider = options.identityProvider;\n    }\n    setChildren(element, children = Iterable.empty(), options) {\n        // Diffs must be deep, since the compression can affect nested elements.\n        // @see https://github.com/microsoft/vscode/pull/114237#issuecomment-759425034\n        const diffIdentityProvider = options.diffIdentityProvider && wrapIdentityProvider(options.diffIdentityProvider);\n        if (element === null) {\n            const compressedChildren = Iterable.map(children, this.enabled ? compress : noCompress);\n            this._setChildren(null, compressedChildren, { diffIdentityProvider, diffDepth: Infinity });\n            return;\n        }\n        const compressedNode = this.nodes.get(element);\n        if (!compressedNode) {\n            throw new TreeError(this.user, 'Unknown compressed tree node');\n        }\n        const node = this.model.getNode(compressedNode);\n        const compressedParentNode = this.model.getParentNodeLocation(compressedNode);\n        const parent = this.model.getNode(compressedParentNode);\n        const decompressedElement = decompress(node);\n        const splicedElement = splice(decompressedElement, element, children);\n        const recompressedElement = (this.enabled ? compress : noCompress)(splicedElement);\n        // If the recompressed node is identical to the original, just set its children.\n        // Saves work and churn diffing the parent element.\n        const elementComparator = options.diffIdentityProvider\n            ? ((a, b) => options.diffIdentityProvider.getId(a) === options.diffIdentityProvider.getId(b))\n            : undefined;\n        if (equals(recompressedElement.element.elements, node.element.elements, elementComparator)) {\n            this._setChildren(compressedNode, recompressedElement.children || Iterable.empty(), { diffIdentityProvider, diffDepth: 1 });\n            return;\n        }\n        const parentChildren = parent.children\n            .map(child => child === node ? recompressedElement : child);\n        this._setChildren(parent.element, parentChildren, {\n            diffIdentityProvider,\n            diffDepth: node.depth - parent.depth,\n        });\n    }\n    isCompressionEnabled() {\n        return this.enabled;\n    }\n    setCompressionEnabled(enabled) {\n        if (enabled === this.enabled) {\n            return;\n        }\n        this.enabled = enabled;\n        const root = this.model.getNode();\n        const rootChildren = root.children;\n        const decompressedRootChildren = Iterable.map(rootChildren, decompress);\n        const recompressedRootChildren = Iterable.map(decompressedRootChildren, enabled ? compress : noCompress);\n        // it should be safe to always use deep diff mode here if an identity\n        // provider is available, since we know the raw nodes are unchanged.\n        this._setChildren(null, recompressedRootChildren, {\n            diffIdentityProvider: this.identityProvider,\n            diffDepth: Infinity,\n        });\n    }\n    _setChildren(node, children, options) {\n        const insertedElements = new Set();\n        const onDidCreateNode = (node) => {\n            for (const element of node.element.elements) {\n                insertedElements.add(element);\n                this.nodes.set(element, node.element);\n            }\n        };\n        const onDidDeleteNode = (node) => {\n            for (const element of node.element.elements) {\n                if (!insertedElements.has(element)) {\n                    this.nodes.delete(element);\n                }\n            }\n        };\n        this.model.setChildren(node, children, { ...options, onDidCreateNode, onDidDeleteNode });\n    }\n    has(element) {\n        return this.nodes.has(element);\n    }\n    getListIndex(location) {\n        const node = this.getCompressedNode(location);\n        return this.model.getListIndex(node);\n    }\n    getListRenderCount(location) {\n        const node = this.getCompressedNode(location);\n        return this.model.getListRenderCount(node);\n    }\n    getNode(location) {\n        if (typeof location === 'undefined') {\n            return this.model.getNode();\n        }\n        const node = this.getCompressedNode(location);\n        return this.model.getNode(node);\n    }\n    // TODO: review this\n    getNodeLocation(node) {\n        const compressedNode = this.model.getNodeLocation(node);\n        if (compressedNode === null) {\n            return null;\n        }\n        return compressedNode.elements[compressedNode.elements.length - 1];\n    }\n    // TODO: review this\n    getParentNodeLocation(location) {\n        const compressedNode = this.getCompressedNode(location);\n        const parentNode = this.model.getParentNodeLocation(compressedNode);\n        if (parentNode === null) {\n            return null;\n        }\n        return parentNode.elements[parentNode.elements.length - 1];\n    }\n    getFirstElementChild(location) {\n        const compressedNode = this.getCompressedNode(location);\n        return this.model.getFirstElementChild(compressedNode);\n    }\n    isCollapsible(location) {\n        const compressedNode = this.getCompressedNode(location);\n        return this.model.isCollapsible(compressedNode);\n    }\n    setCollapsible(location, collapsible) {\n        const compressedNode = this.getCompressedNode(location);\n        return this.model.setCollapsible(compressedNode, collapsible);\n    }\n    isCollapsed(location) {\n        const compressedNode = this.getCompressedNode(location);\n        return this.model.isCollapsed(compressedNode);\n    }\n    setCollapsed(location, collapsed, recursive) {\n        const compressedNode = this.getCompressedNode(location);\n        return this.model.setCollapsed(compressedNode, collapsed, recursive);\n    }\n    expandTo(location) {\n        const compressedNode = this.getCompressedNode(location);\n        this.model.expandTo(compressedNode);\n    }\n    rerender(location) {\n        const compressedNode = this.getCompressedNode(location);\n        this.model.rerender(compressedNode);\n    }\n    refilter() {\n        this.model.refilter();\n    }\n    resort(location = null, recursive = true) {\n        const compressedNode = this.getCompressedNode(location);\n        this.model.resort(compressedNode, recursive);\n    }\n    getCompressedNode(element) {\n        if (element === null) {\n            return null;\n        }\n        const node = this.nodes.get(element);\n        if (!node) {\n            throw new TreeError(this.user, `Tree element not found: ${element}`);\n        }\n        return node;\n    }\n}\nconst DefaultElementMapper = elements => elements[elements.length - 1];\nclass CompressedTreeNodeWrapper {\n    get element() { return this.node.element === null ? null : this.unwrapper(this.node.element); }\n    get children() { return this.node.children.map(node => new CompressedTreeNodeWrapper(this.unwrapper, node)); }\n    get depth() { return this.node.depth; }\n    get visibleChildrenCount() { return this.node.visibleChildrenCount; }\n    get visibleChildIndex() { return this.node.visibleChildIndex; }\n    get collapsible() { return this.node.collapsible; }\n    get collapsed() { return this.node.collapsed; }\n    get visible() { return this.node.visible; }\n    get filterData() { return this.node.filterData; }\n    constructor(unwrapper, node) {\n        this.unwrapper = unwrapper;\n        this.node = node;\n    }\n}\nfunction mapOptions(compressedNodeUnwrapper, options) {\n    return {\n        ...options,\n        identityProvider: options.identityProvider && {\n            getId(node) {\n                return options.identityProvider.getId(compressedNodeUnwrapper(node));\n            }\n        },\n        sorter: options.sorter && {\n            compare(node, otherNode) {\n                return options.sorter.compare(node.elements[0], otherNode.elements[0]);\n            }\n        },\n        filter: options.filter && {\n            filter(node, parentVisibility) {\n                const elements = node.elements;\n                for (let i = 0; i < elements.length - 1; i++) {\n                    const result = options.filter.filter(elements[i], parentVisibility);\n                    parentVisibility = getVisibleState(isFilterResult(result) ? result.visibility : result);\n                }\n                return options.filter.filter(elements[elements.length - 1], parentVisibility);\n            }\n        }\n    };\n}\nclass CompressibleObjectTreeModel {\n    get onDidSpliceModel() {\n        return Event.map(this.model.onDidSpliceModel, ({ insertedNodes, deletedNodes }) => ({\n            insertedNodes: insertedNodes.map(node => this.nodeMapper.map(node)),\n            deletedNodes: deletedNodes.map(node => this.nodeMapper.map(node)),\n        }));\n    }\n    get onDidSpliceRenderedNodes() {\n        return Event.map(this.model.onDidSpliceRenderedNodes, ({ start, deleteCount, elements }) => ({\n            start,\n            deleteCount,\n            elements: elements.map(node => this.nodeMapper.map(node))\n        }));\n    }\n    get onDidChangeCollapseState() {\n        return Event.map(this.model.onDidChangeCollapseState, ({ node, deep }) => ({\n            node: this.nodeMapper.map(node),\n            deep\n        }));\n    }\n    get onDidChangeRenderNodeCount() {\n        return Event.map(this.model.onDidChangeRenderNodeCount, node => this.nodeMapper.map(node));\n    }\n    constructor(user, options = {}) {\n        this.rootRef = null;\n        this.elementMapper = options.elementMapper || DefaultElementMapper;\n        const compressedNodeUnwrapper = node => this.elementMapper(node.elements);\n        this.nodeMapper = new WeakMapper(node => new CompressedTreeNodeWrapper(compressedNodeUnwrapper, node));\n        this.model = new CompressedObjectTreeModel(user, mapOptions(compressedNodeUnwrapper, options));\n    }\n    setChildren(element, children = Iterable.empty(), options = {}) {\n        this.model.setChildren(element, children, options);\n    }\n    isCompressionEnabled() {\n        return this.model.isCompressionEnabled();\n    }\n    setCompressionEnabled(enabled) {\n        this.model.setCompressionEnabled(enabled);\n    }\n    has(location) {\n        return this.model.has(location);\n    }\n    getListIndex(location) {\n        return this.model.getListIndex(location);\n    }\n    getListRenderCount(location) {\n        return this.model.getListRenderCount(location);\n    }\n    getNode(location) {\n        return this.nodeMapper.map(this.model.getNode(location));\n    }\n    getNodeLocation(node) {\n        return node.element;\n    }\n    getParentNodeLocation(location) {\n        return this.model.getParentNodeLocation(location);\n    }\n    getFirstElementChild(location) {\n        const result = this.model.getFirstElementChild(location);\n        if (result === null || typeof result === 'undefined') {\n            return result;\n        }\n        return this.elementMapper(result.elements);\n    }\n    isCollapsible(location) {\n        return this.model.isCollapsible(location);\n    }\n    setCollapsible(location, collapsed) {\n        return this.model.setCollapsible(location, collapsed);\n    }\n    isCollapsed(location) {\n        return this.model.isCollapsed(location);\n    }\n    setCollapsed(location, collapsed, recursive) {\n        return this.model.setCollapsed(location, collapsed, recursive);\n    }\n    expandTo(location) {\n        return this.model.expandTo(location);\n    }\n    rerender(location) {\n        return this.model.rerender(location);\n    }\n    refilter() {\n        return this.model.refilter();\n    }\n    resort(element = null, recursive = true) {\n        return this.model.resort(element, recursive);\n    }\n    getCompressedTreeNode(location = null) {\n        return this.model.getNode(location);\n    }\n}\n\nexport { CompressedObjectTreeModel, CompressibleObjectTreeModel, DefaultElementMapper, compress, decompress };\n","import { AbstractTree } from './abstractTree.js';\nimport { CompressibleObjectTreeModel } from './compressedObjectTreeModel.js';\nimport { ObjectTreeModel } from './objectTreeModel.js';\nimport { memoize } from '../../../common/decorators.js';\nimport { Iterable } from '../../../common/iterator.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nclass ObjectTree extends AbstractTree {\n    get onDidChangeCollapseState() { return this.model.onDidChangeCollapseState; }\n    constructor(user, container, delegate, renderers, options = {}) {\n        super(user, container, delegate, renderers, options);\n        this.user = user;\n    }\n    setChildren(element, children = Iterable.empty(), options) {\n        this.model.setChildren(element, children, options);\n    }\n    rerender(element) {\n        if (element === undefined) {\n            this.view.rerender();\n            return;\n        }\n        this.model.rerender(element);\n    }\n    resort(element, recursive = true) {\n        this.model.resort(element, recursive);\n    }\n    hasElement(element) {\n        return this.model.has(element);\n    }\n    createModel(user, options) {\n        return new ObjectTreeModel(user, options);\n    }\n}\nclass CompressibleRenderer {\n    get compressedTreeNodeProvider() {\n        return this._compressedTreeNodeProvider();\n    }\n    constructor(_compressedTreeNodeProvider, stickyScrollDelegate, renderer) {\n        this._compressedTreeNodeProvider = _compressedTreeNodeProvider;\n        this.stickyScrollDelegate = stickyScrollDelegate;\n        this.renderer = renderer;\n        this.templateId = renderer.templateId;\n        if (renderer.onDidChangeTwistieState) {\n            this.onDidChangeTwistieState = renderer.onDidChangeTwistieState;\n        }\n    }\n    renderTemplate(container) {\n        const data = this.renderer.renderTemplate(container);\n        return { compressedTreeNode: undefined, data };\n    }\n    renderElement(node, index, templateData, details) {\n        let compressedTreeNode = this.stickyScrollDelegate.getCompressedNode(node);\n        if (!compressedTreeNode) {\n            compressedTreeNode = this.compressedTreeNodeProvider.getCompressedTreeNode(node.element);\n        }\n        if (compressedTreeNode.element.elements.length === 1) {\n            templateData.compressedTreeNode = undefined;\n            this.renderer.renderElement(node, index, templateData.data, details);\n        }\n        else {\n            templateData.compressedTreeNode = compressedTreeNode;\n            this.renderer.renderCompressedElements(compressedTreeNode, index, templateData.data, details);\n        }\n    }\n    disposeElement(node, index, templateData, details) {\n        if (templateData.compressedTreeNode) {\n            this.renderer.disposeCompressedElements?.(templateData.compressedTreeNode, index, templateData.data, details);\n        }\n        else {\n            this.renderer.disposeElement?.(node, index, templateData.data, details);\n        }\n    }\n    disposeTemplate(templateData) {\n        this.renderer.disposeTemplate(templateData.data);\n    }\n    renderTwistie(element, twistieElement) {\n        return this.renderer.renderTwistie?.(element, twistieElement) ?? false;\n    }\n}\n__decorate([\n    memoize\n], CompressibleRenderer.prototype, \"compressedTreeNodeProvider\", null);\nclass CompressibleStickyScrollDelegate {\n    constructor(modelProvider) {\n        this.modelProvider = modelProvider;\n        this.compressedStickyNodes = new Map();\n    }\n    getCompressedNode(node) {\n        return this.compressedStickyNodes.get(node);\n    }\n    constrainStickyScrollNodes(stickyNodes, stickyScrollMaxItemCount, maxWidgetHeight) {\n        this.compressedStickyNodes.clear();\n        if (stickyNodes.length === 0) {\n            return [];\n        }\n        for (let i = 0; i < stickyNodes.length; i++) {\n            const stickyNode = stickyNodes[i];\n            const stickyNodeBottom = stickyNode.position + stickyNode.height;\n            const followingReachesMaxHeight = i + 1 < stickyNodes.length && stickyNodeBottom + stickyNodes[i + 1].height > maxWidgetHeight;\n            if (followingReachesMaxHeight || i >= stickyScrollMaxItemCount - 1 && stickyScrollMaxItemCount < stickyNodes.length) {\n                const uncompressedStickyNodes = stickyNodes.slice(0, i);\n                const overflowingStickyNodes = stickyNodes.slice(i);\n                const compressedStickyNode = this.compressStickyNodes(overflowingStickyNodes);\n                return [...uncompressedStickyNodes, compressedStickyNode];\n            }\n        }\n        return stickyNodes;\n    }\n    compressStickyNodes(stickyNodes) {\n        if (stickyNodes.length === 0) {\n            throw new Error('Can\\'t compress empty sticky nodes');\n        }\n        const compressionModel = this.modelProvider();\n        if (!compressionModel.isCompressionEnabled()) {\n            return stickyNodes[0];\n        }\n        // Collect all elements to be compressed\n        const elements = [];\n        for (let i = 0; i < stickyNodes.length; i++) {\n            const stickyNode = stickyNodes[i];\n            const compressedNode = compressionModel.getCompressedTreeNode(stickyNode.node.element);\n            if (compressedNode.element) {\n                // if an element is incompressible, it can't be compressed with it's parent element\n                if (i !== 0 && compressedNode.element.incompressible) {\n                    break;\n                }\n                elements.push(...compressedNode.element.elements);\n            }\n        }\n        if (elements.length < 2) {\n            return stickyNodes[0];\n        }\n        // Compress the elements\n        const lastStickyNode = stickyNodes[stickyNodes.length - 1];\n        const compressedElement = { elements, incompressible: false };\n        const compressedNode = { ...lastStickyNode.node, children: [], element: compressedElement };\n        const stickyTreeNode = new Proxy(stickyNodes[0].node, {});\n        const compressedStickyNode = {\n            node: stickyTreeNode,\n            startIndex: stickyNodes[0].startIndex,\n            endIndex: lastStickyNode.endIndex,\n            position: stickyNodes[0].position,\n            height: stickyNodes[0].height,\n        };\n        this.compressedStickyNodes.set(stickyTreeNode, compressedNode);\n        return compressedStickyNode;\n    }\n}\nfunction asObjectTreeOptions(compressedTreeNodeProvider, options) {\n    return options && {\n        ...options,\n        keyboardNavigationLabelProvider: options.keyboardNavigationLabelProvider && {\n            getKeyboardNavigationLabel(e) {\n                let compressedTreeNode;\n                try {\n                    compressedTreeNode = compressedTreeNodeProvider().getCompressedTreeNode(e);\n                }\n                catch {\n                    return options.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(e);\n                }\n                if (compressedTreeNode.element.elements.length === 1) {\n                    return options.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(e);\n                }\n                else {\n                    return options.keyboardNavigationLabelProvider.getCompressedNodeKeyboardNavigationLabel(compressedTreeNode.element.elements);\n                }\n            }\n        }\n    };\n}\nclass CompressibleObjectTree extends ObjectTree {\n    constructor(user, container, delegate, renderers, options = {}) {\n        const compressedTreeNodeProvider = () => this;\n        const stickyScrollDelegate = new CompressibleStickyScrollDelegate(() => this.model);\n        const compressibleRenderers = renderers.map(r => new CompressibleRenderer(compressedTreeNodeProvider, stickyScrollDelegate, r));\n        super(user, container, delegate, compressibleRenderers, { ...asObjectTreeOptions(compressedTreeNodeProvider, options), stickyScrollDelegate });\n    }\n    setChildren(element, children = Iterable.empty(), options) {\n        this.model.setChildren(element, children, options);\n    }\n    createModel(user, options) {\n        return new CompressibleObjectTreeModel(user, options);\n    }\n    updateOptions(optionsUpdate = {}) {\n        super.updateOptions(optionsUpdate);\n        if (typeof optionsUpdate.compressionEnabled !== 'undefined') {\n            this.model.setCompressionEnabled(optionsUpdate.compressionEnabled);\n        }\n    }\n    getCompressedTreeNode(element = null) {\n        return this.model.getCompressedTreeNode(element);\n    }\n}\n\nexport { CompressibleObjectTree, ObjectTree };\n","import { ElementsDragAndDropData } from '../list/listView.js';\nimport { ComposedTreeDelegate, FindFilter, TreeFindMode, FindController } from './abstractTree.js';\nimport { isFilterResult, getVisibleState } from './indexTreeModel.js';\nimport { ObjectTree, CompressibleObjectTree } from './objectTree.js';\nimport { WeakMapper, ObjectTreeElementCollapseState, TreeError } from './tree.js';\nimport { createCancelablePromise, Promises, timeout } from '../../../common/async.js';\nimport { Codicon } from '../../../common/codicons.js';\nimport { ThemeIcon } from '../../../common/themables.js';\nimport { isCancellationError, onUnexpectedError } from '../../../common/errors.js';\nimport { Event, Emitter } from '../../../common/event.js';\nimport { Iterable } from '../../../common/iterator.js';\nimport { DisposableStore, toDisposable, dispose } from '../../../common/lifecycle.js';\nimport { isIterable } from '../../../common/types.js';\nimport { FuzzyScore } from '../../../common/filters.js';\nimport { splice } from '../../../common/arrays.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction createAsyncDataTreeNode(props) {\n    return {\n        ...props,\n        children: [],\n        refreshPromise: undefined,\n        stale: true,\n        slow: false,\n        forceExpanded: false\n    };\n}\nfunction isAncestor(ancestor, descendant) {\n    if (!descendant.parent) {\n        return false;\n    }\n    else if (descendant.parent === ancestor) {\n        return true;\n    }\n    else {\n        return isAncestor(ancestor, descendant.parent);\n    }\n}\nfunction intersects(node, other) {\n    return node === other || isAncestor(node, other) || isAncestor(other, node);\n}\nclass AsyncDataTreeNodeWrapper {\n    get element() { return this.node.element.element; }\n    get children() { return this.node.children.map(node => new AsyncDataTreeNodeWrapper(node)); }\n    get depth() { return this.node.depth; }\n    get visibleChildrenCount() { return this.node.visibleChildrenCount; }\n    get visibleChildIndex() { return this.node.visibleChildIndex; }\n    get collapsible() { return this.node.collapsible; }\n    get collapsed() { return this.node.collapsed; }\n    get visible() { return this.node.visible; }\n    get filterData() { return this.node.filterData; }\n    constructor(node) {\n        this.node = node;\n    }\n}\nclass AsyncDataTreeRenderer {\n    constructor(renderer, nodeMapper, onDidChangeTwistieState) {\n        this.renderer = renderer;\n        this.nodeMapper = nodeMapper;\n        this.onDidChangeTwistieState = onDidChangeTwistieState;\n        this.renderedNodes = new Map();\n        this.templateId = renderer.templateId;\n    }\n    renderTemplate(container) {\n        const templateData = this.renderer.renderTemplate(container);\n        return { templateData };\n    }\n    renderElement(node, index, templateData, details) {\n        this.renderer.renderElement(this.nodeMapper.map(node), index, templateData.templateData, details);\n    }\n    renderTwistie(element, twistieElement) {\n        if (element.slow) {\n            twistieElement.classList.add(...ThemeIcon.asClassNameArray(Codicon.treeItemLoading));\n            return true;\n        }\n        else {\n            twistieElement.classList.remove(...ThemeIcon.asClassNameArray(Codicon.treeItemLoading));\n            return false;\n        }\n    }\n    disposeElement(node, index, templateData, details) {\n        this.renderer.disposeElement?.(this.nodeMapper.map(node), index, templateData.templateData, details);\n    }\n    disposeTemplate(templateData) {\n        this.renderer.disposeTemplate(templateData.templateData);\n    }\n    dispose() {\n        this.renderedNodes.clear();\n    }\n}\nfunction asTreeEvent(e) {\n    return {\n        browserEvent: e.browserEvent,\n        elements: e.elements.map(e => e.element)\n    };\n}\nfunction asTreeMouseEvent(e) {\n    return {\n        browserEvent: e.browserEvent,\n        element: e.element && e.element.element,\n        target: e.target\n    };\n}\nclass AsyncDataTreeElementsDragAndDropData extends ElementsDragAndDropData {\n    constructor(data) {\n        super(data.elements.map(node => node.element));\n        this.data = data;\n    }\n}\nfunction asAsyncDataTreeDragAndDropData(data) {\n    if (data instanceof ElementsDragAndDropData) {\n        return new AsyncDataTreeElementsDragAndDropData(data);\n    }\n    return data;\n}\nclass AsyncDataTreeNodeListDragAndDrop {\n    constructor(dnd) {\n        this.dnd = dnd;\n    }\n    getDragURI(node) {\n        return this.dnd.getDragURI(node.element);\n    }\n    getDragLabel(nodes, originalEvent) {\n        if (this.dnd.getDragLabel) {\n            return this.dnd.getDragLabel(nodes.map(node => node.element), originalEvent);\n        }\n        return undefined;\n    }\n    onDragStart(data, originalEvent) {\n        this.dnd.onDragStart?.(asAsyncDataTreeDragAndDropData(data), originalEvent);\n    }\n    onDragOver(data, targetNode, targetIndex, targetSector, originalEvent, raw = true) {\n        return this.dnd.onDragOver(asAsyncDataTreeDragAndDropData(data), targetNode && targetNode.element, targetIndex, targetSector, originalEvent);\n    }\n    drop(data, targetNode, targetIndex, targetSector, originalEvent) {\n        this.dnd.drop(asAsyncDataTreeDragAndDropData(data), targetNode && targetNode.element, targetIndex, targetSector, originalEvent);\n    }\n    onDragEnd(originalEvent) {\n        this.dnd.onDragEnd?.(originalEvent);\n    }\n    dispose() {\n        this.dnd.dispose();\n    }\n}\nclass AsyncFindFilter extends FindFilter {\n    constructor(findProvider, // remove public\n    keyboardNavigationLabelProvider, filter) {\n        super(keyboardNavigationLabelProvider, filter);\n        this.findProvider = findProvider;\n        this.isFindSessionActive = false;\n    }\n    filter(element, parentVisibility) {\n        const filterResult = super.filter(element, parentVisibility);\n        if (!this.isFindSessionActive || this.findMode === TreeFindMode.Highlight || !this.findProvider.isVisible) {\n            return filterResult;\n        }\n        const visibility = isFilterResult(filterResult) ? filterResult.visibility : filterResult;\n        if (getVisibleState(visibility) === 0 /* TreeVisibility.Hidden */) {\n            return 0 /* TreeVisibility.Hidden */;\n        }\n        return this.findProvider.isVisible(element) ? filterResult : 0 /* TreeVisibility.Hidden */;\n    }\n}\n// TODO Fix types\nclass AsyncFindController extends FindController {\n    constructor(tree, findProvider, filter, contextViewProvider, options) {\n        super(tree, filter, contextViewProvider, options);\n        this.findProvider = findProvider;\n        this.filter = filter;\n        this.activeSession = false;\n        this.asyncWorkInProgress = false;\n        // Always make sure to end the session before disposing\n        this.disposables.add(toDisposable(async () => {\n            if (this.activeSession) {\n                await this.findProvider.endSession?.();\n            }\n        }));\n    }\n    render() {\n        if (this.asyncWorkInProgress || !this.activeFindMetadata) {\n            return;\n        }\n        const showNotFound = this.activeFindMetadata.matchCount === 0 && this.pattern.length > 0;\n        this.renderMessage(showNotFound);\n        if (this.pattern.length) {\n            this.alertResults(this.activeFindMetadata.matchCount);\n        }\n    }\n    shouldAllowFocus(node) {\n        return this.shouldFocusWhenNavigating(node);\n    }\n    shouldFocusWhenNavigating(node) {\n        if (!this.activeSession || !this.activeFindMetadata) {\n            return true;\n        }\n        const element = node.element?.element;\n        if (element && this.activeFindMetadata.isMatch(element)) {\n            return true;\n        }\n        return !FuzzyScore.isDefault(node.filterData);\n    }\n}\nfunction asObjectTreeOptions(options) {\n    return options && {\n        ...options,\n        collapseByDefault: true,\n        identityProvider: options.identityProvider && {\n            getId(el) {\n                return options.identityProvider.getId(el.element);\n            }\n        },\n        dnd: options.dnd && new AsyncDataTreeNodeListDragAndDrop(options.dnd),\n        multipleSelectionController: options.multipleSelectionController && {\n            isSelectionSingleChangeEvent(e) {\n                // eslint-disable-next-line local/code-no-dangerous-type-assertions\n                return options.multipleSelectionController.isSelectionSingleChangeEvent({ ...e, element: e.element });\n            },\n            isSelectionRangeChangeEvent(e) {\n                // eslint-disable-next-line local/code-no-dangerous-type-assertions\n                return options.multipleSelectionController.isSelectionRangeChangeEvent({ ...e, element: e.element });\n            }\n        },\n        accessibilityProvider: options.accessibilityProvider && {\n            ...options.accessibilityProvider,\n            getPosInSet: undefined,\n            getSetSize: undefined,\n            getRole: options.accessibilityProvider.getRole ? (el) => {\n                return options.accessibilityProvider.getRole(el.element);\n            } : () => 'treeitem',\n            isChecked: options.accessibilityProvider.isChecked ? (e) => {\n                return !!(options.accessibilityProvider?.isChecked(e.element));\n            } : undefined,\n            getAriaLabel(e) {\n                return options.accessibilityProvider.getAriaLabel(e.element);\n            },\n            getWidgetAriaLabel() {\n                return options.accessibilityProvider.getWidgetAriaLabel();\n            },\n            getWidgetRole: options.accessibilityProvider.getWidgetRole ? () => options.accessibilityProvider.getWidgetRole() : () => 'tree',\n            getAriaLevel: options.accessibilityProvider.getAriaLevel && (node => {\n                return options.accessibilityProvider.getAriaLevel(node.element);\n            }),\n            getActiveDescendantId: options.accessibilityProvider.getActiveDescendantId && (node => {\n                return options.accessibilityProvider.getActiveDescendantId(node.element);\n            })\n        },\n        filter: options.filter && {\n            filter(e, parentVisibility) {\n                return options.filter.filter(e.element, parentVisibility);\n            }\n        },\n        keyboardNavigationLabelProvider: options.keyboardNavigationLabelProvider && {\n            ...options.keyboardNavigationLabelProvider,\n            getKeyboardNavigationLabel(e) {\n                return options.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(e.element);\n            }\n        },\n        sorter: undefined,\n        expandOnlyOnTwistieClick: typeof options.expandOnlyOnTwistieClick === 'undefined' ? undefined : (typeof options.expandOnlyOnTwistieClick !== 'function' ? options.expandOnlyOnTwistieClick : ((e) => options.expandOnlyOnTwistieClick(e.element))),\n        defaultFindVisibility: (e) => {\n            if (e.hasChildren && e.stale) {\n                return 1 /* TreeVisibility.Visible */;\n            }\n            else if (typeof options.defaultFindVisibility === 'number') {\n                return options.defaultFindVisibility;\n            }\n            else if (typeof options.defaultFindVisibility === 'undefined') {\n                return 2 /* TreeVisibility.Recurse */;\n            }\n            else {\n                return options.defaultFindVisibility(e.element);\n            }\n        },\n        stickyScrollDelegate: options.stickyScrollDelegate\n    };\n}\nfunction dfs(node, fn) {\n    fn(node);\n    node.children.forEach(child => dfs(child, fn));\n}\nclass AsyncDataTree {\n    get onDidScroll() { return this.tree.onDidScroll; }\n    get onDidChangeFocus() { return Event.map(this.tree.onDidChangeFocus, asTreeEvent); }\n    get onDidChangeSelection() { return Event.map(this.tree.onDidChangeSelection, asTreeEvent); }\n    get onMouseDblClick() { return Event.map(this.tree.onMouseDblClick, asTreeMouseEvent); }\n    get onPointer() { return Event.map(this.tree.onPointer, asTreeMouseEvent); }\n    get onDidFocus() { return this.tree.onDidFocus; }\n    /**\n     * To be used internally only!\n     * @deprecated\n     */\n    get onDidChangeModel() { return this.tree.onDidChangeModel; }\n    get onDidChangeCollapseState() { return this.tree.onDidChangeCollapseState; }\n    get onDidChangeStickyScrollFocused() { return this.tree.onDidChangeStickyScrollFocused; }\n    get onDidDispose() { return this.tree.onDidDispose; }\n    constructor(user, container, delegate, renderers, dataSource, options = {}) {\n        this.user = user;\n        this.dataSource = dataSource;\n        this.nodes = new Map();\n        this.subTreeRefreshPromises = new Map();\n        this.refreshPromises = new Map();\n        this._onDidRender = new Emitter();\n        this._onDidChangeNodeSlowState = new Emitter();\n        this.nodeMapper = new WeakMapper(node => new AsyncDataTreeNodeWrapper(node));\n        this.disposables = new DisposableStore();\n        this.identityProvider = options.identityProvider;\n        this.autoExpandSingleChildren = typeof options.autoExpandSingleChildren === 'undefined' ? false : options.autoExpandSingleChildren;\n        this.sorter = options.sorter;\n        this.getDefaultCollapseState = e => options.collapseByDefault ? (options.collapseByDefault(e) ? ObjectTreeElementCollapseState.PreserveOrCollapsed : ObjectTreeElementCollapseState.PreserveOrExpanded) : undefined;\n        let asyncFindEnabled = false;\n        let findFilter;\n        if (options.findProvider && (options.findWidgetEnabled ?? true) && options.keyboardNavigationLabelProvider && options.contextViewProvider) {\n            asyncFindEnabled = true;\n            findFilter = new AsyncFindFilter(options.findProvider, options.keyboardNavigationLabelProvider, options.filter);\n        }\n        this.tree = this.createTree(user, container, delegate, renderers, { ...options, findWidgetEnabled: !asyncFindEnabled, filter: findFilter ?? options.filter });\n        this.root = createAsyncDataTreeNode({\n            element: undefined,\n            parent: null,\n            hasChildren: true,\n            defaultCollapseState: undefined\n        });\n        if (this.identityProvider) {\n            this.root = {\n                ...this.root,\n                id: null\n            };\n        }\n        this.nodes.set(null, this.root);\n        this.tree.onDidChangeCollapseState(this._onDidChangeCollapseState, this, this.disposables);\n        if (asyncFindEnabled) {\n            const findOptions = {\n                styles: options.findWidgetStyles,\n                showNotFoundMessage: options.showNotFoundMessage,\n                defaultFindMatchType: options.defaultFindMatchType,\n                defaultFindMode: options.defaultFindMode,\n            };\n            this.findController = this.disposables.add(new AsyncFindController(this.tree, options.findProvider, findFilter, this.tree.options.contextViewProvider, findOptions));\n            this.focusNavigationFilter = node => this.findController.shouldFocusWhenNavigating(node);\n            this.onDidChangeFindOpenState = this.findController.onDidChangeOpenState;\n            this.onDidChangeFindMode = this.findController.onDidChangeMode;\n            this.onDidChangeFindMatchType = this.findController.onDidChangeMatchType;\n        }\n        else {\n            this.onDidChangeFindOpenState = this.tree.onDidChangeFindOpenState;\n            this.onDidChangeFindMode = this.tree.onDidChangeFindMode;\n            this.onDidChangeFindMatchType = this.tree.onDidChangeFindMatchType;\n        }\n    }\n    createTree(user, container, delegate, renderers, options) {\n        const objectTreeDelegate = new ComposedTreeDelegate(delegate);\n        const objectTreeRenderers = renderers.map(r => new AsyncDataTreeRenderer(r, this.nodeMapper, this._onDidChangeNodeSlowState.event));\n        const objectTreeOptions = asObjectTreeOptions(options) || {};\n        return new ObjectTree(user, container, objectTreeDelegate, objectTreeRenderers, objectTreeOptions);\n    }\n    updateOptions(optionsUpdate = {}) {\n        if (this.findController) {\n            if (optionsUpdate.defaultFindMode !== undefined) {\n                this.findController.mode = optionsUpdate.defaultFindMode;\n            }\n            if (optionsUpdate.defaultFindMatchType !== undefined) {\n                this.findController.matchType = optionsUpdate.defaultFindMatchType;\n            }\n        }\n        this.tree.updateOptions(optionsUpdate);\n    }\n    // Widget\n    getHTMLElement() {\n        return this.tree.getHTMLElement();\n    }\n    get scrollTop() {\n        return this.tree.scrollTop;\n    }\n    set scrollTop(scrollTop) {\n        this.tree.scrollTop = scrollTop;\n    }\n    get scrollHeight() {\n        return this.tree.scrollHeight;\n    }\n    get renderHeight() {\n        return this.tree.renderHeight;\n    }\n    domFocus() {\n        this.tree.domFocus();\n    }\n    layout(height, width) {\n        this.tree.layout(height, width);\n    }\n    style(styles) {\n        this.tree.style(styles);\n    }\n    // Model\n    getInput() {\n        return this.root.element;\n    }\n    async setInput(input, viewState) {\n        this.cancelAllRefreshPromises();\n        this.root.element = input;\n        const viewStateContext = viewState && { viewState, focus: [], selection: [] };\n        await this._updateChildren(input, true, false, viewStateContext);\n        if (viewStateContext) {\n            this.tree.setFocus(viewStateContext.focus);\n            this.tree.setSelection(viewStateContext.selection);\n        }\n        if (viewState && typeof viewState.scrollTop === 'number') {\n            this.scrollTop = viewState.scrollTop;\n        }\n    }\n    cancelAllRefreshPromises(includeSubTrees = false) {\n        this.refreshPromises.forEach(promise => promise.cancel());\n        this.refreshPromises.clear();\n        if (includeSubTrees) {\n            this.subTreeRefreshPromises.forEach(promise => promise.cancel());\n            this.subTreeRefreshPromises.clear();\n        }\n    }\n    async _updateChildren(element = this.root.element, recursive = true, rerender = false, viewStateContext, options) {\n        if (typeof this.root.element === 'undefined') {\n            throw new TreeError(this.user, 'Tree input not set');\n        }\n        if (this.root.refreshPromise) {\n            await this.root.refreshPromise;\n            await Event.toPromise(this._onDidRender.event);\n        }\n        const node = this.getDataNode(element);\n        await this.refreshAndRenderNode(node, recursive, viewStateContext, options);\n        if (rerender) {\n            try {\n                this.tree.rerender(node);\n            }\n            catch {\n                // missing nodes are fine, this could've resulted from\n                // parallel refresh calls, removing `node` altogether\n            }\n        }\n    }\n    // View\n    rerender(element) {\n        if (element === undefined || element === this.root.element) {\n            this.tree.rerender();\n            return;\n        }\n        const node = this.getDataNode(element);\n        this.tree.rerender(node);\n    }\n    // Tree\n    getNode(element = this.root.element) {\n        const dataNode = this.getDataNode(element);\n        const node = this.tree.getNode(dataNode === this.root ? null : dataNode);\n        return this.nodeMapper.map(node);\n    }\n    collapse(element, recursive = false) {\n        const node = this.getDataNode(element);\n        return this.tree.collapse(node === this.root ? null : node, recursive);\n    }\n    async expand(element, recursive = false) {\n        if (typeof this.root.element === 'undefined') {\n            throw new TreeError(this.user, 'Tree input not set');\n        }\n        if (this.root.refreshPromise) {\n            await this.root.refreshPromise;\n            await Event.toPromise(this._onDidRender.event);\n        }\n        const node = this.getDataNode(element);\n        if (this.tree.hasElement(node) && !this.tree.isCollapsible(node)) {\n            return false;\n        }\n        if (node.refreshPromise) {\n            await node.refreshPromise;\n            await Event.toPromise(this._onDidRender.event);\n        }\n        if (node !== this.root && !node.refreshPromise && !this.tree.isCollapsed(node)) {\n            return false;\n        }\n        const result = this.tree.expand(node === this.root ? null : node, recursive);\n        if (node.refreshPromise) {\n            await node.refreshPromise;\n            await Event.toPromise(this._onDidRender.event);\n        }\n        return result;\n    }\n    setSelection(elements, browserEvent) {\n        const nodes = elements.map(e => this.getDataNode(e));\n        this.tree.setSelection(nodes, browserEvent);\n    }\n    getSelection() {\n        const nodes = this.tree.getSelection();\n        return nodes.map(n => n.element);\n    }\n    setFocus(elements, browserEvent) {\n        const nodes = elements.map(e => this.getDataNode(e));\n        this.tree.setFocus(nodes, browserEvent);\n    }\n    getFocus() {\n        const nodes = this.tree.getFocus();\n        return nodes.map(n => n.element);\n    }\n    reveal(element, relativeTop) {\n        this.tree.reveal(this.getDataNode(element), relativeTop);\n    }\n    // Tree navigation\n    getParentElement(element) {\n        const node = this.tree.getParentElement(this.getDataNode(element));\n        return (node && node.element);\n    }\n    getFirstElementChild(element = this.root.element) {\n        const dataNode = this.getDataNode(element);\n        const node = this.tree.getFirstElementChild(dataNode === this.root ? null : dataNode);\n        return (node && node.element);\n    }\n    // Implementation\n    getDataNode(element) {\n        const node = this.nodes.get((element === this.root.element ? null : element));\n        if (!node) {\n            const nodeIdentity = this.identityProvider?.getId(element).toString();\n            throw new TreeError(this.user, `Data tree node not found${nodeIdentity ? `: ${nodeIdentity}` : ''}`);\n        }\n        return node;\n    }\n    async refreshAndRenderNode(node, recursive, viewStateContext, options) {\n        if (this.disposables.isDisposed) {\n            return; // tree disposed during refresh, again (#228211)\n        }\n        await this.refreshNode(node, recursive, viewStateContext);\n        if (this.disposables.isDisposed) {\n            return; // tree disposed during refresh (#199264)\n        }\n        this.render(node, viewStateContext, options);\n    }\n    async refreshNode(node, recursive, viewStateContext) {\n        let result;\n        this.subTreeRefreshPromises.forEach((refreshPromise, refreshNode) => {\n            if (!result && intersects(refreshNode, node)) {\n                result = refreshPromise.then(() => this.refreshNode(node, recursive, viewStateContext));\n            }\n        });\n        if (result) {\n            return result;\n        }\n        if (node !== this.root) {\n            const treeNode = this.tree.getNode(node);\n            if (treeNode.collapsed) {\n                node.hasChildren = !!this.dataSource.hasChildren(node.element);\n                node.stale = true;\n                this.setChildren(node, [], recursive, viewStateContext);\n                return;\n            }\n        }\n        return this.doRefreshSubTree(node, recursive, viewStateContext);\n    }\n    async doRefreshSubTree(node, recursive, viewStateContext) {\n        const cancelablePromise = createCancelablePromise(async () => {\n            const childrenToRefresh = await this.doRefreshNode(node, recursive, viewStateContext);\n            node.stale = false;\n            await Promises.settled(childrenToRefresh.map(child => this.doRefreshSubTree(child, recursive, viewStateContext)));\n        });\n        node.refreshPromise = cancelablePromise;\n        this.subTreeRefreshPromises.set(node, cancelablePromise);\n        cancelablePromise.finally(() => {\n            node.refreshPromise = undefined;\n            this.subTreeRefreshPromises.delete(node);\n        });\n        return cancelablePromise;\n    }\n    async doRefreshNode(node, recursive, viewStateContext) {\n        node.hasChildren = !!this.dataSource.hasChildren(node.element);\n        let childrenPromise;\n        if (!node.hasChildren) {\n            childrenPromise = Promise.resolve(Iterable.empty());\n        }\n        else {\n            const children = this.doGetChildren(node);\n            if (isIterable(children)) {\n                childrenPromise = Promise.resolve(children);\n            }\n            else {\n                const slowTimeout = timeout(800);\n                slowTimeout.then(() => {\n                    node.slow = true;\n                    this._onDidChangeNodeSlowState.fire(node);\n                }, _ => null);\n                childrenPromise = children.finally(() => slowTimeout.cancel());\n            }\n        }\n        try {\n            const children = await childrenPromise;\n            return this.setChildren(node, children, recursive, viewStateContext);\n        }\n        catch (err) {\n            if (node !== this.root && this.tree.hasElement(node)) {\n                this.tree.collapse(node);\n            }\n            if (isCancellationError(err)) {\n                return [];\n            }\n            throw err;\n        }\n        finally {\n            if (node.slow) {\n                node.slow = false;\n                this._onDidChangeNodeSlowState.fire(node);\n            }\n        }\n    }\n    doGetChildren(node) {\n        let result = this.refreshPromises.get(node);\n        if (result) {\n            return result;\n        }\n        const children = this.dataSource.getChildren(node.element);\n        if (isIterable(children)) {\n            return this.processChildren(children);\n        }\n        else {\n            result = createCancelablePromise(async () => this.processChildren(await children));\n            this.refreshPromises.set(node, result);\n            return result.finally(() => { this.refreshPromises.delete(node); });\n        }\n    }\n    _onDidChangeCollapseState({ node, deep }) {\n        if (node.element === null) {\n            return;\n        }\n        if (!node.collapsed && node.element.stale) {\n            if (deep) {\n                this.collapse(node.element.element);\n            }\n            else {\n                this.refreshAndRenderNode(node.element, false)\n                    .catch(onUnexpectedError);\n            }\n        }\n    }\n    setChildren(node, childrenElementsIterable, recursive, viewStateContext) {\n        const childrenElements = [...childrenElementsIterable];\n        // perf: if the node was and still is a leaf, avoid all this hassle\n        if (node.children.length === 0 && childrenElements.length === 0) {\n            return [];\n        }\n        const nodesToForget = new Map();\n        const childrenTreeNodesById = new Map();\n        for (const child of node.children) {\n            nodesToForget.set(child.element, child);\n            if (this.identityProvider) {\n                childrenTreeNodesById.set(child.id, { node: child, collapsed: this.tree.hasElement(child) && this.tree.isCollapsed(child) });\n            }\n        }\n        const childrenToRefresh = [];\n        const children = childrenElements.map(element => {\n            const hasChildren = !!this.dataSource.hasChildren(element);\n            if (!this.identityProvider) {\n                const asyncDataTreeNode = createAsyncDataTreeNode({ element, parent: node, hasChildren, defaultCollapseState: this.getDefaultCollapseState(element) });\n                if (hasChildren && asyncDataTreeNode.defaultCollapseState === ObjectTreeElementCollapseState.PreserveOrExpanded) {\n                    childrenToRefresh.push(asyncDataTreeNode);\n                }\n                return asyncDataTreeNode;\n            }\n            const id = this.identityProvider.getId(element).toString();\n            const result = childrenTreeNodesById.get(id);\n            if (result) {\n                const asyncDataTreeNode = result.node;\n                nodesToForget.delete(asyncDataTreeNode.element);\n                this.nodes.delete(asyncDataTreeNode.element);\n                this.nodes.set(element, asyncDataTreeNode);\n                asyncDataTreeNode.element = element;\n                asyncDataTreeNode.hasChildren = hasChildren;\n                if (recursive) {\n                    if (result.collapsed) {\n                        asyncDataTreeNode.children.forEach(node => dfs(node, node => this.nodes.delete(node.element)));\n                        asyncDataTreeNode.children.splice(0, asyncDataTreeNode.children.length);\n                        asyncDataTreeNode.stale = true;\n                    }\n                    else {\n                        childrenToRefresh.push(asyncDataTreeNode);\n                    }\n                }\n                else if (hasChildren && !result.collapsed) {\n                    childrenToRefresh.push(asyncDataTreeNode);\n                }\n                return asyncDataTreeNode;\n            }\n            const childAsyncDataTreeNode = createAsyncDataTreeNode({ element, parent: node, id, hasChildren, defaultCollapseState: this.getDefaultCollapseState(element) });\n            if (viewStateContext && viewStateContext.viewState.focus && viewStateContext.viewState.focus.indexOf(id) > -1) {\n                viewStateContext.focus.push(childAsyncDataTreeNode);\n            }\n            if (viewStateContext && viewStateContext.viewState.selection && viewStateContext.viewState.selection.indexOf(id) > -1) {\n                viewStateContext.selection.push(childAsyncDataTreeNode);\n            }\n            if (viewStateContext && viewStateContext.viewState.expanded && viewStateContext.viewState.expanded.indexOf(id) > -1) {\n                childrenToRefresh.push(childAsyncDataTreeNode);\n            }\n            else if (hasChildren && childAsyncDataTreeNode.defaultCollapseState === ObjectTreeElementCollapseState.PreserveOrExpanded) {\n                childrenToRefresh.push(childAsyncDataTreeNode);\n            }\n            return childAsyncDataTreeNode;\n        });\n        for (const node of nodesToForget.values()) {\n            dfs(node, node => this.nodes.delete(node.element));\n        }\n        for (const child of children) {\n            this.nodes.set(child.element, child);\n        }\n        splice(node.children, 0, node.children.length, children);\n        // TODO@joao this doesn't take filter into account\n        if (node !== this.root && this.autoExpandSingleChildren && children.length === 1 && childrenToRefresh.length === 0) {\n            children[0].forceExpanded = true;\n            childrenToRefresh.push(children[0]);\n        }\n        return childrenToRefresh;\n    }\n    render(node, viewStateContext, options) {\n        const children = node.children.map(node => this.asTreeElement(node, viewStateContext));\n        const objectTreeOptions = options && {\n            ...options,\n            diffIdentityProvider: options.diffIdentityProvider && {\n                getId(node) {\n                    return options.diffIdentityProvider.getId(node.element);\n                }\n            }\n        };\n        this.tree.setChildren(node === this.root ? null : node, children, objectTreeOptions);\n        if (node !== this.root) {\n            this.tree.setCollapsible(node, node.hasChildren);\n        }\n        this._onDidRender.fire();\n    }\n    asTreeElement(node, viewStateContext) {\n        if (node.stale) {\n            return {\n                element: node,\n                collapsible: node.hasChildren,\n                collapsed: true\n            };\n        }\n        let collapsed;\n        if (viewStateContext && viewStateContext.viewState.expanded && node.id && viewStateContext.viewState.expanded.indexOf(node.id) > -1) {\n            collapsed = false;\n        }\n        else if (node.forceExpanded) {\n            collapsed = false;\n            node.forceExpanded = false;\n        }\n        else {\n            collapsed = node.defaultCollapseState;\n        }\n        return {\n            element: node,\n            children: node.hasChildren ? Iterable.map(node.children, child => this.asTreeElement(child, viewStateContext)) : [],\n            collapsible: node.hasChildren,\n            collapsed\n        };\n    }\n    processChildren(children) {\n        if (this.sorter) {\n            children = [...children].sort(this.sorter.compare.bind(this.sorter));\n        }\n        return children;\n    }\n    dispose() {\n        this.disposables.dispose();\n        this.tree.dispose();\n    }\n}\nclass CompressibleAsyncDataTreeNodeWrapper {\n    get element() {\n        return {\n            elements: this.node.element.elements.map(e => e.element),\n            incompressible: this.node.element.incompressible\n        };\n    }\n    get children() { return this.node.children.map(node => new CompressibleAsyncDataTreeNodeWrapper(node)); }\n    get depth() { return this.node.depth; }\n    get visibleChildrenCount() { return this.node.visibleChildrenCount; }\n    get visibleChildIndex() { return this.node.visibleChildIndex; }\n    get collapsible() { return this.node.collapsible; }\n    get collapsed() { return this.node.collapsed; }\n    get visible() { return this.node.visible; }\n    get filterData() { return this.node.filterData; }\n    constructor(node) {\n        this.node = node;\n    }\n}\nclass CompressibleAsyncDataTreeRenderer {\n    constructor(renderer, nodeMapper, compressibleNodeMapperProvider, onDidChangeTwistieState) {\n        this.renderer = renderer;\n        this.nodeMapper = nodeMapper;\n        this.compressibleNodeMapperProvider = compressibleNodeMapperProvider;\n        this.onDidChangeTwistieState = onDidChangeTwistieState;\n        this.renderedNodes = new Map();\n        this.disposables = [];\n        this.templateId = renderer.templateId;\n    }\n    renderTemplate(container) {\n        const templateData = this.renderer.renderTemplate(container);\n        return { templateData };\n    }\n    renderElement(node, index, templateData, details) {\n        this.renderer.renderElement(this.nodeMapper.map(node), index, templateData.templateData, details);\n    }\n    renderCompressedElements(node, index, templateData, details) {\n        this.renderer.renderCompressedElements(this.compressibleNodeMapperProvider().map(node), index, templateData.templateData, details);\n    }\n    renderTwistie(element, twistieElement) {\n        if (element.slow) {\n            twistieElement.classList.add(...ThemeIcon.asClassNameArray(Codicon.treeItemLoading));\n            return true;\n        }\n        else {\n            twistieElement.classList.remove(...ThemeIcon.asClassNameArray(Codicon.treeItemLoading));\n            return false;\n        }\n    }\n    disposeElement(node, index, templateData, details) {\n        this.renderer.disposeElement?.(this.nodeMapper.map(node), index, templateData.templateData, details);\n    }\n    disposeCompressedElements(node, index, templateData, details) {\n        this.renderer.disposeCompressedElements?.(this.compressibleNodeMapperProvider().map(node), index, templateData.templateData, details);\n    }\n    disposeTemplate(templateData) {\n        this.renderer.disposeTemplate(templateData.templateData);\n    }\n    dispose() {\n        this.renderedNodes.clear();\n        this.disposables = dispose(this.disposables);\n    }\n}\nfunction asCompressibleObjectTreeOptions(options) {\n    const objectTreeOptions = options && asObjectTreeOptions(options);\n    return objectTreeOptions && {\n        ...objectTreeOptions,\n        keyboardNavigationLabelProvider: objectTreeOptions.keyboardNavigationLabelProvider && {\n            ...objectTreeOptions.keyboardNavigationLabelProvider,\n            getCompressedNodeKeyboardNavigationLabel(els) {\n                return options.keyboardNavigationLabelProvider.getCompressedNodeKeyboardNavigationLabel(els.map(e => e.element));\n            }\n        },\n        stickyScrollDelegate: objectTreeOptions.stickyScrollDelegate\n    };\n}\nclass CompressibleAsyncDataTree extends AsyncDataTree {\n    constructor(user, container, virtualDelegate, compressionDelegate, renderers, dataSource, options = {}) {\n        super(user, container, virtualDelegate, renderers, dataSource, options);\n        this.compressionDelegate = compressionDelegate;\n        this.compressibleNodeMapper = new WeakMapper(node => new CompressibleAsyncDataTreeNodeWrapper(node));\n        this.filter = options.filter;\n    }\n    createTree(user, container, delegate, renderers, options) {\n        const objectTreeDelegate = new ComposedTreeDelegate(delegate);\n        const objectTreeRenderers = renderers.map(r => new CompressibleAsyncDataTreeRenderer(r, this.nodeMapper, () => this.compressibleNodeMapper, this._onDidChangeNodeSlowState.event));\n        const objectTreeOptions = asCompressibleObjectTreeOptions(options) || {};\n        return new CompressibleObjectTree(user, container, objectTreeDelegate, objectTreeRenderers, objectTreeOptions);\n    }\n    asTreeElement(node, viewStateContext) {\n        return {\n            incompressible: this.compressionDelegate.isIncompressible(node.element),\n            ...super.asTreeElement(node, viewStateContext)\n        };\n    }\n    render(node, viewStateContext, options) {\n        if (!this.identityProvider) {\n            return super.render(node, viewStateContext);\n        }\n        // Preserve traits across compressions. Hacky but does the trick.\n        // This is hard to fix properly since it requires rewriting the traits\n        // across trees and lists. Let's just keep it this way for now.\n        const getId = (element) => this.identityProvider.getId(element).toString();\n        const getUncompressedIds = (nodes) => {\n            const result = new Set();\n            for (const node of nodes) {\n                const compressedNode = this.tree.getCompressedTreeNode(node === this.root ? null : node);\n                if (!compressedNode.element) {\n                    continue;\n                }\n                for (const node of compressedNode.element.elements) {\n                    result.add(getId(node.element));\n                }\n            }\n            return result;\n        };\n        const oldSelection = getUncompressedIds(this.tree.getSelection());\n        const oldFocus = getUncompressedIds(this.tree.getFocus());\n        super.render(node, viewStateContext, options);\n        const selection = this.getSelection();\n        let didChangeSelection = false;\n        const focus = this.getFocus();\n        let didChangeFocus = false;\n        const visit = (node) => {\n            const compressedNode = node.element;\n            if (compressedNode) {\n                for (let i = 0; i < compressedNode.elements.length; i++) {\n                    const id = getId(compressedNode.elements[i].element);\n                    const element = compressedNode.elements[compressedNode.elements.length - 1].element;\n                    // github.com/microsoft/vscode/issues/85938\n                    if (oldSelection.has(id) && selection.indexOf(element) === -1) {\n                        selection.push(element);\n                        didChangeSelection = true;\n                    }\n                    if (oldFocus.has(id) && focus.indexOf(element) === -1) {\n                        focus.push(element);\n                        didChangeFocus = true;\n                    }\n                }\n            }\n            node.children.forEach(visit);\n        };\n        visit(this.tree.getCompressedTreeNode(node === this.root ? null : node));\n        if (didChangeSelection) {\n            this.setSelection(selection);\n        }\n        if (didChangeFocus) {\n            this.setFocus(focus);\n        }\n    }\n    // For compressed async data trees, `TreeVisibility.Recurse` doesn't currently work\n    // and we have to filter everything beforehand\n    // Related to #85193 and #85835\n    processChildren(children) {\n        if (this.filter) {\n            children = Iterable.filter(children, e => {\n                const result = this.filter.filter(e, 1 /* TreeVisibility.Visible */);\n                const visibility = getVisibility(result);\n                if (visibility === 2 /* TreeVisibility.Recurse */) {\n                    throw new Error('Recursive tree visibility not supported in async data compressed trees');\n                }\n                return visibility === 1 /* TreeVisibility.Visible */;\n            });\n        }\n        return super.processChildren(children);\n    }\n}\nfunction getVisibility(filterResult) {\n    if (typeof filterResult === 'boolean') {\n        return filterResult ? 1 /* TreeVisibility.Visible */ : 0 /* TreeVisibility.Hidden */;\n    }\n    else if (isFilterResult(filterResult)) {\n        return getVisibleState(filterResult.visibility);\n    }\n    else {\n        return getVisibleState(filterResult);\n    }\n}\n\nexport { AsyncDataTree, CompressibleAsyncDataTree };\n","import { AbstractTree } from './abstractTree.js';\nimport { ObjectTreeModel } from './objectTreeModel.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DataTree extends AbstractTree {\n    constructor(user, container, delegate, renderers, dataSource, options = {}) {\n        super(user, container, delegate, renderers, options);\n        this.user = user;\n        this.dataSource = dataSource;\n        this.identityProvider = options.identityProvider;\n    }\n    createModel(user, options) {\n        return new ObjectTreeModel(user, options);\n    }\n}\n\nexport { DataTree };\n","import { isMacintosh, isLinux, isWindows, isWeb, isIOS, isMobile } from '../../../base/common/platform.js';\nimport { localize } from '../../../nls.js';\nimport { RawContextKey } from './contextkey.js';\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 *--------------------------------------------------------------------------------------------*/\nnew RawContextKey('isMac', isMacintosh, localize(1684, \"Whether the operating system is macOS\"));\nnew RawContextKey('isLinux', isLinux, localize(1685, \"Whether the operating system is Linux\"));\nconst IsWindowsContext = new RawContextKey('isWindows', isWindows, localize(1686, \"Whether the operating system is Windows\"));\nconst IsWebContext = new RawContextKey('isWeb', isWeb, localize(1687, \"Whether the platform is a web browser\"));\nnew RawContextKey('isMacNative', isMacintosh && !isWeb, localize(1688, \"Whether the operating system is macOS on a non-browser platform\"));\nnew RawContextKey('isIOS', isIOS, localize(1689, \"Whether the operating system is iOS\"));\nnew RawContextKey('isMobile', isMobile, localize(1690, \"Whether the platform is a mobile web browser\"));\nnew RawContextKey('isDevelopment', false, true);\nnew RawContextKey('productQualityType', '', localize(1691, \"Quality type of VS Code\"));\nconst InputFocusedContextKey = 'inputFocus';\nconst InputFocusedContext = new RawContextKey(InputFocusedContextKey, false, localize(1692, \"Whether keyboard focus is inside an input box\"));\n\nexport { InputFocusedContext, InputFocusedContextKey, IsWebContext, IsWindowsContext };\n","import { isKeyboardEvent, isActiveElement } from '../../../base/browser/dom.js';\nimport { PagedList } from '../../../base/browser/ui/list/listPaging.js';\nimport { List, isSelectionSingleChangeEvent, isSelectionRangeChangeEvent, TypeNavigationMode } from '../../../base/browser/ui/list/listWidget.js';\nimport { Table } from '../../../base/browser/ui/table/tableWidget.js';\nimport { TreeFindMode, TreeFindMatchType } from '../../../base/browser/ui/tree/abstractTree.js';\nimport { AsyncDataTree, CompressibleAsyncDataTree } from '../../../base/browser/ui/tree/asyncDataTree.js';\nimport { DataTree } from '../../../base/browser/ui/tree/dataTree.js';\nimport { ObjectTree, CompressibleObjectTree } from '../../../base/browser/ui/tree/objectTree.js';\nimport { Emitter, Event } from '../../../base/common/event.js';\nimport { DisposableStore, dispose, Disposable, combinedDisposable, toDisposable } from '../../../base/common/lifecycle.js';\nimport { localize } from '../../../nls.js';\nimport { IConfigurationService } from '../../configuration/common/configuration.js';\nimport { Extensions } from '../../configuration/common/configurationRegistry.js';\nimport { RawContextKey, ContextKeyExpr, IContextKeyService } from '../../contextkey/common/contextkey.js';\nimport { InputFocusedContextKey } from '../../contextkey/common/contextkeys.js';\nimport { IContextViewService } from '../../contextview/browser/contextView.js';\nimport { createDecorator, IInstantiationService } from '../../instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../keybinding/common/keybinding.js';\nimport { Registry } from '../../registry/common/platform.js';\nimport { getListStyles, defaultListStyles, defaultFindWidgetStyles } from '../../theme/browser/defaultStyles.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst IListService = createDecorator('listService');\nclass ListService {\n    get lastFocusedList() {\n        return this._lastFocusedWidget;\n    }\n    constructor() {\n        this.disposables = new DisposableStore();\n        this.lists = [];\n        this._lastFocusedWidget = undefined;\n    }\n    setLastFocusedList(widget) {\n        if (widget === this._lastFocusedWidget) {\n            return;\n        }\n        this._lastFocusedWidget?.getHTMLElement().classList.remove('last-focused');\n        this._lastFocusedWidget = widget;\n        this._lastFocusedWidget?.getHTMLElement().classList.add('last-focused');\n    }\n    register(widget, extraContextKeys) {\n        if (this.lists.some(l => l.widget === widget)) {\n            throw new Error('Cannot register the same widget multiple times');\n        }\n        // Keep in our lists list\n        const registeredList = { widget, extraContextKeys };\n        this.lists.push(registeredList);\n        // Check for currently being focused\n        if (isActiveElement(widget.getHTMLElement())) {\n            this.setLastFocusedList(widget);\n        }\n        return combinedDisposable(widget.onDidFocus(() => this.setLastFocusedList(widget)), toDisposable(() => this.lists.splice(this.lists.indexOf(registeredList), 1)), widget.onDidDispose(() => {\n            this.lists = this.lists.filter(l => l !== registeredList);\n            if (this._lastFocusedWidget === widget) {\n                this.setLastFocusedList(undefined);\n            }\n        }));\n    }\n    dispose() {\n        this.disposables.dispose();\n    }\n}\nconst RawWorkbenchListScrollAtBoundaryContextKey = new RawContextKey('listScrollAtBoundary', 'none');\nContextKeyExpr.or(RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo('top'), RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo('both'));\nContextKeyExpr.or(RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo('bottom'), RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo('both'));\nconst RawWorkbenchListFocusContextKey = new RawContextKey('listFocus', true);\nconst WorkbenchTreeStickyScrollFocused = new RawContextKey('treestickyScrollFocused', false);\nconst WorkbenchListSupportsMultiSelectContextKey = new RawContextKey('listSupportsMultiselect', true);\nconst WorkbenchListFocusContextKey = ContextKeyExpr.and(RawWorkbenchListFocusContextKey, ContextKeyExpr.not(InputFocusedContextKey), WorkbenchTreeStickyScrollFocused.negate());\nconst WorkbenchListHasSelectionOrFocus = new RawContextKey('listHasSelectionOrFocus', false);\nconst WorkbenchListDoubleSelection = new RawContextKey('listDoubleSelection', false);\nconst WorkbenchListMultiSelection = new RawContextKey('listMultiSelection', false);\nconst WorkbenchListSelectionNavigation = new RawContextKey('listSelectionNavigation', false);\nconst WorkbenchListSupportsFind = new RawContextKey('listSupportsFind', true);\nconst WorkbenchTreeElementCanCollapse = new RawContextKey('treeElementCanCollapse', false);\nconst WorkbenchTreeElementHasParent = new RawContextKey('treeElementHasParent', false);\nconst WorkbenchTreeElementCanExpand = new RawContextKey('treeElementCanExpand', false);\nconst WorkbenchTreeElementHasChild = new RawContextKey('treeElementHasChild', false);\nconst WorkbenchTreeFindOpen = new RawContextKey('treeFindOpen', false);\nconst WorkbenchListTypeNavigationModeKey = 'listTypeNavigationMode';\n/**\n * @deprecated in favor of WorkbenchListTypeNavigationModeKey\n */\nconst WorkbenchListAutomaticKeyboardNavigationLegacyKey = 'listAutomaticKeyboardNavigation';\nfunction createScopedContextKeyService(contextKeyService, widget) {\n    const result = contextKeyService.createScoped(widget.getHTMLElement());\n    RawWorkbenchListFocusContextKey.bindTo(result);\n    return result;\n}\nfunction createScrollObserver(contextKeyService, widget) {\n    const listScrollAt = RawWorkbenchListScrollAtBoundaryContextKey.bindTo(contextKeyService);\n    const update = () => {\n        const atTop = widget.scrollTop === 0;\n        // We need a threshold `1` since scrollHeight is rounded.\n        // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#determine_if_an_element_has_been_totally_scrolled\n        const atBottom = widget.scrollHeight - widget.renderHeight - widget.scrollTop < 1;\n        if (atTop && atBottom) {\n            listScrollAt.set('both');\n        }\n        else if (atTop) {\n            listScrollAt.set('top');\n        }\n        else if (atBottom) {\n            listScrollAt.set('bottom');\n        }\n        else {\n            listScrollAt.set('none');\n        }\n    };\n    update();\n    return widget.onDidScroll(update);\n}\nconst multiSelectModifierSettingKey = 'workbench.list.multiSelectModifier';\nconst openModeSettingKey = 'workbench.list.openMode';\nconst horizontalScrollingKey = 'workbench.list.horizontalScrolling';\nconst defaultFindModeSettingKey = 'workbench.list.defaultFindMode';\nconst typeNavigationModeSettingKey = 'workbench.list.typeNavigationMode';\n/** @deprecated in favor of `workbench.list.defaultFindMode` and `workbench.list.typeNavigationMode` */\nconst keyboardNavigationSettingKey = 'workbench.list.keyboardNavigation';\nconst scrollByPageKey = 'workbench.list.scrollByPage';\nconst defaultFindMatchTypeSettingKey = 'workbench.list.defaultFindMatchType';\nconst treeIndentKey = 'workbench.tree.indent';\nconst treeRenderIndentGuidesKey = 'workbench.tree.renderIndentGuides';\nconst listSmoothScrolling = 'workbench.list.smoothScrolling';\nconst mouseWheelScrollSensitivityKey = 'workbench.list.mouseWheelScrollSensitivity';\nconst fastScrollSensitivityKey = 'workbench.list.fastScrollSensitivity';\nconst treeExpandMode = 'workbench.tree.expandMode';\nconst treeStickyScroll = 'workbench.tree.enableStickyScroll';\nconst treeStickyScrollMaxElements = 'workbench.tree.stickyScrollMaxItemCount';\nfunction useAltAsMultipleSelectionModifier(configurationService) {\n    return configurationService.getValue(multiSelectModifierSettingKey) === 'alt';\n}\nclass MultipleSelectionController extends Disposable {\n    constructor(configurationService) {\n        super();\n        this.configurationService = configurationService;\n        this.useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService);\n        this.registerListeners();\n    }\n    registerListeners() {\n        this._register(this.configurationService.onDidChangeConfiguration(e => {\n            if (e.affectsConfiguration(multiSelectModifierSettingKey)) {\n                this.useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(this.configurationService);\n            }\n        }));\n    }\n    isSelectionSingleChangeEvent(event) {\n        if (this.useAltAsMultipleSelectionModifier) {\n            return event.browserEvent.altKey;\n        }\n        return isSelectionSingleChangeEvent(event);\n    }\n    isSelectionRangeChangeEvent(event) {\n        return isSelectionRangeChangeEvent(event);\n    }\n}\nfunction toWorkbenchListOptions(accessor, options) {\n    const configurationService = accessor.get(IConfigurationService);\n    const keybindingService = accessor.get(IKeybindingService);\n    const disposables = new DisposableStore();\n    const result = {\n        ...options,\n        keyboardNavigationDelegate: { mightProducePrintableCharacter(e) { return keybindingService.mightProducePrintableCharacter(e); } },\n        smoothScrolling: Boolean(configurationService.getValue(listSmoothScrolling)),\n        mouseWheelScrollSensitivity: configurationService.getValue(mouseWheelScrollSensitivityKey),\n        fastScrollSensitivity: configurationService.getValue(fastScrollSensitivityKey),\n        multipleSelectionController: options.multipleSelectionController ?? disposables.add(new MultipleSelectionController(configurationService)),\n        keyboardNavigationEventFilter: createKeyboardNavigationEventFilter(keybindingService),\n        scrollByPage: Boolean(configurationService.getValue(scrollByPageKey))\n    };\n    return [result, disposables];\n}\nlet WorkbenchList = class WorkbenchList extends List {\n    constructor(user, container, delegate, renderers, options, contextKeyService, listService, configurationService, instantiationService) {\n        const horizontalScrolling = typeof options.horizontalScrolling !== 'undefined' ? options.horizontalScrolling : Boolean(configurationService.getValue(horizontalScrollingKey));\n        const [workbenchListOptions, workbenchListOptionsDisposable] = instantiationService.invokeFunction(toWorkbenchListOptions, options);\n        super(user, container, delegate, renderers, {\n            keyboardSupport: false,\n            ...workbenchListOptions,\n            horizontalScrolling,\n        });\n        this.disposables.add(workbenchListOptionsDisposable);\n        this.contextKeyService = createScopedContextKeyService(contextKeyService, this);\n        this.disposables.add(createScrollObserver(this.contextKeyService, this));\n        this.listSupportsMultiSelect = WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService);\n        this.listSupportsMultiSelect.set(options.multipleSelectionSupport !== false);\n        const listSelectionNavigation = WorkbenchListSelectionNavigation.bindTo(this.contextKeyService);\n        listSelectionNavigation.set(Boolean(options.selectionNavigation));\n        this.listHasSelectionOrFocus = WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService);\n        this.listDoubleSelection = WorkbenchListDoubleSelection.bindTo(this.contextKeyService);\n        this.listMultiSelection = WorkbenchListMultiSelection.bindTo(this.contextKeyService);\n        this.horizontalScrolling = options.horizontalScrolling;\n        this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService);\n        this.disposables.add(this.contextKeyService);\n        this.disposables.add(listService.register(this));\n        this.updateStyles(options.overrideStyles);\n        this.disposables.add(this.onDidChangeSelection(() => {\n            const selection = this.getSelection();\n            const focus = this.getFocus();\n            this.contextKeyService.bufferChangeEvents(() => {\n                this.listHasSelectionOrFocus.set(selection.length > 0 || focus.length > 0);\n                this.listMultiSelection.set(selection.length > 1);\n                this.listDoubleSelection.set(selection.length === 2);\n            });\n        }));\n        this.disposables.add(this.onDidChangeFocus(() => {\n            const selection = this.getSelection();\n            const focus = this.getFocus();\n            this.listHasSelectionOrFocus.set(selection.length > 0 || focus.length > 0);\n        }));\n        this.disposables.add(configurationService.onDidChangeConfiguration(e => {\n            if (e.affectsConfiguration(multiSelectModifierSettingKey)) {\n                this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService);\n            }\n            let options = {};\n            if (e.affectsConfiguration(horizontalScrollingKey) && this.horizontalScrolling === undefined) {\n                const horizontalScrolling = Boolean(configurationService.getValue(horizontalScrollingKey));\n                options = { ...options, horizontalScrolling };\n            }\n            if (e.affectsConfiguration(scrollByPageKey)) {\n                const scrollByPage = Boolean(configurationService.getValue(scrollByPageKey));\n                options = { ...options, scrollByPage };\n            }\n            if (e.affectsConfiguration(listSmoothScrolling)) {\n                const smoothScrolling = Boolean(configurationService.getValue(listSmoothScrolling));\n                options = { ...options, smoothScrolling };\n            }\n            if (e.affectsConfiguration(mouseWheelScrollSensitivityKey)) {\n                const mouseWheelScrollSensitivity = configurationService.getValue(mouseWheelScrollSensitivityKey);\n                options = { ...options, mouseWheelScrollSensitivity };\n            }\n            if (e.affectsConfiguration(fastScrollSensitivityKey)) {\n                const fastScrollSensitivity = configurationService.getValue(fastScrollSensitivityKey);\n                options = { ...options, fastScrollSensitivity };\n            }\n            if (Object.keys(options).length > 0) {\n                this.updateOptions(options);\n            }\n        }));\n        this.navigator = new ListResourceNavigator(this, { configurationService, ...options });\n        this.disposables.add(this.navigator);\n    }\n    updateOptions(options) {\n        super.updateOptions(options);\n        if (options.overrideStyles !== undefined) {\n            this.updateStyles(options.overrideStyles);\n        }\n        if (options.multipleSelectionSupport !== undefined) {\n            this.listSupportsMultiSelect.set(!!options.multipleSelectionSupport);\n        }\n    }\n    updateStyles(styles) {\n        this.style(styles ? getListStyles(styles) : defaultListStyles);\n    }\n};\nWorkbenchList = __decorate([\n    __param(5, IContextKeyService),\n    __param(6, IListService),\n    __param(7, IConfigurationService),\n    __param(8, IInstantiationService)\n], WorkbenchList);\nlet WorkbenchPagedList = class WorkbenchPagedList extends PagedList {\n    constructor(user, container, delegate, renderers, options, contextKeyService, listService, configurationService, instantiationService) {\n        const horizontalScrolling = typeof options.horizontalScrolling !== 'undefined' ? options.horizontalScrolling : Boolean(configurationService.getValue(horizontalScrollingKey));\n        const [workbenchListOptions, workbenchListOptionsDisposable] = instantiationService.invokeFunction(toWorkbenchListOptions, options);\n        super(user, container, delegate, renderers, {\n            keyboardSupport: false,\n            ...workbenchListOptions,\n            horizontalScrolling,\n        });\n        this.disposables = new DisposableStore();\n        this.disposables.add(workbenchListOptionsDisposable);\n        this.contextKeyService = createScopedContextKeyService(contextKeyService, this);\n        this.disposables.add(createScrollObserver(this.contextKeyService, this.widget));\n        this.horizontalScrolling = options.horizontalScrolling;\n        this.listSupportsMultiSelect = WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService);\n        this.listSupportsMultiSelect.set(options.multipleSelectionSupport !== false);\n        const listSelectionNavigation = WorkbenchListSelectionNavigation.bindTo(this.contextKeyService);\n        listSelectionNavigation.set(Boolean(options.selectionNavigation));\n        this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService);\n        this.disposables.add(this.contextKeyService);\n        this.disposables.add(listService.register(this));\n        this.updateStyles(options.overrideStyles);\n        this.disposables.add(configurationService.onDidChangeConfiguration(e => {\n            if (e.affectsConfiguration(multiSelectModifierSettingKey)) {\n                this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService);\n            }\n            let options = {};\n            if (e.affectsConfiguration(horizontalScrollingKey) && this.horizontalScrolling === undefined) {\n                const horizontalScrolling = Boolean(configurationService.getValue(horizontalScrollingKey));\n                options = { ...options, horizontalScrolling };\n            }\n            if (e.affectsConfiguration(scrollByPageKey)) {\n                const scrollByPage = Boolean(configurationService.getValue(scrollByPageKey));\n                options = { ...options, scrollByPage };\n            }\n            if (e.affectsConfiguration(listSmoothScrolling)) {\n                const smoothScrolling = Boolean(configurationService.getValue(listSmoothScrolling));\n                options = { ...options, smoothScrolling };\n            }\n            if (e.affectsConfiguration(mouseWheelScrollSensitivityKey)) {\n                const mouseWheelScrollSensitivity = configurationService.getValue(mouseWheelScrollSensitivityKey);\n                options = { ...options, mouseWheelScrollSensitivity };\n            }\n            if (e.affectsConfiguration(fastScrollSensitivityKey)) {\n                const fastScrollSensitivity = configurationService.getValue(fastScrollSensitivityKey);\n                options = { ...options, fastScrollSensitivity };\n            }\n            if (Object.keys(options).length > 0) {\n                this.updateOptions(options);\n            }\n        }));\n        this.navigator = new ListResourceNavigator(this, { configurationService, ...options });\n        this.disposables.add(this.navigator);\n    }\n    updateOptions(options) {\n        super.updateOptions(options);\n        if (options.overrideStyles !== undefined) {\n            this.updateStyles(options.overrideStyles);\n        }\n        if (options.multipleSelectionSupport !== undefined) {\n            this.listSupportsMultiSelect.set(!!options.multipleSelectionSupport);\n        }\n    }\n    updateStyles(styles) {\n        this.style(styles ? getListStyles(styles) : defaultListStyles);\n    }\n    dispose() {\n        this.disposables.dispose();\n        super.dispose();\n    }\n};\nWorkbenchPagedList = __decorate([\n    __param(5, IContextKeyService),\n    __param(6, IListService),\n    __param(7, IConfigurationService),\n    __param(8, IInstantiationService)\n], WorkbenchPagedList);\nlet WorkbenchTable = class WorkbenchTable extends Table {\n    constructor(user, container, delegate, columns, renderers, options, contextKeyService, listService, configurationService, instantiationService) {\n        const horizontalScrolling = typeof options.horizontalScrolling !== 'undefined' ? options.horizontalScrolling : Boolean(configurationService.getValue(horizontalScrollingKey));\n        const [workbenchListOptions, workbenchListOptionsDisposable] = instantiationService.invokeFunction(toWorkbenchListOptions, options);\n        super(user, container, delegate, columns, renderers, {\n            keyboardSupport: false,\n            ...workbenchListOptions,\n            horizontalScrolling,\n        });\n        this.disposables.add(workbenchListOptionsDisposable);\n        this.contextKeyService = createScopedContextKeyService(contextKeyService, this);\n        this.disposables.add(createScrollObserver(this.contextKeyService, this));\n        this.listSupportsMultiSelect = WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService);\n        this.listSupportsMultiSelect.set(options.multipleSelectionSupport !== false);\n        const listSelectionNavigation = WorkbenchListSelectionNavigation.bindTo(this.contextKeyService);\n        listSelectionNavigation.set(Boolean(options.selectionNavigation));\n        this.listHasSelectionOrFocus = WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService);\n        this.listDoubleSelection = WorkbenchListDoubleSelection.bindTo(this.contextKeyService);\n        this.listMultiSelection = WorkbenchListMultiSelection.bindTo(this.contextKeyService);\n        this.horizontalScrolling = options.horizontalScrolling;\n        this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService);\n        this.disposables.add(this.contextKeyService);\n        this.disposables.add(listService.register(this));\n        this.updateStyles(options.overrideStyles);\n        this.disposables.add(this.onDidChangeSelection(() => {\n            const selection = this.getSelection();\n            const focus = this.getFocus();\n            this.contextKeyService.bufferChangeEvents(() => {\n                this.listHasSelectionOrFocus.set(selection.length > 0 || focus.length > 0);\n                this.listMultiSelection.set(selection.length > 1);\n                this.listDoubleSelection.set(selection.length === 2);\n            });\n        }));\n        this.disposables.add(this.onDidChangeFocus(() => {\n            const selection = this.getSelection();\n            const focus = this.getFocus();\n            this.listHasSelectionOrFocus.set(selection.length > 0 || focus.length > 0);\n        }));\n        this.disposables.add(configurationService.onDidChangeConfiguration(e => {\n            if (e.affectsConfiguration(multiSelectModifierSettingKey)) {\n                this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService);\n            }\n            let options = {};\n            if (e.affectsConfiguration(horizontalScrollingKey) && this.horizontalScrolling === undefined) {\n                const horizontalScrolling = Boolean(configurationService.getValue(horizontalScrollingKey));\n                options = { ...options, horizontalScrolling };\n            }\n            if (e.affectsConfiguration(scrollByPageKey)) {\n                const scrollByPage = Boolean(configurationService.getValue(scrollByPageKey));\n                options = { ...options, scrollByPage };\n            }\n            if (e.affectsConfiguration(listSmoothScrolling)) {\n                const smoothScrolling = Boolean(configurationService.getValue(listSmoothScrolling));\n                options = { ...options, smoothScrolling };\n            }\n            if (e.affectsConfiguration(mouseWheelScrollSensitivityKey)) {\n                const mouseWheelScrollSensitivity = configurationService.getValue(mouseWheelScrollSensitivityKey);\n                options = { ...options, mouseWheelScrollSensitivity };\n            }\n            if (e.affectsConfiguration(fastScrollSensitivityKey)) {\n                const fastScrollSensitivity = configurationService.getValue(fastScrollSensitivityKey);\n                options = { ...options, fastScrollSensitivity };\n            }\n            if (Object.keys(options).length > 0) {\n                this.updateOptions(options);\n            }\n        }));\n        this.navigator = new TableResourceNavigator(this, { configurationService, ...options });\n        this.disposables.add(this.navigator);\n    }\n    updateOptions(options) {\n        super.updateOptions(options);\n        if (options.overrideStyles !== undefined) {\n            this.updateStyles(options.overrideStyles);\n        }\n        if (options.multipleSelectionSupport !== undefined) {\n            this.listSupportsMultiSelect.set(!!options.multipleSelectionSupport);\n        }\n    }\n    updateStyles(styles) {\n        this.style(styles ? getListStyles(styles) : defaultListStyles);\n    }\n    dispose() {\n        this.disposables.dispose();\n        super.dispose();\n    }\n};\nWorkbenchTable = __decorate([\n    __param(6, IContextKeyService),\n    __param(7, IListService),\n    __param(8, IConfigurationService),\n    __param(9, IInstantiationService)\n], WorkbenchTable);\nclass ResourceNavigator extends Disposable {\n    constructor(widget, options) {\n        super();\n        this.widget = widget;\n        this._onDidOpen = this._register(new Emitter());\n        this.onDidOpen = this._onDidOpen.event;\n        this._register(Event.filter(this.widget.onDidChangeSelection, e => isKeyboardEvent(e.browserEvent))(e => this.onSelectionFromKeyboard(e)));\n        this._register(this.widget.onPointer((e) => this.onPointer(e.element, e.browserEvent)));\n        this._register(this.widget.onMouseDblClick((e) => this.onMouseDblClick(e.element, e.browserEvent)));\n        if (typeof options?.openOnSingleClick !== 'boolean' && options?.configurationService) {\n            this.openOnSingleClick = options?.configurationService.getValue(openModeSettingKey) !== 'doubleClick';\n            this._register(options?.configurationService.onDidChangeConfiguration(e => {\n                if (e.affectsConfiguration(openModeSettingKey)) {\n                    this.openOnSingleClick = options?.configurationService.getValue(openModeSettingKey) !== 'doubleClick';\n                }\n            }));\n        }\n        else {\n            this.openOnSingleClick = options?.openOnSingleClick ?? true;\n        }\n    }\n    onSelectionFromKeyboard(event) {\n        if (event.elements.length !== 1) {\n            return;\n        }\n        const selectionKeyboardEvent = event.browserEvent;\n        const preserveFocus = typeof selectionKeyboardEvent.preserveFocus === 'boolean' ? selectionKeyboardEvent.preserveFocus : true;\n        const pinned = typeof selectionKeyboardEvent.pinned === 'boolean' ? selectionKeyboardEvent.pinned : !preserveFocus;\n        const sideBySide = false;\n        this._open(this.getSelectedElement(), preserveFocus, pinned, sideBySide, event.browserEvent);\n    }\n    onPointer(element, browserEvent) {\n        if (!this.openOnSingleClick) {\n            return;\n        }\n        const isDoubleClick = browserEvent.detail === 2;\n        if (isDoubleClick) {\n            return;\n        }\n        const isMiddleClick = browserEvent.button === 1;\n        const preserveFocus = true;\n        const pinned = isMiddleClick;\n        const sideBySide = browserEvent.ctrlKey || browserEvent.metaKey || browserEvent.altKey;\n        this._open(element, preserveFocus, pinned, sideBySide, browserEvent);\n    }\n    onMouseDblClick(element, browserEvent) {\n        if (!browserEvent) {\n            return;\n        }\n        // copied from AbstractTree\n        const target = browserEvent.target;\n        const onTwistie = target.classList.contains('monaco-tl-twistie')\n            || (target.classList.contains('monaco-icon-label') && target.classList.contains('folder-icon') && browserEvent.offsetX < 16);\n        if (onTwistie) {\n            return;\n        }\n        const preserveFocus = false;\n        const pinned = true;\n        const sideBySide = (browserEvent.ctrlKey || browserEvent.metaKey || browserEvent.altKey);\n        this._open(element, preserveFocus, pinned, sideBySide, browserEvent);\n    }\n    _open(element, preserveFocus, pinned, sideBySide, browserEvent) {\n        if (!element) {\n            return;\n        }\n        this._onDidOpen.fire({\n            editorOptions: {\n                preserveFocus,\n                pinned,\n                revealIfVisible: true\n            },\n            sideBySide,\n            element,\n            browserEvent\n        });\n    }\n}\nclass ListResourceNavigator extends ResourceNavigator {\n    constructor(widget, options) {\n        super(widget, options);\n        this.widget = widget;\n    }\n    getSelectedElement() {\n        return this.widget.getSelectedElements()[0];\n    }\n}\nclass TableResourceNavigator extends ResourceNavigator {\n    constructor(widget, options) {\n        super(widget, options);\n    }\n    getSelectedElement() {\n        return this.widget.getSelectedElements()[0];\n    }\n}\nclass TreeResourceNavigator extends ResourceNavigator {\n    constructor(widget, options) {\n        super(widget, options);\n    }\n    getSelectedElement() {\n        return this.widget.getSelection()[0] ?? undefined;\n    }\n}\nfunction createKeyboardNavigationEventFilter(keybindingService) {\n    let inMultiChord = false;\n    return event => {\n        if (event.toKeyCodeChord().isModifierKey()) {\n            return false;\n        }\n        if (inMultiChord) {\n            inMultiChord = false;\n            return false;\n        }\n        const result = keybindingService.softDispatch(event, event.target);\n        if (result.kind === 1 /* ResultKind.MoreChordsNeeded */) {\n            inMultiChord = true;\n            return false;\n        }\n        inMultiChord = false;\n        return result.kind === 0 /* ResultKind.NoMatchingKb */;\n    };\n}\nlet WorkbenchObjectTree = class WorkbenchObjectTree extends ObjectTree {\n    get onDidOpen() { return this.internals.onDidOpen; }\n    constructor(user, container, delegate, renderers, options, instantiationService, contextKeyService, listService, configurationService) {\n        // eslint-disable-next-line local/code-no-any-casts\n        const { options: treeOptions, getTypeNavigationMode, disposable } = instantiationService.invokeFunction(workbenchTreeDataPreamble, options);\n        super(user, container, delegate, renderers, treeOptions);\n        this.disposables.add(disposable);\n        this.internals = new WorkbenchTreeInternals(this, options, getTypeNavigationMode, options.overrideStyles, contextKeyService, listService, configurationService);\n        this.disposables.add(this.internals);\n    }\n    updateOptions(options) {\n        super.updateOptions(options);\n        this.internals.updateOptions(options);\n    }\n};\nWorkbenchObjectTree = __decorate([\n    __param(5, IInstantiationService),\n    __param(6, IContextKeyService),\n    __param(7, IListService),\n    __param(8, IConfigurationService)\n], WorkbenchObjectTree);\nlet WorkbenchCompressibleObjectTree = class WorkbenchCompressibleObjectTree extends CompressibleObjectTree {\n    constructor(user, container, delegate, renderers, options, instantiationService, contextKeyService, listService, configurationService) {\n        // eslint-disable-next-line local/code-no-any-casts\n        const { options: treeOptions, getTypeNavigationMode, disposable } = instantiationService.invokeFunction(workbenchTreeDataPreamble, options);\n        super(user, container, delegate, renderers, treeOptions);\n        this.disposables.add(disposable);\n        this.internals = new WorkbenchTreeInternals(this, options, getTypeNavigationMode, options.overrideStyles, contextKeyService, listService, configurationService);\n        this.disposables.add(this.internals);\n    }\n    updateOptions(options = {}) {\n        super.updateOptions(options);\n        if (options.overrideStyles) {\n            this.internals.updateStyleOverrides(options.overrideStyles);\n        }\n        this.internals.updateOptions(options);\n    }\n};\nWorkbenchCompressibleObjectTree = __decorate([\n    __param(5, IInstantiationService),\n    __param(6, IContextKeyService),\n    __param(7, IListService),\n    __param(8, IConfigurationService)\n], WorkbenchCompressibleObjectTree);\nlet WorkbenchDataTree = class WorkbenchDataTree extends DataTree {\n    constructor(user, container, delegate, renderers, dataSource, options, instantiationService, contextKeyService, listService, configurationService) {\n        // eslint-disable-next-line local/code-no-any-casts\n        const { options: treeOptions, getTypeNavigationMode, disposable } = instantiationService.invokeFunction(workbenchTreeDataPreamble, options);\n        super(user, container, delegate, renderers, dataSource, treeOptions);\n        this.disposables.add(disposable);\n        this.internals = new WorkbenchTreeInternals(this, options, getTypeNavigationMode, options.overrideStyles, contextKeyService, listService, configurationService);\n        this.disposables.add(this.internals);\n    }\n    updateOptions(options = {}) {\n        super.updateOptions(options);\n        if (options.overrideStyles !== undefined) {\n            this.internals.updateStyleOverrides(options.overrideStyles);\n        }\n        this.internals.updateOptions(options);\n    }\n};\nWorkbenchDataTree = __decorate([\n    __param(6, IInstantiationService),\n    __param(7, IContextKeyService),\n    __param(8, IListService),\n    __param(9, IConfigurationService)\n], WorkbenchDataTree);\nlet WorkbenchAsyncDataTree = class WorkbenchAsyncDataTree extends AsyncDataTree {\n    get onDidOpen() { return this.internals.onDidOpen; }\n    constructor(user, container, delegate, renderers, dataSource, options, instantiationService, contextKeyService, listService, configurationService) {\n        // eslint-disable-next-line local/code-no-any-casts\n        const { options: treeOptions, getTypeNavigationMode, disposable } = instantiationService.invokeFunction(workbenchTreeDataPreamble, options);\n        super(user, container, delegate, renderers, dataSource, treeOptions);\n        this.disposables.add(disposable);\n        this.internals = new WorkbenchTreeInternals(this, options, getTypeNavigationMode, options.overrideStyles, contextKeyService, listService, configurationService);\n        this.disposables.add(this.internals);\n    }\n    updateOptions(options = {}) {\n        super.updateOptions(options);\n        if (options.overrideStyles) {\n            this.internals.updateStyleOverrides(options.overrideStyles);\n        }\n        this.internals.updateOptions(options);\n    }\n};\nWorkbenchAsyncDataTree = __decorate([\n    __param(6, IInstantiationService),\n    __param(7, IContextKeyService),\n    __param(8, IListService),\n    __param(9, IConfigurationService)\n], WorkbenchAsyncDataTree);\nlet WorkbenchCompressibleAsyncDataTree = class WorkbenchCompressibleAsyncDataTree extends CompressibleAsyncDataTree {\n    constructor(user, container, virtualDelegate, compressionDelegate, renderers, dataSource, options, instantiationService, contextKeyService, listService, configurationService) {\n        // eslint-disable-next-line local/code-no-any-casts\n        const { options: treeOptions, getTypeNavigationMode, disposable } = instantiationService.invokeFunction(workbenchTreeDataPreamble, options);\n        super(user, container, virtualDelegate, compressionDelegate, renderers, dataSource, treeOptions);\n        this.disposables.add(disposable);\n        this.internals = new WorkbenchTreeInternals(this, options, getTypeNavigationMode, options.overrideStyles, contextKeyService, listService, configurationService);\n        this.disposables.add(this.internals);\n    }\n    updateOptions(options) {\n        super.updateOptions(options);\n        this.internals.updateOptions(options);\n    }\n};\nWorkbenchCompressibleAsyncDataTree = __decorate([\n    __param(7, IInstantiationService),\n    __param(8, IContextKeyService),\n    __param(9, IListService),\n    __param(10, IConfigurationService)\n], WorkbenchCompressibleAsyncDataTree);\nfunction getDefaultTreeFindMode(configurationService) {\n    const value = configurationService.getValue(defaultFindModeSettingKey);\n    if (value === 'highlight') {\n        return TreeFindMode.Highlight;\n    }\n    else if (value === 'filter') {\n        return TreeFindMode.Filter;\n    }\n    const deprecatedValue = configurationService.getValue(keyboardNavigationSettingKey);\n    if (deprecatedValue === 'simple' || deprecatedValue === 'highlight') {\n        return TreeFindMode.Highlight;\n    }\n    else if (deprecatedValue === 'filter') {\n        return TreeFindMode.Filter;\n    }\n    return undefined;\n}\nfunction getDefaultTreeFindMatchType(configurationService) {\n    const value = configurationService.getValue(defaultFindMatchTypeSettingKey);\n    if (value === 'fuzzy') {\n        return TreeFindMatchType.Fuzzy;\n    }\n    else if (value === 'contiguous') {\n        return TreeFindMatchType.Contiguous;\n    }\n    return undefined;\n}\nfunction workbenchTreeDataPreamble(accessor, options) {\n    const configurationService = accessor.get(IConfigurationService);\n    const contextViewService = accessor.get(IContextViewService);\n    const contextKeyService = accessor.get(IContextKeyService);\n    const instantiationService = accessor.get(IInstantiationService);\n    const getTypeNavigationMode = () => {\n        // give priority to the context key value to specify a value\n        const modeString = contextKeyService.getContextKeyValue(WorkbenchListTypeNavigationModeKey);\n        if (modeString === 'automatic') {\n            return TypeNavigationMode.Automatic;\n        }\n        else if (modeString === 'trigger') {\n            return TypeNavigationMode.Trigger;\n        }\n        // also check the deprecated context key to set the mode to 'trigger'\n        const modeBoolean = contextKeyService.getContextKeyValue(WorkbenchListAutomaticKeyboardNavigationLegacyKey);\n        if (modeBoolean === false) {\n            return TypeNavigationMode.Trigger;\n        }\n        // finally, check the setting\n        const configString = configurationService.getValue(typeNavigationModeSettingKey);\n        if (configString === 'automatic') {\n            return TypeNavigationMode.Automatic;\n        }\n        else if (configString === 'trigger') {\n            return TypeNavigationMode.Trigger;\n        }\n        return undefined;\n    };\n    const horizontalScrolling = options.horizontalScrolling !== undefined ? options.horizontalScrolling : Boolean(configurationService.getValue(horizontalScrollingKey));\n    const [workbenchListOptions, disposable] = instantiationService.invokeFunction(toWorkbenchListOptions, options);\n    const paddingBottom = options.paddingBottom;\n    const renderIndentGuides = options.renderIndentGuides !== undefined ? options.renderIndentGuides : configurationService.getValue(treeRenderIndentGuidesKey);\n    return {\n        getTypeNavigationMode,\n        disposable,\n        // eslint-disable-next-line local/code-no-dangerous-type-assertions\n        options: {\n            // ...options, // TODO@Joao why is this not splatted here?\n            keyboardSupport: false,\n            ...workbenchListOptions,\n            indent: typeof configurationService.getValue(treeIndentKey) === 'number' ? configurationService.getValue(treeIndentKey) : undefined,\n            renderIndentGuides,\n            smoothScrolling: Boolean(configurationService.getValue(listSmoothScrolling)),\n            defaultFindMode: options.defaultFindMode ?? getDefaultTreeFindMode(configurationService),\n            defaultFindMatchType: options.defaultFindMatchType ?? getDefaultTreeFindMatchType(configurationService),\n            horizontalScrolling,\n            scrollByPage: Boolean(configurationService.getValue(scrollByPageKey)),\n            paddingBottom: paddingBottom,\n            hideTwistiesOfChildlessElements: options.hideTwistiesOfChildlessElements,\n            expandOnlyOnTwistieClick: options.expandOnlyOnTwistieClick ?? (configurationService.getValue(treeExpandMode) === 'doubleClick'),\n            contextViewProvider: contextViewService,\n            findWidgetStyles: defaultFindWidgetStyles,\n            enableStickyScroll: Boolean(configurationService.getValue(treeStickyScroll)),\n            stickyScrollMaxItemCount: Number(configurationService.getValue(treeStickyScrollMaxElements)),\n        }\n    };\n}\nlet WorkbenchTreeInternals = class WorkbenchTreeInternals {\n    get onDidOpen() { return this.navigator.onDidOpen; }\n    constructor(tree, options, getTypeNavigationMode, overrideStyles, contextKeyService, listService, configurationService) {\n        this.tree = tree;\n        this.disposables = [];\n        this.contextKeyService = createScopedContextKeyService(contextKeyService, tree);\n        this.disposables.push(createScrollObserver(this.contextKeyService, tree));\n        this.listSupportsMultiSelect = WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService);\n        this.listSupportsMultiSelect.set(options.multipleSelectionSupport !== false);\n        const listSelectionNavigation = WorkbenchListSelectionNavigation.bindTo(this.contextKeyService);\n        listSelectionNavigation.set(Boolean(options.selectionNavigation));\n        this.listSupportFindWidget = WorkbenchListSupportsFind.bindTo(this.contextKeyService);\n        this.listSupportFindWidget.set(options.findWidgetEnabled ?? true);\n        this.hasSelectionOrFocus = WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService);\n        this.hasDoubleSelection = WorkbenchListDoubleSelection.bindTo(this.contextKeyService);\n        this.hasMultiSelection = WorkbenchListMultiSelection.bindTo(this.contextKeyService);\n        this.treeElementCanCollapse = WorkbenchTreeElementCanCollapse.bindTo(this.contextKeyService);\n        this.treeElementHasParent = WorkbenchTreeElementHasParent.bindTo(this.contextKeyService);\n        this.treeElementCanExpand = WorkbenchTreeElementCanExpand.bindTo(this.contextKeyService);\n        this.treeElementHasChild = WorkbenchTreeElementHasChild.bindTo(this.contextKeyService);\n        this.treeFindOpen = WorkbenchTreeFindOpen.bindTo(this.contextKeyService);\n        this.treeStickyScrollFocused = WorkbenchTreeStickyScrollFocused.bindTo(this.contextKeyService);\n        this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService);\n        this.updateStyleOverrides(overrideStyles);\n        const updateCollapseContextKeys = () => {\n            const focus = tree.getFocus()[0];\n            if (!focus) {\n                return;\n            }\n            const node = tree.getNode(focus);\n            this.treeElementCanCollapse.set(node.collapsible && !node.collapsed);\n            this.treeElementHasParent.set(!!tree.getParentElement(focus));\n            this.treeElementCanExpand.set(node.collapsible && node.collapsed);\n            this.treeElementHasChild.set(!!tree.getFirstElementChild(focus));\n        };\n        const interestingContextKeys = new Set();\n        interestingContextKeys.add(WorkbenchListTypeNavigationModeKey);\n        interestingContextKeys.add(WorkbenchListAutomaticKeyboardNavigationLegacyKey);\n        this.disposables.push(this.contextKeyService, listService.register(tree), tree.onDidChangeSelection(() => {\n            const selection = tree.getSelection();\n            const focus = tree.getFocus();\n            this.contextKeyService.bufferChangeEvents(() => {\n                this.hasSelectionOrFocus.set(selection.length > 0 || focus.length > 0);\n                this.hasMultiSelection.set(selection.length > 1);\n                this.hasDoubleSelection.set(selection.length === 2);\n            });\n        }), tree.onDidChangeFocus(() => {\n            const selection = tree.getSelection();\n            const focus = tree.getFocus();\n            this.hasSelectionOrFocus.set(selection.length > 0 || focus.length > 0);\n            updateCollapseContextKeys();\n        }), tree.onDidChangeCollapseState(updateCollapseContextKeys), tree.onDidChangeModel(updateCollapseContextKeys), tree.onDidChangeFindOpenState(enabled => this.treeFindOpen.set(enabled)), tree.onDidChangeStickyScrollFocused(focused => this.treeStickyScrollFocused.set(focused)), configurationService.onDidChangeConfiguration(e => {\n            let newOptions = {};\n            if (e.affectsConfiguration(multiSelectModifierSettingKey)) {\n                this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService);\n            }\n            if (e.affectsConfiguration(treeIndentKey)) {\n                const indent = configurationService.getValue(treeIndentKey);\n                newOptions = { ...newOptions, indent };\n            }\n            if (e.affectsConfiguration(treeRenderIndentGuidesKey) && options.renderIndentGuides === undefined) {\n                const renderIndentGuides = configurationService.getValue(treeRenderIndentGuidesKey);\n                newOptions = { ...newOptions, renderIndentGuides };\n            }\n            if (e.affectsConfiguration(listSmoothScrolling)) {\n                const smoothScrolling = Boolean(configurationService.getValue(listSmoothScrolling));\n                newOptions = { ...newOptions, smoothScrolling };\n            }\n            if (e.affectsConfiguration(defaultFindModeSettingKey) || e.affectsConfiguration(keyboardNavigationSettingKey)) {\n                const defaultFindMode = getDefaultTreeFindMode(configurationService);\n                newOptions = { ...newOptions, defaultFindMode };\n            }\n            if (e.affectsConfiguration(typeNavigationModeSettingKey) || e.affectsConfiguration(keyboardNavigationSettingKey)) {\n                const typeNavigationMode = getTypeNavigationMode();\n                newOptions = { ...newOptions, typeNavigationMode };\n            }\n            if (e.affectsConfiguration(defaultFindMatchTypeSettingKey)) {\n                const defaultFindMatchType = getDefaultTreeFindMatchType(configurationService);\n                newOptions = { ...newOptions, defaultFindMatchType };\n            }\n            if (e.affectsConfiguration(horizontalScrollingKey) && options.horizontalScrolling === undefined) {\n                const horizontalScrolling = Boolean(configurationService.getValue(horizontalScrollingKey));\n                newOptions = { ...newOptions, horizontalScrolling };\n            }\n            if (e.affectsConfiguration(scrollByPageKey)) {\n                const scrollByPage = Boolean(configurationService.getValue(scrollByPageKey));\n                newOptions = { ...newOptions, scrollByPage };\n            }\n            if (e.affectsConfiguration(treeExpandMode) && options.expandOnlyOnTwistieClick === undefined) {\n                newOptions = { ...newOptions, expandOnlyOnTwistieClick: configurationService.getValue(treeExpandMode) === 'doubleClick' };\n            }\n            if (e.affectsConfiguration(treeStickyScroll)) {\n                const enableStickyScroll = configurationService.getValue(treeStickyScroll);\n                newOptions = { ...newOptions, enableStickyScroll };\n            }\n            if (e.affectsConfiguration(treeStickyScrollMaxElements)) {\n                const stickyScrollMaxItemCount = Math.max(1, configurationService.getValue(treeStickyScrollMaxElements));\n                newOptions = { ...newOptions, stickyScrollMaxItemCount };\n            }\n            if (e.affectsConfiguration(mouseWheelScrollSensitivityKey)) {\n                const mouseWheelScrollSensitivity = configurationService.getValue(mouseWheelScrollSensitivityKey);\n                newOptions = { ...newOptions, mouseWheelScrollSensitivity };\n            }\n            if (e.affectsConfiguration(fastScrollSensitivityKey)) {\n                const fastScrollSensitivity = configurationService.getValue(fastScrollSensitivityKey);\n                newOptions = { ...newOptions, fastScrollSensitivity };\n            }\n            if (Object.keys(newOptions).length > 0) {\n                tree.updateOptions(newOptions);\n            }\n        }), this.contextKeyService.onDidChangeContext(e => {\n            if (e.affectsSome(interestingContextKeys)) {\n                tree.updateOptions({ typeNavigationMode: getTypeNavigationMode() });\n            }\n        }));\n        this.navigator = new TreeResourceNavigator(tree, { configurationService, ...options });\n        this.disposables.push(this.navigator);\n    }\n    updateOptions(options) {\n        if (options.multipleSelectionSupport !== undefined) {\n            this.listSupportsMultiSelect.set(!!options.multipleSelectionSupport);\n        }\n    }\n    updateStyleOverrides(overrideStyles) {\n        this.tree.style(overrideStyles ? getListStyles(overrideStyles) : defaultListStyles);\n    }\n    dispose() {\n        this.disposables = dispose(this.disposables);\n    }\n};\nWorkbenchTreeInternals = __decorate([\n    __param(4, IContextKeyService),\n    __param(5, IListService),\n    __param(6, IConfigurationService)\n], WorkbenchTreeInternals);\nconst configurationRegistry = Registry.as(Extensions.Configuration);\nconfigurationRegistry.registerConfiguration({\n    id: 'workbench',\n    order: 7,\n    title: localize(1705, \"Workbench\"),\n    type: 'object',\n    properties: {\n        [multiSelectModifierSettingKey]: {\n            type: 'string',\n            enum: ['ctrlCmd', 'alt'],\n            markdownEnumDescriptions: [\n                localize(1706, \"Maps to `Control` on Windows and Linux and to `Command` on macOS.\"),\n                localize(1707, \"Maps to `Alt` on Windows and Linux and to `Option` on macOS.\")\n            ],\n            default: 'ctrlCmd',\n            description: localize(1708, \"The modifier to be used to add an item in trees and lists to a multi-selection with the mouse (for example in the explorer, open editors and scm view). The 'Open to Side' mouse gestures - if supported - will adapt such that they do not conflict with the multiselect modifier.\")\n\n\n\n\n\n\n        },\n        [openModeSettingKey]: {\n            type: 'string',\n            enum: ['singleClick', 'doubleClick'],\n            default: 'singleClick',\n            description: localize(1709, \"Controls how to open items in trees and lists using the mouse (if supported). Note that some trees and lists might choose to ignore this setting if it is not applicable.\")\n\n\n\n        },\n        [horizontalScrollingKey]: {\n            type: 'boolean',\n            default: false,\n            description: localize(1710, \"Controls whether lists and trees support horizontal scrolling in the workbench. Warning: turning on this setting has a performance implication.\")\n        },\n        [scrollByPageKey]: {\n            type: 'boolean',\n            default: false,\n            description: localize(1711, \"Controls whether clicks in the scrollbar scroll page by page.\")\n        },\n        [treeIndentKey]: {\n            type: 'number',\n            default: 8,\n            minimum: 4,\n            maximum: 40,\n            description: localize(1712, \"Controls tree indentation in pixels.\")\n        },\n        [treeRenderIndentGuidesKey]: {\n            type: 'string',\n            enum: ['none', 'onHover', 'always'],\n            default: 'onHover',\n            description: localize(1713, \"Controls whether the tree should render indent guides.\")\n        },\n        [listSmoothScrolling]: {\n            type: 'boolean',\n            default: false,\n            description: localize(1714, \"Controls whether lists and trees have smooth scrolling.\"),\n        },\n        [mouseWheelScrollSensitivityKey]: {\n            type: 'number',\n            default: 1,\n            markdownDescription: localize(1715, \"A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.\")\n        },\n        [fastScrollSensitivityKey]: {\n            type: 'number',\n            default: 5,\n            markdownDescription: localize(1716, \"Scrolling speed multiplier when pressing `Alt`.\")\n        },\n        [defaultFindModeSettingKey]: {\n            type: 'string',\n            enum: ['highlight', 'filter'],\n            enumDescriptions: [\n                localize(1717, \"Highlight elements when searching. Further up and down navigation will traverse only the highlighted elements.\"),\n                localize(1718, \"Filter elements when searching.\")\n            ],\n            default: 'highlight',\n            description: localize(1719, \"Controls the default find mode for lists and trees in the workbench.\")\n        },\n        [keyboardNavigationSettingKey]: {\n            type: 'string',\n            enum: ['simple', 'highlight', 'filter'],\n            enumDescriptions: [\n                localize(1720, \"Simple keyboard navigation focuses elements which match the keyboard input. Matching is done only on prefixes.\"),\n                localize(1721, \"Highlight keyboard navigation highlights elements which match the keyboard input. Further up and down navigation will traverse only the highlighted elements.\"),\n                localize(1722, \"Filter keyboard navigation will filter out and hide all the elements which do not match the keyboard input.\")\n            ],\n            default: 'highlight',\n            description: localize(1723, \"Controls the keyboard navigation style for lists and trees in the workbench. Can be simple, highlight and filter.\"),\n            deprecated: true,\n            deprecationMessage: localize(1724, \"Please use 'workbench.list.defaultFindMode' and\t'workbench.list.typeNavigationMode' instead.\")\n        },\n        [defaultFindMatchTypeSettingKey]: {\n            type: 'string',\n            enum: ['fuzzy', 'contiguous'],\n            enumDescriptions: [\n                localize(1725, \"Use fuzzy matching when searching.\"),\n                localize(1726, \"Use contiguous matching when searching.\")\n            ],\n            default: 'fuzzy',\n            description: localize(1727, \"Controls the type of matching used when searching lists and trees in the workbench.\")\n        },\n        [treeExpandMode]: {\n            type: 'string',\n            enum: ['singleClick', 'doubleClick'],\n            default: 'singleClick',\n            description: localize(1728, \"Controls how tree folders are expanded when clicking the folder names. Note that some trees and lists might choose to ignore this setting if it is not applicable.\"),\n        },\n        [treeStickyScroll]: {\n            type: 'boolean',\n            default: true,\n            description: localize(1729, \"Controls whether sticky scrolling is enabled in trees.\"),\n        },\n        [treeStickyScrollMaxElements]: {\n            type: 'number',\n            minimum: 1,\n            default: 7,\n            markdownDescription: localize(1730, \"Controls the number of sticky elements displayed in the tree when {0} is enabled.\", '`#workbench.tree.enableStickyScroll#`'),\n        },\n        [typeNavigationModeSettingKey]: {\n            type: 'string',\n            enum: ['automatic', 'trigger'],\n            default: 'automatic',\n            markdownDescription: localize(1731, \"Controls how type navigation works in lists and trees in the workbench. When set to `trigger`, type navigation begins once the `list.triggerTypeNavigation` command is run.\"),\n        }\n    }\n});\n\nexport { IListService, ListService, RawWorkbenchListFocusContextKey, RawWorkbenchListScrollAtBoundaryContextKey, WorkbenchAsyncDataTree, WorkbenchCompressibleAsyncDataTree, WorkbenchCompressibleObjectTree, WorkbenchDataTree, WorkbenchList, WorkbenchListDoubleSelection, WorkbenchListFocusContextKey, WorkbenchListHasSelectionOrFocus, WorkbenchListMultiSelection, WorkbenchListSelectionNavigation, WorkbenchListSupportsFind, WorkbenchListSupportsMultiSelectContextKey, WorkbenchObjectTree, WorkbenchPagedList, WorkbenchTable, WorkbenchTreeElementCanCollapse, WorkbenchTreeElementCanExpand, WorkbenchTreeElementHasChild, WorkbenchTreeElementHasParent, WorkbenchTreeFindOpen, WorkbenchTreeStickyScrollFocused };\n","import { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { defaultGenerator } from '../../../../base/common/idGenerator.js';\nimport { dispose } from '../../../../base/common/lifecycle.js';\nimport { ResourceMap } from '../../../../base/common/map.js';\nimport { extUri, basename } from '../../../../base/common/resources.js';\nimport { commonPrefixLength } from '../../../../base/common/strings.js';\nimport { Range } from '../../../common/core/range.js';\nimport { localize } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nclass OneReference {\n    constructor(isProviderFirst, parent, link, _rangeCallback) {\n        this.isProviderFirst = isProviderFirst;\n        this.parent = parent;\n        this.link = link;\n        this._rangeCallback = _rangeCallback;\n        this.id = defaultGenerator.nextId();\n    }\n    get uri() {\n        return this.link.uri;\n    }\n    get range() {\n        return this._range ?? this.link.targetSelectionRange ?? this.link.range;\n    }\n    set range(value) {\n        this._range = value;\n        this._rangeCallback(this);\n    }\n    get ariaMessage() {\n        const preview = this.parent.getPreview(this)?.preview(this.range);\n        if (!preview) {\n            return localize(1087, \"in {0} on line {1} at column {2}\", basename(this.uri), this.range.startLineNumber, this.range.startColumn);\n        }\n        else {\n            return localize(1088, \"{0} in {1} on line {2} at column {3}\", preview.value, basename(this.uri), this.range.startLineNumber, this.range.startColumn);\n        }\n    }\n}\nclass FilePreview {\n    constructor(_modelReference) {\n        this._modelReference = _modelReference;\n    }\n    dispose() {\n        this._modelReference.dispose();\n    }\n    preview(range, n = 8) {\n        const model = this._modelReference.object.textEditorModel;\n        if (!model) {\n            return undefined;\n        }\n        const { startLineNumber, startColumn, endLineNumber, endColumn } = range;\n        const word = model.getWordUntilPosition({ lineNumber: startLineNumber, column: startColumn - n });\n        const beforeRange = new Range(startLineNumber, word.startColumn, startLineNumber, startColumn);\n        const afterRange = new Range(endLineNumber, endColumn, endLineNumber, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */);\n        const before = model.getValueInRange(beforeRange).replace(/^\\s+/, '');\n        const inside = model.getValueInRange(range);\n        const after = model.getValueInRange(afterRange).replace(/\\s+$/, '');\n        return {\n            value: before + inside + after,\n            highlight: { start: before.length, end: before.length + inside.length }\n        };\n    }\n}\nclass FileReferences {\n    constructor(parent, uri) {\n        this.parent = parent;\n        this.uri = uri;\n        this.children = [];\n        this._previews = new ResourceMap();\n    }\n    dispose() {\n        dispose(this._previews.values());\n        this._previews.clear();\n    }\n    getPreview(child) {\n        return this._previews.get(child.uri);\n    }\n    get ariaMessage() {\n        const len = this.children.length;\n        if (len === 1) {\n            return localize(1089, \"1 symbol in {0}, full path {1}\", basename(this.uri), this.uri.fsPath);\n        }\n        else {\n            return localize(1090, \"{0} symbols in {1}, full path {2}\", len, basename(this.uri), this.uri.fsPath);\n        }\n    }\n    async resolve(textModelResolverService) {\n        if (this._previews.size !== 0) {\n            return this;\n        }\n        for (const child of this.children) {\n            if (this._previews.has(child.uri)) {\n                continue;\n            }\n            try {\n                const ref = await textModelResolverService.createModelReference(child.uri);\n                this._previews.set(child.uri, new FilePreview(ref));\n            }\n            catch (err) {\n                onUnexpectedError(err);\n            }\n        }\n        return this;\n    }\n}\nclass ReferencesModel {\n    constructor(links, title) {\n        this.groups = [];\n        this.references = [];\n        this._onDidChangeReferenceRange = new Emitter();\n        this.onDidChangeReferenceRange = this._onDidChangeReferenceRange.event;\n        this._links = links;\n        this._title = title;\n        // grouping and sorting\n        const [providersFirst] = links;\n        links.sort(ReferencesModel._compareReferences);\n        let current;\n        for (const link of links) {\n            if (!current || !extUri.isEqual(current.uri, link.uri, true)) {\n                // new group\n                current = new FileReferences(this, link.uri);\n                this.groups.push(current);\n            }\n            // append, check for equality first!\n            if (current.children.length === 0 || ReferencesModel._compareReferences(link, current.children[current.children.length - 1]) !== 0) {\n                const oneRef = new OneReference(providersFirst === link, current, link, ref => this._onDidChangeReferenceRange.fire(ref));\n                this.references.push(oneRef);\n                current.children.push(oneRef);\n            }\n        }\n    }\n    dispose() {\n        dispose(this.groups);\n        this._onDidChangeReferenceRange.dispose();\n        this.groups.length = 0;\n    }\n    clone() {\n        return new ReferencesModel(this._links, this._title);\n    }\n    get title() {\n        return this._title;\n    }\n    get isEmpty() {\n        return this.groups.length === 0;\n    }\n    get ariaMessage() {\n        if (this.isEmpty) {\n            return localize(1091, \"No results found\");\n        }\n        else if (this.references.length === 1) {\n            return localize(1092, \"Found 1 symbol in {0}\", this.references[0].uri.fsPath);\n        }\n        else if (this.groups.length === 1) {\n            return localize(1093, \"Found {0} symbols in {1}\", this.references.length, this.groups[0].uri.fsPath);\n        }\n        else {\n            return localize(1094, \"Found {0} symbols in {1} files\", this.references.length, this.groups.length);\n        }\n    }\n    nextOrPreviousReference(reference, next) {\n        const { parent } = reference;\n        let idx = parent.children.indexOf(reference);\n        const childCount = parent.children.length;\n        const groupCount = parent.parent.groups.length;\n        if (groupCount === 1 || next && idx + 1 < childCount || !next && idx > 0) {\n            // cycling within one file\n            if (next) {\n                idx = (idx + 1) % childCount;\n            }\n            else {\n                idx = (idx + childCount - 1) % childCount;\n            }\n            return parent.children[idx];\n        }\n        idx = parent.parent.groups.indexOf(parent);\n        if (next) {\n            idx = (idx + 1) % groupCount;\n            return parent.parent.groups[idx].children[0];\n        }\n        else {\n            idx = (idx + groupCount - 1) % groupCount;\n            return parent.parent.groups[idx].children[parent.parent.groups[idx].children.length - 1];\n        }\n    }\n    nearestReference(resource, position) {\n        const nearest = this.references.map((ref, idx) => {\n            return {\n                idx,\n                prefixLen: commonPrefixLength(ref.uri.toString(), resource.toString()),\n                offsetDist: Math.abs(ref.range.startLineNumber - position.lineNumber) * 100 + Math.abs(ref.range.startColumn - position.column)\n            };\n        }).sort((a, b) => {\n            if (a.prefixLen > b.prefixLen) {\n                return -1;\n            }\n            else if (a.prefixLen < b.prefixLen) {\n                return 1;\n            }\n            else if (a.offsetDist < b.offsetDist) {\n                return -1;\n            }\n            else if (a.offsetDist > b.offsetDist) {\n                return 1;\n            }\n            else {\n                return 0;\n            }\n        })[0];\n        if (nearest) {\n            return this.references[nearest.idx];\n        }\n        return undefined;\n    }\n    referenceAt(resource, position) {\n        for (const ref of this.references) {\n            if (ref.uri.toString() === resource.toString()) {\n                if (Range.containsPosition(ref.range, position)) {\n                    return ref;\n                }\n            }\n        }\n        return undefined;\n    }\n    firstReference() {\n        for (const ref of this.references) {\n            if (ref.isProviderFirst) {\n                return ref;\n            }\n        }\n        return this.references[0];\n    }\n    static _compareReferences(a, b) {\n        return extUri.compare(a.uri, b.uri) || Range.compareRangesUsingStarts(a.range, b.range);\n    }\n}\n\nexport { FilePreview, FileReferences, OneReference, ReferencesModel };\n","import { append, $ } from '../../dom.js';\nimport { format } from '../../../common/strings.js';\nimport './countBadge.css';\nimport { Disposable, MutableDisposable, toDisposable } from '../../../common/lifecycle.js';\nimport { getBaseLayerHoverDelegate } from '../hover/hoverDelegate2.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CountBadge extends Disposable {\n    constructor(container, options, styles) {\n        super();\n        this.options = options;\n        this.styles = styles;\n        this.count = 0;\n        this.hover = this._register(new MutableDisposable());\n        this.element = append(container, $('.monaco-count-badge'));\n        this._register(toDisposable(() => container.removeChild(this.element)));\n        this.countFormat = this.options.countFormat || '{0}';\n        this.titleFormat = this.options.titleFormat || '';\n        this.setCount(this.options.count || 0);\n        this.updateHover();\n    }\n    setCount(count) {\n        this.count = count;\n        this.render();\n    }\n    setTitleFormat(titleFormat) {\n        this.titleFormat = titleFormat;\n        this.updateHover();\n        this.render();\n    }\n    updateHover() {\n        if (this.titleFormat !== '' && !this.hover.value) {\n            this.hover.value = getBaseLayerHoverDelegate().setupDelayedHoverAtMouse(this.element, () => ({ content: format(this.titleFormat, this.count), appearance: { compact: true } }));\n        }\n        else if (this.titleFormat === '' && this.hover.value) {\n            this.hover.value = undefined;\n        }\n    }\n    render() {\n        this.element.textContent = format(this.countFormat, this.count);\n        this.element.style.backgroundColor = this.styles.badgeBackground ?? '';\n        this.element.style.color = this.styles.badgeForeground ?? '';\n        if (this.styles.badgeBorder) {\n            this.element.style.border = `1px solid ${this.styles.badgeBorder}`;\n        }\n    }\n}\n\nexport { CountBadge };\n","import { append, $, reset } from '../../dom.js';\nimport { getBaseLayerHoverDelegate } from '../hover/hoverDelegate2.js';\nimport { getDefaultHoverDelegate } from '../hover/hoverDelegateFactory.js';\nimport { renderLabelWithIcons } from '../iconLabel/iconLabels.js';\nimport { Disposable } from '../../../common/lifecycle.js';\nimport { equals } from '../../../common/objects.js';\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/**\n * A widget which can render a label with substring highlights, often\n * originating from a filter function like the fuzzy matcher.\n */\nclass HighlightedLabel extends Disposable {\n    /**\n     * Create a new {@link HighlightedLabel}.\n     *\n     * @param container The parent container to append to.\n     */\n    constructor(container, options) {\n        super();\n        this.options = options;\n        this.text = '';\n        this.title = '';\n        this.highlights = [];\n        this.didEverRender = false;\n        this.domNode = append(container, $('span.monaco-highlighted-label'));\n    }\n    /**\n     * The label's DOM node.\n     */\n    get element() {\n        return this.domNode;\n    }\n    /**\n     * Set the label and highlights.\n     *\n     * @param text The label to display.\n     * @param highlights The ranges to highlight.\n     * @param title An optional title for the hover tooltip.\n     * @param escapeNewLines Whether to escape new lines.\n     * @returns\n     */\n    set(text, highlights = [], title = '', escapeNewLines, supportIcons) {\n        if (!text) {\n            text = '';\n        }\n        if (escapeNewLines) {\n            // adjusts highlights inplace\n            text = HighlightedLabel.escapeNewLines(text, highlights);\n        }\n        if (this.didEverRender && this.text === text && this.title === title && equals(this.highlights, highlights)) {\n            return;\n        }\n        this.text = text;\n        this.title = title;\n        this.highlights = highlights;\n        this.render(supportIcons);\n    }\n    render(supportIcons) {\n        const children = [];\n        let pos = 0;\n        for (const highlight of this.highlights) {\n            if (highlight.end === highlight.start) {\n                continue;\n            }\n            if (pos < highlight.start) {\n                const substring = this.text.substring(pos, highlight.start);\n                if (supportIcons) {\n                    children.push(...renderLabelWithIcons(substring));\n                }\n                else {\n                    children.push(substring);\n                }\n                pos = highlight.start;\n            }\n            const substring = this.text.substring(pos, highlight.end);\n            const element = $('span.highlight', undefined, ...supportIcons ? renderLabelWithIcons(substring) : [substring]);\n            if (highlight.extraClasses) {\n                element.classList.add(...highlight.extraClasses);\n            }\n            children.push(element);\n            pos = highlight.end;\n        }\n        if (pos < this.text.length) {\n            const substring = this.text.substring(pos);\n            if (supportIcons) {\n                children.push(...renderLabelWithIcons(substring));\n            }\n            else {\n                children.push(substring);\n            }\n        }\n        reset(this.domNode, ...children);\n        if (!this.customHover && this.title !== '') {\n            const hoverDelegate = this.options?.hoverDelegate ?? getDefaultHoverDelegate('mouse');\n            this.customHover = this._register(getBaseLayerHoverDelegate().setupManagedHover(hoverDelegate, this.domNode, this.title));\n        }\n        else if (this.customHover) {\n            this.customHover.update(this.title);\n        }\n        this.didEverRender = true;\n    }\n    static escapeNewLines(text, highlights) {\n        let total = 0;\n        let extra = 0;\n        return text.replace(/\\r\\n|\\r|\\n/g, (match, offset) => {\n            extra = match === '\\r\\n' ? -1 : 0;\n            offset += total;\n            for (const highlight of highlights) {\n                if (highlight.end <= offset) {\n                    continue;\n                }\n                if (highlight.start >= offset) {\n                    highlight.start += extra;\n                }\n                if (highlight.end >= offset) {\n                    highlight.end += extra;\n                }\n            }\n            total += extra;\n            return '\\u23CE';\n        });\n    }\n}\n\nexport { HighlightedLabel };\n","import './iconlabel.css';\nimport { append, $, isHTMLElement, isAncestor, after } from '../../dom.js';\nimport { asCSSUrl } from '../../cssValue.js';\nimport { HighlightedLabel } from '../highlightedlabel/highlightedLabel.js';\nimport { Disposable } from '../../../common/lifecycle.js';\nimport { equals } from '../../../common/objects.js';\nimport { Range } from '../../../common/range.js';\nimport { getDefaultHoverDelegate } from '../hover/hoverDelegateFactory.js';\nimport { getBaseLayerHoverDelegate } from '../hover/hoverDelegate2.js';\nimport { ThemeIcon } from '../../../common/themables.js';\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 *--------------------------------------------------------------------------------------------*/\nclass FastLabelNode {\n    constructor(_element) {\n        this._element = _element;\n    }\n    get element() {\n        return this._element;\n    }\n    set textContent(content) {\n        if (this.disposed || content === this._textContent) {\n            return;\n        }\n        this._textContent = content;\n        this._element.textContent = content;\n    }\n    set classNames(classNames) {\n        if (this.disposed || equals(classNames, this._classNames)) {\n            return;\n        }\n        this._classNames = classNames;\n        this._element.classList.value = '';\n        this._element.classList.add(...classNames);\n    }\n    set empty(empty) {\n        if (this.disposed || empty === this._empty) {\n            return;\n        }\n        this._empty = empty;\n        this._element.style.marginLeft = empty ? '0' : '';\n    }\n    dispose() {\n        this.disposed = true;\n    }\n}\nclass IconLabel extends Disposable {\n    constructor(container, options) {\n        super();\n        this.customHovers = new Map();\n        this.creationOptions = options;\n        this.domNode = this._register(new FastLabelNode(append(container, $('.monaco-icon-label'))));\n        this.labelContainer = append(this.domNode.element, $('.monaco-icon-label-container'));\n        this.nameContainer = append(this.labelContainer, $('span.monaco-icon-name-container'));\n        if (options?.supportHighlights || options?.supportIcons) {\n            this.nameNode = this._register(new LabelWithHighlights(this.nameContainer, !!options.supportIcons));\n        }\n        else {\n            this.nameNode = new Label(this.nameContainer);\n        }\n        this.hoverDelegate = options?.hoverDelegate ?? getDefaultHoverDelegate('mouse');\n    }\n    get element() {\n        return this.domNode.element;\n    }\n    setLabel(label, description, options) {\n        const labelClasses = ['monaco-icon-label'];\n        const containerClasses = ['monaco-icon-label-container'];\n        let ariaLabel = '';\n        if (options) {\n            if (options.extraClasses) {\n                labelClasses.push(...options.extraClasses);\n            }\n            if (options.bold) {\n                labelClasses.push('bold');\n            }\n            if (options.italic) {\n                labelClasses.push('italic');\n            }\n            if (options.strikethrough) {\n                labelClasses.push('strikethrough');\n            }\n            if (options.disabledCommand) {\n                containerClasses.push('disabled');\n            }\n            if (options.title) {\n                if (typeof options.title === 'string') {\n                    ariaLabel += options.title;\n                }\n                else {\n                    ariaLabel += label;\n                }\n            }\n        }\n        // eslint-disable-next-line no-restricted-syntax\n        const existingIconNode = this.domNode.element.querySelector('.monaco-icon-label-iconpath');\n        if (options?.iconPath) {\n            let iconNode;\n            if (!existingIconNode || !(isHTMLElement(existingIconNode))) {\n                iconNode = $('.monaco-icon-label-iconpath');\n                this.domNode.element.prepend(iconNode);\n            }\n            else {\n                iconNode = existingIconNode;\n            }\n            if (ThemeIcon.isThemeIcon(options.iconPath)) {\n                const iconClass = ThemeIcon.asClassName(options.iconPath);\n                iconNode.className = `monaco-icon-label-iconpath ${iconClass}`;\n                iconNode.style.backgroundImage = '';\n            }\n            else {\n                iconNode.style.backgroundImage = asCSSUrl(options?.iconPath);\n            }\n            iconNode.style.backgroundRepeat = 'no-repeat';\n            iconNode.style.backgroundPosition = 'center';\n            iconNode.style.backgroundSize = 'contain';\n        }\n        else if (existingIconNode) {\n            existingIconNode.remove();\n        }\n        this.domNode.classNames = labelClasses;\n        this.domNode.element.setAttribute('aria-label', ariaLabel);\n        this.labelContainer.classList.value = '';\n        this.labelContainer.classList.add(...containerClasses);\n        this.setupHover(options?.descriptionTitle ? this.labelContainer : this.element, options?.title);\n        this.nameNode.setLabel(label, options);\n        if (description || this.descriptionNode) {\n            const descriptionNode = this.getOrCreateDescriptionNode();\n            if (descriptionNode instanceof HighlightedLabel) {\n                const supportIcons = options?.supportIcons ?? this.creationOptions?.supportIcons;\n                descriptionNode.set(description || '', options ? options.descriptionMatches : undefined, undefined, options?.labelEscapeNewLines, supportIcons);\n                this.setupHover(descriptionNode.element, options?.descriptionTitle);\n            }\n            else {\n                descriptionNode.textContent = description && options?.labelEscapeNewLines ? HighlightedLabel.escapeNewLines(description, []) : (description || '');\n                this.setupHover(descriptionNode.element, options?.descriptionTitle || '');\n                descriptionNode.empty = !description;\n            }\n        }\n        if (options?.suffix || this.suffixNode) {\n            const suffixNode = this.getOrCreateSuffixNode();\n            suffixNode.textContent = options?.suffix ?? '';\n        }\n    }\n    setupHover(htmlElement, tooltip) {\n        const previousCustomHover = this.customHovers.get(htmlElement);\n        if (previousCustomHover) {\n            previousCustomHover.dispose();\n            this.customHovers.delete(htmlElement);\n        }\n        if (!tooltip) {\n            htmlElement.removeAttribute('title');\n            return;\n        }\n        let hoverTarget = htmlElement;\n        if (this.creationOptions?.hoverTargetOverride) {\n            if (!isAncestor(htmlElement, this.creationOptions.hoverTargetOverride)) {\n                throw new Error('hoverTargetOverrride must be an ancestor of the htmlElement');\n            }\n            hoverTarget = this.creationOptions.hoverTargetOverride;\n        }\n        const hoverDisposable = getBaseLayerHoverDelegate().setupManagedHover(this.hoverDelegate, hoverTarget, tooltip);\n        if (hoverDisposable) {\n            this.customHovers.set(htmlElement, hoverDisposable);\n        }\n    }\n    dispose() {\n        super.dispose();\n        for (const disposable of this.customHovers.values()) {\n            disposable.dispose();\n        }\n        this.customHovers.clear();\n    }\n    getOrCreateSuffixNode() {\n        if (!this.suffixNode) {\n            const suffixContainer = this._register(new FastLabelNode(after(this.nameContainer, $('span.monaco-icon-suffix-container'))));\n            this.suffixNode = this._register(new FastLabelNode(append(suffixContainer.element, $('span.label-suffix'))));\n        }\n        return this.suffixNode;\n    }\n    getOrCreateDescriptionNode() {\n        if (!this.descriptionNode) {\n            const descriptionContainer = this._register(new FastLabelNode(append(this.labelContainer, $('span.monaco-icon-description-container'))));\n            if (this.creationOptions?.supportDescriptionHighlights) {\n                this.descriptionNode = this._register(new HighlightedLabel(append(descriptionContainer.element, $('span.label-description'))));\n            }\n            else {\n                this.descriptionNode = this._register(new FastLabelNode(append(descriptionContainer.element, $('span.label-description'))));\n            }\n        }\n        return this.descriptionNode;\n    }\n}\nclass Label {\n    constructor(container) {\n        this.container = container;\n        this.label = undefined;\n        this.singleLabel = undefined;\n    }\n    setLabel(label, options) {\n        if (this.label === label && equals(this.options, options)) {\n            return;\n        }\n        this.label = label;\n        this.options = options;\n        if (typeof label === 'string') {\n            if (!this.singleLabel) {\n                this.container.textContent = '';\n                this.container.classList.remove('multiple');\n                this.singleLabel = append(this.container, $('a.label-name', { id: options?.domId }));\n            }\n            this.singleLabel.textContent = label;\n        }\n        else {\n            this.container.textContent = '';\n            this.container.classList.add('multiple');\n            this.singleLabel = undefined;\n            for (let i = 0; i < label.length; i++) {\n                const l = label[i];\n                const id = options?.domId && `${options?.domId}_${i}`;\n                append(this.container, $('a.label-name', { id, 'data-icon-label-count': label.length, 'data-icon-label-index': i, 'role': 'treeitem' }, l));\n                if (i < label.length - 1) {\n                    append(this.container, $('span.label-separator', undefined, options?.separator || '/'));\n                }\n            }\n        }\n    }\n}\nfunction splitMatches(labels, separator, matches) {\n    if (!matches) {\n        return undefined;\n    }\n    let labelStart = 0;\n    return labels.map(label => {\n        const labelRange = { start: labelStart, end: labelStart + label.length };\n        const result = matches\n            .map(match => Range.intersect(labelRange, match))\n            .filter(range => !Range.isEmpty(range))\n            .map(({ start, end }) => ({ start: start - labelStart, end: end - labelStart }));\n        labelStart = labelRange.end + separator.length;\n        return result;\n    });\n}\nclass LabelWithHighlights extends Disposable {\n    constructor(container, supportIcons) {\n        super();\n        this.container = container;\n        this.supportIcons = supportIcons;\n        this.label = undefined;\n        this.singleLabel = undefined;\n    }\n    setLabel(label, options) {\n        if (this.label === label && equals(this.options, options)) {\n            return;\n        }\n        this.label = label;\n        this.options = options;\n        // Determine supportIcons: use option if provided, otherwise use constructor value\n        const supportIcons = options?.supportIcons ?? this.supportIcons;\n        if (typeof label === 'string') {\n            if (!this.singleLabel) {\n                this.container.textContent = '';\n                this.container.classList.remove('multiple');\n                this.singleLabel = this._register(new HighlightedLabel(append(this.container, $('a.label-name', { id: options?.domId }))));\n            }\n            this.singleLabel.set(label, options?.matches, undefined, options?.labelEscapeNewLines, supportIcons);\n        }\n        else {\n            this.container.textContent = '';\n            this.container.classList.add('multiple');\n            this.singleLabel = undefined;\n            const separator = options?.separator || '/';\n            const matches = splitMatches(label, separator, options?.matches);\n            for (let i = 0; i < label.length; i++) {\n                const l = label[i];\n                const m = matches ? matches[i] : undefined;\n                const id = options?.domId && `${options?.domId}_${i}`;\n                const name = $('a.label-name', { id, 'data-icon-label-count': label.length, 'data-icon-label-index': i, 'role': 'treeitem' });\n                const highlightedLabel = this._register(new HighlightedLabel(append(this.container, name)));\n                highlightedLabel.set(l, m, undefined, options?.labelEscapeNewLines, supportIcons);\n                if (i < label.length - 1) {\n                    append(name, $('span.label-separator', undefined, separator));\n                }\n            }\n        }\n    }\n}\n\nexport { IconLabel };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\n\nconst ILabelService = createDecorator('labelService');\n\nexport { ILabelService };\n","import { append, $ } from '../../../../../base/browser/dom.js';\nimport { CountBadge } from '../../../../../base/browser/ui/countBadge/countBadge.js';\nimport { HighlightedLabel } from '../../../../../base/browser/ui/highlightedlabel/highlightedLabel.js';\nimport { IconLabel } from '../../../../../base/browser/ui/iconLabel/iconLabel.js';\nimport { createMatches, FuzzyScore } from '../../../../../base/common/filters.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport { basename, dirname } from '../../../../../base/common/resources.js';\nimport { ITextModelService } from '../../../../common/services/resolverService.js';\nimport { localize } from '../../../../../nls.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';\nimport { ILabelService } from '../../../../../platform/label/common/label.js';\nimport { defaultCountBadgeStyles } from '../../../../../platform/theme/browser/defaultStyles.js';\nimport { ReferencesModel, FileReferences, OneReference } from '../referencesModel.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar FileReferencesRenderer_1;\nlet DataSource = class DataSource {\n    constructor(_resolverService) {\n        this._resolverService = _resolverService;\n    }\n    hasChildren(element) {\n        if (element instanceof ReferencesModel) {\n            return true;\n        }\n        if (element instanceof FileReferences) {\n            return true;\n        }\n        return false;\n    }\n    getChildren(element) {\n        if (element instanceof ReferencesModel) {\n            return element.groups;\n        }\n        if (element instanceof FileReferences) {\n            return element.resolve(this._resolverService).then(val => {\n                // if (element.failure) {\n                // \t// refresh the element on failure so that\n                // \t// we can update its rendering\n                // \treturn tree.refresh(element).then(() => val.children);\n                // }\n                return val.children;\n            });\n        }\n        throw new Error('bad tree');\n    }\n};\nDataSource = __decorate([\n    __param(0, ITextModelService)\n], DataSource);\n//#endregion\nclass Delegate {\n    getHeight() {\n        return 23;\n    }\n    getTemplateId(element) {\n        if (element instanceof FileReferences) {\n            return FileReferencesRenderer.id;\n        }\n        else {\n            return OneReferenceRenderer.id;\n        }\n    }\n}\nlet StringRepresentationProvider = class StringRepresentationProvider {\n    constructor(_keybindingService) {\n        this._keybindingService = _keybindingService;\n    }\n    getKeyboardNavigationLabel(element) {\n        if (element instanceof OneReference) {\n            const parts = element.parent.getPreview(element)?.preview(element.range);\n            if (parts) {\n                return parts.value;\n            }\n        }\n        // FileReferences or unresolved OneReference\n        return basename(element.uri);\n    }\n};\nStringRepresentationProvider = __decorate([\n    __param(0, IKeybindingService)\n], StringRepresentationProvider);\nclass IdentityProvider {\n    getId(element) {\n        return element instanceof OneReference ? element.id : element.uri;\n    }\n}\n//#region render: File\nlet FileReferencesTemplate = class FileReferencesTemplate extends Disposable {\n    constructor(container, _labelService) {\n        super();\n        this._labelService = _labelService;\n        const parent = document.createElement('div');\n        parent.classList.add('reference-file');\n        this.file = this._register(new IconLabel(parent, { supportHighlights: true }));\n        this.badge = this._register(new CountBadge(append(parent, $('.count')), {}, defaultCountBadgeStyles));\n        container.appendChild(parent);\n    }\n    set(element, matches) {\n        const parent = dirname(element.uri);\n        this.file.setLabel(this._labelService.getUriBasenameLabel(element.uri), this._labelService.getUriLabel(parent, { relative: true }), { title: this._labelService.getUriLabel(element.uri), matches });\n        const len = element.children.length;\n        this.badge.setCount(len);\n        if (len > 1) {\n            this.badge.setTitleFormat(localize(1081, \"{0} references\", len));\n        }\n        else {\n            this.badge.setTitleFormat(localize(1082, \"{0} reference\", len));\n        }\n    }\n};\nFileReferencesTemplate = __decorate([\n    __param(1, ILabelService)\n], FileReferencesTemplate);\nlet FileReferencesRenderer = class FileReferencesRenderer {\n    static { FileReferencesRenderer_1 = this; }\n    static { this.id = 'FileReferencesRenderer'; }\n    constructor(_instantiationService) {\n        this._instantiationService = _instantiationService;\n        this.templateId = FileReferencesRenderer_1.id;\n    }\n    renderTemplate(container) {\n        return this._instantiationService.createInstance(FileReferencesTemplate, container);\n    }\n    renderElement(node, index, template) {\n        template.set(node.element, createMatches(node.filterData));\n    }\n    disposeTemplate(templateData) {\n        templateData.dispose();\n    }\n};\nFileReferencesRenderer = FileReferencesRenderer_1 = __decorate([\n    __param(0, IInstantiationService)\n], FileReferencesRenderer);\n//#endregion\n//#region render: Reference\nclass OneReferenceTemplate extends Disposable {\n    constructor(container) {\n        super();\n        this.label = this._register(new HighlightedLabel(container));\n    }\n    set(element, score) {\n        const preview = element.parent.getPreview(element)?.preview(element.range);\n        if (!preview || !preview.value) {\n            // this means we FAILED to resolve the document or the value is the empty string\n            this.label.set(`${basename(element.uri)}:${element.range.startLineNumber + 1}:${element.range.startColumn + 1}`);\n        }\n        else {\n            // render search match as highlight unless\n            // we have score, then render the score\n            const { value, highlight } = preview;\n            if (score && !FuzzyScore.isDefault(score)) {\n                this.label.element.classList.toggle('referenceMatch', false);\n                this.label.set(value, createMatches(score));\n            }\n            else {\n                this.label.element.classList.toggle('referenceMatch', true);\n                this.label.set(value, [highlight]);\n            }\n        }\n    }\n}\nclass OneReferenceRenderer {\n    constructor() {\n        this.templateId = OneReferenceRenderer.id;\n    }\n    static { this.id = 'OneReferenceRenderer'; }\n    renderTemplate(container) {\n        return new OneReferenceTemplate(container);\n    }\n    renderElement(node, index, templateData) {\n        templateData.set(node.element, node.filterData);\n    }\n    disposeTemplate(templateData) {\n        templateData.dispose();\n    }\n}\n//#endregion\nclass AccessibilityProvider {\n    getWidgetAriaLabel() {\n        return localize(1083, \"References\");\n    }\n    getAriaLabel(element) {\n        return element.ariaMessage;\n    }\n}\n\nexport { AccessibilityProvider, DataSource, Delegate, FileReferencesRenderer, IdentityProvider, OneReferenceRenderer, StringRepresentationProvider };\n","import { Dimension, append, $, hide, addStandardDisposableListener, show } from '../../../../../base/browser/dom.js';\nimport { SplitView, Sizing } from '../../../../../base/browser/ui/splitview/splitview.js';\nimport { Color } from '../../../../../base/common/color.js';\nimport { Emitter, Event } from '../../../../../base/common/event.js';\nimport { DisposableStore, dispose } from '../../../../../base/common/lifecycle.js';\nimport { Schemas } from '../../../../../base/common/network.js';\nimport { basenameOrAuthority, dirname } from '../../../../../base/common/resources.js';\nimport './referencesWidget.css';\nimport { EmbeddedCodeEditorWidget } from '../../../../browser/widget/codeEditor/embeddedCodeEditorWidget.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { ModelDecorationOptions, TextModel } from '../../../../common/model/textModel.js';\nimport { PLAINTEXT_LANGUAGE_ID } from '../../../../common/languages/modesRegistry.js';\nimport { ITextModelService } from '../../../../common/services/resolverService.js';\nimport { StringRepresentationProvider, Delegate, FileReferencesRenderer, OneReferenceRenderer, DataSource, IdentityProvider, AccessibilityProvider } from './referencesTree.js';\nimport { IPeekViewService, PeekViewWidget, peekViewBorder, peekViewTitleInfoForeground, peekViewTitleForeground, peekViewTitleBackground, peekViewResultsBackground } from '../../../peekView/browser/peekView.js';\nimport { localize } from '../../../../../nls.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';\nimport { ILabelService } from '../../../../../platform/label/common/label.js';\nimport { WorkbenchAsyncDataTree } from '../../../../../platform/list/browser/listService.js';\nimport { IThemeService } from '../../../../../platform/theme/common/themeService.js';\nimport { FileReferences, OneReference } from '../referencesModel.js';\nimport { DataTransfers } from '../../../../../base/browser/dnd.js';\nimport { withSelection } from '../../../../../platform/opener/common/opener.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass DecorationsManager {\n    static { this.DecorationOptions = ModelDecorationOptions.register({\n        description: 'reference-decoration',\n        stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n        className: 'reference-decoration'\n    }); }\n    constructor(_editor, _model) {\n        this._editor = _editor;\n        this._model = _model;\n        this._decorations = new Map();\n        this._decorationIgnoreSet = new Set();\n        this._callOnDispose = new DisposableStore();\n        this._callOnModelChange = new DisposableStore();\n        this._callOnDispose.add(this._editor.onDidChangeModel(() => this._onModelChanged()));\n        this._onModelChanged();\n    }\n    dispose() {\n        this._callOnModelChange.dispose();\n        this._callOnDispose.dispose();\n        this.removeDecorations();\n    }\n    _onModelChanged() {\n        this._callOnModelChange.clear();\n        const model = this._editor.getModel();\n        if (!model) {\n            return;\n        }\n        for (const ref of this._model.references) {\n            if (ref.uri.toString() === model.uri.toString()) {\n                this._addDecorations(ref.parent);\n                return;\n            }\n        }\n    }\n    _addDecorations(reference) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        this._callOnModelChange.add(this._editor.getModel().onDidChangeDecorations(() => this._onDecorationChanged()));\n        const newDecorations = [];\n        const newDecorationsActualIndex = [];\n        for (let i = 0, len = reference.children.length; i < len; i++) {\n            const oneReference = reference.children[i];\n            if (this._decorationIgnoreSet.has(oneReference.id)) {\n                continue;\n            }\n            if (oneReference.uri.toString() !== this._editor.getModel().uri.toString()) {\n                continue;\n            }\n            newDecorations.push({\n                range: oneReference.range,\n                options: DecorationsManager.DecorationOptions\n            });\n            newDecorationsActualIndex.push(i);\n        }\n        this._editor.changeDecorations((changeAccessor) => {\n            const decorations = changeAccessor.deltaDecorations([], newDecorations);\n            for (let i = 0; i < decorations.length; i++) {\n                this._decorations.set(decorations[i], reference.children[newDecorationsActualIndex[i]]);\n            }\n        });\n    }\n    _onDecorationChanged() {\n        const toRemove = [];\n        const model = this._editor.getModel();\n        if (!model) {\n            return;\n        }\n        for (const [decorationId, reference] of this._decorations) {\n            const newRange = model.getDecorationRange(decorationId);\n            if (!newRange) {\n                continue;\n            }\n            let ignore = false;\n            if (Range.equalsRange(newRange, reference.range)) {\n                continue;\n            }\n            if (Range.spansMultipleLines(newRange)) {\n                ignore = true;\n            }\n            else {\n                const lineLength = reference.range.endColumn - reference.range.startColumn;\n                const newLineLength = newRange.endColumn - newRange.startColumn;\n                if (lineLength !== newLineLength) {\n                    ignore = true;\n                }\n            }\n            if (ignore) {\n                this._decorationIgnoreSet.add(reference.id);\n                toRemove.push(decorationId);\n            }\n            else {\n                reference.range = newRange;\n            }\n        }\n        for (let i = 0, len = toRemove.length; i < len; i++) {\n            this._decorations.delete(toRemove[i]);\n        }\n        this._editor.removeDecorations(toRemove);\n    }\n    removeDecorations() {\n        this._editor.removeDecorations([...this._decorations.keys()]);\n        this._decorations.clear();\n    }\n}\nclass LayoutData {\n    constructor() {\n        this.ratio = 0.7;\n        this.heightInLines = 18;\n    }\n    static fromJSON(raw) {\n        let ratio;\n        let heightInLines;\n        try {\n            const data = JSON.parse(raw);\n            ratio = data.ratio;\n            heightInLines = data.heightInLines;\n        }\n        catch {\n            //\n        }\n        return {\n            ratio: ratio || 0.7,\n            heightInLines: heightInLines || 18\n        };\n    }\n}\nclass ReferencesTree extends WorkbenchAsyncDataTree {\n}\nlet ReferencesDragAndDrop = class ReferencesDragAndDrop {\n    constructor(labelService) {\n        this.labelService = labelService;\n        this.disposables = new DisposableStore();\n    }\n    getDragURI(element) {\n        if (element instanceof FileReferences) {\n            return element.uri.toString();\n        }\n        else if (element instanceof OneReference) {\n            return withSelection(element.uri, element.range).toString();\n        }\n        return null;\n    }\n    getDragLabel(elements) {\n        if (elements.length === 0) {\n            return undefined;\n        }\n        const labels = elements.map(e => this.labelService.getUriBasenameLabel(e.uri));\n        return labels.join(', ');\n    }\n    onDragStart(data, originalEvent) {\n        if (!originalEvent.dataTransfer) {\n            return;\n        }\n        const elements = data.elements;\n        const resources = elements.map(e => this.getDragURI(e)).filter(Boolean);\n        if (resources.length) {\n            // Apply resources as resource-list\n            originalEvent.dataTransfer.setData(DataTransfers.RESOURCES, JSON.stringify(resources));\n            // Also add as plain text for outside consumers\n            originalEvent.dataTransfer.setData(DataTransfers.TEXT, resources.join('\\n'));\n        }\n    }\n    onDragOver() { return false; }\n    drop() { }\n    dispose() { this.disposables.dispose(); }\n};\nReferencesDragAndDrop = __decorate([\n    __param(0, ILabelService)\n], ReferencesDragAndDrop);\n/**\n * ZoneWidget that is shown inside the editor\n */\nlet ReferenceWidget = class ReferenceWidget extends PeekViewWidget {\n    constructor(editor, _defaultTreeKeyboardSupport, layoutData, themeService, _textModelResolverService, _instantiationService, _peekViewService, _uriLabel, _keybindingService) {\n        super(editor, { showFrame: false, showArrow: true, isResizeable: true, isAccessible: true, supportOnTitleClick: true }, _instantiationService);\n        this._defaultTreeKeyboardSupport = _defaultTreeKeyboardSupport;\n        this.layoutData = layoutData;\n        this._textModelResolverService = _textModelResolverService;\n        this._instantiationService = _instantiationService;\n        this._peekViewService = _peekViewService;\n        this._uriLabel = _uriLabel;\n        this._keybindingService = _keybindingService;\n        this._disposeOnNewModel = new DisposableStore();\n        this._callOnDispose = new DisposableStore();\n        this._onDidSelectReference = new Emitter();\n        this.onDidSelectReference = this._onDidSelectReference.event;\n        this._dim = new Dimension(0, 0);\n        this._isClosing = false; // whether or not a dispose is already in progress\n        this._applyTheme(themeService.getColorTheme());\n        this._callOnDispose.add(themeService.onDidColorThemeChange(this._applyTheme.bind(this)));\n        this._peekViewService.addExclusiveWidget(editor, this);\n        this.create();\n    }\n    get isClosing() {\n        return this._isClosing;\n    }\n    dispose() {\n        this._isClosing = true;\n        this.setModel(undefined);\n        this._callOnDispose.dispose();\n        this._disposeOnNewModel.dispose();\n        dispose(this._preview);\n        dispose(this._previewNotAvailableMessage);\n        dispose(this._tree);\n        dispose(this._previewModelReference);\n        this._splitView.dispose();\n        super.dispose();\n    }\n    _applyTheme(theme) {\n        const borderColor = theme.getColor(peekViewBorder) || Color.transparent;\n        this.style({\n            arrowColor: borderColor,\n            frameColor: borderColor,\n            headerBackgroundColor: theme.getColor(peekViewTitleBackground) || Color.transparent,\n            primaryHeadingColor: theme.getColor(peekViewTitleForeground),\n            secondaryHeadingColor: theme.getColor(peekViewTitleInfoForeground)\n        });\n    }\n    show(where) {\n        super.show(where, this.layoutData.heightInLines || 18);\n    }\n    focusOnReferenceTree() {\n        this._tree.domFocus();\n    }\n    focusOnPreviewEditor() {\n        this._preview.focus();\n    }\n    isPreviewEditorFocused() {\n        return this._preview.hasTextFocus();\n    }\n    _onTitleClick(e) {\n        if (this._preview && this._preview.getModel()) {\n            this._onDidSelectReference.fire({\n                element: this._getFocusedReference(),\n                kind: e.ctrlKey || e.metaKey || e.altKey ? 'side' : 'open',\n                source: 'title'\n            });\n        }\n    }\n    _fillBody(containerElement) {\n        this.setCssClass('reference-zone-widget');\n        // message pane\n        this._messageContainer = append(containerElement, $('div.messages'));\n        hide(this._messageContainer);\n        this._splitView = new SplitView(containerElement, { orientation: 1 /* Orientation.HORIZONTAL */ });\n        // editor\n        this._previewContainer = append(containerElement, $('div.preview.inline'));\n        const options = {\n            scrollBeyondLastLine: false,\n            scrollbar: {\n                verticalScrollbarSize: 14,\n                horizontal: 'auto',\n                useShadows: true,\n                verticalHasArrows: false,\n                horizontalHasArrows: false,\n                alwaysConsumeMouseWheel: true\n            },\n            overviewRulerLanes: 2,\n            fixedOverflowWidgets: true,\n            minimap: {\n                enabled: false\n            }\n        };\n        this._preview = this._instantiationService.createInstance(EmbeddedCodeEditorWidget, this._previewContainer, options, {}, this.editor);\n        hide(this._previewContainer);\n        this._previewNotAvailableMessage = this._instantiationService.createInstance(TextModel, localize(1084, \"no preview available\"), PLAINTEXT_LANGUAGE_ID, TextModel.DEFAULT_CREATION_OPTIONS, null);\n        // tree\n        this._treeContainer = append(containerElement, $('div.ref-tree.inline'));\n        const treeOptions = {\n            keyboardSupport: this._defaultTreeKeyboardSupport,\n            accessibilityProvider: new AccessibilityProvider(),\n            keyboardNavigationLabelProvider: this._instantiationService.createInstance(StringRepresentationProvider),\n            identityProvider: new IdentityProvider(),\n            openOnSingleClick: true,\n            selectionNavigation: true,\n            overrideStyles: {\n                listBackground: peekViewResultsBackground\n            },\n            dnd: this._instantiationService.createInstance(ReferencesDragAndDrop)\n        };\n        if (this._defaultTreeKeyboardSupport) {\n            // the tree will consume `Escape` and prevent the widget from closing\n            this._callOnDispose.add(addStandardDisposableListener(this._treeContainer, 'keydown', (e) => {\n                if (e.equals(9 /* KeyCode.Escape */)) {\n                    this._keybindingService.dispatchEvent(e, e.target);\n                    e.stopPropagation();\n                }\n            }, true));\n        }\n        this._tree = this._instantiationService.createInstance(ReferencesTree, 'ReferencesWidget', this._treeContainer, new Delegate(), [\n            this._instantiationService.createInstance(FileReferencesRenderer),\n            this._instantiationService.createInstance(OneReferenceRenderer),\n        ], this._instantiationService.createInstance(DataSource), treeOptions);\n        // split stuff\n        this._splitView.addView({\n            onDidChange: Event.None,\n            element: this._previewContainer,\n            minimumSize: 200,\n            maximumSize: Number.MAX_VALUE,\n            layout: (width) => {\n                this._preview.layout({ height: this._dim.height, width });\n            }\n        }, Sizing.Distribute);\n        this._splitView.addView({\n            onDidChange: Event.None,\n            element: this._treeContainer,\n            minimumSize: 100,\n            maximumSize: Number.MAX_VALUE,\n            layout: (width) => {\n                this._treeContainer.style.height = `${this._dim.height}px`;\n                this._treeContainer.style.width = `${width}px`;\n                this._tree.layout(this._dim.height, width);\n            }\n        }, Sizing.Distribute);\n        this._disposables.add(this._splitView.onDidSashChange(() => {\n            if (this._dim.width) {\n                this.layoutData.ratio = this._splitView.getViewSize(0) / this._dim.width;\n            }\n        }, undefined));\n        // listen on selection and focus\n        const onEvent = (element, kind) => {\n            if (element instanceof OneReference) {\n                if (kind === 'show') {\n                    this._revealReference(element, false);\n                }\n                this._onDidSelectReference.fire({ element, kind, source: 'tree' });\n            }\n        };\n        this._disposables.add(this._tree.onDidOpen(e => {\n            if (e.sideBySide) {\n                onEvent(e.element, 'side');\n            }\n            else if (e.editorOptions.pinned) {\n                onEvent(e.element, 'goto');\n            }\n            else {\n                onEvent(e.element, 'show');\n            }\n        }));\n        hide(this._treeContainer);\n    }\n    _onWidth(width) {\n        if (this._dim) {\n            this._doLayoutBody(this._dim.height, width);\n        }\n    }\n    _doLayoutBody(heightInPixel, widthInPixel) {\n        super._doLayoutBody(heightInPixel, widthInPixel);\n        this._dim = new Dimension(widthInPixel, heightInPixel);\n        this.layoutData.heightInLines = this._viewZone ? this._viewZone.heightInLines : this.layoutData.heightInLines;\n        this._splitView.layout(widthInPixel);\n        this._splitView.resizeView(0, widthInPixel * this.layoutData.ratio);\n    }\n    setSelection(selection) {\n        return this._revealReference(selection, true).then(() => {\n            if (!this._model) {\n                // disposed\n                return;\n            }\n            // show in tree\n            this._tree.setSelection([selection]);\n            this._tree.setFocus([selection]);\n        });\n    }\n    setModel(newModel) {\n        // clean up\n        this._disposeOnNewModel.clear();\n        this._model = newModel;\n        if (this._model) {\n            return this._onNewModel();\n        }\n        return Promise.resolve();\n    }\n    _onNewModel() {\n        if (!this._model) {\n            return Promise.resolve(undefined);\n        }\n        if (this._model.isEmpty) {\n            this.setTitle('');\n            this._messageContainer.innerText = localize(1085, \"No results\");\n            show(this._messageContainer);\n            return Promise.resolve(undefined);\n        }\n        hide(this._messageContainer);\n        this._decorationsManager = new DecorationsManager(this._preview, this._model);\n        this._disposeOnNewModel.add(this._decorationsManager);\n        // listen on model changes\n        this._disposeOnNewModel.add(this._model.onDidChangeReferenceRange(reference => this._tree.rerender(reference)));\n        // listen on editor\n        this._disposeOnNewModel.add(this._preview.onMouseDown(e => {\n            const { event, target } = e;\n            if (event.detail !== 2) {\n                return;\n            }\n            const element = this._getFocusedReference();\n            if (!element) {\n                return;\n            }\n            this._onDidSelectReference.fire({\n                element: { uri: element.uri, range: target.range },\n                kind: (event.ctrlKey || event.metaKey || event.altKey) ? 'side' : 'open',\n                source: 'editor'\n            });\n        }));\n        // make sure things are rendered\n        this.container.classList.add('results-loaded');\n        show(this._treeContainer);\n        show(this._previewContainer);\n        this._splitView.layout(this._dim.width);\n        this.focusOnReferenceTree();\n        // pick input and a reference to begin with\n        return this._tree.setInput(this._model.groups.length === 1 ? this._model.groups[0] : this._model);\n    }\n    _getFocusedReference() {\n        const [element] = this._tree.getFocus();\n        if (element instanceof OneReference) {\n            return element;\n        }\n        else if (element instanceof FileReferences) {\n            if (element.children.length > 0) {\n                return element.children[0];\n            }\n        }\n        return undefined;\n    }\n    async revealReference(reference) {\n        await this._revealReference(reference, false);\n        this._onDidSelectReference.fire({ element: reference, kind: 'goto', source: 'tree' });\n    }\n    async _revealReference(reference, revealParent) {\n        // check if there is anything to do...\n        if (this._revealedReference === reference) {\n            return;\n        }\n        this._revealedReference = reference;\n        // Update widget header\n        if (reference.uri.scheme !== Schemas.inMemory) {\n            this.setTitle(basenameOrAuthority(reference.uri), this._uriLabel.getUriLabel(dirname(reference.uri)));\n        }\n        else {\n            this.setTitle(localize(1086, \"References\"));\n        }\n        const promise = this._textModelResolverService.createModelReference(reference.uri);\n        if (this._tree.getInput() === reference.parent) {\n            this._tree.reveal(reference);\n        }\n        else {\n            if (revealParent) {\n                this._tree.reveal(reference.parent);\n            }\n            await this._tree.expand(reference.parent);\n            this._tree.reveal(reference);\n        }\n        const ref = await promise;\n        if (!this._model) {\n            // disposed\n            ref.dispose();\n            return;\n        }\n        dispose(this._previewModelReference);\n        // show in editor\n        const model = ref.object;\n        if (model) {\n            const scrollType = this._preview.getModel() === model.textEditorModel ? 0 /* ScrollType.Smooth */ : 1 /* ScrollType.Immediate */;\n            const sel = Range.lift(reference.range).collapseToStart();\n            this._previewModelReference = ref;\n            this._preview.setModel(model.textEditorModel);\n            this._preview.setSelection(sel);\n            this._preview.revealRangeInCenter(sel, scrollType);\n        }\n        else {\n            this._preview.setModel(this._previewNotAvailableMessage);\n            ref.dispose();\n        }\n    }\n};\nReferenceWidget = __decorate([\n    __param(3, IThemeService),\n    __param(4, ITextModelService),\n    __param(5, IInstantiationService),\n    __param(6, IPeekViewService),\n    __param(7, ILabelService),\n    __param(8, IKeybindingService)\n], ReferenceWidget);\n\nexport { LayoutData, ReferenceWidget };\n","import { createCancelablePromise } from '../../../../../base/common/async.js';\nimport { onUnexpectedError } from '../../../../../base/common/errors.js';\nimport { KeyChord } from '../../../../../base/common/keyCodes.js';\nimport { DisposableStore } from '../../../../../base/common/lifecycle.js';\nimport { ICodeEditorService } from '../../../../browser/services/codeEditorService.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { PeekContext } from '../../../peekView/browser/peekView.js';\nimport { getOuterEditor } from '../../../../browser/widget/codeEditor/embeddedCodeEditorWidget.js';\nimport { localize } from '../../../../../nls.js';\nimport { CommandsRegistry } from '../../../../../platform/commands/common/commands.js';\nimport { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';\nimport { RawContextKey, IContextKeyService, ContextKeyExpr } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { KeybindingsRegistry } from '../../../../../platform/keybinding/common/keybindingsRegistry.js';\nimport { IListService, WorkbenchListFocusContextKey, WorkbenchTreeElementCanCollapse, WorkbenchTreeElementCanExpand } from '../../../../../platform/list/browser/listService.js';\nimport { INotificationService } from '../../../../../platform/notification/common/notification.js';\nimport { IStorageService } from '../../../../../platform/storage/common/storage.js';\nimport { OneReference } from '../referencesModel.js';\nimport { LayoutData, ReferenceWidget } from './referencesWidget.js';\nimport { EditorContextKeys } from '../../../../common/editorContextKeys.js';\nimport { InputFocusedContext } from '../../../../../platform/contextkey/common/contextkeys.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ReferencesController_1;\nconst ctxReferenceSearchVisible = new RawContextKey('referenceSearchVisible', false, localize(1078, \"Whether reference peek is visible, like 'Peek References' or 'Peek Definition'\"));\nlet ReferencesController = class ReferencesController {\n    static { ReferencesController_1 = this; }\n    static { this.ID = 'editor.contrib.referencesController'; }\n    static get(editor) {\n        return editor.getContribution(ReferencesController_1.ID);\n    }\n    constructor(_defaultTreeKeyboardSupport, _editor, contextKeyService, _editorService, _notificationService, _instantiationService, _storageService, _configurationService) {\n        this._defaultTreeKeyboardSupport = _defaultTreeKeyboardSupport;\n        this._editor = _editor;\n        this._editorService = _editorService;\n        this._notificationService = _notificationService;\n        this._instantiationService = _instantiationService;\n        this._storageService = _storageService;\n        this._configurationService = _configurationService;\n        this._disposables = new DisposableStore();\n        this._requestIdPool = 0;\n        this._ignoreModelChangeEvent = false;\n        this._referenceSearchVisible = ctxReferenceSearchVisible.bindTo(contextKeyService);\n    }\n    dispose() {\n        this._referenceSearchVisible.reset();\n        this._disposables.dispose();\n        this._widget?.dispose();\n        this._model?.dispose();\n        this._widget = undefined;\n        this._model = undefined;\n    }\n    toggleWidget(range, modelPromise, peekMode) {\n        // close current widget and return early is position didn't change\n        let widgetPosition;\n        if (this._widget) {\n            widgetPosition = this._widget.position;\n        }\n        this.closeWidget();\n        if (!!widgetPosition && range.containsPosition(widgetPosition)) {\n            return;\n        }\n        this._peekMode = peekMode;\n        this._referenceSearchVisible.set(true);\n        // close the widget on model/mode changes\n        this._disposables.add(this._editor.onDidChangeModelLanguage(() => { this.closeWidget(); }));\n        this._disposables.add(this._editor.onDidChangeModel(() => {\n            if (!this._ignoreModelChangeEvent) {\n                this.closeWidget();\n            }\n        }));\n        const storageKey = 'peekViewLayout';\n        const data = LayoutData.fromJSON(this._storageService.get(storageKey, 0 /* StorageScope.PROFILE */, '{}'));\n        this._widget = this._instantiationService.createInstance(ReferenceWidget, this._editor, this._defaultTreeKeyboardSupport, data);\n        this._widget.setTitle(localize(1079, \"Loading...\"));\n        this._widget.show(range);\n        this._disposables.add(this._widget.onDidClose(() => {\n            modelPromise.cancel();\n            if (this._widget) {\n                this._storageService.store(storageKey, JSON.stringify(this._widget.layoutData), 0 /* StorageScope.PROFILE */, 1 /* StorageTarget.MACHINE */);\n                if (!this._widget.isClosing) {\n                    // to prevent calling this too many times, check whether it was already closing.\n                    this.closeWidget();\n                }\n                this._widget = undefined;\n            }\n            else {\n                this.closeWidget();\n            }\n        }));\n        this._disposables.add(this._widget.onDidSelectReference(event => {\n            const { element, kind } = event;\n            if (!element) {\n                return;\n            }\n            switch (kind) {\n                case 'open':\n                    if (event.source !== 'editor' || !this._configurationService.getValue('editor.stablePeek')) {\n                        // when stable peek is configured we don't close\n                        // the peek window on selecting the editor\n                        this.openReference(element, false, false);\n                    }\n                    break;\n                case 'side':\n                    this.openReference(element, true, false);\n                    break;\n                case 'goto':\n                    if (peekMode) {\n                        this._gotoReference(element, true);\n                    }\n                    else {\n                        this.openReference(element, false, true);\n                    }\n                    break;\n            }\n        }));\n        const requestId = ++this._requestIdPool;\n        modelPromise.then(model => {\n            // still current request? widget still open?\n            if (requestId !== this._requestIdPool || !this._widget) {\n                model.dispose();\n                return undefined;\n            }\n            this._model?.dispose();\n            this._model = model;\n            // show widget\n            return this._widget.setModel(this._model).then(() => {\n                if (this._widget && this._model && this._editor.hasModel()) { // might have been closed\n                    // set title\n                    if (!this._model.isEmpty) {\n                        this._widget.setMetaTitle(localize(1080, \"{0} ({1})\", this._model.title, this._model.references.length));\n                    }\n                    else {\n                        this._widget.setMetaTitle('');\n                    }\n                    // set 'best' selection\n                    const uri = this._editor.getModel().uri;\n                    const pos = new Position(range.startLineNumber, range.startColumn);\n                    const selection = this._model.nearestReference(uri, pos);\n                    if (selection) {\n                        return this._widget.setSelection(selection).then(() => {\n                            if (this._widget && this._editor.getOption(99 /* EditorOption.peekWidgetDefaultFocus */) === 'editor') {\n                                this._widget.focusOnPreviewEditor();\n                            }\n                        });\n                    }\n                }\n                return undefined;\n            });\n        }, error => {\n            this._notificationService.error(error);\n        });\n    }\n    changeFocusBetweenPreviewAndReferences() {\n        if (!this._widget) {\n            // can be called while still resolving...\n            return;\n        }\n        if (this._widget.isPreviewEditorFocused()) {\n            this._widget.focusOnReferenceTree();\n        }\n        else {\n            this._widget.focusOnPreviewEditor();\n        }\n    }\n    async goToNextOrPreviousReference(fwd) {\n        if (!this._editor.hasModel() || !this._model || !this._widget) {\n            // can be called while still resolving...\n            return;\n        }\n        const currentPosition = this._widget.position;\n        if (!currentPosition) {\n            return;\n        }\n        const source = this._model.nearestReference(this._editor.getModel().uri, currentPosition);\n        if (!source) {\n            return;\n        }\n        const target = this._model.nextOrPreviousReference(source, fwd);\n        const editorFocus = this._editor.hasTextFocus();\n        const previewEditorFocus = this._widget.isPreviewEditorFocused();\n        await this._widget.setSelection(target);\n        await this._gotoReference(target, false);\n        if (editorFocus) {\n            this._editor.focus();\n        }\n        else if (this._widget && previewEditorFocus) {\n            this._widget.focusOnPreviewEditor();\n        }\n    }\n    async revealReference(reference) {\n        if (!this._editor.hasModel() || !this._model || !this._widget) {\n            // can be called while still resolving...\n            return;\n        }\n        await this._widget.revealReference(reference);\n    }\n    closeWidget(focusEditor = true) {\n        this._widget?.dispose();\n        this._model?.dispose();\n        this._referenceSearchVisible.reset();\n        this._disposables.clear();\n        this._widget = undefined;\n        this._model = undefined;\n        if (focusEditor) {\n            this._editor.focus();\n        }\n        this._requestIdPool += 1; // Cancel pending requests\n    }\n    _gotoReference(ref, pinned) {\n        this._widget?.hide();\n        this._ignoreModelChangeEvent = true;\n        const range = Range.lift(ref.range).collapseToStart();\n        return this._editorService.openCodeEditor({\n            resource: ref.uri,\n            options: { selection: range, selectionSource: \"code.jump\" /* TextEditorSelectionSource.JUMP */, pinned }\n        }, this._editor).then(openedEditor => {\n            this._ignoreModelChangeEvent = false;\n            if (!openedEditor || !this._widget) {\n                // something went wrong...\n                this.closeWidget();\n                return;\n            }\n            if (this._editor === openedEditor) {\n                //\n                this._widget.show(range);\n                this._widget.focusOnReferenceTree();\n            }\n            else {\n                // we opened a different editor instance which means a different controller instance.\n                // therefore we stop with this controller and continue with the other\n                const other = ReferencesController_1.get(openedEditor);\n                const model = this._model.clone();\n                this.closeWidget();\n                openedEditor.focus();\n                other?.toggleWidget(range, createCancelablePromise(_ => Promise.resolve(model)), this._peekMode ?? false);\n            }\n        }, (err) => {\n            this._ignoreModelChangeEvent = false;\n            onUnexpectedError(err);\n        });\n    }\n    openReference(ref, sideBySide, pinned) {\n        // clear stage\n        if (!sideBySide) {\n            this.closeWidget();\n        }\n        const { uri, range } = ref;\n        this._editorService.openCodeEditor({\n            resource: uri,\n            options: { selection: range, selectionSource: \"code.jump\" /* TextEditorSelectionSource.JUMP */, pinned }\n        }, this._editor, sideBySide);\n    }\n};\nReferencesController = ReferencesController_1 = __decorate([\n    __param(2, IContextKeyService),\n    __param(3, ICodeEditorService),\n    __param(4, INotificationService),\n    __param(5, IInstantiationService),\n    __param(6, IStorageService),\n    __param(7, IConfigurationService)\n], ReferencesController);\nfunction withController(accessor, fn) {\n    const outerEditor = getOuterEditor(accessor);\n    if (!outerEditor) {\n        return;\n    }\n    const controller = ReferencesController.get(outerEditor);\n    if (controller) {\n        fn(controller);\n    }\n}\nKeybindingsRegistry.registerCommandAndKeybindingRule({\n    id: 'togglePeekWidgetFocus',\n    weight: 100 /* KeybindingWeight.EditorContrib */,\n    primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 60 /* KeyCode.F2 */),\n    when: ContextKeyExpr.or(ctxReferenceSearchVisible, PeekContext.inPeekEditor),\n    handler(accessor) {\n        withController(accessor, controller => {\n            controller.changeFocusBetweenPreviewAndReferences();\n        });\n    }\n});\nKeybindingsRegistry.registerCommandAndKeybindingRule({\n    id: 'goToNextReference',\n    weight: 100 /* KeybindingWeight.EditorContrib */ - 10,\n    primary: 62 /* KeyCode.F4 */,\n    secondary: [70 /* KeyCode.F12 */],\n    when: ContextKeyExpr.or(ctxReferenceSearchVisible, PeekContext.inPeekEditor),\n    handler(accessor) {\n        withController(accessor, controller => {\n            controller.goToNextOrPreviousReference(true);\n        });\n    }\n});\nKeybindingsRegistry.registerCommandAndKeybindingRule({\n    id: 'goToPreviousReference',\n    weight: 100 /* KeybindingWeight.EditorContrib */ - 10,\n    primary: 1024 /* KeyMod.Shift */ | 62 /* KeyCode.F4 */,\n    secondary: [1024 /* KeyMod.Shift */ | 70 /* KeyCode.F12 */],\n    when: ContextKeyExpr.or(ctxReferenceSearchVisible, PeekContext.inPeekEditor),\n    handler(accessor) {\n        withController(accessor, controller => {\n            controller.goToNextOrPreviousReference(false);\n        });\n    }\n});\n// commands that aren't needed anymore because there is now ContextKeyExpr.OR\nCommandsRegistry.registerCommandAlias('goToNextReferenceFromEmbeddedEditor', 'goToNextReference');\nCommandsRegistry.registerCommandAlias('goToPreviousReferenceFromEmbeddedEditor', 'goToPreviousReference');\n// close\nCommandsRegistry.registerCommandAlias('closeReferenceSearchEditor', 'closeReferenceSearch');\nCommandsRegistry.registerCommand('closeReferenceSearch', accessor => withController(accessor, controller => controller.closeWidget()));\nKeybindingsRegistry.registerKeybindingRule({\n    id: 'closeReferenceSearch',\n    weight: 100 /* KeybindingWeight.EditorContrib */ - 101,\n    primary: 9 /* KeyCode.Escape */,\n    secondary: [1024 /* KeyMod.Shift */ | 9 /* KeyCode.Escape */],\n    when: ContextKeyExpr.and(PeekContext.inPeekEditor, ContextKeyExpr.not('config.editor.stablePeek'))\n});\nKeybindingsRegistry.registerKeybindingRule({\n    id: 'closeReferenceSearch',\n    weight: 200 /* KeybindingWeight.WorkbenchContrib */ + 50,\n    primary: 9 /* KeyCode.Escape */,\n    secondary: [1024 /* KeyMod.Shift */ | 9 /* KeyCode.Escape */],\n    when: ContextKeyExpr.and(ctxReferenceSearchVisible, ContextKeyExpr.not('config.editor.stablePeek'), ContextKeyExpr.or(EditorContextKeys.editorTextFocus, InputFocusedContext.negate()))\n});\nKeybindingsRegistry.registerCommandAndKeybindingRule({\n    id: 'revealReference',\n    weight: 200 /* KeybindingWeight.WorkbenchContrib */,\n    primary: 3 /* KeyCode.Enter */,\n    mac: {\n        primary: 3 /* KeyCode.Enter */,\n        secondary: [2048 /* KeyMod.CtrlCmd */ | 18 /* KeyCode.DownArrow */]\n    },\n    when: ContextKeyExpr.and(ctxReferenceSearchVisible, WorkbenchListFocusContextKey, WorkbenchTreeElementCanCollapse.negate(), WorkbenchTreeElementCanExpand.negate()),\n    handler(accessor) {\n        const listService = accessor.get(IListService);\n        const focus = listService.lastFocusedList?.getFocus();\n        if (Array.isArray(focus) && focus[0] instanceof OneReference) {\n            withController(accessor, controller => controller.revealReference(focus[0]));\n        }\n    }\n});\nKeybindingsRegistry.registerCommandAndKeybindingRule({\n    id: 'openReferenceToSide',\n    weight: 100 /* KeybindingWeight.EditorContrib */,\n    primary: 2048 /* KeyMod.CtrlCmd */ | 3 /* KeyCode.Enter */,\n    mac: {\n        primary: 256 /* KeyMod.WinCtrl */ | 3 /* KeyCode.Enter */\n    },\n    when: ContextKeyExpr.and(ctxReferenceSearchVisible, WorkbenchListFocusContextKey, WorkbenchTreeElementCanCollapse.negate(), WorkbenchTreeElementCanExpand.negate()),\n    handler(accessor) {\n        const listService = accessor.get(IListService);\n        const focus = listService.lastFocusedList?.getFocus();\n        if (Array.isArray(focus) && focus[0] instanceof OneReference) {\n            withController(accessor, controller => controller.openReference(focus[0], true, true));\n        }\n    }\n});\nCommandsRegistry.registerCommand('openReference', (accessor) => {\n    const listService = accessor.get(IListService);\n    const focus = listService.lastFocusedList?.getFocus();\n    if (Array.isArray(focus) && focus[0] instanceof OneReference) {\n        withController(accessor, controller => controller.openReference(focus[0], false, true));\n    }\n});\n\nexport { ReferencesController, ctxReferenceSearchVisible };\n","import { Emitter } from '../../../../base/common/event.js';\nimport { combinedDisposable, DisposableStore, dispose } from '../../../../base/common/lifecycle.js';\nimport { isEqual } from '../../../../base/common/resources.js';\nimport { registerEditorCommand, EditorCommand } from '../../../browser/editorExtensions.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { Range } from '../../../common/core/range.js';\nimport { localize } from '../../../../nls.js';\nimport { RawContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { registerSingleton } from '../../../../platform/instantiation/common/extensions.js';\nimport { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { KeybindingsRegistry } from '../../../../platform/keybinding/common/keybindingsRegistry.js';\nimport { INotificationService } from '../../../../platform/notification/common/notification.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst ctxHasSymbols = new RawContextKey('hasSymbols', false, localize(1095, \"Whether there are symbol locations that can be navigated via keyboard-only.\"));\nconst ISymbolNavigationService = createDecorator('ISymbolNavigationService');\nlet SymbolNavigationService = class SymbolNavigationService {\n    constructor(contextKeyService, _editorService, _notificationService, _keybindingService) {\n        this._editorService = _editorService;\n        this._notificationService = _notificationService;\n        this._keybindingService = _keybindingService;\n        this._currentModel = undefined;\n        this._currentIdx = -1;\n        this._ignoreEditorChange = false;\n        this._ctxHasSymbols = ctxHasSymbols.bindTo(contextKeyService);\n    }\n    reset() {\n        this._ctxHasSymbols.reset();\n        this._currentState?.dispose();\n        this._currentMessage?.close();\n        this._currentModel = undefined;\n        this._currentIdx = -1;\n    }\n    put(anchor) {\n        const refModel = anchor.parent.parent;\n        if (refModel.references.length <= 1) {\n            this.reset();\n            return;\n        }\n        this._currentModel = refModel;\n        this._currentIdx = refModel.references.indexOf(anchor);\n        this._ctxHasSymbols.set(true);\n        this._showMessage();\n        const editorState = new EditorState(this._editorService);\n        const listener = editorState.onDidChange(_ => {\n            if (this._ignoreEditorChange) {\n                return;\n            }\n            const editor = this._editorService.getActiveCodeEditor();\n            if (!editor) {\n                return;\n            }\n            const model = editor.getModel();\n            const position = editor.getPosition();\n            if (!model || !position) {\n                return;\n            }\n            let seenUri = false;\n            let seenPosition = false;\n            for (const reference of refModel.references) {\n                if (isEqual(reference.uri, model.uri)) {\n                    seenUri = true;\n                    seenPosition = seenPosition || Range.containsPosition(reference.range, position);\n                }\n                else if (seenUri) {\n                    break;\n                }\n            }\n            if (!seenUri || !seenPosition) {\n                this.reset();\n            }\n        });\n        this._currentState = combinedDisposable(editorState, listener);\n    }\n    revealNext(source) {\n        if (!this._currentModel) {\n            return Promise.resolve();\n        }\n        // get next result and advance\n        this._currentIdx += 1;\n        this._currentIdx %= this._currentModel.references.length;\n        const reference = this._currentModel.references[this._currentIdx];\n        // status\n        this._showMessage();\n        // open editor, ignore events while that happens\n        this._ignoreEditorChange = true;\n        return this._editorService.openCodeEditor({\n            resource: reference.uri,\n            options: {\n                selection: Range.collapseToStart(reference.range),\n                selectionRevealType: 3 /* TextEditorSelectionRevealType.NearTopIfOutsideViewport */\n            }\n        }, source).finally(() => {\n            this._ignoreEditorChange = false;\n        });\n    }\n    _showMessage() {\n        this._currentMessage?.close();\n        const kb = this._keybindingService.lookupKeybinding('editor.gotoNextSymbolFromResult');\n        const message = kb\n            ? localize(1096, \"Symbol {0} of {1}, {2} for next\", this._currentIdx + 1, this._currentModel.references.length, kb.getLabel())\n            : localize(1097, \"Symbol {0} of {1}\", this._currentIdx + 1, this._currentModel.references.length);\n        this._currentMessage = this._notificationService.status(message);\n    }\n};\nSymbolNavigationService = __decorate([\n    __param(0, IContextKeyService),\n    __param(1, ICodeEditorService),\n    __param(2, INotificationService),\n    __param(3, IKeybindingService)\n], SymbolNavigationService);\nregisterSingleton(ISymbolNavigationService, SymbolNavigationService, 1 /* InstantiationType.Delayed */);\nregisterEditorCommand(new class extends EditorCommand {\n    constructor() {\n        super({\n            id: 'editor.gotoNextSymbolFromResult',\n            precondition: ctxHasSymbols,\n            kbOpts: {\n                weight: 100 /* KeybindingWeight.EditorContrib */,\n                primary: 70 /* KeyCode.F12 */\n            }\n        });\n    }\n    runEditorCommand(accessor, editor) {\n        return accessor.get(ISymbolNavigationService).revealNext(editor);\n    }\n});\nKeybindingsRegistry.registerCommandAndKeybindingRule({\n    id: 'editor.gotoNextSymbolFromResult.cancel',\n    weight: 100 /* KeybindingWeight.EditorContrib */,\n    when: ctxHasSymbols,\n    primary: 9 /* KeyCode.Escape */,\n    handler(accessor) {\n        accessor.get(ISymbolNavigationService).reset();\n    }\n});\n//\nlet EditorState = class EditorState {\n    constructor(editorService) {\n        this._listener = new Map();\n        this._disposables = new DisposableStore();\n        this._onDidChange = new Emitter();\n        this.onDidChange = this._onDidChange.event;\n        this._disposables.add(editorService.onCodeEditorRemove(this._onDidRemoveEditor, this));\n        this._disposables.add(editorService.onCodeEditorAdd(this._onDidAddEditor, this));\n        editorService.listCodeEditors().forEach(this._onDidAddEditor, this);\n    }\n    dispose() {\n        this._disposables.dispose();\n        this._onDidChange.dispose();\n        dispose(this._listener.values());\n    }\n    _onDidAddEditor(editor) {\n        this._listener.set(editor, combinedDisposable(editor.onDidChangeCursorPosition(_ => this._onDidChange.fire({ editor })), editor.onDidChangeModelContent(_ => this._onDidChange.fire({ editor }))));\n    }\n    _onDidRemoveEditor(editor) {\n        this._listener.get(editor)?.dispose();\n        this._listener.delete(editor);\n    }\n};\nEditorState = __decorate([\n    __param(0, ICodeEditorService)\n], EditorState);\n\nexport { ISymbolNavigationService, ctxHasSymbols };\n","import { coalesce } from '../../../../base/common/arrays.js';\nimport { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { matchesSomeScheme, Schemas } from '../../../../base/common/network.js';\nimport { registerModelAndPositionCommand } from '../../../browser/editorExtensions.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { ReferencesModel } from './referencesModel.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction shouldIncludeLocationLink(sourceModel, loc) {\n    // Always allow the location if the request comes from a document with the same scheme.\n    if (loc.uri.scheme === sourceModel.uri.scheme) {\n        return true;\n    }\n    // Otherwise filter out locations from internal schemes\n    if (matchesSomeScheme(loc.uri, Schemas.walkThroughSnippet, Schemas.vscodeChatCodeBlock, Schemas.vscodeChatCodeCompareBlock)) {\n        return false;\n    }\n    return true;\n}\nasync function getLocationLinks(model, position, registry, recursive, provide) {\n    const provider = registry.ordered(model, recursive);\n    // get results\n    const promises = provider.map((provider) => {\n        return Promise.resolve(provide(provider, model, position)).then(undefined, err => {\n            onUnexpectedExternalError(err);\n            return undefined;\n        });\n    });\n    const values = await Promise.all(promises);\n    return coalesce(values.flat()).filter(loc => shouldIncludeLocationLink(model, loc));\n}\nfunction getDefinitionsAtPosition(registry, model, position, recursive, token) {\n    return getLocationLinks(model, position, registry, recursive, (provider, model, position) => {\n        return provider.provideDefinition(model, position, token);\n    });\n}\nfunction getDeclarationsAtPosition(registry, model, position, recursive, token) {\n    return getLocationLinks(model, position, registry, recursive, (provider, model, position) => {\n        return provider.provideDeclaration(model, position, token);\n    });\n}\nfunction getImplementationsAtPosition(registry, model, position, recursive, token) {\n    return getLocationLinks(model, position, registry, recursive, (provider, model, position) => {\n        return provider.provideImplementation(model, position, token);\n    });\n}\nfunction getTypeDefinitionsAtPosition(registry, model, position, recursive, token) {\n    return getLocationLinks(model, position, registry, recursive, (provider, model, position) => {\n        return provider.provideTypeDefinition(model, position, token);\n    });\n}\nfunction getReferencesAtPosition(registry, model, position, compact, recursive, token) {\n    return getLocationLinks(model, position, registry, recursive, async (provider, model, position) => {\n        const result = (await provider.provideReferences(model, position, { includeDeclaration: true }, token))?.filter(ref => shouldIncludeLocationLink(model, ref));\n        if (!compact || !result || result.length !== 2) {\n            return result;\n        }\n        const resultWithoutDeclaration = (await provider.provideReferences(model, position, { includeDeclaration: false }, token))?.filter(ref => shouldIncludeLocationLink(model, ref));\n        if (resultWithoutDeclaration && resultWithoutDeclaration.length === 1) {\n            return resultWithoutDeclaration;\n        }\n        return result;\n    });\n}\n// -- API commands ----\nasync function _sortedAndDeduped(callback) {\n    const rawLinks = await callback();\n    const model = new ReferencesModel(rawLinks, '');\n    const modelLinks = model.references.map(ref => ref.link);\n    model.dispose();\n    return modelLinks;\n}\nregisterModelAndPositionCommand('_executeDefinitionProvider', (accessor, model, position) => {\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const promise = getDefinitionsAtPosition(languageFeaturesService.definitionProvider, model, position, false, CancellationToken.None);\n    return _sortedAndDeduped(() => promise);\n});\nregisterModelAndPositionCommand('_executeDefinitionProvider_recursive', (accessor, model, position) => {\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const promise = getDefinitionsAtPosition(languageFeaturesService.definitionProvider, model, position, true, CancellationToken.None);\n    return _sortedAndDeduped(() => promise);\n});\nregisterModelAndPositionCommand('_executeTypeDefinitionProvider', (accessor, model, position) => {\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const promise = getTypeDefinitionsAtPosition(languageFeaturesService.typeDefinitionProvider, model, position, false, CancellationToken.None);\n    return _sortedAndDeduped(() => promise);\n});\nregisterModelAndPositionCommand('_executeTypeDefinitionProvider_recursive', (accessor, model, position) => {\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const promise = getTypeDefinitionsAtPosition(languageFeaturesService.typeDefinitionProvider, model, position, true, CancellationToken.None);\n    return _sortedAndDeduped(() => promise);\n});\nregisterModelAndPositionCommand('_executeDeclarationProvider', (accessor, model, position) => {\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const promise = getDeclarationsAtPosition(languageFeaturesService.declarationProvider, model, position, false, CancellationToken.None);\n    return _sortedAndDeduped(() => promise);\n});\nregisterModelAndPositionCommand('_executeDeclarationProvider_recursive', (accessor, model, position) => {\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const promise = getDeclarationsAtPosition(languageFeaturesService.declarationProvider, model, position, true, CancellationToken.None);\n    return _sortedAndDeduped(() => promise);\n});\nregisterModelAndPositionCommand('_executeReferenceProvider', (accessor, model, position) => {\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const promise = getReferencesAtPosition(languageFeaturesService.referenceProvider, model, position, false, false, CancellationToken.None);\n    return _sortedAndDeduped(() => promise);\n});\nregisterModelAndPositionCommand('_executeReferenceProvider_recursive', (accessor, model, position) => {\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const promise = getReferencesAtPosition(languageFeaturesService.referenceProvider, model, position, false, true, CancellationToken.None);\n    return _sortedAndDeduped(() => promise);\n});\nregisterModelAndPositionCommand('_executeImplementationProvider', (accessor, model, position) => {\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const promise = getImplementationsAtPosition(languageFeaturesService.implementationProvider, model, position, false, CancellationToken.None);\n    return _sortedAndDeduped(() => promise);\n});\nregisterModelAndPositionCommand('_executeImplementationProvider_recursive', (accessor, model, position) => {\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const promise = getImplementationsAtPosition(languageFeaturesService.implementationProvider, model, position, true, CancellationToken.None);\n    return _sortedAndDeduped(() => promise);\n});\n\nexport { getDeclarationsAtPosition, getDefinitionsAtPosition, getImplementationsAtPosition, getReferencesAtPosition, getTypeDefinitionsAtPosition };\n","import { alert } from '../../../../base/browser/ui/aria/aria.js';\nimport { raceCancellation, createCancelablePromise } from '../../../../base/common/async.js';\nimport { KeyChord } from '../../../../base/common/keyCodes.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { EditorStateCancellationTokenSource } from '../../editorState/browser/editorState.js';\nimport { isCodeEditor } from '../../../browser/editorBrowser.js';\nimport { EditorAction2 } from '../../../browser/editorExtensions.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { EmbeddedCodeEditorWidget } from '../../../browser/widget/codeEditor/embeddedCodeEditorWidget.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { isLocationLink } from '../../../common/languages.js';\nimport { ReferencesController } from './peek/referencesController.js';\nimport { ReferencesModel } from './referencesModel.js';\nimport { ISymbolNavigationService } from './symbolNavigation.js';\nimport { MessageController } from '../../message/browser/messageController.js';\nimport { PeekContext } from '../../peekView/browser/peekView.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { MenuRegistry, MenuId, registerAction2 } from '../../../../platform/actions/common/actions.js';\nimport { CommandsRegistry, ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { INotificationService } from '../../../../platform/notification/common/notification.js';\nimport { IEditorProgressService } from '../../../../platform/progress/common/progress.js';\nimport { getReferencesAtPosition, getDefinitionsAtPosition, getDeclarationsAtPosition, getTypeDefinitionsAtPosition, getImplementationsAtPosition } from './goToSymbol.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { Iterable } from '../../../../base/common/iterator.js';\nimport { IsWebContext } from '../../../../platform/contextkey/common/contextkeys.js';\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 *--------------------------------------------------------------------------------------------*/\nMenuRegistry.appendMenuItem(MenuId.EditorContext, {\n    submenu: MenuId.EditorContextPeek,\n    title: localize(1038, \"Peek\"),\n    group: 'navigation',\n    order: 100\n});\nclass SymbolNavigationAnchor {\n    static is(thing) {\n        if (!thing || typeof thing !== 'object') {\n            return false;\n        }\n        if (thing instanceof SymbolNavigationAnchor) {\n            return true;\n        }\n        if (Position.isIPosition(thing.position) && thing.model) {\n            return true;\n        }\n        return false;\n    }\n    constructor(model, position) {\n        this.model = model;\n        this.position = position;\n    }\n}\nclass SymbolNavigationAction extends EditorAction2 {\n    static { this._allSymbolNavigationCommands = new Map(); }\n    static { this._activeAlternativeCommands = new Set(); }\n    static all() {\n        return SymbolNavigationAction._allSymbolNavigationCommands.values();\n    }\n    static _patchConfig(opts) {\n        const result = { ...opts, f1: true };\n        // patch context menu when clause\n        if (result.menu) {\n            for (const item of Iterable.wrap(result.menu)) {\n                if (item.id === MenuId.EditorContext || item.id === MenuId.EditorContextPeek) {\n                    item.when = ContextKeyExpr.and(opts.precondition, item.when);\n                }\n            }\n        }\n        return result;\n    }\n    constructor(configuration, opts) {\n        super(SymbolNavigationAction._patchConfig(opts));\n        this.configuration = configuration;\n        SymbolNavigationAction._allSymbolNavigationCommands.set(opts.id, this);\n    }\n    runEditorCommand(accessor, editor, arg, range) {\n        if (!editor.hasModel()) {\n            return Promise.resolve(undefined);\n        }\n        const notificationService = accessor.get(INotificationService);\n        const editorService = accessor.get(ICodeEditorService);\n        const progressService = accessor.get(IEditorProgressService);\n        const symbolNavService = accessor.get(ISymbolNavigationService);\n        const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n        const instaService = accessor.get(IInstantiationService);\n        const model = editor.getModel();\n        const position = editor.getPosition();\n        const anchor = SymbolNavigationAnchor.is(arg) ? arg : new SymbolNavigationAnchor(model, position);\n        const cts = new EditorStateCancellationTokenSource(editor, 1 /* CodeEditorStateFlag.Value */ | 4 /* CodeEditorStateFlag.Position */);\n        const promise = raceCancellation(this._getLocationModel(languageFeaturesService, anchor.model, anchor.position, cts.token), cts.token).then(async (references) => {\n            if (!references || cts.token.isCancellationRequested) {\n                return;\n            }\n            alert(references.ariaMessage);\n            let altAction;\n            if (references.referenceAt(model.uri, position)) {\n                const altActionId = this._getAlternativeCommand(editor);\n                if (altActionId !== undefined && !SymbolNavigationAction._activeAlternativeCommands.has(altActionId) && SymbolNavigationAction._allSymbolNavigationCommands.has(altActionId)) {\n                    altAction = SymbolNavigationAction._allSymbolNavigationCommands.get(altActionId);\n                }\n            }\n            const referenceCount = references.references.length;\n            if (referenceCount === 0) {\n                // no result -> show message\n                if (!this.configuration.muteMessage) {\n                    const info = model.getWordAtPosition(position);\n                    MessageController.get(editor)?.showMessage(this._getNoResultFoundMessage(info), position);\n                }\n            }\n            else if (referenceCount === 1 && altAction) {\n                // already at the only result, run alternative\n                SymbolNavigationAction._activeAlternativeCommands.add(this.desc.id);\n                instaService.invokeFunction((accessor) => altAction.runEditorCommand(accessor, editor, arg, range).finally(() => {\n                    SymbolNavigationAction._activeAlternativeCommands.delete(this.desc.id);\n                }));\n            }\n            else {\n                // normal results handling\n                return this._onResult(editorService, symbolNavService, editor, references, range);\n            }\n        }, (err) => {\n            // report an error\n            notificationService.error(err);\n        }).finally(() => {\n            cts.dispose();\n        });\n        progressService.showWhile(promise, 250);\n        return promise;\n    }\n    async _onResult(editorService, symbolNavService, editor, model, range) {\n        const gotoLocation = this._getGoToPreference(editor);\n        if (!(editor instanceof EmbeddedCodeEditorWidget) && (this.configuration.openInPeek || (gotoLocation === 'peek' && model.references.length > 1))) {\n            this._openInPeek(editor, model, range);\n        }\n        else {\n            const next = model.firstReference();\n            const peek = model.references.length > 1 && gotoLocation === 'gotoAndPeek';\n            const targetEditor = await this._openReference(editor, editorService, next, this.configuration.openToSide, !peek);\n            if (peek && targetEditor) {\n                this._openInPeek(targetEditor, model, range);\n            }\n            else {\n                model.dispose();\n            }\n            // keep remaining locations around when using\n            // 'goto'-mode\n            if (gotoLocation === 'goto') {\n                symbolNavService.put(next);\n            }\n        }\n    }\n    async _openReference(editor, editorService, reference, sideBySide, highlight) {\n        // range is the target-selection-range when we have one\n        // and the fallback is the 'full' range\n        let range = undefined;\n        if (isLocationLink(reference)) {\n            range = reference.targetSelectionRange;\n        }\n        if (!range) {\n            range = reference.range;\n        }\n        if (!range) {\n            return undefined;\n        }\n        const targetEditor = await editorService.openCodeEditor({\n            resource: reference.uri,\n            options: {\n                selection: Range.collapseToStart(range),\n                selectionRevealType: 3 /* TextEditorSelectionRevealType.NearTopIfOutsideViewport */,\n                selectionSource: \"code.jump\" /* TextEditorSelectionSource.JUMP */\n            }\n        }, editor, sideBySide);\n        if (!targetEditor) {\n            return undefined;\n        }\n        if (highlight) {\n            const modelNow = targetEditor.getModel();\n            const decorations = targetEditor.createDecorationsCollection([{ range, options: { description: 'symbol-navigate-action-highlight', className: 'symbolHighlight' } }]);\n            setTimeout(() => {\n                if (targetEditor.getModel() === modelNow) {\n                    decorations.clear();\n                }\n            }, 350);\n        }\n        return targetEditor;\n    }\n    _openInPeek(target, model, range) {\n        const controller = ReferencesController.get(target);\n        if (controller && target.hasModel()) {\n            controller.toggleWidget(range ?? target.getSelection(), createCancelablePromise(_ => Promise.resolve(model)), this.configuration.openInPeek);\n        }\n        else {\n            model.dispose();\n        }\n    }\n}\n//#region --- DEFINITION\nclass DefinitionAction extends SymbolNavigationAction {\n    async _getLocationModel(languageFeaturesService, model, position, token) {\n        return new ReferencesModel(await getDefinitionsAtPosition(languageFeaturesService.definitionProvider, model, position, false, token), localize(1039, 'Definitions'));\n    }\n    _getNoResultFoundMessage(info) {\n        return info && info.word\n            ? localize(1040, \"No definition found for '{0}'\", info.word)\n            : localize(1041, \"No definition found\");\n    }\n    _getAlternativeCommand(editor) {\n        return editor.getOption(67 /* EditorOption.gotoLocation */).alternativeDefinitionCommand;\n    }\n    _getGoToPreference(editor) {\n        return editor.getOption(67 /* EditorOption.gotoLocation */).multipleDefinitions;\n    }\n}\nregisterAction2(class GoToDefinitionAction extends DefinitionAction {\n    static { this.id = 'editor.action.revealDefinition'; }\n    constructor() {\n        super({\n            openToSide: false,\n            openInPeek: false,\n            muteMessage: false\n        }, {\n            id: GoToDefinitionAction.id,\n            title: {\n                ...localize2(1065, \"Go to Definition\"),\n                mnemonicTitle: localize(1042, \"Go to &&Definition\"),\n            },\n            precondition: EditorContextKeys.hasDefinitionProvider,\n            keybinding: [{\n                    when: EditorContextKeys.editorTextFocus,\n                    primary: 70 /* KeyCode.F12 */,\n                    weight: 100 /* KeybindingWeight.EditorContrib */\n                }, {\n                    when: ContextKeyExpr.and(EditorContextKeys.editorTextFocus, IsWebContext),\n                    primary: 2048 /* KeyMod.CtrlCmd */ | 70 /* KeyCode.F12 */,\n                    weight: 100 /* KeybindingWeight.EditorContrib */\n                }],\n            menu: [{\n                    id: MenuId.EditorContext,\n                    group: 'navigation',\n                    order: 1.1\n                }, {\n                    id: MenuId.MenubarGoMenu,\n                    precondition: null,\n                    group: '4_symbol_nav',\n                    order: 2,\n                }]\n        });\n        CommandsRegistry.registerCommandAlias('editor.action.goToDeclaration', GoToDefinitionAction.id);\n    }\n});\nregisterAction2(class OpenDefinitionToSideAction extends DefinitionAction {\n    static { this.id = 'editor.action.revealDefinitionAside'; }\n    constructor() {\n        super({\n            openToSide: true,\n            openInPeek: false,\n            muteMessage: false\n        }, {\n            id: OpenDefinitionToSideAction.id,\n            title: localize2(1066, \"Open Definition to the Side\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.hasDefinitionProvider, EditorContextKeys.isInEmbeddedEditor.toNegated()),\n            keybinding: [{\n                    when: EditorContextKeys.editorTextFocus,\n                    primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 70 /* KeyCode.F12 */),\n                    weight: 100 /* KeybindingWeight.EditorContrib */\n                }, {\n                    when: ContextKeyExpr.and(EditorContextKeys.editorTextFocus, IsWebContext),\n                    primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 70 /* KeyCode.F12 */),\n                    weight: 100 /* KeybindingWeight.EditorContrib */\n                }]\n        });\n        CommandsRegistry.registerCommandAlias('editor.action.openDeclarationToTheSide', OpenDefinitionToSideAction.id);\n    }\n});\nregisterAction2(class PeekDefinitionAction extends DefinitionAction {\n    static { this.id = 'editor.action.peekDefinition'; }\n    constructor() {\n        super({\n            openToSide: false,\n            openInPeek: true,\n            muteMessage: false\n        }, {\n            id: PeekDefinitionAction.id,\n            title: localize2(1067, \"Peek Definition\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.hasDefinitionProvider, PeekContext.notInPeekEditor, EditorContextKeys.isInEmbeddedEditor.toNegated()),\n            keybinding: {\n                when: EditorContextKeys.editorTextFocus,\n                primary: 512 /* KeyMod.Alt */ | 70 /* KeyCode.F12 */,\n                linux: { primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 68 /* KeyCode.F10 */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menu: {\n                id: MenuId.EditorContextPeek,\n                group: 'peek',\n                order: 2\n            }\n        });\n        CommandsRegistry.registerCommandAlias('editor.action.previewDeclaration', PeekDefinitionAction.id);\n    }\n});\n//#endregion\n//#region --- DECLARATION\nclass DeclarationAction extends SymbolNavigationAction {\n    async _getLocationModel(languageFeaturesService, model, position, token) {\n        return new ReferencesModel(await getDeclarationsAtPosition(languageFeaturesService.declarationProvider, model, position, false, token), localize(1043, 'Declarations'));\n    }\n    _getNoResultFoundMessage(info) {\n        return info && info.word\n            ? localize(1044, \"No declaration found for '{0}'\", info.word)\n            : localize(1045, \"No declaration found\");\n    }\n    _getAlternativeCommand(editor) {\n        return editor.getOption(67 /* EditorOption.gotoLocation */).alternativeDeclarationCommand;\n    }\n    _getGoToPreference(editor) {\n        return editor.getOption(67 /* EditorOption.gotoLocation */).multipleDeclarations;\n    }\n}\nregisterAction2(class GoToDeclarationAction extends DeclarationAction {\n    static { this.id = 'editor.action.revealDeclaration'; }\n    constructor() {\n        super({\n            openToSide: false,\n            openInPeek: false,\n            muteMessage: false\n        }, {\n            id: GoToDeclarationAction.id,\n            title: {\n                ...localize2(1068, \"Go to Declaration\"),\n                mnemonicTitle: localize(1046, \"Go to &&Declaration\"),\n            },\n            precondition: ContextKeyExpr.and(EditorContextKeys.hasDeclarationProvider, EditorContextKeys.isInEmbeddedEditor.toNegated()),\n            menu: [{\n                    id: MenuId.EditorContext,\n                    group: 'navigation',\n                    order: 1.3\n                }, {\n                    id: MenuId.MenubarGoMenu,\n                    precondition: null,\n                    group: '4_symbol_nav',\n                    order: 3,\n                }],\n        });\n    }\n    _getNoResultFoundMessage(info) {\n        return info && info.word\n            ? localize(1047, \"No declaration found for '{0}'\", info.word)\n            : localize(1048, \"No declaration found\");\n    }\n});\nregisterAction2(class PeekDeclarationAction extends DeclarationAction {\n    constructor() {\n        super({\n            openToSide: false,\n            openInPeek: true,\n            muteMessage: false\n        }, {\n            id: 'editor.action.peekDeclaration',\n            title: localize2(1069, \"Peek Declaration\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.hasDeclarationProvider, PeekContext.notInPeekEditor, EditorContextKeys.isInEmbeddedEditor.toNegated()),\n            menu: {\n                id: MenuId.EditorContextPeek,\n                group: 'peek',\n                order: 3\n            }\n        });\n    }\n});\n//#endregion\n//#region --- TYPE DEFINITION\nclass TypeDefinitionAction extends SymbolNavigationAction {\n    async _getLocationModel(languageFeaturesService, model, position, token) {\n        return new ReferencesModel(await getTypeDefinitionsAtPosition(languageFeaturesService.typeDefinitionProvider, model, position, false, token), localize(1049, 'Type Definitions'));\n    }\n    _getNoResultFoundMessage(info) {\n        return info && info.word\n            ? localize(1050, \"No type definition found for '{0}'\", info.word)\n            : localize(1051, \"No type definition found\");\n    }\n    _getAlternativeCommand(editor) {\n        return editor.getOption(67 /* EditorOption.gotoLocation */).alternativeTypeDefinitionCommand;\n    }\n    _getGoToPreference(editor) {\n        return editor.getOption(67 /* EditorOption.gotoLocation */).multipleTypeDefinitions;\n    }\n}\nregisterAction2(class GoToTypeDefinitionAction extends TypeDefinitionAction {\n    static { this.ID = 'editor.action.goToTypeDefinition'; }\n    constructor() {\n        super({\n            openToSide: false,\n            openInPeek: false,\n            muteMessage: false\n        }, {\n            id: GoToTypeDefinitionAction.ID,\n            title: {\n                ...localize2(1070, \"Go to Type Definition\"),\n                mnemonicTitle: localize(1052, \"Go to &&Type Definition\"),\n            },\n            precondition: EditorContextKeys.hasTypeDefinitionProvider,\n            keybinding: {\n                when: EditorContextKeys.editorTextFocus,\n                primary: 0,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menu: [{\n                    id: MenuId.EditorContext,\n                    group: 'navigation',\n                    order: 1.4\n                }, {\n                    id: MenuId.MenubarGoMenu,\n                    precondition: null,\n                    group: '4_symbol_nav',\n                    order: 3,\n                }]\n        });\n    }\n});\nregisterAction2(class PeekTypeDefinitionAction extends TypeDefinitionAction {\n    static { this.ID = 'editor.action.peekTypeDefinition'; }\n    constructor() {\n        super({\n            openToSide: false,\n            openInPeek: true,\n            muteMessage: false\n        }, {\n            id: PeekTypeDefinitionAction.ID,\n            title: localize2(1071, \"Peek Type Definition\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.hasTypeDefinitionProvider, PeekContext.notInPeekEditor, EditorContextKeys.isInEmbeddedEditor.toNegated()),\n            menu: {\n                id: MenuId.EditorContextPeek,\n                group: 'peek',\n                order: 4\n            }\n        });\n    }\n});\n//#endregion\n//#region --- IMPLEMENTATION\nclass ImplementationAction extends SymbolNavigationAction {\n    async _getLocationModel(languageFeaturesService, model, position, token) {\n        return new ReferencesModel(await getImplementationsAtPosition(languageFeaturesService.implementationProvider, model, position, false, token), localize(1053, 'Implementations'));\n    }\n    _getNoResultFoundMessage(info) {\n        return info && info.word\n            ? localize(1054, \"No implementation found for '{0}'\", info.word)\n            : localize(1055, \"No implementation found\");\n    }\n    _getAlternativeCommand(editor) {\n        return editor.getOption(67 /* EditorOption.gotoLocation */).alternativeImplementationCommand;\n    }\n    _getGoToPreference(editor) {\n        return editor.getOption(67 /* EditorOption.gotoLocation */).multipleImplementations;\n    }\n}\nregisterAction2(class GoToImplementationAction extends ImplementationAction {\n    static { this.ID = 'editor.action.goToImplementation'; }\n    constructor() {\n        super({\n            openToSide: false,\n            openInPeek: false,\n            muteMessage: false\n        }, {\n            id: GoToImplementationAction.ID,\n            title: {\n                ...localize2(1072, \"Go to Implementations\"),\n                mnemonicTitle: localize(1056, \"Go to &&Implementations\"),\n            },\n            precondition: EditorContextKeys.hasImplementationProvider,\n            keybinding: {\n                when: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 70 /* KeyCode.F12 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menu: [{\n                    id: MenuId.EditorContext,\n                    group: 'navigation',\n                    order: 1.45\n                }, {\n                    id: MenuId.MenubarGoMenu,\n                    precondition: null,\n                    group: '4_symbol_nav',\n                    order: 4,\n                }]\n        });\n    }\n});\nregisterAction2(class PeekImplementationAction extends ImplementationAction {\n    static { this.ID = 'editor.action.peekImplementation'; }\n    constructor() {\n        super({\n            openToSide: false,\n            openInPeek: true,\n            muteMessage: false\n        }, {\n            id: PeekImplementationAction.ID,\n            title: localize2(1073, \"Peek Implementations\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.hasImplementationProvider, PeekContext.notInPeekEditor, EditorContextKeys.isInEmbeddedEditor.toNegated()),\n            keybinding: {\n                when: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 70 /* KeyCode.F12 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menu: {\n                id: MenuId.EditorContextPeek,\n                group: 'peek',\n                order: 5\n            }\n        });\n    }\n});\n//#endregion\n//#region --- REFERENCES\nclass ReferencesAction extends SymbolNavigationAction {\n    _getNoResultFoundMessage(info) {\n        return info\n            ? localize(1057, \"No references found for '{0}'\", info.word)\n            : localize(1058, \"No references found\");\n    }\n    _getAlternativeCommand(editor) {\n        return editor.getOption(67 /* EditorOption.gotoLocation */).alternativeReferenceCommand;\n    }\n    _getGoToPreference(editor) {\n        return editor.getOption(67 /* EditorOption.gotoLocation */).multipleReferences;\n    }\n}\nregisterAction2(class GoToReferencesAction extends ReferencesAction {\n    constructor() {\n        super({\n            openToSide: false,\n            openInPeek: false,\n            muteMessage: false\n        }, {\n            id: 'editor.action.goToReferences',\n            title: {\n                ...localize2(1074, \"Go to References\"),\n                mnemonicTitle: localize(1059, \"Go to &&References\"),\n            },\n            precondition: ContextKeyExpr.and(EditorContextKeys.hasReferenceProvider, PeekContext.notInPeekEditor, EditorContextKeys.isInEmbeddedEditor.toNegated()),\n            keybinding: {\n                when: EditorContextKeys.editorTextFocus,\n                primary: 1024 /* KeyMod.Shift */ | 70 /* KeyCode.F12 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menu: [{\n                    id: MenuId.EditorContext,\n                    group: 'navigation',\n                    order: 1.45\n                }, {\n                    id: MenuId.MenubarGoMenu,\n                    precondition: null,\n                    group: '4_symbol_nav',\n                    order: 5,\n                }]\n        });\n    }\n    async _getLocationModel(languageFeaturesService, model, position, token) {\n        return new ReferencesModel(await getReferencesAtPosition(languageFeaturesService.referenceProvider, model, position, true, false, token), localize(1060, 'References'));\n    }\n});\nregisterAction2(class PeekReferencesAction extends ReferencesAction {\n    constructor() {\n        super({\n            openToSide: false,\n            openInPeek: true,\n            muteMessage: false\n        }, {\n            id: 'editor.action.referenceSearch.trigger',\n            title: localize2(1075, \"Peek References\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.hasReferenceProvider, PeekContext.notInPeekEditor, EditorContextKeys.isInEmbeddedEditor.toNegated()),\n            menu: {\n                id: MenuId.EditorContextPeek,\n                group: 'peek',\n                order: 6\n            }\n        });\n    }\n    async _getLocationModel(languageFeaturesService, model, position, token) {\n        return new ReferencesModel(await getReferencesAtPosition(languageFeaturesService.referenceProvider, model, position, false, false, token), localize(1061, 'References'));\n    }\n});\n//#endregion\n//#region --- GENERIC goto symbols command\nclass GenericGoToLocationAction extends SymbolNavigationAction {\n    constructor(config, _references, _gotoMultipleBehaviour) {\n        super(config, {\n            id: 'editor.action.goToLocation',\n            title: localize2(1076, \"Go to Any Symbol\"),\n            precondition: ContextKeyExpr.and(PeekContext.notInPeekEditor, EditorContextKeys.isInEmbeddedEditor.toNegated()),\n        });\n        this._references = _references;\n        this._gotoMultipleBehaviour = _gotoMultipleBehaviour;\n    }\n    async _getLocationModel(languageFeaturesService, _model, _position, _token) {\n        return new ReferencesModel(this._references, localize(1062, 'Locations'));\n    }\n    _getNoResultFoundMessage(info) {\n        return info && localize(1063, \"No results for '{0}'\", info.word) || '';\n    }\n    _getGoToPreference(editor) {\n        return this._gotoMultipleBehaviour ?? editor.getOption(67 /* EditorOption.gotoLocation */).multipleReferences;\n    }\n    _getAlternativeCommand() {\n        return undefined;\n    }\n}\nCommandsRegistry.registerCommand({\n    id: 'editor.action.goToLocations',\n    metadata: {\n        description: 'Go to locations from a position in a file',\n        args: [\n            { name: 'uri', description: 'The text document in which to start', constraint: URI },\n            { name: 'position', description: 'The position at which to start', constraint: Position.isIPosition },\n            { name: 'locations', description: 'An array of locations.', constraint: Array },\n            { name: 'multiple', description: 'Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto`' },\n            { name: 'noResultsMessage', description: 'Human readable message that shows when locations is empty.' },\n        ]\n    },\n    handler: async (accessor, resource, position, references, multiple, noResultsMessage, openInPeek) => {\n        assertType(URI.isUri(resource));\n        assertType(Position.isIPosition(position));\n        assertType(Array.isArray(references));\n        assertType(typeof multiple === 'undefined' || typeof multiple === 'string');\n        assertType(typeof openInPeek === 'undefined' || typeof openInPeek === 'boolean');\n        const editorService = accessor.get(ICodeEditorService);\n        const editor = await editorService.openCodeEditor({ resource }, editorService.getFocusedCodeEditor());\n        if (isCodeEditor(editor)) {\n            editor.setPosition(position);\n            editor.revealPositionInCenterIfOutsideViewport(position, 0 /* ScrollType.Smooth */);\n            return editor.invokeWithinContext(accessor => {\n                const command = new class extends GenericGoToLocationAction {\n                    _getNoResultFoundMessage(info) {\n                        return noResultsMessage || super._getNoResultFoundMessage(info);\n                    }\n                }({\n                    muteMessage: !Boolean(noResultsMessage),\n                    openInPeek: Boolean(openInPeek),\n                    openToSide: false\n                }, references, multiple);\n                accessor.get(IInstantiationService).invokeFunction(command.run.bind(command), editor);\n            });\n        }\n    }\n});\nCommandsRegistry.registerCommand({\n    id: 'editor.action.peekLocations',\n    metadata: {\n        description: 'Peek locations from a position in a file',\n        args: [\n            { name: 'uri', description: 'The text document in which to start', constraint: URI },\n            { name: 'position', description: 'The position at which to start', constraint: Position.isIPosition },\n            { name: 'locations', description: 'An array of locations.', constraint: Array },\n            { name: 'multiple', description: 'Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto`' },\n        ]\n    },\n    handler: async (accessor, resource, position, references, multiple) => {\n        accessor.get(ICommandService).executeCommand('editor.action.goToLocations', resource, position, references, multiple, undefined, true);\n    }\n});\n//#endregion\n//#region --- REFERENCE search special commands\nCommandsRegistry.registerCommand({\n    id: 'editor.action.findReferences',\n    handler: (accessor, resource, position) => {\n        assertType(URI.isUri(resource));\n        assertType(Position.isIPosition(position));\n        const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n        const codeEditorService = accessor.get(ICodeEditorService);\n        return codeEditorService.openCodeEditor({ resource }, codeEditorService.getFocusedCodeEditor()).then(control => {\n            if (!isCodeEditor(control) || !control.hasModel()) {\n                return undefined;\n            }\n            const controller = ReferencesController.get(control);\n            if (!controller) {\n                return undefined;\n            }\n            const references = createCancelablePromise(token => getReferencesAtPosition(languageFeaturesService.referenceProvider, control.getModel(), Position.lift(position), false, false, token).then(references => new ReferencesModel(references, localize(1064, 'References'))));\n            const range = new Range(position.lineNumber, position.column, position.lineNumber, position.column);\n            return Promise.resolve(controller.toggleWidget(range, references, false));\n        });\n    }\n});\n// use NEW command\nCommandsRegistry.registerCommandAlias('editor.action.showReferences', 'editor.action.peekLocations');\n//#endregion\n\nexport { DefinitionAction, SymbolNavigationAction, SymbolNavigationAnchor };\n","import { getDomNodePagePosition } from '../../../../base/browser/dom.js';\nimport { Action, Separator } from '../../../../base/common/actions.js';\nimport { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { generateUuid } from '../../../../base/common/uuid.js';\nimport { Range } from '../../../common/core/range.js';\nimport { ITextModelService } from '../../../common/services/resolverService.js';\nimport { DefinitionAction, SymbolNavigationAnchor, SymbolNavigationAction } from '../../gotoSymbol/browser/goToCommands.js';\nimport { PeekContext } from '../../peekView/browser/peekView.js';\nimport { MenuRegistry, MenuId, isIMenuItem, MenuItemAction } from '../../../../platform/actions/common/actions.js';\nimport { ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IContextMenuService } from '../../../../platform/contextview/browser/contextView.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { INotificationService, Severity } from '../../../../platform/notification/common/notification.js';\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 *--------------------------------------------------------------------------------------------*/\nasync function showGoToContextMenu(accessor, editor, anchor, part) {\n    const resolverService = accessor.get(ITextModelService);\n    const contextMenuService = accessor.get(IContextMenuService);\n    const commandService = accessor.get(ICommandService);\n    const instaService = accessor.get(IInstantiationService);\n    const notificationService = accessor.get(INotificationService);\n    await part.item.resolve(CancellationToken.None);\n    if (!part.part.location) {\n        return;\n    }\n    const location = part.part.location;\n    const menuActions = [];\n    // from all registered (not active) context menu actions select those\n    // that are a symbol navigation actions\n    const filter = new Set(MenuRegistry.getMenuItems(MenuId.EditorContext)\n        .map(item => isIMenuItem(item) ? item.command.id : generateUuid()));\n    for (const delegate of SymbolNavigationAction.all()) {\n        if (filter.has(delegate.desc.id)) {\n            menuActions.push(new Action(delegate.desc.id, MenuItemAction.label(delegate.desc, { renderShortTitle: true }), undefined, true, async () => {\n                const ref = await resolverService.createModelReference(location.uri);\n                try {\n                    const symbolAnchor = new SymbolNavigationAnchor(ref.object.textEditorModel, Range.getStartPosition(location.range));\n                    const range = part.item.anchor.range;\n                    await instaService.invokeFunction(delegate.runEditorCommand.bind(delegate), editor, symbolAnchor, range);\n                }\n                finally {\n                    ref.dispose();\n                }\n            }));\n        }\n    }\n    if (part.part.command) {\n        const { command } = part.part;\n        menuActions.push(new Separator());\n        menuActions.push(new Action(command.id, command.title, undefined, true, async () => {\n            try {\n                await commandService.executeCommand(command.id, ...(command.arguments ?? []));\n            }\n            catch (err) {\n                notificationService.notify({\n                    severity: Severity.Error,\n                    source: part.item.provider.displayName,\n                    message: err\n                });\n            }\n        }));\n    }\n    // show context menu\n    const useShadowDOM = editor.getOption(144 /* EditorOption.useShadowDOM */);\n    contextMenuService.showContextMenu({\n        domForShadowRoot: useShadowDOM ? editor.getDomNode() ?? undefined : undefined,\n        getAnchor: () => {\n            const box = getDomNodePagePosition(anchor);\n            return { x: box.left, y: box.top + box.height + 8 };\n        },\n        getActions: () => menuActions,\n        onHide: () => {\n            editor.focus();\n        },\n        autoSelectFirstItem: true,\n    });\n}\nasync function goToDefinitionWithLocation(accessor, event, editor, location) {\n    const resolverService = accessor.get(ITextModelService);\n    const ref = await resolverService.createModelReference(location.uri);\n    await editor.invokeWithinContext(async (accessor) => {\n        const openToSide = event.hasSideBySideModifier;\n        const contextKeyService = accessor.get(IContextKeyService);\n        const isInPeek = PeekContext.inPeekEditor.getValue(contextKeyService);\n        const canPeek = !openToSide && editor.getOption(101 /* EditorOption.definitionLinkOpensInPeek */) && !isInPeek;\n        const action = new DefinitionAction({ openToSide, openInPeek: canPeek, muteMessage: true }, { title: { value: '', original: '' }, id: '', precondition: undefined });\n        return action.run(accessor, new SymbolNavigationAnchor(ref.object.textEditorModel, Range.getStartPosition(location.range)), Range.lift(location.range));\n    });\n    ref.dispose();\n}\n\nexport { goToDefinitionWithLocation, showGoToContextMenu };\n","import { ModifierKeyEmitter, isHTMLElement } from '../../../../base/browser/dom.js';\nimport { isNonEmptyArray } from '../../../../base/common/arrays.js';\nimport { RunOnceScheduler, disposableTimeout } from '../../../../base/common/async.js';\nimport { CancellationTokenSource, CancellationToken } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { DisposableStore, toDisposable, MutableDisposable } from '../../../../base/common/lifecycle.js';\nimport { LRUCache } from '../../../../base/common/map.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { DynamicCssRules } from '../../../browser/editorDom.js';\nimport { StableEditorScrollState } from '../../../browser/stableEditorScroll.js';\nimport { EDITOR_FONT_DEFAULTS } from '../../../common/config/fontInfo.js';\nimport { EditOperation } from '../../../common/core/editOperation.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Command, InlayHintKind } from '../../../common/languages.js';\nimport { InjectedTextCursorStops } from '../../../common/model.js';\nimport { ModelDecorationInjectedTextOptions } from '../../../common/model/textModel.js';\nimport { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { ITextModelService } from '../../../common/services/resolverService.js';\nimport { ClickLinkGesture } from '../../gotoSymbol/browser/link/clickLinkGesture.js';\nimport { InlayHintsFragments, InlayHintAnchor } from './inlayHints.js';\nimport { goToDefinitionWithLocation, showGoToContextMenu } from './inlayHintsLocations.js';\nimport { ICommandService, CommandsRegistry } from '../../../../platform/commands/common/commands.js';\nimport { registerSingleton } from '../../../../platform/instantiation/common/extensions.js';\nimport { createDecorator, IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { Severity, INotificationService } from '../../../../platform/notification/common/notification.js';\nimport '../../../../platform/theme/common/colorUtils.js';\nimport '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorActiveLinkForeground, editorInlayHintParameterBackground, editorInlayHintParameterForeground, editorInlayHintTypeBackground, editorInlayHintTypeForeground, editorInlayHintBackground, editorInlayHintForeground } from '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { themeColorFromId } from '../../../../platform/theme/common/themeService.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar InlayHintsController_1;\n// --- hint caching service (per session)\nclass InlayHintsCache {\n    constructor() {\n        this._entries = new LRUCache(50);\n    }\n    get(model) {\n        const key = InlayHintsCache._key(model);\n        return this._entries.get(key);\n    }\n    set(model, value) {\n        const key = InlayHintsCache._key(model);\n        this._entries.set(key, value);\n    }\n    static _key(model) {\n        return `${model.uri.toString()}/${model.getVersionId()}`;\n    }\n}\nconst IInlayHintsCache = createDecorator('IInlayHintsCache');\nregisterSingleton(IInlayHintsCache, InlayHintsCache, 1 /* InstantiationType.Delayed */);\n// --- rendered label\nclass RenderedInlayHintLabelPart {\n    constructor(item, index) {\n        this.item = item;\n        this.index = index;\n    }\n    get part() {\n        const label = this.item.hint.label;\n        if (typeof label === 'string') {\n            return { label };\n        }\n        else {\n            return label[this.index];\n        }\n    }\n}\nclass ActiveInlayHintInfo {\n    constructor(part, hasTriggerModifier) {\n        this.part = part;\n        this.hasTriggerModifier = hasTriggerModifier;\n    }\n}\n/**\n *  Mix of CancellationTokenSource, DisposableStore and MutableDisposable\n */\nclass CancellationStore {\n    constructor() {\n        this._store = new MutableDisposable();\n        this._tokenSource = new CancellationTokenSource();\n    }\n    dispose() {\n        this._store.dispose();\n        this._tokenSource.dispose(true);\n    }\n    reset() {\n        this._tokenSource.dispose(true);\n        this._tokenSource = new CancellationTokenSource();\n        this._store.value = new DisposableStore();\n        return {\n            store: this._store.value,\n            token: this._tokenSource.token\n        };\n    }\n}\n// --- controller\nlet InlayHintsController = class InlayHintsController {\n    static { InlayHintsController_1 = this; }\n    static { this.ID = 'editor.contrib.InlayHints'; }\n    static { this._MAX_DECORATORS = 1500; }\n    static { this._whitespaceData = {}; }\n    static get(editor) {\n        return editor.getContribution(InlayHintsController_1.ID) ?? undefined;\n    }\n    constructor(_editor, _languageFeaturesService, _featureDebounce, _inlayHintsCache, _commandService, _notificationService, _instaService) {\n        this._editor = _editor;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._inlayHintsCache = _inlayHintsCache;\n        this._commandService = _commandService;\n        this._notificationService = _notificationService;\n        this._instaService = _instaService;\n        this._disposables = new DisposableStore();\n        this._sessionDisposables = new DisposableStore();\n        this._decorationsMetadata = new Map();\n        this._activeRenderMode = 0 /* RenderMode.Normal */;\n        this._ruleFactory = this._disposables.add(new DynamicCssRules(this._editor));\n        this._debounceInfo = _featureDebounce.for(_languageFeaturesService.inlayHintsProvider, 'InlayHint', { min: 25 });\n        this._disposables.add(_languageFeaturesService.inlayHintsProvider.onDidChange(() => this._update()));\n        this._disposables.add(_editor.onDidChangeModel(() => this._update()));\n        this._disposables.add(_editor.onDidChangeModelLanguage(() => this._update()));\n        this._disposables.add(_editor.onDidChangeConfiguration(e => {\n            if (e.hasChanged(159 /* EditorOption.inlayHints */)) {\n                this._update();\n            }\n        }));\n        this._update();\n    }\n    dispose() {\n        this._sessionDisposables.dispose();\n        this._removeAllDecorations();\n        this._disposables.dispose();\n    }\n    _update() {\n        this._sessionDisposables.clear();\n        this._removeAllDecorations();\n        const options = this._editor.getOption(159 /* EditorOption.inlayHints */);\n        if (options.enabled === 'off') {\n            return;\n        }\n        const model = this._editor.getModel();\n        if (!model || !this._languageFeaturesService.inlayHintsProvider.has(model)) {\n            return;\n        }\n        if (options.enabled === 'on') {\n            // different \"on\" modes: always\n            this._activeRenderMode = 0 /* RenderMode.Normal */;\n        }\n        else {\n            // different \"on\" modes: offUnlessPressed, or onUnlessPressed\n            let defaultMode;\n            let altMode;\n            if (options.enabled === 'onUnlessPressed') {\n                defaultMode = 0 /* RenderMode.Normal */;\n                altMode = 1 /* RenderMode.Invisible */;\n            }\n            else {\n                defaultMode = 1 /* RenderMode.Invisible */;\n                altMode = 0 /* RenderMode.Normal */;\n            }\n            this._activeRenderMode = defaultMode;\n            this._sessionDisposables.add(ModifierKeyEmitter.getInstance().event(e => {\n                if (!this._editor.hasModel()) {\n                    return;\n                }\n                const newRenderMode = e.altKey && e.ctrlKey && !(e.shiftKey || e.metaKey) ? altMode : defaultMode;\n                if (newRenderMode !== this._activeRenderMode) {\n                    this._activeRenderMode = newRenderMode;\n                    const model = this._editor.getModel();\n                    const copies = this._copyInlayHintsWithCurrentAnchor(model);\n                    this._updateHintsDecorators([model.getFullModelRange()], copies);\n                    scheduler.schedule(0);\n                }\n            }));\n        }\n        // iff possible, quickly update from cache\n        const cached = this._inlayHintsCache.get(model);\n        if (cached) {\n            this._updateHintsDecorators([model.getFullModelRange()], cached);\n        }\n        this._sessionDisposables.add(toDisposable(() => {\n            // cache items when switching files etc\n            if (!model.isDisposed()) {\n                this._cacheHintsForFastRestore(model);\n            }\n        }));\n        let cts;\n        const watchedProviders = new Set();\n        this._sessionDisposables.add(model.onWillDispose(() => cts?.cancel()));\n        const cancellationStore = this._sessionDisposables.add(new CancellationStore());\n        const scheduler = new RunOnceScheduler(async () => {\n            const t1 = Date.now();\n            const { store, token } = cancellationStore.reset();\n            try {\n                const inlayHints = await InlayHintsFragments.create(this._languageFeaturesService.inlayHintsProvider, model, this._getHintsRanges(), token);\n                scheduler.delay = this._debounceInfo.update(model, Date.now() - t1);\n                if (token.isCancellationRequested) {\n                    inlayHints.dispose();\n                    return;\n                }\n                // listen to provider changes\n                for (const provider of inlayHints.provider) {\n                    if (typeof provider.onDidChangeInlayHints === 'function' && !watchedProviders.has(provider)) {\n                        watchedProviders.add(provider);\n                        store.add(provider.onDidChangeInlayHints(() => {\n                            if (!scheduler.isScheduled()) { // ignore event when request is already scheduled\n                                scheduler.schedule();\n                            }\n                        }));\n                    }\n                }\n                store.add(inlayHints);\n                this._updateHintsDecorators(inlayHints.ranges, inlayHints.items);\n                this._cacheHintsForFastRestore(model);\n            }\n            catch (err) {\n                onUnexpectedError(err);\n            }\n        }, this._debounceInfo.get(model));\n        this._sessionDisposables.add(scheduler);\n        scheduler.schedule(0);\n        this._sessionDisposables.add(this._editor.onDidScrollChange((e) => {\n            // update when scroll position changes\n            // uses scrollTopChanged has weak heuristic to differenatiate between scrolling due to\n            // typing or due to \"actual\" scrolling\n            if (e.scrollTopChanged || !scheduler.isScheduled()) {\n                scheduler.schedule();\n            }\n        }));\n        const cursor = this._sessionDisposables.add(new MutableDisposable());\n        this._sessionDisposables.add(this._editor.onDidChangeModelContent((e) => {\n            // mark current cursor position and time after which the whole can be updated/redrawn\n            const delay = Math.max(scheduler.delay, 800);\n            this._cursorInfo = { position: this._editor.getPosition(), notEarlierThan: Date.now() + delay };\n            cursor.value = disposableTimeout(() => scheduler.schedule(0), delay);\n            scheduler.schedule();\n        }));\n        this._sessionDisposables.add(this._editor.onDidChangeConfiguration(e => {\n            if (e.hasChanged(159 /* EditorOption.inlayHints */)) {\n                scheduler.schedule();\n            }\n        }));\n        // mouse gestures\n        this._sessionDisposables.add(this._installDblClickGesture(() => scheduler.schedule(0)));\n        this._sessionDisposables.add(this._installLinkGesture());\n        this._sessionDisposables.add(this._installContextMenu());\n    }\n    _installLinkGesture() {\n        const store = new DisposableStore();\n        const gesture = store.add(new ClickLinkGesture(this._editor));\n        // let removeHighlight = () => { };\n        const sessionStore = new DisposableStore();\n        store.add(sessionStore);\n        store.add(gesture.onMouseMoveOrRelevantKeyDown(e => {\n            const [mouseEvent] = e;\n            const labelPart = this._getInlayHintLabelPart(mouseEvent);\n            const model = this._editor.getModel();\n            if (!labelPart || !model) {\n                sessionStore.clear();\n                return;\n            }\n            // resolve the item\n            const cts = new CancellationTokenSource();\n            sessionStore.add(toDisposable(() => cts.dispose(true)));\n            labelPart.item.resolve(cts.token);\n            // render link => when the modifier is pressed and when there is a command or location\n            this._activeInlayHintPart = labelPart.part.command || labelPart.part.location\n                ? new ActiveInlayHintInfo(labelPart, mouseEvent.hasTriggerModifier)\n                : undefined;\n            const lineNumber = model.validatePosition(labelPart.item.hint.position).lineNumber;\n            const range = new Range(lineNumber, 1, lineNumber, model.getLineMaxColumn(lineNumber));\n            const lineHints = this._getInlineHintsForRange(range);\n            this._updateHintsDecorators([range], lineHints);\n            sessionStore.add(toDisposable(() => {\n                this._activeInlayHintPart = undefined;\n                this._updateHintsDecorators([range], lineHints);\n            }));\n        }));\n        store.add(gesture.onCancel(() => sessionStore.clear()));\n        store.add(gesture.onExecute(async (e) => {\n            const label = this._getInlayHintLabelPart(e);\n            if (label) {\n                const part = label.part;\n                if (part.location) {\n                    // location -> execute go to def\n                    this._instaService.invokeFunction(goToDefinitionWithLocation, e, this._editor, part.location);\n                }\n                else if (Command.is(part.command)) {\n                    // command -> execute it\n                    await this._invokeCommand(part.command, label.item);\n                }\n            }\n        }));\n        return store;\n    }\n    _getInlineHintsForRange(range) {\n        const lineHints = new Set();\n        for (const data of this._decorationsMetadata.values()) {\n            if (range.containsRange(data.item.anchor.range)) {\n                lineHints.add(data.item);\n            }\n        }\n        return Array.from(lineHints);\n    }\n    _installDblClickGesture(updateInlayHints) {\n        return this._editor.onMouseUp(async (e) => {\n            if (e.event.detail !== 2) {\n                return;\n            }\n            const part = this._getInlayHintLabelPart(e);\n            if (!part) {\n                return;\n            }\n            e.event.preventDefault();\n            await part.item.resolve(CancellationToken.None);\n            if (isNonEmptyArray(part.item.hint.textEdits)) {\n                const edits = part.item.hint.textEdits.map(edit => EditOperation.replace(Range.lift(edit.range), edit.text));\n                this._editor.executeEdits('inlayHint.default', edits);\n                updateInlayHints();\n            }\n        });\n    }\n    _installContextMenu() {\n        return this._editor.onContextMenu(async (e) => {\n            if (!(isHTMLElement(e.event.target))) {\n                return;\n            }\n            const part = this._getInlayHintLabelPart(e);\n            if (part) {\n                await this._instaService.invokeFunction(showGoToContextMenu, this._editor, e.event.target, part);\n            }\n        });\n    }\n    _getInlayHintLabelPart(e) {\n        if (e.target.type !== 6 /* MouseTargetType.CONTENT_TEXT */) {\n            return undefined;\n        }\n        const options = e.target.detail.injectedText?.options;\n        if (options instanceof ModelDecorationInjectedTextOptions && options?.attachedData instanceof RenderedInlayHintLabelPart) {\n            return options.attachedData;\n        }\n        return undefined;\n    }\n    async _invokeCommand(command, item) {\n        try {\n            await this._commandService.executeCommand(command.id, ...(command.arguments ?? []));\n        }\n        catch (err) {\n            this._notificationService.notify({\n                severity: Severity.Error,\n                source: item.provider.displayName,\n                message: err\n            });\n        }\n    }\n    _cacheHintsForFastRestore(model) {\n        const hints = this._copyInlayHintsWithCurrentAnchor(model);\n        this._inlayHintsCache.set(model, hints);\n    }\n    // return inlay hints but with an anchor that reflects \"updates\"\n    // that happened after receiving them, e.g adding new lines before a hint\n    _copyInlayHintsWithCurrentAnchor(model) {\n        const items = new Map();\n        for (const [id, obj] of this._decorationsMetadata) {\n            if (items.has(obj.item)) {\n                // an inlay item can be rendered as multiple decorations\n                // but they will all uses the same range\n                continue;\n            }\n            const range = model.getDecorationRange(id);\n            if (range) {\n                // update range with whatever the editor has tweaked it to\n                const anchor = new InlayHintAnchor(range, obj.item.anchor.direction);\n                const copy = obj.item.with({ anchor });\n                items.set(obj.item, copy);\n            }\n        }\n        return Array.from(items.values());\n    }\n    _getHintsRanges() {\n        const extra = 30;\n        const model = this._editor.getModel();\n        const visibleRanges = this._editor.getVisibleRangesPlusViewportAboveBelow();\n        const result = [];\n        for (const range of visibleRanges.sort(Range.compareRangesUsingStarts)) {\n            const extendedRange = model.validateRange(new Range(range.startLineNumber - extra, range.startColumn, range.endLineNumber + extra, range.endColumn));\n            if (result.length === 0 || !Range.areIntersectingOrTouching(result[result.length - 1], extendedRange)) {\n                result.push(extendedRange);\n            }\n            else {\n                result[result.length - 1] = Range.plusRange(result[result.length - 1], extendedRange);\n            }\n        }\n        return result;\n    }\n    _updateHintsDecorators(ranges, items) {\n        const itemFixedLengths = new Map();\n        if (this._cursorInfo\n            && this._cursorInfo.notEarlierThan > Date.now()\n            && ranges.some(range => range.containsPosition(this._cursorInfo.position))) {\n            // collect inlay hints that are on the same line and before the cursor. Those \"old\" hints\n            // define fixed lengths so that the cursor does not jump back and worth while typing.\n            const { position } = this._cursorInfo;\n            this._cursorInfo = undefined;\n            const lengths = new Map();\n            for (const deco of this._editor.getLineDecorations(position.lineNumber) ?? []) {\n                const data = this._decorationsMetadata.get(deco.id);\n                if (deco.range.startColumn > position.column) {\n                    continue;\n                }\n                const opts = data?.decoration.options[data.item.anchor.direction];\n                if (opts && opts.attachedData !== InlayHintsController_1._whitespaceData) {\n                    const len = lengths.get(data.item) ?? 0;\n                    lengths.set(data.item, len + opts.content.length);\n                }\n            }\n            // on the cursor line and before the cursor-column\n            const newItemsWithFixedLength = items.filter(item => item.anchor.range.startLineNumber === position.lineNumber && item.anchor.range.endColumn <= position.column);\n            const fixedLengths = Array.from(lengths.values());\n            // match up fixed lengths with items and distribute the remaining lengths to the last item\n            let lastItem;\n            while (true) {\n                const targetItem = newItemsWithFixedLength.shift();\n                const fixedLength = fixedLengths.shift();\n                if (!fixedLength && !targetItem) {\n                    break; // DONE\n                }\n                if (targetItem) {\n                    itemFixedLengths.set(targetItem, fixedLength ?? 0);\n                    lastItem = targetItem;\n                }\n                else if (lastItem && fixedLength) {\n                    // still lengths but no more item. give it all to the last\n                    let len = itemFixedLengths.get(lastItem);\n                    len += fixedLength;\n                    len += fixedLengths.reduce((p, c) => p + c, 0);\n                    fixedLengths.length = 0;\n                    break; // DONE\n                }\n            }\n        }\n        // utils to collect/create injected text decorations\n        const newDecorationsData = [];\n        const addInjectedText = (item, ref, content, cursorStops, attachedData) => {\n            const opts = {\n                content,\n                inlineClassNameAffectsLetterSpacing: true,\n                inlineClassName: ref.className,\n                cursorStops,\n                attachedData\n            };\n            newDecorationsData.push({\n                item,\n                classNameRef: ref,\n                decoration: {\n                    range: item.anchor.range,\n                    options: {\n                        // className: \"rangeHighlight\", // DEBUG highlight to see to what range a hint is attached\n                        description: 'InlayHint',\n                        showIfCollapsed: item.anchor.range.isEmpty(), // \"original\" range is empty\n                        collapseOnReplaceEdit: !item.anchor.range.isEmpty(),\n                        stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,\n                        [item.anchor.direction]: this._activeRenderMode === 0 /* RenderMode.Normal */ ? opts : undefined\n                    }\n                }\n            });\n        };\n        const addInjectedWhitespace = (item, isLast) => {\n            const marginRule = this._ruleFactory.createClassNameRef({\n                width: `${(fontSize / 3) | 0}px`,\n                display: 'inline-block'\n            });\n            addInjectedText(item, marginRule, '\\u200a', isLast ? InjectedTextCursorStops.Right : InjectedTextCursorStops.None, InlayHintsController_1._whitespaceData);\n        };\n        //\n        const { fontSize, fontFamily, padding, isUniform } = this._getLayoutInfo();\n        const maxLength = this._editor.getOption(159 /* EditorOption.inlayHints */).maximumLength;\n        const fontFamilyVar = '--code-editorInlayHintsFontFamily';\n        this._editor.getContainerDomNode().style.setProperty(fontFamilyVar, fontFamily);\n        let currentLineInfo = { line: 0, totalLen: 0 };\n        for (let i = 0; i < items.length; i++) {\n            const item = items[i];\n            if (currentLineInfo.line !== item.anchor.range.startLineNumber) {\n                currentLineInfo = { line: item.anchor.range.startLineNumber, totalLen: 0 };\n            }\n            if (maxLength && currentLineInfo.totalLen > maxLength) {\n                continue;\n            }\n            // whitespace leading the actual label\n            if (item.hint.paddingLeft) {\n                addInjectedWhitespace(item, false);\n            }\n            // the label with its parts\n            const parts = typeof item.hint.label === 'string'\n                ? [{ label: item.hint.label }]\n                : item.hint.label;\n            const itemFixedLength = itemFixedLengths.get(item);\n            let itemActualLength = 0;\n            for (let i = 0; i < parts.length; i++) {\n                const part = parts[i];\n                const isFirst = i === 0;\n                const isLast = i === parts.length - 1;\n                const cssProperties = {\n                    fontSize: `${fontSize}px`,\n                    fontFamily: `var(${fontFamilyVar}), ${EDITOR_FONT_DEFAULTS.fontFamily}`,\n                    verticalAlign: isUniform ? 'baseline' : 'middle',\n                    unicodeBidi: 'isolate'\n                };\n                if (isNonEmptyArray(item.hint.textEdits)) {\n                    cssProperties.cursor = 'default';\n                }\n                this._fillInColors(cssProperties, item.hint);\n                if ((part.command || part.location) && this._activeInlayHintPart?.part.item === item && this._activeInlayHintPart.part.index === i) {\n                    // active link!\n                    cssProperties.textDecoration = 'underline';\n                    if (this._activeInlayHintPart.hasTriggerModifier) {\n                        cssProperties.color = themeColorFromId(editorActiveLinkForeground);\n                        cssProperties.cursor = 'pointer';\n                    }\n                }\n                let textlabel = part.label;\n                currentLineInfo.totalLen += textlabel.length;\n                let tooLong = false;\n                const over = maxLength !== 0 ? (currentLineInfo.totalLen - maxLength) : 0;\n                if (over > 0) {\n                    textlabel = textlabel.slice(0, -over) + '…';\n                    tooLong = true;\n                }\n                itemActualLength += textlabel.length;\n                if (itemFixedLength !== undefined) {\n                    const overFixedLength = itemActualLength - itemFixedLength;\n                    if (overFixedLength >= 0) {\n                        // longer than fixed length, trim\n                        itemActualLength -= overFixedLength;\n                        textlabel = textlabel.slice(0, -(1 + overFixedLength)) + '…';\n                        tooLong = true;\n                    }\n                }\n                if (padding) {\n                    if (isFirst && (isLast || tooLong)) {\n                        // only element\n                        cssProperties.padding = `1px ${Math.max(1, fontSize / 4) | 0}px`;\n                        cssProperties.borderRadius = `${(fontSize / 4) | 0}px`;\n                    }\n                    else if (isFirst) {\n                        // first element\n                        cssProperties.padding = `1px 0 1px ${Math.max(1, fontSize / 4) | 0}px`;\n                        cssProperties.borderRadius = `${(fontSize / 4) | 0}px 0 0 ${(fontSize / 4) | 0}px`;\n                    }\n                    else if ((isLast || tooLong)) {\n                        // last element\n                        cssProperties.padding = `1px ${Math.max(1, fontSize / 4) | 0}px 1px 0`;\n                        cssProperties.borderRadius = `0 ${(fontSize / 4) | 0}px ${(fontSize / 4) | 0}px 0`;\n                    }\n                    else {\n                        cssProperties.padding = `1px 0 1px 0`;\n                    }\n                }\n                addInjectedText(item, this._ruleFactory.createClassNameRef(cssProperties), fixSpace(textlabel), isLast && !item.hint.paddingRight ? InjectedTextCursorStops.Right : InjectedTextCursorStops.None, new RenderedInlayHintLabelPart(item, i));\n                if (tooLong) {\n                    break;\n                }\n            }\n            if (itemFixedLength !== undefined && itemActualLength < itemFixedLength) {\n                // shorter than fixed length, pad\n                const pad = (itemFixedLength - itemActualLength);\n                addInjectedText(item, this._ruleFactory.createClassNameRef({}), '\\u200a'.repeat(pad), InjectedTextCursorStops.None);\n            }\n            // whitespace trailing the actual label\n            if (item.hint.paddingRight) {\n                addInjectedWhitespace(item, true);\n            }\n            if (newDecorationsData.length > InlayHintsController_1._MAX_DECORATORS) {\n                break;\n            }\n        }\n        // collect all decoration ids that are affected by the ranges\n        // and only update those decorations\n        const decorationIdsToReplace = [];\n        for (const [id, metadata] of this._decorationsMetadata) {\n            const range = this._editor.getModel()?.getDecorationRange(id);\n            if (range && ranges.some(r => r.containsRange(range))) {\n                decorationIdsToReplace.push(id);\n                metadata.classNameRef.dispose();\n                this._decorationsMetadata.delete(id);\n            }\n        }\n        const scrollState = StableEditorScrollState.capture(this._editor);\n        this._editor.changeDecorations(accessor => {\n            const newDecorationIds = accessor.deltaDecorations(decorationIdsToReplace, newDecorationsData.map(d => d.decoration));\n            for (let i = 0; i < newDecorationIds.length; i++) {\n                const data = newDecorationsData[i];\n                this._decorationsMetadata.set(newDecorationIds[i], data);\n            }\n        });\n        scrollState.restore(this._editor);\n    }\n    _fillInColors(props, hint) {\n        if (hint.kind === InlayHintKind.Parameter) {\n            props.backgroundColor = themeColorFromId(editorInlayHintParameterBackground);\n            props.color = themeColorFromId(editorInlayHintParameterForeground);\n        }\n        else if (hint.kind === InlayHintKind.Type) {\n            props.backgroundColor = themeColorFromId(editorInlayHintTypeBackground);\n            props.color = themeColorFromId(editorInlayHintTypeForeground);\n        }\n        else {\n            props.backgroundColor = themeColorFromId(editorInlayHintBackground);\n            props.color = themeColorFromId(editorInlayHintForeground);\n        }\n    }\n    _getLayoutInfo() {\n        const options = this._editor.getOption(159 /* EditorOption.inlayHints */);\n        const padding = options.padding;\n        const editorFontSize = this._editor.getOption(61 /* EditorOption.fontSize */);\n        const editorFontFamily = this._editor.getOption(58 /* EditorOption.fontFamily */);\n        let fontSize = options.fontSize;\n        if (!fontSize || fontSize < 5 || fontSize > editorFontSize) {\n            fontSize = editorFontSize;\n        }\n        const fontFamily = options.fontFamily || editorFontFamily;\n        const isUniform = !padding\n            && fontFamily === editorFontFamily\n            && fontSize === editorFontSize;\n        return { fontSize, fontFamily, padding, isUniform };\n    }\n    _removeAllDecorations() {\n        this._editor.removeDecorations(Array.from(this._decorationsMetadata.keys()));\n        for (const obj of this._decorationsMetadata.values()) {\n            obj.classNameRef.dispose();\n        }\n        this._decorationsMetadata.clear();\n    }\n};\nInlayHintsController = InlayHintsController_1 = __decorate([\n    __param(1, ILanguageFeaturesService),\n    __param(2, ILanguageFeatureDebounceService),\n    __param(3, IInlayHintsCache),\n    __param(4, ICommandService),\n    __param(5, INotificationService),\n    __param(6, IInstantiationService)\n], InlayHintsController);\n// Prevents the view from potentially visible whitespace\nfunction fixSpace(str) {\n    const noBreakWhitespace = '\\xa0';\n    return str.replace(/[ \\t]/g, noBreakWhitespace);\n}\nCommandsRegistry.registerCommand('_executeInlayHintProvider', async (accessor, ...args) => {\n    const [uri, range] = args;\n    assertType(URI.isUri(uri));\n    assertType(Range.isIRange(range));\n    const { inlayHintsProvider } = accessor.get(ILanguageFeaturesService);\n    const ref = await accessor.get(ITextModelService).createModelReference(uri);\n    try {\n        const model = await InlayHintsFragments.create(inlayHintsProvider, ref.object.textEditorModel, [Range.lift(range)], CancellationToken.None);\n        const result = model.items.map(i => i.hint);\n        setTimeout(() => model.dispose(), 0); // dispose after sending to ext host\n        return result;\n    }\n    finally {\n        ref.dispose();\n    }\n});\n\nexport { InlayHintsController, RenderedInlayHintLabelPart };\n","import { AsyncIterableProducer } from '../../../../base/common/async.js';\nimport { MarkdownString, isEmptyMarkdownString } from '../../../../base/common/htmlContent.js';\nimport { Position } from '../../../common/core/position.js';\nimport { ModelDecorationInjectedTextOptions } from '../../../common/model/textModel.js';\nimport { HoverForeignElementAnchor } from '../../hover/browser/hoverTypes.js';\nimport { ITextModelService } from '../../../common/services/resolverService.js';\nimport { getHoverProviderResultsAsAsyncIterable } from '../../hover/browser/getHover.js';\nimport { MarkdownHoverParticipant, MarkdownHover } from '../../hover/browser/markdownHoverParticipant.js';\nimport { InlayHintsController, RenderedInlayHintLabelPart } from './inlayHintsController.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { localize } from '../../../../nls.js';\nimport { isMacintosh } from '../../../../base/common/platform.js';\nimport { asCommandLink } from './inlayHints.js';\nimport { isNonEmptyArray } from '../../../../base/common/arrays.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { IHoverService } from '../../../../platform/hover/browser/hover.js';\nimport { ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { IMarkdownRendererService } from '../../../../platform/markdown/browser/markdownRenderer.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass InlayHintsHoverAnchor extends HoverForeignElementAnchor {\n    constructor(part, owner, initialMousePosX, initialMousePosY) {\n        super(10, owner, part.item.anchor.range, initialMousePosX, initialMousePosY, true);\n        this.part = part;\n    }\n}\nlet InlayHintsHover = class InlayHintsHover extends MarkdownHoverParticipant {\n    constructor(editor, markdownRendererService, keybindingService, hoverService, configurationService, _resolverService, languageFeaturesService, commandService) {\n        super(editor, markdownRendererService, configurationService, languageFeaturesService, keybindingService, hoverService, commandService);\n        this._resolverService = _resolverService;\n        this.hoverOrdinal = 6;\n    }\n    suggestHoverAnchor(mouseEvent) {\n        const controller = InlayHintsController.get(this._editor);\n        if (!controller) {\n            return null;\n        }\n        if (mouseEvent.target.type !== 6 /* MouseTargetType.CONTENT_TEXT */) {\n            return null;\n        }\n        const options = mouseEvent.target.detail.injectedText?.options;\n        if (!(options instanceof ModelDecorationInjectedTextOptions && options.attachedData instanceof RenderedInlayHintLabelPart)) {\n            return null;\n        }\n        return new InlayHintsHoverAnchor(options.attachedData, this, mouseEvent.event.posx, mouseEvent.event.posy);\n    }\n    computeSync() {\n        return [];\n    }\n    computeAsync(anchor, _lineDecorations, source, token) {\n        if (!(anchor instanceof InlayHintsHoverAnchor)) {\n            return AsyncIterableProducer.EMPTY;\n        }\n        return new AsyncIterableProducer(async (executor) => {\n            const { part } = anchor;\n            await part.item.resolve(token);\n            if (token.isCancellationRequested) {\n                return;\n            }\n            // (1) Inlay Tooltip\n            let itemTooltip;\n            if (typeof part.item.hint.tooltip === 'string') {\n                itemTooltip = new MarkdownString().appendText(part.item.hint.tooltip);\n            }\n            else if (part.item.hint.tooltip) {\n                itemTooltip = part.item.hint.tooltip;\n            }\n            if (itemTooltip) {\n                executor.emitOne(new MarkdownHover(this, anchor.range, [itemTooltip], false, 0));\n            }\n            // (1.2) Inlay dbl-click gesture\n            if (isNonEmptyArray(part.item.hint.textEdits)) {\n                executor.emitOne(new MarkdownHover(this, anchor.range, [new MarkdownString().appendText(localize(1164, \"Double-click to insert\"))], false, 10001));\n            }\n            // (2) Inlay Label Part Tooltip\n            let partTooltip;\n            if (typeof part.part.tooltip === 'string') {\n                partTooltip = new MarkdownString().appendText(part.part.tooltip);\n            }\n            else if (part.part.tooltip) {\n                partTooltip = part.part.tooltip;\n            }\n            if (partTooltip) {\n                executor.emitOne(new MarkdownHover(this, anchor.range, [partTooltip], false, 1));\n            }\n            // (2.2) Inlay Label Part Help Hover\n            if (part.part.location || part.part.command) {\n                let linkHint;\n                const useMetaKey = this._editor.getOption(86 /* EditorOption.multiCursorModifier */) === 'altKey';\n                const kb = useMetaKey\n                    ? isMacintosh\n                        ? localize(1165, \"cmd + click\")\n                        : localize(1166, \"ctrl + click\")\n                    : isMacintosh\n                        ? localize(1167, \"option + click\")\n                        : localize(1168, \"alt + click\");\n                if (part.part.location && part.part.command) {\n                    linkHint = new MarkdownString().appendText(localize(1169, 'Go to Definition ({0}), right click for more', kb));\n                }\n                else if (part.part.location) {\n                    linkHint = new MarkdownString().appendText(localize(1170, 'Go to Definition ({0})', kb));\n                }\n                else if (part.part.command) {\n                    linkHint = new MarkdownString(`[${localize(1171, \"Execute Command\")}](${asCommandLink(part.part.command)} \"${part.part.command.title}\") (${kb})`, { isTrusted: true });\n                }\n                if (linkHint) {\n                    executor.emitOne(new MarkdownHover(this, anchor.range, [linkHint], false, 10000));\n                }\n            }\n            // (3) Inlay Label Part Location tooltip\n            const iterable = this._resolveInlayHintLabelPartHover(part, token);\n            for await (const item of iterable) {\n                executor.emitOne(item);\n            }\n        });\n    }\n    async *_resolveInlayHintLabelPartHover(part, token) {\n        if (!part.part.location) {\n            return;\n        }\n        const { uri, range } = part.part.location;\n        const ref = await this._resolverService.createModelReference(uri);\n        try {\n            const model = ref.object.textEditorModel;\n            if (!this._languageFeaturesService.hoverProvider.has(model)) {\n                return;\n            }\n            for await (const item of getHoverProviderResultsAsAsyncIterable(this._languageFeaturesService.hoverProvider, model, new Position(range.startLineNumber, range.startColumn), token)) {\n                if (!isEmptyMarkdownString(item.hover.contents)) {\n                    yield new MarkdownHover(this, part.item.anchor.range, item.hover.contents, false, 2 + item.ordinal);\n                }\n            }\n        }\n        finally {\n            ref.dispose();\n        }\n    }\n};\nInlayHintsHover = __decorate([\n    __param(1, IMarkdownRendererService),\n    __param(2, IKeybindingService),\n    __param(3, IHoverService),\n    __param(4, IConfigurationService),\n    __param(5, ITextModelService),\n    __param(6, ILanguageFeaturesService),\n    __param(7, ICommandService)\n], InlayHintsHover);\n\nexport { InlayHintsHover };\n","import { binarySearch2, equals } from '../../../../base/common/arrays.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { LinkedList } from '../../../../base/common/linkedList.js';\nimport { compare } from '../../../../base/common/strings.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { Range } from '../../../common/core/range.js';\nimport { registerSingleton } from '../../../../platform/instantiation/common/extensions.js';\nimport { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IMarkerService, MarkerSeverity } from '../../../../platform/markers/common/markers.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { isEqual } from '../../../../base/common/resources.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass MarkerCoordinate {\n    constructor(marker, index, total) {\n        this.marker = marker;\n        this.index = index;\n        this.total = total;\n    }\n}\nlet MarkerList = class MarkerList {\n    constructor(resourceFilter, _markerService, _configService) {\n        this._markerService = _markerService;\n        this._configService = _configService;\n        this._onDidChange = new Emitter();\n        this.onDidChange = this._onDidChange.event;\n        this._dispoables = new DisposableStore();\n        this._markers = [];\n        this._nextIdx = -1;\n        if (URI.isUri(resourceFilter)) {\n            this._resourceFilter = uri => uri.toString() === resourceFilter.toString();\n        }\n        else if (resourceFilter) {\n            this._resourceFilter = resourceFilter;\n        }\n        const compareOrder = this._configService.getValue('problems.sortOrder');\n        const compareMarker = (a, b) => {\n            let res = compare(a.resource.toString(), b.resource.toString());\n            if (res === 0) {\n                if (compareOrder === 'position') {\n                    res = Range.compareRangesUsingStarts(a, b) || MarkerSeverity.compare(a.severity, b.severity);\n                }\n                else {\n                    res = MarkerSeverity.compare(a.severity, b.severity) || Range.compareRangesUsingStarts(a, b);\n                }\n            }\n            return res;\n        };\n        const updateMarker = () => {\n            let newMarkers = this._markerService.read({\n                resource: URI.isUri(resourceFilter) ? resourceFilter : undefined,\n                severities: MarkerSeverity.Error | MarkerSeverity.Warning | MarkerSeverity.Info\n            });\n            if (typeof resourceFilter === 'function') {\n                newMarkers = newMarkers.filter(m => this._resourceFilter(m.resource));\n            }\n            newMarkers.sort(compareMarker);\n            if (equals(newMarkers, this._markers, (a, b) => a.resource.toString() === b.resource.toString()\n                && a.startLineNumber === b.startLineNumber\n                && a.startColumn === b.startColumn\n                && a.endLineNumber === b.endLineNumber\n                && a.endColumn === b.endColumn\n                && a.severity === b.severity\n                && a.message === b.message)) {\n                return false;\n            }\n            this._markers = newMarkers;\n            return true;\n        };\n        updateMarker();\n        this._dispoables.add(_markerService.onMarkerChanged(uris => {\n            if (!this._resourceFilter || uris.some(uri => this._resourceFilter(uri))) {\n                if (updateMarker()) {\n                    this._nextIdx = -1;\n                    this._onDidChange.fire();\n                }\n            }\n        }));\n    }\n    dispose() {\n        this._dispoables.dispose();\n        this._onDidChange.dispose();\n    }\n    matches(uri) {\n        if (!this._resourceFilter && !uri) {\n            return true;\n        }\n        if (!this._resourceFilter || !uri) {\n            return false;\n        }\n        return this._resourceFilter(uri);\n    }\n    get selected() {\n        const marker = this._markers[this._nextIdx];\n        return marker && new MarkerCoordinate(marker, this._nextIdx + 1, this._markers.length);\n    }\n    _initIdx(model, position, fwd) {\n        let idx = this._markers.findIndex(marker => isEqual(marker.resource, model.uri));\n        if (idx < 0) {\n            // ignore model, position because this will be a different file\n            idx = binarySearch2(this._markers.length, idx => compare(this._markers[idx].resource.toString(), model.uri.toString()));\n            if (idx < 0) {\n                idx = ~idx;\n            }\n            if (fwd) {\n                this._nextIdx = idx;\n            }\n            else {\n                this._nextIdx = (this._markers.length + idx - 1) % this._markers.length;\n            }\n        }\n        else {\n            // find marker for file\n            let found = false;\n            let wentPast = false;\n            for (let i = idx; i < this._markers.length; i++) {\n                let range = Range.lift(this._markers[i]);\n                if (range.isEmpty()) {\n                    const word = model.getWordAtPosition(range.getStartPosition());\n                    if (word) {\n                        range = new Range(range.startLineNumber, word.startColumn, range.startLineNumber, word.endColumn);\n                    }\n                }\n                if (position && (range.containsPosition(position) || position.isBeforeOrEqual(range.getStartPosition()))) {\n                    this._nextIdx = i;\n                    found = true;\n                    wentPast = !range.containsPosition(position);\n                    break;\n                }\n                if (this._markers[i].resource.toString() !== model.uri.toString()) {\n                    break;\n                }\n            }\n            if (!found) {\n                // after the last change\n                this._nextIdx = fwd ? 0 : this._markers.length - 1;\n            }\n            else if (wentPast && !fwd) {\n                // we went past and have to go one back\n                this._nextIdx -= 1;\n            }\n        }\n        if (this._nextIdx < 0) {\n            this._nextIdx = this._markers.length - 1;\n        }\n    }\n    resetIndex() {\n        this._nextIdx = -1;\n    }\n    move(fwd, model, position) {\n        if (this._markers.length === 0) {\n            return false;\n        }\n        const oldIdx = this._nextIdx;\n        if (this._nextIdx === -1) {\n            this._initIdx(model, position, fwd);\n        }\n        else if (fwd) {\n            this._nextIdx = (this._nextIdx + 1) % this._markers.length;\n        }\n        else if (!fwd) {\n            this._nextIdx = (this._nextIdx - 1 + this._markers.length) % this._markers.length;\n        }\n        if (oldIdx !== this._nextIdx) {\n            return true;\n        }\n        return false;\n    }\n    find(uri, position) {\n        let idx = this._markers.findIndex(marker => marker.resource.toString() === uri.toString());\n        if (idx < 0) {\n            return undefined;\n        }\n        for (; idx < this._markers.length; idx++) {\n            if (Range.containsPosition(this._markers[idx], position)) {\n                return new MarkerCoordinate(this._markers[idx], idx + 1, this._markers.length);\n            }\n        }\n        return undefined;\n    }\n};\nMarkerList = __decorate([\n    __param(1, IMarkerService),\n    __param(2, IConfigurationService)\n], MarkerList);\nconst IMarkerNavigationService = createDecorator('IMarkerNavigationService');\nlet MarkerNavigationService = class MarkerNavigationService {\n    constructor(_markerService, _configService) {\n        this._markerService = _markerService;\n        this._configService = _configService;\n        this._provider = new LinkedList();\n    }\n    getMarkerList(resource) {\n        for (const provider of this._provider) {\n            const result = provider.getMarkerList(resource);\n            if (result) {\n                return result;\n            }\n        }\n        // default\n        return new MarkerList(resource, this._markerService, this._configService);\n    }\n};\nMarkerNavigationService = __decorate([\n    __param(0, IMarkerService),\n    __param(1, IConfigurationService)\n], MarkerNavigationService);\nregisterSingleton(IMarkerNavigationService, MarkerNavigationService, 1 /* InstantiationType.Delayed */);\n\nexport { IMarkerNavigationService, MarkerCoordinate, MarkerList };\n","import './media/severityIcon.css';\nimport { Codicon } from '../../../common/codicons.js';\nimport { ThemeIcon } from '../../../common/themables.js';\nimport Severity from '../../../common/severity.js';\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 *--------------------------------------------------------------------------------------------*/\nvar SeverityIcon;\n(function (SeverityIcon) {\n    function className(severity) {\n        switch (severity) {\n            case Severity.Ignore:\n                return 'severity-ignore ' + ThemeIcon.asClassName(Codicon.info);\n            case Severity.Info:\n                return ThemeIcon.asClassName(Codicon.info);\n            case Severity.Warning:\n                return ThemeIcon.asClassName(Codicon.warning);\n            case Severity.Error:\n                return ThemeIcon.asClassName(Codicon.error);\n            default:\n                return '';\n        }\n    }\n    SeverityIcon.className = className;\n})(SeverityIcon || (SeverityIcon = {}));\n\nexport { SeverityIcon };\n","import { append, $, addStandardDisposableListener, clearNode } from '../../../../base/browser/dom.js';\nimport { ScrollableElement } from '../../../../base/browser/ui/scrollbar/scrollableElement.js';\nimport { isNonEmptyArray } from '../../../../base/common/arrays.js';\nimport { Color } from '../../../../base/common/color.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { DisposableStore, dispose } from '../../../../base/common/lifecycle.js';\nimport { basename } from '../../../../base/common/resources.js';\nimport { splitLines } from '../../../../base/common/strings.js';\nimport './media/gotoErrorWidget.css';\nimport { Range } from '../../../common/core/range.js';\nimport { PeekViewWidget, peekViewTitleInfoForeground, peekViewTitleForeground } from '../../peekView/browser/peekView.js';\nimport { localize } from '../../../../nls.js';\nimport { getFlatActionBarActions } from '../../../../platform/actions/browser/menuEntryActionViewItem.js';\nimport { MenuId, IMenuService } from '../../../../platform/actions/common/actions.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { ILabelService } from '../../../../platform/label/common/label.js';\nimport { MarkerSeverity } from '../../../../platform/markers/common/markers.js';\nimport { IOpenerService } from '../../../../platform/opener/common/opener.js';\nimport { SeverityIcon } from '../../../../base/browser/ui/severityIcon/severityIcon.js';\nimport { registerColor, oneOf, transparent } from '../../../../platform/theme/common/colorUtils.js';\nimport { contrastBorder } from '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorErrorBorder, editorErrorForeground, editorWarningBorder, editorWarningForeground, editorInfoBorder, editorInfoForeground, editorBackground } from '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { IThemeService } from '../../../../platform/theme/common/themeService.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar MarkerNavigationWidget_1;\nclass MessageWidget {\n    constructor(parent, editor, onRelatedInformation, _openerService, _labelService) {\n        this._openerService = _openerService;\n        this._labelService = _labelService;\n        this._lines = 0;\n        this._longestLineLength = 0;\n        this._relatedDiagnostics = new WeakMap();\n        this._disposables = new DisposableStore();\n        this._editor = editor;\n        const domNode = document.createElement('div');\n        domNode.className = 'descriptioncontainer';\n        this._messageBlock = document.createElement('div');\n        this._messageBlock.classList.add('message');\n        this._messageBlock.setAttribute('aria-live', 'assertive');\n        this._messageBlock.setAttribute('role', 'alert');\n        domNode.appendChild(this._messageBlock);\n        this._relatedBlock = document.createElement('div');\n        domNode.appendChild(this._relatedBlock);\n        this._disposables.add(addStandardDisposableListener(this._relatedBlock, 'click', event => {\n            event.preventDefault();\n            const related = this._relatedDiagnostics.get(event.target);\n            if (related) {\n                onRelatedInformation(related);\n            }\n        }));\n        this._scrollable = new ScrollableElement(domNode, {\n            horizontal: 1 /* ScrollbarVisibility.Auto */,\n            vertical: 1 /* ScrollbarVisibility.Auto */,\n            useShadows: false,\n            horizontalScrollbarSize: 6,\n            verticalScrollbarSize: 6\n        });\n        parent.appendChild(this._scrollable.getDomNode());\n        this._disposables.add(this._scrollable.onScroll(e => {\n            domNode.style.left = `-${e.scrollLeft}px`;\n            domNode.style.top = `-${e.scrollTop}px`;\n        }));\n        this._disposables.add(this._scrollable);\n    }\n    dispose() {\n        dispose(this._disposables);\n    }\n    update(marker) {\n        const { source, message, relatedInformation, code } = marker;\n        let sourceAndCodeLength = (source?.length || 0) + '()'.length;\n        if (code) {\n            if (typeof code === 'string') {\n                sourceAndCodeLength += code.length;\n            }\n            else {\n                sourceAndCodeLength += code.value.length;\n            }\n        }\n        const lines = splitLines(message);\n        this._lines = lines.length;\n        this._longestLineLength = 0;\n        for (const line of lines) {\n            this._longestLineLength = Math.max(line.length + sourceAndCodeLength, this._longestLineLength);\n        }\n        clearNode(this._messageBlock);\n        this._messageBlock.setAttribute('aria-label', this.getAriaLabel(marker));\n        this._editor.applyFontInfo(this._messageBlock);\n        let lastLineElement = this._messageBlock;\n        for (const line of lines) {\n            lastLineElement = document.createElement('div');\n            lastLineElement.innerText = line;\n            if (line === '') {\n                lastLineElement.style.height = this._messageBlock.style.lineHeight;\n            }\n            this._messageBlock.appendChild(lastLineElement);\n        }\n        if (source || code) {\n            const detailsElement = document.createElement('span');\n            detailsElement.classList.add('details');\n            lastLineElement.appendChild(detailsElement);\n            if (source) {\n                const sourceElement = document.createElement('span');\n                sourceElement.innerText = source;\n                sourceElement.classList.add('source');\n                detailsElement.appendChild(sourceElement);\n            }\n            if (code) {\n                if (typeof code === 'string') {\n                    const codeElement = document.createElement('span');\n                    codeElement.innerText = `(${code})`;\n                    codeElement.classList.add('code');\n                    detailsElement.appendChild(codeElement);\n                }\n                else {\n                    this._codeLink = $('a.code-link');\n                    this._codeLink.setAttribute('href', `${code.target.toString()}`);\n                    this._codeLink.onclick = (e) => {\n                        this._openerService.open(code.target, { allowCommands: true });\n                        e.preventDefault();\n                        e.stopPropagation();\n                    };\n                    const codeElement = append(this._codeLink, $('span'));\n                    codeElement.innerText = code.value;\n                    detailsElement.appendChild(this._codeLink);\n                }\n            }\n        }\n        clearNode(this._relatedBlock);\n        this._editor.applyFontInfo(this._relatedBlock);\n        if (isNonEmptyArray(relatedInformation)) {\n            const relatedInformationNode = this._relatedBlock.appendChild(document.createElement('div'));\n            relatedInformationNode.style.paddingTop = `${Math.floor(this._editor.getOption(75 /* EditorOption.lineHeight */) * 0.66)}px`;\n            this._lines += 1;\n            for (const related of relatedInformation) {\n                const container = document.createElement('div');\n                const relatedResource = document.createElement('a');\n                relatedResource.classList.add('filename');\n                relatedResource.innerText = `${this._labelService.getUriBasenameLabel(related.resource)}(${related.startLineNumber}, ${related.startColumn}): `;\n                relatedResource.title = this._labelService.getUriLabel(related.resource);\n                this._relatedDiagnostics.set(relatedResource, related);\n                const relatedMessage = document.createElement('span');\n                relatedMessage.innerText = related.message;\n                container.appendChild(relatedResource);\n                container.appendChild(relatedMessage);\n                this._lines += 1;\n                relatedInformationNode.appendChild(container);\n            }\n        }\n        const fontInfo = this._editor.getOption(59 /* EditorOption.fontInfo */);\n        const scrollWidth = Math.ceil(fontInfo.typicalFullwidthCharacterWidth * this._longestLineLength * 0.75);\n        const scrollHeight = fontInfo.lineHeight * this._lines;\n        this._scrollable.setScrollDimensions({ scrollWidth, scrollHeight });\n    }\n    layout(height, width) {\n        this._scrollable.getDomNode().style.height = `${height}px`;\n        this._scrollable.getDomNode().style.width = `${width}px`;\n        this._scrollable.setScrollDimensions({ width, height });\n    }\n    getHeightInLines() {\n        return Math.min(17, this._lines);\n    }\n    getAriaLabel(marker) {\n        let severityLabel = '';\n        switch (marker.severity) {\n            case MarkerSeverity.Error:\n                severityLabel = localize(1024, \"Error\");\n                break;\n            case MarkerSeverity.Warning:\n                severityLabel = localize(1025, \"Warning\");\n                break;\n            case MarkerSeverity.Info:\n                severityLabel = localize(1026, \"Info\");\n                break;\n            case MarkerSeverity.Hint:\n                severityLabel = localize(1027, \"Hint\");\n                break;\n        }\n        let ariaLabel = localize(1028, \"{0} at {1}. \", severityLabel, marker.startLineNumber + ':' + marker.startColumn);\n        const model = this._editor.getModel();\n        if (model && (marker.startLineNumber <= model.getLineCount()) && (marker.startLineNumber >= 1)) {\n            const lineContent = model.getLineContent(marker.startLineNumber);\n            ariaLabel = `${lineContent}, ${ariaLabel}`;\n        }\n        return ariaLabel;\n    }\n}\nlet MarkerNavigationWidget = class MarkerNavigationWidget extends PeekViewWidget {\n    static { MarkerNavigationWidget_1 = this; }\n    static { this.TitleMenu = new MenuId('gotoErrorTitleMenu'); }\n    constructor(editor, _themeService, _openerService, _menuService, instantiationService, _contextKeyService, _labelService) {\n        super(editor, { showArrow: true, showFrame: true, isAccessible: true, frameWidth: 1 }, instantiationService);\n        this._themeService = _themeService;\n        this._openerService = _openerService;\n        this._menuService = _menuService;\n        this._contextKeyService = _contextKeyService;\n        this._labelService = _labelService;\n        this._callOnDispose = new DisposableStore();\n        this._onDidSelectRelatedInformation = new Emitter();\n        this.onDidSelectRelatedInformation = this._onDidSelectRelatedInformation.event;\n        this._severity = MarkerSeverity.Warning;\n        this._backgroundColor = Color.white;\n        this._applyTheme(_themeService.getColorTheme());\n        this._callOnDispose.add(_themeService.onDidColorThemeChange(this._applyTheme.bind(this)));\n        this.create();\n    }\n    _applyTheme(theme) {\n        this._backgroundColor = theme.getColor(editorMarkerNavigationBackground);\n        let colorId = editorMarkerNavigationError;\n        let headerBackground = editorMarkerNavigationErrorHeader;\n        if (this._severity === MarkerSeverity.Warning) {\n            colorId = editorMarkerNavigationWarning;\n            headerBackground = editorMarkerNavigationWarningHeader;\n        }\n        else if (this._severity === MarkerSeverity.Info) {\n            colorId = editorMarkerNavigationInfo;\n            headerBackground = editorMarkerNavigationInfoHeader;\n        }\n        const frameColor = theme.getColor(colorId);\n        const headerBg = theme.getColor(headerBackground);\n        this.style({\n            arrowColor: frameColor,\n            frameColor: frameColor,\n            headerBackgroundColor: headerBg,\n            primaryHeadingColor: theme.getColor(peekViewTitleForeground),\n            secondaryHeadingColor: theme.getColor(peekViewTitleInfoForeground)\n        }); // style() will trigger _applyStyles\n    }\n    _applyStyles() {\n        if (this._parentContainer) {\n            this._parentContainer.style.backgroundColor = this._backgroundColor ? this._backgroundColor.toString() : '';\n        }\n        super._applyStyles();\n    }\n    dispose() {\n        this._callOnDispose.dispose();\n        super.dispose();\n    }\n    _fillHead(container) {\n        super._fillHead(container);\n        this._disposables.add(this._actionbarWidget.actionRunner.onWillRun(e => this.editor.focus()));\n        const menu = this._menuService.getMenuActions(MarkerNavigationWidget_1.TitleMenu, this._contextKeyService);\n        const actions = getFlatActionBarActions(menu);\n        this._actionbarWidget.push(actions, { label: false, icon: true, index: 0 });\n    }\n    _fillTitleIcon(container) {\n        this._icon = append(container, $(''));\n    }\n    _fillBody(container) {\n        this._parentContainer = container;\n        container.classList.add('marker-widget');\n        this._parentContainer.tabIndex = 0;\n        this._parentContainer.setAttribute('role', 'tooltip');\n        this._container = document.createElement('div');\n        container.appendChild(this._container);\n        this._message = new MessageWidget(this._container, this.editor, related => this._onDidSelectRelatedInformation.fire(related), this._openerService, this._labelService);\n        this._disposables.add(this._message);\n    }\n    show() {\n        throw new Error('call showAtMarker');\n    }\n    showAtMarker(marker, markerIdx, markerCount) {\n        // update:\n        // * title\n        // * message\n        this._container.classList.remove('stale');\n        this._message.update(marker);\n        // update frame color (only applied on 'show')\n        this._severity = marker.severity;\n        this._applyTheme(this._themeService.getColorTheme());\n        // show\n        const range = Range.lift(marker);\n        const editorPosition = this.editor.getPosition();\n        const position = editorPosition && range.containsPosition(editorPosition) ? editorPosition : range.getStartPosition();\n        super.show(position, this.computeRequiredHeight());\n        const model = this.editor.getModel();\n        if (model) {\n            const detail = markerCount > 1\n                ? localize(1029, \"{0} of {1} problems\", markerIdx, markerCount)\n                : localize(1030, \"{0} of {1} problem\", markerIdx, markerCount);\n            this.setTitle(basename(model.uri), detail);\n        }\n        this._icon.className = `codicon ${SeverityIcon.className(MarkerSeverity.toSeverity(this._severity))}`;\n        this.editor.revealPositionNearTop(position, 0 /* ScrollType.Smooth */);\n        this.editor.focus();\n    }\n    updateMarker(marker) {\n        this._container.classList.remove('stale');\n        this._message.update(marker);\n    }\n    showStale() {\n        this._container.classList.add('stale');\n        this._relayout();\n    }\n    _doLayoutBody(heightInPixel, widthInPixel) {\n        super._doLayoutBody(heightInPixel, widthInPixel);\n        this._heightInPixel = heightInPixel;\n        this._message.layout(heightInPixel, widthInPixel);\n        this._container.style.height = `${heightInPixel}px`;\n    }\n    _onWidth(widthInPixel) {\n        this._message.layout(this._heightInPixel, widthInPixel);\n    }\n    _relayout() {\n        super._relayout(this.computeRequiredHeight());\n    }\n    computeRequiredHeight() {\n        return 3 + this._message.getHeightInLines();\n    }\n};\nMarkerNavigationWidget = MarkerNavigationWidget_1 = __decorate([\n    __param(1, IThemeService),\n    __param(2, IOpenerService),\n    __param(3, IMenuService),\n    __param(4, IInstantiationService),\n    __param(5, IContextKeyService),\n    __param(6, ILabelService)\n], MarkerNavigationWidget);\n// theming\nconst errorDefault = oneOf(editorErrorForeground, editorErrorBorder);\nconst warningDefault = oneOf(editorWarningForeground, editorWarningBorder);\nconst infoDefault = oneOf(editorInfoForeground, editorInfoBorder);\nconst editorMarkerNavigationError = registerColor('editorMarkerNavigationError.background', { dark: errorDefault, light: errorDefault, hcDark: contrastBorder, hcLight: contrastBorder }, localize(1031, 'Editor marker navigation widget error color.'));\nconst editorMarkerNavigationErrorHeader = registerColor('editorMarkerNavigationError.headerBackground', { dark: transparent(editorMarkerNavigationError, .1), light: transparent(editorMarkerNavigationError, .1), hcDark: null, hcLight: null }, localize(1032, 'Editor marker navigation widget error heading background.'));\nconst editorMarkerNavigationWarning = registerColor('editorMarkerNavigationWarning.background', { dark: warningDefault, light: warningDefault, hcDark: contrastBorder, hcLight: contrastBorder }, localize(1033, 'Editor marker navigation widget warning color.'));\nconst editorMarkerNavigationWarningHeader = registerColor('editorMarkerNavigationWarning.headerBackground', { dark: transparent(editorMarkerNavigationWarning, .1), light: transparent(editorMarkerNavigationWarning, .1), hcDark: '#0C141F', hcLight: transparent(editorMarkerNavigationWarning, .2) }, localize(1034, 'Editor marker navigation widget warning heading background.'));\nconst editorMarkerNavigationInfo = registerColor('editorMarkerNavigationInfo.background', { dark: infoDefault, light: infoDefault, hcDark: contrastBorder, hcLight: contrastBorder }, localize(1035, 'Editor marker navigation widget info color.'));\nconst editorMarkerNavigationInfoHeader = registerColor('editorMarkerNavigationInfo.headerBackground', { dark: transparent(editorMarkerNavigationInfo, .1), light: transparent(editorMarkerNavigationInfo, .1), hcDark: null, hcLight: null }, localize(1036, 'Editor marker navigation widget info heading background.'));\nconst editorMarkerNavigationBackground = registerColor('editorMarkerNavigation.background', editorBackground, localize(1037, 'Editor marker navigation widget background.'));\n\nexport { MarkerNavigationWidget };\n","import { Codicon } from '../../../../base/common/codicons.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { registerEditorContribution, registerEditorAction, EditorCommand, registerEditorCommand, EditorAction } from '../../../browser/editorExtensions.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { IMarkerNavigationService } from './markerNavigationService.js';\nimport { localize2, localize } from '../../../../nls.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { RawContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { registerIcon } from '../../../../platform/theme/common/iconRegistry.js';\nimport { MarkerNavigationWidget } from './gotoErrorWidget.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar MarkerController_1;\nlet MarkerController = class MarkerController {\n    static { MarkerController_1 = this; }\n    static { this.ID = 'editor.contrib.markerController'; }\n    static get(editor) {\n        return editor.getContribution(MarkerController_1.ID);\n    }\n    constructor(editor, _markerNavigationService, _contextKeyService, _editorService, _instantiationService) {\n        this._markerNavigationService = _markerNavigationService;\n        this._contextKeyService = _contextKeyService;\n        this._editorService = _editorService;\n        this._instantiationService = _instantiationService;\n        this._sessionDispoables = new DisposableStore();\n        this._editor = editor;\n        this._widgetVisible = CONTEXT_MARKERS_NAVIGATION_VISIBLE.bindTo(this._contextKeyService);\n    }\n    dispose() {\n        this._cleanUp();\n        this._sessionDispoables.dispose();\n    }\n    _cleanUp() {\n        this._widgetVisible.reset();\n        this._sessionDispoables.clear();\n        this._widget = undefined;\n        this._model = undefined;\n    }\n    _getOrCreateModel(uri) {\n        if (this._model && this._model.matches(uri)) {\n            return this._model;\n        }\n        let reusePosition = false;\n        if (this._model) {\n            reusePosition = true;\n            this._cleanUp();\n        }\n        this._model = this._markerNavigationService.getMarkerList(uri);\n        if (reusePosition) {\n            this._model.move(true, this._editor.getModel(), this._editor.getPosition());\n        }\n        this._widget = this._instantiationService.createInstance(MarkerNavigationWidget, this._editor);\n        this._widget.onDidClose(() => this.close(), this, this._sessionDispoables);\n        this._widgetVisible.set(true);\n        this._sessionDispoables.add(this._model);\n        this._sessionDispoables.add(this._widget);\n        // follow cursor\n        this._sessionDispoables.add(this._editor.onDidChangeCursorPosition(e => {\n            if (!this._model?.selected || !Range.containsPosition(this._model?.selected.marker, e.position)) {\n                this._model?.resetIndex();\n            }\n        }));\n        // update markers\n        this._sessionDispoables.add(this._model.onDidChange(() => {\n            if (!this._widget || !this._widget.position || !this._model) {\n                return;\n            }\n            const info = this._model.find(this._editor.getModel().uri, this._widget.position);\n            if (info) {\n                this._widget.updateMarker(info.marker);\n            }\n            else {\n                this._widget.showStale();\n            }\n        }));\n        // open related\n        this._sessionDispoables.add(this._widget.onDidSelectRelatedInformation(related => {\n            this._editorService.openCodeEditor({\n                resource: related.resource,\n                options: { pinned: true, revealIfOpened: true, selection: Range.lift(related).collapseToStart() }\n            }, this._editor);\n            this.close(false);\n        }));\n        this._sessionDispoables.add(this._editor.onDidChangeModel(() => this._cleanUp()));\n        return this._model;\n    }\n    close(focusEditor = true) {\n        this._cleanUp();\n        if (focusEditor) {\n            this._editor.focus();\n        }\n    }\n    showAtMarker(marker) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        const textModel = this._editor.getModel();\n        const model = this._getOrCreateModel(textModel.uri);\n        model.resetIndex();\n        model.move(true, textModel, new Position(marker.startLineNumber, marker.startColumn));\n        if (model.selected) {\n            this._widget.showAtMarker(model.selected.marker, model.selected.index, model.selected.total);\n        }\n    }\n    async navigate(next, multiFile) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        const textModel = this._editor.getModel();\n        const model = this._getOrCreateModel(multiFile ? undefined : textModel.uri);\n        model.move(next, textModel, this._editor.getPosition());\n        if (!model.selected) {\n            return;\n        }\n        if (model.selected.marker.resource.toString() !== textModel.uri.toString()) {\n            // show in different editor\n            this._cleanUp();\n            const otherEditor = await this._editorService.openCodeEditor({\n                resource: model.selected.marker.resource,\n                options: { pinned: false, revealIfOpened: true, selectionRevealType: 2 /* TextEditorSelectionRevealType.NearTop */, selection: model.selected.marker }\n            }, this._editor);\n            if (otherEditor) {\n                MarkerController_1.get(otherEditor)?.close();\n                MarkerController_1.get(otherEditor)?.navigate(next, multiFile);\n            }\n        }\n        else {\n            // show in this editor\n            this._widget.showAtMarker(model.selected.marker, model.selected.index, model.selected.total);\n        }\n    }\n};\nMarkerController = MarkerController_1 = __decorate([\n    __param(1, IMarkerNavigationService),\n    __param(2, IContextKeyService),\n    __param(3, ICodeEditorService),\n    __param(4, IInstantiationService)\n], MarkerController);\nclass MarkerNavigationAction extends EditorAction {\n    constructor(_next, _multiFile, opts) {\n        super(opts);\n        this._next = _next;\n        this._multiFile = _multiFile;\n    }\n    async run(_accessor, editor) {\n        if (editor.hasModel()) {\n            await MarkerController.get(editor)?.navigate(this._next, this._multiFile);\n        }\n    }\n}\nclass NextMarkerAction extends MarkerNavigationAction {\n    static { this.ID = 'editor.action.marker.next'; }\n    static { this.LABEL = localize2(1020, \"Go to Next Problem (Error, Warning, Info)\"); }\n    constructor() {\n        super(true, false, {\n            id: NextMarkerAction.ID,\n            label: NextMarkerAction.LABEL,\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.focus,\n                primary: 512 /* KeyMod.Alt */ | 66 /* KeyCode.F8 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MarkerNavigationWidget.TitleMenu,\n                title: NextMarkerAction.LABEL.value,\n                icon: registerIcon('marker-navigation-next', Codicon.arrowDown, localize(1016, 'Icon for goto next marker.')),\n                group: 'navigation',\n                order: 1\n            }\n        });\n    }\n}\nclass PrevMarkerAction extends MarkerNavigationAction {\n    static { this.ID = 'editor.action.marker.prev'; }\n    static { this.LABEL = localize2(1021, \"Go to Previous Problem (Error, Warning, Info)\"); }\n    constructor() {\n        super(false, false, {\n            id: PrevMarkerAction.ID,\n            label: PrevMarkerAction.LABEL,\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.focus,\n                primary: 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 66 /* KeyCode.F8 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MarkerNavigationWidget.TitleMenu,\n                title: PrevMarkerAction.LABEL.value,\n                icon: registerIcon('marker-navigation-previous', Codicon.arrowUp, localize(1017, 'Icon for goto previous marker.')),\n                group: 'navigation',\n                order: 2\n            }\n        });\n    }\n}\nclass NextMarkerInFilesAction extends MarkerNavigationAction {\n    constructor() {\n        super(true, true, {\n            id: 'editor.action.marker.nextInFiles',\n            label: localize2(1022, \"Go to Next Problem in Files (Error, Warning, Info)\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.focus,\n                primary: 66 /* KeyCode.F8 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarGoMenu,\n                title: localize(1018, \"Next &&Problem\"),\n                group: '6_problem_nav',\n                order: 1\n            }\n        });\n    }\n}\nclass PrevMarkerInFilesAction extends MarkerNavigationAction {\n    constructor() {\n        super(false, true, {\n            id: 'editor.action.marker.prevInFiles',\n            label: localize2(1023, \"Go to Previous Problem in Files (Error, Warning, Info)\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.focus,\n                primary: 1024 /* KeyMod.Shift */ | 66 /* KeyCode.F8 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarGoMenu,\n                title: localize(1019, \"Previous &&Problem\"),\n                group: '6_problem_nav',\n                order: 2\n            }\n        });\n    }\n}\nregisterEditorContribution(MarkerController.ID, MarkerController, 4 /* EditorContributionInstantiation.Lazy */);\nregisterEditorAction(NextMarkerAction);\nregisterEditorAction(PrevMarkerAction);\nregisterEditorAction(NextMarkerInFilesAction);\nregisterEditorAction(PrevMarkerInFilesAction);\nconst CONTEXT_MARKERS_NAVIGATION_VISIBLE = new RawContextKey('markersNavigationVisible', false);\nconst MarkerCommand = EditorCommand.bindToContribution(MarkerController.get);\nregisterEditorCommand(new MarkerCommand({\n    id: 'closeMarkersNavigation',\n    precondition: CONTEXT_MARKERS_NAVIGATION_VISIBLE,\n    handler: x => x.close(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 50,\n        kbExpr: EditorContextKeys.focus,\n        primary: 9 /* KeyCode.Escape */,\n        secondary: [1024 /* KeyMod.Shift */ | 9 /* KeyCode.Escape */]\n    }\n}));\n\nexport { MarkerController, NextMarkerAction };\n","import { $ as $$1, append, addDisposableListener, getDomNodePagePosition } from '../../../../base/browser/dom.js';\nimport { isNonEmptyArray } from '../../../../base/common/arrays.js';\nimport { disposableTimeout, createCancelablePromise } from '../../../../base/common/async.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { DisposableStore, Disposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { basename } from '../../../../base/common/resources.js';\nimport { Range } from '../../../common/core/range.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { IMarkerDecorationsService } from '../../../common/services/markerDecorations.js';\nimport { quickFixCommandId, ApplyCodeActionReason, getCodeActions } from '../../codeAction/browser/codeAction.js';\nimport { CodeActionController } from '../../codeAction/browser/codeActionController.js';\nimport { CodeActionTriggerSource, CodeActionKind } from '../../codeAction/common/types.js';\nimport { MarkerController, NextMarkerAction } from '../../gotoError/browser/gotoError.js';\nimport { RenderedHoverParts } from './hoverTypes.js';\nimport { localize } from '../../../../nls.js';\nimport { MarkerSeverity, IMarkerData } from '../../../../platform/markers/common/markers.js';\nimport { IOpenerService } from '../../../../platform/opener/common/opener.js';\nimport { Progress } from '../../../../platform/progress/common/progress.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst $ = $$1;\nclass MarkerHover {\n    constructor(owner, range, marker) {\n        this.owner = owner;\n        this.range = range;\n        this.marker = marker;\n    }\n    isValidForHoverAnchor(anchor) {\n        return (anchor.type === 1 /* HoverAnchorType.Range */\n            && this.range.startColumn <= anchor.range.startColumn\n            && this.range.endColumn >= anchor.range.endColumn);\n    }\n}\nconst markerCodeActionTrigger = {\n    type: 1 /* CodeActionTriggerType.Invoke */,\n    filter: { include: CodeActionKind.QuickFix },\n    triggerAction: CodeActionTriggerSource.QuickFixHover\n};\nlet MarkerHoverParticipant = class MarkerHoverParticipant {\n    constructor(_editor, _markerDecorationsService, _openerService, _languageFeaturesService) {\n        this._editor = _editor;\n        this._markerDecorationsService = _markerDecorationsService;\n        this._openerService = _openerService;\n        this._languageFeaturesService = _languageFeaturesService;\n        this.hoverOrdinal = 1;\n        this.recentMarkerCodeActionsInfo = undefined;\n    }\n    computeSync(anchor, lineDecorations) {\n        if (!this._editor.hasModel() || anchor.type !== 1 /* HoverAnchorType.Range */ && !anchor.supportsMarkerHover) {\n            return [];\n        }\n        const model = this._editor.getModel();\n        const anchorRange = anchor.range;\n        if (!model.isValidRange(anchor.range)) {\n            return [];\n        }\n        const lineNumber = anchorRange.startLineNumber;\n        const maxColumn = model.getLineMaxColumn(lineNumber);\n        const result = [];\n        for (const d of lineDecorations) {\n            const startColumn = (d.range.startLineNumber === lineNumber) ? d.range.startColumn : 1;\n            const endColumn = (d.range.endLineNumber === lineNumber) ? d.range.endColumn : maxColumn;\n            const marker = this._markerDecorationsService.getMarker(model.uri, d);\n            if (!marker) {\n                continue;\n            }\n            const range = new Range(anchor.range.startLineNumber, startColumn, anchor.range.startLineNumber, endColumn);\n            result.push(new MarkerHover(this, range, marker));\n        }\n        return result;\n    }\n    renderHoverParts(context, hoverParts) {\n        if (!hoverParts.length) {\n            return new RenderedHoverParts([]);\n        }\n        const renderedHoverParts = [];\n        hoverParts.forEach(hoverPart => {\n            const renderedMarkerHover = this._renderMarkerHover(hoverPart);\n            context.fragment.appendChild(renderedMarkerHover.hoverElement);\n            renderedHoverParts.push(renderedMarkerHover);\n        });\n        const markerHoverForStatusbar = hoverParts.length === 1 ? hoverParts[0] : hoverParts.sort((a, b) => MarkerSeverity.compare(a.marker.severity, b.marker.severity))[0];\n        const disposables = this._renderMarkerStatusbar(context, markerHoverForStatusbar);\n        return new RenderedHoverParts(renderedHoverParts, disposables);\n    }\n    getAccessibleContent(hoverPart) {\n        return hoverPart.marker.message;\n    }\n    _renderMarkerHover(markerHover) {\n        const disposables = new DisposableStore();\n        const hoverElement = $('div.hover-row');\n        const markerElement = append(hoverElement, $('div.marker.hover-contents'));\n        const { source, message, code, relatedInformation } = markerHover.marker;\n        this._editor.applyFontInfo(markerElement);\n        const messageElement = append(markerElement, $('span'));\n        messageElement.style.whiteSpace = 'pre-wrap';\n        messageElement.innerText = message;\n        if (source || code) {\n            // Code has link\n            if (code && typeof code !== 'string') {\n                const sourceAndCodeElement = $('span');\n                if (source) {\n                    const sourceElement = append(sourceAndCodeElement, $('span'));\n                    sourceElement.innerText = source;\n                }\n                const codeLink = append(sourceAndCodeElement, $('a.code-link'));\n                codeLink.setAttribute('href', code.target.toString(true));\n                disposables.add(addDisposableListener(codeLink, 'click', (e) => {\n                    this._openerService.open(code.target, { allowCommands: true });\n                    e.preventDefault();\n                    e.stopPropagation();\n                }));\n                const codeElement = append(codeLink, $('span'));\n                codeElement.innerText = code.value;\n                const detailsElement = append(markerElement, sourceAndCodeElement);\n                detailsElement.style.opacity = '0.6';\n                detailsElement.style.paddingLeft = '6px';\n            }\n            else {\n                const detailsElement = append(markerElement, $('span'));\n                detailsElement.style.opacity = '0.6';\n                detailsElement.style.paddingLeft = '6px';\n                detailsElement.innerText = source && code ? `${source}(${code})` : source ? source : `(${code})`;\n            }\n        }\n        if (isNonEmptyArray(relatedInformation)) {\n            for (const { message, resource, startLineNumber, startColumn } of relatedInformation) {\n                const relatedInfoContainer = append(markerElement, $('div'));\n                relatedInfoContainer.style.marginTop = '8px';\n                const a = append(relatedInfoContainer, $('a'));\n                a.innerText = `${basename(resource)}(${startLineNumber}, ${startColumn}): `;\n                a.style.cursor = 'pointer';\n                disposables.add(addDisposableListener(a, 'click', (e) => {\n                    e.stopPropagation();\n                    e.preventDefault();\n                    if (this._openerService) {\n                        const editorOptions = { selection: { startLineNumber, startColumn } };\n                        this._openerService.open(resource, {\n                            fromUserGesture: true,\n                            editorOptions\n                        }).catch(onUnexpectedError);\n                    }\n                }));\n                const messageElement = append(relatedInfoContainer, $('span'));\n                messageElement.innerText = message;\n                this._editor.applyFontInfo(messageElement);\n            }\n        }\n        const renderedHoverPart = {\n            hoverPart: markerHover,\n            hoverElement,\n            dispose: () => disposables.dispose()\n        };\n        return renderedHoverPart;\n    }\n    _renderMarkerStatusbar(context, markerHover) {\n        const disposables = new DisposableStore();\n        if (markerHover.marker.severity === MarkerSeverity.Error || markerHover.marker.severity === MarkerSeverity.Warning || markerHover.marker.severity === MarkerSeverity.Info) {\n            const markerController = MarkerController.get(this._editor);\n            if (markerController) {\n                context.statusBar.addAction({\n                    label: localize(1139, \"View Problem\"),\n                    commandId: NextMarkerAction.ID,\n                    run: () => {\n                        context.hide();\n                        markerController.showAtMarker(markerHover.marker);\n                        this._editor.focus();\n                    }\n                });\n            }\n        }\n        if (!this._editor.getOption(104 /* EditorOption.readOnly */)) {\n            const quickfixPlaceholderElement = context.statusBar.append($('div'));\n            if (this.recentMarkerCodeActionsInfo) {\n                if (IMarkerData.makeKey(this.recentMarkerCodeActionsInfo.marker) === IMarkerData.makeKey(markerHover.marker)) {\n                    if (!this.recentMarkerCodeActionsInfo.hasCodeActions) {\n                        quickfixPlaceholderElement.textContent = localize(1140, \"No quick fixes available\");\n                    }\n                }\n                else {\n                    this.recentMarkerCodeActionsInfo = undefined;\n                }\n            }\n            const updatePlaceholderDisposable = this.recentMarkerCodeActionsInfo && !this.recentMarkerCodeActionsInfo.hasCodeActions ? Disposable.None : disposableTimeout(() => quickfixPlaceholderElement.textContent = localize(1141, \"Checking for quick fixes...\"), 200, disposables);\n            if (!quickfixPlaceholderElement.textContent) {\n                // Have some content in here to avoid flickering\n                quickfixPlaceholderElement.textContent = String.fromCharCode(0xA0); // &nbsp;\n            }\n            const codeActionsPromise = this.getCodeActions(markerHover.marker);\n            disposables.add(toDisposable(() => codeActionsPromise.cancel()));\n            codeActionsPromise.then(actions => {\n                updatePlaceholderDisposable.dispose();\n                this.recentMarkerCodeActionsInfo = { marker: markerHover.marker, hasCodeActions: actions.validActions.length > 0 };\n                if (!this.recentMarkerCodeActionsInfo.hasCodeActions) {\n                    actions.dispose();\n                    quickfixPlaceholderElement.textContent = localize(1142, \"No quick fixes available\");\n                    return;\n                }\n                quickfixPlaceholderElement.style.display = 'none';\n                let showing = false;\n                disposables.add(toDisposable(() => {\n                    if (!showing) {\n                        actions.dispose();\n                    }\n                }));\n                context.statusBar.addAction({\n                    label: localize(1143, \"Quick Fix...\"),\n                    commandId: quickFixCommandId,\n                    run: (target) => {\n                        showing = true;\n                        const controller = CodeActionController.get(this._editor);\n                        const elementPosition = getDomNodePagePosition(target);\n                        // Hide the hover pre-emptively, otherwise the editor can close the code actions\n                        // context menu as well when using keyboard navigation\n                        context.hide();\n                        controller?.showCodeActions(markerCodeActionTrigger, actions, {\n                            x: elementPosition.left,\n                            y: elementPosition.top,\n                            width: elementPosition.width,\n                            height: elementPosition.height\n                        });\n                    }\n                });\n                const aiCodeAction = actions.validActions.find(action => action.action.isAI);\n                if (aiCodeAction) {\n                    context.statusBar.addAction({\n                        label: aiCodeAction.action.title,\n                        commandId: aiCodeAction.action.command?.id ?? '',\n                        iconClass: ThemeIcon.asClassName(Codicon.sparkle),\n                        run: () => {\n                            const controller = CodeActionController.get(this._editor);\n                            controller?.applyCodeAction(aiCodeAction, false, false, ApplyCodeActionReason.FromProblemsHover);\n                        }\n                    });\n                }\n                // Notify that the contents have changed given we added\n                // actions to the hover\n                // https://github.com/microsoft/vscode/issues/250424\n                context.onContentsChanged();\n            }, onUnexpectedError);\n        }\n        return disposables;\n    }\n    getCodeActions(marker) {\n        return createCancelablePromise(cancellationToken => {\n            return getCodeActions(this._languageFeaturesService.codeActionProvider, this._editor.getModel(), new Range(marker.startLineNumber, marker.startColumn, marker.endLineNumber, marker.endColumn), markerCodeActionTrigger, Progress.None, cancellationToken);\n        });\n    }\n};\nMarkerHoverParticipant = __decorate([\n    __param(1, IMarkerDecorationsService),\n    __param(2, IOpenerService),\n    __param(3, ILanguageFeaturesService)\n], MarkerHoverParticipant);\n\nexport { MarkerHover, MarkerHoverParticipant };\n","import { RenderedHoverParts } from './hoverTypes.js';\nimport { Disposable, toDisposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { EditorHoverStatusBar } from './contentHoverStatusBar.js';\nimport { HoverCopyButton } from './hoverCopyButton.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { addDisposableListener, EventType } from '../../../../base/browser/dom.js';\nimport { MarkdownHoverParticipant } from './markdownHoverParticipant.js';\nimport { HoverColorPickerParticipant } from '../../colorPicker/browser/hoverColorPicker/hoverColorPickerParticipant.js';\nimport { InlayHintsHover } from '../../inlayHints/browser/inlayHintsHover.js';\nimport { BugIndicatingError } from '../../../../base/common/errors.js';\nimport { IHoverService } from '../../../../platform/hover/browser/hover.js';\nimport { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';\nimport { MarkerHover } from './markerHoverParticipant.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar RenderedContentHover_1, RenderedContentHoverParts_1;\nlet RenderedContentHover = RenderedContentHover_1 = class RenderedContentHover extends Disposable {\n    constructor(editor, hoverResult, participants, context, keybindingService, hoverService, clipboardService) {\n        super();\n        const parts = hoverResult.hoverParts;\n        this._renderedHoverParts = this._register(new RenderedContentHoverParts(editor, participants, parts, context, keybindingService, hoverService, clipboardService));\n        const contentHoverComputerOptions = hoverResult.options;\n        const anchor = contentHoverComputerOptions.anchor;\n        const { showAtPosition, showAtSecondaryPosition } = RenderedContentHover_1.computeHoverPositions(editor, anchor.range, parts);\n        this.shouldAppearBeforeContent = parts.some(m => m.isBeforeContent);\n        this.showAtPosition = showAtPosition;\n        this.showAtSecondaryPosition = showAtSecondaryPosition;\n        this.initialMousePosX = anchor.initialMousePosX;\n        this.initialMousePosY = anchor.initialMousePosY;\n        this.shouldFocus = contentHoverComputerOptions.shouldFocus;\n        this.source = contentHoverComputerOptions.source;\n    }\n    get domNode() {\n        return this._renderedHoverParts.domNode;\n    }\n    get domNodeHasChildren() {\n        return this._renderedHoverParts.domNodeHasChildren;\n    }\n    get focusedHoverPartIndex() {\n        return this._renderedHoverParts.focusedHoverPartIndex;\n    }\n    get hoverPartsCount() {\n        return this._renderedHoverParts.hoverPartsCount;\n    }\n    focusHoverPartWithIndex(index) {\n        this._renderedHoverParts.focusHoverPartWithIndex(index);\n    }\n    async updateHoverVerbosityLevel(action, index, focus) {\n        this._renderedHoverParts.updateHoverVerbosityLevel(action, index, focus);\n    }\n    isColorPickerVisible() {\n        return this._renderedHoverParts.isColorPickerVisible();\n    }\n    static computeHoverPositions(editor, anchorRange, hoverParts) {\n        let startColumnBoundary = 1;\n        if (editor.hasModel()) {\n            // Ensure the range is on the current view line\n            const viewModel = editor._getViewModel();\n            const coordinatesConverter = viewModel.coordinatesConverter;\n            const anchorViewRange = coordinatesConverter.convertModelRangeToViewRange(anchorRange);\n            const anchorViewMinColumn = viewModel.getLineMinColumn(anchorViewRange.startLineNumber);\n            const anchorViewRangeStart = new Position(anchorViewRange.startLineNumber, anchorViewMinColumn);\n            startColumnBoundary = coordinatesConverter.convertViewPositionToModelPosition(anchorViewRangeStart).column;\n        }\n        // The anchor range is always on a single line\n        const anchorStartLineNumber = anchorRange.startLineNumber;\n        let secondaryPositionColumn = anchorRange.startColumn;\n        let forceShowAtRange;\n        for (const hoverPart of hoverParts) {\n            const hoverPartRange = hoverPart.range;\n            const hoverPartRangeOnAnchorStartLine = hoverPartRange.startLineNumber === anchorStartLineNumber;\n            const hoverPartRangeOnAnchorEndLine = hoverPartRange.endLineNumber === anchorStartLineNumber;\n            const hoverPartRangeIsOnAnchorLine = hoverPartRangeOnAnchorStartLine && hoverPartRangeOnAnchorEndLine;\n            if (hoverPartRangeIsOnAnchorLine) {\n                // this message has a range that is completely sitting on the line of the anchor\n                const hoverPartStartColumn = hoverPartRange.startColumn;\n                const minSecondaryPositionColumn = Math.min(secondaryPositionColumn, hoverPartStartColumn);\n                secondaryPositionColumn = Math.max(minSecondaryPositionColumn, startColumnBoundary);\n            }\n            if (hoverPart.forceShowAtRange) {\n                forceShowAtRange = hoverPartRange;\n            }\n        }\n        let showAtPosition;\n        let showAtSecondaryPosition;\n        if (forceShowAtRange) {\n            const forceShowAtPosition = forceShowAtRange.getStartPosition();\n            showAtPosition = forceShowAtPosition;\n            showAtSecondaryPosition = forceShowAtPosition;\n        }\n        else {\n            showAtPosition = anchorRange.getStartPosition();\n            showAtSecondaryPosition = new Position(anchorStartLineNumber, secondaryPositionColumn);\n        }\n        return {\n            showAtPosition,\n            showAtSecondaryPosition,\n        };\n    }\n};\nRenderedContentHover = RenderedContentHover_1 = __decorate([\n    __param(4, IKeybindingService),\n    __param(5, IHoverService),\n    __param(6, IClipboardService)\n], RenderedContentHover);\nclass RenderedStatusBar {\n    constructor(fragment, _statusBar) {\n        this._statusBar = _statusBar;\n        fragment.appendChild(this._statusBar.hoverElement);\n    }\n    get hoverElement() {\n        return this._statusBar.hoverElement;\n    }\n    get actions() {\n        return this._statusBar.actions;\n    }\n    dispose() {\n        this._statusBar.dispose();\n    }\n}\nlet RenderedContentHoverParts = class RenderedContentHoverParts extends Disposable {\n    static { RenderedContentHoverParts_1 = this; }\n    static { this._DECORATION_OPTIONS = ModelDecorationOptions.register({\n        description: 'content-hover-highlight',\n        className: 'hoverHighlight'\n    }); }\n    constructor(editor, participants, hoverParts, context, keybindingService, _hoverService, _clipboardService) {\n        super();\n        this._hoverService = _hoverService;\n        this._clipboardService = _clipboardService;\n        this._renderedParts = [];\n        this._focusedHoverPartIndex = -1;\n        this._context = context;\n        this._fragment = document.createDocumentFragment();\n        this._register(this._renderParts(participants, hoverParts, context, keybindingService, this._hoverService));\n        this._register(this._registerListenersOnRenderedParts());\n        this._register(this._createEditorDecorations(editor, hoverParts));\n        this._updateMarkdownAndColorParticipantInfo(participants);\n    }\n    _createEditorDecorations(editor, hoverParts) {\n        if (hoverParts.length === 0) {\n            return Disposable.None;\n        }\n        let highlightRange = hoverParts[0].range;\n        for (const hoverPart of hoverParts) {\n            const hoverPartRange = hoverPart.range;\n            highlightRange = Range.plusRange(highlightRange, hoverPartRange);\n        }\n        const highlightDecoration = editor.createDecorationsCollection();\n        highlightDecoration.set([{\n                range: highlightRange,\n                options: RenderedContentHoverParts_1._DECORATION_OPTIONS\n            }]);\n        return toDisposable(() => {\n            highlightDecoration.clear();\n        });\n    }\n    _renderParts(participants, hoverParts, hoverContext, keybindingService, hoverService) {\n        const statusBar = new EditorHoverStatusBar(keybindingService, hoverService);\n        const hoverRenderingContext = {\n            fragment: this._fragment,\n            statusBar,\n            ...hoverContext\n        };\n        const disposables = new DisposableStore();\n        disposables.add(statusBar);\n        for (const participant of participants) {\n            const renderedHoverParts = this._renderHoverPartsForParticipant(hoverParts, participant, hoverRenderingContext);\n            disposables.add(renderedHoverParts);\n            for (const renderedHoverPart of renderedHoverParts.renderedHoverParts) {\n                this._renderedParts.push({\n                    type: 'hoverPart',\n                    participant,\n                    hoverPart: renderedHoverPart.hoverPart,\n                    hoverElement: renderedHoverPart.hoverElement,\n                });\n            }\n        }\n        const renderedStatusBar = this._renderStatusBar(this._fragment, statusBar);\n        if (renderedStatusBar) {\n            disposables.add(renderedStatusBar);\n            this._renderedParts.push({\n                type: 'statusBar',\n                hoverElement: renderedStatusBar.hoverElement,\n                actions: renderedStatusBar.actions,\n            });\n        }\n        return disposables;\n    }\n    _renderHoverPartsForParticipant(hoverParts, participant, hoverRenderingContext) {\n        const hoverPartsForParticipant = hoverParts.filter(hoverPart => hoverPart.owner === participant);\n        const hasHoverPartsForParticipant = hoverPartsForParticipant.length > 0;\n        if (!hasHoverPartsForParticipant) {\n            return new RenderedHoverParts([]);\n        }\n        return participant.renderHoverParts(hoverRenderingContext, hoverPartsForParticipant);\n    }\n    _renderStatusBar(fragment, statusBar) {\n        if (!statusBar.hasContent) {\n            return undefined;\n        }\n        return new RenderedStatusBar(fragment, statusBar);\n    }\n    _registerListenersOnRenderedParts() {\n        const disposables = new DisposableStore();\n        this._renderedParts.forEach((renderedPart, index) => {\n            const element = renderedPart.hoverElement;\n            element.tabIndex = 0;\n            disposables.add(addDisposableListener(element, EventType.FOCUS_IN, (event) => {\n                event.stopPropagation();\n                this._focusedHoverPartIndex = index;\n            }));\n            disposables.add(addDisposableListener(element, EventType.FOCUS_OUT, (event) => {\n                event.stopPropagation();\n                this._focusedHoverPartIndex = -1;\n            }));\n            // Add copy button for marker hovers\n            if (renderedPart.type === 'hoverPart' && renderedPart.hoverPart instanceof MarkerHover) {\n                disposables.add(new HoverCopyButton(element, () => renderedPart.participant.getAccessibleContent(renderedPart.hoverPart), this._clipboardService, this._hoverService));\n            }\n        });\n        return disposables;\n    }\n    _updateMarkdownAndColorParticipantInfo(participants) {\n        const markdownHoverParticipant = participants.find(p => {\n            return (p instanceof MarkdownHoverParticipant) && !(p instanceof InlayHintsHover);\n        });\n        if (markdownHoverParticipant) {\n            this._markdownHoverParticipant = markdownHoverParticipant;\n        }\n        this._colorHoverParticipant = participants.find(p => p instanceof HoverColorPickerParticipant);\n    }\n    focusHoverPartWithIndex(index) {\n        if (index < 0 || index >= this._renderedParts.length) {\n            return;\n        }\n        this._renderedParts[index].hoverElement.focus();\n    }\n    async updateHoverVerbosityLevel(action, index, focus) {\n        if (!this._markdownHoverParticipant) {\n            return;\n        }\n        let rangeOfIndicesToUpdate;\n        if (index >= 0) {\n            rangeOfIndicesToUpdate = { start: index, endExclusive: index + 1 };\n        }\n        else {\n            rangeOfIndicesToUpdate = this._findRangeOfMarkdownHoverParts(this._markdownHoverParticipant);\n        }\n        for (let i = rangeOfIndicesToUpdate.start; i < rangeOfIndicesToUpdate.endExclusive; i++) {\n            const normalizedMarkdownHoverIndex = this._normalizedIndexToMarkdownHoverIndexRange(this._markdownHoverParticipant, i);\n            if (normalizedMarkdownHoverIndex === undefined) {\n                continue;\n            }\n            const renderedPart = await this._markdownHoverParticipant.updateMarkdownHoverVerbosityLevel(action, normalizedMarkdownHoverIndex);\n            if (!renderedPart) {\n                continue;\n            }\n            this._renderedParts[i] = {\n                type: 'hoverPart',\n                participant: this._markdownHoverParticipant,\n                hoverPart: renderedPart.hoverPart,\n                hoverElement: renderedPart.hoverElement,\n            };\n        }\n        if (focus) {\n            if (index >= 0) {\n                this.focusHoverPartWithIndex(index);\n            }\n            else {\n                this._context.focus();\n            }\n        }\n        this._context.onContentsChanged();\n    }\n    isColorPickerVisible() {\n        return this._colorHoverParticipant?.isColorPickerVisible() ?? false;\n    }\n    _normalizedIndexToMarkdownHoverIndexRange(markdownHoverParticipant, index) {\n        const renderedPart = this._renderedParts[index];\n        if (!renderedPart || renderedPart.type !== 'hoverPart') {\n            return undefined;\n        }\n        const isHoverPartMarkdownHover = renderedPart.participant === markdownHoverParticipant;\n        if (!isHoverPartMarkdownHover) {\n            return undefined;\n        }\n        const firstIndexOfMarkdownHovers = this._renderedParts.findIndex(renderedPart => renderedPart.type === 'hoverPart'\n            && renderedPart.participant === markdownHoverParticipant);\n        if (firstIndexOfMarkdownHovers === -1) {\n            throw new BugIndicatingError();\n        }\n        return index - firstIndexOfMarkdownHovers;\n    }\n    _findRangeOfMarkdownHoverParts(markdownHoverParticipant) {\n        const copiedRenderedParts = this._renderedParts.slice();\n        const firstIndexOfMarkdownHovers = copiedRenderedParts.findIndex(renderedPart => renderedPart.type === 'hoverPart' && renderedPart.participant === markdownHoverParticipant);\n        const inversedLastIndexOfMarkdownHovers = copiedRenderedParts.reverse().findIndex(renderedPart => renderedPart.type === 'hoverPart' && renderedPart.participant === markdownHoverParticipant);\n        const lastIndexOfMarkdownHovers = inversedLastIndexOfMarkdownHovers >= 0 ? copiedRenderedParts.length - inversedLastIndexOfMarkdownHovers : inversedLastIndexOfMarkdownHovers;\n        return { start: firstIndexOfMarkdownHovers, endExclusive: lastIndexOfMarkdownHovers + 1 };\n    }\n    get domNode() {\n        return this._fragment;\n    }\n    get domNodeHasChildren() {\n        return this._fragment.hasChildNodes();\n    }\n    get focusedHoverPartIndex() {\n        return this._focusedHoverPartIndex;\n    }\n    get hoverPartsCount() {\n        return this._renderedParts.length;\n    }\n};\nRenderedContentHoverParts = RenderedContentHoverParts_1 = __decorate([\n    __param(4, IKeybindingService),\n    __param(5, IHoverService),\n    __param(6, IClipboardService)\n], RenderedContentHoverParts);\n\nexport { RenderedContentHover };\n","import { addStandardDisposableListener } from '../../../../base/browser/dom.js';\nimport { Disposable, MutableDisposable } from '../../../../base/common/lifecycle.js';\nimport { TokenizationRegistry } from '../../../common/languages.js';\nimport { HoverOperation } from './hoverOperation.js';\nimport { HoverParticipantRegistry, HoverRangeAnchor } from './hoverTypes.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { ContentHoverWidget } from './contentHoverWidget.js';\nimport { ContentHoverComputer } from './contentHoverComputer.js';\nimport { ContentHoverResult } from './contentHoverTypes.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { RenderedContentHover } from './contentHoverRendered.js';\nimport { isMousePositionWithinElement } from './hoverUtils.js';\nimport { IHoverService } from '../../../../platform/hover/browser/hover.js';\nimport { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet ContentHoverWidgetWrapper = class ContentHoverWidgetWrapper extends Disposable {\n    constructor(_editor, _instantiationService, _keybindingService, _hoverService, _clipboardService) {\n        super();\n        this._editor = _editor;\n        this._instantiationService = _instantiationService;\n        this._keybindingService = _keybindingService;\n        this._hoverService = _hoverService;\n        this._clipboardService = _clipboardService;\n        this._currentResult = null;\n        this._renderedContentHover = this._register(new MutableDisposable());\n        this._onContentsChanged = this._register(new Emitter());\n        this.onContentsChanged = this._onContentsChanged.event;\n        this._contentHoverWidget = this._register(this._instantiationService.createInstance(ContentHoverWidget, this._editor));\n        this._participants = this._initializeHoverParticipants();\n        this._hoverOperation = this._register(new HoverOperation(this._editor, new ContentHoverComputer(this._editor, this._participants)));\n        this._registerListeners();\n    }\n    _initializeHoverParticipants() {\n        const participants = [];\n        for (const participant of HoverParticipantRegistry.getAll()) {\n            const participantInstance = this._instantiationService.createInstance(participant, this._editor);\n            participants.push(participantInstance);\n        }\n        participants.sort((p1, p2) => p1.hoverOrdinal - p2.hoverOrdinal);\n        this._register(this._contentHoverWidget.onDidResize(() => {\n            this._participants.forEach(participant => participant.handleResize?.());\n        }));\n        this._register(this._contentHoverWidget.onDidScroll((e) => {\n            this._participants.forEach(participant => participant.handleScroll?.(e));\n        }));\n        this._register(this._contentHoverWidget.onContentsChanged(() => {\n            this._participants.forEach(participant => participant.handleContentsChanged?.());\n        }));\n        return participants;\n    }\n    _registerListeners() {\n        this._register(this._hoverOperation.onResult((result) => {\n            const messages = (result.hasLoadingMessage ? this._addLoadingMessage(result) : result.value);\n            this._withResult(new ContentHoverResult(messages, result.isComplete, result.options));\n        }));\n        const contentHoverWidgetNode = this._contentHoverWidget.getDomNode();\n        this._register(addStandardDisposableListener(contentHoverWidgetNode, 'keydown', (e) => {\n            if (e.equals(9 /* KeyCode.Escape */)) {\n                this.hide();\n            }\n        }));\n        this._register(addStandardDisposableListener(contentHoverWidgetNode, 'mouseleave', (e) => {\n            this._onMouseLeave(e);\n        }));\n        this._register(TokenizationRegistry.onDidChange(() => {\n            if (this._contentHoverWidget.position && this._currentResult) {\n                this._setCurrentResult(this._currentResult); // render again\n            }\n        }));\n        this._register(this._contentHoverWidget.onContentsChanged(() => {\n            this._onContentsChanged.fire();\n        }));\n    }\n    /**\n     * Returns true if the hover shows now or will show.\n     */\n    _startShowingOrUpdateHover(anchor, mode, source, focus, mouseEvent) {\n        const contentHoverIsVisible = this._contentHoverWidget.position && this._currentResult;\n        if (!contentHoverIsVisible) {\n            if (anchor) {\n                this._startHoverOperationIfNecessary(anchor, mode, source, focus, false);\n                return true;\n            }\n            return false;\n        }\n        const isHoverSticky = this._editor.getOption(69 /* EditorOption.hover */).sticky;\n        const isMouseGettingCloser = mouseEvent && this._contentHoverWidget.isMouseGettingCloser(mouseEvent.event.posx, mouseEvent.event.posy);\n        const isHoverStickyAndIsMouseGettingCloser = isHoverSticky && isMouseGettingCloser;\n        // The mouse is getting closer to the hover, so we will keep the hover untouched\n        // But we will kick off a hover update at the new anchor, insisting on keeping the hover visible.\n        if (isHoverStickyAndIsMouseGettingCloser) {\n            if (anchor) {\n                this._startHoverOperationIfNecessary(anchor, mode, source, focus, true);\n            }\n            return true;\n        }\n        // If mouse is not getting closer and anchor not defined, hide the hover\n        if (!anchor) {\n            this._setCurrentResult(null);\n            return false;\n        }\n        // If mouse if not getting closer and anchor is defined, and the new anchor is the same as the previous anchor\n        const currentAnchorEqualsPreviousAnchor = this._currentResult && this._currentResult.options.anchor.equals(anchor);\n        if (currentAnchorEqualsPreviousAnchor) {\n            return true;\n        }\n        // If mouse if not getting closer and anchor is defined, and the new anchor is not compatible with the previous anchor\n        const currentAnchorCompatibleWithPreviousAnchor = this._currentResult && anchor.canAdoptVisibleHover(this._currentResult.options.anchor, this._contentHoverWidget.position);\n        if (!currentAnchorCompatibleWithPreviousAnchor) {\n            this._setCurrentResult(null);\n            this._startHoverOperationIfNecessary(anchor, mode, source, focus, false);\n            return true;\n        }\n        // We aren't getting any closer to the hover, so we will filter existing results\n        // and keep those which also apply to the new anchor.\n        if (this._currentResult) {\n            this._setCurrentResult(this._currentResult.filter(anchor));\n        }\n        this._startHoverOperationIfNecessary(anchor, mode, source, focus, false);\n        return true;\n    }\n    _startHoverOperationIfNecessary(anchor, mode, source, shouldFocus, insistOnKeepingHoverVisible) {\n        const currentAnchorEqualToPreviousHover = this._hoverOperation.options && this._hoverOperation.options.anchor.equals(anchor);\n        if (currentAnchorEqualToPreviousHover) {\n            return;\n        }\n        this._hoverOperation.cancel();\n        const contentHoverComputerOptions = {\n            anchor,\n            source,\n            shouldFocus,\n            insistOnKeepingHoverVisible\n        };\n        this._hoverOperation.start(mode, contentHoverComputerOptions);\n    }\n    _setCurrentResult(hoverResult) {\n        let currentHoverResult = hoverResult;\n        const currentResultEqualToPreviousResult = this._currentResult === currentHoverResult;\n        if (currentResultEqualToPreviousResult) {\n            return;\n        }\n        const currentHoverResultIsEmpty = currentHoverResult && currentHoverResult.hoverParts.length === 0;\n        if (currentHoverResultIsEmpty) {\n            currentHoverResult = null;\n        }\n        this._currentResult = currentHoverResult;\n        if (this._currentResult) {\n            this._showHover(this._currentResult);\n        }\n        else {\n            this._hideHover();\n        }\n    }\n    _addLoadingMessage(hoverResult) {\n        for (const participant of this._participants) {\n            if (!participant.createLoadingMessage) {\n                continue;\n            }\n            const loadingMessage = participant.createLoadingMessage(hoverResult.options.anchor);\n            if (!loadingMessage) {\n                continue;\n            }\n            return hoverResult.value.slice(0).concat([loadingMessage]);\n        }\n        return hoverResult.value;\n    }\n    _withResult(hoverResult) {\n        const previousHoverIsVisibleWithCompleteResult = this._contentHoverWidget.position && this._currentResult && this._currentResult.isComplete;\n        if (!previousHoverIsVisibleWithCompleteResult) {\n            this._setCurrentResult(hoverResult);\n        }\n        // The hover is visible with a previous complete result.\n        const isCurrentHoverResultComplete = hoverResult.isComplete;\n        if (!isCurrentHoverResultComplete) {\n            // Instead of rendering the new partial result, we wait for the result to be complete.\n            return;\n        }\n        const currentHoverResultIsEmpty = hoverResult.hoverParts.length === 0;\n        const insistOnKeepingPreviousHoverVisible = hoverResult.options.insistOnKeepingHoverVisible;\n        const shouldKeepPreviousHoverVisible = currentHoverResultIsEmpty && insistOnKeepingPreviousHoverVisible;\n        if (shouldKeepPreviousHoverVisible) {\n            // The hover would now hide normally, so we'll keep the previous messages\n            return;\n        }\n        this._setCurrentResult(hoverResult);\n    }\n    _showHover(hoverResult) {\n        const context = this._getHoverContext();\n        this._renderedContentHover.value = new RenderedContentHover(this._editor, hoverResult, this._participants, context, this._keybindingService, this._hoverService, this._clipboardService);\n        if (this._renderedContentHover.value.domNodeHasChildren) {\n            this._contentHoverWidget.show(this._renderedContentHover.value);\n        }\n        else {\n            this._renderedContentHover.clear();\n        }\n    }\n    _hideHover() {\n        this._contentHoverWidget.hide();\n        this._participants.forEach(participant => participant.handleHide?.());\n    }\n    _getHoverContext() {\n        const hide = () => {\n            this.hide();\n        };\n        const onContentsChanged = () => {\n            this._contentHoverWidget.handleContentsChanged();\n        };\n        const setMinimumDimensions = (dimensions) => {\n            this._contentHoverWidget.setMinimumDimensions(dimensions);\n        };\n        const focus = () => this.focus();\n        return { hide, onContentsChanged, setMinimumDimensions, focus };\n    }\n    showsOrWillShow(mouseEvent) {\n        const isContentWidgetResizing = this._contentHoverWidget.isResizing;\n        if (isContentWidgetResizing) {\n            return true;\n        }\n        const anchorCandidates = this._findHoverAnchorCandidates(mouseEvent);\n        const anchorCandidatesExist = anchorCandidates.length > 0;\n        if (!anchorCandidatesExist) {\n            return this._startShowingOrUpdateHover(null, 0 /* HoverStartMode.Delayed */, 0 /* HoverStartSource.Mouse */, false, mouseEvent);\n        }\n        const anchor = anchorCandidates[0];\n        return this._startShowingOrUpdateHover(anchor, 0 /* HoverStartMode.Delayed */, 0 /* HoverStartSource.Mouse */, false, mouseEvent);\n    }\n    _findHoverAnchorCandidates(mouseEvent) {\n        const anchorCandidates = [];\n        for (const participant of this._participants) {\n            if (!participant.suggestHoverAnchor) {\n                continue;\n            }\n            const anchor = participant.suggestHoverAnchor(mouseEvent);\n            if (!anchor) {\n                continue;\n            }\n            anchorCandidates.push(anchor);\n        }\n        const target = mouseEvent.target;\n        switch (target.type) {\n            case 6 /* MouseTargetType.CONTENT_TEXT */: {\n                anchorCandidates.push(new HoverRangeAnchor(0, target.range, mouseEvent.event.posx, mouseEvent.event.posy));\n                break;\n            }\n            case 7 /* MouseTargetType.CONTENT_EMPTY */: {\n                const epsilon = this._editor.getOption(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth / 2;\n                // Let hover kick in even when the mouse is technically in the empty area after a line, given the distance is small enough\n                const mouseIsWithinLinesAndCloseToHover = !target.detail.isAfterLines\n                    && typeof target.detail.horizontalDistanceToText === 'number'\n                    && target.detail.horizontalDistanceToText < epsilon;\n                if (!mouseIsWithinLinesAndCloseToHover) {\n                    break;\n                }\n                anchorCandidates.push(new HoverRangeAnchor(0, target.range, mouseEvent.event.posx, mouseEvent.event.posy));\n                break;\n            }\n        }\n        anchorCandidates.sort((a, b) => b.priority - a.priority);\n        return anchorCandidates;\n    }\n    _onMouseLeave(e) {\n        const editorDomNode = this._editor.getDomNode();\n        const isMousePositionOutsideOfEditor = !editorDomNode || !isMousePositionWithinElement(editorDomNode, e.x, e.y);\n        if (isMousePositionOutsideOfEditor) {\n            this.hide();\n        }\n    }\n    startShowingAtRange(range, mode, source, focus) {\n        this._startShowingOrUpdateHover(new HoverRangeAnchor(0, range, undefined, undefined), mode, source, focus, null);\n    }\n    async updateHoverVerbosityLevel(action, index, focus) {\n        this._renderedContentHover.value?.updateHoverVerbosityLevel(action, index, focus);\n    }\n    focusedHoverPartIndex() {\n        return this._renderedContentHover.value?.focusedHoverPartIndex ?? -1;\n    }\n    containsNode(node) {\n        return (node ? this._contentHoverWidget.getDomNode().contains(node) : false);\n    }\n    focus() {\n        const hoverPartsCount = this._renderedContentHover.value?.hoverPartsCount;\n        if (hoverPartsCount === 1) {\n            this.focusHoverPartWithIndex(0);\n            return;\n        }\n        this._contentHoverWidget.focus();\n    }\n    focusHoverPartWithIndex(index) {\n        this._renderedContentHover.value?.focusHoverPartWithIndex(index);\n    }\n    scrollUp() {\n        this._contentHoverWidget.scrollUp();\n    }\n    scrollDown() {\n        this._contentHoverWidget.scrollDown();\n    }\n    scrollLeft() {\n        this._contentHoverWidget.scrollLeft();\n    }\n    scrollRight() {\n        this._contentHoverWidget.scrollRight();\n    }\n    pageUp() {\n        this._contentHoverWidget.pageUp();\n    }\n    pageDown() {\n        this._contentHoverWidget.pageDown();\n    }\n    goToTop() {\n        this._contentHoverWidget.goToTop();\n    }\n    goToBottom() {\n        this._contentHoverWidget.goToBottom();\n    }\n    hide() {\n        this._hoverOperation.cancel();\n        this._setCurrentResult(null);\n    }\n    getDomNode() {\n        return this._contentHoverWidget.getDomNode();\n    }\n    get isColorPickerVisible() {\n        return this._renderedContentHover.value?.isColorPickerVisible() ?? false;\n    }\n    get isVisibleFromKeyboard() {\n        return this._contentHoverWidget.isVisibleFromKeyboard;\n    }\n    get isVisible() {\n        return this._contentHoverWidget.isVisible;\n    }\n    get isFocused() {\n        return this._contentHoverWidget.isFocused;\n    }\n    get isResizing() {\n        return this._contentHoverWidget.isResizing;\n    }\n    get widget() {\n        return this._contentHoverWidget;\n    }\n};\nContentHoverWidgetWrapper = __decorate([\n    __param(1, IInstantiationService),\n    __param(2, IKeybindingService),\n    __param(3, IHoverService),\n    __param(4, IClipboardService)\n], ContentHoverWidgetWrapper);\n\nexport { ContentHoverWidgetWrapper };\n","import { ColorDecorationInjectedTextMarker } from '../colorDetector.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction isOnColorDecorator(mouseEvent) {\n    const target = mouseEvent.target;\n    return !!target\n        && target.type === 6 /* MouseTargetType.CONTENT_TEXT */\n        && target.detail.injectedText?.options.attachedData === ColorDecorationInjectedTextMarker;\n}\n\nexport { isOnColorDecorator };\n","import { SHOW_OR_FOCUS_HOVER_ACTION_ID, INCREASE_HOVER_VERBOSITY_ACTION_ID, DECREASE_HOVER_VERBOSITY_ACTION_ID } from './hoverActionIds.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { InlineSuggestionHintsContentWidget } from '../../inlineCompletions/browser/hintsWidget/inlineCompletionsHintsWidget.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { isMousePositionWithinElement } from './hoverUtils.js';\nimport { ContentHoverWidgetWrapper } from './contentHoverWidgetWrapper.js';\nimport './hover.css';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { isOnColorDecorator } from '../../colorPicker/browser/hoverColorPicker/hoverColorPicker.js';\nimport { IContextMenuService } from '../../../../platform/contextview/browser/contextView.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ContentHoverController_1;\nlet ContentHoverController = class ContentHoverController extends Disposable {\n    static { ContentHoverController_1 = this; }\n    static { this.ID = 'editor.contrib.contentHover'; }\n    constructor(_editor, _contextMenuService, _instantiationService, _keybindingService) {\n        super();\n        this._editor = _editor;\n        this._instantiationService = _instantiationService;\n        this._keybindingService = _keybindingService;\n        this._onHoverContentsChanged = this._register(new Emitter());\n        this.shouldKeepOpenOnEditorMouseMoveOrLeave = false;\n        this._listenersStore = new DisposableStore();\n        this._isMouseDown = false;\n        this._ignoreMouseEvents = false;\n        this._reactToEditorMouseMoveRunner = this._register(new RunOnceScheduler(() => {\n            if (this._mouseMoveEvent) {\n                this._reactToEditorMouseMove(this._mouseMoveEvent);\n            }\n        }, 0));\n        this._register(_contextMenuService.onDidShowContextMenu(() => {\n            this.hideContentHover();\n            this._ignoreMouseEvents = true;\n        }));\n        this._register(_contextMenuService.onDidHideContextMenu(() => {\n            this._ignoreMouseEvents = false;\n        }));\n        this._hookListeners();\n        this._register(this._editor.onDidChangeConfiguration((e) => {\n            if (e.hasChanged(69 /* EditorOption.hover */)) {\n                this._unhookListeners();\n                this._hookListeners();\n            }\n        }));\n    }\n    static get(editor) {\n        return editor.getContribution(ContentHoverController_1.ID);\n    }\n    _hookListeners() {\n        const hoverOpts = this._editor.getOption(69 /* EditorOption.hover */);\n        this._hoverSettings = {\n            enabled: hoverOpts.enabled,\n            sticky: hoverOpts.sticky,\n            hidingDelay: hoverOpts.hidingDelay\n        };\n        if (!hoverOpts.enabled) {\n            this._cancelSchedulerAndHide();\n        }\n        this._listenersStore.add(this._editor.onMouseDown((e) => this._onEditorMouseDown(e)));\n        this._listenersStore.add(this._editor.onMouseUp(() => this._onEditorMouseUp()));\n        this._listenersStore.add(this._editor.onMouseMove((e) => this._onEditorMouseMove(e)));\n        this._listenersStore.add(this._editor.onKeyDown((e) => this._onKeyDown(e)));\n        this._listenersStore.add(this._editor.onMouseLeave((e) => this._onEditorMouseLeave(e)));\n        this._listenersStore.add(this._editor.onDidChangeModel(() => this._cancelSchedulerAndHide()));\n        this._listenersStore.add(this._editor.onDidChangeModelContent(() => this._cancelScheduler()));\n        this._listenersStore.add(this._editor.onDidScrollChange((e) => this._onEditorScrollChanged(e)));\n    }\n    _unhookListeners() {\n        this._listenersStore.clear();\n    }\n    _cancelSchedulerAndHide() {\n        this._cancelScheduler();\n        this.hideContentHover();\n    }\n    _cancelScheduler() {\n        this._mouseMoveEvent = undefined;\n        this._reactToEditorMouseMoveRunner.cancel();\n    }\n    _onEditorScrollChanged(e) {\n        if (this._ignoreMouseEvents) {\n            return;\n        }\n        if (e.scrollTopChanged || e.scrollLeftChanged) {\n            this.hideContentHover();\n        }\n    }\n    _onEditorMouseDown(mouseEvent) {\n        if (this._ignoreMouseEvents) {\n            return;\n        }\n        this._isMouseDown = true;\n        const shouldKeepHoverWidgetVisible = this._shouldKeepHoverWidgetVisible(mouseEvent);\n        if (shouldKeepHoverWidgetVisible) {\n            return;\n        }\n        this.hideContentHover();\n    }\n    _shouldKeepHoverWidgetVisible(mouseEvent) {\n        return this._isMouseOnContentHoverWidget(mouseEvent) || this._isContentWidgetResizing() || isOnColorDecorator(mouseEvent);\n    }\n    _isMouseOnContentHoverWidget(mouseEvent) {\n        if (!this._contentWidget) {\n            return false;\n        }\n        return isMousePositionWithinElement(this._contentWidget.getDomNode(), mouseEvent.event.posx, mouseEvent.event.posy);\n    }\n    _onEditorMouseUp() {\n        if (this._ignoreMouseEvents) {\n            return;\n        }\n        this._isMouseDown = false;\n    }\n    _onEditorMouseLeave(mouseEvent) {\n        if (this._ignoreMouseEvents) {\n            return;\n        }\n        if (this.shouldKeepOpenOnEditorMouseMoveOrLeave) {\n            return;\n        }\n        this._cancelScheduler();\n        const shouldKeepHoverWidgetVisible = this._shouldKeepHoverWidgetVisible(mouseEvent);\n        if (shouldKeepHoverWidgetVisible) {\n            return;\n        }\n        this.hideContentHover();\n    }\n    _shouldKeepCurrentHover(mouseEvent) {\n        const contentWidget = this._contentWidget;\n        if (!contentWidget) {\n            return false;\n        }\n        const isHoverSticky = this._hoverSettings.sticky;\n        const isMouseOnStickyContentHoverWidget = (mouseEvent, isHoverSticky) => {\n            const isMouseOnContentHoverWidget = this._isMouseOnContentHoverWidget(mouseEvent);\n            return isHoverSticky && isMouseOnContentHoverWidget;\n        };\n        const isMouseOnColorPickerOrChoosingColor = (mouseEvent) => {\n            const isColorPickerVisible = contentWidget.isColorPickerVisible;\n            const isMouseOnContentHoverWidget = this._isMouseOnContentHoverWidget(mouseEvent);\n            const isMouseOnHoverWithColorPicker = isColorPickerVisible && isMouseOnContentHoverWidget;\n            const isMaybeChoosingColor = isColorPickerVisible && this._isMouseDown;\n            return isMouseOnHoverWithColorPicker || isMaybeChoosingColor;\n        };\n        // TODO@aiday-mar verify if the following is necessary code\n        const isTextSelectedWithinContentHoverWidget = (mouseEvent, sticky) => {\n            const view = mouseEvent.event.browserEvent.view;\n            if (!view) {\n                return false;\n            }\n            return sticky && contentWidget.containsNode(view.document.activeElement) && !view.getSelection()?.isCollapsed;\n        };\n        const isFocused = contentWidget.isFocused;\n        const isResizing = contentWidget.isResizing;\n        const isStickyAndVisibleFromKeyboard = this._hoverSettings.sticky && contentWidget.isVisibleFromKeyboard;\n        return this.shouldKeepOpenOnEditorMouseMoveOrLeave\n            || isFocused\n            || isResizing\n            || isStickyAndVisibleFromKeyboard\n            || isMouseOnStickyContentHoverWidget(mouseEvent, isHoverSticky)\n            || isMouseOnColorPickerOrChoosingColor(mouseEvent)\n            || isTextSelectedWithinContentHoverWidget(mouseEvent, isHoverSticky);\n    }\n    _onEditorMouseMove(mouseEvent) {\n        if (this._ignoreMouseEvents) {\n            return;\n        }\n        this._mouseMoveEvent = mouseEvent;\n        const shouldKeepCurrentHover = this._shouldKeepCurrentHover(mouseEvent);\n        if (shouldKeepCurrentHover) {\n            this._reactToEditorMouseMoveRunner.cancel();\n            return;\n        }\n        const shouldRescheduleHoverComputation = this._shouldRescheduleHoverComputation();\n        if (shouldRescheduleHoverComputation) {\n            if (!this._reactToEditorMouseMoveRunner.isScheduled()) {\n                this._reactToEditorMouseMoveRunner.schedule(this._hoverSettings.hidingDelay);\n            }\n            return;\n        }\n        this._reactToEditorMouseMove(mouseEvent);\n    }\n    _shouldRescheduleHoverComputation() {\n        const hidingDelay = this._hoverSettings.hidingDelay;\n        const isContentHoverWidgetVisible = this._contentWidget?.isVisible ?? false;\n        // If the mouse is not over the widget, and if sticky is on,\n        // then give it a grace period before reacting to the mouse event\n        return isContentHoverWidgetVisible && this._hoverSettings.sticky && hidingDelay > 0;\n    }\n    _reactToEditorMouseMove(mouseEvent) {\n        if (this._hoverSettings.enabled) {\n            const contentWidget = this._getOrCreateContentWidget();\n            if (contentWidget.showsOrWillShow(mouseEvent)) {\n                return;\n            }\n        }\n        this.hideContentHover();\n    }\n    _onKeyDown(e) {\n        if (this._ignoreMouseEvents) {\n            return;\n        }\n        if (!this._contentWidget) {\n            return;\n        }\n        const isPotentialKeyboardShortcut = this._isPotentialKeyboardShortcut(e);\n        const isModifierKeyPressed = this._isModifierKeyPressed(e);\n        if (isPotentialKeyboardShortcut || isModifierKeyPressed) {\n            return;\n        }\n        if (this._contentWidget.isFocused && e.keyCode === 2 /* KeyCode.Tab */) {\n            return;\n        }\n        this.hideContentHover();\n    }\n    _isPotentialKeyboardShortcut(e) {\n        if (!this._editor.hasModel() || !this._contentWidget) {\n            return false;\n        }\n        const resolvedKeyboardEvent = this._keybindingService.softDispatch(e, this._editor.getDomNode());\n        const moreChordsAreNeeded = resolvedKeyboardEvent.kind === 1 /* ResultKind.MoreChordsNeeded */;\n        const isHoverAction = resolvedKeyboardEvent.kind === 2 /* ResultKind.KbFound */\n            && (resolvedKeyboardEvent.commandId === SHOW_OR_FOCUS_HOVER_ACTION_ID\n                || resolvedKeyboardEvent.commandId === INCREASE_HOVER_VERBOSITY_ACTION_ID\n                || resolvedKeyboardEvent.commandId === DECREASE_HOVER_VERBOSITY_ACTION_ID)\n            && this._contentWidget.isVisible;\n        return moreChordsAreNeeded || isHoverAction;\n    }\n    _isModifierKeyPressed(e) {\n        return e.keyCode === 5 /* KeyCode.Ctrl */\n            || e.keyCode === 6 /* KeyCode.Alt */\n            || e.keyCode === 57 /* KeyCode.Meta */\n            || e.keyCode === 4 /* KeyCode.Shift */;\n    }\n    hideContentHover() {\n        if (InlineSuggestionHintsContentWidget.dropDownVisible) {\n            return;\n        }\n        this._contentWidget?.hide();\n    }\n    _getOrCreateContentWidget() {\n        if (!this._contentWidget) {\n            this._contentWidget = this._instantiationService.createInstance(ContentHoverWidgetWrapper, this._editor);\n            this._listenersStore.add(this._contentWidget.onContentsChanged(() => this._onHoverContentsChanged.fire()));\n        }\n        return this._contentWidget;\n    }\n    showContentHover(range, mode, source, focus) {\n        this._getOrCreateContentWidget().startShowingAtRange(range, mode, source, focus);\n    }\n    _isContentWidgetResizing() {\n        return this._contentWidget?.widget.isResizing || false;\n    }\n    focusedHoverPartIndex() {\n        return this._getOrCreateContentWidget().focusedHoverPartIndex();\n    }\n    updateHoverVerbosityLevel(action, index, focus) {\n        this._getOrCreateContentWidget().updateHoverVerbosityLevel(action, index, focus);\n    }\n    focus() {\n        this._contentWidget?.focus();\n    }\n    scrollUp() {\n        this._contentWidget?.scrollUp();\n    }\n    scrollDown() {\n        this._contentWidget?.scrollDown();\n    }\n    scrollLeft() {\n        this._contentWidget?.scrollLeft();\n    }\n    scrollRight() {\n        this._contentWidget?.scrollRight();\n    }\n    pageUp() {\n        this._contentWidget?.pageUp();\n    }\n    pageDown() {\n        this._contentWidget?.pageDown();\n    }\n    goToTop() {\n        this._contentWidget?.goToTop();\n    }\n    goToBottom() {\n        this._contentWidget?.goToBottom();\n    }\n    get isColorPickerVisible() {\n        return this._contentWidget?.isColorPickerVisible;\n    }\n    get isHoverVisible() {\n        return this._contentWidget?.isVisible;\n    }\n    dispose() {\n        super.dispose();\n        this._unhookListeners();\n        this._listenersStore.dispose();\n        this._contentWidget?.dispose();\n    }\n};\nContentHoverController = ContentHoverController_1 = __decorate([\n    __param(1, IContextMenuService),\n    __param(2, IInstantiationService),\n    __param(3, IKeybindingService)\n], ContentHoverController);\n\nexport { ContentHoverController };\n","import { Disposable } from '../../../../../base/common/lifecycle.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { ContentHoverController } from '../../../hover/browser/contentHoverController.js';\nimport { isOnColorDecorator } from './hoverColorPicker.js';\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 *--------------------------------------------------------------------------------------------*/\nclass HoverColorPickerContribution extends Disposable {\n    static { this.ID = 'editor.contrib.colorContribution'; } // ms\n    constructor(_editor) {\n        super();\n        this._editor = _editor;\n        this._register(_editor.onMouseDown((e) => this.onMouseDown(e)));\n    }\n    dispose() {\n        super.dispose();\n    }\n    onMouseDown(mouseEvent) {\n        const colorDecoratorsActivatedOn = this._editor.getOption(168 /* EditorOption.colorDecoratorsActivatedOn */);\n        if (colorDecoratorsActivatedOn !== 'click' && colorDecoratorsActivatedOn !== 'clickAndHover') {\n            return;\n        }\n        if (!isOnColorDecorator(mouseEvent)) {\n            return;\n        }\n        const hoverController = this._editor.getContribution(ContentHoverController.ID);\n        if (!hoverController) {\n            return;\n        }\n        if (hoverController.isColorPickerVisible) {\n            return;\n        }\n        const targetRange = mouseEvent.target.range;\n        if (!targetRange) {\n            return;\n        }\n        const range = new Range(targetRange.startLineNumber, targetRange.startColumn + 1, targetRange.endLineNumber, targetRange.endColumn + 1);\n        hoverController.showContentHover(range, 1 /* HoverStartMode.Immediate */, 1 /* HoverStartSource.Click */, false);\n    }\n}\n\nexport { HoverColorPickerContribution };\n","import { CancellationToken } from '../../../../../base/common/cancellation.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport { IThemeService } from '../../../../../platform/theme/common/themeService.js';\nimport { getColors } from '../color.js';\nimport { ColorDetector } from '../colorDetector.js';\nimport { createColorHover, updateColorPresentations, updateEditorModel } from '../colorPickerParticipantUtils.js';\nimport { ColorPickerWidget } from '../colorPickerWidget.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { Dimension } from '../../../../../base/browser/dom.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass StandaloneColorPickerHover {\n    constructor(owner, range, model, provider) {\n        this.owner = owner;\n        this.range = range;\n        this.model = model;\n        this.provider = provider;\n    }\n    static fromBaseColor(owner, color) {\n        return new StandaloneColorPickerHover(owner, color.range, color.model, color.provider);\n    }\n}\nclass StandaloneColorPickerRenderedParts extends Disposable {\n    constructor(editor, context, colorHover, themeService) {\n        super();\n        const editorModel = editor.getModel();\n        const colorPickerModel = colorHover.model;\n        this.color = colorHover.model.color;\n        this.colorPicker = this._register(new ColorPickerWidget(context.fragment, colorPickerModel, editor.getOption(163 /* EditorOption.pixelRatio */), themeService, \"standalone\" /* ColorPickerWidgetType.Standalone */));\n        this._register(colorPickerModel.onColorFlushed((color) => {\n            this.color = color;\n        }));\n        this._register(colorPickerModel.onDidChangeColor((color) => {\n            updateColorPresentations(editorModel, colorPickerModel, color, colorHover.range, colorHover);\n        }));\n        this._register(editor.onDidChangeModelContent((e) => {\n            {\n                context.hide();\n                editor.focus();\n            }\n        }));\n        updateColorPresentations(editorModel, colorPickerModel, this.color, colorHover.range, colorHover);\n    }\n}\nlet StandaloneColorPickerParticipant = class StandaloneColorPickerParticipant {\n    constructor(_editor, _themeService) {\n        this._editor = _editor;\n        this._themeService = _themeService;\n    }\n    async createColorHover(defaultColorInfo, defaultColorProvider, colorProviderRegistry) {\n        if (!this._editor.hasModel()) {\n            return null;\n        }\n        const colorDetector = ColorDetector.get(this._editor);\n        if (!colorDetector) {\n            return null;\n        }\n        const colors = await getColors(colorProviderRegistry, this._editor.getModel(), CancellationToken.None);\n        let foundColorInfo = null;\n        let foundColorProvider = null;\n        for (const colorData of colors) {\n            const colorInfo = colorData.colorInfo;\n            if (Range.containsRange(colorInfo.range, defaultColorInfo.range)) {\n                foundColorInfo = colorInfo;\n                foundColorProvider = colorData.provider;\n            }\n        }\n        const colorInfo = foundColorInfo ?? defaultColorInfo;\n        const colorProvider = foundColorProvider ?? defaultColorProvider;\n        const foundInEditor = !!foundColorInfo;\n        const colorHover = StandaloneColorPickerHover.fromBaseColor(this, await createColorHover(this._editor.getModel(), colorInfo, colorProvider));\n        return { colorHover, foundInEditor };\n    }\n    async updateEditorModel(colorHoverData) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        const colorPickerModel = colorHoverData.model;\n        let range = new Range(colorHoverData.range.startLineNumber, colorHoverData.range.startColumn, colorHoverData.range.endLineNumber, colorHoverData.range.endColumn);\n        if (this._color) {\n            await updateColorPresentations(this._editor.getModel(), colorPickerModel, this._color, range, colorHoverData);\n            range = updateEditorModel(this._editor, range, colorPickerModel);\n        }\n    }\n    renderHoverParts(context, hoverParts) {\n        if (hoverParts.length === 0 || !this._editor.hasModel()) {\n            return undefined;\n        }\n        this._setMinimumDimensions(context);\n        this._renderedParts = new StandaloneColorPickerRenderedParts(this._editor, context, hoverParts[0], this._themeService);\n        return this._renderedParts;\n    }\n    _setMinimumDimensions(context) {\n        const minimumHeight = this._editor.getOption(75 /* EditorOption.lineHeight */) + 8;\n        context.setMinimumDimensions(new Dimension(302, minimumHeight));\n    }\n    get _color() {\n        return this._renderedParts?.color;\n    }\n};\nStandaloneColorPickerParticipant = __decorate([\n    __param(1, IThemeService)\n], StandaloneColorPickerParticipant);\n\nexport { StandaloneColorPickerHover, StandaloneColorPickerParticipant, StandaloneColorPickerRenderedParts };\n","import '../colorPicker.css';\nimport { Disposable, MutableDisposable } from '../../../../../base/common/lifecycle.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { EditorHoverStatusBar } from '../../../hover/browser/contentHoverStatusBar.js';\nimport { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';\nimport { Emitter } from '../../../../../base/common/event.js';\nimport { ILanguageFeaturesService } from '../../../../common/services/languageFeatures.js';\nimport { DefaultDocumentColorProvider } from '../defaultDocumentColorProvider.js';\nimport { IEditorWorkerService } from '../../../../common/services/editorWorker.js';\nimport { StandaloneColorPickerParticipant } from './standaloneColorPickerParticipant.js';\nimport { trackFocus } from '../../../../../base/browser/dom.js';\nimport { IHoverService } from '../../../../../platform/hover/browser/hover.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar StandaloneColorPickerWidget_1;\nclass StandaloneColorPickerResult {\n    // The color picker result consists of: an array of color results and a boolean indicating if the color was found in the editor\n    constructor(value, foundInEditor) {\n        this.value = value;\n        this.foundInEditor = foundInEditor;\n    }\n}\nconst PADDING = 8;\nconst CLOSE_BUTTON_WIDTH = 22;\nlet StandaloneColorPickerWidget = class StandaloneColorPickerWidget extends Disposable {\n    static { StandaloneColorPickerWidget_1 = this; }\n    static { this.ID = 'editor.contrib.standaloneColorPickerWidget'; }\n    constructor(_editor, _standaloneColorPickerVisible, _standaloneColorPickerFocused, _instantiationService, _keybindingService, _languageFeaturesService, _editorWorkerService, _hoverService) {\n        super();\n        this._editor = _editor;\n        this._standaloneColorPickerVisible = _standaloneColorPickerVisible;\n        this._standaloneColorPickerFocused = _standaloneColorPickerFocused;\n        this._keybindingService = _keybindingService;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._editorWorkerService = _editorWorkerService;\n        this._hoverService = _hoverService;\n        this.allowEditorOverflow = true;\n        this._position = undefined;\n        this._body = document.createElement('div');\n        this._colorHover = null;\n        this._selectionSetInEditor = false;\n        this._onResult = this._register(new Emitter());\n        this.onResult = this._onResult.event;\n        this._renderedHoverParts = this._register(new MutableDisposable());\n        this._renderedStatusBar = this._register(new MutableDisposable());\n        this._standaloneColorPickerVisible.set(true);\n        this._standaloneColorPickerParticipant = _instantiationService.createInstance(StandaloneColorPickerParticipant, this._editor);\n        this._position = this._editor._getViewModel()?.getPrimaryCursorState().modelState.position;\n        const editorSelection = this._editor.getSelection();\n        const selection = editorSelection ?\n            {\n                startLineNumber: editorSelection.startLineNumber,\n                startColumn: editorSelection.startColumn,\n                endLineNumber: editorSelection.endLineNumber,\n                endColumn: editorSelection.endColumn\n            } : { startLineNumber: 0, endLineNumber: 0, endColumn: 0, startColumn: 0 };\n        const focusTracker = this._register(trackFocus(this._body));\n        this._register(focusTracker.onDidBlur(_ => {\n            this.hide();\n        }));\n        this._register(focusTracker.onDidFocus(_ => {\n            this.focus();\n        }));\n        // When the cursor position changes, hide the color picker\n        this._register(this._editor.onDidChangeCursorPosition(() => {\n            // Do not hide the color picker when the cursor changes position due to the keybindings\n            if (!this._selectionSetInEditor) {\n                this.hide();\n            }\n            else {\n                this._selectionSetInEditor = false;\n            }\n        }));\n        this._register(this._editor.onMouseMove((e) => {\n            const classList = e.target.element?.classList;\n            if (classList && classList.contains('colorpicker-color-decoration')) {\n                this.hide();\n            }\n        }));\n        this._register(this.onResult((result) => {\n            this._render(result.value, result.foundInEditor);\n        }));\n        this._start(selection);\n        this._body.style.zIndex = '50';\n        this._editor.addContentWidget(this);\n    }\n    updateEditor() {\n        if (this._colorHover) {\n            this._standaloneColorPickerParticipant.updateEditorModel(this._colorHover);\n        }\n    }\n    getId() {\n        return StandaloneColorPickerWidget_1.ID;\n    }\n    getDomNode() {\n        return this._body;\n    }\n    getPosition() {\n        if (!this._position) {\n            return null;\n        }\n        const positionPreference = this._editor.getOption(69 /* EditorOption.hover */).above;\n        return {\n            position: this._position,\n            secondaryPosition: this._position,\n            preference: positionPreference ? [1 /* ContentWidgetPositionPreference.ABOVE */, 2 /* ContentWidgetPositionPreference.BELOW */] : [2 /* ContentWidgetPositionPreference.BELOW */, 1 /* ContentWidgetPositionPreference.ABOVE */],\n            positionAffinity: 2 /* PositionAffinity.None */\n        };\n    }\n    hide() {\n        this.dispose();\n        this._standaloneColorPickerVisible.set(false);\n        this._standaloneColorPickerFocused.set(false);\n        this._editor.removeContentWidget(this);\n        this._editor.focus();\n    }\n    focus() {\n        this._standaloneColorPickerFocused.set(true);\n        this._body.focus();\n    }\n    async _start(selection) {\n        const computeAsyncResult = await this._computeAsync(selection);\n        if (!computeAsyncResult) {\n            return;\n        }\n        this._onResult.fire(new StandaloneColorPickerResult(computeAsyncResult.result, computeAsyncResult.foundInEditor));\n    }\n    async _computeAsync(range) {\n        if (!this._editor.hasModel()) {\n            return null;\n        }\n        const colorInfo = {\n            range: range,\n            color: { red: 0, green: 0, blue: 0, alpha: 1 }\n        };\n        const colorHoverResult = await this._standaloneColorPickerParticipant.createColorHover(colorInfo, new DefaultDocumentColorProvider(this._editorWorkerService), this._languageFeaturesService.colorProvider);\n        if (!colorHoverResult) {\n            return null;\n        }\n        return { result: colorHoverResult.colorHover, foundInEditor: colorHoverResult.foundInEditor };\n    }\n    _render(colorHover, foundInEditor) {\n        const fragment = document.createDocumentFragment();\n        this._renderedStatusBar.value = this._register(new EditorHoverStatusBar(this._keybindingService, this._hoverService));\n        const context = {\n            fragment,\n            statusBar: this._renderedStatusBar.value,\n            onContentsChanged: () => { },\n            setMinimumDimensions: () => { },\n            hide: () => this.hide(),\n            focus: () => this.focus()\n        };\n        this._colorHover = colorHover;\n        this._renderedHoverParts.value = this._standaloneColorPickerParticipant.renderHoverParts(context, [colorHover]);\n        if (!this._renderedHoverParts.value) {\n            this._renderedStatusBar.clear();\n            this._renderedHoverParts.clear();\n            return;\n        }\n        const colorPicker = this._renderedHoverParts.value.colorPicker;\n        this._body.classList.add('standalone-colorpicker-body');\n        this._body.style.maxHeight = Math.max(this._editor.getLayoutInfo().height / 4, 250) + 'px';\n        this._body.style.maxWidth = Math.max(this._editor.getLayoutInfo().width * 0.66, 500) + 'px';\n        this._body.tabIndex = 0;\n        this._body.appendChild(fragment);\n        colorPicker.layout();\n        const colorPickerBody = colorPicker.body;\n        const saturationBoxWidth = colorPickerBody.saturationBox.domNode.clientWidth;\n        const widthOfOriginalColorBox = colorPickerBody.domNode.clientWidth - saturationBoxWidth - CLOSE_BUTTON_WIDTH - PADDING;\n        const enterButton = colorPicker.body.enterButton;\n        enterButton?.onClicked(() => {\n            this.updateEditor();\n            this.hide();\n        });\n        const colorPickerHeader = colorPicker.header;\n        const pickedColorNode = colorPickerHeader.pickedColorNode;\n        pickedColorNode.style.width = saturationBoxWidth + PADDING + 'px';\n        const originalColorNode = colorPickerHeader.originalColorNode;\n        originalColorNode.style.width = widthOfOriginalColorBox + 'px';\n        const closeButton = colorPicker.header.closeButton;\n        closeButton?.onClicked(() => {\n            this.hide();\n        });\n        // When found in the editor, highlight the selection in the editor\n        if (foundInEditor) {\n            if (enterButton) {\n                enterButton.button.textContent = 'Replace';\n            }\n            this._selectionSetInEditor = true;\n            this._editor.setSelection(colorHover.range);\n        }\n        this._editor.layoutContentWidget(this);\n    }\n};\nStandaloneColorPickerWidget = StandaloneColorPickerWidget_1 = __decorate([\n    __param(3, IInstantiationService),\n    __param(4, IKeybindingService),\n    __param(5, ILanguageFeaturesService),\n    __param(6, IEditorWorkerService),\n    __param(7, IHoverService)\n], StandaloneColorPickerWidget);\n\nexport { StandaloneColorPickerWidget };\n","import { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { EditorContextKeys } from '../../../../common/editorContextKeys.js';\nimport { StandaloneColorPickerWidget } from './standaloneColorPickerWidget.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar StandaloneColorPickerController_1;\nlet StandaloneColorPickerController = class StandaloneColorPickerController extends Disposable {\n    static { StandaloneColorPickerController_1 = this; }\n    static { this.ID = 'editor.contrib.standaloneColorPickerController'; }\n    constructor(_editor, _contextKeyService, _instantiationService) {\n        super();\n        this._editor = _editor;\n        this._instantiationService = _instantiationService;\n        this._standaloneColorPickerWidget = null;\n        this._standaloneColorPickerVisible = EditorContextKeys.standaloneColorPickerVisible.bindTo(_contextKeyService);\n        this._standaloneColorPickerFocused = EditorContextKeys.standaloneColorPickerFocused.bindTo(_contextKeyService);\n    }\n    showOrFocus() {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        if (!this._standaloneColorPickerVisible.get()) {\n            this._standaloneColorPickerWidget = this._instantiationService.createInstance(StandaloneColorPickerWidget, this._editor, this._standaloneColorPickerVisible, this._standaloneColorPickerFocused);\n        }\n        else if (!this._standaloneColorPickerFocused.get()) {\n            this._standaloneColorPickerWidget?.focus();\n        }\n    }\n    hide() {\n        this._standaloneColorPickerFocused.set(false);\n        this._standaloneColorPickerVisible.set(false);\n        this._standaloneColorPickerWidget?.hide();\n        this._editor.focus();\n    }\n    insertColor() {\n        this._standaloneColorPickerWidget?.updateEditor();\n        this.hide();\n    }\n    static get(editor) {\n        return editor.getContribution(StandaloneColorPickerController_1.ID);\n    }\n};\nStandaloneColorPickerController = StandaloneColorPickerController_1 = __decorate([\n    __param(1, IContextKeyService),\n    __param(2, IInstantiationService)\n], StandaloneColorPickerController);\n\nexport { StandaloneColorPickerController };\n","import { EditorAction, EditorAction2 } from '../../../../browser/editorExtensions.js';\nimport { localize2, localize } from '../../../../../nls.js';\nimport { EditorContextKeys } from '../../../../common/editorContextKeys.js';\nimport { MenuId } from '../../../../../platform/actions/common/actions.js';\nimport { StandaloneColorPickerController } from './standaloneColorPickerController.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ShowOrFocusStandaloneColorPicker extends EditorAction2 {\n    constructor() {\n        super({\n            id: 'editor.action.showOrFocusStandaloneColorPicker',\n            title: {\n                ...localize2(889, \"Show or Focus Standalone Color Picker\"),\n                mnemonicTitle: localize(888, \"&&Show or Focus Standalone Color Picker\"),\n            },\n            precondition: undefined,\n            menu: [\n                { id: MenuId.CommandPalette },\n            ],\n            metadata: {\n                description: localize2(890, \"Show or focus a standalone color picker which uses the default color provider. It displays hex/rgb/hsl colors.\"),\n            }\n        });\n    }\n    runEditorCommand(_accessor, editor) {\n        StandaloneColorPickerController.get(editor)?.showOrFocus();\n    }\n}\nclass HideStandaloneColorPicker extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.hideColorPicker',\n            label: localize2(891, \"Hide the Color Picker\"),\n\n\n\n\n\n            precondition: EditorContextKeys.standaloneColorPickerVisible.isEqualTo(true),\n            kbOpts: {\n                primary: 9 /* KeyCode.Escape */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: {\n                description: localize2(892, \"Hide the standalone color picker.\"),\n            }\n        });\n    }\n    run(_accessor, editor) {\n        StandaloneColorPickerController.get(editor)?.hide();\n    }\n}\nclass InsertColorWithStandaloneColorPicker extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.insertColorWithStandaloneColorPicker',\n            label: localize2(893, \"Insert Color with Standalone Color Picker\"),\n\n\n\n\n\n            precondition: EditorContextKeys.standaloneColorPickerFocused.isEqualTo(true),\n            kbOpts: {\n                primary: 3 /* KeyCode.Enter */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: {\n                description: localize2(894, \"Insert hex/rgb/hsl colors with the focused standalone color picker.\"),\n            }\n        });\n    }\n    run(_accessor, editor) {\n        StandaloneColorPickerController.get(editor)?.insertColor();\n    }\n}\n\nexport { HideStandaloneColorPicker, InsertColorWithStandaloneColorPicker, ShowOrFocusStandaloneColorPicker };\n","import { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { illegalArgument } from '../../../../base/common/errors.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { registerAction2 } from '../../../../platform/actions/common/actions.js';\nimport { CommandsRegistry } from '../../../../platform/commands/common/commands.js';\nimport { registerEditorAction, registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { registerEditorFeature } from '../../../common/editorFeatures.js';\nimport { HoverParticipantRegistry } from '../../hover/browser/hoverTypes.js';\nimport { _setupColorCommand, _findColorData, ExtColorDataCollector, ColorPresentationsCollector } from './color.js';\nimport { ColorDetector } from './colorDetector.js';\nimport { DefaultDocumentColorProviderFeature } from './defaultDocumentColorProvider.js';\nimport { HoverColorPickerContribution } from './hoverColorPicker/hoverColorPickerContribution.js';\nimport { HoverColorPickerParticipant } from './hoverColorPicker/hoverColorPickerParticipant.js';\nimport { HideStandaloneColorPicker, InsertColorWithStandaloneColorPicker, ShowOrFocusStandaloneColorPicker } from './standaloneColorPicker/standaloneColorPickerActions.js';\nimport { StandaloneColorPickerController } from './standaloneColorPicker/standaloneColorPickerController.js';\nimport { Range } from '../../../common/core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterEditorAction(HideStandaloneColorPicker);\nregisterEditorAction(InsertColorWithStandaloneColorPicker);\nregisterAction2(ShowOrFocusStandaloneColorPicker);\nregisterEditorContribution(HoverColorPickerContribution.ID, HoverColorPickerContribution, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\nregisterEditorContribution(StandaloneColorPickerController.ID, StandaloneColorPickerController, 1 /* EditorContributionInstantiation.AfterFirstRender */);\nregisterEditorContribution(ColorDetector.ID, ColorDetector, 1 /* EditorContributionInstantiation.AfterFirstRender */);\nregisterEditorFeature(DefaultDocumentColorProviderFeature);\nHoverParticipantRegistry.register(HoverColorPickerParticipant);\nCommandsRegistry.registerCommand('_executeDocumentColorProvider', function (accessor, ...args) {\n    const [resource] = args;\n    if (!(resource instanceof URI)) {\n        throw illegalArgument();\n    }\n    const { model, colorProviderRegistry, defaultColorDecoratorsEnablement } = _setupColorCommand(accessor, resource);\n    return _findColorData(new ExtColorDataCollector(), colorProviderRegistry, model, CancellationToken.None, defaultColorDecoratorsEnablement);\n});\nCommandsRegistry.registerCommand('_executeColorPresentationProvider', function (accessor, ...args) {\n    const [color, context] = args;\n    if (!context) {\n        return;\n    }\n    const { uri, range } = context;\n    if (!(uri instanceof URI) || !Array.isArray(color) || color.length !== 4 || !Range.isIRange(range)) {\n        throw illegalArgument();\n    }\n    const { model, colorProviderRegistry, defaultColorDecoratorsEnablement } = _setupColorCommand(accessor, uri);\n    const [red, green, blue, alpha] = color;\n    return _findColorData(new ColorPresentationsCollector({ range: range, color: { red, green, blue, alpha } }), colorProviderRegistry, model, CancellationToken.None, defaultColorDecoratorsEnablement);\n});\n","import { EditOperation } from '../../../common/core/editOperation.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\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 *--------------------------------------------------------------------------------------------*/\nclass BlockCommentCommand {\n    constructor(selection, insertSpace, languageConfigurationService) {\n        this.languageConfigurationService = languageConfigurationService;\n        this._selection = selection;\n        this._insertSpace = insertSpace;\n        this._usedEndToken = null;\n    }\n    static _haystackHasNeedleAtOffset(haystack, needle, offset) {\n        if (offset < 0) {\n            return false;\n        }\n        const needleLength = needle.length;\n        const haystackLength = haystack.length;\n        if (offset + needleLength > haystackLength) {\n            return false;\n        }\n        for (let i = 0; i < needleLength; i++) {\n            const codeA = haystack.charCodeAt(offset + i);\n            const codeB = needle.charCodeAt(i);\n            if (codeA === codeB) {\n                continue;\n            }\n            if (codeA >= 65 /* CharCode.A */ && codeA <= 90 /* CharCode.Z */ && codeA + 32 === codeB) {\n                // codeA is upper-case variant of codeB\n                continue;\n            }\n            if (codeB >= 65 /* CharCode.A */ && codeB <= 90 /* CharCode.Z */ && codeB + 32 === codeA) {\n                // codeB is upper-case variant of codeA\n                continue;\n            }\n            return false;\n        }\n        return true;\n    }\n    _createOperationsForBlockComment(selection, startToken, endToken, insertSpace, model, builder) {\n        const startLineNumber = selection.startLineNumber;\n        const startColumn = selection.startColumn;\n        const endLineNumber = selection.endLineNumber;\n        const endColumn = selection.endColumn;\n        const startLineText = model.getLineContent(startLineNumber);\n        const endLineText = model.getLineContent(endLineNumber);\n        let startTokenIndex = startLineText.lastIndexOf(startToken, startColumn - 1 + startToken.length);\n        let endTokenIndex = endLineText.indexOf(endToken, endColumn - 1 - endToken.length);\n        if (startTokenIndex !== -1 && endTokenIndex !== -1) {\n            if (startLineNumber === endLineNumber) {\n                const lineBetweenTokens = startLineText.substring(startTokenIndex + startToken.length, endTokenIndex);\n                if (lineBetweenTokens.indexOf(endToken) >= 0) {\n                    // force to add a block comment\n                    startTokenIndex = -1;\n                    endTokenIndex = -1;\n                }\n            }\n            else {\n                const startLineAfterStartToken = startLineText.substring(startTokenIndex + startToken.length);\n                const endLineBeforeEndToken = endLineText.substring(0, endTokenIndex);\n                if (startLineAfterStartToken.indexOf(endToken) >= 0 || endLineBeforeEndToken.indexOf(endToken) >= 0) {\n                    // force to add a block comment\n                    startTokenIndex = -1;\n                    endTokenIndex = -1;\n                }\n            }\n        }\n        let ops;\n        if (startTokenIndex !== -1 && endTokenIndex !== -1) {\n            // Consider spaces as part of the comment tokens\n            if (insertSpace && startTokenIndex + startToken.length < startLineText.length && startLineText.charCodeAt(startTokenIndex + startToken.length) === 32 /* CharCode.Space */) {\n                // Pretend the start token contains a trailing space\n                startToken = startToken + ' ';\n            }\n            if (insertSpace && endTokenIndex > 0 && endLineText.charCodeAt(endTokenIndex - 1) === 32 /* CharCode.Space */) {\n                // Pretend the end token contains a leading space\n                endToken = ' ' + endToken;\n                endTokenIndex -= 1;\n            }\n            ops = BlockCommentCommand._createRemoveBlockCommentOperations(new Range(startLineNumber, startTokenIndex + startToken.length + 1, endLineNumber, endTokenIndex + 1), startToken, endToken);\n        }\n        else {\n            ops = BlockCommentCommand._createAddBlockCommentOperations(selection, startToken, endToken, this._insertSpace);\n            this._usedEndToken = ops.length === 1 ? endToken : null;\n        }\n        for (const op of ops) {\n            builder.addTrackedEditOperation(op.range, op.text);\n        }\n    }\n    static _createRemoveBlockCommentOperations(r, startToken, endToken) {\n        const res = [];\n        if (!Range.isEmpty(r)) {\n            // Remove block comment start\n            res.push(EditOperation.delete(new Range(r.startLineNumber, r.startColumn - startToken.length, r.startLineNumber, r.startColumn)));\n            // Remove block comment end\n            res.push(EditOperation.delete(new Range(r.endLineNumber, r.endColumn, r.endLineNumber, r.endColumn + endToken.length)));\n        }\n        else {\n            // Remove both continuously\n            res.push(EditOperation.delete(new Range(r.startLineNumber, r.startColumn - startToken.length, r.endLineNumber, r.endColumn + endToken.length)));\n        }\n        return res;\n    }\n    static _createAddBlockCommentOperations(r, startToken, endToken, insertSpace) {\n        const res = [];\n        if (!Range.isEmpty(r)) {\n            // Insert block comment start\n            res.push(EditOperation.insert(new Position(r.startLineNumber, r.startColumn), startToken + (insertSpace ? ' ' : '')));\n            // Insert block comment end\n            res.push(EditOperation.insert(new Position(r.endLineNumber, r.endColumn), (insertSpace ? ' ' : '') + endToken));\n        }\n        else {\n            // Insert both continuously\n            res.push(EditOperation.replace(new Range(r.startLineNumber, r.startColumn, r.endLineNumber, r.endColumn), startToken + '  ' + endToken));\n        }\n        return res;\n    }\n    getEditOperations(model, builder) {\n        const startLineNumber = this._selection.startLineNumber;\n        const startColumn = this._selection.startColumn;\n        model.tokenization.tokenizeIfCheap(startLineNumber);\n        const languageId = model.getLanguageIdAtPosition(startLineNumber, startColumn);\n        const config = this.languageConfigurationService.getLanguageConfiguration(languageId).comments;\n        if (!config || !config.blockCommentStartToken || !config.blockCommentEndToken) {\n            // Mode does not support block comments\n            return;\n        }\n        this._createOperationsForBlockComment(this._selection, config.blockCommentStartToken, config.blockCommentEndToken, this._insertSpace, model, builder);\n    }\n    computeCursorState(model, helper) {\n        const inverseEditOperations = helper.getInverseEditOperations();\n        if (inverseEditOperations.length === 2) {\n            const startTokenEditOperation = inverseEditOperations[0];\n            const endTokenEditOperation = inverseEditOperations[1];\n            return new Selection(startTokenEditOperation.range.endLineNumber, startTokenEditOperation.range.endColumn, endTokenEditOperation.range.startLineNumber, endTokenEditOperation.range.startColumn);\n        }\n        else {\n            const srcRange = inverseEditOperations[0].range;\n            const deltaColumn = this._usedEndToken ? -this._usedEndToken.length - 1 : 0; // minus 1 space before endToken\n            return new Selection(srcRange.endLineNumber, srcRange.endColumn + deltaColumn, srcRange.endLineNumber, srcRange.endColumn + deltaColumn);\n        }\n    }\n}\n\nexport { BlockCommentCommand };\n","import { firstNonWhitespaceIndex } from '../../../../base/common/strings.js';\nimport { EditOperation } from '../../../common/core/editOperation.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { BlockCommentCommand } from './blockCommentCommand.js';\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 *--------------------------------------------------------------------------------------------*/\nclass LineCommentCommand {\n    constructor(languageConfigurationService, selection, indentSize, type, insertSpace, ignoreEmptyLines, ignoreFirstLine) {\n        this.languageConfigurationService = languageConfigurationService;\n        this._selection = selection;\n        this._indentSize = indentSize;\n        this._type = type;\n        this._insertSpace = insertSpace;\n        this._selectionId = null;\n        this._deltaColumn = 0;\n        this._moveEndPositionDown = false;\n        this._ignoreEmptyLines = ignoreEmptyLines;\n        this._ignoreFirstLine = ignoreFirstLine || false;\n    }\n    /**\n     * Do an initial pass over the lines and gather info about the line comment string.\n     * Returns null if any of the lines doesn't support a line comment string.\n     */\n    static _gatherPreflightCommentStrings(model, startLineNumber, endLineNumber, languageConfigurationService) {\n        model.tokenization.tokenizeIfCheap(startLineNumber);\n        const languageId = model.getLanguageIdAtPosition(startLineNumber, 1);\n        const config = languageConfigurationService.getLanguageConfiguration(languageId).comments;\n        const commentStr = (config ? config.lineCommentToken : null);\n        if (!commentStr) {\n            // Mode does not support line comments\n            return null;\n        }\n        const lines = [];\n        for (let i = 0, lineCount = endLineNumber - startLineNumber + 1; i < lineCount; i++) {\n            lines[i] = {\n                ignore: false,\n                commentStr: commentStr,\n                commentStrOffset: 0,\n                commentStrLength: commentStr.length\n            };\n        }\n        return lines;\n    }\n    /**\n     * Analyze lines and decide which lines are relevant and what the toggle should do.\n     * Also, build up several offsets and lengths useful in the generation of editor operations.\n     */\n    static _analyzeLines(type, insertSpace, model, lines, startLineNumber, ignoreEmptyLines, ignoreFirstLine, languageConfigurationService, languageId) {\n        let onlyWhitespaceLines = true;\n        const config = languageConfigurationService.getLanguageConfiguration(languageId).comments;\n        const lineCommentNoIndent = config?.lineCommentNoIndent ?? false;\n        let shouldRemoveComments;\n        if (type === 0 /* Type.Toggle */) {\n            shouldRemoveComments = true;\n        }\n        else if (type === 1 /* Type.ForceAdd */) {\n            shouldRemoveComments = false;\n        }\n        else {\n            shouldRemoveComments = true;\n        }\n        for (let i = 0, lineCount = lines.length; i < lineCount; i++) {\n            const lineData = lines[i];\n            const lineNumber = startLineNumber + i;\n            if (lineNumber === startLineNumber && ignoreFirstLine) {\n                // first line ignored\n                lineData.ignore = true;\n                continue;\n            }\n            const lineContent = model.getLineContent(lineNumber);\n            const lineContentStartOffset = firstNonWhitespaceIndex(lineContent);\n            if (lineContentStartOffset === -1) {\n                // Empty or whitespace only line\n                lineData.ignore = ignoreEmptyLines;\n                lineData.commentStrOffset = lineCommentNoIndent ? 0 : lineContent.length;\n                continue;\n            }\n            onlyWhitespaceLines = false;\n            const offset = lineCommentNoIndent ? 0 : lineContentStartOffset;\n            lineData.ignore = false;\n            lineData.commentStrOffset = offset;\n            if (shouldRemoveComments && !BlockCommentCommand._haystackHasNeedleAtOffset(lineContent, lineData.commentStr, offset)) {\n                if (type === 0 /* Type.Toggle */) {\n                    // Every line so far has been a line comment, but this one is not\n                    shouldRemoveComments = false;\n                }\n                else if (type === 1 /* Type.ForceAdd */) ;\n                else {\n                    lineData.ignore = true;\n                }\n            }\n            if (shouldRemoveComments && insertSpace) {\n                // Remove a following space if present\n                const commentStrEndOffset = lineContentStartOffset + lineData.commentStrLength;\n                if (commentStrEndOffset < lineContent.length && lineContent.charCodeAt(commentStrEndOffset) === 32 /* CharCode.Space */) {\n                    lineData.commentStrLength += 1;\n                }\n            }\n        }\n        if (type === 0 /* Type.Toggle */ && onlyWhitespaceLines) {\n            // For only whitespace lines, we insert comments\n            shouldRemoveComments = false;\n            // Also, no longer ignore them\n            for (let i = 0, lineCount = lines.length; i < lineCount; i++) {\n                lines[i].ignore = false;\n            }\n        }\n        return {\n            supported: true,\n            shouldRemoveComments: shouldRemoveComments,\n            lines: lines\n        };\n    }\n    /**\n     * Analyze all lines and decide exactly what to do => not supported | insert line comments | remove line comments\n     */\n    static _gatherPreflightData(type, insertSpace, model, startLineNumber, endLineNumber, ignoreEmptyLines, ignoreFirstLine, languageConfigurationService) {\n        const lines = LineCommentCommand._gatherPreflightCommentStrings(model, startLineNumber, endLineNumber, languageConfigurationService);\n        const languageId = model.getLanguageIdAtPosition(startLineNumber, 1);\n        if (lines === null) {\n            return {\n                supported: false\n            };\n        }\n        return LineCommentCommand._analyzeLines(type, insertSpace, model, lines, startLineNumber, ignoreEmptyLines, ignoreFirstLine, languageConfigurationService, languageId);\n    }\n    /**\n     * Given a successful analysis, execute either insert line comments, either remove line comments\n     */\n    _executeLineComments(model, builder, data, s) {\n        let ops;\n        if (data.shouldRemoveComments) {\n            ops = LineCommentCommand._createRemoveLineCommentsOperations(data.lines, s.startLineNumber);\n        }\n        else {\n            LineCommentCommand._normalizeInsertionPoint(model, data.lines, s.startLineNumber, this._indentSize);\n            ops = this._createAddLineCommentsOperations(data.lines, s.startLineNumber);\n        }\n        const cursorPosition = new Position(s.positionLineNumber, s.positionColumn);\n        for (let i = 0, len = ops.length; i < len; i++) {\n            builder.addEditOperation(ops[i].range, ops[i].text);\n            if (Range.isEmpty(ops[i].range) && Range.getStartPosition(ops[i].range).equals(cursorPosition)) {\n                const lineContent = model.getLineContent(cursorPosition.lineNumber);\n                if (lineContent.length + 1 === cursorPosition.column) {\n                    this._deltaColumn = (ops[i].text || '').length;\n                }\n            }\n        }\n        this._selectionId = builder.trackSelection(s);\n    }\n    _attemptRemoveBlockComment(model, s, startToken, endToken) {\n        let startLineNumber = s.startLineNumber;\n        let endLineNumber = s.endLineNumber;\n        const startTokenAllowedBeforeColumn = endToken.length + Math.max(model.getLineFirstNonWhitespaceColumn(s.startLineNumber), s.startColumn);\n        let startTokenIndex = model.getLineContent(startLineNumber).lastIndexOf(startToken, startTokenAllowedBeforeColumn - 1);\n        let endTokenIndex = model.getLineContent(endLineNumber).indexOf(endToken, s.endColumn - 1 - startToken.length);\n        if (startTokenIndex !== -1 && endTokenIndex === -1) {\n            endTokenIndex = model.getLineContent(startLineNumber).indexOf(endToken, startTokenIndex + startToken.length);\n            endLineNumber = startLineNumber;\n        }\n        if (startTokenIndex === -1 && endTokenIndex !== -1) {\n            startTokenIndex = model.getLineContent(endLineNumber).lastIndexOf(startToken, endTokenIndex);\n            startLineNumber = endLineNumber;\n        }\n        if (s.isEmpty() && (startTokenIndex === -1 || endTokenIndex === -1)) {\n            startTokenIndex = model.getLineContent(startLineNumber).indexOf(startToken);\n            if (startTokenIndex !== -1) {\n                endTokenIndex = model.getLineContent(startLineNumber).indexOf(endToken, startTokenIndex + startToken.length);\n            }\n        }\n        // We have to adjust to possible inner white space.\n        // For Space after startToken, add Space to startToken - range math will work out.\n        if (startTokenIndex !== -1 && model.getLineContent(startLineNumber).charCodeAt(startTokenIndex + startToken.length) === 32 /* CharCode.Space */) {\n            startToken += ' ';\n        }\n        // For Space before endToken, add Space before endToken and shift index one left.\n        if (endTokenIndex !== -1 && model.getLineContent(endLineNumber).charCodeAt(endTokenIndex - 1) === 32 /* CharCode.Space */) {\n            endToken = ' ' + endToken;\n            endTokenIndex -= 1;\n        }\n        if (startTokenIndex !== -1 && endTokenIndex !== -1) {\n            return BlockCommentCommand._createRemoveBlockCommentOperations(new Range(startLineNumber, startTokenIndex + startToken.length + 1, endLineNumber, endTokenIndex + 1), startToken, endToken);\n        }\n        return null;\n    }\n    /**\n     * Given an unsuccessful analysis, delegate to the block comment command\n     */\n    _executeBlockComment(model, builder, s) {\n        model.tokenization.tokenizeIfCheap(s.startLineNumber);\n        const languageId = model.getLanguageIdAtPosition(s.startLineNumber, 1);\n        const config = this.languageConfigurationService.getLanguageConfiguration(languageId).comments;\n        if (!config || !config.blockCommentStartToken || !config.blockCommentEndToken) {\n            // Mode does not support block comments\n            return;\n        }\n        const startToken = config.blockCommentStartToken;\n        const endToken = config.blockCommentEndToken;\n        let ops = this._attemptRemoveBlockComment(model, s, startToken, endToken);\n        if (!ops) {\n            if (s.isEmpty()) {\n                const lineContent = model.getLineContent(s.startLineNumber);\n                let firstNonWhitespaceIndex$1 = firstNonWhitespaceIndex(lineContent);\n                if (firstNonWhitespaceIndex$1 === -1) {\n                    // Line is empty or contains only whitespace\n                    firstNonWhitespaceIndex$1 = lineContent.length;\n                }\n                ops = BlockCommentCommand._createAddBlockCommentOperations(new Range(s.startLineNumber, firstNonWhitespaceIndex$1 + 1, s.startLineNumber, lineContent.length + 1), startToken, endToken, this._insertSpace);\n            }\n            else {\n                ops = BlockCommentCommand._createAddBlockCommentOperations(new Range(s.startLineNumber, model.getLineFirstNonWhitespaceColumn(s.startLineNumber), s.endLineNumber, model.getLineMaxColumn(s.endLineNumber)), startToken, endToken, this._insertSpace);\n            }\n            if (ops.length === 1) {\n                // Leave cursor after token and Space\n                this._deltaColumn = startToken.length + 1;\n            }\n        }\n        this._selectionId = builder.trackSelection(s);\n        for (const op of ops) {\n            builder.addEditOperation(op.range, op.text);\n        }\n    }\n    getEditOperations(model, builder) {\n        let s = this._selection;\n        this._moveEndPositionDown = false;\n        if (s.startLineNumber === s.endLineNumber && this._ignoreFirstLine) {\n            builder.addEditOperation(new Range(s.startLineNumber, model.getLineMaxColumn(s.startLineNumber), s.startLineNumber + 1, 1), s.startLineNumber === model.getLineCount() ? '' : '\\n');\n            this._selectionId = builder.trackSelection(s);\n            return;\n        }\n        if (s.startLineNumber < s.endLineNumber && s.endColumn === 1) {\n            this._moveEndPositionDown = true;\n            s = s.setEndPosition(s.endLineNumber - 1, model.getLineMaxColumn(s.endLineNumber - 1));\n        }\n        const data = LineCommentCommand._gatherPreflightData(this._type, this._insertSpace, model, s.startLineNumber, s.endLineNumber, this._ignoreEmptyLines, this._ignoreFirstLine, this.languageConfigurationService);\n        if (data.supported) {\n            return this._executeLineComments(model, builder, data, s);\n        }\n        return this._executeBlockComment(model, builder, s);\n    }\n    computeCursorState(model, helper) {\n        let result = helper.getTrackedSelection(this._selectionId);\n        if (this._moveEndPositionDown) {\n            result = result.setEndPosition(result.endLineNumber + 1, 1);\n        }\n        return new Selection(result.selectionStartLineNumber, result.selectionStartColumn + this._deltaColumn, result.positionLineNumber, result.positionColumn + this._deltaColumn);\n    }\n    /**\n     * Generate edit operations in the remove line comment case\n     */\n    static _createRemoveLineCommentsOperations(lines, startLineNumber) {\n        const res = [];\n        for (let i = 0, len = lines.length; i < len; i++) {\n            const lineData = lines[i];\n            if (lineData.ignore) {\n                continue;\n            }\n            res.push(EditOperation.delete(new Range(startLineNumber + i, lineData.commentStrOffset + 1, startLineNumber + i, lineData.commentStrOffset + lineData.commentStrLength + 1)));\n        }\n        return res;\n    }\n    /**\n     * Generate edit operations in the add line comment case\n     */\n    _createAddLineCommentsOperations(lines, startLineNumber) {\n        const res = [];\n        const afterCommentStr = this._insertSpace ? ' ' : '';\n        for (let i = 0, len = lines.length; i < len; i++) {\n            const lineData = lines[i];\n            if (lineData.ignore) {\n                continue;\n            }\n            res.push(EditOperation.insert(new Position(startLineNumber + i, lineData.commentStrOffset + 1), lineData.commentStr + afterCommentStr));\n        }\n        return res;\n    }\n    static nextVisibleColumn(currentVisibleColumn, indentSize, isTab, columnSize) {\n        if (isTab) {\n            return currentVisibleColumn + (indentSize - (currentVisibleColumn % indentSize));\n        }\n        return currentVisibleColumn + columnSize;\n    }\n    /**\n     * Adjust insertion points to have them vertically aligned in the add line comment case\n     */\n    static _normalizeInsertionPoint(model, lines, startLineNumber, indentSize) {\n        let minVisibleColumn = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n        let j;\n        let lenJ;\n        for (let i = 0, len = lines.length; i < len; i++) {\n            if (lines[i].ignore) {\n                continue;\n            }\n            const lineContent = model.getLineContent(startLineNumber + i);\n            let currentVisibleColumn = 0;\n            for (let j = 0, lenJ = lines[i].commentStrOffset; currentVisibleColumn < minVisibleColumn && j < lenJ; j++) {\n                currentVisibleColumn = LineCommentCommand.nextVisibleColumn(currentVisibleColumn, indentSize, lineContent.charCodeAt(j) === 9 /* CharCode.Tab */, 1);\n            }\n            if (currentVisibleColumn < minVisibleColumn) {\n                minVisibleColumn = currentVisibleColumn;\n            }\n        }\n        minVisibleColumn = Math.floor(minVisibleColumn / indentSize) * indentSize;\n        for (let i = 0, len = lines.length; i < len; i++) {\n            if (lines[i].ignore) {\n                continue;\n            }\n            const lineContent = model.getLineContent(startLineNumber + i);\n            let currentVisibleColumn = 0;\n            for (j = 0, lenJ = lines[i].commentStrOffset; currentVisibleColumn < minVisibleColumn && j < lenJ; j++) {\n                currentVisibleColumn = LineCommentCommand.nextVisibleColumn(currentVisibleColumn, indentSize, lineContent.charCodeAt(j) === 9 /* CharCode.Tab */, 1);\n            }\n            if (currentVisibleColumn > minVisibleColumn) {\n                lines[i].commentStrOffset = j - 1;\n            }\n            else {\n                lines[i].commentStrOffset = j;\n            }\n        }\n    }\n}\n\nexport { LineCommentCommand };\n","import { KeyChord } from '../../../../base/common/keyCodes.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { Range } from '../../../common/core/range.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { BlockCommentCommand } from './blockCommentCommand.js';\nimport { LineCommentCommand } from './lineCommentCommand.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CommentLineAction extends EditorAction {\n    constructor(type, opts) {\n        super(opts);\n        this._type = type;\n    }\n    run(accessor, editor) {\n        const languageConfigurationService = accessor.get(ILanguageConfigurationService);\n        if (!editor.hasModel()) {\n            return;\n        }\n        const model = editor.getModel();\n        const commands = [];\n        const modelOptions = model.getOptions();\n        const commentsOptions = editor.getOption(29 /* EditorOption.comments */);\n        const selections = editor.getSelections().map((selection, index) => ({ selection, index, ignoreFirstLine: false }));\n        selections.sort((a, b) => Range.compareRangesUsingStarts(a.selection, b.selection));\n        // Remove selections that would result in copying the same line\n        let prev = selections[0];\n        for (let i = 1; i < selections.length; i++) {\n            const curr = selections[i];\n            if (prev.selection.endLineNumber === curr.selection.startLineNumber) {\n                // these two selections would copy the same line\n                if (prev.index < curr.index) {\n                    // prev wins\n                    curr.ignoreFirstLine = true;\n                }\n                else {\n                    // curr wins\n                    prev.ignoreFirstLine = true;\n                    prev = curr;\n                }\n            }\n        }\n        for (const selection of selections) {\n            commands.push(new LineCommentCommand(languageConfigurationService, selection.selection, modelOptions.indentSize, this._type, commentsOptions.insertSpace, commentsOptions.ignoreEmptyLines, selection.ignoreFirstLine));\n        }\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, commands);\n        editor.pushUndoStop();\n    }\n}\nclass ToggleCommentLineAction extends CommentLineAction {\n    constructor() {\n        super(0 /* Type.Toggle */, {\n            id: 'editor.action.commentLine',\n            label: localize2(897, \"Toggle Line Comment\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 90 /* KeyCode.Slash */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarEditMenu,\n                group: '5_insert',\n                title: localize(895, \"&&Toggle Line Comment\"),\n                order: 1\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n}\nclass AddLineCommentAction extends CommentLineAction {\n    constructor() {\n        super(1 /* Type.ForceAdd */, {\n            id: 'editor.action.addCommentLine',\n            label: localize2(898, \"Add Line Comment\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 33 /* KeyCode.KeyC */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n}\nclass RemoveLineCommentAction extends CommentLineAction {\n    constructor() {\n        super(2 /* Type.ForceRemove */, {\n            id: 'editor.action.removeCommentLine',\n            label: localize2(899, \"Remove Line Comment\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 51 /* KeyCode.KeyU */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n}\nclass BlockCommentAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.blockComment',\n            label: localize2(900, \"Toggle Block Comment\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 31 /* KeyCode.KeyA */,\n                linux: { primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 31 /* KeyCode.KeyA */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarEditMenu,\n                group: '5_insert',\n                title: localize(896, \"Toggle &&Block Comment\"),\n                order: 2\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(accessor, editor) {\n        const languageConfigurationService = accessor.get(ILanguageConfigurationService);\n        if (!editor.hasModel()) {\n            return;\n        }\n        const commentsOptions = editor.getOption(29 /* EditorOption.comments */);\n        const commands = [];\n        const selections = editor.getSelections();\n        for (const selection of selections) {\n            commands.push(new BlockCommentCommand(selection, commentsOptions.insertSpace, languageConfigurationService));\n        }\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, commands);\n        editor.pushUndoStop();\n    }\n}\nregisterEditorAction(ToggleCommentLineAction);\nregisterEditorAction(AddLineCommentAction);\nregisterEditorAction(RemoveLineCommentAction);\nregisterEditorAction(BlockCommentAction);\n","import { getShadowRoot, getDomNodePagePosition } from '../../../../base/browser/dom.js';\nimport { ActionViewItem } from '../../../../base/browser/ui/actionbar/actionViewItems.js';\nimport { SubmenuAction, Separator } from '../../../../base/common/actions.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { isIOS } from '../../../../base/common/platform.js';\nimport { registerEditorContribution, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { SubmenuItemAction, IMenuService } from '../../../../platform/actions/common/actions.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IContextMenuService, IContextViewService } from '../../../../platform/contextview/browser/contextView.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { isStandaloneEditorWorkspace, IWorkspaceContextService } from '../../../../platform/workspace/common/workspace.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ContextMenuController_1;\nlet ContextMenuController = class ContextMenuController {\n    static { ContextMenuController_1 = this; }\n    static { this.ID = 'editor.contrib.contextmenu'; }\n    static get(editor) {\n        return editor.getContribution(ContextMenuController_1.ID);\n    }\n    constructor(editor, _contextMenuService, _contextViewService, _contextKeyService, _keybindingService, _menuService, _configurationService, _workspaceContextService) {\n        this._contextMenuService = _contextMenuService;\n        this._contextViewService = _contextViewService;\n        this._contextKeyService = _contextKeyService;\n        this._keybindingService = _keybindingService;\n        this._menuService = _menuService;\n        this._configurationService = _configurationService;\n        this._workspaceContextService = _workspaceContextService;\n        this._toDispose = new DisposableStore();\n        this._contextMenuIsBeingShownCount = 0;\n        this._editor = editor;\n        this._toDispose.add(this._editor.onContextMenu((e) => this._onContextMenu(e)));\n        this._toDispose.add(this._editor.onMouseWheel((e) => {\n            if (this._contextMenuIsBeingShownCount > 0) {\n                const view = this._contextViewService.getContextViewElement();\n                const target = e.srcElement;\n                // Event triggers on shadow root host first\n                // Check if the context view is under this host before hiding it #103169\n                if (!(target.shadowRoot && getShadowRoot(view) === target.shadowRoot)) {\n                    this._contextViewService.hideContextView();\n                }\n            }\n        }));\n        this._toDispose.add(this._editor.onKeyDown((e) => {\n            if (!this._editor.getOption(30 /* EditorOption.contextmenu */)) {\n                return; // Context menu is turned off through configuration\n            }\n            if (e.keyCode === 58 /* KeyCode.ContextMenu */) {\n                // Chrome is funny like that\n                e.preventDefault();\n                e.stopPropagation();\n                this.showContextMenu();\n            }\n        }));\n    }\n    _onContextMenu(e) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        if (!this._editor.getOption(30 /* EditorOption.contextmenu */)) {\n            this._editor.focus();\n            // Ensure the cursor is at the position of the mouse click\n            if (e.target.position && !this._editor.getSelection().containsPosition(e.target.position)) {\n                this._editor.setPosition(e.target.position);\n            }\n            return; // Context menu is turned off through configuration\n        }\n        if (e.target.type === 12 /* MouseTargetType.OVERLAY_WIDGET */) {\n            return; // allow native menu on widgets to support right click on input field for example in find\n        }\n        if (e.target.type === 6 /* MouseTargetType.CONTENT_TEXT */ && e.target.detail.injectedText) {\n            return; // allow native menu on injected text\n        }\n        e.event.preventDefault();\n        e.event.stopPropagation();\n        if (e.target.type === 11 /* MouseTargetType.SCROLLBAR */) {\n            return this._showScrollbarContextMenu(e.event);\n        }\n        if (e.target.type !== 6 /* MouseTargetType.CONTENT_TEXT */ && e.target.type !== 7 /* MouseTargetType.CONTENT_EMPTY */ && e.target.type !== 1 /* MouseTargetType.TEXTAREA */) {\n            return; // only support mouse click into text or native context menu key for now\n        }\n        // Ensure the editor gets focus if it hasn't, so the right events are being sent to other contributions\n        this._editor.focus();\n        // Ensure the cursor is at the position of the mouse click\n        if (e.target.position) {\n            let hasSelectionAtPosition = false;\n            for (const selection of this._editor.getSelections()) {\n                if (selection.containsPosition(e.target.position)) {\n                    hasSelectionAtPosition = true;\n                    break;\n                }\n            }\n            if (!hasSelectionAtPosition) {\n                this._editor.setPosition(e.target.position);\n            }\n        }\n        // Unless the user triggerd the context menu through Shift+F10, use the mouse position as menu position\n        let anchor = null;\n        if (e.target.type !== 1 /* MouseTargetType.TEXTAREA */) {\n            anchor = e.event;\n        }\n        // Show the context menu\n        this.showContextMenu(anchor);\n    }\n    showContextMenu(anchor) {\n        if (!this._editor.getOption(30 /* EditorOption.contextmenu */)) {\n            return; // Context menu is turned off through configuration\n        }\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        // Find actions available for menu\n        const menuActions = this._getMenuActions(this._editor.getModel(), this._editor.contextMenuId);\n        // Show menu if we have actions to show\n        if (menuActions.length > 0) {\n            this._doShowContextMenu(menuActions, anchor);\n        }\n    }\n    _getMenuActions(model, menuId) {\n        const result = [];\n        // get menu groups\n        const groups = this._menuService.getMenuActions(menuId, this._contextKeyService, { arg: model.uri });\n        // translate them into other actions\n        for (const group of groups) {\n            const [, actions] = group;\n            let addedItems = 0;\n            for (const action of actions) {\n                if (action instanceof SubmenuItemAction) {\n                    const subActions = this._getMenuActions(model, action.item.submenu);\n                    if (subActions.length > 0) {\n                        result.push(new SubmenuAction(action.id, action.label, subActions));\n                        addedItems++;\n                    }\n                }\n                else {\n                    result.push(action);\n                    addedItems++;\n                }\n            }\n            if (addedItems) {\n                result.push(new Separator());\n            }\n        }\n        if (result.length) {\n            result.pop(); // remove last separator\n        }\n        return result;\n    }\n    _doShowContextMenu(actions, event = null) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        let anchor = event;\n        if (!anchor) {\n            // Ensure selection is visible\n            this._editor.revealPosition(this._editor.getPosition(), 1 /* ScrollType.Immediate */);\n            this._editor.render();\n            const cursorCoords = this._editor.getScrolledVisiblePosition(this._editor.getPosition());\n            // Translate to absolute editor position\n            const editorCoords = getDomNodePagePosition(this._editor.getDomNode());\n            const posx = editorCoords.left + cursorCoords.left;\n            const posy = editorCoords.top + cursorCoords.top + cursorCoords.height;\n            anchor = { x: posx, y: posy };\n        }\n        const useShadowDOM = this._editor.getOption(144 /* EditorOption.useShadowDOM */) && !isIOS; // Do not use shadow dom on IOS #122035\n        // Show menu\n        this._contextMenuIsBeingShownCount++;\n        this._contextMenuService.showContextMenu({\n            domForShadowRoot: useShadowDOM ? this._editor.getOverflowWidgetsDomNode() ?? this._editor.getDomNode() : undefined,\n            getAnchor: () => anchor,\n            getActions: () => actions,\n            getActionViewItem: (action) => {\n                const keybinding = this._keybindingFor(action);\n                if (keybinding) {\n                    return new ActionViewItem(action, action, { label: true, keybinding: keybinding.getLabel(), isMenu: true });\n                }\n                const customAction = action;\n                if (typeof customAction.getActionViewItem === 'function') {\n                    return customAction.getActionViewItem();\n                }\n                return new ActionViewItem(action, action, { icon: true, label: true, isMenu: true });\n            },\n            getKeyBinding: (action) => {\n                return this._keybindingFor(action);\n            },\n            onHide: (wasCancelled) => {\n                this._contextMenuIsBeingShownCount--;\n            }\n        });\n    }\n    _showScrollbarContextMenu(anchor) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        if (isStandaloneEditorWorkspace(this._workspaceContextService.getWorkspace())) {\n            // can't update the configuration properly in the standalone editor\n            return;\n        }\n        const minimapOptions = this._editor.getOption(81 /* EditorOption.minimap */);\n        let lastId = 0;\n        const createAction = (opts) => {\n            return {\n                id: `menu-action-${++lastId}`,\n                label: opts.label,\n                tooltip: '',\n                class: undefined,\n                enabled: (typeof opts.enabled === 'undefined' ? true : opts.enabled),\n                checked: opts.checked,\n                run: opts.run\n            };\n        };\n        const createSubmenuAction = (label, actions) => {\n            return new SubmenuAction(`menu-action-${++lastId}`, label, actions, undefined);\n        };\n        const createEnumAction = (label, enabled, configName, configuredValue, options) => {\n            if (!enabled) {\n                return createAction({ label, enabled, run: () => { } });\n            }\n            const createRunner = (value) => {\n                return () => {\n                    this._configurationService.updateValue(configName, value);\n                };\n            };\n            const actions = [];\n            for (const option of options) {\n                actions.push(createAction({\n                    label: option.label,\n                    checked: configuredValue === option.value,\n                    run: createRunner(option.value)\n                }));\n            }\n            return createSubmenuAction(label, actions);\n        };\n        const actions = [];\n        actions.push(createAction({\n            label: localize(901, \"Minimap\"),\n            checked: minimapOptions.enabled,\n            run: () => {\n                this._configurationService.updateValue(`editor.minimap.enabled`, !minimapOptions.enabled);\n            }\n        }));\n        actions.push(new Separator());\n        actions.push(createAction({\n            label: localize(902, \"Render Characters\"),\n            enabled: minimapOptions.enabled,\n            checked: minimapOptions.renderCharacters,\n            run: () => {\n                this._configurationService.updateValue(`editor.minimap.renderCharacters`, !minimapOptions.renderCharacters);\n            }\n        }));\n        actions.push(createEnumAction(localize(903, \"Vertical size\"), minimapOptions.enabled, 'editor.minimap.size', minimapOptions.size, [{\n                label: localize(904, \"Proportional\"),\n                value: 'proportional'\n            }, {\n                label: localize(905, \"Fill\"),\n                value: 'fill'\n            }, {\n                label: localize(906, \"Fit\"),\n                value: 'fit'\n            }]));\n        actions.push(createEnumAction(localize(907, \"Slider\"), minimapOptions.enabled, 'editor.minimap.showSlider', minimapOptions.showSlider, [{\n                label: localize(908, \"Mouse Over\"),\n                value: 'mouseover'\n            }, {\n                label: localize(909, \"Always\"),\n                value: 'always'\n            }]));\n        const useShadowDOM = this._editor.getOption(144 /* EditorOption.useShadowDOM */) && !isIOS; // Do not use shadow dom on IOS #122035\n        this._contextMenuIsBeingShownCount++;\n        this._contextMenuService.showContextMenu({\n            domForShadowRoot: useShadowDOM ? this._editor.getDomNode() : undefined,\n            getAnchor: () => anchor,\n            getActions: () => actions,\n            onHide: (wasCancelled) => {\n                this._contextMenuIsBeingShownCount--;\n                this._editor.focus();\n            }\n        });\n    }\n    _keybindingFor(action) {\n        return this._keybindingService.lookupKeybinding(action.id);\n    }\n    dispose() {\n        if (this._contextMenuIsBeingShownCount > 0) {\n            this._contextViewService.hideContextView();\n        }\n        this._toDispose.dispose();\n    }\n};\nContextMenuController = ContextMenuController_1 = __decorate([\n    __param(1, IContextMenuService),\n    __param(2, IContextViewService),\n    __param(3, IContextKeyService),\n    __param(4, IKeybindingService),\n    __param(5, IMenuService),\n    __param(6, IConfigurationService),\n    __param(7, IWorkspaceContextService)\n], ContextMenuController);\nclass ShowContextMenu extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.showContextMenu',\n            label: localize2(910, \"Show Editor Context Menu\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 1024 /* KeyMod.Shift */ | 68 /* KeyCode.F10 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(accessor, editor) {\n        ContextMenuController.get(editor)?.showContextMenu();\n    }\n}\nregisterEditorContribution(ContextMenuController.ID, ContextMenuController, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\nregisterEditorAction(ShowContextMenu);\n\nexport { ContextMenuController };\n","import { Disposable } from '../../../../base/common/lifecycle.js';\nimport { registerEditorContribution, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { localize2 } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CursorState {\n    constructor(selections) {\n        this.selections = selections;\n    }\n    equals(other) {\n        const thisLen = this.selections.length;\n        const otherLen = other.selections.length;\n        if (thisLen !== otherLen) {\n            return false;\n        }\n        for (let i = 0; i < thisLen; i++) {\n            if (!this.selections[i].equalsSelection(other.selections[i])) {\n                return false;\n            }\n        }\n        return true;\n    }\n}\nclass StackElement {\n    constructor(cursorState, scrollTop, scrollLeft) {\n        this.cursorState = cursorState;\n        this.scrollTop = scrollTop;\n        this.scrollLeft = scrollLeft;\n    }\n}\nclass CursorUndoRedoController extends Disposable {\n    static { this.ID = 'editor.contrib.cursorUndoRedoController'; }\n    static get(editor) {\n        return editor.getContribution(CursorUndoRedoController.ID);\n    }\n    constructor(editor) {\n        super();\n        this._editor = editor;\n        this._isCursorUndoRedo = false;\n        this._undoStack = [];\n        this._redoStack = [];\n        this._register(editor.onDidChangeModel((e) => {\n            this._undoStack = [];\n            this._redoStack = [];\n        }));\n        this._register(editor.onDidChangeModelContent((e) => {\n            this._undoStack = [];\n            this._redoStack = [];\n        }));\n        this._register(editor.onDidChangeCursorSelection((e) => {\n            if (this._isCursorUndoRedo) {\n                return;\n            }\n            if (!e.oldSelections) {\n                return;\n            }\n            if (e.oldModelVersionId !== e.modelVersionId) {\n                return;\n            }\n            const prevState = new CursorState(e.oldSelections);\n            const isEqualToLastUndoStack = (this._undoStack.length > 0 && this._undoStack[this._undoStack.length - 1].cursorState.equals(prevState));\n            if (!isEqualToLastUndoStack) {\n                this._undoStack.push(new StackElement(prevState, editor.getScrollTop(), editor.getScrollLeft()));\n                this._redoStack = [];\n                if (this._undoStack.length > 50) {\n                    // keep the cursor undo stack bounded\n                    this._undoStack.shift();\n                }\n            }\n        }));\n    }\n    cursorUndo() {\n        if (!this._editor.hasModel() || this._undoStack.length === 0) {\n            return;\n        }\n        this._redoStack.push(new StackElement(new CursorState(this._editor.getSelections()), this._editor.getScrollTop(), this._editor.getScrollLeft()));\n        this._applyState(this._undoStack.pop());\n    }\n    cursorRedo() {\n        if (!this._editor.hasModel() || this._redoStack.length === 0) {\n            return;\n        }\n        this._undoStack.push(new StackElement(new CursorState(this._editor.getSelections()), this._editor.getScrollTop(), this._editor.getScrollLeft()));\n        this._applyState(this._redoStack.pop());\n    }\n    _applyState(stackElement) {\n        this._isCursorUndoRedo = true;\n        this._editor.setSelections(stackElement.cursorState.selections);\n        this._editor.setScrollPosition({\n            scrollTop: stackElement.scrollTop,\n            scrollLeft: stackElement.scrollLeft\n        });\n        this._isCursorUndoRedo = false;\n    }\n}\nclass CursorUndo extends EditorAction {\n    constructor() {\n        super({\n            id: 'cursorUndo',\n            label: localize2(911, \"Cursor Undo\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 51 /* KeyCode.KeyU */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(accessor, editor, args) {\n        CursorUndoRedoController.get(editor)?.cursorUndo();\n    }\n}\nclass CursorRedo extends EditorAction {\n    constructor() {\n        super({\n            id: 'cursorRedo',\n            label: localize2(912, \"Cursor Redo\"),\n            precondition: undefined\n        });\n    }\n    run(accessor, editor, args) {\n        CursorUndoRedoController.get(editor)?.cursorRedo();\n    }\n}\nregisterEditorContribution(CursorUndoRedoController.ID, CursorUndoRedoController, 0 /* EditorContributionInstantiation.Eager */); // eager because it needs to listen to record cursor state ASAP\nregisterEditorAction(CursorUndo);\nregisterEditorAction(CursorRedo);\n\nexport { CursorRedo, CursorUndo, CursorUndoRedoController };\n","import { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DragAndDropCommand {\n    constructor(selection, targetPosition, copy) {\n        this.selection = selection;\n        this.targetPosition = targetPosition;\n        this.copy = copy;\n        this.targetSelection = null;\n    }\n    getEditOperations(model, builder) {\n        const text = model.getValueInRange(this.selection);\n        if (!this.copy) {\n            builder.addEditOperation(this.selection, null);\n        }\n        builder.addEditOperation(new Range(this.targetPosition.lineNumber, this.targetPosition.column, this.targetPosition.lineNumber, this.targetPosition.column), text);\n        if (this.selection.containsPosition(this.targetPosition) && !(this.copy && (this.selection.getEndPosition().equals(this.targetPosition) || this.selection.getStartPosition().equals(this.targetPosition)) // we allow users to paste content beside the selection\n        )) {\n            this.targetSelection = this.selection;\n            return;\n        }\n        if (this.copy) {\n            this.targetSelection = new Selection(this.targetPosition.lineNumber, this.targetPosition.column, this.selection.endLineNumber - this.selection.startLineNumber + this.targetPosition.lineNumber, this.selection.startLineNumber === this.selection.endLineNumber ?\n                this.targetPosition.column + this.selection.endColumn - this.selection.startColumn :\n                this.selection.endColumn);\n            return;\n        }\n        if (this.targetPosition.lineNumber > this.selection.endLineNumber) {\n            // Drag the selection downwards\n            this.targetSelection = new Selection(this.targetPosition.lineNumber - this.selection.endLineNumber + this.selection.startLineNumber, this.targetPosition.column, this.targetPosition.lineNumber, this.selection.startLineNumber === this.selection.endLineNumber ?\n                this.targetPosition.column + this.selection.endColumn - this.selection.startColumn :\n                this.selection.endColumn);\n            return;\n        }\n        if (this.targetPosition.lineNumber < this.selection.endLineNumber) {\n            // Drag the selection upwards\n            this.targetSelection = new Selection(this.targetPosition.lineNumber, this.targetPosition.column, this.targetPosition.lineNumber + this.selection.endLineNumber - this.selection.startLineNumber, this.selection.startLineNumber === this.selection.endLineNumber ?\n                this.targetPosition.column + this.selection.endColumn - this.selection.startColumn :\n                this.selection.endColumn);\n            return;\n        }\n        // The target position is at the same line as the selection's end position.\n        if (this.selection.endColumn <= this.targetPosition.column) {\n            // The target position is after the selection's end position\n            this.targetSelection = new Selection(this.targetPosition.lineNumber - this.selection.endLineNumber + this.selection.startLineNumber, this.selection.startLineNumber === this.selection.endLineNumber ?\n                this.targetPosition.column - this.selection.endColumn + this.selection.startColumn :\n                this.targetPosition.column - this.selection.endColumn + this.selection.startColumn, this.targetPosition.lineNumber, this.selection.startLineNumber === this.selection.endLineNumber ?\n                this.targetPosition.column :\n                this.selection.endColumn);\n        }\n        else {\n            // The target position is before the selection's end position. Since the selection doesn't contain the target position, the selection is one-line and target position is before this selection.\n            this.targetSelection = new Selection(this.targetPosition.lineNumber - this.selection.endLineNumber + this.selection.startLineNumber, this.targetPosition.column, this.targetPosition.lineNumber, this.targetPosition.column + this.selection.endColumn - this.selection.startColumn);\n        }\n    }\n    computeCursorState(model, helper) {\n        return this.targetSelection;\n    }\n}\n\nexport { DragAndDropCommand };\n","import { Disposable } from '../../../../base/common/lifecycle.js';\nimport { isMacintosh } from '../../../../base/common/platform.js';\nimport './dnd.css';\nimport { registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { DragAndDropCommand } from './dragAndDropCommand.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction hasTriggerModifier(e) {\n    if (isMacintosh) {\n        return e.altKey;\n    }\n    else {\n        return e.ctrlKey;\n    }\n}\nclass DragAndDropController extends Disposable {\n    static { this.ID = 'editor.contrib.dragAndDrop'; }\n    static { this.TRIGGER_KEY_VALUE = isMacintosh ? 6 /* KeyCode.Alt */ : 5 /* KeyCode.Ctrl */; }\n    constructor(editor) {\n        super();\n        this._editor = editor;\n        this._dndDecorationIds = this._editor.createDecorationsCollection();\n        this._register(this._editor.onMouseDown((e) => this._onEditorMouseDown(e)));\n        this._register(this._editor.onMouseUp((e) => this._onEditorMouseUp(e)));\n        this._register(this._editor.onMouseDrag((e) => this._onEditorMouseDrag(e)));\n        this._register(this._editor.onMouseDrop((e) => this._onEditorMouseDrop(e)));\n        this._register(this._editor.onMouseDropCanceled(() => this._onEditorMouseDropCanceled()));\n        this._register(this._editor.onKeyDown((e) => this.onEditorKeyDown(e)));\n        this._register(this._editor.onKeyUp((e) => this.onEditorKeyUp(e)));\n        this._register(this._editor.onDidBlurEditorWidget(() => this.onEditorBlur()));\n        this._register(this._editor.onDidBlurEditorText(() => this.onEditorBlur()));\n        this._mouseDown = false;\n        this._modifierPressed = false;\n        this._dragSelection = null;\n    }\n    onEditorBlur() {\n        this._removeDecoration();\n        this._dragSelection = null;\n        this._mouseDown = false;\n        this._modifierPressed = false;\n    }\n    onEditorKeyDown(e) {\n        if (!this._editor.getOption(42 /* EditorOption.dragAndDrop */) || this._editor.getOption(28 /* EditorOption.columnSelection */)) {\n            return;\n        }\n        if (hasTriggerModifier(e)) {\n            this._modifierPressed = true;\n        }\n        if (this._mouseDown && hasTriggerModifier(e)) {\n            this._editor.updateOptions({\n                mouseStyle: 'copy'\n            });\n        }\n    }\n    onEditorKeyUp(e) {\n        if (!this._editor.getOption(42 /* EditorOption.dragAndDrop */) || this._editor.getOption(28 /* EditorOption.columnSelection */)) {\n            return;\n        }\n        if (hasTriggerModifier(e)) {\n            this._modifierPressed = false;\n        }\n        if (this._mouseDown && e.keyCode === DragAndDropController.TRIGGER_KEY_VALUE) {\n            this._editor.updateOptions({\n                mouseStyle: 'default'\n            });\n        }\n    }\n    _onEditorMouseDown(mouseEvent) {\n        this._mouseDown = true;\n    }\n    _onEditorMouseUp(mouseEvent) {\n        this._mouseDown = false;\n        // Whenever users release the mouse, the drag and drop operation should finish and the cursor should revert to text.\n        this._editor.updateOptions({\n            mouseStyle: 'text'\n        });\n    }\n    _onEditorMouseDrag(mouseEvent) {\n        const target = mouseEvent.target;\n        if (this._dragSelection === null) {\n            const selections = this._editor.getSelections() || [];\n            const possibleSelections = selections.filter(selection => target.position && selection.containsPosition(target.position));\n            if (possibleSelections.length === 1) {\n                this._dragSelection = possibleSelections[0];\n            }\n            else {\n                return;\n            }\n        }\n        if (hasTriggerModifier(mouseEvent.event)) {\n            this._editor.updateOptions({\n                mouseStyle: 'copy'\n            });\n        }\n        else {\n            this._editor.updateOptions({\n                mouseStyle: 'default'\n            });\n        }\n        if (target.position) {\n            if (this._dragSelection.containsPosition(target.position)) {\n                this._removeDecoration();\n            }\n            else {\n                this.showAt(target.position);\n            }\n        }\n    }\n    _onEditorMouseDropCanceled() {\n        this._editor.updateOptions({\n            mouseStyle: 'text'\n        });\n        this._removeDecoration();\n        this._dragSelection = null;\n        this._mouseDown = false;\n    }\n    _onEditorMouseDrop(mouseEvent) {\n        if (mouseEvent.target && (this._hitContent(mouseEvent.target) || this._hitMargin(mouseEvent.target)) && mouseEvent.target.position) {\n            const newCursorPosition = new Position(mouseEvent.target.position.lineNumber, mouseEvent.target.position.column);\n            if (this._dragSelection === null) {\n                let newSelections = null;\n                if (mouseEvent.event.shiftKey) {\n                    const primarySelection = this._editor.getSelection();\n                    if (primarySelection) {\n                        const { selectionStartLineNumber, selectionStartColumn } = primarySelection;\n                        newSelections = [new Selection(selectionStartLineNumber, selectionStartColumn, newCursorPosition.lineNumber, newCursorPosition.column)];\n                    }\n                }\n                else {\n                    newSelections = (this._editor.getSelections() || []).map(selection => {\n                        if (selection.containsPosition(newCursorPosition)) {\n                            return new Selection(newCursorPosition.lineNumber, newCursorPosition.column, newCursorPosition.lineNumber, newCursorPosition.column);\n                        }\n                        else {\n                            return selection;\n                        }\n                    });\n                }\n                // Use `mouse` as the source instead of `api` and setting the reason to explicit (to behave like any other mouse operation).\n                this._editor.setSelections(newSelections || [], 'mouse', 3 /* CursorChangeReason.Explicit */);\n            }\n            else if (!this._dragSelection.containsPosition(newCursorPosition) ||\n                ((hasTriggerModifier(mouseEvent.event) ||\n                    this._modifierPressed) && (this._dragSelection.getEndPosition().equals(newCursorPosition) || this._dragSelection.getStartPosition().equals(newCursorPosition)) // we allow users to paste content beside the selection\n                )) {\n                this._editor.pushUndoStop();\n                this._editor.executeCommand(DragAndDropController.ID, new DragAndDropCommand(this._dragSelection, newCursorPosition, hasTriggerModifier(mouseEvent.event) || this._modifierPressed));\n                this._editor.pushUndoStop();\n            }\n        }\n        this._editor.updateOptions({\n            mouseStyle: 'text'\n        });\n        this._removeDecoration();\n        this._dragSelection = null;\n        this._mouseDown = false;\n    }\n    static { this._DECORATION_OPTIONS = ModelDecorationOptions.register({\n        description: 'dnd-target',\n        className: 'dnd-target'\n    }); }\n    showAt(position) {\n        this._dndDecorationIds.set([{\n                range: new Range(position.lineNumber, position.column, position.lineNumber, position.column),\n                options: DragAndDropController._DECORATION_OPTIONS\n            }]);\n        this._editor.revealPosition(position, 1 /* ScrollType.Immediate */);\n    }\n    _removeDecoration() {\n        this._dndDecorationIds.clear();\n    }\n    _hitContent(target) {\n        return target.type === 6 /* MouseTargetType.CONTENT_TEXT */ ||\n            target.type === 7 /* MouseTargetType.CONTENT_EMPTY */;\n    }\n    _hitMargin(target) {\n        return target.type === 2 /* MouseTargetType.GUTTER_GLYPH_MARGIN */ ||\n            target.type === 3 /* MouseTargetType.GUTTER_LINE_NUMBERS */ ||\n            target.type === 4 /* MouseTargetType.GUTTER_LINE_DECORATIONS */;\n    }\n    dispose() {\n        this._removeDecoration();\n        this._dragSelection = null;\n        this._mouseDown = false;\n        this._modifierPressed = false;\n        super.dispose();\n    }\n}\nregisterEditorContribution(DragAndDropController.ID, DragAndDropController, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\n\nexport { DragAndDropController };\n","import { HierarchicalKind } from '../../../../base/common/hierarchicalKind.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { registerEditorContribution, registerEditorCommand, EditorCommand, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { registerEditorFeature } from '../../../common/editorFeatures.js';\nimport { CopyPasteController, pasteWidgetVisibleCtx, changePasteTypeCommandId } from './copyPasteController.js';\nimport { DefaultTextPasteOrDropEditProvider, DefaultPasteProvidersFeature } from './defaultProviders.js';\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 *--------------------------------------------------------------------------------------------*/\nconst pasteAsCommandId = 'editor.action.pasteAs';\nregisterEditorContribution(CopyPasteController.ID, CopyPasteController, 0 /* EditorContributionInstantiation.Eager */); // eager because it listens to events on the container dom node of the editor\nregisterEditorFeature(DefaultPasteProvidersFeature);\nregisterEditorCommand(new class extends EditorCommand {\n    constructor() {\n        super({\n            id: changePasteTypeCommandId,\n            precondition: pasteWidgetVisibleCtx,\n            kbOpts: {\n                weight: 100 /* KeybindingWeight.EditorContrib */,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 89 /* KeyCode.Period */,\n            }\n        });\n    }\n    runEditorCommand(_accessor, editor) {\n        return CopyPasteController.get(editor)?.changePasteType();\n    }\n});\nregisterEditorCommand(new class extends EditorCommand {\n    constructor() {\n        super({\n            id: 'editor.hidePasteWidget',\n            precondition: pasteWidgetVisibleCtx,\n            kbOpts: {\n                weight: 100 /* KeybindingWeight.EditorContrib */,\n                primary: 9 /* KeyCode.Escape */,\n            }\n        });\n    }\n    runEditorCommand(_accessor, editor) {\n        CopyPasteController.get(editor)?.clearWidgets();\n    }\n});\nregisterEditorAction(class PasteAsAction extends EditorAction {\n    static { this.argsSchema = {\n        oneOf: [\n            {\n                type: 'object',\n                required: ['kind'],\n                properties: {\n                    kind: {\n                        type: 'string',\n                        description: localize(913, \"The kind of the paste edit to try pasting with.\\nIf there are multiple edits for this kind, the editor will show a picker. If there are no edits of this kind, the editor will show an error message.\"),\n                    }\n                },\n            },\n            {\n                type: 'object',\n                required: ['preferences'],\n                properties: {\n                    preferences: {\n                        type: 'array',\n                        description: localize(914, \"List of preferred paste edit kind to try applying.\\nThe first edit matching the preferences will be applied.\"),\n                        items: { type: 'string' }\n                    }\n                },\n            }\n        ]\n    }; }\n    constructor() {\n        super({\n            id: pasteAsCommandId,\n            label: localize2(915, \"Paste As...\"),\n            precondition: EditorContextKeys.writable,\n            metadata: {\n                description: 'Paste as',\n                args: [{\n                        name: 'args',\n                        schema: PasteAsAction.argsSchema\n                    }]\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(_accessor, editor, args) {\n        let preference;\n        if (args) {\n            if ('kind' in args) {\n                preference = { only: new HierarchicalKind(args.kind) };\n            }\n            else if ('preferences' in args) {\n                preference = { preferences: args.preferences.map(kind => new HierarchicalKind(kind)) };\n            }\n        }\n        return CopyPasteController.get(editor)?.pasteAs(preference);\n    }\n});\nregisterEditorAction(class extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.pasteAsText',\n            label: localize2(916, \"Paste as Text\"),\n            precondition: EditorContextKeys.writable,\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(_accessor, editor) {\n        return CopyPasteController.get(editor)?.pasteAs({ providerId: DefaultTextPasteOrDropEditProvider.id });\n    }\n});\n\nexport { pasteAsCommandId };\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 *--------------------------------------------------------------------------------------------*/\nclass TreeViewsDnDService {\n    constructor() {\n        this._dragOperations = new Map();\n    }\n    removeDragOperationTransfer(uuid) {\n        if ((uuid && this._dragOperations.has(uuid))) {\n            const operation = this._dragOperations.get(uuid);\n            this._dragOperations.delete(uuid);\n            return operation;\n        }\n        return undefined;\n    }\n}\nclass DraggedTreeItemsIdentifier {\n    constructor(identifier) {\n        this.identifier = identifier;\n    }\n}\n\nexport { DraggedTreeItemsIdentifier, TreeViewsDnDService };\n","import { registerSingleton } from '../../../platform/instantiation/common/extensions.js';\nimport { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\nimport { TreeViewsDnDService } from './treeViewsDnd.js';\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 *--------------------------------------------------------------------------------------------*/\nconst ITreeViewsDnDService = createDecorator('treeViewsDndService');\nregisterSingleton(ITreeViewsDnDService, TreeViewsDnDService, 1 /* InstantiationType.Delayed */);\n\nexport { ITreeViewsDnDService };\n","import { coalesce } from '../../../../base/common/arrays.js';\nimport { createCancelablePromise, raceCancellation } from '../../../../base/common/async.js';\nimport { VSDataTransfer } from '../../../../base/common/dataTransfer.js';\nimport { isCancellationError } from '../../../../base/common/errors.js';\nimport { HierarchicalKind } from '../../../../base/common/hierarchicalKind.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { localize } from '../../../../nls.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { RawContextKey } from '../../../../platform/contextkey/common/contextkey.js';\nimport { LocalSelectionTransfer } from '../../../../platform/dnd/browser/dnd.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { toExternalVSDataTransfer } from '../../../browser/dataTransfer.js';\nimport { Range } from '../../../common/core/range.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { DraggedTreeItemsIdentifier } from '../../../common/services/treeViewsDnd.js';\nimport { ITreeViewsDnDService } from '../../../common/services/treeViewsDndService.js';\nimport { EditorStateCancellationTokenSource } from '../../editorState/browser/editorState.js';\nimport { InlineProgressManager } from '../../inlineProgress/browser/inlineProgress.js';\nimport { sortEditsByYieldTo } from './edit.js';\nimport { PostEditWidgetManager } from './postEditWidget.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar DropIntoEditorController_1;\nconst dropAsPreferenceConfig = 'editor.dropIntoEditor.preferences';\nconst changeDropTypeCommandId = 'editor.changeDropType';\nconst dropWidgetVisibleCtx = new RawContextKey('dropWidgetVisible', false, localize(934, \"Whether the drop widget is showing\"));\nlet DropIntoEditorController = class DropIntoEditorController extends Disposable {\n    static { DropIntoEditorController_1 = this; }\n    static { this.ID = 'editor.contrib.dropIntoEditorController'; }\n    static get(editor) {\n        return editor.getContribution(DropIntoEditorController_1.ID);\n    }\n    constructor(editor, instantiationService, _configService, _languageFeaturesService, _treeViewsDragAndDropService) {\n        super();\n        this._configService = _configService;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._treeViewsDragAndDropService = _treeViewsDragAndDropService;\n        this.treeItemsTransfer = LocalSelectionTransfer.getInstance();\n        this._dropProgressManager = this._register(instantiationService.createInstance(InlineProgressManager, 'dropIntoEditor', editor));\n        this._postDropWidgetManager = this._register(instantiationService.createInstance(PostEditWidgetManager, 'dropIntoEditor', editor, dropWidgetVisibleCtx, { id: changeDropTypeCommandId, label: localize(935, \"Show drop options...\") }, () => DropIntoEditorController_1._configureDefaultAction ? [DropIntoEditorController_1._configureDefaultAction] : []));\n        this._register(editor.onDropIntoEditor(e => this.onDropIntoEditor(editor, e.position, e.event)));\n    }\n    clearWidgets() {\n        this._postDropWidgetManager.clear();\n    }\n    changeDropType() {\n        this._postDropWidgetManager.tryShowSelector();\n    }\n    async onDropIntoEditor(editor, position, dragEvent) {\n        if (!dragEvent.dataTransfer || !editor.hasModel()) {\n            return;\n        }\n        DropIntoEditorController_1._currentDropOperation?.cancel();\n        editor.focus();\n        editor.setPosition(position);\n        const p = createCancelablePromise(async (token) => {\n            const disposables = new DisposableStore();\n            const tokenSource = disposables.add(new EditorStateCancellationTokenSource(editor, 1 /* CodeEditorStateFlag.Value */, undefined, token));\n            try {\n                const ourDataTransfer = await this.extractDataTransferData(dragEvent);\n                if (ourDataTransfer.size === 0 || tokenSource.token.isCancellationRequested) {\n                    return;\n                }\n                const model = editor.getModel();\n                if (!model) {\n                    return;\n                }\n                const providers = this._languageFeaturesService.documentDropEditProvider\n                    .ordered(model)\n                    .filter(provider => {\n                    if (!provider.dropMimeTypes) {\n                        // Keep all providers that don't specify mime types\n                        return true;\n                    }\n                    return provider.dropMimeTypes.some(mime => ourDataTransfer.matches(mime));\n                });\n                const editSession = disposables.add(await this.getDropEdits(providers, model, position, ourDataTransfer, tokenSource.token));\n                if (tokenSource.token.isCancellationRequested) {\n                    return;\n                }\n                if (editSession.edits.length) {\n                    const activeEditIndex = this.getInitialActiveEditIndex(model, editSession.edits);\n                    const canShowWidget = editor.getOption(43 /* EditorOption.dropIntoEditor */).showDropSelector === 'afterDrop';\n                    // Pass in the parent token here as it tracks cancelling the entire drop operation\n                    await this._postDropWidgetManager.applyEditAndShowIfNeeded([Range.fromPositions(position)], { activeEditIndex, allEdits: editSession.edits }, canShowWidget, async (edit) => edit, token);\n                }\n            }\n            finally {\n                disposables.dispose();\n                if (DropIntoEditorController_1._currentDropOperation === p) {\n                    DropIntoEditorController_1._currentDropOperation = undefined;\n                }\n            }\n        });\n        this._dropProgressManager.showWhile(position, localize(936, \"Running drop handlers. Click to cancel\"), p, { cancel: () => p.cancel() });\n        DropIntoEditorController_1._currentDropOperation = p;\n    }\n    async getDropEdits(providers, model, position, dataTransfer, token) {\n        const disposables = new DisposableStore();\n        const results = await raceCancellation(Promise.all(providers.map(async (provider) => {\n            try {\n                const edits = await provider.provideDocumentDropEdits(model, position, dataTransfer, token);\n                if (edits) {\n                    disposables.add(edits);\n                }\n                return edits?.edits.map(edit => ({ ...edit, providerId: provider.id }));\n            }\n            catch (err) {\n                if (!isCancellationError(err)) {\n                    console.error(err);\n                }\n                console.error(err);\n            }\n            return undefined;\n        })), token);\n        const edits = coalesce(results ?? []).flat();\n        return {\n            edits: sortEditsByYieldTo(edits),\n            dispose: () => disposables.dispose()\n        };\n    }\n    getInitialActiveEditIndex(model, edits) {\n        const preferredProviders = this._configService.getValue(dropAsPreferenceConfig, { resource: model.uri });\n        for (const config of Array.isArray(preferredProviders) ? preferredProviders : []) {\n            const desiredKind = new HierarchicalKind(config);\n            const editIndex = edits.findIndex(edit => edit.kind && desiredKind.contains(edit.kind));\n            if (editIndex >= 0) {\n                return editIndex;\n            }\n        }\n        return 0;\n    }\n    async extractDataTransferData(dragEvent) {\n        if (!dragEvent.dataTransfer) {\n            return new VSDataTransfer();\n        }\n        const dataTransfer = toExternalVSDataTransfer(dragEvent.dataTransfer);\n        if (this.treeItemsTransfer.hasData(DraggedTreeItemsIdentifier.prototype)) {\n            const data = this.treeItemsTransfer.getData(DraggedTreeItemsIdentifier.prototype);\n            if (Array.isArray(data)) {\n                for (const id of data) {\n                    const treeDataTransfer = await this._treeViewsDragAndDropService.removeDragOperationTransfer(id.identifier);\n                    if (treeDataTransfer) {\n                        for (const [type, value] of treeDataTransfer) {\n                            dataTransfer.replace(type, value);\n                        }\n                    }\n                }\n            }\n        }\n        return dataTransfer;\n    }\n};\nDropIntoEditorController = DropIntoEditorController_1 = __decorate([\n    __param(1, IInstantiationService),\n    __param(2, IConfigurationService),\n    __param(3, ILanguageFeaturesService),\n    __param(4, ITreeViewsDnDService)\n], DropIntoEditorController);\n\nexport { DropIntoEditorController, changeDropTypeCommandId, dropAsPreferenceConfig, dropWidgetVisibleCtx };\n","import { registerEditorContribution, registerEditorCommand, EditorCommand } from '../../../browser/editorExtensions.js';\nimport { registerEditorFeature } from '../../../common/editorFeatures.js';\nimport { DefaultDropProvidersFeature } from './defaultProviders.js';\nimport { DropIntoEditorController, dropWidgetVisibleCtx, changeDropTypeCommandId } from './dropIntoEditorController.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterEditorContribution(DropIntoEditorController.ID, DropIntoEditorController, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\nregisterEditorFeature(DefaultDropProvidersFeature);\nregisterEditorCommand(new class extends EditorCommand {\n    constructor() {\n        super({\n            id: changeDropTypeCommandId,\n            precondition: dropWidgetVisibleCtx,\n            kbOpts: {\n                weight: 100 /* KeybindingWeight.EditorContrib */,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 89 /* KeyCode.Period */,\n            }\n        });\n    }\n    runEditorCommand(_accessor, editor, _args) {\n        DropIntoEditorController.get(editor)?.changeDropType();\n    }\n});\nregisterEditorCommand(new class extends EditorCommand {\n    constructor() {\n        super({\n            id: 'editor.hideDropWidget',\n            precondition: dropWidgetVisibleCtx,\n            kbOpts: {\n                weight: 100 /* KeybindingWeight.EditorContrib */,\n                primary: 9 /* KeyCode.Escape */,\n            }\n        });\n    }\n    runEditorCommand(_accessor, editor, _args) {\n        DropIntoEditorController.get(editor)?.clearWidgets();\n    }\n});\n","import { addDisposableListener, EventType } from '../../../../base/browser/dom.js';\nimport './findOptionsWidget.css';\nimport { CaseSensitiveToggle, WholeWordsToggle, RegexToggle } from '../../../../base/browser/ui/findinput/findInputToggles.js';\nimport { Widget } from '../../../../base/browser/ui/widget.js';\nimport { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { FIND_IDS } from './findModel.js';\nimport { asCssVariable } from '../../../../platform/theme/common/colorUtils.js';\nimport '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport '../../../../platform/theme/common/colors/editorColors.js';\nimport { inputActiveOptionBackground, inputActiveOptionForeground, inputActiveOptionBorder } from '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\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 *--------------------------------------------------------------------------------------------*/\nclass FindOptionsWidget extends Widget {\n    static { this.ID = 'editor.contrib.findOptionsWidget'; }\n    constructor(editor, state, keybindingService) {\n        super();\n        this._hideSoon = this._register(new RunOnceScheduler(() => this._hide(), 2000));\n        this._isVisible = false;\n        this._editor = editor;\n        this._state = state;\n        this._keybindingService = keybindingService;\n        this._domNode = document.createElement('div');\n        this._domNode.className = 'findOptionsWidget';\n        this._domNode.style.display = 'none';\n        this._domNode.style.top = '10px';\n        this._domNode.style.zIndex = '12';\n        this._domNode.setAttribute('role', 'presentation');\n        this._domNode.setAttribute('aria-hidden', 'true');\n        const toggleStyles = {\n            inputActiveOptionBorder: asCssVariable(inputActiveOptionBorder),\n            inputActiveOptionForeground: asCssVariable(inputActiveOptionForeground),\n            inputActiveOptionBackground: asCssVariable(inputActiveOptionBackground),\n        };\n        const hoverLifecycleOptions = { groupId: 'find-options-widget' };\n        this.caseSensitive = this._register(new CaseSensitiveToggle({\n            appendTitle: this._keybindingLabelFor(FIND_IDS.ToggleCaseSensitiveCommand),\n            isChecked: this._state.matchCase,\n            hoverLifecycleOptions,\n            ...toggleStyles\n        }));\n        this._domNode.appendChild(this.caseSensitive.domNode);\n        this._register(this.caseSensitive.onChange(() => {\n            this._state.change({\n                matchCase: this.caseSensitive.checked\n            }, false);\n        }));\n        this.wholeWords = this._register(new WholeWordsToggle({\n            appendTitle: this._keybindingLabelFor(FIND_IDS.ToggleWholeWordCommand),\n            isChecked: this._state.wholeWord,\n            hoverLifecycleOptions,\n            ...toggleStyles\n        }));\n        this._domNode.appendChild(this.wholeWords.domNode);\n        this._register(this.wholeWords.onChange(() => {\n            this._state.change({\n                wholeWord: this.wholeWords.checked\n            }, false);\n        }));\n        this.regex = this._register(new RegexToggle({\n            appendTitle: this._keybindingLabelFor(FIND_IDS.ToggleRegexCommand),\n            isChecked: this._state.isRegex,\n            hoverLifecycleOptions,\n            ...toggleStyles\n        }));\n        this._domNode.appendChild(this.regex.domNode);\n        this._register(this.regex.onChange(() => {\n            this._state.change({\n                isRegex: this.regex.checked\n            }, false);\n        }));\n        this._editor.addOverlayWidget(this);\n        this._register(this._state.onFindReplaceStateChange((e) => {\n            let somethingChanged = false;\n            if (e.isRegex) {\n                this.regex.checked = this._state.isRegex;\n                somethingChanged = true;\n            }\n            if (e.wholeWord) {\n                this.wholeWords.checked = this._state.wholeWord;\n                somethingChanged = true;\n            }\n            if (e.matchCase) {\n                this.caseSensitive.checked = this._state.matchCase;\n                somethingChanged = true;\n            }\n            if (!this._state.isRevealed && somethingChanged) {\n                this._revealTemporarily();\n            }\n        }));\n        this._register(addDisposableListener(this._domNode, EventType.MOUSE_LEAVE, (e) => this._onMouseLeave()));\n        this._register(addDisposableListener(this._domNode, 'mouseover', (e) => this._onMouseOver()));\n    }\n    _keybindingLabelFor(actionId) {\n        const kb = this._keybindingService.lookupKeybinding(actionId);\n        if (!kb) {\n            return '';\n        }\n        return ` (${kb.getLabel()})`;\n    }\n    dispose() {\n        this._editor.removeOverlayWidget(this);\n        super.dispose();\n    }\n    // ----- IOverlayWidget API\n    getId() {\n        return FindOptionsWidget.ID;\n    }\n    getDomNode() {\n        return this._domNode;\n    }\n    getPosition() {\n        return {\n            preference: 0 /* OverlayWidgetPositionPreference.TOP_RIGHT_CORNER */\n        };\n    }\n    highlightFindOptions() {\n        this._revealTemporarily();\n    }\n    _revealTemporarily() {\n        this._show();\n        this._hideSoon.schedule();\n    }\n    _onMouseLeave() {\n        this._hideSoon.schedule();\n    }\n    _onMouseOver() {\n        this._hideSoon.cancel();\n    }\n    _show() {\n        if (this._isVisible) {\n            return;\n        }\n        this._isVisible = true;\n        this._domNode.style.display = 'block';\n    }\n    _hide() {\n        if (!this._isVisible) {\n            return;\n        }\n        this._isVisible = false;\n        this._domNode.style.display = 'none';\n    }\n}\n\nexport { FindOptionsWidget };\n","import { Emitter } from '../../../../base/common/event.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { Range } from '../../../common/core/range.js';\nimport { MATCHES_LIMIT } from './findModel.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction effectiveOptionValue(override, value) {\n    if (override === 1 /* FindOptionOverride.True */) {\n        return true;\n    }\n    if (override === 2 /* FindOptionOverride.False */) {\n        return false;\n    }\n    return value;\n}\nclass FindReplaceState extends Disposable {\n    get searchString() { return this._searchString; }\n    get replaceString() { return this._replaceString; }\n    get isRevealed() { return this._isRevealed; }\n    get isReplaceRevealed() { return this._isReplaceRevealed; }\n    get isRegex() { return effectiveOptionValue(this._isRegexOverride, this._isRegex); }\n    get wholeWord() { return effectiveOptionValue(this._wholeWordOverride, this._wholeWord); }\n    get matchCase() { return effectiveOptionValue(this._matchCaseOverride, this._matchCase); }\n    get preserveCase() { return effectiveOptionValue(this._preserveCaseOverride, this._preserveCase); }\n    get actualIsRegex() { return this._isRegex; }\n    get actualWholeWord() { return this._wholeWord; }\n    get actualMatchCase() { return this._matchCase; }\n    get actualPreserveCase() { return this._preserveCase; }\n    get searchScope() { return this._searchScope; }\n    get matchesPosition() { return this._matchesPosition; }\n    get matchesCount() { return this._matchesCount; }\n    get currentMatch() { return this._currentMatch; }\n    constructor() {\n        super();\n        this._onFindReplaceStateChange = this._register(new Emitter());\n        this.onFindReplaceStateChange = this._onFindReplaceStateChange.event;\n        this._searchString = '';\n        this._replaceString = '';\n        this._isRevealed = false;\n        this._isReplaceRevealed = false;\n        this._isRegex = false;\n        this._isRegexOverride = 0 /* FindOptionOverride.NotSet */;\n        this._wholeWord = false;\n        this._wholeWordOverride = 0 /* FindOptionOverride.NotSet */;\n        this._matchCase = false;\n        this._matchCaseOverride = 0 /* FindOptionOverride.NotSet */;\n        this._preserveCase = false;\n        this._preserveCaseOverride = 0 /* FindOptionOverride.NotSet */;\n        this._searchScope = null;\n        this._matchesPosition = 0;\n        this._matchesCount = 0;\n        this._currentMatch = null;\n        this._loop = true;\n        this._isSearching = false;\n        this._filters = null;\n    }\n    changeMatchInfo(matchesPosition, matchesCount, currentMatch) {\n        const changeEvent = {\n            moveCursor: false,\n            updateHistory: false,\n            searchString: false,\n            replaceString: false,\n            isRevealed: false,\n            isReplaceRevealed: false,\n            isRegex: false,\n            wholeWord: false,\n            matchCase: false,\n            preserveCase: false,\n            searchScope: false,\n            matchesPosition: false,\n            matchesCount: false,\n            currentMatch: false,\n            loop: false,\n            isSearching: false,\n            filters: false\n        };\n        let somethingChanged = false;\n        if (matchesCount === 0) {\n            matchesPosition = 0;\n        }\n        if (matchesPosition > matchesCount) {\n            matchesPosition = matchesCount;\n        }\n        if (this._matchesPosition !== matchesPosition) {\n            this._matchesPosition = matchesPosition;\n            changeEvent.matchesPosition = true;\n            somethingChanged = true;\n        }\n        if (this._matchesCount !== matchesCount) {\n            this._matchesCount = matchesCount;\n            changeEvent.matchesCount = true;\n            somethingChanged = true;\n        }\n        if (typeof currentMatch !== 'undefined') {\n            if (!Range.equalsRange(this._currentMatch, currentMatch)) {\n                this._currentMatch = currentMatch;\n                changeEvent.currentMatch = true;\n                somethingChanged = true;\n            }\n        }\n        if (somethingChanged) {\n            this._onFindReplaceStateChange.fire(changeEvent);\n        }\n    }\n    change(newState, moveCursor, updateHistory = true) {\n        const changeEvent = {\n            moveCursor: moveCursor,\n            updateHistory: updateHistory,\n            searchString: false,\n            replaceString: false,\n            isRevealed: false,\n            isReplaceRevealed: false,\n            isRegex: false,\n            wholeWord: false,\n            matchCase: false,\n            preserveCase: false,\n            searchScope: false,\n            matchesPosition: false,\n            matchesCount: false,\n            currentMatch: false,\n            loop: false,\n            isSearching: false,\n            filters: false\n        };\n        let somethingChanged = false;\n        const oldEffectiveIsRegex = this.isRegex;\n        const oldEffectiveWholeWords = this.wholeWord;\n        const oldEffectiveMatchCase = this.matchCase;\n        const oldEffectivePreserveCase = this.preserveCase;\n        if (typeof newState.searchString !== 'undefined') {\n            if (this._searchString !== newState.searchString) {\n                this._searchString = newState.searchString;\n                changeEvent.searchString = true;\n                somethingChanged = true;\n            }\n        }\n        if (typeof newState.replaceString !== 'undefined') {\n            if (this._replaceString !== newState.replaceString) {\n                this._replaceString = newState.replaceString;\n                changeEvent.replaceString = true;\n                somethingChanged = true;\n            }\n        }\n        if (typeof newState.isRevealed !== 'undefined') {\n            if (this._isRevealed !== newState.isRevealed) {\n                this._isRevealed = newState.isRevealed;\n                changeEvent.isRevealed = true;\n                somethingChanged = true;\n            }\n        }\n        if (typeof newState.isReplaceRevealed !== 'undefined') {\n            if (this._isReplaceRevealed !== newState.isReplaceRevealed) {\n                this._isReplaceRevealed = newState.isReplaceRevealed;\n                changeEvent.isReplaceRevealed = true;\n                somethingChanged = true;\n            }\n        }\n        if (typeof newState.isRegex !== 'undefined') {\n            this._isRegex = newState.isRegex;\n        }\n        if (typeof newState.wholeWord !== 'undefined') {\n            this._wholeWord = newState.wholeWord;\n        }\n        if (typeof newState.matchCase !== 'undefined') {\n            this._matchCase = newState.matchCase;\n        }\n        if (typeof newState.preserveCase !== 'undefined') {\n            this._preserveCase = newState.preserveCase;\n        }\n        if (typeof newState.searchScope !== 'undefined') {\n            if (!newState.searchScope?.every((newSearchScope) => {\n                return this._searchScope?.some(existingSearchScope => {\n                    return !Range.equalsRange(existingSearchScope, newSearchScope);\n                });\n            })) {\n                this._searchScope = newState.searchScope;\n                changeEvent.searchScope = true;\n                somethingChanged = true;\n            }\n        }\n        if (typeof newState.loop !== 'undefined') {\n            if (this._loop !== newState.loop) {\n                this._loop = newState.loop;\n                changeEvent.loop = true;\n                somethingChanged = true;\n            }\n        }\n        if (typeof newState.isSearching !== 'undefined') {\n            if (this._isSearching !== newState.isSearching) {\n                this._isSearching = newState.isSearching;\n                changeEvent.isSearching = true;\n                somethingChanged = true;\n            }\n        }\n        if (typeof newState.filters !== 'undefined') {\n            if (this._filters) {\n                this._filters.update(newState.filters);\n            }\n            else {\n                this._filters = newState.filters;\n            }\n            changeEvent.filters = true;\n            somethingChanged = true;\n        }\n        // Overrides get set when they explicitly come in and get reset anytime something else changes\n        this._isRegexOverride = (typeof newState.isRegexOverride !== 'undefined' ? newState.isRegexOverride : 0 /* FindOptionOverride.NotSet */);\n        this._wholeWordOverride = (typeof newState.wholeWordOverride !== 'undefined' ? newState.wholeWordOverride : 0 /* FindOptionOverride.NotSet */);\n        this._matchCaseOverride = (typeof newState.matchCaseOverride !== 'undefined' ? newState.matchCaseOverride : 0 /* FindOptionOverride.NotSet */);\n        this._preserveCaseOverride = (typeof newState.preserveCaseOverride !== 'undefined' ? newState.preserveCaseOverride : 0 /* FindOptionOverride.NotSet */);\n        if (oldEffectiveIsRegex !== this.isRegex) {\n            somethingChanged = true;\n            changeEvent.isRegex = true;\n        }\n        if (oldEffectiveWholeWords !== this.wholeWord) {\n            somethingChanged = true;\n            changeEvent.wholeWord = true;\n        }\n        if (oldEffectiveMatchCase !== this.matchCase) {\n            somethingChanged = true;\n            changeEvent.matchCase = true;\n        }\n        if (oldEffectivePreserveCase !== this.preserveCase) {\n            somethingChanged = true;\n            changeEvent.preserveCase = true;\n        }\n        if (somethingChanged) {\n            this._onFindReplaceStateChange.fire(changeEvent);\n        }\n    }\n    canNavigateBack() {\n        return this.canNavigateInLoop() || (this.matchesPosition !== 1);\n    }\n    canNavigateForward() {\n        return this.canNavigateInLoop() || (this.matchesPosition < this.matchesCount);\n    }\n    canNavigateInLoop() {\n        return this._loop || (this.matchesCount >= MATCHES_LIMIT);\n    }\n}\n\nexport { FindReplaceState };\n","import { Emitter } from '../../../../base/common/event.js';\nimport { IStorageService } from '../../../../platform/storage/common/storage.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar FindWidgetSearchHistory_1;\nlet FindWidgetSearchHistory = class FindWidgetSearchHistory {\n    static { FindWidgetSearchHistory_1 = this; }\n    static { this.FIND_HISTORY_KEY = 'workbench.find.history'; }\n    static { this._instance = null; }\n    static getOrCreate(storageService) {\n        if (!FindWidgetSearchHistory_1._instance) {\n            FindWidgetSearchHistory_1._instance = new FindWidgetSearchHistory_1(storageService);\n        }\n        return FindWidgetSearchHistory_1._instance;\n    }\n    constructor(storageService) {\n        this.storageService = storageService;\n        this.inMemoryValues = new Set();\n        this._onDidChangeEmitter = new Emitter();\n        this.onDidChange = this._onDidChangeEmitter.event;\n        this.load();\n    }\n    delete(t) {\n        const result = this.inMemoryValues.delete(t);\n        this.save();\n        return result;\n    }\n    add(t) {\n        this.inMemoryValues.add(t);\n        this.save();\n        return this;\n    }\n    has(t) {\n        return this.inMemoryValues.has(t);\n    }\n    forEach(callbackfn, thisArg) {\n        // fetch latest from storage\n        this.load();\n        return this.inMemoryValues.forEach(callbackfn);\n    }\n    replace(t) {\n        this.inMemoryValues = new Set(t);\n        this.save();\n    }\n    load() {\n        let result;\n        const raw = this.storageService.get(FindWidgetSearchHistory_1.FIND_HISTORY_KEY, 1 /* StorageScope.WORKSPACE */);\n        if (raw) {\n            try {\n                result = JSON.parse(raw);\n            }\n            catch (e) {\n                // Invalid data\n            }\n        }\n        this.inMemoryValues = new Set(result || []);\n    }\n    // Run saves async\n    save() {\n        const elements = [];\n        this.inMemoryValues.forEach(e => elements.push(e));\n        return new Promise(resolve => {\n            this.storageService.store(FindWidgetSearchHistory_1.FIND_HISTORY_KEY, JSON.stringify(elements), 1 /* StorageScope.WORKSPACE */, 0 /* StorageTarget.USER */);\n            this._onDidChangeEmitter.fire(elements);\n            resolve();\n        });\n    }\n};\nFindWidgetSearchHistory = FindWidgetSearchHistory_1 = __decorate([\n    __param(0, IStorageService)\n], FindWidgetSearchHistory);\n\nexport { FindWidgetSearchHistory };\n","import { Emitter } from '../../../../base/common/event.js';\nimport { IStorageService } from '../../../../platform/storage/common/storage.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ReplaceWidgetHistory_1;\nlet ReplaceWidgetHistory = class ReplaceWidgetHistory {\n    static { ReplaceWidgetHistory_1 = this; }\n    static { this.FIND_HISTORY_KEY = 'workbench.replace.history'; }\n    static { this._instance = null; }\n    static getOrCreate(storageService) {\n        if (!ReplaceWidgetHistory_1._instance) {\n            ReplaceWidgetHistory_1._instance = new ReplaceWidgetHistory_1(storageService);\n        }\n        return ReplaceWidgetHistory_1._instance;\n    }\n    constructor(storageService) {\n        this.storageService = storageService;\n        this.inMemoryValues = new Set();\n        this._onDidChangeEmitter = new Emitter();\n        this.onDidChange = this._onDidChangeEmitter.event;\n        this.load();\n    }\n    delete(t) {\n        const result = this.inMemoryValues.delete(t);\n        this.save();\n        return result;\n    }\n    add(t) {\n        this.inMemoryValues.add(t);\n        this.save();\n        return this;\n    }\n    has(t) {\n        return this.inMemoryValues.has(t);\n    }\n    forEach(callbackfn, thisArg) {\n        // fetch latest from storage\n        this.load();\n        return this.inMemoryValues.forEach(callbackfn);\n    }\n    replace(t) {\n        this.inMemoryValues = new Set(t);\n        this.save();\n    }\n    load() {\n        let result;\n        const raw = this.storageService.get(ReplaceWidgetHistory_1.FIND_HISTORY_KEY, 1 /* StorageScope.WORKSPACE */);\n        if (raw) {\n            try {\n                result = JSON.parse(raw);\n            }\n            catch (e) {\n                // Invalid data\n            }\n        }\n        this.inMemoryValues = new Set(result || []);\n    }\n    // Run saves async\n    save() {\n        const elements = [];\n        this.inMemoryValues.forEach(e => elements.push(e));\n        return new Promise(resolve => {\n            this.storageService.store(ReplaceWidgetHistory_1.FIND_HISTORY_KEY, JSON.stringify(elements), 1 /* StorageScope.WORKSPACE */, 0 /* StorageTarget.USER */);\n            this._onDidChangeEmitter.fire(elements);\n            resolve();\n        });\n    }\n};\nReplaceWidgetHistory = ReplaceWidgetHistory_1 = __decorate([\n    __param(0, IStorageService)\n], ReplaceWidgetHistory);\n\nexport { ReplaceWidgetHistory };\n","import { Delayer } from '../../../../base/common/async.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { escapeRegExpCharacters } from '../../../../base/common/strings.js';\nimport { registerMultiEditorAction, MultiEditorAction, registerEditorContribution, registerEditorAction, EditorCommand, registerEditorCommand, EditorAction } from '../../../browser/editorExtensions.js';\nimport { overviewRulerRangeHighlight } from '../../../common/core/editorColorRegistry.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { OverviewRulerLane } from '../../../common/model.js';\nimport { CONTEXT_FIND_WIDGET_VISIBLE, CONTEXT_FIND_INPUT_FOCUSED, FindModelBoundToEditorModel, FIND_IDS, ToggleCaseSensitiveKeybinding, ToggleWholeWordKeybinding, ToggleRegexKeybinding, ToggleSearchScopeKeybinding, TogglePreserveCaseKeybinding, CONTEXT_REPLACE_INPUT_FOCUSED } from './findModel.js';\nimport { FindOptionsWidget } from './findOptionsWidget.js';\nimport { FindReplaceState } from './findState.js';\nimport { FindWidget } from './findWidget.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';\nimport { IContextKeyService, ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IContextViewService } from '../../../../platform/contextview/browser/contextView.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { INotificationService, Severity } from '../../../../platform/notification/common/notification.js';\nimport { IQuickInputService } from '../../../../platform/quickinput/common/quickInput.js';\nimport { IStorageService } from '../../../../platform/storage/common/storage.js';\nimport { themeColorFromId } from '../../../../platform/theme/common/themeService.js';\nimport { IHoverService } from '../../../../platform/hover/browser/hover.js';\nimport { FindWidgetSearchHistory } from './findWidgetSearchHistory.js';\nimport { ReplaceWidgetHistory } from './replaceWidgetHistory.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar CommonFindController_1;\nconst SEARCH_STRING_MAX_LENGTH = 524288;\nfunction getSelectionSearchString(editor, seedSearchStringFromSelection = 'single', seedSearchStringFromNonEmptySelection = false) {\n    if (!editor.hasModel()) {\n        return null;\n    }\n    const selection = editor.getSelection();\n    // if selection spans multiple lines, default search string to empty\n    if ((seedSearchStringFromSelection === 'single' && selection.startLineNumber === selection.endLineNumber)\n        || seedSearchStringFromSelection === 'multiple') {\n        if (selection.isEmpty()) {\n            const wordAtPosition = editor.getConfiguredWordAtPosition(selection.getStartPosition());\n            if (wordAtPosition && (false === seedSearchStringFromNonEmptySelection)) {\n                return wordAtPosition.word;\n            }\n        }\n        else {\n            if (editor.getModel().getValueLengthInRange(selection) < SEARCH_STRING_MAX_LENGTH) {\n                return editor.getModel().getValueInRange(selection);\n            }\n        }\n    }\n    return null;\n}\nlet CommonFindController = class CommonFindController extends Disposable {\n    static { CommonFindController_1 = this; }\n    static { this.ID = 'editor.contrib.findController'; }\n    get editor() {\n        return this._editor;\n    }\n    static get(editor) {\n        return editor.getContribution(CommonFindController_1.ID);\n    }\n    constructor(editor, contextKeyService, storageService, clipboardService, notificationService, hoverService) {\n        super();\n        this._editor = editor;\n        this._findWidgetVisible = CONTEXT_FIND_WIDGET_VISIBLE.bindTo(contextKeyService);\n        this._contextKeyService = contextKeyService;\n        this._storageService = storageService;\n        this._clipboardService = clipboardService;\n        this._notificationService = notificationService;\n        this._hoverService = hoverService;\n        this._updateHistoryDelayer = new Delayer(500);\n        this._state = this._register(new FindReplaceState());\n        this.loadQueryState();\n        this._register(this._state.onFindReplaceStateChange((e) => this._onStateChanged(e)));\n        this._model = null;\n        this._register(this._editor.onDidChangeModel(() => {\n            const shouldRestartFind = (this._editor.getModel() && this._state.isRevealed);\n            this.disposeModel();\n            this._state.change({\n                searchScope: null,\n                matchCase: this._storageService.getBoolean('editor.matchCase', 1 /* StorageScope.WORKSPACE */, false),\n                wholeWord: this._storageService.getBoolean('editor.wholeWord', 1 /* StorageScope.WORKSPACE */, false),\n                isRegex: this._storageService.getBoolean('editor.isRegex', 1 /* StorageScope.WORKSPACE */, false),\n                preserveCase: this._storageService.getBoolean('editor.preserveCase', 1 /* StorageScope.WORKSPACE */, false)\n            }, false);\n            if (shouldRestartFind) {\n                this._start({\n                    forceRevealReplace: false,\n                    seedSearchStringFromSelection: 'none',\n                    seedSearchStringFromNonEmptySelection: false,\n                    seedSearchStringFromGlobalClipboard: false,\n                    shouldFocus: 0 /* FindStartFocusAction.NoFocusChange */,\n                    shouldAnimate: false,\n                    updateSearchScope: false,\n                    loop: this._editor.getOption(50 /* EditorOption.find */).loop\n                });\n            }\n        }));\n    }\n    dispose() {\n        this.disposeModel();\n        super.dispose();\n    }\n    disposeModel() {\n        if (this._model) {\n            this._model.dispose();\n            this._model = null;\n        }\n    }\n    _onStateChanged(e) {\n        this.saveQueryState(e);\n        if (e.isRevealed) {\n            if (this._state.isRevealed) {\n                this._findWidgetVisible.set(true);\n            }\n            else {\n                this._findWidgetVisible.reset();\n                this.disposeModel();\n            }\n        }\n        if (e.searchString) {\n            this.setGlobalBufferTerm(this._state.searchString);\n        }\n    }\n    saveQueryState(e) {\n        if (e.isRegex) {\n            this._storageService.store('editor.isRegex', this._state.actualIsRegex, 1 /* StorageScope.WORKSPACE */, 1 /* StorageTarget.MACHINE */);\n        }\n        if (e.wholeWord) {\n            this._storageService.store('editor.wholeWord', this._state.actualWholeWord, 1 /* StorageScope.WORKSPACE */, 1 /* StorageTarget.MACHINE */);\n        }\n        if (e.matchCase) {\n            this._storageService.store('editor.matchCase', this._state.actualMatchCase, 1 /* StorageScope.WORKSPACE */, 1 /* StorageTarget.MACHINE */);\n        }\n        if (e.preserveCase) {\n            this._storageService.store('editor.preserveCase', this._state.actualPreserveCase, 1 /* StorageScope.WORKSPACE */, 1 /* StorageTarget.MACHINE */);\n        }\n    }\n    loadQueryState() {\n        this._state.change({\n            matchCase: this._storageService.getBoolean('editor.matchCase', 1 /* StorageScope.WORKSPACE */, this._state.matchCase),\n            wholeWord: this._storageService.getBoolean('editor.wholeWord', 1 /* StorageScope.WORKSPACE */, this._state.wholeWord),\n            isRegex: this._storageService.getBoolean('editor.isRegex', 1 /* StorageScope.WORKSPACE */, this._state.isRegex),\n            preserveCase: this._storageService.getBoolean('editor.preserveCase', 1 /* StorageScope.WORKSPACE */, this._state.preserveCase)\n        }, false);\n    }\n    isFindInputFocused() {\n        return !!CONTEXT_FIND_INPUT_FOCUSED.getValue(this._contextKeyService);\n    }\n    getState() {\n        return this._state;\n    }\n    closeFindWidget() {\n        this._state.change({\n            isRevealed: false,\n            searchScope: null\n        }, false);\n        this._editor.focus();\n    }\n    toggleCaseSensitive() {\n        this._state.change({ matchCase: !this._state.matchCase }, false);\n        if (!this._state.isRevealed) {\n            this.highlightFindOptions();\n        }\n    }\n    toggleWholeWords() {\n        this._state.change({ wholeWord: !this._state.wholeWord }, false);\n        if (!this._state.isRevealed) {\n            this.highlightFindOptions();\n        }\n    }\n    toggleRegex() {\n        this._state.change({ isRegex: !this._state.isRegex }, false);\n        if (!this._state.isRevealed) {\n            this.highlightFindOptions();\n        }\n    }\n    togglePreserveCase() {\n        this._state.change({ preserveCase: !this._state.preserveCase }, false);\n        if (!this._state.isRevealed) {\n            this.highlightFindOptions();\n        }\n    }\n    toggleSearchScope() {\n        if (this._state.searchScope) {\n            this._state.change({ searchScope: null }, true);\n        }\n        else {\n            if (this._editor.hasModel()) {\n                let selections = this._editor.getSelections();\n                selections = selections.map(selection => {\n                    if (selection.endColumn === 1 && selection.endLineNumber > selection.startLineNumber) {\n                        selection = selection.setEndPosition(selection.endLineNumber - 1, this._editor.getModel().getLineMaxColumn(selection.endLineNumber - 1));\n                    }\n                    if (!selection.isEmpty()) {\n                        return selection;\n                    }\n                    return null;\n                }).filter((element) => !!element);\n                if (selections.length) {\n                    this._state.change({ searchScope: selections }, true);\n                }\n            }\n        }\n    }\n    setSearchString(searchString) {\n        if (this._state.isRegex) {\n            searchString = escapeRegExpCharacters(searchString);\n        }\n        this._state.change({ searchString: searchString }, false);\n    }\n    highlightFindOptions(ignoreWhenVisible = false) {\n        // overwritten in subclass\n    }\n    async _start(opts, newState) {\n        this.disposeModel();\n        if (!this._editor.hasModel()) {\n            // cannot do anything with an editor that doesn't have a model...\n            return;\n        }\n        const stateChanges = {\n            ...newState,\n            isRevealed: true\n        };\n        if (opts.seedSearchStringFromSelection === 'single') {\n            const selectionSearchString = getSelectionSearchString(this._editor, opts.seedSearchStringFromSelection, opts.seedSearchStringFromNonEmptySelection);\n            if (selectionSearchString) {\n                if (this._state.isRegex) {\n                    stateChanges.searchString = escapeRegExpCharacters(selectionSearchString);\n                }\n                else {\n                    stateChanges.searchString = selectionSearchString;\n                }\n            }\n        }\n        else if (opts.seedSearchStringFromSelection === 'multiple' && !opts.updateSearchScope) {\n            const selectionSearchString = getSelectionSearchString(this._editor, opts.seedSearchStringFromSelection);\n            if (selectionSearchString) {\n                stateChanges.searchString = selectionSearchString;\n            }\n        }\n        if (!stateChanges.searchString && opts.seedSearchStringFromGlobalClipboard) {\n            const selectionSearchString = await this.getGlobalBufferTerm();\n            if (!this._editor.hasModel()) {\n                // the editor has lost its model in the meantime\n                return;\n            }\n            if (selectionSearchString) {\n                stateChanges.searchString = selectionSearchString;\n            }\n        }\n        // Overwrite isReplaceRevealed\n        if (opts.forceRevealReplace || stateChanges.isReplaceRevealed) {\n            stateChanges.isReplaceRevealed = true;\n        }\n        else if (!this._findWidgetVisible.get()) {\n            stateChanges.isReplaceRevealed = false;\n        }\n        if (opts.updateSearchScope) {\n            const currentSelections = this._editor.getSelections();\n            if (currentSelections.some(selection => !selection.isEmpty())) {\n                stateChanges.searchScope = currentSelections;\n            }\n        }\n        stateChanges.loop = opts.loop;\n        this._state.change(stateChanges, false);\n        if (!this._model) {\n            this._model = new FindModelBoundToEditorModel(this._editor, this._state);\n        }\n    }\n    start(opts, newState) {\n        return this._start(opts, newState);\n    }\n    moveToNextMatch() {\n        if (this._model) {\n            this._model.moveToNextMatch();\n            return true;\n        }\n        return false;\n    }\n    moveToPrevMatch() {\n        if (this._model) {\n            this._model.moveToPrevMatch();\n            return true;\n        }\n        return false;\n    }\n    goToMatch(index) {\n        if (this._model) {\n            this._model.moveToMatch(index);\n            return true;\n        }\n        return false;\n    }\n    replace() {\n        if (this._model) {\n            this._model.replace();\n            return true;\n        }\n        return false;\n    }\n    replaceAll() {\n        if (this._model) {\n            if (this._editor.getModel()?.isTooLargeForHeapOperation()) {\n                this._notificationService.warn(localize(940, \"The file is too large to perform a replace all operation.\"));\n                return false;\n            }\n            this._model.replaceAll();\n            return true;\n        }\n        return false;\n    }\n    selectAllMatches() {\n        if (this._model) {\n            this._model.selectAllMatches();\n            this._editor.focus();\n            return true;\n        }\n        return false;\n    }\n    async getGlobalBufferTerm() {\n        if (this._editor.getOption(50 /* EditorOption.find */).globalFindClipboard\n            && this._editor.hasModel()\n            && !this._editor.getModel().isTooLargeForSyncing()) {\n            return this._clipboardService.readFindText();\n        }\n        return '';\n    }\n    setGlobalBufferTerm(text) {\n        if (this._editor.getOption(50 /* EditorOption.find */).globalFindClipboard\n            && this._editor.hasModel()\n            && !this._editor.getModel().isTooLargeForSyncing()) {\n            // intentionally not awaited\n            this._clipboardService.writeFindText(text);\n        }\n    }\n};\nCommonFindController = CommonFindController_1 = __decorate([\n    __param(1, IContextKeyService),\n    __param(2, IStorageService),\n    __param(3, IClipboardService),\n    __param(4, INotificationService),\n    __param(5, IHoverService)\n], CommonFindController);\nlet FindController = class FindController extends CommonFindController {\n    constructor(editor, _contextViewService, _contextKeyService, _keybindingService, notificationService, _storageService, clipboardService, hoverService) {\n        super(editor, _contextKeyService, _storageService, clipboardService, notificationService, hoverService);\n        this._contextViewService = _contextViewService;\n        this._keybindingService = _keybindingService;\n        this._widget = null;\n        this._findOptionsWidget = null;\n        this._findWidgetSearchHistory = FindWidgetSearchHistory.getOrCreate(_storageService);\n        this._replaceWidgetHistory = ReplaceWidgetHistory.getOrCreate(_storageService);\n    }\n    async _start(opts, newState) {\n        if (!this._widget) {\n            this._createFindWidget();\n        }\n        const selection = this._editor.getSelection();\n        let updateSearchScope = false;\n        switch (this._editor.getOption(50 /* EditorOption.find */).autoFindInSelection) {\n            case 'always':\n                updateSearchScope = true;\n                break;\n            case 'never':\n                updateSearchScope = false;\n                break;\n            case 'multiline': {\n                const isSelectionMultipleLine = !!selection && selection.startLineNumber !== selection.endLineNumber;\n                updateSearchScope = isSelectionMultipleLine;\n                break;\n            }\n        }\n        opts.updateSearchScope = opts.updateSearchScope || updateSearchScope;\n        await super._start(opts, newState);\n        if (this._widget) {\n            if (opts.shouldFocus === 2 /* FindStartFocusAction.FocusReplaceInput */) {\n                this._widget.focusReplaceInput();\n            }\n            else if (opts.shouldFocus === 1 /* FindStartFocusAction.FocusFindInput */) {\n                this._widget.focusFindInput();\n            }\n        }\n    }\n    highlightFindOptions(ignoreWhenVisible = false) {\n        if (!this._widget) {\n            this._createFindWidget();\n        }\n        if (this._state.isRevealed && !ignoreWhenVisible) {\n            this._widget.highlightFindOptions();\n        }\n        else {\n            this._findOptionsWidget.highlightFindOptions();\n        }\n    }\n    _createFindWidget() {\n        this._widget = this._register(new FindWidget(this._editor, this, this._state, this._contextViewService, this._keybindingService, this._contextKeyService, this._hoverService, this._findWidgetSearchHistory, this._replaceWidgetHistory));\n        this._findOptionsWidget = this._register(new FindOptionsWidget(this._editor, this._state, this._keybindingService));\n    }\n    saveViewState() {\n        return this._widget?.getViewState();\n    }\n    restoreViewState(state) {\n        this._widget?.setViewState(state);\n    }\n};\nFindController = __decorate([\n    __param(1, IContextViewService),\n    __param(2, IContextKeyService),\n    __param(3, IKeybindingService),\n    __param(4, INotificationService),\n    __param(5, IStorageService),\n    __param(6, IClipboardService),\n    __param(7, IHoverService)\n], FindController);\nconst StartFindAction = registerMultiEditorAction(new MultiEditorAction({\n    id: FIND_IDS.StartFindAction,\n    label: localize2(947, \"Find\"),\n    precondition: ContextKeyExpr.or(EditorContextKeys.focus, ContextKeyExpr.has('editorIsOpen')),\n    kbOpts: {\n        kbExpr: null,\n        primary: 2048 /* KeyMod.CtrlCmd */ | 36 /* KeyCode.KeyF */,\n        weight: 100 /* KeybindingWeight.EditorContrib */\n    },\n    menuOpts: {\n        menuId: MenuId.MenubarEditMenu,\n        group: '3_find',\n        title: localize(941, \"&&Find\"),\n        order: 1\n    }\n}));\nStartFindAction.addImplementation(0, (accessor, editor, args) => {\n    const controller = CommonFindController.get(editor);\n    if (!controller) {\n        return false;\n    }\n    return controller.start({\n        forceRevealReplace: false,\n        seedSearchStringFromSelection: editor.getOption(50 /* EditorOption.find */).seedSearchStringFromSelection !== 'never' ? 'single' : 'none',\n        seedSearchStringFromNonEmptySelection: editor.getOption(50 /* EditorOption.find */).seedSearchStringFromSelection === 'selection',\n        seedSearchStringFromGlobalClipboard: editor.getOption(50 /* EditorOption.find */).globalFindClipboard,\n        shouldFocus: 1 /* FindStartFocusAction.FocusFindInput */,\n        shouldAnimate: true,\n        updateSearchScope: false,\n        loop: editor.getOption(50 /* EditorOption.find */).loop\n    });\n});\nconst findArgDescription = {\n    description: 'Open a new In-Editor Find Widget.',\n    args: [{\n            name: 'Open a new In-Editor Find Widget args',\n            schema: {\n                properties: {\n                    searchString: { type: 'string' },\n                    replaceString: { type: 'string' },\n                    isRegex: { type: 'boolean' },\n                    matchWholeWord: { type: 'boolean' },\n                    isCaseSensitive: { type: 'boolean' },\n                    preserveCase: { type: 'boolean' },\n                    findInSelection: { type: 'boolean' },\n                }\n            }\n        }]\n};\nclass StartFindWithArgsAction extends EditorAction {\n    constructor() {\n        super({\n            id: FIND_IDS.StartFindWithArgs,\n            label: localize2(948, \"Find with Arguments\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: null,\n                primary: 0,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: findArgDescription\n        });\n    }\n    async run(accessor, editor, args) {\n        const controller = CommonFindController.get(editor);\n        if (controller) {\n            const newState = args ? {\n                searchString: args.searchString,\n                replaceString: args.replaceString,\n                isReplaceRevealed: args.replaceString !== undefined,\n                isRegex: args.isRegex,\n                // isRegexOverride: args.regexOverride,\n                wholeWord: args.matchWholeWord,\n                // wholeWordOverride: args.wholeWordOverride,\n                matchCase: args.isCaseSensitive,\n                // matchCaseOverride: args.matchCaseOverride,\n                preserveCase: args.preserveCase,\n                // preserveCaseOverride: args.preserveCaseOverride,\n            } : {};\n            await controller.start({\n                forceRevealReplace: false,\n                seedSearchStringFromSelection: (controller.getState().searchString.length === 0) && editor.getOption(50 /* EditorOption.find */).seedSearchStringFromSelection !== 'never' ? 'single' : 'none',\n                seedSearchStringFromNonEmptySelection: editor.getOption(50 /* EditorOption.find */).seedSearchStringFromSelection === 'selection',\n                seedSearchStringFromGlobalClipboard: true,\n                shouldFocus: 1 /* FindStartFocusAction.FocusFindInput */,\n                shouldAnimate: true,\n                updateSearchScope: args?.findInSelection || false,\n                loop: editor.getOption(50 /* EditorOption.find */).loop\n            }, newState);\n            controller.setGlobalBufferTerm(controller.getState().searchString);\n        }\n    }\n}\nclass StartFindWithSelectionAction extends EditorAction {\n    constructor() {\n        super({\n            id: FIND_IDS.StartFindWithSelection,\n            label: localize2(949, \"Find with Selection\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: null,\n                primary: 0,\n                mac: {\n                    primary: 2048 /* KeyMod.CtrlCmd */ | 35 /* KeyCode.KeyE */,\n                },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    async run(accessor, editor) {\n        const controller = CommonFindController.get(editor);\n        if (controller) {\n            await controller.start({\n                forceRevealReplace: false,\n                seedSearchStringFromSelection: 'multiple',\n                seedSearchStringFromNonEmptySelection: false,\n                seedSearchStringFromGlobalClipboard: false,\n                shouldFocus: 0 /* FindStartFocusAction.NoFocusChange */,\n                shouldAnimate: true,\n                updateSearchScope: false,\n                loop: editor.getOption(50 /* EditorOption.find */).loop\n            });\n            controller.setGlobalBufferTerm(controller.getState().searchString);\n        }\n    }\n}\nasync function matchFindAction(editor, next) {\n    const controller = CommonFindController.get(editor);\n    if (!controller) {\n        return;\n    }\n    const runMatch = () => {\n        const result = next ? controller.moveToNextMatch() : controller.moveToPrevMatch();\n        if (result) {\n            controller.editor.pushUndoStop();\n            return true;\n        }\n        return false;\n    };\n    if (!runMatch()) {\n        await controller.start({\n            forceRevealReplace: false,\n            seedSearchStringFromSelection: (controller.getState().searchString.length === 0) && editor.getOption(50 /* EditorOption.find */).seedSearchStringFromSelection !== 'never' ? 'single' : 'none',\n            seedSearchStringFromNonEmptySelection: editor.getOption(50 /* EditorOption.find */).seedSearchStringFromSelection === 'selection',\n            seedSearchStringFromGlobalClipboard: true,\n            shouldFocus: 0 /* FindStartFocusAction.NoFocusChange */,\n            shouldAnimate: true,\n            updateSearchScope: false,\n            loop: editor.getOption(50 /* EditorOption.find */).loop\n        });\n        runMatch();\n    }\n}\nconst NextMatchFindAction = registerMultiEditorAction(new MultiEditorAction({\n    id: FIND_IDS.NextMatchFindAction,\n    label: localize2(950, \"Find Next\"),\n    precondition: undefined,\n    kbOpts: [{\n            kbExpr: EditorContextKeys.focus,\n            primary: 61 /* KeyCode.F3 */,\n            mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 37 /* KeyCode.KeyG */, secondary: [61 /* KeyCode.F3 */] },\n            weight: 100 /* KeybindingWeight.EditorContrib */\n        }, {\n            kbExpr: ContextKeyExpr.and(EditorContextKeys.focus, CONTEXT_FIND_INPUT_FOCUSED),\n            primary: 3 /* KeyCode.Enter */,\n            weight: 100 /* KeybindingWeight.EditorContrib */\n        }]\n}));\nNextMatchFindAction.addImplementation(0, async (accessor, editor, args) => {\n    return matchFindAction(editor, true);\n});\nconst PreviousMatchFindAction = registerMultiEditorAction(new MultiEditorAction({\n    id: FIND_IDS.PreviousMatchFindAction,\n    label: localize2(951, \"Find Previous\"),\n    precondition: undefined,\n    kbOpts: [{\n            kbExpr: EditorContextKeys.focus,\n            primary: 1024 /* KeyMod.Shift */ | 61 /* KeyCode.F3 */,\n            mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 37 /* KeyCode.KeyG */, secondary: [1024 /* KeyMod.Shift */ | 61 /* KeyCode.F3 */] },\n            weight: 100 /* KeybindingWeight.EditorContrib */\n        }, {\n            kbExpr: ContextKeyExpr.and(EditorContextKeys.focus, CONTEXT_FIND_INPUT_FOCUSED),\n            primary: 1024 /* KeyMod.Shift */ | 3 /* KeyCode.Enter */,\n            weight: 100 /* KeybindingWeight.EditorContrib */\n        }]\n}));\nPreviousMatchFindAction.addImplementation(0, async (accessor, editor, args) => {\n    return matchFindAction(editor, false);\n});\nclass MoveToMatchFindAction extends EditorAction {\n    constructor() {\n        super({\n            id: FIND_IDS.GoToMatchFindAction,\n            label: localize2(952, \"Go to Match...\"),\n            precondition: CONTEXT_FIND_WIDGET_VISIBLE\n        });\n        this._highlightDecorations = [];\n    }\n    run(accessor, editor, args) {\n        const controller = CommonFindController.get(editor);\n        if (!controller) {\n            return;\n        }\n        const matchesCount = controller.getState().matchesCount;\n        if (matchesCount < 1) {\n            const notificationService = accessor.get(INotificationService);\n            notificationService.notify({\n                severity: Severity.Warning,\n                message: localize(942, \"No matches. Try searching for something else.\")\n            });\n            return;\n        }\n        const quickInputService = accessor.get(IQuickInputService);\n        const disposables = new DisposableStore();\n        const inputBox = disposables.add(quickInputService.createInputBox());\n        inputBox.placeholder = localize(943, \"Type a number to go to a specific match (between 1 and {0})\", matchesCount);\n        const toFindMatchIndex = (value) => {\n            const index = parseInt(value);\n            if (isNaN(index)) {\n                return undefined;\n            }\n            const matchCount = controller.getState().matchesCount;\n            if (index > 0 && index <= matchCount) {\n                return index - 1; // zero based\n            }\n            else if (index < 0 && index >= -matchCount) {\n                return matchCount + index;\n            }\n            return undefined;\n        };\n        const updatePickerAndEditor = (value) => {\n            const index = toFindMatchIndex(value);\n            if (typeof index === 'number') {\n                // valid\n                inputBox.validationMessage = undefined;\n                controller.goToMatch(index);\n                const currentMatch = controller.getState().currentMatch;\n                if (currentMatch) {\n                    this.addDecorations(editor, currentMatch);\n                }\n            }\n            else {\n                inputBox.validationMessage = localize(944, \"Please type a number between 1 and {0}\", controller.getState().matchesCount);\n                this.clearDecorations(editor);\n            }\n        };\n        disposables.add(inputBox.onDidChangeValue(value => {\n            updatePickerAndEditor(value);\n        }));\n        disposables.add(inputBox.onDidAccept(() => {\n            const index = toFindMatchIndex(inputBox.value);\n            if (typeof index === 'number') {\n                controller.goToMatch(index);\n                inputBox.hide();\n            }\n            else {\n                inputBox.validationMessage = localize(945, \"Please type a number between 1 and {0}\", controller.getState().matchesCount);\n            }\n        }));\n        disposables.add(inputBox.onDidHide(() => {\n            this.clearDecorations(editor);\n            disposables.dispose();\n        }));\n        inputBox.show();\n    }\n    clearDecorations(editor) {\n        editor.changeDecorations(changeAccessor => {\n            this._highlightDecorations = changeAccessor.deltaDecorations(this._highlightDecorations, []);\n        });\n    }\n    addDecorations(editor, range) {\n        editor.changeDecorations(changeAccessor => {\n            this._highlightDecorations = changeAccessor.deltaDecorations(this._highlightDecorations, [\n                {\n                    range,\n                    options: {\n                        description: 'find-match-quick-access-range-highlight',\n                        className: 'rangeHighlight',\n                        isWholeLine: true\n                    }\n                },\n                {\n                    range,\n                    options: {\n                        description: 'find-match-quick-access-range-highlight-overview',\n                        overviewRuler: {\n                            color: themeColorFromId(overviewRulerRangeHighlight),\n                            position: OverviewRulerLane.Full\n                        }\n                    }\n                }\n            ]);\n        });\n    }\n}\nclass SelectionMatchFindAction extends EditorAction {\n    async run(accessor, editor) {\n        const controller = CommonFindController.get(editor);\n        if (!controller) {\n            return;\n        }\n        const selectionSearchString = getSelectionSearchString(editor, 'single', false);\n        if (selectionSearchString) {\n            controller.setSearchString(selectionSearchString);\n        }\n        if (!this._run(controller)) {\n            await controller.start({\n                forceRevealReplace: false,\n                seedSearchStringFromSelection: 'none',\n                seedSearchStringFromNonEmptySelection: false,\n                seedSearchStringFromGlobalClipboard: false,\n                shouldFocus: 0 /* FindStartFocusAction.NoFocusChange */,\n                shouldAnimate: true,\n                updateSearchScope: false,\n                loop: editor.getOption(50 /* EditorOption.find */).loop\n            });\n            this._run(controller);\n        }\n    }\n}\nclass NextSelectionMatchFindAction extends SelectionMatchFindAction {\n    constructor() {\n        super({\n            id: FIND_IDS.NextSelectionMatchFindAction,\n            label: localize2(953, \"Find Next Selection\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.focus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 61 /* KeyCode.F3 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    _run(controller) {\n        return controller.moveToNextMatch();\n    }\n}\nclass PreviousSelectionMatchFindAction extends SelectionMatchFindAction {\n    constructor() {\n        super({\n            id: FIND_IDS.PreviousSelectionMatchFindAction,\n            label: localize2(954, \"Find Previous Selection\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.focus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 61 /* KeyCode.F3 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    _run(controller) {\n        return controller.moveToPrevMatch();\n    }\n}\nconst StartFindReplaceAction = registerMultiEditorAction(new MultiEditorAction({\n    id: FIND_IDS.StartFindReplaceAction,\n    label: localize2(955, \"Replace\"),\n    precondition: ContextKeyExpr.or(EditorContextKeys.focus, ContextKeyExpr.has('editorIsOpen')),\n    kbOpts: {\n        kbExpr: null,\n        primary: 2048 /* KeyMod.CtrlCmd */ | 38 /* KeyCode.KeyH */,\n        mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 36 /* KeyCode.KeyF */ },\n        weight: 100 /* KeybindingWeight.EditorContrib */\n    },\n    menuOpts: {\n        menuId: MenuId.MenubarEditMenu,\n        group: '3_find',\n        title: localize(946, \"&&Replace\"),\n        order: 2\n    }\n}));\nStartFindReplaceAction.addImplementation(0, (accessor, editor, args) => {\n    if (!editor.hasModel() || editor.getOption(104 /* EditorOption.readOnly */)) {\n        return false;\n    }\n    const controller = CommonFindController.get(editor);\n    if (!controller) {\n        return false;\n    }\n    const currentSelection = editor.getSelection();\n    const findInputFocused = controller.isFindInputFocused();\n    // we only seed search string from selection when the current selection is single line and not empty,\n    // + the find input is not focused\n    const seedSearchStringFromSelection = !currentSelection.isEmpty()\n        && currentSelection.startLineNumber === currentSelection.endLineNumber\n        && (editor.getOption(50 /* EditorOption.find */).seedSearchStringFromSelection !== 'never')\n        && !findInputFocused;\n    /*\n    * if the existing search string in find widget is empty and we don't seed search string from selection, it means the Find Input is still empty, so we should focus the Find Input instead of Replace Input.\n\n    * findInputFocused true -> seedSearchStringFromSelection false, FocusReplaceInput\n    * findInputFocused false, seedSearchStringFromSelection true FocusReplaceInput\n    * findInputFocused false seedSearchStringFromSelection false FocusFindInput\n    */\n    const shouldFocus = (findInputFocused || seedSearchStringFromSelection) ?\n        2 /* FindStartFocusAction.FocusReplaceInput */ : 1 /* FindStartFocusAction.FocusFindInput */;\n    return controller.start({\n        forceRevealReplace: true,\n        seedSearchStringFromSelection: seedSearchStringFromSelection ? 'single' : 'none',\n        seedSearchStringFromNonEmptySelection: editor.getOption(50 /* EditorOption.find */).seedSearchStringFromSelection === 'selection',\n        seedSearchStringFromGlobalClipboard: editor.getOption(50 /* EditorOption.find */).seedSearchStringFromSelection !== 'never',\n        shouldFocus: shouldFocus,\n        shouldAnimate: true,\n        updateSearchScope: false,\n        loop: editor.getOption(50 /* EditorOption.find */).loop\n    });\n});\nregisterEditorContribution(CommonFindController.ID, FindController, 0 /* EditorContributionInstantiation.Eager */); // eager because it uses `saveViewState`/`restoreViewState`\nregisterEditorAction(StartFindWithArgsAction);\nregisterEditorAction(StartFindWithSelectionAction);\nregisterEditorAction(MoveToMatchFindAction);\nregisterEditorAction(NextSelectionMatchFindAction);\nregisterEditorAction(PreviousSelectionMatchFindAction);\nconst FindCommand = EditorCommand.bindToContribution(CommonFindController.get);\nregisterEditorCommand(new FindCommand({\n    id: FIND_IDS.CloseFindWidgetCommand,\n    precondition: CONTEXT_FIND_WIDGET_VISIBLE,\n    handler: x => x.closeFindWidget(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 5,\n        kbExpr: ContextKeyExpr.and(EditorContextKeys.focus, ContextKeyExpr.not('isComposing')),\n        primary: 9 /* KeyCode.Escape */,\n        secondary: [1024 /* KeyMod.Shift */ | 9 /* KeyCode.Escape */]\n    }\n}));\nregisterEditorCommand(new FindCommand({\n    id: FIND_IDS.ToggleCaseSensitiveCommand,\n    precondition: undefined,\n    handler: x => x.toggleCaseSensitive(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 5,\n        kbExpr: EditorContextKeys.focus,\n        primary: ToggleCaseSensitiveKeybinding.primary,\n        mac: ToggleCaseSensitiveKeybinding.mac,\n        win: ToggleCaseSensitiveKeybinding.win,\n        linux: ToggleCaseSensitiveKeybinding.linux\n    }\n}));\nregisterEditorCommand(new FindCommand({\n    id: FIND_IDS.ToggleWholeWordCommand,\n    precondition: undefined,\n    handler: x => x.toggleWholeWords(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 5,\n        kbExpr: EditorContextKeys.focus,\n        primary: ToggleWholeWordKeybinding.primary,\n        mac: ToggleWholeWordKeybinding.mac,\n        win: ToggleWholeWordKeybinding.win,\n        linux: ToggleWholeWordKeybinding.linux\n    }\n}));\nregisterEditorCommand(new FindCommand({\n    id: FIND_IDS.ToggleRegexCommand,\n    precondition: undefined,\n    handler: x => x.toggleRegex(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 5,\n        kbExpr: EditorContextKeys.focus,\n        primary: ToggleRegexKeybinding.primary,\n        mac: ToggleRegexKeybinding.mac,\n        win: ToggleRegexKeybinding.win,\n        linux: ToggleRegexKeybinding.linux\n    }\n}));\nregisterEditorCommand(new FindCommand({\n    id: FIND_IDS.ToggleSearchScopeCommand,\n    precondition: undefined,\n    handler: x => x.toggleSearchScope(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 5,\n        kbExpr: EditorContextKeys.focus,\n        primary: ToggleSearchScopeKeybinding.primary,\n        mac: ToggleSearchScopeKeybinding.mac,\n        win: ToggleSearchScopeKeybinding.win,\n        linux: ToggleSearchScopeKeybinding.linux\n    }\n}));\nregisterEditorCommand(new FindCommand({\n    id: FIND_IDS.TogglePreserveCaseCommand,\n    precondition: undefined,\n    handler: x => x.togglePreserveCase(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 5,\n        kbExpr: EditorContextKeys.focus,\n        primary: TogglePreserveCaseKeybinding.primary,\n        mac: TogglePreserveCaseKeybinding.mac,\n        win: TogglePreserveCaseKeybinding.win,\n        linux: TogglePreserveCaseKeybinding.linux\n    }\n}));\nregisterEditorCommand(new FindCommand({\n    id: FIND_IDS.ReplaceOneAction,\n    precondition: CONTEXT_FIND_WIDGET_VISIBLE,\n    handler: x => x.replace(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 5,\n        kbExpr: EditorContextKeys.focus,\n        primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 22 /* KeyCode.Digit1 */\n    }\n}));\nregisterEditorCommand(new FindCommand({\n    id: FIND_IDS.ReplaceOneAction,\n    precondition: CONTEXT_FIND_WIDGET_VISIBLE,\n    handler: x => x.replace(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 5,\n        kbExpr: ContextKeyExpr.and(EditorContextKeys.focus, CONTEXT_REPLACE_INPUT_FOCUSED),\n        primary: 3 /* KeyCode.Enter */\n    }\n}));\nregisterEditorCommand(new FindCommand({\n    id: FIND_IDS.ReplaceAllAction,\n    precondition: CONTEXT_FIND_WIDGET_VISIBLE,\n    handler: x => x.replaceAll(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 5,\n        kbExpr: EditorContextKeys.focus,\n        primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 3 /* KeyCode.Enter */\n    }\n}));\nregisterEditorCommand(new FindCommand({\n    id: FIND_IDS.ReplaceAllAction,\n    precondition: CONTEXT_FIND_WIDGET_VISIBLE,\n    handler: x => x.replaceAll(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 5,\n        kbExpr: ContextKeyExpr.and(EditorContextKeys.focus, CONTEXT_REPLACE_INPUT_FOCUSED),\n        primary: undefined,\n        mac: {\n            primary: 2048 /* KeyMod.CtrlCmd */ | 3 /* KeyCode.Enter */,\n        }\n    }\n}));\nregisterEditorCommand(new FindCommand({\n    id: FIND_IDS.SelectAllMatchesAction,\n    precondition: CONTEXT_FIND_WIDGET_VISIBLE,\n    handler: x => x.selectAllMatches(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 5,\n        kbExpr: EditorContextKeys.focus,\n        primary: 512 /* KeyMod.Alt */ | 3 /* KeyCode.Enter */\n    }\n}));\n\nexport { CommonFindController, FindController, MoveToMatchFindAction, NextMatchFindAction, NextSelectionMatchFindAction, PreviousMatchFindAction, PreviousSelectionMatchFindAction, SelectionMatchFindAction, StartFindAction, StartFindReplaceAction, StartFindWithArgsAction, StartFindWithSelectionAction, getSelectionSearchString };\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 *--------------------------------------------------------------------------------------------*/\nconst foldSourceAbbr = {\n    [0 /* FoldSource.provider */]: ' ',\n    [1 /* FoldSource.userDefined */]: 'u',\n    [2 /* FoldSource.recovered */]: 'r',\n};\nconst MAX_FOLDING_REGIONS = 0xFFFF;\nconst MAX_LINE_NUMBER = 0xFFFFFF;\nconst MASK_INDENT = 0xFF000000;\nclass BitField {\n    constructor(size) {\n        const numWords = Math.ceil(size / 32);\n        this._states = new Uint32Array(numWords);\n    }\n    get(index) {\n        const arrayIndex = (index / 32) | 0;\n        const bit = index % 32;\n        return (this._states[arrayIndex] & (1 << bit)) !== 0;\n    }\n    set(index, newState) {\n        const arrayIndex = (index / 32) | 0;\n        const bit = index % 32;\n        const value = this._states[arrayIndex];\n        if (newState) {\n            this._states[arrayIndex] = value | (1 << bit);\n        }\n        else {\n            this._states[arrayIndex] = value & ~(1 << bit);\n        }\n    }\n}\nclass FoldingRegions {\n    constructor(startIndexes, endIndexes, types) {\n        if (startIndexes.length !== endIndexes.length || startIndexes.length > MAX_FOLDING_REGIONS) {\n            throw new Error('invalid startIndexes or endIndexes size');\n        }\n        this._startIndexes = startIndexes;\n        this._endIndexes = endIndexes;\n        this._collapseStates = new BitField(startIndexes.length);\n        this._userDefinedStates = new BitField(startIndexes.length);\n        this._recoveredStates = new BitField(startIndexes.length);\n        this._types = types;\n        this._parentsComputed = false;\n    }\n    ensureParentIndices() {\n        if (!this._parentsComputed) {\n            this._parentsComputed = true;\n            const parentIndexes = [];\n            const isInsideLast = (startLineNumber, endLineNumber) => {\n                const index = parentIndexes[parentIndexes.length - 1];\n                return this.getStartLineNumber(index) <= startLineNumber && this.getEndLineNumber(index) >= endLineNumber;\n            };\n            for (let i = 0, len = this._startIndexes.length; i < len; i++) {\n                const startLineNumber = this._startIndexes[i];\n                const endLineNumber = this._endIndexes[i];\n                if (startLineNumber > MAX_LINE_NUMBER || endLineNumber > MAX_LINE_NUMBER) {\n                    throw new Error('startLineNumber or endLineNumber must not exceed ' + MAX_LINE_NUMBER);\n                }\n                while (parentIndexes.length > 0 && !isInsideLast(startLineNumber, endLineNumber)) {\n                    parentIndexes.pop();\n                }\n                const parentIndex = parentIndexes.length > 0 ? parentIndexes[parentIndexes.length - 1] : -1;\n                parentIndexes.push(i);\n                this._startIndexes[i] = startLineNumber + ((parentIndex & 0xFF) << 24);\n                this._endIndexes[i] = endLineNumber + ((parentIndex & 0xFF00) << 16);\n            }\n        }\n    }\n    get length() {\n        return this._startIndexes.length;\n    }\n    getStartLineNumber(index) {\n        return this._startIndexes[index] & MAX_LINE_NUMBER;\n    }\n    getEndLineNumber(index) {\n        return this._endIndexes[index] & MAX_LINE_NUMBER;\n    }\n    getType(index) {\n        return this._types ? this._types[index] : undefined;\n    }\n    hasTypes() {\n        return !!this._types;\n    }\n    isCollapsed(index) {\n        return this._collapseStates.get(index);\n    }\n    setCollapsed(index, newState) {\n        this._collapseStates.set(index, newState);\n    }\n    isUserDefined(index) {\n        return this._userDefinedStates.get(index);\n    }\n    setUserDefined(index, newState) {\n        return this._userDefinedStates.set(index, newState);\n    }\n    isRecovered(index) {\n        return this._recoveredStates.get(index);\n    }\n    setRecovered(index, newState) {\n        return this._recoveredStates.set(index, newState);\n    }\n    getSource(index) {\n        if (this.isUserDefined(index)) {\n            return 1 /* FoldSource.userDefined */;\n        }\n        else if (this.isRecovered(index)) {\n            return 2 /* FoldSource.recovered */;\n        }\n        return 0 /* FoldSource.provider */;\n    }\n    setSource(index, source) {\n        if (source === 1 /* FoldSource.userDefined */) {\n            this.setUserDefined(index, true);\n            this.setRecovered(index, false);\n        }\n        else if (source === 2 /* FoldSource.recovered */) {\n            this.setUserDefined(index, false);\n            this.setRecovered(index, true);\n        }\n        else {\n            this.setUserDefined(index, false);\n            this.setRecovered(index, false);\n        }\n    }\n    setCollapsedAllOfType(type, newState) {\n        let hasChanged = false;\n        if (this._types) {\n            for (let i = 0; i < this._types.length; i++) {\n                if (this._types[i] === type) {\n                    this.setCollapsed(i, newState);\n                    hasChanged = true;\n                }\n            }\n        }\n        return hasChanged;\n    }\n    toRegion(index) {\n        return new FoldingRegion(this, index);\n    }\n    getParentIndex(index) {\n        this.ensureParentIndices();\n        const parent = ((this._startIndexes[index] & MASK_INDENT) >>> 24) + ((this._endIndexes[index] & MASK_INDENT) >>> 16);\n        if (parent === MAX_FOLDING_REGIONS) {\n            return -1;\n        }\n        return parent;\n    }\n    contains(index, line) {\n        return this.getStartLineNumber(index) <= line && this.getEndLineNumber(index) >= line;\n    }\n    findIndex(line) {\n        let low = 0, high = this._startIndexes.length;\n        if (high === 0) {\n            return -1; // no children\n        }\n        while (low < high) {\n            const mid = Math.floor((low + high) / 2);\n            if (line < this.getStartLineNumber(mid)) {\n                high = mid;\n            }\n            else {\n                low = mid + 1;\n            }\n        }\n        return low - 1;\n    }\n    findRange(line) {\n        let index = this.findIndex(line);\n        if (index >= 0) {\n            const endLineNumber = this.getEndLineNumber(index);\n            if (endLineNumber >= line) {\n                return index;\n            }\n            index = this.getParentIndex(index);\n            while (index !== -1) {\n                if (this.contains(index, line)) {\n                    return index;\n                }\n                index = this.getParentIndex(index);\n            }\n        }\n        return -1;\n    }\n    toString() {\n        const res = [];\n        for (let i = 0; i < this.length; i++) {\n            res[i] = `[${foldSourceAbbr[this.getSource(i)]}${this.isCollapsed(i) ? '+' : '-'}] ${this.getStartLineNumber(i)}/${this.getEndLineNumber(i)}`;\n        }\n        return res.join(', ');\n    }\n    toFoldRange(index) {\n        return {\n            startLineNumber: this._startIndexes[index] & MAX_LINE_NUMBER,\n            endLineNumber: this._endIndexes[index] & MAX_LINE_NUMBER,\n            type: this._types ? this._types[index] : undefined,\n            isCollapsed: this.isCollapsed(index),\n            source: this.getSource(index)\n        };\n    }\n    static fromFoldRanges(ranges) {\n        const rangesLength = ranges.length;\n        const startIndexes = new Uint32Array(rangesLength);\n        const endIndexes = new Uint32Array(rangesLength);\n        let types = [];\n        let gotTypes = false;\n        for (let i = 0; i < rangesLength; i++) {\n            const range = ranges[i];\n            startIndexes[i] = range.startLineNumber;\n            endIndexes[i] = range.endLineNumber;\n            types.push(range.type);\n            if (range.type) {\n                gotTypes = true;\n            }\n        }\n        if (!gotTypes) {\n            types = undefined;\n        }\n        const regions = new FoldingRegions(startIndexes, endIndexes, types);\n        for (let i = 0; i < rangesLength; i++) {\n            if (ranges[i].isCollapsed) {\n                regions.setCollapsed(i, true);\n            }\n            regions.setSource(i, ranges[i].source);\n        }\n        return regions;\n    }\n    /**\n     * Two inputs, each a FoldingRegions or a FoldRange[], are merged.\n     * Each input must be pre-sorted on startLineNumber.\n     * The first list is assumed to always include all regions currently defined by range providers.\n     * The second list only contains the previously collapsed and all manual ranges.\n     * If the line position matches, the range of the new range is taken, and the range is no longer manual\n     * When an entry in one list overlaps an entry in the other, the second list's entry \"wins\" and\n     * overlapping entries in the first list are discarded.\n     * Invalid entries are discarded. An entry is invalid if:\n     * \t\tthe start and end line numbers aren't a valid range of line numbers,\n     * \t\tit is out of sequence or has the same start line as a preceding entry,\n     * \t\tit overlaps a preceding entry and is not fully contained by that entry.\n     */\n    static sanitizeAndMerge(rangesA, rangesB, maxLineNumber, selection) {\n        maxLineNumber = maxLineNumber ?? Number.MAX_VALUE;\n        const getIndexedFunction = (r, limit) => {\n            return Array.isArray(r)\n                ? ((i) => { return (i < limit) ? r[i] : undefined; })\n                : ((i) => { return (i < limit) ? r.toFoldRange(i) : undefined; });\n        };\n        const getA = getIndexedFunction(rangesA, rangesA.length);\n        const getB = getIndexedFunction(rangesB, rangesB.length);\n        let indexA = 0;\n        let indexB = 0;\n        let nextA = getA(0);\n        let nextB = getB(0);\n        const stackedRanges = [];\n        let topStackedRange;\n        let prevLineNumber = 0;\n        const resultRanges = [];\n        while (nextA || nextB) {\n            let useRange = undefined;\n            if (nextB && (!nextA || nextA.startLineNumber >= nextB.startLineNumber)) {\n                if (nextA && nextA.startLineNumber === nextB.startLineNumber) {\n                    if (nextB.source === 1 /* FoldSource.userDefined */) {\n                        // a user defined range (possibly unfolded)\n                        useRange = nextB;\n                    }\n                    else {\n                        // a previously folded range or a (possibly unfolded) recovered range\n                        useRange = nextA;\n                        // stays collapsed if the range still has the same number of lines or the selection is not in the range or after it\n                        useRange.isCollapsed = nextB.isCollapsed && (nextA.endLineNumber === nextB.endLineNumber || !selection?.startsInside(nextA.startLineNumber + 1, nextA.endLineNumber + 1));\n                        useRange.source = 0 /* FoldSource.provider */;\n                    }\n                    nextA = getA(++indexA); // not necessary, just for speed\n                }\n                else {\n                    useRange = nextB;\n                    if (nextB.isCollapsed && nextB.source === 0 /* FoldSource.provider */) {\n                        // a previously collapsed range\n                        useRange.source = 2 /* FoldSource.recovered */;\n                    }\n                }\n                nextB = getB(++indexB);\n            }\n            else {\n                // nextA is next. The user folded B set takes precedence and we sometimes need to look\n                // ahead in it to check for an upcoming conflict.\n                let scanIndex = indexB;\n                let prescanB = nextB;\n                while (true) {\n                    if (!prescanB || prescanB.startLineNumber > nextA.endLineNumber) {\n                        useRange = nextA;\n                        break; // no conflict, use this nextA\n                    }\n                    if (prescanB.source === 1 /* FoldSource.userDefined */ && prescanB.endLineNumber > nextA.endLineNumber) {\n                        // we found a user folded range, it wins\n                        break; // without setting nextResult, so this nextA gets skipped\n                    }\n                    prescanB = getB(++scanIndex);\n                }\n                nextA = getA(++indexA);\n            }\n            if (useRange) {\n                while (topStackedRange\n                    && topStackedRange.endLineNumber < useRange.startLineNumber) {\n                    topStackedRange = stackedRanges.pop();\n                }\n                if (useRange.endLineNumber > useRange.startLineNumber\n                    && useRange.startLineNumber > prevLineNumber\n                    && useRange.endLineNumber <= maxLineNumber\n                    && (!topStackedRange\n                        || topStackedRange.endLineNumber >= useRange.endLineNumber)) {\n                    resultRanges.push(useRange);\n                    prevLineNumber = useRange.startLineNumber;\n                    if (topStackedRange) {\n                        stackedRanges.push(topStackedRange);\n                    }\n                    topStackedRange = useRange;\n                }\n            }\n        }\n        return resultRanges;\n    }\n}\nclass FoldingRegion {\n    constructor(ranges, index) {\n        this.ranges = ranges;\n        this.index = index;\n    }\n    get startLineNumber() {\n        return this.ranges.getStartLineNumber(this.index);\n    }\n    get endLineNumber() {\n        return this.ranges.getEndLineNumber(this.index);\n    }\n    get regionIndex() {\n        return this.index;\n    }\n    get parentIndex() {\n        return this.ranges.getParentIndex(this.index);\n    }\n    get isCollapsed() {\n        return this.ranges.isCollapsed(this.index);\n    }\n    containedBy(range) {\n        return range.startLineNumber <= this.startLineNumber && range.endLineNumber >= this.endLineNumber;\n    }\n    containsLine(lineNumber) {\n        return this.startLineNumber <= lineNumber && lineNumber <= this.endLineNumber;\n    }\n}\n\nexport { FoldingRegion, FoldingRegions, MAX_FOLDING_REGIONS, MAX_LINE_NUMBER, foldSourceAbbr };\n","import { Emitter } from '../../../../base/common/event.js';\nimport { FoldingRegions } from './foldingRanges.js';\nimport { hash } from '../../../../base/common/hash.js';\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 *--------------------------------------------------------------------------------------------*/\nclass FoldingModel {\n    get regions() { return this._regions; }\n    get textModel() { return this._textModel; }\n    constructor(textModel, decorationProvider) {\n        this._updateEventEmitter = new Emitter();\n        this.onDidChange = this._updateEventEmitter.event;\n        this._textModel = textModel;\n        this._decorationProvider = decorationProvider;\n        this._regions = new FoldingRegions(new Uint32Array(0), new Uint32Array(0));\n        this._editorDecorationIds = [];\n    }\n    toggleCollapseState(toggledRegions) {\n        if (!toggledRegions.length) {\n            return;\n        }\n        toggledRegions = toggledRegions.sort((r1, r2) => r1.regionIndex - r2.regionIndex);\n        const processed = {};\n        this._decorationProvider.changeDecorations(accessor => {\n            let k = 0; // index from [0 ... this.regions.length]\n            let dirtyRegionEndLine = -1; // end of the range where decorations need to be updated\n            let lastHiddenLine = -1; // the end of the last hidden lines\n            const updateDecorationsUntil = (index) => {\n                while (k < index) {\n                    const endLineNumber = this._regions.getEndLineNumber(k);\n                    const isCollapsed = this._regions.isCollapsed(k);\n                    if (endLineNumber <= dirtyRegionEndLine) {\n                        const isManual = this.regions.getSource(k) !== 0 /* FoldSource.provider */;\n                        accessor.changeDecorationOptions(this._editorDecorationIds[k], this._decorationProvider.getDecorationOption(isCollapsed, endLineNumber <= lastHiddenLine, isManual));\n                    }\n                    if (isCollapsed && endLineNumber > lastHiddenLine) {\n                        lastHiddenLine = endLineNumber;\n                    }\n                    k++;\n                }\n            };\n            for (const region of toggledRegions) {\n                const index = region.regionIndex;\n                const editorDecorationId = this._editorDecorationIds[index];\n                if (editorDecorationId && !processed[editorDecorationId]) {\n                    processed[editorDecorationId] = true;\n                    updateDecorationsUntil(index); // update all decorations up to current index using the old dirtyRegionEndLine\n                    const newCollapseState = !this._regions.isCollapsed(index);\n                    this._regions.setCollapsed(index, newCollapseState);\n                    dirtyRegionEndLine = Math.max(dirtyRegionEndLine, this._regions.getEndLineNumber(index));\n                }\n            }\n            updateDecorationsUntil(this._regions.length);\n        });\n        this._updateEventEmitter.fire({ model: this, collapseStateChanged: toggledRegions });\n    }\n    removeManualRanges(ranges) {\n        const newFoldingRanges = new Array();\n        const intersects = (foldRange) => {\n            for (const range of ranges) {\n                if (!(range.startLineNumber > foldRange.endLineNumber || foldRange.startLineNumber > range.endLineNumber)) {\n                    return true;\n                }\n            }\n            return false;\n        };\n        for (let i = 0; i < this._regions.length; i++) {\n            const foldRange = this._regions.toFoldRange(i);\n            if (foldRange.source === 0 /* FoldSource.provider */ || !intersects(foldRange)) {\n                newFoldingRanges.push(foldRange);\n            }\n        }\n        this.updatePost(FoldingRegions.fromFoldRanges(newFoldingRanges));\n    }\n    update(newRegions, selection) {\n        const foldedOrManualRanges = this._currentFoldedOrManualRanges(selection);\n        const newRanges = FoldingRegions.sanitizeAndMerge(newRegions, foldedOrManualRanges, this._textModel.getLineCount(), selection);\n        this.updatePost(FoldingRegions.fromFoldRanges(newRanges));\n    }\n    updatePost(newRegions) {\n        const newEditorDecorations = [];\n        let lastHiddenLine = -1;\n        for (let index = 0, limit = newRegions.length; index < limit; index++) {\n            const startLineNumber = newRegions.getStartLineNumber(index);\n            const endLineNumber = newRegions.getEndLineNumber(index);\n            const isCollapsed = newRegions.isCollapsed(index);\n            const isManual = newRegions.getSource(index) !== 0 /* FoldSource.provider */;\n            const decorationRange = {\n                startLineNumber: startLineNumber,\n                startColumn: this._textModel.getLineMaxColumn(startLineNumber),\n                endLineNumber: endLineNumber,\n                endColumn: this._textModel.getLineMaxColumn(endLineNumber) + 1\n            };\n            newEditorDecorations.push({ range: decorationRange, options: this._decorationProvider.getDecorationOption(isCollapsed, endLineNumber <= lastHiddenLine, isManual) });\n            if (isCollapsed && endLineNumber > lastHiddenLine) {\n                lastHiddenLine = endLineNumber;\n            }\n        }\n        this._decorationProvider.changeDecorations(accessor => this._editorDecorationIds = accessor.deltaDecorations(this._editorDecorationIds, newEditorDecorations));\n        this._regions = newRegions;\n        this._updateEventEmitter.fire({ model: this });\n    }\n    _currentFoldedOrManualRanges(selection) {\n        const foldedRanges = [];\n        for (let i = 0, limit = this._regions.length; i < limit; i++) {\n            let isCollapsed = this.regions.isCollapsed(i);\n            const source = this.regions.getSource(i);\n            if (isCollapsed || source !== 0 /* FoldSource.provider */) {\n                const foldRange = this._regions.toFoldRange(i);\n                const decRange = this._textModel.getDecorationRange(this._editorDecorationIds[i]);\n                if (decRange) {\n                    if (isCollapsed && selection?.startsInside(decRange.startLineNumber + 1, decRange.endLineNumber)) {\n                        isCollapsed = false; // uncollapse is the range is blocked\n                    }\n                    foldedRanges.push({\n                        startLineNumber: decRange.startLineNumber,\n                        endLineNumber: decRange.endLineNumber,\n                        type: foldRange.type,\n                        isCollapsed,\n                        source\n                    });\n                }\n            }\n        }\n        return foldedRanges;\n    }\n    /**\n     * Collapse state memento, for persistence only\n     */\n    getMemento() {\n        const foldedOrManualRanges = this._currentFoldedOrManualRanges();\n        const result = [];\n        const maxLineNumber = this._textModel.getLineCount();\n        for (let i = 0, limit = foldedOrManualRanges.length; i < limit; i++) {\n            const range = foldedOrManualRanges[i];\n            if (range.startLineNumber >= range.endLineNumber || range.startLineNumber < 1 || range.endLineNumber > maxLineNumber) {\n                continue;\n            }\n            const checksum = this._getLinesChecksum(range.startLineNumber + 1, range.endLineNumber);\n            result.push({\n                startLineNumber: range.startLineNumber,\n                endLineNumber: range.endLineNumber,\n                isCollapsed: range.isCollapsed,\n                source: range.source,\n                checksum: checksum\n            });\n        }\n        return (result.length > 0) ? result : undefined;\n    }\n    /**\n     * Apply persisted state, for persistence only\n     */\n    applyMemento(state) {\n        if (!Array.isArray(state)) {\n            return;\n        }\n        const rangesToRestore = [];\n        const maxLineNumber = this._textModel.getLineCount();\n        for (const range of state) {\n            if (range.startLineNumber >= range.endLineNumber || range.startLineNumber < 1 || range.endLineNumber > maxLineNumber) {\n                continue;\n            }\n            const checksum = this._getLinesChecksum(range.startLineNumber + 1, range.endLineNumber);\n            if (!range.checksum || checksum === range.checksum) {\n                rangesToRestore.push({\n                    startLineNumber: range.startLineNumber,\n                    endLineNumber: range.endLineNumber,\n                    type: undefined,\n                    isCollapsed: range.isCollapsed ?? true,\n                    source: range.source ?? 0 /* FoldSource.provider */\n                });\n            }\n        }\n        const newRanges = FoldingRegions.sanitizeAndMerge(this._regions, rangesToRestore, maxLineNumber);\n        this.updatePost(FoldingRegions.fromFoldRanges(newRanges));\n    }\n    _getLinesChecksum(lineNumber1, lineNumber2) {\n        const h = hash(this._textModel.getLineContent(lineNumber1)\n            + this._textModel.getLineContent(lineNumber2));\n        return h % 1000000; // 6 digits is plenty\n    }\n    dispose() {\n        this._decorationProvider.removeDecorations(this._editorDecorationIds);\n    }\n    getAllRegionsAtLine(lineNumber, filter) {\n        const result = [];\n        if (this._regions) {\n            let index = this._regions.findRange(lineNumber);\n            let level = 1;\n            while (index >= 0) {\n                const current = this._regions.toRegion(index);\n                if (!filter || filter(current, level)) {\n                    result.push(current);\n                }\n                level++;\n                index = current.parentIndex;\n            }\n        }\n        return result;\n    }\n    getRegionAtLine(lineNumber) {\n        if (this._regions) {\n            const index = this._regions.findRange(lineNumber);\n            if (index >= 0) {\n                return this._regions.toRegion(index);\n            }\n        }\n        return null;\n    }\n    getRegionsInside(region, filter) {\n        const result = [];\n        const index = region ? region.regionIndex + 1 : 0;\n        const endLineNumber = region ? region.endLineNumber : Number.MAX_VALUE;\n        if (filter && filter.length === 2) {\n            const levelStack = [];\n            for (let i = index, len = this._regions.length; i < len; i++) {\n                const current = this._regions.toRegion(i);\n                if (this._regions.getStartLineNumber(i) < endLineNumber) {\n                    while (levelStack.length > 0 && !current.containedBy(levelStack[levelStack.length - 1])) {\n                        levelStack.pop();\n                    }\n                    levelStack.push(current);\n                    if (filter(current, levelStack.length)) {\n                        result.push(current);\n                    }\n                }\n                else {\n                    break;\n                }\n            }\n        }\n        else {\n            for (let i = index, len = this._regions.length; i < len; i++) {\n                const current = this._regions.toRegion(i);\n                if (this._regions.getStartLineNumber(i) < endLineNumber) {\n                    if (!filter || filter(current)) {\n                        result.push(current);\n                    }\n                }\n                else {\n                    break;\n                }\n            }\n        }\n        return result;\n    }\n}\n/**\n * Collapse or expand the regions at the given locations\n * @param levels The number of levels. Use 1 to only impact the regions at the location, use Number.MAX_VALUE for all levels.\n * @param lineNumbers the location of the regions to collapse or expand, or if not set, all regions in the model.\n */\nfunction toggleCollapseState(foldingModel, levels, lineNumbers) {\n    const toToggle = [];\n    for (const lineNumber of lineNumbers) {\n        const region = foldingModel.getRegionAtLine(lineNumber);\n        if (region) {\n            const doCollapse = !region.isCollapsed;\n            toToggle.push(region);\n            if (levels > 1) {\n                const regionsInside = foldingModel.getRegionsInside(region, (r, level) => r.isCollapsed !== doCollapse && level < levels);\n                toToggle.push(...regionsInside);\n            }\n        }\n    }\n    foldingModel.toggleCollapseState(toToggle);\n}\n/**\n * Collapse or expand the regions at the given locations including all children.\n * @param doCollapse Whether to collapse or expand\n * @param levels The number of levels. Use 1 to only impact the regions at the location, use Number.MAX_VALUE for all levels.\n * @param lineNumbers the location of the regions to collapse or expand, or if not set, all regions in the model.\n */\nfunction setCollapseStateLevelsDown(foldingModel, doCollapse, levels = Number.MAX_VALUE, lineNumbers) {\n    const toToggle = [];\n    if (lineNumbers && lineNumbers.length > 0) {\n        for (const lineNumber of lineNumbers) {\n            const region = foldingModel.getRegionAtLine(lineNumber);\n            if (region) {\n                if (region.isCollapsed !== doCollapse) {\n                    toToggle.push(region);\n                }\n                if (levels > 1) {\n                    const regionsInside = foldingModel.getRegionsInside(region, (r, level) => r.isCollapsed !== doCollapse && level < levels);\n                    toToggle.push(...regionsInside);\n                }\n            }\n        }\n    }\n    else {\n        const regionsInside = foldingModel.getRegionsInside(null, (r, level) => r.isCollapsed !== doCollapse && level < levels);\n        toToggle.push(...regionsInside);\n    }\n    foldingModel.toggleCollapseState(toToggle);\n}\n/**\n * Collapse or expand the regions at the given locations including all parents.\n * @param doCollapse Whether to collapse or expand\n * @param levels The number of levels. Use 1 to only impact the regions at the location, use Number.MAX_VALUE for all levels.\n * @param lineNumbers the location of the regions to collapse or expand.\n */\nfunction setCollapseStateLevelsUp(foldingModel, doCollapse, levels, lineNumbers) {\n    const toToggle = [];\n    for (const lineNumber of lineNumbers) {\n        const regions = foldingModel.getAllRegionsAtLine(lineNumber, (region, level) => region.isCollapsed !== doCollapse && level <= levels);\n        toToggle.push(...regions);\n    }\n    foldingModel.toggleCollapseState(toToggle);\n}\n/**\n * Collapse or expand a region at the given locations. If the inner most region is already collapsed/expanded, uses the first parent instead.\n * @param doCollapse Whether to collapse or expand\n * @param lineNumbers the location of the regions to collapse or expand.\n */\nfunction setCollapseStateUp(foldingModel, doCollapse, lineNumbers) {\n    const toToggle = [];\n    for (const lineNumber of lineNumbers) {\n        const regions = foldingModel.getAllRegionsAtLine(lineNumber, (region) => region.isCollapsed !== doCollapse);\n        if (regions.length > 0) {\n            toToggle.push(regions[0]);\n        }\n    }\n    foldingModel.toggleCollapseState(toToggle);\n}\n/**\n * Folds or unfolds all regions that have a given level, except if they contain one of the blocked lines.\n * @param foldLevel level. Level == 1 is the top level\n * @param doCollapse Whether to collapse or expand\n*/\nfunction setCollapseStateAtLevel(foldingModel, foldLevel, doCollapse, blockedLineNumbers) {\n    const filter = (region, level) => level === foldLevel && region.isCollapsed !== doCollapse && !blockedLineNumbers.some(line => region.containsLine(line));\n    const toToggle = foldingModel.getRegionsInside(null, filter);\n    foldingModel.toggleCollapseState(toToggle);\n}\n/**\n * Folds or unfolds all regions, except if they contain or are contained by a region of one of the blocked lines.\n * @param doCollapse Whether to collapse or expand\n * @param blockedLineNumbers the location of regions to not collapse or expand\n */\nfunction setCollapseStateForRest(foldingModel, doCollapse, blockedLineNumbers) {\n    const filteredRegions = [];\n    for (const lineNumber of blockedLineNumbers) {\n        const regions = foldingModel.getAllRegionsAtLine(lineNumber, undefined);\n        if (regions.length > 0) {\n            filteredRegions.push(regions[0]);\n        }\n    }\n    const filter = (region) => filteredRegions.every((filteredRegion) => !filteredRegion.containedBy(region) && !region.containedBy(filteredRegion)) && region.isCollapsed !== doCollapse;\n    const toToggle = foldingModel.getRegionsInside(null, filter);\n    foldingModel.toggleCollapseState(toToggle);\n}\n/**\n * Folds all regions for which the lines start with a given regex\n * @param foldingModel the folding model\n */\nfunction setCollapseStateForMatchingLines(foldingModel, regExp, doCollapse) {\n    const editorModel = foldingModel.textModel;\n    const regions = foldingModel.regions;\n    const toToggle = [];\n    for (let i = regions.length - 1; i >= 0; i--) {\n        if (doCollapse !== regions.isCollapsed(i)) {\n            const startLineNumber = regions.getStartLineNumber(i);\n            if (regExp.test(editorModel.getLineContent(startLineNumber))) {\n                toToggle.push(regions.toRegion(i));\n            }\n        }\n    }\n    foldingModel.toggleCollapseState(toToggle);\n}\n/**\n * Folds all regions of the given type\n * @param foldingModel the folding model\n */\nfunction setCollapseStateForType(foldingModel, type, doCollapse) {\n    const regions = foldingModel.regions;\n    const toToggle = [];\n    for (let i = regions.length - 1; i >= 0; i--) {\n        if (doCollapse !== regions.isCollapsed(i) && type === regions.getType(i)) {\n            toToggle.push(regions.toRegion(i));\n        }\n    }\n    foldingModel.toggleCollapseState(toToggle);\n}\n/**\n * Get line to go to for parent fold of current line\n * @param lineNumber the current line number\n * @param foldingModel the folding model\n *\n * @return Parent fold start line\n */\nfunction getParentFoldLine(lineNumber, foldingModel) {\n    let startLineNumber = null;\n    const foldingRegion = foldingModel.getRegionAtLine(lineNumber);\n    if (foldingRegion !== null) {\n        startLineNumber = foldingRegion.startLineNumber;\n        // If current line is not the start of the current fold, go to top line of current fold. If not, go to parent fold\n        if (lineNumber === startLineNumber) {\n            const parentFoldingIdx = foldingRegion.parentIndex;\n            if (parentFoldingIdx !== -1) {\n                startLineNumber = foldingModel.regions.getStartLineNumber(parentFoldingIdx);\n            }\n            else {\n                startLineNumber = null;\n            }\n        }\n    }\n    return startLineNumber;\n}\n/**\n * Get line to go to for previous fold at the same level of current line\n * @param lineNumber the current line number\n * @param foldingModel the folding model\n *\n * @return Previous fold start line\n */\nfunction getPreviousFoldLine(lineNumber, foldingModel) {\n    let foldingRegion = foldingModel.getRegionAtLine(lineNumber);\n    // If on the folding range start line, go to previous sibling.\n    if (foldingRegion !== null && foldingRegion.startLineNumber === lineNumber) {\n        // If current line is not the start of the current fold, go to top line of current fold. If not, go to previous fold.\n        if (lineNumber !== foldingRegion.startLineNumber) {\n            return foldingRegion.startLineNumber;\n        }\n        else {\n            // Find min line number to stay within parent.\n            const expectedParentIndex = foldingRegion.parentIndex;\n            let minLineNumber = 0;\n            if (expectedParentIndex !== -1) {\n                minLineNumber = foldingModel.regions.getStartLineNumber(foldingRegion.parentIndex);\n            }\n            // Find fold at same level.\n            while (foldingRegion !== null) {\n                if (foldingRegion.regionIndex > 0) {\n                    foldingRegion = foldingModel.regions.toRegion(foldingRegion.regionIndex - 1);\n                    // Keep at same level.\n                    if (foldingRegion.startLineNumber <= minLineNumber) {\n                        return null;\n                    }\n                    else if (foldingRegion.parentIndex === expectedParentIndex) {\n                        return foldingRegion.startLineNumber;\n                    }\n                }\n                else {\n                    return null;\n                }\n            }\n        }\n    }\n    else {\n        // Go to last fold that's before the current line.\n        if (foldingModel.regions.length > 0) {\n            foldingRegion = foldingModel.regions.toRegion(foldingModel.regions.length - 1);\n            while (foldingRegion !== null) {\n                // Found fold before current line.\n                if (foldingRegion.startLineNumber < lineNumber) {\n                    return foldingRegion.startLineNumber;\n                }\n                if (foldingRegion.regionIndex > 0) {\n                    foldingRegion = foldingModel.regions.toRegion(foldingRegion.regionIndex - 1);\n                }\n                else {\n                    foldingRegion = null;\n                }\n            }\n        }\n    }\n    return null;\n}\n/**\n * Get line to go to next fold at the same level of current line\n * @param lineNumber the current line number\n * @param foldingModel the folding model\n *\n * @return Next fold start line\n */\nfunction getNextFoldLine(lineNumber, foldingModel) {\n    let foldingRegion = foldingModel.getRegionAtLine(lineNumber);\n    // If on the folding range start line, go to next sibling.\n    if (foldingRegion !== null && foldingRegion.startLineNumber === lineNumber) {\n        // Find max line number to stay within parent.\n        const expectedParentIndex = foldingRegion.parentIndex;\n        let maxLineNumber = 0;\n        if (expectedParentIndex !== -1) {\n            maxLineNumber = foldingModel.regions.getEndLineNumber(foldingRegion.parentIndex);\n        }\n        else if (foldingModel.regions.length === 0) {\n            return null;\n        }\n        else {\n            maxLineNumber = foldingModel.regions.getEndLineNumber(foldingModel.regions.length - 1);\n        }\n        // Find fold at same level.\n        while (foldingRegion !== null) {\n            if (foldingRegion.regionIndex < foldingModel.regions.length) {\n                foldingRegion = foldingModel.regions.toRegion(foldingRegion.regionIndex + 1);\n                // Keep at same level.\n                if (foldingRegion.startLineNumber >= maxLineNumber) {\n                    return null;\n                }\n                else if (foldingRegion.parentIndex === expectedParentIndex) {\n                    return foldingRegion.startLineNumber;\n                }\n            }\n            else {\n                return null;\n            }\n        }\n    }\n    else {\n        // Go to first fold that's after the current line.\n        if (foldingModel.regions.length > 0) {\n            foldingRegion = foldingModel.regions.toRegion(0);\n            while (foldingRegion !== null) {\n                // Found fold after current line.\n                if (foldingRegion.startLineNumber > lineNumber) {\n                    return foldingRegion.startLineNumber;\n                }\n                if (foldingRegion.regionIndex < foldingModel.regions.length) {\n                    foldingRegion = foldingModel.regions.toRegion(foldingRegion.regionIndex + 1);\n                }\n                else {\n                    foldingRegion = null;\n                }\n            }\n        }\n    }\n    return null;\n}\n\nexport { FoldingModel, getNextFoldLine, getParentFoldLine, getPreviousFoldLine, setCollapseStateAtLevel, setCollapseStateForMatchingLines, setCollapseStateForRest, setCollapseStateForType, setCollapseStateLevelsDown, setCollapseStateLevelsUp, setCollapseStateUp, toggleCollapseState };\n","import { findFirstIdxMonotonousOrArrLen } from '../../../../base/common/arraysFind.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { Range } from '../../../common/core/range.js';\nimport { countEOL } from '../../../common/core/misc/eolCounter.js';\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 *--------------------------------------------------------------------------------------------*/\nclass HiddenRangeModel {\n    get onDidChange() { return this._updateEventEmitter.event; }\n    get hiddenRanges() { return this._hiddenRanges; }\n    constructor(model) {\n        this._updateEventEmitter = new Emitter();\n        this._hasLineChanges = false;\n        this._foldingModel = model;\n        this._foldingModelListener = model.onDidChange(_ => this.updateHiddenRanges());\n        this._hiddenRanges = [];\n        if (model.regions.length) {\n            this.updateHiddenRanges();\n        }\n    }\n    notifyChangeModelContent(e) {\n        if (this._hiddenRanges.length && !this._hasLineChanges) {\n            this._hasLineChanges = e.changes.some(change => {\n                return change.range.endLineNumber !== change.range.startLineNumber || countEOL(change.text)[0] !== 0;\n            });\n        }\n    }\n    updateHiddenRanges() {\n        let updateHiddenAreas = false;\n        const newHiddenAreas = [];\n        let i = 0; // index into hidden\n        let k = 0;\n        let lastCollapsedStart = Number.MAX_VALUE;\n        let lastCollapsedEnd = -1;\n        const ranges = this._foldingModel.regions;\n        for (; i < ranges.length; i++) {\n            if (!ranges.isCollapsed(i)) {\n                continue;\n            }\n            const startLineNumber = ranges.getStartLineNumber(i) + 1; // the first line is not hidden\n            const endLineNumber = ranges.getEndLineNumber(i);\n            if (lastCollapsedStart <= startLineNumber && endLineNumber <= lastCollapsedEnd) {\n                // ignore ranges contained in collapsed regions\n                continue;\n            }\n            if (!updateHiddenAreas && k < this._hiddenRanges.length && this._hiddenRanges[k].startLineNumber === startLineNumber && this._hiddenRanges[k].endLineNumber === endLineNumber) {\n                // reuse the old ranges\n                newHiddenAreas.push(this._hiddenRanges[k]);\n                k++;\n            }\n            else {\n                updateHiddenAreas = true;\n                newHiddenAreas.push(new Range(startLineNumber, 1, endLineNumber, 1));\n            }\n            lastCollapsedStart = startLineNumber;\n            lastCollapsedEnd = endLineNumber;\n        }\n        if (this._hasLineChanges || updateHiddenAreas || k < this._hiddenRanges.length) {\n            this.applyHiddenRanges(newHiddenAreas);\n        }\n    }\n    applyHiddenRanges(newHiddenAreas) {\n        this._hiddenRanges = newHiddenAreas;\n        this._hasLineChanges = false;\n        this._updateEventEmitter.fire(newHiddenAreas);\n    }\n    hasRanges() {\n        return this._hiddenRanges.length > 0;\n    }\n    isHidden(line) {\n        return findRange(this._hiddenRanges, line) !== null;\n    }\n    adjustSelections(selections) {\n        let hasChanges = false;\n        const editorModel = this._foldingModel.textModel;\n        let lastRange = null;\n        const adjustLine = (line) => {\n            if (!lastRange || !isInside(line, lastRange)) {\n                lastRange = findRange(this._hiddenRanges, line);\n            }\n            if (lastRange) {\n                return lastRange.startLineNumber - 1;\n            }\n            return null;\n        };\n        for (let i = 0, len = selections.length; i < len; i++) {\n            let selection = selections[i];\n            const adjustedStartLine = adjustLine(selection.startLineNumber);\n            if (adjustedStartLine) {\n                selection = selection.setStartPosition(adjustedStartLine, editorModel.getLineMaxColumn(adjustedStartLine));\n                hasChanges = true;\n            }\n            const adjustedEndLine = adjustLine(selection.endLineNumber);\n            if (adjustedEndLine) {\n                selection = selection.setEndPosition(adjustedEndLine, editorModel.getLineMaxColumn(adjustedEndLine));\n                hasChanges = true;\n            }\n            selections[i] = selection;\n        }\n        return hasChanges;\n    }\n    dispose() {\n        if (this.hiddenRanges.length > 0) {\n            this._hiddenRanges = [];\n            this._updateEventEmitter.fire(this._hiddenRanges);\n        }\n        if (this._foldingModelListener) {\n            this._foldingModelListener.dispose();\n            this._foldingModelListener = null;\n        }\n    }\n}\nfunction isInside(line, range) {\n    return line >= range.startLineNumber && line <= range.endLineNumber;\n}\nfunction findRange(ranges, line) {\n    const i = findFirstIdxMonotonousOrArrLen(ranges, r => line < r.startLineNumber) - 1;\n    if (i >= 0 && ranges[i].endLineNumber >= line) {\n        return ranges[i];\n    }\n    return null;\n}\n\nexport { HiddenRangeModel };\n","import { computeIndentLevel } from '../../../common/model/utils.js';\nimport { MAX_LINE_NUMBER, FoldingRegions } from './foldingRanges.js';\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 *--------------------------------------------------------------------------------------------*/\nconst MAX_FOLDING_REGIONS_FOR_INDENT_DEFAULT = 5000;\nconst ID_INDENT_PROVIDER = 'indent';\nclass IndentRangeProvider {\n    constructor(editorModel, languageConfigurationService, foldingRangesLimit) {\n        this.editorModel = editorModel;\n        this.languageConfigurationService = languageConfigurationService;\n        this.foldingRangesLimit = foldingRangesLimit;\n        this.id = ID_INDENT_PROVIDER;\n    }\n    dispose() { }\n    compute(cancelationToken) {\n        const foldingRules = this.languageConfigurationService.getLanguageConfiguration(this.editorModel.getLanguageId()).foldingRules;\n        const offSide = foldingRules && !!foldingRules.offSide;\n        const markers = foldingRules && foldingRules.markers;\n        return Promise.resolve(computeRanges(this.editorModel, offSide, markers, this.foldingRangesLimit));\n    }\n}\n// public only for testing\nclass RangesCollector {\n    constructor(foldingRangesLimit) {\n        this._startIndexes = [];\n        this._endIndexes = [];\n        this._indentOccurrences = [];\n        this._length = 0;\n        this._foldingRangesLimit = foldingRangesLimit;\n    }\n    insertFirst(startLineNumber, endLineNumber, indent) {\n        if (startLineNumber > MAX_LINE_NUMBER || endLineNumber > MAX_LINE_NUMBER) {\n            return;\n        }\n        const index = this._length;\n        this._startIndexes[index] = startLineNumber;\n        this._endIndexes[index] = endLineNumber;\n        this._length++;\n        if (indent < 1000) {\n            this._indentOccurrences[indent] = (this._indentOccurrences[indent] || 0) + 1;\n        }\n    }\n    toIndentRanges(model) {\n        const limit = this._foldingRangesLimit.limit;\n        if (this._length <= limit) {\n            this._foldingRangesLimit.update(this._length, false);\n            // reverse and create arrays of the exact length\n            const startIndexes = new Uint32Array(this._length);\n            const endIndexes = new Uint32Array(this._length);\n            for (let i = this._length - 1, k = 0; i >= 0; i--, k++) {\n                startIndexes[k] = this._startIndexes[i];\n                endIndexes[k] = this._endIndexes[i];\n            }\n            return new FoldingRegions(startIndexes, endIndexes);\n        }\n        else {\n            this._foldingRangesLimit.update(this._length, limit);\n            let entries = 0;\n            let maxIndent = this._indentOccurrences.length;\n            for (let i = 0; i < this._indentOccurrences.length; i++) {\n                const n = this._indentOccurrences[i];\n                if (n) {\n                    if (n + entries > limit) {\n                        maxIndent = i;\n                        break;\n                    }\n                    entries += n;\n                }\n            }\n            const tabSize = model.getOptions().tabSize;\n            // reverse and create arrays of the exact length\n            const startIndexes = new Uint32Array(limit);\n            const endIndexes = new Uint32Array(limit);\n            for (let i = this._length - 1, k = 0; i >= 0; i--) {\n                const startIndex = this._startIndexes[i];\n                const lineContent = model.getLineContent(startIndex);\n                const indent = computeIndentLevel(lineContent, tabSize);\n                if (indent < maxIndent || (indent === maxIndent && entries++ < limit)) {\n                    startIndexes[k] = startIndex;\n                    endIndexes[k] = this._endIndexes[i];\n                    k++;\n                }\n            }\n            return new FoldingRegions(startIndexes, endIndexes);\n        }\n    }\n}\nconst foldingRangesLimitDefault = {\n    limit: MAX_FOLDING_REGIONS_FOR_INDENT_DEFAULT,\n    update: () => { }\n};\nfunction computeRanges(model, offSide, markers, foldingRangesLimit = foldingRangesLimitDefault) {\n    const tabSize = model.getOptions().tabSize;\n    const result = new RangesCollector(foldingRangesLimit);\n    let pattern = undefined;\n    if (markers) {\n        pattern = new RegExp(`(${markers.start.source})|(?:${markers.end.source})`);\n    }\n    const previousRegions = [];\n    const line = model.getLineCount() + 1;\n    previousRegions.push({ indent: -1, endAbove: line, line }); // sentinel, to make sure there's at least one entry\n    for (let line = model.getLineCount(); line > 0; line--) {\n        const lineContent = model.getLineContent(line);\n        const indent = computeIndentLevel(lineContent, tabSize);\n        let previous = previousRegions[previousRegions.length - 1];\n        if (indent === -1) {\n            if (offSide) {\n                // for offSide languages, empty lines are associated to the previous block\n                // note: the next block is already written to the results, so this only\n                // impacts the end position of the block before\n                previous.endAbove = line;\n            }\n            continue; // only whitespace\n        }\n        let m;\n        if (pattern && (m = lineContent.match(pattern))) {\n            // folding pattern match\n            if (m[1]) { // start pattern match\n                // discard all regions until the folding pattern\n                let i = previousRegions.length - 1;\n                while (i > 0 && previousRegions[i].indent !== -2) {\n                    i--;\n                }\n                if (i > 0) {\n                    previousRegions.length = i + 1;\n                    previous = previousRegions[i];\n                    // new folding range from pattern, includes the end line\n                    result.insertFirst(line, previous.line, indent);\n                    previous.line = line;\n                    previous.indent = indent;\n                    previous.endAbove = line;\n                    continue;\n                }\n            }\n            else { // end pattern match\n                previousRegions.push({ indent: -2, endAbove: line, line });\n                continue;\n            }\n        }\n        if (previous.indent > indent) {\n            // discard all regions with larger indent\n            do {\n                previousRegions.pop();\n                previous = previousRegions[previousRegions.length - 1];\n            } while (previous.indent > indent);\n            // new folding range\n            const endLineNumber = previous.endAbove - 1;\n            if (endLineNumber - line >= 1) { // needs at east size 1\n                result.insertFirst(line, endLineNumber, indent);\n            }\n        }\n        if (previous.indent === indent) {\n            previous.endAbove = line;\n        }\n        else { // previous.indent < indent\n            // new region with a bigger indent\n            previousRegions.push({ indent, endAbove: line, line });\n        }\n    }\n    return result.toIndentRanges(model);\n}\n\nexport { IndentRangeProvider, RangesCollector, computeRanges };\n","import { Codicon } from '../../../../base/common/codicons.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { localize } from '../../../../nls.js';\nimport { registerColor, transparent } from '../../../../platform/theme/common/colorUtils.js';\nimport { iconForeground } from '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorSelectionBackground } from '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { registerIcon } from '../../../../platform/theme/common/iconRegistry.js';\nimport { themeColorFromId } from '../../../../platform/theme/common/themeService.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\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 *--------------------------------------------------------------------------------------------*/\nconst foldBackground = registerColor('editor.foldBackground', { light: transparent(editorSelectionBackground, 0.3), dark: transparent(editorSelectionBackground, 0.3), hcDark: null, hcLight: null }, localize(1002, \"Background color behind folded ranges. The color must not be opaque so as not to hide underlying decorations.\"), true);\nregisterColor('editor.foldPlaceholderForeground', { light: '#808080', dark: '#808080', hcDark: null, hcLight: null }, localize(1003, \"Color of the collapsed text after the first line of a folded range.\"));\nregisterColor('editorGutter.foldingControlForeground', iconForeground, localize(1004, 'Color of the folding control in the editor gutter.'));\nconst foldingExpandedIcon = registerIcon('folding-expanded', Codicon.chevronDown, localize(1005, 'Icon for expanded ranges in the editor glyph margin.'));\nconst foldingCollapsedIcon = registerIcon('folding-collapsed', Codicon.chevronRight, localize(1006, 'Icon for collapsed ranges in the editor glyph margin.'));\nconst foldingManualCollapsedIcon = registerIcon('folding-manual-collapsed', foldingCollapsedIcon, localize(1007, 'Icon for manually collapsed ranges in the editor glyph margin.'));\nconst foldingManualExpandedIcon = registerIcon('folding-manual-expanded', foldingExpandedIcon, localize(1008, 'Icon for manually expanded ranges in the editor glyph margin.'));\nconst foldedBackgroundMinimap = { color: themeColorFromId(foldBackground), position: 1 /* MinimapPosition.Inline */ };\nconst collapsed = localize(1009, \"Click to expand the range.\");\nconst expanded = localize(1010, \"Click to collapse the range.\");\nclass FoldingDecorationProvider {\n    static { this.COLLAPSED_VISUAL_DECORATION = ModelDecorationOptions.register({\n        description: 'folding-collapsed-visual-decoration',\n        stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,\n        afterContentClassName: 'inline-folded',\n        isWholeLine: true,\n        linesDecorationsTooltip: collapsed,\n        firstLineDecorationClassName: ThemeIcon.asClassName(foldingCollapsedIcon),\n    }); }\n    static { this.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION = ModelDecorationOptions.register({\n        description: 'folding-collapsed-highlighted-visual-decoration',\n        stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,\n        afterContentClassName: 'inline-folded',\n        className: 'folded-background',\n        minimap: foldedBackgroundMinimap,\n        isWholeLine: true,\n        linesDecorationsTooltip: collapsed,\n        firstLineDecorationClassName: ThemeIcon.asClassName(foldingCollapsedIcon)\n    }); }\n    static { this.MANUALLY_COLLAPSED_VISUAL_DECORATION = ModelDecorationOptions.register({\n        description: 'folding-manually-collapsed-visual-decoration',\n        stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,\n        afterContentClassName: 'inline-folded',\n        isWholeLine: true,\n        linesDecorationsTooltip: collapsed,\n        firstLineDecorationClassName: ThemeIcon.asClassName(foldingManualCollapsedIcon)\n    }); }\n    static { this.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION = ModelDecorationOptions.register({\n        description: 'folding-manually-collapsed-highlighted-visual-decoration',\n        stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,\n        afterContentClassName: 'inline-folded',\n        className: 'folded-background',\n        minimap: foldedBackgroundMinimap,\n        isWholeLine: true,\n        linesDecorationsTooltip: collapsed,\n        firstLineDecorationClassName: ThemeIcon.asClassName(foldingManualCollapsedIcon)\n    }); }\n    static { this.NO_CONTROLS_COLLAPSED_RANGE_DECORATION = ModelDecorationOptions.register({\n        description: 'folding-no-controls-range-decoration',\n        stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,\n        afterContentClassName: 'inline-folded',\n        isWholeLine: true,\n        linesDecorationsTooltip: collapsed,\n    }); }\n    static { this.NO_CONTROLS_COLLAPSED_HIGHLIGHTED_RANGE_DECORATION = ModelDecorationOptions.register({\n        description: 'folding-no-controls-range-decoration',\n        stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,\n        afterContentClassName: 'inline-folded',\n        className: 'folded-background',\n        minimap: foldedBackgroundMinimap,\n        isWholeLine: true,\n        linesDecorationsTooltip: collapsed,\n    }); }\n    static { this.EXPANDED_VISUAL_DECORATION = ModelDecorationOptions.register({\n        description: 'folding-expanded-visual-decoration',\n        stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n        isWholeLine: true,\n        firstLineDecorationClassName: 'alwaysShowFoldIcons ' + ThemeIcon.asClassName(foldingExpandedIcon),\n        linesDecorationsTooltip: expanded,\n    }); }\n    static { this.EXPANDED_AUTO_HIDE_VISUAL_DECORATION = ModelDecorationOptions.register({\n        description: 'folding-expanded-auto-hide-visual-decoration',\n        stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n        isWholeLine: true,\n        firstLineDecorationClassName: ThemeIcon.asClassName(foldingExpandedIcon),\n        linesDecorationsTooltip: expanded,\n    }); }\n    static { this.MANUALLY_EXPANDED_VISUAL_DECORATION = ModelDecorationOptions.register({\n        description: 'folding-manually-expanded-visual-decoration',\n        stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,\n        isWholeLine: true,\n        firstLineDecorationClassName: 'alwaysShowFoldIcons ' + ThemeIcon.asClassName(foldingManualExpandedIcon),\n        linesDecorationsTooltip: expanded,\n    }); }\n    static { this.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION = ModelDecorationOptions.register({\n        description: 'folding-manually-expanded-auto-hide-visual-decoration',\n        stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,\n        isWholeLine: true,\n        firstLineDecorationClassName: ThemeIcon.asClassName(foldingManualExpandedIcon),\n        linesDecorationsTooltip: expanded,\n    }); }\n    static { this.NO_CONTROLS_EXPANDED_RANGE_DECORATION = ModelDecorationOptions.register({\n        description: 'folding-no-controls-range-decoration',\n        stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,\n        isWholeLine: true\n    }); }\n    static { this.HIDDEN_RANGE_DECORATION = ModelDecorationOptions.register({\n        description: 'folding-hidden-range-decoration',\n        stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */\n    }); }\n    constructor(editor) {\n        this.editor = editor;\n        this.showFoldingControls = 'mouseover';\n        this.showFoldingHighlights = true;\n    }\n    getDecorationOption(isCollapsed, isHidden, isManual) {\n        if (isHidden) { // is inside another collapsed region\n            return FoldingDecorationProvider.HIDDEN_RANGE_DECORATION;\n        }\n        if (this.showFoldingControls === 'never') {\n            if (isCollapsed) {\n                return this.showFoldingHighlights ? FoldingDecorationProvider.NO_CONTROLS_COLLAPSED_HIGHLIGHTED_RANGE_DECORATION : FoldingDecorationProvider.NO_CONTROLS_COLLAPSED_RANGE_DECORATION;\n            }\n            return FoldingDecorationProvider.NO_CONTROLS_EXPANDED_RANGE_DECORATION;\n        }\n        if (isCollapsed) {\n            return isManual ?\n                (this.showFoldingHighlights ? FoldingDecorationProvider.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION : FoldingDecorationProvider.MANUALLY_COLLAPSED_VISUAL_DECORATION)\n                : (this.showFoldingHighlights ? FoldingDecorationProvider.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION : FoldingDecorationProvider.COLLAPSED_VISUAL_DECORATION);\n        }\n        else if (this.showFoldingControls === 'mouseover') {\n            return isManual ? FoldingDecorationProvider.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION : FoldingDecorationProvider.EXPANDED_AUTO_HIDE_VISUAL_DECORATION;\n        }\n        else {\n            return isManual ? FoldingDecorationProvider.MANUALLY_EXPANDED_VISUAL_DECORATION : FoldingDecorationProvider.EXPANDED_VISUAL_DECORATION;\n        }\n    }\n    changeDecorations(callback) {\n        return this.editor.changeDecorations(callback);\n    }\n    removeDecorations(decorationIds) {\n        this.editor.removeDecorations(decorationIds);\n    }\n}\n\nexport { FoldingDecorationProvider, foldingCollapsedIcon, foldingExpandedIcon, foldingManualCollapsedIcon, foldingManualExpandedIcon };\n","import { onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { MAX_LINE_NUMBER, FoldingRegions } from './foldingRanges.js';\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 *--------------------------------------------------------------------------------------------*/\nconst foldingContext = {};\nconst ID_SYNTAX_PROVIDER = 'syntax';\nclass SyntaxRangeProvider {\n    constructor(editorModel, providers, handleFoldingRangesChange, foldingRangesLimit, fallbackRangeProvider // used when all providers return null\n    ) {\n        this.editorModel = editorModel;\n        this.providers = providers;\n        this.handleFoldingRangesChange = handleFoldingRangesChange;\n        this.foldingRangesLimit = foldingRangesLimit;\n        this.fallbackRangeProvider = fallbackRangeProvider;\n        this.id = ID_SYNTAX_PROVIDER;\n        this.disposables = new DisposableStore();\n        if (fallbackRangeProvider) {\n            this.disposables.add(fallbackRangeProvider);\n        }\n        for (const provider of providers) {\n            if (typeof provider.onDidChange === 'function') {\n                this.disposables.add(provider.onDidChange(handleFoldingRangesChange));\n            }\n        }\n    }\n    compute(cancellationToken) {\n        return collectSyntaxRanges(this.providers, this.editorModel, cancellationToken).then(ranges => {\n            if (this.editorModel.isDisposed()) {\n                return null;\n            }\n            if (ranges) {\n                const res = sanitizeRanges(ranges, this.foldingRangesLimit);\n                return res;\n            }\n            return this.fallbackRangeProvider?.compute(cancellationToken) ?? null;\n        });\n    }\n    dispose() {\n        this.disposables.dispose();\n    }\n}\nfunction collectSyntaxRanges(providers, model, cancellationToken) {\n    let rangeData = null;\n    const promises = providers.map((provider, i) => {\n        return Promise.resolve(provider.provideFoldingRanges(model, foldingContext, cancellationToken)).then(ranges => {\n            if (cancellationToken.isCancellationRequested) {\n                return;\n            }\n            if (Array.isArray(ranges)) {\n                if (!Array.isArray(rangeData)) {\n                    rangeData = [];\n                }\n                const nLines = model.getLineCount();\n                for (const r of ranges) {\n                    if (r.start > 0 && r.end > r.start && r.end <= nLines) {\n                        rangeData.push({ start: r.start, end: r.end, rank: i, kind: r.kind });\n                    }\n                }\n            }\n        }, onUnexpectedExternalError);\n    });\n    return Promise.all(promises).then(_ => {\n        return rangeData;\n    });\n}\nclass RangesCollector {\n    constructor(foldingRangesLimit) {\n        this._startIndexes = [];\n        this._endIndexes = [];\n        this._nestingLevels = [];\n        this._nestingLevelCounts = [];\n        this._types = [];\n        this._length = 0;\n        this._foldingRangesLimit = foldingRangesLimit;\n    }\n    add(startLineNumber, endLineNumber, type, nestingLevel) {\n        if (startLineNumber > MAX_LINE_NUMBER || endLineNumber > MAX_LINE_NUMBER) {\n            return;\n        }\n        const index = this._length;\n        this._startIndexes[index] = startLineNumber;\n        this._endIndexes[index] = endLineNumber;\n        this._nestingLevels[index] = nestingLevel;\n        this._types[index] = type;\n        this._length++;\n        if (nestingLevel < 30) {\n            this._nestingLevelCounts[nestingLevel] = (this._nestingLevelCounts[nestingLevel] || 0) + 1;\n        }\n    }\n    toIndentRanges() {\n        const limit = this._foldingRangesLimit.limit;\n        if (this._length <= limit) {\n            this._foldingRangesLimit.update(this._length, false);\n            const startIndexes = new Uint32Array(this._length);\n            const endIndexes = new Uint32Array(this._length);\n            for (let i = 0; i < this._length; i++) {\n                startIndexes[i] = this._startIndexes[i];\n                endIndexes[i] = this._endIndexes[i];\n            }\n            return new FoldingRegions(startIndexes, endIndexes, this._types);\n        }\n        else {\n            this._foldingRangesLimit.update(this._length, limit);\n            let entries = 0;\n            let maxLevel = this._nestingLevelCounts.length;\n            for (let i = 0; i < this._nestingLevelCounts.length; i++) {\n                const n = this._nestingLevelCounts[i];\n                if (n) {\n                    if (n + entries > limit) {\n                        maxLevel = i;\n                        break;\n                    }\n                    entries += n;\n                }\n            }\n            const startIndexes = new Uint32Array(limit);\n            const endIndexes = new Uint32Array(limit);\n            const types = [];\n            for (let i = 0, k = 0; i < this._length; i++) {\n                const level = this._nestingLevels[i];\n                if (level < maxLevel || (level === maxLevel && entries++ < limit)) {\n                    startIndexes[k] = this._startIndexes[i];\n                    endIndexes[k] = this._endIndexes[i];\n                    types[k] = this._types[i];\n                    k++;\n                }\n            }\n            return new FoldingRegions(startIndexes, endIndexes, types);\n        }\n    }\n}\nfunction sanitizeRanges(rangeData, foldingRangesLimit) {\n    const sorted = rangeData.sort((d1, d2) => {\n        let diff = d1.start - d2.start;\n        if (diff === 0) {\n            diff = d1.rank - d2.rank;\n        }\n        return diff;\n    });\n    const collector = new RangesCollector(foldingRangesLimit);\n    let top = undefined;\n    const previous = [];\n    for (const entry of sorted) {\n        if (!top) {\n            top = entry;\n            collector.add(entry.start, entry.end, entry.kind && entry.kind.value, previous.length);\n        }\n        else {\n            if (entry.start > top.start) {\n                if (entry.end <= top.end) {\n                    previous.push(top);\n                    top = entry;\n                    collector.add(entry.start, entry.end, entry.kind && entry.kind.value, previous.length);\n                }\n                else {\n                    if (entry.start > top.end) {\n                        do {\n                            top = previous.pop();\n                        } while (top && entry.start > top.end);\n                        if (top) {\n                            previous.push(top);\n                        }\n                        top = entry;\n                    }\n                    collector.add(entry.start, entry.end, entry.kind && entry.kind.value, previous.length);\n                }\n            }\n        }\n    }\n    return collector.toIndentRanges();\n}\n\nexport { SyntaxRangeProvider, sanitizeRanges };\n","import { Delayer, RunOnceScheduler, createCancelablePromise } from '../../../../base/common/async.js';\nimport { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedError, illegalArgument } from '../../../../base/common/errors.js';\nimport { KeyChord } from '../../../../base/common/keyCodes.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { escapeRegExpCharacters } from '../../../../base/common/strings.js';\nimport { isUndefined, isObject, isNumber, isString } from '../../../../base/common/types.js';\nimport './folding.css';\nimport { StableEditorScrollState } from '../../../browser/stableEditorScroll.js';\nimport { registerEditorContribution, registerEditorAction, registerInstantiatedEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { FoldingRangeKind } from '../../../common/languages.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { FoldingModel, setCollapseStateAtLevel, setCollapseStateLevelsUp, setCollapseStateLevelsDown, setCollapseStateUp, toggleCollapseState, setCollapseStateForType, setCollapseStateForMatchingLines, setCollapseStateForRest, getParentFoldLine, getPreviousFoldLine, getNextFoldLine } from './foldingModel.js';\nimport { HiddenRangeModel } from './hiddenRangeModel.js';\nimport { IndentRangeProvider } from './indentRangeProvider.js';\nimport { localize2 } from '../../../../nls.js';\nimport { RawContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { FoldingDecorationProvider } from './foldingDecorations.js';\nimport { FoldingRegions } from './foldingRanges.js';\nimport { SyntaxRangeProvider } from './syntaxRangeProvider.js';\nimport { INotificationService } from '../../../../platform/notification/common/notification.js';\nimport { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport { StopWatch } from '../../../../base/common/stopwatch.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { CommandsRegistry } from '../../../../platform/commands/common/commands.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { IModelService } from '../../../common/services/model.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar FoldingController_1;\nconst CONTEXT_FOLDING_ENABLED = new RawContextKey('foldingEnabled', false);\nlet FoldingController = class FoldingController extends Disposable {\n    static { FoldingController_1 = this; }\n    static { this.ID = 'editor.contrib.folding'; }\n    static get(editor) {\n        return editor.getContribution(FoldingController_1.ID);\n    }\n    static getFoldingRangeProviders(languageFeaturesService, model) {\n        const foldingRangeProviders = languageFeaturesService.foldingRangeProvider.ordered(model);\n        return (FoldingController_1._foldingRangeSelector?.(foldingRangeProviders, model)) ?? foldingRangeProviders;\n    }\n    constructor(editor, contextKeyService, languageConfigurationService, notificationService, languageFeatureDebounceService, languageFeaturesService) {\n        super();\n        this.contextKeyService = contextKeyService;\n        this.languageConfigurationService = languageConfigurationService;\n        this.languageFeaturesService = languageFeaturesService;\n        this.localToDispose = this._register(new DisposableStore());\n        this.editor = editor;\n        this._foldingLimitReporter = this._register(new RangesLimitReporter(editor));\n        const options = this.editor.getOptions();\n        this._isEnabled = options.get(52 /* EditorOption.folding */);\n        this._useFoldingProviders = options.get(53 /* EditorOption.foldingStrategy */) !== 'indentation';\n        this._unfoldOnClickAfterEndOfLine = options.get(57 /* EditorOption.unfoldOnClickAfterEndOfLine */);\n        this._restoringViewState = false;\n        this._currentModelHasFoldedImports = false;\n        this._foldingImportsByDefault = options.get(55 /* EditorOption.foldingImportsByDefault */);\n        this.updateDebounceInfo = languageFeatureDebounceService.for(languageFeaturesService.foldingRangeProvider, 'Folding', { min: 200 });\n        this.foldingModel = null;\n        this.hiddenRangeModel = null;\n        this.rangeProvider = null;\n        this.foldingRegionPromise = null;\n        this.foldingModelPromise = null;\n        this.updateScheduler = null;\n        this.cursorChangedScheduler = null;\n        this.mouseDownInfo = null;\n        this.foldingDecorationProvider = new FoldingDecorationProvider(editor);\n        this.foldingDecorationProvider.showFoldingControls = options.get(126 /* EditorOption.showFoldingControls */);\n        this.foldingDecorationProvider.showFoldingHighlights = options.get(54 /* EditorOption.foldingHighlight */);\n        this.foldingEnabled = CONTEXT_FOLDING_ENABLED.bindTo(this.contextKeyService);\n        this.foldingEnabled.set(this._isEnabled);\n        this._register(this.editor.onDidChangeModel(() => this.onModelChanged()));\n        this._register(this.editor.onDidChangeConfiguration((e) => {\n            if (e.hasChanged(52 /* EditorOption.folding */)) {\n                this._isEnabled = this.editor.getOptions().get(52 /* EditorOption.folding */);\n                this.foldingEnabled.set(this._isEnabled);\n                this.onModelChanged();\n            }\n            if (e.hasChanged(56 /* EditorOption.foldingMaximumRegions */)) {\n                this.onModelChanged();\n            }\n            if (e.hasChanged(126 /* EditorOption.showFoldingControls */) || e.hasChanged(54 /* EditorOption.foldingHighlight */)) {\n                const options = this.editor.getOptions();\n                this.foldingDecorationProvider.showFoldingControls = options.get(126 /* EditorOption.showFoldingControls */);\n                this.foldingDecorationProvider.showFoldingHighlights = options.get(54 /* EditorOption.foldingHighlight */);\n                this.triggerFoldingModelChanged();\n            }\n            if (e.hasChanged(53 /* EditorOption.foldingStrategy */)) {\n                this._useFoldingProviders = this.editor.getOptions().get(53 /* EditorOption.foldingStrategy */) !== 'indentation';\n                this.onFoldingStrategyChanged();\n            }\n            if (e.hasChanged(57 /* EditorOption.unfoldOnClickAfterEndOfLine */)) {\n                this._unfoldOnClickAfterEndOfLine = this.editor.getOptions().get(57 /* EditorOption.unfoldOnClickAfterEndOfLine */);\n            }\n            if (e.hasChanged(55 /* EditorOption.foldingImportsByDefault */)) {\n                this._foldingImportsByDefault = this.editor.getOptions().get(55 /* EditorOption.foldingImportsByDefault */);\n            }\n        }));\n        this.onModelChanged();\n    }\n    /**\n     * Store view state.\n     */\n    saveViewState() {\n        const model = this.editor.getModel();\n        if (!model || !this._isEnabled || model.isTooLargeForTokenization()) {\n            return {};\n        }\n        if (this.foldingModel) { // disposed ?\n            const collapsedRegions = this.foldingModel.getMemento();\n            const provider = this.rangeProvider ? this.rangeProvider.id : undefined;\n            return { collapsedRegions, lineCount: model.getLineCount(), provider, foldedImports: this._currentModelHasFoldedImports };\n        }\n        return undefined;\n    }\n    /**\n     * Restore view state.\n     */\n    restoreViewState(state) {\n        const model = this.editor.getModel();\n        if (!model || !this._isEnabled || model.isTooLargeForTokenization() || !this.hiddenRangeModel) {\n            return;\n        }\n        if (!state) {\n            return;\n        }\n        this._currentModelHasFoldedImports = !!state.foldedImports;\n        if (state.collapsedRegions && state.collapsedRegions.length > 0 && this.foldingModel) {\n            this._restoringViewState = true;\n            try {\n                this.foldingModel.applyMemento(state.collapsedRegions);\n            }\n            finally {\n                this._restoringViewState = false;\n            }\n        }\n    }\n    onModelChanged() {\n        this.localToDispose.clear();\n        const model = this.editor.getModel();\n        if (!this._isEnabled || !model || model.isTooLargeForTokenization()) {\n            // huge files get no view model, so they cannot support hidden areas\n            return;\n        }\n        this._currentModelHasFoldedImports = false;\n        this.foldingModel = new FoldingModel(model, this.foldingDecorationProvider);\n        this.localToDispose.add(this.foldingModel);\n        this.hiddenRangeModel = new HiddenRangeModel(this.foldingModel);\n        this.localToDispose.add(this.hiddenRangeModel);\n        this.localToDispose.add(this.hiddenRangeModel.onDidChange(hr => this.onHiddenRangesChanges(hr)));\n        this.updateScheduler = new Delayer(this.updateDebounceInfo.get(model));\n        this.localToDispose.add(this.updateScheduler);\n        this.cursorChangedScheduler = new RunOnceScheduler(() => this.revealCursor(), 200);\n        this.localToDispose.add(this.cursorChangedScheduler);\n        this.localToDispose.add(this.languageFeaturesService.foldingRangeProvider.onDidChange(() => this.onFoldingStrategyChanged()));\n        this.localToDispose.add(this.editor.onDidChangeModelLanguageConfiguration(() => this.onFoldingStrategyChanged())); // covers model language changes as well\n        this.localToDispose.add(this.editor.onDidChangeModelContent(e => this.onDidChangeModelContent(e)));\n        this.localToDispose.add(this.editor.onDidChangeCursorPosition(() => this.onCursorPositionChanged()));\n        this.localToDispose.add(this.editor.onMouseDown(e => this.onEditorMouseDown(e)));\n        this.localToDispose.add(this.editor.onMouseUp(e => this.onEditorMouseUp(e)));\n        this.localToDispose.add({\n            dispose: () => {\n                if (this.foldingRegionPromise) {\n                    this.foldingRegionPromise.cancel();\n                    this.foldingRegionPromise = null;\n                }\n                this.updateScheduler?.cancel();\n                this.updateScheduler = null;\n                this.foldingModel = null;\n                this.foldingModelPromise = null;\n                this.hiddenRangeModel = null;\n                this.cursorChangedScheduler = null;\n                this.rangeProvider?.dispose();\n                this.rangeProvider = null;\n            }\n        });\n        this.triggerFoldingModelChanged();\n    }\n    onFoldingStrategyChanged() {\n        this.rangeProvider?.dispose();\n        this.rangeProvider = null;\n        this.triggerFoldingModelChanged();\n    }\n    getRangeProvider(editorModel) {\n        if (this.rangeProvider) {\n            return this.rangeProvider;\n        }\n        const indentRangeProvider = new IndentRangeProvider(editorModel, this.languageConfigurationService, this._foldingLimitReporter);\n        this.rangeProvider = indentRangeProvider; // fallback\n        if (this._useFoldingProviders && this.foldingModel) {\n            const selectedProviders = FoldingController_1.getFoldingRangeProviders(this.languageFeaturesService, editorModel);\n            if (selectedProviders.length > 0) {\n                this.rangeProvider = new SyntaxRangeProvider(editorModel, selectedProviders, () => this.triggerFoldingModelChanged(), this._foldingLimitReporter, indentRangeProvider);\n            }\n        }\n        return this.rangeProvider;\n    }\n    getFoldingModel() {\n        return this.foldingModelPromise;\n    }\n    onDidChangeModelContent(e) {\n        this.hiddenRangeModel?.notifyChangeModelContent(e);\n        this.triggerFoldingModelChanged();\n    }\n    triggerFoldingModelChanged() {\n        if (this.updateScheduler) {\n            if (this.foldingRegionPromise) {\n                this.foldingRegionPromise.cancel();\n                this.foldingRegionPromise = null;\n            }\n            this.foldingModelPromise = this.updateScheduler.trigger(() => {\n                const foldingModel = this.foldingModel;\n                if (!foldingModel) { // null if editor has been disposed, or folding turned off\n                    return null;\n                }\n                const sw = new StopWatch();\n                const provider = this.getRangeProvider(foldingModel.textModel);\n                const foldingRegionPromise = this.foldingRegionPromise = createCancelablePromise(token => provider.compute(token));\n                return foldingRegionPromise.then(foldingRanges => {\n                    if (foldingRanges && foldingRegionPromise === this.foldingRegionPromise) { // new request or cancelled in the meantime?\n                        let scrollState;\n                        if (this._foldingImportsByDefault && !this._currentModelHasFoldedImports) {\n                            const hasChanges = foldingRanges.setCollapsedAllOfType(FoldingRangeKind.Imports.value, true);\n                            if (hasChanges) {\n                                scrollState = StableEditorScrollState.capture(this.editor);\n                                this._currentModelHasFoldedImports = hasChanges;\n                            }\n                        }\n                        // some cursors might have moved into hidden regions, make sure they are in expanded regions\n                        const selections = this.editor.getSelections();\n                        foldingModel.update(foldingRanges, toSelectedLines(selections));\n                        scrollState?.restore(this.editor);\n                        // update debounce info\n                        const newValue = this.updateDebounceInfo.update(foldingModel.textModel, sw.elapsed());\n                        if (this.updateScheduler) {\n                            this.updateScheduler.defaultDelay = newValue;\n                        }\n                    }\n                    return foldingModel;\n                });\n            }).then(undefined, (err) => {\n                onUnexpectedError(err);\n                return null;\n            });\n        }\n    }\n    onHiddenRangesChanges(hiddenRanges) {\n        if (this.hiddenRangeModel && hiddenRanges.length && !this._restoringViewState) {\n            const selections = this.editor.getSelections();\n            if (selections) {\n                if (this.hiddenRangeModel.adjustSelections(selections)) {\n                    this.editor.setSelections(selections);\n                }\n            }\n        }\n        this.editor.setHiddenAreas(hiddenRanges, this);\n    }\n    onCursorPositionChanged() {\n        if (this.hiddenRangeModel && this.hiddenRangeModel.hasRanges()) {\n            this.cursorChangedScheduler.schedule();\n        }\n    }\n    revealCursor() {\n        const foldingModel = this.getFoldingModel();\n        if (!foldingModel) {\n            return;\n        }\n        foldingModel.then(foldingModel => {\n            if (foldingModel) {\n                const selections = this.editor.getSelections();\n                if (selections && selections.length > 0) {\n                    const toToggle = [];\n                    for (const selection of selections) {\n                        const lineNumber = selection.selectionStartLineNumber;\n                        if (this.hiddenRangeModel && this.hiddenRangeModel.isHidden(lineNumber)) {\n                            toToggle.push(...foldingModel.getAllRegionsAtLine(lineNumber, r => r.isCollapsed && lineNumber > r.startLineNumber));\n                        }\n                    }\n                    if (toToggle.length) {\n                        foldingModel.toggleCollapseState(toToggle);\n                        this.reveal(selections[0].getPosition());\n                    }\n                }\n            }\n        }).then(undefined, onUnexpectedError);\n    }\n    onEditorMouseDown(e) {\n        this.mouseDownInfo = null;\n        if (!this.hiddenRangeModel || !e.target || !e.target.range) {\n            return;\n        }\n        if (!e.event.leftButton && !e.event.middleButton) {\n            return;\n        }\n        const range = e.target.range;\n        let iconClicked = false;\n        switch (e.target.type) {\n            case 4 /* MouseTargetType.GUTTER_LINE_DECORATIONS */: {\n                const data = e.target.detail;\n                const offsetLeftInGutter = e.target.element.offsetLeft;\n                const gutterOffsetX = data.offsetX - offsetLeftInGutter;\n                // const gutterOffsetX = data.offsetX - data.glyphMarginWidth - data.lineNumbersWidth - data.glyphMarginLeft;\n                // TODO@joao TODO@alex TODO@martin this is such that we don't collide with dirty diff\n                if (gutterOffsetX < 4) { // the whitespace between the border and the real folding icon border is 4px\n                    return;\n                }\n                iconClicked = true;\n                break;\n            }\n            case 7 /* MouseTargetType.CONTENT_EMPTY */: {\n                if (this._unfoldOnClickAfterEndOfLine && this.hiddenRangeModel.hasRanges()) {\n                    const data = e.target.detail;\n                    if (!data.isAfterLines) {\n                        break;\n                    }\n                }\n                return;\n            }\n            case 6 /* MouseTargetType.CONTENT_TEXT */: {\n                if (this.hiddenRangeModel.hasRanges()) {\n                    const model = this.editor.getModel();\n                    if (model && range.startColumn === model.getLineMaxColumn(range.startLineNumber)) {\n                        break;\n                    }\n                }\n                return;\n            }\n            default:\n                return;\n        }\n        this.mouseDownInfo = { lineNumber: range.startLineNumber, iconClicked };\n    }\n    onEditorMouseUp(e) {\n        const foldingModel = this.foldingModel;\n        if (!foldingModel || !this.mouseDownInfo || !e.target) {\n            return;\n        }\n        const lineNumber = this.mouseDownInfo.lineNumber;\n        const iconClicked = this.mouseDownInfo.iconClicked;\n        const range = e.target.range;\n        if (!range || range.startLineNumber !== lineNumber) {\n            return;\n        }\n        if (iconClicked) {\n            if (e.target.type !== 4 /* MouseTargetType.GUTTER_LINE_DECORATIONS */) {\n                return;\n            }\n        }\n        else {\n            const model = this.editor.getModel();\n            if (!model || range.startColumn !== model.getLineMaxColumn(lineNumber)) {\n                return;\n            }\n        }\n        const region = foldingModel.getRegionAtLine(lineNumber);\n        if (region && region.startLineNumber === lineNumber) {\n            const isCollapsed = region.isCollapsed;\n            if (iconClicked || isCollapsed) {\n                const surrounding = e.event.altKey;\n                let toToggle = [];\n                if (surrounding) {\n                    const filter = (otherRegion) => !otherRegion.containedBy(region) && !region.containedBy(otherRegion);\n                    const toMaybeToggle = foldingModel.getRegionsInside(null, filter);\n                    for (const r of toMaybeToggle) {\n                        if (r.isCollapsed) {\n                            toToggle.push(r);\n                        }\n                    }\n                    // if any surrounding regions are folded, unfold those. Otherwise, fold all surrounding\n                    if (toToggle.length === 0) {\n                        toToggle = toMaybeToggle;\n                    }\n                }\n                else {\n                    const recursive = e.event.middleButton || e.event.shiftKey;\n                    if (recursive) {\n                        for (const r of foldingModel.getRegionsInside(region)) {\n                            if (r.isCollapsed === isCollapsed) {\n                                toToggle.push(r);\n                            }\n                        }\n                    }\n                    // when recursive, first only collapse all children. If all are already folded or there are no children, also fold parent.\n                    if (isCollapsed || !recursive || toToggle.length === 0) {\n                        toToggle.push(region);\n                    }\n                }\n                foldingModel.toggleCollapseState(toToggle);\n                this.reveal({ lineNumber, column: 1 });\n            }\n        }\n    }\n    reveal(position) {\n        this.editor.revealPositionInCenterIfOutsideViewport(position, 0 /* ScrollType.Smooth */);\n    }\n};\nFoldingController = FoldingController_1 = __decorate([\n    __param(1, IContextKeyService),\n    __param(2, ILanguageConfigurationService),\n    __param(3, INotificationService),\n    __param(4, ILanguageFeatureDebounceService),\n    __param(5, ILanguageFeaturesService)\n], FoldingController);\nclass RangesLimitReporter extends Disposable {\n    constructor(editor) {\n        super();\n        this.editor = editor;\n        this._onDidChange = this._register(new Emitter());\n        this._computed = 0;\n        this._limited = false;\n    }\n    get limit() {\n        return this.editor.getOptions().get(56 /* EditorOption.foldingMaximumRegions */);\n    }\n    update(computed, limited) {\n        if (computed !== this._computed || limited !== this._limited) {\n            this._computed = computed;\n            this._limited = limited;\n            this._onDidChange.fire();\n        }\n    }\n}\nclass FoldingAction extends EditorAction {\n    runEditorCommand(accessor, editor, args) {\n        const languageConfigurationService = accessor.get(ILanguageConfigurationService);\n        const foldingController = FoldingController.get(editor);\n        if (!foldingController) {\n            return;\n        }\n        const foldingModelPromise = foldingController.getFoldingModel();\n        if (foldingModelPromise) {\n            this.reportTelemetry(accessor, editor);\n            return foldingModelPromise.then(foldingModel => {\n                if (foldingModel) {\n                    this.invoke(foldingController, foldingModel, editor, args, languageConfigurationService);\n                    const selection = editor.getSelection();\n                    if (selection) {\n                        foldingController.reveal(selection.getStartPosition());\n                    }\n                }\n            });\n        }\n    }\n    getSelectedLines(editor) {\n        const selections = editor.getSelections();\n        return selections ? selections.map(s => s.startLineNumber) : [];\n    }\n    getLineNumbers(args, editor) {\n        if (args && args.selectionLines) {\n            return args.selectionLines.map(l => l + 1); // to 0-bases line numbers\n        }\n        return this.getSelectedLines(editor);\n    }\n    run(_accessor, _editor) {\n    }\n}\nfunction toSelectedLines(selections) {\n    if (!selections || selections.length === 0) {\n        return {\n            startsInside: () => false\n        };\n    }\n    return {\n        startsInside(startLine, endLine) {\n            for (const s of selections) {\n                const line = s.startLineNumber;\n                if (line >= startLine && line <= endLine) {\n                    return true;\n                }\n            }\n            return false;\n        }\n    };\n}\nfunction foldingArgumentsConstraint(args) {\n    if (!isUndefined(args)) {\n        if (!isObject(args)) {\n            return false;\n        }\n        const foldingArgs = args;\n        if (!isUndefined(foldingArgs.levels) && !isNumber(foldingArgs.levels)) {\n            return false;\n        }\n        if (!isUndefined(foldingArgs.direction) && !isString(foldingArgs.direction)) {\n            return false;\n        }\n        if (!isUndefined(foldingArgs.selectionLines) && (!Array.isArray(foldingArgs.selectionLines) || !foldingArgs.selectionLines.every(isNumber))) {\n            return false;\n        }\n    }\n    return true;\n}\nclass UnfoldAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.unfold',\n            label: localize2(982, \"Unfold\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 94 /* KeyCode.BracketRight */,\n                mac: {\n                    primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 94 /* KeyCode.BracketRight */\n                },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: {\n                description: 'Unfold the content in the editor',\n                args: [\n                    {\n                        name: 'Unfold editor argument',\n                        description: `Property-value pairs that can be passed through this argument:\n\t\t\t\t\t\t* 'levels': Number of levels to unfold. If not set, defaults to 1.\n\t\t\t\t\t\t* 'direction': If 'up', unfold given number of levels up otherwise unfolds down.\n\t\t\t\t\t\t* 'selectionLines': Array of the start lines (0-based) of the editor selections to apply the unfold action to. If not set, the active selection(s) will be used.\n\t\t\t\t\t\t`,\n                        constraint: foldingArgumentsConstraint,\n                        schema: {\n                            'type': 'object',\n                            'properties': {\n                                'levels': {\n                                    'type': 'number',\n                                    'default': 1\n                                },\n                                'direction': {\n                                    'type': 'string',\n                                    'enum': ['up', 'down'],\n                                    'default': 'down'\n                                },\n                                'selectionLines': {\n                                    'type': 'array',\n                                    'items': {\n                                        'type': 'number'\n                                    }\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor, args) {\n        const levels = args && args.levels || 1;\n        const lineNumbers = this.getLineNumbers(args, editor);\n        if (args && args.direction === 'up') {\n            setCollapseStateLevelsUp(foldingModel, false, levels, lineNumbers);\n        }\n        else {\n            setCollapseStateLevelsDown(foldingModel, false, levels, lineNumbers);\n        }\n    }\n}\nclass UnFoldRecursivelyAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.unfoldRecursively',\n            label: localize2(983, \"Unfold Recursively\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 94 /* KeyCode.BracketRight */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor, _args) {\n        setCollapseStateLevelsDown(foldingModel, false, Number.MAX_VALUE, this.getSelectedLines(editor));\n    }\n}\nclass FoldAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.fold',\n            label: localize2(984, \"Fold\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 92 /* KeyCode.BracketLeft */,\n                mac: {\n                    primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 92 /* KeyCode.BracketLeft */\n                },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: {\n                description: 'Fold the content in the editor',\n                args: [\n                    {\n                        name: 'Fold editor argument',\n                        description: `Property-value pairs that can be passed through this argument:\n\t\t\t\t\t\t\t* 'levels': Number of levels to fold.\n\t\t\t\t\t\t\t* 'direction': If 'up', folds given number of levels up otherwise folds down.\n\t\t\t\t\t\t\t* 'selectionLines': Array of the start lines (0-based) of the editor selections to apply the fold action to. If not set, the active selection(s) will be used.\n\t\t\t\t\t\t\tIf no levels or direction is set, folds the region at the locations or if already collapsed, the first uncollapsed parent instead.\n\t\t\t\t\t\t`,\n                        constraint: foldingArgumentsConstraint,\n                        schema: {\n                            'type': 'object',\n                            'properties': {\n                                'levels': {\n                                    'type': 'number',\n                                },\n                                'direction': {\n                                    'type': 'string',\n                                    'enum': ['up', 'down'],\n                                },\n                                'selectionLines': {\n                                    'type': 'array',\n                                    'items': {\n                                        'type': 'number'\n                                    }\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor, args) {\n        const lineNumbers = this.getLineNumbers(args, editor);\n        const levels = args && args.levels;\n        const direction = args && args.direction;\n        if (typeof levels !== 'number' && typeof direction !== 'string') {\n            // fold the region at the location or if already collapsed, the first uncollapsed parent instead.\n            setCollapseStateUp(foldingModel, true, lineNumbers);\n        }\n        else {\n            if (direction === 'up') {\n                setCollapseStateLevelsUp(foldingModel, true, levels || 1, lineNumbers);\n            }\n            else {\n                setCollapseStateLevelsDown(foldingModel, true, levels || 1, lineNumbers);\n            }\n        }\n    }\n}\nclass ToggleFoldAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.toggleFold',\n            label: localize2(985, \"Toggle Fold\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 42 /* KeyCode.KeyL */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor) {\n        const selectedLines = this.getSelectedLines(editor);\n        toggleCollapseState(foldingModel, 1, selectedLines);\n    }\n}\nclass FoldRecursivelyAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.foldRecursively',\n            label: localize2(986, \"Fold Recursively\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 92 /* KeyCode.BracketLeft */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor) {\n        const selectedLines = this.getSelectedLines(editor);\n        setCollapseStateLevelsDown(foldingModel, true, Number.MAX_VALUE, selectedLines);\n    }\n}\nclass ToggleFoldRecursivelyAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.toggleFoldRecursively',\n            label: localize2(987, \"Toggle Fold Recursively\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 42 /* KeyCode.KeyL */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor) {\n        const selectedLines = this.getSelectedLines(editor);\n        toggleCollapseState(foldingModel, Number.MAX_VALUE, selectedLines);\n    }\n}\nclass FoldAllBlockCommentsAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.foldAllBlockComments',\n            label: localize2(988, \"Fold All Block Comments\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 90 /* KeyCode.Slash */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor, args, languageConfigurationService) {\n        if (foldingModel.regions.hasTypes()) {\n            setCollapseStateForType(foldingModel, FoldingRangeKind.Comment.value, true);\n        }\n        else {\n            const editorModel = editor.getModel();\n            if (!editorModel) {\n                return;\n            }\n            const comments = languageConfigurationService.getLanguageConfiguration(editorModel.getLanguageId()).comments;\n            if (comments && comments.blockCommentStartToken) {\n                const regExp = new RegExp('^\\\\s*' + escapeRegExpCharacters(comments.blockCommentStartToken));\n                setCollapseStateForMatchingLines(foldingModel, regExp, true);\n            }\n        }\n    }\n}\nclass FoldAllRegionsAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.foldAllMarkerRegions',\n            label: localize2(989, \"Fold All Regions\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 29 /* KeyCode.Digit8 */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor, args, languageConfigurationService) {\n        if (foldingModel.regions.hasTypes()) {\n            setCollapseStateForType(foldingModel, FoldingRangeKind.Region.value, true);\n        }\n        else {\n            const editorModel = editor.getModel();\n            if (!editorModel) {\n                return;\n            }\n            const foldingRules = languageConfigurationService.getLanguageConfiguration(editorModel.getLanguageId()).foldingRules;\n            if (foldingRules && foldingRules.markers && foldingRules.markers.start) {\n                const regExp = new RegExp(foldingRules.markers.start);\n                setCollapseStateForMatchingLines(foldingModel, regExp, true);\n            }\n        }\n    }\n}\nclass UnfoldAllRegionsAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.unfoldAllMarkerRegions',\n            label: localize2(990, \"Unfold All Regions\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 30 /* KeyCode.Digit9 */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor, args, languageConfigurationService) {\n        if (foldingModel.regions.hasTypes()) {\n            setCollapseStateForType(foldingModel, FoldingRangeKind.Region.value, false);\n        }\n        else {\n            const editorModel = editor.getModel();\n            if (!editorModel) {\n                return;\n            }\n            const foldingRules = languageConfigurationService.getLanguageConfiguration(editorModel.getLanguageId()).foldingRules;\n            if (foldingRules && foldingRules.markers && foldingRules.markers.start) {\n                const regExp = new RegExp(foldingRules.markers.start);\n                setCollapseStateForMatchingLines(foldingModel, regExp, false);\n            }\n        }\n    }\n}\nclass FoldAllExceptAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.foldAllExcept',\n            label: localize2(991, \"Fold All Except Selected\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 88 /* KeyCode.Minus */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor) {\n        const selectedLines = this.getSelectedLines(editor);\n        setCollapseStateForRest(foldingModel, true, selectedLines);\n    }\n}\nclass UnfoldAllExceptAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.unfoldAllExcept',\n            label: localize2(992, \"Unfold All Except Selected\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 86 /* KeyCode.Equal */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor) {\n        const selectedLines = this.getSelectedLines(editor);\n        setCollapseStateForRest(foldingModel, false, selectedLines);\n    }\n}\nclass FoldAllAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.foldAll',\n            label: localize2(993, \"Fold All\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 21 /* KeyCode.Digit0 */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, _editor) {\n        setCollapseStateLevelsDown(foldingModel, true);\n    }\n}\nclass UnfoldAllAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.unfoldAll',\n            label: localize2(994, \"Unfold All\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 40 /* KeyCode.KeyJ */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, _editor) {\n        setCollapseStateLevelsDown(foldingModel, false);\n    }\n}\nclass FoldLevelAction extends FoldingAction {\n    static { this.ID_PREFIX = 'editor.foldLevel'; }\n    static { this.ID = (level) => FoldLevelAction.ID_PREFIX + level; }\n    getFoldingLevel() {\n        return parseInt(this.id.substr(FoldLevelAction.ID_PREFIX.length));\n    }\n    invoke(_foldingController, foldingModel, editor) {\n        setCollapseStateAtLevel(foldingModel, this.getFoldingLevel(), true, this.getSelectedLines(editor));\n    }\n}\n/** Action to go to the parent fold of current line */\nclass GotoParentFoldAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.gotoParentFold',\n            label: localize2(995, \"Go to Parent Fold\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor) {\n        const selectedLines = this.getSelectedLines(editor);\n        if (selectedLines.length > 0) {\n            const startLineNumber = getParentFoldLine(selectedLines[0], foldingModel);\n            if (startLineNumber !== null) {\n                editor.setSelection({\n                    startLineNumber: startLineNumber,\n                    startColumn: 1,\n                    endLineNumber: startLineNumber,\n                    endColumn: 1\n                });\n            }\n        }\n    }\n}\n/** Action to go to the previous fold of current line */\nclass GotoPreviousFoldAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.gotoPreviousFold',\n            label: localize2(996, \"Go to Previous Folding Range\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor) {\n        const selectedLines = this.getSelectedLines(editor);\n        if (selectedLines.length > 0) {\n            const startLineNumber = getPreviousFoldLine(selectedLines[0], foldingModel);\n            if (startLineNumber !== null) {\n                editor.setSelection({\n                    startLineNumber: startLineNumber,\n                    startColumn: 1,\n                    endLineNumber: startLineNumber,\n                    endColumn: 1\n                });\n            }\n        }\n    }\n}\n/** Action to go to the next fold of current line */\nclass GotoNextFoldAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.gotoNextFold',\n            label: localize2(997, \"Go to Next Folding Range\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor) {\n        const selectedLines = this.getSelectedLines(editor);\n        if (selectedLines.length > 0) {\n            const startLineNumber = getNextFoldLine(selectedLines[0], foldingModel);\n            if (startLineNumber !== null) {\n                editor.setSelection({\n                    startLineNumber: startLineNumber,\n                    startColumn: 1,\n                    endLineNumber: startLineNumber,\n                    endColumn: 1\n                });\n            }\n        }\n    }\n}\nclass FoldRangeFromSelectionAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.createFoldingRangeFromSelection',\n            label: localize2(998, \"Create Folding Range from Selection\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 87 /* KeyCode.Comma */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(_foldingController, foldingModel, editor) {\n        const collapseRanges = [];\n        const selections = editor.getSelections();\n        if (selections) {\n            for (const selection of selections) {\n                let endLineNumber = selection.endLineNumber;\n                if (selection.endColumn === 1) {\n                    --endLineNumber;\n                }\n                if (endLineNumber > selection.startLineNumber) {\n                    collapseRanges.push({\n                        startLineNumber: selection.startLineNumber,\n                        endLineNumber: endLineNumber,\n                        type: undefined,\n                        isCollapsed: true,\n                        source: 1 /* FoldSource.userDefined */\n                    });\n                    editor.setSelection({\n                        startLineNumber: selection.startLineNumber,\n                        startColumn: 1,\n                        endLineNumber: selection.startLineNumber,\n                        endColumn: 1\n                    });\n                }\n            }\n            if (collapseRanges.length > 0) {\n                collapseRanges.sort((a, b) => {\n                    return a.startLineNumber - b.startLineNumber;\n                });\n                const newRanges = FoldingRegions.sanitizeAndMerge(foldingModel.regions, collapseRanges, editor.getModel()?.getLineCount());\n                foldingModel.updatePost(FoldingRegions.fromFoldRanges(newRanges));\n            }\n        }\n    }\n}\nclass RemoveFoldRangeFromSelectionAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.removeManualFoldingRanges',\n            label: localize2(999, \"Remove Manual Folding Ranges\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 89 /* KeyCode.Period */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    invoke(foldingController, foldingModel, editor) {\n        const selections = editor.getSelections();\n        if (selections) {\n            const ranges = [];\n            for (const selection of selections) {\n                const { startLineNumber, endLineNumber } = selection;\n                ranges.push(endLineNumber >= startLineNumber ? { startLineNumber, endLineNumber } : { endLineNumber, startLineNumber });\n            }\n            foldingModel.removeManualRanges(ranges);\n            foldingController.triggerFoldingModelChanged();\n        }\n    }\n}\nclass ToggleImportFoldAction extends FoldingAction {\n    constructor() {\n        super({\n            id: 'editor.toggleImportFold',\n            label: localize2(1000, \"Toggle Import Fold\"),\n            precondition: CONTEXT_FOLDING_ENABLED,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    async invoke(foldingController, foldingModel) {\n        const regionsToToggle = [];\n        const regions = foldingModel.regions;\n        for (let i = regions.length - 1; i >= 0; i--) {\n            if (regions.getType(i) === FoldingRangeKind.Imports.value) {\n                regionsToToggle.push(regions.toRegion(i));\n            }\n        }\n        foldingModel.toggleCollapseState(regionsToToggle);\n        foldingController.triggerFoldingModelChanged();\n    }\n}\nregisterEditorContribution(FoldingController.ID, FoldingController, 0 /* EditorContributionInstantiation.Eager */); // eager because it uses `saveViewState`/`restoreViewState`\nregisterEditorAction(UnfoldAction);\nregisterEditorAction(UnFoldRecursivelyAction);\nregisterEditorAction(FoldAction);\nregisterEditorAction(FoldRecursivelyAction);\nregisterEditorAction(ToggleFoldRecursivelyAction);\nregisterEditorAction(FoldAllAction);\nregisterEditorAction(UnfoldAllAction);\nregisterEditorAction(FoldAllBlockCommentsAction);\nregisterEditorAction(FoldAllRegionsAction);\nregisterEditorAction(UnfoldAllRegionsAction);\nregisterEditorAction(FoldAllExceptAction);\nregisterEditorAction(UnfoldAllExceptAction);\nregisterEditorAction(ToggleFoldAction);\nregisterEditorAction(GotoParentFoldAction);\nregisterEditorAction(GotoPreviousFoldAction);\nregisterEditorAction(GotoNextFoldAction);\nregisterEditorAction(FoldRangeFromSelectionAction);\nregisterEditorAction(RemoveFoldRangeFromSelectionAction);\nregisterEditorAction(ToggleImportFoldAction);\nfor (let i = 1; i <= 7; i++) {\n    registerInstantiatedEditorAction(new FoldLevelAction({\n        id: FoldLevelAction.ID(i),\n        label: localize2(1001, \"Fold Level {0}\", i),\n        precondition: CONTEXT_FOLDING_ENABLED,\n        kbOpts: {\n            kbExpr: EditorContextKeys.editorTextFocus,\n            primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | (21 /* KeyCode.Digit0 */ + i)),\n            weight: 100 /* KeybindingWeight.EditorContrib */\n        }\n    }));\n}\nCommandsRegistry.registerCommand('_executeFoldingRangeProvider', async function (accessor, ...args) {\n    const [resource] = args;\n    if (!(resource instanceof URI)) {\n        throw illegalArgument();\n    }\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const model = accessor.get(IModelService).getModel(resource);\n    if (!model) {\n        throw illegalArgument();\n    }\n    const configurationService = accessor.get(IConfigurationService);\n    if (!configurationService.getValue('editor.folding', { resource })) {\n        return [];\n    }\n    const languageConfigurationService = accessor.get(ILanguageConfigurationService);\n    const strategy = configurationService.getValue('editor.foldingStrategy', { resource });\n    const foldingLimitReporter = {\n        get limit() {\n            return configurationService.getValue('editor.foldingMaximumRegions', { resource });\n        },\n        update: (computed, limited) => { }\n    };\n    const indentRangeProvider = new IndentRangeProvider(model, languageConfigurationService, foldingLimitReporter);\n    let rangeProvider = indentRangeProvider;\n    if (strategy !== 'indentation') {\n        const providers = FoldingController.getFoldingRangeProviders(languageFeaturesService, model);\n        if (providers.length) {\n            rangeProvider = new SyntaxRangeProvider(model, providers, () => { }, foldingLimitReporter, indentRangeProvider);\n        }\n    }\n    const ranges = await rangeProvider.compute(CancellationToken.None);\n    const result = [];\n    try {\n        if (ranges) {\n            for (let i = 0; i < ranges.length; i++) {\n                const type = ranges.getType(i);\n                result.push({ start: ranges.getStartLineNumber(i), end: ranges.getEndLineNumber(i), kind: type ? FoldingRangeKind.fromValue(type) : undefined });\n            }\n        }\n        return result;\n    }\n    finally {\n        rangeProvider.dispose();\n    }\n});\n\nexport { FoldingController, RangesLimitReporter, toSelectedLines };\n","import { registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { EditorZoom } from '../../../common/config/editorZoom.js';\nimport { localize2 } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nclass EditorFontZoomIn extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.fontZoomIn',\n            label: localize2(1011, \"Increase Editor Font Size\"),\n            precondition: undefined\n        });\n    }\n    run(accessor, editor) {\n        EditorZoom.setZoomLevel(EditorZoom.getZoomLevel() + 1);\n    }\n}\nclass EditorFontZoomOut extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.fontZoomOut',\n            label: localize2(1012, \"Decrease Editor Font Size\"),\n            precondition: undefined\n        });\n    }\n    run(accessor, editor) {\n        EditorZoom.setZoomLevel(EditorZoom.getZoomLevel() - 1);\n    }\n}\nclass EditorFontZoomReset extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.fontZoomReset',\n            label: localize2(1013, \"Reset Editor Font Size\"),\n            precondition: undefined\n        });\n    }\n    run(accessor, editor) {\n        EditorZoom.setZoomLevel(0);\n    }\n}\nregisterEditorAction(EditorFontZoomIn);\nregisterEditorAction(EditorFontZoomOut);\nregisterEditorAction(EditorFontZoomReset);\n","import { EditOperation } from '../../../common/core/editOperation.js';\nimport { Range } from '../../../common/core/range.js';\nimport { StableEditorScrollState } from '../../../browser/stableEditorScroll.js';\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 *--------------------------------------------------------------------------------------------*/\nclass FormattingEdit {\n    static _handleEolEdits(editor, edits) {\n        let newEol = undefined;\n        const singleEdits = [];\n        for (const edit of edits) {\n            if (typeof edit.eol === 'number') {\n                newEol = edit.eol;\n            }\n            if (edit.range && typeof edit.text === 'string') {\n                singleEdits.push(edit);\n            }\n        }\n        if (typeof newEol === 'number') {\n            if (editor.hasModel()) {\n                editor.getModel().pushEOL(newEol);\n            }\n        }\n        return singleEdits;\n    }\n    static _isFullModelReplaceEdit(editor, edit) {\n        if (!editor.hasModel()) {\n            return false;\n        }\n        const model = editor.getModel();\n        const editRange = model.validateRange(edit.range);\n        const fullModelRange = model.getFullModelRange();\n        return fullModelRange.equalsRange(editRange);\n    }\n    static execute(editor, _edits, addUndoStops) {\n        if (addUndoStops) {\n            editor.pushUndoStop();\n        }\n        const scrollState = StableEditorScrollState.capture(editor);\n        const edits = FormattingEdit._handleEolEdits(editor, _edits);\n        if (edits.length === 1 && FormattingEdit._isFullModelReplaceEdit(editor, edits[0])) {\n            // We use replace semantics and hope that markers stay put...\n            editor.executeEdits('formatEditsCommand', edits.map(edit => EditOperation.replace(Range.lift(edit.range), edit.text)));\n        }\n        else {\n            editor.executeEdits('formatEditsCommand', edits.map(edit => EditOperation.replaceMove(Range.lift(edit.range), edit.text)));\n        }\n        if (addUndoStops) {\n            editor.pushUndoStop();\n        }\n        scrollState.restoreRelativeVerticalPositionOfCursor(editor);\n    }\n}\n\nexport { FormattingEdit };\n","/**\n * **!Do not construct directly!**\n *\n * **!Only static methods because it gets serialized!**\n *\n * This represents the \"canonical\" version for an extension identifier. Extension ids\n * have to be case-insensitive (due to the marketplace), but we must ensure case\n * preservation because the extension API is already public at this time.\n *\n * For example, given an extension with the publisher `\"Hello\"` and the name `\"World\"`,\n * its canonical extension identifier is `\"Hello.World\"`. This extension could be\n * referenced in some other extension's dependencies using the string `\"hello.world\"`.\n *\n * To make matters more complicated, an extension can optionally have an UUID. When two\n * extensions have the same UUID, they are considered equal even if their identifier is different.\n */\nclass ExtensionIdentifier {\n    constructor(value) {\n        this.value = value;\n        this._lower = value.toLowerCase();\n    }\n    /**\n     * Gives the value by which to index (for equality).\n     */\n    static toKey(id) {\n        if (typeof id === 'string') {\n            return id.toLowerCase();\n        }\n        return id._lower;\n    }\n}\nclass ExtensionIdentifierSet {\n    constructor(iterable) {\n        this._set = new Set();\n        if (iterable) {\n            for (const value of iterable) {\n                this.add(value);\n            }\n        }\n    }\n    add(id) {\n        this._set.add(ExtensionIdentifier.toKey(id));\n    }\n    has(id) {\n        return this._set.has(ExtensionIdentifier.toKey(id));\n    }\n}\n\nexport { ExtensionIdentifier, ExtensionIdentifierSet };\n","import { isNonEmptyArray, asArray } from '../../../../base/common/arrays.js';\nimport { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { Iterable } from '../../../../base/common/iterator.js';\nimport { LinkedList } from '../../../../base/common/linkedList.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { EditorStateCancellationTokenSource, TextModelCancellationTokenSource } from '../../editorState/browser/editorState.js';\nimport { isCodeEditor } from '../../../browser/editorBrowser.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { IEditorWorkerService } from '../../../common/services/editorWorker.js';\nimport { ITextModelService } from '../../../common/services/resolverService.js';\nimport { FormattingEdit } from './formattingEdit.js';\nimport { CommandsRegistry } from '../../../../platform/commands/common/commands.js';\nimport { ExtensionIdentifierSet } from '../../../../platform/extensions/common/extensions.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { ILogService } from '../../../../platform/log/common/log.js';\nimport { IAccessibilitySignalService, AccessibilitySignal } from '../../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction getRealAndSyntheticDocumentFormattersOrdered(documentFormattingEditProvider, documentRangeFormattingEditProvider, model) {\n    const result = [];\n    const seen = new ExtensionIdentifierSet();\n    // (1) add all document formatter\n    const docFormatter = documentFormattingEditProvider.ordered(model);\n    for (const formatter of docFormatter) {\n        result.push(formatter);\n        if (formatter.extensionId) {\n            seen.add(formatter.extensionId);\n        }\n    }\n    // (2) add all range formatter as document formatter (unless the same extension already did that)\n    const rangeFormatter = documentRangeFormattingEditProvider.ordered(model);\n    for (const formatter of rangeFormatter) {\n        if (formatter.extensionId) {\n            if (seen.has(formatter.extensionId)) {\n                continue;\n            }\n            seen.add(formatter.extensionId);\n        }\n        result.push({\n            displayName: formatter.displayName,\n            extensionId: formatter.extensionId,\n            provideDocumentFormattingEdits(model, options, token) {\n                return formatter.provideDocumentRangeFormattingEdits(model, model.getFullModelRange(), options, token);\n            }\n        });\n    }\n    return result;\n}\nclass FormattingConflicts {\n    static { this._selectors = new LinkedList(); }\n    static setFormatterSelector(selector) {\n        const remove = FormattingConflicts._selectors.unshift(selector);\n        return { dispose: remove };\n    }\n    static async select(formatter, document, mode, kind) {\n        if (formatter.length === 0) {\n            return undefined;\n        }\n        const selector = Iterable.first(FormattingConflicts._selectors);\n        if (selector) {\n            return await selector(formatter, document, mode, kind);\n        }\n        return undefined;\n    }\n}\nasync function formatDocumentRangesWithSelectedProvider(accessor, editorOrModel, rangeOrRanges, mode, progress, token, userGesture) {\n    const instaService = accessor.get(IInstantiationService);\n    const { documentRangeFormattingEditProvider: documentRangeFormattingEditProviderRegistry } = accessor.get(ILanguageFeaturesService);\n    const model = isCodeEditor(editorOrModel) ? editorOrModel.getModel() : editorOrModel;\n    const provider = documentRangeFormattingEditProviderRegistry.ordered(model);\n    const selected = await FormattingConflicts.select(provider, model, mode, 2 /* FormattingKind.Selection */);\n    if (selected) {\n        progress.report(selected);\n        await instaService.invokeFunction(formatDocumentRangesWithProvider, selected, editorOrModel, rangeOrRanges, token, userGesture);\n    }\n}\nasync function formatDocumentRangesWithProvider(accessor, provider, editorOrModel, rangeOrRanges, token, userGesture) {\n    const workerService = accessor.get(IEditorWorkerService);\n    const logService = accessor.get(ILogService);\n    const accessibilitySignalService = accessor.get(IAccessibilitySignalService);\n    let model;\n    let cts;\n    if (isCodeEditor(editorOrModel)) {\n        model = editorOrModel.getModel();\n        cts = new EditorStateCancellationTokenSource(editorOrModel, 1 /* CodeEditorStateFlag.Value */ | 4 /* CodeEditorStateFlag.Position */, undefined, token);\n    }\n    else {\n        model = editorOrModel;\n        cts = new TextModelCancellationTokenSource(editorOrModel, token);\n    }\n    // make sure that ranges don't overlap nor touch each other\n    const ranges = [];\n    let len = 0;\n    for (const range of asArray(rangeOrRanges).sort(Range.compareRangesUsingStarts)) {\n        if (len > 0 && Range.areIntersectingOrTouching(ranges[len - 1], range)) {\n            ranges[len - 1] = Range.fromPositions(ranges[len - 1].getStartPosition(), range.getEndPosition());\n        }\n        else {\n            len = ranges.push(range);\n        }\n    }\n    const computeEdits = async (range) => {\n        logService.trace(`[format][provideDocumentRangeFormattingEdits] (request)`, provider.extensionId?.value, range);\n        const result = (await provider.provideDocumentRangeFormattingEdits(model, range, model.getFormattingOptions(), cts.token)) || [];\n        logService.trace(`[format][provideDocumentRangeFormattingEdits] (response)`, provider.extensionId?.value, result);\n        return result;\n    };\n    const hasIntersectingEdit = (a, b) => {\n        if (!a.length || !b.length) {\n            return false;\n        }\n        // quick exit if the list of ranges are completely unrelated [O(n)]\n        const mergedA = a.reduce((acc, val) => { return Range.plusRange(acc, val.range); }, a[0].range);\n        if (!b.some(x => { return Range.intersectRanges(mergedA, x.range); })) {\n            return false;\n        }\n        // fallback to a complete check [O(n^2)]\n        for (const edit of a) {\n            for (const otherEdit of b) {\n                if (Range.intersectRanges(edit.range, otherEdit.range)) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    };\n    const allEdits = [];\n    const rawEditsList = [];\n    try {\n        if (typeof provider.provideDocumentRangesFormattingEdits === 'function') {\n            logService.trace(`[format][provideDocumentRangeFormattingEdits] (request)`, provider.extensionId?.value, ranges);\n            const result = (await provider.provideDocumentRangesFormattingEdits(model, ranges, model.getFormattingOptions(), cts.token)) || [];\n            logService.trace(`[format][provideDocumentRangeFormattingEdits] (response)`, provider.extensionId?.value, result);\n            rawEditsList.push(result);\n        }\n        else {\n            for (const range of ranges) {\n                if (cts.token.isCancellationRequested) {\n                    return true;\n                }\n                rawEditsList.push(await computeEdits(range));\n            }\n            for (let i = 0; i < ranges.length; ++i) {\n                for (let j = i + 1; j < ranges.length; ++j) {\n                    if (cts.token.isCancellationRequested) {\n                        return true;\n                    }\n                    if (hasIntersectingEdit(rawEditsList[i], rawEditsList[j])) {\n                        // Merge ranges i and j into a single range, recompute the associated edits\n                        const mergedRange = Range.plusRange(ranges[i], ranges[j]);\n                        const edits = await computeEdits(mergedRange);\n                        ranges.splice(j, 1);\n                        ranges.splice(i, 1);\n                        ranges.push(mergedRange);\n                        rawEditsList.splice(j, 1);\n                        rawEditsList.splice(i, 1);\n                        rawEditsList.push(edits);\n                        // Restart scanning\n                        i = 0;\n                        j = 0;\n                    }\n                }\n            }\n        }\n        for (const rawEdits of rawEditsList) {\n            if (cts.token.isCancellationRequested) {\n                return true;\n            }\n            const minimalEdits = await workerService.computeMoreMinimalEdits(model.uri, rawEdits);\n            if (minimalEdits) {\n                allEdits.push(...minimalEdits);\n            }\n        }\n        if (cts.token.isCancellationRequested) {\n            return true;\n        }\n    }\n    finally {\n        cts.dispose();\n    }\n    if (allEdits.length === 0) {\n        return false;\n    }\n    if (isCodeEditor(editorOrModel)) {\n        // use editor to apply edits\n        FormattingEdit.execute(editorOrModel, allEdits, true);\n        editorOrModel.revealPositionInCenterIfOutsideViewport(editorOrModel.getPosition(), 1 /* ScrollType.Immediate */);\n    }\n    else {\n        // use model to apply edits\n        const [{ range }] = allEdits;\n        const initialSelection = new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn);\n        model.pushEditOperations([initialSelection], allEdits.map(edit => {\n            return {\n                text: edit.text,\n                range: Range.lift(edit.range),\n                forceMoveMarkers: true\n            };\n        }), undoEdits => {\n            for (const { range } of undoEdits) {\n                if (Range.areIntersectingOrTouching(range, initialSelection)) {\n                    return [new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn)];\n                }\n            }\n            return null;\n        });\n    }\n    accessibilitySignalService.playSignal(AccessibilitySignal.format, { userGesture });\n    return true;\n}\nasync function formatDocumentWithSelectedProvider(accessor, editorOrModel, mode, progress, token, userGesture) {\n    const instaService = accessor.get(IInstantiationService);\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const model = isCodeEditor(editorOrModel) ? editorOrModel.getModel() : editorOrModel;\n    const provider = getRealAndSyntheticDocumentFormattersOrdered(languageFeaturesService.documentFormattingEditProvider, languageFeaturesService.documentRangeFormattingEditProvider, model);\n    const selected = await FormattingConflicts.select(provider, model, mode, 1 /* FormattingKind.File */);\n    if (selected) {\n        progress.report(selected);\n        await instaService.invokeFunction(formatDocumentWithProvider, selected, editorOrModel, mode, token, userGesture);\n    }\n}\nasync function formatDocumentWithProvider(accessor, provider, editorOrModel, mode, token, userGesture) {\n    const workerService = accessor.get(IEditorWorkerService);\n    const accessibilitySignalService = accessor.get(IAccessibilitySignalService);\n    let model;\n    let cts;\n    if (isCodeEditor(editorOrModel)) {\n        model = editorOrModel.getModel();\n        cts = new EditorStateCancellationTokenSource(editorOrModel, 1 /* CodeEditorStateFlag.Value */ | 4 /* CodeEditorStateFlag.Position */, undefined, token);\n    }\n    else {\n        model = editorOrModel;\n        cts = new TextModelCancellationTokenSource(editorOrModel, token);\n    }\n    let edits;\n    try {\n        const rawEdits = await provider.provideDocumentFormattingEdits(model, model.getFormattingOptions(), cts.token);\n        edits = await workerService.computeMoreMinimalEdits(model.uri, rawEdits);\n        if (cts.token.isCancellationRequested) {\n            return true;\n        }\n    }\n    finally {\n        cts.dispose();\n    }\n    if (!edits || edits.length === 0) {\n        return false;\n    }\n    if (isCodeEditor(editorOrModel)) {\n        // use editor to apply edits\n        FormattingEdit.execute(editorOrModel, edits, mode !== 2 /* FormattingMode.Silent */);\n        if (mode !== 2 /* FormattingMode.Silent */) {\n            editorOrModel.revealPositionInCenterIfOutsideViewport(editorOrModel.getPosition(), 1 /* ScrollType.Immediate */);\n        }\n    }\n    else {\n        // use model to apply edits\n        const [{ range }] = edits;\n        const initialSelection = new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn);\n        model.pushEditOperations([initialSelection], edits.map(edit => {\n            return {\n                text: edit.text,\n                range: Range.lift(edit.range),\n                forceMoveMarkers: true\n            };\n        }), undoEdits => {\n            for (const { range } of undoEdits) {\n                if (Range.areIntersectingOrTouching(range, initialSelection)) {\n                    return [new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn)];\n                }\n            }\n            return null;\n        });\n    }\n    accessibilitySignalService.playSignal(AccessibilitySignal.format, { userGesture });\n    return true;\n}\nasync function getDocumentRangeFormattingEditsUntilResult(workerService, languageFeaturesService, model, range, options, token) {\n    const providers = languageFeaturesService.documentRangeFormattingEditProvider.ordered(model);\n    for (const provider of providers) {\n        const rawEdits = await Promise.resolve(provider.provideDocumentRangeFormattingEdits(model, range, options, token)).catch(onUnexpectedExternalError);\n        if (isNonEmptyArray(rawEdits)) {\n            return await workerService.computeMoreMinimalEdits(model.uri, rawEdits);\n        }\n    }\n    return undefined;\n}\nasync function getDocumentFormattingEditsUntilResult(workerService, languageFeaturesService, model, options, token) {\n    const providers = getRealAndSyntheticDocumentFormattersOrdered(languageFeaturesService.documentFormattingEditProvider, languageFeaturesService.documentRangeFormattingEditProvider, model);\n    for (const provider of providers) {\n        const rawEdits = await Promise.resolve(provider.provideDocumentFormattingEdits(model, options, token)).catch(onUnexpectedExternalError);\n        if (isNonEmptyArray(rawEdits)) {\n            return await workerService.computeMoreMinimalEdits(model.uri, rawEdits);\n        }\n    }\n    return undefined;\n}\nfunction getOnTypeFormattingEdits(workerService, languageFeaturesService, model, position, ch, options, token) {\n    const providers = languageFeaturesService.onTypeFormattingEditProvider.ordered(model);\n    if (providers.length === 0) {\n        return Promise.resolve(undefined);\n    }\n    if (providers[0].autoFormatTriggerCharacters.indexOf(ch) < 0) {\n        return Promise.resolve(undefined);\n    }\n    return Promise.resolve(providers[0].provideOnTypeFormattingEdits(model, position, ch, options, token)).catch(onUnexpectedExternalError).then(edits => {\n        return workerService.computeMoreMinimalEdits(model.uri, edits);\n    });\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nCommandsRegistry.registerCommand('_executeFormatRangeProvider', async function (accessor, ...args) {\n    const [resource, range, options] = args;\n    assertType(URI.isUri(resource));\n    assertType(Range.isIRange(range));\n    const resolverService = accessor.get(ITextModelService);\n    const workerService = accessor.get(IEditorWorkerService);\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const reference = await resolverService.createModelReference(resource);\n    try {\n        return getDocumentRangeFormattingEditsUntilResult(workerService, languageFeaturesService, reference.object.textEditorModel, Range.lift(range), options, CancellationToken.None);\n    }\n    finally {\n        reference.dispose();\n    }\n});\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nCommandsRegistry.registerCommand('_executeFormatDocumentProvider', async function (accessor, ...args) {\n    const [resource, options] = args;\n    assertType(URI.isUri(resource));\n    const resolverService = accessor.get(ITextModelService);\n    const workerService = accessor.get(IEditorWorkerService);\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const reference = await resolverService.createModelReference(resource);\n    try {\n        return getDocumentFormattingEditsUntilResult(workerService, languageFeaturesService, reference.object.textEditorModel, options, CancellationToken.None);\n    }\n    finally {\n        reference.dispose();\n    }\n});\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nCommandsRegistry.registerCommand('_executeFormatOnTypeProvider', async function (accessor, ...args) {\n    const [resource, position, ch, options] = args;\n    assertType(URI.isUri(resource));\n    assertType(Position.isIPosition(position));\n    assertType(typeof ch === 'string');\n    const resolverService = accessor.get(ITextModelService);\n    const workerService = accessor.get(IEditorWorkerService);\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const reference = await resolverService.createModelReference(resource);\n    try {\n        return getOnTypeFormattingEdits(workerService, languageFeaturesService, reference.object.textEditorModel, Position.lift(position), ch, options, CancellationToken.None);\n    }\n    finally {\n        reference.dispose();\n    }\n});\n\nexport { FormattingConflicts, formatDocumentRangesWithProvider, formatDocumentRangesWithSelectedProvider, formatDocumentWithProvider, formatDocumentWithSelectedProvider, getDocumentFormattingEditsUntilResult, getDocumentRangeFormattingEditsUntilResult, getOnTypeFormattingEdits, getRealAndSyntheticDocumentFormattersOrdered };\n","import { isNonEmptyArray } from '../../../../base/common/arrays.js';\nimport { CancellationTokenSource, CancellationToken } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { KeyChord } from '../../../../base/common/keyCodes.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { registerEditorContribution, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { CharacterSet } from '../../../common/core/characterClassifier.js';\nimport { Range } from '../../../common/core/range.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { IEditorWorkerService } from '../../../common/services/editorWorker.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { getOnTypeFormattingEdits, formatDocumentRangesWithSelectedProvider, formatDocumentWithSelectedProvider } from './format.js';\nimport { FormattingEdit } from './formattingEdit.js';\nimport { localize2 } from '../../../../nls.js';\nimport { IAccessibilitySignalService, AccessibilitySignal } from '../../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';\nimport { CommandsRegistry, ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { Progress, IEditorProgressService } from '../../../../platform/progress/common/progress.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet FormatOnType = class FormatOnType {\n    static { this.ID = 'editor.contrib.autoFormat'; }\n    constructor(_editor, _languageFeaturesService, _workerService, _accessibilitySignalService) {\n        this._editor = _editor;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._workerService = _workerService;\n        this._accessibilitySignalService = _accessibilitySignalService;\n        this._disposables = new DisposableStore();\n        this._sessionDisposables = new DisposableStore();\n        this._disposables.add(_languageFeaturesService.onTypeFormattingEditProvider.onDidChange(this._update, this));\n        this._disposables.add(_editor.onDidChangeModel(() => this._update()));\n        this._disposables.add(_editor.onDidChangeModelLanguage(() => this._update()));\n        this._disposables.add(_editor.onDidChangeConfiguration(e => {\n            if (e.hasChanged(65 /* EditorOption.formatOnType */)) {\n                this._update();\n            }\n        }));\n        this._update();\n    }\n    dispose() {\n        this._disposables.dispose();\n        this._sessionDisposables.dispose();\n    }\n    _update() {\n        // clean up\n        this._sessionDisposables.clear();\n        // we are disabled\n        if (!this._editor.getOption(65 /* EditorOption.formatOnType */)) {\n            return;\n        }\n        // no model\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        const model = this._editor.getModel();\n        // no support\n        const [support] = this._languageFeaturesService.onTypeFormattingEditProvider.ordered(model);\n        if (!support || !support.autoFormatTriggerCharacters) {\n            return;\n        }\n        // register typing listeners that will trigger the format\n        const triggerChars = new CharacterSet();\n        for (const ch of support.autoFormatTriggerCharacters) {\n            triggerChars.add(ch.charCodeAt(0));\n        }\n        this._sessionDisposables.add(this._editor.onDidType((text) => {\n            const lastCharCode = text.charCodeAt(text.length - 1);\n            if (triggerChars.has(lastCharCode)) {\n                this._trigger(String.fromCharCode(lastCharCode));\n            }\n        }));\n    }\n    _trigger(ch) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        if (this._editor.getSelections().length > 1 || !this._editor.getSelection().isEmpty()) {\n            return;\n        }\n        const model = this._editor.getModel();\n        const position = this._editor.getPosition();\n        const cts = new CancellationTokenSource();\n        // install a listener that checks if edits happens before the\n        // position on which we format right now. If so, we won't\n        // apply the format edits\n        const unbind = this._editor.onDidChangeModelContent((e) => {\n            if (e.isFlush) {\n                // a model.setValue() was called\n                // cancel only once\n                cts.cancel();\n                unbind.dispose();\n                return;\n            }\n            for (let i = 0, len = e.changes.length; i < len; i++) {\n                const change = e.changes[i];\n                if (change.range.endLineNumber <= position.lineNumber) {\n                    // cancel only once\n                    cts.cancel();\n                    unbind.dispose();\n                    return;\n                }\n            }\n        });\n        getOnTypeFormattingEdits(this._workerService, this._languageFeaturesService, model, position, ch, model.getFormattingOptions(), cts.token).then(edits => {\n            if (cts.token.isCancellationRequested) {\n                return;\n            }\n            if (isNonEmptyArray(edits)) {\n                this._accessibilitySignalService.playSignal(AccessibilitySignal.format, { userGesture: false });\n                FormattingEdit.execute(this._editor, edits, true);\n            }\n        }).finally(() => {\n            unbind.dispose();\n        });\n    }\n};\nFormatOnType = __decorate([\n    __param(1, ILanguageFeaturesService),\n    __param(2, IEditorWorkerService),\n    __param(3, IAccessibilitySignalService)\n], FormatOnType);\nlet FormatOnPaste = class FormatOnPaste {\n    static { this.ID = 'editor.contrib.formatOnPaste'; }\n    constructor(editor, _languageFeaturesService, _instantiationService) {\n        this.editor = editor;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._instantiationService = _instantiationService;\n        this._callOnDispose = new DisposableStore();\n        this._callOnModel = new DisposableStore();\n        this._callOnDispose.add(editor.onDidChangeConfiguration(() => this._update()));\n        this._callOnDispose.add(editor.onDidChangeModel(() => this._update()));\n        this._callOnDispose.add(editor.onDidChangeModelLanguage(() => this._update()));\n        this._callOnDispose.add(_languageFeaturesService.documentRangeFormattingEditProvider.onDidChange(this._update, this));\n    }\n    dispose() {\n        this._callOnDispose.dispose();\n        this._callOnModel.dispose();\n    }\n    _update() {\n        // clean up\n        this._callOnModel.clear();\n        // we are disabled\n        if (!this.editor.getOption(64 /* EditorOption.formatOnPaste */)) {\n            return;\n        }\n        // no model\n        if (!this.editor.hasModel()) {\n            return;\n        }\n        // no formatter\n        if (!this._languageFeaturesService.documentRangeFormattingEditProvider.has(this.editor.getModel())) {\n            return;\n        }\n        this._callOnModel.add(this.editor.onDidPaste(({ range }) => this._trigger(range)));\n    }\n    _trigger(range) {\n        if (!this.editor.hasModel()) {\n            return;\n        }\n        if (this.editor.getSelections().length > 1) {\n            return;\n        }\n        this._instantiationService.invokeFunction(formatDocumentRangesWithSelectedProvider, this.editor, range, 2 /* FormattingMode.Silent */, Progress.None, CancellationToken.None, false).catch(onUnexpectedError);\n    }\n};\nFormatOnPaste = __decorate([\n    __param(1, ILanguageFeaturesService),\n    __param(2, IInstantiationService)\n], FormatOnPaste);\nclass FormatDocumentAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.formatDocument',\n            label: localize2(1014, \"Format Document\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.notInCompositeEditor, EditorContextKeys.writable, EditorContextKeys.hasDocumentFormattingProvider),\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 36 /* KeyCode.KeyF */,\n                linux: { primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 39 /* KeyCode.KeyI */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            contextMenuOpts: {\n                group: '1_modification',\n                order: 1.3\n            }\n        });\n    }\n    async run(accessor, editor) {\n        if (editor.hasModel()) {\n            const instaService = accessor.get(IInstantiationService);\n            const progressService = accessor.get(IEditorProgressService);\n            await progressService.showWhile(instaService.invokeFunction(formatDocumentWithSelectedProvider, editor, 1 /* FormattingMode.Explicit */, Progress.None, CancellationToken.None, true), 250);\n        }\n    }\n}\nclass FormatSelectionAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.formatSelection',\n            label: localize2(1015, \"Format Selection\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, EditorContextKeys.hasDocumentSelectionFormattingProvider),\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 36 /* KeyCode.KeyF */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            contextMenuOpts: {\n                when: EditorContextKeys.hasNonEmptySelection,\n                group: '1_modification',\n                order: 1.31\n            }\n        });\n    }\n    async run(accessor, editor) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const instaService = accessor.get(IInstantiationService);\n        const model = editor.getModel();\n        const ranges = editor.getSelections().map(range => {\n            return range.isEmpty()\n                ? new Range(range.startLineNumber, 1, range.startLineNumber, model.getLineMaxColumn(range.startLineNumber))\n                : range;\n        });\n        const progressService = accessor.get(IEditorProgressService);\n        await progressService.showWhile(instaService.invokeFunction(formatDocumentRangesWithSelectedProvider, editor, ranges, 1 /* FormattingMode.Explicit */, Progress.None, CancellationToken.None, true), 250);\n    }\n}\nregisterEditorContribution(FormatOnType.ID, FormatOnType, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\nregisterEditorContribution(FormatOnPaste.ID, FormatOnPaste, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\nregisterEditorAction(FormatDocumentAction);\nregisterEditorAction(FormatSelectionAction);\n// this is the old format action that does both (format document OR format selection)\n// and we keep it here such that existing keybinding configurations etc will still work\nCommandsRegistry.registerCommand('editor.action.format', async (accessor) => {\n    const editor = accessor.get(ICodeEditorService).getFocusedCodeEditor();\n    if (!editor || !editor.hasModel()) {\n        return;\n    }\n    const commandService = accessor.get(ICommandService);\n    if (editor.getSelection().isEmpty()) {\n        await commandService.executeCommand('editor.action.formatDocument');\n    }\n    else {\n        await commandService.executeCommand('editor.action.formatSelection');\n    }\n});\n\nexport { FormatOnType };\n","import { equals } from '../../../../base/common/arrays.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { Iterable } from '../../../../base/common/iterator.js';\nimport { LRUCache } from '../../../../base/common/map.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';\nimport { registerSingleton } from '../../../../platform/instantiation/common/extensions.js';\nimport { IModelService } from '../../../common/services/model.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass TreeElement {\n    remove() {\n        this.parent?.children.delete(this.id);\n    }\n    static findId(candidate, container) {\n        // complex id-computation which contains the origin/extension,\n        // the parent path, and some dedupe logic when names collide\n        let candidateId;\n        if (typeof candidate === 'string') {\n            candidateId = `${container.id}/${candidate}`;\n        }\n        else {\n            candidateId = `${container.id}/${candidate.name}`;\n            if (container.children.get(candidateId) !== undefined) {\n                candidateId = `${container.id}/${candidate.name}_${candidate.range.startLineNumber}_${candidate.range.startColumn}`;\n            }\n        }\n        let id = candidateId;\n        for (let i = 0; container.children.get(id) !== undefined; i++) {\n            id = `${candidateId}_${i}`;\n        }\n        return id;\n    }\n    static empty(element) {\n        return element.children.size === 0;\n    }\n}\nclass OutlineElement extends TreeElement {\n    constructor(id, parent, symbol) {\n        super();\n        this.id = id;\n        this.parent = parent;\n        this.symbol = symbol;\n        this.children = new Map();\n    }\n}\nclass OutlineGroup extends TreeElement {\n    constructor(id, parent, label, order) {\n        super();\n        this.id = id;\n        this.parent = parent;\n        this.label = label;\n        this.order = order;\n        this.children = new Map();\n    }\n}\nclass OutlineModel extends TreeElement {\n    static create(registry, textModel, token) {\n        const cts = new CancellationTokenSource(token);\n        const result = new OutlineModel(textModel.uri);\n        const provider = registry.ordered(textModel);\n        const promises = provider.map((provider, index) => {\n            const id = TreeElement.findId(`provider_${index}`, result);\n            const group = new OutlineGroup(id, result, provider.displayName ?? 'Unknown Outline Provider', index);\n            return Promise.resolve(provider.provideDocumentSymbols(textModel, cts.token)).then(result => {\n                for (const info of result || []) {\n                    OutlineModel._makeOutlineElement(info, group);\n                }\n                return group;\n            }, err => {\n                onUnexpectedExternalError(err);\n                return group;\n            }).then(group => {\n                if (!TreeElement.empty(group)) {\n                    result._groups.set(id, group);\n                }\n                else {\n                    group.remove();\n                }\n            });\n        });\n        const listener = registry.onDidChange(() => {\n            const newProvider = registry.ordered(textModel);\n            if (!equals(newProvider, provider)) {\n                cts.cancel();\n            }\n        });\n        return Promise.all(promises).then(() => {\n            if (cts.token.isCancellationRequested && !token.isCancellationRequested) {\n                return OutlineModel.create(registry, textModel, token);\n            }\n            else {\n                return result._compact();\n            }\n        }).finally(() => {\n            cts.dispose();\n            listener.dispose();\n            cts.dispose();\n        });\n    }\n    static _makeOutlineElement(info, container) {\n        const id = TreeElement.findId(info, container);\n        const res = new OutlineElement(id, container, info);\n        if (info.children) {\n            for (const childInfo of info.children) {\n                OutlineModel._makeOutlineElement(childInfo, res);\n            }\n        }\n        container.children.set(res.id, res);\n    }\n    constructor(uri) {\n        super();\n        this.uri = uri;\n        this.id = 'root';\n        this.parent = undefined;\n        this._groups = new Map();\n        this.children = new Map();\n        this.id = 'root';\n        this.parent = undefined;\n    }\n    _compact() {\n        let count = 0;\n        for (const [key, group] of this._groups) {\n            if (group.children.size === 0) { // empty\n                this._groups.delete(key);\n            }\n            else {\n                count += 1;\n            }\n        }\n        if (count !== 1) {\n            //\n            this.children = this._groups;\n        }\n        else {\n            // adopt all elements of the first group\n            const group = Iterable.first(this._groups.values());\n            for (const [, child] of group.children) {\n                child.parent = this;\n                this.children.set(child.id, child);\n            }\n        }\n        return this;\n    }\n    getTopLevelSymbols() {\n        const roots = [];\n        for (const child of this.children.values()) {\n            if (child instanceof OutlineElement) {\n                roots.push(child.symbol);\n            }\n            else {\n                roots.push(...Iterable.map(child.children.values(), child => child.symbol));\n            }\n        }\n        return roots.sort((a, b) => Range.compareRangesUsingStarts(a.range, b.range));\n    }\n    asListOfDocumentSymbols() {\n        const roots = this.getTopLevelSymbols();\n        const bucket = [];\n        OutlineModel._flattenDocumentSymbols(bucket, roots, '');\n        return bucket.sort((a, b) => Position.compare(Range.getStartPosition(a.range), Range.getStartPosition(b.range)) || Position.compare(Range.getEndPosition(b.range), Range.getEndPosition(a.range)));\n    }\n    static _flattenDocumentSymbols(bucket, entries, overrideContainerLabel) {\n        for (const entry of entries) {\n            bucket.push({\n                kind: entry.kind,\n                tags: entry.tags,\n                name: entry.name,\n                detail: entry.detail,\n                containerName: entry.containerName || overrideContainerLabel,\n                range: entry.range,\n                selectionRange: entry.selectionRange,\n                children: undefined, // we flatten it...\n            });\n            // Recurse over children\n            if (entry.children) {\n                OutlineModel._flattenDocumentSymbols(bucket, entry.children, entry.name);\n            }\n        }\n    }\n}\nconst IOutlineModelService = createDecorator('IOutlineModelService');\nlet OutlineModelService = class OutlineModelService {\n    constructor(_languageFeaturesService, debounces, modelService) {\n        this._languageFeaturesService = _languageFeaturesService;\n        this._disposables = new DisposableStore();\n        this._cache = new LRUCache(15, 0.7);\n        this._debounceInformation = debounces.for(_languageFeaturesService.documentSymbolProvider, 'DocumentSymbols', { min: 350 });\n        // don't cache outline models longer than their text model\n        this._disposables.add(modelService.onModelRemoved(textModel => {\n            this._cache.delete(textModel.id);\n        }));\n    }\n    dispose() {\n        this._disposables.dispose();\n    }\n    async getOrCreate(textModel, token) {\n        const registry = this._languageFeaturesService.documentSymbolProvider;\n        const provider = registry.ordered(textModel);\n        let data = this._cache.get(textModel.id);\n        if (!data || data.versionId !== textModel.getVersionId() || !equals(data.provider, provider)) {\n            const source = new CancellationTokenSource();\n            data = {\n                versionId: textModel.getVersionId(),\n                provider,\n                promiseCnt: 0,\n                source,\n                promise: OutlineModel.create(registry, textModel, source.token),\n                model: undefined,\n            };\n            this._cache.set(textModel.id, data);\n            const now = Date.now();\n            data.promise.then(outlineModel => {\n                data.model = outlineModel;\n                this._debounceInformation.update(textModel, Date.now() - now);\n            }).catch(_err => {\n                this._cache.delete(textModel.id);\n            });\n        }\n        if (data.model) {\n            // resolved -> return data\n            return data.model;\n        }\n        // increase usage counter\n        data.promiseCnt += 1;\n        const listener = token.onCancellationRequested(() => {\n            // last -> cancel provider request, remove cached promise\n            if (--data.promiseCnt === 0) {\n                data.source.cancel();\n                this._cache.delete(textModel.id);\n            }\n        });\n        try {\n            return await data.promise;\n        }\n        finally {\n            listener.dispose();\n        }\n    }\n};\nOutlineModelService = __decorate([\n    __param(0, ILanguageFeaturesService),\n    __param(1, ILanguageFeatureDebounceService),\n    __param(2, IModelService)\n], OutlineModelService);\nregisterSingleton(IOutlineModelService, OutlineModelService, 1 /* InstantiationType.Delayed */);\n\nexport { IOutlineModelService, OutlineElement, OutlineGroup, OutlineModel, OutlineModelService, TreeElement };\n","import { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { ITextModelService } from '../../../common/services/resolverService.js';\nimport { IOutlineModelService } from './outlineModel.js';\nimport { CommandsRegistry } from '../../../../platform/commands/common/commands.js';\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 *--------------------------------------------------------------------------------------------*/\nCommandsRegistry.registerCommand('_executeDocumentSymbolProvider', async function (accessor, ...args) {\n    const [resource] = args;\n    assertType(URI.isUri(resource));\n    const outlineService = accessor.get(IOutlineModelService);\n    const modelService = accessor.get(ITextModelService);\n    const reference = await modelService.createModelReference(resource);\n    try {\n        return (await outlineService.getOrCreate(reference.object.textEditorModel, CancellationToken.None)).getTopLevelSymbols();\n    }\n    finally {\n        reference.dispose();\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 *--------------------------------------------------------------------------------------------*/\nconst AccessibleViewRegistry = new class AccessibleViewRegistry {\n    constructor() {\n        this._implementations = [];\n    }\n    register(implementation) {\n        this._implementations.push(implementation);\n        return {\n            dispose: () => {\n                const idx = this._implementations.indexOf(implementation);\n                if (idx !== -1) {\n                    this._implementations.splice(idx, 1);\n                }\n            }\n        };\n    }\n    getImplementations() {\n        return this._implementations;\n    }\n};\n\nexport { AccessibleViewRegistry };\n","import '../../../base/common/observableInternal/index.js';\nimport { IInstantiationService } from '../../instantiation/common/instantiation.js';\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nfunction hotClassGetOriginalInstance(value) {\n    if (value instanceof BaseClass) {\n        // eslint-disable-next-line local/code-no-any-casts\n        return value._instance;\n    }\n    return value;\n}\nclass BaseClass {\n    constructor(instantiationService) {\n        this.instantiationService = instantiationService;\n    }\n    init(...params) { }\n}\n/**\n * Wrap a class in a reloadable wrapper.\n * When the wrapper is created, the original class is created.\n * When the original class changes, the instance is re-created.\n*/\nfunction wrapInHotClass1(clazz) {\n    return clazz.get() ;\n}\nlet BaseClass1 = class BaseClass1 extends BaseClass {\n    constructor(param1, i) { super(i); this.init(param1); }\n};\nBaseClass1 = __decorate([\n    __param(1, IInstantiationService)\n], BaseClass1);\n\nexport { hotClassGetOriginalInstance, wrapInHotClass1 };\n","import { mapFilter } from './arrays.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ValidatorBase {\n    validateOrThrow(content) {\n        const result = this.validate(content);\n        if (result.error) {\n            throw new Error(result.error.message);\n        }\n        return result.content;\n    }\n}\nclass TypeofValidator extends ValidatorBase {\n    constructor(type) {\n        super();\n        this.type = type;\n    }\n    validate(content) {\n        if (typeof content !== this.type) {\n            return { content: undefined, error: { message: `Expected ${this.type}, but got ${typeof content}` } };\n        }\n        return { content: content, error: undefined };\n    }\n    getJSONSchema() {\n        return { type: this.type };\n    }\n}\nconst vStringValidator = new TypeofValidator('string');\nfunction vString() { return vStringValidator; }\nnew TypeofValidator('number');\nconst vBooleanValidator = new TypeofValidator('boolean');\nfunction vBoolean() { return vBooleanValidator; }\nnew TypeofValidator('object');\nclass UndefinedValidator extends ValidatorBase {\n    validate(content) {\n        if (content !== undefined) {\n            return { content: undefined, error: { message: `Expected undefined, but got ${typeof content}` } };\n        }\n        return { content: undefined, error: undefined };\n    }\n    getJSONSchema() {\n        return {};\n    }\n}\nfunction vUndefined() {\n    return new UndefinedValidator();\n}\nclass Optional {\n    constructor(validator) {\n        this.validator = validator;\n    }\n}\nfunction vOptionalProp(validator) {\n    return new Optional(validator);\n}\nclass ObjValidator extends ValidatorBase {\n    constructor(properties) {\n        super();\n        this.properties = properties;\n    }\n    validate(content) {\n        if (typeof content !== 'object' || content === null) {\n            return { content: undefined, error: { message: 'Expected object' } };\n        }\n        // eslint-disable-next-line local/code-no-dangerous-type-assertions\n        const result = {};\n        for (const key in this.properties) {\n            const prop = this.properties[key];\n            // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n            const fieldValue = content[key];\n            const isOptional = prop instanceof Optional;\n            const validator = isOptional ? prop.validator : prop;\n            if (isOptional && fieldValue === undefined) {\n                // Optional field not provided, skip validation\n                continue;\n            }\n            const { content: value, error } = validator.validate(fieldValue);\n            if (error) {\n                return { content: undefined, error: { message: `Error in property '${key}': ${error.message}` } };\n            }\n            // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n            result[key] = value;\n        }\n        return { content: result, error: undefined };\n    }\n    getJSONSchema() {\n        const requiredFields = [];\n        const schemaProperties = {};\n        for (const [key, prop] of Object.entries(this.properties)) {\n            const isOptional = prop instanceof Optional;\n            const validator = isOptional ? prop.validator : prop;\n            schemaProperties[key] = validator.getJSONSchema();\n            if (!isOptional) {\n                requiredFields.push(key);\n            }\n        }\n        const schema = {\n            type: 'object',\n            properties: schemaProperties,\n            ...(requiredFields.length > 0 ? { required: requiredFields } : {})\n        };\n        return schema;\n    }\n}\nfunction vObj(properties) {\n    return new ObjValidator(properties);\n}\nclass UnionValidator extends ValidatorBase {\n    constructor(validators) {\n        super();\n        this.validators = validators;\n    }\n    validate(content) {\n        let lastError;\n        for (const validator of this.validators) {\n            const { content: value, error } = validator.validate(content);\n            if (!error) {\n                // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n                return { content: value, error: undefined };\n            }\n            lastError = error;\n        }\n        return { content: undefined, error: lastError };\n    }\n    getJSONSchema() {\n        return {\n            oneOf: mapFilter(this.validators, validator => {\n                if (validator instanceof UndefinedValidator) {\n                    return undefined;\n                }\n                return validator.getJSONSchema();\n            }),\n        };\n    }\n}\nfunction vUnion(...validators) {\n    return new UnionValidator(validators);\n}\nclass UseRefSchemaValidator extends ValidatorBase {\n    constructor(_ref, _validator) {\n        super();\n        this._ref = _ref;\n        this._validator = _validator;\n    }\n    validate(content) {\n        return this._validator.validate(content);\n    }\n    getJSONSchema() {\n        return { $ref: this._ref };\n    }\n}\nfunction vWithJsonSchemaRef(ref, validator) {\n    return new UseRefSchemaValidator(ref, validator);\n}\n\nexport { Optional, ValidatorBase, vBoolean, vObj, vOptionalProp, vString, vUndefined, vUnion, vWithJsonSchemaRef };\n","import { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError, CancellationError, isCancellationError } from '../../../../base/common/errors.js';\nimport { FuzzyScore } from '../../../../base/common/filters.js';\nimport { DisposableStore, isDisposable } from '../../../../base/common/lifecycle.js';\nimport { StopWatch } from '../../../../base/common/stopwatch.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { ITextModelService } from '../../../common/services/resolverService.js';\nimport { SnippetParser } from '../../snippet/browser/snippetParser.js';\nimport { localize } from '../../../../nls.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { CommandsRegistry } from '../../../../platform/commands/common/commands.js';\nimport { RawContextKey } from '../../../../platform/contextkey/common/contextkey.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { historyNavigationVisible } from '../../../../platform/history/browser/contextScopedHistoryWidget.js';\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 *--------------------------------------------------------------------------------------------*/\nconst Context = {\n    Visible: historyNavigationVisible,\n    HasFocusedSuggestion: new RawContextKey('suggestWidgetHasFocusedSuggestion', false, localize(1455, \"Whether any suggestion is focused\")),\n    DetailsVisible: new RawContextKey('suggestWidgetDetailsVisible', false, localize(1456, \"Whether suggestion details are visible\")),\n    MultipleSuggestions: new RawContextKey('suggestWidgetMultipleSuggestions', false, localize(1457, \"Whether there are multiple suggestions to pick from\")),\n    MakesTextEdit: new RawContextKey('suggestionMakesTextEdit', true, localize(1458, \"Whether inserting the current suggestion yields in a change or has everything already been typed\")),\n    AcceptSuggestionsOnEnter: new RawContextKey('acceptSuggestionOnEnter', true, localize(1459, \"Whether suggestions are inserted when pressing Enter\")),\n    HasInsertAndReplaceRange: new RawContextKey('suggestionHasInsertAndReplaceRange', false, localize(1460, \"Whether the current suggestion has insert and replace behaviour\")),\n    InsertMode: new RawContextKey('suggestionInsertMode', undefined, { type: 'string', description: localize(1461, \"Whether the default behaviour is to insert or replace\") }),\n    CanResolve: new RawContextKey('suggestionCanResolve', false, localize(1462, \"Whether the current suggestion supports to resolve further details\")),\n};\nconst suggestWidgetStatusbarMenu = new MenuId('suggestWidgetStatusBar');\nclass CompletionItem {\n    constructor(position, completion, container, provider) {\n        this.position = position;\n        this.completion = completion;\n        this.container = container;\n        this.provider = provider;\n        // validation\n        this.isInvalid = false;\n        // sorting, filtering\n        this.score = FuzzyScore.Default;\n        this.distance = 0;\n        this.textLabel = typeof completion.label === 'string'\n            ? completion.label\n            : completion.label?.label;\n        // ensure lower-variants (perf)\n        this.labelLow = this.textLabel.toLowerCase();\n        // validate label\n        this.isInvalid = !this.textLabel;\n        this.sortTextLow = completion.sortText && completion.sortText.toLowerCase();\n        this.filterTextLow = completion.filterText && completion.filterText.toLowerCase();\n        this.extensionId = completion.extensionId;\n        // normalize ranges\n        if (Range.isIRange(completion.range)) {\n            this.editStart = new Position(completion.range.startLineNumber, completion.range.startColumn);\n            this.editInsertEnd = new Position(completion.range.endLineNumber, completion.range.endColumn);\n            this.editReplaceEnd = new Position(completion.range.endLineNumber, completion.range.endColumn);\n            // validate range\n            this.isInvalid = this.isInvalid\n                || Range.spansMultipleLines(completion.range) || completion.range.startLineNumber !== position.lineNumber;\n        }\n        else {\n            this.editStart = new Position(completion.range.insert.startLineNumber, completion.range.insert.startColumn);\n            this.editInsertEnd = new Position(completion.range.insert.endLineNumber, completion.range.insert.endColumn);\n            this.editReplaceEnd = new Position(completion.range.replace.endLineNumber, completion.range.replace.endColumn);\n            // validate ranges\n            this.isInvalid = this.isInvalid\n                || Range.spansMultipleLines(completion.range.insert) || Range.spansMultipleLines(completion.range.replace)\n                || completion.range.insert.startLineNumber !== position.lineNumber || completion.range.replace.startLineNumber !== position.lineNumber\n                || completion.range.insert.startColumn !== completion.range.replace.startColumn;\n        }\n        // create the suggestion resolver\n        if (typeof provider.resolveCompletionItem !== 'function') {\n            this._resolveCache = Promise.resolve();\n            this._resolveDuration = 0;\n        }\n    }\n    // ---- resolving\n    get isResolved() {\n        return this._resolveDuration !== undefined;\n    }\n    get resolveDuration() {\n        return this._resolveDuration !== undefined ? this._resolveDuration : -1;\n    }\n    async resolve(token) {\n        if (!this._resolveCache) {\n            const sub = token.onCancellationRequested(() => {\n                this._resolveCache = undefined;\n                this._resolveDuration = undefined;\n            });\n            const sw = new StopWatch(true);\n            this._resolveCache = Promise.resolve(this.provider.resolveCompletionItem(this.completion, token)).then(value => {\n                Object.assign(this.completion, value);\n                this._resolveDuration = sw.elapsed();\n            }, err => {\n                if (isCancellationError(err)) {\n                    // the IPC queue will reject the request with the\n                    // cancellation error -> reset cached\n                    this._resolveCache = undefined;\n                    this._resolveDuration = undefined;\n                }\n            }).finally(() => {\n                sub.dispose();\n            });\n        }\n        return this._resolveCache;\n    }\n}\nclass CompletionOptions {\n    static { this.default = new CompletionOptions(); }\n    constructor(snippetSortOrder = 2 /* SnippetSortOrder.Bottom */, kindFilter = new Set(), providerFilter = new Set(), providerItemsToReuse = new Map(), showDeprecated = true) {\n        this.snippetSortOrder = snippetSortOrder;\n        this.kindFilter = kindFilter;\n        this.providerFilter = providerFilter;\n        this.providerItemsToReuse = providerItemsToReuse;\n        this.showDeprecated = showDeprecated;\n    }\n}\nclass CompletionItemModel {\n    constructor(items, needsClipboard, durations, disposable) {\n        this.items = items;\n        this.needsClipboard = needsClipboard;\n        this.durations = durations;\n        this.disposable = disposable;\n    }\n}\nasync function provideSuggestionItems(registry, model, position, options = CompletionOptions.default, context = { triggerKind: 0 /* languages.CompletionTriggerKind.Invoke */ }, token = CancellationToken.None) {\n    const sw = new StopWatch();\n    position = position.clone();\n    const word = model.getWordAtPosition(position);\n    const defaultReplaceRange = word ? new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn) : Range.fromPositions(position);\n    const defaultRange = { replace: defaultReplaceRange, insert: defaultReplaceRange.setEndPosition(position.lineNumber, position.column) };\n    const result = [];\n    const disposables = new DisposableStore();\n    const durations = [];\n    let needsClipboard = false;\n    const onCompletionList = (provider, container, sw) => {\n        let didAddResult = false;\n        if (!container) {\n            return didAddResult;\n        }\n        for (const suggestion of container.suggestions) {\n            if (!options.kindFilter.has(suggestion.kind)) {\n                // skip if not showing deprecated suggestions\n                if (!options.showDeprecated && suggestion?.tags?.includes(1 /* languages.CompletionItemTag.Deprecated */)) {\n                    continue;\n                }\n                // fill in default range when missing\n                if (!suggestion.range) {\n                    suggestion.range = defaultRange;\n                }\n                // fill in default sortText when missing\n                if (!suggestion.sortText) {\n                    suggestion.sortText = typeof suggestion.label === 'string' ? suggestion.label : suggestion.label.label;\n                }\n                if (!needsClipboard && suggestion.insertTextRules && suggestion.insertTextRules & 4 /* languages.CompletionItemInsertTextRule.InsertAsSnippet */) {\n                    needsClipboard = SnippetParser.guessNeedsClipboard(suggestion.insertText);\n                }\n                result.push(new CompletionItem(position, suggestion, container, provider));\n                didAddResult = true;\n            }\n        }\n        if (isDisposable(container)) {\n            disposables.add(container);\n        }\n        durations.push({\n            providerName: provider._debugDisplayName ?? 'unknown_provider', elapsedProvider: container.duration ?? -1, elapsedOverall: sw.elapsed()\n        });\n        return didAddResult;\n    };\n    // ask for snippets in parallel to asking \"real\" providers. Only do something if configured to\n    // do so - no snippet filter, no special-providers-only request\n    const snippetCompletions = (async () => {\n        {\n            return;\n        }\n    })();\n    // add suggestions from contributed providers - providers are ordered in groups of\n    // equal score and once a group produces a result the process stops\n    // get provider groups, always add snippet suggestion provider\n    for (const providerGroup of registry.orderedGroups(model)) {\n        // for each support in the group ask for suggestions\n        let didAddResult = false;\n        await Promise.all(providerGroup.map(async (provider) => {\n            // we have items from a previous session that we can reuse\n            if (options.providerItemsToReuse.has(provider)) {\n                const items = options.providerItemsToReuse.get(provider);\n                items.forEach(item => result.push(item));\n                didAddResult = didAddResult || items.length > 0;\n                return;\n            }\n            // check if this provider is filtered out\n            if (options.providerFilter.size > 0 && !options.providerFilter.has(provider)) {\n                return;\n            }\n            try {\n                const sw = new StopWatch();\n                const list = await provider.provideCompletionItems(model, position, context, token);\n                didAddResult = onCompletionList(provider, list, sw) || didAddResult;\n            }\n            catch (err) {\n                onUnexpectedExternalError(err);\n            }\n        }));\n        if (didAddResult || token.isCancellationRequested) {\n            break;\n        }\n    }\n    await snippetCompletions;\n    if (token.isCancellationRequested) {\n        disposables.dispose();\n        return Promise.reject(new CancellationError());\n    }\n    return new CompletionItemModel(result.sort(getSuggestionComparator(options.snippetSortOrder)), needsClipboard, { entries: durations, elapsed: sw.elapsed() }, disposables);\n}\nfunction defaultComparator(a, b) {\n    // check with 'sortText'\n    if (a.sortTextLow && b.sortTextLow) {\n        if (a.sortTextLow < b.sortTextLow) {\n            return -1;\n        }\n        else if (a.sortTextLow > b.sortTextLow) {\n            return 1;\n        }\n    }\n    // check with 'label'\n    if (a.textLabel < b.textLabel) {\n        return -1;\n    }\n    else if (a.textLabel > b.textLabel) {\n        return 1;\n    }\n    // check with 'type'\n    return a.completion.kind - b.completion.kind;\n}\nfunction snippetUpComparator(a, b) {\n    if (a.completion.kind !== b.completion.kind) {\n        if (a.completion.kind === 28 /* languages.CompletionItemKind.Snippet */) {\n            return -1;\n        }\n        else if (b.completion.kind === 28 /* languages.CompletionItemKind.Snippet */) {\n            return 1;\n        }\n    }\n    return defaultComparator(a, b);\n}\nfunction snippetDownComparator(a, b) {\n    if (a.completion.kind !== b.completion.kind) {\n        if (a.completion.kind === 28 /* languages.CompletionItemKind.Snippet */) {\n            return 1;\n        }\n        else if (b.completion.kind === 28 /* languages.CompletionItemKind.Snippet */) {\n            return -1;\n        }\n    }\n    return defaultComparator(a, b);\n}\nconst _snippetComparators = new Map();\n_snippetComparators.set(0 /* SnippetSortOrder.Top */, snippetUpComparator);\n_snippetComparators.set(2 /* SnippetSortOrder.Bottom */, snippetDownComparator);\n_snippetComparators.set(1 /* SnippetSortOrder.Inline */, defaultComparator);\nfunction getSuggestionComparator(snippetConfig) {\n    return _snippetComparators.get(snippetConfig);\n}\nCommandsRegistry.registerCommand('_executeCompletionItemProvider', async (accessor, ...args) => {\n    const [uri, position, triggerCharacter, maxItemsToResolve] = args;\n    assertType(URI.isUri(uri));\n    assertType(Position.isIPosition(position));\n    assertType(typeof triggerCharacter === 'string' || !triggerCharacter);\n    assertType(typeof maxItemsToResolve === 'number' || !maxItemsToResolve);\n    const { completionProvider } = accessor.get(ILanguageFeaturesService);\n    const ref = await accessor.get(ITextModelService).createModelReference(uri);\n    try {\n        const result = {\n            incomplete: false,\n            suggestions: []\n        };\n        const resolving = [];\n        const actualPosition = ref.object.textEditorModel.validatePosition(position);\n        const completions = await provideSuggestionItems(completionProvider, ref.object.textEditorModel, actualPosition, undefined, { triggerCharacter: triggerCharacter ?? undefined, triggerKind: triggerCharacter ? 1 /* languages.CompletionTriggerKind.TriggerCharacter */ : 0 /* languages.CompletionTriggerKind.Invoke */ });\n        for (const item of completions.items) {\n            if (resolving.length < (maxItemsToResolve ?? 0)) {\n                resolving.push(item.resolve(CancellationToken.None));\n            }\n            result.incomplete = result.incomplete || item.container.incomplete;\n            result.suggestions.push(item.completion);\n        }\n        try {\n            await Promise.all(resolving);\n            return result;\n        }\n        finally {\n            setTimeout(() => completions.disposable.dispose(), 100);\n        }\n    }\n    finally {\n        ref.dispose();\n    }\n});\nfunction showSimpleSuggestions(editor, provider) {\n    editor.getContribution('editor.contrib.suggestController')?.triggerSuggest(new Set().add(provider), undefined, true);\n}\nclass QuickSuggestionsOptions {\n    static isAllOff(config) {\n        return config.other === 'off' && config.comments === 'off' && config.strings === 'off';\n    }\n    static isAllOn(config) {\n        return config.other === 'on' && config.comments === 'on' && config.strings === 'on';\n    }\n    static valueFor(config, tokenType) {\n        switch (tokenType) {\n            case 1 /* StandardTokenType.Comment */: return config.comments;\n            case 2 /* StandardTokenType.String */: return config.strings;\n            default: return config.other;\n        }\n    }\n}\n\nexport { CompletionItem, CompletionItemModel, CompletionOptions, Context, QuickSuggestionsOptions, getSuggestionComparator, provideSuggestionItems, showSimpleSuggestions, suggestWidgetStatusbarMenu };\n","import { RawContextKey } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { localize } from '../../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nclass InlineCompletionContextKeys {\n    static { this.inlineSuggestionVisible = new RawContextKey('inlineSuggestionVisible', false, localize(1192, \"Whether an inline suggestion is visible\")); }\n    static { this.inlineSuggestionHasIndentation = new RawContextKey('inlineSuggestionHasIndentation', false, localize(1193, \"Whether the inline suggestion starts with whitespace\")); }\n    static { this.inlineSuggestionHasIndentationLessThanTabSize = new RawContextKey('inlineSuggestionHasIndentationLessThanTabSize', true, localize(1194, \"Whether the inline suggestion starts with whitespace that is less than what would be inserted by tab\")); }\n    static { this.suppressSuggestions = new RawContextKey('inlineSuggestionSuppressSuggestions', undefined, localize(1195, \"Whether suggestions should be suppressed for the current suggestion\")); }\n    static { this.cursorBeforeGhostText = new RawContextKey('cursorBeforeGhostText', false, localize(1196, \"Whether the cursor is at ghost text\")); }\n    static { this.cursorInIndentation = new RawContextKey('cursorInIndentation', false, localize(1197, \"Whether the cursor is in indentation\")); }\n    static { this.hasSelection = new RawContextKey('editor.hasSelection', false, localize(1198, \"Whether the editor has a selection\")); }\n    static { this.cursorAtInlineEdit = new RawContextKey('cursorAtInlineEdit', false, localize(1199, \"Whether the cursor is at an inline edit\")); }\n    static { this.inlineEditVisible = new RawContextKey('inlineEditIsVisible', false, localize(1200, \"Whether an inline edit is visible\")); }\n    static { this.tabShouldJumpToInlineEdit = new RawContextKey('tabShouldJumpToInlineEdit', false, localize(1201, \"Whether tab should jump to an inline edit.\")); }\n    static { this.tabShouldAcceptInlineEdit = new RawContextKey('tabShouldAcceptInlineEdit', false, localize(1202, \"Whether tab should accept the inline edit.\")); }\n    static { this.inInlineEditsPreviewEditor = new RawContextKey('inInlineEditsPreviewEditor', true, localize(1203, \"Whether the current code editor is showing an inline edits preview\")); }\n}\n\nexport { InlineCompletionContextKeys };\n","import { lastNonWhitespaceIndex } from '../../../base/common/strings.js';\nimport { EditOperation } from '../core/editOperation.js';\nimport { Range } from '../core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nclass TrimTrailingWhitespaceCommand {\n    constructor(selection, cursors, trimInRegexesAndStrings) {\n        this._selection = selection;\n        this._cursors = cursors;\n        this._selectionId = null;\n        this._trimInRegexesAndStrings = trimInRegexesAndStrings;\n    }\n    getEditOperations(model, builder) {\n        const ops = trimTrailingWhitespace(model, this._cursors, this._trimInRegexesAndStrings);\n        for (let i = 0, len = ops.length; i < len; i++) {\n            const op = ops[i];\n            builder.addEditOperation(op.range, op.text);\n        }\n        this._selectionId = builder.trackSelection(this._selection);\n    }\n    computeCursorState(model, helper) {\n        return helper.getTrackedSelection(this._selectionId);\n    }\n}\n/**\n * Generate commands for trimming trailing whitespace on a model and ignore lines on which cursors are sitting.\n */\nfunction trimTrailingWhitespace(model, cursors, trimInRegexesAndStrings) {\n    // Sort cursors ascending\n    cursors.sort((a, b) => {\n        if (a.lineNumber === b.lineNumber) {\n            return a.column - b.column;\n        }\n        return a.lineNumber - b.lineNumber;\n    });\n    // Reduce multiple cursors on the same line and only keep the last one on the line\n    for (let i = cursors.length - 2; i >= 0; i--) {\n        if (cursors[i].lineNumber === cursors[i + 1].lineNumber) {\n            // Remove cursor at `i`\n            cursors.splice(i, 1);\n        }\n    }\n    const r = [];\n    let rLen = 0;\n    let cursorIndex = 0;\n    const cursorLen = cursors.length;\n    for (let lineNumber = 1, lineCount = model.getLineCount(); lineNumber <= lineCount; lineNumber++) {\n        const lineContent = model.getLineContent(lineNumber);\n        const maxLineColumn = lineContent.length + 1;\n        let minEditColumn = 0;\n        if (cursorIndex < cursorLen && cursors[cursorIndex].lineNumber === lineNumber) {\n            minEditColumn = cursors[cursorIndex].column;\n            cursorIndex++;\n            if (minEditColumn === maxLineColumn) {\n                // The cursor is at the end of the line => no edits for sure on this line\n                continue;\n            }\n        }\n        if (lineContent.length === 0) {\n            continue;\n        }\n        const lastNonWhitespaceIndex$1 = lastNonWhitespaceIndex(lineContent);\n        let fromColumn = 0;\n        if (lastNonWhitespaceIndex$1 === -1) {\n            // Entire line is whitespace\n            fromColumn = 1;\n        }\n        else if (lastNonWhitespaceIndex$1 !== lineContent.length - 1) {\n            // There is trailing whitespace\n            fromColumn = lastNonWhitespaceIndex$1 + 2;\n        }\n        else {\n            // There is no trailing whitespace\n            continue;\n        }\n        if (!trimInRegexesAndStrings) {\n            if (!model.tokenization.hasAccurateTokensForLine(lineNumber)) {\n                // We don't want to force line tokenization, as that can be expensive, but we also don't want to trim\n                // trailing whitespace in lines that are not tokenized yet, as that can be wrong and trim whitespace from\n                // lines that the user requested we don't. So we bail out if the tokens are not accurate for this line.\n                continue;\n            }\n            const lineTokens = model.tokenization.getLineTokens(lineNumber);\n            const fromColumnType = lineTokens.getStandardTokenType(lineTokens.findTokenIndexAtOffset(fromColumn));\n            if (fromColumnType === 2 /* StandardTokenType.String */ || fromColumnType === 3 /* StandardTokenType.RegEx */) {\n                continue;\n            }\n        }\n        fromColumn = Math.max(minEditColumn, fromColumn);\n        r[rLen++] = EditOperation.delete(new Range(lineNumber, fromColumn, lineNumber, maxLineColumn));\n    }\n    return r;\n}\n\nexport { TrimTrailingWhitespaceCommand, trimTrailingWhitespace };\n","import { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CopyLinesCommand {\n    constructor(selection, isCopyingDown, noop) {\n        this._selection = selection;\n        this._isCopyingDown = isCopyingDown;\n        this._noop = noop || false;\n        this._selectionDirection = 0 /* SelectionDirection.LTR */;\n        this._selectionId = null;\n        this._startLineNumberDelta = 0;\n        this._endLineNumberDelta = 0;\n    }\n    getEditOperations(model, builder) {\n        let s = this._selection;\n        this._startLineNumberDelta = 0;\n        this._endLineNumberDelta = 0;\n        if (s.startLineNumber < s.endLineNumber && s.endColumn === 1) {\n            this._endLineNumberDelta = 1;\n            s = s.setEndPosition(s.endLineNumber - 1, model.getLineMaxColumn(s.endLineNumber - 1));\n        }\n        const sourceLines = [];\n        for (let i = s.startLineNumber; i <= s.endLineNumber; i++) {\n            sourceLines.push(model.getLineContent(i));\n        }\n        const sourceText = sourceLines.join('\\n');\n        if (sourceText === '') {\n            // Duplicating empty line\n            if (this._isCopyingDown) {\n                this._startLineNumberDelta++;\n                this._endLineNumberDelta++;\n            }\n        }\n        if (this._noop) {\n            builder.addEditOperation(new Range(s.endLineNumber, model.getLineMaxColumn(s.endLineNumber), s.endLineNumber + 1, 1), s.endLineNumber === model.getLineCount() ? '' : '\\n');\n        }\n        else {\n            if (!this._isCopyingDown) {\n                builder.addEditOperation(new Range(s.endLineNumber, model.getLineMaxColumn(s.endLineNumber), s.endLineNumber, model.getLineMaxColumn(s.endLineNumber)), '\\n' + sourceText);\n            }\n            else {\n                builder.addEditOperation(new Range(s.startLineNumber, 1, s.startLineNumber, 1), sourceText + '\\n');\n            }\n        }\n        this._selectionId = builder.trackSelection(s);\n        this._selectionDirection = this._selection.getDirection();\n    }\n    computeCursorState(model, helper) {\n        let result = helper.getTrackedSelection(this._selectionId);\n        if (this._startLineNumberDelta !== 0 || this._endLineNumberDelta !== 0) {\n            let startLineNumber = result.startLineNumber;\n            let startColumn = result.startColumn;\n            let endLineNumber = result.endLineNumber;\n            let endColumn = result.endColumn;\n            if (this._startLineNumberDelta !== 0) {\n                startLineNumber = startLineNumber + this._startLineNumberDelta;\n                startColumn = 1;\n            }\n            if (this._endLineNumberDelta !== 0) {\n                endLineNumber = endLineNumber + this._endLineNumberDelta;\n                endColumn = 1;\n            }\n            result = Selection.createWithDirection(startLineNumber, startColumn, endLineNumber, endColumn, this._selectionDirection);\n        }\n        return result;\n    }\n}\n\nexport { CopyLinesCommand };\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 *--------------------------------------------------------------------------------------------*/\nfunction getSpaceCnt(str, tabSize) {\n    let spacesCnt = 0;\n    for (let i = 0; i < str.length; i++) {\n        if (str.charAt(i) === '\\t') {\n            spacesCnt += tabSize;\n        }\n        else {\n            spacesCnt++;\n        }\n    }\n    return spacesCnt;\n}\nfunction generateIndent(spacesCnt, tabSize, insertSpaces) {\n    spacesCnt = spacesCnt < 0 ? 0 : spacesCnt;\n    let result = '';\n    if (!insertSpaces) {\n        const tabsCnt = Math.floor(spacesCnt / tabSize);\n        spacesCnt = spacesCnt % tabSize;\n        for (let i = 0; i < tabsCnt; i++) {\n            result += '\\t';\n        }\n    }\n    for (let i = 0; i < spacesCnt; i++) {\n        result += ' ';\n    }\n    return result;\n}\n\nexport { generateIndent, getSpaceCnt };\n","import { getLeadingWhitespace, lastNonWhitespaceIndex } from '../../../../base/common/strings.js';\nimport { ShiftCommand } from '../../../common/commands/shiftCommand.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { IndentAction } from '../../../common/languages/languageConfiguration.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { getSpaceCnt, generateIndent } from '../../indentation/common/indentUtils.js';\nimport { getGoodIndentForLine, getIndentMetadata } from '../../../common/languages/autoIndent.js';\nimport { getEnterAction } from '../../../common/languages/enterAction.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet MoveLinesCommand = class MoveLinesCommand {\n    constructor(selection, isMovingDown, autoIndent, _languageConfigurationService) {\n        this._languageConfigurationService = _languageConfigurationService;\n        this._selection = selection;\n        this._isMovingDown = isMovingDown;\n        this._autoIndent = autoIndent;\n        this._selectionId = null;\n        this._moveEndLineSelectionShrink = false;\n    }\n    getEditOperations(model, builder) {\n        const getLanguageId = () => {\n            return model.getLanguageId();\n        };\n        const getLanguageIdAtPosition = (lineNumber, column) => {\n            return model.getLanguageIdAtPosition(lineNumber, column);\n        };\n        const modelLineCount = model.getLineCount();\n        if (this._isMovingDown && this._selection.endLineNumber === modelLineCount) {\n            this._selectionId = builder.trackSelection(this._selection);\n            return;\n        }\n        if (!this._isMovingDown && this._selection.startLineNumber === 1) {\n            this._selectionId = builder.trackSelection(this._selection);\n            return;\n        }\n        this._moveEndPositionDown = false;\n        let s = this._selection;\n        if (s.startLineNumber < s.endLineNumber && s.endColumn === 1) {\n            this._moveEndPositionDown = true;\n            s = s.setEndPosition(s.endLineNumber - 1, model.getLineMaxColumn(s.endLineNumber - 1));\n        }\n        const { tabSize, indentSize, insertSpaces } = model.getOptions();\n        const indentConverter = this.buildIndentConverter(tabSize, indentSize, insertSpaces);\n        if (s.startLineNumber === s.endLineNumber && model.getLineMaxColumn(s.startLineNumber) === 1) {\n            // Current line is empty\n            const lineNumber = s.startLineNumber;\n            const otherLineNumber = (this._isMovingDown ? lineNumber + 1 : lineNumber - 1);\n            if (model.getLineMaxColumn(otherLineNumber) === 1) {\n                // Other line number is empty too, so no editing is needed\n                // Add a no-op to force running by the model\n                builder.addEditOperation(new Range(1, 1, 1, 1), null);\n            }\n            else {\n                // Type content from other line number on line number\n                builder.addEditOperation(new Range(lineNumber, 1, lineNumber, 1), model.getLineContent(otherLineNumber));\n                // Remove content from other line number\n                builder.addEditOperation(new Range(otherLineNumber, 1, otherLineNumber, model.getLineMaxColumn(otherLineNumber)), null);\n            }\n            // Track selection at the other line number\n            s = new Selection(otherLineNumber, 1, otherLineNumber, 1);\n        }\n        else {\n            let movingLineNumber;\n            let movingLineText;\n            if (this._isMovingDown) {\n                movingLineNumber = s.endLineNumber + 1;\n                movingLineText = model.getLineContent(movingLineNumber);\n                // Delete line that needs to be moved\n                builder.addEditOperation(new Range(movingLineNumber - 1, model.getLineMaxColumn(movingLineNumber - 1), movingLineNumber, model.getLineMaxColumn(movingLineNumber)), null);\n                let insertingText = movingLineText;\n                if (this.shouldAutoIndent(model, s)) {\n                    const movingLineMatchResult = this.matchEnterRule(model, indentConverter, tabSize, movingLineNumber, s.startLineNumber - 1);\n                    // if s.startLineNumber - 1 matches onEnter rule, we still honor that.\n                    if (movingLineMatchResult !== null) {\n                        const oldIndentation = getLeadingWhitespace(model.getLineContent(movingLineNumber));\n                        const newSpaceCnt = movingLineMatchResult + getSpaceCnt(oldIndentation, tabSize);\n                        const newIndentation = generateIndent(newSpaceCnt, tabSize, insertSpaces);\n                        insertingText = newIndentation + this.trimStart(movingLineText);\n                    }\n                    else {\n                        // no enter rule matches, let's check indentatin rules then.\n                        const virtualModel = {\n                            tokenization: {\n                                getLineTokens: (lineNumber) => {\n                                    if (lineNumber === s.startLineNumber) {\n                                        return model.tokenization.getLineTokens(movingLineNumber);\n                                    }\n                                    else {\n                                        return model.tokenization.getLineTokens(lineNumber);\n                                    }\n                                },\n                                getLanguageId,\n                                getLanguageIdAtPosition,\n                            },\n                            getLineContent: (lineNumber) => {\n                                if (lineNumber === s.startLineNumber) {\n                                    return model.getLineContent(movingLineNumber);\n                                }\n                                else {\n                                    return model.getLineContent(lineNumber);\n                                }\n                            },\n                        };\n                        const indentOfMovingLine = getGoodIndentForLine(this._autoIndent, virtualModel, model.getLanguageIdAtPosition(movingLineNumber, 1), s.startLineNumber, indentConverter, this._languageConfigurationService);\n                        if (indentOfMovingLine !== null) {\n                            const oldIndentation = getLeadingWhitespace(model.getLineContent(movingLineNumber));\n                            const newSpaceCnt = getSpaceCnt(indentOfMovingLine, tabSize);\n                            const oldSpaceCnt = getSpaceCnt(oldIndentation, tabSize);\n                            if (newSpaceCnt !== oldSpaceCnt) {\n                                const newIndentation = generateIndent(newSpaceCnt, tabSize, insertSpaces);\n                                insertingText = newIndentation + this.trimStart(movingLineText);\n                            }\n                        }\n                    }\n                    // add edit operations for moving line first to make sure it's executed after we make indentation change\n                    // to s.startLineNumber\n                    builder.addEditOperation(new Range(s.startLineNumber, 1, s.startLineNumber, 1), insertingText + '\\n');\n                    const ret = this.matchEnterRuleMovingDown(model, indentConverter, tabSize, s.startLineNumber, movingLineNumber, insertingText);\n                    // check if the line being moved before matches onEnter rules, if so let's adjust the indentation by onEnter rules.\n                    if (ret !== null) {\n                        if (ret !== 0) {\n                            this.getIndentEditsOfMovingBlock(model, builder, s, tabSize, insertSpaces, ret);\n                        }\n                    }\n                    else {\n                        // it doesn't match onEnter rules, let's check indentation rules then.\n                        const virtualModel = {\n                            tokenization: {\n                                getLineTokens: (lineNumber) => {\n                                    if (lineNumber === s.startLineNumber) {\n                                        // TODO@aiday-mar: the tokens here don't correspond exactly to the corresponding content (after indentation adjustment), have to fix this.\n                                        return model.tokenization.getLineTokens(movingLineNumber);\n                                    }\n                                    else if (lineNumber >= s.startLineNumber + 1 && lineNumber <= s.endLineNumber + 1) {\n                                        return model.tokenization.getLineTokens(lineNumber - 1);\n                                    }\n                                    else {\n                                        return model.tokenization.getLineTokens(lineNumber);\n                                    }\n                                },\n                                getLanguageId,\n                                getLanguageIdAtPosition,\n                            },\n                            getLineContent: (lineNumber) => {\n                                if (lineNumber === s.startLineNumber) {\n                                    return insertingText;\n                                }\n                                else if (lineNumber >= s.startLineNumber + 1 && lineNumber <= s.endLineNumber + 1) {\n                                    return model.getLineContent(lineNumber - 1);\n                                }\n                                else {\n                                    return model.getLineContent(lineNumber);\n                                }\n                            },\n                        };\n                        const newIndentatOfMovingBlock = getGoodIndentForLine(this._autoIndent, virtualModel, model.getLanguageIdAtPosition(movingLineNumber, 1), s.startLineNumber + 1, indentConverter, this._languageConfigurationService);\n                        if (newIndentatOfMovingBlock !== null) {\n                            const oldIndentation = getLeadingWhitespace(model.getLineContent(s.startLineNumber));\n                            const newSpaceCnt = getSpaceCnt(newIndentatOfMovingBlock, tabSize);\n                            const oldSpaceCnt = getSpaceCnt(oldIndentation, tabSize);\n                            if (newSpaceCnt !== oldSpaceCnt) {\n                                const spaceCntOffset = newSpaceCnt - oldSpaceCnt;\n                                this.getIndentEditsOfMovingBlock(model, builder, s, tabSize, insertSpaces, spaceCntOffset);\n                            }\n                        }\n                    }\n                }\n                else {\n                    // Insert line that needs to be moved before\n                    builder.addEditOperation(new Range(s.startLineNumber, 1, s.startLineNumber, 1), insertingText + '\\n');\n                }\n            }\n            else {\n                movingLineNumber = s.startLineNumber - 1;\n                movingLineText = model.getLineContent(movingLineNumber);\n                // Delete line that needs to be moved\n                builder.addEditOperation(new Range(movingLineNumber, 1, movingLineNumber + 1, 1), null);\n                // Insert line that needs to be moved after\n                builder.addEditOperation(new Range(s.endLineNumber, model.getLineMaxColumn(s.endLineNumber), s.endLineNumber, model.getLineMaxColumn(s.endLineNumber)), '\\n' + movingLineText);\n                if (this.shouldAutoIndent(model, s)) {\n                    const virtualModel = {\n                        tokenization: {\n                            getLineTokens: (lineNumber) => {\n                                if (lineNumber === movingLineNumber) {\n                                    return model.tokenization.getLineTokens(s.startLineNumber);\n                                }\n                                else {\n                                    return model.tokenization.getLineTokens(lineNumber);\n                                }\n                            },\n                            getLanguageId,\n                            getLanguageIdAtPosition,\n                        },\n                        getLineContent: (lineNumber) => {\n                            if (lineNumber === movingLineNumber) {\n                                return model.getLineContent(s.startLineNumber);\n                            }\n                            else {\n                                return model.getLineContent(lineNumber);\n                            }\n                        },\n                    };\n                    const ret = this.matchEnterRule(model, indentConverter, tabSize, s.startLineNumber, s.startLineNumber - 2);\n                    // check if s.startLineNumber - 2 matches onEnter rules, if so adjust the moving block by onEnter rules.\n                    if (ret !== null) {\n                        if (ret !== 0) {\n                            this.getIndentEditsOfMovingBlock(model, builder, s, tabSize, insertSpaces, ret);\n                        }\n                    }\n                    else {\n                        // it doesn't match any onEnter rule, let's check indentation rules then.\n                        const indentOfFirstLine = getGoodIndentForLine(this._autoIndent, virtualModel, model.getLanguageIdAtPosition(s.startLineNumber, 1), movingLineNumber, indentConverter, this._languageConfigurationService);\n                        if (indentOfFirstLine !== null) {\n                            // adjust the indentation of the moving block\n                            const oldIndent = getLeadingWhitespace(model.getLineContent(s.startLineNumber));\n                            const newSpaceCnt = getSpaceCnt(indentOfFirstLine, tabSize);\n                            const oldSpaceCnt = getSpaceCnt(oldIndent, tabSize);\n                            if (newSpaceCnt !== oldSpaceCnt) {\n                                const spaceCntOffset = newSpaceCnt - oldSpaceCnt;\n                                this.getIndentEditsOfMovingBlock(model, builder, s, tabSize, insertSpaces, spaceCntOffset);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        this._selectionId = builder.trackSelection(s);\n    }\n    buildIndentConverter(tabSize, indentSize, insertSpaces) {\n        return {\n            shiftIndent: (indentation) => {\n                return ShiftCommand.shiftIndent(indentation, indentation.length + 1, tabSize, indentSize, insertSpaces);\n            },\n            unshiftIndent: (indentation) => {\n                return ShiftCommand.unshiftIndent(indentation, indentation.length + 1, tabSize, indentSize, insertSpaces);\n            }\n        };\n    }\n    parseEnterResult(model, indentConverter, tabSize, line, enter) {\n        if (enter) {\n            let enterPrefix = enter.indentation;\n            if (enter.indentAction === IndentAction.None) {\n                enterPrefix = enter.indentation + enter.appendText;\n            }\n            else if (enter.indentAction === IndentAction.Indent) {\n                enterPrefix = enter.indentation + enter.appendText;\n            }\n            else if (enter.indentAction === IndentAction.IndentOutdent) {\n                enterPrefix = enter.indentation;\n            }\n            else if (enter.indentAction === IndentAction.Outdent) {\n                enterPrefix = indentConverter.unshiftIndent(enter.indentation) + enter.appendText;\n            }\n            const movingLineText = model.getLineContent(line);\n            if (this.trimStart(movingLineText).indexOf(this.trimStart(enterPrefix)) >= 0) {\n                const oldIndentation = getLeadingWhitespace(model.getLineContent(line));\n                let newIndentation = getLeadingWhitespace(enterPrefix);\n                const indentMetadataOfMovelingLine = getIndentMetadata(model, line, this._languageConfigurationService);\n                if (indentMetadataOfMovelingLine !== null && indentMetadataOfMovelingLine & 2 /* IndentConsts.DECREASE_MASK */) {\n                    newIndentation = indentConverter.unshiftIndent(newIndentation);\n                }\n                const newSpaceCnt = getSpaceCnt(newIndentation, tabSize);\n                const oldSpaceCnt = getSpaceCnt(oldIndentation, tabSize);\n                return newSpaceCnt - oldSpaceCnt;\n            }\n        }\n        return null;\n    }\n    /**\n     *\n     * @param model\n     * @param indentConverter\n     * @param tabSize\n     * @param line the line moving down\n     * @param futureAboveLineNumber the line which will be at the `line` position\n     * @param futureAboveLineText\n     */\n    matchEnterRuleMovingDown(model, indentConverter, tabSize, line, futureAboveLineNumber, futureAboveLineText) {\n        if (lastNonWhitespaceIndex(futureAboveLineText) >= 0) {\n            // break\n            const maxColumn = model.getLineMaxColumn(futureAboveLineNumber);\n            const enter = getEnterAction(this._autoIndent, model, new Range(futureAboveLineNumber, maxColumn, futureAboveLineNumber, maxColumn), this._languageConfigurationService);\n            return this.parseEnterResult(model, indentConverter, tabSize, line, enter);\n        }\n        else {\n            // go upwards, starting from `line - 1`\n            let validPrecedingLine = line - 1;\n            while (validPrecedingLine >= 1) {\n                const lineContent = model.getLineContent(validPrecedingLine);\n                const nonWhitespaceIdx = lastNonWhitespaceIndex(lineContent);\n                if (nonWhitespaceIdx >= 0) {\n                    break;\n                }\n                validPrecedingLine--;\n            }\n            if (validPrecedingLine < 1 || line > model.getLineCount()) {\n                return null;\n            }\n            const maxColumn = model.getLineMaxColumn(validPrecedingLine);\n            const enter = getEnterAction(this._autoIndent, model, new Range(validPrecedingLine, maxColumn, validPrecedingLine, maxColumn), this._languageConfigurationService);\n            return this.parseEnterResult(model, indentConverter, tabSize, line, enter);\n        }\n    }\n    matchEnterRule(model, indentConverter, tabSize, line, oneLineAbove, previousLineText) {\n        let validPrecedingLine = oneLineAbove;\n        while (validPrecedingLine >= 1) {\n            // ship empty lines as empty lines just inherit indentation\n            let lineContent;\n            if (validPrecedingLine === oneLineAbove && previousLineText !== undefined) {\n                lineContent = previousLineText;\n            }\n            else {\n                lineContent = model.getLineContent(validPrecedingLine);\n            }\n            const nonWhitespaceIdx = lastNonWhitespaceIndex(lineContent);\n            if (nonWhitespaceIdx >= 0) {\n                break;\n            }\n            validPrecedingLine--;\n        }\n        if (validPrecedingLine < 1 || line > model.getLineCount()) {\n            return null;\n        }\n        const maxColumn = model.getLineMaxColumn(validPrecedingLine);\n        const enter = getEnterAction(this._autoIndent, model, new Range(validPrecedingLine, maxColumn, validPrecedingLine, maxColumn), this._languageConfigurationService);\n        return this.parseEnterResult(model, indentConverter, tabSize, line, enter);\n    }\n    trimStart(str) {\n        return str.replace(/^\\s+/, '');\n    }\n    shouldAutoIndent(model, selection) {\n        if (this._autoIndent < 4 /* EditorAutoIndentStrategy.Full */) {\n            return false;\n        }\n        // if it's not easy to tokenize, we stop auto indent.\n        if (!model.tokenization.isCheapToTokenize(selection.startLineNumber)) {\n            return false;\n        }\n        const languageAtSelectionStart = model.getLanguageIdAtPosition(selection.startLineNumber, 1);\n        const languageAtSelectionEnd = model.getLanguageIdAtPosition(selection.endLineNumber, 1);\n        if (languageAtSelectionStart !== languageAtSelectionEnd) {\n            return false;\n        }\n        if (this._languageConfigurationService.getLanguageConfiguration(languageAtSelectionStart).indentRulesSupport === null) {\n            return false;\n        }\n        return true;\n    }\n    getIndentEditsOfMovingBlock(model, builder, s, tabSize, insertSpaces, offset) {\n        for (let i = s.startLineNumber; i <= s.endLineNumber; i++) {\n            const lineContent = model.getLineContent(i);\n            const originalIndent = getLeadingWhitespace(lineContent);\n            const originalSpacesCnt = getSpaceCnt(originalIndent, tabSize);\n            const newSpacesCnt = originalSpacesCnt + offset;\n            const newIndent = generateIndent(newSpacesCnt, tabSize, insertSpaces);\n            if (newIndent !== originalIndent) {\n                builder.addEditOperation(new Range(i, 1, i, originalIndent.length + 1), newIndent);\n                if (i === s.endLineNumber && s.endColumn <= originalIndent.length + 1 && newIndent === '') {\n                    // as users select part of the original indent white spaces\n                    // when we adjust the indentation of endLine, we should adjust the cursor position as well.\n                    this._moveEndLineSelectionShrink = true;\n                }\n            }\n        }\n    }\n    computeCursorState(model, helper) {\n        let result = helper.getTrackedSelection(this._selectionId);\n        if (this._moveEndPositionDown) {\n            result = result.setEndPosition(result.endLineNumber + 1, 1);\n        }\n        if (this._moveEndLineSelectionShrink && result.startLineNumber < result.endLineNumber) {\n            result = result.setEndPosition(result.endLineNumber, 2);\n        }\n        return result;\n    }\n};\nMoveLinesCommand = __decorate([\n    __param(3, ILanguageConfigurationService)\n], MoveLinesCommand);\n\nexport { MoveLinesCommand };\n","import { safeIntl } from '../../../../base/common/date.js';\nimport { EditOperation } from '../../../common/core/editOperation.js';\nimport { Range } from '../../../common/core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nclass SortLinesCommand {\n    static { this._COLLATOR = safeIntl.Collator(); }\n    constructor(selection, descending) {\n        this.selection = selection;\n        this.descending = descending;\n        this.selectionId = null;\n    }\n    getEditOperations(model, builder) {\n        const op = sortLines(model, this.selection, this.descending);\n        if (op) {\n            builder.addEditOperation(op.range, op.text);\n        }\n        this.selectionId = builder.trackSelection(this.selection);\n    }\n    computeCursorState(model, helper) {\n        return helper.getTrackedSelection(this.selectionId);\n    }\n    static canRun(model, selection, descending) {\n        if (model === null) {\n            return false;\n        }\n        const data = getSortData(model, selection, descending);\n        if (!data) {\n            return false;\n        }\n        for (let i = 0, len = data.before.length; i < len; i++) {\n            if (data.before[i] !== data.after[i]) {\n                return true;\n            }\n        }\n        return false;\n    }\n}\nfunction getSortData(model, selection, descending) {\n    const startLineNumber = selection.startLineNumber;\n    let endLineNumber = selection.endLineNumber;\n    if (selection.endColumn === 1) {\n        endLineNumber--;\n    }\n    // Nothing to sort if user didn't select anything.\n    if (startLineNumber >= endLineNumber) {\n        return null;\n    }\n    const linesToSort = [];\n    // Get the contents of the selection to be sorted.\n    for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n        linesToSort.push(model.getLineContent(lineNumber));\n    }\n    let sorted = linesToSort.slice(0);\n    sorted.sort(SortLinesCommand._COLLATOR.value.compare);\n    // If descending, reverse the order.\n    if (descending === true) {\n        sorted = sorted.reverse();\n    }\n    return {\n        startLineNumber: startLineNumber,\n        endLineNumber: endLineNumber,\n        before: linesToSort,\n        after: sorted\n    };\n}\n/**\n * Generate commands for sorting lines on a model.\n */\nfunction sortLines(model, selection, descending) {\n    const data = getSortData(model, selection, descending);\n    if (!data) {\n        return null;\n    }\n    return EditOperation.replace(new Range(data.startLineNumber, 1, data.endLineNumber, model.getLineMaxColumn(data.endLineNumber)), data.after.join('\\n'));\n}\n\nexport { SortLinesCommand };\n","import { KeyChord } from '../../../../base/common/keyCodes.js';\nimport { localize2, localize } from '../../../../nls.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { CoreEditingCommands } from '../../../browser/coreCommands.js';\nimport { EditorAction, registerEditorAction } from '../../../browser/editorExtensions.js';\nimport { ReplaceCommandThatSelectsText, ReplaceCommand, ReplaceCommandThatPreservesSelection } from '../../../common/commands/replaceCommand.js';\nimport { TrimTrailingWhitespaceCommand } from '../../../common/commands/trimTrailingWhitespaceCommand.js';\nimport { EditOperation } from '../../../common/core/editOperation.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { EnterOperation } from '../../../common/cursor/cursorTypeEditOperations.js';\nimport { TypeOperations } from '../../../common/cursor/cursorTypeOperations.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { CopyLinesCommand } from './copyLinesCommand.js';\nimport { MoveLinesCommand } from './moveLinesCommand.js';\nimport { SortLinesCommand } from './sortLinesCommand.js';\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// copy lines\nclass AbstractCopyLinesAction extends EditorAction {\n    constructor(down, opts) {\n        super(opts);\n        this.down = down;\n    }\n    run(_accessor, editor) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const selections = editor.getSelections().map((selection, index) => ({ selection, index, ignore: false }));\n        selections.sort((a, b) => Range.compareRangesUsingStarts(a.selection, b.selection));\n        // Remove selections that would result in copying the same line\n        let prev = selections[0];\n        for (let i = 1; i < selections.length; i++) {\n            const curr = selections[i];\n            if (prev.selection.endLineNumber === curr.selection.startLineNumber) {\n                // these two selections would copy the same line\n                if (prev.index < curr.index) {\n                    // prev wins\n                    curr.ignore = true;\n                }\n                else {\n                    // curr wins\n                    prev.ignore = true;\n                    prev = curr;\n                }\n            }\n        }\n        const commands = [];\n        for (const selection of selections) {\n            commands.push(new CopyLinesCommand(selection.selection, this.down, selection.ignore));\n        }\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, commands);\n        editor.pushUndoStop();\n    }\n}\nclass CopyLinesUpAction extends AbstractCopyLinesAction {\n    constructor() {\n        super(false, {\n            id: 'editor.action.copyLinesUpAction',\n            label: localize2(1249, \"Copy Line Up\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 512 /* KeyMod.Alt */ | 1024 /* KeyMod.Shift */ | 16 /* KeyCode.UpArrow */,\n                linux: { primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 1024 /* KeyMod.Shift */ | 16 /* KeyCode.UpArrow */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarSelectionMenu,\n                group: '2_line',\n                title: localize(1244, \"&&Copy Line Up\"),\n                order: 1\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n}\nclass CopyLinesDownAction extends AbstractCopyLinesAction {\n    constructor() {\n        super(true, {\n            id: 'editor.action.copyLinesDownAction',\n            label: localize2(1250, \"Copy Line Down\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 512 /* KeyMod.Alt */ | 1024 /* KeyMod.Shift */ | 18 /* KeyCode.DownArrow */,\n                linux: { primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 1024 /* KeyMod.Shift */ | 18 /* KeyCode.DownArrow */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarSelectionMenu,\n                group: '2_line',\n                title: localize(1245, \"Co&&py Line Down\"),\n                order: 2\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n}\nclass DuplicateSelectionAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.duplicateSelection',\n            label: localize2(1251, \"Duplicate Selection\"),\n            precondition: EditorContextKeys.writable,\n            menuOpts: {\n                menuId: MenuId.MenubarSelectionMenu,\n                group: '2_line',\n                title: localize(1246, \"&&Duplicate Selection\"),\n                order: 5\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(accessor, editor, args) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const commands = [];\n        const selections = editor.getSelections();\n        const model = editor.getModel();\n        for (const selection of selections) {\n            if (selection.isEmpty()) {\n                commands.push(new CopyLinesCommand(selection, true));\n            }\n            else {\n                const insertSelection = new Selection(selection.endLineNumber, selection.endColumn, selection.endLineNumber, selection.endColumn);\n                commands.push(new ReplaceCommandThatSelectsText(insertSelection, model.getValueInRange(selection)));\n            }\n        }\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, commands);\n        editor.pushUndoStop();\n    }\n}\n// move lines\nclass AbstractMoveLinesAction extends EditorAction {\n    constructor(down, opts) {\n        super(opts);\n        this.down = down;\n    }\n    run(accessor, editor) {\n        const languageConfigurationService = accessor.get(ILanguageConfigurationService);\n        const commands = [];\n        const selections = editor.getSelections() || [];\n        const autoIndent = editor.getOption(16 /* EditorOption.autoIndent */);\n        for (const selection of selections) {\n            commands.push(new MoveLinesCommand(selection, this.down, autoIndent, languageConfigurationService));\n        }\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, commands);\n        editor.pushUndoStop();\n    }\n}\nclass MoveLinesUpAction extends AbstractMoveLinesAction {\n    constructor() {\n        super(false, {\n            id: 'editor.action.moveLinesUpAction',\n            label: localize2(1252, \"Move Line Up\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 512 /* KeyMod.Alt */ | 16 /* KeyCode.UpArrow */,\n                linux: { primary: 512 /* KeyMod.Alt */ | 16 /* KeyCode.UpArrow */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarSelectionMenu,\n                group: '2_line',\n                title: localize(1247, \"Mo&&ve Line Up\"),\n                order: 3\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n}\nclass MoveLinesDownAction extends AbstractMoveLinesAction {\n    constructor() {\n        super(true, {\n            id: 'editor.action.moveLinesDownAction',\n            label: localize2(1253, \"Move Line Down\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 512 /* KeyMod.Alt */ | 18 /* KeyCode.DownArrow */,\n                linux: { primary: 512 /* KeyMod.Alt */ | 18 /* KeyCode.DownArrow */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarSelectionMenu,\n                group: '2_line',\n                title: localize(1248, \"Move &&Line Down\"),\n                order: 4\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n}\nclass AbstractSortLinesAction extends EditorAction {\n    constructor(descending, opts) {\n        super(opts);\n        this.descending = descending;\n    }\n    run(_accessor, editor) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const model = editor.getModel();\n        let selections = editor.getSelections();\n        if (selections.length === 1 && selections[0].isEmpty()) {\n            // Apply to whole document.\n            selections = [new Selection(1, 1, model.getLineCount(), model.getLineMaxColumn(model.getLineCount()))];\n        }\n        for (const selection of selections) {\n            if (!SortLinesCommand.canRun(editor.getModel(), selection, this.descending)) {\n                return;\n            }\n        }\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            commands[i] = new SortLinesCommand(selections[i], this.descending);\n        }\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, commands);\n        editor.pushUndoStop();\n    }\n}\nclass SortLinesAscendingAction extends AbstractSortLinesAction {\n    constructor() {\n        super(false, {\n            id: 'editor.action.sortLinesAscending',\n            label: localize2(1254, \"Sort Lines Ascending\"),\n            precondition: EditorContextKeys.writable,\n            canTriggerInlineEdits: true,\n        });\n    }\n}\nclass SortLinesDescendingAction extends AbstractSortLinesAction {\n    constructor() {\n        super(true, {\n            id: 'editor.action.sortLinesDescending',\n            label: localize2(1255, \"Sort Lines Descending\"),\n            precondition: EditorContextKeys.writable,\n            canTriggerInlineEdits: true,\n        });\n    }\n}\nclass DeleteDuplicateLinesAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.removeDuplicateLines',\n            label: localize2(1256, \"Delete Duplicate Lines\"),\n            precondition: EditorContextKeys.writable,\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(_accessor, editor) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const model = editor.getModel();\n        if (model.getLineCount() === 1 && model.getLineMaxColumn(1) === 1) {\n            return;\n        }\n        const edits = [];\n        const endCursorState = [];\n        let linesDeleted = 0;\n        let updateSelection = true;\n        let selections = editor.getSelections();\n        if (selections.length === 1 && selections[0].isEmpty()) {\n            // Apply to whole document.\n            selections = [new Selection(1, 1, model.getLineCount(), model.getLineMaxColumn(model.getLineCount()))];\n            updateSelection = false;\n        }\n        for (const selection of selections) {\n            const uniqueLines = new Set();\n            const lines = [];\n            for (let i = selection.startLineNumber; i <= selection.endLineNumber; i++) {\n                const line = model.getLineContent(i);\n                if (uniqueLines.has(line)) {\n                    continue;\n                }\n                lines.push(line);\n                uniqueLines.add(line);\n            }\n            const selectionToReplace = new Selection(selection.startLineNumber, 1, selection.endLineNumber, model.getLineMaxColumn(selection.endLineNumber));\n            const adjustedSelectionStart = selection.startLineNumber - linesDeleted;\n            const finalSelection = new Selection(adjustedSelectionStart, 1, adjustedSelectionStart + lines.length - 1, lines[lines.length - 1].length);\n            edits.push(EditOperation.replace(selectionToReplace, lines.join('\\n')));\n            endCursorState.push(finalSelection);\n            linesDeleted += (selection.endLineNumber - selection.startLineNumber + 1) - lines.length;\n        }\n        editor.pushUndoStop();\n        editor.executeEdits(this.id, edits, updateSelection ? endCursorState : undefined);\n        editor.pushUndoStop();\n    }\n}\nclass ReverseLinesAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.reverseLines',\n            label: localize2(1257, \"Reverse lines\"),\n            precondition: EditorContextKeys.writable,\n            canTriggerInlineEdits: true\n        });\n    }\n    run(_accessor, editor) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const model = editor.getModel();\n        const originalSelections = editor.getSelections();\n        let selections = originalSelections;\n        if (selections.length === 1 && selections[0].isEmpty()) {\n            // Apply to whole document.\n            selections = [new Selection(1, 1, model.getLineCount(), model.getLineMaxColumn(model.getLineCount()))];\n        }\n        const edits = [];\n        const resultingSelections = [];\n        for (let i = 0; i < selections.length; i++) {\n            const selection = selections[i];\n            const originalSelection = originalSelections[i];\n            let endLineNumber = selection.endLineNumber;\n            if (selection.startLineNumber < selection.endLineNumber && selection.endColumn === 1) {\n                endLineNumber--;\n            }\n            let range = new Range(selection.startLineNumber, 1, endLineNumber, model.getLineMaxColumn(endLineNumber));\n            // Exclude last line if empty and we're at the end of the document\n            if (endLineNumber === model.getLineCount() && model.getLineContent(range.endLineNumber) === '') {\n                range = range.setEndPosition(range.endLineNumber - 1, model.getLineMaxColumn(range.endLineNumber - 1));\n            }\n            const lines = [];\n            for (let i = range.endLineNumber; i >= range.startLineNumber; i--) {\n                lines.push(model.getLineContent(i));\n            }\n            const edit = EditOperation.replace(range, lines.join('\\n'));\n            edits.push(edit);\n            const updateLineNumber = function (lineNumber) {\n                return lineNumber <= range.endLineNumber ? range.endLineNumber - lineNumber + range.startLineNumber : lineNumber;\n            };\n            const updateSelection = function (sel) {\n                if (sel.isEmpty()) {\n                    // keep just the cursor\n                    return new Selection(updateLineNumber(sel.positionLineNumber), sel.positionColumn, updateLineNumber(sel.positionLineNumber), sel.positionColumn);\n                }\n                else {\n                    // keep selection - maintain direction by creating backward selection\n                    const newSelectionStart = updateLineNumber(sel.selectionStartLineNumber);\n                    const newPosition = updateLineNumber(sel.positionLineNumber);\n                    const newSelectionStartColumn = sel.selectionStartColumn;\n                    const newPositionColumn = sel.positionColumn;\n                    // Create selection: from (newSelectionStart, newSelectionStartColumn) to (newPosition, newPositionColumn)\n                    // After reversal: from (3, 2) to (1, 3)\n                    return new Selection(newSelectionStart, newSelectionStartColumn, newPosition, newPositionColumn);\n                }\n            };\n            resultingSelections.push(updateSelection(originalSelection));\n        }\n        editor.pushUndoStop();\n        editor.executeEdits(this.id, edits, resultingSelections);\n        editor.pushUndoStop();\n    }\n}\nclass TrimTrailingWhitespaceAction extends EditorAction {\n    static { this.ID = 'editor.action.trimTrailingWhitespace'; }\n    constructor() {\n        super({\n            id: TrimTrailingWhitespaceAction.ID,\n            label: localize2(1258, \"Trim Trailing Whitespace\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 54 /* KeyCode.KeyX */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(_accessor, editor, args) {\n        let cursors = [];\n        if (args.reason === 'auto-save') {\n            // See https://github.com/editorconfig/editorconfig-vscode/issues/47\n            // It is very convenient for the editor config extension to invoke this action.\n            // So, if we get a reason:'auto-save' passed in, let's preserve cursor positions.\n            cursors = (editor.getSelections() || []).map(s => new Position(s.positionLineNumber, s.positionColumn));\n        }\n        const selection = editor.getSelection();\n        if (selection === null) {\n            return;\n        }\n        const config = _accessor.get(IConfigurationService);\n        const model = editor.getModel();\n        const trimInRegexAndStrings = config.getValue('files.trimTrailingWhitespaceInRegexAndStrings', { overrideIdentifier: model?.getLanguageId(), resource: model?.uri });\n        const command = new TrimTrailingWhitespaceCommand(selection, cursors, trimInRegexAndStrings);\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, [command]);\n        editor.pushUndoStop();\n    }\n}\nclass DeleteLinesAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.deleteLines',\n            label: localize2(1259, \"Delete Line\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 41 /* KeyCode.KeyK */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(_accessor, editor) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const ops = this._getLinesToRemove(editor);\n        const model = editor.getModel();\n        if (model.getLineCount() === 1 && model.getLineMaxColumn(1) === 1) {\n            // Model is empty\n            return;\n        }\n        let linesDeleted = 0;\n        const edits = [];\n        const cursorState = [];\n        for (let i = 0, len = ops.length; i < len; i++) {\n            const op = ops[i];\n            let startLineNumber = op.startLineNumber;\n            let endLineNumber = op.endLineNumber;\n            let startColumn = 1;\n            let endColumn = model.getLineMaxColumn(endLineNumber);\n            if (endLineNumber < model.getLineCount()) {\n                endLineNumber += 1;\n                endColumn = 1;\n            }\n            else if (startLineNumber > 1) {\n                startLineNumber -= 1;\n                startColumn = model.getLineMaxColumn(startLineNumber);\n            }\n            edits.push(EditOperation.replace(new Selection(startLineNumber, startColumn, endLineNumber, endColumn), ''));\n            cursorState.push(new Selection(startLineNumber - linesDeleted, op.positionColumn, startLineNumber - linesDeleted, op.positionColumn));\n            linesDeleted += (op.endLineNumber - op.startLineNumber + 1);\n        }\n        editor.pushUndoStop();\n        editor.executeEdits(this.id, edits, cursorState);\n        editor.pushUndoStop();\n    }\n    _getLinesToRemove(editor) {\n        // Construct delete operations\n        const operations = editor.getSelections().map((s) => {\n            let endLineNumber = s.endLineNumber;\n            if (s.startLineNumber < s.endLineNumber && s.endColumn === 1) {\n                endLineNumber -= 1;\n            }\n            return {\n                startLineNumber: s.startLineNumber,\n                selectionStartColumn: s.selectionStartColumn,\n                endLineNumber: endLineNumber,\n                positionColumn: s.positionColumn\n            };\n        });\n        // Sort delete operations\n        operations.sort((a, b) => {\n            if (a.startLineNumber === b.startLineNumber) {\n                return a.endLineNumber - b.endLineNumber;\n            }\n            return a.startLineNumber - b.startLineNumber;\n        });\n        // Merge delete operations which are adjacent or overlapping\n        const mergedOperations = [];\n        let previousOperation = operations[0];\n        for (let i = 1; i < operations.length; i++) {\n            if (previousOperation.endLineNumber + 1 >= operations[i].startLineNumber) {\n                // Merge current operations into the previous one\n                previousOperation.endLineNumber = operations[i].endLineNumber;\n            }\n            else {\n                // Push previous operation\n                mergedOperations.push(previousOperation);\n                previousOperation = operations[i];\n            }\n        }\n        // Push the last operation\n        mergedOperations.push(previousOperation);\n        return mergedOperations;\n    }\n}\nclass IndentLinesAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.indentLines',\n            label: localize2(1260, \"Indent Line\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 94 /* KeyCode.BracketRight */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(_accessor, editor) {\n        const viewModel = editor._getViewModel();\n        if (!viewModel) {\n            return;\n        }\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, TypeOperations.indent(viewModel.cursorConfig, editor.getModel(), editor.getSelections()));\n        editor.pushUndoStop();\n    }\n}\nclass OutdentLinesAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.outdentLines',\n            label: localize2(1261, \"Outdent Line\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 92 /* KeyCode.BracketLeft */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(_accessor, editor) {\n        CoreEditingCommands.Outdent.runEditorCommand(_accessor, editor, null);\n    }\n}\nclass InsertLineBeforeAction extends EditorAction {\n    static { this.ID = 'editor.action.insertLineBefore'; }\n    constructor() {\n        super({\n            id: InsertLineBeforeAction.ID,\n            label: localize2(1262, \"Insert Line Above\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 3 /* KeyCode.Enter */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(_accessor, editor) {\n        const viewModel = editor._getViewModel();\n        if (!viewModel) {\n            return;\n        }\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, EnterOperation.lineInsertBefore(viewModel.cursorConfig, editor.getModel(), editor.getSelections()));\n    }\n}\nclass InsertLineAfterAction extends EditorAction {\n    static { this.ID = 'editor.action.insertLineAfter'; }\n    constructor() {\n        super({\n            id: InsertLineAfterAction.ID,\n            label: localize2(1263, \"Insert Line Below\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 3 /* KeyCode.Enter */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(_accessor, editor) {\n        const viewModel = editor._getViewModel();\n        if (!viewModel) {\n            return;\n        }\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, EnterOperation.lineInsertAfter(viewModel.cursorConfig, editor.getModel(), editor.getSelections()));\n    }\n}\nclass AbstractDeleteAllToBoundaryAction extends EditorAction {\n    run(_accessor, editor) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const primaryCursor = editor.getSelection();\n        const rangesToDelete = this._getRangesToDelete(editor);\n        // merge overlapping selections\n        const effectiveRanges = [];\n        for (let i = 0, count = rangesToDelete.length - 1; i < count; i++) {\n            const range = rangesToDelete[i];\n            const nextRange = rangesToDelete[i + 1];\n            if (Range.intersectRanges(range, nextRange) === null) {\n                effectiveRanges.push(range);\n            }\n            else {\n                rangesToDelete[i + 1] = Range.plusRange(range, nextRange);\n            }\n        }\n        effectiveRanges.push(rangesToDelete[rangesToDelete.length - 1]);\n        const endCursorState = this._getEndCursorState(primaryCursor, effectiveRanges);\n        const edits = effectiveRanges.map(range => {\n            return EditOperation.replace(range, '');\n        });\n        editor.pushUndoStop();\n        editor.executeEdits(this.id, edits, endCursorState);\n        editor.pushUndoStop();\n    }\n}\nclass DeleteAllLeftAction extends AbstractDeleteAllToBoundaryAction {\n    constructor() {\n        super({\n            id: 'deleteAllLeft',\n            label: localize2(1264, \"Delete All Left\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 0,\n                mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 1 /* KeyCode.Backspace */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    _getEndCursorState(primaryCursor, rangesToDelete) {\n        let endPrimaryCursor = null;\n        const endCursorState = [];\n        let deletedLines = 0;\n        rangesToDelete.forEach(range => {\n            let endCursor;\n            if (range.endColumn === 1 && deletedLines > 0) {\n                const newStartLine = range.startLineNumber - deletedLines;\n                endCursor = new Selection(newStartLine, range.startColumn, newStartLine, range.startColumn);\n            }\n            else {\n                endCursor = new Selection(range.startLineNumber, range.startColumn, range.startLineNumber, range.startColumn);\n            }\n            deletedLines += range.endLineNumber - range.startLineNumber;\n            if (range.intersectRanges(primaryCursor)) {\n                endPrimaryCursor = endCursor;\n            }\n            else {\n                endCursorState.push(endCursor);\n            }\n        });\n        if (endPrimaryCursor) {\n            endCursorState.unshift(endPrimaryCursor);\n        }\n        return endCursorState;\n    }\n    _getRangesToDelete(editor) {\n        const selections = editor.getSelections();\n        if (selections === null) {\n            return [];\n        }\n        let rangesToDelete = selections;\n        const model = editor.getModel();\n        if (model === null) {\n            return [];\n        }\n        rangesToDelete.sort(Range.compareRangesUsingStarts);\n        rangesToDelete = rangesToDelete.map(selection => {\n            if (selection.isEmpty()) {\n                if (selection.startColumn === 1) {\n                    const deleteFromLine = Math.max(1, selection.startLineNumber - 1);\n                    const deleteFromColumn = selection.startLineNumber === 1 ? 1 : model.getLineLength(deleteFromLine) + 1;\n                    return new Range(deleteFromLine, deleteFromColumn, selection.startLineNumber, 1);\n                }\n                else {\n                    return new Range(selection.startLineNumber, 1, selection.startLineNumber, selection.startColumn);\n                }\n            }\n            else {\n                return new Range(selection.startLineNumber, 1, selection.endLineNumber, selection.endColumn);\n            }\n        });\n        return rangesToDelete;\n    }\n}\nclass DeleteAllRightAction extends AbstractDeleteAllToBoundaryAction {\n    constructor() {\n        super({\n            id: 'deleteAllRight',\n            label: localize2(1265, \"Delete All Right\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 0,\n                mac: { primary: 256 /* KeyMod.WinCtrl */ | 41 /* KeyCode.KeyK */, secondary: [2048 /* KeyMod.CtrlCmd */ | 20 /* KeyCode.Delete */] },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    _getEndCursorState(primaryCursor, rangesToDelete) {\n        let endPrimaryCursor = null;\n        const endCursorState = [];\n        for (let i = 0, len = rangesToDelete.length, offset = 0; i < len; i++) {\n            const range = rangesToDelete[i];\n            const endCursor = new Selection(range.startLineNumber - offset, range.startColumn, range.startLineNumber - offset, range.startColumn);\n            if (range.intersectRanges(primaryCursor)) {\n                endPrimaryCursor = endCursor;\n            }\n            else {\n                endCursorState.push(endCursor);\n            }\n        }\n        if (endPrimaryCursor) {\n            endCursorState.unshift(endPrimaryCursor);\n        }\n        return endCursorState;\n    }\n    _getRangesToDelete(editor) {\n        const model = editor.getModel();\n        if (model === null) {\n            return [];\n        }\n        const selections = editor.getSelections();\n        if (selections === null) {\n            return [];\n        }\n        const rangesToDelete = selections.map((sel) => {\n            if (sel.isEmpty()) {\n                const maxColumn = model.getLineMaxColumn(sel.startLineNumber);\n                if (sel.startColumn === maxColumn) {\n                    return new Range(sel.startLineNumber, sel.startColumn, sel.startLineNumber + 1, 1);\n                }\n                else {\n                    return new Range(sel.startLineNumber, sel.startColumn, sel.startLineNumber, maxColumn);\n                }\n            }\n            return sel;\n        });\n        rangesToDelete.sort(Range.compareRangesUsingStarts);\n        return rangesToDelete;\n    }\n}\nclass JoinLinesAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.joinLines',\n            label: localize2(1266, \"Join Lines\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 0,\n                mac: { primary: 256 /* KeyMod.WinCtrl */ | 40 /* KeyCode.KeyJ */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(_accessor, editor) {\n        const selections = editor.getSelections();\n        if (selections === null) {\n            return;\n        }\n        let primaryCursor = editor.getSelection();\n        if (primaryCursor === null) {\n            return;\n        }\n        selections.sort(Range.compareRangesUsingStarts);\n        const reducedSelections = [];\n        const lastSelection = selections.reduce((previousValue, currentValue) => {\n            if (previousValue.isEmpty()) {\n                if (previousValue.endLineNumber === currentValue.startLineNumber) {\n                    if (primaryCursor.equalsSelection(previousValue)) {\n                        primaryCursor = currentValue;\n                    }\n                    return currentValue;\n                }\n                if (currentValue.startLineNumber > previousValue.endLineNumber + 1) {\n                    reducedSelections.push(previousValue);\n                    return currentValue;\n                }\n                else {\n                    return new Selection(previousValue.startLineNumber, previousValue.startColumn, currentValue.endLineNumber, currentValue.endColumn);\n                }\n            }\n            else {\n                if (currentValue.startLineNumber > previousValue.endLineNumber) {\n                    reducedSelections.push(previousValue);\n                    return currentValue;\n                }\n                else {\n                    return new Selection(previousValue.startLineNumber, previousValue.startColumn, currentValue.endLineNumber, currentValue.endColumn);\n                }\n            }\n        });\n        reducedSelections.push(lastSelection);\n        const model = editor.getModel();\n        if (model === null) {\n            return;\n        }\n        const edits = [];\n        const endCursorState = [];\n        let endPrimaryCursor = primaryCursor;\n        let lineOffset = 0;\n        for (let i = 0, len = reducedSelections.length; i < len; i++) {\n            const selection = reducedSelections[i];\n            const startLineNumber = selection.startLineNumber;\n            const startColumn = 1;\n            let columnDeltaOffset = 0;\n            let endLineNumber, endColumn;\n            const selectionEndPositionOffset = model.getLineLength(selection.endLineNumber) - selection.endColumn;\n            if (selection.isEmpty() || selection.startLineNumber === selection.endLineNumber) {\n                const position = selection.getStartPosition();\n                if (position.lineNumber < model.getLineCount()) {\n                    endLineNumber = startLineNumber + 1;\n                    endColumn = model.getLineMaxColumn(endLineNumber);\n                }\n                else {\n                    endLineNumber = position.lineNumber;\n                    endColumn = model.getLineMaxColumn(position.lineNumber);\n                }\n            }\n            else {\n                endLineNumber = selection.endLineNumber;\n                endColumn = model.getLineMaxColumn(endLineNumber);\n            }\n            let trimmedLinesContent = model.getLineContent(startLineNumber);\n            for (let i = startLineNumber + 1; i <= endLineNumber; i++) {\n                const lineText = model.getLineContent(i);\n                const firstNonWhitespaceIdx = model.getLineFirstNonWhitespaceColumn(i);\n                if (firstNonWhitespaceIdx >= 1) {\n                    let insertSpace = true;\n                    if (trimmedLinesContent === '') {\n                        insertSpace = false;\n                    }\n                    if (insertSpace && (trimmedLinesContent.charAt(trimmedLinesContent.length - 1) === ' ' ||\n                        trimmedLinesContent.charAt(trimmedLinesContent.length - 1) === '\\t')) {\n                        insertSpace = false;\n                        trimmedLinesContent = trimmedLinesContent.replace(/[\\s\\uFEFF\\xA0]+$/g, ' ');\n                    }\n                    const lineTextWithoutIndent = lineText.substr(firstNonWhitespaceIdx - 1);\n                    trimmedLinesContent += (insertSpace ? ' ' : '') + lineTextWithoutIndent;\n                    if (insertSpace) {\n                        columnDeltaOffset = lineTextWithoutIndent.length + 1;\n                    }\n                    else {\n                        columnDeltaOffset = lineTextWithoutIndent.length;\n                    }\n                }\n                else {\n                    columnDeltaOffset = 0;\n                }\n            }\n            const deleteSelection = new Range(startLineNumber, startColumn, endLineNumber, endColumn);\n            if (!deleteSelection.isEmpty()) {\n                let resultSelection;\n                if (selection.isEmpty()) {\n                    edits.push(EditOperation.replace(deleteSelection, trimmedLinesContent));\n                    resultSelection = new Selection(deleteSelection.startLineNumber - lineOffset, trimmedLinesContent.length - columnDeltaOffset + 1, startLineNumber - lineOffset, trimmedLinesContent.length - columnDeltaOffset + 1);\n                }\n                else {\n                    if (selection.startLineNumber === selection.endLineNumber) {\n                        edits.push(EditOperation.replace(deleteSelection, trimmedLinesContent));\n                        resultSelection = new Selection(selection.startLineNumber - lineOffset, selection.startColumn, selection.endLineNumber - lineOffset, selection.endColumn);\n                    }\n                    else {\n                        edits.push(EditOperation.replace(deleteSelection, trimmedLinesContent));\n                        resultSelection = new Selection(selection.startLineNumber - lineOffset, selection.startColumn, selection.startLineNumber - lineOffset, trimmedLinesContent.length - selectionEndPositionOffset);\n                    }\n                }\n                if (Range.intersectRanges(deleteSelection, primaryCursor) !== null) {\n                    endPrimaryCursor = resultSelection;\n                }\n                else {\n                    endCursorState.push(resultSelection);\n                }\n            }\n            lineOffset += deleteSelection.endLineNumber - deleteSelection.startLineNumber;\n        }\n        endCursorState.unshift(endPrimaryCursor);\n        editor.pushUndoStop();\n        editor.executeEdits(this.id, edits, endCursorState);\n        editor.pushUndoStop();\n    }\n}\nclass TransposeAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.transpose',\n            label: localize2(1267, \"Transpose Characters around the Cursor\"),\n            precondition: EditorContextKeys.writable,\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(_accessor, editor) {\n        const selections = editor.getSelections();\n        if (selections === null) {\n            return;\n        }\n        const model = editor.getModel();\n        if (model === null) {\n            return;\n        }\n        const commands = [];\n        for (let i = 0, len = selections.length; i < len; i++) {\n            const selection = selections[i];\n            if (!selection.isEmpty()) {\n                continue;\n            }\n            const cursor = selection.getStartPosition();\n            const maxColumn = model.getLineMaxColumn(cursor.lineNumber);\n            if (cursor.column >= maxColumn) {\n                if (cursor.lineNumber === model.getLineCount()) {\n                    continue;\n                }\n                // The cursor is at the end of current line and current line is not empty\n                // then we transpose the character before the cursor and the line break if there is any following line.\n                const deleteSelection = new Range(cursor.lineNumber, Math.max(1, cursor.column - 1), cursor.lineNumber + 1, 1);\n                const chars = model.getValueInRange(deleteSelection).split('').reverse().join('');\n                commands.push(new ReplaceCommand(new Selection(cursor.lineNumber, Math.max(1, cursor.column - 1), cursor.lineNumber + 1, 1), chars));\n            }\n            else {\n                const deleteSelection = new Range(cursor.lineNumber, Math.max(1, cursor.column - 1), cursor.lineNumber, cursor.column + 1);\n                const chars = model.getValueInRange(deleteSelection).split('').reverse().join('');\n                commands.push(new ReplaceCommandThatPreservesSelection(deleteSelection, chars, new Selection(cursor.lineNumber, cursor.column + 1, cursor.lineNumber, cursor.column + 1)));\n            }\n        }\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, commands);\n        editor.pushUndoStop();\n    }\n}\nclass AbstractCaseAction extends EditorAction {\n    run(_accessor, editor) {\n        const selections = editor.getSelections();\n        if (selections === null) {\n            return;\n        }\n        const model = editor.getModel();\n        if (model === null) {\n            return;\n        }\n        const wordSeparators = editor.getOption(148 /* EditorOption.wordSeparators */);\n        const textEdits = [];\n        for (const selection of selections) {\n            if (selection.isEmpty()) {\n                const cursor = selection.getStartPosition();\n                const word = editor.getConfiguredWordAtPosition(cursor);\n                if (!word) {\n                    continue;\n                }\n                const wordRange = new Range(cursor.lineNumber, word.startColumn, cursor.lineNumber, word.endColumn);\n                const text = model.getValueInRange(wordRange);\n                textEdits.push(EditOperation.replace(wordRange, this._modifyText(text, wordSeparators)));\n            }\n            else {\n                const text = model.getValueInRange(selection);\n                textEdits.push(EditOperation.replace(selection, this._modifyText(text, wordSeparators)));\n            }\n        }\n        editor.pushUndoStop();\n        editor.executeEdits(this.id, textEdits);\n        editor.pushUndoStop();\n    }\n}\nclass UpperCaseAction extends AbstractCaseAction {\n    constructor() {\n        super({\n            id: 'editor.action.transformToUppercase',\n            label: localize2(1268, \"Transform to Uppercase\"),\n            precondition: EditorContextKeys.writable,\n            canTriggerInlineEdits: true,\n        });\n    }\n    _modifyText(text, wordSeparators) {\n        return text.toLocaleUpperCase();\n    }\n}\nclass LowerCaseAction extends AbstractCaseAction {\n    constructor() {\n        super({\n            id: 'editor.action.transformToLowercase',\n            label: localize2(1269, \"Transform to Lowercase\"),\n            precondition: EditorContextKeys.writable,\n            canTriggerInlineEdits: true\n        });\n    }\n    _modifyText(text, wordSeparators) {\n        return text.toLocaleLowerCase();\n    }\n}\nclass BackwardsCompatibleRegExp {\n    constructor(_pattern, _flags) {\n        this._pattern = _pattern;\n        this._flags = _flags;\n        this._actual = null;\n        this._evaluated = false;\n    }\n    get() {\n        if (!this._evaluated) {\n            this._evaluated = true;\n            try {\n                this._actual = new RegExp(this._pattern, this._flags);\n            }\n            catch (err) {\n                // this browser does not support this regular expression\n            }\n        }\n        return this._actual;\n    }\n    isSupported() {\n        return (this.get() !== null);\n    }\n}\nclass TitleCaseAction extends AbstractCaseAction {\n    static { this.titleBoundary = new BackwardsCompatibleRegExp('(^|[^\\\\p{L}\\\\p{N}\\']|((^|\\\\P{L})\\'))\\\\p{L}', 'gmu'); }\n    constructor() {\n        super({\n            id: 'editor.action.transformToTitlecase',\n            label: localize2(1270, \"Transform to Title Case\"),\n            precondition: EditorContextKeys.writable,\n            canTriggerInlineEdits: true\n        });\n    }\n    _modifyText(text, wordSeparators) {\n        const titleBoundary = TitleCaseAction.titleBoundary.get();\n        if (!titleBoundary) {\n            // cannot support this\n            return text;\n        }\n        return text\n            .toLocaleLowerCase()\n            .replace(titleBoundary, (b) => b.toLocaleUpperCase());\n    }\n}\nclass SnakeCaseAction extends AbstractCaseAction {\n    static { this.caseBoundary = new BackwardsCompatibleRegExp('(\\\\p{Ll})(\\\\p{Lu})', 'gmu'); }\n    static { this.singleLetters = new BackwardsCompatibleRegExp('(\\\\p{Lu}|\\\\p{N})(\\\\p{Lu})(\\\\p{Ll})', 'gmu'); }\n    constructor() {\n        super({\n            id: 'editor.action.transformToSnakecase',\n            label: localize2(1271, \"Transform to Snake Case\"),\n            precondition: EditorContextKeys.writable,\n            canTriggerInlineEdits: true,\n        });\n    }\n    _modifyText(text, wordSeparators) {\n        const caseBoundary = SnakeCaseAction.caseBoundary.get();\n        const singleLetters = SnakeCaseAction.singleLetters.get();\n        if (!caseBoundary || !singleLetters) {\n            // cannot support this\n            return text;\n        }\n        return (text\n            .replace(caseBoundary, '$1_$2')\n            .replace(singleLetters, '$1_$2$3')\n            .toLocaleLowerCase());\n    }\n}\nclass CamelCaseAction extends AbstractCaseAction {\n    static { this.singleLineWordBoundary = new BackwardsCompatibleRegExp('[_\\\\s-]+', 'gm'); }\n    static { this.multiLineWordBoundary = new BackwardsCompatibleRegExp('[_-]+', 'gm'); }\n    static { this.validWordStart = new BackwardsCompatibleRegExp('^(\\\\p{Lu}[^\\\\p{Lu}])', 'gmu'); }\n    constructor() {\n        super({\n            id: 'editor.action.transformToCamelcase',\n            label: localize2(1272, \"Transform to Camel Case\"),\n            precondition: EditorContextKeys.writable,\n            canTriggerInlineEdits: true\n        });\n    }\n    _modifyText(text, wordSeparators) {\n        const wordBoundary = /\\r\\n|\\r|\\n/.test(text) ? CamelCaseAction.multiLineWordBoundary.get() : CamelCaseAction.singleLineWordBoundary.get();\n        const validWordStart = CamelCaseAction.validWordStart.get();\n        if (!wordBoundary || !validWordStart) {\n            // cannot support this\n            return text;\n        }\n        const words = text.split(wordBoundary);\n        const firstWord = words.shift()?.replace(validWordStart, (start) => start.toLocaleLowerCase());\n        return firstWord + words.map((word) => word.substring(0, 1).toLocaleUpperCase() + word.substring(1))\n            .join('');\n    }\n}\nclass PascalCaseAction extends AbstractCaseAction {\n    static { this.wordBoundary = new BackwardsCompatibleRegExp('[_ \\\\t-]', 'gm'); }\n    static { this.wordBoundaryToMaintain = new BackwardsCompatibleRegExp('(?<=\\\\.)', 'gm'); }\n    static { this.upperCaseWordMatcher = new BackwardsCompatibleRegExp('^\\\\p{Lu}+$', 'mu'); }\n    constructor() {\n        super({\n            id: 'editor.action.transformToPascalcase',\n            label: localize2(1273, \"Transform to Pascal Case\"),\n            precondition: EditorContextKeys.writable,\n            canTriggerInlineEdits: true,\n        });\n    }\n    _modifyText(text, wordSeparators) {\n        const wordBoundary = PascalCaseAction.wordBoundary.get();\n        const wordBoundaryToMaintain = PascalCaseAction.wordBoundaryToMaintain.get();\n        const upperCaseWordMatcher = PascalCaseAction.upperCaseWordMatcher.get();\n        if (!wordBoundary || !wordBoundaryToMaintain || !upperCaseWordMatcher) {\n            // cannot support this\n            return text;\n        }\n        const wordsWithMaintainBoundaries = text.split(wordBoundaryToMaintain);\n        const words = wordsWithMaintainBoundaries.map(word => word.split(wordBoundary)).flat();\n        return words.map(word => {\n            const normalizedWord = word.charAt(0).toLocaleUpperCase() + word.slice(1);\n            const isAllCaps = normalizedWord.length > 1 && upperCaseWordMatcher.test(normalizedWord);\n            if (isAllCaps) {\n                return normalizedWord.charAt(0) + normalizedWord.slice(1).toLocaleLowerCase();\n            }\n            return normalizedWord;\n        }).join('');\n    }\n}\nclass KebabCaseAction extends AbstractCaseAction {\n    static isSupported() {\n        const areAllRegexpsSupported = [\n            this.caseBoundary,\n            this.singleLetters,\n            this.underscoreBoundary,\n        ].every((regexp) => regexp.isSupported());\n        return areAllRegexpsSupported;\n    }\n    static { this.caseBoundary = new BackwardsCompatibleRegExp('(\\\\p{Ll})(\\\\p{Lu})', 'gmu'); }\n    static { this.singleLetters = new BackwardsCompatibleRegExp('(\\\\p{Lu}|\\\\p{N})(\\\\p{Lu}\\\\p{Ll})', 'gmu'); }\n    static { this.underscoreBoundary = new BackwardsCompatibleRegExp('(\\\\S)(_)(\\\\S)', 'gm'); }\n    constructor() {\n        super({\n            id: 'editor.action.transformToKebabcase',\n            label: localize2(1274, 'Transform to Kebab Case'),\n            precondition: EditorContextKeys.writable,\n            canTriggerInlineEdits: true,\n        });\n    }\n    _modifyText(text, _) {\n        const caseBoundary = KebabCaseAction.caseBoundary.get();\n        const singleLetters = KebabCaseAction.singleLetters.get();\n        const underscoreBoundary = KebabCaseAction.underscoreBoundary.get();\n        if (!caseBoundary || !singleLetters || !underscoreBoundary) {\n            // one or more regexps aren't supported\n            return text;\n        }\n        return text\n            .replace(underscoreBoundary, '$1-$3')\n            .replace(caseBoundary, '$1-$2')\n            .replace(singleLetters, '$1-$2')\n            .toLocaleLowerCase();\n    }\n}\nregisterEditorAction(CopyLinesUpAction);\nregisterEditorAction(CopyLinesDownAction);\nregisterEditorAction(DuplicateSelectionAction);\nregisterEditorAction(MoveLinesUpAction);\nregisterEditorAction(MoveLinesDownAction);\nregisterEditorAction(SortLinesAscendingAction);\nregisterEditorAction(SortLinesDescendingAction);\nregisterEditorAction(DeleteDuplicateLinesAction);\nregisterEditorAction(TrimTrailingWhitespaceAction);\nregisterEditorAction(DeleteLinesAction);\nregisterEditorAction(IndentLinesAction);\nregisterEditorAction(OutdentLinesAction);\nregisterEditorAction(InsertLineBeforeAction);\nregisterEditorAction(InsertLineAfterAction);\nregisterEditorAction(DeleteAllLeftAction);\nregisterEditorAction(DeleteAllRightAction);\nregisterEditorAction(JoinLinesAction);\nregisterEditorAction(TransposeAction);\nregisterEditorAction(UpperCaseAction);\nregisterEditorAction(LowerCaseAction);\nregisterEditorAction(ReverseLinesAction);\nif (SnakeCaseAction.caseBoundary.isSupported() && SnakeCaseAction.singleLetters.isSupported()) {\n    registerEditorAction(SnakeCaseAction);\n}\nif (CamelCaseAction.singleLineWordBoundary.isSupported() && CamelCaseAction.multiLineWordBoundary.isSupported()) {\n    registerEditorAction(CamelCaseAction);\n}\nif (PascalCaseAction.wordBoundary.isSupported()) {\n    registerEditorAction(PascalCaseAction);\n}\nif (TitleCaseAction.titleBoundary.isSupported()) {\n    registerEditorAction(TitleCaseAction);\n}\nif (KebabCaseAction.isSupported()) {\n    registerEditorAction(KebabCaseAction);\n}\n\nexport { AbstractCaseAction, AbstractDeleteAllToBoundaryAction, AbstractSortLinesAction, CamelCaseAction, DeleteAllLeftAction, DeleteAllRightAction, DeleteDuplicateLinesAction, DeleteLinesAction, DuplicateSelectionAction, IndentLinesAction, InsertLineAfterAction, InsertLineBeforeAction, JoinLinesAction, KebabCaseAction, LowerCaseAction, PascalCaseAction, ReverseLinesAction, SnakeCaseAction, SortLinesAscendingAction, SortLinesDescendingAction, TitleCaseAction, TransposeAction, TrimTrailingWhitespaceAction, UpperCaseAction };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\n\nconst IDataChannelService = createDecorator('dataChannelService');\nclass NullDataChannelService {\n    getDataChannel(_channelId) {\n        return {\n            sendData: () => { },\n        };\n    }\n}\n\nexport { IDataChannelService, NullDataChannelService };\n","import { Disposable } from '../../../../base/common/lifecycle.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IDataChannelService } from '../../../../platform/dataChannel/common/dataChannel.js';\nimport { observableFromEvent } from '../../../../base/common/observableInternal/observables/observableFromEvent.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/**\n * The sourceLabel must not contain '@'!\n*/\nfunction formatRecordableLogEntry(entry) {\n    // eslint-disable-next-line local/code-no-any-casts\n    return entry.sourceId + ' @@ ' + JSON.stringify({ ...entry, modelUri: entry.modelUri?.toString(), sourceId: undefined });\n}\nlet StructuredLogger = class StructuredLogger extends Disposable {\n    static cast() {\n        return this;\n    }\n    constructor(_key, _contextKeyService, _dataChannelService) {\n        super();\n        this._key = _key;\n        this._contextKeyService = _contextKeyService;\n        this._dataChannelService = _dataChannelService;\n        this._isEnabledContextKeyValue = observableContextKey('structuredLogger.enabled:' + this._key, this._contextKeyService).recomputeInitiallyAndOnChange(this._store);\n        this.isEnabled = this._isEnabledContextKeyValue.map(v => v !== undefined);\n    }\n    log(data) {\n        const enabled = this._isEnabledContextKeyValue.get();\n        if (!enabled) {\n            return false;\n        }\n        this._dataChannelService.getDataChannel('structuredLogger:' + this._key).sendData(data);\n        return true;\n    }\n};\nStructuredLogger = __decorate([\n    __param(1, IContextKeyService),\n    __param(2, IDataChannelService)\n], StructuredLogger);\nfunction observableContextKey(key, contextKeyService) {\n    return observableFromEvent(contextKeyService.onDidChangeContext, () => contextKeyService.getContextKeyValue(key));\n}\n\nexport { StructuredLogger, formatRecordableLogEntry };\n","import { Disposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { ILoggerService, canLog, LogLevel } from '../../../../../platform/log/common/log.js';\nimport { CodeEditorWidget } from '../../../../browser/widget/codeEditor/codeEditorWidget.js';\nimport { StructuredLogger } from '../structuredLogger.js';\nimport { observableFromEvent } from '../../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { autorun } from '../../../../../base/common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet TextModelChangeRecorder = class TextModelChangeRecorder extends Disposable {\n    constructor(_editor, _instantiationService, _loggerService) {\n        super();\n        this._editor = _editor;\n        this._instantiationService = _instantiationService;\n        this._loggerService = _loggerService;\n        this._structuredLogger = this._register(this._instantiationService.createInstance(StructuredLogger.cast(), 'editor.inlineSuggest.logChangeReason.commandId'));\n        const logger = this._loggerService?.createLogger('textModelChanges', { hidden: false, name: 'Text Model Changes Reason' });\n        const loggingLevel = observableFromEvent(this, logger.onDidChangeLogLevel, () => logger.getLevel());\n        this._register(autorun(reader => {\n            if (!canLog(loggingLevel.read(reader), LogLevel.Trace)) {\n                return;\n            }\n            reader.store.add(this._editor.onDidChangeModelContent((e) => {\n                if (this._editor.getModel()?.uri.scheme === 'output') {\n                    return;\n                }\n                logger.trace('onDidChangeModelContent: ' + e.detailedReasons.map(r => r.toKey(Number.MAX_VALUE)).join(', '));\n            }));\n        }));\n        this._register(autorun(reader => {\n            if (!(this._editor instanceof CodeEditorWidget)) {\n                return;\n            }\n            if (!this._structuredLogger.isEnabled.read(reader)) {\n                return;\n            }\n            reader.store.add(this._editor.onDidChangeModelContent(e => {\n                const tm = this._editor.getModel();\n                if (!tm) {\n                    return;\n                }\n                const reason = e.detailedReasons[0];\n                const data = {\n                    ...reason.metadata,\n                    sourceId: 'TextModel.setChangeReason',\n                    source: reason.metadata.source,\n                    time: Date.now(),\n                    modelUri: tm.uri,\n                    modelVersion: tm.getVersionId(),\n                };\n                setTimeout(() => {\n                    // To ensure that this reaches the extension host after the content change event.\n                    // (Without the setTimeout, I observed this command being called before the content change event arrived)\n                    this._structuredLogger.log(data);\n                }, 0);\n            }));\n        }));\n    }\n};\nTextModelChangeRecorder = __decorate([\n    __param(1, IInstantiationService),\n    __param(2, ILoggerService)\n], TextModelChangeRecorder);\n\nexport { TextModelChangeRecorder };\n","import { hasDriveLetter } from './extpath.js';\nimport { isWindows } from './platform.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction normalizeDriveLetter(path, isWindowsOS = isWindows) {\n    if (hasDriveLetter(path, isWindowsOS)) {\n        return path.charAt(0).toUpperCase() + path.slice(1);\n    }\n    return path;\n}\n\nexport { normalizeDriveLetter };\n","import { normalizeDriveLetter } from '../../../../base/common/labels.js';\nimport { basename, dirname } from '../../../../base/common/path.js';\nimport { dirname as dirname$1 } from '../../../../base/common/resources.js';\nimport { isFalsyOrWhitespace, getLeadingWhitespace, splitLines, commonPrefixLength } from '../../../../base/common/strings.js';\nimport { generateUuid } from '../../../../base/common/uuid.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { Text } from './snippetParser.js';\nimport { localize } from '../../../../nls.js';\nimport { toWorkspaceIdentifier, isEmptyWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, WORKSPACE_EXTENSION } from '../../../../platform/workspace/common/workspace.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass CompositeSnippetVariableResolver {\n    constructor(_delegates) {\n        this._delegates = _delegates;\n        //\n    }\n    resolve(variable) {\n        for (const delegate of this._delegates) {\n            const value = delegate.resolve(variable);\n            if (value !== undefined) {\n                return value;\n            }\n        }\n        return undefined;\n    }\n}\nclass SelectionBasedVariableResolver {\n    constructor(_model, _selection, _selectionIdx, _overtypingCapturer) {\n        this._model = _model;\n        this._selection = _selection;\n        this._selectionIdx = _selectionIdx;\n        this._overtypingCapturer = _overtypingCapturer;\n        //\n    }\n    resolve(variable) {\n        const { name } = variable;\n        if (name === 'SELECTION' || name === 'TM_SELECTED_TEXT') {\n            let value = this._model.getValueInRange(this._selection) || undefined;\n            let isMultiline = this._selection.startLineNumber !== this._selection.endLineNumber;\n            // If there was no selected text, try to get last overtyped text\n            if (!value && this._overtypingCapturer) {\n                const info = this._overtypingCapturer.getLastOvertypedInfo(this._selectionIdx);\n                if (info) {\n                    value = info.value;\n                    isMultiline = info.multiline;\n                }\n            }\n            if (value && isMultiline && variable.snippet) {\n                // Selection is a multiline string which we indentation we now\n                // need to adjust. We compare the indentation of this variable\n                // with the indentation at the editor position and add potential\n                // extra indentation to the value\n                const line = this._model.getLineContent(this._selection.startLineNumber);\n                const lineLeadingWhitespace = getLeadingWhitespace(line, 0, this._selection.startColumn - 1);\n                let varLeadingWhitespace = lineLeadingWhitespace;\n                variable.snippet.walk(marker => {\n                    if (marker === variable) {\n                        return false;\n                    }\n                    if (marker instanceof Text) {\n                        varLeadingWhitespace = getLeadingWhitespace(splitLines(marker.value).pop());\n                    }\n                    return true;\n                });\n                const whitespaceCommonLength = commonPrefixLength(varLeadingWhitespace, lineLeadingWhitespace);\n                value = value.replace(/(\\r\\n|\\r|\\n)(.*)/g, (m, newline, rest) => `${newline}${varLeadingWhitespace.substr(whitespaceCommonLength)}${rest}`);\n            }\n            return value;\n        }\n        else if (name === 'TM_CURRENT_LINE') {\n            return this._model.getLineContent(this._selection.positionLineNumber);\n        }\n        else if (name === 'TM_CURRENT_WORD') {\n            const info = this._model.getWordAtPosition({\n                lineNumber: this._selection.positionLineNumber,\n                column: this._selection.positionColumn\n            });\n            return info && info.word || undefined;\n        }\n        else if (name === 'TM_LINE_INDEX') {\n            return String(this._selection.positionLineNumber - 1);\n        }\n        else if (name === 'TM_LINE_NUMBER') {\n            return String(this._selection.positionLineNumber);\n        }\n        else if (name === 'CURSOR_INDEX') {\n            return String(this._selectionIdx);\n        }\n        else if (name === 'CURSOR_NUMBER') {\n            return String(this._selectionIdx + 1);\n        }\n        return undefined;\n    }\n}\nclass ModelBasedVariableResolver {\n    constructor(_labelService, _model) {\n        this._labelService = _labelService;\n        this._model = _model;\n        //\n    }\n    resolve(variable) {\n        const { name } = variable;\n        if (name === 'TM_FILENAME') {\n            return basename(this._model.uri.fsPath);\n        }\n        else if (name === 'TM_FILENAME_BASE') {\n            const name = basename(this._model.uri.fsPath);\n            const idx = name.lastIndexOf('.');\n            if (idx <= 0) {\n                return name;\n            }\n            else {\n                return name.slice(0, idx);\n            }\n        }\n        else if (name === 'TM_DIRECTORY') {\n            if (dirname(this._model.uri.fsPath) === '.') {\n                return '';\n            }\n            return this._labelService.getUriLabel(dirname$1(this._model.uri));\n        }\n        else if (name === 'TM_DIRECTORY_BASE') {\n            if (dirname(this._model.uri.fsPath) === '.') {\n                return '';\n            }\n            return basename(dirname(this._model.uri.fsPath));\n        }\n        else if (name === 'TM_FILEPATH') {\n            return this._labelService.getUriLabel(this._model.uri);\n        }\n        else if (name === 'RELATIVE_FILEPATH') {\n            return this._labelService.getUriLabel(this._model.uri, { relative: true, noPrefix: true });\n        }\n        return undefined;\n    }\n}\nclass ClipboardBasedVariableResolver {\n    constructor(_readClipboardText, _selectionIdx, _selectionCount, _spread) {\n        this._readClipboardText = _readClipboardText;\n        this._selectionIdx = _selectionIdx;\n        this._selectionCount = _selectionCount;\n        this._spread = _spread;\n        //\n    }\n    resolve(variable) {\n        if (variable.name !== 'CLIPBOARD') {\n            return undefined;\n        }\n        const clipboardText = this._readClipboardText();\n        if (!clipboardText) {\n            return undefined;\n        }\n        // `spread` is assigning each cursor a line of the clipboard\n        // text whenever there the line count equals the cursor count\n        // and when enabled\n        if (this._spread) {\n            const lines = clipboardText.split(/\\r\\n|\\n|\\r/).filter(s => !isFalsyOrWhitespace(s));\n            if (lines.length === this._selectionCount) {\n                return lines[this._selectionIdx];\n            }\n        }\n        return clipboardText;\n    }\n}\nlet CommentBasedVariableResolver = class CommentBasedVariableResolver {\n    constructor(_model, _selection, _languageConfigurationService) {\n        this._model = _model;\n        this._selection = _selection;\n        this._languageConfigurationService = _languageConfigurationService;\n        //\n    }\n    resolve(variable) {\n        const { name } = variable;\n        const langId = this._model.getLanguageIdAtPosition(this._selection.selectionStartLineNumber, this._selection.selectionStartColumn);\n        const config = this._languageConfigurationService.getLanguageConfiguration(langId).comments;\n        if (!config) {\n            return undefined;\n        }\n        if (name === 'LINE_COMMENT') {\n            return config.lineCommentToken || undefined;\n        }\n        else if (name === 'BLOCK_COMMENT_START') {\n            return config.blockCommentStartToken || undefined;\n        }\n        else if (name === 'BLOCK_COMMENT_END') {\n            return config.blockCommentEndToken || undefined;\n        }\n        return undefined;\n    }\n};\nCommentBasedVariableResolver = __decorate([\n    __param(2, ILanguageConfigurationService)\n], CommentBasedVariableResolver);\nclass TimeBasedVariableResolver {\n    constructor() {\n        this._date = new Date();\n    }\n    static { this.dayNames = [localize(1406, \"Sunday\"), localize(1407, \"Monday\"), localize(1408, \"Tuesday\"), localize(1409, \"Wednesday\"), localize(1410, \"Thursday\"), localize(1411, \"Friday\"), localize(1412, \"Saturday\")]; }\n    static { this.dayNamesShort = [localize(1413, \"Sun\"), localize(1414, \"Mon\"), localize(1415, \"Tue\"), localize(1416, \"Wed\"), localize(1417, \"Thu\"), localize(1418, \"Fri\"), localize(1419, \"Sat\")]; }\n    static { this.monthNames = [localize(1420, \"January\"), localize(1421, \"February\"), localize(1422, \"March\"), localize(1423, \"April\"), localize(1424, \"May\"), localize(1425, \"June\"), localize(1426, \"July\"), localize(1427, \"August\"), localize(1428, \"September\"), localize(1429, \"October\"), localize(1430, \"November\"), localize(1431, \"December\")]; }\n    static { this.monthNamesShort = [localize(1432, \"Jan\"), localize(1433, \"Feb\"), localize(1434, \"Mar\"), localize(1435, \"Apr\"), localize(1436, \"May\"), localize(1437, \"Jun\"), localize(1438, \"Jul\"), localize(1439, \"Aug\"), localize(1440, \"Sep\"), localize(1441, \"Oct\"), localize(1442, \"Nov\"), localize(1443, \"Dec\")]; }\n    resolve(variable) {\n        const { name } = variable;\n        if (name === 'CURRENT_YEAR') {\n            return String(this._date.getFullYear());\n        }\n        else if (name === 'CURRENT_YEAR_SHORT') {\n            return String(this._date.getFullYear()).slice(-2);\n        }\n        else if (name === 'CURRENT_MONTH') {\n            return String(this._date.getMonth().valueOf() + 1).padStart(2, '0');\n        }\n        else if (name === 'CURRENT_DATE') {\n            return String(this._date.getDate().valueOf()).padStart(2, '0');\n        }\n        else if (name === 'CURRENT_HOUR') {\n            return String(this._date.getHours().valueOf()).padStart(2, '0');\n        }\n        else if (name === 'CURRENT_MINUTE') {\n            return String(this._date.getMinutes().valueOf()).padStart(2, '0');\n        }\n        else if (name === 'CURRENT_SECOND') {\n            return String(this._date.getSeconds().valueOf()).padStart(2, '0');\n        }\n        else if (name === 'CURRENT_DAY_NAME') {\n            return TimeBasedVariableResolver.dayNames[this._date.getDay()];\n        }\n        else if (name === 'CURRENT_DAY_NAME_SHORT') {\n            return TimeBasedVariableResolver.dayNamesShort[this._date.getDay()];\n        }\n        else if (name === 'CURRENT_MONTH_NAME') {\n            return TimeBasedVariableResolver.monthNames[this._date.getMonth()];\n        }\n        else if (name === 'CURRENT_MONTH_NAME_SHORT') {\n            return TimeBasedVariableResolver.monthNamesShort[this._date.getMonth()];\n        }\n        else if (name === 'CURRENT_SECONDS_UNIX') {\n            return String(Math.floor(this._date.getTime() / 1000));\n        }\n        else if (name === 'CURRENT_TIMEZONE_OFFSET') {\n            const rawTimeOffset = this._date.getTimezoneOffset();\n            const sign = rawTimeOffset > 0 ? '-' : '+';\n            const hours = Math.trunc(Math.abs(rawTimeOffset / 60));\n            const hoursString = (hours < 10 ? '0' + hours : hours);\n            const minutes = Math.abs(rawTimeOffset) - hours * 60;\n            const minutesString = (minutes < 10 ? '0' + minutes : minutes);\n            return sign + hoursString + ':' + minutesString;\n        }\n        return undefined;\n    }\n}\nclass WorkspaceBasedVariableResolver {\n    constructor(_workspaceService) {\n        this._workspaceService = _workspaceService;\n        //\n    }\n    resolve(variable) {\n        if (!this._workspaceService) {\n            return undefined;\n        }\n        const workspaceIdentifier = toWorkspaceIdentifier(this._workspaceService.getWorkspace());\n        if (isEmptyWorkspaceIdentifier(workspaceIdentifier)) {\n            return undefined;\n        }\n        if (variable.name === 'WORKSPACE_NAME') {\n            return this._resolveWorkspaceName(workspaceIdentifier);\n        }\n        else if (variable.name === 'WORKSPACE_FOLDER') {\n            return this._resoveWorkspacePath(workspaceIdentifier);\n        }\n        return undefined;\n    }\n    _resolveWorkspaceName(workspaceIdentifier) {\n        if (isSingleFolderWorkspaceIdentifier(workspaceIdentifier)) {\n            return basename(workspaceIdentifier.uri.path);\n        }\n        let filename = basename(workspaceIdentifier.configPath.path);\n        if (filename.endsWith(WORKSPACE_EXTENSION)) {\n            filename = filename.substr(0, filename.length - WORKSPACE_EXTENSION.length - 1);\n        }\n        return filename;\n    }\n    _resoveWorkspacePath(workspaceIdentifier) {\n        if (isSingleFolderWorkspaceIdentifier(workspaceIdentifier)) {\n            return normalizeDriveLetter(workspaceIdentifier.uri.fsPath);\n        }\n        const filename = basename(workspaceIdentifier.configPath.path);\n        let folderpath = workspaceIdentifier.configPath.fsPath;\n        if (folderpath.endsWith(filename)) {\n            folderpath = folderpath.substr(0, folderpath.length - filename.length - 1);\n        }\n        return (folderpath ? normalizeDriveLetter(folderpath) : '/');\n    }\n}\nclass RandomBasedVariableResolver {\n    resolve(variable) {\n        const { name } = variable;\n        if (name === 'RANDOM') {\n            return Math.random().toString().slice(-6);\n        }\n        else if (name === 'RANDOM_HEX') {\n            return Math.random().toString(16).slice(-6);\n        }\n        else if (name === 'UUID') {\n            return generateUuid();\n        }\n        return undefined;\n    }\n}\n\nexport { ClipboardBasedVariableResolver, CommentBasedVariableResolver, CompositeSnippetVariableResolver, ModelBasedVariableResolver, RandomBasedVariableResolver, SelectionBasedVariableResolver, TimeBasedVariableResolver, WorkspaceBasedVariableResolver };\n","import { groupBy } from '../../../../base/common/arrays.js';\nimport { dispose } from '../../../../base/common/lifecycle.js';\nimport { getLeadingWhitespace } from '../../../../base/common/strings.js';\nimport './snippetSession.css';\nimport { EditOperation } from '../../../common/core/editOperation.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { ILabelService } from '../../../../platform/label/common/label.js';\nimport { IWorkspaceContextService } from '../../../../platform/workspace/common/workspace.js';\nimport { Placeholder, Choice, Text, SnippetParser, TextmateSnippet } from './snippetParser.js';\nimport { ModelBasedVariableResolver, CompositeSnippetVariableResolver, ClipboardBasedVariableResolver, SelectionBasedVariableResolver, CommentBasedVariableResolver, TimeBasedVariableResolver, WorkspaceBasedVariableResolver, RandomBasedVariableResolver } from './snippetVariables.js';\nimport { EditSources } from '../../../common/textModelEditSource.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar SnippetSession_1;\nclass OneSnippet {\n    static { this._decor = {\n        active: ModelDecorationOptions.register({ description: 'snippet-placeholder-1', stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */, className: 'snippet-placeholder' }),\n        inactive: ModelDecorationOptions.register({ description: 'snippet-placeholder-2', stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */, className: 'snippet-placeholder' }),\n        activeFinal: ModelDecorationOptions.register({ description: 'snippet-placeholder-3', stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */, className: 'finish-snippet-placeholder' }),\n        inactiveFinal: ModelDecorationOptions.register({ description: 'snippet-placeholder-4', stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */, className: 'finish-snippet-placeholder' }),\n    }; }\n    constructor(_editor, _snippet, _snippetLineLeadingWhitespace) {\n        this._editor = _editor;\n        this._snippet = _snippet;\n        this._snippetLineLeadingWhitespace = _snippetLineLeadingWhitespace;\n        this._offset = -1;\n        this._nestingLevel = 1;\n        this._placeholderGroups = groupBy(_snippet.placeholders, Placeholder.compareByIndex);\n        this._placeholderGroupsIdx = -1;\n    }\n    initialize(textChange) {\n        this._offset = textChange.newPosition;\n    }\n    dispose() {\n        if (this._placeholderDecorations) {\n            this._editor.removeDecorations([...this._placeholderDecorations.values()]);\n        }\n        this._placeholderGroups.length = 0;\n    }\n    _initDecorations() {\n        if (this._offset === -1) {\n            throw new Error(`Snippet not initialized!`);\n        }\n        if (this._placeholderDecorations) {\n            // already initialized\n            return;\n        }\n        this._placeholderDecorations = new Map();\n        const model = this._editor.getModel();\n        this._editor.changeDecorations(accessor => {\n            // create a decoration for each placeholder\n            for (const placeholder of this._snippet.placeholders) {\n                const placeholderOffset = this._snippet.offset(placeholder);\n                const placeholderLen = this._snippet.fullLen(placeholder);\n                const range = Range.fromPositions(model.getPositionAt(this._offset + placeholderOffset), model.getPositionAt(this._offset + placeholderOffset + placeholderLen));\n                const options = placeholder.isFinalTabstop ? OneSnippet._decor.inactiveFinal : OneSnippet._decor.inactive;\n                const handle = accessor.addDecoration(range, options);\n                this._placeholderDecorations.set(placeholder, handle);\n            }\n        });\n    }\n    move(fwd) {\n        if (!this._editor.hasModel()) {\n            return [];\n        }\n        this._initDecorations();\n        // Transform placeholder text if necessary\n        if (this._placeholderGroupsIdx >= 0) {\n            const operations = [];\n            for (const placeholder of this._placeholderGroups[this._placeholderGroupsIdx]) {\n                // Check if the placeholder has a transformation\n                if (placeholder.transform) {\n                    const id = this._placeholderDecorations.get(placeholder);\n                    const range = this._editor.getModel().getDecorationRange(id);\n                    const currentValue = this._editor.getModel().getValueInRange(range);\n                    const transformedValueLines = placeholder.transform.resolve(currentValue).split(/\\r\\n|\\r|\\n/);\n                    // fix indentation for transformed lines\n                    for (let i = 1; i < transformedValueLines.length; i++) {\n                        transformedValueLines[i] = this._editor.getModel().normalizeIndentation(this._snippetLineLeadingWhitespace + transformedValueLines[i]);\n                    }\n                    operations.push(EditOperation.replace(range, transformedValueLines.join(this._editor.getModel().getEOL())));\n                }\n            }\n            if (operations.length > 0) {\n                this._editor.executeEdits('snippet.placeholderTransform', operations);\n            }\n        }\n        let couldSkipThisPlaceholder = false;\n        if (fwd === true && this._placeholderGroupsIdx < this._placeholderGroups.length - 1) {\n            this._placeholderGroupsIdx += 1;\n            couldSkipThisPlaceholder = true;\n        }\n        else if (fwd === false && this._placeholderGroupsIdx > 0) {\n            this._placeholderGroupsIdx -= 1;\n            couldSkipThisPlaceholder = true;\n        }\n        else ;\n        const newSelections = this._editor.getModel().changeDecorations(accessor => {\n            const activePlaceholders = new Set();\n            // change stickiness to always grow when typing at its edges\n            // because these decorations represent the currently active\n            // tabstop.\n            // Special case #1: reaching the final tabstop\n            // Special case #2: placeholders enclosing active placeholders\n            const selections = [];\n            for (const placeholder of this._placeholderGroups[this._placeholderGroupsIdx]) {\n                const id = this._placeholderDecorations.get(placeholder);\n                const range = this._editor.getModel().getDecorationRange(id);\n                selections.push(new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn));\n                // consider to skip this placeholder index when the decoration\n                // range is empty but when the placeholder wasn't. that's a strong\n                // hint that the placeholder has been deleted. (all placeholder must match this)\n                couldSkipThisPlaceholder = couldSkipThisPlaceholder && this._hasPlaceholderBeenCollapsed(placeholder);\n                accessor.changeDecorationOptions(id, placeholder.isFinalTabstop ? OneSnippet._decor.activeFinal : OneSnippet._decor.active);\n                activePlaceholders.add(placeholder);\n                for (const enclosingPlaceholder of this._snippet.enclosingPlaceholders(placeholder)) {\n                    const id = this._placeholderDecorations.get(enclosingPlaceholder);\n                    accessor.changeDecorationOptions(id, enclosingPlaceholder.isFinalTabstop ? OneSnippet._decor.activeFinal : OneSnippet._decor.active);\n                    activePlaceholders.add(enclosingPlaceholder);\n                }\n            }\n            // change stickness to never grow when typing at its edges\n            // so that in-active tabstops never grow\n            for (const [placeholder, id] of this._placeholderDecorations) {\n                if (!activePlaceholders.has(placeholder)) {\n                    accessor.changeDecorationOptions(id, placeholder.isFinalTabstop ? OneSnippet._decor.inactiveFinal : OneSnippet._decor.inactive);\n                }\n            }\n            return selections;\n        });\n        return !couldSkipThisPlaceholder ? newSelections ?? [] : this.move(fwd);\n    }\n    _hasPlaceholderBeenCollapsed(placeholder) {\n        // A placeholder is empty when it wasn't empty when authored but\n        // when its tracking decoration is empty. This also applies to all\n        // potential parent placeholders\n        let marker = placeholder;\n        while (marker) {\n            if (marker instanceof Placeholder) {\n                const id = this._placeholderDecorations.get(marker);\n                const range = this._editor.getModel().getDecorationRange(id);\n                if (range.isEmpty() && marker.toString().length > 0) {\n                    return true;\n                }\n            }\n            marker = marker.parent;\n        }\n        return false;\n    }\n    get isAtFirstPlaceholder() {\n        return this._placeholderGroupsIdx <= 0 || this._placeholderGroups.length === 0;\n    }\n    get isAtLastPlaceholder() {\n        return this._placeholderGroupsIdx === this._placeholderGroups.length - 1;\n    }\n    get hasPlaceholder() {\n        return this._snippet.placeholders.length > 0;\n    }\n    /**\n     * A snippet is trivial when it has no placeholder or only a final placeholder at\n     * its very end\n     */\n    get isTrivialSnippet() {\n        if (this._snippet.placeholders.length === 0) {\n            return true;\n        }\n        if (this._snippet.placeholders.length === 1) {\n            const [placeholder] = this._snippet.placeholders;\n            if (placeholder.isFinalTabstop) {\n                if (this._snippet.rightMostDescendant === placeholder) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n    computePossibleSelections() {\n        const result = new Map();\n        for (const placeholdersWithEqualIndex of this._placeholderGroups) {\n            let ranges;\n            for (const placeholder of placeholdersWithEqualIndex) {\n                if (placeholder.isFinalTabstop) {\n                    // ignore those\n                    break;\n                }\n                if (!ranges) {\n                    ranges = [];\n                    result.set(placeholder.index, ranges);\n                }\n                const id = this._placeholderDecorations.get(placeholder);\n                const range = this._editor.getModel().getDecorationRange(id);\n                if (!range) {\n                    // one of the placeholder lost its decoration and\n                    // therefore we bail out and pretend the placeholder\n                    // (with its mirrors) doesn't exist anymore.\n                    result.delete(placeholder.index);\n                    break;\n                }\n                ranges.push(range);\n            }\n        }\n        return result;\n    }\n    get activeChoice() {\n        if (!this._placeholderDecorations) {\n            return undefined;\n        }\n        const placeholder = this._placeholderGroups[this._placeholderGroupsIdx][0];\n        if (!placeholder?.choice) {\n            return undefined;\n        }\n        const id = this._placeholderDecorations.get(placeholder);\n        if (!id) {\n            return undefined;\n        }\n        const range = this._editor.getModel().getDecorationRange(id);\n        if (!range) {\n            return undefined;\n        }\n        return { range, choice: placeholder.choice };\n    }\n    get hasChoice() {\n        let result = false;\n        this._snippet.walk(marker => {\n            result = marker instanceof Choice;\n            return !result;\n        });\n        return result;\n    }\n    merge(others) {\n        const model = this._editor.getModel();\n        this._nestingLevel *= 10;\n        this._editor.changeDecorations(accessor => {\n            // For each active placeholder take one snippet and merge it\n            // in that the placeholder (can be many for `$1foo$1foo`). Because\n            // everything is sorted by editor selection we can simply remove\n            // elements from the beginning of the array\n            for (const placeholder of this._placeholderGroups[this._placeholderGroupsIdx]) {\n                const nested = others.shift();\n                console.assert(nested._offset !== -1);\n                console.assert(!nested._placeholderDecorations);\n                // Massage placeholder-indicies of the nested snippet to be\n                // sorted right after the insertion point. This ensures we move\n                // through the placeholders in the correct order\n                const indexLastPlaceholder = nested._snippet.placeholderInfo.last.index;\n                for (const nestedPlaceholder of nested._snippet.placeholderInfo.all) {\n                    if (nestedPlaceholder.isFinalTabstop) {\n                        nestedPlaceholder.index = placeholder.index + ((indexLastPlaceholder + 1) / this._nestingLevel);\n                    }\n                    else {\n                        nestedPlaceholder.index = placeholder.index + (nestedPlaceholder.index / this._nestingLevel);\n                    }\n                }\n                this._snippet.replace(placeholder, nested._snippet.children);\n                // Remove the placeholder at which position are inserting\n                // the snippet and also remove its decoration.\n                const id = this._placeholderDecorations.get(placeholder);\n                accessor.removeDecoration(id);\n                this._placeholderDecorations.delete(placeholder);\n                // For each *new* placeholder we create decoration to monitor\n                // how and if it grows/shrinks.\n                for (const placeholder of nested._snippet.placeholders) {\n                    const placeholderOffset = nested._snippet.offset(placeholder);\n                    const placeholderLen = nested._snippet.fullLen(placeholder);\n                    const range = Range.fromPositions(model.getPositionAt(nested._offset + placeholderOffset), model.getPositionAt(nested._offset + placeholderOffset + placeholderLen));\n                    const handle = accessor.addDecoration(range, OneSnippet._decor.inactive);\n                    this._placeholderDecorations.set(placeholder, handle);\n                }\n            }\n            // Last, re-create the placeholder groups by sorting placeholders by their index.\n            this._placeholderGroups = groupBy(this._snippet.placeholders, Placeholder.compareByIndex);\n        });\n    }\n}\nconst _defaultOptions = {\n    overwriteBefore: 0,\n    overwriteAfter: 0,\n    adjustWhitespace: true,\n    clipboardText: undefined,\n    overtypingCapturer: undefined\n};\nlet SnippetSession = SnippetSession_1 = class SnippetSession {\n    static adjustWhitespace(model, position, adjustIndentation, snippet, filter) {\n        const line = model.getLineContent(position.lineNumber);\n        const lineLeadingWhitespace = getLeadingWhitespace(line, 0, position.column - 1);\n        // the snippet as inserted\n        let snippetTextString;\n        snippet.walk(marker => {\n            // all text elements that are not inside choice\n            if (!(marker instanceof Text) || marker.parent instanceof Choice) {\n                return true;\n            }\n            // check with filter (iff provided)\n            if (filter && !filter.has(marker)) {\n                return true;\n            }\n            const lines = marker.value.split(/\\r\\n|\\r|\\n/);\n            if (adjustIndentation) {\n                // adjust indentation of snippet test\n                // -the snippet-start doesn't get extra-indented (lineLeadingWhitespace), only normalized\n                // -all N+1 lines get extra-indented and normalized\n                // -the text start get extra-indented and normalized when following a linebreak\n                const offset = snippet.offset(marker);\n                if (offset === 0) {\n                    // snippet start\n                    lines[0] = model.normalizeIndentation(lines[0]);\n                }\n                else {\n                    // check if text start is after a linebreak\n                    snippetTextString = snippetTextString ?? snippet.toString();\n                    const prevChar = snippetTextString.charCodeAt(offset - 1);\n                    if (prevChar === 10 /* CharCode.LineFeed */ || prevChar === 13 /* CharCode.CarriageReturn */) {\n                        lines[0] = model.normalizeIndentation(lineLeadingWhitespace + lines[0]);\n                    }\n                }\n                for (let i = 1; i < lines.length; i++) {\n                    lines[i] = model.normalizeIndentation(lineLeadingWhitespace + lines[i]);\n                }\n            }\n            const newValue = lines.join(model.getEOL());\n            if (newValue !== marker.value) {\n                marker.parent.replace(marker, [new Text(newValue)]);\n                snippetTextString = undefined;\n            }\n            return true;\n        });\n        return lineLeadingWhitespace;\n    }\n    static adjustSelection(model, selection, overwriteBefore, overwriteAfter) {\n        if (overwriteBefore !== 0 || overwriteAfter !== 0) {\n            // overwrite[Before|After] is compute using the position, not the whole\n            // selection. therefore we adjust the selection around that position\n            const { positionLineNumber, positionColumn } = selection;\n            const positionColumnBefore = positionColumn - overwriteBefore;\n            const positionColumnAfter = positionColumn + overwriteAfter;\n            const range = model.validateRange({\n                startLineNumber: positionLineNumber,\n                startColumn: positionColumnBefore,\n                endLineNumber: positionLineNumber,\n                endColumn: positionColumnAfter\n            });\n            selection = Selection.createWithDirection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn, selection.getDirection());\n        }\n        return selection;\n    }\n    static createEditsAndSnippetsFromSelections(editor, template, overwriteBefore, overwriteAfter, enforceFinalTabstop, adjustWhitespace, clipboardText, overtypingCapturer, languageConfigurationService) {\n        const edits = [];\n        const snippets = [];\n        if (!editor.hasModel()) {\n            return { edits, snippets };\n        }\n        const model = editor.getModel();\n        const workspaceService = editor.invokeWithinContext(accessor => accessor.get(IWorkspaceContextService));\n        const modelBasedVariableResolver = editor.invokeWithinContext(accessor => new ModelBasedVariableResolver(accessor.get(ILabelService), model));\n        const readClipboardText = () => clipboardText;\n        // know what text the overwrite[Before|After] extensions\n        // of the primary cursor have selected because only when\n        // secondary selections extend to the same text we can grow them\n        const firstBeforeText = model.getValueInRange(SnippetSession_1.adjustSelection(model, editor.getSelection(), overwriteBefore, 0));\n        const firstAfterText = model.getValueInRange(SnippetSession_1.adjustSelection(model, editor.getSelection(), 0, overwriteAfter));\n        // remember the first non-whitespace column to decide if\n        // `keepWhitespace` should be overruled for secondary selections\n        const firstLineFirstNonWhitespace = model.getLineFirstNonWhitespaceColumn(editor.getSelection().positionLineNumber);\n        // sort selections by their start position but remeber\n        // the original index. that allows you to create correct\n        // offset-based selection logic without changing the\n        // primary selection\n        const indexedSelections = editor.getSelections()\n            .map((selection, idx) => ({ selection, idx }))\n            .sort((a, b) => Range.compareRangesUsingStarts(a.selection, b.selection));\n        for (const { selection, idx } of indexedSelections) {\n            // extend selection with the `overwriteBefore` and `overwriteAfter` and then\n            // compare if this matches the extensions of the primary selection\n            let extensionBefore = SnippetSession_1.adjustSelection(model, selection, overwriteBefore, 0);\n            let extensionAfter = SnippetSession_1.adjustSelection(model, selection, 0, overwriteAfter);\n            if (firstBeforeText !== model.getValueInRange(extensionBefore)) {\n                extensionBefore = selection;\n            }\n            if (firstAfterText !== model.getValueInRange(extensionAfter)) {\n                extensionAfter = selection;\n            }\n            // merge the before and after selection into one\n            const snippetSelection = selection\n                .setStartPosition(extensionBefore.startLineNumber, extensionBefore.startColumn)\n                .setEndPosition(extensionAfter.endLineNumber, extensionAfter.endColumn);\n            const snippet = new SnippetParser().parse(template, true, enforceFinalTabstop);\n            // adjust the template string to match the indentation and\n            // whitespace rules of this insert location (can be different for each cursor)\n            // happens when being asked for (default) or when this is a secondary\n            // cursor and the leading whitespace is different\n            const start = snippetSelection.getStartPosition();\n            const snippetLineLeadingWhitespace = SnippetSession_1.adjustWhitespace(model, start, adjustWhitespace || (idx > 0 && firstLineFirstNonWhitespace !== model.getLineFirstNonWhitespaceColumn(selection.positionLineNumber)), snippet);\n            snippet.resolveVariables(new CompositeSnippetVariableResolver([\n                modelBasedVariableResolver,\n                new ClipboardBasedVariableResolver(readClipboardText, idx, indexedSelections.length, editor.getOption(88 /* EditorOption.multiCursorPaste */) === 'spread'),\n                new SelectionBasedVariableResolver(model, selection, idx, overtypingCapturer),\n                new CommentBasedVariableResolver(model, selection, languageConfigurationService),\n                new TimeBasedVariableResolver,\n                new WorkspaceBasedVariableResolver(workspaceService),\n                new RandomBasedVariableResolver,\n            ]));\n            // store snippets with the index of their originating selection.\n            // that ensures the primary cursor stays primary despite not being\n            // the one with lowest start position\n            edits[idx] = EditOperation.replace(snippetSelection, snippet.toString());\n            edits[idx].identifier = { major: idx, minor: 0 }; // mark the edit so only our undo edits will be used to generate end cursors\n            edits[idx]._isTracked = true;\n            snippets[idx] = new OneSnippet(editor, snippet, snippetLineLeadingWhitespace);\n        }\n        return { edits, snippets };\n    }\n    static createEditsAndSnippetsFromEdits(editor, snippetEdits, enforceFinalTabstop, adjustWhitespace, clipboardText, overtypingCapturer, languageConfigurationService) {\n        if (!editor.hasModel() || snippetEdits.length === 0) {\n            return { edits: [], snippets: [] };\n        }\n        const edits = [];\n        const model = editor.getModel();\n        const parser = new SnippetParser();\n        const snippet = new TextmateSnippet();\n        // snippet variables resolver\n        const resolver = new CompositeSnippetVariableResolver([\n            editor.invokeWithinContext(accessor => new ModelBasedVariableResolver(accessor.get(ILabelService), model)),\n            new ClipboardBasedVariableResolver(() => clipboardText, 0, editor.getSelections().length, editor.getOption(88 /* EditorOption.multiCursorPaste */) === 'spread'),\n            new SelectionBasedVariableResolver(model, editor.getSelection(), 0, overtypingCapturer),\n            new CommentBasedVariableResolver(model, editor.getSelection(), languageConfigurationService),\n            new TimeBasedVariableResolver,\n            new WorkspaceBasedVariableResolver(editor.invokeWithinContext(accessor => accessor.get(IWorkspaceContextService))),\n            new RandomBasedVariableResolver,\n        ]);\n        //\n        snippetEdits = snippetEdits.sort((a, b) => Range.compareRangesUsingStarts(a.range, b.range));\n        let offset = 0;\n        for (let i = 0; i < snippetEdits.length; i++) {\n            const { range, template, keepWhitespace } = snippetEdits[i];\n            // gaps between snippet edits are appended as text nodes. this\n            // ensures placeholder-offsets are later correct\n            if (i > 0) {\n                const lastRange = snippetEdits[i - 1].range;\n                const textRange = Range.fromPositions(lastRange.getEndPosition(), range.getStartPosition());\n                const textNode = new Text(model.getValueInRange(textRange));\n                snippet.appendChild(textNode);\n                offset += textNode.value.length;\n            }\n            const newNodes = parser.parseFragment(template, snippet);\n            SnippetSession_1.adjustWhitespace(model, range.getStartPosition(), keepWhitespace !== undefined ? !keepWhitespace : adjustWhitespace, snippet, new Set(newNodes));\n            snippet.resolveVariables(resolver);\n            const snippetText = snippet.toString();\n            const snippetFragmentText = snippetText.slice(offset);\n            offset = snippetText.length;\n            // make edit\n            const edit = EditOperation.replace(range, snippetFragmentText);\n            edit.identifier = { major: i, minor: 0 }; // mark the edit so only our undo edits will be used to generate end cursors\n            edit._isTracked = true;\n            edits.push(edit);\n        }\n        //\n        parser.ensureFinalTabstop(snippet, enforceFinalTabstop, true);\n        return {\n            edits,\n            snippets: [new OneSnippet(editor, snippet, '')]\n        };\n    }\n    constructor(_editor, _template, _options = _defaultOptions, _languageConfigurationService) {\n        this._editor = _editor;\n        this._template = _template;\n        this._options = _options;\n        this._languageConfigurationService = _languageConfigurationService;\n        this._templateMerges = [];\n        this._snippets = [];\n    }\n    dispose() {\n        dispose(this._snippets);\n    }\n    _logInfo() {\n        return `template=\"${this._template}\", merged_templates=\"${this._templateMerges.join(' -> ')}\"`;\n    }\n    insert(editReason) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        // make insert edit and start with first selections\n        const { edits, snippets } = typeof this._template === 'string'\n            ? SnippetSession_1.createEditsAndSnippetsFromSelections(this._editor, this._template, this._options.overwriteBefore, this._options.overwriteAfter, false, this._options.adjustWhitespace, this._options.clipboardText, this._options.overtypingCapturer, this._languageConfigurationService)\n            : SnippetSession_1.createEditsAndSnippetsFromEdits(this._editor, this._template, false, this._options.adjustWhitespace, this._options.clipboardText, this._options.overtypingCapturer, this._languageConfigurationService);\n        this._snippets = snippets;\n        this._editor.executeEdits(editReason ?? EditSources.snippet(), edits, _undoEdits => {\n            // Sometimes, the text buffer will remove automatic whitespace when doing any edits,\n            // so we need to look only at the undo edits relevant for us.\n            // Our edits have an identifier set so that's how we can distinguish them\n            const undoEdits = _undoEdits.filter(edit => !!edit.identifier);\n            for (let idx = 0; idx < snippets.length; idx++) {\n                snippets[idx].initialize(undoEdits[idx].textChange);\n            }\n            if (this._snippets[0].hasPlaceholder) {\n                return this._move(true);\n            }\n            else {\n                return undoEdits\n                    .map(edit => Selection.fromPositions(edit.range.getEndPosition()));\n            }\n        });\n        this._editor.revealRange(this._editor.getSelections()[0]);\n    }\n    merge(template, options = _defaultOptions) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        this._templateMerges.push([this._snippets[0]._nestingLevel, this._snippets[0]._placeholderGroupsIdx, template]);\n        const { edits, snippets } = SnippetSession_1.createEditsAndSnippetsFromSelections(this._editor, template, options.overwriteBefore, options.overwriteAfter, true, options.adjustWhitespace, options.clipboardText, options.overtypingCapturer, this._languageConfigurationService);\n        this._editor.executeEdits('snippet', edits, _undoEdits => {\n            // Sometimes, the text buffer will remove automatic whitespace when doing any edits,\n            // so we need to look only at the undo edits relevant for us.\n            // Our edits have an identifier set so that's how we can distinguish them\n            const undoEdits = _undoEdits.filter(edit => !!edit.identifier);\n            for (let idx = 0; idx < snippets.length; idx++) {\n                snippets[idx].initialize(undoEdits[idx].textChange);\n            }\n            // Trivial snippets have no placeholder or are just the final placeholder. That means they\n            // are just text insertions and we don't need to merge the nested snippet into the existing\n            // snippet\n            const isTrivialSnippet = snippets[0].isTrivialSnippet;\n            if (!isTrivialSnippet) {\n                for (const snippet of this._snippets) {\n                    snippet.merge(snippets);\n                }\n                console.assert(snippets.length === 0);\n            }\n            if (this._snippets[0].hasPlaceholder && !isTrivialSnippet) {\n                return this._move(undefined);\n            }\n            else {\n                return undoEdits.map(edit => Selection.fromPositions(edit.range.getEndPosition()));\n            }\n        });\n    }\n    next() {\n        const newSelections = this._move(true);\n        this._editor.setSelections(newSelections);\n        this._editor.revealPositionInCenterIfOutsideViewport(newSelections[0].getPosition());\n    }\n    prev() {\n        const newSelections = this._move(false);\n        this._editor.setSelections(newSelections);\n        this._editor.revealPositionInCenterIfOutsideViewport(newSelections[0].getPosition());\n    }\n    _move(fwd) {\n        const selections = [];\n        for (const snippet of this._snippets) {\n            const oneSelection = snippet.move(fwd);\n            selections.push(...oneSelection);\n        }\n        return selections;\n    }\n    get isAtFirstPlaceholder() {\n        return this._snippets[0].isAtFirstPlaceholder;\n    }\n    get isAtLastPlaceholder() {\n        return this._snippets[0].isAtLastPlaceholder;\n    }\n    get hasPlaceholder() {\n        return this._snippets[0].hasPlaceholder;\n    }\n    get hasChoice() {\n        return this._snippets[0].hasChoice;\n    }\n    get activeChoice() {\n        return this._snippets[0].activeChoice;\n    }\n    isSelectionWithinPlaceholders() {\n        if (!this.hasPlaceholder) {\n            return false;\n        }\n        const selections = this._editor.getSelections();\n        if (selections.length < this._snippets.length) {\n            // this means we started snippet mode with N\n            // selections and have M (N > M) selections.\n            // So one snippet is without selection -> cancel\n            return false;\n        }\n        const allPossibleSelections = new Map();\n        for (const snippet of this._snippets) {\n            const possibleSelections = snippet.computePossibleSelections();\n            // for the first snippet find the placeholder (and its ranges)\n            // that contain at least one selection. for all remaining snippets\n            // the same placeholder (and their ranges) must be used.\n            if (allPossibleSelections.size === 0) {\n                for (const [index, ranges] of possibleSelections) {\n                    ranges.sort(Range.compareRangesUsingStarts);\n                    for (const selection of selections) {\n                        if (ranges[0].containsRange(selection)) {\n                            allPossibleSelections.set(index, []);\n                            break;\n                        }\n                    }\n                }\n            }\n            if (allPossibleSelections.size === 0) {\n                // return false if we couldn't associate a selection to\n                // this (the first) snippet\n                return false;\n            }\n            // add selections from 'this' snippet so that we know all\n            // selections for this placeholder\n            allPossibleSelections.forEach((array, index) => {\n                array.push(...possibleSelections.get(index));\n            });\n        }\n        // sort selections (and later placeholder-ranges). then walk both\n        // arrays and make sure the placeholder-ranges contain the corresponding\n        // selection\n        selections.sort(Range.compareRangesUsingStarts);\n        for (const [index, ranges] of allPossibleSelections) {\n            if (ranges.length !== selections.length) {\n                allPossibleSelections.delete(index);\n                continue;\n            }\n            ranges.sort(Range.compareRangesUsingStarts);\n            for (let i = 0; i < ranges.length; i++) {\n                if (!ranges[i].containsRange(selections[i])) {\n                    allPossibleSelections.delete(index);\n                    continue;\n                }\n            }\n        }\n        // from all possible selections we have deleted those\n        // that don't match with the current selection. if we don't\n        // have any left, we don't have a selection anymore\n        return allPossibleSelections.size > 0;\n    }\n};\nSnippetSession = SnippetSession_1 = __decorate([\n    __param(3, ILanguageConfigurationService)\n], SnippetSession);\n\nexport { OneSnippet, SnippetSession };\n","import { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { registerEditorContribution, EditorCommand, registerEditorCommand } from '../../../browser/editorExtensions.js';\nimport { Position } from '../../../common/core/position.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { showSimpleSuggestions } from '../../suggest/browser/suggest.js';\nimport { localize } from '../../../../nls.js';\nimport { RawContextKey, IContextKeyService, ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport { ILogService } from '../../../../platform/log/common/log.js';\nimport { SnippetSession } from './snippetSession.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { observableValue } from '../../../../base/common/observableInternal/observables/observableValue.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar SnippetController2_1;\nconst _defaultOptions = {\n    overwriteBefore: 0,\n    overwriteAfter: 0,\n    undoStopBefore: true,\n    undoStopAfter: true,\n    adjustWhitespace: true,\n    clipboardText: undefined,\n    overtypingCapturer: undefined\n};\nlet SnippetController2 = class SnippetController2 {\n    static { SnippetController2_1 = this; }\n    static { this.ID = 'snippetController2'; }\n    static get(editor) {\n        return editor.getContribution(SnippetController2_1.ID);\n    }\n    static { this.InSnippetMode = new RawContextKey('inSnippetMode', false, localize(1402, \"Whether the editor in current in snippet mode\")); }\n    static { this.HasNextTabstop = new RawContextKey('hasNextTabstop', false, localize(1403, \"Whether there is a next tab stop when in snippet mode\")); }\n    static { this.HasPrevTabstop = new RawContextKey('hasPrevTabstop', false, localize(1404, \"Whether there is a previous tab stop when in snippet mode\")); }\n    constructor(_editor, _logService, _languageFeaturesService, contextKeyService, _languageConfigurationService) {\n        this._editor = _editor;\n        this._logService = _logService;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._languageConfigurationService = _languageConfigurationService;\n        this._inSnippetObservable = observableValue(this, false);\n        this._snippetListener = new DisposableStore();\n        this._modelVersionId = -1;\n        this._inSnippet = SnippetController2_1.InSnippetMode.bindTo(contextKeyService);\n        this._hasNextTabstop = SnippetController2_1.HasNextTabstop.bindTo(contextKeyService);\n        this._hasPrevTabstop = SnippetController2_1.HasPrevTabstop.bindTo(contextKeyService);\n    }\n    dispose() {\n        this._inSnippet.reset();\n        this._inSnippetObservable.set(false, undefined);\n        this._hasPrevTabstop.reset();\n        this._hasNextTabstop.reset();\n        this._session?.dispose();\n        this._snippetListener.dispose();\n    }\n    insert(template, opts) {\n        // this is here to find out more about the yet-not-understood\n        // error that sometimes happens when we fail to inserted a nested\n        // snippet\n        try {\n            this._doInsert(template, typeof opts === 'undefined' ? _defaultOptions : { ..._defaultOptions, ...opts });\n        }\n        catch (e) {\n            this.cancel();\n            this._logService.error(e);\n            this._logService.error('snippet_error');\n            this._logService.error('insert_template=', template);\n            this._logService.error('existing_template=', this._session ? this._session._logInfo() : '<no_session>');\n        }\n    }\n    _doInsert(template, opts) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        // don't listen while inserting the snippet\n        // as that is the inflight state causing cancelation\n        this._snippetListener.clear();\n        if (opts.undoStopBefore) {\n            this._editor.getModel().pushStackElement();\n        }\n        // don't merge\n        if (this._session && typeof template !== 'string') {\n            this.cancel();\n        }\n        if (!this._session) {\n            this._modelVersionId = this._editor.getModel().getAlternativeVersionId();\n            this._session = new SnippetSession(this._editor, template, opts, this._languageConfigurationService);\n            this._session.insert(opts.reason);\n        }\n        else {\n            assertType(typeof template === 'string');\n            this._session.merge(template, opts);\n        }\n        if (opts.undoStopAfter) {\n            this._editor.getModel().pushStackElement();\n        }\n        // regster completion item provider when there is any choice element\n        if (this._session?.hasChoice) {\n            const provider = {\n                _debugDisplayName: 'snippetChoiceCompletions',\n                provideCompletionItems: (model, position) => {\n                    if (!this._session || model !== this._editor.getModel() || !Position.equals(this._editor.getPosition(), position)) {\n                        return undefined;\n                    }\n                    const { activeChoice } = this._session;\n                    if (!activeChoice || activeChoice.choice.options.length === 0) {\n                        return undefined;\n                    }\n                    const word = model.getValueInRange(activeChoice.range);\n                    const isAnyOfOptions = Boolean(activeChoice.choice.options.find(o => o.value === word));\n                    const suggestions = [];\n                    for (let i = 0; i < activeChoice.choice.options.length; i++) {\n                        const option = activeChoice.choice.options[i];\n                        suggestions.push({\n                            kind: 13 /* CompletionItemKind.Value */,\n                            label: option.value,\n                            insertText: option.value,\n                            sortText: 'a'.repeat(i + 1),\n                            range: activeChoice.range,\n                            filterText: isAnyOfOptions ? `${word}_${option.value}` : undefined,\n                            command: { id: 'jumpToNextSnippetPlaceholder', title: localize(1405, 'Go to next placeholder...') }\n                        });\n                    }\n                    return { suggestions };\n                }\n            };\n            const model = this._editor.getModel();\n            let registration;\n            let isRegistered = false;\n            const disable = () => {\n                registration?.dispose();\n                isRegistered = false;\n            };\n            const enable = () => {\n                if (!isRegistered) {\n                    registration = this._languageFeaturesService.completionProvider.register({\n                        language: model.getLanguageId(),\n                        pattern: model.uri.fsPath,\n                        scheme: model.uri.scheme,\n                        exclusive: true\n                    }, provider);\n                    this._snippetListener.add(registration);\n                    isRegistered = true;\n                }\n            };\n            this._choiceCompletions = { provider, enable, disable };\n        }\n        this._updateState();\n        this._snippetListener.add(this._editor.onDidChangeModelContent(e => e.isFlush && this.cancel()));\n        this._snippetListener.add(this._editor.onDidChangeModel(() => this.cancel()));\n        this._snippetListener.add(this._editor.onDidChangeCursorSelection(() => this._updateState()));\n    }\n    _updateState() {\n        if (!this._session || !this._editor.hasModel()) {\n            // canceled in the meanwhile\n            return;\n        }\n        if (this._modelVersionId === this._editor.getModel().getAlternativeVersionId()) {\n            // undo until the 'before' state happened\n            // and makes use cancel snippet mode\n            return this.cancel();\n        }\n        if (!this._session.hasPlaceholder) {\n            // don't listen for selection changes and don't\n            // update context keys when the snippet is plain text\n            return this.cancel();\n        }\n        if (this._session.isAtLastPlaceholder || !this._session.isSelectionWithinPlaceholders()) {\n            this._editor.getModel().pushStackElement();\n            return this.cancel();\n        }\n        this._inSnippet.set(true);\n        this._inSnippetObservable.set(true, undefined);\n        this._hasPrevTabstop.set(!this._session.isAtFirstPlaceholder);\n        this._hasNextTabstop.set(!this._session.isAtLastPlaceholder);\n        this._handleChoice();\n    }\n    _handleChoice() {\n        if (!this._session || !this._editor.hasModel()) {\n            this._currentChoice = undefined;\n            return;\n        }\n        const { activeChoice } = this._session;\n        if (!activeChoice || !this._choiceCompletions) {\n            this._choiceCompletions?.disable();\n            this._currentChoice = undefined;\n            return;\n        }\n        if (this._currentChoice !== activeChoice.choice) {\n            this._currentChoice = activeChoice.choice;\n            this._choiceCompletions.enable();\n            // trigger suggest with the special choice completion provider\n            queueMicrotask(() => {\n                showSimpleSuggestions(this._editor, this._choiceCompletions.provider);\n            });\n        }\n    }\n    finish() {\n        while (this._inSnippet.get()) {\n            this.next();\n        }\n    }\n    cancel(resetSelection = false) {\n        this._inSnippet.reset();\n        this._inSnippetObservable.set(false, undefined);\n        this._hasPrevTabstop.reset();\n        this._hasNextTabstop.reset();\n        this._snippetListener.clear();\n        this._currentChoice = undefined;\n        this._session?.dispose();\n        this._session = undefined;\n        this._modelVersionId = -1;\n        if (resetSelection) {\n            // reset selection to the primary cursor when being asked\n            // for. this happens when explicitly cancelling snippet mode,\n            // e.g. when pressing ESC\n            this._editor.setSelections([this._editor.getSelection()]);\n        }\n    }\n    prev() {\n        this._session?.prev();\n        this._updateState();\n    }\n    next() {\n        this._session?.next();\n        this._updateState();\n    }\n    isInSnippet() {\n        return Boolean(this._inSnippet.get());\n    }\n    get isInSnippetObservable() {\n        return this._inSnippetObservable;\n    }\n};\nSnippetController2 = SnippetController2_1 = __decorate([\n    __param(1, ILogService),\n    __param(2, ILanguageFeaturesService),\n    __param(3, IContextKeyService),\n    __param(4, ILanguageConfigurationService)\n], SnippetController2);\nregisterEditorContribution(SnippetController2.ID, SnippetController2, 4 /* EditorContributionInstantiation.Lazy */);\nconst CommandCtor = EditorCommand.bindToContribution(SnippetController2.get);\nregisterEditorCommand(new CommandCtor({\n    id: 'jumpToNextSnippetPlaceholder',\n    precondition: ContextKeyExpr.and(SnippetController2.InSnippetMode, SnippetController2.HasNextTabstop),\n    handler: ctrl => ctrl.next(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 30,\n        kbExpr: EditorContextKeys.textInputFocus,\n        primary: 2 /* KeyCode.Tab */\n    }\n}));\nregisterEditorCommand(new CommandCtor({\n    id: 'jumpToPrevSnippetPlaceholder',\n    precondition: ContextKeyExpr.and(SnippetController2.InSnippetMode, SnippetController2.HasPrevTabstop),\n    handler: ctrl => ctrl.prev(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 30,\n        kbExpr: EditorContextKeys.textInputFocus,\n        primary: 1024 /* KeyMod.Shift */ | 2 /* KeyCode.Tab */\n    }\n}));\nregisterEditorCommand(new CommandCtor({\n    id: 'leaveSnippet',\n    precondition: SnippetController2.InSnippetMode,\n    handler: ctrl => ctrl.cancel(true),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 30,\n        kbExpr: EditorContextKeys.textInputFocus,\n        primary: 9 /* KeyCode.Escape */,\n        secondary: [1024 /* KeyMod.Shift */ | 9 /* KeyCode.Escape */]\n    }\n}));\nregisterEditorCommand(new CommandCtor({\n    id: 'acceptSnippet',\n    precondition: SnippetController2.InSnippetMode,\n    handler: ctrl => ctrl.finish(),\n    // kbOpts: {\n    // \tweight: KeybindingWeight.EditorContrib + 30,\n    // \tkbExpr: EditorContextKeys.textFocus,\n    // \tprimary: KeyCode.Enter,\n    // }\n}));\n\nexport { SnippetController2 };\n","import './positionToOffset.js';\nimport { PositionOffsetTransformerBase } from './positionToOffsetImpl.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction getPositionOffsetTransformerFromTextModel(textModel) {\n    return new PositionOffsetTransformerWithTextModel(textModel);\n}\nclass PositionOffsetTransformerWithTextModel extends PositionOffsetTransformerBase {\n    constructor(_textModel) {\n        super();\n        this._textModel = _textModel;\n    }\n    getOffset(position) {\n        return this._textModel.getOffsetAt(position);\n    }\n    getPosition(offset) {\n        return this._textModel.getPositionAt(offset);\n    }\n}\n\nexport { getPositionOffsetTransformerFromTextModel };\n","import { Permutation, compareBy } from '../../../../base/common/arrays.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { bindContextKey } from '../../../../platform/observable/common/platformObservableUtils.js';\nimport { Range } from '../../../common/core/range.js';\nimport { TextEdit } from '../../../common/core/edits/textEdit.js';\nimport { getPositionOffsetTransformerFromTextModel } from '../../../common/core/text/getPositionOffsetTransformerFromTextModel.js';\nimport { observableValue } from '../../../../base/common/observableInternal/observables/observableValue.js';\nimport { autorun } from '../../../../base/common/observableInternal/reactions/autorun.js';\nimport { transaction } from '../../../../base/common/observableInternal/transaction.js';\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 *--------------------------------------------------------------------------------------------*/\nconst array = [];\nfunction getReadonlyEmptyArray() {\n    return array;\n}\nfunction getEndPositionsAfterApplying(edits) {\n    const newRanges = getModifiedRangesAfterApplying(edits);\n    return newRanges.map(range => range.getEndPosition());\n}\nfunction getModifiedRangesAfterApplying(edits) {\n    const sortPerm = Permutation.createSortPermutation(edits, compareBy(e => e.range, Range.compareRangesUsingStarts));\n    const edit = new TextEdit(sortPerm.apply(edits));\n    const sortedNewRanges = edit.getNewRanges();\n    return sortPerm.inverse().apply(sortedNewRanges);\n}\nfunction removeTextReplacementCommonSuffixPrefix(edits, textModel) {\n    const transformer = getPositionOffsetTransformerFromTextModel(textModel);\n    const text = textModel.getValue();\n    const stringReplacements = edits.map(edit => transformer.getStringReplacement(edit));\n    const minimalStringReplacements = stringReplacements.map(replacement => replacement.removeCommonSuffixPrefix(text));\n    return minimalStringReplacements.map(replacement => transformer.getTextReplacement(replacement));\n}\nfunction convertItemsToStableObservables(items, store) {\n    const result = observableValue('result', []);\n    const innerObservables = [];\n    store.add(autorun(reader => {\n        const itemsValue = items.read(reader);\n        transaction(tx => {\n            if (itemsValue.length !== innerObservables.length) {\n                innerObservables.length = itemsValue.length;\n                for (let i = 0; i < innerObservables.length; i++) {\n                    if (!innerObservables[i]) {\n                        innerObservables[i] = observableValue('item', itemsValue[i]);\n                    }\n                }\n                result.set([...innerObservables], tx);\n            }\n            innerObservables.forEach((o, i) => o.set(itemsValue[i], tx));\n        });\n    }));\n    return result;\n}\nclass ObservableContextKeyService {\n    constructor(_contextKeyService) {\n        this._contextKeyService = _contextKeyService;\n    }\n    bind(key, obs) {\n        return bindContextKey(key, this._contextKeyService, obs instanceof Function ? obs : reader => obs.read(reader));\n    }\n}\nfunction wait(ms, cancellationToken) {\n    return new Promise(resolve => {\n        let d = undefined;\n        const handle = setTimeout(() => {\n            if (d) {\n                d.dispose();\n            }\n            resolve();\n        }, ms);\n        if (cancellationToken) {\n            d = cancellationToken.onCancellationRequested(() => {\n                clearTimeout(handle);\n                if (d) {\n                    d.dispose();\n                }\n                resolve();\n            });\n        }\n    });\n}\n\nexport { ObservableContextKeyService, convertItemsToStableObservables, getEndPositionsAfterApplying, getModifiedRangesAfterApplying, getReadonlyEmptyArray, removeTextReplacementCommonSuffixPrefix, wait };\n","import { getActiveWindow } from '../../../../../base/browser/dom.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { observableSignal } from '../../../../../base/common/observableInternal/observables/observableSignal.js';\nimport { observableValue } from '../../../../../base/common/observableInternal/observables/observableValue.js';\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 *--------------------------------------------------------------------------------------------*/\nclass AnimatedValue {\n    constructor(startValue, endValue, durationMs, _interpolationFunction = easeOutExpo) {\n        this.startValue = startValue;\n        this.endValue = endValue;\n        this.durationMs = durationMs;\n        this._interpolationFunction = _interpolationFunction;\n        this.startTimeMs = Date.now();\n        if (startValue === endValue) {\n            this.durationMs = 0;\n        }\n    }\n    isFinished() {\n        return Date.now() >= this.startTimeMs + this.durationMs;\n    }\n    getValue() {\n        const timePassed = Date.now() - this.startTimeMs;\n        if (timePassed >= this.durationMs) {\n            return this.endValue;\n        }\n        const value = this._interpolationFunction(timePassed, this.startValue, this.endValue - this.startValue, this.durationMs);\n        return value;\n    }\n}\nfunction easeOutExpo(passedTime, start, length, totalDuration) {\n    return passedTime === totalDuration\n        ? start + length\n        : length * (-Math.pow(2, -10 * passedTime / totalDuration) + 1) + start;\n}\nfunction easeOutCubic(passedTime, start, length, totalDuration) {\n    return length * ((passedTime = passedTime / totalDuration - 1) * passedTime * passedTime + 1) + start;\n}\nclass ObservableAnimatedValue {\n    constructor(initialValue) {\n        this._value = observableValue(this, initialValue);\n    }\n    getValue(reader) {\n        const value = this._value.read(reader);\n        if (!value.isFinished()) {\n            AnimationFrameScheduler.instance.invalidateOnNextAnimationFrame(reader);\n        }\n        return value.getValue();\n    }\n}\nclass AnimationFrameScheduler {\n    constructor() {\n        this._counter = observableSignal(this);\n        this._isScheduled = false;\n    }\n    static { this.instance = new AnimationFrameScheduler(); }\n    invalidateOnNextAnimationFrame(reader) {\n        this._counter.read(reader);\n        if (!this._isScheduled) {\n            this._isScheduled = true;\n            getActiveWindow().requestAnimationFrame(() => {\n                this._isScheduled = false;\n                this._update();\n            });\n        }\n    }\n    _update() {\n        this._counter.trigger(undefined);\n    }\n}\n\nexport { AnimatedValue, AnimationFrameScheduler, ObservableAnimatedValue, easeOutCubic, easeOutExpo };\n","import { equals } from '../../../../../base/common/arrays.js';\nimport { splitLines } from '../../../../../base/common/strings.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { TextEdit, TextReplacement } from '../../../../common/core/edits/textEdit.js';\nimport { LineDecoration } from '../../../../common/viewLayout/lineDecorations.js';\nimport { assertFn, checkAdjacentItems } from '../../../../../base/common/assert.js';\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 *--------------------------------------------------------------------------------------------*/\nclass GhostText {\n    constructor(lineNumber, parts) {\n        this.lineNumber = lineNumber;\n        this.parts = parts;\n        assertFn(() => checkAdjacentItems(parts, (p1, p2) => p1.column <= p2.column));\n    }\n    equals(other) {\n        return this.lineNumber === other.lineNumber &&\n            this.parts.length === other.parts.length &&\n            this.parts.every((part, index) => part.equals(other.parts[index]));\n    }\n    renderForScreenReader(lineText) {\n        if (this.parts.length === 0) {\n            return '';\n        }\n        const lastPart = this.parts[this.parts.length - 1];\n        const cappedLineText = lineText.substr(0, lastPart.column - 1);\n        const text = new TextEdit([\n            ...this.parts.map(p => new TextReplacement(Range.fromPositions(new Position(1, p.column)), p.lines.map(line => line.line).join('\\n'))),\n        ]).applyToString(cappedLineText);\n        return text.substring(this.parts[0].column - 1);\n    }\n    isEmpty() {\n        return this.parts.every(p => p.lines.length === 0);\n    }\n    get lineCount() {\n        return 1 + this.parts.reduce((r, p) => r + p.lines.length - 1, 0);\n    }\n}\nclass GhostTextPart {\n    constructor(column, text, \n    /**\n     * Indicates if this part is a preview of an inline suggestion when a suggestion is previewed.\n    */\n    preview, _inlineDecorations = []) {\n        this.column = column;\n        this.text = text;\n        this.preview = preview;\n        this._inlineDecorations = _inlineDecorations;\n        this.lines = splitLines(this.text).map((line, i) => ({\n            line,\n            lineDecorations: LineDecoration.filter(this._inlineDecorations, i + 1, 1, line.length + 1)\n        }));\n    }\n    equals(other) {\n        return this.column === other.column &&\n            this.lines.length === other.lines.length &&\n            this.lines.every((line, index) => line.line === other.lines[index].line &&\n                LineDecoration.equalsArr(line.lineDecorations, other.lines[index].lineDecorations));\n    }\n}\nclass GhostTextReplacement {\n    constructor(lineNumber, columnRange, text, additionalReservedLineCount = 0) {\n        this.lineNumber = lineNumber;\n        this.columnRange = columnRange;\n        this.text = text;\n        this.additionalReservedLineCount = additionalReservedLineCount;\n        this.parts = [\n            new GhostTextPart(this.columnRange.endColumnExclusive, this.text, false),\n        ];\n        this.newLines = splitLines(this.text);\n    }\n    renderForScreenReader(_lineText) {\n        return this.newLines.join('\\n');\n    }\n    get lineCount() {\n        return this.newLines.length;\n    }\n    isEmpty() {\n        return this.parts.every(p => p.lines.length === 0);\n    }\n    equals(other) {\n        return this.lineNumber === other.lineNumber &&\n            this.columnRange.equals(other.columnRange) &&\n            this.newLines.length === other.newLines.length &&\n            this.newLines.every((line, index) => line === other.newLines[index]) &&\n            this.additionalReservedLineCount === other.additionalReservedLineCount;\n    }\n}\nfunction ghostTextsOrReplacementsEqual(a, b) {\n    return equals(a, b, ghostTextOrReplacementEquals);\n}\nfunction ghostTextOrReplacementEquals(a, b) {\n    if (a === b) {\n        return true;\n    }\n    if (!a || !b) {\n        return false;\n    }\n    if (a instanceof GhostText && b instanceof GhostText) {\n        return a.equals(b);\n    }\n    if (a instanceof GhostTextReplacement && b instanceof GhostTextReplacement) {\n        return a.equals(b);\n    }\n    return false;\n}\n\nexport { GhostText, GhostTextPart, GhostTextReplacement, ghostTextOrReplacementEquals, ghostTextsOrReplacementsEqual };\n","import { commonPrefixLength } from '../../../../../base/common/strings.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { TextLength } from '../../../../common/core/text/textLength.js';\nimport { TextReplacement } from '../../../../common/core/edits/textEdit.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction singleTextRemoveCommonPrefix(edit, model, validModelRange) {\n    const modelRange = validModelRange ? edit.range.intersectRanges(validModelRange) : edit.range;\n    if (!modelRange) {\n        return edit;\n    }\n    const normalizedText = edit.text.replaceAll('\\r\\n', '\\n');\n    const valueToReplace = model.getValueInRange(modelRange, 1 /* EndOfLinePreference.LF */);\n    const commonPrefixLen = commonPrefixLength(valueToReplace, normalizedText);\n    const start = TextLength.ofText(valueToReplace.substring(0, commonPrefixLen)).addToPosition(edit.range.getStartPosition());\n    const text = normalizedText.substring(commonPrefixLen);\n    const range = Range.fromPositions(start, edit.range.getEndPosition());\n    return new TextReplacement(range, text);\n}\nfunction singleTextEditAugments(edit, base) {\n    // The augmented completion must replace the base range, but can replace even more\n    return edit.text.startsWith(base.text) && rangeExtends(edit.range, base.range);\n}\nfunction rangeExtends(extendingRange, rangeToExtend) {\n    return rangeToExtend.getStartPosition().equals(extendingRange.getStartPosition())\n        && rangeToExtend.getEndPosition().isBeforeOrEqual(extendingRange.getEndPosition());\n}\n\nexport { singleTextEditAugments, singleTextRemoveCommonPrefix };\n","import { LcsDiff } from '../../../../../base/common/diff/diff.js';\nimport { getLeadingWhitespace } from '../../../../../base/common/strings.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { TextReplacement } from '../../../../common/core/edits/textEdit.js';\nimport { GhostTextPart, GhostText } from './ghostText.js';\nimport { singleTextRemoveCommonPrefix } from './singleTextEditHelpers.js';\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/**\n * @param previewSuffixLength Sets where to split `inlineCompletion.text`.\n * \tIf the text is `hello` and the suffix length is 2, the non-preview part is `hel` and the preview-part is `lo`.\n*/\nfunction computeGhostText(edit, model, mode, cursorPosition, previewSuffixLength = 0) {\n    let e = singleTextRemoveCommonPrefix(edit, model);\n    if (e.range.endLineNumber !== e.range.startLineNumber) {\n        // This edit might span multiple lines, but the first lines must be a common prefix.\n        return undefined;\n    }\n    const sourceLine = model.getLineContent(e.range.startLineNumber);\n    const sourceIndentationLength = getLeadingWhitespace(sourceLine).length;\n    const suggestionTouchesIndentation = e.range.startColumn - 1 <= sourceIndentationLength;\n    if (suggestionTouchesIndentation) {\n        // source:      ··········[······abc]\n        //                         ^^^^^^^^^ inlineCompletion.range\n        //              ^^^^^^^^^^ ^^^^^^ sourceIndentationLength\n        //                         ^^^^^^ replacedIndentation.length\n        //                               ^^^ rangeThatDoesNotReplaceIndentation\n        // inlineCompletion.text: '··foo'\n        //                         ^^ suggestionAddedIndentationLength\n        const suggestionAddedIndentationLength = getLeadingWhitespace(e.text).length;\n        const replacedIndentation = sourceLine.substring(e.range.startColumn - 1, sourceIndentationLength);\n        const [startPosition, endPosition] = [e.range.getStartPosition(), e.range.getEndPosition()];\n        const newStartPosition = startPosition.column + replacedIndentation.length <= endPosition.column\n            ? startPosition.delta(0, replacedIndentation.length)\n            : endPosition;\n        const rangeThatDoesNotReplaceIndentation = Range.fromPositions(newStartPosition, endPosition);\n        const suggestionWithoutIndentationChange = e.text.startsWith(replacedIndentation)\n            // Adds more indentation without changing existing indentation: We can add ghost text for this\n            ? e.text.substring(replacedIndentation.length)\n            // Changes or removes existing indentation. Only add ghost text for the non-indentation part.\n            : e.text.substring(suggestionAddedIndentationLength);\n        e = new TextReplacement(rangeThatDoesNotReplaceIndentation, suggestionWithoutIndentationChange);\n    }\n    // This is a single line string\n    const valueToBeReplaced = model.getValueInRange(e.range);\n    const changes = cachingDiff(valueToBeReplaced, e.text);\n    if (!changes) {\n        // No ghost text in case the diff would be too slow to compute\n        return undefined;\n    }\n    const lineNumber = e.range.startLineNumber;\n    const parts = new Array();\n    if (mode === 'prefix') {\n        const filteredChanges = changes.filter(c => c.originalLength === 0);\n        if (filteredChanges.length > 1 || filteredChanges.length === 1 && filteredChanges[0].originalStart !== valueToBeReplaced.length) {\n            // Prefixes only have a single change.\n            return undefined;\n        }\n    }\n    const previewStartInCompletionText = e.text.length - previewSuffixLength;\n    for (const c of changes) {\n        const insertColumn = e.range.startColumn + c.originalStart + c.originalLength;\n        if (mode === 'subwordSmart' && cursorPosition && cursorPosition.lineNumber === e.range.startLineNumber && insertColumn < cursorPosition.column) {\n            // No ghost text before cursor\n            return undefined;\n        }\n        if (c.originalLength > 0) {\n            return undefined;\n        }\n        if (c.modifiedLength === 0) {\n            continue;\n        }\n        const modifiedEnd = c.modifiedStart + c.modifiedLength;\n        const nonPreviewTextEnd = Math.max(c.modifiedStart, Math.min(modifiedEnd, previewStartInCompletionText));\n        const nonPreviewText = e.text.substring(c.modifiedStart, nonPreviewTextEnd);\n        const italicText = e.text.substring(nonPreviewTextEnd, Math.max(c.modifiedStart, modifiedEnd));\n        if (nonPreviewText.length > 0) {\n            parts.push(new GhostTextPart(insertColumn, nonPreviewText, false));\n        }\n        if (italicText.length > 0) {\n            parts.push(new GhostTextPart(insertColumn, italicText, true));\n        }\n    }\n    return new GhostText(lineNumber, parts);\n}\nlet lastRequest = undefined;\nfunction cachingDiff(originalValue, newValue) {\n    if (lastRequest?.originalValue === originalValue && lastRequest?.newValue === newValue) {\n        return lastRequest?.changes;\n    }\n    else {\n        let changes = smartDiff(originalValue, newValue, true);\n        if (changes) {\n            const deletedChars = deletedCharacters(changes);\n            if (deletedChars > 0) {\n                // For performance reasons, don't compute diff if there is nothing to improve\n                const newChanges = smartDiff(originalValue, newValue, false);\n                if (newChanges && deletedCharacters(newChanges) < deletedChars) {\n                    // Disabling smartness seems to be better here\n                    changes = newChanges;\n                }\n            }\n        }\n        lastRequest = {\n            originalValue,\n            newValue,\n            changes\n        };\n        return changes;\n    }\n}\nfunction deletedCharacters(changes) {\n    let sum = 0;\n    for (const c of changes) {\n        sum += c.originalLength;\n    }\n    return sum;\n}\n/**\n * When matching `if ()` with `if (f() = 1) { g(); }`,\n * align it like this:        `if (       )`\n * Not like this:\t\t\t  `if (  )`\n * Also not like this:\t\t  `if (             )`.\n *\n * The parenthesis are preprocessed to ensure that they match correctly.\n */\nfunction smartDiff(originalValue, newValue, smartBracketMatching) {\n    if (originalValue.length > 5000 || newValue.length > 5000) {\n        // We don't want to work on strings that are too big\n        return undefined;\n    }\n    function getMaxCharCode(val) {\n        let maxCharCode = 0;\n        for (let i = 0, len = val.length; i < len; i++) {\n            const charCode = val.charCodeAt(i);\n            if (charCode > maxCharCode) {\n                maxCharCode = charCode;\n            }\n        }\n        return maxCharCode;\n    }\n    const maxCharCode = Math.max(getMaxCharCode(originalValue), getMaxCharCode(newValue));\n    function getUniqueCharCode(id) {\n        if (id < 0) {\n            throw new Error('unexpected');\n        }\n        return maxCharCode + id + 1;\n    }\n    function getElements(source) {\n        let level = 0;\n        let group = 0;\n        const characters = new Int32Array(source.length);\n        for (let i = 0, len = source.length; i < len; i++) {\n            // TODO support more brackets\n            if (smartBracketMatching && source[i] === '(') {\n                const id = group * 100 + level;\n                characters[i] = getUniqueCharCode(2 * id);\n                level++;\n            }\n            else if (smartBracketMatching && source[i] === ')') {\n                level = Math.max(level - 1, 0);\n                const id = group * 100 + level;\n                characters[i] = getUniqueCharCode(2 * id + 1);\n                if (level === 0) {\n                    group++;\n                }\n            }\n            else {\n                characters[i] = source.charCodeAt(i);\n            }\n        }\n        return characters;\n    }\n    const elements1 = getElements(originalValue);\n    const elements2 = getElements(newValue);\n    return new LcsDiff({ getElements: () => elements1 }, { getElements: () => elements2 }).ComputeDiff(false).changes;\n}\n\nexport { computeGhostText, smartDiff };\n","import { BugIndicatingError } from '../../errors.js';\nimport { strictEquals } from '../../equals.js';\nimport '../../event.js';\nimport '../../lifecycle.js';\nimport { subtransaction } from '../transaction.js';\nimport { DebugNameData } from '../debugName.js';\nimport { DerivedWithSetter } from '../observables/derivedImpl.js';\nimport { DebugLocation } from '../debugLocation.js';\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/**\n * Creates an observable value that is based on values and changes from other observables.\n * Additionally, a reducer can report how that state changed.\n*/\nfunction observableReducerSettable(owner, options) {\n    let prevValue = undefined;\n    let hasValue = false;\n    const d = new DerivedWithSetter(new DebugNameData(owner, undefined, options.update), (reader, changeSummary) => {\n        if (!hasValue) {\n            prevValue = options.initial instanceof Function ? options.initial() : options.initial;\n            hasValue = true;\n        }\n        const newValue = options.update(reader, prevValue, changeSummary);\n        prevValue = newValue;\n        return newValue;\n    }, options.changeTracker, () => {\n        if (hasValue) {\n            options.disposeFinal?.(prevValue);\n            hasValue = false;\n        }\n    }, options.equalityComparer ?? strictEquals, (value, tx, change) => {\n        if (!hasValue) {\n            throw new BugIndicatingError('Can only set when there is a listener! This is to prevent leaks.');\n        }\n        subtransaction(tx, tx => {\n            prevValue = value;\n            d.setValue(value, tx, change);\n        });\n    }, DebugLocation.ofCaller());\n    return d;\n}\n\nexport { observableReducerSettable };\n","import { ITelemetryService } from '../../telemetry/common/telemetry.js';\nimport { IDataChannelService } from '../common/dataChannel.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass InterceptingTelemetryService {\n    constructor(_baseService, _intercept) {\n        this._baseService = _baseService;\n        this._intercept = _intercept;\n    }\n    publicLog2(eventName, data) {\n        this._intercept(eventName, data);\n        this._baseService.publicLog2(eventName, data);\n    }\n}\nlet DataChannelForwardingTelemetryService = class DataChannelForwardingTelemetryService extends InterceptingTelemetryService {\n    constructor(telemetryService, dataChannelService) {\n        super(telemetryService, (eventName, data) => {\n            // filter for extension\n            let forward = true;\n            if (data && shouldForwardToChannel in data) {\n                forward = Boolean(data[shouldForwardToChannel]);\n            }\n            if (forward) {\n                dataChannelService.getDataChannel('editTelemetry').sendData({ eventName, data: data ?? {} });\n            }\n        });\n    }\n};\nDataChannelForwardingTelemetryService = __decorate([\n    __param(0, ITelemetryService),\n    __param(1, IDataChannelService)\n], DataChannelForwardingTelemetryService);\nconst shouldForwardToChannel = Symbol('shouldForwardToChannel');\nfunction forwardToChannelIf(value) {\n    return {\n        // This will not be sent via telemetry, it is just a marker\n        [shouldForwardToChannel]: value\n    };\n}\nfunction isCopilotLikeExtension(extensionId) {\n    if (!extensionId) {\n        return false;\n    }\n    const extIdLowerCase = extensionId.toLowerCase();\n    return extIdLowerCase === 'github.copilot' || extIdLowerCase === 'github.copilot-chat';\n}\n\nexport { DataChannelForwardingTelemetryService, InterceptingTelemetryService, forwardToChannelIf, isCopilotLikeExtension };\n","import { StringReplacement, StringEdit } from '../core/edits/stringEdit.js';\nimport { OffsetRange } from '../core/ranges/offsetRange.js';\n\nfunction offsetEditFromContentChanges(contentChanges) {\n    const editsArr = contentChanges.map(c => new StringReplacement(OffsetRange.ofStartAndLength(c.rangeOffset, c.rangeLength), c.text));\n    editsArr.reverse();\n    const edits = new StringEdit(editsArr);\n    return edits;\n}\n\nexport { offsetEditFromContentChanges };\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 *--------------------------------------------------------------------------------------------*/\nfunction sendInlineCompletionsEndOfLifeTelemetry(dataChannel, endOfLifeSummary) {\n    dataChannel.publicLog2('inlineCompletion.endOfLife', endOfLifeSummary);\n}\n\nexport { sendInlineCompletionsEndOfLifeTelemetry };\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 *--------------------------------------------------------------------------------------------*/\nclass LinesDiff {\n    constructor(changes, \n    /**\n     * Sorted by original line ranges.\n     * The original line ranges and the modified line ranges must be disjoint (but can be touching).\n     */\n    moves, \n    /**\n     * Indicates if the time out was reached.\n     * In that case, the diffs might be an approximation and the user should be asked to rerun the diff with more time.\n     */\n    hitTimeout) {\n        this.changes = changes;\n        this.moves = moves;\n        this.hitTimeout = hitTimeout;\n    }\n}\nclass MovedText {\n    constructor(lineRangeMapping, changes) {\n        this.lineRangeMapping = lineRangeMapping;\n        this.changes = changes;\n    }\n}\n\nexport { LinesDiff, MovedText };\n","import { LcsDiff } from '../../../base/common/diff/diff.js';\nimport { LinesDiff } from './linesDiffComputer.js';\nimport { DetailedLineRangeMapping, RangeMapping } from './rangeMapping.js';\nimport { firstNonWhitespaceIndex, lastNonWhitespaceIndex } from '../../../base/common/strings.js';\nimport { Range } from '../core/range.js';\nimport { assertFn, checkAdjacentItems } from '../../../base/common/assert.js';\nimport { LineRange } from '../core/ranges/lineRange.js';\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 *--------------------------------------------------------------------------------------------*/\nconst MINIMUM_MATCHING_CHARACTER_LENGTH = 3;\nclass LegacyLinesDiffComputer {\n    computeDiff(originalLines, modifiedLines, options) {\n        const diffComputer = new DiffComputer(originalLines, modifiedLines, {\n            maxComputationTime: options.maxComputationTimeMs,\n            shouldIgnoreTrimWhitespace: options.ignoreTrimWhitespace,\n            shouldComputeCharChanges: true,\n            shouldMakePrettyDiff: true,\n            shouldPostProcessCharChanges: true,\n        });\n        const result = diffComputer.computeDiff();\n        const changes = [];\n        let lastChange = null;\n        for (const c of result.changes) {\n            let originalRange;\n            if (c.originalEndLineNumber === 0) {\n                // Insertion\n                originalRange = new LineRange(c.originalStartLineNumber + 1, c.originalStartLineNumber + 1);\n            }\n            else {\n                originalRange = new LineRange(c.originalStartLineNumber, c.originalEndLineNumber + 1);\n            }\n            let modifiedRange;\n            if (c.modifiedEndLineNumber === 0) {\n                // Deletion\n                modifiedRange = new LineRange(c.modifiedStartLineNumber + 1, c.modifiedStartLineNumber + 1);\n            }\n            else {\n                modifiedRange = new LineRange(c.modifiedStartLineNumber, c.modifiedEndLineNumber + 1);\n            }\n            let change = new DetailedLineRangeMapping(originalRange, modifiedRange, c.charChanges?.map(c => new RangeMapping(new Range(c.originalStartLineNumber, c.originalStartColumn, c.originalEndLineNumber, c.originalEndColumn), new Range(c.modifiedStartLineNumber, c.modifiedStartColumn, c.modifiedEndLineNumber, c.modifiedEndColumn))));\n            if (lastChange) {\n                if (lastChange.modified.endLineNumberExclusive === change.modified.startLineNumber\n                    || lastChange.original.endLineNumberExclusive === change.original.startLineNumber) {\n                    // join touching diffs. Probably moving diffs up/down in the algorithm causes touching diffs.\n                    change = new DetailedLineRangeMapping(lastChange.original.join(change.original), lastChange.modified.join(change.modified), lastChange.innerChanges && change.innerChanges ?\n                        lastChange.innerChanges.concat(change.innerChanges) : undefined);\n                    changes.pop();\n                }\n            }\n            changes.push(change);\n            lastChange = change;\n        }\n        assertFn(() => {\n            return checkAdjacentItems(changes, (m1, m2) => m2.original.startLineNumber - m1.original.endLineNumberExclusive === m2.modified.startLineNumber - m1.modified.endLineNumberExclusive &&\n                // There has to be an unchanged line in between (otherwise both diffs should have been joined)\n                m1.original.endLineNumberExclusive < m2.original.startLineNumber &&\n                m1.modified.endLineNumberExclusive < m2.modified.startLineNumber);\n        });\n        return new LinesDiff(changes, [], result.quitEarly);\n    }\n}\nfunction computeDiff(originalSequence, modifiedSequence, continueProcessingPredicate, pretty) {\n    const diffAlgo = new LcsDiff(originalSequence, modifiedSequence, continueProcessingPredicate);\n    return diffAlgo.ComputeDiff(pretty);\n}\nclass LineSequence {\n    constructor(lines) {\n        const startColumns = [];\n        const endColumns = [];\n        for (let i = 0, length = lines.length; i < length; i++) {\n            startColumns[i] = getFirstNonBlankColumn(lines[i], 1);\n            endColumns[i] = getLastNonBlankColumn(lines[i], 1);\n        }\n        this.lines = lines;\n        this._startColumns = startColumns;\n        this._endColumns = endColumns;\n    }\n    getElements() {\n        const elements = [];\n        for (let i = 0, len = this.lines.length; i < len; i++) {\n            elements[i] = this.lines[i].substring(this._startColumns[i] - 1, this._endColumns[i] - 1);\n        }\n        return elements;\n    }\n    getStrictElement(index) {\n        return this.lines[index];\n    }\n    getStartLineNumber(i) {\n        return i + 1;\n    }\n    getEndLineNumber(i) {\n        return i + 1;\n    }\n    createCharSequence(shouldIgnoreTrimWhitespace, startIndex, endIndex) {\n        const charCodes = [];\n        const lineNumbers = [];\n        const columns = [];\n        let len = 0;\n        for (let index = startIndex; index <= endIndex; index++) {\n            const lineContent = this.lines[index];\n            const startColumn = (shouldIgnoreTrimWhitespace ? this._startColumns[index] : 1);\n            const endColumn = (shouldIgnoreTrimWhitespace ? this._endColumns[index] : lineContent.length + 1);\n            for (let col = startColumn; col < endColumn; col++) {\n                charCodes[len] = lineContent.charCodeAt(col - 1);\n                lineNumbers[len] = index + 1;\n                columns[len] = col;\n                len++;\n            }\n            if (!shouldIgnoreTrimWhitespace && index < endIndex) {\n                // Add \\n if trim whitespace is not ignored\n                charCodes[len] = 10 /* CharCode.LineFeed */;\n                lineNumbers[len] = index + 1;\n                columns[len] = lineContent.length + 1;\n                len++;\n            }\n        }\n        return new CharSequence(charCodes, lineNumbers, columns);\n    }\n}\nclass CharSequence {\n    constructor(charCodes, lineNumbers, columns) {\n        this._charCodes = charCodes;\n        this._lineNumbers = lineNumbers;\n        this._columns = columns;\n    }\n    toString() {\n        return ('[' + this._charCodes.map((s, idx) => (s === 10 /* CharCode.LineFeed */ ? '\\\\n' : String.fromCharCode(s)) + `-(${this._lineNumbers[idx]},${this._columns[idx]})`).join(', ') + ']');\n    }\n    _assertIndex(index, arr) {\n        if (index < 0 || index >= arr.length) {\n            throw new Error(`Illegal index`);\n        }\n    }\n    getElements() {\n        return this._charCodes;\n    }\n    getStartLineNumber(i) {\n        if (i > 0 && i === this._lineNumbers.length) {\n            // the start line number of the element after the last element\n            // is the end line number of the last element\n            return this.getEndLineNumber(i - 1);\n        }\n        this._assertIndex(i, this._lineNumbers);\n        return this._lineNumbers[i];\n    }\n    getEndLineNumber(i) {\n        if (i === -1) {\n            // the end line number of the element before the first element\n            // is the start line number of the first element\n            return this.getStartLineNumber(i + 1);\n        }\n        this._assertIndex(i, this._lineNumbers);\n        if (this._charCodes[i] === 10 /* CharCode.LineFeed */) {\n            return this._lineNumbers[i] + 1;\n        }\n        return this._lineNumbers[i];\n    }\n    getStartColumn(i) {\n        if (i > 0 && i === this._columns.length) {\n            // the start column of the element after the last element\n            // is the end column of the last element\n            return this.getEndColumn(i - 1);\n        }\n        this._assertIndex(i, this._columns);\n        return this._columns[i];\n    }\n    getEndColumn(i) {\n        if (i === -1) {\n            // the end column of the element before the first element\n            // is the start column of the first element\n            return this.getStartColumn(i + 1);\n        }\n        this._assertIndex(i, this._columns);\n        if (this._charCodes[i] === 10 /* CharCode.LineFeed */) {\n            return 1;\n        }\n        return this._columns[i] + 1;\n    }\n}\nclass CharChange {\n    constructor(originalStartLineNumber, originalStartColumn, originalEndLineNumber, originalEndColumn, modifiedStartLineNumber, modifiedStartColumn, modifiedEndLineNumber, modifiedEndColumn) {\n        this.originalStartLineNumber = originalStartLineNumber;\n        this.originalStartColumn = originalStartColumn;\n        this.originalEndLineNumber = originalEndLineNumber;\n        this.originalEndColumn = originalEndColumn;\n        this.modifiedStartLineNumber = modifiedStartLineNumber;\n        this.modifiedStartColumn = modifiedStartColumn;\n        this.modifiedEndLineNumber = modifiedEndLineNumber;\n        this.modifiedEndColumn = modifiedEndColumn;\n    }\n    static createFromDiffChange(diffChange, originalCharSequence, modifiedCharSequence) {\n        const originalStartLineNumber = originalCharSequence.getStartLineNumber(diffChange.originalStart);\n        const originalStartColumn = originalCharSequence.getStartColumn(diffChange.originalStart);\n        const originalEndLineNumber = originalCharSequence.getEndLineNumber(diffChange.originalStart + diffChange.originalLength - 1);\n        const originalEndColumn = originalCharSequence.getEndColumn(diffChange.originalStart + diffChange.originalLength - 1);\n        const modifiedStartLineNumber = modifiedCharSequence.getStartLineNumber(diffChange.modifiedStart);\n        const modifiedStartColumn = modifiedCharSequence.getStartColumn(diffChange.modifiedStart);\n        const modifiedEndLineNumber = modifiedCharSequence.getEndLineNumber(diffChange.modifiedStart + diffChange.modifiedLength - 1);\n        const modifiedEndColumn = modifiedCharSequence.getEndColumn(diffChange.modifiedStart + diffChange.modifiedLength - 1);\n        return new CharChange(originalStartLineNumber, originalStartColumn, originalEndLineNumber, originalEndColumn, modifiedStartLineNumber, modifiedStartColumn, modifiedEndLineNumber, modifiedEndColumn);\n    }\n}\nfunction postProcessCharChanges(rawChanges) {\n    if (rawChanges.length <= 1) {\n        return rawChanges;\n    }\n    const result = [rawChanges[0]];\n    let prevChange = result[0];\n    for (let i = 1, len = rawChanges.length; i < len; i++) {\n        const currChange = rawChanges[i];\n        const originalMatchingLength = currChange.originalStart - (prevChange.originalStart + prevChange.originalLength);\n        const modifiedMatchingLength = currChange.modifiedStart - (prevChange.modifiedStart + prevChange.modifiedLength);\n        // Both of the above should be equal, but the continueProcessingPredicate may prevent this from being true\n        const matchingLength = Math.min(originalMatchingLength, modifiedMatchingLength);\n        if (matchingLength < MINIMUM_MATCHING_CHARACTER_LENGTH) {\n            // Merge the current change into the previous one\n            prevChange.originalLength = (currChange.originalStart + currChange.originalLength) - prevChange.originalStart;\n            prevChange.modifiedLength = (currChange.modifiedStart + currChange.modifiedLength) - prevChange.modifiedStart;\n        }\n        else {\n            // Add the current change\n            result.push(currChange);\n            prevChange = currChange;\n        }\n    }\n    return result;\n}\nclass LineChange {\n    constructor(originalStartLineNumber, originalEndLineNumber, modifiedStartLineNumber, modifiedEndLineNumber, charChanges) {\n        this.originalStartLineNumber = originalStartLineNumber;\n        this.originalEndLineNumber = originalEndLineNumber;\n        this.modifiedStartLineNumber = modifiedStartLineNumber;\n        this.modifiedEndLineNumber = modifiedEndLineNumber;\n        this.charChanges = charChanges;\n    }\n    static createFromDiffResult(shouldIgnoreTrimWhitespace, diffChange, originalLineSequence, modifiedLineSequence, continueCharDiff, shouldComputeCharChanges, shouldPostProcessCharChanges) {\n        let originalStartLineNumber;\n        let originalEndLineNumber;\n        let modifiedStartLineNumber;\n        let modifiedEndLineNumber;\n        let charChanges = undefined;\n        if (diffChange.originalLength === 0) {\n            originalStartLineNumber = originalLineSequence.getStartLineNumber(diffChange.originalStart) - 1;\n            originalEndLineNumber = 0;\n        }\n        else {\n            originalStartLineNumber = originalLineSequence.getStartLineNumber(diffChange.originalStart);\n            originalEndLineNumber = originalLineSequence.getEndLineNumber(diffChange.originalStart + diffChange.originalLength - 1);\n        }\n        if (diffChange.modifiedLength === 0) {\n            modifiedStartLineNumber = modifiedLineSequence.getStartLineNumber(diffChange.modifiedStart) - 1;\n            modifiedEndLineNumber = 0;\n        }\n        else {\n            modifiedStartLineNumber = modifiedLineSequence.getStartLineNumber(diffChange.modifiedStart);\n            modifiedEndLineNumber = modifiedLineSequence.getEndLineNumber(diffChange.modifiedStart + diffChange.modifiedLength - 1);\n        }\n        if (shouldComputeCharChanges && diffChange.originalLength > 0 && diffChange.originalLength < 20 && diffChange.modifiedLength > 0 && diffChange.modifiedLength < 20 && continueCharDiff()) {\n            // Compute character changes for diff chunks of at most 20 lines...\n            const originalCharSequence = originalLineSequence.createCharSequence(shouldIgnoreTrimWhitespace, diffChange.originalStart, diffChange.originalStart + diffChange.originalLength - 1);\n            const modifiedCharSequence = modifiedLineSequence.createCharSequence(shouldIgnoreTrimWhitespace, diffChange.modifiedStart, diffChange.modifiedStart + diffChange.modifiedLength - 1);\n            if (originalCharSequence.getElements().length > 0 && modifiedCharSequence.getElements().length > 0) {\n                let rawChanges = computeDiff(originalCharSequence, modifiedCharSequence, continueCharDiff, true).changes;\n                if (shouldPostProcessCharChanges) {\n                    rawChanges = postProcessCharChanges(rawChanges);\n                }\n                charChanges = [];\n                for (let i = 0, length = rawChanges.length; i < length; i++) {\n                    charChanges.push(CharChange.createFromDiffChange(rawChanges[i], originalCharSequence, modifiedCharSequence));\n                }\n            }\n        }\n        return new LineChange(originalStartLineNumber, originalEndLineNumber, modifiedStartLineNumber, modifiedEndLineNumber, charChanges);\n    }\n}\nclass DiffComputer {\n    constructor(originalLines, modifiedLines, opts) {\n        this.shouldComputeCharChanges = opts.shouldComputeCharChanges;\n        this.shouldPostProcessCharChanges = opts.shouldPostProcessCharChanges;\n        this.shouldIgnoreTrimWhitespace = opts.shouldIgnoreTrimWhitespace;\n        this.shouldMakePrettyDiff = opts.shouldMakePrettyDiff;\n        this.originalLines = originalLines;\n        this.modifiedLines = modifiedLines;\n        this.original = new LineSequence(originalLines);\n        this.modified = new LineSequence(modifiedLines);\n        this.continueLineDiff = createContinueProcessingPredicate(opts.maxComputationTime);\n        this.continueCharDiff = createContinueProcessingPredicate(opts.maxComputationTime === 0 ? 0 : Math.min(opts.maxComputationTime, 5000)); // never run after 5s for character changes...\n    }\n    computeDiff() {\n        if (this.original.lines.length === 1 && this.original.lines[0].length === 0) {\n            // empty original => fast path\n            if (this.modified.lines.length === 1 && this.modified.lines[0].length === 0) {\n                return {\n                    quitEarly: false,\n                    changes: []\n                };\n            }\n            return {\n                quitEarly: false,\n                changes: [{\n                        originalStartLineNumber: 1,\n                        originalEndLineNumber: 1,\n                        modifiedStartLineNumber: 1,\n                        modifiedEndLineNumber: this.modified.lines.length,\n                        charChanges: undefined\n                    }]\n            };\n        }\n        if (this.modified.lines.length === 1 && this.modified.lines[0].length === 0) {\n            // empty modified => fast path\n            return {\n                quitEarly: false,\n                changes: [{\n                        originalStartLineNumber: 1,\n                        originalEndLineNumber: this.original.lines.length,\n                        modifiedStartLineNumber: 1,\n                        modifiedEndLineNumber: 1,\n                        charChanges: undefined\n                    }]\n            };\n        }\n        const diffResult = computeDiff(this.original, this.modified, this.continueLineDiff, this.shouldMakePrettyDiff);\n        const rawChanges = diffResult.changes;\n        const quitEarly = diffResult.quitEarly;\n        // The diff is always computed with ignoring trim whitespace\n        // This ensures we get the prettiest diff\n        if (this.shouldIgnoreTrimWhitespace) {\n            const lineChanges = [];\n            for (let i = 0, length = rawChanges.length; i < length; i++) {\n                lineChanges.push(LineChange.createFromDiffResult(this.shouldIgnoreTrimWhitespace, rawChanges[i], this.original, this.modified, this.continueCharDiff, this.shouldComputeCharChanges, this.shouldPostProcessCharChanges));\n            }\n            return {\n                quitEarly: quitEarly,\n                changes: lineChanges\n            };\n        }\n        // Need to post-process and introduce changes where the trim whitespace is different\n        // Note that we are looping starting at -1 to also cover the lines before the first change\n        const result = [];\n        let originalLineIndex = 0;\n        let modifiedLineIndex = 0;\n        for (let i = -1 /* !!!! */, len = rawChanges.length; i < len; i++) {\n            const nextChange = (i + 1 < len ? rawChanges[i + 1] : null);\n            const originalStop = (nextChange ? nextChange.originalStart : this.originalLines.length);\n            const modifiedStop = (nextChange ? nextChange.modifiedStart : this.modifiedLines.length);\n            while (originalLineIndex < originalStop && modifiedLineIndex < modifiedStop) {\n                const originalLine = this.originalLines[originalLineIndex];\n                const modifiedLine = this.modifiedLines[modifiedLineIndex];\n                if (originalLine !== modifiedLine) {\n                    // These lines differ only in trim whitespace\n                    // Check the leading whitespace\n                    {\n                        let originalStartColumn = getFirstNonBlankColumn(originalLine, 1);\n                        let modifiedStartColumn = getFirstNonBlankColumn(modifiedLine, 1);\n                        while (originalStartColumn > 1 && modifiedStartColumn > 1) {\n                            const originalChar = originalLine.charCodeAt(originalStartColumn - 2);\n                            const modifiedChar = modifiedLine.charCodeAt(modifiedStartColumn - 2);\n                            if (originalChar !== modifiedChar) {\n                                break;\n                            }\n                            originalStartColumn--;\n                            modifiedStartColumn--;\n                        }\n                        if (originalStartColumn > 1 || modifiedStartColumn > 1) {\n                            this._pushTrimWhitespaceCharChange(result, originalLineIndex + 1, 1, originalStartColumn, modifiedLineIndex + 1, 1, modifiedStartColumn);\n                        }\n                    }\n                    // Check the trailing whitespace\n                    {\n                        let originalEndColumn = getLastNonBlankColumn(originalLine, 1);\n                        let modifiedEndColumn = getLastNonBlankColumn(modifiedLine, 1);\n                        const originalMaxColumn = originalLine.length + 1;\n                        const modifiedMaxColumn = modifiedLine.length + 1;\n                        while (originalEndColumn < originalMaxColumn && modifiedEndColumn < modifiedMaxColumn) {\n                            const originalChar = originalLine.charCodeAt(originalEndColumn - 1);\n                            const modifiedChar = originalLine.charCodeAt(modifiedEndColumn - 1);\n                            if (originalChar !== modifiedChar) {\n                                break;\n                            }\n                            originalEndColumn++;\n                            modifiedEndColumn++;\n                        }\n                        if (originalEndColumn < originalMaxColumn || modifiedEndColumn < modifiedMaxColumn) {\n                            this._pushTrimWhitespaceCharChange(result, originalLineIndex + 1, originalEndColumn, originalMaxColumn, modifiedLineIndex + 1, modifiedEndColumn, modifiedMaxColumn);\n                        }\n                    }\n                }\n                originalLineIndex++;\n                modifiedLineIndex++;\n            }\n            if (nextChange) {\n                // Emit the actual change\n                result.push(LineChange.createFromDiffResult(this.shouldIgnoreTrimWhitespace, nextChange, this.original, this.modified, this.continueCharDiff, this.shouldComputeCharChanges, this.shouldPostProcessCharChanges));\n                originalLineIndex += nextChange.originalLength;\n                modifiedLineIndex += nextChange.modifiedLength;\n            }\n        }\n        return {\n            quitEarly: quitEarly,\n            changes: result\n        };\n    }\n    _pushTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn) {\n        if (this._mergeTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn)) {\n            // Merged into previous\n            return;\n        }\n        let charChanges = undefined;\n        if (this.shouldComputeCharChanges) {\n            charChanges = [new CharChange(originalLineNumber, originalStartColumn, originalLineNumber, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedLineNumber, modifiedEndColumn)];\n        }\n        result.push(new LineChange(originalLineNumber, originalLineNumber, modifiedLineNumber, modifiedLineNumber, charChanges));\n    }\n    _mergeTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn) {\n        const len = result.length;\n        if (len === 0) {\n            return false;\n        }\n        const prevChange = result[len - 1];\n        if (prevChange.originalEndLineNumber === 0 || prevChange.modifiedEndLineNumber === 0) {\n            // Don't merge with inserts/deletes\n            return false;\n        }\n        if (prevChange.originalEndLineNumber === originalLineNumber && prevChange.modifiedEndLineNumber === modifiedLineNumber) {\n            if (this.shouldComputeCharChanges && prevChange.charChanges) {\n                prevChange.charChanges.push(new CharChange(originalLineNumber, originalStartColumn, originalLineNumber, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedLineNumber, modifiedEndColumn));\n            }\n            return true;\n        }\n        if (prevChange.originalEndLineNumber + 1 === originalLineNumber && prevChange.modifiedEndLineNumber + 1 === modifiedLineNumber) {\n            prevChange.originalEndLineNumber = originalLineNumber;\n            prevChange.modifiedEndLineNumber = modifiedLineNumber;\n            if (this.shouldComputeCharChanges && prevChange.charChanges) {\n                prevChange.charChanges.push(new CharChange(originalLineNumber, originalStartColumn, originalLineNumber, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedLineNumber, modifiedEndColumn));\n            }\n            return true;\n        }\n        return false;\n    }\n}\nfunction getFirstNonBlankColumn(txt, defaultValue) {\n    const r = firstNonWhitespaceIndex(txt);\n    if (r === -1) {\n        return defaultValue;\n    }\n    return r + 1;\n}\nfunction getLastNonBlankColumn(txt, defaultValue) {\n    const r = lastNonWhitespaceIndex(txt);\n    if (r === -1) {\n        return defaultValue;\n    }\n    return r + 2;\n}\nfunction createContinueProcessingPredicate(maximumRuntime) {\n    if (maximumRuntime === 0) {\n        return () => true;\n    }\n    const startTime = Date.now();\n    return () => {\n        return Date.now() - startTime < maximumRuntime;\n    };\n}\n\nexport { DiffComputer, LegacyLinesDiffComputer };\n","import { OffsetRange } from '../../../core/ranges/offsetRange.js';\nimport { InfiniteTimeout, DiffAlgorithmResult, SequenceDiff } from './diffAlgorithm.js';\nimport { Array2D } from '../utils.js';\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/**\n * A O(MN) diffing algorithm that supports a score function.\n * The algorithm can be improved by processing the 2d array diagonally.\n*/\nclass DynamicProgrammingDiffing {\n    compute(sequence1, sequence2, timeout = InfiniteTimeout.instance, equalityScore) {\n        if (sequence1.length === 0 || sequence2.length === 0) {\n            return DiffAlgorithmResult.trivial(sequence1, sequence2);\n        }\n        /**\n         * lcsLengths.get(i, j): Length of the longest common subsequence of sequence1.substring(0, i + 1) and sequence2.substring(0, j + 1).\n         */\n        const lcsLengths = new Array2D(sequence1.length, sequence2.length);\n        const directions = new Array2D(sequence1.length, sequence2.length);\n        const lengths = new Array2D(sequence1.length, sequence2.length);\n        // ==== Initializing lcsLengths ====\n        for (let s1 = 0; s1 < sequence1.length; s1++) {\n            for (let s2 = 0; s2 < sequence2.length; s2++) {\n                if (!timeout.isValid()) {\n                    return DiffAlgorithmResult.trivialTimedOut(sequence1, sequence2);\n                }\n                const horizontalLen = s1 === 0 ? 0 : lcsLengths.get(s1 - 1, s2);\n                const verticalLen = s2 === 0 ? 0 : lcsLengths.get(s1, s2 - 1);\n                let extendedSeqScore;\n                if (sequence1.getElement(s1) === sequence2.getElement(s2)) {\n                    if (s1 === 0 || s2 === 0) {\n                        extendedSeqScore = 0;\n                    }\n                    else {\n                        extendedSeqScore = lcsLengths.get(s1 - 1, s2 - 1);\n                    }\n                    if (s1 > 0 && s2 > 0 && directions.get(s1 - 1, s2 - 1) === 3) {\n                        // Prefer consecutive diagonals\n                        extendedSeqScore += lengths.get(s1 - 1, s2 - 1);\n                    }\n                    extendedSeqScore += (equalityScore ? equalityScore(s1, s2) : 1);\n                }\n                else {\n                    extendedSeqScore = -1;\n                }\n                const newValue = Math.max(horizontalLen, verticalLen, extendedSeqScore);\n                if (newValue === extendedSeqScore) {\n                    // Prefer diagonals\n                    const prevLen = s1 > 0 && s2 > 0 ? lengths.get(s1 - 1, s2 - 1) : 0;\n                    lengths.set(s1, s2, prevLen + 1);\n                    directions.set(s1, s2, 3);\n                }\n                else if (newValue === horizontalLen) {\n                    lengths.set(s1, s2, 0);\n                    directions.set(s1, s2, 1);\n                }\n                else if (newValue === verticalLen) {\n                    lengths.set(s1, s2, 0);\n                    directions.set(s1, s2, 2);\n                }\n                lcsLengths.set(s1, s2, newValue);\n            }\n        }\n        // ==== Backtracking ====\n        const result = [];\n        let lastAligningPosS1 = sequence1.length;\n        let lastAligningPosS2 = sequence2.length;\n        function reportDecreasingAligningPositions(s1, s2) {\n            if (s1 + 1 !== lastAligningPosS1 || s2 + 1 !== lastAligningPosS2) {\n                result.push(new SequenceDiff(new OffsetRange(s1 + 1, lastAligningPosS1), new OffsetRange(s2 + 1, lastAligningPosS2)));\n            }\n            lastAligningPosS1 = s1;\n            lastAligningPosS2 = s2;\n        }\n        let s1 = sequence1.length - 1;\n        let s2 = sequence2.length - 1;\n        while (s1 >= 0 && s2 >= 0) {\n            if (directions.get(s1, s2) === 3) {\n                reportDecreasingAligningPositions(s1, s2);\n                s1--;\n                s2--;\n            }\n            else {\n                if (directions.get(s1, s2) === 1) {\n                    s1--;\n                }\n                else {\n                    s2--;\n                }\n            }\n        }\n        reportDecreasingAligningPositions(-1, -1);\n        result.reverse();\n        return new DiffAlgorithmResult(result, false);\n    }\n}\n\nexport { DynamicProgrammingDiffing };\n","import { OffsetRange } from '../../../core/ranges/offsetRange.js';\nimport { InfiniteTimeout, DiffAlgorithmResult, SequenceDiff } from './diffAlgorithm.js';\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/**\n * An O(ND) diff algorithm that has a quadratic space worst-case complexity.\n*/\nclass MyersDiffAlgorithm {\n    compute(seq1, seq2, timeout = InfiniteTimeout.instance) {\n        // These are common special cases.\n        // The early return improves performance dramatically.\n        if (seq1.length === 0 || seq2.length === 0) {\n            return DiffAlgorithmResult.trivial(seq1, seq2);\n        }\n        const seqX = seq1; // Text on the x axis\n        const seqY = seq2; // Text on the y axis\n        function getXAfterSnake(x, y) {\n            while (x < seqX.length && y < seqY.length && seqX.getElement(x) === seqY.getElement(y)) {\n                x++;\n                y++;\n            }\n            return x;\n        }\n        let d = 0;\n        // V[k]: X value of longest d-line that ends in diagonal k.\n        // d-line: path from (0,0) to (x,y) that uses exactly d non-diagonals.\n        // diagonal k: Set of points (x,y) with x-y = k.\n        // k=1 -> (1,0),(2,1)\n        const V = new FastInt32Array();\n        V.set(0, getXAfterSnake(0, 0));\n        const paths = new FastArrayNegativeIndices();\n        paths.set(0, V.get(0) === 0 ? null : new SnakePath(null, 0, 0, V.get(0)));\n        let k = 0;\n        loop: while (true) {\n            d++;\n            if (!timeout.isValid()) {\n                return DiffAlgorithmResult.trivialTimedOut(seqX, seqY);\n            }\n            // The paper has `for (k = -d; k <= d; k += 2)`, but we can ignore diagonals that cannot influence the result.\n            const lowerBound = -Math.min(d, seqY.length + (d % 2));\n            const upperBound = Math.min(d, seqX.length + (d % 2));\n            for (k = lowerBound; k <= upperBound; k += 2) {\n                // We can use the X values of (d-1)-lines to compute X value of the longest d-lines.\n                const maxXofDLineTop = k === upperBound ? -1 : V.get(k + 1); // We take a vertical non-diagonal (add a symbol in seqX)\n                const maxXofDLineLeft = k === lowerBound ? -1 : V.get(k - 1) + 1; // We take a horizontal non-diagonal (+1 x) (delete a symbol in seqX)\n                const x = Math.min(Math.max(maxXofDLineTop, maxXofDLineLeft), seqX.length);\n                const y = x - k;\n                if (x > seqX.length || y > seqY.length) {\n                    // This diagonal is irrelevant for the result.\n                    // TODO: Don't pay the cost for this in the next iteration.\n                    continue;\n                }\n                const newMaxX = getXAfterSnake(x, y);\n                V.set(k, newMaxX);\n                const lastPath = x === maxXofDLineTop ? paths.get(k + 1) : paths.get(k - 1);\n                paths.set(k, newMaxX !== x ? new SnakePath(lastPath, x, y, newMaxX - x) : lastPath);\n                if (V.get(k) === seqX.length && V.get(k) - k === seqY.length) {\n                    break loop;\n                }\n            }\n        }\n        let path = paths.get(k);\n        const result = [];\n        let lastAligningPosS1 = seqX.length;\n        let lastAligningPosS2 = seqY.length;\n        while (true) {\n            const endX = path ? path.x + path.length : 0;\n            const endY = path ? path.y + path.length : 0;\n            if (endX !== lastAligningPosS1 || endY !== lastAligningPosS2) {\n                result.push(new SequenceDiff(new OffsetRange(endX, lastAligningPosS1), new OffsetRange(endY, lastAligningPosS2)));\n            }\n            if (!path) {\n                break;\n            }\n            lastAligningPosS1 = path.x;\n            lastAligningPosS2 = path.y;\n            path = path.prev;\n        }\n        result.reverse();\n        return new DiffAlgorithmResult(result, false);\n    }\n}\nclass SnakePath {\n    constructor(prev, x, y, length) {\n        this.prev = prev;\n        this.x = x;\n        this.y = y;\n        this.length = length;\n    }\n}\n/**\n * An array that supports fast negative indices.\n*/\nclass FastInt32Array {\n    constructor() {\n        this.positiveArr = new Int32Array(10);\n        this.negativeArr = new Int32Array(10);\n    }\n    get(idx) {\n        if (idx < 0) {\n            idx = -idx - 1;\n            return this.negativeArr[idx];\n        }\n        else {\n            return this.positiveArr[idx];\n        }\n    }\n    set(idx, value) {\n        if (idx < 0) {\n            idx = -idx - 1;\n            if (idx >= this.negativeArr.length) {\n                const arr = this.negativeArr;\n                this.negativeArr = new Int32Array(arr.length * 2);\n                this.negativeArr.set(arr);\n            }\n            this.negativeArr[idx] = value;\n        }\n        else {\n            if (idx >= this.positiveArr.length) {\n                const arr = this.positiveArr;\n                this.positiveArr = new Int32Array(arr.length * 2);\n                this.positiveArr.set(arr);\n            }\n            this.positiveArr[idx] = value;\n        }\n    }\n}\n/**\n * An array that supports fast negative indices.\n*/\nclass FastArrayNegativeIndices {\n    constructor() {\n        this.positiveArr = [];\n        this.negativeArr = [];\n    }\n    get(idx) {\n        if (idx < 0) {\n            idx = -idx - 1;\n            return this.negativeArr[idx];\n        }\n        else {\n            return this.positiveArr[idx];\n        }\n    }\n    set(idx, value) {\n        if (idx < 0) {\n            idx = -idx - 1;\n            this.negativeArr[idx] = value;\n        }\n        else {\n            this.positiveArr[idx] = value;\n        }\n    }\n}\n\nexport { MyersDiffAlgorithm };\n","import { findLastIdxMonotonous, findLastMonotonous, findFirstMonotonous } from '../../../../base/common/arraysFind.js';\nimport { OffsetRange } from '../../core/ranges/offsetRange.js';\nimport { Position } from '../../core/position.js';\nimport { Range } from '../../core/range.js';\nimport { isSpace } from './utils.js';\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 *--------------------------------------------------------------------------------------------*/\nclass LinesSliceCharSequence {\n    constructor(lines, range, considerWhitespaceChanges) {\n        this.lines = lines;\n        this.range = range;\n        this.considerWhitespaceChanges = considerWhitespaceChanges;\n        this.elements = [];\n        this.firstElementOffsetByLineIdx = [];\n        this.lineStartOffsets = [];\n        this.trimmedWsLengthsByLineIdx = [];\n        this.firstElementOffsetByLineIdx.push(0);\n        for (let lineNumber = this.range.startLineNumber; lineNumber <= this.range.endLineNumber; lineNumber++) {\n            let line = lines[lineNumber - 1];\n            let lineStartOffset = 0;\n            if (lineNumber === this.range.startLineNumber && this.range.startColumn > 1) {\n                lineStartOffset = this.range.startColumn - 1;\n                line = line.substring(lineStartOffset);\n            }\n            this.lineStartOffsets.push(lineStartOffset);\n            let trimmedWsLength = 0;\n            if (!considerWhitespaceChanges) {\n                const trimmedStartLine = line.trimStart();\n                trimmedWsLength = line.length - trimmedStartLine.length;\n                line = trimmedStartLine.trimEnd();\n            }\n            this.trimmedWsLengthsByLineIdx.push(trimmedWsLength);\n            const lineLength = lineNumber === this.range.endLineNumber ? Math.min(this.range.endColumn - 1 - lineStartOffset - trimmedWsLength, line.length) : line.length;\n            for (let i = 0; i < lineLength; i++) {\n                this.elements.push(line.charCodeAt(i));\n            }\n            if (lineNumber < this.range.endLineNumber) {\n                this.elements.push('\\n'.charCodeAt(0));\n                this.firstElementOffsetByLineIdx.push(this.elements.length);\n            }\n        }\n    }\n    toString() {\n        return `Slice: \"${this.text}\"`;\n    }\n    get text() {\n        return this.getText(new OffsetRange(0, this.length));\n    }\n    getText(range) {\n        return this.elements.slice(range.start, range.endExclusive).map(e => String.fromCharCode(e)).join('');\n    }\n    getElement(offset) {\n        return this.elements[offset];\n    }\n    get length() {\n        return this.elements.length;\n    }\n    getBoundaryScore(length) {\n        //   a   b   c   ,           d   e   f\n        // 11  0   0   12  15  6   13  0   0   11\n        const prevCategory = getCategory(length > 0 ? this.elements[length - 1] : -1);\n        const nextCategory = getCategory(length < this.elements.length ? this.elements[length] : -1);\n        if (prevCategory === 7 /* CharBoundaryCategory.LineBreakCR */ && nextCategory === 8 /* CharBoundaryCategory.LineBreakLF */) {\n            // don't break between \\r and \\n\n            return 0;\n        }\n        if (prevCategory === 8 /* CharBoundaryCategory.LineBreakLF */) {\n            // prefer the linebreak before the change\n            return 150;\n        }\n        let score = 0;\n        if (prevCategory !== nextCategory) {\n            score += 10;\n            if (prevCategory === 0 /* CharBoundaryCategory.WordLower */ && nextCategory === 1 /* CharBoundaryCategory.WordUpper */) {\n                score += 1;\n            }\n        }\n        score += getCategoryBoundaryScore(prevCategory);\n        score += getCategoryBoundaryScore(nextCategory);\n        return score;\n    }\n    translateOffset(offset, preference = 'right') {\n        // find smallest i, so that lineBreakOffsets[i] <= offset using binary search\n        const i = findLastIdxMonotonous(this.firstElementOffsetByLineIdx, (value) => value <= offset);\n        const lineOffset = offset - this.firstElementOffsetByLineIdx[i];\n        return new Position(this.range.startLineNumber + i, 1 + this.lineStartOffsets[i] + lineOffset + ((lineOffset === 0 && preference === 'left') ? 0 : this.trimmedWsLengthsByLineIdx[i]));\n    }\n    translateRange(range) {\n        const pos1 = this.translateOffset(range.start, 'right');\n        const pos2 = this.translateOffset(range.endExclusive, 'left');\n        if (pos2.isBefore(pos1)) {\n            return Range.fromPositions(pos2, pos2);\n        }\n        return Range.fromPositions(pos1, pos2);\n    }\n    /**\n     * Finds the word that contains the character at the given offset\n     */\n    findWordContaining(offset) {\n        if (offset < 0 || offset >= this.elements.length) {\n            return undefined;\n        }\n        if (!isWordChar(this.elements[offset])) {\n            return undefined;\n        }\n        // find start\n        let start = offset;\n        while (start > 0 && isWordChar(this.elements[start - 1])) {\n            start--;\n        }\n        // find end\n        let end = offset;\n        while (end < this.elements.length && isWordChar(this.elements[end])) {\n            end++;\n        }\n        return new OffsetRange(start, end);\n    }\n    /** fooBar has the two sub-words foo and bar */\n    findSubWordContaining(offset) {\n        if (offset < 0 || offset >= this.elements.length) {\n            return undefined;\n        }\n        if (!isWordChar(this.elements[offset])) {\n            return undefined;\n        }\n        // find start\n        let start = offset;\n        while (start > 0 && isWordChar(this.elements[start - 1]) && !isUpperCase(this.elements[start])) {\n            start--;\n        }\n        // find end\n        let end = offset;\n        while (end < this.elements.length && isWordChar(this.elements[end]) && !isUpperCase(this.elements[end])) {\n            end++;\n        }\n        return new OffsetRange(start, end);\n    }\n    countLinesIn(range) {\n        return this.translateOffset(range.endExclusive).lineNumber - this.translateOffset(range.start).lineNumber;\n    }\n    isStronglyEqual(offset1, offset2) {\n        return this.elements[offset1] === this.elements[offset2];\n    }\n    extendToFullLines(range) {\n        const start = findLastMonotonous(this.firstElementOffsetByLineIdx, x => x <= range.start) ?? 0;\n        const end = findFirstMonotonous(this.firstElementOffsetByLineIdx, x => range.endExclusive <= x) ?? this.elements.length;\n        return new OffsetRange(start, end);\n    }\n}\nfunction isWordChar(charCode) {\n    return charCode >= 97 /* CharCode.a */ && charCode <= 122 /* CharCode.z */\n        || charCode >= 65 /* CharCode.A */ && charCode <= 90 /* CharCode.Z */\n        || charCode >= 48 /* CharCode.Digit0 */ && charCode <= 57 /* CharCode.Digit9 */;\n}\nfunction isUpperCase(charCode) {\n    return charCode >= 65 /* CharCode.A */ && charCode <= 90 /* CharCode.Z */;\n}\nconst score = {\n    [0 /* CharBoundaryCategory.WordLower */]: 0,\n    [1 /* CharBoundaryCategory.WordUpper */]: 0,\n    [2 /* CharBoundaryCategory.WordNumber */]: 0,\n    [3 /* CharBoundaryCategory.End */]: 10,\n    [4 /* CharBoundaryCategory.Other */]: 2,\n    [5 /* CharBoundaryCategory.Separator */]: 30,\n    [6 /* CharBoundaryCategory.Space */]: 3,\n    [7 /* CharBoundaryCategory.LineBreakCR */]: 10,\n    [8 /* CharBoundaryCategory.LineBreakLF */]: 10,\n};\nfunction getCategoryBoundaryScore(category) {\n    return score[category];\n}\nfunction getCategory(charCode) {\n    if (charCode === 10 /* CharCode.LineFeed */) {\n        return 8 /* CharBoundaryCategory.LineBreakLF */;\n    }\n    else if (charCode === 13 /* CharCode.CarriageReturn */) {\n        return 7 /* CharBoundaryCategory.LineBreakCR */;\n    }\n    else if (isSpace(charCode)) {\n        return 6 /* CharBoundaryCategory.Space */;\n    }\n    else if (charCode >= 97 /* CharCode.a */ && charCode <= 122 /* CharCode.z */) {\n        return 0 /* CharBoundaryCategory.WordLower */;\n    }\n    else if (charCode >= 65 /* CharCode.A */ && charCode <= 90 /* CharCode.Z */) {\n        return 1 /* CharBoundaryCategory.WordUpper */;\n    }\n    else if (charCode >= 48 /* CharCode.Digit0 */ && charCode <= 57 /* CharCode.Digit9 */) {\n        return 2 /* CharBoundaryCategory.WordNumber */;\n    }\n    else if (charCode === -1) {\n        return 3 /* CharBoundaryCategory.End */;\n    }\n    else if (charCode === 44 /* CharCode.Comma */ || charCode === 59 /* CharCode.Semicolon */) {\n        return 5 /* CharBoundaryCategory.Separator */;\n    }\n    else {\n        return 4 /* CharBoundaryCategory.Other */;\n    }\n}\n\nexport { LinesSliceCharSequence };\n","import { SequenceDiff } from './algorithms/diffAlgorithm.js';\nimport { LineRangeMapping } from '../rangeMapping.js';\nimport { pushMany, compareBy, numberComparator, reverseOrder } from '../../../../base/common/arrays.js';\nimport { MonotonousArray, findLastMonotonous } from '../../../../base/common/arraysFind.js';\nimport { SetMap } from '../../../../base/common/map.js';\nimport { LineRange, LineRangeSet } from '../../core/ranges/lineRange.js';\nimport { LinesSliceCharSequence } from './linesSliceCharSequence.js';\nimport { LineRangeFragment, isSpace } from './utils.js';\nimport { MyersDiffAlgorithm } from './algorithms/myersDiffAlgorithm.js';\nimport { Range } from '../../core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction computeMovedLines(changes, originalLines, modifiedLines, hashedOriginalLines, hashedModifiedLines, timeout) {\n    let { moves, excludedChanges } = computeMovesFromSimpleDeletionsToSimpleInsertions(changes, originalLines, modifiedLines, timeout);\n    if (!timeout.isValid()) {\n        return [];\n    }\n    const filteredChanges = changes.filter(c => !excludedChanges.has(c));\n    const unchangedMoves = computeUnchangedMoves(filteredChanges, hashedOriginalLines, hashedModifiedLines, originalLines, modifiedLines, timeout);\n    pushMany(moves, unchangedMoves);\n    moves = joinCloseConsecutiveMoves(moves);\n    // Ignore too short moves\n    moves = moves.filter(current => {\n        const lines = current.original.toOffsetRange().slice(originalLines).map(l => l.trim());\n        const originalText = lines.join('\\n');\n        return originalText.length >= 15 && countWhere(lines, l => l.length >= 2) >= 2;\n    });\n    moves = removeMovesInSameDiff(changes, moves);\n    return moves;\n}\nfunction countWhere(arr, predicate) {\n    let count = 0;\n    for (const t of arr) {\n        if (predicate(t)) {\n            count++;\n        }\n    }\n    return count;\n}\nfunction computeMovesFromSimpleDeletionsToSimpleInsertions(changes, originalLines, modifiedLines, timeout) {\n    const moves = [];\n    const deletions = changes\n        .filter(c => c.modified.isEmpty && c.original.length >= 3)\n        .map(d => new LineRangeFragment(d.original, originalLines, d));\n    const insertions = new Set(changes\n        .filter(c => c.original.isEmpty && c.modified.length >= 3)\n        .map(d => new LineRangeFragment(d.modified, modifiedLines, d)));\n    const excludedChanges = new Set();\n    for (const deletion of deletions) {\n        let highestSimilarity = -1;\n        let best;\n        for (const insertion of insertions) {\n            const similarity = deletion.computeSimilarity(insertion);\n            if (similarity > highestSimilarity) {\n                highestSimilarity = similarity;\n                best = insertion;\n            }\n        }\n        if (highestSimilarity > 0.90 && best) {\n            insertions.delete(best);\n            moves.push(new LineRangeMapping(deletion.range, best.range));\n            excludedChanges.add(deletion.source);\n            excludedChanges.add(best.source);\n        }\n        if (!timeout.isValid()) {\n            return { moves, excludedChanges };\n        }\n    }\n    return { moves, excludedChanges };\n}\nfunction computeUnchangedMoves(changes, hashedOriginalLines, hashedModifiedLines, originalLines, modifiedLines, timeout) {\n    const moves = [];\n    const original3LineHashes = new SetMap();\n    for (const change of changes) {\n        for (let i = change.original.startLineNumber; i < change.original.endLineNumberExclusive - 2; i++) {\n            const key = `${hashedOriginalLines[i - 1]}:${hashedOriginalLines[i + 1 - 1]}:${hashedOriginalLines[i + 2 - 1]}`;\n            original3LineHashes.add(key, { range: new LineRange(i, i + 3) });\n        }\n    }\n    const possibleMappings = [];\n    changes.sort(compareBy(c => c.modified.startLineNumber, numberComparator));\n    for (const change of changes) {\n        let lastMappings = [];\n        for (let i = change.modified.startLineNumber; i < change.modified.endLineNumberExclusive - 2; i++) {\n            const key = `${hashedModifiedLines[i - 1]}:${hashedModifiedLines[i + 1 - 1]}:${hashedModifiedLines[i + 2 - 1]}`;\n            const currentModifiedRange = new LineRange(i, i + 3);\n            const nextMappings = [];\n            original3LineHashes.forEach(key, ({ range }) => {\n                for (const lastMapping of lastMappings) {\n                    // does this match extend some last match?\n                    if (lastMapping.originalLineRange.endLineNumberExclusive + 1 === range.endLineNumberExclusive &&\n                        lastMapping.modifiedLineRange.endLineNumberExclusive + 1 === currentModifiedRange.endLineNumberExclusive) {\n                        lastMapping.originalLineRange = new LineRange(lastMapping.originalLineRange.startLineNumber, range.endLineNumberExclusive);\n                        lastMapping.modifiedLineRange = new LineRange(lastMapping.modifiedLineRange.startLineNumber, currentModifiedRange.endLineNumberExclusive);\n                        nextMappings.push(lastMapping);\n                        return;\n                    }\n                }\n                const mapping = {\n                    modifiedLineRange: currentModifiedRange,\n                    originalLineRange: range,\n                };\n                possibleMappings.push(mapping);\n                nextMappings.push(mapping);\n            });\n            lastMappings = nextMappings;\n        }\n        if (!timeout.isValid()) {\n            return [];\n        }\n    }\n    possibleMappings.sort(reverseOrder(compareBy(m => m.modifiedLineRange.length, numberComparator)));\n    const modifiedSet = new LineRangeSet();\n    const originalSet = new LineRangeSet();\n    for (const mapping of possibleMappings) {\n        const diffOrigToMod = mapping.modifiedLineRange.startLineNumber - mapping.originalLineRange.startLineNumber;\n        const modifiedSections = modifiedSet.subtractFrom(mapping.modifiedLineRange);\n        const originalTranslatedSections = originalSet.subtractFrom(mapping.originalLineRange).getWithDelta(diffOrigToMod);\n        const modifiedIntersectedSections = modifiedSections.getIntersection(originalTranslatedSections);\n        for (const s of modifiedIntersectedSections.ranges) {\n            if (s.length < 3) {\n                continue;\n            }\n            const modifiedLineRange = s;\n            const originalLineRange = s.delta(-diffOrigToMod);\n            moves.push(new LineRangeMapping(originalLineRange, modifiedLineRange));\n            modifiedSet.addRange(modifiedLineRange);\n            originalSet.addRange(originalLineRange);\n        }\n    }\n    moves.sort(compareBy(m => m.original.startLineNumber, numberComparator));\n    const monotonousChanges = new MonotonousArray(changes);\n    for (let i = 0; i < moves.length; i++) {\n        const move = moves[i];\n        const firstTouchingChangeOrig = monotonousChanges.findLastMonotonous(c => c.original.startLineNumber <= move.original.startLineNumber);\n        const firstTouchingChangeMod = findLastMonotonous(changes, c => c.modified.startLineNumber <= move.modified.startLineNumber);\n        const linesAbove = Math.max(move.original.startLineNumber - firstTouchingChangeOrig.original.startLineNumber, move.modified.startLineNumber - firstTouchingChangeMod.modified.startLineNumber);\n        const lastTouchingChangeOrig = monotonousChanges.findLastMonotonous(c => c.original.startLineNumber < move.original.endLineNumberExclusive);\n        const lastTouchingChangeMod = findLastMonotonous(changes, c => c.modified.startLineNumber < move.modified.endLineNumberExclusive);\n        const linesBelow = Math.max(lastTouchingChangeOrig.original.endLineNumberExclusive - move.original.endLineNumberExclusive, lastTouchingChangeMod.modified.endLineNumberExclusive - move.modified.endLineNumberExclusive);\n        let extendToTop;\n        for (extendToTop = 0; extendToTop < linesAbove; extendToTop++) {\n            const origLine = move.original.startLineNumber - extendToTop - 1;\n            const modLine = move.modified.startLineNumber - extendToTop - 1;\n            if (origLine > originalLines.length || modLine > modifiedLines.length) {\n                break;\n            }\n            if (modifiedSet.contains(modLine) || originalSet.contains(origLine)) {\n                break;\n            }\n            if (!areLinesSimilar(originalLines[origLine - 1], modifiedLines[modLine - 1], timeout)) {\n                break;\n            }\n        }\n        if (extendToTop > 0) {\n            originalSet.addRange(new LineRange(move.original.startLineNumber - extendToTop, move.original.startLineNumber));\n            modifiedSet.addRange(new LineRange(move.modified.startLineNumber - extendToTop, move.modified.startLineNumber));\n        }\n        let extendToBottom;\n        for (extendToBottom = 0; extendToBottom < linesBelow; extendToBottom++) {\n            const origLine = move.original.endLineNumberExclusive + extendToBottom;\n            const modLine = move.modified.endLineNumberExclusive + extendToBottom;\n            if (origLine > originalLines.length || modLine > modifiedLines.length) {\n                break;\n            }\n            if (modifiedSet.contains(modLine) || originalSet.contains(origLine)) {\n                break;\n            }\n            if (!areLinesSimilar(originalLines[origLine - 1], modifiedLines[modLine - 1], timeout)) {\n                break;\n            }\n        }\n        if (extendToBottom > 0) {\n            originalSet.addRange(new LineRange(move.original.endLineNumberExclusive, move.original.endLineNumberExclusive + extendToBottom));\n            modifiedSet.addRange(new LineRange(move.modified.endLineNumberExclusive, move.modified.endLineNumberExclusive + extendToBottom));\n        }\n        if (extendToTop > 0 || extendToBottom > 0) {\n            moves[i] = new LineRangeMapping(new LineRange(move.original.startLineNumber - extendToTop, move.original.endLineNumberExclusive + extendToBottom), new LineRange(move.modified.startLineNumber - extendToTop, move.modified.endLineNumberExclusive + extendToBottom));\n        }\n    }\n    return moves;\n}\nfunction areLinesSimilar(line1, line2, timeout) {\n    if (line1.trim() === line2.trim()) {\n        return true;\n    }\n    if (line1.length > 300 && line2.length > 300) {\n        return false;\n    }\n    const myersDiffingAlgorithm = new MyersDiffAlgorithm();\n    const result = myersDiffingAlgorithm.compute(new LinesSliceCharSequence([line1], new Range(1, 1, 1, line1.length), false), new LinesSliceCharSequence([line2], new Range(1, 1, 1, line2.length), false), timeout);\n    let commonNonSpaceCharCount = 0;\n    const inverted = SequenceDiff.invert(result.diffs, line1.length);\n    for (const seq of inverted) {\n        seq.seq1Range.forEach(idx => {\n            if (!isSpace(line1.charCodeAt(idx))) {\n                commonNonSpaceCharCount++;\n            }\n        });\n    }\n    function countNonWsChars(str) {\n        let count = 0;\n        for (let i = 0; i < line1.length; i++) {\n            if (!isSpace(str.charCodeAt(i))) {\n                count++;\n            }\n        }\n        return count;\n    }\n    const longerLineLength = countNonWsChars(line1.length > line2.length ? line1 : line2);\n    const r = commonNonSpaceCharCount / longerLineLength > 0.6 && longerLineLength > 10;\n    return r;\n}\nfunction joinCloseConsecutiveMoves(moves) {\n    if (moves.length === 0) {\n        return moves;\n    }\n    moves.sort(compareBy(m => m.original.startLineNumber, numberComparator));\n    const result = [moves[0]];\n    for (let i = 1; i < moves.length; i++) {\n        const last = result[result.length - 1];\n        const current = moves[i];\n        const originalDist = current.original.startLineNumber - last.original.endLineNumberExclusive;\n        const modifiedDist = current.modified.startLineNumber - last.modified.endLineNumberExclusive;\n        const currentMoveAfterLast = originalDist >= 0 && modifiedDist >= 0;\n        if (currentMoveAfterLast && originalDist + modifiedDist <= 2) {\n            result[result.length - 1] = last.join(current);\n            continue;\n        }\n        result.push(current);\n    }\n    return result;\n}\nfunction removeMovesInSameDiff(changes, moves) {\n    const changesMonotonous = new MonotonousArray(changes);\n    moves = moves.filter(m => {\n        const diffBeforeEndOfMoveOriginal = changesMonotonous.findLastMonotonous(c => c.original.startLineNumber < m.original.endLineNumberExclusive)\n            || new LineRangeMapping(new LineRange(1, 1), new LineRange(1, 1));\n        const diffBeforeEndOfMoveModified = findLastMonotonous(changes, c => c.modified.startLineNumber < m.modified.endLineNumberExclusive);\n        const differentDiffs = diffBeforeEndOfMoveOriginal !== diffBeforeEndOfMoveModified;\n        return differentDiffs;\n    });\n    return moves;\n}\n\nexport { computeMovedLines };\n","import { forEachWithNeighbors } from '../../../../base/common/arrays.js';\nimport { OffsetRange } from '../../core/ranges/offsetRange.js';\nimport { SequenceDiff, OffsetPair } from './algorithms/diffAlgorithm.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction optimizeSequenceDiffs(sequence1, sequence2, sequenceDiffs) {\n    let result = sequenceDiffs;\n    result = joinSequenceDiffsByShifting(sequence1, sequence2, result);\n    // Sometimes, calling this function twice improves the result.\n    // Uncomment the second invocation and run the tests to see the difference.\n    result = joinSequenceDiffsByShifting(sequence1, sequence2, result);\n    result = shiftSequenceDiffs(sequence1, sequence2, result);\n    return result;\n}\n/**\n * This function fixes issues like this:\n * ```\n * import { Baz, Bar } from \"foo\";\n * ```\n * <->\n * ```\n * import { Baz, Bar, Foo } from \"foo\";\n * ```\n * Computed diff: [ {Add \",\" after Bar}, {Add \"Foo \" after space} }\n * Improved diff: [{Add \", Foo\" after Bar}]\n */\nfunction joinSequenceDiffsByShifting(sequence1, sequence2, sequenceDiffs) {\n    if (sequenceDiffs.length === 0) {\n        return sequenceDiffs;\n    }\n    const result = [];\n    result.push(sequenceDiffs[0]);\n    // First move them all to the left as much as possible and join them if possible\n    for (let i = 1; i < sequenceDiffs.length; i++) {\n        const prevResult = result[result.length - 1];\n        let cur = sequenceDiffs[i];\n        if (cur.seq1Range.isEmpty || cur.seq2Range.isEmpty) {\n            const length = cur.seq1Range.start - prevResult.seq1Range.endExclusive;\n            let d;\n            for (d = 1; d <= length; d++) {\n                if (sequence1.getElement(cur.seq1Range.start - d) !== sequence1.getElement(cur.seq1Range.endExclusive - d) ||\n                    sequence2.getElement(cur.seq2Range.start - d) !== sequence2.getElement(cur.seq2Range.endExclusive - d)) {\n                    break;\n                }\n            }\n            d--;\n            if (d === length) {\n                // Merge previous and current diff\n                result[result.length - 1] = new SequenceDiff(new OffsetRange(prevResult.seq1Range.start, cur.seq1Range.endExclusive - length), new OffsetRange(prevResult.seq2Range.start, cur.seq2Range.endExclusive - length));\n                continue;\n            }\n            cur = cur.delta(-d);\n        }\n        result.push(cur);\n    }\n    const result2 = [];\n    // Then move them all to the right and join them again if possible\n    for (let i = 0; i < result.length - 1; i++) {\n        const nextResult = result[i + 1];\n        let cur = result[i];\n        if (cur.seq1Range.isEmpty || cur.seq2Range.isEmpty) {\n            const length = nextResult.seq1Range.start - cur.seq1Range.endExclusive;\n            let d;\n            for (d = 0; d < length; d++) {\n                if (!sequence1.isStronglyEqual(cur.seq1Range.start + d, cur.seq1Range.endExclusive + d) ||\n                    !sequence2.isStronglyEqual(cur.seq2Range.start + d, cur.seq2Range.endExclusive + d)) {\n                    break;\n                }\n            }\n            if (d === length) {\n                // Merge previous and current diff, write to result!\n                result[i + 1] = new SequenceDiff(new OffsetRange(cur.seq1Range.start + length, nextResult.seq1Range.endExclusive), new OffsetRange(cur.seq2Range.start + length, nextResult.seq2Range.endExclusive));\n                continue;\n            }\n            if (d > 0) {\n                cur = cur.delta(d);\n            }\n        }\n        result2.push(cur);\n    }\n    if (result.length > 0) {\n        result2.push(result[result.length - 1]);\n    }\n    return result2;\n}\n// align character level diffs at whitespace characters\n// import { IBar } from \"foo\";\n// import { I[Arr, I]Bar } from \"foo\";\n// ->\n// import { [IArr, ]IBar } from \"foo\";\n// import { ITransaction, observableValue, transaction } from 'vs/base/common/observable';\n// import { ITransaction, observable[FromEvent, observable]Value, transaction } from 'vs/base/common/observable';\n// ->\n// import { ITransaction, [observableFromEvent, ]observableValue, transaction } from 'vs/base/common/observable';\n// collectBrackets(level + 1, levelPerBracketType);\n// collectBrackets(level + 1, levelPerBracket[ + 1, levelPerBracket]Type);\n// ->\n// collectBrackets(level + 1, [levelPerBracket + 1, ]levelPerBracketType);\nfunction shiftSequenceDiffs(sequence1, sequence2, sequenceDiffs) {\n    if (!sequence1.getBoundaryScore || !sequence2.getBoundaryScore) {\n        return sequenceDiffs;\n    }\n    for (let i = 0; i < sequenceDiffs.length; i++) {\n        const prevDiff = (i > 0 ? sequenceDiffs[i - 1] : undefined);\n        const diff = sequenceDiffs[i];\n        const nextDiff = (i + 1 < sequenceDiffs.length ? sequenceDiffs[i + 1] : undefined);\n        const seq1ValidRange = new OffsetRange(prevDiff ? prevDiff.seq1Range.endExclusive + 1 : 0, nextDiff ? nextDiff.seq1Range.start - 1 : sequence1.length);\n        const seq2ValidRange = new OffsetRange(prevDiff ? prevDiff.seq2Range.endExclusive + 1 : 0, nextDiff ? nextDiff.seq2Range.start - 1 : sequence2.length);\n        if (diff.seq1Range.isEmpty) {\n            sequenceDiffs[i] = shiftDiffToBetterPosition(diff, sequence1, sequence2, seq1ValidRange, seq2ValidRange);\n        }\n        else if (diff.seq2Range.isEmpty) {\n            sequenceDiffs[i] = shiftDiffToBetterPosition(diff.swap(), sequence2, sequence1, seq2ValidRange, seq1ValidRange).swap();\n        }\n    }\n    return sequenceDiffs;\n}\nfunction shiftDiffToBetterPosition(diff, sequence1, sequence2, seq1ValidRange, seq2ValidRange) {\n    const maxShiftLimit = 100; // To prevent performance issues\n    // don't touch previous or next!\n    let deltaBefore = 1;\n    while (diff.seq1Range.start - deltaBefore >= seq1ValidRange.start &&\n        diff.seq2Range.start - deltaBefore >= seq2ValidRange.start &&\n        sequence2.isStronglyEqual(diff.seq2Range.start - deltaBefore, diff.seq2Range.endExclusive - deltaBefore) && deltaBefore < maxShiftLimit) {\n        deltaBefore++;\n    }\n    deltaBefore--;\n    let deltaAfter = 0;\n    while (diff.seq1Range.start + deltaAfter < seq1ValidRange.endExclusive &&\n        diff.seq2Range.endExclusive + deltaAfter < seq2ValidRange.endExclusive &&\n        sequence2.isStronglyEqual(diff.seq2Range.start + deltaAfter, diff.seq2Range.endExclusive + deltaAfter) && deltaAfter < maxShiftLimit) {\n        deltaAfter++;\n    }\n    if (deltaBefore === 0 && deltaAfter === 0) {\n        return diff;\n    }\n    // Visualize `[sequence1.text, diff.seq1Range.start + deltaAfter]`\n    // and `[sequence2.text, diff.seq2Range.start + deltaAfter, diff.seq2Range.endExclusive + deltaAfter]`\n    let bestDelta = 0;\n    let bestScore = -1;\n    // find best scored delta\n    for (let delta = -deltaBefore; delta <= deltaAfter; delta++) {\n        const seq2OffsetStart = diff.seq2Range.start + delta;\n        const seq2OffsetEndExclusive = diff.seq2Range.endExclusive + delta;\n        const seq1Offset = diff.seq1Range.start + delta;\n        const score = sequence1.getBoundaryScore(seq1Offset) + sequence2.getBoundaryScore(seq2OffsetStart) + sequence2.getBoundaryScore(seq2OffsetEndExclusive);\n        if (score > bestScore) {\n            bestScore = score;\n            bestDelta = delta;\n        }\n    }\n    return diff.delta(bestDelta);\n}\nfunction removeShortMatches(sequence1, sequence2, sequenceDiffs) {\n    const result = [];\n    for (const s of sequenceDiffs) {\n        const last = result[result.length - 1];\n        if (!last) {\n            result.push(s);\n            continue;\n        }\n        if (s.seq1Range.start - last.seq1Range.endExclusive <= 2 || s.seq2Range.start - last.seq2Range.endExclusive <= 2) {\n            result[result.length - 1] = new SequenceDiff(last.seq1Range.join(s.seq1Range), last.seq2Range.join(s.seq2Range));\n        }\n        else {\n            result.push(s);\n        }\n    }\n    return result;\n}\nfunction extendDiffsToEntireWordIfAppropriate(sequence1, sequence2, sequenceDiffs, findParent, force = false) {\n    const equalMappings = SequenceDiff.invert(sequenceDiffs, sequence1.length);\n    const additional = [];\n    let lastPoint = new OffsetPair(0, 0);\n    function scanWord(pair, equalMapping) {\n        if (pair.offset1 < lastPoint.offset1 || pair.offset2 < lastPoint.offset2) {\n            return;\n        }\n        const w1 = findParent(sequence1, pair.offset1);\n        const w2 = findParent(sequence2, pair.offset2);\n        if (!w1 || !w2) {\n            return;\n        }\n        let w = new SequenceDiff(w1, w2);\n        const equalPart = w.intersect(equalMapping);\n        let equalChars1 = equalPart.seq1Range.length;\n        let equalChars2 = equalPart.seq2Range.length;\n        // The words do not touch previous equals mappings, as we would have processed them already.\n        // But they might touch the next ones.\n        while (equalMappings.length > 0) {\n            const next = equalMappings[0];\n            const intersects = next.seq1Range.intersects(w.seq1Range) || next.seq2Range.intersects(w.seq2Range);\n            if (!intersects) {\n                break;\n            }\n            const v1 = findParent(sequence1, next.seq1Range.start);\n            const v2 = findParent(sequence2, next.seq2Range.start);\n            // Because there is an intersection, we know that the words are not empty.\n            const v = new SequenceDiff(v1, v2);\n            const equalPart = v.intersect(next);\n            equalChars1 += equalPart.seq1Range.length;\n            equalChars2 += equalPart.seq2Range.length;\n            w = w.join(v);\n            if (w.seq1Range.endExclusive >= next.seq1Range.endExclusive) {\n                // The word extends beyond the next equal mapping.\n                equalMappings.shift();\n            }\n            else {\n                break;\n            }\n        }\n        if ((force && equalChars1 + equalChars2 < w.seq1Range.length + w.seq2Range.length) || equalChars1 + equalChars2 < (w.seq1Range.length + w.seq2Range.length) * 2 / 3) {\n            additional.push(w);\n        }\n        lastPoint = w.getEndExclusives();\n    }\n    while (equalMappings.length > 0) {\n        const next = equalMappings.shift();\n        if (next.seq1Range.isEmpty) {\n            continue;\n        }\n        scanWord(next.getStarts(), next);\n        // The equal parts are not empty, so -1 gives us a character that is equal in both parts.\n        scanWord(next.getEndExclusives().delta(-1), next);\n    }\n    const merged = mergeSequenceDiffs(sequenceDiffs, additional);\n    return merged;\n}\nfunction mergeSequenceDiffs(sequenceDiffs1, sequenceDiffs2) {\n    const result = [];\n    while (sequenceDiffs1.length > 0 || sequenceDiffs2.length > 0) {\n        const sd1 = sequenceDiffs1[0];\n        const sd2 = sequenceDiffs2[0];\n        let next;\n        if (sd1 && (!sd2 || sd1.seq1Range.start < sd2.seq1Range.start)) {\n            next = sequenceDiffs1.shift();\n        }\n        else {\n            next = sequenceDiffs2.shift();\n        }\n        if (result.length > 0 && result[result.length - 1].seq1Range.endExclusive >= next.seq1Range.start) {\n            result[result.length - 1] = result[result.length - 1].join(next);\n        }\n        else {\n            result.push(next);\n        }\n    }\n    return result;\n}\nfunction removeVeryShortMatchingLinesBetweenDiffs(sequence1, _sequence2, sequenceDiffs) {\n    let diffs = sequenceDiffs;\n    if (diffs.length === 0) {\n        return diffs;\n    }\n    let counter = 0;\n    let shouldRepeat;\n    do {\n        shouldRepeat = false;\n        const result = [\n            diffs[0]\n        ];\n        for (let i = 1; i < diffs.length; i++) {\n            const cur = diffs[i];\n            const lastResult = result[result.length - 1];\n            function shouldJoinDiffs(before, after) {\n                const unchangedRange = new OffsetRange(lastResult.seq1Range.endExclusive, cur.seq1Range.start);\n                const unchangedText = sequence1.getText(unchangedRange);\n                const unchangedTextWithoutWs = unchangedText.replace(/\\s/g, '');\n                if (unchangedTextWithoutWs.length <= 4\n                    && (before.seq1Range.length + before.seq2Range.length > 5 || after.seq1Range.length + after.seq2Range.length > 5)) {\n                    return true;\n                }\n                return false;\n            }\n            const shouldJoin = shouldJoinDiffs(lastResult, cur);\n            if (shouldJoin) {\n                shouldRepeat = true;\n                result[result.length - 1] = result[result.length - 1].join(cur);\n            }\n            else {\n                result.push(cur);\n            }\n        }\n        diffs = result;\n    } while (counter++ < 10 && shouldRepeat);\n    return diffs;\n}\nfunction removeVeryShortMatchingTextBetweenLongDiffs(sequence1, sequence2, sequenceDiffs) {\n    let diffs = sequenceDiffs;\n    if (diffs.length === 0) {\n        return diffs;\n    }\n    let counter = 0;\n    let shouldRepeat;\n    do {\n        shouldRepeat = false;\n        const result = [\n            diffs[0]\n        ];\n        for (let i = 1; i < diffs.length; i++) {\n            const cur = diffs[i];\n            const lastResult = result[result.length - 1];\n            function shouldJoinDiffs(before, after) {\n                const unchangedRange = new OffsetRange(lastResult.seq1Range.endExclusive, cur.seq1Range.start);\n                const unchangedLineCount = sequence1.countLinesIn(unchangedRange);\n                if (unchangedLineCount > 5 || unchangedRange.length > 500) {\n                    return false;\n                }\n                const unchangedText = sequence1.getText(unchangedRange).trim();\n                if (unchangedText.length > 20 || unchangedText.split(/\\r\\n|\\r|\\n/).length > 1) {\n                    return false;\n                }\n                const beforeLineCount1 = sequence1.countLinesIn(before.seq1Range);\n                const beforeSeq1Length = before.seq1Range.length;\n                const beforeLineCount2 = sequence2.countLinesIn(before.seq2Range);\n                const beforeSeq2Length = before.seq2Range.length;\n                const afterLineCount1 = sequence1.countLinesIn(after.seq1Range);\n                const afterSeq1Length = after.seq1Range.length;\n                const afterLineCount2 = sequence2.countLinesIn(after.seq2Range);\n                const afterSeq2Length = after.seq2Range.length;\n                // TODO: Maybe a neural net can be used to derive the result from these numbers\n                const max = 2 * 40 + 50;\n                function cap(v) {\n                    return Math.min(v, max);\n                }\n                if (Math.pow(Math.pow(cap(beforeLineCount1 * 40 + beforeSeq1Length), 1.5) + Math.pow(cap(beforeLineCount2 * 40 + beforeSeq2Length), 1.5), 1.5)\n                    + Math.pow(Math.pow(cap(afterLineCount1 * 40 + afterSeq1Length), 1.5) + Math.pow(cap(afterLineCount2 * 40 + afterSeq2Length), 1.5), 1.5) > ((max ** 1.5) ** 1.5) * 1.3) {\n                    return true;\n                }\n                return false;\n            }\n            const shouldJoin = shouldJoinDiffs(lastResult, cur);\n            if (shouldJoin) {\n                shouldRepeat = true;\n                result[result.length - 1] = result[result.length - 1].join(cur);\n            }\n            else {\n                result.push(cur);\n            }\n        }\n        diffs = result;\n    } while (counter++ < 10 && shouldRepeat);\n    const newDiffs = [];\n    // Remove short suffixes/prefixes\n    forEachWithNeighbors(diffs, (prev, cur, next) => {\n        let newDiff = cur;\n        function shouldMarkAsChanged(text) {\n            return text.length > 0 && text.trim().length <= 3 && cur.seq1Range.length + cur.seq2Range.length > 100;\n        }\n        const fullRange1 = sequence1.extendToFullLines(cur.seq1Range);\n        const prefix = sequence1.getText(new OffsetRange(fullRange1.start, cur.seq1Range.start));\n        if (shouldMarkAsChanged(prefix)) {\n            newDiff = newDiff.deltaStart(-prefix.length);\n        }\n        const suffix = sequence1.getText(new OffsetRange(cur.seq1Range.endExclusive, fullRange1.endExclusive));\n        if (shouldMarkAsChanged(suffix)) {\n            newDiff = newDiff.deltaEnd(suffix.length);\n        }\n        const availableSpace = SequenceDiff.fromOffsetPairs(prev ? prev.getEndExclusives() : OffsetPair.zero, next ? next.getStarts() : OffsetPair.max);\n        const result = newDiff.intersect(availableSpace);\n        if (newDiffs.length > 0 && result.getStarts().equals(newDiffs[newDiffs.length - 1].getEndExclusives())) {\n            newDiffs[newDiffs.length - 1] = newDiffs[newDiffs.length - 1].join(result);\n        }\n        else {\n            newDiffs.push(result);\n        }\n    });\n    return newDiffs;\n}\n\nexport { extendDiffsToEntireWordIfAppropriate, optimizeSequenceDiffs, removeShortMatches, removeVeryShortMatchingLinesBetweenDiffs, removeVeryShortMatchingTextBetweenLongDiffs };\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 *--------------------------------------------------------------------------------------------*/\nclass LineSequence {\n    constructor(trimmedHash, lines) {\n        this.trimmedHash = trimmedHash;\n        this.lines = lines;\n    }\n    getElement(offset) {\n        return this.trimmedHash[offset];\n    }\n    get length() {\n        return this.trimmedHash.length;\n    }\n    getBoundaryScore(length) {\n        const indentationBefore = length === 0 ? 0 : getIndentation(this.lines[length - 1]);\n        const indentationAfter = length === this.lines.length ? 0 : getIndentation(this.lines[length]);\n        return 1000 - (indentationBefore + indentationAfter);\n    }\n    getText(range) {\n        return this.lines.slice(range.start, range.endExclusive).join('\\n');\n    }\n    isStronglyEqual(offset1, offset2) {\n        return this.lines[offset1] === this.lines[offset2];\n    }\n}\nfunction getIndentation(str) {\n    let i = 0;\n    while (i < str.length && (str.charCodeAt(i) === 32 /* CharCode.Space */ || str.charCodeAt(i) === 9 /* CharCode.Tab */)) {\n        i++;\n    }\n    return i;\n}\n\nexport { LineSequence };\n","import { equals } from '../../../../base/common/arrays.js';\nimport { assertFn } from '../../../../base/common/assert.js';\nimport { LineRange } from '../../core/ranges/lineRange.js';\nimport { OffsetRange } from '../../core/ranges/offsetRange.js';\nimport { Range } from '../../core/range.js';\nimport { ArrayText } from '../../core/text/abstractText.js';\nimport { LinesDiff, MovedText } from '../linesDiffComputer.js';\nimport { DetailedLineRangeMapping, RangeMapping, lineRangeMappingFromRangeMappings, LineRangeMapping } from '../rangeMapping.js';\nimport { InfiniteTimeout, DateTimeout, SequenceDiff } from './algorithms/diffAlgorithm.js';\nimport { DynamicProgrammingDiffing } from './algorithms/dynamicProgrammingDiffing.js';\nimport { MyersDiffAlgorithm } from './algorithms/myersDiffAlgorithm.js';\nimport { computeMovedLines } from './computeMovedLines.js';\nimport { optimizeSequenceDiffs, removeVeryShortMatchingLinesBetweenDiffs, extendDiffsToEntireWordIfAppropriate, removeShortMatches, removeVeryShortMatchingTextBetweenLongDiffs } from './heuristicSequenceOptimizations.js';\nimport { LineSequence } from './lineSequence.js';\nimport { LinesSliceCharSequence } from './linesSliceCharSequence.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DefaultLinesDiffComputer {\n    constructor() {\n        this.dynamicProgrammingDiffing = new DynamicProgrammingDiffing();\n        this.myersDiffingAlgorithm = new MyersDiffAlgorithm();\n    }\n    computeDiff(originalLines, modifiedLines, options) {\n        if (originalLines.length <= 1 && equals(originalLines, modifiedLines, (a, b) => a === b)) {\n            return new LinesDiff([], [], false);\n        }\n        if (originalLines.length === 1 && originalLines[0].length === 0 || modifiedLines.length === 1 && modifiedLines[0].length === 0) {\n            return new LinesDiff([\n                new DetailedLineRangeMapping(new LineRange(1, originalLines.length + 1), new LineRange(1, modifiedLines.length + 1), [\n                    new RangeMapping(new Range(1, 1, originalLines.length, originalLines[originalLines.length - 1].length + 1), new Range(1, 1, modifiedLines.length, modifiedLines[modifiedLines.length - 1].length + 1))\n                ])\n            ], [], false);\n        }\n        const timeout = options.maxComputationTimeMs === 0 ? InfiniteTimeout.instance : new DateTimeout(options.maxComputationTimeMs);\n        const considerWhitespaceChanges = !options.ignoreTrimWhitespace;\n        const perfectHashes = new Map();\n        function getOrCreateHash(text) {\n            let hash = perfectHashes.get(text);\n            if (hash === undefined) {\n                hash = perfectHashes.size;\n                perfectHashes.set(text, hash);\n            }\n            return hash;\n        }\n        const originalLinesHashes = originalLines.map((l) => getOrCreateHash(l.trim()));\n        const modifiedLinesHashes = modifiedLines.map((l) => getOrCreateHash(l.trim()));\n        const sequence1 = new LineSequence(originalLinesHashes, originalLines);\n        const sequence2 = new LineSequence(modifiedLinesHashes, modifiedLines);\n        const lineAlignmentResult = (() => {\n            if (sequence1.length + sequence2.length < 1700) {\n                // Use the improved algorithm for small files\n                return this.dynamicProgrammingDiffing.compute(sequence1, sequence2, timeout, (offset1, offset2) => originalLines[offset1] === modifiedLines[offset2]\n                    ? modifiedLines[offset2].length === 0\n                        ? 0.1\n                        : 1 + Math.log(1 + modifiedLines[offset2].length)\n                    : 0.99);\n            }\n            return this.myersDiffingAlgorithm.compute(sequence1, sequence2, timeout);\n        })();\n        let lineAlignments = lineAlignmentResult.diffs;\n        let hitTimeout = lineAlignmentResult.hitTimeout;\n        lineAlignments = optimizeSequenceDiffs(sequence1, sequence2, lineAlignments);\n        lineAlignments = removeVeryShortMatchingLinesBetweenDiffs(sequence1, sequence2, lineAlignments);\n        const alignments = [];\n        const scanForWhitespaceChanges = (equalLinesCount) => {\n            if (!considerWhitespaceChanges) {\n                return;\n            }\n            for (let i = 0; i < equalLinesCount; i++) {\n                const seq1Offset = seq1LastStart + i;\n                const seq2Offset = seq2LastStart + i;\n                if (originalLines[seq1Offset] !== modifiedLines[seq2Offset]) {\n                    // This is because of whitespace changes, diff these lines\n                    const characterDiffs = this.refineDiff(originalLines, modifiedLines, new SequenceDiff(new OffsetRange(seq1Offset, seq1Offset + 1), new OffsetRange(seq2Offset, seq2Offset + 1)), timeout, considerWhitespaceChanges, options);\n                    for (const a of characterDiffs.mappings) {\n                        alignments.push(a);\n                    }\n                    if (characterDiffs.hitTimeout) {\n                        hitTimeout = true;\n                    }\n                }\n            }\n        };\n        let seq1LastStart = 0;\n        let seq2LastStart = 0;\n        for (const diff of lineAlignments) {\n            assertFn(() => diff.seq1Range.start - seq1LastStart === diff.seq2Range.start - seq2LastStart);\n            const equalLinesCount = diff.seq1Range.start - seq1LastStart;\n            scanForWhitespaceChanges(equalLinesCount);\n            seq1LastStart = diff.seq1Range.endExclusive;\n            seq2LastStart = diff.seq2Range.endExclusive;\n            const characterDiffs = this.refineDiff(originalLines, modifiedLines, diff, timeout, considerWhitespaceChanges, options);\n            if (characterDiffs.hitTimeout) {\n                hitTimeout = true;\n            }\n            for (const a of characterDiffs.mappings) {\n                alignments.push(a);\n            }\n        }\n        scanForWhitespaceChanges(originalLines.length - seq1LastStart);\n        const original = new ArrayText(originalLines);\n        const modified = new ArrayText(modifiedLines);\n        const changes = lineRangeMappingFromRangeMappings(alignments, original, modified);\n        let moves = [];\n        if (options.computeMoves) {\n            moves = this.computeMoves(changes, originalLines, modifiedLines, originalLinesHashes, modifiedLinesHashes, timeout, considerWhitespaceChanges, options);\n        }\n        // Make sure all ranges are valid\n        assertFn(() => {\n            function validatePosition(pos, lines) {\n                if (pos.lineNumber < 1 || pos.lineNumber > lines.length) {\n                    return false;\n                }\n                const line = lines[pos.lineNumber - 1];\n                if (pos.column < 1 || pos.column > line.length + 1) {\n                    return false;\n                }\n                return true;\n            }\n            function validateRange(range, lines) {\n                if (range.startLineNumber < 1 || range.startLineNumber > lines.length + 1) {\n                    return false;\n                }\n                if (range.endLineNumberExclusive < 1 || range.endLineNumberExclusive > lines.length + 1) {\n                    return false;\n                }\n                return true;\n            }\n            for (const c of changes) {\n                if (!c.innerChanges) {\n                    return false;\n                }\n                for (const ic of c.innerChanges) {\n                    const valid = validatePosition(ic.modifiedRange.getStartPosition(), modifiedLines) && validatePosition(ic.modifiedRange.getEndPosition(), modifiedLines) &&\n                        validatePosition(ic.originalRange.getStartPosition(), originalLines) && validatePosition(ic.originalRange.getEndPosition(), originalLines);\n                    if (!valid) {\n                        return false;\n                    }\n                }\n                if (!validateRange(c.modified, modifiedLines) || !validateRange(c.original, originalLines)) {\n                    return false;\n                }\n            }\n            return true;\n        });\n        return new LinesDiff(changes, moves, hitTimeout);\n    }\n    computeMoves(changes, originalLines, modifiedLines, hashedOriginalLines, hashedModifiedLines, timeout, considerWhitespaceChanges, options) {\n        const moves = computeMovedLines(changes, originalLines, modifiedLines, hashedOriginalLines, hashedModifiedLines, timeout);\n        const movesWithDiffs = moves.map(m => {\n            const moveChanges = this.refineDiff(originalLines, modifiedLines, new SequenceDiff(m.original.toOffsetRange(), m.modified.toOffsetRange()), timeout, considerWhitespaceChanges, options);\n            const mappings = lineRangeMappingFromRangeMappings(moveChanges.mappings, new ArrayText(originalLines), new ArrayText(modifiedLines), true);\n            return new MovedText(m, mappings);\n        });\n        return movesWithDiffs;\n    }\n    refineDiff(originalLines, modifiedLines, diff, timeout, considerWhitespaceChanges, options) {\n        const lineRangeMapping = toLineRangeMapping(diff);\n        const rangeMapping = lineRangeMapping.toRangeMapping2(originalLines, modifiedLines);\n        const slice1 = new LinesSliceCharSequence(originalLines, rangeMapping.originalRange, considerWhitespaceChanges);\n        const slice2 = new LinesSliceCharSequence(modifiedLines, rangeMapping.modifiedRange, considerWhitespaceChanges);\n        const diffResult = slice1.length + slice2.length < 500\n            ? this.dynamicProgrammingDiffing.compute(slice1, slice2, timeout)\n            : this.myersDiffingAlgorithm.compute(slice1, slice2, timeout);\n        let diffs = diffResult.diffs;\n        diffs = optimizeSequenceDiffs(slice1, slice2, diffs);\n        diffs = extendDiffsToEntireWordIfAppropriate(slice1, slice2, diffs, (seq, idx) => seq.findWordContaining(idx));\n        if (options.extendToSubwords) {\n            diffs = extendDiffsToEntireWordIfAppropriate(slice1, slice2, diffs, (seq, idx) => seq.findSubWordContaining(idx), true);\n        }\n        diffs = removeShortMatches(slice1, slice2, diffs);\n        diffs = removeVeryShortMatchingTextBetweenLongDiffs(slice1, slice2, diffs);\n        const result = diffs.map((d) => new RangeMapping(slice1.translateRange(d.seq1Range), slice2.translateRange(d.seq2Range)));\n        // Assert: result applied on original should be the same as diff applied to original\n        return {\n            mappings: result,\n            hitTimeout: diffResult.hitTimeout,\n        };\n    }\n}\nfunction toLineRangeMapping(sequenceDiff) {\n    return new LineRangeMapping(new LineRange(sequenceDiff.seq1Range.start + 1, sequenceDiff.seq1Range.endExclusive + 1), new LineRange(sequenceDiff.seq2Range.start + 1, sequenceDiff.seq2Range.endExclusive + 1));\n}\n\nexport { DefaultLinesDiffComputer };\n","import { LegacyLinesDiffComputer } from './legacyLinesDiffComputer.js';\nimport { DefaultLinesDiffComputer } from './defaultLinesDiffComputer/defaultLinesDiffComputer.js';\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 *--------------------------------------------------------------------------------------------*/\nconst linesDiffComputers = {\n    getLegacy: () => new LegacyLinesDiffComputer(),\n    getDefault: () => new DefaultLinesDiffComputer(),\n};\n\nexport { linesDiffComputers };\n","import { BugIndicatingError } from '../../../../../base/common/errors.js';\nimport { matchesSubString } from '../../../../../base/common/filters.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { splitLines, commonPrefixLength, commonSuffixLength } from '../../../../../base/common/strings.js';\nimport { StringReplacement, applyEditsToRanges, StringEdit } from '../../../../common/core/edits/stringEdit.js';\nimport { TextEdit, TextReplacement } from '../../../../common/core/edits/textEdit.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { StringText } from '../../../../common/core/text/abstractText.js';\nimport { getPositionOffsetTransformerFromTextModel } from '../../../../common/core/text/getPositionOffsetTransformerFromTextModel.js';\nimport { TextLength } from '../../../../common/core/text/textLength.js';\nimport { linesDiffComputers } from '../../../../common/diff/linesDiffComputers.js';\nimport { InlineCompletionTriggerKind } from '../../../../common/languages.js';\nimport { TextModelText } from '../../../../common/model/textModelText.js';\nimport { singleTextRemoveCommonPrefix } from './singleTextEditHelpers.js';\nimport { observableSignal } from '../../../../../base/common/observableInternal/observables/observableSignal.js';\nimport { observableValue } from '../../../../../base/common/observableInternal/observables/observableValue.js';\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 *--------------------------------------------------------------------------------------------*/\nvar InlineSuggestionItem;\n(function (InlineSuggestionItem) {\n    function create(data, textModel) {\n        if (!data.isInlineEdit && !data.uri) {\n            return InlineCompletionItem.create(data, textModel);\n        }\n        else {\n            return InlineEditItem.create(data, textModel);\n        }\n    }\n    InlineSuggestionItem.create = create;\n})(InlineSuggestionItem || (InlineSuggestionItem = {}));\nclass InlineSuggestionItemBase {\n    constructor(_data, identity, hint) {\n        this._data = _data;\n        this.identity = identity;\n        this.hint = hint;\n    }\n    /**\n     * A reference to the original inline completion list this inline completion has been constructed from.\n     * Used for event data to ensure referential equality.\n    */\n    get source() { return this._data.source; }\n    get isFromExplicitRequest() { return this._data.context.triggerKind === InlineCompletionTriggerKind.Explicit; }\n    get forwardStable() { return this.source.inlineSuggestions.enableForwardStability ?? false; }\n    get editRange() { return this.getSingleTextEdit().range; }\n    get targetRange() { return this.hint?.range && !this.hint.jumpToEdit ? this.hint?.range : this.editRange; }\n    get insertText() { return this.getSingleTextEdit().text; }\n    get semanticId() { return this.hash; }\n    get action() { return this._sourceInlineCompletion.gutterMenuLinkAction; }\n    get command() { return this._sourceInlineCompletion.command; }\n    get warning() { return this._sourceInlineCompletion.warning; }\n    get showInlineEditMenu() { return !!this._sourceInlineCompletion.showInlineEditMenu; }\n    get hash() {\n        return JSON.stringify([\n            this.getSingleTextEdit().text,\n            this.getSingleTextEdit().range.getStartPosition().toString()\n        ]);\n    }\n    get requestUuid() { return this._data.context.requestUuid; }\n    get partialAccepts() { return this._data.partialAccepts; }\n    /**\n     * A reference to the original inline completion this inline completion has been constructed from.\n     * Used for event data to ensure referential equality.\n    */\n    get _sourceInlineCompletion() { return this._data.sourceInlineCompletion; }\n    addRef() {\n        this.identity.addRef();\n        this.source.addRef();\n    }\n    removeRef() {\n        this.identity.removeRef();\n        this.source.removeRef();\n    }\n    reportInlineEditShown(commandService, viewKind, viewData) {\n        this._data.reportInlineEditShown(commandService, this.insertText, viewKind, viewData);\n    }\n    reportPartialAccept(acceptedCharacters, info, partialAcceptance) {\n        this._data.reportPartialAccept(acceptedCharacters, info, partialAcceptance);\n    }\n    reportEndOfLife(reason) {\n        this._data.reportEndOfLife(reason);\n    }\n    setEndOfLifeReason(reason) {\n        this._data.setEndOfLifeReason(reason);\n    }\n    setIsPreceeded(item) {\n        this._data.setIsPreceeded(item.partialAccepts);\n    }\n    setNotShownReasonIfNotSet(reason) {\n        this._data.setNotShownReason(reason);\n    }\n    /**\n     * Avoid using this method. Instead introduce getters for the needed properties.\n    */\n    getSourceCompletion() {\n        return this._sourceInlineCompletion;\n    }\n}\nclass InlineSuggestionIdentity {\n    constructor() {\n        this._onDispose = observableSignal(this);\n        this._jumpedTo = observableValue(this, false);\n        this._refCount = 1;\n        this.id = 'InlineCompletionIdentity' + InlineSuggestionIdentity.idCounter++;\n    }\n    static { this.idCounter = 0; }\n    get jumpedTo() {\n        return this._jumpedTo;\n    }\n    addRef() {\n        this._refCount++;\n    }\n    removeRef() {\n        this._refCount--;\n        if (this._refCount === 0) {\n            this._onDispose.trigger(undefined);\n        }\n    }\n    setJumpTo(tx) {\n        this._jumpedTo.set(true, tx);\n    }\n}\nclass InlineSuggestHint {\n    static create(displayLocation) {\n        return new InlineSuggestHint(Range.lift(displayLocation.range), displayLocation.content, displayLocation.style, displayLocation.jumpToEdit);\n    }\n    constructor(range, content, style, jumpToEdit) {\n        this.range = range;\n        this.content = content;\n        this.style = style;\n        this.jumpToEdit = jumpToEdit;\n    }\n    withEdit(edit, positionOffsetTransformer) {\n        const offsetRange = new OffsetRange(positionOffsetTransformer.getOffset(this.range.getStartPosition()), positionOffsetTransformer.getOffset(this.range.getEndPosition()));\n        const newOffsetRange = applyEditsToRanges([offsetRange], edit)[0];\n        if (!newOffsetRange) {\n            return undefined;\n        }\n        const newRange = positionOffsetTransformer.getRange(newOffsetRange);\n        return new InlineSuggestHint(newRange, this.content, this.style, this.jumpToEdit);\n    }\n}\nclass InlineCompletionItem extends InlineSuggestionItemBase {\n    static create(data, textModel) {\n        const identity = new InlineSuggestionIdentity();\n        const transformer = getPositionOffsetTransformerFromTextModel(textModel);\n        const insertText = data.insertText.replace(/\\r\\n|\\r|\\n/g, textModel.getEOL());\n        const edit = reshapeInlineCompletion(new StringReplacement(transformer.getOffsetRange(data.range), insertText), textModel);\n        const trimmedEdit = edit.removeCommonSuffixAndPrefix(textModel.getValue());\n        const textEdit = transformer.getTextReplacement(edit);\n        const displayLocation = data.hint ? InlineSuggestHint.create(data.hint) : undefined;\n        return new InlineCompletionItem(edit, trimmedEdit, textEdit, textEdit.range, data.snippetInfo, data.additionalTextEdits, data, identity, displayLocation);\n    }\n    constructor(_edit, _trimmedEdit, _textEdit, _originalRange, snippetInfo, additionalTextEdits, data, identity, displayLocation) {\n        super(data, identity, displayLocation);\n        this._edit = _edit;\n        this._trimmedEdit = _trimmedEdit;\n        this._textEdit = _textEdit;\n        this._originalRange = _originalRange;\n        this.snippetInfo = snippetInfo;\n        this.additionalTextEdits = additionalTextEdits;\n        this.isInlineEdit = false;\n    }\n    get hash() {\n        return JSON.stringify(this._trimmedEdit.toJson());\n    }\n    getSingleTextEdit() { return this._textEdit; }\n    withIdentity(identity) {\n        return new InlineCompletionItem(this._edit, this._trimmedEdit, this._textEdit, this._originalRange, this.snippetInfo, this.additionalTextEdits, this._data, identity, this.hint);\n    }\n    withEdit(textModelEdit, textModel) {\n        const newEditRange = applyEditsToRanges([this._edit.replaceRange], textModelEdit);\n        if (newEditRange.length === 0) {\n            return undefined;\n        }\n        const newEdit = new StringReplacement(newEditRange[0], this._textEdit.text);\n        const positionOffsetTransformer = getPositionOffsetTransformerFromTextModel(textModel);\n        const newTextEdit = positionOffsetTransformer.getTextReplacement(newEdit);\n        let newDisplayLocation = this.hint;\n        if (newDisplayLocation) {\n            newDisplayLocation = newDisplayLocation.withEdit(textModelEdit, positionOffsetTransformer);\n            if (!newDisplayLocation) {\n                return undefined;\n            }\n        }\n        const trimmedEdit = newEdit.removeCommonSuffixAndPrefix(textModel.getValue());\n        return new InlineCompletionItem(newEdit, trimmedEdit, newTextEdit, this._originalRange, this.snippetInfo, this.additionalTextEdits, this._data, this.identity, newDisplayLocation);\n    }\n    canBeReused(model, position) {\n        // TODO@hediet I believe this can be simplified to `return true;`, as applying an edit should kick out this suggestion.\n        const updatedRange = this._textEdit.range;\n        const result = !!updatedRange\n            && updatedRange.containsPosition(position)\n            && this.isVisible(model, position)\n            && TextLength.ofRange(updatedRange).isGreaterThanOrEqualTo(TextLength.ofRange(this._originalRange));\n        return result;\n    }\n    isVisible(model, cursorPosition) {\n        const singleTextEdit = this.getSingleTextEdit();\n        return inlineCompletionIsVisible(singleTextEdit, this._originalRange, model, cursorPosition);\n    }\n}\nfunction inlineCompletionIsVisible(singleTextEdit, originalRange, model, cursorPosition) {\n    const minimizedReplacement = singleTextRemoveCommonPrefix(singleTextEdit, model);\n    const editRange = singleTextEdit.range;\n    if (!editRange\n        || (originalRange && !originalRange.getStartPosition().equals(editRange.getStartPosition()))\n        || cursorPosition.lineNumber !== minimizedReplacement.range.startLineNumber\n        || minimizedReplacement.isEmpty // if the completion is empty after removing the common prefix of the completion and the model, the completion item would not be visible\n    ) {\n        return false;\n    }\n    // We might consider comparing by .toLowerText, but this requires GhostTextReplacement\n    const originalValue = model.getValueInRange(minimizedReplacement.range, 1 /* EndOfLinePreference.LF */);\n    const filterText = minimizedReplacement.text;\n    const cursorPosIndex = Math.max(0, cursorPosition.column - minimizedReplacement.range.startColumn);\n    let filterTextBefore = filterText.substring(0, cursorPosIndex);\n    let filterTextAfter = filterText.substring(cursorPosIndex);\n    let originalValueBefore = originalValue.substring(0, cursorPosIndex);\n    let originalValueAfter = originalValue.substring(cursorPosIndex);\n    const originalValueIndent = model.getLineIndentColumn(minimizedReplacement.range.startLineNumber);\n    if (minimizedReplacement.range.startColumn <= originalValueIndent) {\n        // Remove indentation\n        originalValueBefore = originalValueBefore.trimStart();\n        if (originalValueBefore.length === 0) {\n            originalValueAfter = originalValueAfter.trimStart();\n        }\n        filterTextBefore = filterTextBefore.trimStart();\n        if (filterTextBefore.length === 0) {\n            filterTextAfter = filterTextAfter.trimStart();\n        }\n    }\n    return filterTextBefore.startsWith(originalValueBefore)\n        && !!matchesSubString(originalValueAfter, filterTextAfter);\n}\nclass InlineEditItem extends InlineSuggestionItemBase {\n    static create(data, textModel) {\n        const offsetEdit = getStringEdit(textModel, data.range, data.insertText);\n        const text = new TextModelText(textModel);\n        const textEdit = TextEdit.fromStringEdit(offsetEdit, text);\n        const singleTextEdit = offsetEdit.isEmpty() ? new TextReplacement(new Range(1, 1, 1, 1), '') : textEdit.toReplacement(text); // FIXME: .toReplacement() can throw because offsetEdit is empty because we get an empty diff in getStringEdit after diffing\n        const identity = new InlineSuggestionIdentity();\n        const edits = offsetEdit.replacements.map(edit => {\n            const replacedRange = Range.fromPositions(textModel.getPositionAt(edit.replaceRange.start), textModel.getPositionAt(edit.replaceRange.endExclusive));\n            const replacedText = textModel.getValueInRange(replacedRange);\n            return SingleUpdatedNextEdit.create(edit, replacedText);\n        });\n        const hint = data.hint ? InlineSuggestHint.create(data.hint) : undefined;\n        return new InlineEditItem(offsetEdit, singleTextEdit, data.uri, data, identity, edits, hint, false, textModel.getVersionId());\n    }\n    constructor(_edit, _textEdit, uri, data, identity, _edits, hint, _lastChangePartOfInlineEdit = false, _inlineEditModelVersion) {\n        super(data, identity, hint);\n        this._edit = _edit;\n        this._textEdit = _textEdit;\n        this.uri = uri;\n        this._edits = _edits;\n        this._lastChangePartOfInlineEdit = _lastChangePartOfInlineEdit;\n        this._inlineEditModelVersion = _inlineEditModelVersion;\n        this.snippetInfo = undefined;\n        this.additionalTextEdits = [];\n        this.isInlineEdit = true;\n    }\n    get updatedEditModelVersion() { return this._inlineEditModelVersion; }\n    get updatedEdit() { return this._edit; }\n    getSingleTextEdit() {\n        return this._textEdit;\n    }\n    withIdentity(identity) {\n        return new InlineEditItem(this._edit, this._textEdit, this.uri, this._data, identity, this._edits, this.hint, this._lastChangePartOfInlineEdit, this._inlineEditModelVersion);\n    }\n    canBeReused(model, position) {\n        // TODO@hediet I believe this can be simplified to `return true;`, as applying an edit should kick out this suggestion.\n        return this._lastChangePartOfInlineEdit && this.updatedEditModelVersion === model.getVersionId();\n    }\n    withEdit(textModelChanges, textModel) {\n        const edit = this._applyTextModelChanges(textModelChanges, this._edits, textModel);\n        return edit;\n    }\n    _applyTextModelChanges(textModelChanges, edits, textModel) {\n        edits = edits.map(innerEdit => innerEdit.applyTextModelChanges(textModelChanges));\n        if (edits.some(edit => edit.edit === undefined)) {\n            return undefined; // change is invalid, so we will have to drop the completion\n        }\n        const newTextModelVersion = textModel.getVersionId();\n        let inlineEditModelVersion = this._inlineEditModelVersion;\n        const lastChangePartOfInlineEdit = edits.some(edit => edit.lastChangeUpdatedEdit);\n        if (lastChangePartOfInlineEdit) {\n            inlineEditModelVersion = newTextModelVersion ?? -1;\n        }\n        if (newTextModelVersion === null || inlineEditModelVersion + 20 < newTextModelVersion) {\n            return undefined; // the completion has been ignored for a while, remove it\n        }\n        edits = edits.filter(innerEdit => !innerEdit.edit.isEmpty);\n        if (edits.length === 0) {\n            return undefined; // the completion has been typed by the user\n        }\n        const newEdit = new StringEdit(edits.map(edit => edit.edit));\n        const positionOffsetTransformer = getPositionOffsetTransformerFromTextModel(textModel);\n        const newTextEdit = positionOffsetTransformer.getTextEdit(newEdit).toReplacement(new TextModelText(textModel));\n        let newDisplayLocation = this.hint;\n        if (newDisplayLocation) {\n            newDisplayLocation = newDisplayLocation.withEdit(textModelChanges, positionOffsetTransformer);\n            if (!newDisplayLocation) {\n                return undefined;\n            }\n        }\n        return new InlineEditItem(newEdit, newTextEdit, this.uri, this._data, this.identity, edits, newDisplayLocation, lastChangePartOfInlineEdit, inlineEditModelVersion);\n    }\n}\nfunction getStringEdit(textModel, editRange, replaceText) {\n    const eol = textModel.getEOL();\n    const editOriginalText = textModel.getValueInRange(editRange);\n    const editReplaceText = replaceText.replace(/\\r\\n|\\r|\\n/g, eol);\n    const diffAlgorithm = linesDiffComputers.getDefault();\n    const lineDiffs = diffAlgorithm.computeDiff(splitLines(editOriginalText), splitLines(editReplaceText), {\n        ignoreTrimWhitespace: false,\n        computeMoves: false,\n        extendToSubwords: true,\n        maxComputationTimeMs: 500,\n    });\n    const innerChanges = lineDiffs.changes.flatMap(c => c.innerChanges ?? []);\n    function addRangeToPos(pos, range) {\n        const start = TextLength.fromPosition(range.getStartPosition());\n        return TextLength.ofRange(range).createRange(start.addToPosition(pos));\n    }\n    const modifiedText = new StringText(editReplaceText);\n    const offsetEdit = new StringEdit(innerChanges.map(c => {\n        const rangeInModel = addRangeToPos(editRange.getStartPosition(), c.originalRange);\n        const originalRange = getPositionOffsetTransformerFromTextModel(textModel).getOffsetRange(rangeInModel);\n        const replaceText = modifiedText.getValueOfRange(c.modifiedRange);\n        const edit = new StringReplacement(originalRange, replaceText);\n        const originalText = textModel.getValueInRange(rangeInModel);\n        return reshapeInlineEdit(edit, originalText, innerChanges.length, textModel);\n    }));\n    return offsetEdit;\n}\nclass SingleUpdatedNextEdit {\n    static create(edit, replacedText) {\n        const prefixLength = commonPrefixLength(edit.newText, replacedText);\n        const suffixLength = commonSuffixLength(edit.newText, replacedText);\n        const trimmedNewText = edit.newText.substring(prefixLength, edit.newText.length - suffixLength);\n        return new SingleUpdatedNextEdit(edit, trimmedNewText, prefixLength, suffixLength);\n    }\n    get edit() { return this._edit; }\n    get lastChangeUpdatedEdit() { return this._lastChangeUpdatedEdit; }\n    constructor(_edit, _trimmedNewText, _prefixLength, _suffixLength, _lastChangeUpdatedEdit = false) {\n        this._edit = _edit;\n        this._trimmedNewText = _trimmedNewText;\n        this._prefixLength = _prefixLength;\n        this._suffixLength = _suffixLength;\n        this._lastChangeUpdatedEdit = _lastChangeUpdatedEdit;\n    }\n    applyTextModelChanges(textModelChanges) {\n        const c = this._clone();\n        c._applyTextModelChanges(textModelChanges);\n        return c;\n    }\n    _clone() {\n        return new SingleUpdatedNextEdit(this._edit, this._trimmedNewText, this._prefixLength, this._suffixLength, this._lastChangeUpdatedEdit);\n    }\n    _applyTextModelChanges(textModelChanges) {\n        this._lastChangeUpdatedEdit = false;\n        if (!this._edit) {\n            throw new BugIndicatingError('UpdatedInnerEdits: No edit to apply changes to');\n        }\n        const result = this._applyChanges(this._edit, textModelChanges);\n        if (!result) {\n            this._edit = undefined;\n            return;\n        }\n        this._edit = result.edit;\n        this._lastChangeUpdatedEdit = result.editHasChanged;\n    }\n    _applyChanges(edit, textModelChanges) {\n        let editStart = edit.replaceRange.start;\n        let editEnd = edit.replaceRange.endExclusive;\n        let editReplaceText = edit.newText;\n        let editHasChanged = false;\n        const shouldPreserveEditShape = this._prefixLength > 0 || this._suffixLength > 0;\n        for (let i = textModelChanges.replacements.length - 1; i >= 0; i--) {\n            const change = textModelChanges.replacements[i];\n            // INSERTIONS (only support inserting at start of edit)\n            const isInsertion = change.newText.length > 0 && change.replaceRange.isEmpty;\n            if (isInsertion && !shouldPreserveEditShape && change.replaceRange.start === editStart && editReplaceText.startsWith(change.newText)) {\n                editStart += change.newText.length;\n                editReplaceText = editReplaceText.substring(change.newText.length);\n                editEnd = Math.max(editStart, editEnd);\n                editHasChanged = true;\n                continue;\n            }\n            if (isInsertion && shouldPreserveEditShape && change.replaceRange.start === editStart + this._prefixLength && this._trimmedNewText.startsWith(change.newText)) {\n                editEnd += change.newText.length;\n                editHasChanged = true;\n                this._prefixLength += change.newText.length;\n                this._trimmedNewText = this._trimmedNewText.substring(change.newText.length);\n                continue;\n            }\n            // DELETIONS\n            const isDeletion = change.newText.length === 0 && change.replaceRange.length > 0;\n            if (isDeletion && change.replaceRange.start >= editStart + this._prefixLength && change.replaceRange.endExclusive <= editEnd - this._suffixLength) {\n                // user deleted text IN-BETWEEN the deletion range\n                editEnd -= change.replaceRange.length;\n                editHasChanged = true;\n                continue;\n            }\n            // user did exactly the edit\n            if (change.equals(edit)) {\n                editHasChanged = true;\n                editStart = change.replaceRange.endExclusive;\n                editReplaceText = '';\n                continue;\n            }\n            // MOVE EDIT\n            if (change.replaceRange.start > editEnd) {\n                // the change happens after the completion range\n                continue;\n            }\n            if (change.replaceRange.endExclusive < editStart) {\n                // the change happens before the completion range\n                editStart += change.newText.length - change.replaceRange.length;\n                editEnd += change.newText.length - change.replaceRange.length;\n                continue;\n            }\n            // The change intersects the completion, so we will have to drop the completion\n            return undefined;\n        }\n        // the resulting edit is a noop as the original and new text are the same\n        if (this._trimmedNewText.length === 0 && editStart + this._prefixLength === editEnd - this._suffixLength) {\n            return { edit: new StringReplacement(new OffsetRange(editStart + this._prefixLength, editStart + this._prefixLength), ''), editHasChanged: true };\n        }\n        return { edit: new StringReplacement(new OffsetRange(editStart, editEnd), editReplaceText), editHasChanged };\n    }\n}\nfunction reshapeInlineCompletion(edit, textModel) {\n    // If the insertion is a multi line insertion starting on the next line\n    // Move it forwards so that the multi line insertion starts on the current line\n    const eol = textModel.getEOL();\n    if (edit.replaceRange.isEmpty && edit.newText.includes(eol)) {\n        edit = reshapeMultiLineInsertion(edit, textModel);\n    }\n    return edit;\n}\nfunction reshapeInlineEdit(edit, originalText, totalInnerEdits, textModel) {\n    // TODO: EOL are not properly trimmed by the diffAlgorithm #12680\n    const eol = textModel.getEOL();\n    if (edit.newText.endsWith(eol) && originalText.endsWith(eol)) {\n        edit = new StringReplacement(edit.replaceRange.deltaEnd(-eol.length), edit.newText.slice(0, -eol.length));\n    }\n    // INSERTION\n    // If the insertion ends with a new line and is inserted at the start of a line which has text,\n    // we move the insertion to the end of the previous line if possible\n    if (totalInnerEdits === 1 && edit.replaceRange.isEmpty && edit.newText.includes(eol)) {\n        const startPosition = textModel.getPositionAt(edit.replaceRange.start);\n        const hasTextOnInsertionLine = textModel.getLineLength(startPosition.lineNumber) !== 0;\n        if (hasTextOnInsertionLine) {\n            edit = reshapeMultiLineInsertion(edit, textModel);\n        }\n    }\n    // The diff algorithm extended a simple edit to the entire word\n    // shrink it back to a simple edit if it is deletion/insertion only\n    if (totalInnerEdits === 1) {\n        const prefixLength = commonPrefixLength(originalText, edit.newText);\n        const suffixLength = commonSuffixLength(originalText.slice(prefixLength), edit.newText.slice(prefixLength));\n        // reshape it back to an insertion\n        if (prefixLength + suffixLength === originalText.length) {\n            return new StringReplacement(edit.replaceRange.deltaStart(prefixLength).deltaEnd(-suffixLength), edit.newText.substring(prefixLength, edit.newText.length - suffixLength));\n        }\n        // reshape it back to a deletion\n        if (prefixLength + suffixLength === edit.newText.length) {\n            return new StringReplacement(edit.replaceRange.deltaStart(prefixLength).deltaEnd(-suffixLength), '');\n        }\n    }\n    return edit;\n}\nfunction reshapeMultiLineInsertion(edit, textModel) {\n    if (!edit.replaceRange.isEmpty) {\n        throw new BugIndicatingError('Unexpected original range');\n    }\n    if (edit.replaceRange.start === 0) {\n        return edit;\n    }\n    const eol = textModel.getEOL();\n    const startPosition = textModel.getPositionAt(edit.replaceRange.start);\n    const startColumn = startPosition.column;\n    const startLineNumber = startPosition.lineNumber;\n    // If the insertion ends with a new line and is inserted at the start of a line which has text,\n    // we move the insertion to the end of the previous line if possible\n    if (startColumn === 1 && startLineNumber > 1 && edit.newText.endsWith(eol) && !edit.newText.startsWith(eol)) {\n        return new StringReplacement(edit.replaceRange.delta(-1), eol + edit.newText.slice(0, -eol.length));\n    }\n    return edit;\n}\n\nexport { InlineCompletionItem, InlineEditItem, InlineSuggestHint, InlineSuggestionIdentity, InlineSuggestionItem, inlineCompletionIsVisible };\n","import { LanguageAgnosticBracketTokens } from './bracketPairsTree/brackets.js';\nimport { lengthAdd, lengthGetColumnCountIfZeroLineCount, lengthZero } from './bracketPairsTree/length.js';\nimport { parseDocument } from './bracketPairsTree/parser.js';\nimport { DenseKeyProvider } from './bracketPairsTree/smallImmutableSet.js';\nimport { TextBufferTokenizer } from './bracketPairsTree/tokenizer.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction fixBracketsInLine(tokens, languageConfigurationService) {\n    const denseKeyProvider = new DenseKeyProvider();\n    const bracketTokens = new LanguageAgnosticBracketTokens(denseKeyProvider, (languageId) => languageConfigurationService.getLanguageConfiguration(languageId));\n    const tokenizer = new TextBufferTokenizer(new StaticTokenizerSource([tokens]), bracketTokens);\n    const node = parseDocument(tokenizer, [], undefined, true);\n    let str = '';\n    const line = tokens.getLineContent();\n    function processNode(node, offset) {\n        if (node.kind === 2 /* AstNodeKind.Pair */) {\n            processNode(node.openingBracket, offset);\n            offset = lengthAdd(offset, node.openingBracket.length);\n            if (node.child) {\n                processNode(node.child, offset);\n                offset = lengthAdd(offset, node.child.length);\n            }\n            if (node.closingBracket) {\n                processNode(node.closingBracket, offset);\n                offset = lengthAdd(offset, node.closingBracket.length);\n            }\n            else {\n                const singleLangBracketTokens = bracketTokens.getSingleLanguageBracketTokens(node.openingBracket.languageId);\n                const closingTokenText = singleLangBracketTokens.findClosingTokenText(node.openingBracket.bracketIds);\n                str += closingTokenText;\n            }\n        }\n        else if (node.kind === 3 /* AstNodeKind.UnexpectedClosingBracket */) ;\n        else if (node.kind === 0 /* AstNodeKind.Text */ || node.kind === 1 /* AstNodeKind.Bracket */) {\n            str += line.substring(lengthGetColumnCountIfZeroLineCount(offset), lengthGetColumnCountIfZeroLineCount(lengthAdd(offset, node.length)));\n        }\n        else if (node.kind === 4 /* AstNodeKind.List */) {\n            for (const child of node.children) {\n                processNode(child, offset);\n                offset = lengthAdd(offset, child.length);\n            }\n        }\n    }\n    processNode(node, lengthZero);\n    return str;\n}\nclass StaticTokenizerSource {\n    constructor(lines) {\n        this.lines = lines;\n        this.tokenization = {\n            getLineTokens: (lineNumber) => {\n                return this.lines[lineNumber - 1];\n            }\n        };\n    }\n    getLineCount() {\n        return this.lines.length;\n    }\n    getLineLength(lineNumber) {\n        return this.lines[lineNumber - 1].getLineContent().length;\n    }\n}\n\nexport { fixBracketsInLine };\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 *--------------------------------------------------------------------------------------------*/\nclass DirectedGraph {\n    constructor() {\n        this._nodes = new Set();\n        this._outgoingEdges = new Map();\n    }\n    static from(nodes, getOutgoing) {\n        const graph = new DirectedGraph();\n        for (const node of nodes) {\n            graph._nodes.add(node);\n        }\n        for (const node of nodes) {\n            const outgoing = getOutgoing(node);\n            if (outgoing.length > 0) {\n                const outgoingSet = new Set();\n                for (const target of outgoing) {\n                    outgoingSet.add(target);\n                }\n                graph._outgoingEdges.set(node, outgoingSet);\n            }\n        }\n        return graph;\n    }\n    /**\n     * After this, the graph is guaranteed to have no cycles.\n     */\n    removeCycles() {\n        const foundCycles = [];\n        const visited = new Set();\n        const recursionStack = new Set();\n        const toRemove = [];\n        const dfs = (node) => {\n            visited.add(node);\n            recursionStack.add(node);\n            const outgoing = this._outgoingEdges.get(node);\n            if (outgoing) {\n                for (const neighbor of outgoing) {\n                    if (!visited.has(neighbor)) {\n                        dfs(neighbor);\n                    }\n                    else if (recursionStack.has(neighbor)) {\n                        // Found a cycle\n                        foundCycles.push(neighbor);\n                        toRemove.push({ from: node, to: neighbor });\n                    }\n                }\n            }\n            recursionStack.delete(node);\n        };\n        // Run DFS from all unvisited nodes\n        for (const node of this._nodes) {\n            if (!visited.has(node)) {\n                dfs(node);\n            }\n        }\n        // Remove edges that cause cycles\n        for (const { from, to } of toRemove) {\n            const outgoingSet = this._outgoingEdges.get(from);\n            if (outgoingSet) {\n                outgoingSet.delete(to);\n            }\n        }\n        return { foundCycles };\n    }\n    getOutgoing(node) {\n        const outgoing = this._outgoingEdges.get(node);\n        return outgoing ? Array.from(outgoing) : [];\n    }\n}\n\nexport { DirectedGraph };\n","var InlineEditTabAction;\n(function (InlineEditTabAction) {\n    InlineEditTabAction[\"Jump\"] = \"jump\";\n    InlineEditTabAction[\"Accept\"] = \"accept\";\n    InlineEditTabAction[\"Inactive\"] = \"inactive\";\n})(InlineEditTabAction || (InlineEditTabAction = {}));\n// TODO: Move this out of here as it is also includes ghosttext\nvar InlineCompletionViewKind;\n(function (InlineCompletionViewKind) {\n    InlineCompletionViewKind[\"GhostText\"] = \"ghostText\";\n    InlineCompletionViewKind[\"Custom\"] = \"custom\";\n    InlineCompletionViewKind[\"SideBySide\"] = \"sideBySide\";\n    InlineCompletionViewKind[\"Deletion\"] = \"deletion\";\n    InlineCompletionViewKind[\"InsertionInline\"] = \"insertionInline\";\n    InlineCompletionViewKind[\"InsertionMultiLine\"] = \"insertionMultiLine\";\n    InlineCompletionViewKind[\"WordReplacements\"] = \"wordReplacements\";\n    InlineCompletionViewKind[\"LineReplacement\"] = \"lineReplacement\";\n    InlineCompletionViewKind[\"Collapsed\"] = \"collapsed\";\n})(InlineCompletionViewKind || (InlineCompletionViewKind = {}));\n\nexport { InlineCompletionViewKind, InlineEditTabAction };\n","import { assertNever } from '../../../../../base/common/assert.js';\nimport { AsyncIterableProducer } from '../../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError } from '../../../../../base/common/errors.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport { prefixedUuid } from '../../../../../base/common/uuid.js';\nimport { StringReplacement } from '../../../../common/core/edits/stringEdit.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { TextReplacement } from '../../../../common/core/edits/textEdit.js';\nimport { InlineCompletionEndOfLifeReasonKind } from '../../../../common/languages.js';\nimport { fixBracketsInLine } from '../../../../common/model/bracketPairsTextModelPart/fixBrackets.js';\nimport { SnippetParser, Text } from '../../../snippet/browser/snippetParser.js';\nimport { getReadonlyEmptyArray } from '../utils.js';\nimport { groupByMap } from '../../../../../base/common/collections.js';\nimport { DirectedGraph } from './graph.js';\nimport { CachedFunction } from '../../../../../base/common/cache.js';\nimport { InlineCompletionViewKind } from '../view/inlineEdits/inlineEditsViewInterface.js';\nimport { isDefined } from '../../../../../base/common/types.js';\nimport { inlineCompletionIsVisible } from './inlineSuggestionItem.js';\nimport { EditDeltaInfo } from '../../../../common/textModelEditSource.js';\nimport { URI } from '../../../../../base/common/uri.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction provideInlineCompletions(providers, position, model, context, requestInfo, languageConfigurationService) {\n    const requestUuid = prefixedUuid('icr');\n    const cancellationTokenSource = new CancellationTokenSource();\n    let cancelReason = undefined;\n    const contextWithUuid = { ...context, requestUuid: requestUuid };\n    const defaultReplaceRange = getDefaultRange(position, model);\n    const providersByGroupId = groupByMap(providers, p => p.groupId);\n    const yieldsToGraph = DirectedGraph.from(providers, p => {\n        return p.yieldsToGroupIds?.flatMap(groupId => providersByGroupId.get(groupId) ?? []) ?? [];\n    });\n    const { foundCycles } = yieldsToGraph.removeCycles();\n    if (foundCycles.length > 0) {\n        onUnexpectedExternalError(new Error(`Inline completions: cyclic yield-to dependency detected.`\n            + ` Path: ${foundCycles.map(s => s.toString ? s.toString() : ('' + s)).join(' -> ')}`));\n    }\n    let runningCount = 0;\n    const queryProvider = new CachedFunction(async (provider) => {\n        try {\n            runningCount++;\n            if (cancellationTokenSource.token.isCancellationRequested) {\n                return undefined;\n            }\n            const yieldsTo = yieldsToGraph.getOutgoing(provider);\n            for (const p of yieldsTo) {\n                // We know there is no cycle, so no recursion here\n                const result = await queryProvider.get(p);\n                if (result) {\n                    for (const item of result.inlineSuggestions.items) {\n                        if (item.isInlineEdit || typeof item.insertText !== 'string' && item.insertText !== undefined) {\n                            return undefined;\n                        }\n                        if (item.insertText !== undefined) {\n                            const t = new TextReplacement(Range.lift(item.range) ?? defaultReplaceRange, item.insertText);\n                            if (inlineCompletionIsVisible(t, undefined, model, position)) {\n                                return undefined;\n                            }\n                        }\n                        // else: inline completion is not visible, so lets not block\n                    }\n                }\n            }\n            let result;\n            const providerStartTime = Date.now();\n            try {\n                result = await provider.provideInlineCompletions(model, position, contextWithUuid, cancellationTokenSource.token);\n            }\n            catch (e) {\n                onUnexpectedExternalError(e);\n                return undefined;\n            }\n            const providerEndTime = Date.now();\n            if (!result) {\n                return undefined;\n            }\n            const data = [];\n            const list = new InlineSuggestionList(result, data, provider);\n            list.addRef();\n            runWhenCancelled(cancellationTokenSource.token, () => {\n                return list.removeRef(cancelReason);\n            });\n            if (cancellationTokenSource.token.isCancellationRequested) {\n                return undefined; // The list is disposed now, so we cannot return the items!\n            }\n            for (const item of result.items) {\n                data.push(toInlineSuggestData(item, list, defaultReplaceRange, model, languageConfigurationService, contextWithUuid, requestInfo, { startTime: providerStartTime, endTime: providerEndTime }));\n            }\n            return list;\n        }\n        finally {\n            runningCount--;\n        }\n    });\n    const inlineCompletionLists = AsyncIterableProducer.fromPromisesResolveOrder(providers.map(p => queryProvider.get(p))).filter(isDefined);\n    return {\n        contextWithUuid,\n        get didAllProvidersReturn() { return runningCount === 0; },\n        lists: inlineCompletionLists,\n        cancelAndDispose: reason => {\n            if (cancelReason !== undefined) {\n                return;\n            }\n            cancelReason = reason;\n            cancellationTokenSource.dispose(true);\n        }\n    };\n}\n/** If the token is eventually cancelled, this will not leak either. */\nfunction runWhenCancelled(token, callback) {\n    if (token.isCancellationRequested) {\n        callback();\n        return Disposable.None;\n    }\n    else {\n        const listener = token.onCancellationRequested(() => {\n            listener.dispose();\n            callback();\n        });\n        return { dispose: () => listener.dispose() };\n    }\n}\nfunction toInlineSuggestData(inlineCompletion, source, defaultReplaceRange, textModel, languageConfigurationService, context, requestInfo, providerRequestInfo) {\n    let insertText;\n    let snippetInfo;\n    let range = inlineCompletion.range ? Range.lift(inlineCompletion.range) : defaultReplaceRange;\n    if (typeof inlineCompletion.insertText === 'string') {\n        insertText = inlineCompletion.insertText;\n        if (languageConfigurationService && inlineCompletion.completeBracketPairs) {\n            insertText = closeBrackets(insertText, range.getStartPosition(), textModel, languageConfigurationService);\n            // Modify range depending on if brackets are added or removed\n            const diff = insertText.length - inlineCompletion.insertText.length;\n            if (diff !== 0) {\n                range = new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn + diff);\n            }\n        }\n        snippetInfo = undefined;\n    }\n    else if (inlineCompletion.insertText === undefined) {\n        insertText = ''; // TODO use undefined\n        snippetInfo = undefined;\n        range = new Range(1, 1, 1, 1);\n    }\n    else if ('snippet' in inlineCompletion.insertText) {\n        const preBracketCompletionLength = inlineCompletion.insertText.snippet.length;\n        if (languageConfigurationService && inlineCompletion.completeBracketPairs) {\n            inlineCompletion.insertText.snippet = closeBrackets(inlineCompletion.insertText.snippet, range.getStartPosition(), textModel, languageConfigurationService);\n            // Modify range depending on if brackets are added or removed\n            const diff = inlineCompletion.insertText.snippet.length - preBracketCompletionLength;\n            if (diff !== 0) {\n                range = new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn + diff);\n            }\n        }\n        const snippet = new SnippetParser().parse(inlineCompletion.insertText.snippet);\n        if (snippet.children.length === 1 && snippet.children[0] instanceof Text) {\n            insertText = snippet.children[0].value;\n            snippetInfo = undefined;\n        }\n        else {\n            insertText = snippet.toString();\n            snippetInfo = {\n                snippet: inlineCompletion.insertText.snippet,\n                range: range\n            };\n        }\n    }\n    else {\n        assertNever(inlineCompletion.insertText);\n    }\n    return new InlineSuggestData(range, insertText, snippetInfo, URI.revive(inlineCompletion.uri), inlineCompletion.hint, inlineCompletion.additionalTextEdits || getReadonlyEmptyArray(), inlineCompletion, source, context, inlineCompletion.isInlineEdit ?? false, requestInfo, providerRequestInfo, inlineCompletion.correlationId);\n}\nclass InlineSuggestData {\n    constructor(range, insertText, snippetInfo, uri, hint, additionalTextEdits, sourceInlineCompletion, source, context, isInlineEdit, _requestInfo, _providerRequestInfo, _correlationId) {\n        this.range = range;\n        this.insertText = insertText;\n        this.snippetInfo = snippetInfo;\n        this.uri = uri;\n        this.hint = hint;\n        this.additionalTextEdits = additionalTextEdits;\n        this.sourceInlineCompletion = sourceInlineCompletion;\n        this.source = source;\n        this.context = context;\n        this.isInlineEdit = isInlineEdit;\n        this._requestInfo = _requestInfo;\n        this._providerRequestInfo = _providerRequestInfo;\n        this._correlationId = _correlationId;\n        this._didShow = false;\n        this._timeUntilShown = undefined;\n        this._showStartTime = undefined;\n        this._shownDuration = 0;\n        this._showUncollapsedStartTime = undefined;\n        this._showUncollapsedDuration = 0;\n        this._notShownReason = undefined;\n        this._didReportEndOfLife = false;\n        this._lastSetEndOfLifeReason = undefined;\n        this._isPreceeded = false;\n        this._partiallyAcceptedCount = 0;\n        this._partiallyAcceptedSinceOriginal = { characters: 0, ratio: 0, count: 0 };\n        this._viewData = { editorType: _requestInfo.editorType };\n    }\n    get showInlineEditMenu() { return this.sourceInlineCompletion.showInlineEditMenu ?? false; }\n    get partialAccepts() { return this._partiallyAcceptedSinceOriginal; }\n    async reportInlineEditShown(commandService, updatedInsertText, viewKind, viewData) {\n        this.updateShownDuration(viewKind);\n        if (this._didShow) {\n            return;\n        }\n        this._didShow = true;\n        this._viewData.viewKind = viewKind;\n        this._viewData.renderData = viewData;\n        this._timeUntilShown = Date.now() - this._requestInfo.startTime;\n        const editDeltaInfo = new EditDeltaInfo(viewData.lineCountModified, viewData.lineCountOriginal, viewData.characterCountModified, viewData.characterCountOriginal);\n        this.source.provider.handleItemDidShow?.(this.source.inlineSuggestions, this.sourceInlineCompletion, updatedInsertText, editDeltaInfo);\n        if (this.sourceInlineCompletion.shownCommand) {\n            await commandService.executeCommand(this.sourceInlineCompletion.shownCommand.id, ...(this.sourceInlineCompletion.shownCommand.arguments || []));\n        }\n    }\n    reportPartialAccept(acceptedCharacters, info, partialAcceptance) {\n        this._partiallyAcceptedCount++;\n        this._partiallyAcceptedSinceOriginal.characters += partialAcceptance.characters;\n        this._partiallyAcceptedSinceOriginal.ratio = Math.min(this._partiallyAcceptedSinceOriginal.ratio + (1 - this._partiallyAcceptedSinceOriginal.ratio) * partialAcceptance.ratio, 1);\n        this._partiallyAcceptedSinceOriginal.count += partialAcceptance.count;\n        this.source.provider.handlePartialAccept?.(this.source.inlineSuggestions, this.sourceInlineCompletion, acceptedCharacters, info);\n    }\n    /**\n     * Sends the end of life event to the provider.\n     * If no reason is provided, the last set reason is used.\n     * If no reason was set, the default reason is used.\n    */\n    reportEndOfLife(reason) {\n        if (this._didReportEndOfLife) {\n            return;\n        }\n        this._didReportEndOfLife = true;\n        this.reportInlineEditHidden();\n        if (!reason) {\n            reason = this._lastSetEndOfLifeReason ?? { kind: InlineCompletionEndOfLifeReasonKind.Ignored, userTypingDisagreed: false, supersededBy: undefined };\n        }\n        if (reason.kind === InlineCompletionEndOfLifeReasonKind.Rejected && this.source.provider.handleRejection) {\n            this.source.provider.handleRejection(this.source.inlineSuggestions, this.sourceInlineCompletion);\n        }\n        if (this.source.provider.handleEndOfLifetime) {\n            const summary = {\n                requestUuid: this.context.requestUuid,\n                correlationId: this._correlationId,\n                selectedSuggestionInfo: !!this.context.selectedSuggestionInfo,\n                partiallyAccepted: this._partiallyAcceptedCount,\n                partiallyAcceptedCountSinceOriginal: this._partiallyAcceptedSinceOriginal.count,\n                partiallyAcceptedRatioSinceOriginal: this._partiallyAcceptedSinceOriginal.ratio,\n                partiallyAcceptedCharactersSinceOriginal: this._partiallyAcceptedSinceOriginal.characters,\n                shown: this._didShow,\n                shownDuration: this._shownDuration,\n                shownDurationUncollapsed: this._showUncollapsedDuration,\n                preceeded: this._isPreceeded,\n                timeUntilShown: this._timeUntilShown,\n                timeUntilProviderRequest: this._providerRequestInfo.startTime - this._requestInfo.startTime,\n                timeUntilProviderResponse: this._providerRequestInfo.endTime - this._requestInfo.startTime,\n                editorType: this._viewData.editorType,\n                languageId: this._requestInfo.languageId,\n                requestReason: this._requestInfo.reason,\n                viewKind: this._viewData.viewKind,\n                notShownReason: this._notShownReason,\n                typingInterval: this._requestInfo.typingInterval,\n                typingIntervalCharacterCount: this._requestInfo.typingIntervalCharacterCount,\n                availableProviders: this._requestInfo.availableProviders.map(p => p.toString()).join(','),\n                ...this._viewData.renderData,\n            };\n            this.source.provider.handleEndOfLifetime(this.source.inlineSuggestions, this.sourceInlineCompletion, reason, summary);\n        }\n    }\n    setIsPreceeded(partialAccepts) {\n        this._isPreceeded = true;\n        if (this._partiallyAcceptedSinceOriginal.characters !== 0 || this._partiallyAcceptedSinceOriginal.ratio !== 0 || this._partiallyAcceptedSinceOriginal.count !== 0) {\n            console.warn('Expected partiallyAcceptedCountSinceOriginal to be { characters: 0, rate: 0, partialAcceptances: 0 } before setIsPreceeded.');\n        }\n        this._partiallyAcceptedSinceOriginal = partialAccepts;\n    }\n    setNotShownReason(reason) {\n        this._notShownReason ??= reason;\n    }\n    /**\n     * Sets the end of life reason, but does not send the event to the provider yet.\n    */\n    setEndOfLifeReason(reason) {\n        this.reportInlineEditHidden();\n        this._lastSetEndOfLifeReason = reason;\n    }\n    updateShownDuration(viewKind) {\n        const timeNow = Date.now();\n        if (!this._showStartTime) {\n            this._showStartTime = timeNow;\n        }\n        const isCollapsed = viewKind === InlineCompletionViewKind.Collapsed;\n        if (!isCollapsed && this._showUncollapsedStartTime === undefined) {\n            this._showUncollapsedStartTime = timeNow;\n        }\n        if (isCollapsed && this._showUncollapsedStartTime !== undefined) {\n            this._showUncollapsedDuration += timeNow - this._showUncollapsedStartTime;\n        }\n    }\n    reportInlineEditHidden() {\n        if (this._showStartTime === undefined) {\n            return;\n        }\n        const timeNow = Date.now();\n        this._shownDuration += timeNow - this._showStartTime;\n        this._showStartTime = undefined;\n        if (this._showUncollapsedStartTime === undefined) {\n            return;\n        }\n        this._showUncollapsedDuration += timeNow - this._showUncollapsedStartTime;\n        this._showUncollapsedStartTime = undefined;\n    }\n}\nvar InlineCompletionEditorType;\n(function (InlineCompletionEditorType) {\n    InlineCompletionEditorType[\"TextEditor\"] = \"textEditor\";\n    InlineCompletionEditorType[\"DiffEditor\"] = \"diffEditor\";\n    InlineCompletionEditorType[\"Notebook\"] = \"notebook\";\n})(InlineCompletionEditorType || (InlineCompletionEditorType = {}));\n/**\n * A ref counted pointer to the computed `InlineCompletions` and the `InlineCompletionsProvider` that\n * computed them.\n */\nclass InlineSuggestionList {\n    constructor(inlineSuggestions, inlineSuggestionsData, provider) {\n        this.inlineSuggestions = inlineSuggestions;\n        this.inlineSuggestionsData = inlineSuggestionsData;\n        this.provider = provider;\n        this.refCount = 0;\n    }\n    addRef() {\n        this.refCount++;\n    }\n    removeRef(reason = { kind: 'other' }) {\n        this.refCount--;\n        if (this.refCount === 0) {\n            for (const item of this.inlineSuggestionsData) {\n                // Fallback if it has not been called before\n                item.reportEndOfLife();\n            }\n            this.provider.disposeInlineCompletions(this.inlineSuggestions, reason);\n        }\n    }\n}\nfunction getDefaultRange(position, model) {\n    const word = model.getWordAtPosition(position);\n    const maxColumn = model.getLineMaxColumn(position.lineNumber);\n    // By default, always replace up until the end of the current line.\n    // This default might be subject to change!\n    return word\n        ? new Range(position.lineNumber, word.startColumn, position.lineNumber, maxColumn)\n        : Range.fromPositions(position, position.with(undefined, maxColumn));\n}\nfunction closeBrackets(text, position, model, languageConfigurationService) {\n    const currentLine = model.getLineContent(position.lineNumber);\n    const edit = StringReplacement.replace(new OffsetRange(position.column - 1, currentLine.length), text);\n    const proposedLineTokens = model.tokenization.tokenizeLinesAt(position.lineNumber, [edit.replace(currentLine)]);\n    const textTokens = proposedLineTokens?.[0].sliceZeroCopy(edit.getRangeAfterReplace());\n    if (!textTokens) {\n        return text;\n    }\n    const fixedText = fixBracketsInLine(textTokens, languageConfigurationService);\n    return fixedText;\n}\n\nexport { InlineCompletionEditorType, InlineSuggestData, InlineSuggestionList, provideInlineCompletions, runWhenCancelled };\n","import { compareUndefinedSmallest, numberComparator, compareBy, booleanComparator } from '../../../../../base/common/arrays.js';\nimport { findLastMax } from '../../../../../base/common/arraysFind.js';\nimport { RunOnceScheduler } from '../../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../../base/common/cancellation.js';\nimport { equalsIfDefined, itemEquals } from '../../../../../base/common/equals.js';\nimport { Disposable, MutableDisposable, DisposableStore, toDisposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { observableReducerSettable } from '../../../../../base/common/observableInternal/experimental/reducer.js';\nimport { isObject, isDefined } from '../../../../../base/common/types.js';\nimport { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';\nimport { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { isCopilotLikeExtension, forwardToChannelIf, DataChannelForwardingTelemetryService } from '../../../../../platform/dataChannel/browser/forwardingTelemetryService.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { ILogService } from '../../../../../platform/log/common/log.js';\nimport { observableConfigValue } from '../../../../../platform/observable/common/platformObservableUtils.js';\nimport product from '../../../../../platform/product/common/product.js';\nimport { StringEdit } from '../../../../common/core/edits/stringEdit.js';\nimport { InlineCompletionTriggerKind, InlineCompletionEndOfLifeReasonKind } from '../../../../common/languages.js';\nimport { ILanguageConfigurationService } from '../../../../common/languages/languageConfigurationRegistry.js';\nimport { offsetEditFromContentChanges } from '../../../../common/model/textModelStringEdit.js';\nimport { StructuredLogger, formatRecordableLogEntry } from '../structuredLogger.js';\nimport { sendInlineCompletionsEndOfLifeTelemetry } from '../telemetry.js';\nimport { wait } from '../utils.js';\nimport { InlineSuggestionItem } from './inlineSuggestionItem.js';\nimport { provideInlineCompletions, runWhenCancelled } from './provideInlineCompletions.js';\nimport { recordChangesLazy } from '../../../../../base/common/observableInternal/changeTracker.js';\nimport { derived } from '../../../../../base/common/observableInternal/observables/derived.js';\nimport { observableValue } from '../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { transaction } from '../../../../../base/common/observableInternal/transaction.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar InlineCompletionsSource_1;\nlet InlineCompletionsSource = class InlineCompletionsSource extends Disposable {\n    static { InlineCompletionsSource_1 = this; }\n    static { this._requestId = 0; }\n    constructor(_textModel, _versionId, _debounceValue, _cursorPosition, _languageConfigurationService, _logService, _configurationService, _instantiationService, _contextKeyService) {\n        super();\n        this._textModel = _textModel;\n        this._versionId = _versionId;\n        this._debounceValue = _debounceValue;\n        this._cursorPosition = _cursorPosition;\n        this._languageConfigurationService = _languageConfigurationService;\n        this._logService = _logService;\n        this._configurationService = _configurationService;\n        this._instantiationService = _instantiationService;\n        this._contextKeyService = _contextKeyService;\n        this._updateOperation = this._register(new MutableDisposable());\n        this._state = observableReducerSettable(this, {\n            initial: () => ({\n                inlineCompletions: InlineCompletionsState.createEmpty(),\n                suggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n            }),\n            disposeFinal: (values) => {\n                values.inlineCompletions.dispose();\n                values.suggestWidgetInlineCompletions.dispose();\n            },\n            changeTracker: recordChangesLazy(() => ({ versionId: this._versionId })),\n            update: (reader, previousValue, changes) => {\n                const edit = StringEdit.compose(changes.changes.map(c => c.change ? offsetEditFromContentChanges(c.change.changes) : StringEdit.empty).filter(isDefined));\n                if (edit.isEmpty()) {\n                    return previousValue;\n                }\n                try {\n                    return {\n                        inlineCompletions: previousValue.inlineCompletions.createStateWithAppliedEdit(edit, this._textModel),\n                        suggestWidgetInlineCompletions: previousValue.suggestWidgetInlineCompletions.createStateWithAppliedEdit(edit, this._textModel),\n                    };\n                }\n                finally {\n                    previousValue.inlineCompletions.dispose();\n                    previousValue.suggestWidgetInlineCompletions.dispose();\n                }\n            }\n        });\n        this.inlineCompletions = this._state.map(this, v => v.inlineCompletions);\n        this.suggestWidgetInlineCompletions = this._state.map(this, v => v.suggestWidgetInlineCompletions);\n        this._completionsEnabled = undefined;\n        this.clearOperationOnTextModelChange = derived(this, reader => {\n            this._versionId.read(reader);\n            this._updateOperation.clear();\n            return undefined; // always constant\n        });\n        this._loadingCount = observableValue(this, 0);\n        this._loggingEnabled = observableConfigValue('editor.inlineSuggest.logFetch', false, this._configurationService).recomputeInitiallyAndOnChange(this._store);\n        this._sendRequestData = observableConfigValue('editor.inlineSuggest.emptyResponseInformation', true, this._configurationService).recomputeInitiallyAndOnChange(this._store);\n        this._structuredFetchLogger = this._register(this._instantiationService.createInstance(StructuredLogger.cast(), 'editor.inlineSuggest.logFetch.commandId'));\n        this.clearOperationOnTextModelChange.recomputeInitiallyAndOnChange(this._store);\n        const enablementSetting = product.defaultChatAgent?.completionsEnablementSetting ?? undefined;\n        if (enablementSetting) {\n            this._updateCompletionsEnablement(enablementSetting);\n            this._register(this._configurationService.onDidChangeConfiguration(e => {\n                if (e.affectsConfiguration(enablementSetting)) {\n                    this._updateCompletionsEnablement(enablementSetting);\n                }\n            }));\n        }\n        this._state.recomputeInitiallyAndOnChange(this._store);\n    }\n    _updateCompletionsEnablement(enalementSetting) {\n        const result = this._configurationService.getValue(enalementSetting);\n        if (!isObject(result)) {\n            this._completionsEnabled = undefined;\n        }\n        else {\n            this._completionsEnabled = result;\n        }\n    }\n    _log(entry) {\n        if (this._loggingEnabled.get()) {\n            this._logService.info(formatRecordableLogEntry(entry));\n        }\n        this._structuredFetchLogger.log(entry);\n    }\n    fetch(providers, providersLabel, context, activeInlineCompletion, withDebounce, userJumpedToActiveCompletion, requestInfo) {\n        const position = this._cursorPosition.get();\n        const request = new UpdateRequest(position, context, this._textModel.getVersionId(), new Set(providers));\n        const target = context.selectedSuggestionInfo ? this.suggestWidgetInlineCompletions.get() : this.inlineCompletions.get();\n        if (this._updateOperation.value?.request.satisfies(request)) {\n            return this._updateOperation.value.promise;\n        }\n        else if (target?.request?.satisfies(request)) {\n            return Promise.resolve(true);\n        }\n        const updateOngoing = !!this._updateOperation.value;\n        this._updateOperation.clear();\n        const source = new CancellationTokenSource();\n        const promise = (async () => {\n            const store = new DisposableStore();\n            this._loadingCount.set(this._loadingCount.get() + 1, undefined);\n            let didDecrease = false;\n            const decreaseLoadingCount = () => {\n                if (!didDecrease) {\n                    didDecrease = true;\n                    this._loadingCount.set(this._loadingCount.get() - 1, undefined);\n                }\n            };\n            const loadingReset = store.add(new RunOnceScheduler(() => decreaseLoadingCount(), 10 * 1000));\n            loadingReset.schedule();\n            const inlineSuggestionsProviders = providers.filter(p => p.providerId);\n            const requestResponseInfo = new RequestResponseData(context, requestInfo, inlineSuggestionsProviders);\n            try {\n                const recommendedDebounceValue = this._debounceValue.get(this._textModel);\n                const debounceValue = findLastMax(providers.map(p => p.debounceDelayMs), compareUndefinedSmallest(numberComparator)) ?? recommendedDebounceValue;\n                // Debounce in any case if update is ongoing\n                const shouldDebounce = updateOngoing || (withDebounce && context.triggerKind === InlineCompletionTriggerKind.Automatic);\n                if (shouldDebounce) {\n                    // This debounces the operation\n                    await wait(debounceValue, source.token);\n                }\n                if (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId) {\n                    requestResponseInfo.setNoSuggestionReasonIfNotSet('canceled:beforeFetch');\n                    return false;\n                }\n                const requestId = InlineCompletionsSource_1._requestId++;\n                if (this._loggingEnabled.get() || this._structuredFetchLogger.isEnabled.get()) {\n                    this._log({\n                        sourceId: 'InlineCompletions.fetch',\n                        kind: 'start',\n                        requestId,\n                        modelUri: this._textModel.uri,\n                        modelVersion: this._textModel.getVersionId(),\n                        context: { triggerKind: context.triggerKind, suggestInfo: context.selectedSuggestionInfo ? true : undefined },\n                        time: Date.now(),\n                        provider: providersLabel,\n                    });\n                }\n                const startTime = new Date();\n                const providerResult = provideInlineCompletions(providers, this._cursorPosition.get(), this._textModel, context, requestInfo, this._languageConfigurationService);\n                runWhenCancelled(source.token, () => providerResult.cancelAndDispose({ kind: 'tokenCancellation' }));\n                let shouldStopEarly = false;\n                let producedSuggestion = false;\n                const suggestions = [];\n                for await (const list of providerResult.lists) {\n                    if (!list) {\n                        continue;\n                    }\n                    list.addRef();\n                    store.add(toDisposable(() => list.removeRef(list.inlineSuggestionsData.length === 0 ? { kind: 'empty' } : { kind: 'notTaken' })));\n                    for (const item of list.inlineSuggestionsData) {\n                        producedSuggestion = true;\n                        if (!context.includeInlineEdits && (item.isInlineEdit || item.showInlineEditMenu)) {\n                            item.setNotShownReason('notInlineEditRequested');\n                            continue;\n                        }\n                        if (!context.includeInlineCompletions && !(item.isInlineEdit || item.showInlineEditMenu)) {\n                            item.setNotShownReason('notInlineCompletionRequested');\n                            continue;\n                        }\n                        const i = InlineSuggestionItem.create(item, this._textModel);\n                        suggestions.push(i);\n                        // Stop after first visible inline completion\n                        if (!i.isInlineEdit && !i.showInlineEditMenu && context.triggerKind === InlineCompletionTriggerKind.Automatic) {\n                            if (i.isVisible(this._textModel, this._cursorPosition.get())) {\n                                shouldStopEarly = true;\n                            }\n                        }\n                    }\n                    if (shouldStopEarly) {\n                        break;\n                    }\n                }\n                providerResult.cancelAndDispose({ kind: 'lostRace' });\n                if (this._loggingEnabled.get() || this._structuredFetchLogger.isEnabled.get()) {\n                    const didAllProvidersReturn = providerResult.didAllProvidersReturn;\n                    let error = undefined;\n                    if (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId) {\n                        error = 'canceled';\n                    }\n                    const result = suggestions.map(c => ({\n                        range: c.editRange.toString(),\n                        text: c.insertText,\n                        hint: c.hint,\n                        isInlineEdit: c.isInlineEdit,\n                        showInlineEditMenu: c.showInlineEditMenu,\n                        providerId: c.source.provider.providerId?.toString(),\n                    }));\n                    this._log({ sourceId: 'InlineCompletions.fetch', kind: 'end', requestId, durationMs: (Date.now() - startTime.getTime()), error, result, time: Date.now(), didAllProvidersReturn });\n                }\n                requestResponseInfo.setRequestUuid(providerResult.contextWithUuid.requestUuid);\n                if (producedSuggestion) {\n                    requestResponseInfo.setHasProducedSuggestion();\n                    if (suggestions.length > 0 && source.token.isCancellationRequested) {\n                        suggestions.forEach(s => s.setNotShownReasonIfNotSet('canceled:whileAwaitingOtherProviders'));\n                    }\n                }\n                else {\n                    if (source.token.isCancellationRequested) {\n                        requestResponseInfo.setNoSuggestionReasonIfNotSet('canceled:whileFetching');\n                    }\n                    else {\n                        const completionsQuotaExceeded = this._contextKeyService.getContextKeyValue('completionsQuotaExceeded');\n                        requestResponseInfo.setNoSuggestionReasonIfNotSet(completionsQuotaExceeded ? 'completionsQuotaExceeded' : 'noSuggestion');\n                    }\n                }\n                const remainingTimeToWait = context.earliestShownDateTime - Date.now();\n                if (remainingTimeToWait > 0) {\n                    await wait(remainingTimeToWait, source.token);\n                }\n                if (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId\n                    || userJumpedToActiveCompletion.get() /* In the meantime the user showed interest for the active completion so dont hide it */) {\n                    const notShownReason = source.token.isCancellationRequested ? 'canceled:afterMinShowDelay' :\n                        this._store.isDisposed ? 'canceled:disposed' :\n                            this._textModel.getVersionId() !== request.versionId ? 'canceled:documentChanged' :\n                                userJumpedToActiveCompletion.get() ? 'canceled:userJumped' :\n                                    'unknown';\n                    suggestions.forEach(s => s.setNotShownReasonIfNotSet(notShownReason));\n                    return false;\n                }\n                const endTime = new Date();\n                this._debounceValue.update(this._textModel, endTime.getTime() - startTime.getTime());\n                const cursorPosition = this._cursorPosition.get();\n                this._updateOperation.clear();\n                transaction(tx => {\n                    /** @description Update completions with provider result */\n                    const v = this._state.get();\n                    if (context.selectedSuggestionInfo) {\n                        this._state.set({\n                            inlineCompletions: InlineCompletionsState.createEmpty(),\n                            suggestWidgetInlineCompletions: v.suggestWidgetInlineCompletions.createStateWithAppliedResults(suggestions, request, this._textModel, cursorPosition, activeInlineCompletion),\n                        }, tx);\n                    }\n                    else {\n                        this._state.set({\n                            inlineCompletions: v.inlineCompletions.createStateWithAppliedResults(suggestions, request, this._textModel, cursorPosition, activeInlineCompletion),\n                            suggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n                        }, tx);\n                    }\n                    v.inlineCompletions.dispose();\n                    v.suggestWidgetInlineCompletions.dispose();\n                });\n            }\n            finally {\n                store.dispose();\n                decreaseLoadingCount();\n                this.sendInlineCompletionsRequestTelemetry(requestResponseInfo);\n            }\n            return true;\n        })();\n        const updateOperation = new UpdateOperation(request, source, promise);\n        this._updateOperation.value = updateOperation;\n        return promise;\n    }\n    clear(tx) {\n        this._updateOperation.clear();\n        const v = this._state.get();\n        this._state.set({\n            inlineCompletions: InlineCompletionsState.createEmpty(),\n            suggestWidgetInlineCompletions: InlineCompletionsState.createEmpty()\n        }, tx);\n        v.inlineCompletions.dispose();\n        v.suggestWidgetInlineCompletions.dispose();\n    }\n    seedInlineCompletionsWithSuggestWidget() {\n        const inlineCompletions = this.inlineCompletions.get();\n        const suggestWidgetInlineCompletions = this.suggestWidgetInlineCompletions.get();\n        if (!suggestWidgetInlineCompletions) {\n            return;\n        }\n        transaction(tx => {\n            /** @description Seed inline completions with (newer) suggest widget inline completions */\n            if (!inlineCompletions || (suggestWidgetInlineCompletions.request?.versionId ?? -1) > (inlineCompletions.request?.versionId ?? -1)) {\n                inlineCompletions?.dispose();\n                const s = this._state.get();\n                this._state.set({\n                    inlineCompletions: suggestWidgetInlineCompletions.clone(),\n                    suggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n                }, tx);\n                s.inlineCompletions.dispose();\n                s.suggestWidgetInlineCompletions.dispose();\n            }\n            this.clearSuggestWidgetInlineCompletions(tx);\n        });\n    }\n    sendInlineCompletionsRequestTelemetry(requestResponseInfo) {\n        if (!this._sendRequestData.get() && !this._contextKeyService.getContextKeyValue('isRunningUnificationExperiment')) {\n            return;\n        }\n        if (requestResponseInfo.requestUuid === undefined || requestResponseInfo.hasProducedSuggestion) {\n            return;\n        }\n        if (!isCompletionsEnabled(this._completionsEnabled, this._textModel.getLanguageId())) {\n            return;\n        }\n        if (!requestResponseInfo.providers.some(p => isCopilotLikeExtension(p.providerId?.extensionId))) {\n            return;\n        }\n        const emptyEndOfLifeEvent = {\n            opportunityId: requestResponseInfo.requestUuid,\n            noSuggestionReason: requestResponseInfo.noSuggestionReason ?? 'unknown',\n            extensionId: 'vscode-core',\n            extensionVersion: '0.0.0',\n            groupId: 'empty',\n            shown: false,\n            editorType: requestResponseInfo.requestInfo.editorType,\n            requestReason: requestResponseInfo.requestInfo.reason,\n            typingInterval: requestResponseInfo.requestInfo.typingInterval,\n            typingIntervalCharacterCount: requestResponseInfo.requestInfo.typingIntervalCharacterCount,\n            languageId: requestResponseInfo.requestInfo.languageId,\n            selectedSuggestionInfo: !!requestResponseInfo.context.selectedSuggestionInfo,\n            availableProviders: requestResponseInfo.providers.map(p => p.providerId?.toString()).filter(isDefined).join(','),\n            ...forwardToChannelIf(requestResponseInfo.providers.some(p => isCopilotLikeExtension(p.providerId?.extensionId))),\n            timeUntilProviderRequest: undefined,\n            timeUntilProviderResponse: undefined,\n            viewKind: undefined,\n            preceeded: undefined,\n            superseded: undefined,\n            reason: undefined,\n            correlationId: undefined,\n            shownDuration: undefined,\n            shownDurationUncollapsed: undefined,\n            timeUntilShown: undefined,\n            partiallyAccepted: undefined,\n            partiallyAcceptedCountSinceOriginal: undefined,\n            partiallyAcceptedRatioSinceOriginal: undefined,\n            partiallyAcceptedCharactersSinceOriginal: undefined,\n            cursorColumnDistance: undefined,\n            cursorLineDistance: undefined,\n            lineCountOriginal: undefined,\n            lineCountModified: undefined,\n            characterCountOriginal: undefined,\n            characterCountModified: undefined,\n            disjointReplacements: undefined,\n            sameShapeReplacements: undefined,\n            notShownReason: undefined,\n        };\n        const dataChannel = this._instantiationService.createInstance(DataChannelForwardingTelemetryService);\n        sendInlineCompletionsEndOfLifeTelemetry(dataChannel, emptyEndOfLifeEvent);\n    }\n    clearSuggestWidgetInlineCompletions(tx) {\n        if (this._updateOperation.value?.request.context.selectedSuggestionInfo) {\n            this._updateOperation.clear();\n        }\n    }\n    cancelUpdate() {\n        this._updateOperation.clear();\n    }\n};\nInlineCompletionsSource = InlineCompletionsSource_1 = __decorate([\n    __param(4, ILanguageConfigurationService),\n    __param(5, ILogService),\n    __param(6, IConfigurationService),\n    __param(7, IInstantiationService),\n    __param(8, IContextKeyService)\n], InlineCompletionsSource);\nclass UpdateRequest {\n    constructor(position, context, versionId, providers) {\n        this.position = position;\n        this.context = context;\n        this.versionId = versionId;\n        this.providers = providers;\n    }\n    satisfies(other) {\n        return this.position.equals(other.position)\n            && equalsIfDefined(this.context.selectedSuggestionInfo, other.context.selectedSuggestionInfo, itemEquals())\n            && (other.context.triggerKind === InlineCompletionTriggerKind.Automatic\n                || this.context.triggerKind === InlineCompletionTriggerKind.Explicit)\n            && this.versionId === other.versionId\n            && isSubset(other.providers, this.providers);\n    }\n}\nclass RequestResponseData {\n    constructor(context, requestInfo, providers) {\n        this.context = context;\n        this.requestInfo = requestInfo;\n        this.providers = providers;\n        this.hasProducedSuggestion = false;\n    }\n    setRequestUuid(uuid) {\n        this.requestUuid = uuid;\n    }\n    setNoSuggestionReasonIfNotSet(type) {\n        this.noSuggestionReason ??= type;\n    }\n    setHasProducedSuggestion() {\n        this.hasProducedSuggestion = true;\n    }\n}\nfunction isSubset(set1, set2) {\n    return [...set1].every(item => set2.has(item));\n}\nfunction isCompletionsEnabled(completionsEnablementObject, modeId = '*') {\n    if (completionsEnablementObject === undefined) {\n        return false; // default to disabled if setting is not available\n    }\n    if (typeof completionsEnablementObject[modeId] !== 'undefined') {\n        return Boolean(completionsEnablementObject[modeId]); // go with setting if explicitly defined\n    }\n    return Boolean(completionsEnablementObject['*']); // fallback to global setting otherwise\n}\nclass UpdateOperation {\n    constructor(request, cancellationTokenSource, promise) {\n        this.request = request;\n        this.cancellationTokenSource = cancellationTokenSource;\n        this.promise = promise;\n    }\n    dispose() {\n        this.cancellationTokenSource.cancel();\n    }\n}\nclass InlineCompletionsState extends Disposable {\n    static createEmpty() {\n        return new InlineCompletionsState([], undefined);\n    }\n    constructor(inlineCompletions, request) {\n        for (const inlineCompletion of inlineCompletions) {\n            inlineCompletion.addRef();\n        }\n        super();\n        this.inlineCompletions = inlineCompletions;\n        this.request = request;\n        this._register({\n            dispose: () => {\n                for (const inlineCompletion of this.inlineCompletions) {\n                    inlineCompletion.removeRef();\n                }\n            }\n        });\n    }\n    _findById(id) {\n        return this.inlineCompletions.find(i => i.identity === id);\n    }\n    _findByHash(hash) {\n        return this.inlineCompletions.find(i => i.hash === hash);\n    }\n    /**\n     * Applies the edit on the state.\n    */\n    createStateWithAppliedEdit(edit, textModel) {\n        const newInlineCompletions = this.inlineCompletions.map(i => i.withEdit(edit, textModel)).filter(isDefined);\n        return new InlineCompletionsState(newInlineCompletions, this.request);\n    }\n    createStateWithAppliedResults(updatedSuggestions, request, textModel, cursorPosition, itemIdToPreserveAtTop) {\n        let itemToPreserve = undefined;\n        if (itemIdToPreserveAtTop) {\n            const itemToPreserveCandidate = this._findById(itemIdToPreserveAtTop);\n            if (itemToPreserveCandidate && itemToPreserveCandidate.canBeReused(textModel, request.position)) {\n                itemToPreserve = itemToPreserveCandidate;\n                const updatedItemToPreserve = updatedSuggestions.find(i => i.hash === itemToPreserveCandidate.hash);\n                if (updatedItemToPreserve) {\n                    updatedSuggestions = moveToFront(updatedItemToPreserve, updatedSuggestions);\n                }\n                else {\n                    updatedSuggestions = [itemToPreserveCandidate, ...updatedSuggestions];\n                }\n            }\n        }\n        const preferInlineCompletions = itemToPreserve\n            // itemToPreserve has precedence\n            ? !itemToPreserve.isInlineEdit\n            // Otherwise: prefer inline completion if there is a visible one\n            : updatedSuggestions.some(i => !i.isInlineEdit && i.isVisible(textModel, cursorPosition));\n        let updatedItems = [];\n        for (const i of updatedSuggestions) {\n            const oldItem = this._findByHash(i.hash);\n            let item;\n            if (oldItem && oldItem !== i) {\n                item = i.withIdentity(oldItem.identity);\n                i.setIsPreceeded(oldItem);\n                oldItem.setEndOfLifeReason({ kind: InlineCompletionEndOfLifeReasonKind.Ignored, userTypingDisagreed: false, supersededBy: i.getSourceCompletion() });\n            }\n            else {\n                item = i;\n            }\n            if (preferInlineCompletions !== item.isInlineEdit) {\n                updatedItems.push(item);\n            }\n        }\n        updatedItems.sort(compareBy(i => i.showInlineEditMenu, booleanComparator));\n        updatedItems = distinctByKey(updatedItems, i => i.semanticId);\n        return new InlineCompletionsState(updatedItems, request);\n    }\n    clone() {\n        return new InlineCompletionsState(this.inlineCompletions, this.request);\n    }\n}\n/** Keeps the first item in case of duplicates. */\nfunction distinctByKey(items, key) {\n    const seen = new Set();\n    return items.filter(item => {\n        const k = key(item);\n        if (seen.has(k)) {\n            return false;\n        }\n        seen.add(k);\n        return true;\n    });\n}\nfunction moveToFront(item, items) {\n    const index = items.indexOf(item);\n    if (index > -1) {\n        return [item, ...items.slice(0, index), ...items.slice(index + 1)];\n    }\n    return items;\n}\n\nexport { InlineCompletionsSource };\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 *--------------------------------------------------------------------------------------------*/\nclass InlineEdit {\n    constructor(edit, commands, inlineCompletion) {\n        this.edit = edit;\n        this.commands = commands;\n        this.inlineCompletion = inlineCompletion;\n    }\n    equals(other) {\n        return this.edit.equals(other.edit)\n            && this.inlineCompletion === other.inlineCompletion;\n    }\n}\n\nexport { InlineEdit };\n","import { TimeoutTimer } from '../../../base/common/async.js';\nimport { BugIndicatingError } from '../../../base/common/errors.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { localize, localize2 } from '../../../nls.js';\nimport { Action2 } from '../../../platform/actions/common/actions.js';\nimport { RawContextKey, IContextKeyService, ContextKeyExpr } from '../../../platform/contextkey/common/contextkey.js';\nimport { registerSingleton } from '../../../platform/instantiation/common/extensions.js';\nimport { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\nimport { IQuickInputService } from '../../../platform/quickinput/common/quickInput.js';\nimport { IStorageService } from '../../../platform/storage/common/storage.js';\nimport { ITelemetryService } from '../../../platform/telemetry/common/telemetry.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst IInlineCompletionsService = createDecorator('IInlineCompletionsService');\nconst InlineCompletionsSnoozing = new RawContextKey('inlineCompletions.snoozed', false, localize(79, \"Whether inline completions are currently snoozed\"));\nlet InlineCompletionsService = class InlineCompletionsService extends Disposable {\n    get snoozeTimeLeft() {\n        if (this._snoozeTimeEnd === undefined) {\n            return 0;\n        }\n        return Math.max(0, this._snoozeTimeEnd - Date.now());\n    }\n    constructor(_contextKeyService, _telemetryService) {\n        super();\n        this._contextKeyService = _contextKeyService;\n        this._telemetryService = _telemetryService;\n        this._onDidChangeIsSnoozing = this._register(new Emitter());\n        this.onDidChangeIsSnoozing = this._onDidChangeIsSnoozing.event; // 5 minutes\n        this._snoozeTimeEnd = undefined;\n        this._recentCompletionIds = [];\n        this._timer = this._register(new TimeoutTimer());\n        const inlineCompletionsSnoozing = InlineCompletionsSnoozing.bindTo(this._contextKeyService);\n        this._register(this.onDidChangeIsSnoozing(() => inlineCompletionsSnoozing.set(this.isSnoozing())));\n    }\n    setSnoozeDuration(durationMs) {\n        if (durationMs < 0) {\n            throw new BugIndicatingError(`Invalid snooze duration: ${durationMs}. Duration must be non-negative.`);\n        }\n        if (durationMs === 0) {\n            this.cancelSnooze();\n            return;\n        }\n        const wasSnoozing = this.isSnoozing();\n        const timeLeft = this.snoozeTimeLeft;\n        this._snoozeTimeEnd = Date.now() + durationMs;\n        if (!wasSnoozing) {\n            this._onDidChangeIsSnoozing.fire(true);\n        }\n        this._timer.cancelAndSet(() => {\n            if (!this.isSnoozing()) {\n                this._onDidChangeIsSnoozing.fire(false);\n            }\n            else {\n                throw new BugIndicatingError('Snooze timer did not fire as expected');\n            }\n        }, this.snoozeTimeLeft + 1);\n        this._reportSnooze(durationMs - timeLeft, durationMs);\n    }\n    isSnoozing() {\n        return this.snoozeTimeLeft > 0;\n    }\n    cancelSnooze() {\n        if (this.isSnoozing()) {\n            this._reportSnooze(-this.snoozeTimeLeft, 0);\n            this._snoozeTimeEnd = undefined;\n            this._timer.cancel();\n            this._onDidChangeIsSnoozing.fire(false);\n        }\n    }\n    reportNewCompletion(requestUuid) {\n        this._lastCompletionId = requestUuid;\n        this._recentCompletionIds.unshift(requestUuid);\n        if (this._recentCompletionIds.length > 5) {\n            this._recentCompletionIds.pop();\n        }\n    }\n    _reportSnooze(deltaMs, totalMs) {\n        const deltaSeconds = Math.round(deltaMs / 1000);\n        const totalSeconds = Math.round(totalMs / 1000);\n        this._telemetryService.publicLog2('inlineCompletions.snooze', {\n            deltaSeconds,\n            totalSeconds,\n            lastCompletionId: this._lastCompletionId,\n            recentCompletionIds: this._recentCompletionIds,\n        });\n    }\n};\nInlineCompletionsService = __decorate([\n    __param(0, IContextKeyService),\n    __param(1, ITelemetryService)\n], InlineCompletionsService);\nregisterSingleton(IInlineCompletionsService, InlineCompletionsService, 1 /* InstantiationType.Delayed */);\nconst snoozeInlineSuggestId = 'editor.action.inlineSuggest.snooze';\nconst cancelSnoozeInlineSuggestId = 'editor.action.inlineSuggest.cancelSnooze';\nconst LAST_SNOOZE_DURATION_KEY = 'inlineCompletions.lastSnoozeDuration';\nclass SnoozeInlineCompletion extends Action2 {\n    static { this.ID = snoozeInlineSuggestId; }\n    constructor() {\n        super({\n            id: SnoozeInlineCompletion.ID,\n            title: localize2(81, \"Snooze Inline Suggestions\"),\n            precondition: ContextKeyExpr.true(),\n            f1: true,\n        });\n    }\n    async run(accessor, ...args) {\n        const quickInputService = accessor.get(IQuickInputService);\n        const inlineCompletionsService = accessor.get(IInlineCompletionsService);\n        const storageService = accessor.get(IStorageService);\n        let durationMs;\n        if (args.length > 0 && typeof args[0] === 'number') {\n            durationMs = args[0] * 60_000;\n        }\n        if (!durationMs) {\n            durationMs = await this.getDurationFromUser(quickInputService, storageService);\n        }\n        if (durationMs) {\n            inlineCompletionsService.setSnoozeDuration(durationMs);\n        }\n    }\n    async getDurationFromUser(quickInputService, storageService) {\n        const lastSelectedDuration = storageService.getNumber(LAST_SNOOZE_DURATION_KEY, 0 /* StorageScope.PROFILE */, 300_000);\n        const items = [\n            { label: '1 minute', id: '1', value: 60_000 },\n            { label: '5 minutes', id: '5', value: 300_000 },\n            { label: '10 minutes', id: '10', value: 600_000 },\n            { label: '15 minutes', id: '15', value: 900_000 },\n            { label: '30 minutes', id: '30', value: 1_800_000 },\n            { label: '60 minutes', id: '60', value: 3_600_000 }\n        ];\n        const picked = await quickInputService.pick(items, {\n            placeHolder: localize(80, \"Select snooze duration for Inline Suggestions\"),\n            activeItem: items.find(item => item.value === lastSelectedDuration),\n        });\n        if (picked) {\n            storageService.store(LAST_SNOOZE_DURATION_KEY, picked.value, 0 /* StorageScope.PROFILE */, 0 /* StorageTarget.USER */);\n            return picked.value;\n        }\n        return undefined;\n    }\n}\nclass CancelSnoozeInlineCompletion extends Action2 {\n    static { this.ID = cancelSnoozeInlineSuggestId; }\n    constructor() {\n        super({\n            id: CancelSnoozeInlineCompletion.ID,\n            title: localize2(82, \"Cancel Snooze Inline Suggestions\"),\n            precondition: InlineCompletionsSnoozing,\n            f1: true,\n        });\n    }\n    async run(accessor) {\n        accessor.get(IInlineCompletionsService).cancelSnooze();\n    }\n}\n\nexport { CancelSnoozeInlineCompletion, IInlineCompletionsService, InlineCompletionsService, SnoozeInlineCompletion };\n","import { sum } from '../../../../../base/common/arrays.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\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/**\n * Tracks typing speed as average milliseconds between keystrokes.\n * Higher values indicate slower typing.\n */\nclass TypingInterval extends Disposable {\n    // Configuration constants\n    static { this.MAX_SESSION_GAP_MS = 3_000; } // 3 seconds max gap between keystrokes in a session\n    static { this.MIN_SESSION_DURATION_MS = 1_000; } // Minimum session duration to consider\n    static { this.SESSION_HISTORY_LIMIT = 50; } // Keep last 50 sessions for calculation\n    static { this.TYPING_SPEED_WINDOW_MS = 300_000; } // 5 minutes window for speed calculation\n    static { this.MIN_CHARS_FOR_RELIABLE_SPEED = 20; } // Minimum characters needed for reliable speed calculation\n    /**\n     * Gets the current typing interval as average milliseconds between keystrokes\n     * and the number of characters involved in the computation.\n     * Higher interval values indicate slower typing.\n     * Returns { interval: 0, characterCount: 0 } if no typing data is available.\n     */\n    getTypingInterval() {\n        if (this._cacheInvalidated || this._cachedTypingIntervalResult === null) {\n            this._cachedTypingIntervalResult = this._calculateTypingInterval();\n            this._cacheInvalidated = false;\n        }\n        return this._cachedTypingIntervalResult;\n    }\n    constructor(_textModel) {\n        super();\n        this._textModel = _textModel;\n        this._typingSessions = [];\n        this._currentSession = null;\n        this._lastChangeTime = 0;\n        this._cachedTypingIntervalResult = null;\n        this._cacheInvalidated = true;\n        this._register(this._textModel.onDidChangeContent(e => this._updateTypingSpeed(e)));\n    }\n    _updateTypingSpeed(change) {\n        const now = Date.now();\n        if (!this._isUserTyping(change)) {\n            this._finalizeCurrentSession();\n            return;\n        }\n        // If too much time has passed since last change, start a new session\n        if (this._currentSession && (now - this._lastChangeTime) > TypingInterval.MAX_SESSION_GAP_MS) {\n            this._finalizeCurrentSession();\n        }\n        // Start new session if none exists\n        if (!this._currentSession) {\n            this._currentSession = {\n                startTime: now,\n                endTime: now,\n                characterCount: 0\n            };\n        }\n        // Update current session\n        this._currentSession.endTime = now;\n        this._currentSession.characterCount += this._getActualCharacterCount(change);\n        this._lastChangeTime = now;\n        this._cacheInvalidated = true;\n    }\n    _getActualCharacterCount(change) {\n        let totalChars = 0;\n        for (const c of change.changes) {\n            // Count characters added or removed (use the larger of the two)\n            totalChars += Math.max(c.text.length, c.rangeLength);\n        }\n        return totalChars;\n    }\n    _isUserTyping(change) {\n        // If no detailed reasons, assume user typing\n        if (!change.detailedReasons || change.detailedReasons.length === 0) {\n            return false;\n        }\n        // Check if any of the reasons indicate actual user typing\n        for (const reason of change.detailedReasons) {\n            if (this._isUserTypingReason(reason)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    _isUserTypingReason(reason) {\n        // Handle undo/redo - not considered user typing\n        if (reason.metadata.isUndoing || reason.metadata.isRedoing) {\n            return false;\n        }\n        // Handle different source types\n        switch (reason.metadata.source) {\n            case 'cursor': {\n                // Direct user input via cursor\n                const kind = reason.metadata.kind;\n                return kind === 'type' || kind === 'compositionType' || kind === 'compositionEnd';\n            }\n            default:\n                // All other sources (paste, suggestions, code actions, etc.) are not user typing\n                return false;\n        }\n    }\n    _finalizeCurrentSession() {\n        if (!this._currentSession) {\n            return;\n        }\n        const sessionDuration = this._currentSession.endTime - this._currentSession.startTime;\n        // Only keep sessions that meet minimum duration and have actual content\n        if (sessionDuration >= TypingInterval.MIN_SESSION_DURATION_MS && this._currentSession.characterCount > 0) {\n            this._typingSessions.push(this._currentSession);\n            // Limit session history\n            if (this._typingSessions.length > TypingInterval.SESSION_HISTORY_LIMIT) {\n                this._typingSessions.shift();\n            }\n        }\n        this._currentSession = null;\n    }\n    _calculateTypingInterval() {\n        // Finalize current session for calculation\n        if (this._currentSession) {\n            const tempSession = { ...this._currentSession };\n            const sessionDuration = tempSession.endTime - tempSession.startTime;\n            if (sessionDuration >= TypingInterval.MIN_SESSION_DURATION_MS && tempSession.characterCount > 0) {\n                const allSessions = [...this._typingSessions, tempSession];\n                return this._calculateSpeedFromSessions(allSessions);\n            }\n        }\n        return this._calculateSpeedFromSessions(this._typingSessions);\n    }\n    _calculateSpeedFromSessions(sessions) {\n        if (sessions.length === 0) {\n            return { averageInterval: 0, characterCount: 0 };\n        }\n        // Sort sessions by recency (most recent first) to ensure we get the most recent sessions\n        const sortedSessions = [...sessions].sort((a, b) => b.endTime - a.endTime);\n        // First, try the standard window\n        const cutoffTime = Date.now() - TypingInterval.TYPING_SPEED_WINDOW_MS;\n        const recentSessions = sortedSessions.filter(session => session.endTime > cutoffTime);\n        const olderSessions = sortedSessions.splice(recentSessions.length);\n        let totalChars = sum(recentSessions.map(session => session.characterCount));\n        // If we don't have enough characters in the standard window, expand to include older sessions\n        for (let i = 0; i < olderSessions.length && totalChars < TypingInterval.MIN_CHARS_FOR_RELIABLE_SPEED; i++) {\n            recentSessions.push(olderSessions[i]);\n            totalChars += olderSessions[i].characterCount;\n        }\n        const totalTime = sum(recentSessions.map(session => session.endTime - session.startTime));\n        if (totalTime === 0 || totalChars <= 1) {\n            return { averageInterval: 0, characterCount: totalChars };\n        }\n        // Calculate average milliseconds between keystrokes\n        const keystrokeIntervals = Math.max(1, totalChars - 1);\n        const avgMsBetweenKeystrokes = totalTime / keystrokeIntervals;\n        return {\n            averageInterval: Math.round(avgMsBetweenKeystrokes),\n            characterCount: totalChars\n        };\n    }\n    dispose() {\n        this._finalizeCurrentSession();\n        super.dispose();\n    }\n}\n\nexport { TypingInterval };\n","import { mapFindFirst } from '../../../../../base/common/arraysFind.js';\nimport { itemsEquals } from '../../../../../base/common/equals.js';\nimport { BugIndicatingError, onUnexpectedExternalError } from '../../../../../base/common/errors.js';\nimport { Emitter } from '../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { firstNonWhitespaceIndex } from '../../../../../base/common/strings.js';\nimport { isDefined } from '../../../../../base/common/types.js';\nimport { IAccessibilityService } from '../../../../../platform/accessibility/common/accessibility.js';\nimport { ICommandService } from '../../../../../platform/commands/common/commands.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { observableCodeEditor } from '../../../../browser/observableCodeEditor.js';\nimport { CursorColumns } from '../../../../common/core/cursorColumns.js';\nimport { LineRange } from '../../../../common/core/ranges/lineRange.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { Selection } from '../../../../common/core/selection.js';\nimport { TextEdit, TextReplacement } from '../../../../common/core/edits/textEdit.js';\nimport { TextLength } from '../../../../common/core/text/textLength.js';\nimport { InlineCompletionTriggerKind, InlineCompletionEndOfLifeReasonKind } from '../../../../common/languages.js';\nimport { ILanguageConfigurationService } from '../../../../common/languages/languageConfigurationRegistry.js';\nimport { TextModelText } from '../../../../common/model/textModelText.js';\nimport { ILanguageFeaturesService } from '../../../../common/services/languageFeatures.js';\nimport { SnippetController2 } from '../../../snippet/browser/snippetController2.js';\nimport { removeTextReplacementCommonSuffixPrefix, getEndPositionsAfterApplying } from '../utils.js';\nimport { ObservableAnimatedValue, AnimatedValue, easeOutCubic } from './animation.js';\nimport { computeGhostText } from './computeGhostText.js';\nimport { GhostText, ghostTextsOrReplacementsEqual, ghostTextOrReplacementEquals } from './ghostText.js';\nimport { InlineCompletionsSource } from './inlineCompletionsSource.js';\nimport { InlineEdit } from './inlineEdit.js';\nimport { InlineCompletionEditorType } from './provideInlineCompletions.js';\nimport { singleTextRemoveCommonPrefix, singleTextEditAugments } from './singleTextEditHelpers.js';\nimport { EditSources } from '../../../../common/textModelEditSource.js';\nimport { ICodeEditorService } from '../../../../browser/services/codeEditorService.js';\nimport { IInlineCompletionsService } from '../../../../browser/services/inlineCompletionsService.js';\nimport { TypingInterval } from './typingSpeed.js';\nimport { StringReplacement } from '../../../../common/core/edits/stringEdit.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { URI } from '../../../../../base/common/uri.js';\nimport { derived, derivedHandleChanges, derivedOpts } from '../../../../../base/common/observableInternal/observables/derived.js';\nimport { recomputeInitiallyAndOnChange, mapObservableArrayCached } from '../../../../../base/common/observableInternal/utils/utils.js';\nimport { observableValue } from '../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { observableSignal } from '../../../../../base/common/observableInternal/observables/observableSignal.js';\nimport { constObservable } from '../../../../../base/common/observableInternal/observables/constObservable.js';\nimport { autorun } from '../../../../../base/common/observableInternal/reactions/autorun.js';\nimport { observableFromEvent } from '../../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { subtransaction, transaction } from '../../../../../base/common/observableInternal/transaction.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet InlineCompletionsModel = class InlineCompletionsModel extends Disposable {\n    get isAcceptingPartially() { return this._isAcceptingPartially; }\n    constructor(textModel, _selectedSuggestItem, _textModelVersionId, _positions, _debounceValue, _enabled, _editor, _instantiationService, _commandService, _languageConfigurationService, _accessibilityService, _languageFeaturesService, _codeEditorService, _inlineCompletionsService) {\n        super();\n        this.textModel = textModel;\n        this._selectedSuggestItem = _selectedSuggestItem;\n        this._textModelVersionId = _textModelVersionId;\n        this._positions = _positions;\n        this._debounceValue = _debounceValue;\n        this._enabled = _enabled;\n        this._editor = _editor;\n        this._instantiationService = _instantiationService;\n        this._commandService = _commandService;\n        this._languageConfigurationService = _languageConfigurationService;\n        this._accessibilityService = _accessibilityService;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._codeEditorService = _codeEditorService;\n        this._inlineCompletionsService = _inlineCompletionsService;\n        this._isActive = observableValue(this, false);\n        this._onlyRequestInlineEditsSignal = observableSignal(this);\n        this._forceUpdateExplicitlySignal = observableSignal(this);\n        this._noDelaySignal = observableSignal(this);\n        this._fetchSpecificProviderSignal = observableSignal(this);\n        // We use a semantic id to keep the same inline completion selected even if the provider reorders the completions.\n        this._selectedInlineCompletionId = observableValue(this, undefined);\n        this.primaryPosition = derived(this, reader => this._positions.read(reader)[0] ?? new Position(1, 1));\n        this.allPositions = derived(this, reader => this._positions.read(reader));\n        this._isAcceptingPartially = false;\n        this._appearedInsideViewport = derived(this, reader => {\n            const state = this.state.read(reader);\n            if (!state || !state.inlineCompletion) {\n                return false;\n            }\n            return isSuggestionInViewport(this._editor, state.inlineCompletion);\n        });\n        this._onDidAccept = new Emitter();\n        this.onDidAccept = this._onDidAccept.event;\n        this._lastShownInlineCompletionInfo = undefined;\n        this._lastAcceptedInlineCompletionInfo = undefined;\n        this._didUndoInlineEdits = derivedHandleChanges({\n            owner: this,\n            changeTracker: {\n                createChangeSummary: () => ({ didUndo: false }),\n                handleChange: (ctx, changeSummary) => {\n                    changeSummary.didUndo = ctx.didChange(this._textModelVersionId) && !!ctx.change?.isUndoing;\n                    return true;\n                }\n            }\n        }, (reader, changeSummary) => {\n            const versionId = this._textModelVersionId.read(reader);\n            if (versionId !== null\n                && this._lastAcceptedInlineCompletionInfo\n                && this._lastAcceptedInlineCompletionInfo.textModelVersionIdAfter === versionId - 1\n                && this._lastAcceptedInlineCompletionInfo.inlineCompletion.isInlineEdit\n                && changeSummary.didUndo) {\n                this._lastAcceptedInlineCompletionInfo = undefined;\n                return true;\n            }\n            return false;\n        });\n        this._preserveCurrentCompletionReasons = new Set([\n            VersionIdChangeReason.Redo,\n            VersionIdChangeReason.Undo,\n            VersionIdChangeReason.AcceptWord,\n        ]);\n        this.dontRefetchSignal = observableSignal(this);\n        this._fetchInlineCompletionsPromise = derivedHandleChanges({\n            owner: this,\n            changeTracker: {\n                createChangeSummary: () => ({\n                    dontRefetch: false,\n                    preserveCurrentCompletion: false,\n                    inlineCompletionTriggerKind: InlineCompletionTriggerKind.Automatic,\n                    onlyRequestInlineEdits: false,\n                    shouldDebounce: true,\n                    provider: undefined,\n                    textChange: false,\n                    changeReason: '',\n                }),\n                handleChange: (ctx, changeSummary) => {\n                    /** @description fetch inline completions */\n                    if (ctx.didChange(this._textModelVersionId)) {\n                        if (this._preserveCurrentCompletionReasons.has(this._getReason(ctx.change))) {\n                            changeSummary.preserveCurrentCompletion = true;\n                        }\n                        const detailedReasons = ctx.change?.detailedReasons ?? [];\n                        changeSummary.changeReason = detailedReasons.length > 0 ? detailedReasons[0].getType() : '';\n                        changeSummary.textChange = true;\n                    }\n                    else if (ctx.didChange(this._forceUpdateExplicitlySignal)) {\n                        changeSummary.preserveCurrentCompletion = true;\n                        changeSummary.inlineCompletionTriggerKind = InlineCompletionTriggerKind.Explicit;\n                    }\n                    else if (ctx.didChange(this.dontRefetchSignal)) {\n                        changeSummary.dontRefetch = true;\n                    }\n                    else if (ctx.didChange(this._onlyRequestInlineEditsSignal)) {\n                        changeSummary.onlyRequestInlineEdits = true;\n                    }\n                    else if (ctx.didChange(this._fetchSpecificProviderSignal)) {\n                        changeSummary.provider = ctx.change;\n                    }\n                    return true;\n                },\n            },\n        }, (reader, changeSummary) => {\n            this._source.clearOperationOnTextModelChange.read(reader); // Make sure the clear operation runs before the fetch operation\n            this._noDelaySignal.read(reader);\n            this.dontRefetchSignal.read(reader);\n            this._onlyRequestInlineEditsSignal.read(reader);\n            this._forceUpdateExplicitlySignal.read(reader);\n            this._fetchSpecificProviderSignal.read(reader);\n            const shouldUpdate = ((this._enabled.read(reader) && this._selectedSuggestItem.read(reader)) || this._isActive.read(reader))\n                && (!this._inlineCompletionsService.isSnoozing() || changeSummary.inlineCompletionTriggerKind === InlineCompletionTriggerKind.Explicit);\n            if (!shouldUpdate) {\n                this._source.cancelUpdate();\n                return undefined;\n            }\n            this._textModelVersionId.read(reader); // Refetch on text change\n            const suggestWidgetInlineCompletions = this._source.suggestWidgetInlineCompletions.read(undefined);\n            let suggestItem = this._selectedSuggestItem.read(reader);\n            if (this._shouldShowOnSuggestConflict.read(undefined)) {\n                suggestItem = undefined;\n            }\n            if (suggestWidgetInlineCompletions && !suggestItem) {\n                this._source.seedInlineCompletionsWithSuggestWidget();\n            }\n            if (changeSummary.dontRefetch) {\n                return Promise.resolve(true);\n            }\n            if (this._didUndoInlineEdits.read(reader) && changeSummary.inlineCompletionTriggerKind !== InlineCompletionTriggerKind.Explicit) {\n                transaction(tx => {\n                    this._source.clear(tx);\n                });\n                return undefined;\n            }\n            let reason = '';\n            if (changeSummary.provider) {\n                reason += 'providerOnDidChange';\n            }\n            else if (changeSummary.inlineCompletionTriggerKind === InlineCompletionTriggerKind.Explicit) {\n                reason += 'explicit';\n            }\n            if (changeSummary.changeReason) {\n                reason += reason.length > 0 ? `:${changeSummary.changeReason}` : changeSummary.changeReason;\n            }\n            const typingInterval = this._typing.getTypingInterval();\n            const requestInfo = {\n                editorType: this.editorType,\n                startTime: Date.now(),\n                languageId: this.textModel.getLanguageId(),\n                reason,\n                typingInterval: typingInterval.averageInterval,\n                typingIntervalCharacterCount: typingInterval.characterCount,\n                availableProviders: [],\n            };\n            let context = {\n                triggerKind: changeSummary.inlineCompletionTriggerKind,\n                selectedSuggestionInfo: suggestItem?.toSelectedSuggestionInfo(),\n                includeInlineCompletions: !changeSummary.onlyRequestInlineEdits,\n                includeInlineEdits: this._inlineEditsEnabled.read(reader),\n                requestIssuedDateTime: requestInfo.startTime,\n                earliestShownDateTime: requestInfo.startTime + (changeSummary.inlineCompletionTriggerKind === InlineCompletionTriggerKind.Explicit || this.inAcceptFlow.read(undefined) ? 0 : this._minShowDelay.read(undefined)),\n            };\n            if (context.triggerKind === InlineCompletionTriggerKind.Automatic && changeSummary.textChange) {\n                if (this.textModel.getAlternativeVersionId() === this._lastShownInlineCompletionInfo?.alternateTextModelVersionId) {\n                    // When undoing back to a version where an inline edit/completion was shown,\n                    // we want to show an inline edit (or completion) again if it was originally an inline edit (or completion).\n                    context = {\n                        ...context,\n                        includeInlineCompletions: !this._lastShownInlineCompletionInfo.inlineCompletion.isInlineEdit,\n                        includeInlineEdits: this._lastShownInlineCompletionInfo.inlineCompletion.isInlineEdit,\n                    };\n                }\n            }\n            const itemToPreserveCandidate = this.selectedInlineCompletion.read(undefined) ?? this._inlineCompletionItems.read(undefined)?.inlineEdit;\n            const itemToPreserve = changeSummary.preserveCurrentCompletion || itemToPreserveCandidate?.forwardStable\n                ? itemToPreserveCandidate : undefined;\n            const userJumpedToActiveCompletion = this._jumpedToId.map(jumpedTo => !!jumpedTo && jumpedTo === this._inlineCompletionItems.read(undefined)?.inlineEdit?.semanticId);\n            const providers = changeSummary.provider\n                ? { providers: [changeSummary.provider], label: 'single:' + changeSummary.provider.providerId?.toString() }\n                : { providers: this._languageFeaturesService.inlineCompletionsProvider.all(this.textModel), label: undefined }; // TODO: should use inlineCompletionProviders\n            const availableProviders = this.getAvailableProviders(providers.providers);\n            requestInfo.availableProviders = availableProviders.map(p => p.providerId).filter(isDefined);\n            return this._source.fetch(availableProviders, providers.label, context, itemToPreserve?.identity, changeSummary.shouldDebounce, userJumpedToActiveCompletion, requestInfo);\n        });\n        this._inlineCompletionItems = derivedOpts({ owner: this }, reader => {\n            const c = this._source.inlineCompletions.read(reader);\n            if (!c) {\n                return undefined;\n            }\n            const cursorPosition = this.primaryPosition.read(reader);\n            let inlineEdit = undefined;\n            const visibleCompletions = [];\n            for (const completion of c.inlineCompletions) {\n                if (!completion.isInlineEdit) {\n                    if (completion.isVisible(this.textModel, cursorPosition)) {\n                        visibleCompletions.push(completion);\n                    }\n                }\n                else {\n                    inlineEdit = completion;\n                }\n            }\n            if (visibleCompletions.length !== 0) {\n                // Don't show the inline edit if there is a visible completion\n                inlineEdit = undefined;\n            }\n            return {\n                inlineCompletions: visibleCompletions,\n                inlineEdit,\n            };\n        });\n        this._filteredInlineCompletionItems = derivedOpts({ owner: this, equalsFn: itemsEquals() }, reader => {\n            const c = this._inlineCompletionItems.read(reader);\n            return c?.inlineCompletions ?? [];\n        });\n        this.selectedInlineCompletionIndex = derived(this, (reader) => {\n            const selectedInlineCompletionId = this._selectedInlineCompletionId.read(reader);\n            const filteredCompletions = this._filteredInlineCompletionItems.read(reader);\n            const idx = this._selectedInlineCompletionId === undefined ? -1\n                : filteredCompletions.findIndex(v => v.semanticId === selectedInlineCompletionId);\n            if (idx === -1) {\n                // Reset the selection so that the selection does not jump back when it appears again\n                this._selectedInlineCompletionId.set(undefined, undefined);\n                return 0;\n            }\n            return idx;\n        });\n        this.selectedInlineCompletion = derived(this, (reader) => {\n            const filteredCompletions = this._filteredInlineCompletionItems.read(reader);\n            const idx = this.selectedInlineCompletionIndex.read(reader);\n            return filteredCompletions[idx];\n        });\n        this.activeCommands = derivedOpts({ owner: this, equalsFn: itemsEquals() }, r => this.selectedInlineCompletion.read(r)?.source.inlineSuggestions.commands ?? []);\n        this.inlineCompletionsCount = derived(this, reader => {\n            if (this.lastTriggerKind.read(reader) === InlineCompletionTriggerKind.Explicit) {\n                return this._filteredInlineCompletionItems.read(reader).length;\n            }\n            else {\n                return undefined;\n            }\n        });\n        this._hasVisiblePeekWidgets = derived(this, reader => this._editorObs.openedPeekWidgets.read(reader) > 0);\n        this._shouldShowOnSuggestConflict = derived(this, reader => {\n            const showOnSuggestConflict = this._showOnSuggestConflict.read(reader);\n            if (showOnSuggestConflict !== 'never') {\n                const hasInlineCompletion = !!this.selectedInlineCompletion.read(reader);\n                if (hasInlineCompletion) {\n                    const item = this._selectedSuggestItem.read(reader);\n                    if (!item) {\n                        return false;\n                    }\n                    if (showOnSuggestConflict === 'whenSuggestListIsIncomplete') {\n                        return item.listIncomplete;\n                    }\n                    return true;\n                }\n            }\n            return false;\n        });\n        this.state = derivedOpts({\n            owner: this,\n            equalsFn: (a, b) => {\n                if (!a || !b) {\n                    return a === b;\n                }\n                if (a.kind === 'ghostText' && b.kind === 'ghostText') {\n                    return ghostTextsOrReplacementsEqual(a.ghostTexts, b.ghostTexts)\n                        && a.inlineCompletion === b.inlineCompletion\n                        && a.suggestItem === b.suggestItem;\n                }\n                else if (a.kind === 'inlineEdit' && b.kind === 'inlineEdit') {\n                    return a.inlineEdit.equals(b.inlineEdit);\n                }\n                return false;\n            }\n        }, (reader) => {\n            const model = this.textModel;\n            if (this._suppressInSnippetMode.read(reader) && this._isInSnippetMode.read(reader)) {\n                return undefined;\n            }\n            const item = this._inlineCompletionItems.read(reader);\n            const inlineEditResult = item?.inlineEdit;\n            if (inlineEditResult) {\n                if (this._hasVisiblePeekWidgets.read(reader)) {\n                    return undefined;\n                }\n                let edit = inlineEditResult.getSingleTextEdit();\n                edit = singleTextRemoveCommonPrefix(edit, model);\n                const cursorAtInlineEdit = this.primaryPosition.map(cursorPos => LineRange.fromRangeInclusive(inlineEditResult.targetRange).addMargin(1, 1).contains(cursorPos.lineNumber));\n                const commands = inlineEditResult.source.inlineSuggestions.commands;\n                const inlineEdit = new InlineEdit(edit, commands ?? [], inlineEditResult);\n                const edits = inlineEditResult.updatedEdit;\n                const e = edits ? TextEdit.fromStringEdit(edits, new TextModelText(this.textModel)).replacements : [edit];\n                const nextEditUri = (item.inlineEdit?.command?.id === 'vscode.open' || item.inlineEdit?.command?.id === '_workbench.open') &&\n                    // eslint-disable-next-line local/code-no-any-casts\n                    item.inlineEdit?.command.arguments?.length ? URI.from(item.inlineEdit?.command.arguments[0]) : undefined;\n                return { kind: 'inlineEdit', inlineEdit, inlineCompletion: inlineEditResult, edits: e, cursorAtInlineEdit, nextEditUri };\n            }\n            const suggestItem = this._selectedSuggestItem.read(reader);\n            if (!this._shouldShowOnSuggestConflict.read(reader) && suggestItem) {\n                const suggestCompletionEdit = singleTextRemoveCommonPrefix(suggestItem.getSingleTextEdit(), model);\n                const augmentation = this._computeAugmentation(suggestCompletionEdit, reader);\n                const isSuggestionPreviewEnabled = this._suggestPreviewEnabled.read(reader);\n                if (!isSuggestionPreviewEnabled && !augmentation) {\n                    return undefined;\n                }\n                const fullEdit = augmentation?.edit ?? suggestCompletionEdit;\n                const fullEditPreviewLength = augmentation ? augmentation.edit.text.length - suggestCompletionEdit.text.length : 0;\n                const mode = this._suggestPreviewMode.read(reader);\n                const positions = this._positions.read(reader);\n                const allPotentialEdits = [fullEdit, ...getSecondaryEdits(this.textModel, positions, fullEdit)];\n                const validEditsAndGhostTexts = allPotentialEdits\n                    .map((edit, idx) => ({ edit, ghostText: edit ? computeGhostText(edit, model, mode, positions[idx], fullEditPreviewLength) : undefined }))\n                    .filter(({ edit, ghostText }) => edit !== undefined && ghostText !== undefined);\n                const edits = validEditsAndGhostTexts.map(({ edit }) => edit);\n                const ghostTexts = validEditsAndGhostTexts.map(({ ghostText }) => ghostText);\n                const primaryGhostText = ghostTexts[0] ?? new GhostText(fullEdit.range.endLineNumber, []);\n                return { kind: 'ghostText', edits, primaryGhostText, ghostTexts, inlineCompletion: augmentation?.completion, suggestItem };\n            }\n            else {\n                if (!this._isActive.read(reader)) {\n                    return undefined;\n                }\n                const inlineCompletion = this.selectedInlineCompletion.read(reader);\n                if (!inlineCompletion) {\n                    return undefined;\n                }\n                const replacement = inlineCompletion.getSingleTextEdit();\n                const mode = this._inlineSuggestMode.read(reader);\n                const positions = this._positions.read(reader);\n                const allPotentialEdits = [replacement, ...getSecondaryEdits(this.textModel, positions, replacement)];\n                const validEditsAndGhostTexts = allPotentialEdits\n                    .map((edit, idx) => ({ edit, ghostText: edit ? computeGhostText(edit, model, mode, positions[idx], 0) : undefined }))\n                    .filter(({ edit, ghostText }) => edit !== undefined && ghostText !== undefined);\n                const edits = validEditsAndGhostTexts.map(({ edit }) => edit);\n                const ghostTexts = validEditsAndGhostTexts.map(({ ghostText }) => ghostText);\n                if (!ghostTexts[0]) {\n                    return undefined;\n                }\n                return { kind: 'ghostText', edits, primaryGhostText: ghostTexts[0], ghostTexts, inlineCompletion, suggestItem: undefined };\n            }\n        });\n        this.inlineCompletionState = derived(this, reader => {\n            const s = this.state.read(reader);\n            if (!s || s.kind !== 'ghostText') {\n                return undefined;\n            }\n            if (this._editorObs.inComposition.read(reader)) {\n                return undefined;\n            }\n            return s;\n        });\n        this.inlineEditState = derived(this, reader => {\n            const s = this.state.read(reader);\n            if (!s || s.kind !== 'inlineEdit') {\n                return undefined;\n            }\n            return s;\n        });\n        this.inlineEditAvailable = derived(this, reader => {\n            const s = this.inlineEditState.read(reader);\n            return !!s;\n        });\n        this.warning = derived(this, reader => {\n            return this.inlineCompletionState.read(reader)?.inlineCompletion?.warning;\n        });\n        this.ghostTexts = derivedOpts({ owner: this, equalsFn: ghostTextsOrReplacementsEqual }, reader => {\n            const v = this.inlineCompletionState.read(reader);\n            if (!v) {\n                return undefined;\n            }\n            return v.ghostTexts;\n        });\n        this.primaryGhostText = derivedOpts({ owner: this, equalsFn: ghostTextOrReplacementEquals }, reader => {\n            const v = this.inlineCompletionState.read(reader);\n            if (!v) {\n                return undefined;\n            }\n            return v?.primaryGhostText;\n        });\n        this.showCollapsed = derived(this, reader => {\n            const state = this.state.read(reader);\n            if (!state || state.kind !== 'inlineEdit') {\n                return false;\n            }\n            if (state.inlineCompletion.hint) {\n                return false;\n            }\n            const isCurrentModelVersion = state.inlineCompletion.updatedEditModelVersion === this._textModelVersionId.read(reader);\n            return (this._inlineEditsShowCollapsedEnabled.read(reader) || !isCurrentModelVersion)\n                && this._jumpedToId.read(reader) !== state.inlineCompletion.semanticId\n                && !this._inAcceptFlow.read(reader);\n        });\n        this._tabShouldIndent = derived(this, reader => {\n            if (this._inAcceptFlow.read(reader)) {\n                return false;\n            }\n            function isMultiLine(range) {\n                return range.startLineNumber !== range.endLineNumber;\n            }\n            function getNonIndentationRange(model, lineNumber) {\n                const columnStart = model.getLineIndentColumn(lineNumber);\n                const lastNonWsColumn = model.getLineLastNonWhitespaceColumn(lineNumber);\n                const columnEnd = Math.max(lastNonWsColumn, columnStart);\n                return new Range(lineNumber, columnStart, lineNumber, columnEnd);\n            }\n            const selections = this._editorObs.selections.read(reader);\n            return selections?.some(s => {\n                if (s.isEmpty()) {\n                    return this.textModel.getLineLength(s.startLineNumber) === 0;\n                }\n                else {\n                    return isMultiLine(s) || s.containsRange(getNonIndentationRange(this.textModel, s.startLineNumber));\n                }\n            });\n        });\n        this.tabShouldJumpToInlineEdit = derived(this, reader => {\n            if (this._tabShouldIndent.read(reader)) {\n                return false;\n            }\n            const s = this.inlineEditState.read(reader);\n            if (!s) {\n                return false;\n            }\n            if (this.showCollapsed.read(reader)) {\n                return true;\n            }\n            if (this._inAcceptFlow.read(reader) && this._appearedInsideViewport.read(reader) && !s.inlineCompletion.hint?.jumpToEdit) {\n                return false;\n            }\n            return !s.cursorAtInlineEdit.read(reader);\n        });\n        this.tabShouldAcceptInlineEdit = derived(this, reader => {\n            const s = this.inlineEditState.read(reader);\n            if (!s) {\n                return false;\n            }\n            if (this.showCollapsed.read(reader)) {\n                return false;\n            }\n            if (this._tabShouldIndent.read(reader)) {\n                return false;\n            }\n            if (this._inAcceptFlow.read(reader) && this._appearedInsideViewport.read(reader) && !s.inlineCompletion.hint?.jumpToEdit) {\n                return true;\n            }\n            if (s.inlineCompletion.targetRange.startLineNumber === this._editorObs.cursorLineNumber.read(reader)) {\n                return true;\n            }\n            if (this._jumpedToId.read(reader) === s.inlineCompletion.semanticId) {\n                return true;\n            }\n            return s.cursorAtInlineEdit.read(reader);\n        });\n        this._jumpedToId = observableValue(this, undefined);\n        this._inAcceptFlow = observableValue(this, false);\n        this.inAcceptFlow = this._inAcceptFlow;\n        this._source = this._register(this._instantiationService.createInstance(InlineCompletionsSource, this.textModel, this._textModelVersionId, this._debounceValue, this.primaryPosition));\n        this.lastTriggerKind = this._source.inlineCompletions.map(this, v => v?.request?.context.triggerKind);\n        this._editorObs = observableCodeEditor(this._editor);\n        const suggest = this._editorObs.getOption(134 /* EditorOption.suggest */);\n        this._suggestPreviewEnabled = suggest.map(v => v.preview);\n        this._suggestPreviewMode = suggest.map(v => v.previewMode);\n        const inlineSuggest = this._editorObs.getOption(71 /* EditorOption.inlineSuggest */);\n        this._inlineSuggestMode = inlineSuggest.map(v => v.mode);\n        this._suppressedInlineCompletionGroupIds = inlineSuggest.map(v => new Set(v.experimental.suppressInlineSuggestions.split(',')));\n        this._inlineEditsEnabled = inlineSuggest.map(v => !!v.edits.enabled);\n        this._inlineEditsShowCollapsedEnabled = inlineSuggest.map(s => s.edits.showCollapsed);\n        this._triggerCommandOnProviderChange = inlineSuggest.map(s => s.triggerCommandOnProviderChange);\n        this._minShowDelay = inlineSuggest.map(s => s.minShowDelay);\n        this._showOnSuggestConflict = inlineSuggest.map(s => s.experimental.showOnSuggestConflict);\n        this._suppressInSnippetMode = inlineSuggest.map(s => s.suppressInSnippetMode);\n        const snippetController = SnippetController2.get(this._editor);\n        this._isInSnippetMode = snippetController?.isInSnippetObservable ?? constObservable(false);\n        this._typing = this._register(new TypingInterval(this.textModel));\n        this._register(this._inlineCompletionsService.onDidChangeIsSnoozing((isSnoozing) => {\n            if (isSnoozing) {\n                this.stop();\n            }\n        }));\n        { // Determine editor type\n            const isNotebook = this.textModel.uri.scheme === 'vscode-notebook-cell';\n            const [diffEditor] = this._codeEditorService.listDiffEditors()\n                .filter(d => d.getOriginalEditor().getId() === this._editor.getId() ||\n                d.getModifiedEditor().getId() === this._editor.getId());\n            this.isInDiffEditor = !!diffEditor;\n            this.editorType = isNotebook ? InlineCompletionEditorType.Notebook\n                : this.isInDiffEditor ? InlineCompletionEditorType.DiffEditor\n                    : InlineCompletionEditorType.TextEditor;\n        }\n        this._register(recomputeInitiallyAndOnChange(this.state, (s) => {\n            if (s && s.inlineCompletion) {\n                this._inlineCompletionsService.reportNewCompletion(s.inlineCompletion.requestUuid);\n            }\n        }));\n        this._register(recomputeInitiallyAndOnChange(this._fetchInlineCompletionsPromise));\n        this._register(autorun(reader => {\n            this._editorObs.versionId.read(reader);\n            this._inAcceptFlow.set(false, undefined);\n        }));\n        this._register(autorun(reader => {\n            const jumpToReset = this.state.map((s, reader) => !s || s.kind === 'inlineEdit' && !s.cursorAtInlineEdit.read(reader)).read(reader);\n            if (jumpToReset) {\n                this._jumpedToId.set(undefined, undefined);\n            }\n        }));\n        const inlineEditSemanticId = this.inlineEditState.map(s => s?.inlineCompletion.semanticId);\n        this._register(autorun(reader => {\n            const id = inlineEditSemanticId.read(reader);\n            if (id) {\n                this._editor.pushUndoStop();\n                this._lastShownInlineCompletionInfo = {\n                    alternateTextModelVersionId: this.textModel.getAlternativeVersionId(),\n                    inlineCompletion: this.state.get().inlineCompletion,\n                };\n            }\n        }));\n        // TODO: should use getAvailableProviders and update on _suppressedInlineCompletionGroupIds change\n        const inlineCompletionProviders = observableFromEvent(this._languageFeaturesService.inlineCompletionsProvider.onDidChange, () => this._languageFeaturesService.inlineCompletionsProvider.all(textModel));\n        mapObservableArrayCached(this, inlineCompletionProviders, (provider, store) => {\n            if (!provider.onDidChangeInlineCompletions) {\n                return;\n            }\n            store.add(provider.onDidChangeInlineCompletions(() => {\n                if (!this._enabled.get()) {\n                    return;\n                }\n                // Only update the active editor\n                const activeEditor = this._codeEditorService.getFocusedCodeEditor() || this._codeEditorService.getActiveCodeEditor();\n                if (activeEditor !== this._editor) {\n                    return;\n                }\n                if (this._triggerCommandOnProviderChange.get()) {\n                    // TODO@hediet remove this and always do the else branch.\n                    this.trigger(undefined, { onlyFetchInlineEdits: true });\n                    return;\n                }\n                // If there is an active suggestion from a different provider, we ignore the update\n                const activeState = this.state.get();\n                if (activeState && (activeState.inlineCompletion || activeState.edits) && activeState.inlineCompletion?.source.provider !== provider) {\n                    return;\n                }\n                transaction(tx => {\n                    this._fetchSpecificProviderSignal.trigger(tx, provider);\n                    this.trigger(tx);\n                });\n            }));\n        }).recomputeInitiallyAndOnChange(this._store);\n        this._didUndoInlineEdits.recomputeInitiallyAndOnChange(this._store);\n    }\n    getIndentationInfo(reader) {\n        let startsWithIndentation = false;\n        let startsWithIndentationLessThanTabSize = true;\n        const ghostText = this?.primaryGhostText.read(reader);\n        if (!!this?._selectedSuggestItem && ghostText && ghostText.parts.length > 0) {\n            const { column, lines } = ghostText.parts[0];\n            const firstLine = lines[0].line;\n            const indentationEndColumn = this.textModel.getLineIndentColumn(ghostText.lineNumber);\n            const inIndentation = column <= indentationEndColumn;\n            if (inIndentation) {\n                let firstNonWsIdx = firstNonWhitespaceIndex(firstLine);\n                if (firstNonWsIdx === -1) {\n                    firstNonWsIdx = firstLine.length - 1;\n                }\n                startsWithIndentation = firstNonWsIdx > 0;\n                const tabSize = this.textModel.getOptions().tabSize;\n                const visibleColumnIndentation = CursorColumns.visibleColumnFromColumn(firstLine, firstNonWsIdx + 1, tabSize);\n                startsWithIndentationLessThanTabSize = visibleColumnIndentation < tabSize;\n            }\n        }\n        return {\n            startsWithIndentation,\n            startsWithIndentationLessThanTabSize,\n        };\n    }\n    _getReason(e) {\n        if (e?.isUndoing) {\n            return VersionIdChangeReason.Undo;\n        }\n        if (e?.isRedoing) {\n            return VersionIdChangeReason.Redo;\n        }\n        if (this.isAcceptingPartially) {\n            return VersionIdChangeReason.AcceptWord;\n        }\n        return VersionIdChangeReason.Other;\n    }\n    // TODO: This is not an ideal implementation of excludesGroupIds, however as this is currently still behind proposed API\n    // and due to the time constraints, we are using a simplified approach\n    getAvailableProviders(providers) {\n        const suppressedProviderGroupIds = this._suppressedInlineCompletionGroupIds.get();\n        const unsuppressedProviders = providers.filter(provider => !(provider.groupId && suppressedProviderGroupIds.has(provider.groupId)));\n        const excludedGroupIds = new Set();\n        for (const provider of unsuppressedProviders) {\n            provider.excludesGroupIds?.forEach(p => excludedGroupIds.add(p));\n        }\n        const availableProviders = [];\n        for (const provider of unsuppressedProviders) {\n            if (provider.groupId && excludedGroupIds.has(provider.groupId)) {\n                continue;\n            }\n            availableProviders.push(provider);\n        }\n        return availableProviders;\n    }\n    async trigger(tx, options = {}) {\n        subtransaction(tx, tx => {\n            if (options.onlyFetchInlineEdits) {\n                this._onlyRequestInlineEditsSignal.trigger(tx);\n            }\n            if (options.noDelay) {\n                this._noDelaySignal.trigger(tx);\n            }\n            this._isActive.set(true, tx);\n            if (options.explicit) {\n                this._inAcceptFlow.set(true, tx);\n                this._forceUpdateExplicitlySignal.trigger(tx);\n            }\n            if (options.provider) {\n                this._fetchSpecificProviderSignal.trigger(tx, options.provider);\n            }\n        });\n        await this._fetchInlineCompletionsPromise.get();\n    }\n    async triggerExplicitly(tx, onlyFetchInlineEdits = false) {\n        return this.trigger(tx, { onlyFetchInlineEdits, explicit: true });\n    }\n    stop(stopReason = 'automatic', tx) {\n        subtransaction(tx, tx => {\n            if (stopReason === 'explicitCancel') {\n                const inlineCompletion = this.state.get()?.inlineCompletion;\n                if (inlineCompletion) {\n                    inlineCompletion.reportEndOfLife({ kind: InlineCompletionEndOfLifeReasonKind.Rejected });\n                }\n            }\n            this._isActive.set(false, tx);\n            this._source.clear(tx);\n        });\n    }\n    _computeAugmentation(suggestCompletion, reader) {\n        const model = this.textModel;\n        const suggestWidgetInlineCompletions = this._source.suggestWidgetInlineCompletions.read(reader);\n        const candidateInlineCompletions = suggestWidgetInlineCompletions\n            ? suggestWidgetInlineCompletions.inlineCompletions.filter(c => !c.isInlineEdit)\n            : [this.selectedInlineCompletion.read(reader)].filter(isDefined);\n        const augmentedCompletion = mapFindFirst(candidateInlineCompletions, completion => {\n            let r = completion.getSingleTextEdit();\n            r = singleTextRemoveCommonPrefix(r, model, Range.fromPositions(r.range.getStartPosition(), suggestCompletion.range.getEndPosition()));\n            return singleTextEditAugments(r, suggestCompletion) ? { completion, edit: r } : undefined;\n        });\n        return augmentedCompletion;\n    }\n    async _deltaSelectedInlineCompletionIndex(delta) {\n        await this.triggerExplicitly();\n        const completions = this._filteredInlineCompletionItems.get() || [];\n        if (completions.length > 0) {\n            const newIdx = (this.selectedInlineCompletionIndex.get() + delta + completions.length) % completions.length;\n            this._selectedInlineCompletionId.set(completions[newIdx].semanticId, undefined);\n        }\n        else {\n            this._selectedInlineCompletionId.set(undefined, undefined);\n        }\n    }\n    async next() { await this._deltaSelectedInlineCompletionIndex(1); }\n    async previous() { await this._deltaSelectedInlineCompletionIndex(-1); }\n    _getMetadata(completion, languageId, type = undefined) {\n        if (type) {\n            return EditSources.inlineCompletionPartialAccept({\n                nes: completion.isInlineEdit,\n                requestUuid: completion.requestUuid,\n                providerId: completion.source.provider.providerId,\n                languageId,\n                type,\n            });\n        }\n        else {\n            return EditSources.inlineCompletionAccept({\n                nes: completion.isInlineEdit,\n                requestUuid: completion.requestUuid,\n                providerId: completion.source.provider.providerId,\n                languageId\n            });\n        }\n    }\n    async accept(editor = this._editor) {\n        if (editor.getModel() !== this.textModel) {\n            throw new BugIndicatingError();\n        }\n        let completion;\n        let isNextEditUri = false;\n        const state = this.state.get();\n        if (state?.kind === 'ghostText') {\n            if (!state || state.primaryGhostText.isEmpty() || !state.inlineCompletion) {\n                return;\n            }\n            completion = state.inlineCompletion;\n        }\n        else if (state?.kind === 'inlineEdit') {\n            completion = state.inlineCompletion;\n            isNextEditUri = !!state.nextEditUri;\n        }\n        else {\n            return;\n        }\n        // Make sure the completion list will not be disposed before the text change is sent.\n        completion.addRef();\n        try {\n            editor.pushUndoStop();\n            if (isNextEditUri) {\n                // Do nothing\n            }\n            else if (completion.snippetInfo) {\n                const mainEdit = TextReplacement.delete(completion.editRange);\n                const additionalEdits = completion.additionalTextEdits.map(e => new TextReplacement(Range.lift(e.range), e.text ?? ''));\n                const edit = TextEdit.fromParallelReplacementsUnsorted([mainEdit, ...additionalEdits]);\n                editor.edit(edit, this._getMetadata(completion, this.textModel.getLanguageId()));\n                editor.setPosition(completion.snippetInfo.range.getStartPosition(), 'inlineCompletionAccept');\n                SnippetController2.get(editor)?.insert(completion.snippetInfo.snippet, { undoStopBefore: false });\n            }\n            else {\n                const edits = state.edits;\n                // The cursor should move to the end of the edit, not the end of the range provided by the extension\n                // Inline Edit diffs (human readable) the suggestion from the extension so it already removes common suffix/prefix\n                // Inline Completions does diff the suggestion so it may contain common suffix\n                let minimalEdits = edits;\n                if (state.kind === 'ghostText') {\n                    minimalEdits = removeTextReplacementCommonSuffixPrefix(edits, this.textModel);\n                }\n                const selections = getEndPositionsAfterApplying(minimalEdits).map(p => Selection.fromPositions(p));\n                const additionalEdits = completion.additionalTextEdits.map(e => new TextReplacement(Range.lift(e.range), e.text ?? ''));\n                const edit = TextEdit.fromParallelReplacementsUnsorted([...edits, ...additionalEdits]);\n                editor.edit(edit, this._getMetadata(completion, this.textModel.getLanguageId()));\n                if (completion.hint === undefined) {\n                    // do not move the cursor when the completion is displayed in a different location\n                    editor.setSelections(state.kind === 'inlineEdit' ? selections.slice(-1) : selections, 'inlineCompletionAccept');\n                }\n                if (state.kind === 'inlineEdit' && !this._accessibilityService.isMotionReduced()) {\n                    const editRanges = edit.getNewRanges();\n                    const dec = this._store.add(new FadeoutDecoration(editor, editRanges, () => {\n                        this._store.delete(dec);\n                    }));\n                }\n            }\n            this._onDidAccept.fire();\n            // Reset before invoking the command, as the command might cause a follow up trigger (which we don't want to reset).\n            this.stop();\n            if (completion.command) {\n                await this._commandService\n                    .executeCommand(completion.command.id, ...(completion.command.arguments || []))\n                    .then(undefined, onUnexpectedExternalError);\n            }\n            completion.reportEndOfLife({ kind: InlineCompletionEndOfLifeReasonKind.Accepted });\n        }\n        finally {\n            completion.removeRef();\n            this._inAcceptFlow.set(true, undefined);\n            this._lastAcceptedInlineCompletionInfo = { textModelVersionIdAfter: this.textModel.getVersionId(), inlineCompletion: completion };\n        }\n    }\n    async acceptNextWord() {\n        await this._acceptNext(this._editor, 'word', (pos, text) => {\n            const langId = this.textModel.getLanguageIdAtPosition(pos.lineNumber, pos.column);\n            const config = this._languageConfigurationService.getLanguageConfiguration(langId);\n            const wordRegExp = new RegExp(config.wordDefinition.source, config.wordDefinition.flags.replace('g', ''));\n            const m1 = text.match(wordRegExp);\n            let acceptUntilIndexExclusive = 0;\n            if (m1 && m1.index !== undefined) {\n                if (m1.index === 0) {\n                    acceptUntilIndexExclusive = m1[0].length;\n                }\n                else {\n                    acceptUntilIndexExclusive = m1.index;\n                }\n            }\n            else {\n                acceptUntilIndexExclusive = text.length;\n            }\n            const wsRegExp = /\\s+/g;\n            const m2 = wsRegExp.exec(text);\n            if (m2 && m2.index !== undefined) {\n                if (m2.index + m2[0].length < acceptUntilIndexExclusive) {\n                    acceptUntilIndexExclusive = m2.index + m2[0].length;\n                }\n            }\n            return acceptUntilIndexExclusive;\n        }, 0 /* PartialAcceptTriggerKind.Word */);\n    }\n    async acceptNextLine() {\n        await this._acceptNext(this._editor, 'line', (pos, text) => {\n            const m = text.match(/\\n/);\n            if (m && m.index !== undefined) {\n                return m.index + 1;\n            }\n            return text.length;\n        }, 1 /* PartialAcceptTriggerKind.Line */);\n    }\n    async _acceptNext(editor, type, getAcceptUntilIndex, kind) {\n        if (editor.getModel() !== this.textModel) {\n            throw new BugIndicatingError();\n        }\n        const state = this.inlineCompletionState.get();\n        if (!state || state.primaryGhostText.isEmpty() || !state.inlineCompletion) {\n            return;\n        }\n        const ghostText = state.primaryGhostText;\n        const completion = state.inlineCompletion;\n        if (completion.snippetInfo) {\n            // not in WYSIWYG mode, partial commit might change completion, thus it is not supported\n            await this.accept(editor);\n            return;\n        }\n        const firstPart = ghostText.parts[0];\n        const ghostTextPos = new Position(ghostText.lineNumber, firstPart.column);\n        const ghostTextVal = firstPart.text;\n        const acceptUntilIndexExclusive = getAcceptUntilIndex(ghostTextPos, ghostTextVal);\n        if (acceptUntilIndexExclusive === ghostTextVal.length && ghostText.parts.length === 1) {\n            this.accept(editor);\n            return;\n        }\n        const partialGhostTextVal = ghostTextVal.substring(0, acceptUntilIndexExclusive);\n        const positions = this._positions.get();\n        const cursorPosition = positions[0];\n        // Executing the edit might free the completion, so we have to hold a reference on it.\n        completion.addRef();\n        try {\n            this._isAcceptingPartially = true;\n            try {\n                editor.pushUndoStop();\n                const replaceRange = Range.fromPositions(cursorPosition, ghostTextPos);\n                const newText = editor.getModel().getValueInRange(replaceRange) + partialGhostTextVal;\n                const primaryEdit = new TextReplacement(replaceRange, newText);\n                const edits = [primaryEdit, ...getSecondaryEdits(this.textModel, positions, primaryEdit)].filter(isDefined);\n                const selections = getEndPositionsAfterApplying(edits).map(p => Selection.fromPositions(p));\n                editor.edit(TextEdit.fromParallelReplacementsUnsorted(edits), this._getMetadata(completion, type));\n                editor.setSelections(selections, 'inlineCompletionPartialAccept');\n                editor.revealPositionInCenterIfOutsideViewport(editor.getPosition(), 1 /* ScrollType.Immediate */);\n            }\n            finally {\n                this._isAcceptingPartially = false;\n            }\n            const acceptedRange = Range.fromPositions(completion.editRange.getStartPosition(), TextLength.ofText(partialGhostTextVal).addToPosition(ghostTextPos));\n            // This assumes that the inline completion and the model use the same EOL style.\n            const text = editor.getModel().getValueInRange(acceptedRange, 1 /* EndOfLinePreference.LF */);\n            const acceptedLength = text.length;\n            completion.reportPartialAccept(acceptedLength, { kind, acceptedLength: acceptedLength }, { characters: acceptUntilIndexExclusive, ratio: acceptUntilIndexExclusive / ghostTextVal.length, count: 1 });\n        }\n        finally {\n            completion.removeRef();\n        }\n    }\n    handleSuggestAccepted(item) {\n        const itemEdit = singleTextRemoveCommonPrefix(item.getSingleTextEdit(), this.textModel);\n        const augmentedCompletion = this._computeAugmentation(itemEdit, undefined);\n        if (!augmentedCompletion) {\n            return;\n        }\n        // This assumes that the inline completion and the model use the same EOL style.\n        const alreadyAcceptedLength = this.textModel.getValueInRange(augmentedCompletion.completion.editRange, 1 /* EndOfLinePreference.LF */).length;\n        const acceptedLength = alreadyAcceptedLength + itemEdit.text.length;\n        augmentedCompletion.completion.reportPartialAccept(itemEdit.text.length, {\n            kind: 2 /* PartialAcceptTriggerKind.Suggest */,\n            acceptedLength,\n        }, {\n            characters: itemEdit.text.length,\n            count: 1,\n            ratio: 1\n        });\n    }\n    extractReproSample() {\n        const value = this.textModel.getValue();\n        const item = this.state.get()?.inlineCompletion;\n        return {\n            documentValue: value,\n            inlineCompletion: item?.getSourceCompletion(),\n        };\n    }\n    jump() {\n        const s = this.inlineEditState.get();\n        if (!s) {\n            return;\n        }\n        transaction(tx => {\n            this._jumpedToId.set(s.inlineCompletion.semanticId, tx);\n            this.dontRefetchSignal.trigger(tx);\n            const targetRange = s.inlineCompletion.targetRange;\n            const targetPosition = targetRange.getStartPosition();\n            this._editor.setPosition(targetPosition, 'inlineCompletions.jump');\n            // TODO: consider using view information to reveal it\n            const isSingleLineChange = targetRange.isSingleLine() && (s.inlineCompletion.hint || !s.inlineCompletion.insertText.includes('\\n'));\n            if (isSingleLineChange) {\n                this._editor.revealPosition(targetPosition);\n            }\n            else {\n                const revealRange = new Range(targetRange.startLineNumber - 1, 1, targetRange.endLineNumber + 1, 1);\n                this._editor.revealRange(revealRange, 1 /* ScrollType.Immediate */);\n            }\n            s.inlineCompletion.identity.setJumpTo(tx);\n            this._editor.focus();\n        });\n    }\n    async handleInlineSuggestionShown(inlineCompletion, viewKind, viewData) {\n        await inlineCompletion.reportInlineEditShown(this._commandService, viewKind, viewData);\n    }\n};\nInlineCompletionsModel = __decorate([\n    __param(7, IInstantiationService),\n    __param(8, ICommandService),\n    __param(9, ILanguageConfigurationService),\n    __param(10, IAccessibilityService),\n    __param(11, ILanguageFeaturesService),\n    __param(12, ICodeEditorService),\n    __param(13, IInlineCompletionsService)\n], InlineCompletionsModel);\nvar VersionIdChangeReason;\n(function (VersionIdChangeReason) {\n    VersionIdChangeReason[VersionIdChangeReason[\"Undo\"] = 0] = \"Undo\";\n    VersionIdChangeReason[VersionIdChangeReason[\"Redo\"] = 1] = \"Redo\";\n    VersionIdChangeReason[VersionIdChangeReason[\"AcceptWord\"] = 2] = \"AcceptWord\";\n    VersionIdChangeReason[VersionIdChangeReason[\"Other\"] = 3] = \"Other\";\n})(VersionIdChangeReason || (VersionIdChangeReason = {}));\nfunction getSecondaryEdits(textModel, positions, primaryTextRepl) {\n    if (positions.length === 1) {\n        // No secondary cursor positions\n        return [];\n    }\n    const text = new TextModelText(textModel);\n    const textTransformer = text.getTransformer();\n    const primaryOffset = textTransformer.getOffset(positions[0]);\n    const secondaryOffsets = positions.slice(1).map(pos => textTransformer.getOffset(pos));\n    primaryTextRepl = primaryTextRepl.removeCommonPrefixAndSuffix(text);\n    const primaryStringRepl = textTransformer.getStringReplacement(primaryTextRepl);\n    const deltaFromOffsetToRangeStart = primaryStringRepl.replaceRange.start - primaryOffset;\n    const primaryContextRange = primaryStringRepl.replaceRange.join(OffsetRange.emptyAt(primaryOffset));\n    const primaryContextValue = text.getValueOfOffsetRange(primaryContextRange);\n    const replacements = secondaryOffsets.map(secondaryOffset => {\n        const newRangeStart = secondaryOffset + deltaFromOffsetToRangeStart;\n        const newRangeEnd = newRangeStart + primaryStringRepl.replaceRange.length;\n        const range = new OffsetRange(newRangeStart, newRangeEnd);\n        const contextRange = range.join(OffsetRange.emptyAt(secondaryOffset));\n        const contextValue = text.getValueOfOffsetRange(contextRange);\n        if (contextValue !== primaryContextValue) {\n            return undefined;\n        }\n        const stringRepl = new StringReplacement(range, primaryStringRepl.newText);\n        const repl = textTransformer.getTextReplacement(stringRepl);\n        return repl;\n    }).filter(isDefined);\n    return replacements;\n}\nclass FadeoutDecoration extends Disposable {\n    constructor(editor, ranges, onDispose) {\n        super();\n        if (onDispose) {\n            this._register({ dispose: () => onDispose() });\n        }\n        this._register(observableCodeEditor(editor).setDecorations(constObservable(ranges.map(range => ({\n            range: range,\n            options: {\n                description: 'animation',\n                className: 'edits-fadeout-decoration',\n                zIndex: 1,\n            }\n        })))));\n        const animation = new AnimatedValue(1, 0, 1000, easeOutCubic);\n        const val = new ObservableAnimatedValue(animation);\n        this._register(autorun(reader => {\n            const opacity = val.getValue(reader);\n            editor.getContainerDomNode().style.setProperty('--animation-opacity', opacity.toString());\n            if (animation.isFinished()) {\n                this.dispose();\n            }\n        }));\n    }\n}\nfunction isSuggestionInViewport(editor, suggestion) {\n    const targetRange = suggestion.targetRange;\n    const visibleRanges = editor.getVisibleRanges();\n    if (visibleRanges.length < 1) {\n        return false;\n    }\n    const viewportRange = new Range(visibleRanges[0].startLineNumber, visibleRanges[0].startColumn, visibleRanges[visibleRanges.length - 1].endLineNumber, visibleRanges[visibleRanges.length - 1].endColumn);\n    return viewportRange.containsRange(targetRange);\n}\n\nexport { InlineCompletionsModel, VersionIdChangeReason, getSecondaryEdits };\n","import { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { LRUCache } from '../../../../base/common/map.js';\nimport { TernarySearchTree } from '../../../../base/common/ternarySearchTree.js';\nimport { CompletionItemKinds } from '../../../common/languages.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { registerSingleton } from '../../../../platform/instantiation/common/extensions.js';\nimport { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';\nimport { WillSaveStateReason, IStorageService } from '../../../../platform/storage/common/storage.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar SuggestMemoryService_1;\nclass Memory {\n    constructor(name) {\n        this.name = name;\n    }\n    select(model, pos, items) {\n        if (items.length === 0) {\n            return 0;\n        }\n        const topScore = items[0].score[0];\n        for (let i = 0; i < items.length; i++) {\n            const { score, completion: suggestion } = items[i];\n            if (score[0] !== topScore) {\n                // stop when leaving the group of top matches\n                break;\n            }\n            if (suggestion.preselect) {\n                // stop when seeing an auto-select-item\n                return i;\n            }\n        }\n        return 0;\n    }\n}\nclass NoMemory extends Memory {\n    constructor() {\n        super('first');\n    }\n    memorize(model, pos, item) {\n        // no-op\n    }\n    toJSON() {\n        return undefined;\n    }\n    fromJSON() {\n        //\n    }\n}\nclass LRUMemory extends Memory {\n    constructor() {\n        super('recentlyUsed');\n        this._cache = new LRUCache(300, 0.66);\n        this._seq = 0;\n    }\n    memorize(model, pos, item) {\n        const key = `${model.getLanguageId()}/${item.textLabel}`;\n        this._cache.set(key, {\n            touch: this._seq++,\n            type: item.completion.kind,\n            insertText: item.completion.insertText\n        });\n    }\n    select(model, pos, items) {\n        if (items.length === 0) {\n            return 0;\n        }\n        const lineSuffix = model.getLineContent(pos.lineNumber).substr(pos.column - 10, pos.column - 1);\n        if (/\\s$/.test(lineSuffix)) {\n            return super.select(model, pos, items);\n        }\n        const topScore = items[0].score[0];\n        let indexPreselect = -1;\n        let indexRecency = -1;\n        let seq = -1;\n        for (let i = 0; i < items.length; i++) {\n            if (items[i].score[0] !== topScore) {\n                // consider only top items\n                break;\n            }\n            const key = `${model.getLanguageId()}/${items[i].textLabel}`;\n            const item = this._cache.peek(key);\n            if (item && item.touch > seq && item.type === items[i].completion.kind && item.insertText === items[i].completion.insertText) {\n                seq = item.touch;\n                indexRecency = i;\n            }\n            if (items[i].completion.preselect && indexPreselect === -1) {\n                // stop when seeing an auto-select-item\n                return indexPreselect = i;\n            }\n        }\n        if (indexRecency !== -1) {\n            return indexRecency;\n        }\n        else if (indexPreselect !== -1) {\n            return indexPreselect;\n        }\n        else {\n            return 0;\n        }\n    }\n    toJSON() {\n        return this._cache.toJSON();\n    }\n    fromJSON(data) {\n        this._cache.clear();\n        const seq = 0;\n        for (const [key, value] of data) {\n            value.touch = seq;\n            value.type = typeof value.type === 'number' ? value.type : CompletionItemKinds.fromString(value.type);\n            this._cache.set(key, value);\n        }\n        this._seq = this._cache.size;\n    }\n}\nclass PrefixMemory extends Memory {\n    constructor() {\n        super('recentlyUsedByPrefix');\n        this._trie = TernarySearchTree.forStrings();\n        this._seq = 0;\n    }\n    memorize(model, pos, item) {\n        const { word } = model.getWordUntilPosition(pos);\n        const key = `${model.getLanguageId()}/${word}`;\n        this._trie.set(key, {\n            type: item.completion.kind,\n            insertText: item.completion.insertText,\n            touch: this._seq++\n        });\n    }\n    select(model, pos, items) {\n        const { word } = model.getWordUntilPosition(pos);\n        if (!word) {\n            return super.select(model, pos, items);\n        }\n        const key = `${model.getLanguageId()}/${word}`;\n        let item = this._trie.get(key);\n        if (!item) {\n            item = this._trie.findSubstr(key);\n        }\n        if (item) {\n            for (let i = 0; i < items.length; i++) {\n                const { kind, insertText } = items[i].completion;\n                if (kind === item.type && insertText === item.insertText) {\n                    return i;\n                }\n            }\n        }\n        return super.select(model, pos, items);\n    }\n    toJSON() {\n        const entries = [];\n        this._trie.forEach((value, key) => entries.push([key, value]));\n        // sort by last recently used (touch), then\n        // take the top 200 item and normalize their\n        // touch\n        entries\n            .sort((a, b) => -(a[1].touch - b[1].touch))\n            .forEach((value, i) => value[1].touch = i);\n        return entries.slice(0, 200);\n    }\n    fromJSON(data) {\n        this._trie.clear();\n        if (data.length > 0) {\n            this._seq = data[0][1].touch + 1;\n            for (const [key, value] of data) {\n                value.type = typeof value.type === 'number' ? value.type : CompletionItemKinds.fromString(value.type);\n                this._trie.set(key, value);\n            }\n        }\n    }\n}\nlet SuggestMemoryService = class SuggestMemoryService {\n    static { SuggestMemoryService_1 = this; }\n    static { this._strategyCtors = new Map([\n        ['recentlyUsedByPrefix', PrefixMemory],\n        ['recentlyUsed', LRUMemory],\n        ['first', NoMemory]\n    ]); }\n    static { this._storagePrefix = 'suggest/memories'; }\n    constructor(_storageService, _configService) {\n        this._storageService = _storageService;\n        this._configService = _configService;\n        this._disposables = new DisposableStore();\n        this._persistSoon = new RunOnceScheduler(() => this._saveState(), 500);\n        this._disposables.add(_storageService.onWillSaveState(e => {\n            if (e.reason === WillSaveStateReason.SHUTDOWN) {\n                this._saveState();\n            }\n        }));\n    }\n    dispose() {\n        this._disposables.dispose();\n        this._persistSoon.dispose();\n    }\n    memorize(model, pos, item) {\n        this._withStrategy(model, pos).memorize(model, pos, item);\n        this._persistSoon.schedule();\n    }\n    select(model, pos, items) {\n        return this._withStrategy(model, pos).select(model, pos, items);\n    }\n    _withStrategy(model, pos) {\n        const mode = this._configService.getValue('editor.suggestSelection', {\n            overrideIdentifier: model.getLanguageIdAtPosition(pos.lineNumber, pos.column),\n            resource: model.uri\n        });\n        if (this._strategy?.name !== mode) {\n            this._saveState();\n            const ctor = SuggestMemoryService_1._strategyCtors.get(mode) || NoMemory;\n            this._strategy = new ctor();\n            try {\n                const share = this._configService.getValue('editor.suggest.shareSuggestSelections');\n                const scope = share ? 0 /* StorageScope.PROFILE */ : 1 /* StorageScope.WORKSPACE */;\n                const raw = this._storageService.get(`${SuggestMemoryService_1._storagePrefix}/${mode}`, scope);\n                if (raw) {\n                    this._strategy.fromJSON(JSON.parse(raw));\n                }\n            }\n            catch (e) {\n                // things can go wrong with JSON...\n            }\n        }\n        return this._strategy;\n    }\n    _saveState() {\n        if (this._strategy) {\n            const share = this._configService.getValue('editor.suggest.shareSuggestSelections');\n            const scope = share ? 0 /* StorageScope.PROFILE */ : 1 /* StorageScope.WORKSPACE */;\n            const raw = JSON.stringify(this._strategy);\n            this._storageService.store(`${SuggestMemoryService_1._storagePrefix}/${this._strategy.name}`, raw, scope, 1 /* StorageTarget.MACHINE */);\n        }\n    }\n};\nSuggestMemoryService = SuggestMemoryService_1 = __decorate([\n    __param(0, IStorageService),\n    __param(1, IConfigurationService)\n], SuggestMemoryService);\nconst ISuggestMemoryService = createDecorator('ISuggestMemories');\nregisterSingleton(ISuggestMemoryService, SuggestMemoryService, 1 /* InstantiationType.Delayed */);\n\nexport { ISuggestMemoryService, LRUMemory, Memory, NoMemory, PrefixMemory, SuggestMemoryService };\n","import { RawContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { localize } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar WordContextKey_1;\nlet WordContextKey = class WordContextKey {\n    static { WordContextKey_1 = this; }\n    static { this.AtEnd = new RawContextKey('atEndOfWord', false, { type: 'boolean', description: localize(1494, \"A context key that is true when at the end of a word. Note that this is only defined when tab-completions are enabled\") }); }\n    constructor(_editor, contextKeyService) {\n        this._editor = _editor;\n        this._enabled = false;\n        this._ckAtEnd = WordContextKey_1.AtEnd.bindTo(contextKeyService);\n        this._configListener = this._editor.onDidChangeConfiguration(e => e.hasChanged(139 /* EditorOption.tabCompletion */) && this._update());\n        this._update();\n    }\n    dispose() {\n        this._configListener.dispose();\n        this._selectionListener?.dispose();\n        this._ckAtEnd.reset();\n    }\n    _update() {\n        // only update this when tab completions are enabled\n        const enabled = this._editor.getOption(139 /* EditorOption.tabCompletion */) === 'on';\n        if (this._enabled === enabled) {\n            return;\n        }\n        this._enabled = enabled;\n        if (this._enabled) {\n            const checkForWordEnd = () => {\n                if (!this._editor.hasModel()) {\n                    this._ckAtEnd.set(false);\n                    return;\n                }\n                const model = this._editor.getModel();\n                const selection = this._editor.getSelection();\n                const word = model.getWordAtPosition(selection.getStartPosition());\n                if (!word) {\n                    this._ckAtEnd.set(false);\n                    return;\n                }\n                this._ckAtEnd.set(word.endColumn === selection.getStartPosition().column && selection.getStartPosition().lineNumber === selection.getEndPosition().lineNumber);\n            };\n            this._selectionListener = this._editor.onDidChangeCursorSelection(checkForWordEnd);\n            checkForWordEnd();\n        }\n        else if (this._selectionListener) {\n            this._ckAtEnd.reset();\n            this._selectionListener.dispose();\n            this._selectionListener = undefined;\n        }\n    }\n};\nWordContextKey = WordContextKey_1 = __decorate([\n    __param(1, IContextKeyService)\n], WordContextKey);\n\nexport { WordContextKey };\n","import { RawContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar SuggestAlternatives_1;\nlet SuggestAlternatives = class SuggestAlternatives {\n    static { SuggestAlternatives_1 = this; }\n    static { this.OtherSuggestions = new RawContextKey('hasOtherSuggestions', false); }\n    constructor(_editor, contextKeyService) {\n        this._editor = _editor;\n        this._index = 0;\n        this._ckOtherSuggestions = SuggestAlternatives_1.OtherSuggestions.bindTo(contextKeyService);\n    }\n    dispose() {\n        this.reset();\n    }\n    reset() {\n        this._ckOtherSuggestions.reset();\n        this._listener?.dispose();\n        this._model = undefined;\n        this._acceptNext = undefined;\n        this._ignore = false;\n    }\n    set({ model, index }, acceptNext) {\n        // no suggestions -> nothing to do\n        if (model.items.length === 0) {\n            this.reset();\n            return;\n        }\n        // no alternative suggestions -> nothing to do\n        const nextIndex = SuggestAlternatives_1._moveIndex(true, model, index);\n        if (nextIndex === index) {\n            this.reset();\n            return;\n        }\n        this._acceptNext = acceptNext;\n        this._model = model;\n        this._index = index;\n        this._listener = this._editor.onDidChangeCursorPosition(() => {\n            if (!this._ignore) {\n                this.reset();\n            }\n        });\n        this._ckOtherSuggestions.set(true);\n    }\n    static _moveIndex(fwd, model, index) {\n        let newIndex = index;\n        for (let rounds = model.items.length; rounds > 0; rounds--) {\n            newIndex = (newIndex + model.items.length + (fwd ? 1 : -1)) % model.items.length;\n            if (newIndex === index) {\n                break;\n            }\n            if (!model.items[newIndex].completion.additionalTextEdits) {\n                break;\n            }\n        }\n        return newIndex;\n    }\n    next() {\n        this._move(true);\n    }\n    prev() {\n        this._move(false);\n    }\n    _move(fwd) {\n        if (!this._model) {\n            // nothing to reason about\n            return;\n        }\n        try {\n            this._ignore = true;\n            this._index = SuggestAlternatives_1._moveIndex(fwd, this._model, this._index);\n            this._acceptNext({ index: this._index, item: this._model.items[this._index], model: this._model });\n        }\n        finally {\n            this._ignore = false;\n        }\n    }\n};\nSuggestAlternatives = SuggestAlternatives_1 = __decorate([\n    __param(1, IContextKeyService)\n], SuggestAlternatives);\n\nexport { SuggestAlternatives };\n","import { isNonEmptyArray } from '../../../../base/common/arrays.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { CharacterSet } from '../../../common/core/characterClassifier.js';\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 *--------------------------------------------------------------------------------------------*/\nclass CommitCharacterController {\n    constructor(editor, widget, model, accept) {\n        this._disposables = new DisposableStore();\n        this._disposables.add(model.onDidSuggest(e => {\n            if (e.completionModel.items.length === 0) {\n                this.reset();\n            }\n        }));\n        this._disposables.add(model.onDidCancel(e => {\n            this.reset();\n        }));\n        this._disposables.add(widget.onDidShow(() => this._onItem(widget.getFocusedItem())));\n        this._disposables.add(widget.onDidFocus(this._onItem, this));\n        this._disposables.add(widget.onDidHide(this.reset, this));\n        this._disposables.add(editor.onWillType(text => {\n            if (this._active && !widget.isFrozen() && model.state !== 0 /* State.Idle */) {\n                const ch = text.charCodeAt(text.length - 1);\n                if (this._active.acceptCharacters.has(ch) && editor.getOption(0 /* EditorOption.acceptSuggestionOnCommitCharacter */)) {\n                    accept(this._active.item);\n                }\n            }\n        }));\n    }\n    _onItem(selected) {\n        if (!selected || !isNonEmptyArray(selected.item.completion.commitCharacters)) {\n            // no item or no commit characters\n            this.reset();\n            return;\n        }\n        if (this._active && this._active.item.item === selected.item) {\n            // still the same item\n            return;\n        }\n        // keep item and its commit characters\n        const acceptCharacters = new CharacterSet();\n        for (const ch of selected.item.completion.commitCharacters) {\n            if (ch.length > 0) {\n                acceptCharacters.add(ch.charCodeAt(0));\n            }\n        }\n        this._active = { acceptCharacters, item: selected };\n    }\n    reset() {\n        this._active = undefined;\n    }\n    dispose() {\n        this._disposables.dispose();\n    }\n}\n\nexport { CommitCharacterController };\n","import { LinkedList } from '../../../../base/common/linkedList.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nclass BracketSelectionRangeProvider {\n    async provideSelectionRanges(model, positions) {\n        const result = [];\n        for (const position of positions) {\n            const bucket = [];\n            result.push(bucket);\n            const ranges = new Map();\n            await new Promise(resolve => BracketSelectionRangeProvider._bracketsRightYield(resolve, 0, model, position, ranges));\n            await new Promise(resolve => BracketSelectionRangeProvider._bracketsLeftYield(resolve, 0, model, position, ranges, bucket));\n        }\n        return result;\n    }\n    static { this._maxDuration = 30; }\n    static { this._maxRounds = 2; }\n    static _bracketsRightYield(resolve, round, model, pos, ranges) {\n        const counts = new Map();\n        const t1 = Date.now();\n        while (true) {\n            if (round >= BracketSelectionRangeProvider._maxRounds) {\n                resolve();\n                break;\n            }\n            if (!pos) {\n                resolve();\n                break;\n            }\n            const bracket = model.bracketPairs.findNextBracket(pos);\n            if (!bracket) {\n                resolve();\n                break;\n            }\n            const d = Date.now() - t1;\n            if (d > BracketSelectionRangeProvider._maxDuration) {\n                setTimeout(() => BracketSelectionRangeProvider._bracketsRightYield(resolve, round + 1, model, pos, ranges));\n                break;\n            }\n            if (bracket.bracketInfo.isOpeningBracket) {\n                const key = bracket.bracketInfo.bracketText;\n                // wait for closing\n                const val = counts.has(key) ? counts.get(key) : 0;\n                counts.set(key, val + 1);\n            }\n            else {\n                const key = bracket.bracketInfo.getOpeningBrackets()[0].bracketText;\n                // process closing\n                let val = counts.has(key) ? counts.get(key) : 0;\n                val -= 1;\n                counts.set(key, Math.max(0, val));\n                if (val < 0) {\n                    let list = ranges.get(key);\n                    if (!list) {\n                        list = new LinkedList();\n                        ranges.set(key, list);\n                    }\n                    list.push(bracket.range);\n                }\n            }\n            pos = bracket.range.getEndPosition();\n        }\n    }\n    static _bracketsLeftYield(resolve, round, model, pos, ranges, bucket) {\n        const counts = new Map();\n        const t1 = Date.now();\n        while (true) {\n            if (round >= BracketSelectionRangeProvider._maxRounds && ranges.size === 0) {\n                resolve();\n                break;\n            }\n            if (!pos) {\n                resolve();\n                break;\n            }\n            const bracket = model.bracketPairs.findPrevBracket(pos);\n            if (!bracket) {\n                resolve();\n                break;\n            }\n            const d = Date.now() - t1;\n            if (d > BracketSelectionRangeProvider._maxDuration) {\n                setTimeout(() => BracketSelectionRangeProvider._bracketsLeftYield(resolve, round + 1, model, pos, ranges, bucket));\n                break;\n            }\n            if (!bracket.bracketInfo.isOpeningBracket) {\n                const key = bracket.bracketInfo.getOpeningBrackets()[0].bracketText;\n                // wait for opening\n                const val = counts.has(key) ? counts.get(key) : 0;\n                counts.set(key, val + 1);\n            }\n            else {\n                const key = bracket.bracketInfo.bracketText;\n                // opening\n                let val = counts.has(key) ? counts.get(key) : 0;\n                val -= 1;\n                counts.set(key, Math.max(0, val));\n                if (val < 0) {\n                    const list = ranges.get(key);\n                    if (list) {\n                        const closing = list.shift();\n                        if (list.size === 0) {\n                            ranges.delete(key);\n                        }\n                        const innerBracket = Range.fromPositions(bracket.range.getEndPosition(), closing.getStartPosition());\n                        const outerBracket = Range.fromPositions(bracket.range.getStartPosition(), closing.getEndPosition());\n                        bucket.push({ range: innerBracket });\n                        bucket.push({ range: outerBracket });\n                        BracketSelectionRangeProvider._addBracketLeading(model, outerBracket, bucket);\n                    }\n                }\n            }\n            pos = bracket.range.getStartPosition();\n        }\n    }\n    static _addBracketLeading(model, bracket, bucket) {\n        if (bracket.startLineNumber === bracket.endLineNumber) {\n            return;\n        }\n        // xxxxxxxx {\n        //\n        // }\n        const startLine = bracket.startLineNumber;\n        const column = model.getLineFirstNonWhitespaceColumn(startLine);\n        if (column !== 0 && column !== bracket.startColumn) {\n            bucket.push({ range: Range.fromPositions(new Position(startLine, column), bracket.getEndPosition()) });\n            bucket.push({ range: Range.fromPositions(new Position(startLine, 1), bracket.getEndPosition()) });\n        }\n        // xxxxxxxx\n        // {\n        //\n        // }\n        const aboveLine = startLine - 1;\n        if (aboveLine > 0) {\n            const column = model.getLineFirstNonWhitespaceColumn(aboveLine);\n            if (column === bracket.startColumn && column !== model.getLineLastNonWhitespaceColumn(aboveLine)) {\n                bucket.push({ range: Range.fromPositions(new Position(aboveLine, column), bracket.getEndPosition()) });\n                bucket.push({ range: Range.fromPositions(new Position(aboveLine, 1), bracket.getEndPosition()) });\n            }\n        }\n    }\n}\n\nexport { BracketSelectionRangeProvider };\n","import { isFalsyOrEmpty, binarySearch } from '../../../../base/common/arrays.js';\nimport { Range } from '../../../common/core/range.js';\nimport { BracketSelectionRangeProvider } from '../../smartSelect/browser/bracketSelections.js';\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 *--------------------------------------------------------------------------------------------*/\nclass WordDistance {\n    static { this.None = new class extends WordDistance {\n        distance() { return 0; }\n    }; }\n    static async create(service, editor) {\n        if (!editor.getOption(134 /* EditorOption.suggest */).localityBonus) {\n            return WordDistance.None;\n        }\n        if (!editor.hasModel()) {\n            return WordDistance.None;\n        }\n        const model = editor.getModel();\n        const position = editor.getPosition();\n        if (!service.canComputeWordRanges(model.uri)) {\n            return WordDistance.None;\n        }\n        const [ranges] = await new BracketSelectionRangeProvider().provideSelectionRanges(model, [position]);\n        if (ranges.length === 0) {\n            return WordDistance.None;\n        }\n        const wordRanges = await service.computeWordRanges(model.uri, ranges[0].range);\n        if (!wordRanges) {\n            return WordDistance.None;\n        }\n        // remove current word\n        const wordUntilPos = model.getWordUntilPosition(position);\n        delete wordRanges[wordUntilPos.word];\n        return new class extends WordDistance {\n            distance(anchor, item) {\n                if (!position.equals(editor.getPosition())) {\n                    return 0;\n                }\n                if (item.kind === 17 /* CompletionItemKind.Keyword */) {\n                    return 2 << 20;\n                }\n                const word = typeof item.label === 'string' ? item.label : item.label.label;\n                const wordLines = wordRanges[word];\n                if (isFalsyOrEmpty(wordLines)) {\n                    return 2 << 20;\n                }\n                const idx = binarySearch(wordLines, Range.fromPositions(anchor), Range.compareRangesUsingStarts);\n                const bestWordRange = idx >= 0 ? wordLines[idx] : wordLines[Math.max(0, ~idx - 1)];\n                let blockDistance = ranges.length;\n                for (const range of ranges) {\n                    if (!Range.containsRange(range.range, bestWordRange)) {\n                        break;\n                    }\n                    blockDistance -= 1;\n                }\n                return blockDistance;\n            }\n        };\n    }\n}\n\nexport { WordDistance };\n","import { quickSelect } from '../../../../base/common/arrays.js';\nimport { FuzzyScoreOptions, fuzzyScore, fuzzyScoreGracefulAggressive, FuzzyScore, anyScore } from '../../../../base/common/filters.js';\nimport { compareIgnoreCase } from '../../../../base/common/strings.js';\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 *--------------------------------------------------------------------------------------------*/\nclass LineContext {\n    constructor(leadingLineContent, characterCountDelta) {\n        this.leadingLineContent = leadingLineContent;\n        this.characterCountDelta = characterCountDelta;\n    }\n}\n/**\n * Sorted, filtered completion view model\n * */\nclass CompletionModel {\n    constructor(items, column, lineContext, wordDistance, options, snippetSuggestions, fuzzyScoreOptions = FuzzyScoreOptions.default, clipboardText = undefined) {\n        this.clipboardText = clipboardText;\n        this._snippetCompareFn = CompletionModel._compareCompletionItems;\n        this._items = items;\n        this._column = column;\n        this._wordDistance = wordDistance;\n        this._options = options;\n        this._refilterKind = 1 /* Refilter.All */;\n        this._lineContext = lineContext;\n        this._fuzzyScoreOptions = fuzzyScoreOptions;\n        if (snippetSuggestions === 'top') {\n            this._snippetCompareFn = CompletionModel._compareCompletionItemsSnippetsUp;\n        }\n        else if (snippetSuggestions === 'bottom') {\n            this._snippetCompareFn = CompletionModel._compareCompletionItemsSnippetsDown;\n        }\n    }\n    get lineContext() {\n        return this._lineContext;\n    }\n    set lineContext(value) {\n        if (this._lineContext.leadingLineContent !== value.leadingLineContent\n            || this._lineContext.characterCountDelta !== value.characterCountDelta) {\n            this._refilterKind = this._lineContext.characterCountDelta < value.characterCountDelta && this._filteredItems ? 2 /* Refilter.Incr */ : 1 /* Refilter.All */;\n            this._lineContext = value;\n        }\n    }\n    get items() {\n        this._ensureCachedState();\n        return this._filteredItems;\n    }\n    getItemsByProvider() {\n        this._ensureCachedState();\n        return this._itemsByProvider;\n    }\n    getIncompleteProvider() {\n        this._ensureCachedState();\n        const result = new Set();\n        for (const [provider, items] of this.getItemsByProvider()) {\n            if (items.length > 0 && items[0].container.incomplete) {\n                result.add(provider);\n            }\n        }\n        return result;\n    }\n    get stats() {\n        this._ensureCachedState();\n        return this._stats;\n    }\n    _ensureCachedState() {\n        if (this._refilterKind !== 0 /* Refilter.Nothing */) {\n            this._createCachedState();\n        }\n    }\n    _createCachedState() {\n        this._itemsByProvider = new Map();\n        const labelLengths = [];\n        const { leadingLineContent, characterCountDelta } = this._lineContext;\n        let word = '';\n        let wordLow = '';\n        // incrementally filter less\n        const source = this._refilterKind === 1 /* Refilter.All */ ? this._items : this._filteredItems;\n        const target = [];\n        // picks a score function based on the number of\n        // items that we have to score/filter and based on the\n        // user-configuration\n        const scoreFn = (!this._options.filterGraceful || source.length > 2000) ? fuzzyScore : fuzzyScoreGracefulAggressive;\n        for (let i = 0; i < source.length; i++) {\n            const item = source[i];\n            if (item.isInvalid) {\n                continue; // SKIP invalid items\n            }\n            // keep all items by their provider\n            const arr = this._itemsByProvider.get(item.provider);\n            if (arr) {\n                arr.push(item);\n            }\n            else {\n                this._itemsByProvider.set(item.provider, [item]);\n            }\n            // 'word' is that remainder of the current line that we\n            // filter and score against. In theory each suggestion uses a\n            // different word, but in practice not - that's why we cache\n            const overwriteBefore = item.position.column - item.editStart.column;\n            const wordLen = overwriteBefore + characterCountDelta - (item.position.column - this._column);\n            if (word.length !== wordLen) {\n                word = wordLen === 0 ? '' : leadingLineContent.slice(-wordLen);\n                wordLow = word.toLowerCase();\n            }\n            // remember the word against which this item was\n            // scored\n            item.word = word;\n            if (wordLen === 0) {\n                // when there is nothing to score against, don't\n                // event try to do. Use a const rank and rely on\n                // the fallback-sort using the initial sort order.\n                // use a score of `-100` because that is out of the\n                // bound of values `fuzzyScore` will return\n                item.score = FuzzyScore.Default;\n            }\n            else {\n                // skip word characters that are whitespace until\n                // we have hit the replace range (overwriteBefore)\n                let wordPos = 0;\n                while (wordPos < overwriteBefore) {\n                    const ch = word.charCodeAt(wordPos);\n                    if (ch === 32 /* CharCode.Space */ || ch === 9 /* CharCode.Tab */) {\n                        wordPos += 1;\n                    }\n                    else {\n                        break;\n                    }\n                }\n                if (wordPos >= wordLen) {\n                    // the wordPos at which scoring starts is the whole word\n                    // and therefore the same rules as not having a word apply\n                    item.score = FuzzyScore.Default;\n                }\n                else if (typeof item.completion.filterText === 'string') {\n                    // when there is a `filterText` it must match the `word`.\n                    // if it matches we check with the label to compute highlights\n                    // and if that doesn't yield a result we have no highlights,\n                    // despite having the match\n                    const match = scoreFn(word, wordLow, wordPos, item.completion.filterText, item.filterTextLow, 0, this._fuzzyScoreOptions);\n                    if (!match) {\n                        continue; // NO match\n                    }\n                    if (compareIgnoreCase(item.completion.filterText, item.textLabel) === 0) {\n                        // filterText and label are actually the same -> use good highlights\n                        item.score = match;\n                    }\n                    else {\n                        // re-run the scorer on the label in the hope of a result BUT use the rank\n                        // of the filterText-match\n                        item.score = anyScore(word, wordLow, wordPos, item.textLabel, item.labelLow, 0);\n                        item.score[0] = match[0]; // use score from filterText\n                    }\n                }\n                else {\n                    // by default match `word` against the `label`\n                    const match = scoreFn(word, wordLow, wordPos, item.textLabel, item.labelLow, 0, this._fuzzyScoreOptions);\n                    if (!match) {\n                        continue; // NO match\n                    }\n                    item.score = match;\n                }\n            }\n            item.idx = i;\n            item.distance = this._wordDistance.distance(item.position, item.completion);\n            target.push(item);\n            // update stats\n            labelLengths.push(item.textLabel.length);\n        }\n        this._filteredItems = target.sort(this._snippetCompareFn);\n        this._refilterKind = 0 /* Refilter.Nothing */;\n        this._stats = {\n            pLabelLen: labelLengths.length ?\n                quickSelect(labelLengths.length - .85, labelLengths, (a, b) => a - b)\n                : 0\n        };\n    }\n    static _compareCompletionItems(a, b) {\n        if (a.score[0] > b.score[0]) {\n            return -1;\n        }\n        else if (a.score[0] < b.score[0]) {\n            return 1;\n        }\n        else if (a.distance < b.distance) {\n            return -1;\n        }\n        else if (a.distance > b.distance) {\n            return 1;\n        }\n        else if (a.idx < b.idx) {\n            return -1;\n        }\n        else if (a.idx > b.idx) {\n            return 1;\n        }\n        else {\n            return 0;\n        }\n    }\n    static _compareCompletionItemsSnippetsDown(a, b) {\n        if (a.completion.kind !== b.completion.kind) {\n            if (a.completion.kind === 28 /* CompletionItemKind.Snippet */) {\n                return 1;\n            }\n            else if (b.completion.kind === 28 /* CompletionItemKind.Snippet */) {\n                return -1;\n            }\n        }\n        return CompletionModel._compareCompletionItems(a, b);\n    }\n    static _compareCompletionItemsSnippetsUp(a, b) {\n        if (a.completion.kind !== b.completion.kind) {\n            if (a.completion.kind === 28 /* CompletionItemKind.Snippet */) {\n                return -1;\n            }\n            else if (b.completion.kind === 28 /* CompletionItemKind.Snippet */) {\n                return 1;\n            }\n        }\n        return CompletionModel._compareCompletionItems(a, b);\n    }\n}\n\nexport { CompletionModel, LineContext };\n","import { TimeoutTimer } from '../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { DisposableStore, dispose } from '../../../../base/common/lifecycle.js';\nimport { getLeadingWhitespace, isLowSurrogate, isHighSurrogate } from '../../../../base/common/strings.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { IEditorWorkerService } from '../../../common/services/editorWorker.js';\nimport { WordDistance } from './wordDistance.js';\nimport { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { ILogService } from '../../../../platform/log/common/log.js';\nimport { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js';\nimport { CompletionModel } from './completionModel.js';\nimport { QuickSuggestionsOptions, CompletionOptions, provideSuggestionItems } from './suggest.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { FuzzyScoreOptions } from '../../../../base/common/filters.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { InlineCompletionContextKeys } from '../../inlineCompletions/browser/controller/inlineCompletionContextKeys.js';\nimport { SnippetController2 } from '../../snippet/browser/snippetController2.js';\nimport { IEnvironmentService } from '../../../../platform/environment/common/environment.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar SuggestModel_1;\nclass LineContext {\n    static shouldAutoTrigger(editor) {\n        if (!editor.hasModel()) {\n            return false;\n        }\n        const model = editor.getModel();\n        const pos = editor.getPosition();\n        model.tokenization.tokenizeIfCheap(pos.lineNumber);\n        const word = model.getWordAtPosition(pos);\n        if (!word) {\n            return false;\n        }\n        if (word.endColumn !== pos.column &&\n            word.startColumn + 1 !== pos.column /* after typing a single character before a word */) {\n            return false;\n        }\n        if (!isNaN(Number(word.word))) {\n            return false;\n        }\n        return true;\n    }\n    constructor(model, position, triggerOptions) {\n        this.leadingLineContent = model.getLineContent(position.lineNumber).substr(0, position.column - 1);\n        this.leadingWord = model.getWordUntilPosition(position);\n        this.lineNumber = position.lineNumber;\n        this.column = position.column;\n        this.triggerOptions = triggerOptions;\n    }\n}\nfunction canShowQuickSuggest(editor, contextKeyService, configurationService) {\n    if (!Boolean(contextKeyService.getContextKeyValue(InlineCompletionContextKeys.inlineSuggestionVisible.key))) {\n        // Allow if there is no inline suggestion.\n        return true;\n    }\n    const suppressSuggestions = contextKeyService.getContextKeyValue(InlineCompletionContextKeys.suppressSuggestions.key);\n    if (suppressSuggestions !== undefined) {\n        return !suppressSuggestions;\n    }\n    return !editor.getOption(71 /* EditorOption.inlineSuggest */).suppressSuggestions;\n}\nfunction canShowSuggestOnTriggerCharacters(editor, contextKeyService, configurationService) {\n    if (!Boolean(contextKeyService.getContextKeyValue('inlineSuggestionVisible'))) {\n        // Allow if there is no inline suggestion.\n        return true;\n    }\n    const suppressSuggestions = contextKeyService.getContextKeyValue(InlineCompletionContextKeys.suppressSuggestions.key);\n    if (suppressSuggestions !== undefined) {\n        return !suppressSuggestions;\n    }\n    return !editor.getOption(71 /* EditorOption.inlineSuggest */).suppressSuggestions;\n}\nlet SuggestModel = SuggestModel_1 = class SuggestModel {\n    constructor(_editor, _editorWorkerService, _clipboardService, _telemetryService, _logService, _contextKeyService, _configurationService, _languageFeaturesService, _envService) {\n        this._editor = _editor;\n        this._editorWorkerService = _editorWorkerService;\n        this._clipboardService = _clipboardService;\n        this._telemetryService = _telemetryService;\n        this._logService = _logService;\n        this._contextKeyService = _contextKeyService;\n        this._configurationService = _configurationService;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._envService = _envService;\n        this._toDispose = new DisposableStore();\n        this._triggerCharacterListener = new DisposableStore();\n        this._triggerQuickSuggest = new TimeoutTimer();\n        this._triggerState = undefined;\n        this._completionDisposables = new DisposableStore();\n        this._onDidCancel = new Emitter();\n        this._onDidTrigger = new Emitter();\n        this._onDidSuggest = new Emitter();\n        this.onDidCancel = this._onDidCancel.event;\n        this.onDidTrigger = this._onDidTrigger.event;\n        this.onDidSuggest = this._onDidSuggest.event;\n        this._currentSelection = this._editor.getSelection() || new Selection(1, 1, 1, 1);\n        // wire up various listeners\n        this._toDispose.add(this._editor.onDidChangeModel(() => {\n            this._updateTriggerCharacters();\n            this.cancel();\n        }));\n        this._toDispose.add(this._editor.onDidChangeModelLanguage(() => {\n            this._updateTriggerCharacters();\n            this.cancel();\n        }));\n        this._toDispose.add(this._editor.onDidChangeConfiguration(() => {\n            this._updateTriggerCharacters();\n        }));\n        this._toDispose.add(this._languageFeaturesService.completionProvider.onDidChange(() => {\n            this._updateTriggerCharacters();\n            this._updateActiveSuggestSession();\n        }));\n        let editorIsComposing = false;\n        this._toDispose.add(this._editor.onDidCompositionStart(() => {\n            editorIsComposing = true;\n        }));\n        this._toDispose.add(this._editor.onDidCompositionEnd(() => {\n            editorIsComposing = false;\n            this._onCompositionEnd();\n        }));\n        this._toDispose.add(this._editor.onDidChangeCursorSelection(e => {\n            // only trigger suggest when the editor isn't composing a character\n            if (!editorIsComposing) {\n                this._onCursorChange(e);\n            }\n        }));\n        this._toDispose.add(this._editor.onDidChangeModelContent(() => {\n            // only filter completions when the editor isn't composing a character\n            // allow-any-unicode-next-line\n            // e.g. ¨ + u makes ü but just ¨ cannot be used for filtering\n            if (!editorIsComposing && this._triggerState !== undefined) {\n                this._refilterCompletionItems();\n            }\n        }));\n        this._updateTriggerCharacters();\n    }\n    dispose() {\n        dispose(this._triggerCharacterListener);\n        dispose([this._onDidCancel, this._onDidSuggest, this._onDidTrigger, this._triggerQuickSuggest]);\n        this._toDispose.dispose();\n        this._completionDisposables.dispose();\n        this.cancel();\n    }\n    _updateTriggerCharacters() {\n        this._triggerCharacterListener.clear();\n        if (this._editor.getOption(104 /* EditorOption.readOnly */)\n            || !this._editor.hasModel()\n            || !this._editor.getOption(137 /* EditorOption.suggestOnTriggerCharacters */)) {\n            return;\n        }\n        const supportsByTriggerCharacter = new Map();\n        for (const support of this._languageFeaturesService.completionProvider.all(this._editor.getModel())) {\n            for (const ch of support.triggerCharacters || []) {\n                let set = supportsByTriggerCharacter.get(ch);\n                if (!set) {\n                    set = new Set();\n                    supportsByTriggerCharacter.set(ch, set);\n                }\n                set.add(support);\n            }\n        }\n        const checkTriggerCharacter = (text) => {\n            if (!canShowSuggestOnTriggerCharacters(this._editor, this._contextKeyService, this._configurationService)) {\n                return;\n            }\n            if (LineContext.shouldAutoTrigger(this._editor)) {\n                // don't trigger by trigger characters when this is a case for quick suggest\n                return;\n            }\n            if (!text) {\n                // came here from the compositionEnd-event\n                const position = this._editor.getPosition();\n                const model = this._editor.getModel();\n                text = model.getLineContent(position.lineNumber).substr(0, position.column - 1);\n            }\n            let lastChar = '';\n            if (isLowSurrogate(text.charCodeAt(text.length - 1))) {\n                if (isHighSurrogate(text.charCodeAt(text.length - 2))) {\n                    lastChar = text.substr(text.length - 2);\n                }\n            }\n            else {\n                lastChar = text.charAt(text.length - 1);\n            }\n            const supports = supportsByTriggerCharacter.get(lastChar);\n            if (supports) {\n                // keep existing items that where not computed by the\n                // supports/providers that want to trigger now\n                const providerItemsToReuse = new Map();\n                if (this._completionModel) {\n                    for (const [provider, items] of this._completionModel.getItemsByProvider()) {\n                        if (!supports.has(provider)) {\n                            providerItemsToReuse.set(provider, items);\n                        }\n                    }\n                }\n                this.trigger({\n                    auto: true,\n                    triggerKind: 1 /* CompletionTriggerKind.TriggerCharacter */,\n                    triggerCharacter: lastChar,\n                    retrigger: Boolean(this._completionModel),\n                    clipboardText: this._completionModel?.clipboardText,\n                    completionOptions: { providerFilter: supports, providerItemsToReuse }\n                });\n            }\n        };\n        this._triggerCharacterListener.add(this._editor.onDidType(checkTriggerCharacter));\n        this._triggerCharacterListener.add(this._editor.onDidCompositionEnd(() => checkTriggerCharacter()));\n    }\n    // --- trigger/retrigger/cancel suggest\n    get state() {\n        if (!this._triggerState) {\n            return 0 /* State.Idle */;\n        }\n        else if (!this._triggerState.auto) {\n            return 1 /* State.Manual */;\n        }\n        else {\n            return 2 /* State.Auto */;\n        }\n    }\n    cancel(retrigger = false) {\n        if (this._triggerState !== undefined) {\n            this._triggerQuickSuggest.cancel();\n            this._requestToken?.cancel();\n            this._requestToken = undefined;\n            this._triggerState = undefined;\n            this._completionModel = undefined;\n            this._context = undefined;\n            this._onDidCancel.fire({ retrigger });\n        }\n    }\n    clear() {\n        this._completionDisposables.clear();\n    }\n    _updateActiveSuggestSession() {\n        if (this._triggerState !== undefined) {\n            if (!this._editor.hasModel() || !this._languageFeaturesService.completionProvider.has(this._editor.getModel())) {\n                this.cancel();\n            }\n            else {\n                this.trigger({ auto: this._triggerState.auto, retrigger: true });\n            }\n        }\n    }\n    _onCursorChange(e) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        const prevSelection = this._currentSelection;\n        this._currentSelection = this._editor.getSelection();\n        if (!e.selection.isEmpty()\n            || (e.reason !== 0 /* CursorChangeReason.NotSet */ && e.reason !== 3 /* CursorChangeReason.Explicit */)\n            || (e.source !== 'keyboard' && e.source !== 'deleteLeft')) {\n            // Early exit if nothing needs to be done!\n            // Leave some form of early exit check here if you wish to continue being a cursor position change listener ;)\n            this.cancel();\n            return;\n        }\n        if (this._triggerState === undefined && e.reason === 0 /* CursorChangeReason.NotSet */) {\n            if (prevSelection.containsRange(this._currentSelection) || prevSelection.getEndPosition().isBeforeOrEqual(this._currentSelection.getPosition())) {\n                // cursor did move RIGHT due to typing -> trigger quick suggest\n                this._doTriggerQuickSuggest();\n            }\n        }\n        else if (this._triggerState !== undefined && e.reason === 3 /* CursorChangeReason.Explicit */) {\n            // suggest is active and something like cursor keys are used to move\n            // the cursor. this means we can refilter at the new position\n            this._refilterCompletionItems();\n        }\n    }\n    _onCompositionEnd() {\n        // trigger or refilter when composition ends\n        if (this._triggerState === undefined) {\n            this._doTriggerQuickSuggest();\n        }\n        else {\n            this._refilterCompletionItems();\n        }\n    }\n    _doTriggerQuickSuggest() {\n        if (QuickSuggestionsOptions.isAllOff(this._editor.getOption(102 /* EditorOption.quickSuggestions */))) {\n            // not enabled\n            return;\n        }\n        if (this._editor.getOption(134 /* EditorOption.suggest */).snippetsPreventQuickSuggestions && SnippetController2.get(this._editor)?.isInSnippet()) {\n            // no quick suggestion when in snippet mode\n            return;\n        }\n        this.cancel();\n        this._triggerQuickSuggest.cancelAndSet(() => {\n            if (this._triggerState !== undefined) {\n                return;\n            }\n            if (!LineContext.shouldAutoTrigger(this._editor)) {\n                return;\n            }\n            if (!this._editor.hasModel() || !this._editor.hasWidgetFocus()) {\n                return;\n            }\n            const model = this._editor.getModel();\n            const pos = this._editor.getPosition();\n            // validate enabled now\n            const config = this._editor.getOption(102 /* EditorOption.quickSuggestions */);\n            if (QuickSuggestionsOptions.isAllOff(config)) {\n                return;\n            }\n            if (!QuickSuggestionsOptions.isAllOn(config)) {\n                // Check the type of the token that triggered this\n                model.tokenization.tokenizeIfCheap(pos.lineNumber);\n                const lineTokens = model.tokenization.getLineTokens(pos.lineNumber);\n                const tokenType = lineTokens.getStandardTokenType(lineTokens.findTokenIndexAtOffset(Math.max(pos.column - 1 - 1, 0)));\n                if (QuickSuggestionsOptions.valueFor(config, tokenType) !== 'on') {\n                    return;\n                }\n            }\n            if (!canShowQuickSuggest(this._editor, this._contextKeyService, this._configurationService)) {\n                // do not trigger quick suggestions if inline suggestions are shown\n                return;\n            }\n            if (!this._languageFeaturesService.completionProvider.has(model)) {\n                return;\n            }\n            // we made it till here -> trigger now\n            this.trigger({ auto: true });\n        }, this._editor.getOption(103 /* EditorOption.quickSuggestionsDelay */));\n    }\n    _refilterCompletionItems() {\n        assertType(this._editor.hasModel());\n        assertType(this._triggerState !== undefined);\n        const model = this._editor.getModel();\n        const position = this._editor.getPosition();\n        const ctx = new LineContext(model, position, { ...this._triggerState, refilter: true });\n        this._onNewContext(ctx);\n    }\n    trigger(options) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        const model = this._editor.getModel();\n        const ctx = new LineContext(model, this._editor.getPosition(), options);\n        // Cancel previous requests, change state & update UI\n        this.cancel(options.retrigger);\n        this._triggerState = options;\n        this._onDidTrigger.fire({ auto: options.auto, shy: options.shy ?? false, position: this._editor.getPosition() });\n        // Capture context when request was sent\n        this._context = ctx;\n        // Build context for request\n        let suggestCtx = { triggerKind: options.triggerKind ?? 0 /* CompletionTriggerKind.Invoke */ };\n        if (options.triggerCharacter) {\n            suggestCtx = {\n                triggerKind: 1 /* CompletionTriggerKind.TriggerCharacter */,\n                triggerCharacter: options.triggerCharacter\n            };\n        }\n        this._requestToken = new CancellationTokenSource();\n        // kind filter and snippet sort rules\n        const snippetSuggestions = this._editor.getOption(128 /* EditorOption.snippetSuggestions */);\n        let snippetSortOrder = 1 /* SnippetSortOrder.Inline */;\n        switch (snippetSuggestions) {\n            case 'top':\n                snippetSortOrder = 0 /* SnippetSortOrder.Top */;\n                break;\n            // \t↓ that's the default anyways...\n            // case 'inline':\n            // \tsnippetSortOrder = SnippetSortOrder.Inline;\n            // \tbreak;\n            case 'bottom':\n                snippetSortOrder = 2 /* SnippetSortOrder.Bottom */;\n                break;\n        }\n        const { itemKind: itemKindFilter, showDeprecated } = SuggestModel_1.createSuggestFilter(this._editor);\n        const completionOptions = new CompletionOptions(snippetSortOrder, options.completionOptions?.kindFilter ?? itemKindFilter, options.completionOptions?.providerFilter, options.completionOptions?.providerItemsToReuse, showDeprecated);\n        const wordDistance = WordDistance.create(this._editorWorkerService, this._editor);\n        const completions = provideSuggestionItems(this._languageFeaturesService.completionProvider, model, this._editor.getPosition(), completionOptions, suggestCtx, this._requestToken.token);\n        Promise.all([completions, wordDistance]).then(async ([completions, wordDistance]) => {\n            this._requestToken?.dispose();\n            if (!this._editor.hasModel()) {\n                completions.disposable.dispose();\n                return;\n            }\n            let clipboardText = options?.clipboardText;\n            if (!clipboardText && completions.needsClipboard) {\n                clipboardText = await this._clipboardService.readText();\n            }\n            if (this._triggerState === undefined) {\n                completions.disposable.dispose();\n                return;\n            }\n            const model = this._editor.getModel();\n            // const items = completions.items;\n            // if (existing) {\n            // \tconst cmpFn = getSuggestionComparator(snippetSortOrder);\n            // \titems = items.concat(existing.items).sort(cmpFn);\n            // }\n            const ctx = new LineContext(model, this._editor.getPosition(), options);\n            const fuzzySearchOptions = {\n                ...FuzzyScoreOptions.default,\n                firstMatchCanBeWeak: !this._editor.getOption(134 /* EditorOption.suggest */).matchOnWordStartOnly\n            };\n            this._completionModel = new CompletionModel(completions.items, this._context.column, {\n                leadingLineContent: ctx.leadingLineContent,\n                characterCountDelta: ctx.column - this._context.column\n            }, wordDistance, this._editor.getOption(134 /* EditorOption.suggest */), this._editor.getOption(128 /* EditorOption.snippetSuggestions */), fuzzySearchOptions, clipboardText);\n            // store containers so that they can be disposed later\n            this._completionDisposables.add(completions.disposable);\n            this._onNewContext(ctx);\n            // finally report telemetry about durations\n            this._reportDurationsTelemetry(completions.durations);\n            // report invalid completions by source\n            if (!this._envService.isBuilt || this._envService.isExtensionDevelopment) {\n                for (const item of completions.items) {\n                    if (item.isInvalid) {\n                        this._logService.warn(`[suggest] did IGNORE invalid completion item from ${item.provider._debugDisplayName}`, item.completion);\n                    }\n                }\n            }\n        }).catch(onUnexpectedError);\n    }\n    /**\n     * Report durations telemetry with a 1% sampling rate.\n     * The telemetry is reported only if a random number between 0 and 100 is less than or equal to 1.\n     */\n    _reportDurationsTelemetry(durations) {\n        if (Math.random() > 0.0001) { // 0.01%\n            return;\n        }\n        setTimeout(() => {\n            this._telemetryService.publicLog2('suggest.durations.json', { data: JSON.stringify(durations) });\n            this._logService.debug('suggest.durations.json', durations);\n        });\n    }\n    static createSuggestFilter(editor) {\n        // kind filter and snippet sort rules\n        const result = new Set();\n        // snippet setting\n        const snippetSuggestions = editor.getOption(128 /* EditorOption.snippetSuggestions */);\n        if (snippetSuggestions === 'none') {\n            result.add(28 /* CompletionItemKind.Snippet */);\n        }\n        // type setting\n        const suggestOptions = editor.getOption(134 /* EditorOption.suggest */);\n        if (!suggestOptions.showMethods) {\n            result.add(0 /* CompletionItemKind.Method */);\n        }\n        if (!suggestOptions.showFunctions) {\n            result.add(1 /* CompletionItemKind.Function */);\n        }\n        if (!suggestOptions.showConstructors) {\n            result.add(2 /* CompletionItemKind.Constructor */);\n        }\n        if (!suggestOptions.showFields) {\n            result.add(3 /* CompletionItemKind.Field */);\n        }\n        if (!suggestOptions.showVariables) {\n            result.add(4 /* CompletionItemKind.Variable */);\n        }\n        if (!suggestOptions.showClasses) {\n            result.add(5 /* CompletionItemKind.Class */);\n        }\n        if (!suggestOptions.showStructs) {\n            result.add(6 /* CompletionItemKind.Struct */);\n        }\n        if (!suggestOptions.showInterfaces) {\n            result.add(7 /* CompletionItemKind.Interface */);\n        }\n        if (!suggestOptions.showModules) {\n            result.add(8 /* CompletionItemKind.Module */);\n        }\n        if (!suggestOptions.showProperties) {\n            result.add(9 /* CompletionItemKind.Property */);\n        }\n        if (!suggestOptions.showEvents) {\n            result.add(10 /* CompletionItemKind.Event */);\n        }\n        if (!suggestOptions.showOperators) {\n            result.add(11 /* CompletionItemKind.Operator */);\n        }\n        if (!suggestOptions.showUnits) {\n            result.add(12 /* CompletionItemKind.Unit */);\n        }\n        if (!suggestOptions.showValues) {\n            result.add(13 /* CompletionItemKind.Value */);\n        }\n        if (!suggestOptions.showConstants) {\n            result.add(14 /* CompletionItemKind.Constant */);\n        }\n        if (!suggestOptions.showEnums) {\n            result.add(15 /* CompletionItemKind.Enum */);\n        }\n        if (!suggestOptions.showEnumMembers) {\n            result.add(16 /* CompletionItemKind.EnumMember */);\n        }\n        if (!suggestOptions.showKeywords) {\n            result.add(17 /* CompletionItemKind.Keyword */);\n        }\n        if (!suggestOptions.showWords) {\n            result.add(18 /* CompletionItemKind.Text */);\n        }\n        if (!suggestOptions.showColors) {\n            result.add(19 /* CompletionItemKind.Color */);\n        }\n        if (!suggestOptions.showFiles) {\n            result.add(20 /* CompletionItemKind.File */);\n        }\n        if (!suggestOptions.showReferences) {\n            result.add(21 /* CompletionItemKind.Reference */);\n        }\n        if (!suggestOptions.showColors) {\n            result.add(22 /* CompletionItemKind.Customcolor */);\n        }\n        if (!suggestOptions.showFolders) {\n            result.add(23 /* CompletionItemKind.Folder */);\n        }\n        if (!suggestOptions.showTypeParameters) {\n            result.add(24 /* CompletionItemKind.TypeParameter */);\n        }\n        if (!suggestOptions.showSnippets) {\n            result.add(28 /* CompletionItemKind.Snippet */);\n        }\n        if (!suggestOptions.showUsers) {\n            result.add(25 /* CompletionItemKind.User */);\n        }\n        if (!suggestOptions.showIssues) {\n            result.add(26 /* CompletionItemKind.Issue */);\n        }\n        return { itemKind: result, showDeprecated: suggestOptions.showDeprecated };\n    }\n    _onNewContext(ctx) {\n        if (!this._context) {\n            // happens when 24x7 IntelliSense is enabled and still in its delay\n            return;\n        }\n        if (ctx.lineNumber !== this._context.lineNumber) {\n            // e.g. happens when pressing Enter while IntelliSense is computed\n            this.cancel();\n            return;\n        }\n        if (getLeadingWhitespace(ctx.leadingLineContent) !== getLeadingWhitespace(this._context.leadingLineContent)) {\n            // cancel IntelliSense when line start changes\n            // happens when the current word gets outdented\n            this.cancel();\n            return;\n        }\n        if (ctx.column < this._context.column) {\n            // typed -> moved cursor LEFT -> retrigger if still on a word\n            if (ctx.leadingWord.word) {\n                this.trigger({ auto: this._context.triggerOptions.auto, retrigger: true });\n            }\n            else {\n                this.cancel();\n            }\n            return;\n        }\n        if (!this._completionModel) {\n            // happens when IntelliSense is not yet computed\n            return;\n        }\n        if (ctx.leadingWord.word.length !== 0 && ctx.leadingWord.startColumn > this._context.leadingWord.startColumn) {\n            // started a new word while IntelliSense shows -> retrigger but reuse all items that we currently have\n            const shouldAutoTrigger = LineContext.shouldAutoTrigger(this._editor);\n            if (shouldAutoTrigger && this._context) {\n                // shouldAutoTrigger forces tokenization, which can cause pending cursor change events to be emitted, which can cause\n                // suggestions to be cancelled, which causes `this._context` to be undefined\n                const map = this._completionModel.getItemsByProvider();\n                this.trigger({\n                    auto: this._context.triggerOptions.auto,\n                    retrigger: true,\n                    clipboardText: this._completionModel.clipboardText,\n                    completionOptions: { providerItemsToReuse: map }\n                });\n            }\n            return;\n        }\n        if (ctx.column > this._context.column && this._completionModel.getIncompleteProvider().size > 0 && ctx.leadingWord.word.length !== 0) {\n            // typed -> moved cursor RIGHT & incomple model & still on a word -> retrigger\n            const providerItemsToReuse = new Map();\n            const providerFilter = new Set();\n            for (const [provider, items] of this._completionModel.getItemsByProvider()) {\n                if (items.length > 0 && items[0].container.incomplete) {\n                    providerFilter.add(provider);\n                }\n                else {\n                    providerItemsToReuse.set(provider, items);\n                }\n            }\n            this.trigger({\n                auto: this._context.triggerOptions.auto,\n                triggerKind: 2 /* CompletionTriggerKind.TriggerForIncompleteCompletions */,\n                retrigger: true,\n                clipboardText: this._completionModel.clipboardText,\n                completionOptions: { providerFilter, providerItemsToReuse }\n            });\n        }\n        else {\n            // typed -> moved cursor RIGHT -> update UI\n            const oldLineContext = this._completionModel.lineContext;\n            let isFrozen = false;\n            this._completionModel.lineContext = {\n                leadingLineContent: ctx.leadingLineContent,\n                characterCountDelta: ctx.column - this._context.column\n            };\n            if (this._completionModel.items.length === 0) {\n                const shouldAutoTrigger = LineContext.shouldAutoTrigger(this._editor);\n                if (!this._context) {\n                    // shouldAutoTrigger forces tokenization, which can cause pending cursor change events to be emitted, which can cause\n                    // suggestions to be cancelled, which causes `this._context` to be undefined\n                    this.cancel();\n                    return;\n                }\n                if (shouldAutoTrigger && this._context.leadingWord.endColumn < ctx.leadingWord.startColumn) {\n                    // retrigger when heading into a new word\n                    this.trigger({ auto: this._context.triggerOptions.auto, retrigger: true });\n                    return;\n                }\n                if (!this._context.triggerOptions.auto) {\n                    // freeze when IntelliSense was manually requested\n                    this._completionModel.lineContext = oldLineContext;\n                    isFrozen = this._completionModel.items.length > 0;\n                    if (isFrozen && ctx.leadingWord.word.length === 0) {\n                        // there were results before but now there aren't\n                        // and also we are not on a word anymore -> cancel\n                        this.cancel();\n                        return;\n                    }\n                }\n                else {\n                    // nothing left\n                    this.cancel();\n                    return;\n                }\n            }\n            this._onDidSuggest.fire({\n                completionModel: this._completionModel,\n                triggerOptions: ctx.triggerOptions,\n                isFrozen,\n            });\n        }\n    }\n};\nSuggestModel = SuggestModel_1 = __decorate([\n    __param(1, IEditorWorkerService),\n    __param(2, IClipboardService),\n    __param(3, ITelemetryService),\n    __param(4, ILogService),\n    __param(5, IContextKeyService),\n    __param(6, IConfigurationService),\n    __param(7, ILanguageFeaturesService),\n    __param(8, IEnvironmentService)\n], SuggestModel);\n\nexport { LineContext, SuggestModel };\n","import { DisposableStore } from '../../../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass OvertypingCapturer {\n    static { this._maxSelectionLength = 51200; }\n    constructor(editor, suggestModel) {\n        this._disposables = new DisposableStore();\n        this._lastOvertyped = [];\n        this._locked = false;\n        this._disposables.add(editor.onWillType(() => {\n            if (this._locked || !editor.hasModel()) {\n                return;\n            }\n            const selections = editor.getSelections();\n            const selectionsLength = selections.length;\n            // Check if it will overtype any selections\n            let willOvertype = false;\n            for (let i = 0; i < selectionsLength; i++) {\n                if (!selections[i].isEmpty()) {\n                    willOvertype = true;\n                    break;\n                }\n            }\n            if (!willOvertype) {\n                if (this._lastOvertyped.length !== 0) {\n                    this._lastOvertyped.length = 0;\n                }\n                return;\n            }\n            this._lastOvertyped = [];\n            const model = editor.getModel();\n            for (let i = 0; i < selectionsLength; i++) {\n                const selection = selections[i];\n                // Check for overtyping capturer restrictions\n                if (model.getValueLengthInRange(selection) > OvertypingCapturer._maxSelectionLength) {\n                    return;\n                }\n                this._lastOvertyped[i] = { value: model.getValueInRange(selection), multiline: selection.startLineNumber !== selection.endLineNumber };\n            }\n        }));\n        this._disposables.add(suggestModel.onDidTrigger(e => {\n            this._locked = true;\n        }));\n        this._disposables.add(suggestModel.onDidCancel(e => {\n            this._locked = false;\n        }));\n    }\n    getLastOvertypedInfo(idx) {\n        if (idx >= 0 && idx < this._lastOvertyped.length) {\n            return this._lastOvertyped[idx];\n        }\n        return undefined;\n    }\n    dispose() {\n        this._disposables.dispose();\n    }\n}\n\nexport { OvertypingCapturer };\n","import { append, $ } from '../../../../base/browser/dom.js';\nimport { ActionBar } from '../../../../base/browser/ui/actionbar/actionbar.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { TextOnlyMenuEntryActionViewItem } from '../../../../platform/actions/browser/menuEntryActionViewItem.js';\nimport { IMenuService, MenuItemAction } from '../../../../platform/actions/common/actions.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet SuggestWidgetStatus = class SuggestWidgetStatus {\n    constructor(container, _menuId, instantiationService, _menuService, _contextKeyService) {\n        this._menuId = _menuId;\n        this._menuService = _menuService;\n        this._contextKeyService = _contextKeyService;\n        this._menuDisposables = new DisposableStore();\n        this.element = append(container, $('.suggest-status-bar'));\n        const actionViewItemProvider = (action => {\n            return action instanceof MenuItemAction ? instantiationService.createInstance(TextOnlyMenuEntryActionViewItem, action, { useComma: false }) : undefined;\n        });\n        this._leftActions = new ActionBar(this.element, { actionViewItemProvider });\n        this._rightActions = new ActionBar(this.element, { actionViewItemProvider });\n        this._leftActions.domNode.classList.add('left');\n        this._rightActions.domNode.classList.add('right');\n    }\n    dispose() {\n        this._menuDisposables.dispose();\n        this._leftActions.dispose();\n        this._rightActions.dispose();\n        this.element.remove();\n    }\n    show() {\n        const menu = this._menuService.createMenu(this._menuId, this._contextKeyService);\n        const renderMenu = () => {\n            const left = [];\n            const right = [];\n            for (const [group, actions] of menu.getActions()) {\n                if (group === 'left') {\n                    left.push(...actions);\n                }\n                else {\n                    right.push(...actions);\n                }\n            }\n            this._leftActions.clear();\n            this._leftActions.push(left);\n            this._rightActions.clear();\n            this._rightActions.push(right);\n        };\n        this._menuDisposables.add(menu.onDidChange(() => renderMenu()));\n        this._menuDisposables.add(menu);\n    }\n    hide() {\n        this._menuDisposables.clear();\n    }\n};\nSuggestWidgetStatus = __decorate([\n    __param(2, IInstantiationService),\n    __param(3, IMenuService),\n    __param(4, IContextKeyService)\n], SuggestWidgetStatus);\n\nexport { SuggestWidgetStatus };\n","import { Dimension, $, append, show, clearNode, hide, size, getClientArea } from '../../../../base/browser/dom.js';\nimport { ResizableHTMLElement } from '../../../../base/browser/ui/resizable/resizable.js';\nimport { DomScrollableElement } from '../../../../base/browser/ui/scrollbar/scrollableElement.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { MarkdownString } from '../../../../base/common/htmlContent.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\nimport { localize } from '../../../../nls.js';\nimport { isHighContrast } from '../../../../platform/theme/common/theme.js';\nimport { IThemeService } from '../../../../platform/theme/common/themeService.js';\nimport { IMarkdownRendererService } from '../../../../platform/markdown/browser/markdownRenderer.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nfunction canExpandCompletionItem(item) {\n    return !!item && Boolean(item.completion.documentation || item.completion.detail && item.completion.detail !== item.completion.label);\n}\nlet SuggestDetailsWidget = class SuggestDetailsWidget {\n    constructor(_editor, _themeService, _markdownRendererService) {\n        this._editor = _editor;\n        this._themeService = _themeService;\n        this._markdownRendererService = _markdownRendererService;\n        this._onDidClose = new Emitter();\n        this.onDidClose = this._onDidClose.event;\n        this._onDidChangeContents = new Emitter();\n        this.onDidChangeContents = this._onDidChangeContents.event;\n        this._disposables = new DisposableStore();\n        this._renderDisposeable = new DisposableStore();\n        this._size = new Dimension(330, 0);\n        this.domNode = $('.suggest-details');\n        this.domNode.classList.add('no-docs');\n        this._body = $('.body');\n        this._scrollbar = new DomScrollableElement(this._body, {\n            alwaysConsumeMouseWheel: true,\n        });\n        append(this.domNode, this._scrollbar.getDomNode());\n        this._disposables.add(this._scrollbar);\n        this._header = append(this._body, $('.header'));\n        this._close = append(this._header, $('span' + ThemeIcon.asCSSSelector(Codicon.close)));\n        this._close.title = localize(1490, \"Close\");\n        this._close.role = 'button';\n        this._close.tabIndex = -1;\n        this._type = append(this._header, $('p.type'));\n        this._docs = append(this._body, $('p.docs'));\n        this._configureFont();\n        this._disposables.add(this._editor.onDidChangeConfiguration(e => {\n            if (e.hasChanged(59 /* EditorOption.fontInfo */)) {\n                this._configureFont();\n            }\n        }));\n    }\n    dispose() {\n        this._disposables.dispose();\n        this._renderDisposeable.dispose();\n    }\n    _configureFont() {\n        const options = this._editor.getOptions();\n        const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n        const fontFamily = fontInfo.getMassagedFontFamily();\n        const fontSize = options.get(135 /* EditorOption.suggestFontSize */) || fontInfo.fontSize;\n        const lineHeight = options.get(136 /* EditorOption.suggestLineHeight */) || fontInfo.lineHeight;\n        const fontWeight = fontInfo.fontWeight;\n        const fontSizePx = `${fontSize}px`;\n        const lineHeightPx = `${lineHeight}px`;\n        this.domNode.style.fontSize = fontSizePx;\n        this.domNode.style.lineHeight = `${lineHeight / fontSize}`;\n        this.domNode.style.fontWeight = fontWeight;\n        this.domNode.style.fontFeatureSettings = fontInfo.fontFeatureSettings;\n        this._type.style.fontFamily = fontFamily;\n        this._close.style.height = lineHeightPx;\n        this._close.style.width = lineHeightPx;\n    }\n    getLayoutInfo() {\n        const lineHeight = this._editor.getOption(136 /* EditorOption.suggestLineHeight */) || this._editor.getOption(59 /* EditorOption.fontInfo */).lineHeight;\n        const borderWidth = isHighContrast(this._themeService.getColorTheme().type) ? 2 : 1;\n        const borderHeight = borderWidth * 2;\n        return {\n            lineHeight,\n            borderWidth,\n            borderHeight,\n            verticalPadding: 22,\n            horizontalPadding: 14\n        };\n    }\n    renderLoading() {\n        this._type.textContent = localize(1491, \"Loading...\");\n        this._docs.textContent = '';\n        this.domNode.classList.remove('no-docs', 'no-type');\n        this.layout(this.size.width, this.getLayoutInfo().lineHeight * 2);\n        this._onDidChangeContents.fire(this);\n    }\n    renderItem(item, explainMode) {\n        this._renderDisposeable.clear();\n        let { detail, documentation } = item.completion;\n        if (explainMode) {\n            let md = '';\n            md += `score: ${item.score[0]}\\n`;\n            md += `prefix: ${item.word ?? '(no prefix)'}\\n`;\n            md += `word: ${item.completion.filterText ? item.completion.filterText + ' (filterText)' : item.textLabel}\\n`;\n            md += `distance: ${item.distance} (localityBonus-setting)\\n`;\n            md += `index: ${item.idx}, based on ${item.completion.sortText && `sortText: \"${item.completion.sortText}\"` || 'label'}\\n`;\n            md += `commit_chars: ${item.completion.commitCharacters?.join('')}\\n`;\n            documentation = new MarkdownString().appendCodeblock('empty', md);\n            detail = `Provider: ${item.provider._debugDisplayName}`;\n        }\n        if (!explainMode && !canExpandCompletionItem(item)) {\n            this.clearContents();\n            return;\n        }\n        this.domNode.classList.remove('no-docs', 'no-type');\n        // --- details\n        if (detail) {\n            const cappedDetail = detail.length > 100000 ? `${detail.substr(0, 100000)}…` : detail;\n            this._type.textContent = cappedDetail;\n            this._type.title = cappedDetail;\n            show(this._type);\n            this._type.classList.toggle('auto-wrap', !/\\r?\\n^\\s+/gmi.test(cappedDetail));\n        }\n        else {\n            clearNode(this._type);\n            this._type.title = '';\n            hide(this._type);\n            this.domNode.classList.add('no-type');\n        }\n        // --- documentation\n        clearNode(this._docs);\n        if (typeof documentation === 'string') {\n            this._docs.classList.remove('markdown-docs');\n            this._docs.textContent = documentation;\n        }\n        else if (documentation) {\n            this._docs.classList.add('markdown-docs');\n            clearNode(this._docs);\n            const renderedContents = this._markdownRendererService.render(documentation, {\n                context: this._editor,\n                asyncRenderCallback: () => {\n                    this.layout(this._size.width, this._type.clientHeight + this._docs.clientHeight);\n                    this._onDidChangeContents.fire(this);\n                }\n            });\n            this._docs.appendChild(renderedContents.element);\n            this._renderDisposeable.add(renderedContents);\n        }\n        this.domNode.classList.toggle('detail-and-doc', !!detail && !!documentation);\n        this.domNode.style.userSelect = 'text';\n        this.domNode.tabIndex = -1;\n        this._close.onmousedown = e => {\n            e.preventDefault();\n            e.stopPropagation();\n        };\n        this._close.onclick = e => {\n            e.preventDefault();\n            e.stopPropagation();\n            this._onDidClose.fire();\n        };\n        this._body.scrollTop = 0;\n        this.layout(this._size.width, this._type.clientHeight + this._docs.clientHeight);\n        this._onDidChangeContents.fire(this);\n    }\n    clearContents() {\n        this.domNode.classList.add('no-docs');\n        this._type.textContent = '';\n        this._docs.textContent = '';\n    }\n    get isEmpty() {\n        return this.domNode.classList.contains('no-docs');\n    }\n    get size() {\n        return this._size;\n    }\n    layout(width, height) {\n        const newSize = new Dimension(width, height);\n        if (!Dimension.equals(newSize, this._size)) {\n            this._size = newSize;\n            size(this.domNode, width, height);\n        }\n        this._scrollbar.scanDomNode();\n    }\n    scrollDown(much = 8) {\n        this._body.scrollTop += much;\n    }\n    scrollUp(much = 8) {\n        this._body.scrollTop -= much;\n    }\n    scrollTop() {\n        this._body.scrollTop = 0;\n    }\n    scrollBottom() {\n        this._body.scrollTop = this._body.scrollHeight;\n    }\n    pageDown() {\n        this.scrollDown(80);\n    }\n    pageUp() {\n        this.scrollUp(80);\n    }\n    focus() {\n        this.domNode.focus();\n    }\n};\nSuggestDetailsWidget = __decorate([\n    __param(1, IThemeService),\n    __param(2, IMarkdownRendererService)\n], SuggestDetailsWidget);\nclass SuggestDetailsOverlay {\n    constructor(widget, _editor) {\n        this.widget = widget;\n        this._editor = _editor;\n        this.allowEditorOverflow = true;\n        this._disposables = new DisposableStore();\n        this._added = false;\n        this._preferAlignAtTop = true;\n        this._resizable = new ResizableHTMLElement();\n        this._resizable.domNode.classList.add('suggest-details-container');\n        this._resizable.domNode.appendChild(widget.domNode);\n        this._resizable.enableSashes(false, true, true, false);\n        let topLeftNow;\n        let sizeNow;\n        let deltaTop = 0;\n        let deltaLeft = 0;\n        this._disposables.add(this._resizable.onDidWillResize(() => {\n            topLeftNow = this._topLeft;\n            sizeNow = this._resizable.size;\n        }));\n        this._disposables.add(this._resizable.onDidResize(e => {\n            if (topLeftNow && sizeNow) {\n                this.widget.layout(e.dimension.width, e.dimension.height);\n                let updateTopLeft = false;\n                if (e.west) {\n                    deltaLeft = sizeNow.width - e.dimension.width;\n                    updateTopLeft = true;\n                }\n                if (e.north) {\n                    deltaTop = sizeNow.height - e.dimension.height;\n                    updateTopLeft = true;\n                }\n                if (updateTopLeft) {\n                    this._applyTopLeft({\n                        top: topLeftNow.top + deltaTop,\n                        left: topLeftNow.left + deltaLeft,\n                    });\n                }\n            }\n            if (e.done) {\n                topLeftNow = undefined;\n                sizeNow = undefined;\n                deltaTop = 0;\n                deltaLeft = 0;\n                this._userSize = e.dimension;\n            }\n        }));\n        this._disposables.add(this.widget.onDidChangeContents(() => {\n            if (this._anchorBox) {\n                this._placeAtAnchor(this._anchorBox, this._userSize ?? this.widget.size, this._preferAlignAtTop);\n            }\n        }));\n    }\n    dispose() {\n        this._resizable.dispose();\n        this._disposables.dispose();\n        this.hide();\n    }\n    getId() {\n        return 'suggest.details';\n    }\n    getDomNode() {\n        return this._resizable.domNode;\n    }\n    getPosition() {\n        return this._topLeft ? { preference: this._topLeft } : null;\n    }\n    show() {\n        if (!this._added) {\n            this._editor.addOverlayWidget(this);\n            this._added = true;\n        }\n    }\n    hide(sessionEnded = false) {\n        this._resizable.clearSashHoverState();\n        if (this._added) {\n            this._editor.removeOverlayWidget(this);\n            this._added = false;\n            this._anchorBox = undefined;\n            this._topLeft = undefined;\n        }\n        if (sessionEnded) {\n            this._userSize = undefined;\n            this.widget.clearContents();\n        }\n    }\n    placeAtAnchor(anchor, preferAlignAtTop) {\n        const anchorBox = anchor.getBoundingClientRect();\n        this._anchorBox = anchorBox;\n        this._preferAlignAtTop = preferAlignAtTop;\n        this._placeAtAnchor(this._anchorBox, this._userSize ?? this.widget.size, preferAlignAtTop);\n    }\n    _placeAtAnchor(anchorBox, size, preferAlignAtTop) {\n        const bodyBox = getClientArea(this.getDomNode().ownerDocument.body);\n        const info = this.widget.getLayoutInfo();\n        const defaultMinSize = new Dimension(220, 2 * info.lineHeight);\n        const defaultTop = anchorBox.top;\n        // EAST\n        const eastPlacement = (function () {\n            const width = bodyBox.width - (anchorBox.left + anchorBox.width + info.borderWidth + info.horizontalPadding);\n            const left = -info.borderWidth + anchorBox.left + anchorBox.width;\n            const maxSizeTop = new Dimension(width, bodyBox.height - anchorBox.top - info.borderHeight - info.verticalPadding);\n            const maxSizeBottom = maxSizeTop.with(undefined, anchorBox.top + anchorBox.height - info.borderHeight - info.verticalPadding);\n            return { top: defaultTop, left, fit: width - size.width, maxSizeTop, maxSizeBottom, minSize: defaultMinSize.with(Math.min(width, defaultMinSize.width)) };\n        })();\n        // WEST\n        const westPlacement = (function () {\n            const width = anchorBox.left - info.borderWidth - info.horizontalPadding;\n            const left = Math.max(info.horizontalPadding, anchorBox.left - size.width - info.borderWidth);\n            const maxSizeTop = new Dimension(width, bodyBox.height - anchorBox.top - info.borderHeight - info.verticalPadding);\n            const maxSizeBottom = maxSizeTop.with(undefined, anchorBox.top + anchorBox.height - info.borderHeight - info.verticalPadding);\n            return { top: defaultTop, left, fit: width - size.width, maxSizeTop, maxSizeBottom, minSize: defaultMinSize.with(Math.min(width, defaultMinSize.width)) };\n        })();\n        // SOUTH\n        const southPacement = (function () {\n            const left = anchorBox.left;\n            const top = -info.borderWidth + anchorBox.top + anchorBox.height;\n            const maxSizeBottom = new Dimension(anchorBox.width - info.borderHeight, bodyBox.height - anchorBox.top - anchorBox.height - info.verticalPadding);\n            return { top, left, fit: maxSizeBottom.height - size.height, maxSizeBottom, maxSizeTop: maxSizeBottom, minSize: defaultMinSize.with(maxSizeBottom.width) };\n        })();\n        // take first placement that fits or the first with \"least bad\" fit\n        const placements = [eastPlacement, westPlacement, southPacement];\n        const placement = placements.find(p => p.fit >= 0) ?? placements.sort((a, b) => b.fit - a.fit)[0];\n        // top/bottom placement\n        const bottom = anchorBox.top + anchorBox.height - info.borderHeight;\n        let alignAtTop;\n        let height = size.height;\n        const maxHeight = Math.max(placement.maxSizeTop.height, placement.maxSizeBottom.height);\n        if (height > maxHeight) {\n            height = maxHeight;\n        }\n        let maxSize;\n        if (preferAlignAtTop) {\n            if (height <= placement.maxSizeTop.height) {\n                alignAtTop = true;\n                maxSize = placement.maxSizeTop;\n            }\n            else {\n                alignAtTop = false;\n                maxSize = placement.maxSizeBottom;\n            }\n        }\n        else {\n            if (height <= placement.maxSizeBottom.height) {\n                alignAtTop = false;\n                maxSize = placement.maxSizeBottom;\n            }\n            else {\n                alignAtTop = true;\n                maxSize = placement.maxSizeTop;\n            }\n        }\n        let { top, left } = placement;\n        if (!alignAtTop && height > anchorBox.height) {\n            top = bottom - height;\n        }\n        const editorDomNode = this._editor.getDomNode();\n        if (editorDomNode) {\n            // get bounding rectangle of the suggest widget relative to the editor\n            const editorBoundingBox = editorDomNode.getBoundingClientRect();\n            top -= editorBoundingBox.top;\n            left -= editorBoundingBox.left;\n        }\n        this._applyTopLeft({ left, top });\n        this._resizable.enableSashes(!alignAtTop, placement === eastPlacement, alignAtTop, placement !== eastPlacement);\n        this._resizable.minSize = placement.minSize;\n        this._resizable.maxSize = maxSize;\n        this._resizable.layout(height, Math.min(maxSize.width, size.width));\n        this.widget.layout(this._resizable.size.width, this._resizable.size.height);\n    }\n    _applyTopLeft(topLeft) {\n        this._topLeft = topLeft;\n        this._editor.layoutOverlayWidget(this);\n    }\n}\n\nexport { SuggestDetailsOverlay, SuggestDetailsWidget, canExpandCompletionItem };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\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//#region file service & providers\nconst IFileService = createDecorator('fileService');\n//#endregion\n//#region Utilities\nvar FileKind;\n(function (FileKind) {\n    FileKind[FileKind[\"FILE\"] = 0] = \"FILE\";\n    FileKind[FileKind[\"FOLDER\"] = 1] = \"FOLDER\";\n    FileKind[FileKind[\"ROOT_FOLDER\"] = 2] = \"ROOT_FOLDER\";\n})(FileKind || (FileKind = {}));\n//#endregion\n\nexport { FileKind, IFileService };\n","import { Schemas } from '../../../base/common/network.js';\nimport { DataUri } from '../../../base/common/resources.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { PLAINTEXT_LANGUAGE_ID } from '../languages/modesRegistry.js';\nimport { FileKind } from '../../../platform/files/common/files.js';\nimport { ThemeIcon } from '../../../base/common/themables.js';\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 *--------------------------------------------------------------------------------------------*/\nconst fileIconDirectoryRegex = /(?:\\/|^)(?:([^\\/]+)\\/)?([^\\/]+)$/;\nfunction getIconClasses(modelService, languageService, resource, fileKind, icon) {\n    if (ThemeIcon.isThemeIcon(icon)) {\n        return [`codicon-${icon.id}`, 'predefined-file-icon'];\n    }\n    if (URI.isUri(icon)) {\n        return [];\n    }\n    // we always set these base classes even if we do not have a path\n    const classes = fileKind === FileKind.ROOT_FOLDER ? ['rootfolder-icon'] : fileKind === FileKind.FOLDER ? ['folder-icon'] : ['file-icon'];\n    if (resource) {\n        // Get the path and name of the resource. For data-URIs, we need to parse specially\n        let name;\n        if (resource.scheme === Schemas.data) {\n            const metadata = DataUri.parseMetaData(resource);\n            name = metadata.get(DataUri.META_DATA_LABEL);\n        }\n        else {\n            const match = resource.path.match(fileIconDirectoryRegex);\n            if (match) {\n                name = fileIconSelectorEscape(match[2].toLowerCase());\n                if (match[1]) {\n                    classes.push(`${fileIconSelectorEscape(match[1].toLowerCase())}-name-dir-icon`); // parent directory\n                }\n            }\n            else {\n                name = fileIconSelectorEscape(resource.authority.toLowerCase());\n            }\n        }\n        // Root Folders\n        if (fileKind === FileKind.ROOT_FOLDER) {\n            classes.push(`${name}-root-name-folder-icon`);\n        }\n        // Folders\n        else if (fileKind === FileKind.FOLDER) {\n            classes.push(`${name}-name-folder-icon`);\n        }\n        // Files\n        else {\n            // Name & Extension(s)\n            if (name) {\n                classes.push(`${name}-name-file-icon`);\n                classes.push(`name-file-icon`); // extra segment to increase file-name score\n                // Avoid doing an explosive combination of extensions for very long filenames\n                // (most file systems do not allow files > 255 length) with lots of `.` characters\n                // https://github.com/microsoft/vscode/issues/116199\n                if (name.length <= 255) {\n                    const dotSegments = name.split('.');\n                    for (let i = 1; i < dotSegments.length; i++) {\n                        classes.push(`${dotSegments.slice(i).join('.')}-ext-file-icon`); // add each combination of all found extensions if more than one\n                    }\n                }\n                classes.push(`ext-file-icon`); // extra segment to increase file-ext score\n            }\n            // Detected Mode\n            const detectedLanguageId = detectLanguageId(modelService, languageService, resource);\n            if (detectedLanguageId) {\n                classes.push(`${fileIconSelectorEscape(detectedLanguageId)}-lang-file-icon`);\n            }\n        }\n    }\n    return classes;\n}\nfunction detectLanguageId(modelService, languageService, resource) {\n    if (!resource) {\n        return null; // we need a resource at least\n    }\n    let languageId = null;\n    // Data URI: check for encoded metadata\n    if (resource.scheme === Schemas.data) {\n        const metadata = DataUri.parseMetaData(resource);\n        const mime = metadata.get(DataUri.META_DATA_MIME);\n        if (mime) {\n            languageId = languageService.getLanguageIdByMimeType(mime);\n        }\n    }\n    // Any other URI: check for model if existing\n    else {\n        const model = modelService.getModel(resource);\n        if (model) {\n            languageId = model.getLanguageId();\n        }\n    }\n    // only take if the language id is specific (aka no just plain text)\n    if (languageId && languageId !== PLAINTEXT_LANGUAGE_ID) {\n        return languageId;\n    }\n    // otherwise fallback to path based detection\n    return languageService.guessLanguageIdByFilepathOrFirstLine(resource);\n}\nfunction fileIconSelectorEscape(str) {\n    return str.replace(/[\\s]/g, '/'); // HTML class names can not contain certain whitespace characters (https://dom.spec.whatwg.org/#interface-domtokenlist), use / instead, which doesn't exist in file names.\n}\n\nexport { fileIconSelectorEscape, getIconClasses };\n","import { append, $, show, hide } from '../../../../base/browser/dom.js';\nimport { IconLabel } from '../../../../base/browser/ui/iconLabel/iconLabel.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { createMatches } from '../../../../base/common/filters.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { CompletionItemKinds } from '../../../common/languages.js';\nimport { getIconClasses } from '../../../common/services/getIconClasses.js';\nimport { IModelService } from '../../../common/services/model.js';\nimport { ILanguageService } from '../../../common/languages/language.js';\nimport { localize } from '../../../../nls.js';\nimport { FileKind } from '../../../../platform/files/common/files.js';\nimport { registerIcon } from '../../../../platform/theme/common/iconRegistry.js';\nimport { IThemeService } from '../../../../platform/theme/common/themeService.js';\nimport { canExpandCompletionItem } from './suggestWidgetDetails.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst suggestMoreInfoIcon = registerIcon('suggest-more-info', Codicon.chevronRight, localize(1492, 'Icon for more information in the suggest widget.'));\nconst _completionItemColor = new class ColorExtractor {\n    static { this._regexRelaxed = /(#([\\da-fA-F]{3}){1,2}|(rgb|hsl)a\\(\\s*(\\d{1,3}%?\\s*,\\s*){3}(1|0?\\.\\d+)\\)|(rgb|hsl)\\(\\s*\\d{1,3}%?(\\s*,\\s*\\d{1,3}%?){2}\\s*\\))/; }\n    static { this._regexStrict = new RegExp(`^${ColorExtractor._regexRelaxed.source}$`, 'i'); }\n    extract(item, out) {\n        if (item.textLabel.match(ColorExtractor._regexStrict)) {\n            out[0] = item.textLabel;\n            return true;\n        }\n        if (item.completion.detail && item.completion.detail.match(ColorExtractor._regexStrict)) {\n            out[0] = item.completion.detail;\n            return true;\n        }\n        if (item.completion.documentation) {\n            const value = typeof item.completion.documentation === 'string'\n                ? item.completion.documentation\n                : item.completion.documentation.value;\n            const match = ColorExtractor._regexRelaxed.exec(value);\n            if (match && (match.index === 0 || match.index + match[0].length === value.length)) {\n                out[0] = match[0];\n                return true;\n            }\n        }\n        return false;\n    }\n};\nlet ItemRenderer = class ItemRenderer {\n    constructor(_editor, _modelService, _languageService, _themeService) {\n        this._editor = _editor;\n        this._modelService = _modelService;\n        this._languageService = _languageService;\n        this._themeService = _themeService;\n        this._onDidToggleDetails = new Emitter();\n        this.onDidToggleDetails = this._onDidToggleDetails.event;\n        this.templateId = 'suggestion';\n    }\n    dispose() {\n        this._onDidToggleDetails.dispose();\n    }\n    renderTemplate(container) {\n        const disposables = new DisposableStore();\n        const root = container;\n        root.classList.add('show-file-icons');\n        const icon = append(container, $('.icon'));\n        const colorspan = append(icon, $('span.colorspan'));\n        const text = append(container, $('.contents'));\n        const main = append(text, $('.main'));\n        const iconContainer = append(main, $('.icon-label.codicon'));\n        const left = append(main, $('span.left'));\n        const right = append(main, $('span.right'));\n        const iconLabel = new IconLabel(left, { supportHighlights: true, supportIcons: true });\n        disposables.add(iconLabel);\n        const parametersLabel = append(left, $('span.signature-label'));\n        const qualifierLabel = append(left, $('span.qualifier-label'));\n        const detailsLabel = append(right, $('span.details-label'));\n        const readMore = append(right, $('span.readMore' + ThemeIcon.asCSSSelector(suggestMoreInfoIcon)));\n        readMore.title = localize(1493, \"Read More\");\n        const configureFont = () => {\n            const options = this._editor.getOptions();\n            const fontInfo = options.get(59 /* EditorOption.fontInfo */);\n            const fontFamily = fontInfo.getMassagedFontFamily();\n            const fontFeatureSettings = fontInfo.fontFeatureSettings;\n            const fontVariationSettings = fontInfo.fontVariationSettings;\n            const fontSize = options.get(135 /* EditorOption.suggestFontSize */) || fontInfo.fontSize;\n            const lineHeight = options.get(136 /* EditorOption.suggestLineHeight */) || fontInfo.lineHeight;\n            const fontWeight = fontInfo.fontWeight;\n            const letterSpacing = fontInfo.letterSpacing;\n            const fontSizePx = `${fontSize}px`;\n            const lineHeightPx = `${lineHeight}px`;\n            const letterSpacingPx = `${letterSpacing}px`;\n            root.style.fontSize = fontSizePx;\n            root.style.fontWeight = fontWeight;\n            root.style.letterSpacing = letterSpacingPx;\n            main.style.fontFamily = fontFamily;\n            main.style.fontFeatureSettings = fontFeatureSettings;\n            main.style.fontVariationSettings = fontVariationSettings;\n            main.style.lineHeight = lineHeightPx;\n            icon.style.height = lineHeightPx;\n            icon.style.width = lineHeightPx;\n            readMore.style.height = lineHeightPx;\n            readMore.style.width = lineHeightPx;\n        };\n        return { root, left, right, icon, colorspan, iconLabel, iconContainer, parametersLabel, qualifierLabel, detailsLabel, readMore, disposables, configureFont };\n    }\n    renderElement(element, index, data) {\n        data.configureFont();\n        const { completion } = element;\n        data.colorspan.style.backgroundColor = '';\n        const labelOptions = {\n            labelEscapeNewLines: true,\n            matches: createMatches(element.score)\n        };\n        const color = [];\n        if (completion.kind === 19 /* CompletionItemKind.Color */ && _completionItemColor.extract(element, color)) {\n            // special logic for 'color' completion items\n            data.icon.className = 'icon customcolor';\n            data.iconContainer.className = 'icon hide';\n            data.colorspan.style.backgroundColor = color[0];\n        }\n        else if (completion.kind === 20 /* CompletionItemKind.File */ && this._themeService.getFileIconTheme().hasFileIcons) {\n            // special logic for 'file' completion items\n            data.icon.className = 'icon hide';\n            data.iconContainer.className = 'icon hide';\n            const labelClasses = getIconClasses(this._modelService, this._languageService, URI.from({ scheme: 'fake', path: element.textLabel }), FileKind.FILE);\n            const detailClasses = getIconClasses(this._modelService, this._languageService, URI.from({ scheme: 'fake', path: completion.detail }), FileKind.FILE);\n            labelOptions.extraClasses = labelClasses.length > detailClasses.length ? labelClasses : detailClasses;\n        }\n        else if (completion.kind === 23 /* CompletionItemKind.Folder */ && this._themeService.getFileIconTheme().hasFolderIcons) {\n            // special logic for 'folder' completion items\n            data.icon.className = 'icon hide';\n            data.iconContainer.className = 'icon hide';\n            labelOptions.extraClasses = [\n                getIconClasses(this._modelService, this._languageService, URI.from({ scheme: 'fake', path: element.textLabel }), FileKind.FOLDER),\n                getIconClasses(this._modelService, this._languageService, URI.from({ scheme: 'fake', path: completion.detail }), FileKind.FOLDER)\n            ].flat();\n        }\n        else {\n            // normal icon\n            data.icon.className = 'icon hide';\n            data.iconContainer.className = '';\n            data.iconContainer.classList.add('suggest-icon', ...ThemeIcon.asClassNameArray(CompletionItemKinds.toIcon(completion.kind)));\n        }\n        if (completion.tags && completion.tags.indexOf(1 /* CompletionItemTag.Deprecated */) >= 0) {\n            labelOptions.extraClasses = (labelOptions.extraClasses || []).concat(['deprecated']);\n            labelOptions.matches = [];\n        }\n        data.iconLabel.setLabel(element.textLabel, undefined, labelOptions);\n        if (typeof completion.label === 'string') {\n            data.parametersLabel.textContent = '';\n            data.detailsLabel.textContent = stripNewLines(completion.detail || '');\n            data.root.classList.add('string-label');\n        }\n        else {\n            data.parametersLabel.textContent = stripNewLines(completion.label.detail || '');\n            data.detailsLabel.textContent = stripNewLines(completion.label.description || '');\n            data.root.classList.remove('string-label');\n        }\n        if (this._editor.getOption(134 /* EditorOption.suggest */).showInlineDetails) {\n            show(data.detailsLabel);\n        }\n        else {\n            hide(data.detailsLabel);\n        }\n        if (canExpandCompletionItem(element)) {\n            data.right.classList.add('can-expand-details');\n            show(data.readMore);\n            data.readMore.onmousedown = e => {\n                e.stopPropagation();\n                e.preventDefault();\n            };\n            data.readMore.onclick = e => {\n                e.stopPropagation();\n                e.preventDefault();\n                this._onDidToggleDetails.fire();\n            };\n        }\n        else {\n            data.right.classList.remove('can-expand-details');\n            hide(data.readMore);\n            data.readMore.onmousedown = null;\n            data.readMore.onclick = null;\n        }\n    }\n    disposeTemplate(templateData) {\n        templateData.disposables.dispose();\n    }\n};\nItemRenderer = __decorate([\n    __param(1, IModelService),\n    __param(2, ILanguageService),\n    __param(3, IThemeService)\n], ItemRenderer);\nfunction stripNewLines(str) {\n    return str.replace(/\\r\\n|\\r|\\n/g, '');\n}\n\nexport { ItemRenderer };\n","import { Dimension, append, $, addStandardDisposableListener, hide, show, runAtThisOrScheduleAtNextAnimationFrame, getWindow, getClientArea, getDomNodePagePosition } from '../../../../base/browser/dom.js';\nimport '../../../../base/browser/ui/codicons/codicon/codicon.css';\nimport '../../../../base/browser/ui/codicons/codicon/codicon-modifiers.css';\nimport { List } from '../../../../base/browser/ui/list/listWidget.js';\nimport { TimeoutTimer, createCancelablePromise, disposableTimeout } from '../../../../base/common/async.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { PauseableEmitter, Emitter } from '../../../../base/common/event.js';\nimport { MutableDisposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { clamp } from '../../../../base/common/numbers.js';\nimport { format } from '../../../../base/common/strings.js';\nimport './media/suggest.css';\nimport { EmbeddedCodeEditorWidget } from '../../../browser/widget/codeEditor/embeddedCodeEditorWidget.js';\nimport { SuggestWidgetStatus } from './suggestWidgetStatus.js';\nimport '../../symbolIcons/browser/symbolIcons.js';\nimport { localize } from '../../../../nls.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IStorageService } from '../../../../platform/storage/common/storage.js';\nimport { registerColor, transparent } from '../../../../platform/theme/common/colorUtils.js';\nimport { activeContrastBorder } from '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorWidgetBackground, editorWidgetBorder, editorForeground } from '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport { listHighlightForeground, listFocusHighlightForeground } from '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport { quickInputListFocusForeground, quickInputListFocusIconForeground, quickInputListFocusBackground } from '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { IThemeService } from '../../../../platform/theme/common/themeService.js';\nimport { ResizableHTMLElement } from '../../../../base/browser/ui/resizable/resizable.js';\nimport { suggestWidgetStatusbarMenu, Context } from './suggest.js';\nimport { SuggestDetailsWidget, SuggestDetailsOverlay, canExpandCompletionItem } from './suggestWidgetDetails.js';\nimport { ItemRenderer } from './suggestWidgetRenderer.js';\nimport { getListStyles } from '../../../../platform/theme/browser/defaultStyles.js';\nimport { status } from '../../../../base/browser/ui/aria/aria.js';\nimport { CompletionItemKinds } from '../../../common/languages.js';\nimport { isWindows } from '../../../../base/common/platform.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar SuggestWidget_1;\n/**\n * Suggest widget colors\n */\nregisterColor('editorSuggestWidget.background', editorWidgetBackground, localize(1473, 'Background color of the suggest widget.'));\nregisterColor('editorSuggestWidget.border', editorWidgetBorder, localize(1474, 'Border color of the suggest widget.'));\nconst editorSuggestWidgetForeground = registerColor('editorSuggestWidget.foreground', editorForeground, localize(1475, 'Foreground color of the suggest widget.'));\nregisterColor('editorSuggestWidget.selectedForeground', quickInputListFocusForeground, localize(1476, 'Foreground color of the selected entry in the suggest widget.'));\nregisterColor('editorSuggestWidget.selectedIconForeground', quickInputListFocusIconForeground, localize(1477, 'Icon foreground color of the selected entry in the suggest widget.'));\nconst editorSuggestWidgetSelectedBackground = registerColor('editorSuggestWidget.selectedBackground', quickInputListFocusBackground, localize(1478, 'Background color of the selected entry in the suggest widget.'));\nregisterColor('editorSuggestWidget.highlightForeground', listHighlightForeground, localize(1479, 'Color of the match highlights in the suggest widget.'));\nregisterColor('editorSuggestWidget.focusHighlightForeground', listFocusHighlightForeground, localize(1480, 'Color of the match highlights in the suggest widget when an item is focused.'));\nregisterColor('editorSuggestWidgetStatus.foreground', transparent(editorSuggestWidgetForeground, .5), localize(1481, 'Foreground color of the suggest widget status.'));\nclass PersistedWidgetSize {\n    constructor(_service, editor) {\n        this._service = _service;\n        this._key = `suggestWidget.size/${editor.getEditorType()}/${editor instanceof EmbeddedCodeEditorWidget}`;\n    }\n    restore() {\n        const raw = this._service.get(this._key, 0 /* StorageScope.PROFILE */) ?? '';\n        try {\n            const obj = JSON.parse(raw);\n            if (Dimension.is(obj)) {\n                return Dimension.lift(obj);\n            }\n        }\n        catch {\n            // ignore\n        }\n        return undefined;\n    }\n    store(size) {\n        this._service.store(this._key, JSON.stringify(size), 0 /* StorageScope.PROFILE */, 1 /* StorageTarget.MACHINE */);\n    }\n    reset() {\n        this._service.remove(this._key, 0 /* StorageScope.PROFILE */);\n    }\n}\nlet SuggestWidget = class SuggestWidget {\n    static { SuggestWidget_1 = this; }\n    static { this.LOADING_MESSAGE = localize(1482, \"Loading...\"); }\n    static { this.NO_SUGGESTIONS_MESSAGE = localize(1483, \"No suggestions.\"); }\n    constructor(editor, _storageService, _contextKeyService, _themeService, instantiationService) {\n        this.editor = editor;\n        this._storageService = _storageService;\n        this._state = 0 /* State.Hidden */;\n        this._isAuto = false;\n        this._pendingLayout = new MutableDisposable();\n        this._pendingShowDetails = new MutableDisposable();\n        this._ignoreFocusEvents = false;\n        this._forceRenderingAbove = false;\n        this._explainMode = false;\n        this._showTimeout = new TimeoutTimer();\n        this._disposables = new DisposableStore();\n        this._onDidSelect = new PauseableEmitter();\n        this._onDidFocus = new PauseableEmitter();\n        this._onDidHide = new Emitter();\n        this._onDidShow = new Emitter();\n        this.onDidSelect = this._onDidSelect.event;\n        this.onDidFocus = this._onDidFocus.event;\n        this.onDidHide = this._onDidHide.event;\n        this.onDidShow = this._onDidShow.event;\n        this._onDetailsKeydown = new Emitter();\n        this.onDetailsKeyDown = this._onDetailsKeydown.event;\n        this.element = new ResizableHTMLElement();\n        this.element.domNode.classList.add('editor-widget', 'suggest-widget');\n        this._contentWidget = new SuggestContentWidget(this, editor);\n        this._persistedSize = new PersistedWidgetSize(_storageService, editor);\n        class ResizeState {\n            constructor(persistedSize, currentSize, persistHeight = false, persistWidth = false) {\n                this.persistedSize = persistedSize;\n                this.currentSize = currentSize;\n                this.persistHeight = persistHeight;\n                this.persistWidth = persistWidth;\n            }\n        }\n        let state;\n        this._disposables.add(this.element.onDidWillResize(() => {\n            this._contentWidget.lockPreference();\n            state = new ResizeState(this._persistedSize.restore(), this.element.size);\n        }));\n        this._disposables.add(this.element.onDidResize(e => {\n            this._resize(e.dimension.width, e.dimension.height);\n            if (state) {\n                state.persistHeight = state.persistHeight || !!e.north || !!e.south;\n                state.persistWidth = state.persistWidth || !!e.east || !!e.west;\n            }\n            if (!e.done) {\n                return;\n            }\n            if (state) {\n                // only store width or height value that have changed and also\n                // only store changes that are above a certain threshold\n                const { itemHeight, defaultSize } = this.getLayoutInfo();\n                const threshold = Math.round(itemHeight / 2);\n                let { width, height } = this.element.size;\n                if (!state.persistHeight || Math.abs(state.currentSize.height - height) <= threshold) {\n                    height = state.persistedSize?.height ?? defaultSize.height;\n                }\n                if (!state.persistWidth || Math.abs(state.currentSize.width - width) <= threshold) {\n                    width = state.persistedSize?.width ?? defaultSize.width;\n                }\n                this._persistedSize.store(new Dimension(width, height));\n            }\n            // reset working state\n            this._contentWidget.unlockPreference();\n            state = undefined;\n        }));\n        this._messageElement = append(this.element.domNode, $('.message'));\n        this._listElement = append(this.element.domNode, $('.tree'));\n        const details = this._disposables.add(instantiationService.createInstance(SuggestDetailsWidget, this.editor));\n        details.onDidClose(() => this.toggleDetails(), this, this._disposables);\n        this._details = new SuggestDetailsOverlay(details, this.editor);\n        const applyIconStyle = () => this.element.domNode.classList.toggle('no-icons', !this.editor.getOption(134 /* EditorOption.suggest */).showIcons);\n        applyIconStyle();\n        const renderer = instantiationService.createInstance(ItemRenderer, this.editor);\n        this._disposables.add(renderer);\n        this._disposables.add(renderer.onDidToggleDetails(() => this.toggleDetails()));\n        this._list = new List('SuggestWidget', this._listElement, {\n            getHeight: (_element) => this.getLayoutInfo().itemHeight,\n            getTemplateId: (_element) => 'suggestion'\n        }, [renderer], {\n            alwaysConsumeMouseWheel: true,\n            useShadows: false,\n            mouseSupport: false,\n            multipleSelectionSupport: false,\n            accessibilityProvider: {\n                getRole: () => isWindows ? 'listitem' : 'option',\n                getWidgetAriaLabel: () => localize(1484, \"Suggest\"),\n                getWidgetRole: () => 'listbox',\n                getAriaLabel: (item) => {\n                    let label = item.textLabel;\n                    const kindLabel = CompletionItemKinds.toLabel(item.completion.kind);\n                    if (typeof item.completion.label !== 'string') {\n                        const { detail, description } = item.completion.label;\n                        if (detail && description) {\n                            label = localize(1485, '{0} {1}, {2}, {3}', label, detail, description, kindLabel);\n                        }\n                        else if (detail) {\n                            label = localize(1486, '{0} {1}, {2}', label, detail, kindLabel);\n                        }\n                        else if (description) {\n                            label = localize(1487, '{0}, {1}, {2}', label, description, kindLabel);\n                        }\n                    }\n                    else {\n                        label = localize(1488, '{0}, {1}', label, kindLabel);\n                    }\n                    if (!item.isResolved || !this._isDetailsVisible()) {\n                        return label;\n                    }\n                    const { documentation, detail } = item.completion;\n                    const docs = format('{0}{1}', detail || '', documentation ? (typeof documentation === 'string' ? documentation : documentation.value) : '');\n                    return localize(1489, \"{0}, docs: {1}\", label, docs);\n                },\n            }\n        });\n        this._list.style(getListStyles({\n            listInactiveFocusBackground: editorSuggestWidgetSelectedBackground,\n            listInactiveFocusOutline: activeContrastBorder\n        }));\n        this._status = instantiationService.createInstance(SuggestWidgetStatus, this.element.domNode, suggestWidgetStatusbarMenu);\n        const applyStatusBarStyle = () => this.element.domNode.classList.toggle('with-status-bar', this.editor.getOption(134 /* EditorOption.suggest */).showStatusBar);\n        applyStatusBarStyle();\n        this._disposables.add(this._list.onMouseDown(e => this._onListMouseDownOrTap(e)));\n        this._disposables.add(this._list.onTap(e => this._onListMouseDownOrTap(e)));\n        this._disposables.add(this._list.onDidChangeSelection(e => this._onListSelection(e)));\n        this._disposables.add(this._list.onDidChangeFocus(e => this._onListFocus(e)));\n        this._disposables.add(this.editor.onDidChangeCursorSelection(() => this._onCursorSelectionChanged()));\n        this._disposables.add(this.editor.onDidChangeConfiguration(e => {\n            if (e.hasChanged(134 /* EditorOption.suggest */)) {\n                applyStatusBarStyle();\n                applyIconStyle();\n            }\n            if (this._completionModel && (e.hasChanged(59 /* EditorOption.fontInfo */) || e.hasChanged(135 /* EditorOption.suggestFontSize */) || e.hasChanged(136 /* EditorOption.suggestLineHeight */))) {\n                this._list.splice(0, this._list.length, this._completionModel.items);\n            }\n        }));\n        this._ctxSuggestWidgetVisible = Context.Visible.bindTo(_contextKeyService);\n        this._ctxSuggestWidgetDetailsVisible = Context.DetailsVisible.bindTo(_contextKeyService);\n        this._ctxSuggestWidgetMultipleSuggestions = Context.MultipleSuggestions.bindTo(_contextKeyService);\n        this._ctxSuggestWidgetHasFocusedSuggestion = Context.HasFocusedSuggestion.bindTo(_contextKeyService);\n        this._disposables.add(addStandardDisposableListener(this._details.widget.domNode, 'keydown', e => {\n            this._onDetailsKeydown.fire(e);\n        }));\n        this._disposables.add(this.editor.onMouseDown((e) => this._onEditorMouseDown(e)));\n    }\n    dispose() {\n        this._details.widget.dispose();\n        this._details.dispose();\n        this._list.dispose();\n        this._status.dispose();\n        this._disposables.dispose();\n        this._loadingTimeout?.dispose();\n        this._pendingLayout.dispose();\n        this._pendingShowDetails.dispose();\n        this._showTimeout.dispose();\n        this._contentWidget.dispose();\n        this.element.dispose();\n    }\n    _onEditorMouseDown(mouseEvent) {\n        if (this._details.widget.domNode.contains(mouseEvent.target.element)) {\n            // Clicking inside details\n            this._details.widget.domNode.focus();\n        }\n        else {\n            // Clicking outside details and inside suggest\n            if (this.element.domNode.contains(mouseEvent.target.element)) {\n                this.editor.focus();\n            }\n        }\n    }\n    _onCursorSelectionChanged() {\n        if (this._state !== 0 /* State.Hidden */) {\n            this._contentWidget.layout();\n        }\n    }\n    _onListMouseDownOrTap(e) {\n        if (typeof e.element === 'undefined' || typeof e.index === 'undefined') {\n            return;\n        }\n        // prevent stealing browser focus from the editor\n        e.browserEvent.preventDefault();\n        e.browserEvent.stopPropagation();\n        this._select(e.element, e.index);\n    }\n    _onListSelection(e) {\n        if (e.elements.length) {\n            this._select(e.elements[0], e.indexes[0]);\n        }\n    }\n    _select(item, index) {\n        const completionModel = this._completionModel;\n        if (completionModel) {\n            this._onDidSelect.fire({ item, index, model: completionModel });\n            this.editor.focus();\n        }\n    }\n    _onListFocus(e) {\n        if (this._ignoreFocusEvents) {\n            return;\n        }\n        if (this._state === 5 /* State.Details */) {\n            // This can happen when focus is in the details-panel and when\n            // arrow keys are pressed to select next/prev items\n            this._setState(3 /* State.Open */);\n        }\n        if (!e.elements.length) {\n            if (this._currentSuggestionDetails) {\n                this._currentSuggestionDetails.cancel();\n                this._currentSuggestionDetails = undefined;\n                this._focusedItem = undefined;\n            }\n            this.editor.setAriaOptions({ activeDescendant: undefined });\n            this._ctxSuggestWidgetHasFocusedSuggestion.set(false);\n            return;\n        }\n        if (!this._completionModel) {\n            return;\n        }\n        this._ctxSuggestWidgetHasFocusedSuggestion.set(true);\n        const item = e.elements[0];\n        const index = e.indexes[0];\n        if (item !== this._focusedItem) {\n            this._currentSuggestionDetails?.cancel();\n            this._currentSuggestionDetails = undefined;\n            this._focusedItem = item;\n            this._list.reveal(index);\n            this._currentSuggestionDetails = createCancelablePromise(async (token) => {\n                const loading = disposableTimeout(() => {\n                    if (this._isDetailsVisible()) {\n                        this._showDetails(true, false);\n                    }\n                }, 250);\n                const sub = token.onCancellationRequested(() => loading.dispose());\n                try {\n                    return await item.resolve(token);\n                }\n                finally {\n                    loading.dispose();\n                    sub.dispose();\n                }\n            });\n            this._currentSuggestionDetails.then(() => {\n                if (index >= this._list.length || item !== this._list.element(index)) {\n                    return;\n                }\n                // item can have extra information, so re-render\n                this._ignoreFocusEvents = true;\n                this._list.splice(index, 1, [item]);\n                this._list.setFocus([index]);\n                this._ignoreFocusEvents = false;\n                if (this._isDetailsVisible()) {\n                    this._showDetails(false, false);\n                }\n                else {\n                    this.element.domNode.classList.remove('docs-side');\n                }\n                this.editor.setAriaOptions({ activeDescendant: this._list.getElementID(index) });\n            }).catch(onUnexpectedError);\n        }\n        // emit an event\n        this._onDidFocus.fire({ item, index, model: this._completionModel });\n    }\n    _setState(state) {\n        if (this._state === state) {\n            return;\n        }\n        this._state = state;\n        this.element.domNode.classList.toggle('frozen', state === 4 /* State.Frozen */);\n        this.element.domNode.classList.remove('message');\n        switch (state) {\n            case 0 /* State.Hidden */:\n                hide(this._messageElement, this._listElement, this._status.element);\n                this._details.hide(true);\n                this._status.hide();\n                this._contentWidget.hide();\n                this._ctxSuggestWidgetVisible.reset();\n                this._ctxSuggestWidgetMultipleSuggestions.reset();\n                this._ctxSuggestWidgetHasFocusedSuggestion.reset();\n                this._showTimeout.cancel();\n                this.element.domNode.classList.remove('visible');\n                this._list.splice(0, this._list.length);\n                this._focusedItem = undefined;\n                this._cappedHeight = undefined;\n                this._explainMode = false;\n                break;\n            case 1 /* State.Loading */:\n                this.element.domNode.classList.add('message');\n                this._messageElement.textContent = SuggestWidget_1.LOADING_MESSAGE;\n                hide(this._listElement, this._status.element);\n                show(this._messageElement);\n                this._details.hide();\n                this._show();\n                this._focusedItem = undefined;\n                status(SuggestWidget_1.LOADING_MESSAGE);\n                break;\n            case 2 /* State.Empty */:\n                this.element.domNode.classList.add('message');\n                this._messageElement.textContent = SuggestWidget_1.NO_SUGGESTIONS_MESSAGE;\n                hide(this._listElement, this._status.element);\n                show(this._messageElement);\n                this._details.hide();\n                this._show();\n                this._focusedItem = undefined;\n                status(SuggestWidget_1.NO_SUGGESTIONS_MESSAGE);\n                break;\n            case 3 /* State.Open */:\n                hide(this._messageElement);\n                show(this._listElement, this._status.element);\n                this._show();\n                break;\n            case 4 /* State.Frozen */:\n                hide(this._messageElement);\n                show(this._listElement, this._status.element);\n                this._show();\n                break;\n            case 5 /* State.Details */:\n                hide(this._messageElement);\n                show(this._listElement, this._status.element);\n                this._details.show();\n                this._show();\n                this._details.widget.focus();\n                break;\n        }\n    }\n    _show() {\n        this._status.show();\n        this._contentWidget.show();\n        this._layout(this._persistedSize.restore());\n        this._ctxSuggestWidgetVisible.set(true);\n        this._showTimeout.cancelAndSet(() => {\n            this.element.domNode.classList.add('visible');\n            this._onDidShow.fire(this);\n        }, 100);\n    }\n    showTriggered(auto, delay) {\n        if (this._state !== 0 /* State.Hidden */) {\n            return;\n        }\n        this._contentWidget.setPosition(this.editor.getPosition());\n        this._isAuto = !!auto;\n        if (!this._isAuto) {\n            this._loadingTimeout = disposableTimeout(() => this._setState(1 /* State.Loading */), delay);\n        }\n    }\n    showSuggestions(completionModel, selectionIndex, isFrozen, isAuto, noFocus) {\n        this._contentWidget.setPosition(this.editor.getPosition());\n        this._loadingTimeout?.dispose();\n        this._currentSuggestionDetails?.cancel();\n        this._currentSuggestionDetails = undefined;\n        if (this._completionModel !== completionModel) {\n            this._completionModel = completionModel;\n        }\n        if (isFrozen && this._state !== 2 /* State.Empty */ && this._state !== 0 /* State.Hidden */) {\n            this._setState(4 /* State.Frozen */);\n            return;\n        }\n        const visibleCount = this._completionModel.items.length;\n        const isEmpty = visibleCount === 0;\n        this._ctxSuggestWidgetMultipleSuggestions.set(visibleCount > 1);\n        if (isEmpty) {\n            this._setState(isAuto ? 0 /* State.Hidden */ : 2 /* State.Empty */);\n            this._completionModel = undefined;\n            return;\n        }\n        this._focusedItem = undefined;\n        // calling list.splice triggers focus event which this widget forwards. That can lead to\n        // suggestions being cancelled and the widget being cleared (and hidden). All this happens\n        // before revealing and focusing is done which means revealing and focusing will fail when\n        // they get run.\n        this._onDidFocus.pause();\n        this._onDidSelect.pause();\n        try {\n            this._list.splice(0, this._list.length, this._completionModel.items);\n            this._setState(isFrozen ? 4 /* State.Frozen */ : 3 /* State.Open */);\n            this._list.reveal(selectionIndex, 0, selectionIndex === 0 ? 0 : this.getLayoutInfo().itemHeight * 0.33);\n            this._list.setFocus(noFocus ? [] : [selectionIndex]);\n        }\n        finally {\n            this._onDidFocus.resume();\n            this._onDidSelect.resume();\n        }\n        this._pendingLayout.value = runAtThisOrScheduleAtNextAnimationFrame(getWindow(this.element.domNode), () => {\n            this._pendingLayout.clear();\n            this._layout(this.element.size);\n            // Reset focus border\n            this._details.widget.domNode.classList.remove('focused');\n        });\n    }\n    focusSelected() {\n        if (this._list.length > 0) {\n            this._list.setFocus([0]);\n        }\n    }\n    selectNextPage() {\n        switch (this._state) {\n            case 0 /* State.Hidden */:\n                return false;\n            case 5 /* State.Details */:\n                this._details.widget.pageDown();\n                return true;\n            case 1 /* State.Loading */:\n                return !this._isAuto;\n            default:\n                this._list.focusNextPage();\n                return true;\n        }\n    }\n    selectNext() {\n        switch (this._state) {\n            case 0 /* State.Hidden */:\n                return false;\n            case 1 /* State.Loading */:\n                return !this._isAuto;\n            default:\n                this._list.focusNext(1, true);\n                return true;\n        }\n    }\n    selectLast() {\n        switch (this._state) {\n            case 0 /* State.Hidden */:\n                return false;\n            case 5 /* State.Details */:\n                this._details.widget.scrollBottom();\n                return true;\n            case 1 /* State.Loading */:\n                return !this._isAuto;\n            default:\n                this._list.focusLast();\n                return true;\n        }\n    }\n    selectPreviousPage() {\n        switch (this._state) {\n            case 0 /* State.Hidden */:\n                return false;\n            case 5 /* State.Details */:\n                this._details.widget.pageUp();\n                return true;\n            case 1 /* State.Loading */:\n                return !this._isAuto;\n            default:\n                this._list.focusPreviousPage();\n                return true;\n        }\n    }\n    selectPrevious() {\n        switch (this._state) {\n            case 0 /* State.Hidden */:\n                return false;\n            case 1 /* State.Loading */:\n                return !this._isAuto;\n            default:\n                this._list.focusPrevious(1, true);\n                return false;\n        }\n    }\n    selectFirst() {\n        switch (this._state) {\n            case 0 /* State.Hidden */:\n                return false;\n            case 5 /* State.Details */:\n                this._details.widget.scrollTop();\n                return true;\n            case 1 /* State.Loading */:\n                return !this._isAuto;\n            default:\n                this._list.focusFirst();\n                return true;\n        }\n    }\n    getFocusedItem() {\n        if (this._state !== 0 /* State.Hidden */\n            && this._state !== 2 /* State.Empty */\n            && this._state !== 1 /* State.Loading */\n            && this._completionModel\n            && this._list.getFocus().length > 0) {\n            return {\n                item: this._list.getFocusedElements()[0],\n                index: this._list.getFocus()[0],\n                model: this._completionModel\n            };\n        }\n        return undefined;\n    }\n    toggleDetailsFocus() {\n        if (this._state === 5 /* State.Details */) {\n            // Should return the focus to the list item.\n            this._list.setFocus(this._list.getFocus());\n            this._setState(3 /* State.Open */);\n        }\n        else if (this._state === 3 /* State.Open */) {\n            this._setState(5 /* State.Details */);\n            if (!this._isDetailsVisible()) {\n                this.toggleDetails(true);\n            }\n            else {\n                this._details.widget.focus();\n            }\n        }\n    }\n    toggleDetails(focused = false) {\n        if (this._isDetailsVisible()) {\n            // hide details widget\n            this._pendingShowDetails.clear();\n            this._ctxSuggestWidgetDetailsVisible.set(false);\n            this._setDetailsVisible(false);\n            this._details.hide();\n            this.element.domNode.classList.remove('shows-details');\n        }\n        else if ((canExpandCompletionItem(this._list.getFocusedElements()[0]) || this._explainMode) && (this._state === 3 /* State.Open */ || this._state === 5 /* State.Details */ || this._state === 4 /* State.Frozen */)) {\n            // show details widget (iff possible)\n            this._ctxSuggestWidgetDetailsVisible.set(true);\n            this._setDetailsVisible(true);\n            this._showDetails(false, focused);\n        }\n    }\n    _showDetails(loading, focused) {\n        this._pendingShowDetails.value = runAtThisOrScheduleAtNextAnimationFrame(getWindow(this.element.domNode), () => {\n            this._pendingShowDetails.clear();\n            this._details.show();\n            let didFocusDetails = false;\n            if (loading) {\n                this._details.widget.renderLoading();\n            }\n            else {\n                this._details.widget.renderItem(this._list.getFocusedElements()[0], this._explainMode);\n            }\n            if (!this._details.widget.isEmpty) {\n                this._positionDetails();\n                this.element.domNode.classList.add('shows-details');\n                if (focused) {\n                    this._details.widget.focus();\n                    didFocusDetails = true;\n                }\n            }\n            else {\n                this._details.hide();\n            }\n            if (!didFocusDetails) {\n                this.editor.focus();\n            }\n        });\n    }\n    toggleExplainMode() {\n        if (this._list.getFocusedElements()[0]) {\n            this._explainMode = !this._explainMode;\n            if (!this._isDetailsVisible()) {\n                this.toggleDetails();\n            }\n            else {\n                this._showDetails(false, false);\n            }\n        }\n    }\n    resetPersistedSize() {\n        this._persistedSize.reset();\n    }\n    hideWidget() {\n        this._pendingLayout.clear();\n        this._pendingShowDetails.clear();\n        this._loadingTimeout?.dispose();\n        this._setState(0 /* State.Hidden */);\n        this._onDidHide.fire(this);\n        this.element.clearSashHoverState();\n        // ensure that a reasonable widget height is persisted so that\n        // accidential \"resize-to-single-items\" cases aren't happening\n        const dim = this._persistedSize.restore();\n        const minPersistedHeight = Math.ceil(this.getLayoutInfo().itemHeight * 4.3);\n        if (dim && dim.height < minPersistedHeight) {\n            this._persistedSize.store(dim.with(undefined, minPersistedHeight));\n        }\n    }\n    isFrozen() {\n        return this._state === 4 /* State.Frozen */;\n    }\n    _afterRender(position) {\n        if (position === null) {\n            if (this._isDetailsVisible()) {\n                this._details.hide(); //todo@jrieken soft-hide\n            }\n            return;\n        }\n        if (this._state === 2 /* State.Empty */ || this._state === 1 /* State.Loading */) {\n            // no special positioning when widget isn't showing list\n            return;\n        }\n        if (this._isDetailsVisible() && !this._details.widget.isEmpty) {\n            this._details.show();\n        }\n        this._positionDetails();\n    }\n    _layout(size) {\n        if (!this.editor.hasModel()) {\n            return;\n        }\n        if (!this.editor.getDomNode()) {\n            // happens when running tests\n            return;\n        }\n        const bodyBox = getClientArea(this.element.domNode.ownerDocument.body);\n        const info = this.getLayoutInfo();\n        if (!size) {\n            size = info.defaultSize;\n        }\n        let height = size.height;\n        let width = size.width;\n        // status bar\n        this._status.element.style.height = `${info.itemHeight}px`;\n        if (this._state === 2 /* State.Empty */ || this._state === 1 /* State.Loading */) {\n            // showing a message only\n            height = info.itemHeight + info.borderHeight;\n            width = info.defaultSize.width / 2;\n            this.element.enableSashes(false, false, false, false);\n            this.element.minSize = this.element.maxSize = new Dimension(width, height);\n            this._contentWidget.setPreference(2 /* ContentWidgetPositionPreference.BELOW */);\n        }\n        else {\n            // showing items\n            // width math\n            const maxWidth = bodyBox.width - info.borderHeight - 2 * info.horizontalPadding;\n            if (width > maxWidth) {\n                width = maxWidth;\n            }\n            const preferredWidth = this._completionModel ? this._completionModel.stats.pLabelLen * info.typicalHalfwidthCharacterWidth : width;\n            // height math\n            const fullHeight = info.statusBarHeight + this._list.contentHeight + info.borderHeight;\n            const minHeight = info.itemHeight + info.statusBarHeight;\n            const editorBox = getDomNodePagePosition(this.editor.getDomNode());\n            const cursorBox = this.editor.getScrolledVisiblePosition(this.editor.getPosition());\n            const cursorBottom = editorBox.top + cursorBox.top + cursorBox.height;\n            const maxHeightBelow = Math.min(bodyBox.height - cursorBottom - info.verticalPadding, fullHeight);\n            const availableSpaceAbove = editorBox.top + cursorBox.top - info.verticalPadding;\n            const maxHeightAbove = Math.min(availableSpaceAbove, fullHeight);\n            let maxHeight = Math.min(Math.max(maxHeightAbove, maxHeightBelow) + info.borderHeight, fullHeight);\n            if (height === this._cappedHeight?.capped) {\n                // Restore the old (wanted) height when the current\n                // height is capped to fit\n                height = this._cappedHeight.wanted;\n            }\n            if (height < minHeight) {\n                height = minHeight;\n            }\n            if (height > maxHeight) {\n                height = maxHeight;\n            }\n            const forceRenderingAboveRequiredSpace = 150;\n            if ((height > maxHeightBelow && maxHeightAbove > maxHeightBelow) || (this._forceRenderingAbove && availableSpaceAbove > forceRenderingAboveRequiredSpace)) {\n                this._contentWidget.setPreference(1 /* ContentWidgetPositionPreference.ABOVE */);\n                this.element.enableSashes(true, true, false, false);\n                maxHeight = maxHeightAbove;\n            }\n            else {\n                this._contentWidget.setPreference(2 /* ContentWidgetPositionPreference.BELOW */);\n                this.element.enableSashes(false, true, true, false);\n                maxHeight = maxHeightBelow;\n            }\n            this.element.preferredSize = new Dimension(preferredWidth, info.defaultSize.height);\n            this.element.maxSize = new Dimension(maxWidth, maxHeight);\n            this.element.minSize = new Dimension(220, minHeight);\n            // Know when the height was capped to fit and remember\n            // the wanted height for later. This is required when going\n            // left to widen suggestions.\n            this._cappedHeight = height === fullHeight\n                ? { wanted: this._cappedHeight?.wanted ?? size.height, capped: height }\n                : undefined;\n        }\n        this._resize(width, height);\n    }\n    _resize(width, height) {\n        const { width: maxWidth, height: maxHeight } = this.element.maxSize;\n        width = Math.min(maxWidth, width);\n        height = Math.min(maxHeight, height);\n        const { statusBarHeight } = this.getLayoutInfo();\n        this._list.layout(height - statusBarHeight, width);\n        this._listElement.style.height = `${height - statusBarHeight}px`;\n        this.element.layout(height, width);\n        this._contentWidget.layout();\n        this._positionDetails();\n    }\n    _positionDetails() {\n        if (this._isDetailsVisible()) {\n            this._details.placeAtAnchor(this.element.domNode, this._contentWidget.getPosition()?.preference[0] === 2 /* ContentWidgetPositionPreference.BELOW */);\n        }\n    }\n    getLayoutInfo() {\n        const fontInfo = this.editor.getOption(59 /* EditorOption.fontInfo */);\n        const itemHeight = clamp(this.editor.getOption(136 /* EditorOption.suggestLineHeight */) || fontInfo.lineHeight, 8, 1000);\n        const statusBarHeight = !this.editor.getOption(134 /* EditorOption.suggest */).showStatusBar || this._state === 2 /* State.Empty */ || this._state === 1 /* State.Loading */ ? 0 : itemHeight;\n        const borderWidth = this._details.widget.getLayoutInfo().borderWidth;\n        const borderHeight = 2 * borderWidth;\n        return {\n            itemHeight,\n            statusBarHeight,\n            borderWidth,\n            borderHeight,\n            typicalHalfwidthCharacterWidth: fontInfo.typicalHalfwidthCharacterWidth,\n            verticalPadding: 22,\n            horizontalPadding: 14,\n            defaultSize: new Dimension(430, statusBarHeight + 12 * itemHeight)\n        };\n    }\n    _isDetailsVisible() {\n        return this._storageService.getBoolean('expandSuggestionDocs', 0 /* StorageScope.PROFILE */, false);\n    }\n    _setDetailsVisible(value) {\n        this._storageService.store('expandSuggestionDocs', value, 0 /* StorageScope.PROFILE */, 0 /* StorageTarget.USER */);\n    }\n    forceRenderingAbove() {\n        if (!this._forceRenderingAbove) {\n            this._forceRenderingAbove = true;\n            this._layout(this._persistedSize.restore());\n        }\n    }\n    stopForceRenderingAbove() {\n        this._forceRenderingAbove = false;\n    }\n};\nSuggestWidget = SuggestWidget_1 = __decorate([\n    __param(1, IStorageService),\n    __param(2, IContextKeyService),\n    __param(3, IThemeService),\n    __param(4, IInstantiationService)\n], SuggestWidget);\nclass SuggestContentWidget {\n    constructor(_widget, _editor) {\n        this._widget = _widget;\n        this._editor = _editor;\n        this.allowEditorOverflow = true;\n        this.suppressMouseDown = false;\n        this._preferenceLocked = false;\n        this._added = false;\n        this._hidden = false;\n    }\n    dispose() {\n        if (this._added) {\n            this._added = false;\n            this._editor.removeContentWidget(this);\n        }\n    }\n    getId() {\n        return 'editor.widget.suggestWidget';\n    }\n    getDomNode() {\n        return this._widget.element.domNode;\n    }\n    show() {\n        this._hidden = false;\n        if (!this._added) {\n            this._added = true;\n            this._editor.addContentWidget(this);\n        }\n    }\n    hide() {\n        if (!this._hidden) {\n            this._hidden = true;\n            this.layout();\n        }\n    }\n    layout() {\n        this._editor.layoutContentWidget(this);\n    }\n    getPosition() {\n        if (this._hidden || !this._position || !this._preference) {\n            return null;\n        }\n        return {\n            position: this._position,\n            preference: [this._preference]\n        };\n    }\n    beforeRender() {\n        const { height, width } = this._widget.element.size;\n        const { borderWidth, horizontalPadding } = this._widget.getLayoutInfo();\n        return new Dimension(width + 2 * borderWidth + horizontalPadding, height + 2 * borderWidth);\n    }\n    afterRender(position) {\n        this._widget._afterRender(position);\n    }\n    setPreference(preference) {\n        if (!this._preferenceLocked) {\n            this._preference = preference;\n        }\n    }\n    lockPreference() {\n        this._preferenceLocked = true;\n    }\n    unlockPreference() {\n        this._preferenceLocked = false;\n    }\n    setPosition(position) {\n        this._position = position;\n    }\n}\n\nexport { SuggestContentWidget, SuggestWidget, editorSuggestWidgetForeground, editorSuggestWidgetSelectedBackground };\n","import { alert } from '../../../../base/browser/ui/aria/aria.js';\nimport { isNonEmptyArray } from '../../../../base/common/arrays.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError, onUnexpectedError } from '../../../../base/common/errors.js';\nimport { Emitter, Event } from '../../../../base/common/event.js';\nimport { KeyCodeChord } from '../../../../base/common/keybindings.js';\nimport { MutableDisposable, DisposableStore, toDisposable, dispose } from '../../../../base/common/lifecycle.js';\nimport { isMacintosh } from '../../../../base/common/platform.js';\nimport { StopWatch } from '../../../../base/common/stopwatch.js';\nimport { assertType, isObject } from '../../../../base/common/types.js';\nimport { StableEditorScrollState } from '../../../browser/stableEditorScroll.js';\nimport { EditorAction, registerEditorContribution, registerEditorAction, EditorCommand, registerEditorCommand } from '../../../browser/editorExtensions.js';\nimport { EditOperation } from '../../../common/core/editOperation.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { ProviderId } from '../../../common/languages.js';\nimport { SnippetController2 } from '../../snippet/browser/snippetController2.js';\nimport { SnippetParser } from '../../snippet/browser/snippetParser.js';\nimport { ISuggestMemoryService } from './suggestMemory.js';\nimport { WordContextKey } from './wordContextKey.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { ICommandService, CommandsRegistry } from '../../../../platform/commands/common/commands.js';\nimport { IContextKeyService, ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { ILogService } from '../../../../platform/log/common/log.js';\nimport { Context, suggestWidgetStatusbarMenu } from './suggest.js';\nimport { SuggestAlternatives } from './suggestAlternatives.js';\nimport { CommitCharacterController } from './suggestCommitCharacters.js';\nimport { SuggestModel } from './suggestModel.js';\nimport { OvertypingCapturer } from './suggestOvertypingCapturer.js';\nimport { SuggestWidget } from './suggestWidget.js';\nimport { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js';\nimport { extname, basename } from '../../../../base/common/resources.js';\nimport { hash } from '../../../../base/common/hash.js';\nimport { WindowIdleValue, getWindow } from '../../../../base/browser/dom.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { EditSources } from '../../../common/textModelEditSource.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar SuggestController_1;\nclass LineSuffix {\n    constructor(_model, _position) {\n        this._model = _model;\n        this._position = _position;\n        this._decorationOptions = ModelDecorationOptions.register({\n            description: 'suggest-line-suffix',\n            stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */\n        });\n        // spy on what's happening right of the cursor. two cases:\n        // 1. end of line -> check that it's still end of line\n        // 2. mid of line -> add a marker and compute the delta\n        const maxColumn = _model.getLineMaxColumn(_position.lineNumber);\n        if (maxColumn !== _position.column) {\n            const offset = _model.getOffsetAt(_position);\n            const end = _model.getPositionAt(offset + 1);\n            _model.changeDecorations(accessor => {\n                if (this._marker) {\n                    accessor.removeDecoration(this._marker);\n                }\n                this._marker = accessor.addDecoration(Range.fromPositions(_position, end), this._decorationOptions);\n            });\n        }\n    }\n    dispose() {\n        if (this._marker && !this._model.isDisposed()) {\n            this._model.changeDecorations(accessor => {\n                accessor.removeDecoration(this._marker);\n                this._marker = undefined;\n            });\n        }\n    }\n    delta(position) {\n        if (this._model.isDisposed() || this._position.lineNumber !== position.lineNumber) {\n            // bail out early if things seems fishy\n            return 0;\n        }\n        // read the marker (in case suggest was triggered at line end) or compare\n        // the cursor to the line end.\n        if (this._marker) {\n            const range = this._model.getDecorationRange(this._marker);\n            const end = this._model.getOffsetAt(range.getStartPosition());\n            return end - this._model.getOffsetAt(position);\n        }\n        else {\n            return this._model.getLineMaxColumn(position.lineNumber) - position.column;\n        }\n    }\n}\nlet SuggestController = class SuggestController {\n    static { SuggestController_1 = this; }\n    static { this.ID = 'editor.contrib.suggestController'; }\n    static get(editor) {\n        return editor.getContribution(SuggestController_1.ID);\n    }\n    get onWillInsertSuggestItem() { return this._onWillInsertSuggestItem.event; }\n    constructor(editor, _memoryService, _commandService, _contextKeyService, _instantiationService, _logService, _telemetryService) {\n        this._memoryService = _memoryService;\n        this._commandService = _commandService;\n        this._contextKeyService = _contextKeyService;\n        this._instantiationService = _instantiationService;\n        this._logService = _logService;\n        this._telemetryService = _telemetryService;\n        this._lineSuffix = new MutableDisposable();\n        this._toDispose = new DisposableStore();\n        this._selectors = new PriorityRegistry(s => s.priority);\n        this._onWillInsertSuggestItem = new Emitter();\n        this._wantsForceRenderingAbove = false;\n        this.editor = editor;\n        this.model = _instantiationService.createInstance(SuggestModel, this.editor);\n        // default selector\n        this._selectors.register({\n            priority: 0,\n            select: (model, pos, items) => this._memoryService.select(model, pos, items)\n        });\n        // context key: update insert/replace mode\n        const ctxInsertMode = Context.InsertMode.bindTo(_contextKeyService);\n        ctxInsertMode.set(editor.getOption(134 /* EditorOption.suggest */).insertMode);\n        this._toDispose.add(this.model.onDidTrigger(() => ctxInsertMode.set(editor.getOption(134 /* EditorOption.suggest */).insertMode)));\n        this.widget = this._toDispose.add(new WindowIdleValue(getWindow(editor.getDomNode()), () => {\n            const widget = this._instantiationService.createInstance(SuggestWidget, this.editor);\n            this._toDispose.add(widget);\n            this._toDispose.add(widget.onDidSelect(item => this._insertSuggestion(item, 0 /* InsertFlags.None */), this));\n            // Wire up logic to accept a suggestion on certain characters\n            const commitCharacterController = new CommitCharacterController(this.editor, widget, this.model, item => this._insertSuggestion(item, 2 /* InsertFlags.NoAfterUndoStop */));\n            this._toDispose.add(commitCharacterController);\n            // Wire up makes text edit context key\n            const ctxMakesTextEdit = Context.MakesTextEdit.bindTo(this._contextKeyService);\n            const ctxHasInsertAndReplace = Context.HasInsertAndReplaceRange.bindTo(this._contextKeyService);\n            const ctxCanResolve = Context.CanResolve.bindTo(this._contextKeyService);\n            this._toDispose.add(toDisposable(() => {\n                ctxMakesTextEdit.reset();\n                ctxHasInsertAndReplace.reset();\n                ctxCanResolve.reset();\n            }));\n            this._toDispose.add(widget.onDidFocus(({ item }) => {\n                // (ctx: makesTextEdit)\n                const position = this.editor.getPosition();\n                const startColumn = item.editStart.column;\n                const endColumn = position.column;\n                let value = true;\n                if (this.editor.getOption(1 /* EditorOption.acceptSuggestionOnEnter */) === 'smart'\n                    && this.model.state === 2 /* State.Auto */\n                    && !item.completion.additionalTextEdits\n                    && !(item.completion.insertTextRules & 4 /* CompletionItemInsertTextRule.InsertAsSnippet */)\n                    && endColumn - startColumn === item.completion.insertText.length) {\n                    const oldText = this.editor.getModel().getValueInRange({\n                        startLineNumber: position.lineNumber,\n                        startColumn,\n                        endLineNumber: position.lineNumber,\n                        endColumn\n                    });\n                    value = oldText !== item.completion.insertText;\n                }\n                ctxMakesTextEdit.set(value);\n                // (ctx: hasInsertAndReplaceRange)\n                ctxHasInsertAndReplace.set(!Position.equals(item.editInsertEnd, item.editReplaceEnd));\n                // (ctx: canResolve)\n                ctxCanResolve.set(Boolean(item.provider.resolveCompletionItem) || Boolean(item.completion.documentation) || item.completion.detail !== item.completion.label);\n            }));\n            this._toDispose.add(widget.onDetailsKeyDown(e => {\n                // cmd + c on macOS, ctrl + c on Win / Linux\n                if (e.toKeyCodeChord().equals(new KeyCodeChord(true, false, false, false, 33 /* KeyCode.KeyC */)) ||\n                    (isMacintosh && e.toKeyCodeChord().equals(new KeyCodeChord(false, false, false, true, 33 /* KeyCode.KeyC */)))) {\n                    e.stopPropagation();\n                    return;\n                }\n                if (!e.toKeyCodeChord().isModifierKey()) {\n                    this.editor.focus();\n                }\n            }));\n            if (this._wantsForceRenderingAbove) {\n                widget.forceRenderingAbove();\n            }\n            return widget;\n        }));\n        // Wire up text overtyping capture\n        this._overtypingCapturer = this._toDispose.add(new WindowIdleValue(getWindow(editor.getDomNode()), () => {\n            return this._toDispose.add(new OvertypingCapturer(this.editor, this.model));\n        }));\n        this._alternatives = this._toDispose.add(new WindowIdleValue(getWindow(editor.getDomNode()), () => {\n            return this._toDispose.add(new SuggestAlternatives(this.editor, this._contextKeyService));\n        }));\n        this._toDispose.add(_instantiationService.createInstance(WordContextKey, editor));\n        this._toDispose.add(this.model.onDidTrigger(e => {\n            this.widget.value.showTriggered(e.auto, e.shy ? 250 : 50);\n            this._lineSuffix.value = new LineSuffix(this.editor.getModel(), e.position);\n        }));\n        this._toDispose.add(this.model.onDidSuggest(e => {\n            if (e.triggerOptions.shy) {\n                return;\n            }\n            let index = -1;\n            for (const selector of this._selectors.itemsOrderedByPriorityDesc) {\n                index = selector.select(this.editor.getModel(), this.editor.getPosition(), e.completionModel.items);\n                if (index !== -1) {\n                    break;\n                }\n            }\n            if (index === -1) {\n                index = 0;\n            }\n            if (this.model.state === 0 /* State.Idle */) {\n                // selecting an item can \"pump\" out selection/cursor change events\n                // which can cancel suggest halfway through this function. therefore\n                // we need to check again and bail if the session has been canceled\n                return;\n            }\n            let noFocus = false;\n            if (e.triggerOptions.auto) {\n                // don't \"focus\" item when configured to do\n                const options = this.editor.getOption(134 /* EditorOption.suggest */);\n                if (options.selectionMode === 'never' || options.selectionMode === 'always') {\n                    // simple: always or never\n                    noFocus = options.selectionMode === 'never';\n                }\n                else if (options.selectionMode === 'whenTriggerCharacter') {\n                    // on with trigger character\n                    noFocus = e.triggerOptions.triggerKind !== 1 /* CompletionTriggerKind.TriggerCharacter */;\n                }\n                else if (options.selectionMode === 'whenQuickSuggestion') {\n                    // without trigger character or when refiltering\n                    noFocus = e.triggerOptions.triggerKind === 1 /* CompletionTriggerKind.TriggerCharacter */ && !e.triggerOptions.refilter;\n                }\n            }\n            this.widget.value.showSuggestions(e.completionModel, index, e.isFrozen, e.triggerOptions.auto, noFocus);\n        }));\n        this._toDispose.add(this.model.onDidCancel(e => {\n            if (!e.retrigger) {\n                this.widget.value.hideWidget();\n            }\n        }));\n        this._toDispose.add(this.editor.onDidBlurEditorWidget(() => {\n            {\n                this.model.cancel();\n                this.model.clear();\n            }\n        }));\n        // Manage the acceptSuggestionsOnEnter context key\n        const acceptSuggestionsOnEnter = Context.AcceptSuggestionsOnEnter.bindTo(_contextKeyService);\n        const updateFromConfig = () => {\n            const acceptSuggestionOnEnter = this.editor.getOption(1 /* EditorOption.acceptSuggestionOnEnter */);\n            acceptSuggestionsOnEnter.set(acceptSuggestionOnEnter === 'on' || acceptSuggestionOnEnter === 'smart');\n        };\n        this._toDispose.add(this.editor.onDidChangeConfiguration(() => updateFromConfig()));\n        updateFromConfig();\n    }\n    dispose() {\n        this._alternatives.dispose();\n        this._toDispose.dispose();\n        this.widget.dispose();\n        this.model.dispose();\n        this._lineSuffix.dispose();\n        this._onWillInsertSuggestItem.dispose();\n    }\n    _insertSuggestion(event, flags) {\n        if (!event || !event.item) {\n            this._alternatives.value.reset();\n            this.model.cancel();\n            this.model.clear();\n            return;\n        }\n        if (!this.editor.hasModel()) {\n            return;\n        }\n        const snippetController = SnippetController2.get(this.editor);\n        if (!snippetController) {\n            return;\n        }\n        this._onWillInsertSuggestItem.fire({ item: event.item });\n        const model = this.editor.getModel();\n        const modelVersionNow = model.getAlternativeVersionId();\n        const { item } = event;\n        //\n        const tasks = [];\n        const cts = new CancellationTokenSource();\n        // pushing undo stops *before* additional text edits and\n        // *after* the main edit\n        if (!(flags & 1 /* InsertFlags.NoBeforeUndoStop */)) {\n            this.editor.pushUndoStop();\n        }\n        // compute overwrite[Before|After] deltas BEFORE applying extra edits\n        const info = this.getOverwriteInfo(item, Boolean(flags & 8 /* InsertFlags.AlternativeOverwriteConfig */));\n        // keep item in memory\n        this._memoryService.memorize(model, this.editor.getPosition(), item);\n        const isResolved = item.isResolved;\n        // telemetry data points: duration of command execution, info about async additional edits (-1=n/a, -2=none, 1=success, 0=failed)\n        let _commandExectionDuration = -1;\n        let _additionalEditsAppliedAsync = -1;\n        if (Array.isArray(item.completion.additionalTextEdits)) {\n            // cancel -> stops all listening and closes widget\n            this.model.cancel();\n            // sync additional edits\n            const scrollState = StableEditorScrollState.capture(this.editor);\n            this.editor.executeEdits('suggestController.additionalTextEdits.sync', item.completion.additionalTextEdits.map(edit => {\n                let range = Range.lift(edit.range);\n                if (range.startLineNumber === item.position.lineNumber && range.startColumn > item.position.column) {\n                    // shift additional edit when it is \"after\" the completion insertion position\n                    const columnDelta = this.editor.getPosition().column - item.position.column;\n                    const startColumnDelta = columnDelta;\n                    const endColumnDelta = Range.spansMultipleLines(range) ? 0 : columnDelta;\n                    range = new Range(range.startLineNumber, range.startColumn + startColumnDelta, range.endLineNumber, range.endColumn + endColumnDelta);\n                }\n                return EditOperation.replaceMove(range, edit.text);\n            }));\n            scrollState.restoreRelativeVerticalPositionOfCursor(this.editor);\n        }\n        else if (!isResolved) {\n            // async additional edits\n            const sw = new StopWatch();\n            let position;\n            const docListener = model.onDidChangeContent(e => {\n                if (e.isFlush) {\n                    cts.cancel();\n                    docListener.dispose();\n                    return;\n                }\n                for (const change of e.changes) {\n                    const thisPosition = Range.getEndPosition(change.range);\n                    if (!position || Position.isBefore(thisPosition, position)) {\n                        position = thisPosition;\n                    }\n                }\n            });\n            const oldFlags = flags;\n            flags |= 2 /* InsertFlags.NoAfterUndoStop */;\n            let didType = false;\n            const typeListener = this.editor.onWillType(() => {\n                typeListener.dispose();\n                didType = true;\n                if (!(oldFlags & 2 /* InsertFlags.NoAfterUndoStop */)) {\n                    this.editor.pushUndoStop();\n                }\n            });\n            tasks.push(item.resolve(cts.token).then(() => {\n                if (!item.completion.additionalTextEdits || cts.token.isCancellationRequested) {\n                    return undefined;\n                }\n                if (position && item.completion.additionalTextEdits.some(edit => Position.isBefore(position, Range.getStartPosition(edit.range)))) {\n                    return false;\n                }\n                if (didType) {\n                    this.editor.pushUndoStop();\n                }\n                const scrollState = StableEditorScrollState.capture(this.editor);\n                this.editor.executeEdits('suggestController.additionalTextEdits.async', item.completion.additionalTextEdits.map(edit => EditOperation.replaceMove(Range.lift(edit.range), edit.text)));\n                scrollState.restoreRelativeVerticalPositionOfCursor(this.editor);\n                if (didType || !(oldFlags & 2 /* InsertFlags.NoAfterUndoStop */)) {\n                    this.editor.pushUndoStop();\n                }\n                return true;\n            }).then(applied => {\n                this._logService.trace('[suggest] async resolving of edits DONE (ms, applied?)', sw.elapsed(), applied);\n                _additionalEditsAppliedAsync = applied === true ? 1 : applied === false ? 0 : -2;\n            }).finally(() => {\n                docListener.dispose();\n                typeListener.dispose();\n            }));\n        }\n        let { insertText } = item.completion;\n        if (!(item.completion.insertTextRules & 4 /* CompletionItemInsertTextRule.InsertAsSnippet */)) {\n            insertText = SnippetParser.escape(insertText);\n        }\n        // cancel -> stops all listening and closes widget\n        this.model.cancel();\n        snippetController.insert(insertText, {\n            overwriteBefore: info.overwriteBefore,\n            overwriteAfter: info.overwriteAfter,\n            undoStopBefore: false,\n            undoStopAfter: false,\n            adjustWhitespace: !(item.completion.insertTextRules & 1 /* CompletionItemInsertTextRule.KeepWhitespace */),\n            clipboardText: event.model.clipboardText,\n            overtypingCapturer: this._overtypingCapturer.value,\n            reason: EditSources.suggest({ providerId: ProviderId.fromExtensionId(item.extensionId?.value) }),\n        });\n        if (!(flags & 2 /* InsertFlags.NoAfterUndoStop */)) {\n            this.editor.pushUndoStop();\n        }\n        if (item.completion.command) {\n            if (item.completion.command.id === TriggerSuggestAction.id) {\n                // retigger\n                this.model.trigger({ auto: true, retrigger: true });\n            }\n            else {\n                // exec command, done\n                const sw = new StopWatch();\n                tasks.push(this._commandService.executeCommand(item.completion.command.id, ...(item.completion.command.arguments ? [...item.completion.command.arguments] : [])).catch(e => {\n                    if (item.completion.extensionId) {\n                        onUnexpectedExternalError(e);\n                    }\n                    else {\n                        onUnexpectedError(e);\n                    }\n                }).finally(() => {\n                    _commandExectionDuration = sw.elapsed();\n                }));\n            }\n        }\n        if (flags & 4 /* InsertFlags.KeepAlternativeSuggestions */) {\n            this._alternatives.value.set(event, next => {\n                // cancel resolving of additional edits\n                cts.cancel();\n                // this is not so pretty. when inserting the 'next'\n                // suggestion we undo until we are at the state at\n                // which we were before inserting the previous suggestion...\n                while (model.canUndo()) {\n                    if (modelVersionNow !== model.getAlternativeVersionId()) {\n                        model.undo();\n                    }\n                    this._insertSuggestion(next, 1 /* InsertFlags.NoBeforeUndoStop */ | 2 /* InsertFlags.NoAfterUndoStop */ | (flags & 8 /* InsertFlags.AlternativeOverwriteConfig */ ? 8 /* InsertFlags.AlternativeOverwriteConfig */ : 0));\n                    break;\n                }\n            });\n        }\n        this._alertCompletionItem(item);\n        // clear only now - after all tasks are done\n        Promise.all(tasks).finally(() => {\n            this._reportSuggestionAcceptedTelemetry(item, model, isResolved, _commandExectionDuration, _additionalEditsAppliedAsync, event.index, event.model.items);\n            this.model.clear();\n            cts.dispose();\n        });\n    }\n    _reportSuggestionAcceptedTelemetry(item, model, itemResolved, commandExectionDuration, additionalEditsAppliedAsync, index, completionItems) {\n        if (Math.random() > 0.0001) { // 0.01%\n            return;\n        }\n        const labelMap = new Map();\n        for (let i = 0; i < Math.min(30, completionItems.length); i++) {\n            const label = completionItems[i].textLabel;\n            if (labelMap.has(label)) {\n                labelMap.get(label).push(i);\n            }\n            else {\n                labelMap.set(label, [i]);\n            }\n        }\n        const firstIndexArray = labelMap.get(item.textLabel);\n        const hasDuplicates = firstIndexArray && firstIndexArray.length > 1;\n        const firstIndex = hasDuplicates ? firstIndexArray[0] : -1;\n        this._telemetryService.publicLog2('suggest.acceptedSuggestion', {\n            extensionId: item.extensionId?.value ?? 'unknown',\n            providerId: item.provider._debugDisplayName ?? 'unknown',\n            kind: item.completion.kind,\n            basenameHash: hash(basename(model.uri)).toString(16),\n            languageId: model.getLanguageId(),\n            fileExtension: extname(model.uri),\n            resolveInfo: !item.provider.resolveCompletionItem ? -1 : itemResolved ? 1 : 0,\n            resolveDuration: item.resolveDuration,\n            commandDuration: commandExectionDuration,\n            additionalEditsAsync: additionalEditsAppliedAsync,\n            index,\n            firstIndex,\n        });\n    }\n    getOverwriteInfo(item, toggleMode) {\n        assertType(this.editor.hasModel());\n        let replace = this.editor.getOption(134 /* EditorOption.suggest */).insertMode === 'replace';\n        if (toggleMode) {\n            replace = !replace;\n        }\n        const overwriteBefore = item.position.column - item.editStart.column;\n        const overwriteAfter = (replace ? item.editReplaceEnd.column : item.editInsertEnd.column) - item.position.column;\n        const columnDelta = this.editor.getPosition().column - item.position.column;\n        const suffixDelta = this._lineSuffix.value ? this._lineSuffix.value.delta(this.editor.getPosition()) : 0;\n        return {\n            overwriteBefore: overwriteBefore + columnDelta,\n            overwriteAfter: overwriteAfter + suffixDelta\n        };\n    }\n    _alertCompletionItem(item) {\n        if (isNonEmptyArray(item.completion.additionalTextEdits)) {\n            const msg = localize(1463, \"Accepting '{0}' made {1} additional edits\", item.textLabel, item.completion.additionalTextEdits.length);\n            alert(msg);\n        }\n    }\n    triggerSuggest(onlyFrom, auto, noFilter) {\n        if (this.editor.hasModel()) {\n            this.model.trigger({\n                auto: auto ?? false,\n                completionOptions: { providerFilter: onlyFrom, kindFilter: noFilter ? new Set() : undefined }\n            });\n            this.editor.revealPosition(this.editor.getPosition(), 0 /* ScrollType.Smooth */);\n            this.editor.focus();\n        }\n    }\n    triggerSuggestAndAcceptBest(arg) {\n        if (!this.editor.hasModel()) {\n            return;\n        }\n        const positionNow = this.editor.getPosition();\n        const fallback = () => {\n            if (positionNow.equals(this.editor.getPosition())) {\n                this._commandService.executeCommand(arg.fallback);\n            }\n        };\n        const makesTextEdit = (item) => {\n            if (item.completion.insertTextRules & 4 /* CompletionItemInsertTextRule.InsertAsSnippet */ || item.completion.additionalTextEdits) {\n                // snippet, other editor -> makes edit\n                return true;\n            }\n            const position = this.editor.getPosition();\n            const startColumn = item.editStart.column;\n            const endColumn = position.column;\n            if (endColumn - startColumn !== item.completion.insertText.length) {\n                // unequal lengths -> makes edit\n                return true;\n            }\n            const textNow = this.editor.getModel().getValueInRange({\n                startLineNumber: position.lineNumber,\n                startColumn,\n                endLineNumber: position.lineNumber,\n                endColumn\n            });\n            // unequal text -> makes edit\n            return textNow !== item.completion.insertText;\n        };\n        Event.once(this.model.onDidTrigger)(_ => {\n            // wait for trigger because only then the cancel-event is trustworthy\n            const listener = [];\n            Event.any(this.model.onDidTrigger, this.model.onDidCancel)(() => {\n                // retrigger or cancel -> try to type default text\n                dispose(listener);\n                fallback();\n            }, undefined, listener);\n            this.model.onDidSuggest(({ completionModel }) => {\n                dispose(listener);\n                if (completionModel.items.length === 0) {\n                    fallback();\n                    return;\n                }\n                const index = this._memoryService.select(this.editor.getModel(), this.editor.getPosition(), completionModel.items);\n                const item = completionModel.items[index];\n                if (!makesTextEdit(item)) {\n                    fallback();\n                    return;\n                }\n                this.editor.pushUndoStop();\n                this._insertSuggestion({ index, item, model: completionModel }, 4 /* InsertFlags.KeepAlternativeSuggestions */ | 1 /* InsertFlags.NoBeforeUndoStop */ | 2 /* InsertFlags.NoAfterUndoStop */);\n            }, undefined, listener);\n        });\n        this.model.trigger({ auto: false, shy: true });\n        this.editor.revealPosition(positionNow, 0 /* ScrollType.Smooth */);\n        this.editor.focus();\n    }\n    acceptSelectedSuggestion(keepAlternativeSuggestions, alternativeOverwriteConfig) {\n        const item = this.widget.value.getFocusedItem();\n        let flags = 0;\n        if (keepAlternativeSuggestions) {\n            flags |= 4 /* InsertFlags.KeepAlternativeSuggestions */;\n        }\n        if (alternativeOverwriteConfig) {\n            flags |= 8 /* InsertFlags.AlternativeOverwriteConfig */;\n        }\n        this._insertSuggestion(item, flags);\n    }\n    acceptNextSuggestion() {\n        this._alternatives.value.next();\n    }\n    acceptPrevSuggestion() {\n        this._alternatives.value.prev();\n    }\n    cancelSuggestWidget() {\n        this.model.cancel();\n        this.model.clear();\n        this.widget.value.hideWidget();\n    }\n    focusSuggestion() {\n        this.widget.value.focusSelected();\n    }\n    selectNextSuggestion() {\n        this.widget.value.selectNext();\n    }\n    selectNextPageSuggestion() {\n        this.widget.value.selectNextPage();\n    }\n    selectLastSuggestion() {\n        this.widget.value.selectLast();\n    }\n    selectPrevSuggestion() {\n        this.widget.value.selectPrevious();\n    }\n    selectPrevPageSuggestion() {\n        this.widget.value.selectPreviousPage();\n    }\n    selectFirstSuggestion() {\n        this.widget.value.selectFirst();\n    }\n    toggleSuggestionDetails() {\n        this.widget.value.toggleDetails();\n    }\n    toggleExplainMode() {\n        this.widget.value.toggleExplainMode();\n    }\n    toggleSuggestionFocus() {\n        this.widget.value.toggleDetailsFocus();\n    }\n    resetWidgetSize() {\n        this.widget.value.resetPersistedSize();\n    }\n    forceRenderingAbove() {\n        if (this.widget.isInitialized) {\n            this.widget.value.forceRenderingAbove();\n        }\n        else {\n            // Defer this until the widget is created\n            this._wantsForceRenderingAbove = true;\n        }\n    }\n    stopForceRenderingAbove() {\n        if (this.widget.isInitialized) {\n            this.widget.value.stopForceRenderingAbove();\n        }\n        else {\n            this._wantsForceRenderingAbove = false;\n        }\n    }\n    registerSelector(selector) {\n        return this._selectors.register(selector);\n    }\n};\nSuggestController = SuggestController_1 = __decorate([\n    __param(1, ISuggestMemoryService),\n    __param(2, ICommandService),\n    __param(3, IContextKeyService),\n    __param(4, IInstantiationService),\n    __param(5, ILogService),\n    __param(6, ITelemetryService)\n], SuggestController);\nclass PriorityRegistry {\n    constructor(prioritySelector) {\n        this.prioritySelector = prioritySelector;\n        this._items = new Array();\n    }\n    register(value) {\n        if (this._items.indexOf(value) !== -1) {\n            throw new Error('Value is already registered');\n        }\n        this._items.push(value);\n        this._items.sort((s1, s2) => this.prioritySelector(s2) - this.prioritySelector(s1));\n        return {\n            dispose: () => {\n                const idx = this._items.indexOf(value);\n                if (idx >= 0) {\n                    this._items.splice(idx, 1);\n                }\n            }\n        };\n    }\n    get itemsOrderedByPriorityDesc() {\n        return this._items;\n    }\n}\nclass TriggerSuggestAction extends EditorAction {\n    static { this.id = 'editor.action.triggerSuggest'; }\n    constructor() {\n        super({\n            id: TriggerSuggestAction.id,\n            label: localize2(1471, \"Trigger Suggest\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, EditorContextKeys.hasCompletionItemProvider, Context.Visible.toNegated()),\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 10 /* KeyCode.Space */,\n                secondary: [2048 /* KeyMod.CtrlCmd */ | 39 /* KeyCode.KeyI */],\n                mac: { primary: 256 /* KeyMod.WinCtrl */ | 10 /* KeyCode.Space */, secondary: [512 /* KeyMod.Alt */ | 9 /* KeyCode.Escape */, 2048 /* KeyMod.CtrlCmd */ | 39 /* KeyCode.KeyI */] },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(_accessor, editor, args) {\n        const controller = SuggestController.get(editor);\n        if (!controller) {\n            return;\n        }\n        let auto;\n        if (args && typeof args === 'object') {\n            if (args.auto === true) {\n                auto = true;\n            }\n        }\n        controller.triggerSuggest(undefined, auto, undefined);\n    }\n}\nregisterEditorContribution(SuggestController.ID, SuggestController, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\nregisterEditorAction(TriggerSuggestAction);\nconst weight = 100 /* KeybindingWeight.EditorContrib */ + 90;\nconst SuggestCommand = EditorCommand.bindToContribution(SuggestController.get);\nregisterEditorCommand(new SuggestCommand({\n    id: 'acceptSelectedSuggestion',\n    precondition: ContextKeyExpr.and(Context.Visible, Context.HasFocusedSuggestion),\n    handler(x) {\n        x.acceptSelectedSuggestion(true, false);\n    },\n    kbOpts: [{\n            // normal tab\n            primary: 2 /* KeyCode.Tab */,\n            kbExpr: ContextKeyExpr.and(Context.Visible, EditorContextKeys.textInputFocus),\n            weight,\n        }, {\n            // accept on enter has special rules\n            primary: 3 /* KeyCode.Enter */,\n            kbExpr: ContextKeyExpr.and(Context.Visible, EditorContextKeys.textInputFocus, Context.AcceptSuggestionsOnEnter, Context.MakesTextEdit),\n            weight,\n        }],\n    menuOpts: [{\n            menuId: suggestWidgetStatusbarMenu,\n            title: localize(1464, \"Insert\"),\n            group: 'left',\n            order: 1,\n            when: Context.HasInsertAndReplaceRange.toNegated()\n        }, {\n            menuId: suggestWidgetStatusbarMenu,\n            title: localize(1465, \"Insert\"),\n            group: 'left',\n            order: 1,\n            when: ContextKeyExpr.and(Context.HasInsertAndReplaceRange, Context.InsertMode.isEqualTo('insert'))\n        }, {\n            menuId: suggestWidgetStatusbarMenu,\n            title: localize(1466, \"Replace\"),\n            group: 'left',\n            order: 1,\n            when: ContextKeyExpr.and(Context.HasInsertAndReplaceRange, Context.InsertMode.isEqualTo('replace'))\n        }]\n}));\nregisterEditorCommand(new SuggestCommand({\n    id: 'acceptAlternativeSelectedSuggestion',\n    precondition: ContextKeyExpr.and(Context.Visible, EditorContextKeys.textInputFocus, Context.HasFocusedSuggestion),\n    kbOpts: {\n        weight: weight,\n        kbExpr: EditorContextKeys.textInputFocus,\n        primary: 1024 /* KeyMod.Shift */ | 3 /* KeyCode.Enter */,\n        secondary: [1024 /* KeyMod.Shift */ | 2 /* KeyCode.Tab */],\n    },\n    handler(x) {\n        x.acceptSelectedSuggestion(false, true);\n    },\n    menuOpts: [{\n            menuId: suggestWidgetStatusbarMenu,\n            group: 'left',\n            order: 2,\n            when: ContextKeyExpr.and(Context.HasInsertAndReplaceRange, Context.InsertMode.isEqualTo('insert')),\n            title: localize(1467, \"Replace\")\n        }, {\n            menuId: suggestWidgetStatusbarMenu,\n            group: 'left',\n            order: 2,\n            when: ContextKeyExpr.and(Context.HasInsertAndReplaceRange, Context.InsertMode.isEqualTo('replace')),\n            title: localize(1468, \"Insert\")\n        }]\n}));\n// continue to support the old command\nCommandsRegistry.registerCommandAlias('acceptSelectedSuggestionOnEnter', 'acceptSelectedSuggestion');\nregisterEditorCommand(new SuggestCommand({\n    id: 'hideSuggestWidget',\n    precondition: Context.Visible,\n    handler: x => x.cancelSuggestWidget(),\n    kbOpts: {\n        weight: weight,\n        kbExpr: EditorContextKeys.textInputFocus,\n        primary: 9 /* KeyCode.Escape */,\n        secondary: [1024 /* KeyMod.Shift */ | 9 /* KeyCode.Escape */]\n    }\n}));\nregisterEditorCommand(new SuggestCommand({\n    id: 'selectNextSuggestion',\n    precondition: ContextKeyExpr.and(Context.Visible, ContextKeyExpr.or(Context.MultipleSuggestions, Context.HasFocusedSuggestion.negate())),\n    handler: c => c.selectNextSuggestion(),\n    kbOpts: {\n        weight: weight,\n        kbExpr: EditorContextKeys.textInputFocus,\n        primary: 18 /* KeyCode.DownArrow */,\n        secondary: [2048 /* KeyMod.CtrlCmd */ | 18 /* KeyCode.DownArrow */],\n        mac: { primary: 18 /* KeyCode.DownArrow */, secondary: [2048 /* KeyMod.CtrlCmd */ | 18 /* KeyCode.DownArrow */, 256 /* KeyMod.WinCtrl */ | 44 /* KeyCode.KeyN */] }\n    }\n}));\nregisterEditorCommand(new SuggestCommand({\n    id: 'selectNextPageSuggestion',\n    precondition: ContextKeyExpr.and(Context.Visible, ContextKeyExpr.or(Context.MultipleSuggestions, Context.HasFocusedSuggestion.negate())),\n    handler: c => c.selectNextPageSuggestion(),\n    kbOpts: {\n        weight: weight,\n        kbExpr: EditorContextKeys.textInputFocus,\n        primary: 12 /* KeyCode.PageDown */,\n        secondary: [2048 /* KeyMod.CtrlCmd */ | 12 /* KeyCode.PageDown */]\n    }\n}));\nregisterEditorCommand(new SuggestCommand({\n    id: 'selectLastSuggestion',\n    precondition: ContextKeyExpr.and(Context.Visible, ContextKeyExpr.or(Context.MultipleSuggestions, Context.HasFocusedSuggestion.negate())),\n    handler: c => c.selectLastSuggestion()\n}));\nregisterEditorCommand(new SuggestCommand({\n    id: 'selectPrevSuggestion',\n    precondition: ContextKeyExpr.and(Context.Visible, ContextKeyExpr.or(Context.MultipleSuggestions, Context.HasFocusedSuggestion.negate())),\n    handler: c => c.selectPrevSuggestion(),\n    kbOpts: {\n        weight: weight,\n        kbExpr: EditorContextKeys.textInputFocus,\n        primary: 16 /* KeyCode.UpArrow */,\n        secondary: [2048 /* KeyMod.CtrlCmd */ | 16 /* KeyCode.UpArrow */],\n        mac: { primary: 16 /* KeyCode.UpArrow */, secondary: [2048 /* KeyMod.CtrlCmd */ | 16 /* KeyCode.UpArrow */, 256 /* KeyMod.WinCtrl */ | 46 /* KeyCode.KeyP */] }\n    }\n}));\nregisterEditorCommand(new SuggestCommand({\n    id: 'selectPrevPageSuggestion',\n    precondition: ContextKeyExpr.and(Context.Visible, ContextKeyExpr.or(Context.MultipleSuggestions, Context.HasFocusedSuggestion.negate())),\n    handler: c => c.selectPrevPageSuggestion(),\n    kbOpts: {\n        weight: weight,\n        kbExpr: EditorContextKeys.textInputFocus,\n        primary: 11 /* KeyCode.PageUp */,\n        secondary: [2048 /* KeyMod.CtrlCmd */ | 11 /* KeyCode.PageUp */]\n    }\n}));\nregisterEditorCommand(new SuggestCommand({\n    id: 'selectFirstSuggestion',\n    precondition: ContextKeyExpr.and(Context.Visible, ContextKeyExpr.or(Context.MultipleSuggestions, Context.HasFocusedSuggestion.negate())),\n    handler: c => c.selectFirstSuggestion()\n}));\nregisterEditorCommand(new SuggestCommand({\n    id: 'focusSuggestion',\n    precondition: ContextKeyExpr.and(Context.Visible, Context.HasFocusedSuggestion.negate()),\n    handler: x => x.focusSuggestion(),\n    kbOpts: {\n        weight: weight,\n        kbExpr: EditorContextKeys.textInputFocus,\n        primary: 2048 /* KeyMod.CtrlCmd */ | 10 /* KeyCode.Space */,\n        secondary: [2048 /* KeyMod.CtrlCmd */ | 39 /* KeyCode.KeyI */],\n        mac: { primary: 256 /* KeyMod.WinCtrl */ | 10 /* KeyCode.Space */, secondary: [2048 /* KeyMod.CtrlCmd */ | 39 /* KeyCode.KeyI */] }\n    },\n}));\nregisterEditorCommand(new SuggestCommand({\n    id: 'focusAndAcceptSuggestion',\n    precondition: ContextKeyExpr.and(Context.Visible, Context.HasFocusedSuggestion.negate()),\n    handler: c => {\n        c.focusSuggestion();\n        c.acceptSelectedSuggestion(true, false);\n    }\n}));\nregisterEditorCommand(new SuggestCommand({\n    id: 'toggleSuggestionDetails',\n    precondition: ContextKeyExpr.and(Context.Visible, Context.HasFocusedSuggestion),\n    handler: x => x.toggleSuggestionDetails(),\n    kbOpts: {\n        weight: weight,\n        kbExpr: EditorContextKeys.textInputFocus,\n        primary: 2048 /* KeyMod.CtrlCmd */ | 10 /* KeyCode.Space */,\n        secondary: [2048 /* KeyMod.CtrlCmd */ | 39 /* KeyCode.KeyI */],\n        mac: { primary: 256 /* KeyMod.WinCtrl */ | 10 /* KeyCode.Space */, secondary: [2048 /* KeyMod.CtrlCmd */ | 39 /* KeyCode.KeyI */] }\n    },\n    menuOpts: [{\n            menuId: suggestWidgetStatusbarMenu,\n            group: 'right',\n            order: 1,\n            when: ContextKeyExpr.and(Context.DetailsVisible, Context.CanResolve),\n            title: localize(1469, \"Show Less\")\n        }, {\n            menuId: suggestWidgetStatusbarMenu,\n            group: 'right',\n            order: 1,\n            when: ContextKeyExpr.and(Context.DetailsVisible.toNegated(), Context.CanResolve),\n            title: localize(1470, \"Show More\")\n        }]\n}));\nregisterEditorCommand(new SuggestCommand({\n    id: 'toggleExplainMode',\n    precondition: Context.Visible,\n    handler: x => x.toggleExplainMode(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */,\n        primary: 2048 /* KeyMod.CtrlCmd */ | 90 /* KeyCode.Slash */,\n    }\n}));\nregisterEditorCommand(new SuggestCommand({\n    id: 'toggleSuggestionFocus',\n    precondition: Context.Visible,\n    handler: x => x.toggleSuggestionFocus(),\n    kbOpts: {\n        weight: weight,\n        kbExpr: EditorContextKeys.textInputFocus,\n        primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 10 /* KeyCode.Space */,\n        mac: { primary: 256 /* KeyMod.WinCtrl */ | 512 /* KeyMod.Alt */ | 10 /* KeyCode.Space */ }\n    }\n}));\n//#region tab completions\nregisterEditorCommand(new SuggestCommand({\n    id: 'insertBestCompletion',\n    precondition: ContextKeyExpr.and(EditorContextKeys.textInputFocus, ContextKeyExpr.equals('config.editor.tabCompletion', 'on'), WordContextKey.AtEnd, Context.Visible.toNegated(), SuggestAlternatives.OtherSuggestions.toNegated(), SnippetController2.InSnippetMode.toNegated()),\n    handler: (x, arg) => {\n        x.triggerSuggestAndAcceptBest(isObject(arg) ? { fallback: 'tab', ...arg } : { fallback: 'tab' });\n    },\n    kbOpts: {\n        weight,\n        primary: 2 /* KeyCode.Tab */\n    }\n}));\nregisterEditorCommand(new SuggestCommand({\n    id: 'insertNextSuggestion',\n    precondition: ContextKeyExpr.and(EditorContextKeys.textInputFocus, ContextKeyExpr.equals('config.editor.tabCompletion', 'on'), SuggestAlternatives.OtherSuggestions, Context.Visible.toNegated(), SnippetController2.InSnippetMode.toNegated()),\n    handler: x => x.acceptNextSuggestion(),\n    kbOpts: {\n        weight: weight,\n        kbExpr: EditorContextKeys.textInputFocus,\n        primary: 2 /* KeyCode.Tab */\n    }\n}));\nregisterEditorCommand(new SuggestCommand({\n    id: 'insertPrevSuggestion',\n    precondition: ContextKeyExpr.and(EditorContextKeys.textInputFocus, ContextKeyExpr.equals('config.editor.tabCompletion', 'on'), SuggestAlternatives.OtherSuggestions, Context.Visible.toNegated(), SnippetController2.InSnippetMode.toNegated()),\n    handler: x => x.acceptPrevSuggestion(),\n    kbOpts: {\n        weight: weight,\n        kbExpr: EditorContextKeys.textInputFocus,\n        primary: 1024 /* KeyMod.Shift */ | 2 /* KeyCode.Tab */\n    }\n}));\nregisterEditorAction(class extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.resetSuggestSize',\n            label: localize2(1472, \"Reset Suggest Widget Size\"),\n            precondition: undefined\n        });\n    }\n    run(_accessor, editor) {\n        SuggestController.get(editor)?.resetWidgetSize();\n    }\n});\n\nexport { SuggestController, TriggerSuggestAction };\n","import { compareBy, numberComparator } from '../../../../../base/common/arrays.js';\nimport { findFirstMax } from '../../../../../base/common/arraysFind.js';\nimport { Emitter, Event } from '../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { TextReplacement } from '../../../../common/core/edits/textEdit.js';\nimport { SelectedSuggestionInfo } from '../../../../common/languages.js';\nimport { singleTextRemoveCommonPrefix, singleTextEditAugments } from './singleTextEditHelpers.js';\nimport { SnippetParser } from '../../../snippet/browser/snippetParser.js';\nimport { SnippetSession } from '../../../snippet/browser/snippetSession.js';\nimport { SuggestController } from '../../../suggest/browser/suggestController.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { observableFromEvent } from '../../../../../base/common/observableInternal/observables/observableFromEvent.js';\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 *--------------------------------------------------------------------------------------------*/\nclass SuggestWidgetAdaptor extends Disposable {\n    get selectedItem() {\n        return this._currentSuggestItemInfo;\n    }\n    constructor(editor, suggestControllerPreselector, onWillAccept) {\n        super();\n        this.editor = editor;\n        this.suggestControllerPreselector = suggestControllerPreselector;\n        this.onWillAccept = onWillAccept;\n        this.isSuggestWidgetVisible = false;\n        this.isShiftKeyPressed = false;\n        this._isActive = false;\n        this._currentSuggestItemInfo = undefined;\n        this._onDidSelectedItemChange = this._register(new Emitter());\n        this.onDidSelectedItemChange = this._onDidSelectedItemChange.event;\n        // See the command acceptAlternativeSelectedSuggestion that is bound to shift+tab\n        this._register(editor.onKeyDown(e => {\n            if (e.shiftKey && !this.isShiftKeyPressed) {\n                this.isShiftKeyPressed = true;\n                this.update(this._isActive);\n            }\n        }));\n        this._register(editor.onKeyUp(e => {\n            if (e.shiftKey && this.isShiftKeyPressed) {\n                this.isShiftKeyPressed = false;\n                this.update(this._isActive);\n            }\n        }));\n        const suggestController = SuggestController.get(this.editor);\n        if (suggestController) {\n            this._register(suggestController.registerSelector({\n                priority: 100,\n                select: (model, pos, suggestItems) => {\n                    const textModel = this.editor.getModel();\n                    if (!textModel) {\n                        // Should not happen\n                        return -1;\n                    }\n                    const i = this.suggestControllerPreselector();\n                    const itemToPreselect = i ? singleTextRemoveCommonPrefix(i, textModel) : undefined;\n                    if (!itemToPreselect) {\n                        return -1;\n                    }\n                    const position = Position.lift(pos);\n                    const candidates = suggestItems\n                        .map((suggestItem, index) => {\n                        const suggestItemInfo = SuggestItemInfo.fromSuggestion(suggestController, textModel, position, suggestItem, this.isShiftKeyPressed);\n                        const suggestItemTextEdit = singleTextRemoveCommonPrefix(suggestItemInfo.getSingleTextEdit(), textModel);\n                        const valid = singleTextEditAugments(itemToPreselect, suggestItemTextEdit);\n                        return { index, valid, prefixLength: suggestItemTextEdit.text.length, suggestItem };\n                    })\n                        .filter(item => item && item.valid && item.prefixLength > 0);\n                    const result = findFirstMax(candidates, compareBy(s => s.prefixLength, numberComparator));\n                    return result ? result.index : -1;\n                }\n            }));\n            let isBoundToSuggestWidget = false;\n            const bindToSuggestWidget = () => {\n                if (isBoundToSuggestWidget) {\n                    return;\n                }\n                isBoundToSuggestWidget = true;\n                this._register(suggestController.widget.value.onDidShow(() => {\n                    this.isSuggestWidgetVisible = true;\n                    this.update(true);\n                }));\n                this._register(suggestController.widget.value.onDidHide(() => {\n                    this.isSuggestWidgetVisible = false;\n                    this.update(false);\n                }));\n                this._register(suggestController.widget.value.onDidFocus(() => {\n                    this.isSuggestWidgetVisible = true;\n                    this.update(true);\n                }));\n            };\n            this._register(Event.once(suggestController.model.onDidTrigger)(e => {\n                bindToSuggestWidget();\n            }));\n            this._register(suggestController.onWillInsertSuggestItem(e => {\n                const position = this.editor.getPosition();\n                const model = this.editor.getModel();\n                if (!position || !model) {\n                    return undefined;\n                }\n                const suggestItemInfo = SuggestItemInfo.fromSuggestion(suggestController, model, position, e.item, this.isShiftKeyPressed);\n                this.onWillAccept(suggestItemInfo);\n            }));\n        }\n        this.update(this._isActive);\n    }\n    update(newActive) {\n        const newInlineCompletion = this.getSuggestItemInfo();\n        if (this._isActive !== newActive || !suggestItemInfoEquals(this._currentSuggestItemInfo, newInlineCompletion)) {\n            this._isActive = newActive;\n            this._currentSuggestItemInfo = newInlineCompletion;\n            this._onDidSelectedItemChange.fire();\n        }\n    }\n    getSuggestItemInfo() {\n        const suggestController = SuggestController.get(this.editor);\n        if (!suggestController || !this.isSuggestWidgetVisible) {\n            return undefined;\n        }\n        const focusedItem = suggestController.widget.value.getFocusedItem();\n        const position = this.editor.getPosition();\n        const model = this.editor.getModel();\n        if (!focusedItem || !position || !model) {\n            return undefined;\n        }\n        return SuggestItemInfo.fromSuggestion(suggestController, model, position, focusedItem.item, this.isShiftKeyPressed);\n    }\n    stopForceRenderingAbove() {\n        const suggestController = SuggestController.get(this.editor);\n        suggestController?.stopForceRenderingAbove();\n    }\n    forceRenderingAbove() {\n        const suggestController = SuggestController.get(this.editor);\n        suggestController?.forceRenderingAbove();\n    }\n}\nclass SuggestItemInfo {\n    static fromSuggestion(suggestController, model, position, item, toggleMode) {\n        let { insertText } = item.completion;\n        let isSnippetText = false;\n        if (item.completion.insertTextRules & 4 /* CompletionItemInsertTextRule.InsertAsSnippet */) {\n            const snippet = new SnippetParser().parse(insertText);\n            if (snippet.children.length < 100) {\n                // Adjust whitespace is expensive.\n                SnippetSession.adjustWhitespace(model, position, true, snippet);\n            }\n            insertText = snippet.toString();\n            isSnippetText = true;\n        }\n        const info = suggestController.getOverwriteInfo(item, toggleMode);\n        return new SuggestItemInfo(Range.fromPositions(position.delta(0, -info.overwriteBefore), position.delta(0, Math.max(info.overwriteAfter, 0))), insertText, item.completion.kind, isSnippetText, item.container.incomplete ?? false);\n    }\n    constructor(range, insertText, completionItemKind, isSnippetText, listIncomplete) {\n        this.range = range;\n        this.insertText = insertText;\n        this.completionItemKind = completionItemKind;\n        this.isSnippetText = isSnippetText;\n        this.listIncomplete = listIncomplete;\n    }\n    equals(other) {\n        return this.range.equalsRange(other.range)\n            && this.insertText === other.insertText\n            && this.completionItemKind === other.completionItemKind\n            && this.isSnippetText === other.isSnippetText;\n    }\n    toSelectedSuggestionInfo() {\n        return new SelectedSuggestionInfo(this.range, this.insertText, this.completionItemKind, this.isSnippetText);\n    }\n    getSingleTextEdit() {\n        return new TextReplacement(this.range, this.insertText);\n    }\n}\nfunction suggestItemInfoEquals(a, b) {\n    if (a === b) {\n        return true;\n    }\n    if (!a || !b) {\n        return false;\n    }\n    return a.equals(b);\n}\nclass ObservableSuggestWidgetAdapter extends Disposable {\n    constructor(_editorObs, _handleSuggestAccepted, _suggestControllerPreselector) {\n        super();\n        this._editorObs = _editorObs;\n        this._handleSuggestAccepted = _handleSuggestAccepted;\n        this._suggestControllerPreselector = _suggestControllerPreselector;\n        this._suggestWidgetAdaptor = this._register(new SuggestWidgetAdaptor(this._editorObs.editor, () => {\n            this._editorObs.forceUpdate();\n            return this._suggestControllerPreselector();\n        }, (item) => this._editorObs.forceUpdate(_tx => {\n            /** @description InlineCompletionsController.handleSuggestAccepted */\n            this._handleSuggestAccepted(item);\n        })));\n        this.selectedItem = observableFromEvent(this, cb => this._suggestWidgetAdaptor.onDidSelectedItemChange(() => {\n            this._editorObs.forceUpdate(_tx => cb(undefined));\n        }), () => this._suggestWidgetAdaptor.selectedItem);\n    }\n    stopForceRenderingAbove() {\n        this._suggestWidgetAdaptor.stopForceRenderingAbove();\n    }\n    forceRenderingAbove() {\n        this._suggestWidgetAdaptor.forceRenderingAbove();\n    }\n}\n\nexport { ObservableSuggestWidgetAdapter, SuggestItemInfo, SuggestWidgetAdaptor };\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/**\n * Represents a column range in a single line.\n*/\nclass RangeSingleLine {\n    constructor(\n    /** 1-based */\n    lineNumber, columnRange) {\n        this.lineNumber = lineNumber;\n        this.columnRange = columnRange;\n    }\n}\n\nexport { RangeSingleLine };\n","import { BugIndicatingError } from '../../../../base/common/errors.js';\nimport { OffsetRange } from './offsetRange.js';\nimport { Range } from '../range.js';\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/**\n * Represents a 1-based range of columns.\n * Use {@lik OffsetRange} to represent a 0-based range.\n*/\nclass ColumnRange {\n    constructor(\n    /** 1-based */\n    startColumn, endColumnExclusive) {\n        this.startColumn = startColumn;\n        this.endColumnExclusive = endColumnExclusive;\n        if (startColumn > endColumnExclusive) {\n            throw new BugIndicatingError(`startColumn ${startColumn} cannot be after endColumnExclusive ${endColumnExclusive}`);\n        }\n    }\n    toRange(lineNumber) {\n        return new Range(lineNumber, this.startColumn, lineNumber, this.endColumnExclusive);\n    }\n    equals(other) {\n        return this.startColumn === other.startColumn\n            && this.endColumnExclusive === other.endColumnExclusive;\n    }\n    toZeroBasedOffsetRange() {\n        return new OffsetRange(this.startColumn - 1, this.endColumnExclusive - 1);\n    }\n}\n\nexport { ColumnRange };\n","import { OffsetRange } from '../core/ranges/offsetRange.js';\nimport { LineTokens } from './lineTokens.js';\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/**\n * This class represents a sequence of tokens.\n * Conceptually, each token has a length and a metadata number.\n * A token array might be used to annotate a string with metadata.\n * Use {@link TokenWithTextArrayBuilder} to efficiently create a token array.\n *\n * TODO: Make this class more efficient (e.g. by using a Int32Array).\n*/\nclass TokenWithTextArray {\n    static fromLineTokens(lineTokens) {\n        const tokenInfo = [];\n        for (let i = 0; i < lineTokens.getCount(); i++) {\n            tokenInfo.push(new TokenWithTextInfo(lineTokens.getTokenText(i), lineTokens.getMetadata(i)));\n        }\n        return TokenWithTextArray.create(tokenInfo);\n    }\n    static create(tokenInfo) {\n        return new TokenWithTextArray(tokenInfo);\n    }\n    constructor(_tokenInfo) {\n        this._tokenInfo = _tokenInfo;\n    }\n    toLineTokens(decoder) {\n        return LineTokens.createFromTextAndMetadata(this.map((_r, t) => ({ text: t.text, metadata: t.metadata })), decoder);\n    }\n    map(cb) {\n        const result = [];\n        let lengthSum = 0;\n        for (const tokenInfo of this._tokenInfo) {\n            const range = new OffsetRange(lengthSum, lengthSum + tokenInfo.text.length);\n            result.push(cb(range, tokenInfo));\n            lengthSum += tokenInfo.text.length;\n        }\n        return result;\n    }\n    slice(range) {\n        const result = [];\n        let lengthSum = 0;\n        for (const tokenInfo of this._tokenInfo) {\n            const tokenStart = lengthSum;\n            const tokenEndEx = tokenStart + tokenInfo.text.length;\n            if (tokenEndEx > range.start) {\n                if (tokenStart >= range.endExclusive) {\n                    break;\n                }\n                const deltaBefore = Math.max(0, range.start - tokenStart);\n                const deltaAfter = Math.max(0, tokenEndEx - range.endExclusive);\n                result.push(new TokenWithTextInfo(tokenInfo.text.slice(deltaBefore, tokenInfo.text.length - deltaAfter), tokenInfo.metadata));\n            }\n            lengthSum += tokenInfo.text.length;\n        }\n        return TokenWithTextArray.create(result);\n    }\n    append(other) {\n        const result = this._tokenInfo.concat(other._tokenInfo);\n        return TokenWithTextArray.create(result);\n    }\n}\nclass TokenWithTextInfo {\n    constructor(text, metadata) {\n        this.text = text;\n        this.metadata = metadata;\n    }\n}\n\nexport { TokenWithTextArray, TokenWithTextInfo };\n","import { createTrustedTypesPolicy } from '../../../../../../base/browser/trustedTypes.js';\nimport '../../../../../../base/browser/ui/iconLabel/iconLabels.js';\nimport '../../../../../../base/common/codicons.js';\nimport { Emitter, Event } from '../../../../../../base/common/event.js';\nimport { createHotClass } from '../../../../../../base/common/hotReloadHelpers.js';\nimport { Disposable, toDisposable, MutableDisposable, DisposableStore } from '../../../../../../base/common/lifecycle.js';\nimport '../../../../../../base/common/observableInternal/index.js';\nimport { containsRTL, isBasicASCII } from '../../../../../../base/common/strings.js';\nimport { applyFontInfo } from '../../../../../browser/config/domFontInfo.js';\nimport { observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { EditorFontLigatures } from '../../../../../common/config/editorOptions.js';\nimport { StringEdit, StringReplacement } from '../../../../../common/core/edits/stringEdit.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { StringBuilder } from '../../../../../common/core/stringBuilder.js';\nimport { ILanguageService } from '../../../../../common/languages/language.js';\nimport { InjectedTextCursorStops } from '../../../../../common/model.js';\nimport { LineTokens } from '../../../../../common/tokens/lineTokens.js';\nimport { LineDecoration } from '../../../../../common/viewLayout/lineDecorations.js';\nimport { renderViewLine, RenderLineInput } from '../../../../../common/viewLayout/viewLineRenderer.js';\nimport { GhostTextReplacement } from '../../model/ghostText.js';\nimport { RangeSingleLine } from '../../../../../common/core/ranges/rangeSingleLine.js';\nimport { ColumnRange } from '../../../../../common/core/ranges/columnRange.js';\nimport { addDisposableListener, getWindow, isHTMLElement } from '../../../../../../base/browser/dom.js';\nimport './ghostTextView.css';\nimport { StandardMouseEvent } from '../../../../../../base/browser/mouseEvent.js';\nimport { CodeEditorWidget } from '../../../../../browser/widget/codeEditor/codeEditorWidget.js';\nimport { TokenWithTextArray } from '../../../../../common/tokens/tokenWithTextArray.js';\nimport { sum } from '../../../../../../base/common/arrays.js';\nimport { observableValue } from '../../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { derived } from '../../../../../../base/common/observableInternal/observables/derived.js';\nimport { autorunWithStore, autorun } from '../../../../../../base/common/observableInternal/reactions/autorun.js';\nimport { observableSignalFromEvent } from '../../../../../../base/common/observableInternal/observables/observableSignalFromEvent.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst GHOST_TEXT_CLASS_NAME = 'ghost-text';\nlet GhostTextView = class GhostTextView extends Disposable {\n    static { this.hot = createHotClass(this); }\n    constructor(_editor, _model, _options, _shouldKeepCursorStable, _isClickable, _languageService) {\n        super();\n        this._editor = _editor;\n        this._model = _model;\n        this._options = _options;\n        this._shouldKeepCursorStable = _shouldKeepCursorStable;\n        this._isClickable = _isClickable;\n        this._languageService = _languageService;\n        this._isDisposed = observableValue(this, false);\n        this._editorObs = observableCodeEditor(this._editor);\n        this._warningState = derived(reader => {\n            const gt = this._model.ghostText.read(reader);\n            if (!gt) {\n                return undefined;\n            }\n            const warning = this._model.warning.read(reader);\n            if (!warning) {\n                return undefined;\n            }\n            return { lineNumber: gt.lineNumber, position: new Position(gt.lineNumber, gt.parts[0].column), icon: warning.icon };\n        });\n        this._onDidClick = this._register(new Emitter());\n        this.onDidClick = this._onDidClick.event;\n        this._useSyntaxHighlighting = this._options.map(o => o.syntaxHighlightingEnabled);\n        this._extraClassNames = derived(this, reader => {\n            const extraClasses = [...this._options.read(reader).extraClasses ?? []];\n            if (this._useSyntaxHighlighting.read(reader)) {\n                extraClasses.push('syntax-highlighted');\n            }\n            if (this._warningState.read(reader)) {\n                extraClasses.push('warning');\n            }\n            const extraClassNames = extraClasses.map(c => ` ${c}`).join('');\n            return extraClassNames;\n        });\n        this.uiState = derived(this, reader => {\n            if (this._isDisposed.read(reader)) {\n                return undefined;\n            }\n            const textModel = this._editorObs.model.read(reader);\n            if (textModel !== this._model.targetTextModel.read(reader)) {\n                return undefined;\n            }\n            const ghostText = this._model.ghostText.read(reader);\n            if (!ghostText) {\n                return undefined;\n            }\n            const replacedRange = ghostText instanceof GhostTextReplacement ? ghostText.columnRange : undefined;\n            const syntaxHighlightingEnabled = this._useSyntaxHighlighting.read(reader);\n            const extraClassNames = this._extraClassNames.read(reader);\n            const { inlineTexts, additionalLines, hiddenRange, additionalLinesOriginalSuffix } = computeGhostTextViewData(ghostText, textModel, GHOST_TEXT_CLASS_NAME + extraClassNames);\n            const currentLine = textModel.getLineContent(ghostText.lineNumber);\n            const edit = new StringEdit(inlineTexts.map(t => StringReplacement.insert(t.column - 1, t.text)));\n            const tokens = syntaxHighlightingEnabled ? textModel.tokenization.tokenizeLinesAt(ghostText.lineNumber, [edit.apply(currentLine), ...additionalLines.map(l => l.content)]) : undefined;\n            const newRanges = edit.getNewRanges();\n            const inlineTextsWithTokens = inlineTexts.map((t, idx) => ({ ...t, tokens: tokens?.[0]?.getTokensInRange(newRanges[idx]) }));\n            const tokenizedAdditionalLines = additionalLines.map((l, idx) => {\n                let content = tokens?.[idx + 1] ?? LineTokens.createEmpty(l.content, this._languageService.languageIdCodec);\n                if (idx === additionalLines.length - 1 && additionalLinesOriginalSuffix) {\n                    const t = TokenWithTextArray.fromLineTokens(textModel.tokenization.getLineTokens(additionalLinesOriginalSuffix.lineNumber));\n                    const existingContent = t.slice(additionalLinesOriginalSuffix.columnRange.toZeroBasedOffsetRange());\n                    content = TokenWithTextArray.fromLineTokens(content).append(existingContent).toLineTokens(content.languageIdCodec);\n                }\n                return {\n                    content,\n                    decorations: l.decorations,\n                };\n            });\n            const cursorColumn = this._editor.getSelection()?.getStartPosition().column;\n            const disjointInlineTexts = inlineTextsWithTokens.filter(inline => inline.text !== '');\n            const hasInsertionOnCurrentLine = disjointInlineTexts.length !== 0;\n            const renderData = {\n                cursorColumnDistance: (hasInsertionOnCurrentLine ? disjointInlineTexts[0].column : 1) - cursorColumn,\n                cursorLineDistance: hasInsertionOnCurrentLine ? 0 : (additionalLines.findIndex(line => line.content !== '') + 1),\n                lineCountOriginal: hasInsertionOnCurrentLine ? 1 : 0,\n                lineCountModified: additionalLines.length + (hasInsertionOnCurrentLine ? 1 : 0),\n                characterCountOriginal: 0,\n                characterCountModified: sum(disjointInlineTexts.map(inline => inline.text.length)) + sum(tokenizedAdditionalLines.map(line => line.content.getTextLength())),\n                disjointReplacements: disjointInlineTexts.length + (additionalLines.length > 0 ? 1 : 0),\n                sameShapeReplacements: disjointInlineTexts.length > 1 && tokenizedAdditionalLines.length === 0 ? disjointInlineTexts.every(inline => inline.text === disjointInlineTexts[0].text) : undefined,\n            };\n            this._model.handleInlineCompletionShown.read(reader)?.(renderData);\n            return {\n                replacedRange,\n                inlineTexts: inlineTextsWithTokens,\n                additionalLines: tokenizedAdditionalLines,\n                hiddenRange,\n                lineNumber: ghostText.lineNumber,\n                additionalReservedLineCount: this._model.minReservedLineCount.read(reader),\n                targetTextModel: textModel,\n                syntaxHighlightingEnabled,\n            };\n        });\n        this.decorations = derived(this, reader => {\n            const uiState = this.uiState.read(reader);\n            if (!uiState) {\n                return [];\n            }\n            const decorations = [];\n            const extraClassNames = this._extraClassNames.read(reader);\n            if (uiState.replacedRange) {\n                decorations.push({\n                    range: uiState.replacedRange.toRange(uiState.lineNumber),\n                    options: { inlineClassName: 'inline-completion-text-to-replace' + extraClassNames, description: 'GhostTextReplacement' }\n                });\n            }\n            if (uiState.hiddenRange) {\n                decorations.push({\n                    range: uiState.hiddenRange.toRange(uiState.lineNumber),\n                    options: { inlineClassName: 'ghost-text-hidden', description: 'ghost-text-hidden', }\n                });\n            }\n            for (const p of uiState.inlineTexts) {\n                decorations.push({\n                    range: Range.fromPositions(new Position(uiState.lineNumber, p.column)),\n                    options: {\n                        description: 'ghost-text-decoration',\n                        after: {\n                            content: p.text,\n                            tokens: p.tokens,\n                            inlineClassName: (p.preview ? 'ghost-text-decoration-preview' : 'ghost-text-decoration')\n                                + (this._isClickable ? ' clickable' : '')\n                                + extraClassNames\n                                + p.lineDecorations.map(d => ' ' + d.className).join(' '), // TODO: take the ranges into account for line decorations\n                            cursorStops: InjectedTextCursorStops.Left,\n                            attachedData: new GhostTextAttachedData(this),\n                        },\n                        showIfCollapsed: true,\n                    }\n                });\n            }\n            return decorations;\n        });\n        this._additionalLinesWidget = this._register(new AdditionalLinesWidget(this._editor, derived(reader => {\n            /** @description lines */\n            const uiState = this.uiState.read(reader);\n            return uiState ? {\n                lineNumber: uiState.lineNumber,\n                additionalLines: uiState.additionalLines,\n                minReservedLineCount: uiState.additionalReservedLineCount,\n                targetTextModel: uiState.targetTextModel,\n            } : undefined;\n        }), this._shouldKeepCursorStable, this._isClickable));\n        this._isInlineTextHovered = this._editorObs.isTargetHovered(p => p.target.type === 6 /* MouseTargetType.CONTENT_TEXT */ &&\n            p.target.detail.injectedText?.options.attachedData instanceof GhostTextAttachedData &&\n            p.target.detail.injectedText.options.attachedData.owner === this, this._store);\n        this.isHovered = derived(this, reader => {\n            if (this._isDisposed.read(reader)) {\n                return false;\n            }\n            return this._isInlineTextHovered.read(reader) || this._additionalLinesWidget.isHovered.read(reader);\n        });\n        this.height = derived(this, reader => {\n            const lineHeight = this._editorObs.getOption(75 /* EditorOption.lineHeight */).read(reader);\n            return lineHeight + (this._additionalLinesWidget.viewZoneHeight.read(reader) ?? 0);\n        });\n        this._register(toDisposable(() => { this._isDisposed.set(true, undefined); }));\n        this._register(this._editorObs.setDecorations(this.decorations));\n        if (this._isClickable) {\n            this._register(this._additionalLinesWidget.onDidClick((e) => this._onDidClick.fire(e)));\n            this._register(this._editor.onMouseUp(e => {\n                if (e.target.type !== 6 /* MouseTargetType.CONTENT_TEXT */) {\n                    return;\n                }\n                const a = e.target.detail.injectedText?.options.attachedData;\n                if (a instanceof GhostTextAttachedData && a.owner === this) {\n                    this._onDidClick.fire(e.event);\n                }\n            }));\n        }\n        this._register(autorunWithStore((reader, store) => {\n            {\n                return;\n            }\n        }));\n    }\n    static getWarningWidgetContext(domNode) {\n        // eslint-disable-next-line local/code-no-any-casts\n        const data = domNode.ghostTextViewWarningWidgetData;\n        if (data) {\n            return data;\n        }\n        else if (domNode.parentElement) {\n            return this.getWarningWidgetContext(domNode.parentElement);\n        }\n        return undefined;\n    }\n    ownsViewZone(viewZoneId) {\n        return this._additionalLinesWidget.viewZoneId === viewZoneId;\n    }\n};\nGhostTextView = __decorate([\n    __param(5, ILanguageService)\n], GhostTextView);\nclass GhostTextAttachedData {\n    constructor(owner) {\n        this.owner = owner;\n    }\n}\nfunction computeGhostTextViewData(ghostText, textModel, ghostTextClassName) {\n    const inlineTexts = [];\n    const additionalLines = [];\n    function addToAdditionalLines(ghLines, className) {\n        if (additionalLines.length > 0) {\n            const lastLine = additionalLines[additionalLines.length - 1];\n            if (className) {\n                lastLine.decorations.push(new LineDecoration(lastLine.content.length + 1, lastLine.content.length + 1 + ghLines[0].line.length, className, 0 /* InlineDecorationType.Regular */));\n            }\n            lastLine.content += ghLines[0].line;\n            ghLines = ghLines.slice(1);\n        }\n        for (const ghLine of ghLines) {\n            additionalLines.push({\n                content: ghLine.line,\n                decorations: className ? [new LineDecoration(1, ghLine.line.length + 1, className, 0 /* InlineDecorationType.Regular */), ...ghLine.lineDecorations] : [...ghLine.lineDecorations]\n            });\n        }\n    }\n    const textBufferLine = textModel.getLineContent(ghostText.lineNumber);\n    let hiddenTextStartColumn = undefined;\n    let lastIdx = 0;\n    for (const part of ghostText.parts) {\n        let ghLines = part.lines;\n        if (hiddenTextStartColumn === undefined) {\n            inlineTexts.push({ column: part.column, text: ghLines[0].line, preview: part.preview, lineDecorations: ghLines[0].lineDecorations });\n            ghLines = ghLines.slice(1);\n        }\n        else {\n            addToAdditionalLines([{ line: textBufferLine.substring(lastIdx, part.column - 1), lineDecorations: [] }], undefined);\n        }\n        if (ghLines.length > 0) {\n            addToAdditionalLines(ghLines, ghostTextClassName);\n            if (hiddenTextStartColumn === undefined && part.column <= textBufferLine.length) {\n                hiddenTextStartColumn = part.column;\n            }\n        }\n        lastIdx = part.column - 1;\n    }\n    let additionalLinesOriginalSuffix = undefined;\n    if (hiddenTextStartColumn !== undefined) {\n        additionalLinesOriginalSuffix = new RangeSingleLine(ghostText.lineNumber, new ColumnRange(lastIdx + 1, textBufferLine.length + 1));\n    }\n    const hiddenRange = hiddenTextStartColumn !== undefined ? new ColumnRange(hiddenTextStartColumn, textBufferLine.length + 1) : undefined;\n    return {\n        inlineTexts,\n        additionalLines,\n        hiddenRange,\n        additionalLinesOriginalSuffix,\n    };\n}\nclass AdditionalLinesWidget extends Disposable {\n    get viewZoneId() { return this._viewZoneInfo?.viewZoneId; }\n    get viewZoneHeight() { return this._viewZoneHeight; }\n    constructor(_editor, _lines, _shouldKeepCursorStable, _isClickable) {\n        super();\n        this._editor = _editor;\n        this._lines = _lines;\n        this._shouldKeepCursorStable = _shouldKeepCursorStable;\n        this._isClickable = _isClickable;\n        this._viewZoneHeight = observableValue('viewZoneHeight', undefined);\n        this.editorOptionsChanged = observableSignalFromEvent('editorOptionChanged', Event.filter(this._editor.onDidChangeConfiguration, e => e.hasChanged(40 /* EditorOption.disableMonospaceOptimizations */)\n            || e.hasChanged(133 /* EditorOption.stopRenderingLineAfter */)\n            || e.hasChanged(113 /* EditorOption.renderWhitespace */)\n            || e.hasChanged(108 /* EditorOption.renderControlCharacters */)\n            || e.hasChanged(60 /* EditorOption.fontLigatures */)\n            || e.hasChanged(59 /* EditorOption.fontInfo */)\n            || e.hasChanged(75 /* EditorOption.lineHeight */)));\n        this._onDidClick = this._register(new Emitter());\n        this.onDidClick = this._onDidClick.event;\n        this._viewZoneListener = this._register(new MutableDisposable());\n        this.isHovered = observableCodeEditor(this._editor).isTargetHovered(p => isTargetGhostText(p.target.element), this._store);\n        this.hasBeenAccepted = false;\n        if (this._editor instanceof CodeEditorWidget && this._shouldKeepCursorStable) {\n            this._register(this._editor.onBeforeExecuteEdit(e => this.hasBeenAccepted = e.source === 'inlineSuggestion.accept'));\n        }\n        this._register(autorun(reader => {\n            /** @description update view zone */\n            const lines = this._lines.read(reader);\n            this.editorOptionsChanged.read(reader);\n            if (lines) {\n                this.hasBeenAccepted = false;\n                this.updateLines(lines.lineNumber, lines.additionalLines, lines.minReservedLineCount);\n            }\n            else {\n                this.clear();\n            }\n        }));\n    }\n    dispose() {\n        super.dispose();\n        this.clear();\n    }\n    clear() {\n        this._viewZoneListener.clear();\n        this._editor.changeViewZones((changeAccessor) => {\n            this.removeActiveViewZone(changeAccessor);\n        });\n    }\n    updateLines(lineNumber, additionalLines, minReservedLineCount) {\n        const textModel = this._editor.getModel();\n        if (!textModel) {\n            return;\n        }\n        const { tabSize } = textModel.getOptions();\n        this._editor.changeViewZones((changeAccessor) => {\n            const store = new DisposableStore();\n            this.removeActiveViewZone(changeAccessor);\n            const heightInLines = Math.max(additionalLines.length, minReservedLineCount);\n            if (heightInLines > 0) {\n                const domNode = document.createElement('div');\n                renderLines(domNode, tabSize, additionalLines, this._editor.getOptions(), this._isClickable);\n                if (this._isClickable) {\n                    store.add(addDisposableListener(domNode, 'mousedown', (e) => {\n                        e.preventDefault(); // This prevents that the editor loses focus\n                    }));\n                    store.add(addDisposableListener(domNode, 'click', (e) => {\n                        if (isTargetGhostText(e.target)) {\n                            this._onDidClick.fire(new StandardMouseEvent(getWindow(e), e));\n                        }\n                    }));\n                }\n                this.addViewZone(changeAccessor, lineNumber, heightInLines, domNode);\n            }\n            this._viewZoneListener.value = store;\n        });\n    }\n    addViewZone(changeAccessor, afterLineNumber, heightInLines, domNode) {\n        const id = changeAccessor.addZone({\n            afterLineNumber: afterLineNumber,\n            heightInLines: heightInLines,\n            domNode,\n            afterColumnAffinity: 1 /* PositionAffinity.Right */,\n            onComputedHeight: (height) => {\n                this._viewZoneHeight.set(height, undefined); // TODO: can a transaction be used to avoid flickering?\n            }\n        });\n        this.keepCursorStable(afterLineNumber, heightInLines);\n        this._viewZoneInfo = { viewZoneId: id, heightInLines, lineNumber: afterLineNumber };\n    }\n    removeActiveViewZone(changeAccessor) {\n        if (this._viewZoneInfo) {\n            changeAccessor.removeZone(this._viewZoneInfo.viewZoneId);\n            if (!this.hasBeenAccepted) {\n                this.keepCursorStable(this._viewZoneInfo.lineNumber, -this._viewZoneInfo.heightInLines);\n            }\n            this._viewZoneInfo = undefined;\n            this._viewZoneHeight.set(undefined, undefined);\n        }\n    }\n    keepCursorStable(lineNumber, heightInLines) {\n        if (!this._shouldKeepCursorStable) {\n            return;\n        }\n        const cursorLineNumber = this._editor.getSelection()?.getStartPosition()?.lineNumber;\n        if (cursorLineNumber !== undefined && lineNumber < cursorLineNumber) {\n            this._editor.setScrollTop(this._editor.getScrollTop() + heightInLines * this._editor.getOption(75 /* EditorOption.lineHeight */));\n        }\n    }\n}\nfunction isTargetGhostText(target) {\n    return isHTMLElement(target) && target.classList.contains(GHOST_TEXT_CLASS_NAME);\n}\nfunction renderLines(domNode, tabSize, lines, opts, isClickable) {\n    const disableMonospaceOptimizations = opts.get(40 /* EditorOption.disableMonospaceOptimizations */);\n    const stopRenderingLineAfter = opts.get(133 /* EditorOption.stopRenderingLineAfter */);\n    // To avoid visual confusion, we don't want to render visible whitespace\n    const renderWhitespace = 'none';\n    const renderControlCharacters = opts.get(108 /* EditorOption.renderControlCharacters */);\n    const fontLigatures = opts.get(60 /* EditorOption.fontLigatures */);\n    const fontInfo = opts.get(59 /* EditorOption.fontInfo */);\n    const lineHeight = opts.get(75 /* EditorOption.lineHeight */);\n    let classNames = 'suggest-preview-text';\n    if (isClickable) {\n        classNames += ' clickable';\n    }\n    const sb = new StringBuilder(10000);\n    sb.appendString(`<div class=\"${classNames}\">`);\n    for (let i = 0, len = lines.length; i < len; i++) {\n        const lineData = lines[i];\n        const lineTokens = lineData.content;\n        sb.appendString('<div class=\"view-line');\n        sb.appendString('\" style=\"top:');\n        sb.appendString(String(i * lineHeight));\n        sb.appendString('px;width:1000000px;\">');\n        const line = lineTokens.getLineContent();\n        const isBasicASCII$1 = isBasicASCII(line);\n        const containsRTL$1 = containsRTL(line);\n        renderViewLine(new RenderLineInput((fontInfo.isMonospace && !disableMonospaceOptimizations), fontInfo.canUseHalfwidthRightwardsArrow, line, false, isBasicASCII$1, containsRTL$1, 0, lineTokens, lineData.decorations, tabSize, 0, fontInfo.spaceWidth, fontInfo.middotWidth, fontInfo.wsmiddotWidth, stopRenderingLineAfter, renderWhitespace, renderControlCharacters, fontLigatures !== EditorFontLigatures.OFF, null, null, 0), sb);\n        sb.appendString('</div>');\n    }\n    sb.appendString('</div>');\n    applyFontInfo(domNode, fontInfo);\n    const html = sb.build();\n    const trustedhtml = ttPolicy ? ttPolicy.createHTML(html) : html;\n    domNode.innerHTML = trustedhtml;\n}\nconst ttPolicy = createTrustedTypesPolicy('editorGhostText', { createHTML: value => value });\n\nexport { AdditionalLinesWidget, GhostTextView, ttPolicy };\n","import { assert, checkAdjacentItems } from '../../../../base/common/assert.js';\nimport { splitLines } from '../../../../base/common/strings.js';\nimport { LineRange } from '../ranges/lineRange.js';\nimport { Position } from '../position.js';\nimport { Range } from '../range.js';\n\nclass LineEdit {\n    static { this.empty = new LineEdit([]); }\n    constructor(\n    /**\n     * Have to be sorted by start line number and non-intersecting.\n    */\n    replacements) {\n        this.replacements = replacements;\n        assert(checkAdjacentItems(replacements, (i1, i2) => i1.lineRange.endLineNumberExclusive <= i2.lineRange.startLineNumber));\n    }\n    toString() {\n        return this.replacements.map(e => e.toString()).join(',');\n    }\n    getNewLineRanges() {\n        const ranges = [];\n        let offset = 0;\n        for (const e of this.replacements) {\n            ranges.push(LineRange.ofLength(e.lineRange.startLineNumber + offset, e.newLines.length));\n            offset += e.newLines.length - e.lineRange.length;\n        }\n        return ranges;\n    }\n}\nclass LineReplacement {\n    static fromSingleTextEdit(edit, initialValue) {\n        // 1: ab[cde\n        // 2: fghijk\n        // 3: lmn]opq\n        // replaced with\n        // 1n: 123\n        // 2n: 456\n        // 3n: 789\n        // simple solution: replace [1..4) with [1n..4n)\n        const newLines = splitLines(edit.text);\n        let startLineNumber = edit.range.startLineNumber;\n        const survivingFirstLineText = initialValue.getValueOfRange(Range.fromPositions(new Position(edit.range.startLineNumber, 1), edit.range.getStartPosition()));\n        newLines[0] = survivingFirstLineText + newLines[0];\n        let endLineNumberEx = edit.range.endLineNumber + 1;\n        const editEndLineNumberMaxColumn = initialValue.getTransformer().getLineLength(edit.range.endLineNumber) + 1;\n        const survivingEndLineText = initialValue.getValueOfRange(Range.fromPositions(edit.range.getEndPosition(), new Position(edit.range.endLineNumber, editEndLineNumberMaxColumn)));\n        newLines[newLines.length - 1] = newLines[newLines.length - 1] + survivingEndLineText;\n        // Replacing [startLineNumber, endLineNumberEx) with newLines would be correct, however it might not be minimal.\n        const startBeforeNewLine = edit.range.startColumn === initialValue.getTransformer().getLineLength(edit.range.startLineNumber) + 1;\n        const endAfterNewLine = edit.range.endColumn === 1;\n        if (startBeforeNewLine && newLines[0].length === survivingFirstLineText.length) {\n            // the replacement would not delete any text on the first line\n            startLineNumber++;\n            newLines.shift();\n        }\n        if (newLines.length > 0 && startLineNumber < endLineNumberEx && endAfterNewLine && newLines[newLines.length - 1].length === survivingEndLineText.length) {\n            // the replacement would not delete any text on the last line\n            endLineNumberEx--;\n            newLines.pop();\n        }\n        return new LineReplacement(new LineRange(startLineNumber, endLineNumberEx), newLines);\n    }\n    constructor(lineRange, newLines) {\n        this.lineRange = lineRange;\n        this.newLines = newLines;\n    }\n    toString() {\n        return `${this.lineRange}->${JSON.stringify(this.newLines)}`;\n    }\n    toLineEdit() {\n        return new LineEdit([this]);\n    }\n}\n\nexport { LineEdit, LineReplacement };\n","import { LineReplacement } from '../../../../../common/core/edits/lineEdit.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\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 *--------------------------------------------------------------------------------------------*/\nclass InlineEditWithChanges {\n    get lineEdit() {\n        if (this.edit.replacements.length === 0) {\n            return new LineReplacement(new LineRange(1, 1), []);\n        }\n        return LineReplacement.fromSingleTextEdit(this.edit.toReplacement(this.originalText), this.originalText);\n    }\n    get originalLineRange() { return this.lineEdit.lineRange; }\n    get modifiedLineRange() { return this.lineEdit.toLineEdit().getNewLineRanges()[0]; }\n    get displayRange() {\n        return this.originalText.lineRange.intersect(this.originalLineRange.join(LineRange.ofLength(this.originalLineRange.startLineNumber, this.lineEdit.newLines.length)));\n    }\n    constructor(originalText, edit, cursorPosition, multiCursorPositions, commands, inlineCompletion) {\n        this.originalText = originalText;\n        this.edit = edit;\n        this.cursorPosition = cursorPosition;\n        this.multiCursorPositions = multiCursorPositions;\n        this.commands = commands;\n        this.inlineCompletion = inlineCompletion;\n    }\n}\n\nexport { InlineEditWithChanges };\n","import '../../../../../../base/common/observableInternal/index.js';\nimport { localize } from '../../../../../../nls.js';\nimport { observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { TextEdit } from '../../../../../common/core/edits/textEdit.js';\nimport { StringText } from '../../../../../common/core/text/abstractText.js';\nimport { InlineEditTabAction } from './inlineEditsViewInterface.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { derived } from '../../../../../../base/common/observableInternal/observables/derived.js';\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 *--------------------------------------------------------------------------------------------*/\nclass InlineEditModel {\n    constructor(_model, inlineEdit, tabAction) {\n        this._model = _model;\n        this.inlineEdit = inlineEdit;\n        this.tabAction = tabAction;\n        this.action = this.inlineEdit.inlineCompletion.action;\n        this.displayName = this.inlineEdit.inlineCompletion.source.provider.displayName ?? localize(1219, \"Inline Edit\");\n        this.extensionCommands = this.inlineEdit.inlineCompletion.source.inlineSuggestions.commands ?? [];\n        this.isInDiffEditor = this._model.isInDiffEditor;\n        this.displayLocation = this.inlineEdit.inlineCompletion.hint;\n        this.showCollapsed = this._model.showCollapsed;\n    }\n    accept() {\n        this._model.accept();\n    }\n    jump() {\n        this._model.jump();\n    }\n    handleInlineEditShown(viewKind, viewData) {\n        this._model.handleInlineSuggestionShown(this.inlineEdit.inlineCompletion, viewKind, viewData);\n    }\n}\nclass InlineEditHost {\n    constructor(_model) {\n        this._model = _model;\n        this.onDidAccept = this._model.onDidAccept;\n        this.inAcceptFlow = this._model.inAcceptFlow;\n    }\n}\nclass GhostTextIndicator {\n    constructor(editor, model, lineRange, inlineCompletion) {\n        this.lineRange = lineRange;\n        const editorObs = observableCodeEditor(editor);\n        const tabAction = derived(this, reader => {\n            if (editorObs.isFocused.read(reader)) {\n                if (inlineCompletion.showInlineEditMenu) {\n                    return InlineEditTabAction.Accept;\n                }\n            }\n            return InlineEditTabAction.Inactive;\n        });\n        this.model = new InlineEditModel(model, new InlineEditWithChanges(new StringText(''), new TextEdit([inlineCompletion.getSingleTextEdit()]), model.primaryPosition.get(), model.allPositions.get(), inlineCompletion.source.inlineSuggestions.commands ?? [], inlineCompletion), tabAction);\n    }\n}\n\nexport { GhostTextIndicator, InlineEditHost, InlineEditModel };\n","import { BugIndicatingError } from '../../../../base/common/errors.js';\nimport { Point } from './point.js';\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 *--------------------------------------------------------------------------------------------*/\nclass Rect {\n    static fromPoints(topLeft, bottomRight) {\n        return new Rect(topLeft.x, topLeft.y, bottomRight.x, bottomRight.y);\n    }\n    static fromPointSize(point, size) {\n        return new Rect(point.x, point.y, point.x + size.x, point.y + size.y);\n    }\n    static fromLeftTopRightBottom(left, top, right, bottom) {\n        return new Rect(left, top, right, bottom);\n    }\n    static fromLeftTopWidthHeight(left, top, width, height) {\n        return new Rect(left, top, left + width, top + height);\n    }\n    static fromRanges(leftRight, topBottom) {\n        return new Rect(leftRight.start, topBottom.start, leftRight.endExclusive, topBottom.endExclusive);\n    }\n    static hull(rects) {\n        let left = Number.MAX_SAFE_INTEGER;\n        let top = Number.MAX_SAFE_INTEGER;\n        let right = Number.MIN_SAFE_INTEGER;\n        let bottom = Number.MIN_SAFE_INTEGER;\n        for (const rect of rects) {\n            left = Math.min(left, rect.left);\n            top = Math.min(top, rect.top);\n            right = Math.max(right, rect.right);\n            bottom = Math.max(bottom, rect.bottom);\n        }\n        return new Rect(left, top, right, bottom);\n    }\n    get width() { return this.right - this.left; }\n    get height() { return this.bottom - this.top; }\n    constructor(left, top, right, bottom) {\n        this.left = left;\n        this.top = top;\n        this.right = right;\n        this.bottom = bottom;\n        if (left > right) {\n            throw new BugIndicatingError('Invalid arguments: Horizontally offset by ' + (left - right));\n        }\n        if (top > bottom) {\n            throw new BugIndicatingError('Invalid arguments: Vertically offset by ' + (top - bottom));\n        }\n    }\n    withMargin(marginOrVerticalOrTop, rightOrHorizontal, bottom, left) {\n        let marginLeft, marginRight, marginTop, marginBottom;\n        // Single margin value\n        if (rightOrHorizontal === undefined && bottom === undefined && left === undefined) {\n            marginLeft = marginRight = marginTop = marginBottom = marginOrVerticalOrTop;\n        }\n        // Vertical and horizontal margins\n        else if (bottom === undefined && left === undefined) {\n            marginLeft = marginRight = rightOrHorizontal;\n            marginTop = marginBottom = marginOrVerticalOrTop;\n        }\n        // Individual margins for all sides\n        else {\n            marginLeft = left;\n            marginRight = rightOrHorizontal;\n            marginTop = marginOrVerticalOrTop;\n            marginBottom = bottom;\n        }\n        return new Rect(this.left - marginLeft, this.top - marginTop, this.right + marginRight, this.bottom + marginBottom);\n    }\n    intersectVertical(range) {\n        const newTop = Math.max(this.top, range.start);\n        const newBottom = Math.min(this.bottom, range.endExclusive);\n        return new Rect(this.left, newTop, this.right, Math.max(newTop, newBottom));\n    }\n    intersectHorizontal(range) {\n        const newLeft = Math.max(this.left, range.start);\n        const newRight = Math.min(this.right, range.endExclusive);\n        return new Rect(newLeft, this.top, Math.max(newLeft, newRight), this.bottom);\n    }\n    toString() {\n        return `Rect{(${this.left},${this.top}), (${this.right},${this.bottom})}`;\n    }\n    intersect(parent) {\n        const left = Math.max(this.left, parent.left);\n        const right = Math.min(this.right, parent.right);\n        const top = Math.max(this.top, parent.top);\n        const bottom = Math.min(this.bottom, parent.bottom);\n        if (left > right || top > bottom) {\n            return undefined;\n        }\n        return new Rect(left, top, right, bottom);\n    }\n    containsRect(other) {\n        return this.left <= other.left\n            && this.top <= other.top\n            && this.right >= other.right\n            && this.bottom >= other.bottom;\n    }\n    containsPoint(point) {\n        return this.left <= point.x\n            && this.top <= point.y\n            && this.right >= point.x\n            && this.bottom >= point.y;\n    }\n    moveToBeContainedIn(parent) {\n        const width = this.width;\n        const height = this.height;\n        let left = this.left;\n        let top = this.top;\n        if (left < parent.left) {\n            left = parent.left;\n        }\n        else if (left + width > parent.right) {\n            left = parent.right - width;\n        }\n        if (top < parent.top) {\n            top = parent.top;\n        }\n        else if (top + height > parent.bottom) {\n            top = parent.bottom - height;\n        }\n        return new Rect(left, top, left + width, top + height);\n    }\n    withWidth(width) {\n        return new Rect(this.left, this.top, this.left + width, this.bottom);\n    }\n    withHeight(height) {\n        return new Rect(this.left, this.top, this.right, this.top + height);\n    }\n    withTop(top) {\n        return new Rect(this.left, top, this.right, this.bottom);\n    }\n    withLeft(left) {\n        return new Rect(left, this.top, this.right, this.bottom);\n    }\n    translateX(delta) {\n        return new Rect(this.left + delta, this.top, this.right + delta, this.bottom);\n    }\n    translateY(delta) {\n        return new Rect(this.left, this.top + delta, this.right, this.bottom + delta);\n    }\n    getLeftBottom() {\n        return new Point(this.left, this.bottom);\n    }\n    getRightBottom() {\n        return new Point(this.right, this.bottom);\n    }\n    getRightTop() {\n        return new Point(this.right, this.top);\n    }\n    toStyles() {\n        return {\n            position: 'absolute',\n            left: `${this.left}px`,\n            top: `${this.top}px`,\n            width: `${this.width}px`,\n            height: `${this.height}px`,\n        };\n    }\n}\n\nexport { Rect };\n","import { addDisposableListener, EventType } from '../../../../base/browser/dom.js';\nimport { createTrustedTypesPolicy } from '../../../../base/browser/trustedTypes.js';\nimport { equals } from '../../../../base/common/arrays.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\nimport './stickyScroll.css';\nimport { getColumnOfNodeOffset } from '../../../browser/viewParts/viewLines/viewLine.js';\nimport { EmbeddedCodeEditorWidget } from '../../../browser/widget/codeEditor/embeddedCodeEditorWidget.js';\nimport { Position } from '../../../common/core/position.js';\nimport { StringBuilder } from '../../../common/core/stringBuilder.js';\nimport { LineDecoration } from '../../../common/viewLayout/lineDecorations.js';\nimport { RenderLineInput, renderViewLine } from '../../../common/viewLayout/viewLineRenderer.js';\nimport { foldingCollapsedIcon, foldingExpandedIcon } from '../../folding/browser/foldingDecorations.js';\nimport { Emitter } from '../../../../base/common/event.js';\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 *--------------------------------------------------------------------------------------------*/\nclass StickyScrollWidgetState {\n    constructor(startLineNumbers, endLineNumbers, lastLineRelativePosition, showEndForLine = null) {\n        this.startLineNumbers = startLineNumbers;\n        this.endLineNumbers = endLineNumbers;\n        this.lastLineRelativePosition = lastLineRelativePosition;\n        this.showEndForLine = showEndForLine;\n    }\n    equals(other) {\n        return !!other\n            && this.lastLineRelativePosition === other.lastLineRelativePosition\n            && this.showEndForLine === other.showEndForLine\n            && equals(this.startLineNumbers, other.startLineNumbers)\n            && equals(this.endLineNumbers, other.endLineNumbers);\n    }\n    static get Empty() {\n        return new StickyScrollWidgetState([], [], 0);\n    }\n}\nconst _ttPolicy = createTrustedTypesPolicy('stickyScrollViewLayer', { createHTML: value => value });\nconst STICKY_INDEX_ATTR = 'data-sticky-line-index';\nconst STICKY_IS_LINE_ATTR = 'data-sticky-is-line';\nconst STICKY_IS_LINE_NUMBER_ATTR = 'data-sticky-is-line-number';\nconst STICKY_IS_FOLDING_ICON_ATTR = 'data-sticky-is-folding-icon';\nclass StickyScrollWidget extends Disposable {\n    get height() { return this._height; }\n    constructor(editor) {\n        super();\n        this._foldingIconStore = this._register(new DisposableStore());\n        this._rootDomNode = document.createElement('div');\n        this._lineNumbersDomNode = document.createElement('div');\n        this._linesDomNodeScrollable = document.createElement('div');\n        this._linesDomNode = document.createElement('div');\n        this._renderedStickyLines = [];\n        this._lineNumbers = [];\n        this._lastLineRelativePosition = 0;\n        this._minContentWidthInPx = 0;\n        this._isOnGlyphMargin = false;\n        this._height = -1;\n        this._onDidChangeStickyScrollHeight = this._register(new Emitter());\n        this.onDidChangeStickyScrollHeight = this._onDidChangeStickyScrollHeight.event;\n        this._editor = editor;\n        this._lineHeight = editor.getOption(75 /* EditorOption.lineHeight */);\n        this._lineNumbersDomNode.className = 'sticky-widget-line-numbers';\n        this._lineNumbersDomNode.setAttribute('role', 'none');\n        this._linesDomNode.className = 'sticky-widget-lines';\n        this._linesDomNode.setAttribute('role', 'list');\n        this._linesDomNodeScrollable.className = 'sticky-widget-lines-scrollable';\n        this._linesDomNodeScrollable.appendChild(this._linesDomNode);\n        this._rootDomNode.className = 'sticky-widget';\n        this._rootDomNode.classList.toggle('peek', editor instanceof EmbeddedCodeEditorWidget);\n        this._rootDomNode.appendChild(this._lineNumbersDomNode);\n        this._rootDomNode.appendChild(this._linesDomNodeScrollable);\n        this._setHeight(0);\n        const updateScrollLeftPosition = () => {\n            this._linesDomNode.style.left = this._editor.getOption(131 /* EditorOption.stickyScroll */).scrollWithEditor ? `-${this._editor.getScrollLeft()}px` : '0px';\n        };\n        this._register(this._editor.onDidChangeConfiguration((e) => {\n            if (e.hasChanged(131 /* EditorOption.stickyScroll */)) {\n                updateScrollLeftPosition();\n            }\n            if (e.hasChanged(75 /* EditorOption.lineHeight */)) {\n                this._lineHeight = this._editor.getOption(75 /* EditorOption.lineHeight */);\n            }\n        }));\n        this._register(this._editor.onDidScrollChange((e) => {\n            if (e.scrollLeftChanged) {\n                updateScrollLeftPosition();\n            }\n            if (e.scrollWidthChanged) {\n                this._updateWidgetWidth();\n            }\n        }));\n        this._register(this._editor.onDidChangeModel(() => {\n            updateScrollLeftPosition();\n            this._updateWidgetWidth();\n        }));\n        updateScrollLeftPosition();\n        this._register(this._editor.onDidLayoutChange((e) => {\n            this._updateWidgetWidth();\n        }));\n        this._updateWidgetWidth();\n    }\n    get lineNumbers() {\n        return this._lineNumbers;\n    }\n    get lineNumberCount() {\n        return this._lineNumbers.length;\n    }\n    getRenderedStickyLine(lineNumber) {\n        return this._renderedStickyLines.find(stickyLine => stickyLine.lineNumber === lineNumber);\n    }\n    getCurrentLines() {\n        return this._lineNumbers;\n    }\n    setState(state, foldingModel, rebuildFromIndexCandidate) {\n        const currentStateAndPreviousStateUndefined = !this._state && !state;\n        const currentStateDefinedAndEqualsPreviousState = this._state && this._state.equals(state);\n        if (rebuildFromIndexCandidate === undefined && (currentStateAndPreviousStateUndefined || currentStateDefinedAndEqualsPreviousState)) {\n            return;\n        }\n        const data = this._findRenderingData(state);\n        const previousLineNumbers = this._lineNumbers;\n        this._lineNumbers = data.lineNumbers;\n        this._lastLineRelativePosition = data.lastLineRelativePosition;\n        const rebuildFromIndex = this._findIndexToRebuildFrom(previousLineNumbers, this._lineNumbers, rebuildFromIndexCandidate);\n        this._renderRootNode(this._lineNumbers, this._lastLineRelativePosition, foldingModel, rebuildFromIndex);\n        this._state = state;\n    }\n    _findRenderingData(state) {\n        if (!state) {\n            return { lineNumbers: [], lastLineRelativePosition: 0 };\n        }\n        const candidateLineNumbers = [...state.startLineNumbers];\n        if (state.showEndForLine !== null) {\n            candidateLineNumbers[state.showEndForLine] = state.endLineNumbers[state.showEndForLine];\n        }\n        let totalHeight = 0;\n        for (let i = 0; i < candidateLineNumbers.length; i++) {\n            totalHeight += this._editor.getLineHeightForPosition(new Position(candidateLineNumbers[i], 1));\n        }\n        if (totalHeight === 0) {\n            return { lineNumbers: [], lastLineRelativePosition: 0 };\n        }\n        return { lineNumbers: candidateLineNumbers, lastLineRelativePosition: state.lastLineRelativePosition };\n    }\n    _findIndexToRebuildFrom(previousLineNumbers, newLineNumbers, rebuildFromIndexCandidate) {\n        if (newLineNumbers.length === 0) {\n            return 0;\n        }\n        if (rebuildFromIndexCandidate !== undefined) {\n            return rebuildFromIndexCandidate;\n        }\n        const validIndex = newLineNumbers.findIndex(startLineNumber => !previousLineNumbers.includes(startLineNumber));\n        return validIndex === -1 ? 0 : validIndex;\n    }\n    _updateWidgetWidth() {\n        const layoutInfo = this._editor.getLayoutInfo();\n        const lineNumbersWidth = layoutInfo.contentLeft;\n        this._lineNumbersDomNode.style.width = `${lineNumbersWidth}px`;\n        this._linesDomNodeScrollable.style.setProperty('--vscode-editorStickyScroll-scrollableWidth', `${this._editor.getScrollWidth() - layoutInfo.verticalScrollbarWidth}px`);\n        this._rootDomNode.style.width = `${layoutInfo.width - layoutInfo.verticalScrollbarWidth}px`;\n    }\n    _useFoldingOpacityTransition(requireTransitions) {\n        this._lineNumbersDomNode.style.setProperty('--vscode-editorStickyScroll-foldingOpacityTransition', `opacity ${requireTransitions ? 0.5 : 0}s`);\n    }\n    _setFoldingIconsVisibility(allVisible) {\n        for (const line of this._renderedStickyLines) {\n            const foldingIcon = line.foldingIcon;\n            if (!foldingIcon) {\n                continue;\n            }\n            foldingIcon.setVisible(allVisible ? true : foldingIcon.isCollapsed);\n        }\n    }\n    async _renderRootNode(lineNumbers, lastLineRelativePosition, foldingModel, rebuildFromIndex) {\n        const viewModel = this._editor._getViewModel();\n        if (!viewModel) {\n            this._clearWidget();\n            return;\n        }\n        if (lineNumbers.length === 0) {\n            this._clearWidget();\n            return;\n        }\n        const renderedStickyLines = [];\n        const lastLineNumber = lineNumbers[lineNumbers.length - 1];\n        let top = 0;\n        for (let i = 0; i < this._renderedStickyLines.length; i++) {\n            if (i < rebuildFromIndex) {\n                const renderedLine = this._renderedStickyLines[i];\n                renderedStickyLines.push(this._updatePosition(renderedLine, top, renderedLine.lineNumber === lastLineNumber));\n                top += renderedLine.height;\n            }\n            else {\n                const renderedLine = this._renderedStickyLines[i];\n                renderedLine.lineNumberDomNode.remove();\n                renderedLine.lineDomNode.remove();\n            }\n        }\n        const layoutInfo = this._editor.getLayoutInfo();\n        for (let i = rebuildFromIndex; i < lineNumbers.length; i++) {\n            const stickyLine = this._renderChildNode(viewModel, i, lineNumbers[i], top, lastLineNumber === lineNumbers[i], foldingModel, layoutInfo);\n            top += stickyLine.height;\n            this._linesDomNode.appendChild(stickyLine.lineDomNode);\n            this._lineNumbersDomNode.appendChild(stickyLine.lineNumberDomNode);\n            renderedStickyLines.push(stickyLine);\n        }\n        if (foldingModel) {\n            this._setFoldingHoverListeners();\n            this._useFoldingOpacityTransition(!this._isOnGlyphMargin);\n        }\n        this._minContentWidthInPx = Math.max(...this._renderedStickyLines.map(l => l.scrollWidth)) + layoutInfo.verticalScrollbarWidth;\n        this._renderedStickyLines = renderedStickyLines;\n        this._setHeight(top + lastLineRelativePosition);\n        this._editor.layoutOverlayWidget(this);\n    }\n    _clearWidget() {\n        for (let i = 0; i < this._renderedStickyLines.length; i++) {\n            const stickyLine = this._renderedStickyLines[i];\n            stickyLine.lineNumberDomNode.remove();\n            stickyLine.lineDomNode.remove();\n        }\n        this._setHeight(0);\n    }\n    _setHeight(height) {\n        if (this._height === height) {\n            return;\n        }\n        this._height = height;\n        if (this._height === 0) {\n            this._rootDomNode.style.display = 'none';\n        }\n        else {\n            this._rootDomNode.style.display = 'block';\n            this._lineNumbersDomNode.style.height = `${this._height}px`;\n            this._linesDomNodeScrollable.style.height = `${this._height}px`;\n            this._rootDomNode.style.height = `${this._height}px`;\n        }\n        this._onDidChangeStickyScrollHeight.fire({ height: this._height });\n    }\n    _setFoldingHoverListeners() {\n        const showFoldingControls = this._editor.getOption(126 /* EditorOption.showFoldingControls */);\n        if (showFoldingControls !== 'mouseover') {\n            return;\n        }\n        this._foldingIconStore.clear();\n        this._foldingIconStore.add(addDisposableListener(this._lineNumbersDomNode, EventType.MOUSE_ENTER, () => {\n            this._isOnGlyphMargin = true;\n            this._setFoldingIconsVisibility(true);\n        }));\n        this._foldingIconStore.add(addDisposableListener(this._lineNumbersDomNode, EventType.MOUSE_LEAVE, () => {\n            this._isOnGlyphMargin = false;\n            this._useFoldingOpacityTransition(true);\n            this._setFoldingIconsVisibility(false);\n        }));\n    }\n    _renderChildNode(viewModel, index, line, top, isLastLine, foldingModel, layoutInfo) {\n        const viewLineNumber = viewModel.coordinatesConverter.convertModelPositionToViewPosition(new Position(line, 1)).lineNumber;\n        const lineRenderingData = viewModel.getViewLineRenderingData(viewLineNumber);\n        const lineNumberOption = this._editor.getOption(76 /* EditorOption.lineNumbers */);\n        const verticalScrollbarSize = this._editor.getOption(117 /* EditorOption.scrollbar */).verticalScrollbarSize;\n        let actualInlineDecorations;\n        try {\n            actualInlineDecorations = LineDecoration.filter(lineRenderingData.inlineDecorations, viewLineNumber, lineRenderingData.minColumn, lineRenderingData.maxColumn);\n        }\n        catch (err) {\n            actualInlineDecorations = [];\n        }\n        const lineHeight = this._editor.getLineHeightForPosition(new Position(line, 1));\n        const textDirection = viewModel.getTextDirection(line);\n        const renderLineInput = new RenderLineInput(true, true, lineRenderingData.content, lineRenderingData.continuesWithWrappedLine, lineRenderingData.isBasicASCII, lineRenderingData.containsRTL, 0, lineRenderingData.tokens, actualInlineDecorations, lineRenderingData.tabSize, lineRenderingData.startVisibleColumn, 1, 1, 1, 500, 'none', true, true, null, textDirection, verticalScrollbarSize);\n        const sb = new StringBuilder(2000);\n        const renderOutput = renderViewLine(renderLineInput, sb);\n        let newLine;\n        if (_ttPolicy) {\n            newLine = _ttPolicy.createHTML(sb.build());\n        }\n        else {\n            newLine = sb.build();\n        }\n        const lineHTMLNode = document.createElement('span');\n        lineHTMLNode.setAttribute(STICKY_INDEX_ATTR, String(index));\n        lineHTMLNode.setAttribute(STICKY_IS_LINE_ATTR, '');\n        lineHTMLNode.setAttribute('role', 'listitem');\n        lineHTMLNode.tabIndex = 0;\n        lineHTMLNode.className = 'sticky-line-content';\n        lineHTMLNode.classList.add(`stickyLine${line}`);\n        lineHTMLNode.style.lineHeight = `${lineHeight}px`;\n        lineHTMLNode.innerHTML = newLine;\n        const lineNumberHTMLNode = document.createElement('span');\n        lineNumberHTMLNode.setAttribute(STICKY_INDEX_ATTR, String(index));\n        lineNumberHTMLNode.setAttribute(STICKY_IS_LINE_NUMBER_ATTR, '');\n        lineNumberHTMLNode.className = 'sticky-line-number';\n        lineNumberHTMLNode.style.lineHeight = `${lineHeight}px`;\n        const lineNumbersWidth = layoutInfo.contentLeft;\n        lineNumberHTMLNode.style.width = `${lineNumbersWidth}px`;\n        const innerLineNumberHTML = document.createElement('span');\n        if (lineNumberOption.renderType === 1 /* RenderLineNumbersType.On */ || lineNumberOption.renderType === 3 /* RenderLineNumbersType.Interval */ && line % 10 === 0) {\n            innerLineNumberHTML.innerText = line.toString();\n        }\n        else if (lineNumberOption.renderType === 2 /* RenderLineNumbersType.Relative */) {\n            innerLineNumberHTML.innerText = Math.abs(line - this._editor.getPosition().lineNumber).toString();\n        }\n        innerLineNumberHTML.className = 'sticky-line-number-inner';\n        innerLineNumberHTML.style.width = `${layoutInfo.lineNumbersWidth}px`;\n        innerLineNumberHTML.style.paddingLeft = `${layoutInfo.lineNumbersLeft}px`;\n        lineNumberHTMLNode.appendChild(innerLineNumberHTML);\n        const foldingIcon = this._renderFoldingIconForLine(foldingModel, line);\n        if (foldingIcon) {\n            lineNumberHTMLNode.appendChild(foldingIcon.domNode);\n            foldingIcon.domNode.style.left = `${layoutInfo.lineNumbersWidth + layoutInfo.lineNumbersLeft}px`;\n            foldingIcon.domNode.style.lineHeight = `${lineHeight}px`;\n        }\n        this._editor.applyFontInfo(lineHTMLNode);\n        this._editor.applyFontInfo(lineNumberHTMLNode);\n        lineNumberHTMLNode.style.lineHeight = `${lineHeight}px`;\n        lineHTMLNode.style.lineHeight = `${lineHeight}px`;\n        lineNumberHTMLNode.style.height = `${lineHeight}px`;\n        lineHTMLNode.style.height = `${lineHeight}px`;\n        const renderedLine = new RenderedStickyLine(index, line, lineHTMLNode, lineNumberHTMLNode, foldingIcon, renderOutput.characterMapping, lineHTMLNode.scrollWidth, lineHeight);\n        return this._updatePosition(renderedLine, top, isLastLine);\n    }\n    _updatePosition(stickyLine, top, isLastLine) {\n        const lineHTMLNode = stickyLine.lineDomNode;\n        const lineNumberHTMLNode = stickyLine.lineNumberDomNode;\n        if (isLastLine) {\n            const zIndex = '0';\n            lineHTMLNode.style.zIndex = zIndex;\n            lineNumberHTMLNode.style.zIndex = zIndex;\n            const updatedTop = `${top + this._lastLineRelativePosition + (stickyLine.foldingIcon?.isCollapsed ? 1 : 0)}px`;\n            lineHTMLNode.style.top = updatedTop;\n            lineNumberHTMLNode.style.top = updatedTop;\n        }\n        else {\n            const zIndex = '1';\n            lineHTMLNode.style.zIndex = zIndex;\n            lineNumberHTMLNode.style.zIndex = zIndex;\n            lineHTMLNode.style.top = `${top}px`;\n            lineNumberHTMLNode.style.top = `${top}px`;\n        }\n        return stickyLine;\n    }\n    _renderFoldingIconForLine(foldingModel, line) {\n        const showFoldingControls = this._editor.getOption(126 /* EditorOption.showFoldingControls */);\n        if (!foldingModel || showFoldingControls === 'never') {\n            return;\n        }\n        const foldingRegions = foldingModel.regions;\n        const indexOfFoldingRegion = foldingRegions.findRange(line);\n        const startLineNumber = foldingRegions.getStartLineNumber(indexOfFoldingRegion);\n        const isFoldingScope = line === startLineNumber;\n        if (!isFoldingScope) {\n            return;\n        }\n        const isCollapsed = foldingRegions.isCollapsed(indexOfFoldingRegion);\n        const foldingIcon = new StickyFoldingIcon(isCollapsed, startLineNumber, foldingRegions.getEndLineNumber(indexOfFoldingRegion), this._lineHeight);\n        foldingIcon.setVisible(this._isOnGlyphMargin ? true : (isCollapsed || showFoldingControls === 'always'));\n        foldingIcon.domNode.setAttribute(STICKY_IS_FOLDING_ICON_ATTR, '');\n        return foldingIcon;\n    }\n    getId() {\n        return 'editor.contrib.stickyScrollWidget';\n    }\n    getDomNode() {\n        return this._rootDomNode;\n    }\n    getPosition() {\n        return {\n            preference: 2 /* OverlayWidgetPositionPreference.TOP_CENTER */,\n            stackOridinal: 10,\n        };\n    }\n    getMinContentWidthInPx() {\n        return this._minContentWidthInPx;\n    }\n    focusLineWithIndex(index) {\n        if (0 <= index && index < this._renderedStickyLines.length) {\n            this._renderedStickyLines[index].lineDomNode.focus();\n        }\n    }\n    /**\n     * Given a leaf dom node, tries to find the editor position.\n     */\n    getEditorPositionFromNode(spanDomNode) {\n        if (!spanDomNode || spanDomNode.children.length > 0) {\n            // This is not a leaf node\n            return null;\n        }\n        const renderedStickyLine = this._getRenderedStickyLineFromChildDomNode(spanDomNode);\n        if (!renderedStickyLine) {\n            return null;\n        }\n        const column = getColumnOfNodeOffset(renderedStickyLine.characterMapping, spanDomNode, 0);\n        return new Position(renderedStickyLine.lineNumber, column);\n    }\n    getLineNumberFromChildDomNode(domNode) {\n        return this._getRenderedStickyLineFromChildDomNode(domNode)?.lineNumber ?? null;\n    }\n    _getRenderedStickyLineFromChildDomNode(domNode) {\n        const index = this.getLineIndexFromChildDomNode(domNode);\n        if (index === null || index < 0 || index >= this._renderedStickyLines.length) {\n            return null;\n        }\n        return this._renderedStickyLines[index];\n    }\n    /**\n     * Given a child dom node, tries to find the line number attribute that was stored in the node.\n     * @returns the attribute value or null if none is found.\n     */\n    getLineIndexFromChildDomNode(domNode) {\n        const lineIndex = this._getAttributeValue(domNode, STICKY_INDEX_ATTR);\n        return lineIndex ? parseInt(lineIndex, 10) : null;\n    }\n    /**\n     * Given a child dom node, tries to find if it is (contained in) a sticky line.\n     * @returns a boolean.\n     */\n    isInStickyLine(domNode) {\n        const isInLine = this._getAttributeValue(domNode, STICKY_IS_LINE_ATTR);\n        return isInLine !== undefined;\n    }\n    /**\n     * Given a child dom node, tries to find if this dom node is (contained in) a sticky folding icon.\n     * @returns a boolean.\n     */\n    isInFoldingIconDomNode(domNode) {\n        const isInFoldingIcon = this._getAttributeValue(domNode, STICKY_IS_FOLDING_ICON_ATTR);\n        return isInFoldingIcon !== undefined;\n    }\n    /**\n     * Given the dom node, finds if it or its parent sequence contains the given attribute.\n     * @returns the attribute value or undefined.\n     */\n    _getAttributeValue(domNode, attribute) {\n        while (domNode && domNode !== this._rootDomNode) {\n            const line = domNode.getAttribute(attribute);\n            if (line !== null) {\n                return line;\n            }\n            domNode = domNode.parentElement;\n        }\n        return;\n    }\n}\nclass RenderedStickyLine {\n    constructor(index, lineNumber, lineDomNode, lineNumberDomNode, foldingIcon, characterMapping, scrollWidth, height) {\n        this.index = index;\n        this.lineNumber = lineNumber;\n        this.lineDomNode = lineDomNode;\n        this.lineNumberDomNode = lineNumberDomNode;\n        this.foldingIcon = foldingIcon;\n        this.characterMapping = characterMapping;\n        this.scrollWidth = scrollWidth;\n        this.height = height;\n    }\n}\nclass StickyFoldingIcon {\n    constructor(isCollapsed, foldingStartLine, foldingEndLine, dimension) {\n        this.isCollapsed = isCollapsed;\n        this.foldingStartLine = foldingStartLine;\n        this.foldingEndLine = foldingEndLine;\n        this.dimension = dimension;\n        this.domNode = document.createElement('div');\n        this.domNode.style.width = `26px`;\n        this.domNode.style.height = `${dimension}px`;\n        this.domNode.style.lineHeight = `${dimension}px`;\n        this.domNode.className = ThemeIcon.asClassName(isCollapsed ? foldingCollapsedIcon : foldingExpandedIcon);\n    }\n    setVisible(visible) {\n        this.domNode.style.cursor = visible ? 'pointer' : 'default';\n        this.domNode.style.opacity = visible ? '1' : '0';\n    }\n}\n\nexport { StickyScrollWidget, StickyScrollWidgetState };\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 *--------------------------------------------------------------------------------------------*/\nclass StickyRange {\n    constructor(startLineNumber, endLineNumber) {\n        this.startLineNumber = startLineNumber;\n        this.endLineNumber = endLineNumber;\n    }\n}\nclass StickyElement {\n    constructor(\n    /**\n     * Range of line numbers spanned by the current scope\n     */\n    range, \n    /**\n     * Must be sorted by start line number\n    */\n    children, \n    /**\n     * Parent sticky outline element\n     */\n    parent) {\n        this.range = range;\n        this.children = children;\n        this.parent = parent;\n    }\n}\nclass StickyModel {\n    constructor(uri, version, element, outlineProviderId) {\n        this.uri = uri;\n        this.version = version;\n        this.element = element;\n        this.outlineProviderId = outlineProviderId;\n    }\n}\n\nexport { StickyElement, StickyModel, StickyRange };\n","import { Disposable, DisposableStore, MutableDisposable } from '../../../../base/common/lifecycle.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { OutlineModel, OutlineGroup, OutlineElement } from '../../documentSymbols/browser/outlineModel.js';\nimport { Delayer, createCancelablePromise } from '../../../../base/common/async.js';\nimport { FoldingController, RangesLimitReporter } from '../../folding/browser/folding.js';\nimport { SyntaxRangeProvider } from '../../folding/browser/syntaxRangeProvider.js';\nimport { IndentRangeProvider } from '../../folding/browser/indentRangeProvider.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { StickyModel, StickyRange, StickyElement } from './stickyScrollElement.js';\nimport { Iterable } from '../../../../base/common/iterator.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ModelProvider;\n(function (ModelProvider) {\n    ModelProvider[\"OUTLINE_MODEL\"] = \"outlineModel\";\n    ModelProvider[\"FOLDING_PROVIDER_MODEL\"] = \"foldingProviderModel\";\n    ModelProvider[\"INDENTATION_MODEL\"] = \"indentationModel\";\n})(ModelProvider || (ModelProvider = {}));\nvar Status;\n(function (Status) {\n    Status[Status[\"VALID\"] = 0] = \"VALID\";\n    Status[Status[\"INVALID\"] = 1] = \"INVALID\";\n    Status[Status[\"CANCELED\"] = 2] = \"CANCELED\";\n})(Status || (Status = {}));\nlet StickyModelProvider = class StickyModelProvider extends Disposable {\n    constructor(_editor, onProviderUpdate, _languageConfigurationService, _languageFeaturesService) {\n        super();\n        this._editor = _editor;\n        this._modelProviders = [];\n        this._modelPromise = null;\n        this._updateScheduler = this._register(new Delayer(300));\n        this._updateOperation = this._register(new DisposableStore());\n        switch (this._editor.getOption(131 /* EditorOption.stickyScroll */).defaultModel) {\n            case ModelProvider.OUTLINE_MODEL:\n                this._modelProviders.push(new StickyModelFromCandidateOutlineProvider(this._editor, _languageFeaturesService));\n            // fall through\n            case ModelProvider.FOLDING_PROVIDER_MODEL:\n                this._modelProviders.push(new StickyModelFromCandidateSyntaxFoldingProvider(this._editor, onProviderUpdate, _languageFeaturesService));\n            // fall through\n            case ModelProvider.INDENTATION_MODEL:\n                this._modelProviders.push(new StickyModelFromCandidateIndentationFoldingProvider(this._editor, _languageConfigurationService));\n                break;\n        }\n    }\n    dispose() {\n        this._modelProviders.forEach(provider => provider.dispose());\n        this._updateOperation.clear();\n        this._cancelModelPromise();\n        super.dispose();\n    }\n    _cancelModelPromise() {\n        if (this._modelPromise) {\n            this._modelPromise.cancel();\n            this._modelPromise = null;\n        }\n    }\n    async update(token) {\n        this._updateOperation.clear();\n        this._updateOperation.add({\n            dispose: () => {\n                this._cancelModelPromise();\n                this._updateScheduler.cancel();\n            }\n        });\n        this._cancelModelPromise();\n        return await this._updateScheduler.trigger(async () => {\n            for (const modelProvider of this._modelProviders) {\n                const { statusPromise, modelPromise } = modelProvider.computeStickyModel(token);\n                this._modelPromise = modelPromise;\n                const status = await statusPromise;\n                if (this._modelPromise !== modelPromise) {\n                    return null;\n                }\n                switch (status) {\n                    case Status.CANCELED:\n                        this._updateOperation.clear();\n                        return null;\n                    case Status.VALID:\n                        return modelProvider.stickyModel;\n                }\n            }\n            return null;\n        }).catch((error) => {\n            onUnexpectedError(error);\n            return null;\n        });\n    }\n};\nStickyModelProvider = __decorate([\n    __param(2, IInstantiationService),\n    __param(3, ILanguageFeaturesService)\n], StickyModelProvider);\nclass StickyModelCandidateProvider extends Disposable {\n    constructor(_editor) {\n        super();\n        this._editor = _editor;\n        this._stickyModel = null;\n    }\n    get stickyModel() {\n        return this._stickyModel;\n    }\n    _invalid() {\n        this._stickyModel = null;\n        return Status.INVALID;\n    }\n    computeStickyModel(token) {\n        if (token.isCancellationRequested || !this.isProviderValid()) {\n            return { statusPromise: this._invalid(), modelPromise: null };\n        }\n        const providerModelPromise = createCancelablePromise(token => this.createModelFromProvider(token));\n        return {\n            statusPromise: providerModelPromise.then(providerModel => {\n                if (!this.isModelValid(providerModel)) {\n                    return this._invalid();\n                }\n                if (token.isCancellationRequested) {\n                    return Status.CANCELED;\n                }\n                this._stickyModel = this.createStickyModel(token, providerModel);\n                return Status.VALID;\n            }).then(undefined, (err) => {\n                onUnexpectedError(err);\n                return Status.CANCELED;\n            }),\n            modelPromise: providerModelPromise\n        };\n    }\n    /**\n     * Method which checks whether the model returned by the provider is valid and can be used to compute a sticky model.\n     * This method by default returns true.\n     * @param model model returned by the provider\n     * @returns boolean indicating whether the model is valid\n     */\n    isModelValid(model) {\n        return true;\n    }\n    /**\n     * Method which checks whether the provider is valid before applying it to find the provider model.\n     * This method by default returns true.\n     * @returns boolean indicating whether the provider is valid\n     */\n    isProviderValid() {\n        return true;\n    }\n}\nlet StickyModelFromCandidateOutlineProvider = class StickyModelFromCandidateOutlineProvider extends StickyModelCandidateProvider {\n    constructor(_editor, _languageFeaturesService) {\n        super(_editor);\n        this._languageFeaturesService = _languageFeaturesService;\n    }\n    createModelFromProvider(token) {\n        return OutlineModel.create(this._languageFeaturesService.documentSymbolProvider, this._editor.getModel(), token);\n    }\n    createStickyModel(token, model) {\n        const { stickyOutlineElement, providerID } = this._stickyModelFromOutlineModel(model, this._stickyModel?.outlineProviderId);\n        const textModel = this._editor.getModel();\n        return new StickyModel(textModel.uri, textModel.getVersionId(), stickyOutlineElement, providerID);\n    }\n    isModelValid(model) {\n        return model && model.children.size > 0;\n    }\n    _stickyModelFromOutlineModel(outlineModel, preferredProvider) {\n        let outlineElements;\n        // When several possible outline providers\n        if (Iterable.first(outlineModel.children.values()) instanceof OutlineGroup) {\n            const provider = Iterable.find(outlineModel.children.values(), outlineGroupOfModel => outlineGroupOfModel.id === preferredProvider);\n            if (provider) {\n                outlineElements = provider.children;\n            }\n            else {\n                let tempID = '';\n                let maxTotalSumOfRanges = -1;\n                let optimalOutlineGroup = undefined;\n                for (const [_key, outlineGroup] of outlineModel.children.entries()) {\n                    const totalSumRanges = this._findSumOfRangesOfGroup(outlineGroup);\n                    if (totalSumRanges > maxTotalSumOfRanges) {\n                        optimalOutlineGroup = outlineGroup;\n                        maxTotalSumOfRanges = totalSumRanges;\n                        tempID = outlineGroup.id;\n                    }\n                }\n                preferredProvider = tempID;\n                outlineElements = optimalOutlineGroup.children;\n            }\n        }\n        else {\n            outlineElements = outlineModel.children;\n        }\n        const stickyChildren = [];\n        const outlineElementsArray = Array.from(outlineElements.values()).sort((element1, element2) => {\n            const range1 = new StickyRange(element1.symbol.range.startLineNumber, element1.symbol.range.endLineNumber);\n            const range2 = new StickyRange(element2.symbol.range.startLineNumber, element2.symbol.range.endLineNumber);\n            return this._comparator(range1, range2);\n        });\n        for (const outlineElement of outlineElementsArray) {\n            stickyChildren.push(this._stickyModelFromOutlineElement(outlineElement, outlineElement.symbol.selectionRange.startLineNumber));\n        }\n        const stickyOutlineElement = new StickyElement(undefined, stickyChildren, undefined);\n        return {\n            stickyOutlineElement: stickyOutlineElement,\n            providerID: preferredProvider\n        };\n    }\n    _stickyModelFromOutlineElement(outlineElement, previousStartLine) {\n        const children = [];\n        for (const child of outlineElement.children.values()) {\n            if (child.symbol.selectionRange.startLineNumber !== child.symbol.range.endLineNumber) {\n                if (child.symbol.selectionRange.startLineNumber !== previousStartLine) {\n                    children.push(this._stickyModelFromOutlineElement(child, child.symbol.selectionRange.startLineNumber));\n                }\n                else {\n                    for (const subchild of child.children.values()) {\n                        children.push(this._stickyModelFromOutlineElement(subchild, child.symbol.selectionRange.startLineNumber));\n                    }\n                }\n            }\n        }\n        children.sort((child1, child2) => this._comparator(child1.range, child2.range));\n        const range = new StickyRange(outlineElement.symbol.selectionRange.startLineNumber, outlineElement.symbol.range.endLineNumber);\n        return new StickyElement(range, children, undefined);\n    }\n    _comparator(range1, range2) {\n        if (range1.startLineNumber !== range2.startLineNumber) {\n            return range1.startLineNumber - range2.startLineNumber;\n        }\n        else {\n            return range2.endLineNumber - range1.endLineNumber;\n        }\n    }\n    _findSumOfRangesOfGroup(outline) {\n        let res = 0;\n        for (const child of outline.children.values()) {\n            res += this._findSumOfRangesOfGroup(child);\n        }\n        if (outline instanceof OutlineElement) {\n            return res + outline.symbol.range.endLineNumber - outline.symbol.selectionRange.startLineNumber;\n        }\n        else {\n            return res;\n        }\n    }\n};\nStickyModelFromCandidateOutlineProvider = __decorate([\n    __param(1, ILanguageFeaturesService)\n], StickyModelFromCandidateOutlineProvider);\nclass StickyModelFromCandidateFoldingProvider extends StickyModelCandidateProvider {\n    constructor(editor) {\n        super(editor);\n        this._foldingLimitReporter = this._register(new RangesLimitReporter(editor));\n    }\n    createStickyModel(token, model) {\n        const foldingElement = this._fromFoldingRegions(model);\n        const textModel = this._editor.getModel();\n        return new StickyModel(textModel.uri, textModel.getVersionId(), foldingElement, undefined);\n    }\n    isModelValid(model) {\n        return model !== null;\n    }\n    _fromFoldingRegions(foldingRegions) {\n        const length = foldingRegions.length;\n        const orderedStickyElements = [];\n        // The root sticky outline element\n        const stickyOutlineElement = new StickyElement(undefined, [], undefined);\n        for (let i = 0; i < length; i++) {\n            // Finding the parent index of the current range\n            const parentIndex = foldingRegions.getParentIndex(i);\n            let parentNode;\n            if (parentIndex !== -1) {\n                // Access the reference of the parent node\n                parentNode = orderedStickyElements[parentIndex];\n            }\n            else {\n                // In that case the parent node is the root node\n                parentNode = stickyOutlineElement;\n            }\n            const child = new StickyElement(new StickyRange(foldingRegions.getStartLineNumber(i), foldingRegions.getEndLineNumber(i) + 1), [], parentNode);\n            parentNode.children.push(child);\n            orderedStickyElements.push(child);\n        }\n        return stickyOutlineElement;\n    }\n}\nlet StickyModelFromCandidateIndentationFoldingProvider = class StickyModelFromCandidateIndentationFoldingProvider extends StickyModelFromCandidateFoldingProvider {\n    constructor(editor, _languageConfigurationService) {\n        super(editor);\n        this._languageConfigurationService = _languageConfigurationService;\n        this.provider = this._register(new IndentRangeProvider(editor.getModel(), this._languageConfigurationService, this._foldingLimitReporter));\n    }\n    async createModelFromProvider(token) {\n        return this.provider.compute(token);\n    }\n};\nStickyModelFromCandidateIndentationFoldingProvider = __decorate([\n    __param(1, ILanguageConfigurationService)\n], StickyModelFromCandidateIndentationFoldingProvider);\nlet StickyModelFromCandidateSyntaxFoldingProvider = class StickyModelFromCandidateSyntaxFoldingProvider extends StickyModelFromCandidateFoldingProvider {\n    constructor(editor, onProviderUpdate, _languageFeaturesService) {\n        super(editor);\n        this._languageFeaturesService = _languageFeaturesService;\n        this.provider = this._register(new MutableDisposable());\n        this._register(this._languageFeaturesService.foldingRangeProvider.onDidChange(() => {\n            this._updateProvider(editor, onProviderUpdate);\n        }));\n        this._updateProvider(editor, onProviderUpdate);\n    }\n    _updateProvider(editor, onProviderUpdate) {\n        const selectedProviders = FoldingController.getFoldingRangeProviders(this._languageFeaturesService, editor.getModel());\n        if (selectedProviders.length === 0) {\n            return;\n        }\n        this.provider.value = new SyntaxRangeProvider(editor.getModel(), selectedProviders, onProviderUpdate, this._foldingLimitReporter, undefined);\n    }\n    isProviderValid() {\n        return this.provider !== undefined;\n    }\n    async createModelFromProvider(token) {\n        return this.provider.value?.compute(token) ?? null;\n    }\n};\nStickyModelFromCandidateSyntaxFoldingProvider = __decorate([\n    __param(2, ILanguageFeaturesService)\n], StickyModelFromCandidateSyntaxFoldingProvider);\n\nexport { StickyModelProvider };\n","import { Disposable, DisposableStore, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { binarySearch } from '../../../../base/common/arrays.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { StickyModelProvider } from './stickyScrollModelProvider.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass StickyLineCandidate {\n    constructor(startLineNumber, endLineNumber, top, height) {\n        this.startLineNumber = startLineNumber;\n        this.endLineNumber = endLineNumber;\n        this.top = top;\n        this.height = height;\n    }\n}\nlet StickyLineCandidateProvider = class StickyLineCandidateProvider extends Disposable {\n    constructor(editor, _languageFeaturesService, _languageConfigurationService) {\n        super();\n        this._languageFeaturesService = _languageFeaturesService;\n        this._languageConfigurationService = _languageConfigurationService;\n        this._onDidChangeStickyScroll = this._register(new Emitter());\n        this.onDidChangeStickyScroll = this._onDidChangeStickyScroll.event;\n        this._model = null;\n        this._cts = null;\n        this._stickyModelProvider = null;\n        this._editor = editor;\n        this._sessionStore = this._register(new DisposableStore());\n        this._updateSoon = this._register(new RunOnceScheduler(() => this.update(), 50));\n        this._register(this._editor.onDidChangeConfiguration(e => {\n            if (e.hasChanged(131 /* EditorOption.stickyScroll */)) {\n                this.readConfiguration();\n            }\n        }));\n        this.readConfiguration();\n    }\n    /**\n     * Read and apply the sticky scroll configuration.\n     */\n    readConfiguration() {\n        this._sessionStore.clear();\n        const options = this._editor.getOption(131 /* EditorOption.stickyScroll */);\n        if (!options.enabled) {\n            return;\n        }\n        this._sessionStore.add(this._editor.onDidChangeModel(() => {\n            this._model = null;\n            this.updateStickyModelProvider();\n            this._onDidChangeStickyScroll.fire();\n            this.update();\n        }));\n        this._sessionStore.add(this._editor.onDidChangeHiddenAreas(() => this.update()));\n        this._sessionStore.add(this._editor.onDidChangeModelContent(() => this._updateSoon.schedule()));\n        this._sessionStore.add(this._languageFeaturesService.documentSymbolProvider.onDidChange(() => this.update()));\n        this._sessionStore.add(toDisposable(() => {\n            this._stickyModelProvider?.dispose();\n            this._stickyModelProvider = null;\n        }));\n        this.updateStickyModelProvider();\n        this.update();\n    }\n    /**\n     * Get the version ID of the sticky model.\n     */\n    getVersionId() {\n        return this._model?.version;\n    }\n    /**\n     * Update the sticky model provider.\n     */\n    updateStickyModelProvider() {\n        this._stickyModelProvider?.dispose();\n        this._stickyModelProvider = null;\n        if (this._editor.hasModel()) {\n            this._stickyModelProvider = new StickyModelProvider(this._editor, () => this._updateSoon.schedule(), this._languageConfigurationService, this._languageFeaturesService);\n        }\n    }\n    /**\n     * Update the sticky line candidates.\n     */\n    async update() {\n        this._cts?.dispose(true);\n        this._cts = new CancellationTokenSource();\n        await this.updateStickyModel(this._cts.token);\n        this._onDidChangeStickyScroll.fire();\n    }\n    /**\n     * Update the sticky model based on the current editor state.\n     */\n    async updateStickyModel(token) {\n        if (!this._editor.hasModel() || !this._stickyModelProvider || this._editor.getModel().isTooLargeForTokenization()) {\n            this._model = null;\n            return;\n        }\n        const model = await this._stickyModelProvider.update(token);\n        if (!token.isCancellationRequested) {\n            this._model = model;\n        }\n    }\n    /**\n     * Get sticky line candidates intersecting a given range.\n     */\n    getCandidateStickyLinesIntersecting(range) {\n        if (!this._model?.element) {\n            return [];\n        }\n        const stickyLineCandidates = [];\n        this.getCandidateStickyLinesIntersectingFromStickyModel(range, this._model.element, stickyLineCandidates, 0, 0, -1);\n        return this.filterHiddenRanges(stickyLineCandidates);\n    }\n    /**\n     * Get sticky line candidates intersecting a given range from the sticky model.\n     */\n    getCandidateStickyLinesIntersectingFromStickyModel(range, outlineModel, result, depth, top, lastStartLineNumber) {\n        const textModel = this._editor.getModel();\n        if (!textModel) {\n            return;\n        }\n        if (outlineModel.children.length === 0) {\n            return;\n        }\n        let lastLine = lastStartLineNumber;\n        const childrenStartLines = [];\n        for (let i = 0; i < outlineModel.children.length; i++) {\n            const child = outlineModel.children[i];\n            if (child.range) {\n                childrenStartLines.push(child.range.startLineNumber);\n            }\n        }\n        const lowerBound = this.updateIndex(binarySearch(childrenStartLines, range.startLineNumber, (a, b) => { return a - b; }));\n        const upperBound = this.updateIndex(binarySearch(childrenStartLines, range.endLineNumber, (a, b) => { return a - b; }));\n        for (let i = lowerBound; i <= upperBound; i++) {\n            const child = outlineModel.children[i];\n            if (!child || !child.range) {\n                continue;\n            }\n            const { startLineNumber, endLineNumber } = child.range;\n            if (endLineNumber > startLineNumber + 1\n                && range.startLineNumber <= endLineNumber + 1\n                && startLineNumber - 1 <= range.endLineNumber\n                && startLineNumber !== lastLine\n                && textModel.isValidRange(new Range(startLineNumber, 1, endLineNumber, 1))) {\n                lastLine = startLineNumber;\n                const lineHeight = this._editor.getLineHeightForPosition(new Position(startLineNumber, 1));\n                result.push(new StickyLineCandidate(startLineNumber, endLineNumber - 1, top, lineHeight));\n                this.getCandidateStickyLinesIntersectingFromStickyModel(range, child, result, depth + 1, top + lineHeight, startLineNumber);\n            }\n        }\n    }\n    /**\n     * Filter out sticky line candidates that are within hidden ranges.\n     */\n    filterHiddenRanges(stickyLineCandidates) {\n        const hiddenRanges = this._editor._getViewModel()?.getHiddenAreas();\n        if (!hiddenRanges) {\n            return stickyLineCandidates;\n        }\n        return stickyLineCandidates.filter(candidate => {\n            return !hiddenRanges.some(hiddenRange => candidate.startLineNumber >= hiddenRange.startLineNumber &&\n                candidate.endLineNumber <= hiddenRange.endLineNumber + 1);\n        });\n    }\n    /**\n     * Update the binary search index.\n     */\n    updateIndex(index) {\n        if (index === -1) {\n            return 0;\n        }\n        else if (index < 0) {\n            return -index - 2;\n        }\n        return index;\n    }\n};\nStickyLineCandidateProvider = __decorate([\n    __param(1, ILanguageFeaturesService),\n    __param(2, ILanguageConfigurationService)\n], StickyLineCandidateProvider);\n\nexport { StickyLineCandidate, StickyLineCandidateProvider };\n","import { Disposable, DisposableStore, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { StickyScrollWidget, StickyScrollWidgetState } from './stickyScrollWidget.js';\nimport { StickyLineCandidateProvider } from './stickyScrollProvider.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IContextMenuService } from '../../../../platform/contextview/browser/contextView.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { ClickLinkGesture } from '../../gotoSymbol/browser/link/clickLinkGesture.js';\nimport { Range } from '../../../common/core/range.js';\nimport { getDefinitionsAtPosition } from '../../gotoSymbol/browser/goToSymbol.js';\nimport { goToDefinitionWithLocation } from '../../inlayHints/browser/inlayHintsLocations.js';\nimport { Position } from '../../../common/core/position.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport { addDisposableListener, getWindow, EventType, trackFocus, addStandardDisposableListener, isHTMLElement } from '../../../../base/browser/dom.js';\nimport { StickyRange } from './stickyScrollElement.js';\nimport { StandardMouseEvent } from '../../../../base/browser/mouseEvent.js';\nimport { FoldingController } from '../../folding/browser/folding.js';\nimport { toggleCollapseState } from '../../folding/browser/foldingModel.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { mainWindow } from '../../../../base/browser/window.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar StickyScrollController_1;\nlet StickyScrollController = class StickyScrollController extends Disposable {\n    static { StickyScrollController_1 = this; }\n    static { this.ID = 'store.contrib.stickyScrollController'; }\n    constructor(_editor, _contextMenuService, _languageFeaturesService, _instaService, _languageConfigurationService, _languageFeatureDebounceService, _contextKeyService) {\n        super();\n        this._editor = _editor;\n        this._contextMenuService = _contextMenuService;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._instaService = _instaService;\n        this._contextKeyService = _contextKeyService;\n        this._sessionStore = new DisposableStore();\n        this._maxStickyLines = Number.MAX_SAFE_INTEGER;\n        this._candidateDefinitionsLength = -1;\n        this._focusedStickyElementIndex = -1;\n        this._enabled = false;\n        this._focused = false;\n        this._positionRevealed = false;\n        this._onMouseDown = false;\n        this._endLineNumbers = [];\n        this._mouseTarget = null;\n        this._onDidChangeStickyScrollHeight = this._register(new Emitter());\n        this.onDidChangeStickyScrollHeight = this._onDidChangeStickyScrollHeight.event;\n        this._stickyScrollWidget = new StickyScrollWidget(this._editor);\n        this._stickyLineCandidateProvider = new StickyLineCandidateProvider(this._editor, _languageFeaturesService, _languageConfigurationService);\n        this._register(this._stickyScrollWidget);\n        this._register(this._stickyLineCandidateProvider);\n        this._widgetState = StickyScrollWidgetState.Empty;\n        const stickyScrollDomNode = this._stickyScrollWidget.getDomNode();\n        this._register(this._editor.onDidChangeLineHeight((e) => {\n            e.changes.forEach((change) => {\n                const lineNumber = change.lineNumber;\n                if (this._widgetState.startLineNumbers.includes(lineNumber)) {\n                    this._renderStickyScroll(lineNumber);\n                }\n            });\n        }));\n        this._register(this._editor.onDidChangeFont((e) => {\n            e.changes.forEach((change) => {\n                const lineNumber = change.lineNumber;\n                if (this._widgetState.startLineNumbers.includes(lineNumber)) {\n                    this._renderStickyScroll(lineNumber);\n                }\n            });\n        }));\n        this._register(this._editor.onDidChangeConfiguration(e => {\n            this._readConfigurationChange(e);\n        }));\n        this._register(addDisposableListener(stickyScrollDomNode, EventType.CONTEXT_MENU, async (event) => {\n            this._onContextMenu(getWindow(stickyScrollDomNode), event);\n        }));\n        this._stickyScrollFocusedContextKey = EditorContextKeys.stickyScrollFocused.bindTo(this._contextKeyService);\n        this._stickyScrollVisibleContextKey = EditorContextKeys.stickyScrollVisible.bindTo(this._contextKeyService);\n        const focusTracker = this._register(trackFocus(stickyScrollDomNode));\n        this._register(focusTracker.onDidBlur(_ => {\n            // Suppose that the blurring is caused by scrolling, then keep the focus on the sticky scroll\n            // This is determined by the fact that the height of the widget has become zero and there has been no position revealing\n            if (this._positionRevealed === false && stickyScrollDomNode.clientHeight === 0) {\n                this._focusedStickyElementIndex = -1;\n                this.focus();\n            }\n            // In all other casees, dispose the focus on the sticky scroll\n            else {\n                this._disposeFocusStickyScrollStore();\n            }\n        }));\n        this._register(focusTracker.onDidFocus(_ => {\n            this.focus();\n        }));\n        this._registerMouseListeners();\n        // Suppose that mouse down on the sticky scroll, then do not focus on the sticky scroll because this will be followed by the revealing of a position\n        this._register(addDisposableListener(stickyScrollDomNode, EventType.MOUSE_DOWN, (e) => {\n            this._onMouseDown = true;\n        }));\n        this._register(this._stickyScrollWidget.onDidChangeStickyScrollHeight((e) => {\n            this._onDidChangeStickyScrollHeight.fire(e);\n        }));\n        this._onDidResize();\n        this._readConfiguration();\n    }\n    get stickyScrollWidgetHeight() {\n        return this._stickyScrollWidget.height;\n    }\n    static get(editor) {\n        return editor.getContribution(StickyScrollController_1.ID);\n    }\n    _disposeFocusStickyScrollStore() {\n        this._stickyScrollFocusedContextKey.set(false);\n        this._focusDisposableStore?.dispose();\n        this._focused = false;\n        this._positionRevealed = false;\n        this._onMouseDown = false;\n    }\n    isFocused() {\n        return this._focused;\n    }\n    focus() {\n        // If the mouse is down, do not focus on the sticky scroll\n        if (this._onMouseDown) {\n            this._onMouseDown = false;\n            this._editor.focus();\n            return;\n        }\n        const focusState = this._stickyScrollFocusedContextKey.get();\n        if (focusState === true) {\n            return;\n        }\n        this._focused = true;\n        this._focusDisposableStore = new DisposableStore();\n        this._stickyScrollFocusedContextKey.set(true);\n        this._focusedStickyElementIndex = this._stickyScrollWidget.lineNumbers.length - 1;\n        this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n    }\n    focusNext() {\n        if (this._focusedStickyElementIndex < this._stickyScrollWidget.lineNumberCount - 1) {\n            this._focusNav(true);\n        }\n    }\n    focusPrevious() {\n        if (this._focusedStickyElementIndex > 0) {\n            this._focusNav(false);\n        }\n    }\n    selectEditor() {\n        this._editor.focus();\n    }\n    // True is next, false is previous\n    _focusNav(direction) {\n        this._focusedStickyElementIndex = direction ? this._focusedStickyElementIndex + 1 : this._focusedStickyElementIndex - 1;\n        this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n    }\n    goToFocused() {\n        const lineNumbers = this._stickyScrollWidget.lineNumbers;\n        this._disposeFocusStickyScrollStore();\n        this._revealPosition({ lineNumber: lineNumbers[this._focusedStickyElementIndex], column: 1 });\n    }\n    _revealPosition(position) {\n        this._reveaInEditor(position, () => this._editor.revealPosition(position));\n    }\n    _revealLineInCenterIfOutsideViewport(position) {\n        this._reveaInEditor(position, () => this._editor.revealLineInCenterIfOutsideViewport(position.lineNumber, 0 /* ScrollType.Smooth */));\n    }\n    _reveaInEditor(position, revealFunction) {\n        if (this._focused) {\n            this._disposeFocusStickyScrollStore();\n        }\n        this._positionRevealed = true;\n        revealFunction();\n        this._editor.setSelection(Range.fromPositions(position));\n        this._editor.focus();\n    }\n    _registerMouseListeners() {\n        const sessionStore = this._register(new DisposableStore());\n        const gesture = this._register(new ClickLinkGesture(this._editor, {\n            extractLineNumberFromMouseEvent: (e) => {\n                const position = this._stickyScrollWidget.getEditorPositionFromNode(e.target.element);\n                return position ? position.lineNumber : 0;\n            }\n        }));\n        const getMouseEventTarget = (mouseEvent) => {\n            if (!this._editor.hasModel()) {\n                return null;\n            }\n            if (mouseEvent.target.type !== 12 /* MouseTargetType.OVERLAY_WIDGET */ || mouseEvent.target.detail !== this._stickyScrollWidget.getId()) {\n                // not hovering over our widget\n                return null;\n            }\n            const mouseTargetElement = mouseEvent.target.element;\n            if (!mouseTargetElement || mouseTargetElement.innerText !== mouseTargetElement.innerHTML) {\n                // not on a span element rendering text\n                return null;\n            }\n            const position = this._stickyScrollWidget.getEditorPositionFromNode(mouseTargetElement);\n            if (!position) {\n                // not hovering a sticky scroll line\n                return null;\n            }\n            return {\n                range: new Range(position.lineNumber, position.column, position.lineNumber, position.column + mouseTargetElement.innerText.length),\n                textElement: mouseTargetElement\n            };\n        };\n        const stickyScrollWidgetDomNode = this._stickyScrollWidget.getDomNode();\n        this._register(addStandardDisposableListener(stickyScrollWidgetDomNode, EventType.CLICK, (mouseEvent) => {\n            if (mouseEvent.ctrlKey || mouseEvent.altKey || mouseEvent.metaKey) {\n                // modifier pressed\n                return;\n            }\n            if (!mouseEvent.leftButton) {\n                // not left click\n                return;\n            }\n            if (mouseEvent.shiftKey) {\n                // shift click\n                const lineIndex = this._stickyScrollWidget.getLineIndexFromChildDomNode(mouseEvent.target);\n                if (lineIndex === null) {\n                    return;\n                }\n                const position = new Position(this._endLineNumbers[lineIndex], 1);\n                this._revealLineInCenterIfOutsideViewport(position);\n                return;\n            }\n            const isInFoldingIconDomNode = this._stickyScrollWidget.isInFoldingIconDomNode(mouseEvent.target);\n            if (isInFoldingIconDomNode) {\n                // clicked on folding icon\n                const lineNumber = this._stickyScrollWidget.getLineNumberFromChildDomNode(mouseEvent.target);\n                this._toggleFoldingRegionForLine(lineNumber);\n                return;\n            }\n            const isInStickyLine = this._stickyScrollWidget.isInStickyLine(mouseEvent.target);\n            if (!isInStickyLine) {\n                return;\n            }\n            // normal click\n            let position = this._stickyScrollWidget.getEditorPositionFromNode(mouseEvent.target);\n            if (!position) {\n                const lineNumber = this._stickyScrollWidget.getLineNumberFromChildDomNode(mouseEvent.target);\n                if (lineNumber === null) {\n                    // not hovering a sticky scroll line\n                    return;\n                }\n                position = new Position(lineNumber, 1);\n            }\n            this._revealPosition(position);\n        }));\n        this._register(addDisposableListener(mainWindow, EventType.MOUSE_MOVE, mouseEvent => {\n            this._mouseTarget = mouseEvent.target;\n            this._onMouseMoveOrKeyDown(mouseEvent);\n        }));\n        this._register(addDisposableListener(mainWindow, EventType.KEY_DOWN, mouseEvent => {\n            this._onMouseMoveOrKeyDown(mouseEvent);\n        }));\n        this._register(addDisposableListener(mainWindow, EventType.KEY_UP, () => {\n            if (this._showEndForLine !== undefined) {\n                this._showEndForLine = undefined;\n                this._renderStickyScroll();\n            }\n        }));\n        this._register(gesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, _keyboardEvent]) => {\n            const mouseTarget = getMouseEventTarget(mouseEvent);\n            if (!mouseTarget || !mouseEvent.hasTriggerModifier || !this._editor.hasModel()) {\n                sessionStore.clear();\n                return;\n            }\n            const { range, textElement } = mouseTarget;\n            if (!range.equalsRange(this._stickyRangeProjectedOnEditor)) {\n                this._stickyRangeProjectedOnEditor = range;\n                sessionStore.clear();\n            }\n            else if (textElement.style.textDecoration === 'underline') {\n                return;\n            }\n            const cancellationToken = new CancellationTokenSource();\n            sessionStore.add(toDisposable(() => cancellationToken.dispose(true)));\n            let currentHTMLChild;\n            getDefinitionsAtPosition(this._languageFeaturesService.definitionProvider, this._editor.getModel(), new Position(range.startLineNumber, range.startColumn + 1), false, cancellationToken.token).then((candidateDefinitions => {\n                if (cancellationToken.token.isCancellationRequested) {\n                    return;\n                }\n                if (candidateDefinitions.length !== 0) {\n                    this._candidateDefinitionsLength = candidateDefinitions.length;\n                    const childHTML = textElement;\n                    if (currentHTMLChild !== childHTML) {\n                        sessionStore.clear();\n                        currentHTMLChild = childHTML;\n                        currentHTMLChild.style.textDecoration = 'underline';\n                        sessionStore.add(toDisposable(() => {\n                            currentHTMLChild.style.textDecoration = 'none';\n                        }));\n                    }\n                    else if (!currentHTMLChild) {\n                        currentHTMLChild = childHTML;\n                        currentHTMLChild.style.textDecoration = 'underline';\n                        sessionStore.add(toDisposable(() => {\n                            currentHTMLChild.style.textDecoration = 'none';\n                        }));\n                    }\n                }\n                else {\n                    sessionStore.clear();\n                }\n            }));\n        }));\n        this._register(gesture.onCancel(() => {\n            sessionStore.clear();\n        }));\n        this._register(gesture.onExecute(async (e) => {\n            if (e.target.type !== 12 /* MouseTargetType.OVERLAY_WIDGET */ || e.target.detail !== this._stickyScrollWidget.getId()) {\n                // not hovering over our widget\n                return;\n            }\n            const position = this._stickyScrollWidget.getEditorPositionFromNode(e.target.element);\n            if (!position) {\n                // not hovering a sticky scroll line\n                return;\n            }\n            if (!this._editor.hasModel() || !this._stickyRangeProjectedOnEditor) {\n                return;\n            }\n            if (this._candidateDefinitionsLength > 1) {\n                if (this._focused) {\n                    this._disposeFocusStickyScrollStore();\n                }\n                this._revealPosition({ lineNumber: position.lineNumber, column: 1 });\n            }\n            this._instaService.invokeFunction(goToDefinitionWithLocation, e, this._editor, { uri: this._editor.getModel().uri, range: this._stickyRangeProjectedOnEditor });\n        }));\n    }\n    _onContextMenu(targetWindow, e) {\n        const event = new StandardMouseEvent(targetWindow, e);\n        this._contextMenuService.showContextMenu({\n            menuId: MenuId.StickyScrollContext,\n            getAnchor: () => event,\n        });\n    }\n    _onMouseMoveOrKeyDown(mouseEvent) {\n        if (!mouseEvent.shiftKey) {\n            return;\n        }\n        if (!this._mouseTarget || !isHTMLElement(this._mouseTarget)) {\n            return;\n        }\n        const currentEndForLineIndex = this._stickyScrollWidget.getLineIndexFromChildDomNode(this._mouseTarget);\n        if (currentEndForLineIndex === null || this._showEndForLine === currentEndForLineIndex) {\n            return;\n        }\n        this._showEndForLine = currentEndForLineIndex;\n        this._renderStickyScroll();\n    }\n    _toggleFoldingRegionForLine(line) {\n        if (!this._foldingModel || line === null) {\n            return;\n        }\n        const stickyLine = this._stickyScrollWidget.getRenderedStickyLine(line);\n        const foldingIcon = stickyLine?.foldingIcon;\n        if (!foldingIcon) {\n            return;\n        }\n        toggleCollapseState(this._foldingModel, 1, [line]);\n        foldingIcon.isCollapsed = !foldingIcon.isCollapsed;\n        const scrollTop = (foldingIcon.isCollapsed ?\n            this._editor.getTopForLineNumber(foldingIcon.foldingEndLine)\n            : this._editor.getTopForLineNumber(foldingIcon.foldingStartLine))\n            - this._editor.getOption(75 /* EditorOption.lineHeight */) * stickyLine.index + 1;\n        this._editor.setScrollTop(scrollTop);\n        this._renderStickyScroll(line);\n    }\n    _readConfiguration() {\n        const options = this._editor.getOption(131 /* EditorOption.stickyScroll */);\n        if (options.enabled === false) {\n            this._editor.removeOverlayWidget(this._stickyScrollWidget);\n            this._resetState();\n            this._sessionStore.clear();\n            this._enabled = false;\n            return;\n        }\n        else if (options.enabled && !this._enabled) {\n            // When sticky scroll was just enabled, add the listeners on the sticky scroll\n            this._editor.addOverlayWidget(this._stickyScrollWidget);\n            this._sessionStore.add(this._editor.onDidScrollChange((e) => {\n                if (e.scrollTopChanged) {\n                    this._showEndForLine = undefined;\n                    this._renderStickyScroll();\n                }\n            }));\n            this._sessionStore.add(this._editor.onDidLayoutChange(() => this._onDidResize()));\n            this._sessionStore.add(this._editor.onDidChangeModelTokens((e) => this._onTokensChange(e)));\n            this._sessionStore.add(this._stickyLineCandidateProvider.onDidChangeStickyScroll(() => {\n                this._showEndForLine = undefined;\n                this._renderStickyScroll();\n            }));\n            this._enabled = true;\n        }\n        const lineNumberOption = this._editor.getOption(76 /* EditorOption.lineNumbers */);\n        if (lineNumberOption.renderType === 2 /* RenderLineNumbersType.Relative */) {\n            this._sessionStore.add(this._editor.onDidChangeCursorPosition(() => {\n                this._showEndForLine = undefined;\n                this._renderStickyScroll(0);\n            }));\n        }\n    }\n    _readConfigurationChange(event) {\n        if (event.hasChanged(131 /* EditorOption.stickyScroll */)\n            || event.hasChanged(81 /* EditorOption.minimap */)\n            || event.hasChanged(75 /* EditorOption.lineHeight */)\n            || event.hasChanged(126 /* EditorOption.showFoldingControls */)\n            || event.hasChanged(76 /* EditorOption.lineNumbers */)) {\n            this._readConfiguration();\n        }\n        if (event.hasChanged(76 /* EditorOption.lineNumbers */) || event.hasChanged(52 /* EditorOption.folding */) || event.hasChanged(126 /* EditorOption.showFoldingControls */)) {\n            this._renderStickyScroll(0);\n        }\n    }\n    _needsUpdate(event) {\n        const stickyLineNumbers = this._stickyScrollWidget.getCurrentLines();\n        for (const stickyLineNumber of stickyLineNumbers) {\n            for (const range of event.ranges) {\n                if (stickyLineNumber >= range.fromLineNumber && stickyLineNumber <= range.toLineNumber) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n    _onTokensChange(event) {\n        if (this._needsUpdate(event)) {\n            // Rebuilding the whole widget from line 0\n            this._renderStickyScroll(0);\n        }\n    }\n    _onDidResize() {\n        const layoutInfo = this._editor.getLayoutInfo();\n        // Make sure sticky scroll doesn't take up more than 25% of the editor\n        const theoreticalLines = layoutInfo.height / this._editor.getOption(75 /* EditorOption.lineHeight */);\n        this._maxStickyLines = Math.round(theoreticalLines * .25);\n        this._renderStickyScroll(0);\n    }\n    async _renderStickyScroll(rebuildFromLine) {\n        const model = this._editor.getModel();\n        if (!model || model.isTooLargeForTokenization()) {\n            this._resetState();\n            return;\n        }\n        const nextRebuildFromLine = this._updateAndGetMinRebuildFromLine(rebuildFromLine);\n        const stickyWidgetVersion = this._stickyLineCandidateProvider.getVersionId();\n        const shouldUpdateState = stickyWidgetVersion === undefined || stickyWidgetVersion === model.getVersionId();\n        if (shouldUpdateState) {\n            if (!this._focused) {\n                await this._updateState(nextRebuildFromLine);\n            }\n            else {\n                // Suppose that previously the sticky scroll widget had height 0, then if there are visible lines, set the last line as focused\n                if (this._focusedStickyElementIndex === -1) {\n                    await this._updateState(nextRebuildFromLine);\n                    this._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1;\n                    if (this._focusedStickyElementIndex !== -1) {\n                        this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n                    }\n                }\n                else {\n                    const focusedStickyElementLineNumber = this._stickyScrollWidget.lineNumbers[this._focusedStickyElementIndex];\n                    await this._updateState(nextRebuildFromLine);\n                    // Suppose that after setting the state, there are no sticky lines, set the focused index to -1\n                    if (this._stickyScrollWidget.lineNumberCount === 0) {\n                        this._focusedStickyElementIndex = -1;\n                    }\n                    else {\n                        const previousFocusedLineNumberExists = this._stickyScrollWidget.lineNumbers.includes(focusedStickyElementLineNumber);\n                        // If the line number is still there, do not change anything\n                        // If the line number is not there, set the new focused line to be the last line\n                        if (!previousFocusedLineNumberExists) {\n                            this._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1;\n                        }\n                        this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n                    }\n                }\n            }\n        }\n    }\n    _updateAndGetMinRebuildFromLine(rebuildFromLine) {\n        if (rebuildFromLine !== undefined) {\n            const minRebuildFromLineOrInfinity = this._minRebuildFromLine !== undefined ? this._minRebuildFromLine : Infinity;\n            this._minRebuildFromLine = Math.min(rebuildFromLine, minRebuildFromLineOrInfinity);\n        }\n        return this._minRebuildFromLine;\n    }\n    async _updateState(rebuildFromLine) {\n        this._minRebuildFromLine = undefined;\n        this._foldingModel = await FoldingController.get(this._editor)?.getFoldingModel() ?? undefined;\n        this._widgetState = this.findScrollWidgetState();\n        const stickyWidgetHasLines = this._widgetState.startLineNumbers.length > 0;\n        this._stickyScrollVisibleContextKey.set(stickyWidgetHasLines);\n        this._stickyScrollWidget.setState(this._widgetState, this._foldingModel, rebuildFromLine);\n    }\n    async _resetState() {\n        this._minRebuildFromLine = undefined;\n        this._foldingModel = undefined;\n        this._widgetState = StickyScrollWidgetState.Empty;\n        this._stickyScrollVisibleContextKey.set(false);\n        this._stickyScrollWidget.setState(undefined, undefined);\n    }\n    findScrollWidgetState() {\n        const maxNumberStickyLines = Math.min(this._maxStickyLines, this._editor.getOption(131 /* EditorOption.stickyScroll */).maxLineCount);\n        const scrollTop = this._editor.getScrollTop();\n        let lastLineRelativePosition = 0;\n        const startLineNumbers = [];\n        const endLineNumbers = [];\n        const arrayVisibleRanges = this._editor.getVisibleRanges();\n        if (arrayVisibleRanges.length !== 0) {\n            const fullVisibleRange = new StickyRange(arrayVisibleRanges[0].startLineNumber, arrayVisibleRanges[arrayVisibleRanges.length - 1].endLineNumber);\n            const candidateRanges = this._stickyLineCandidateProvider.getCandidateStickyLinesIntersecting(fullVisibleRange);\n            for (const range of candidateRanges) {\n                const start = range.startLineNumber;\n                const end = range.endLineNumber;\n                const topOfElement = range.top;\n                const bottomOfElement = topOfElement + range.height;\n                const topOfBeginningLine = this._editor.getTopForLineNumber(start) - scrollTop;\n                const bottomOfEndLine = this._editor.getBottomForLineNumber(end) - scrollTop;\n                if (topOfElement > topOfBeginningLine && topOfElement <= bottomOfEndLine) {\n                    startLineNumbers.push(start);\n                    endLineNumbers.push(end + 1);\n                    if (bottomOfElement > bottomOfEndLine) {\n                        lastLineRelativePosition = bottomOfEndLine - bottomOfElement;\n                    }\n                }\n                if (startLineNumbers.length === maxNumberStickyLines) {\n                    break;\n                }\n            }\n        }\n        this._endLineNumbers = endLineNumbers;\n        return new StickyScrollWidgetState(startLineNumbers, endLineNumbers, lastLineRelativePosition, this._showEndForLine);\n    }\n    dispose() {\n        super.dispose();\n        this._sessionStore.dispose();\n    }\n};\nStickyScrollController = StickyScrollController_1 = __decorate([\n    __param(1, IContextMenuService),\n    __param(2, ILanguageFeaturesService),\n    __param(3, IInstantiationService),\n    __param(4, ILanguageConfigurationService),\n    __param(5, ILanguageFeatureDebounceService),\n    __param(6, IContextKeyService)\n], StickyScrollController);\n\nexport { StickyScrollController };\n","import { BugIndicatingError } from '../../../../../../base/common/errors.js';\nimport '../../../../../../base/common/observableInternal/index.js';\nimport { localize } from '../../../../../../nls.js';\nimport { registerColor, transparent, darken } from '../../../../../../platform/theme/common/colorUtils.js';\nimport '../../../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../../../platform/theme/common/colors/chartsColors.js';\nimport { diffRemoved, diffInserted, diffInsertedLine, editorBackground } from '../../../../../../platform/theme/common/colors/editorColors.js';\nimport { buttonForeground, buttonBackground, buttonSecondaryForeground, buttonSecondaryBackground } from '../../../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../../../platform/theme/common/colors/searchColors.js';\nimport { InlineEditTabAction } from './inlineEditsViewInterface.js';\nimport { observableFromEventOpts } from '../../../../../../base/common/observableInternal/observables/observableFromEvent.js';\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 *--------------------------------------------------------------------------------------------*/\nconst originalBackgroundColor = registerColor('inlineEdit.originalBackground', transparent(diffRemoved, 0.2), localize(1220, 'Background color for the original text in inline edits.'), true);\nconst modifiedBackgroundColor = registerColor('inlineEdit.modifiedBackground', transparent(diffInserted, 0.3), localize(1221, 'Background color for the modified text in inline edits.'), true);\nregisterColor('inlineEdit.originalChangedLineBackground', transparent(diffRemoved, 0.8), localize(1222, 'Background color for the changed lines in the original text of inline edits.'), true);\nconst originalChangedTextOverlayColor = registerColor('inlineEdit.originalChangedTextBackground', transparent(diffRemoved, 0.8), localize(1223, 'Overlay color for the changed text in the original text of inline edits.'), true);\nconst modifiedChangedLineBackgroundColor = registerColor('inlineEdit.modifiedChangedLineBackground', {\n    light: transparent(diffInsertedLine, 0.7),\n    dark: transparent(diffInsertedLine, 0.7),\n    hcDark: diffInsertedLine,\n    hcLight: diffInsertedLine\n}, localize(1224, 'Background color for the changed lines in the modified text of inline edits.'), true);\nconst modifiedChangedTextOverlayColor = registerColor('inlineEdit.modifiedChangedTextBackground', transparent(diffInserted, 0.7), localize(1225, 'Overlay color for the changed text in the modified text of inline edits.'), true);\n// ------- GUTTER INDICATOR -------\nconst inlineEditIndicatorPrimaryForeground = registerColor('inlineEdit.gutterIndicator.primaryForeground', buttonForeground, localize(1226, 'Foreground color for the primary inline edit gutter indicator.'));\nconst inlineEditIndicatorPrimaryBorder = registerColor('inlineEdit.gutterIndicator.primaryBorder', buttonBackground, localize(1227, 'Border color for the primary inline edit gutter indicator.'));\nconst inlineEditIndicatorPrimaryBackground = registerColor('inlineEdit.gutterIndicator.primaryBackground', {\n    light: transparent(inlineEditIndicatorPrimaryBorder, 0.5),\n    dark: transparent(inlineEditIndicatorPrimaryBorder, 0.4),\n    hcDark: transparent(inlineEditIndicatorPrimaryBorder, 0.4),\n    hcLight: transparent(inlineEditIndicatorPrimaryBorder, 0.5),\n}, localize(1228, 'Background color for the primary inline edit gutter indicator.'));\nconst inlineEditIndicatorSecondaryForeground = registerColor('inlineEdit.gutterIndicator.secondaryForeground', buttonSecondaryForeground, localize(1229, 'Foreground color for the secondary inline edit gutter indicator.'));\nconst inlineEditIndicatorSecondaryBorder = registerColor('inlineEdit.gutterIndicator.secondaryBorder', buttonSecondaryBackground, localize(1230, 'Border color for the secondary inline edit gutter indicator.'));\nconst inlineEditIndicatorSecondaryBackground = registerColor('inlineEdit.gutterIndicator.secondaryBackground', inlineEditIndicatorSecondaryBorder, localize(1231, 'Background color for the secondary inline edit gutter indicator.'));\nconst inlineEditIndicatorsuccessfulForeground = registerColor('inlineEdit.gutterIndicator.successfulForeground', buttonForeground, localize(1232, 'Foreground color for the successful inline edit gutter indicator.'));\nconst inlineEditIndicatorsuccessfulBorder = registerColor('inlineEdit.gutterIndicator.successfulBorder', buttonBackground, localize(1233, 'Border color for the successful inline edit gutter indicator.'));\nconst inlineEditIndicatorsuccessfulBackground = registerColor('inlineEdit.gutterIndicator.successfulBackground', inlineEditIndicatorsuccessfulBorder, localize(1234, 'Background color for the successful inline edit gutter indicator.'));\nconst inlineEditIndicatorBackground = registerColor('inlineEdit.gutterIndicator.background', {\n    hcDark: transparent('tab.inactiveBackground', 0.5),\n    hcLight: transparent('tab.inactiveBackground', 0.5),\n    dark: transparent('tab.inactiveBackground', 0.5),\n    light: '#5f5f5f18',\n}, localize(1235, 'Background color for the inline edit gutter indicator.'));\n// ------- BORDER COLORS -------\nconst originalBorder = registerColor('inlineEdit.originalBorder', {\n    light: diffRemoved,\n    dark: diffRemoved,\n    hcDark: diffRemoved,\n    hcLight: diffRemoved\n}, localize(1236, 'Border color for the original text in inline edits.'));\nconst modifiedBorder = registerColor('inlineEdit.modifiedBorder', {\n    light: darken(diffInserted, 0.6),\n    dark: diffInserted,\n    hcDark: diffInserted,\n    hcLight: diffInserted\n}, localize(1237, 'Border color for the modified text in inline edits.'));\nconst tabWillAcceptModifiedBorder = registerColor('inlineEdit.tabWillAcceptModifiedBorder', {\n    light: darken(modifiedBorder, 0),\n    dark: darken(modifiedBorder, 0),\n    hcDark: darken(modifiedBorder, 0),\n    hcLight: darken(modifiedBorder, 0)\n}, localize(1238, 'Modified border color for the inline edits widget when tab will accept it.'));\nconst tabWillAcceptOriginalBorder = registerColor('inlineEdit.tabWillAcceptOriginalBorder', {\n    light: darken(originalBorder, 0),\n    dark: darken(originalBorder, 0),\n    hcDark: darken(originalBorder, 0),\n    hcLight: darken(originalBorder, 0)\n}, localize(1239, 'Original border color for the inline edits widget over the original text when tab will accept it.'));\nfunction getModifiedBorderColor(tabAction) {\n    return tabAction.map(a => a === InlineEditTabAction.Accept ? tabWillAcceptModifiedBorder : modifiedBorder);\n}\nfunction getOriginalBorderColor(tabAction) {\n    return tabAction.map(a => a === InlineEditTabAction.Accept ? tabWillAcceptOriginalBorder : originalBorder);\n}\nfunction getEditorBlendedColor(colorIdentifier, themeService) {\n    let color;\n    if (typeof colorIdentifier === 'string') {\n        color = observeColor(colorIdentifier, themeService);\n    }\n    else {\n        color = colorIdentifier.map((identifier, reader) => observeColor(identifier, themeService).read(reader));\n    }\n    const backgroundColor = observeColor(editorBackground, themeService);\n    return color.map((c, reader) => /** @description makeOpaque */ c.makeOpaque(backgroundColor.read(reader)));\n}\nfunction observeColor(colorIdentifier, themeService) {\n    return observableFromEventOpts({\n        owner: { observeColor: colorIdentifier },\n        equalsFn: (a, b) => a.equals(b),\n        debugName: () => `observeColor(${colorIdentifier})`\n    }, themeService.onDidColorThemeChange, () => {\n        const color = themeService.getColorTheme().getColor(colorIdentifier);\n        if (!color) {\n            throw new BugIndicatingError(`Missing color: ${colorIdentifier}`);\n        }\n        return color;\n    });\n}\n\nexport { getEditorBlendedColor, getModifiedBorderColor, getOriginalBorderColor, inlineEditIndicatorBackground, inlineEditIndicatorPrimaryBackground, inlineEditIndicatorPrimaryBorder, inlineEditIndicatorPrimaryForeground, inlineEditIndicatorSecondaryBackground, inlineEditIndicatorSecondaryBorder, inlineEditIndicatorSecondaryForeground, inlineEditIndicatorsuccessfulBackground, inlineEditIndicatorsuccessfulBorder, inlineEditIndicatorsuccessfulForeground, modifiedBackgroundColor, modifiedChangedLineBackgroundColor, modifiedChangedTextOverlayColor, observeColor, originalBackgroundColor, originalChangedTextOverlayColor };\n","import { numberComparator } from '../../../../../../../base/common/arrays.js';\nimport { findFirstMin } from '../../../../../../../base/common/arraysFind.js';\nimport '../../../../../../../base/common/observableInternal/index.js';\nimport { splitLines } from '../../../../../../../base/common/strings.js';\nimport { observableCodeEditor } from '../../../../../../browser/observableCodeEditor.js';\nimport { Rect } from '../../../../../../common/core/2d/rect.js';\nimport { OffsetRange } from '../../../../../../common/core/ranges/offsetRange.js';\nimport { Position } from '../../../../../../common/core/position.js';\nimport { Range } from '../../../../../../common/core/range.js';\nimport { TextReplacement, TextEdit } from '../../../../../../common/core/edits/textEdit.js';\nimport { RangeMapping } from '../../../../../../common/diff/rangeMapping.js';\nimport { indentOfLine } from '../../../../../../common/model/textModel.js';\nimport { BugIndicatingError } from '../../../../../../../base/common/errors.js';\nimport { DebugLocation } from '../../../../../../../base/common/observableInternal/debugLocation.js';\nimport { derivedObservableWithCache } from '../../../../../../../base/common/observableInternal/utils/utils.js';\nimport { derivedOpts, derived } from '../../../../../../../base/common/observableInternal/observables/derived.js';\n\nfunction maxContentWidthInRange(editor, range, reader) {\n    editor.layoutInfo.read(reader);\n    editor.value.read(reader);\n    const model = editor.model.read(reader);\n    if (!model) {\n        return 0;\n    }\n    let maxContentWidth = 0;\n    editor.scrollTop.read(reader);\n    for (let i = range.startLineNumber; i < range.endLineNumberExclusive; i++) {\n        const column = model.getLineMaxColumn(i);\n        let lineContentWidth = editor.editor.getOffsetForColumn(i, column);\n        if (lineContentWidth === -1) {\n            // approximation\n            const typicalHalfwidthCharacterWidth = editor.editor.getOption(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;\n            const approximation = column * typicalHalfwidthCharacterWidth;\n            lineContentWidth = approximation;\n        }\n        maxContentWidth = Math.max(maxContentWidth, lineContentWidth);\n    }\n    const lines = range.mapToLineArray(l => model.getLineContent(l));\n    if (maxContentWidth < 5 && lines.some(l => l.length > 0) && model.uri.scheme !== 'file') {\n        console.error('unexpected width');\n    }\n    return maxContentWidth;\n}\nfunction getOffsetForPos(editor, pos, reader) {\n    editor.layoutInfo.read(reader);\n    editor.value.read(reader);\n    const model = editor.model.read(reader);\n    if (!model) {\n        return 0;\n    }\n    editor.scrollTop.read(reader);\n    const lineContentWidth = editor.editor.getOffsetForColumn(pos.lineNumber, pos.column);\n    return lineContentWidth;\n}\nfunction getPrefixTrim(diffRanges, originalLinesRange, modifiedLines, editor, reader = undefined) {\n    const textModel = editor.getModel();\n    if (!textModel) {\n        return { prefixTrim: 0, prefixLeftOffset: 0 };\n    }\n    const replacementStart = diffRanges.map(r => r.isSingleLine() ? r.startColumn - 1 : 0);\n    const originalIndents = originalLinesRange.mapToLineArray(line => indentOfLine(textModel.getLineContent(line)));\n    const modifiedIndents = modifiedLines.filter(line => line !== '').map(line => indentOfLine(line));\n    const prefixTrim = Math.min(...replacementStart, ...originalIndents, ...modifiedIndents);\n    let prefixLeftOffset;\n    const startLineIndent = textModel.getLineIndentColumn(originalLinesRange.startLineNumber);\n    if (startLineIndent >= prefixTrim + 1) {\n        // We can use the editor to get the offset\n        // TODO go through other usages of getOffsetForColumn and come up with a robust reactive solution to read it\n        observableCodeEditor(editor).scrollTop.read(reader); // getOffsetForColumn requires the line number to be visible. This might change on scroll top.\n        prefixLeftOffset = editor.getOffsetForColumn(originalLinesRange.startLineNumber, prefixTrim + 1);\n    }\n    else if (modifiedLines.length > 0) {\n        // Content is not in the editor, we can use the content width to calculate the offset\n        prefixLeftOffset = getContentRenderWidth(modifiedLines[0].slice(0, prefixTrim), editor, textModel);\n    }\n    else {\n        // unable to approximate the offset\n        return { prefixTrim: 0, prefixLeftOffset: 0 };\n    }\n    return { prefixTrim, prefixLeftOffset };\n}\nfunction getContentRenderWidth(content, editor, textModel) {\n    const w = editor.getOption(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;\n    const tabSize = textModel.getOptions().tabSize * w;\n    const numTabs = content.split('\\t').length - 1;\n    const numNoneTabs = content.length - numTabs;\n    return numNoneTabs * w + numTabs * tabSize;\n}\nfunction getEditorValidOverlayRect(editor) {\n    const contentLeft = editor.layoutInfoContentLeft;\n    const width = derived({ name: 'editor.validOverlay.width' }, r => {\n        const hasMinimapOnTheRight = editor.layoutInfoMinimap.read(r).minimapLeft !== 0;\n        const editorWidth = editor.layoutInfoWidth.read(r) - contentLeft.read(r);\n        if (hasMinimapOnTheRight) {\n            const minimapAndScrollbarWidth = editor.layoutInfoMinimap.read(r).minimapWidth + editor.layoutInfoVerticalScrollbarWidth.read(r);\n            return editorWidth - minimapAndScrollbarWidth;\n        }\n        return editorWidth;\n    });\n    const height = derived({ name: 'editor.validOverlay.height' }, r => editor.layoutInfoHeight.read(r) + editor.contentHeight.read(r));\n    return derived({ name: 'editor.validOverlay' }, r => Rect.fromLeftTopWidthHeight(contentLeft.read(r), 0, width.read(r), height.read(r)));\n}\nfunction applyEditToModifiedRangeMappings(rangeMapping, edit) {\n    const updatedMappings = [];\n    for (const m of rangeMapping) {\n        const updatedRange = edit.mapRange(m.modifiedRange);\n        updatedMappings.push(new RangeMapping(m.originalRange, updatedRange));\n    }\n    return updatedMappings;\n}\nfunction classNames(...classes) {\n    return classes.filter(c => typeof c === 'string').join(' ');\n}\nfunction offsetRangeToRange(columnOffsetRange, startPos) {\n    return new Range(startPos.lineNumber, startPos.column + columnOffsetRange.start, startPos.lineNumber, startPos.column + columnOffsetRange.endExclusive);\n}\n/**\n * Calculates the indentation size (in spaces) of a given line,\n * interpreting tabs as the specified tab size.\n */\nfunction getIndentationSize(line, tabSize) {\n    let currentSize = 0;\n    loop: for (let i = 0, len = line.length; i < len; i++) {\n        switch (line.charCodeAt(i)) {\n            case 9 /* CharCode.Tab */:\n                currentSize += tabSize;\n                break;\n            case 32 /* CharCode.Space */:\n                currentSize++;\n                break;\n            default: break loop;\n        }\n    }\n    // if currentSize % tabSize !== 0,\n    // then there are spaces which are not part of the indentation\n    return currentSize - (currentSize % tabSize);\n}\n/**\n * Calculates the number of characters at the start of a line that correspond to a given indentation size,\n * taking into account both tabs and spaces.\n */\nfunction indentSizeToIndentLength(line, indentSize, tabSize) {\n    let remainingSize = indentSize - (indentSize % tabSize);\n    let i = 0;\n    for (; i < line.length; i++) {\n        if (remainingSize === 0) {\n            break;\n        }\n        switch (line.charCodeAt(i)) {\n            case 9 /* CharCode.Tab */:\n                remainingSize -= tabSize;\n                break;\n            case 32 /* CharCode.Space */:\n                remainingSize--;\n                break;\n            default: throw new BugIndicatingError('Unexpected character found while calculating indent length');\n        }\n    }\n    return i;\n}\nfunction createReindentEdit(text, range, tabSize) {\n    const newLines = splitLines(text);\n    const edits = [];\n    const minIndentSize = findFirstMin(range.mapToLineArray(l => getIndentationSize(newLines[l - 1], tabSize)), numberComparator);\n    range.forEach(lineNumber => {\n        const indentLength = indentSizeToIndentLength(newLines[lineNumber - 1], minIndentSize, tabSize);\n        edits.push(new TextReplacement(offsetRangeToRange(new OffsetRange(0, indentLength), new Position(lineNumber, 1)), ''));\n    });\n    return new TextEdit(edits);\n}\nclass PathBuilder {\n    constructor() {\n        this._data = '';\n    }\n    moveTo(point) {\n        this._data += `M ${point.x} ${point.y} `;\n        return this;\n    }\n    lineTo(point) {\n        this._data += `L ${point.x} ${point.y} `;\n        return this;\n    }\n    build() {\n        return this._data;\n    }\n}\nfunction mapOutFalsy(obs) {\n    const nonUndefinedObs = derivedObservableWithCache(undefined, (reader, lastValue) => obs.read(reader) || lastValue);\n    return derivedOpts({\n        debugName: () => `${obs.debugName}.mapOutFalsy`\n    }, reader => {\n        nonUndefinedObs.read(reader);\n        const val = obs.read(reader);\n        if (!val) {\n            return undefined;\n        }\n        return nonUndefinedObs;\n    });\n}\nfunction rectToProps(fn, debugLocation = DebugLocation.ofCaller()) {\n    return {\n        left: derived({ name: 'editor.validOverlay.left' }, reader => /** @description left */ fn(reader).left, debugLocation),\n        top: derived({ name: 'editor.validOverlay.top' }, reader => /** @description top */ fn(reader).top, debugLocation),\n        width: derived({ name: 'editor.validOverlay.width' }, reader => /** @description width */ fn(reader).right - fn(reader).left, debugLocation),\n        height: derived({ name: 'editor.validOverlay.height' }, reader => /** @description height */ fn(reader).bottom - fn(reader).top, debugLocation),\n    };\n}\n\nexport { PathBuilder, applyEditToModifiedRangeMappings, classNames, createReindentEdit, getContentRenderWidth, getEditorValidOverlayRect, getOffsetForPos, getPrefixTrim, mapOutFalsy, maxContentWidthInRange, rectToProps };\n","import { n } from '../../../../../../../base/browser/dom.js';\nimport { ActionBar } from '../../../../../../../base/browser/ui/actionbar/actionbar.js';\nimport { renderIcon } from '../../../../../../../base/browser/ui/iconLabel/iconLabels.js';\nimport { KeybindingLabel } from '../../../../../../../base/browser/ui/keybindingLabel/keybindingLabel.js';\nimport { Codicon } from '../../../../../../../base/common/codicons.js';\nimport '../../../../../../../base/common/observableInternal/index.js';\nimport { OS } from '../../../../../../../base/common/platform.js';\nimport { ThemeIcon } from '../../../../../../../base/common/themables.js';\nimport { localize } from '../../../../../../../nls.js';\nimport { ICommandService } from '../../../../../../../platform/commands/common/commands.js';\nimport { IContextKeyService } from '../../../../../../../platform/contextkey/common/contextkey.js';\nimport { nativeHoverDelegate } from '../../../../../../../platform/hover/browser/hover.js';\nimport { IKeybindingService } from '../../../../../../../platform/keybinding/common/keybinding.js';\nimport { defaultKeybindingLabelStyles } from '../../../../../../../platform/theme/browser/defaultStyles.js';\nimport { asCssVariable } from '../../../../../../../platform/theme/common/colorUtils.js';\nimport { descriptionForeground } from '../../../../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorHoverBorder } from '../../../../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../../../../platform/theme/common/colors/inputColors.js';\nimport { editorActionListForeground } from '../../../../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../../../../platform/theme/common/colors/searchColors.js';\nimport { inlineSuggestCommitId, hideInlineCompletionId, toggleShowCollapsedId } from '../../../controller/commandIds.js';\nimport { observableValue } from '../../../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { constObservable } from '../../../../../../../base/common/observableInternal/observables/constObservable.js';\nimport { observableFromEvent } from '../../../../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { derived } from '../../../../../../../base/common/observableInternal/observables/derived.js';\nimport { autorun } from '../../../../../../../base/common/observableInternal/reactions/autorun.js';\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/*---------------------------------------------------------------------------------------------\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet GutterIndicatorMenuContent = class GutterIndicatorMenuContent {\n    constructor(_model, _close, _editorObs, _contextKeyService, _keybindingService, _commandService) {\n        this._model = _model;\n        this._close = _close;\n        this._editorObs = _editorObs;\n        this._contextKeyService = _contextKeyService;\n        this._keybindingService = _keybindingService;\n        this._commandService = _commandService;\n        this._inlineEditsShowCollapsed = this._editorObs.getOption(71 /* EditorOption.inlineSuggest */).map(s => s.edits.showCollapsed);\n    }\n    toDisposableLiveElement() {\n        return this._createHoverContent().toDisposableLiveElement();\n    }\n    _createHoverContent() {\n        const activeElement = observableValue('active', undefined);\n        const createOptionArgs = (options) => {\n            return {\n                title: options.title,\n                icon: options.icon,\n                keybinding: typeof options.commandId === 'string' ? this._getKeybinding(options.commandArgs ? undefined : options.commandId) : derived(this, reader => typeof options.commandId === 'string' ? undefined : this._getKeybinding(options.commandArgs ? undefined : options.commandId.read(reader)).read(reader)),\n                isActive: activeElement.map(v => v === options.id),\n                onHoverChange: v => activeElement.set(v ? options.id : undefined, undefined),\n                onAction: () => {\n                    this._close(true);\n                    return this._commandService.executeCommand(typeof options.commandId === 'string' ? options.commandId : options.commandId.get(), ...(options.commandArgs ?? []));\n                },\n            };\n        };\n        const title = header(this._model.displayName);\n        const gotoAndAccept = option(createOptionArgs({\n            id: 'gotoAndAccept',\n            title: `${localize(1212, \"Go To\")} / ${localize(1213, \"Accept\")}`,\n            icon: Codicon.check,\n            commandId: inlineSuggestCommitId\n        }));\n        const reject = option(createOptionArgs({\n            id: 'reject',\n            title: localize(1214, \"Reject\"),\n            icon: Codicon.close,\n            commandId: hideInlineCompletionId\n        }));\n        const extensionCommands = this._model.extensionCommands.map((c, idx) => option(createOptionArgs({\n            id: c.command.id + '_' + idx,\n            title: c.command.title,\n            icon: c.icon ?? Codicon.symbolEvent,\n            commandId: c.command.id,\n            commandArgs: c.command.arguments\n        })));\n        const toggleCollapsedMode = this._inlineEditsShowCollapsed.map(showCollapsed => showCollapsed ?\n            option(createOptionArgs({\n                id: 'showExpanded',\n                title: localize(1215, \"Show Expanded\"),\n                icon: Codicon.expandAll,\n                commandId: toggleShowCollapsedId\n            }))\n            : option(createOptionArgs({\n                id: 'showCollapsed',\n                title: localize(1216, \"Show Collapsed\"),\n                icon: Codicon.collapseAll,\n                commandId: toggleShowCollapsedId\n            })));\n        const snooze = option(createOptionArgs({\n            id: 'snooze',\n            title: localize(1217, \"Snooze\"),\n            icon: Codicon.bellSlash,\n            commandId: 'editor.action.inlineSuggest.snooze'\n        }));\n        const settings = option(createOptionArgs({\n            id: 'settings',\n            title: localize(1218, \"Settings\"),\n            icon: Codicon.gear,\n            commandId: 'workbench.action.openSettings',\n            commandArgs: ['@tag:nextEditSuggestions']\n        }));\n        const actions = this._model.action ? [this._model.action] : [];\n        const actionBarFooter = actions.length > 0 ? actionBar(actions.map(action => ({\n            id: action.id,\n            label: action.title + '...',\n            enabled: true,\n            run: () => this._commandService.executeCommand(action.id, ...(action.arguments ?? [])),\n            class: undefined,\n            tooltip: action.tooltip ?? action.title\n        })), { hoverDelegate: nativeHoverDelegate /* unable to show hover inside another hover */ }) : undefined;\n        return hoverContent([\n            title,\n            gotoAndAccept,\n            reject,\n            toggleCollapsedMode,\n            extensionCommands.length ? separator() : undefined,\n            snooze,\n            settings,\n            ...extensionCommands,\n            actionBarFooter ? separator() : undefined,\n            actionBarFooter\n        ]);\n    }\n    _getKeybinding(commandId) {\n        if (!commandId) {\n            return constObservable(undefined);\n        }\n        return observableFromEvent(this._contextKeyService.onDidChangeContext, () => this._keybindingService.lookupKeybinding(commandId)); // TODO: use contextkeyservice to use different renderings\n    }\n};\nGutterIndicatorMenuContent = __decorate([\n    __param(3, IContextKeyService),\n    __param(4, IKeybindingService),\n    __param(5, ICommandService)\n], GutterIndicatorMenuContent);\nfunction hoverContent(content) {\n    return n.div({\n        class: 'content',\n        style: {\n            margin: 4,\n            minWidth: 180,\n        }\n    }, content);\n}\nfunction header(title) {\n    return n.div({\n        class: 'header',\n        style: {\n            color: asCssVariable(descriptionForeground),\n            fontSize: '13px',\n            fontWeight: '600',\n            padding: '0 4px',\n            lineHeight: 28,\n        }\n    }, [title]);\n}\nfunction option(props) {\n    return derived({ name: 'inlineEdits.option' }, (_reader) => n.div({\n        class: ['monaco-menu-option', props.isActive?.map(v => v && 'active')],\n        onmouseenter: () => props.onHoverChange?.(true),\n        onmouseleave: () => props.onHoverChange?.(false),\n        onclick: props.onAction,\n        onkeydown: e => {\n            if (e.key === 'Enter') {\n                props.onAction?.();\n            }\n        },\n        tabIndex: 0,\n        style: {\n            borderRadius: 3, // same as hover widget border radius\n        }\n    }, [\n        n.elem('span', {\n            style: {\n                fontSize: 16,\n                display: 'flex',\n            }\n        }, [ThemeIcon.isThemeIcon(props.icon) ? renderIcon(props.icon) : props.icon.map(icon => renderIcon(icon))]),\n        n.elem('span', {}, [props.title]),\n        n.div({\n            style: { marginLeft: 'auto' },\n            ref: elem => {\n                const keybindingLabel = _reader.store.add(new KeybindingLabel(elem, OS, {\n                    disableTitle: true,\n                    ...defaultKeybindingLabelStyles,\n                    keybindingLabelShadow: undefined,\n                    keybindingLabelForeground: asCssVariable(descriptionForeground),\n                    keybindingLabelBackground: 'transparent',\n                    keybindingLabelBorder: 'transparent',\n                    keybindingLabelBottomBorder: undefined,\n                }));\n                _reader.store.add(autorun(reader => {\n                    keybindingLabel.set(props.keybinding.read(reader));\n                }));\n            }\n        })\n    ]));\n}\n// TODO: make this observable\nfunction actionBar(actions, options) {\n    return derived({ name: 'inlineEdits.actionBar' }, (_reader) => n.div({\n        class: ['action-widget-action-bar'],\n        style: {\n            padding: '3px 24px',\n        }\n    }, [\n        n.div({\n            ref: elem => {\n                const actionBar = _reader.store.add(new ActionBar(elem, options));\n                actionBar.push(actions, { icon: false, label: true });\n            }\n        })\n    ]));\n}\nfunction separator() {\n    return n.div({\n        id: 'inline-edit-gutter-indicator-menu-separator',\n        class: 'menu-separator',\n        style: {\n            color: asCssVariable(editorActionListForeground),\n            padding: '2px 0',\n        }\n    }, n.div({\n        style: {\n            borderBottom: `1px solid ${asCssVariable(editorHoverBorder)}`,\n        }\n    }));\n}\n\nexport { GutterIndicatorMenuContent };\n","import { n, trackFocus } from '../../../../../../../base/browser/dom.js';\nimport { renderIcon } from '../../../../../../../base/browser/ui/iconLabel/iconLabels.js';\nimport { Codicon } from '../../../../../../../base/common/codicons.js';\nimport { BugIndicatingError } from '../../../../../../../base/common/errors.js';\nimport { Disposable, DisposableStore, toDisposable } from '../../../../../../../base/common/lifecycle.js';\nimport '../../../../../../../base/common/observableInternal/index.js';\nimport { IAccessibilityService } from '../../../../../../../platform/accessibility/common/accessibility.js';\nimport { IHoverService } from '../../../../../../../platform/hover/browser/hover.js';\nimport { IInstantiationService } from '../../../../../../../platform/instantiation/common/instantiation.js';\nimport { asCssVariable } from '../../../../../../../platform/theme/common/colorUtils.js';\nimport { IThemeService } from '../../../../../../../platform/theme/common/themeService.js';\nimport { Point } from '../../../../../../common/core/2d/point.js';\nimport { Rect } from '../../../../../../common/core/2d/rect.js';\nimport { OffsetRange } from '../../../../../../common/core/ranges/offsetRange.js';\nimport { StickyScrollController } from '../../../../../stickyScroll/browser/stickyScrollController.js';\nimport { InlineEditTabAction } from '../inlineEditsViewInterface.js';\nimport { getEditorBlendedColor, inlineEditIndicatorsuccessfulBorder, inlineEditIndicatorsuccessfulForeground, inlineEditIndicatorsuccessfulBackground, inlineEditIndicatorPrimaryBorder, inlineEditIndicatorPrimaryForeground, inlineEditIndicatorPrimaryBackground, inlineEditIndicatorSecondaryBorder, inlineEditIndicatorSecondaryForeground, inlineEditIndicatorSecondaryBackground, inlineEditIndicatorBackground } from '../theme.js';\nimport { mapOutFalsy, rectToProps } from '../utils/utils.js';\nimport { GutterIndicatorMenuContent } from './gutterIndicatorMenu.js';\nimport { assertNever } from '../../../../../../../base/common/assert.js';\nimport { debouncedObservable } from '../../../../../../../base/common/observableInternal/utils/utils.js';\nimport { derived } from '../../../../../../../base/common/observableInternal/observables/derived.js';\nimport { observableValue } from '../../../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { observableFromEvent } from '../../../../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { constObservable } from '../../../../../../../base/common/observableInternal/observables/constObservable.js';\nimport { runOnChange } from '../../../../../../../base/common/observableInternal/utils/runOnChange.js';\nimport { autorun } from '../../../../../../../base/common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet InlineEditsGutterIndicator = class InlineEditsGutterIndicator extends Disposable {\n    get model() {\n        const model = this._model.get();\n        if (!model) {\n            throw new BugIndicatingError('Inline Edit Model not available');\n        }\n        return model;\n    }\n    constructor(_editorObs, _originalRange, _verticalOffset, _model, _isHoveringOverInlineEdit, _focusIsInMenu, _hoverService, _instantiationService, _accessibilityService, themeService) {\n        super();\n        this._editorObs = _editorObs;\n        this._originalRange = _originalRange;\n        this._verticalOffset = _verticalOffset;\n        this._model = _model;\n        this._isHoveringOverInlineEdit = _isHoveringOverInlineEdit;\n        this._focusIsInMenu = _focusIsInMenu;\n        this._hoverService = _hoverService;\n        this._instantiationService = _instantiationService;\n        this._accessibilityService = _accessibilityService;\n        this._tabAction = derived(this, reader => {\n            const model = this._model.read(reader);\n            if (!model) {\n                return InlineEditTabAction.Inactive;\n            }\n            return model.tabAction.read(reader);\n        });\n        this._hoverVisible = observableValue(this, false);\n        this.isHoverVisible = this._hoverVisible;\n        this._isHoveredOverIcon = observableValue(this, false);\n        this._isHoveredOverIconDebounced = debouncedObservable(this._isHoveredOverIcon, 100);\n        this.isHoveredOverIcon = this._isHoveredOverIconDebounced;\n        this._isHoveredOverInlineEditDebounced = debouncedObservable(this._isHoveringOverInlineEdit, 100);\n        this._gutterIndicatorStyles = this._tabAction.map(this, (v, reader) => {\n            switch (v) {\n                case InlineEditTabAction.Inactive: return {\n                    background: getEditorBlendedColor(inlineEditIndicatorSecondaryBackground, themeService).read(reader).toString(),\n                    foreground: getEditorBlendedColor(inlineEditIndicatorSecondaryForeground, themeService).read(reader).toString(),\n                    border: getEditorBlendedColor(inlineEditIndicatorSecondaryBorder, themeService).read(reader).toString(),\n                };\n                case InlineEditTabAction.Jump: return {\n                    background: getEditorBlendedColor(inlineEditIndicatorPrimaryBackground, themeService).read(reader).toString(),\n                    foreground: getEditorBlendedColor(inlineEditIndicatorPrimaryForeground, themeService).read(reader).toString(),\n                    border: getEditorBlendedColor(inlineEditIndicatorPrimaryBorder, themeService).read(reader).toString()\n                };\n                case InlineEditTabAction.Accept: return {\n                    background: getEditorBlendedColor(inlineEditIndicatorsuccessfulBackground, themeService).read(reader).toString(),\n                    foreground: getEditorBlendedColor(inlineEditIndicatorsuccessfulForeground, themeService).read(reader).toString(),\n                    border: getEditorBlendedColor(inlineEditIndicatorsuccessfulBorder, themeService).read(reader).toString()\n                };\n                default:\n                    assertNever();\n            }\n        });\n        this._originalRangeObs = mapOutFalsy(this._originalRange);\n        this._state = derived(this, reader => {\n            const range = this._originalRangeObs.read(reader);\n            if (!range) {\n                return undefined;\n            }\n            return {\n                range,\n                lineOffsetRange: this._editorObs.observeLineOffsetRange(range, reader.store),\n            };\n        });\n        this._stickyScrollController = StickyScrollController.get(this._editorObs.editor);\n        this._stickyScrollHeight = this._stickyScrollController\n            ? observableFromEvent(this._stickyScrollController.onDidChangeStickyScrollHeight, () => this._stickyScrollController.stickyScrollWidgetHeight)\n            : constObservable(0);\n        this._lineNumberToRender = derived(this, reader => {\n            if (this._verticalOffset.read(reader) !== 0) {\n                return '';\n            }\n            const lineNumber = this._originalRange.read(reader)?.startLineNumber;\n            const lineNumberOptions = this._editorObs.getOption(76 /* EditorOption.lineNumbers */).read(reader);\n            if (lineNumber === undefined || lineNumberOptions.renderType === 0 /* RenderLineNumbersType.Off */) {\n                return '';\n            }\n            if (lineNumberOptions.renderType === 3 /* RenderLineNumbersType.Interval */) {\n                const cursorPosition = this._editorObs.cursorPosition.read(reader);\n                if (lineNumber % 10 === 0 || cursorPosition && cursorPosition.lineNumber === lineNumber) {\n                    return lineNumber.toString();\n                }\n                return '';\n            }\n            if (lineNumberOptions.renderType === 2 /* RenderLineNumbersType.Relative */) {\n                const cursorPosition = this._editorObs.cursorPosition.read(reader);\n                if (!cursorPosition) {\n                    return '';\n                }\n                const relativeLineNumber = Math.abs(lineNumber - cursorPosition.lineNumber);\n                if (relativeLineNumber === 0) {\n                    return lineNumber.toString();\n                }\n                return relativeLineNumber.toString();\n            }\n            if (lineNumberOptions.renderType === 4 /* RenderLineNumbersType.Custom */) {\n                if (lineNumberOptions.renderFn) {\n                    return lineNumberOptions.renderFn(lineNumber);\n                }\n                return '';\n            }\n            return lineNumber.toString();\n        });\n        this._availableWidthForIcon = derived(this, reader => {\n            const textModel = this._editorObs.editor.getModel();\n            const editor = this._editorObs.editor;\n            const layout = this._editorObs.layoutInfo.read(reader);\n            const gutterWidth = layout.decorationsLeft + layout.decorationsWidth - layout.glyphMarginLeft;\n            if (!textModel || gutterWidth <= 0) {\n                return () => 0;\n            }\n            // no glyph margin => the entire gutter width is available as there is no optimal place to put the icon\n            if (layout.lineNumbersLeft === 0) {\n                return () => gutterWidth;\n            }\n            const lineNumberOptions = this._editorObs.getOption(76 /* EditorOption.lineNumbers */).read(reader);\n            if (lineNumberOptions.renderType === 2 /* RenderLineNumbersType.Relative */ || /* likely to flicker */\n                lineNumberOptions.renderType === 0 /* RenderLineNumbersType.Off */) {\n                return () => gutterWidth;\n            }\n            const w = editor.getOption(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;\n            const rightOfLineNumber = layout.lineNumbersLeft + layout.lineNumbersWidth;\n            const totalLines = textModel.getLineCount();\n            const totalLinesDigits = (totalLines + 1 /* 0 based to 1 based*/).toString().length;\n            const offsetDigits = [];\n            // We only need to pre compute the usable width left of the line number for the first line number with a given digit count\n            for (let digits = 1; digits <= totalLinesDigits; digits++) {\n                const firstLineNumberWithDigitCount = 10 ** (digits - 1);\n                const topOfLineNumber = editor.getTopForLineNumber(firstLineNumberWithDigitCount);\n                const digitsWidth = digits * w;\n                const usableWidthLeftOfLineNumber = Math.min(gutterWidth, Math.max(0, rightOfLineNumber - digitsWidth - layout.glyphMarginLeft));\n                offsetDigits.push({ firstLineNumberWithDigitCount, topOfLineNumber, usableWidthLeftOfLineNumber });\n            }\n            return (topOffset) => {\n                for (let i = offsetDigits.length - 1; i >= 0; i--) {\n                    if (topOffset >= offsetDigits[i].topOfLineNumber) {\n                        return offsetDigits[i].usableWidthLeftOfLineNumber;\n                    }\n                }\n                throw new BugIndicatingError('Could not find avilable width for icon');\n            };\n        });\n        this._layout = derived(this, reader => {\n            const s = this._state.read(reader);\n            if (!s) {\n                return undefined;\n            }\n            const layout = this._editorObs.layoutInfo.read(reader);\n            const lineHeight = this._editorObs.observeLineHeightForLine(s.range.map(r => r.startLineNumber)).read(reader);\n            const gutterViewPortPadding = 2;\n            // Entire gutter view from top left to bottom right\n            const gutterWidthWithoutPadding = layout.decorationsLeft + layout.decorationsWidth - layout.glyphMarginLeft - 2 * gutterViewPortPadding;\n            const gutterHeightWithoutPadding = layout.height - 2 * gutterViewPortPadding;\n            const gutterViewPortWithStickyScroll = Rect.fromLeftTopWidthHeight(gutterViewPortPadding, gutterViewPortPadding, gutterWidthWithoutPadding, gutterHeightWithoutPadding);\n            const gutterViewPortWithoutStickyScrollWithoutPaddingTop = gutterViewPortWithStickyScroll.withTop(this._stickyScrollHeight.read(reader));\n            const gutterViewPortWithoutStickyScroll = gutterViewPortWithStickyScroll.withTop(gutterViewPortWithoutStickyScrollWithoutPaddingTop.top + gutterViewPortPadding);\n            // The glyph margin area across all relevant lines\n            const verticalEditRange = s.lineOffsetRange.read(reader);\n            const gutterEditArea = Rect.fromRanges(OffsetRange.fromTo(gutterViewPortWithoutStickyScroll.left, gutterViewPortWithoutStickyScroll.right), verticalEditRange);\n            // The gutter view container (pill)\n            const pillHeight = lineHeight;\n            const pillOffset = this._verticalOffset.read(reader);\n            const pillFullyDockedRect = gutterEditArea.withHeight(pillHeight).translateY(pillOffset);\n            const pillIsFullyDocked = gutterViewPortWithoutStickyScrollWithoutPaddingTop.containsRect(pillFullyDockedRect);\n            // The icon which will be rendered in the pill\n            const iconNoneDocked = this._tabAction.map(action => action === InlineEditTabAction.Accept ? Codicon.keyboardTab : Codicon.arrowRight);\n            const iconDocked = derived(this, reader => {\n                if (this._isHoveredOverIconDebounced.read(reader) || this._isHoveredOverInlineEditDebounced.read(reader)) {\n                    return Codicon.check;\n                }\n                if (this._tabAction.read(reader) === InlineEditTabAction.Accept) {\n                    return Codicon.keyboardTab;\n                }\n                const cursorLineNumber = this._editorObs.cursorLineNumber.read(reader) ?? 0;\n                const editStartLineNumber = s.range.read(reader).startLineNumber;\n                return cursorLineNumber <= editStartLineNumber ? Codicon.keyboardTabAbove : Codicon.keyboardTabBelow;\n            });\n            const idealIconWidth = 22;\n            const minimalIconWidth = 16; // codicon size\n            const iconWidth = (pillRect) => {\n                const availableWidth = this._availableWidthForIcon.read(undefined)(pillRect.bottom + this._editorObs.editor.getScrollTop()) - gutterViewPortPadding;\n                return Math.max(Math.min(availableWidth, idealIconWidth), minimalIconWidth);\n            };\n            if (pillIsFullyDocked) {\n                const pillRect = pillFullyDockedRect;\n                let lineNumberWidth;\n                if (layout.lineNumbersWidth === 0) {\n                    lineNumberWidth = Math.min(Math.max(layout.lineNumbersLeft - gutterViewPortWithStickyScroll.left, 0), pillRect.width - idealIconWidth);\n                }\n                else {\n                    lineNumberWidth = Math.max(layout.lineNumbersLeft + layout.lineNumbersWidth - gutterViewPortWithStickyScroll.left, 0);\n                }\n                const lineNumberRect = pillRect.withWidth(lineNumberWidth);\n                const iconWidth = Math.max(Math.min(layout.decorationsWidth, idealIconWidth), minimalIconWidth);\n                const iconRect = pillRect.withWidth(iconWidth).translateX(lineNumberWidth);\n                return {\n                    gutterEditArea,\n                    icon: iconDocked,\n                    iconDirection: 'right',\n                    iconRect,\n                    pillRect,\n                    lineNumberRect,\n                };\n            }\n            const pillPartiallyDockedPossibleArea = gutterViewPortWithStickyScroll.intersect(gutterEditArea); // The area in which the pill could be partially docked\n            const pillIsPartiallyDocked = pillPartiallyDockedPossibleArea && pillPartiallyDockedPossibleArea.height >= pillHeight;\n            if (pillIsPartiallyDocked) {\n                // pillFullyDockedRect is outside viewport, move it into the viewport under sticky scroll as we prefer the pill to not be on top of the sticky scroll\n                // then move it into the possible area which will only cause it to move if it has to be rendered on top of the sticky scroll\n                const pillRectMoved = pillFullyDockedRect.moveToBeContainedIn(gutterViewPortWithoutStickyScroll).moveToBeContainedIn(pillPartiallyDockedPossibleArea);\n                const pillRect = pillRectMoved.withWidth(iconWidth(pillRectMoved));\n                const iconRect = pillRect;\n                return {\n                    gutterEditArea,\n                    icon: iconDocked,\n                    iconDirection: 'right',\n                    iconRect,\n                    pillRect,\n                };\n            }\n            // pillFullyDockedRect is outside viewport, so move it into viewport\n            const pillRectMoved = pillFullyDockedRect.moveToBeContainedIn(gutterViewPortWithStickyScroll);\n            const pillRect = pillRectMoved.withWidth(iconWidth(pillRectMoved));\n            const iconRect = pillRect;\n            // docked = pill was already in the viewport\n            const iconDirection = pillRect.top < pillFullyDockedRect.top ?\n                'top' :\n                'bottom';\n            return {\n                gutterEditArea,\n                icon: iconNoneDocked,\n                iconDirection,\n                iconRect,\n                pillRect,\n            };\n        });\n        this._iconRef = n.ref();\n        this.isVisible = this._layout.map(l => !!l);\n        this._indicator = n.div({\n            class: 'inline-edits-view-gutter-indicator',\n            onclick: () => {\n                const layout = this._layout.get();\n                const acceptOnClick = layout?.icon.get() === Codicon.check;\n                this._editorObs.editor.focus();\n                if (acceptOnClick) {\n                    this.model.accept();\n                }\n                else {\n                    this.model.jump();\n                }\n            },\n            tabIndex: 0,\n            style: {\n                position: 'absolute',\n                overflow: 'visible',\n            },\n        }, mapOutFalsy(this._layout).map(layout => !layout ? [] : [\n            n.div({\n                style: {\n                    position: 'absolute',\n                    background: asCssVariable(inlineEditIndicatorBackground),\n                    borderRadius: '4px',\n                    ...rectToProps(reader => layout.read(reader).gutterEditArea),\n                }\n            }),\n            n.div({\n                class: 'icon',\n                ref: this._iconRef,\n                onmouseenter: () => {\n                    // TODO show hover when hovering ghost text etc.\n                    this._showHover();\n                },\n                style: {\n                    cursor: 'pointer',\n                    zIndex: '20',\n                    position: 'absolute',\n                    backgroundColor: this._gutterIndicatorStyles.map(v => v.background),\n                    // eslint-disable-next-line local/code-no-any-casts\n                    ['--vscodeIconForeground']: this._gutterIndicatorStyles.map(v => v.foreground),\n                    border: this._gutterIndicatorStyles.map(v => `1px solid ${v.border}`),\n                    boxSizing: 'border-box',\n                    borderRadius: '4px',\n                    display: 'flex',\n                    justifyContent: 'flex-end',\n                    transition: 'background-color 0.2s ease-in-out, width 0.2s ease-in-out',\n                    ...rectToProps(reader => layout.read(reader).pillRect),\n                }\n            }, [\n                n.div({\n                    className: 'line-number',\n                    style: {\n                        lineHeight: layout.map(l => l.lineNumberRect ? l.lineNumberRect.height : 0),\n                        display: layout.map(l => l.lineNumberRect ? 'flex' : 'none'),\n                        alignItems: 'center',\n                        justifyContent: 'flex-end',\n                        width: layout.map(l => l.lineNumberRect ? l.lineNumberRect.width : 0),\n                        height: '100%',\n                        color: this._gutterIndicatorStyles.map(v => v.foreground),\n                    }\n                }, this._lineNumberToRender),\n                n.div({\n                    style: {\n                        rotate: layout.map(l => `${getRotationFromDirection(l.iconDirection)}deg`),\n                        transition: 'rotate 0.2s ease-in-out',\n                        display: 'flex',\n                        alignItems: 'center',\n                        justifyContent: 'center',\n                        height: '100%',\n                        marginRight: layout.map(l => l.pillRect.width - l.iconRect.width - (l.lineNumberRect?.width ?? 0)),\n                        width: layout.map(l => l.iconRect.width),\n                    }\n                }, [\n                    layout.map((l, reader) => renderIcon(l.icon.read(reader))),\n                ])\n            ]),\n        ])).keepUpdated(this._store);\n        this._register(this._editorObs.createOverlayWidget({\n            domNode: this._indicator.element,\n            position: constObservable(null),\n            allowEditorOverflow: false,\n            minContentWidthInPx: constObservable(0),\n        }));\n        this._register(this._editorObs.editor.onMouseMove((e) => {\n            const state = this._state.get();\n            if (state === undefined) {\n                return;\n            }\n            const el = this._iconRef.element;\n            const rect = el.getBoundingClientRect();\n            const rectangularArea = Rect.fromLeftTopWidthHeight(rect.left, rect.top, rect.width, rect.height);\n            const point = new Point(e.event.posx, e.event.posy);\n            this._isHoveredOverIcon.set(rectangularArea.containsPoint(point), undefined);\n        }));\n        this._register(this._editorObs.editor.onDidScrollChange(() => {\n            this._isHoveredOverIcon.set(false, undefined);\n        }));\n        // pulse animation when hovering inline edit\n        this._register(runOnChange(this._isHoveredOverInlineEditDebounced, (isHovering) => {\n            if (isHovering) {\n                this.triggerAnimation();\n            }\n        }));\n        this._register(autorun(reader => {\n            this._indicator.readEffect(reader);\n            if (this._indicator.element) {\n                this._editorObs.editor.applyFontInfo(this._indicator.element);\n            }\n        }));\n    }\n    triggerAnimation() {\n        if (this._accessibilityService.isMotionReduced()) {\n            return new Animation(null, null).finished;\n        }\n        // PULSE ANIMATION:\n        const animation = this._iconRef.element.animate([\n            {\n                outline: `2px solid ${this._gutterIndicatorStyles.map(v => v.border).get()}`,\n                outlineOffset: '-1px',\n                offset: 0\n            },\n            {\n                outline: `2px solid transparent`,\n                outlineOffset: '10px',\n                offset: 1\n            },\n        ], { duration: 500 });\n        return animation.finished;\n    }\n    _showHover() {\n        if (this._hoverVisible.get()) {\n            return;\n        }\n        const disposableStore = new DisposableStore();\n        const content = disposableStore.add(this._instantiationService.createInstance(GutterIndicatorMenuContent, this.model, (focusEditor) => {\n            if (focusEditor) {\n                this._editorObs.editor.focus();\n            }\n            h?.dispose();\n        }, this._editorObs).toDisposableLiveElement());\n        const focusTracker = disposableStore.add(trackFocus(content.element));\n        disposableStore.add(focusTracker.onDidBlur(() => this._focusIsInMenu.set(false, undefined)));\n        disposableStore.add(focusTracker.onDidFocus(() => this._focusIsInMenu.set(true, undefined)));\n        disposableStore.add(toDisposable(() => this._focusIsInMenu.set(false, undefined)));\n        const h = this._hoverService.showInstantHover({\n            target: this._iconRef.element,\n            content: content.element,\n        });\n        if (h) {\n            this._hoverVisible.set(true, undefined);\n            disposableStore.add(this._editorObs.editor.onDidScrollChange(() => h.dispose()));\n            disposableStore.add(h.onDispose(() => {\n                this._hoverVisible.set(false, undefined);\n                disposableStore.dispose();\n            }));\n        }\n        else {\n            disposableStore.dispose();\n        }\n    }\n};\nInlineEditsGutterIndicator = __decorate([\n    __param(6, IHoverService),\n    __param(7, IInstantiationService),\n    __param(8, IAccessibilityService),\n    __param(9, IThemeService)\n], InlineEditsGutterIndicator);\nfunction getRotationFromDirection(direction) {\n    switch (direction) {\n        case 'top': return 90;\n        case 'bottom': return -90;\n        case 'right': return 0;\n    }\n}\n\nexport { InlineEditsGutterIndicator };\n","import { timeout } from '../../../../../../base/common/async.js';\nimport { BugIndicatingError } from '../../../../../../base/common/errors.js';\nimport { Disposable, MutableDisposable, DisposableStore } from '../../../../../../base/common/lifecycle.js';\nimport '../../../../../../base/common/observableInternal/index.js';\nimport { IConfigurationService } from '../../../../../../platform/configuration/common/configuration.js';\nimport { IStorageService } from '../../../../../../platform/storage/common/storage.js';\nimport { runOnChangeWithCancellationToken, runOnChange } from '../../../../../../base/common/observableInternal/utils/runOnChange.js';\nimport { observableValue } from '../../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { derived } from '../../../../../../base/common/observableInternal/observables/derived.js';\nimport { autorun, autorunWithStore } from '../../../../../../base/common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar UserKind;\n(function (UserKind) {\n    UserKind[\"FirstTime\"] = \"firstTime\";\n    UserKind[\"SecondTime\"] = \"secondTime\";\n    UserKind[\"Active\"] = \"active\";\n})(UserKind || (UserKind = {}));\nlet InlineEditsOnboardingExperience = class InlineEditsOnboardingExperience extends Disposable {\n    constructor(_host, _model, _indicator, _collapsedView, _storageService, _configurationService) {\n        super();\n        this._host = _host;\n        this._model = _model;\n        this._indicator = _indicator;\n        this._collapsedView = _collapsedView;\n        this._storageService = _storageService;\n        this._configurationService = _configurationService;\n        this._disposables = this._register(new MutableDisposable());\n        this._setupDone = observableValue({ name: 'setupDone' }, false);\n        this._activeCompletionId = derived(reader => {\n            const model = this._model.read(reader);\n            if (!model) {\n                return undefined;\n            }\n            if (!this._setupDone.read(reader)) {\n                return undefined;\n            }\n            const indicator = this._indicator.read(reader);\n            if (!indicator || !indicator.isVisible.read(reader)) {\n                return undefined;\n            }\n            return model.inlineEdit.inlineCompletion.identity.id;\n        });\n        this._register(this._initializeDebugSetting());\n        // Setup the onboarding experience for new users\n        this._disposables.value = this.setupNewUserExperience();\n        this._setupDone.set(true, undefined);\n    }\n    setupNewUserExperience() {\n        if (this.getNewUserType() === UserKind.Active) {\n            return undefined;\n        }\n        const disposableStore = new DisposableStore();\n        let userHasHoveredOverIcon = false;\n        let inlineEditHasBeenAccepted = false;\n        let firstTimeUserAnimationCount = 0;\n        let secondTimeUserAnimationCount = 0;\n        // pulse animation for new users\n        disposableStore.add(runOnChangeWithCancellationToken(this._activeCompletionId, async (id, _, __, token) => {\n            if (id === undefined) {\n                return;\n            }\n            let userType = this.getNewUserType();\n            // User Kind Transition\n            switch (userType) {\n                case UserKind.FirstTime: {\n                    if (firstTimeUserAnimationCount++ >= 5 || userHasHoveredOverIcon) {\n                        userType = UserKind.SecondTime;\n                        this.setNewUserType(userType);\n                    }\n                    break;\n                }\n                case UserKind.SecondTime: {\n                    if (secondTimeUserAnimationCount++ >= 3 && inlineEditHasBeenAccepted) {\n                        userType = UserKind.Active;\n                        this.setNewUserType(userType);\n                    }\n                    break;\n                }\n            }\n            // Animation\n            switch (userType) {\n                case UserKind.FirstTime: {\n                    for (let i = 0; i < 3 && !token.isCancellationRequested; i++) {\n                        await this._indicator.get()?.triggerAnimation();\n                        await timeout(500);\n                    }\n                    break;\n                }\n                case UserKind.SecondTime: {\n                    this._indicator.get()?.triggerAnimation();\n                    break;\n                }\n            }\n        }));\n        disposableStore.add(autorun(reader => {\n            if (this._collapsedView.isVisible.read(reader)) {\n                if (this.getNewUserType() !== UserKind.Active) {\n                    this._collapsedView.triggerAnimation();\n                }\n            }\n        }));\n        // Remember when the user has hovered over the icon\n        disposableStore.add(autorunWithStore((reader, store) => {\n            const indicator = this._indicator.read(reader);\n            if (!indicator) {\n                return;\n            }\n            store.add(runOnChange(indicator.isHoveredOverIcon, async (isHovered) => {\n                if (isHovered) {\n                    userHasHoveredOverIcon = true;\n                }\n            }));\n        }));\n        // Remember when the user has accepted an inline edit\n        disposableStore.add(autorunWithStore((reader, store) => {\n            const host = this._host.read(reader);\n            if (!host) {\n                return;\n            }\n            store.add(host.onDidAccept(() => {\n                inlineEditHasBeenAccepted = true;\n            }));\n        }));\n        return disposableStore;\n    }\n    getNewUserType() {\n        return this._storageService.get('inlineEditsGutterIndicatorUserKind', -1 /* StorageScope.APPLICATION */, UserKind.FirstTime);\n    }\n    setNewUserType(value) {\n        switch (value) {\n            case UserKind.FirstTime:\n                throw new BugIndicatingError('UserKind should not be set to first time');\n            case UserKind.SecondTime:\n                break;\n            case UserKind.Active:\n                this._disposables.clear();\n                break;\n        }\n        this._storageService.store('inlineEditsGutterIndicatorUserKind', value, -1 /* StorageScope.APPLICATION */, 0 /* StorageTarget.USER */);\n    }\n    _initializeDebugSetting() {\n        // Debug setting to reset the new user experience\n        const hiddenDebugSetting = 'editor.inlineSuggest.edits.resetNewUserExperience';\n        if (this._configurationService.getValue(hiddenDebugSetting)) {\n            this._storageService.remove('inlineEditsGutterIndicatorUserKind', -1 /* StorageScope.APPLICATION */);\n        }\n        const disposable = this._configurationService.onDidChangeConfiguration(e => {\n            if (e.affectsConfiguration(hiddenDebugSetting) && this._configurationService.getValue(hiddenDebugSetting)) {\n                this._storageService.remove('inlineEditsGutterIndicatorUserKind', -1 /* StorageScope.APPLICATION */);\n                this._disposables.value = this.setupNewUserExperience();\n            }\n        });\n        return disposable;\n    }\n};\nInlineEditsOnboardingExperience = __decorate([\n    __param(4, IStorageService),\n    __param(5, IConfigurationService)\n], InlineEditsOnboardingExperience);\n\nexport { InlineEditsOnboardingExperience };\n","import { n } from '../../../../../../../base/browser/dom.js';\nimport { Emitter } from '../../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../../base/common/lifecycle.js';\nimport '../../../../../../../base/common/observableInternal/index.js';\nimport { IAccessibilityService } from '../../../../../../../platform/accessibility/common/accessibility.js';\nimport { asCssVariable } from '../../../../../../../platform/theme/common/colorUtils.js';\nimport { observableCodeEditor } from '../../../../../../browser/observableCodeEditor.js';\nimport { Point } from '../../../../../../common/core/2d/point.js';\nimport { singleTextRemoveCommonPrefix } from '../../../model/singleTextEditHelpers.js';\nimport { inlineEditIndicatorPrimaryBorder } from '../theme.js';\nimport { rectToProps, getEditorValidOverlayRect, PathBuilder } from '../utils/utils.js';\nimport { constObservable } from '../../../../../../../base/common/observableInternal/observables/constObservable.js';\nimport { derived } from '../../../../../../../base/common/observableInternal/observables/derived.js';\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet InlineEditsCollapsedView = class InlineEditsCollapsedView extends Disposable {\n    constructor(_editor, _edit, _accessibilityService) {\n        super();\n        this._editor = _editor;\n        this._edit = _edit;\n        this._accessibilityService = _accessibilityService;\n        this._onDidClick = this._register(new Emitter());\n        this.onDidClick = this._onDidClick.event;\n        this._iconRef = n.ref();\n        this.isHovered = constObservable(false);\n        this._editorObs = observableCodeEditor(this._editor);\n        const firstEdit = this._edit.map(inlineEdit => inlineEdit?.edit.replacements[0] ?? null);\n        const startPosition = firstEdit.map(edit => edit ? singleTextRemoveCommonPrefix(edit, this._editor.getModel()).range.getStartPosition() : null);\n        const observedStartPoint = this._editorObs.observePosition(startPosition, this._store);\n        const startPoint = derived(reader => {\n            const point = observedStartPoint.read(reader);\n            if (!point) {\n                return null;\n            }\n            const contentLeft = this._editorObs.layoutInfoContentLeft.read(reader);\n            const scrollLeft = this._editorObs.scrollLeft.read(reader);\n            return new Point(contentLeft + point.x - scrollLeft, point.y);\n        });\n        const overlayElement = n.div({\n            class: 'inline-edits-collapsed-view',\n            style: {\n                position: 'absolute',\n                overflow: 'visible',\n                top: '0px',\n                left: '0px',\n                display: 'block',\n            },\n        }, [\n            [this.getCollapsedIndicator(startPoint)],\n        ]).keepUpdated(this._store).element;\n        this._register(this._editorObs.createOverlayWidget({\n            domNode: overlayElement,\n            position: constObservable(null),\n            allowEditorOverflow: false,\n            minContentWidthInPx: constObservable(0),\n        }));\n        this.isVisible = this._edit.map((inlineEdit, reader) => !!inlineEdit && startPoint.read(reader) !== null);\n    }\n    triggerAnimation() {\n        if (this._accessibilityService.isMotionReduced()) {\n            return new Animation(null, null).finished;\n        }\n        // PULSE ANIMATION:\n        const animation = this._iconRef.element.animate([\n            { offset: 0.00, transform: 'translateY(-3px)', },\n            { offset: 0.20, transform: 'translateY(1px)', },\n            { offset: 0.36, transform: 'translateY(-1px)', },\n            { offset: 0.52, transform: 'translateY(1px)', },\n            { offset: 0.68, transform: 'translateY(-1px)', },\n            { offset: 0.84, transform: 'translateY(1px)', },\n            { offset: 1.00, transform: 'translateY(0px)', },\n        ], { duration: 2000 });\n        return animation.finished;\n    }\n    getCollapsedIndicator(startPoint) {\n        const contentLeft = this._editorObs.layoutInfoContentLeft;\n        const startPointTranslated = startPoint.map((p, reader) => p ? p.deltaX(-contentLeft.read(reader)) : null);\n        const iconPath = this.createIconPath(startPointTranslated);\n        return n.svg({\n            class: 'collapsedView',\n            ref: this._iconRef,\n            style: {\n                position: 'absolute',\n                ...rectToProps((r) => getEditorValidOverlayRect(this._editorObs).read(r)),\n                overflow: 'hidden',\n                pointerEvents: 'none',\n            }\n        }, [\n            n.svgElem('path', {\n                class: 'collapsedViewPath',\n                d: iconPath,\n                fill: asCssVariable(inlineEditIndicatorPrimaryBorder),\n            }),\n        ]);\n    }\n    createIconPath(indicatorPoint) {\n        const width = 6;\n        const triangleHeight = 3;\n        const baseHeight = 1;\n        return indicatorPoint.map(point => {\n            if (!point) {\n                return new PathBuilder().build();\n            }\n            const baseTopLeft = point.deltaX(-width / 2).deltaY(-baseHeight);\n            const baseTopRight = baseTopLeft.deltaX(width);\n            const baseBottomLeft = baseTopLeft.deltaY(baseHeight);\n            const baseBottomRight = baseTopRight.deltaY(baseHeight);\n            const triangleBottomCenter = baseBottomLeft.deltaX(width / 2).deltaY(triangleHeight);\n            return new PathBuilder()\n                .moveTo(baseTopLeft)\n                .lineTo(baseTopRight)\n                .lineTo(baseBottomRight)\n                .lineTo(triangleBottomCenter)\n                .lineTo(baseBottomLeft)\n                .lineTo(baseTopLeft)\n                .build();\n        });\n    }\n};\nInlineEditsCollapsedView = __decorate([\n    __param(2, IAccessibilityService)\n], InlineEditsCollapsedView);\n\nexport { InlineEditsCollapsedView };\n","import { n, getWindow } from '../../../../../../../base/browser/dom.js';\nimport { StandardMouseEvent } from '../../../../../../../base/browser/mouseEvent.js';\nimport { Emitter } from '../../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../../base/common/lifecycle.js';\nimport '../../../../../../../base/common/observableInternal/index.js';\nimport { asCssVariable } from '../../../../../../../platform/theme/common/colorUtils.js';\nimport '../../../../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorBackground } from '../../../../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../../../../platform/theme/common/colors/searchColors.js';\nimport { IThemeService } from '../../../../../../../platform/theme/common/themeService.js';\nimport { observableCodeEditor } from '../../../../../../browser/observableCodeEditor.js';\nimport { renderLines, RenderOptions, LineSource } from '../../../../../../browser/widget/diffEditor/components/diffEditorViewZones/renderLines.js';\nimport { Rect } from '../../../../../../common/core/2d/rect.js';\nimport { LineRange } from '../../../../../../common/core/ranges/lineRange.js';\nimport { InlineCompletionHintStyle } from '../../../../../../common/languages.js';\nimport { ILanguageService } from '../../../../../../common/languages/language.js';\nimport { TokenArray, LineTokens } from '../../../../../../common/tokens/lineTokens.js';\nimport { InlineEditTabAction } from '../inlineEditsViewInterface.js';\nimport { getEditorBlendedColor, inlineEditIndicatorsuccessfulBackground, inlineEditIndicatorPrimaryBackground, inlineEditIndicatorSecondaryBackground } from '../theme.js';\nimport { maxContentWidthInRange, getContentRenderWidth, rectToProps } from '../utils/utils.js';\nimport { observableValue } from '../../../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { derived } from '../../../../../../../base/common/observableInternal/observables/derived.js';\nimport { derivedObservableWithCache } from '../../../../../../../base/common/observableInternal/utils/utils.js';\nimport { constObservable } from '../../../../../../../base/common/observableInternal/observables/constObservable.js';\nimport { autorun } from '../../../../../../../base/common/observableInternal/reactions/autorun.js';\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst MIN_END_OF_LINE_PADDING = 14;\nconst PADDING_VERTICALLY = 0;\nconst PADDING_HORIZONTALLY = 4;\nconst HORIZONTAL_OFFSET_WHEN_ABOVE_BELOW = 4;\nconst VERTICAL_OFFSET_WHEN_ABOVE_BELOW = 2;\n// !! minEndOfLinePadding should always be larger than paddingHorizontally + horizontalOffsetWhenAboveBelow\nlet InlineEditsCustomView = class InlineEditsCustomView extends Disposable {\n    constructor(_editor, displayLocation, tabAction, themeService, _languageService) {\n        super();\n        this._editor = _editor;\n        this._languageService = _languageService;\n        this._onDidClick = this._register(new Emitter());\n        this.onDidClick = this._onDidClick.event;\n        this._isHovered = observableValue(this, false);\n        this.isHovered = this._isHovered;\n        this._viewRef = n.ref();\n        this._editorObs = observableCodeEditor(this._editor);\n        const styles = tabAction.map((v, reader) => {\n            let border;\n            switch (v) {\n                case InlineEditTabAction.Inactive:\n                    border = inlineEditIndicatorSecondaryBackground;\n                    break;\n                case InlineEditTabAction.Jump:\n                    border = inlineEditIndicatorPrimaryBackground;\n                    break;\n                case InlineEditTabAction.Accept:\n                    border = inlineEditIndicatorsuccessfulBackground;\n                    break;\n            }\n            return {\n                border: getEditorBlendedColor(border, themeService).read(reader).toString(),\n                background: asCssVariable(editorBackground)\n            };\n        });\n        const state = displayLocation.map(dl => dl ? this.getState(dl) : undefined);\n        const view = state.map(s => s ? this.getRendering(s, styles) : undefined);\n        this.minEditorScrollHeight = derived(this, reader => {\n            const s = state.read(reader);\n            if (!s) {\n                return 0;\n            }\n            return s.rect.read(reader).bottom + this._editor.getScrollTop();\n        });\n        const overlay = n.div({\n            class: 'inline-edits-custom-view',\n            style: {\n                position: 'absolute',\n                overflow: 'visible',\n                top: '0px',\n                left: '0px',\n                display: 'block',\n            },\n        }, [view]).keepUpdated(this._store);\n        this._register(this._editorObs.createOverlayWidget({\n            domNode: overlay.element,\n            position: constObservable(null),\n            allowEditorOverflow: false,\n            minContentWidthInPx: derivedObservableWithCache(this, (reader, prev) => {\n                const s = state.read(reader);\n                if (!s) {\n                    return prev ?? 0;\n                }\n                const current = s.rect.map(rect => rect.right).read(reader)\n                    + this._editorObs.layoutInfoVerticalScrollbarWidth.read(reader)\n                    + PADDING_HORIZONTALLY\n                    - this._editorObs.layoutInfoContentLeft.read(reader);\n                return Math.max(prev ?? 0, current); // will run into infinite loop otherwise TODO: fix this\n            }).recomputeInitiallyAndOnChange(this._store),\n        }));\n        this._register(autorun((reader) => {\n            const v = view.read(reader);\n            if (!v) {\n                this._isHovered.set(false, undefined);\n                return;\n            }\n            this._isHovered.set(overlay.isHovered.read(reader), undefined);\n        }));\n    }\n    // TODO: this is very similar to side by side `fitsInsideViewport`, try to use the same function\n    fitsInsideViewport(range, displayLabel, reader) {\n        const editorWidth = this._editorObs.layoutInfoWidth.read(reader);\n        const editorContentLeft = this._editorObs.layoutInfoContentLeft.read(reader);\n        const editorVerticalScrollbar = this._editor.getLayoutInfo().verticalScrollbarWidth;\n        const minimapWidth = this._editorObs.layoutInfoMinimap.read(reader).minimapLeft !== 0 ? this._editorObs.layoutInfoMinimap.read(reader).minimapWidth : 0;\n        const maxOriginalContent = maxContentWidthInRange(this._editorObs, range, undefined);\n        const maxModifiedContent = getContentRenderWidth(displayLabel, this._editor, this._editor.getModel());\n        const padding = PADDING_HORIZONTALLY + MIN_END_OF_LINE_PADDING;\n        return maxOriginalContent + maxModifiedContent + padding < editorWidth - editorContentLeft - editorVerticalScrollbar - minimapWidth;\n    }\n    getState(displayLocation) {\n        const contentState = derived(this, (reader) => {\n            const startLineNumber = displayLocation.range.startLineNumber;\n            const endLineNumber = displayLocation.range.endLineNumber;\n            const startColumn = displayLocation.range.startColumn;\n            const endColumn = displayLocation.range.endColumn;\n            const lineCount = this._editor.getModel()?.getLineCount() ?? 0;\n            const lineWidth = maxContentWidthInRange(this._editorObs, new LineRange(startLineNumber, startLineNumber + 1), reader);\n            const lineWidthBelow = startLineNumber + 1 <= lineCount ? maxContentWidthInRange(this._editorObs, new LineRange(startLineNumber + 1, startLineNumber + 2), reader) : undefined;\n            const lineWidthAbove = startLineNumber - 1 >= 1 ? maxContentWidthInRange(this._editorObs, new LineRange(startLineNumber - 1, startLineNumber), reader) : undefined;\n            const startContentLeftOffset = this._editor.getOffsetForColumn(startLineNumber, startColumn);\n            const endContentLeftOffset = this._editor.getOffsetForColumn(endLineNumber, endColumn);\n            return {\n                lineWidth,\n                lineWidthBelow,\n                lineWidthAbove,\n                startContentLeftOffset,\n                endContentLeftOffset\n            };\n        });\n        const startLineNumber = displayLocation.range.startLineNumber;\n        const endLineNumber = displayLocation.range.endLineNumber;\n        // only check viewport once in the beginning when rendering the view\n        const fitsInsideViewport = this.fitsInsideViewport(new LineRange(startLineNumber, endLineNumber + 1), displayLocation.content, undefined);\n        const rect = derived(this, reader => {\n            const w = this._editorObs.getOption(59 /* EditorOption.fontInfo */).read(reader).typicalHalfwidthCharacterWidth;\n            const { lineWidth, lineWidthBelow, lineWidthAbove, startContentLeftOffset, endContentLeftOffset } = contentState.read(reader);\n            const contentLeft = this._editorObs.layoutInfoContentLeft.read(reader);\n            const lineHeight = this._editorObs.observeLineHeightForLine(startLineNumber).recomputeInitiallyAndOnChange(reader.store).read(reader);\n            const scrollTop = this._editorObs.scrollTop.read(reader);\n            const scrollLeft = this._editorObs.scrollLeft.read(reader);\n            let position;\n            if (startLineNumber === endLineNumber && endContentLeftOffset + 5 * w >= lineWidth && fitsInsideViewport) {\n                position = 'end'; // Render at the end of the line if the range ends almost at the end of the line\n            }\n            else if (lineWidthBelow !== undefined && lineWidthBelow + MIN_END_OF_LINE_PADDING - HORIZONTAL_OFFSET_WHEN_ABOVE_BELOW - PADDING_HORIZONTALLY < startContentLeftOffset) {\n                position = 'below'; // Render Below if possible\n            }\n            else if (lineWidthAbove !== undefined && lineWidthAbove + MIN_END_OF_LINE_PADDING - HORIZONTAL_OFFSET_WHEN_ABOVE_BELOW - PADDING_HORIZONTALLY < startContentLeftOffset) {\n                position = 'above'; // Render Above if possible\n            }\n            else {\n                position = 'end'; // Render at the end of the line otherwise\n            }\n            let topOfLine;\n            let contentStartOffset;\n            let deltaX = 0;\n            let deltaY = 0;\n            switch (position) {\n                case 'end': {\n                    topOfLine = this._editorObs.editor.getTopForLineNumber(startLineNumber);\n                    contentStartOffset = lineWidth;\n                    deltaX = PADDING_HORIZONTALLY + MIN_END_OF_LINE_PADDING;\n                    break;\n                }\n                case 'below': {\n                    topOfLine = this._editorObs.editor.getTopForLineNumber(startLineNumber + 1);\n                    contentStartOffset = startContentLeftOffset;\n                    deltaX = PADDING_HORIZONTALLY + HORIZONTAL_OFFSET_WHEN_ABOVE_BELOW;\n                    deltaY = PADDING_VERTICALLY + VERTICAL_OFFSET_WHEN_ABOVE_BELOW;\n                    break;\n                }\n                case 'above': {\n                    topOfLine = this._editorObs.editor.getTopForLineNumber(startLineNumber - 1);\n                    contentStartOffset = startContentLeftOffset;\n                    deltaX = PADDING_HORIZONTALLY + HORIZONTAL_OFFSET_WHEN_ABOVE_BELOW;\n                    deltaY = -PADDING_VERTICALLY + VERTICAL_OFFSET_WHEN_ABOVE_BELOW;\n                    break;\n                }\n            }\n            const textRect = Rect.fromLeftTopWidthHeight(contentLeft + contentStartOffset - scrollLeft, topOfLine - scrollTop, w * displayLocation.content.length, lineHeight);\n            return textRect.withMargin(PADDING_VERTICALLY, PADDING_HORIZONTALLY).translateX(deltaX).translateY(deltaY);\n        });\n        return {\n            rect,\n            label: displayLocation.content,\n            kind: displayLocation.style\n        };\n    }\n    getRendering(state, styles) {\n        const line = document.createElement('div');\n        const t = this._editor.getModel().tokenization.tokenizeLinesAt(1, [state.label])?.[0];\n        let tokens;\n        if (t && state.kind === InlineCompletionHintStyle.Code) {\n            tokens = TokenArray.fromLineTokens(t).toLineTokens(state.label, this._languageService.languageIdCodec);\n        }\n        else {\n            tokens = LineTokens.createEmpty(state.label, this._languageService.languageIdCodec);\n        }\n        const result = renderLines(new LineSource([tokens]), RenderOptions.fromEditor(this._editor).withSetWidth(false).withScrollBeyondLastColumn(0), [], line, true);\n        line.style.width = `${result.minWidthInPx}px`;\n        const rect = state.rect.map(r => r.withMargin(0, PADDING_HORIZONTALLY));\n        return n.div({\n            class: 'collapsedView',\n            ref: this._viewRef,\n            style: {\n                position: 'absolute',\n                ...rectToProps(reader => rect.read(reader)),\n                overflow: 'hidden',\n                boxSizing: 'border-box',\n                cursor: 'pointer',\n                border: styles.map(s => `1px solid ${s.border}`),\n                borderRadius: '4px',\n                backgroundColor: styles.map(s => s.background),\n                display: 'flex',\n                alignItems: 'center',\n                justifyContent: 'center',\n                whiteSpace: 'nowrap',\n            },\n            onmousedown: e => {\n                e.preventDefault(); // This prevents that the editor loses focus\n            },\n            onclick: (e) => { this._onDidClick.fire(new StandardMouseEvent(getWindow(e), e)); }\n        }, [\n            line\n        ]);\n    }\n};\nInlineEditsCustomView = __decorate([\n    __param(3, IThemeService),\n    __param(4, ILanguageService)\n], InlineEditsCustomView);\n\nexport { InlineEditsCustomView };\n","import { n } from '../../../../../../../base/browser/dom.js';\nimport { Emitter } from '../../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../../base/common/lifecycle.js';\nimport '../../../../../../../base/common/observableInternal/index.js';\nimport { asCssVariable } from '../../../../../../../platform/theme/common/colorUtils.js';\nimport '../../../../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorBackground } from '../../../../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../../../../platform/theme/common/colors/searchColors.js';\nimport { observableCodeEditor } from '../../../../../../browser/observableCodeEditor.js';\nimport { Rect } from '../../../../../../common/core/2d/rect.js';\nimport { OffsetRange } from '../../../../../../common/core/ranges/offsetRange.js';\nimport { Position } from '../../../../../../common/core/position.js';\nimport { getOriginalBorderColor, originalBackgroundColor } from '../theme.js';\nimport { maxContentWidthInRange, getPrefixTrim, mapOutFalsy } from '../utils/utils.js';\nimport { derived } from '../../../../../../../base/common/observableInternal/observables/derived.js';\nimport { constObservable } from '../../../../../../../base/common/observableInternal/observables/constObservable.js';\nimport { derivedObservableWithCache } from '../../../../../../../base/common/observableInternal/utils/utils.js';\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 *--------------------------------------------------------------------------------------------*/\nconst HORIZONTAL_PADDING = 0;\nconst VERTICAL_PADDING = 0;\nconst BORDER_WIDTH = 1;\nconst WIDGET_SEPARATOR_WIDTH = 1;\nconst WIDGET_SEPARATOR_DIFF_EDITOR_WIDTH = 3;\nconst BORDER_RADIUS = 4;\nclass InlineEditsDeletionView extends Disposable {\n    constructor(_editor, _edit, _uiState, _tabAction) {\n        super();\n        this._editor = _editor;\n        this._edit = _edit;\n        this._uiState = _uiState;\n        this._tabAction = _tabAction;\n        this._onDidClick = this._register(new Emitter());\n        this.onDidClick = this._onDidClick.event;\n        this._display = derived(this, reader => !!this._uiState.read(reader) ? 'block' : 'none');\n        this._editorMaxContentWidthInRange = derived(this, reader => {\n            const originalDisplayRange = this._originalDisplayRange.read(reader);\n            if (!originalDisplayRange) {\n                return constObservable(0);\n            }\n            this._editorObs.versionId.read(reader);\n            // Take the max value that we observed.\n            // Reset when either the edit changes or the editor text version.\n            return derivedObservableWithCache(this, (reader, lastValue) => {\n                const maxWidth = maxContentWidthInRange(this._editorObs, originalDisplayRange, reader);\n                return Math.max(maxWidth, lastValue ?? 0);\n            });\n        }).map((v, r) => v.read(r));\n        this._maxPrefixTrim = derived(this, reader => {\n            const state = this._uiState.read(reader);\n            if (!state) {\n                return { prefixTrim: 0, prefixLeftOffset: 0 };\n            }\n            return getPrefixTrim(state.deletions, state.originalRange, [], this._editor);\n        });\n        this._editorLayoutInfo = derived(this, (reader) => {\n            const inlineEdit = this._edit.read(reader);\n            if (!inlineEdit) {\n                return null;\n            }\n            const state = this._uiState.read(reader);\n            if (!state) {\n                return null;\n            }\n            const editorLayout = this._editorObs.layoutInfo.read(reader);\n            const horizontalScrollOffset = this._editorObs.scrollLeft.read(reader);\n            const w = this._editorObs.getOption(59 /* EditorOption.fontInfo */).map(f => f.typicalHalfwidthCharacterWidth).read(reader);\n            const right = editorLayout.contentLeft + Math.max(this._editorMaxContentWidthInRange.read(reader), w) - horizontalScrollOffset;\n            const range = inlineEdit.originalLineRange;\n            const selectionTop = this._originalVerticalStartPosition.read(reader) ?? this._editor.getTopForLineNumber(range.startLineNumber) - this._editorObs.scrollTop.read(reader);\n            const selectionBottom = this._originalVerticalEndPosition.read(reader) ?? this._editor.getTopForLineNumber(range.endLineNumberExclusive) - this._editorObs.scrollTop.read(reader);\n            const left = editorLayout.contentLeft + this._maxPrefixTrim.read(reader).prefixLeftOffset - horizontalScrollOffset;\n            if (right <= left) {\n                return null;\n            }\n            const codeRect = Rect.fromLeftTopRightBottom(left, selectionTop, right, selectionBottom).withMargin(VERTICAL_PADDING, HORIZONTAL_PADDING);\n            return {\n                codeRect,\n                contentLeft: editorLayout.contentLeft,\n            };\n        }).recomputeInitiallyAndOnChange(this._store);\n        this._originalOverlay = n.div({\n            style: { pointerEvents: 'none', }\n        }, derived(this, reader => {\n            const layoutInfoObs = mapOutFalsy(this._editorLayoutInfo).read(reader);\n            if (!layoutInfoObs) {\n                return undefined;\n            }\n            // Create an overlay which hides the left hand side of the original overlay when it overflows to the left\n            // such that there is a smooth transition at the edge of content left\n            const overlayhider = layoutInfoObs.map(layoutInfo => Rect.fromLeftTopRightBottom(layoutInfo.contentLeft - BORDER_RADIUS - BORDER_WIDTH, layoutInfo.codeRect.top, layoutInfo.contentLeft, layoutInfo.codeRect.bottom));\n            const overlayRect = derived(this, reader => {\n                const rect = layoutInfoObs.read(reader).codeRect;\n                const overlayHider = overlayhider.read(reader);\n                return rect.intersectHorizontal(new OffsetRange(overlayHider.left, Number.MAX_SAFE_INTEGER));\n            });\n            const separatorWidth = this._uiState.map(s => s?.inDiffEditor ? WIDGET_SEPARATOR_DIFF_EDITOR_WIDTH : WIDGET_SEPARATOR_WIDTH).read(reader);\n            const separatorRect = overlayRect.map(rect => rect.withMargin(separatorWidth, separatorWidth));\n            return [\n                n.div({\n                    class: 'originalSeparatorDeletion',\n                    style: {\n                        ...separatorRect.read(reader).toStyles(),\n                        borderRadius: `${BORDER_RADIUS}px`,\n                        border: `${BORDER_WIDTH + separatorWidth}px solid ${asCssVariable(editorBackground)}`,\n                        boxSizing: 'border-box',\n                    }\n                }),\n                n.div({\n                    class: 'originalOverlayDeletion',\n                    style: {\n                        ...overlayRect.read(reader).toStyles(),\n                        borderRadius: `${BORDER_RADIUS}px`,\n                        border: getOriginalBorderColor(this._tabAction).map(bc => `${BORDER_WIDTH}px solid ${asCssVariable(bc)}`),\n                        boxSizing: 'border-box',\n                        backgroundColor: asCssVariable(originalBackgroundColor),\n                    }\n                }),\n                n.div({\n                    class: 'originalOverlayHiderDeletion',\n                    style: {\n                        ...overlayhider.read(reader).toStyles(),\n                        backgroundColor: asCssVariable(editorBackground),\n                    }\n                })\n            ];\n        })).keepUpdated(this._store);\n        this._nonOverflowView = n.div({\n            class: 'inline-edits-view',\n            style: {\n                position: 'absolute',\n                overflow: 'visible',\n                top: '0px',\n                left: '0px',\n                display: this._display,\n            },\n        }, [\n            [this._originalOverlay],\n        ]).keepUpdated(this._store);\n        this.isHovered = constObservable(false);\n        this._editorObs = observableCodeEditor(this._editor);\n        const originalStartPosition = derived(this, (reader) => {\n            const inlineEdit = this._edit.read(reader);\n            return inlineEdit ? new Position(inlineEdit.originalLineRange.startLineNumber, 1) : null;\n        });\n        const originalEndPosition = derived(this, (reader) => {\n            const inlineEdit = this._edit.read(reader);\n            return inlineEdit ? new Position(inlineEdit.originalLineRange.endLineNumberExclusive, 1) : null;\n        });\n        this._originalDisplayRange = this._uiState.map(s => s?.originalRange);\n        this._originalVerticalStartPosition = this._editorObs.observePosition(originalStartPosition, this._store).map(p => p?.y);\n        this._originalVerticalEndPosition = this._editorObs.observePosition(originalEndPosition, this._store).map(p => p?.y);\n        this._register(this._editorObs.createOverlayWidget({\n            domNode: this._nonOverflowView.element,\n            position: constObservable(null),\n            allowEditorOverflow: false,\n            minContentWidthInPx: derived(this, reader => {\n                const info = this._editorLayoutInfo.read(reader);\n                if (info === null) {\n                    return 0;\n                }\n                return info.codeRect.width;\n            }),\n        }));\n    }\n}\n\nexport { InlineEditsDeletionView };\n","import { $, n } from '../../../../../../../base/browser/dom.js';\nimport { Emitter } from '../../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../../base/common/lifecycle.js';\nimport '../../../../../../../base/common/observableInternal/index.js';\nimport { IInstantiationService } from '../../../../../../../platform/instantiation/common/instantiation.js';\nimport { asCssVariable } from '../../../../../../../platform/theme/common/colorUtils.js';\nimport '../../../../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorBackground } from '../../../../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../../../../platform/theme/common/colors/searchColors.js';\nimport { observableCodeEditor } from '../../../../../../browser/observableCodeEditor.js';\nimport { RenderOptions, renderLines, LineSource } from '../../../../../../browser/widget/diffEditor/components/diffEditorViewZones/renderLines.js';\nimport { Rect } from '../../../../../../common/core/2d/rect.js';\nimport { Position } from '../../../../../../common/core/position.js';\nimport { Range } from '../../../../../../common/core/range.js';\nimport { LineRange } from '../../../../../../common/core/ranges/lineRange.js';\nimport { OffsetRange } from '../../../../../../common/core/ranges/offsetRange.js';\nimport { ILanguageService } from '../../../../../../common/languages/language.js';\nimport { TokenArray, LineTokens } from '../../../../../../common/tokens/lineTokens.js';\nimport { InlineDecoration } from '../../../../../../common/viewModel/inlineDecorations.js';\nimport { GhostText, GhostTextPart } from '../../../model/ghostText.js';\nimport { GhostTextView } from '../../ghostText/ghostTextView.js';\nimport { getModifiedBorderColor, modifiedBackgroundColor } from '../theme.js';\nimport { getPrefixTrim, mapOutFalsy } from '../utils/utils.js';\nimport { derived } from '../../../../../../../base/common/observableInternal/observables/derived.js';\nimport { observableValue } from '../../../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { constObservable } from '../../../../../../../base/common/observableInternal/observables/constObservable.js';\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst BORDER_WIDTH = 1;\nconst WIDGET_SEPARATOR_WIDTH = 1;\nconst WIDGET_SEPARATOR_DIFF_EDITOR_WIDTH = 3;\nconst BORDER_RADIUS = 4;\nlet InlineEditsInsertionView = class InlineEditsInsertionView extends Disposable {\n    constructor(_editor, _input, _tabAction, instantiationService, _languageService) {\n        super();\n        this._editor = _editor;\n        this._input = _input;\n        this._tabAction = _tabAction;\n        this._languageService = _languageService;\n        this._onDidClick = this._register(new Emitter());\n        this.onDidClick = this._onDidClick.event;\n        this._state = derived(this, reader => {\n            const state = this._input.read(reader);\n            if (!state) {\n                return undefined;\n            }\n            const textModel = this._editor.getModel();\n            const eol = textModel.getEOL();\n            if (state.startColumn === 1 && state.lineNumber > 1 && textModel.getLineLength(state.lineNumber) !== 0 && state.text.endsWith(eol) && !state.text.startsWith(eol)) {\n                const endOfLineColumn = textModel.getLineLength(state.lineNumber - 1) + 1;\n                return { lineNumber: state.lineNumber - 1, column: endOfLineColumn, text: eol + state.text.slice(0, -eol.length) };\n            }\n            return { lineNumber: state.lineNumber, column: state.startColumn, text: state.text };\n        });\n        this._trimVertically = derived(this, reader => {\n            const state = this._state.read(reader);\n            const text = state?.text;\n            if (!text || text.trim() === '') {\n                return { topOffset: 0, bottomOffset: 0, linesTop: 0, linesBottom: 0 };\n            }\n            // Adjust for leading/trailing newlines\n            const lineHeight = this._editor.getLineHeightForPosition(new Position(state.lineNumber, 1));\n            const eol = this._editor.getModel().getEOL();\n            let linesTop = 0;\n            let linesBottom = 0;\n            let i = 0;\n            for (; i < text.length && text.startsWith(eol, i); i += eol.length) {\n                linesTop += 1;\n            }\n            for (let j = text.length; j > i && text.endsWith(eol, j); j -= eol.length) {\n                linesBottom += 1;\n            }\n            return { topOffset: linesTop * lineHeight, bottomOffset: linesBottom * lineHeight, linesTop, linesBottom };\n        });\n        this._maxPrefixTrim = derived(this, reader => {\n            const state = this._state.read(reader);\n            if (!state) {\n                return { prefixLeftOffset: 0, prefixTrim: 0 };\n            }\n            const textModel = this._editor.getModel();\n            const eol = textModel.getEOL();\n            const trimVertically = this._trimVertically.read(reader);\n            const lines = state.text.split(eol);\n            const modifiedLines = lines.slice(trimVertically.linesTop, lines.length - trimVertically.linesBottom);\n            if (trimVertically.linesTop === 0) {\n                modifiedLines[0] = textModel.getLineContent(state.lineNumber) + modifiedLines[0];\n            }\n            const originalRange = new LineRange(state.lineNumber, state.lineNumber + (trimVertically.linesTop > 0 ? 0 : 1));\n            return getPrefixTrim([], originalRange, modifiedLines, this._editor);\n        });\n        this._ghostText = derived(reader => {\n            const state = this._state.read(reader);\n            const prefixTrim = this._maxPrefixTrim.read(reader);\n            if (!state) {\n                return undefined;\n            }\n            const textModel = this._editor.getModel();\n            const eol = textModel.getEOL();\n            const modifiedLines = state.text.split(eol);\n            const inlineDecorations = modifiedLines.map((line, i) => new InlineDecoration(new Range(i + 1, i === 0 ? 1 : prefixTrim.prefixTrim + 1, i + 1, line.length + 1), 'modified-background', 0 /* InlineDecorationType.Regular */));\n            return new GhostText(state.lineNumber, [new GhostTextPart(state.column, state.text, false, inlineDecorations)]);\n        });\n        this._display = derived(this, reader => !!this._state.read(reader) ? 'block' : 'none');\n        this._editorMaxContentWidthInRange = derived(this, reader => {\n            const state = this._state.read(reader);\n            if (!state) {\n                return 0;\n            }\n            this._editorObs.versionId.read(reader);\n            const textModel = this._editor.getModel();\n            const eol = textModel.getEOL();\n            const textBeforeInsertion = state.text.startsWith(eol) ? '' : textModel.getValueInRange(new Range(state.lineNumber, 1, state.lineNumber, state.column));\n            const textAfterInsertion = textModel.getValueInRange(new Range(state.lineNumber, state.column, state.lineNumber, textModel.getLineLength(state.lineNumber) + 1));\n            const text = textBeforeInsertion + state.text + textAfterInsertion;\n            const lines = text.split(eol);\n            const renderOptions = RenderOptions.fromEditor(this._editor).withSetWidth(false).withScrollBeyondLastColumn(0);\n            const lineWidths = lines.map(line => {\n                const t = textModel.tokenization.tokenizeLinesAt(state.lineNumber, [line])?.[0];\n                let tokens;\n                if (t) {\n                    tokens = TokenArray.fromLineTokens(t).toLineTokens(line, this._languageService.languageIdCodec);\n                }\n                else {\n                    tokens = LineTokens.createEmpty(line, this._languageService.languageIdCodec);\n                }\n                return renderLines(new LineSource([tokens]), renderOptions, [], $('div'), true).minWidthInPx;\n            });\n            // Take the max value that we observed.\n            // Reset when either the edit changes or the editor text version.\n            return Math.max(...lineWidths);\n        });\n        this.startLineOffset = this._trimVertically.map(v => v.topOffset);\n        this.originalLines = this._state.map(s => s ?\n            new LineRange(s.lineNumber, Math.min(s.lineNumber + 2, this._editor.getModel().getLineCount() + 1)) : undefined);\n        this._overlayLayout = derived(this, (reader) => {\n            this._ghostText.read(reader);\n            const state = this._state.read(reader);\n            if (!state) {\n                return null;\n            }\n            // Update the overlay when the position changes\n            this._editorObs.observePosition(observableValue(this, new Position(state.lineNumber, state.column)), reader.store).read(reader);\n            const editorLayout = this._editorObs.layoutInfo.read(reader);\n            const horizontalScrollOffset = this._editorObs.scrollLeft.read(reader);\n            const verticalScrollbarWidth = this._editorObs.layoutInfoVerticalScrollbarWidth.read(reader);\n            const right = editorLayout.contentLeft + this._editorMaxContentWidthInRange.read(reader) - horizontalScrollOffset;\n            const prefixLeftOffset = this._maxPrefixTrim.read(reader).prefixLeftOffset ?? 0 /* fix due to observable bug? */;\n            const left = editorLayout.contentLeft + prefixLeftOffset - horizontalScrollOffset;\n            if (right <= left) {\n                return null;\n            }\n            const { topOffset: topTrim, bottomOffset: bottomTrim } = this._trimVertically.read(reader);\n            const scrollTop = this._editorObs.scrollTop.read(reader);\n            const height = this._ghostTextView.height.read(reader) - topTrim - bottomTrim;\n            const top = this._editor.getTopForLineNumber(state.lineNumber) - scrollTop + topTrim;\n            const bottom = top + height;\n            const overlay = new Rect(left, top, right, bottom);\n            return {\n                overlay,\n                startsAtContentLeft: prefixLeftOffset === 0,\n                contentLeft: editorLayout.contentLeft,\n                minContentWidthRequired: prefixLeftOffset + overlay.width + verticalScrollbarWidth,\n            };\n        }).recomputeInitiallyAndOnChange(this._store);\n        this._modifiedOverlay = n.div({\n            style: { pointerEvents: 'none', }\n        }, derived(this, reader => {\n            const overlayLayoutObs = mapOutFalsy(this._overlayLayout).read(reader);\n            if (!overlayLayoutObs) {\n                return undefined;\n            }\n            // Create an overlay which hides the left hand side of the original overlay when it overflows to the left\n            // such that there is a smooth transition at the edge of content left\n            const overlayHider = overlayLayoutObs.map(layoutInfo => Rect.fromLeftTopRightBottom(layoutInfo.contentLeft - BORDER_RADIUS - BORDER_WIDTH, layoutInfo.overlay.top, layoutInfo.contentLeft, layoutInfo.overlay.bottom)).read(reader);\n            const separatorWidth = this._input.map(i => i?.inDiffEditor ? WIDGET_SEPARATOR_DIFF_EDITOR_WIDTH : WIDGET_SEPARATOR_WIDTH).read(reader);\n            const overlayRect = overlayLayoutObs.map(l => l.overlay.withMargin(0, BORDER_WIDTH, 0, l.startsAtContentLeft ? 0 : BORDER_WIDTH).intersectHorizontal(new OffsetRange(overlayHider.left, Number.MAX_SAFE_INTEGER)));\n            const underlayRect = overlayRect.map(rect => rect.withMargin(separatorWidth, separatorWidth));\n            return [\n                n.div({\n                    class: 'originalUnderlayInsertion',\n                    style: {\n                        ...underlayRect.read(reader).toStyles(),\n                        borderRadius: BORDER_RADIUS,\n                        border: `${BORDER_WIDTH + separatorWidth}px solid ${asCssVariable(editorBackground)}`,\n                        boxSizing: 'border-box',\n                    }\n                }),\n                n.div({\n                    class: 'originalOverlayInsertion',\n                    style: {\n                        ...overlayRect.read(reader).toStyles(),\n                        borderRadius: BORDER_RADIUS,\n                        border: getModifiedBorderColor(this._tabAction).map(bc => `${BORDER_WIDTH}px solid ${asCssVariable(bc)}`),\n                        boxSizing: 'border-box',\n                        backgroundColor: asCssVariable(modifiedBackgroundColor),\n                    }\n                }),\n                n.div({\n                    class: 'originalOverlayHiderInsertion',\n                    style: {\n                        ...overlayHider.toStyles(),\n                        backgroundColor: asCssVariable(editorBackground),\n                    }\n                })\n            ];\n        })).keepUpdated(this._store);\n        this._view = n.div({\n            class: 'inline-edits-view',\n            style: {\n                position: 'absolute',\n                overflow: 'visible',\n                top: '0px',\n                left: '0px',\n                display: this._display,\n            },\n        }, [\n            [this._modifiedOverlay],\n        ]).keepUpdated(this._store);\n        this._editorObs = observableCodeEditor(this._editor);\n        this._ghostTextView = this._register(instantiationService.createInstance(GhostTextView, this._editor, {\n            ghostText: this._ghostText,\n            minReservedLineCount: constObservable(0),\n            targetTextModel: this._editorObs.model.map(model => model ?? undefined),\n            warning: constObservable(undefined),\n            handleInlineCompletionShown: constObservable(() => {\n                // This is a no-op for the insertion view, as it is handled by the InlineEditsView.\n            }),\n        }, observableValue(this, { syntaxHighlightingEnabled: true, extraClasses: ['inline-edit'] }), true, true));\n        this.isHovered = this._ghostTextView.isHovered;\n        this._register(this._ghostTextView.onDidClick((e) => {\n            this._onDidClick.fire(e);\n        }));\n        this._register(this._editorObs.createOverlayWidget({\n            domNode: this._view.element,\n            position: constObservable(null),\n            allowEditorOverflow: false,\n            minContentWidthInPx: derived(this, reader => {\n                const info = this._overlayLayout.read(reader);\n                if (info === null) {\n                    return 0;\n                }\n                return info.minContentWidthRequired;\n            }),\n        }));\n    }\n};\nInlineEditsInsertionView = __decorate([\n    __param(3, IInstantiationService),\n    __param(4, ILanguageService)\n], InlineEditsInsertionView);\n\nexport { InlineEditsInsertionView };\n","import { n, getWindow, $ } from '../../../../../../../base/browser/dom.js';\nimport { StandardMouseEvent } from '../../../../../../../base/browser/mouseEvent.js';\nimport { Emitter } from '../../../../../../../base/common/event.js';\nimport { Disposable, toDisposable } from '../../../../../../../base/common/lifecycle.js';\nimport '../../../../../../../base/common/observableInternal/index.js';\nimport { asCssVariable } from '../../../../../../../platform/theme/common/colorUtils.js';\nimport '../../../../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorBackground } from '../../../../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../../../../platform/theme/common/colors/minimapColors.js';\nimport { scrollbarShadow } from '../../../../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../../../../platform/theme/common/colors/searchColors.js';\nimport { IThemeService } from '../../../../../../../platform/theme/common/themeService.js';\nimport { EditorMouseEvent } from '../../../../../../browser/editorDom.js';\nimport { renderLines, RenderOptions, LineSource } from '../../../../../../browser/widget/diffEditor/components/diffEditorViewZones/renderLines.js';\nimport { Point } from '../../../../../../common/core/2d/point.js';\nimport { Rect } from '../../../../../../common/core/2d/rect.js';\nimport { Range } from '../../../../../../common/core/range.js';\nimport { OffsetRange } from '../../../../../../common/core/ranges/offsetRange.js';\nimport { ILanguageService } from '../../../../../../common/languages/language.js';\nimport { TokenArray, LineTokens } from '../../../../../../common/tokens/lineTokens.js';\nimport { InlineDecoration } from '../../../../../../common/viewModel/inlineDecorations.js';\nimport { getModifiedBorderColor, getOriginalBorderColor, getEditorBlendedColor, originalBackgroundColor, modifiedChangedLineBackgroundColor } from '../theme.js';\nimport { getPrefixTrim, mapOutFalsy, rectToProps, getEditorValidOverlayRect } from '../utils/utils.js';\nimport { autorunDelta } from '../../../../../../../base/common/observableInternal/reactions/autorun.js';\nimport { derived } from '../../../../../../../base/common/observableInternal/observables/derived.js';\nimport { constObservable } from '../../../../../../../base/common/observableInternal/observables/constObservable.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet InlineEditsLineReplacementView = class InlineEditsLineReplacementView extends Disposable {\n    constructor(_editor, _edit, _isInDiffEditor, _tabAction, _languageService, _themeService) {\n        super();\n        this._editor = _editor;\n        this._edit = _edit;\n        this._isInDiffEditor = _isInDiffEditor;\n        this._tabAction = _tabAction;\n        this._languageService = _languageService;\n        this._themeService = _themeService;\n        this._onDidClick = this._register(new Emitter());\n        this.onDidClick = this._onDidClick.event;\n        this._maxPrefixTrim = this._edit.map((e, reader) => e ? getPrefixTrim(e.replacements.flatMap(r => [r.originalRange, r.modifiedRange]), e.originalRange, e.modifiedLines, this._editor.editor, reader) : undefined);\n        this._modifiedLineElements = derived(this, reader => {\n            const lines = [];\n            let requiredWidth = 0;\n            const prefixTrim = this._maxPrefixTrim.read(reader);\n            const edit = this._edit.read(reader);\n            if (!edit || !prefixTrim) {\n                return undefined;\n            }\n            const maxPrefixTrim = prefixTrim.prefixTrim;\n            const modifiedBubbles = rangesToBubbleRanges(edit.replacements.map(r => r.modifiedRange)).map(r => new Range(r.startLineNumber, r.startColumn - maxPrefixTrim, r.endLineNumber, r.endColumn - maxPrefixTrim));\n            const textModel = this._editor.model.get();\n            const startLineNumber = edit.modifiedRange.startLineNumber;\n            for (let i = 0; i < edit.modifiedRange.length; i++) {\n                const line = document.createElement('div');\n                const lineNumber = startLineNumber + i;\n                const modLine = edit.modifiedLines[i].slice(maxPrefixTrim);\n                const t = textModel.tokenization.tokenizeLinesAt(lineNumber, [modLine])?.[0];\n                let tokens;\n                if (t) {\n                    tokens = TokenArray.fromLineTokens(t).toLineTokens(modLine, this._languageService.languageIdCodec);\n                }\n                else {\n                    tokens = LineTokens.createEmpty(modLine, this._languageService.languageIdCodec);\n                }\n                const decorations = [];\n                for (const modified of modifiedBubbles.filter(b => b.startLineNumber === lineNumber)) {\n                    const validatedEndColumn = Math.min(modified.endColumn, modLine.length + 1);\n                    decorations.push(new InlineDecoration(new Range(1, modified.startColumn, 1, validatedEndColumn), 'inlineCompletions-modified-bubble', 0 /* InlineDecorationType.Regular */));\n                }\n                // TODO: All lines should be rendered at once for one dom element\n                const result = renderLines(new LineSource([tokens]), RenderOptions.fromEditor(this._editor.editor).withSetWidth(false).withScrollBeyondLastColumn(0), decorations, line, true);\n                this._editor.getOption(59 /* EditorOption.fontInfo */).read(reader); // update when font info changes\n                requiredWidth = Math.max(requiredWidth, result.minWidthInPx);\n                lines.push(line);\n            }\n            return { lines, requiredWidth: requiredWidth };\n        });\n        this._layout = derived(this, reader => {\n            const modifiedLines = this._modifiedLineElements.read(reader);\n            const maxPrefixTrim = this._maxPrefixTrim.read(reader);\n            const edit = this._edit.read(reader);\n            if (!modifiedLines || !maxPrefixTrim || !edit) {\n                return undefined;\n            }\n            const { prefixLeftOffset } = maxPrefixTrim;\n            const { requiredWidth } = modifiedLines;\n            const originalLineHeights = this._editor.observeLineHeightsForLineRange(edit.originalRange).read(reader);\n            const modifiedLineHeights = (() => {\n                const lineHeights = originalLineHeights.slice(0, edit.modifiedRange.length);\n                while (lineHeights.length < edit.modifiedRange.length) {\n                    lineHeights.push(originalLineHeights[originalLineHeights.length - 1]);\n                }\n                return lineHeights;\n            })();\n            const contentLeft = this._editor.layoutInfoContentLeft.read(reader);\n            const verticalScrollbarWidth = this._editor.layoutInfoVerticalScrollbarWidth.read(reader);\n            const scrollLeft = this._editor.scrollLeft.read(reader);\n            const scrollTop = this._editor.scrollTop.read(reader);\n            const editorLeftOffset = contentLeft - scrollLeft;\n            const textModel = this._editor.editor.getModel();\n            const originalLineWidths = edit.originalRange.mapToLineArray(line => this._editor.editor.getOffsetForColumn(line, textModel.getLineMaxColumn(line)) - prefixLeftOffset);\n            const maxLineWidth = Math.max(...originalLineWidths, requiredWidth);\n            const startLineNumber = edit.originalRange.startLineNumber;\n            const endLineNumber = edit.originalRange.endLineNumberExclusive - 1;\n            const topOfOriginalLines = this._editor.editor.getTopForLineNumber(startLineNumber) - scrollTop;\n            const bottomOfOriginalLines = this._editor.editor.getBottomForLineNumber(endLineNumber) - scrollTop;\n            // Box Widget positioning\n            const originalLinesOverlay = Rect.fromLeftTopWidthHeight(editorLeftOffset + prefixLeftOffset, topOfOriginalLines, maxLineWidth, bottomOfOriginalLines - topOfOriginalLines);\n            const modifiedLinesOverlay = Rect.fromLeftTopWidthHeight(originalLinesOverlay.left, originalLinesOverlay.bottom, originalLinesOverlay.width, modifiedLineHeights.reduce((sum, h) => sum + h, 0));\n            const background = Rect.hull([originalLinesOverlay, modifiedLinesOverlay]);\n            const lowerBackground = background.intersectVertical(new OffsetRange(originalLinesOverlay.bottom, Number.MAX_SAFE_INTEGER));\n            const lowerText = new Rect(lowerBackground.left, lowerBackground.top, lowerBackground.right, lowerBackground.bottom);\n            return {\n                originalLinesOverlay,\n                modifiedLinesOverlay,\n                background,\n                lowerBackground,\n                lowerText,\n                modifiedLineHeights,\n                minContentWidthRequired: prefixLeftOffset + maxLineWidth + verticalScrollbarWidth,\n            };\n        });\n        this._viewZoneInfo = derived(reader => {\n            const shouldShowViewZone = this._editor.getOption(71 /* EditorOption.inlineSuggest */).map(o => o.edits.allowCodeShifting === 'always').read(reader);\n            if (!shouldShowViewZone) {\n                return undefined;\n            }\n            const layout = this._layout.read(reader);\n            const edit = this._edit.read(reader);\n            if (!layout || !edit) {\n                return undefined;\n            }\n            const viewZoneHeight = layout.lowerBackground.height;\n            const viewZoneLineNumber = edit.originalRange.endLineNumberExclusive;\n            return { height: viewZoneHeight, lineNumber: viewZoneLineNumber };\n        });\n        this.minEditorScrollHeight = derived(this, reader => {\n            const layout = mapOutFalsy(this._layout).read(reader);\n            if (!layout || this._viewZoneInfo.read(reader) !== undefined) {\n                return 0;\n            }\n            return layout.read(reader).lowerText.bottom + this._editor.editor.getScrollTop();\n        });\n        this._div = n.div({\n            class: 'line-replacement',\n        }, [\n            derived(this, reader => {\n                const layout = mapOutFalsy(this._layout).read(reader);\n                const modifiedLineElements = this._modifiedLineElements.read(reader);\n                if (!layout || !modifiedLineElements) {\n                    return [];\n                }\n                const layoutProps = layout.read(reader);\n                const contentLeft = this._editor.layoutInfoContentLeft.read(reader);\n                const separatorWidth = this._isInDiffEditor.read(reader) ? 3 : 1;\n                modifiedLineElements.lines.forEach((l, i) => {\n                    l.style.width = `${layoutProps.lowerText.width}px`;\n                    l.style.height = `${layoutProps.modifiedLineHeights[i]}px`;\n                    l.style.position = 'relative';\n                });\n                const modifiedBorderColor = getModifiedBorderColor(this._tabAction).read(reader);\n                const originalBorderColor = getOriginalBorderColor(this._tabAction).read(reader);\n                return [\n                    n.div({\n                        style: {\n                            position: 'absolute',\n                            ...rectToProps((r) => getEditorValidOverlayRect(this._editor).read(r)),\n                            overflow: 'hidden',\n                            pointerEvents: 'none',\n                        }\n                    }, [\n                        n.div({\n                            class: 'borderAroundLineReplacement',\n                            style: {\n                                position: 'absolute',\n                                ...rectToProps(reader => layout.read(reader).background.translateX(-contentLeft).withMargin(separatorWidth)),\n                                borderRadius: '4px',\n                                border: `${separatorWidth + 1}px solid ${asCssVariable(editorBackground)}`,\n                                boxSizing: 'border-box',\n                                pointerEvents: 'none',\n                            }\n                        }),\n                        n.div({\n                            class: 'originalOverlayLineReplacement',\n                            style: {\n                                position: 'absolute',\n                                ...rectToProps(reader => layout.read(reader).background.translateX(-contentLeft)),\n                                borderRadius: '4px',\n                                border: getEditorBlendedColor(originalBorderColor, this._themeService).map(c => `1px solid ${c.toString()}`),\n                                pointerEvents: 'none',\n                                boxSizing: 'border-box',\n                                background: asCssVariable(originalBackgroundColor),\n                            }\n                        }),\n                        n.div({\n                            class: 'modifiedOverlayLineReplacement',\n                            style: {\n                                position: 'absolute',\n                                ...rectToProps(reader => layout.read(reader).lowerBackground.translateX(-contentLeft)),\n                                borderRadius: '0 0 4px 4px',\n                                background: asCssVariable(editorBackground),\n                                boxShadow: `${asCssVariable(scrollbarShadow)} 0 6px 6px -6px`,\n                                border: `1px solid ${asCssVariable(modifiedBorderColor)}`,\n                                boxSizing: 'border-box',\n                                overflow: 'hidden',\n                                cursor: 'pointer',\n                                pointerEvents: 'auto',\n                            },\n                            onmousedown: e => {\n                                e.preventDefault(); // This prevents that the editor loses focus\n                            },\n                            onclick: (e) => this._onDidClick.fire(new StandardMouseEvent(getWindow(e), e)),\n                        }, [\n                            n.div({\n                                style: {\n                                    position: 'absolute', top: 0, left: 0, width: '100%', height: '100%',\n                                    background: asCssVariable(modifiedChangedLineBackgroundColor),\n                                },\n                            })\n                        ]),\n                        n.div({\n                            class: 'modifiedLinesLineReplacement',\n                            style: {\n                                position: 'absolute',\n                                boxSizing: 'border-box',\n                                ...rectToProps(reader => layout.read(reader).lowerText.translateX(-contentLeft)),\n                                fontFamily: this._editor.getOption(58 /* EditorOption.fontFamily */),\n                                fontSize: this._editor.getOption(61 /* EditorOption.fontSize */),\n                                fontWeight: this._editor.getOption(62 /* EditorOption.fontWeight */),\n                                pointerEvents: 'none',\n                                whiteSpace: 'nowrap',\n                                borderRadius: '0 0 4px 4px',\n                                overflow: 'hidden',\n                            }\n                        }, [...modifiedLineElements.lines]),\n                    ])\n                ];\n            })\n        ]).keepUpdated(this._store);\n        this.isHovered = this._editor.isTargetHovered((e) => this._isMouseOverWidget(e), this._store);\n        this._previousViewZoneInfo = undefined;\n        this._register(toDisposable(() => this._editor.editor.changeViewZones(accessor => this.removePreviousViewZone(accessor))));\n        this._register(autorunDelta(this._viewZoneInfo, ({ lastValue, newValue }) => {\n            if (lastValue === newValue || (lastValue?.height === newValue?.height && lastValue?.lineNumber === newValue?.lineNumber)) {\n                return;\n            }\n            this._editor.editor.changeViewZones((changeAccessor) => {\n                this.removePreviousViewZone(changeAccessor);\n                if (!newValue) {\n                    return;\n                }\n                this.addViewZone(newValue, changeAccessor);\n            });\n        }));\n        this._register(this._editor.createOverlayWidget({\n            domNode: this._div.element,\n            minContentWidthInPx: derived(this, reader => {\n                return this._layout.read(reader)?.minContentWidthRequired ?? 0;\n            }),\n            position: constObservable({ preference: { top: 0, left: 0 } }),\n            allowEditorOverflow: false,\n        }));\n    }\n    _isMouseOverWidget(e) {\n        const layout = this._layout.get();\n        if (!layout || !(e.event instanceof EditorMouseEvent)) {\n            return false;\n        }\n        return layout.lowerBackground.containsPoint(new Point(e.event.relativePos.x, e.event.relativePos.y));\n    }\n    removePreviousViewZone(changeAccessor) {\n        if (!this._previousViewZoneInfo) {\n            return;\n        }\n        changeAccessor.removeZone(this._previousViewZoneInfo.id);\n        const cursorLineNumber = this._editor.cursorLineNumber.get();\n        if (cursorLineNumber !== null && cursorLineNumber >= this._previousViewZoneInfo.lineNumber) {\n            this._editor.editor.setScrollTop(this._editor.scrollTop.get() - this._previousViewZoneInfo.height);\n        }\n        this._previousViewZoneInfo = undefined;\n    }\n    addViewZone(viewZoneInfo, changeAccessor) {\n        const activeViewZone = changeAccessor.addZone({\n            afterLineNumber: viewZoneInfo.lineNumber - 1,\n            heightInPx: viewZoneInfo.height, // move computation to layout?\n            domNode: $('div'),\n        });\n        this._previousViewZoneInfo = { height: viewZoneInfo.height, lineNumber: viewZoneInfo.lineNumber, id: activeViewZone };\n        const cursorLineNumber = this._editor.cursorLineNumber.get();\n        if (cursorLineNumber !== null && cursorLineNumber >= viewZoneInfo.lineNumber) {\n            this._editor.editor.setScrollTop(this._editor.scrollTop.get() + viewZoneInfo.height);\n        }\n    }\n};\nInlineEditsLineReplacementView = __decorate([\n    __param(4, ILanguageService),\n    __param(5, IThemeService)\n], InlineEditsLineReplacementView);\nfunction rangesToBubbleRanges(ranges) {\n    const result = [];\n    while (ranges.length) {\n        let range = ranges.shift();\n        if (range.startLineNumber !== range.endLineNumber) {\n            ranges.push(new Range(range.startLineNumber + 1, 1, range.endLineNumber, range.endColumn));\n            range = new Range(range.startLineNumber, range.startColumn, range.startLineNumber, Number.MAX_SAFE_INTEGER); // TODO: this is not correct\n        }\n        result.push(range);\n    }\n    return result;\n}\n\nexport { InlineEditsLineReplacementView };\n","import { n, getWindow, $ } from '../../../../../../../base/browser/dom.js';\nimport { StandardMouseEvent } from '../../../../../../../base/browser/mouseEvent.js';\nimport { Color } from '../../../../../../../base/common/color.js';\nimport { Emitter } from '../../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../../base/common/lifecycle.js';\nimport '../../../../../../../base/common/observableInternal/index.js';\nimport { IInstantiationService } from '../../../../../../../platform/instantiation/common/instantiation.js';\nimport { asCssVariableWithDefault, asCssVariable } from '../../../../../../../platform/theme/common/colorUtils.js';\nimport '../../../../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorBackground } from '../../../../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../../../../platform/theme/common/colors/searchColors.js';\nimport { IThemeService } from '../../../../../../../platform/theme/common/themeService.js';\nimport { observableCodeEditor } from '../../../../../../browser/observableCodeEditor.js';\nimport { Rect } from '../../../../../../common/core/2d/rect.js';\nimport { EmbeddedCodeEditorWidget } from '../../../../../../browser/widget/codeEditor/embeddedCodeEditorWidget.js';\nimport { OffsetRange } from '../../../../../../common/core/ranges/offsetRange.js';\nimport { Position } from '../../../../../../common/core/position.js';\nimport { Range } from '../../../../../../common/core/range.js';\nimport { StickyScrollController } from '../../../../../stickyScroll/browser/stickyScrollController.js';\nimport { InlineCompletionContextKeys } from '../../../controller/inlineCompletionContextKeys.js';\nimport { originalBackgroundColor, getOriginalBorderColor, getEditorBlendedColor, getModifiedBorderColor, modifiedBackgroundColor } from '../theme.js';\nimport { maxContentWidthInRange, getContentRenderWidth, getOffsetForPos, PathBuilder, mapOutFalsy } from '../utils/utils.js';\nimport { derived } from '../../../../../../../base/common/observableInternal/observables/derived.js';\nimport { constObservable } from '../../../../../../../base/common/observableInternal/observables/constObservable.js';\nimport { derivedObservableWithCache } from '../../../../../../../base/common/observableInternal/utils/utils.js';\nimport { observableFromEvent } from '../../../../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { autorun } from '../../../../../../../base/common/observableInternal/reactions/autorun.js';\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst HORIZONTAL_PADDING = 0;\nconst VERTICAL_PADDING = 0;\nconst BORDER_WIDTH = 1;\nconst WIDGET_SEPARATOR_WIDTH = 1;\nconst WIDGET_SEPARATOR_DIFF_EDITOR_WIDTH = 3;\nconst BORDER_RADIUS = 4;\nconst ORIGINAL_END_PADDING = 20;\nconst MODIFIED_END_PADDING = 12;\nlet InlineEditsSideBySideView = class InlineEditsSideBySideView extends Disposable {\n    // This is an approximation and should be improved by using the real parameters used bellow\n    static fitsInsideViewport(editor, textModel, edit, reader) {\n        const editorObs = observableCodeEditor(editor);\n        const editorWidth = editorObs.layoutInfoWidth.read(reader);\n        const editorContentLeft = editorObs.layoutInfoContentLeft.read(reader);\n        const editorVerticalScrollbar = editor.getLayoutInfo().verticalScrollbarWidth;\n        const minimapWidth = editorObs.layoutInfoMinimap.read(reader).minimapLeft !== 0 ? editorObs.layoutInfoMinimap.read(reader).minimapWidth : 0;\n        const maxOriginalContent = maxContentWidthInRange(editorObs, edit.displayRange, undefined /* do not reconsider on each layout info change */);\n        const maxModifiedContent = edit.lineEdit.newLines.reduce((max, line) => Math.max(max, getContentRenderWidth(line, editor, textModel)), 0);\n        const originalPadding = ORIGINAL_END_PADDING; // padding after last line of original editor\n        const modifiedPadding = MODIFIED_END_PADDING + 2 * BORDER_WIDTH; // padding after last line of modified editor\n        return maxOriginalContent + maxModifiedContent + originalPadding + modifiedPadding < editorWidth - editorContentLeft - editorVerticalScrollbar - minimapWidth;\n    }\n    constructor(_editor, _edit, _previewTextModel, _uiState, _tabAction, _instantiationService, _themeService) {\n        super();\n        this._editor = _editor;\n        this._edit = _edit;\n        this._previewTextModel = _previewTextModel;\n        this._uiState = _uiState;\n        this._tabAction = _tabAction;\n        this._instantiationService = _instantiationService;\n        this._themeService = _themeService;\n        this._editorObs = observableCodeEditor(this._editor);\n        this._onDidClick = this._register(new Emitter());\n        this.onDidClick = this._onDidClick.event;\n        this._display = derived(this, reader => !!this._uiState.read(reader) ? 'block' : 'none');\n        this.previewRef = n.ref();\n        const separatorWidthObs = this._uiState.map(s => s?.isInDiffEditor ? WIDGET_SEPARATOR_DIFF_EDITOR_WIDTH : WIDGET_SEPARATOR_WIDTH);\n        this._editorContainer = n.div({\n            class: ['editorContainer'],\n            style: { position: 'absolute', overflow: 'hidden', cursor: 'pointer' },\n            onmousedown: e => {\n                e.preventDefault(); // This prevents that the editor loses focus\n            },\n            onclick: (e) => {\n                this._onDidClick.fire(new StandardMouseEvent(getWindow(e), e));\n            }\n        }, [\n            n.div({ class: 'preview', style: { pointerEvents: 'none' }, ref: this.previewRef }),\n        ]).keepUpdated(this._store);\n        this.isHovered = this._editorContainer.didMouseMoveDuringHover;\n        this.previewEditor = this._register(this._instantiationService.createInstance(EmbeddedCodeEditorWidget, this.previewRef.element, {\n            glyphMargin: false,\n            lineNumbers: 'off',\n            minimap: { enabled: false },\n            guides: {\n                indentation: false,\n                bracketPairs: false,\n                bracketPairsHorizontal: false,\n                highlightActiveIndentation: false,\n            },\n            rulers: [],\n            padding: { top: 0, bottom: 0 },\n            folding: false,\n            selectOnLineNumbers: false,\n            selectionHighlight: false,\n            columnSelection: false,\n            overviewRulerBorder: false,\n            overviewRulerLanes: 0,\n            lineDecorationsWidth: 0,\n            lineNumbersMinChars: 0,\n            revealHorizontalRightPadding: 0,\n            bracketPairColorization: { enabled: true, independentColorPoolPerBracketType: false },\n            scrollBeyondLastLine: false,\n            scrollbar: {\n                vertical: 'hidden',\n                horizontal: 'hidden',\n                handleMouseWheel: false,\n            },\n            readOnly: true,\n            wordWrap: 'off',\n            wordWrapOverride1: 'off',\n            wordWrapOverride2: 'off',\n        }, {\n            contextKeyValues: {\n                [InlineCompletionContextKeys.inInlineEditsPreviewEditor.key]: true,\n            },\n            contributions: [],\n        }, this._editor));\n        this._previewEditorObs = observableCodeEditor(this.previewEditor);\n        this._activeViewZones = [];\n        this._updatePreviewEditor = derived(this, reader => {\n            this._editorContainer.readEffect(reader);\n            this._previewEditorObs.model.read(reader); // update when the model is set\n            // Setting this here explicitly to make sure that the preview editor is\n            // visible when needed, we're also checking that these fields are defined\n            // because of the auto run initial\n            // Before removing these, verify with a non-monospace font family\n            this._display.read(reader);\n            if (this._nonOverflowView) {\n                this._nonOverflowView.element.style.display = this._display.read(reader);\n            }\n            const uiState = this._uiState.read(reader);\n            const edit = this._edit.read(reader);\n            if (!uiState || !edit) {\n                return;\n            }\n            const range = edit.originalLineRange;\n            const hiddenAreas = [];\n            if (range.startLineNumber > 1) {\n                hiddenAreas.push(new Range(1, 1, range.startLineNumber - 1, 1));\n            }\n            if (range.startLineNumber + uiState.newTextLineCount < this._previewTextModel.getLineCount() + 1) {\n                hiddenAreas.push(new Range(range.startLineNumber + uiState.newTextLineCount, 1, this._previewTextModel.getLineCount() + 1, 1));\n            }\n            this.previewEditor.setHiddenAreas(hiddenAreas, undefined, true);\n            // TODO: is this the proper way to handle viewzones?\n            const previousViewZones = [...this._activeViewZones];\n            this._activeViewZones = [];\n            const reducedLinesCount = (range.endLineNumberExclusive - range.startLineNumber) - uiState.newTextLineCount;\n            this.previewEditor.changeViewZones((changeAccessor) => {\n                previousViewZones.forEach(id => changeAccessor.removeZone(id));\n                if (reducedLinesCount > 0) {\n                    this._activeViewZones.push(changeAccessor.addZone({\n                        afterLineNumber: range.startLineNumber + uiState.newTextLineCount - 1,\n                        heightInLines: reducedLinesCount,\n                        showInHiddenAreas: true,\n                        domNode: $('div.diagonal-fill.inline-edits-view-zone'),\n                    }));\n                }\n            });\n        });\n        this._previewEditorWidth = derived(this, reader => {\n            const edit = this._edit.read(reader);\n            if (!edit) {\n                return 0;\n            }\n            this._updatePreviewEditor.read(reader);\n            return maxContentWidthInRange(this._previewEditorObs, edit.modifiedLineRange, reader);\n        });\n        this._cursorPosIfTouchesEdit = derived(this, reader => {\n            const cursorPos = this._editorObs.cursorPosition.read(reader);\n            const edit = this._edit.read(reader);\n            if (!edit || !cursorPos) {\n                return undefined;\n            }\n            return edit.modifiedLineRange.contains(cursorPos.lineNumber) ? cursorPos : undefined;\n        });\n        this._originalStartPosition = derived(this, (reader) => {\n            const inlineEdit = this._edit.read(reader);\n            return inlineEdit ? new Position(inlineEdit.originalLineRange.startLineNumber, 1) : null;\n        });\n        this._originalEndPosition = derived(this, (reader) => {\n            const inlineEdit = this._edit.read(reader);\n            return inlineEdit ? new Position(inlineEdit.originalLineRange.endLineNumberExclusive, 1) : null;\n        });\n        this._originalVerticalStartPosition = this._editorObs.observePosition(this._originalStartPosition, this._store).map(p => p?.y);\n        this._originalVerticalEndPosition = this._editorObs.observePosition(this._originalEndPosition, this._store).map(p => p?.y);\n        this._originalDisplayRange = this._edit.map(e => e?.displayRange);\n        this._editorMaxContentWidthInRange = derived(this, reader => {\n            const originalDisplayRange = this._originalDisplayRange.read(reader);\n            if (!originalDisplayRange) {\n                return constObservable(0);\n            }\n            this._editorObs.versionId.read(reader);\n            // Take the max value that we observed.\n            // Reset when either the edit changes or the editor text version.\n            return derivedObservableWithCache(this, (reader, lastValue) => {\n                const maxWidth = maxContentWidthInRange(this._editorObs, originalDisplayRange, reader);\n                return Math.max(maxWidth, lastValue ?? 0);\n            });\n        }).map((v, r) => v.read(r));\n        this._previewEditorLayoutInfo = derived(this, (reader) => {\n            const inlineEdit = this._edit.read(reader);\n            if (!inlineEdit) {\n                return null;\n            }\n            const state = this._uiState.read(reader);\n            if (!state) {\n                return null;\n            }\n            const range = inlineEdit.originalLineRange;\n            const horizontalScrollOffset = this._editorObs.scrollLeft.read(reader);\n            const editorContentMaxWidthInRange = this._editorMaxContentWidthInRange.read(reader);\n            const editorLayout = this._editorObs.layoutInfo.read(reader);\n            const previewContentWidth = this._previewEditorWidth.read(reader);\n            const editorContentAreaWidth = editorLayout.contentWidth - editorLayout.verticalScrollbarWidth;\n            const editorBoundingClientRect = this._editor.getContainerDomNode().getBoundingClientRect();\n            const clientContentAreaRight = editorLayout.contentLeft + editorLayout.contentWidth + editorBoundingClientRect.left;\n            const remainingWidthRightOfContent = getWindow(this._editor.getContainerDomNode()).innerWidth - clientContentAreaRight;\n            const remainingWidthRightOfEditor = getWindow(this._editor.getContainerDomNode()).innerWidth - editorBoundingClientRect.right;\n            const desiredMinimumWidth = Math.min(editorLayout.contentWidth * 0.3, previewContentWidth, 100);\n            const IN_EDITOR_DISPLACEMENT = 0;\n            const maximumAvailableWidth = IN_EDITOR_DISPLACEMENT + remainingWidthRightOfContent;\n            const cursorPos = this._cursorPosIfTouchesEdit.read(reader);\n            const maxPreviewEditorLeft = Math.max(\n            // We're starting from the content area right and moving it left by IN_EDITOR_DISPLACEMENT and also by an amount to ensure some minimum desired width\n            editorContentAreaWidth + horizontalScrollOffset - IN_EDITOR_DISPLACEMENT - Math.max(0, desiredMinimumWidth - maximumAvailableWidth), \n            // But we don't want that the moving left ends up covering the cursor, so this will push it to the right again\n            Math.min(cursorPos ? getOffsetForPos(this._editorObs, cursorPos, reader) + 50 : 0, editorContentAreaWidth + horizontalScrollOffset));\n            const previewEditorLeftInTextArea = Math.min(editorContentMaxWidthInRange + ORIGINAL_END_PADDING, maxPreviewEditorLeft);\n            const maxContentWidth = editorContentMaxWidthInRange + ORIGINAL_END_PADDING + previewContentWidth + 70;\n            const dist = maxPreviewEditorLeft - previewEditorLeftInTextArea;\n            let desiredPreviewEditorScrollLeft;\n            let codeRight;\n            if (previewEditorLeftInTextArea > horizontalScrollOffset) {\n                desiredPreviewEditorScrollLeft = 0;\n                codeRight = editorLayout.contentLeft + previewEditorLeftInTextArea - horizontalScrollOffset;\n            }\n            else {\n                desiredPreviewEditorScrollLeft = horizontalScrollOffset - previewEditorLeftInTextArea;\n                codeRight = editorLayout.contentLeft;\n            }\n            const selectionTop = this._originalVerticalStartPosition.read(reader) ?? this._editor.getTopForLineNumber(range.startLineNumber) - this._editorObs.scrollTop.read(reader);\n            const selectionBottom = this._originalVerticalEndPosition.read(reader) ?? this._editor.getBottomForLineNumber(range.endLineNumberExclusive - 1) - this._editorObs.scrollTop.read(reader);\n            // TODO: const { prefixLeftOffset } = getPrefixTrim(inlineEdit.edit.edits.map(e => e.range), inlineEdit.originalLineRange, [], this._editor);\n            const codeLeft = editorLayout.contentLeft - horizontalScrollOffset;\n            let codeRect = Rect.fromLeftTopRightBottom(codeLeft, selectionTop, codeRight, selectionBottom);\n            const isInsertion = codeRect.height === 0;\n            if (!isInsertion) {\n                codeRect = codeRect.withMargin(VERTICAL_PADDING, HORIZONTAL_PADDING);\n            }\n            const previewLineHeights = this._previewEditorObs.observeLineHeightsForLineRange(inlineEdit.modifiedLineRange).read(reader);\n            const editHeight = previewLineHeights.reduce((acc, h) => acc + h, 0);\n            const codeHeight = selectionBottom - selectionTop;\n            const previewEditorHeight = Math.max(codeHeight, editHeight);\n            const clipped = dist === 0;\n            const codeEditDist = 0;\n            const previewEditorWidth = Math.min(previewContentWidth + MODIFIED_END_PADDING, remainingWidthRightOfEditor + editorLayout.width - editorLayout.contentLeft - codeEditDist);\n            let editRect = Rect.fromLeftTopWidthHeight(codeRect.right + codeEditDist, selectionTop, previewEditorWidth, previewEditorHeight);\n            if (!isInsertion) {\n                editRect = editRect.withMargin(VERTICAL_PADDING, HORIZONTAL_PADDING).translateX(HORIZONTAL_PADDING + BORDER_WIDTH);\n            }\n            else {\n                // Align top of edit with insertion line\n                editRect = editRect.withMargin(VERTICAL_PADDING, HORIZONTAL_PADDING).translateY(VERTICAL_PADDING);\n            }\n            // debugView(debugLogRects({ codeRect, editRect }, this._editor.getDomNode()!), reader);\n            return {\n                codeRect,\n                editRect,\n                codeScrollLeft: horizontalScrollOffset,\n                contentLeft: editorLayout.contentLeft,\n                isInsertion,\n                maxContentWidth,\n                shouldShowShadow: clipped,\n                desiredPreviewEditorScrollLeft,\n                previewEditorWidth,\n            };\n        });\n        this._stickyScrollController = StickyScrollController.get(this._editorObs.editor);\n        this._stickyScrollHeight = this._stickyScrollController ? observableFromEvent(this._stickyScrollController.onDidChangeStickyScrollHeight, () => this._stickyScrollController.stickyScrollWidgetHeight) : constObservable(0);\n        this._shouldOverflow = derived(this, reader => {\n            {\n                return false;\n            }\n        });\n        this._originalBackgroundColor = observableFromEvent(this, this._themeService.onDidColorThemeChange, () => {\n            return this._themeService.getColorTheme().getColor(originalBackgroundColor) ?? Color.transparent;\n        });\n        this._backgroundSvg = n.svg({\n            transform: 'translate(-0.5 -0.5)',\n            style: { overflow: 'visible', pointerEvents: 'none', position: 'absolute' },\n        }, [\n            n.svgElem('path', {\n                class: 'rightOfModifiedBackgroundCoverUp',\n                d: derived(this, reader => {\n                    const layoutInfo = this._previewEditorLayoutInfo.read(reader);\n                    if (!layoutInfo) {\n                        return undefined;\n                    }\n                    const originalBackgroundColor = this._originalBackgroundColor.read(reader);\n                    if (originalBackgroundColor.isTransparent()) {\n                        return undefined;\n                    }\n                    return new PathBuilder()\n                        .moveTo(layoutInfo.codeRect.getRightTop())\n                        .lineTo(layoutInfo.codeRect.getRightTop().deltaX(1000))\n                        .lineTo(layoutInfo.codeRect.getRightBottom().deltaX(1000))\n                        .lineTo(layoutInfo.codeRect.getRightBottom())\n                        .build();\n                }),\n                style: {\n                    fill: asCssVariableWithDefault(editorBackground, 'transparent'),\n                }\n            }),\n        ]).keepUpdated(this._store);\n        this._originalOverlay = n.div({\n            style: { pointerEvents: 'none', display: this._previewEditorLayoutInfo.map(layoutInfo => layoutInfo?.isInsertion ? 'none' : 'block') },\n        }, derived(this, reader => {\n            const layoutInfoObs = mapOutFalsy(this._previewEditorLayoutInfo).read(reader);\n            if (!layoutInfoObs) {\n                return undefined;\n            }\n            const separatorWidth = separatorWidthObs.read(reader);\n            const borderStyling = getOriginalBorderColor(this._tabAction).map(bc => `${BORDER_WIDTH}px solid ${asCssVariable(bc)}`);\n            const borderStylingSeparator = `${BORDER_WIDTH + separatorWidth}px solid ${asCssVariable(editorBackground)}`;\n            const hasBorderLeft = layoutInfoObs.read(reader).codeScrollLeft !== 0;\n            const isModifiedLower = layoutInfoObs.map(layoutInfo => layoutInfo.codeRect.bottom < layoutInfo.editRect.bottom);\n            const transitionRectSize = BORDER_RADIUS * 2 + BORDER_WIDTH * 2;\n            // Create an overlay which hides the left hand side of the original overlay when it overflows to the left\n            // such that there is a smooth transition at the edge of content left\n            const overlayHider = layoutInfoObs.map(layoutInfo => Rect.fromLeftTopRightBottom(layoutInfo.contentLeft - BORDER_RADIUS - BORDER_WIDTH, layoutInfo.codeRect.top, layoutInfo.contentLeft, layoutInfo.codeRect.bottom + transitionRectSize)).read(reader);\n            const intersectionLine = new OffsetRange(overlayHider.left, Number.MAX_SAFE_INTEGER);\n            const overlayRect = layoutInfoObs.map(layoutInfo => layoutInfo.codeRect.intersectHorizontal(intersectionLine));\n            const separatorRect = overlayRect.map(overlayRect => overlayRect.withMargin(separatorWidth, 0, separatorWidth, separatorWidth).intersectHorizontal(intersectionLine));\n            const transitionRect = overlayRect.map(overlayRect => Rect.fromLeftTopWidthHeight(overlayRect.right - transitionRectSize + BORDER_WIDTH, overlayRect.bottom - BORDER_WIDTH, transitionRectSize, transitionRectSize).intersectHorizontal(intersectionLine));\n            return [\n                n.div({\n                    class: 'originalSeparatorSideBySide',\n                    style: {\n                        ...separatorRect.read(reader).toStyles(),\n                        boxSizing: 'border-box',\n                        borderRadius: `${BORDER_RADIUS}px 0 0 ${BORDER_RADIUS}px`,\n                        borderTop: borderStylingSeparator,\n                        borderBottom: borderStylingSeparator,\n                        borderLeft: hasBorderLeft ? 'none' : borderStylingSeparator,\n                    }\n                }),\n                n.div({\n                    class: 'originalOverlaySideBySide',\n                    style: {\n                        ...overlayRect.read(reader).toStyles(),\n                        boxSizing: 'border-box',\n                        borderRadius: `${BORDER_RADIUS}px 0 0 ${BORDER_RADIUS}px`,\n                        borderTop: borderStyling,\n                        borderBottom: borderStyling,\n                        borderLeft: hasBorderLeft ? 'none' : borderStyling,\n                        backgroundColor: asCssVariable(originalBackgroundColor),\n                    }\n                }),\n                n.div({\n                    class: 'originalCornerCutoutSideBySide',\n                    style: {\n                        pointerEvents: 'none',\n                        display: isModifiedLower.map(isLower => isLower ? 'block' : 'none'),\n                        ...transitionRect.read(reader).toStyles(),\n                    }\n                }, [\n                    n.div({\n                        class: 'originalCornerCutoutBackground',\n                        style: {\n                            position: 'absolute', top: '0px', left: '0px', width: '100%', height: '100%',\n                            backgroundColor: getEditorBlendedColor(originalBackgroundColor, this._themeService).map(c => c.toString()),\n                        }\n                    }),\n                    n.div({\n                        class: 'originalCornerCutoutBorder',\n                        style: {\n                            position: 'absolute', top: '0px', left: '0px', width: '100%', height: '100%',\n                            boxSizing: 'border-box',\n                            borderTop: borderStyling,\n                            borderRight: borderStyling,\n                            borderRadius: `0 100% 0 0`,\n                            backgroundColor: asCssVariable(editorBackground)\n                        }\n                    })\n                ]),\n                n.div({\n                    class: 'originalOverlaySideBySideHider',\n                    style: {\n                        ...overlayHider.toStyles(),\n                        backgroundColor: asCssVariable(editorBackground),\n                    }\n                }),\n            ];\n        })).keepUpdated(this._store);\n        this._modifiedOverlay = n.div({\n            style: { pointerEvents: 'none', }\n        }, derived(this, reader => {\n            const layoutInfoObs = mapOutFalsy(this._previewEditorLayoutInfo).read(reader);\n            if (!layoutInfoObs) {\n                return undefined;\n            }\n            const isModifiedLower = layoutInfoObs.map(layoutInfo => layoutInfo.codeRect.bottom < layoutInfo.editRect.bottom);\n            const separatorWidth = separatorWidthObs.read(reader);\n            const borderRadius = isModifiedLower.map(isLower => `0 ${BORDER_RADIUS}px ${BORDER_RADIUS}px ${isLower ? BORDER_RADIUS : 0}px`);\n            const borderStyling = getEditorBlendedColor(getModifiedBorderColor(this._tabAction), this._themeService).map(c => `1px solid ${c.toString()}`);\n            const borderStylingSeparator = `${BORDER_WIDTH + separatorWidth}px solid ${asCssVariable(editorBackground)}`;\n            const overlayRect = layoutInfoObs.map(layoutInfo => layoutInfo.editRect.withMargin(0, BORDER_WIDTH));\n            const separatorRect = overlayRect.map(overlayRect => overlayRect.withMargin(separatorWidth, separatorWidth, separatorWidth, 0));\n            const insertionRect = derived(this, reader => {\n                const overlay = overlayRect.read(reader);\n                const layoutinfo = layoutInfoObs.read(reader);\n                if (!layoutinfo.isInsertion || layoutinfo.contentLeft >= overlay.left) {\n                    return Rect.fromLeftTopWidthHeight(overlay.left, overlay.top, 0, 0);\n                }\n                return new Rect(layoutinfo.contentLeft, overlay.top, overlay.left, overlay.top + BORDER_WIDTH * 2);\n            });\n            return [\n                n.div({\n                    class: 'modifiedInsertionSideBySide',\n                    style: {\n                        ...insertionRect.read(reader).toStyles(),\n                        backgroundColor: getModifiedBorderColor(this._tabAction).map(c => asCssVariable(c)),\n                    }\n                }),\n                n.div({\n                    class: 'modifiedSeparatorSideBySide',\n                    style: {\n                        ...separatorRect.read(reader).toStyles(),\n                        borderRadius,\n                        borderTop: borderStylingSeparator,\n                        borderBottom: borderStylingSeparator,\n                        borderRight: borderStylingSeparator,\n                        boxSizing: 'border-box',\n                    }\n                }),\n                n.div({\n                    class: 'modifiedOverlaySideBySide',\n                    style: {\n                        ...overlayRect.read(reader).toStyles(),\n                        borderRadius,\n                        border: borderStyling,\n                        boxSizing: 'border-box',\n                        backgroundColor: asCssVariable(modifiedBackgroundColor),\n                    }\n                })\n            ];\n        })).keepUpdated(this._store);\n        this._nonOverflowView = n.div({\n            class: 'inline-edits-view',\n            style: {\n                position: 'absolute',\n                overflow: 'visible',\n                top: '0px',\n                left: '0px',\n                display: this._display,\n            },\n        }, [\n            this._backgroundSvg,\n            derived(this, reader => this._shouldOverflow.read(reader) ? [] : [this._editorContainer, this._originalOverlay, this._modifiedOverlay]),\n        ]).keepUpdated(this._store);\n        this._register(this._editorObs.createOverlayWidget({\n            domNode: this._nonOverflowView.element,\n            position: constObservable(null),\n            allowEditorOverflow: false,\n            minContentWidthInPx: derived(this, reader => {\n                const x = this._previewEditorLayoutInfo.read(reader)?.maxContentWidth;\n                if (x === undefined) {\n                    return 0;\n                }\n                return x;\n            }),\n        }));\n        this.previewEditor.setModel(this._previewTextModel);\n        this._register(autorun(reader => {\n            const layoutInfo = this._previewEditorLayoutInfo.read(reader);\n            if (!layoutInfo) {\n                return;\n            }\n            const editorRect = layoutInfo.editRect.withMargin(-VERTICAL_PADDING, -HORIZONTAL_PADDING);\n            this.previewEditor.layout({ height: editorRect.height, width: layoutInfo.previewEditorWidth + 15 /* Make sure editor does not scroll horizontally */ });\n            this._editorContainer.element.style.top = `${editorRect.top}px`;\n            this._editorContainer.element.style.left = `${editorRect.left}px`;\n            this._editorContainer.element.style.width = `${layoutInfo.previewEditorWidth + HORIZONTAL_PADDING}px`; // Set width to clip view zone\n            //this._editorContainer.element.style.borderRadius = `0 ${BORDER_RADIUS}px ${BORDER_RADIUS}px 0`;\n        }));\n        this._register(autorun(reader => {\n            const layoutInfo = this._previewEditorLayoutInfo.read(reader);\n            if (!layoutInfo) {\n                return;\n            }\n            this._previewEditorObs.editor.setScrollLeft(layoutInfo.desiredPreviewEditorScrollLeft);\n        }));\n        this._updatePreviewEditor.recomputeInitiallyAndOnChange(this._store);\n    }\n};\nInlineEditsSideBySideView = __decorate([\n    __param(5, IInstantiationService),\n    __param(6, IThemeService)\n], InlineEditsSideBySideView);\n\nexport { InlineEditsSideBySideView };\n","import { n, getWindow } from '../../../../../../../base/browser/dom.js';\nimport { StandardMouseEvent } from '../../../../../../../base/browser/mouseEvent.js';\nimport { Emitter } from '../../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../../base/common/lifecycle.js';\nimport '../../../../../../../base/common/observableInternal/index.js';\nimport { asCssVariable } from '../../../../../../../platform/theme/common/colorUtils.js';\nimport '../../../../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorBackground, editorHoverForeground } from '../../../../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../../../../platform/theme/common/colors/searchColors.js';\nimport { renderLines, RenderOptions, LineSource } from '../../../../../../browser/widget/diffEditor/components/diffEditorViewZones/renderLines.js';\nimport { Point } from '../../../../../../common/core/2d/point.js';\nimport { Rect } from '../../../../../../common/core/2d/rect.js';\nimport { StringReplacement } from '../../../../../../common/core/edits/stringEdit.js';\nimport { OffsetRange } from '../../../../../../common/core/ranges/offsetRange.js';\nimport { ILanguageService } from '../../../../../../common/languages/language.js';\nimport { TokenArray, LineTokens } from '../../../../../../common/tokens/lineTokens.js';\nimport { getOriginalBorderColor, getModifiedBorderColor, modifiedChangedTextOverlayColor, originalChangedTextOverlayColor } from '../theme.js';\nimport { mapOutFalsy, rectToProps, getEditorValidOverlayRect } from '../utils/utils.js';\nimport { constObservable } from '../../../../../../../base/common/observableInternal/observables/constObservable.js';\nimport { observableValue } from '../../../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { derived } from '../../../../../../../base/common/observableInternal/observables/derived.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst BORDER_WIDTH = 1;\nlet InlineEditsWordReplacementView = class InlineEditsWordReplacementView extends Disposable {\n    static { this.MAX_LENGTH = 100; }\n    constructor(_editor, \n    /** Must be single-line in both sides */\n    _edit, _tabAction, _languageService) {\n        super();\n        this._editor = _editor;\n        this._edit = _edit;\n        this._tabAction = _tabAction;\n        this._languageService = _languageService;\n        this._onDidClick = this._register(new Emitter());\n        this.onDidClick = this._onDidClick.event;\n        this._start = this._editor.observePosition(constObservable(this._edit.range.getStartPosition()), this._store);\n        this._end = this._editor.observePosition(constObservable(this._edit.range.getEndPosition()), this._store);\n        this._line = document.createElement('div');\n        this._hoverableElement = observableValue(this, null);\n        this.isHovered = this._hoverableElement.map((e, reader) => e?.didMouseMoveDuringHover.read(reader) ?? false);\n        this._renderTextEffect = derived(this, _reader => {\n            const tm = this._editor.model.get();\n            const origLine = tm.getLineContent(this._edit.range.startLineNumber);\n            const edit = StringReplacement.replace(new OffsetRange(this._edit.range.startColumn - 1, this._edit.range.endColumn - 1), this._edit.text);\n            const lineToTokenize = edit.replace(origLine);\n            const t = tm.tokenization.tokenizeLinesAt(this._edit.range.startLineNumber, [lineToTokenize])?.[0];\n            let tokens;\n            if (t) {\n                tokens = TokenArray.fromLineTokens(t).slice(edit.getRangeAfterReplace()).toLineTokens(this._edit.text, this._languageService.languageIdCodec);\n            }\n            else {\n                tokens = LineTokens.createEmpty(this._edit.text, this._languageService.languageIdCodec);\n            }\n            const res = renderLines(new LineSource([tokens]), RenderOptions.fromEditor(this._editor.editor).withSetWidth(false).withScrollBeyondLastColumn(0), [], this._line, true);\n            this._line.style.width = `${res.minWidthInPx}px`;\n        });\n        const modifiedLineHeight = this._editor.observeLineHeightForPosition(this._edit.range.getStartPosition());\n        this._layout = derived(this, reader => {\n            this._renderTextEffect.read(reader);\n            const widgetStart = this._start.read(reader);\n            const widgetEnd = this._end.read(reader);\n            // TODO@hediet better about widgetStart and widgetEnd in a single transaction!\n            if (!widgetStart || !widgetEnd || widgetStart.x > widgetEnd.x || widgetStart.y > widgetEnd.y) {\n                return undefined;\n            }\n            const lineHeight = modifiedLineHeight.read(reader);\n            const scrollLeft = this._editor.scrollLeft.read(reader);\n            const w = this._editor.getOption(59 /* EditorOption.fontInfo */).read(reader).typicalHalfwidthCharacterWidth;\n            const modifiedLeftOffset = 3 * w;\n            const modifiedTopOffset = 4;\n            const modifiedOffset = new Point(modifiedLeftOffset, modifiedTopOffset);\n            const originalLine = Rect.fromPoints(widgetStart, widgetEnd).withHeight(lineHeight).translateX(-scrollLeft);\n            const modifiedLine = Rect.fromPointSize(originalLine.getLeftBottom().add(modifiedOffset), new Point(this._edit.text.length * w, originalLine.height));\n            const lowerBackground = modifiedLine.withLeft(originalLine.left);\n            // debugView(debugLogRects({ lowerBackground }, this._editor.editor.getContainerDomNode()), reader);\n            return {\n                originalLine,\n                modifiedLine,\n                lowerBackground,\n                lineHeight,\n            };\n        });\n        this.minEditorScrollHeight = derived(this, reader => {\n            const layout = mapOutFalsy(this._layout).read(reader);\n            if (!layout) {\n                return 0;\n            }\n            return layout.read(reader).modifiedLine.bottom + BORDER_WIDTH + this._editor.editor.getScrollTop();\n        });\n        this._root = n.div({\n            class: 'word-replacement',\n        }, [\n            derived(this, reader => {\n                const layout = mapOutFalsy(this._layout).read(reader);\n                if (!layout) {\n                    return [];\n                }\n                const originalBorderColor = getOriginalBorderColor(this._tabAction).map(c => asCssVariable(c)).read(reader);\n                const modifiedBorderColor = getModifiedBorderColor(this._tabAction).map(c => asCssVariable(c)).read(reader);\n                return [\n                    n.div({\n                        style: {\n                            position: 'absolute',\n                            ...rectToProps((r) => getEditorValidOverlayRect(this._editor).read(r)),\n                            overflow: 'hidden',\n                            pointerEvents: 'none',\n                        }\n                    }, [\n                        n.div({\n                            style: {\n                                position: 'absolute',\n                                ...rectToProps(reader => layout.read(reader).lowerBackground.withMargin(BORDER_WIDTH, 2 * BORDER_WIDTH, BORDER_WIDTH, 0)),\n                                background: asCssVariable(editorBackground),\n                                //boxShadow: `${asCssVariable(scrollbarShadow)} 0 6px 6px -6px`,\n                                cursor: 'pointer',\n                                pointerEvents: 'auto',\n                            },\n                            onmousedown: e => {\n                                e.preventDefault(); // This prevents that the editor loses focus\n                            },\n                            onmouseup: (e) => this._onDidClick.fire(new StandardMouseEvent(getWindow(e), e)),\n                            obsRef: (elem) => {\n                                this._hoverableElement.set(elem, undefined);\n                            }\n                        }),\n                        n.div({\n                            style: {\n                                position: 'absolute',\n                                ...rectToProps(reader => layout.read(reader).modifiedLine.withMargin(BORDER_WIDTH, 2 * BORDER_WIDTH)),\n                                fontFamily: this._editor.getOption(58 /* EditorOption.fontFamily */),\n                                fontSize: this._editor.getOption(61 /* EditorOption.fontSize */),\n                                fontWeight: this._editor.getOption(62 /* EditorOption.fontWeight */),\n                                pointerEvents: 'none',\n                                boxSizing: 'border-box',\n                                borderRadius: '4px',\n                                border: `${BORDER_WIDTH}px solid ${modifiedBorderColor}`,\n                                background: asCssVariable(modifiedChangedTextOverlayColor),\n                                display: 'flex',\n                                justifyContent: 'center',\n                                alignItems: 'center',\n                                outline: `2px solid ${asCssVariable(editorBackground)}`,\n                            }\n                        }, [this._line]),\n                        n.div({\n                            style: {\n                                position: 'absolute',\n                                ...rectToProps(reader => layout.read(reader).originalLine.withMargin(BORDER_WIDTH)),\n                                boxSizing: 'border-box',\n                                borderRadius: '4px',\n                                border: `${BORDER_WIDTH}px solid ${originalBorderColor}`,\n                                background: asCssVariable(originalChangedTextOverlayColor),\n                                pointerEvents: 'none',\n                            }\n                        }, []),\n                        n.svg({\n                            width: 11,\n                            height: 14,\n                            viewBox: '0 0 11 14',\n                            fill: 'none',\n                            style: {\n                                position: 'absolute',\n                                left: layout.map(l => l.modifiedLine.left - 16),\n                                top: layout.map(l => l.modifiedLine.top + Math.round((l.lineHeight - 14 - 5) / 2)),\n                            }\n                        }, [\n                            n.svgElem('path', {\n                                d: 'M1 0C1 2.98966 1 5.92087 1 8.49952C1 9.60409 1.89543 10.5 3 10.5H10.5',\n                                stroke: asCssVariable(editorHoverForeground),\n                            }),\n                            n.svgElem('path', {\n                                d: 'M6 7.5L9.99999 10.49998L6 13.5',\n                                stroke: asCssVariable(editorHoverForeground),\n                            })\n                        ]),\n                    ])\n                ];\n            })\n        ]).keepUpdated(this._store);\n        this._register(this._editor.createOverlayWidget({\n            domNode: this._root.element,\n            minContentWidthInPx: constObservable(0),\n            position: constObservable({ preference: { top: 0, left: 0 } }),\n            allowEditorOverflow: false,\n        }));\n    }\n};\nInlineEditsWordReplacementView = __decorate([\n    __param(3, ILanguageService)\n], InlineEditsWordReplacementView);\n\nexport { InlineEditsWordReplacementView };\n","import { Emitter } from '../../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../../base/common/lifecycle.js';\nimport '../../../../../../../base/common/observableInternal/index.js';\nimport { observableCodeEditor } from '../../../../../../browser/observableCodeEditor.js';\nimport { rangeIsSingleLine } from '../../../../../../browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.js';\nimport { OffsetRange } from '../../../../../../common/core/ranges/offsetRange.js';\nimport { Range } from '../../../../../../common/core/range.js';\nimport { InjectedTextCursorStops } from '../../../../../../common/model.js';\nimport { ModelDecorationOptions } from '../../../../../../common/model/textModel.js';\nimport { classNames } from '../utils/utils.js';\nimport { derived } from '../../../../../../../base/common/observableInternal/observables/derived.js';\nimport { autorunWithStore } from '../../../../../../../base/common/observableInternal/reactions/autorun.js';\nimport { observableFromEvent } from '../../../../../../../base/common/observableInternal/observables/observableFromEvent.js';\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 *--------------------------------------------------------------------------------------------*/\nclass OriginalEditorInlineDiffView extends Disposable {\n    constructor(_originalEditor, _state, _modifiedTextModel) {\n        super();\n        this._originalEditor = _originalEditor;\n        this._state = _state;\n        this._modifiedTextModel = _modifiedTextModel;\n        this._onDidClick = this._register(new Emitter());\n        this.onDidClick = this._onDidClick.event;\n        this.isHovered = observableCodeEditor(this._originalEditor).isTargetHovered(p => p.target.type === 6 /* MouseTargetType.CONTENT_TEXT */ &&\n            p.target.detail.injectedText?.options.attachedData instanceof InlineEditAttachedData &&\n            p.target.detail.injectedText.options.attachedData.owner === this, this._store);\n        this._tokenizationFinished = modelTokenizationFinished(this._modifiedTextModel);\n        this._decorations = derived(this, reader => {\n            const diff = this._state.read(reader);\n            if (!diff) {\n                return undefined;\n            }\n            const modified = diff.modifiedText;\n            const showInline = diff.mode === 'insertionInline';\n            const hasOneInnerChange = diff.diff.length === 1 && diff.diff[0].innerChanges?.length === 1;\n            const showEmptyDecorations = true;\n            const originalDecorations = [];\n            const modifiedDecorations = [];\n            const diffLineAddDecorationBackground = ModelDecorationOptions.register({\n                className: 'inlineCompletions-line-insert',\n                description: 'line-insert',\n                isWholeLine: true,\n                marginClassName: 'gutter-insert',\n            });\n            const diffLineDeleteDecorationBackground = ModelDecorationOptions.register({\n                className: 'inlineCompletions-line-delete',\n                description: 'line-delete',\n                isWholeLine: true,\n                marginClassName: 'gutter-delete',\n            });\n            const diffWholeLineDeleteDecoration = ModelDecorationOptions.register({\n                className: 'inlineCompletions-char-delete',\n                description: 'char-delete',\n                isWholeLine: false,\n                zIndex: 1, // be on top of diff background decoration\n            });\n            const diffWholeLineAddDecoration = ModelDecorationOptions.register({\n                className: 'inlineCompletions-char-insert',\n                description: 'char-insert',\n                isWholeLine: true,\n            });\n            const diffAddDecoration = ModelDecorationOptions.register({\n                className: 'inlineCompletions-char-insert',\n                description: 'char-insert',\n                shouldFillLineOnLineBreak: true,\n            });\n            const diffAddDecorationEmpty = ModelDecorationOptions.register({\n                className: 'inlineCompletions-char-insert diff-range-empty',\n                description: 'char-insert diff-range-empty',\n            });\n            const NESOriginalBackground = ModelDecorationOptions.register({\n                className: 'inlineCompletions-original-lines',\n                description: 'inlineCompletions-original-lines',\n                isWholeLine: false,\n                shouldFillLineOnLineBreak: true,\n            });\n            const showFullLineDecorations = diff.mode !== 'sideBySide' && diff.mode !== 'deletion' && diff.mode !== 'insertionInline' && diff.mode !== 'lineReplacement';\n            const hideEmptyInnerDecorations = diff.mode === 'lineReplacement';\n            for (const m of diff.diff) {\n                if (showFullLineDecorations) {\n                    if (!m.original.isEmpty) {\n                        originalDecorations.push({\n                            range: m.original.toInclusiveRange(),\n                            options: diffLineDeleteDecorationBackground,\n                        });\n                    }\n                    if (!m.modified.isEmpty) {\n                        modifiedDecorations.push({\n                            range: m.modified.toInclusiveRange(),\n                            options: diffLineAddDecorationBackground,\n                        });\n                    }\n                }\n                if (m.modified.isEmpty || m.original.isEmpty) {\n                    if (!m.original.isEmpty) {\n                        originalDecorations.push({ range: m.original.toInclusiveRange(), options: diffWholeLineDeleteDecoration });\n                    }\n                    if (!m.modified.isEmpty) {\n                        modifiedDecorations.push({ range: m.modified.toInclusiveRange(), options: diffWholeLineAddDecoration });\n                    }\n                }\n                else {\n                    const useInlineDiff = showInline && allowsTrueInlineDiffRendering(m);\n                    for (const i of m.innerChanges || []) {\n                        // Don't show empty markers outside the line range\n                        if (m.original.contains(i.originalRange.startLineNumber) && !(hideEmptyInnerDecorations && i.originalRange.isEmpty())) {\n                            const replacedText = this._originalEditor.getModel()?.getValueInRange(i.originalRange, 1 /* EndOfLinePreference.LF */);\n                            originalDecorations.push({\n                                range: i.originalRange,\n                                options: {\n                                    description: 'char-delete',\n                                    shouldFillLineOnLineBreak: false,\n                                    className: classNames('inlineCompletions-char-delete', i.originalRange.isSingleLine() && diff.mode === 'insertionInline' && 'single-line-inline', i.originalRange.isEmpty() && 'empty', ((i.originalRange.isEmpty() && hasOneInnerChange || diff.mode === 'deletion' && replacedText === '\\n') && showEmptyDecorations && !useInlineDiff) && 'diff-range-empty'),\n                                    inlineClassName: useInlineDiff ? classNames('strike-through', 'inlineCompletions') : null,\n                                    zIndex: 1\n                                }\n                            });\n                        }\n                        if (m.modified.contains(i.modifiedRange.startLineNumber)) {\n                            modifiedDecorations.push({\n                                range: i.modifiedRange,\n                                options: (i.modifiedRange.isEmpty() && showEmptyDecorations && !useInlineDiff && hasOneInnerChange)\n                                    ? diffAddDecorationEmpty\n                                    : diffAddDecoration\n                            });\n                        }\n                        if (useInlineDiff) {\n                            const insertedText = modified.getValueOfRange(i.modifiedRange);\n                            // when the injected text becomes long, the editor will split it into multiple spans\n                            // to be able to get the border around the start and end of the text, we need to split it into multiple segments\n                            const textSegments = insertedText.length > 3 ?\n                                [\n                                    { text: insertedText.slice(0, 1), extraClasses: ['start'], offsetRange: new OffsetRange(i.modifiedRange.startColumn - 1, i.modifiedRange.startColumn) },\n                                    { text: insertedText.slice(1, -1), extraClasses: [], offsetRange: new OffsetRange(i.modifiedRange.startColumn, i.modifiedRange.endColumn - 2) },\n                                    { text: insertedText.slice(-1), extraClasses: ['end'], offsetRange: new OffsetRange(i.modifiedRange.endColumn - 2, i.modifiedRange.endColumn - 1) }\n                                ] :\n                                [\n                                    { text: insertedText, extraClasses: ['start', 'end'], offsetRange: new OffsetRange(i.modifiedRange.startColumn - 1, i.modifiedRange.endColumn) }\n                                ];\n                            // Tokenization\n                            this._tokenizationFinished.read(reader); // reconsider when tokenization is finished\n                            const lineTokens = this._modifiedTextModel.tokenization.getLineTokens(i.modifiedRange.startLineNumber);\n                            for (const { text, extraClasses, offsetRange } of textSegments) {\n                                originalDecorations.push({\n                                    range: Range.fromPositions(i.originalRange.getEndPosition()),\n                                    options: {\n                                        description: 'inserted-text',\n                                        before: {\n                                            tokens: lineTokens.getTokensInRange(offsetRange),\n                                            content: text,\n                                            inlineClassName: classNames('inlineCompletions-char-insert', i.modifiedRange.isSingleLine() && diff.mode === 'insertionInline' && 'single-line-inline', ...extraClasses // include extraClasses for additional styling if provided\n                                            ),\n                                            cursorStops: InjectedTextCursorStops.None,\n                                            attachedData: new InlineEditAttachedData(this),\n                                        },\n                                        zIndex: 2,\n                                        showIfCollapsed: true,\n                                    }\n                                });\n                            }\n                        }\n                    }\n                }\n            }\n            if (diff.isInDiffEditor) {\n                for (const m of diff.diff) {\n                    if (!m.original.isEmpty) {\n                        originalDecorations.push({\n                            range: m.original.toExclusiveRange(),\n                            options: NESOriginalBackground,\n                        });\n                    }\n                }\n            }\n            return { originalDecorations, modifiedDecorations };\n        });\n        this._register(observableCodeEditor(this._originalEditor).setDecorations(this._decorations.map(d => d?.originalDecorations ?? [])));\n        const modifiedCodeEditor = this._state.map(s => s?.modifiedCodeEditor);\n        this._register(autorunWithStore((reader, store) => {\n            const e = modifiedCodeEditor.read(reader);\n            if (e) {\n                store.add(observableCodeEditor(e).setDecorations(this._decorations.map(d => d?.modifiedDecorations ?? [])));\n            }\n        }));\n        this._register(this._originalEditor.onMouseUp(e => {\n            if (e.target.type !== 6 /* MouseTargetType.CONTENT_TEXT */) {\n                return;\n            }\n            const a = e.target.detail.injectedText?.options.attachedData;\n            if (a instanceof InlineEditAttachedData && a.owner === this) {\n                this._onDidClick.fire(e.event);\n            }\n        }));\n    }\n}\nclass InlineEditAttachedData {\n    constructor(owner) {\n        this.owner = owner;\n    }\n}\nfunction allowsTrueInlineDiffRendering(mapping) {\n    if (!mapping.innerChanges) {\n        return false;\n    }\n    return mapping.innerChanges.every(c => (rangeIsSingleLine(c.modifiedRange) && rangeIsSingleLine(c.originalRange)));\n}\nlet i = 0;\nfunction modelTokenizationFinished(model) {\n    return observableFromEvent(model.onDidChangeTokens, () => i++);\n}\n\nexport { OriginalEditorInlineDiffView };\n","import { $ } from '../../../../../../base/browser/dom.js';\nimport { equalsIfDefined, itemEquals } from '../../../../../../base/common/equals.js';\nimport { onUnexpectedError, BugIndicatingError } from '../../../../../../base/common/errors.js';\nimport { Event } from '../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport '../../../../../../base/common/observableInternal/index.js';\nimport { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';\nimport { observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { TextReplacement } from '../../../../../common/core/edits/textEdit.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { StringText } from '../../../../../common/core/text/abstractText.js';\nimport { TextLength } from '../../../../../common/core/text/textLength.js';\nimport { RangeMapping, lineRangeMappingFromRangeMappings } from '../../../../../common/diff/rangeMapping.js';\nimport { TextModel } from '../../../../../common/model/textModel.js';\nimport { InlineEditItem } from '../../model/inlineSuggestionItem.js';\nimport { InlineEditsGutterIndicator } from './components/gutterIndicatorView.js';\nimport { InlineEditsOnboardingExperience } from './inlineEditsNewUsers.js';\nimport { InlineEditTabAction, InlineCompletionViewKind } from './inlineEditsViewInterface.js';\nimport { InlineEditsCollapsedView } from './inlineEditsViews/inlineEditsCollapsedView.js';\nimport { InlineEditsCustomView } from './inlineEditsViews/inlineEditsCustomView.js';\nimport { InlineEditsDeletionView } from './inlineEditsViews/inlineEditsDeletionView.js';\nimport { InlineEditsInsertionView } from './inlineEditsViews/inlineEditsInsertionView.js';\nimport { InlineEditsLineReplacementView } from './inlineEditsViews/inlineEditsLineReplacementView.js';\nimport { InlineEditsSideBySideView } from './inlineEditsViews/inlineEditsSideBySideView.js';\nimport { InlineEditsWordReplacementView } from './inlineEditsViews/inlineEditsWordReplacementView.js';\nimport { OriginalEditorInlineDiffView } from './inlineEditsViews/originalEditorInlineDiffView.js';\nimport { createReindentEdit, applyEditToModifiedRangeMappings } from './utils/utils.js';\nimport './view.css';\nimport { derived, derivedOpts } from '../../../../../../base/common/observableInternal/observables/derived.js';\nimport { observableValue } from '../../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { mapObservableArrayCached } from '../../../../../../base/common/observableInternal/utils/utils.js';\nimport { autorunWithStore, autorun } from '../../../../../../base/common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet InlineEditsView = class InlineEditsView extends Disposable {\n    constructor(_editor, _host, _model, _ghostTextIndicator, _focusIsInMenu, _instantiationService) {\n        super();\n        this._editor = _editor;\n        this._host = _host;\n        this._model = _model;\n        this._ghostTextIndicator = _ghostTextIndicator;\n        this._focusIsInMenu = _focusIsInMenu;\n        this._instantiationService = _instantiationService;\n        this._editorObs = observableCodeEditor(this._editor);\n        this._tabAction = derived(reader => this._model.read(reader)?.tabAction.read(reader) ?? InlineEditTabAction.Inactive);\n        this._constructorDone = observableValue(this, false);\n        this._uiState = derived(this, reader => {\n            const model = this._model.read(reader);\n            if (!model || !this._constructorDone.read(reader)) {\n                return undefined;\n            }\n            const inlineEdit = model.inlineEdit;\n            let mappings = RangeMapping.fromEdit(inlineEdit.edit);\n            let newText = inlineEdit.edit.apply(inlineEdit.originalText);\n            let diff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n            let state = this.determineRenderState(model, reader, diff, new StringText(newText));\n            if (!state) {\n                onUnexpectedError(new Error(`unable to determine view: tried to render ${this._previousView?.view}`));\n                return undefined;\n            }\n            if (state.kind === InlineCompletionViewKind.SideBySide) {\n                const indentationAdjustmentEdit = createReindentEdit(newText, inlineEdit.modifiedLineRange, textModel.getOptions().tabSize);\n                newText = indentationAdjustmentEdit.applyToString(newText);\n                mappings = applyEditToModifiedRangeMappings(mappings, indentationAdjustmentEdit);\n                diff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n            }\n            this._previewTextModel.setLanguage(this._editor.getModel().getLanguageId());\n            const previousNewText = this._previewTextModel.getValue();\n            if (previousNewText !== newText) {\n                // Only update the model if the text has changed to avoid flickering\n                this._previewTextModel.setValue(newText);\n            }\n            if (model.showCollapsed.read(reader) && !this._indicator.read(reader)?.isHoverVisible.read(reader)) {\n                state = { kind: InlineCompletionViewKind.Collapsed, viewData: state.viewData };\n            }\n            model.handleInlineEditShown(state.kind, state.viewData);\n            return {\n                state,\n                diff,\n                edit: inlineEdit,\n                newText,\n                newTextLineCount: inlineEdit.modifiedLineRange.length,\n                isInDiffEditor: model.isInDiffEditor,\n            };\n        });\n        this._previewTextModel = this._register(this._instantiationService.createInstance(TextModel, '', this._editor.getModel().getLanguageId(), { ...TextModel.DEFAULT_CREATION_OPTIONS, bracketPairColorizationOptions: { enabled: true, independentColorPoolPerBracketType: false } }, null));\n        this._indicatorCyclicDependencyCircuitBreaker = observableValue(this, false);\n        this._indicator = derived(this, (reader) => {\n            if (!this._indicatorCyclicDependencyCircuitBreaker.read(reader)) {\n                return undefined;\n            }\n            const indicatorDisplayRange = derivedOpts({ owner: this, equalsFn: equalsIfDefined(itemEquals()) }, reader => {\n                /** @description indicatorDisplayRange */\n                const ghostTextIndicator = this._ghostTextIndicator.read(reader);\n                if (ghostTextIndicator) {\n                    return ghostTextIndicator.lineRange;\n                }\n                const state = this._uiState.read(reader);\n                if (!state) {\n                    return undefined;\n                }\n                if (state.state?.kind === 'custom') {\n                    const range = state.state.displayLocation?.range;\n                    if (!range) {\n                        throw new BugIndicatingError('custom view should have a range');\n                    }\n                    return new LineRange(range.startLineNumber, range.endLineNumber);\n                }\n                if (state.state?.kind === 'insertionMultiLine') {\n                    return this._insertion.originalLines.read(reader);\n                }\n                return state.edit.displayRange;\n            });\n            const modelWithGhostTextSupport = derived(this, reader => {\n                /** @description modelWithGhostTextSupport */\n                const model = this._model.read(reader);\n                if (model) {\n                    return model;\n                }\n                const ghostTextIndicator = this._ghostTextIndicator.read(reader);\n                if (ghostTextIndicator) {\n                    return ghostTextIndicator.model;\n                }\n                return model;\n            });\n            return reader.store.add(this._instantiationService.createInstance(InlineEditsGutterIndicator, this._editorObs, indicatorDisplayRange, this._gutterIndicatorOffset, modelWithGhostTextSupport, this._inlineEditsIsHovered, this._focusIsInMenu));\n        });\n        this._inlineEditsIsHovered = derived(this, reader => {\n            return this._sideBySide.isHovered.read(reader)\n                || this._wordReplacementViews.read(reader).some(v => v.isHovered.read(reader))\n                || this._deletion.isHovered.read(reader)\n                || this._inlineDiffView.isHovered.read(reader)\n                || this._lineReplacementView.isHovered.read(reader)\n                || this._insertion.isHovered.read(reader)\n                || this._customView.isHovered.read(reader);\n        });\n        this._gutterIndicatorOffset = derived(this, reader => {\n            // TODO: have a better way to tell the gutter indicator view where the edit is inside a viewzone\n            if (this._uiState.read(reader)?.state?.kind === 'insertionMultiLine') {\n                return this._insertion.startLineOffset.read(reader);\n            }\n            const ghostTextIndicator = this._ghostTextIndicator.read(reader);\n            if (ghostTextIndicator) {\n                return getGhostTextTopOffset(ghostTextIndicator, this._editor);\n            }\n            return 0;\n        });\n        this._sideBySide = this._register(this._instantiationService.createInstance(InlineEditsSideBySideView, this._editor, this._model.map(m => m?.inlineEdit), this._previewTextModel, this._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.SideBySide ? ({\n            newTextLineCount: s.newTextLineCount,\n            isInDiffEditor: s.isInDiffEditor,\n        }) : undefined), this._tabAction));\n        this._deletion = this._register(this._instantiationService.createInstance(InlineEditsDeletionView, this._editor, this._model.map(m => m?.inlineEdit), this._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.Deletion ? ({\n            originalRange: s.state.originalRange,\n            deletions: s.state.deletions,\n            inDiffEditor: s.isInDiffEditor,\n        }) : undefined), this._tabAction));\n        this._insertion = this._register(this._instantiationService.createInstance(InlineEditsInsertionView, this._editor, this._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.InsertionMultiLine ? ({\n            lineNumber: s.state.lineNumber,\n            startColumn: s.state.column,\n            text: s.state.text,\n            inDiffEditor: s.isInDiffEditor,\n        }) : undefined), this._tabAction));\n        this._inlineDiffViewState = derived(this, reader => {\n            const e = this._uiState.read(reader);\n            if (!e || !e.state) {\n                return undefined;\n            }\n            if (e.state.kind === 'wordReplacements' || e.state.kind === 'insertionMultiLine' || e.state.kind === 'collapsed' || e.state.kind === 'custom') {\n                return undefined;\n            }\n            return {\n                modifiedText: new StringText(e.newText),\n                diff: e.diff,\n                mode: e.state.kind,\n                modifiedCodeEditor: this._sideBySide.previewEditor,\n                isInDiffEditor: e.isInDiffEditor,\n            };\n        });\n        this._inlineCollapsedView = this._register(this._instantiationService.createInstance(InlineEditsCollapsedView, this._editor, this._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'collapsed' ? m?.inlineEdit : undefined)));\n        this._customView = this._register(this._instantiationService.createInstance(InlineEditsCustomView, this._editor, this._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'custom' ? m?.displayLocation : undefined), this._tabAction));\n        this._inlineDiffView = this._register(new OriginalEditorInlineDiffView(this._editor, this._inlineDiffViewState, this._previewTextModel));\n        this._wordReplacementViews = mapObservableArrayCached(this, this._uiState.map(s => s?.state?.kind === 'wordReplacements' ? s.state.replacements : []), (e, store) => {\n            return store.add(this._instantiationService.createInstance(InlineEditsWordReplacementView, this._editorObs, e, this._tabAction));\n        });\n        this._lineReplacementView = this._register(this._instantiationService.createInstance(InlineEditsLineReplacementView, this._editorObs, this._uiState.map(s => s?.state?.kind === InlineCompletionViewKind.LineReplacement ? ({\n            originalRange: s.state.originalRange,\n            modifiedRange: s.state.modifiedRange,\n            modifiedLines: s.state.modifiedLines,\n            replacements: s.state.replacements,\n        }) : undefined), this._uiState.map(s => s?.isInDiffEditor ?? false), this._tabAction));\n        this._useCodeShifting = this._editorObs.getOption(71 /* EditorOption.inlineSuggest */).map(s => s.edits.allowCodeShifting);\n        this._renderSideBySide = this._editorObs.getOption(71 /* EditorOption.inlineSuggest */).map(s => s.edits.renderSideBySide);\n        this._register(autorunWithStore((reader, store) => {\n            const model = this._model.read(reader);\n            if (!model) {\n                return;\n            }\n            store.add(Event.any(this._sideBySide.onDidClick, this._deletion.onDidClick, this._lineReplacementView.onDidClick, this._insertion.onDidClick, ...this._wordReplacementViews.read(reader).map(w => w.onDidClick), this._inlineDiffView.onDidClick, this._customView.onDidClick)(e => {\n                if (this._viewHasBeenShownLongerThan(350)) {\n                    e.preventDefault();\n                    model.accept();\n                }\n            }));\n        }));\n        this._indicator.recomputeInitiallyAndOnChange(this._store);\n        this._wordReplacementViews.recomputeInitiallyAndOnChange(this._store);\n        this._indicatorCyclicDependencyCircuitBreaker.set(true, undefined);\n        this._register(this._instantiationService.createInstance(InlineEditsOnboardingExperience, this._host, this._model, this._indicator, this._inlineCollapsedView));\n        const minEditorScrollHeight = derived(this, reader => {\n            return Math.max(...this._wordReplacementViews.read(reader).map(v => v.minEditorScrollHeight.read(reader)), this._lineReplacementView.minEditorScrollHeight.read(reader), this._customView.minEditorScrollHeight.read(reader));\n        }).recomputeInitiallyAndOnChange(this._store);\n        const textModel = this._editor.getModel();\n        let viewZoneId;\n        this._register(autorun(reader => {\n            const minScrollHeight = minEditorScrollHeight.read(reader);\n            this._editor.changeViewZones(accessor => {\n                const scrollHeight = this._editor.getScrollHeight();\n                const viewZoneHeight = minScrollHeight - scrollHeight + 1 /* Add 1px so there is a small gap */;\n                if (viewZoneHeight !== 0 && viewZoneId) {\n                    accessor.removeZone(viewZoneId);\n                    viewZoneId = undefined;\n                }\n                if (viewZoneHeight <= 0) {\n                    return;\n                }\n                viewZoneId = accessor.addZone({\n                    afterLineNumber: textModel.getLineCount(),\n                    heightInPx: viewZoneHeight,\n                    domNode: $('div.minScrollHeightViewZone'),\n                });\n            });\n        }));\n        this._constructorDone.set(true, undefined); // TODO: remove and use correct initialization order\n    }\n    getCacheId(model) {\n        return model.inlineEdit.inlineCompletion.identity.id;\n    }\n    determineView(model, reader, diff, newText) {\n        // Check if we can use the previous view if it is the same InlineCompletion as previously shown\n        const inlineEdit = model.inlineEdit;\n        const canUseCache = this._previousView?.id === this.getCacheId(model) && !model.displayLocation?.jumpToEdit;\n        const reconsiderViewEditorWidthChange = this._previousView?.editorWidth !== this._editorObs.layoutInfoWidth.read(reader) &&\n            (this._previousView?.view === InlineCompletionViewKind.SideBySide ||\n                this._previousView?.view === InlineCompletionViewKind.LineReplacement);\n        if (canUseCache && !reconsiderViewEditorWidthChange) {\n            return this._previousView.view;\n        }\n        if (model.inlineEdit.inlineCompletion instanceof InlineEditItem && model.inlineEdit.inlineCompletion.uri) {\n            return InlineCompletionViewKind.Custom;\n        }\n        if (model.displayLocation && !model.inlineEdit.inlineCompletion.identity.jumpedTo.read(reader)) {\n            return InlineCompletionViewKind.Custom;\n        }\n        // Determine the view based on the edit / diff\n        const numOriginalLines = inlineEdit.originalLineRange.length;\n        const numModifiedLines = inlineEdit.modifiedLineRange.length;\n        const inner = diff.flatMap(d => d.innerChanges ?? []);\n        const isSingleInnerEdit = inner.length === 1;\n        if (!model.isInDiffEditor) {\n            if (isSingleInnerEdit\n                && this._useCodeShifting.read(reader) !== 'never'\n                && isSingleLineInsertion(diff)) {\n                if (isSingleLineInsertionAfterPosition(diff, inlineEdit.cursorPosition)) {\n                    return InlineCompletionViewKind.InsertionInline;\n                }\n                // If we have a single line insertion before the cursor position, we do not want to move the cursor by inserting\n                // the suggestion inline. Use a line replacement view instead. Do not use word replacement view.\n                return InlineCompletionViewKind.LineReplacement;\n            }\n            if (isDeletion(inner, inlineEdit, newText)) {\n                return InlineCompletionViewKind.Deletion;\n            }\n            if (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n                return InlineCompletionViewKind.InsertionMultiLine;\n            }\n            const allInnerChangesNotTooLong = inner.every(m => TextLength.ofRange(m.originalRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH && TextLength.ofRange(m.modifiedRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH);\n            if (allInnerChangesNotTooLong && isSingleInnerEdit && numOriginalLines === 1 && numModifiedLines === 1) {\n                // Do not show indentation changes with word replacement view\n                const modifiedText = inner.map(m => newText.getValueOfRange(m.modifiedRange));\n                const originalText = inner.map(m => model.inlineEdit.originalText.getValueOfRange(m.originalRange));\n                if (!modifiedText.some(v => v.includes('\\t')) && !originalText.some(v => v.includes('\\t'))) {\n                    // Make sure there is no insertion, even if we grow them\n                    if (!inner.some(m => m.originalRange.isEmpty()) ||\n                        !growEditsUntilWhitespace(inner.map(m => new TextReplacement(m.originalRange, '')), inlineEdit.originalText).some(e => e.range.isEmpty() && TextLength.ofRange(e.range).columnCount < InlineEditsWordReplacementView.MAX_LENGTH)) {\n                        return InlineCompletionViewKind.WordReplacements;\n                    }\n                }\n            }\n        }\n        if (numOriginalLines > 0 && numModifiedLines > 0) {\n            if (numOriginalLines === 1 && numModifiedLines === 1 && !model.isInDiffEditor /* prefer side by side in diff editor */) {\n                return InlineCompletionViewKind.LineReplacement;\n            }\n            if (this._renderSideBySide.read(reader) !== 'never' && InlineEditsSideBySideView.fitsInsideViewport(this._editor, this._previewTextModel, inlineEdit, reader)) {\n                return InlineCompletionViewKind.SideBySide;\n            }\n            return InlineCompletionViewKind.LineReplacement;\n        }\n        if (model.isInDiffEditor) {\n            if (isDeletion(inner, inlineEdit, newText)) {\n                return InlineCompletionViewKind.Deletion;\n            }\n            if (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n                return InlineCompletionViewKind.InsertionMultiLine;\n            }\n        }\n        return InlineCompletionViewKind.SideBySide;\n    }\n    determineRenderState(model, reader, diff, newText) {\n        const inlineEdit = model.inlineEdit;\n        let view = this.determineView(model, reader, diff, newText);\n        if (this._willRenderAboveCursor(reader, inlineEdit, view)) {\n            switch (view) {\n                case InlineCompletionViewKind.LineReplacement:\n                case InlineCompletionViewKind.WordReplacements:\n                    view = InlineCompletionViewKind.SideBySide;\n                    break;\n            }\n        }\n        this._previousView = { id: this.getCacheId(model), view, editorWidth: this._editor.getLayoutInfo().width, timestamp: Date.now() };\n        const inner = diff.flatMap(d => d.innerChanges ?? []);\n        const textModel = this._editor.getModel();\n        const stringChanges = inner.map(m => ({\n            originalRange: m.originalRange,\n            modifiedRange: m.modifiedRange,\n            original: textModel.getValueInRange(m.originalRange),\n            modified: newText.getValueOfRange(m.modifiedRange)\n        }));\n        const cursorPosition = inlineEdit.cursorPosition;\n        const startsWithEOL = stringChanges.length === 0 ? false : stringChanges[0].modified.startsWith(textModel.getEOL());\n        const viewData = {\n            cursorColumnDistance: inlineEdit.edit.replacements.length === 0 ? 0 : inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,\n            cursorLineDistance: inlineEdit.lineEdit.lineRange.startLineNumber - cursorPosition.lineNumber + (startsWithEOL && inlineEdit.lineEdit.lineRange.startLineNumber >= cursorPosition.lineNumber ? 1 : 0),\n            lineCountOriginal: inlineEdit.lineEdit.lineRange.length,\n            lineCountModified: inlineEdit.lineEdit.newLines.length,\n            characterCountOriginal: stringChanges.reduce((acc, r) => acc + r.original.length, 0),\n            characterCountModified: stringChanges.reduce((acc, r) => acc + r.modified.length, 0),\n            disjointReplacements: stringChanges.length,\n            sameShapeReplacements: stringChanges.every(r => r.original === stringChanges[0].original && r.modified === stringChanges[0].modified),\n        };\n        switch (view) {\n            case InlineCompletionViewKind.InsertionInline: return { kind: InlineCompletionViewKind.InsertionInline, viewData };\n            case InlineCompletionViewKind.SideBySide: return { kind: InlineCompletionViewKind.SideBySide, viewData };\n            case InlineCompletionViewKind.Collapsed: return { kind: InlineCompletionViewKind.Collapsed, viewData };\n            case InlineCompletionViewKind.Custom: return { kind: InlineCompletionViewKind.Custom, displayLocation: model.displayLocation, viewData };\n        }\n        if (view === InlineCompletionViewKind.Deletion) {\n            return {\n                kind: InlineCompletionViewKind.Deletion,\n                originalRange: inlineEdit.originalLineRange,\n                deletions: inner.map(m => m.originalRange),\n                viewData,\n            };\n        }\n        if (view === InlineCompletionViewKind.InsertionMultiLine) {\n            const change = inner[0];\n            return {\n                kind: InlineCompletionViewKind.InsertionMultiLine,\n                lineNumber: change.originalRange.startLineNumber,\n                column: change.originalRange.startColumn,\n                text: newText.getValueOfRange(change.modifiedRange),\n                viewData,\n            };\n        }\n        const replacements = stringChanges.map(m => new TextReplacement(m.originalRange, m.modified));\n        if (replacements.length === 0) {\n            return undefined;\n        }\n        if (view === InlineCompletionViewKind.WordReplacements) {\n            let grownEdits = growEditsToEntireWord(replacements, inlineEdit.originalText);\n            if (grownEdits.some(e => e.range.isEmpty())) {\n                grownEdits = growEditsUntilWhitespace(replacements, inlineEdit.originalText);\n            }\n            return {\n                kind: InlineCompletionViewKind.WordReplacements,\n                replacements: grownEdits,\n                viewData,\n            };\n        }\n        if (view === InlineCompletionViewKind.LineReplacement) {\n            return {\n                kind: InlineCompletionViewKind.LineReplacement,\n                originalRange: inlineEdit.originalLineRange,\n                modifiedRange: inlineEdit.modifiedLineRange,\n                modifiedLines: inlineEdit.modifiedLineRange.mapToLineArray(line => newText.getLineAt(line)),\n                replacements: inner.map(m => ({ originalRange: m.originalRange, modifiedRange: m.modifiedRange })),\n                viewData,\n            };\n        }\n        return undefined;\n    }\n    _willRenderAboveCursor(reader, inlineEdit, view) {\n        const useCodeShifting = this._useCodeShifting.read(reader);\n        if (useCodeShifting === 'always') {\n            return false;\n        }\n        for (const cursorPosition of inlineEdit.multiCursorPositions) {\n            if (view === InlineCompletionViewKind.WordReplacements &&\n                cursorPosition.lineNumber === inlineEdit.originalLineRange.startLineNumber + 1) {\n                return true;\n            }\n            if (view === InlineCompletionViewKind.LineReplacement &&\n                cursorPosition.lineNumber >= inlineEdit.originalLineRange.endLineNumberExclusive &&\n                cursorPosition.lineNumber < inlineEdit.modifiedLineRange.endLineNumberExclusive + inlineEdit.modifiedLineRange.length) {\n                return true;\n            }\n        }\n        return false;\n    }\n    _viewHasBeenShownLongerThan(durationMs) {\n        const viewCreationTime = this._previousView?.timestamp;\n        if (!viewCreationTime) {\n            throw new BugIndicatingError('viewHasBeenShownLongThan called before a view has been shown');\n        }\n        const currentTime = Date.now();\n        return (currentTime - viewCreationTime) >= durationMs;\n    }\n};\nInlineEditsView = __decorate([\n    __param(5, IInstantiationService)\n], InlineEditsView);\nfunction isSingleLineInsertion(diff) {\n    return diff.every(m => m.innerChanges.every(r => isWordInsertion(r)));\n    function isWordInsertion(r) {\n        if (!r.originalRange.isEmpty()) {\n            return false;\n        }\n        const isInsertionWithinLine = r.modifiedRange.startLineNumber === r.modifiedRange.endLineNumber;\n        if (!isInsertionWithinLine) {\n            return false;\n        }\n        return true;\n    }\n}\nfunction isSingleLineInsertionAfterPosition(diff, position) {\n    if (!position) {\n        return false;\n    }\n    if (!isSingleLineInsertion(diff)) {\n        return false;\n    }\n    const pos = position;\n    return diff.every(m => m.innerChanges.every(r => isStableWordInsertion(r)));\n    function isStableWordInsertion(r) {\n        const insertPosition = r.originalRange.getStartPosition();\n        if (pos.isBeforeOrEqual(insertPosition)) {\n            return true;\n        }\n        if (insertPosition.lineNumber < pos.lineNumber) {\n            return true;\n        }\n        return false;\n    }\n}\nfunction isSingleMultiLineInsertion(diff) {\n    const inner = diff.flatMap(d => d.innerChanges ?? []);\n    if (inner.length !== 1) {\n        return false;\n    }\n    const change = inner[0];\n    if (!change.originalRange.isEmpty()) {\n        return false;\n    }\n    if (change.modifiedRange.startLineNumber === change.modifiedRange.endLineNumber) {\n        return false;\n    }\n    return true;\n}\nfunction isDeletion(inner, inlineEdit, newText) {\n    const innerValues = inner.map(m => ({ original: inlineEdit.originalText.getValueOfRange(m.originalRange), modified: newText.getValueOfRange(m.modifiedRange) }));\n    return innerValues.every(({ original, modified }) => modified.trim() === '' && original.length > 0 && (original.length > modified.length || original.trim() !== ''));\n}\nfunction growEditsToEntireWord(replacements, originalText) {\n    return _growEdits(replacements, originalText, (char) => /^[a-zA-Z]$/.test(char));\n}\nfunction growEditsUntilWhitespace(replacements, originalText) {\n    return _growEdits(replacements, originalText, (char) => !(/^\\s$/.test(char)));\n}\nfunction _growEdits(replacements, originalText, fn) {\n    const result = [];\n    replacements.sort((a, b) => Range.compareRangesUsingStarts(a.range, b.range));\n    for (const edit of replacements) {\n        let startIndex = edit.range.startColumn - 1;\n        let endIndex = edit.range.endColumn - 2;\n        let prefix = '';\n        let suffix = '';\n        const startLineContent = originalText.getLineAt(edit.range.startLineNumber);\n        const endLineContent = originalText.getLineAt(edit.range.endLineNumber);\n        if (isIncluded(startLineContent[startIndex])) {\n            // grow to the left\n            while (isIncluded(startLineContent[startIndex - 1])) {\n                prefix = startLineContent[startIndex - 1] + prefix;\n                startIndex--;\n            }\n        }\n        if (isIncluded(endLineContent[endIndex]) || endIndex < startIndex) {\n            // grow to the right\n            while (isIncluded(endLineContent[endIndex + 1])) {\n                suffix += endLineContent[endIndex + 1];\n                endIndex++;\n            }\n        }\n        // create new edit and merge together if they are touching\n        let newEdit = new TextReplacement(new Range(edit.range.startLineNumber, startIndex + 1, edit.range.endLineNumber, endIndex + 2), prefix + edit.text + suffix);\n        if (result.length > 0 && Range.areIntersectingOrTouching(result[result.length - 1].range, newEdit.range)) {\n            newEdit = TextReplacement.joinReplacements([result.pop(), newEdit], originalText);\n        }\n        result.push(newEdit);\n    }\n    function isIncluded(c) {\n        if (c === undefined) {\n            return false;\n        }\n        return fn(c);\n    }\n    return result;\n}\nfunction getGhostTextTopOffset(ghostTextIndicator, editor) {\n    const replacements = ghostTextIndicator.model.inlineEdit.edit.replacements;\n    if (replacements.length !== 1) {\n        return 0;\n    }\n    const textModel = editor.getModel();\n    if (!textModel) {\n        return 0;\n    }\n    const EOL = textModel.getEOL();\n    const replacement = replacements[0];\n    if (replacement.range.isEmpty() && replacement.text.startsWith(EOL)) {\n        const lineHeight = editor.getLineHeightForPosition(replacement.range.getStartPosition());\n        return countPrefixRepeats(replacement.text, EOL) * lineHeight;\n    }\n    return 0;\n}\nfunction countPrefixRepeats(str, prefix) {\n    if (!prefix.length) {\n        return 0;\n    }\n    let count = 0;\n    let i = 0;\n    while (str.startsWith(prefix, i)) {\n        count++;\n        i += prefix.length;\n    }\n    return count;\n}\n\nexport { InlineEditsView };\n","import { createHotClass } from '../../../../../../base/common/hotReloadHelpers.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport '../../../../../../base/common/observableInternal/index.js';\nimport { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';\nimport { observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { TextReplacement, TextEdit } from '../../../../../common/core/edits/textEdit.js';\nimport { TextModelText } from '../../../../../common/model/textModelText.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { InlineEditModel, InlineEditHost, GhostTextIndicator } from './inlineEditsModel.js';\nimport { InlineEditsView } from './inlineEditsView.js';\nimport { InlineEditTabAction } from './inlineEditsViewInterface.js';\nimport { derived } from '../../../../../../base/common/observableInternal/observables/derived.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet InlineEditsViewAndDiffProducer = class InlineEditsViewAndDiffProducer extends Disposable {\n    static { this.hot = createHotClass(this); }\n    constructor(_editor, _edit, _model, _focusIsInMenu, instantiationService) {\n        super();\n        this._editor = _editor;\n        this._edit = _edit;\n        this._model = _model;\n        this._focusIsInMenu = _focusIsInMenu;\n        this._inlineEdit = derived(this, (reader) => {\n            const model = this._model.read(reader);\n            if (!model) {\n                return undefined;\n            }\n            const inlineEdit = this._edit.read(reader);\n            if (!inlineEdit) {\n                return undefined;\n            }\n            const textModel = this._editor.getModel();\n            if (!textModel) {\n                return undefined;\n            }\n            const editOffset = model.inlineEditState.read(undefined)?.inlineCompletion.updatedEdit;\n            if (!editOffset) {\n                return undefined;\n            }\n            const edits = editOffset.replacements.map(e => {\n                const innerEditRange = Range.fromPositions(textModel.getPositionAt(e.replaceRange.start), textModel.getPositionAt(e.replaceRange.endExclusive));\n                return new TextReplacement(innerEditRange, e.newText);\n            });\n            const diffEdits = new TextEdit(edits);\n            const text = new TextModelText(textModel);\n            return new InlineEditWithChanges(text, diffEdits, model.primaryPosition.read(undefined), model.allPositions.read(undefined), inlineEdit.commands, inlineEdit.inlineCompletion);\n        });\n        this._inlineEditModel = derived(this, reader => {\n            const model = this._model.read(reader);\n            if (!model) {\n                return undefined;\n            }\n            const edit = this._inlineEdit.read(reader);\n            if (!edit) {\n                return undefined;\n            }\n            const tabAction = derived(this, reader => {\n                /** @description tabAction */\n                if (this._editorObs.isFocused.read(reader)) {\n                    if (model.tabShouldJumpToInlineEdit.read(reader)) {\n                        return InlineEditTabAction.Jump;\n                    }\n                    if (model.tabShouldAcceptInlineEdit.read(reader)) {\n                        return InlineEditTabAction.Accept;\n                    }\n                }\n                return InlineEditTabAction.Inactive;\n            });\n            return new InlineEditModel(model, edit, tabAction);\n        });\n        this._inlineEditHost = derived(this, reader => {\n            const model = this._model.read(reader);\n            if (!model) {\n                return undefined;\n            }\n            return new InlineEditHost(model);\n        });\n        this._ghostTextIndicator = derived(this, reader => {\n            const model = this._model.read(reader);\n            if (!model) {\n                return undefined;\n            }\n            const state = model.inlineCompletionState.read(reader);\n            if (!state) {\n                return undefined;\n            }\n            const inlineCompletion = state.inlineCompletion;\n            if (!inlineCompletion) {\n                return undefined;\n            }\n            if (!inlineCompletion.showInlineEditMenu) {\n                return undefined;\n            }\n            const lineRange = LineRange.ofLength(state.primaryGhostText.lineNumber, 1);\n            return new GhostTextIndicator(this._editor, model, lineRange, inlineCompletion);\n        });\n        this._editorObs = observableCodeEditor(this._editor);\n        this._register(instantiationService.createInstance(InlineEditsView, this._editor, this._inlineEditHost, this._inlineEditModel, this._ghostTextIndicator, this._focusIsInMenu));\n    }\n};\nInlineEditsViewAndDiffProducer = __decorate([\n    __param(4, IInstantiationService)\n], InlineEditsViewAndDiffProducer);\n\nexport { InlineEditsViewAndDiffProducer };\n","import { createStyleSheetFromObservable } from '../../../../../base/browser/domStylesheets.js';\nimport { Disposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { observableCodeEditor } from '../../../../browser/observableCodeEditor.js';\nimport { InlineCompletionsHintsWidget } from '../hintsWidget/inlineCompletionsHintsWidget.js';\nimport { convertItemsToStableObservables } from '../utils.js';\nimport { GhostTextView } from './ghostText/ghostTextView.js';\nimport { InlineCompletionViewKind } from './inlineEdits/inlineEditsViewInterface.js';\nimport { InlineEditsViewAndDiffProducer } from './inlineEdits/inlineEditsViewProducer.js';\nimport { derived, derivedDisposable } from '../../../../../base/common/observableInternal/observables/derived.js';\nimport { mapObservableArrayCached, derivedObservableWithCache } from '../../../../../base/common/observableInternal/utils/utils.js';\nimport { constObservable } from '../../../../../base/common/observableInternal/observables/constObservable.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet InlineCompletionsView = class InlineCompletionsView extends Disposable {\n    constructor(_editor, _model, _focusIsInMenu, _instantiationService) {\n        super();\n        this._editor = _editor;\n        this._model = _model;\n        this._focusIsInMenu = _focusIsInMenu;\n        this._instantiationService = _instantiationService;\n        this._ghostTexts = derived(this, (reader) => {\n            const model = this._model.read(reader);\n            return model?.ghostTexts.read(reader) ?? [];\n        });\n        this._stablizedGhostTexts = convertItemsToStableObservables(this._ghostTexts, this._store);\n        this._editorObs = observableCodeEditor(this._editor);\n        this._ghostTextWidgets = mapObservableArrayCached(this, this._stablizedGhostTexts, (ghostText, store) => derivedDisposable((reader) => this._instantiationService.createInstance(GhostTextView.hot.read(reader), this._editor, {\n            ghostText: ghostText,\n            warning: this._model.map((m, reader) => {\n                const warning = m?.warning?.read(reader);\n                return warning ? { icon: warning.icon } : undefined;\n            }),\n            minReservedLineCount: constObservable(0),\n            targetTextModel: this._model.map(v => v?.textModel),\n            handleInlineCompletionShown: this._model.map((model, reader) => {\n                const inlineCompletion = model?.inlineCompletionState.read(reader)?.inlineCompletion;\n                if (inlineCompletion) {\n                    return (viewData) => model.handleInlineSuggestionShown(inlineCompletion, InlineCompletionViewKind.GhostText, viewData);\n                }\n                return () => { };\n            }),\n        }, this._editorObs.getOption(71 /* EditorOption.inlineSuggest */).map(v => ({ syntaxHighlightingEnabled: v.syntaxHighlightingEnabled })), false, false)).recomputeInitiallyAndOnChange(store)).recomputeInitiallyAndOnChange(this._store);\n        this._inlineEdit = derived(this, reader => this._model.read(reader)?.inlineEditState.read(reader)?.inlineEdit);\n        this._everHadInlineEdit = derivedObservableWithCache(this, (reader, last) => last || !!this._inlineEdit.read(reader) || !!this._model.read(reader)?.inlineCompletionState.read(reader)?.inlineCompletion?.showInlineEditMenu);\n        this._inlineEditWidget = derivedDisposable(reader => {\n            if (!this._everHadInlineEdit.read(reader)) {\n                return undefined;\n            }\n            return this._instantiationService.createInstance(InlineEditsViewAndDiffProducer.hot.read(reader), this._editor, this._inlineEdit, this._model, this._focusIsInMenu);\n        })\n            .recomputeInitiallyAndOnChange(this._store);\n        this._fontFamily = this._editorObs.getOption(71 /* EditorOption.inlineSuggest */).map(val => val.fontFamily);\n        this._register(createStyleSheetFromObservable(derived(reader => {\n            const fontFamily = this._fontFamily.read(reader);\n            return `\n.monaco-editor .ghost-text-decoration,\n.monaco-editor .ghost-text-decoration-preview,\n.monaco-editor .ghost-text {\n\tfont-family: ${fontFamily};\n}`;\n        })));\n        this._register(new InlineCompletionsHintsWidget(this._editor, this._model, this._instantiationService));\n    }\n    shouldShowHoverAtViewZone(viewZoneId) {\n        return this._ghostTextWidgets.get()[0]?.get().ownsViewZone(viewZoneId) ?? false;\n    }\n};\nInlineCompletionsView = __decorate([\n    __param(3, IInstantiationService)\n], InlineCompletionsView);\n\nexport { InlineCompletionsView };\n","import { alert } from '../../../../../base/browser/ui/aria/aria.js';\nimport { timeout } from '../../../../../base/common/async.js';\nimport { cancelOnDispose } from '../../../../../base/common/cancellation.js';\nimport { createHotClass } from '../../../../../base/common/hotReloadHelpers.js';\nimport { Disposable, toDisposable } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { isEqual } from '../../../../../base/common/resources.js';\nimport { isUndefined } from '../../../../../base/common/types.js';\nimport { localize } from '../../../../../nls.js';\nimport { IAccessibilityService } from '../../../../../platform/accessibility/common/accessibility.js';\nimport { IAccessibilitySignalService, AccessibilitySignal } from '../../../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';\nimport { ICommandService } from '../../../../../platform/commands/common/commands.js';\nimport { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';\nimport { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';\nimport { hotClassGetOriginalInstance } from '../../../../../platform/observable/common/wrapInHotClass.js';\nimport { CoreEditingCommands } from '../../../../browser/coreCommands.js';\nimport { observableCodeEditor } from '../../../../browser/observableCodeEditor.js';\nimport { TriggerInlineEditCommandsRegistry } from '../../../../browser/triggerInlineEditCommandsRegistry.js';\nimport { getOuterEditor } from '../../../../browser/widget/codeEditor/embeddedCodeEditorWidget.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { ILanguageFeatureDebounceService } from '../../../../common/services/languageFeatureDebounce.js';\nimport { ILanguageFeaturesService } from '../../../../common/services/languageFeatures.js';\nimport { FIND_IDS } from '../../../find/browser/findModel.js';\nimport { InsertLineAfterAction, InsertLineBeforeAction } from '../../../linesOperations/browser/linesOperations.js';\nimport { InlineSuggestionHintsContentWidget } from '../hintsWidget/inlineCompletionsHintsWidget.js';\nimport { TextModelChangeRecorder } from '../model/changeRecorder.js';\nimport { InlineCompletionsModel } from '../model/inlineCompletionsModel.js';\nimport { ObservableSuggestWidgetAdapter } from '../model/suggestWidgetAdapter.js';\nimport { ObservableContextKeyService } from '../utils.js';\nimport { InlineCompletionsView } from '../view/inlineCompletionsView.js';\nimport { inlineSuggestCommitId } from './commandIds.js';\nimport { InlineCompletionContextKeys } from './inlineCompletionContextKeys.js';\nimport { runOnChange, runOnChangeWithStore } from '../../../../../base/common/observableInternal/utils/runOnChange.js';\nimport { derived, derivedDisposable } from '../../../../../base/common/observableInternal/observables/derived.js';\nimport { observableFromEvent } from '../../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { observableValue } from '../../../../../base/common/observableInternal/observables/observableValue.js';\nimport { observableSignal } from '../../../../../base/common/observableInternal/observables/observableSignal.js';\nimport { autorun } from '../../../../../base/common/observableInternal/reactions/autorun.js';\nimport { transaction } from '../../../../../base/common/observableInternal/transaction.js';\nimport { derivedObservableWithCache } from '../../../../../base/common/observableInternal/utils/utils.js';\nimport { waitForState } from '../../../../../base/common/observableInternal/utils/utilsCancellation.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar InlineCompletionsController_1;\nlet InlineCompletionsController = class InlineCompletionsController extends Disposable {\n    static { InlineCompletionsController_1 = this; }\n    static { this._instances = new Set(); }\n    static { this.hot = createHotClass(this); }\n    static { this.ID = 'editor.contrib.inlineCompletionsController'; }\n    /**\n     * Find the controller in the focused editor or in the outer editor (if applicable)\n     */\n    static getInFocusedEditorOrParent(accessor) {\n        const outerEditor = getOuterEditor(accessor);\n        if (!outerEditor) {\n            return null;\n        }\n        return InlineCompletionsController_1.get(outerEditor);\n    }\n    static get(editor) {\n        return hotClassGetOriginalInstance(editor.getContribution(InlineCompletionsController_1.ID));\n    }\n    constructor(editor, _instantiationService, _contextKeyService, _configurationService, _commandService, _debounceService, _languageFeaturesService, _accessibilitySignalService, _keybindingService, _accessibilityService) {\n        super();\n        this.editor = editor;\n        this._instantiationService = _instantiationService;\n        this._contextKeyService = _contextKeyService;\n        this._configurationService = _configurationService;\n        this._commandService = _commandService;\n        this._debounceService = _debounceService;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._accessibilitySignalService = _accessibilitySignalService;\n        this._keybindingService = _keybindingService;\n        this._accessibilityService = _accessibilityService;\n        this._editorObs = observableCodeEditor(this.editor);\n        this._positions = derived(this, reader => this._editorObs.selections.read(reader)?.map(s => s.getEndPosition()) ?? [new Position(1, 1)]);\n        this._suggestWidgetAdapter = this._register(new ObservableSuggestWidgetAdapter(this._editorObs, item => this.model.get()?.handleSuggestAccepted(item), () => this.model.get()?.selectedInlineCompletion.get()?.getSingleTextEdit()));\n        this._enabledInConfig = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(71 /* EditorOption.inlineSuggest */).enabled);\n        this._isScreenReaderEnabled = observableFromEvent(this, this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized());\n        this._editorDictationInProgress = observableFromEvent(this, this._contextKeyService.onDidChangeContext, () => this._contextKeyService.getContext(this.editor.getDomNode()).getValue('editorDictation.inProgress') === true);\n        this._enabled = derived(this, reader => this._enabledInConfig.read(reader) && (!this._isScreenReaderEnabled.read(reader) || !this._editorDictationInProgress.read(reader)));\n        this._debounceValue = this._debounceService.for(this._languageFeaturesService.inlineCompletionsProvider, 'InlineCompletionsDebounce', { min: 50, max: 50 });\n        this._focusIsInMenu = observableValue(this, false);\n        this._focusIsInEditorOrMenu = derived(this, reader => {\n            const editorHasFocus = this._editorObs.isFocused.read(reader);\n            const menuHasFocus = this._focusIsInMenu.read(reader);\n            return editorHasFocus || menuHasFocus;\n        });\n        this._cursorIsInIndentation = derived(this, reader => {\n            const cursorPos = this._editorObs.cursorPosition.read(reader);\n            if (cursorPos === null) {\n                return false;\n            }\n            const model = this._editorObs.model.read(reader);\n            if (!model) {\n                return false;\n            }\n            this._editorObs.versionId.read(reader);\n            const indentMaxColumn = model.getLineIndentColumn(cursorPos.lineNumber);\n            return cursorPos.column <= indentMaxColumn;\n        });\n        this.model = derivedDisposable(this, reader => {\n            if (this._editorObs.isReadonly.read(reader)) {\n                return undefined;\n            }\n            const textModel = this._editorObs.model.read(reader);\n            if (!textModel) {\n                return undefined;\n            }\n            const model = this._instantiationService.createInstance(InlineCompletionsModel, textModel, this._suggestWidgetAdapter.selectedItem, this._editorObs.versionId, this._positions, this._debounceValue, this._enabled, this.editor);\n            return model;\n        }).recomputeInitiallyAndOnChange(this._store);\n        this._playAccessibilitySignal = observableSignal(this);\n        this._hideInlineEditOnSelectionChange = this._editorObs.getOption(71 /* EditorOption.inlineSuggest */).map(val => true);\n        this._view = this._register(this._instantiationService.createInstance(InlineCompletionsView, this.editor, this.model, this._focusIsInMenu));\n        InlineCompletionsController_1._instances.add(this);\n        this._register(toDisposable(() => InlineCompletionsController_1._instances.delete(this)));\n        this._register(autorun(reader => {\n            // Cancel all other inline completions when a new one starts\n            const model = this.model.read(reader);\n            if (!model) {\n                return;\n            }\n            const state = model.state.read(reader);\n            if (!state) {\n                return;\n            }\n            if (!this._focusIsInEditorOrMenu.read(undefined)) {\n                return;\n            }\n            // This controller is in focus, hence reject others.\n            // However if we display a NES that relates to another edit then trigger NES on that related controller\n            const nextEditUri = state.kind === 'inlineEdit' ? state.nextEditUri : undefined;\n            for (const ctrl of InlineCompletionsController_1._instances) {\n                if (ctrl === this) {\n                    continue;\n                }\n                else if (nextEditUri && isEqual(nextEditUri, ctrl.editor.getModel()?.uri)) {\n                    // The next edit in other edito is related to this controller, trigger it.\n                    ctrl.model.read(undefined)?.trigger();\n                }\n                else {\n                    ctrl.reject();\n                }\n            }\n        }));\n        this._register(autorun(reader => {\n            // Cancel all other inline completions when a new one starts\n            const model = this.model.read(reader);\n            const uri = this.editor.getModel()?.uri;\n            if (!model || !uri) {\n                return;\n            }\n            // This NES was accepted, its possible there is an NES that points to this editor.\n            // I.e. there's an NES that reads `Go To Next Edit`,\n            // If there is one that points to this editor, then we need to hide that as this NES was accepted.\n            reader.store.add(model.onDidAccept(() => {\n                for (const ctrl of InlineCompletionsController_1._instances) {\n                    if (ctrl === this) {\n                        continue;\n                    }\n                    // Find the nes from another editor that points to this.\n                    const state = ctrl.model.read(undefined)?.state.read(undefined);\n                    if (state?.kind === 'inlineEdit' && isEqual(state.nextEditUri, uri)) {\n                        ctrl.model.read(undefined)?.stop('automatic');\n                    }\n                }\n            }));\n        }));\n        this._register(runOnChange(this._editorObs.onDidType, (_value, _changes) => {\n            if (this._enabled.get()) {\n                this.model.get()?.trigger();\n            }\n        }));\n        this._register(runOnChange(this._editorObs.onDidPaste, (_value, _changes) => {\n            if (this._enabled.get()) {\n                this.model.get()?.trigger();\n            }\n        }));\n        // These commands don't trigger onDidType.\n        const triggerCommands = new Set([\n            CoreEditingCommands.Tab.id,\n            CoreEditingCommands.DeleteLeft.id,\n            CoreEditingCommands.DeleteRight.id,\n            inlineSuggestCommitId,\n            'acceptSelectedSuggestion',\n            InsertLineAfterAction.ID,\n            InsertLineBeforeAction.ID,\n            FIND_IDS.NextMatchFindAction,\n            ...TriggerInlineEditCommandsRegistry.getRegisteredCommands(),\n        ]);\n        this._register(this._commandService.onDidExecuteCommand((e) => {\n            if (triggerCommands.has(e.commandId) && editor.hasTextFocus() && this._enabled.get()) {\n                let noDelay = false;\n                if (e.commandId === inlineSuggestCommitId) {\n                    noDelay = true;\n                }\n                this._editorObs.forceUpdate(tx => {\n                    /** @description onDidExecuteCommand */\n                    this.model.get()?.trigger(tx, { noDelay });\n                });\n            }\n        }));\n        this._register(runOnChange(this._editorObs.selections, (_value, _, changes) => {\n            if (changes.some(e => e.reason === 3 /* CursorChangeReason.Explicit */ || e.source === 'api')) {\n                if (!this._hideInlineEditOnSelectionChange.get() && this.model.get()?.state.get()?.kind === 'inlineEdit') {\n                    return;\n                }\n                const m = this.model.get();\n                if (!m) {\n                    return;\n                }\n                if (m.state.get()?.kind === 'ghostText') {\n                    this.model.get()?.stop();\n                }\n            }\n        }));\n        this._register(autorun(reader => {\n            const isFocused = this._focusIsInEditorOrMenu.read(reader);\n            const model = this.model.read(undefined);\n            if (isFocused) {\n                // If this model already has an NES for another editor, then leave as is\n                // Else stop other models.\n                const state = model?.state.read(undefined);\n                if (!state || state.kind !== 'inlineEdit' || !state.nextEditUri) {\n                    transaction(tx => {\n                        for (const ctrl of InlineCompletionsController_1._instances) {\n                            if (ctrl !== this) {\n                                ctrl.model.read(undefined)?.stop('automatic', tx);\n                            }\n                        }\n                    });\n                }\n                return;\n            }\n            // This is a hidden setting very useful for debugging\n            if (this._contextKeyService.getContextKeyValue('accessibleViewIsShown')\n                || this._configurationService.getValue('editor.inlineSuggest.keepOnBlur')\n                || editor.getOption(71 /* EditorOption.inlineSuggest */).keepOnBlur\n                || InlineSuggestionHintsContentWidget.dropDownVisible) {\n                return;\n            }\n            if (!model) {\n                return;\n            }\n            if (model.state.read(undefined)?.inlineCompletion?.isFromExplicitRequest && model.inlineEditAvailable.read(undefined)) {\n                // dont hide inline edits on blur when requested explicitly\n                return;\n            }\n            transaction(tx => {\n                /** @description InlineCompletionsController.onDidBlurEditorWidget */\n                model.stop('automatic', tx);\n            });\n        }));\n        this._register(autorun(reader => {\n            /** @description InlineCompletionsController.forceRenderingAbove */\n            const state = this.model.read(reader)?.inlineCompletionState.read(reader);\n            if (state?.suggestItem) {\n                if (state.primaryGhostText.lineCount >= 2) {\n                    this._suggestWidgetAdapter.forceRenderingAbove();\n                }\n            }\n            else {\n                this._suggestWidgetAdapter.stopForceRenderingAbove();\n            }\n        }));\n        this._register(toDisposable(() => {\n            this._suggestWidgetAdapter.stopForceRenderingAbove();\n        }));\n        const currentInlineCompletionBySemanticId = derivedObservableWithCache(this, (reader, last) => {\n            const model = this.model.read(reader);\n            const state = model?.state.read(reader);\n            if (this._suggestWidgetAdapter.selectedItem.get()) {\n                return last;\n            }\n            return state?.inlineCompletion?.semanticId;\n        });\n        this._register(runOnChangeWithStore(derived(reader => {\n            this._playAccessibilitySignal.read(reader);\n            currentInlineCompletionBySemanticId.read(reader);\n            return {};\n        }), async (_value, _, _deltas, store) => {\n            /** @description InlineCompletionsController.playAccessibilitySignalAndReadSuggestion */\n            let model = this.model.get();\n            let state = model?.state.get();\n            if (!state || !model) {\n                return;\n            }\n            await timeout(50, cancelOnDispose(store));\n            await waitForState(this._suggestWidgetAdapter.selectedItem, isUndefined, () => false, cancelOnDispose(store));\n            model = this.model.get();\n            state = model?.state.get();\n            if (!state || !model) {\n                return;\n            }\n            const lineText = state.kind === 'ghostText' ? model.textModel.getLineContent(state.primaryGhostText.lineNumber) : '';\n            this._accessibilitySignalService.playSignal(state.kind === 'ghostText' ? AccessibilitySignal.inlineSuggestion : AccessibilitySignal.nextEditSuggestion);\n            if (this.editor.getOption(12 /* EditorOption.screenReaderAnnounceInlineSuggestion */)) {\n                if (state.kind === 'ghostText') {\n                    this._provideScreenReaderUpdate(state.primaryGhostText.renderForScreenReader(lineText));\n                }\n                else {\n                    this._provideScreenReaderUpdate(''); // Only announce Alt+F2\n                }\n            }\n        }));\n        // TODO@hediet\n        this._register(this._configurationService.onDidChangeConfiguration(e => {\n            if (e.affectsConfiguration('accessibility.verbosity.inlineCompletions')) {\n                this.editor.updateOptions({ inlineCompletionsAccessibilityVerbose: this._configurationService.getValue('accessibility.verbosity.inlineCompletions') });\n            }\n        }));\n        this.editor.updateOptions({ inlineCompletionsAccessibilityVerbose: this._configurationService.getValue('accessibility.verbosity.inlineCompletions') });\n        const contextKeySvcObs = new ObservableContextKeyService(this._contextKeyService);\n        this._register(contextKeySvcObs.bind(InlineCompletionContextKeys.cursorInIndentation, this._cursorIsInIndentation));\n        this._register(contextKeySvcObs.bind(InlineCompletionContextKeys.hasSelection, reader => !this._editorObs.cursorSelection.read(reader)?.isEmpty()));\n        this._register(contextKeySvcObs.bind(InlineCompletionContextKeys.cursorAtInlineEdit, this.model.map((m, reader) => m?.inlineEditState?.read(reader)?.cursorAtInlineEdit.read(reader))));\n        this._register(contextKeySvcObs.bind(InlineCompletionContextKeys.tabShouldAcceptInlineEdit, this.model.map((m, r) => !!m?.tabShouldAcceptInlineEdit.read(r))));\n        this._register(contextKeySvcObs.bind(InlineCompletionContextKeys.tabShouldJumpToInlineEdit, this.model.map((m, r) => !!m?.tabShouldJumpToInlineEdit.read(r))));\n        this._register(contextKeySvcObs.bind(InlineCompletionContextKeys.inlineEditVisible, reader => this.model.read(reader)?.inlineEditState.read(reader) !== undefined));\n        this._register(contextKeySvcObs.bind(InlineCompletionContextKeys.inlineSuggestionHasIndentation, reader => this.model.read(reader)?.getIndentationInfo(reader)?.startsWithIndentation));\n        this._register(contextKeySvcObs.bind(InlineCompletionContextKeys.inlineSuggestionHasIndentationLessThanTabSize, reader => this.model.read(reader)?.getIndentationInfo(reader)?.startsWithIndentationLessThanTabSize));\n        this._register(contextKeySvcObs.bind(InlineCompletionContextKeys.suppressSuggestions, reader => {\n            const model = this.model.read(reader);\n            const state = model?.inlineCompletionState.read(reader);\n            return state?.primaryGhostText && state?.inlineCompletion ? state.inlineCompletion.source.inlineSuggestions.suppressSuggestions : undefined;\n        }));\n        this._register(contextKeySvcObs.bind(InlineCompletionContextKeys.inlineSuggestionVisible, reader => {\n            const model = this.model.read(reader);\n            const state = model?.inlineCompletionState.read(reader);\n            return !!state?.inlineCompletion && state?.primaryGhostText !== undefined && !state?.primaryGhostText.isEmpty();\n        }));\n        const firstGhostTextPos = derived(this, reader => {\n            const model = this.model.read(reader);\n            const state = model?.inlineCompletionState.read(reader);\n            const primaryGhostText = state?.primaryGhostText;\n            if (!primaryGhostText || primaryGhostText.isEmpty()) {\n                return undefined;\n            }\n            const firstPartPos = new Position(primaryGhostText.lineNumber, primaryGhostText.parts[0].column);\n            return firstPartPos;\n        });\n        this._register(contextKeySvcObs.bind(InlineCompletionContextKeys.cursorBeforeGhostText, reader => {\n            const firstPartPos = firstGhostTextPos.read(reader);\n            if (!firstPartPos) {\n                return false;\n            }\n            const cursorPos = this._editorObs.cursorPosition.read(reader);\n            if (!cursorPos) {\n                return false;\n            }\n            return firstPartPos.equals(cursorPos);\n        }));\n        this._register(this._instantiationService.createInstance(TextModelChangeRecorder, this.editor));\n    }\n    playAccessibilitySignal(tx) {\n        this._playAccessibilitySignal.trigger(tx);\n    }\n    _provideScreenReaderUpdate(content) {\n        const accessibleViewShowing = this._contextKeyService.getContextKeyValue('accessibleViewIsShown');\n        const accessibleViewKeybinding = this._keybindingService.lookupKeybinding('editor.action.accessibleView');\n        let hint;\n        if (!accessibleViewShowing && accessibleViewKeybinding && this.editor.getOption(169 /* EditorOption.inlineCompletionsAccessibilityVerbose */)) {\n            hint = localize(1204, \"Inspect this in the accessible view ({0})\", accessibleViewKeybinding.getAriaLabel());\n        }\n        alert(hint ? content + ', ' + hint : content);\n    }\n    shouldShowHoverAt(range) {\n        const ghostText = this.model.get()?.primaryGhostText.get();\n        if (!ghostText) {\n            return false;\n        }\n        return ghostText.parts.some(p => range.containsPosition(new Position(ghostText.lineNumber, p.column)));\n    }\n    shouldShowHoverAtViewZone(viewZoneId) {\n        return this._view.shouldShowHoverAtViewZone(viewZoneId);\n    }\n    reject() {\n        transaction(tx => {\n            const m = this.model.get();\n            if (m) {\n                m.stop('explicitCancel', tx);\n                // Only if this controller is in focus can we cancel others.\n                if (this._focusIsInEditorOrMenu.get()) {\n                    for (const ctrl of InlineCompletionsController_1._instances) {\n                        if (ctrl !== this) {\n                            ctrl.model.get()?.stop('automatic', tx);\n                        }\n                    }\n                }\n            }\n        });\n    }\n    jump() {\n        const m = this.model.get();\n        if (m) {\n            m.jump();\n        }\n    }\n};\nInlineCompletionsController = InlineCompletionsController_1 = __decorate([\n    __param(1, IInstantiationService),\n    __param(2, IContextKeyService),\n    __param(3, IConfigurationService),\n    __param(4, ICommandService),\n    __param(5, ILanguageFeatureDebounceService),\n    __param(6, ILanguageFeaturesService),\n    __param(7, IAccessibilitySignalService),\n    __param(8, IKeybindingService),\n    __param(9, IAccessibilityService)\n], InlineCompletionsController);\n\nexport { InlineCompletionsController };\n","import '../../../../../base/common/observableInternal/index.js';\nimport { splitLines } from '../../../../../base/common/strings.js';\nimport { vUnion, vObj, vOptionalProp, vWithJsonSchemaRef, vUndefined, vBoolean, vString } from '../../../../../base/common/validation.js';\nimport { localize2, localize } from '../../../../../nls.js';\nimport { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from '../../../../../platform/accessibility/common/accessibility.js';\nimport { MenuId, Action2 } from '../../../../../platform/actions/common/actions.js';\nimport { IClipboardService } from '../../../../../platform/clipboard/common/clipboardService.js';\nimport { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';\nimport { ContextKeyExpr } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { KeybindingsRegistry } from '../../../../../platform/keybinding/common/keybindingsRegistry.js';\nimport { INotificationService, Severity } from '../../../../../platform/notification/common/notification.js';\nimport { EditorAction } from '../../../../browser/editorExtensions.js';\nimport { EditorContextKeys } from '../../../../common/editorContextKeys.js';\nimport { ILanguageFeaturesService } from '../../../../common/services/languageFeatures.js';\nimport { Context } from '../../../suggest/browser/suggest.js';\nimport { showNextInlineSuggestionActionId, showPreviousInlineSuggestionActionId, inlineSuggestCommitId, hideInlineCompletionId, toggleShowCollapsedId, jumpToNextInlineEditId } from './commandIds.js';\nimport { InlineCompletionContextKeys } from './inlineCompletionContextKeys.js';\nimport { InlineCompletionsController } from './inlineCompletionsController.js';\nimport { transaction, asyncTransaction } from '../../../../../base/common/observableInternal/transaction.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ShowNextInlineSuggestionAction extends EditorAction {\n    static { this.ID = showNextInlineSuggestionActionId; }\n    constructor() {\n        super({\n            id: ShowNextInlineSuggestionAction.ID,\n            label: localize2(1183, \"Show Next Inline Suggestion\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, InlineCompletionContextKeys.inlineSuggestionVisible),\n            kbOpts: {\n                weight: 100,\n                primary: 512 /* KeyMod.Alt */ | 94 /* KeyCode.BracketRight */,\n            },\n        });\n    }\n    async run(accessor, editor) {\n        const controller = InlineCompletionsController.get(editor);\n        controller?.model.get()?.next();\n    }\n}\nclass ShowPreviousInlineSuggestionAction extends EditorAction {\n    static { this.ID = showPreviousInlineSuggestionActionId; }\n    constructor() {\n        super({\n            id: ShowPreviousInlineSuggestionAction.ID,\n            label: localize2(1184, \"Show Previous Inline Suggestion\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, InlineCompletionContextKeys.inlineSuggestionVisible),\n            kbOpts: {\n                weight: 100,\n                primary: 512 /* KeyMod.Alt */ | 92 /* KeyCode.BracketLeft */,\n            },\n        });\n    }\n    async run(accessor, editor) {\n        const controller = InlineCompletionsController.get(editor);\n        controller?.model.get()?.previous();\n    }\n}\nconst providerIdSchemaUri = 'vscode://schemas/inlineCompletionProviderIdArgs';\nfunction inlineCompletionProviderGetMatcher(provider) {\n    const result = [];\n    if (provider.providerId) {\n        result.push(provider.providerId.toStringWithoutVersion());\n        result.push(provider.providerId.extensionId + ':*');\n    }\n    return result;\n}\nconst argsValidator = vUnion(vObj({\n    showNoResultNotification: vOptionalProp(vBoolean()),\n    providerId: vOptionalProp(vWithJsonSchemaRef(providerIdSchemaUri, vString())),\n    explicit: vOptionalProp(vBoolean()),\n}), vUndefined());\nclass TriggerInlineSuggestionAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.inlineSuggest.trigger',\n            label: localize2(1185, \"Trigger Inline Suggestion\"),\n            precondition: EditorContextKeys.writable,\n            metadata: {\n                description: localize(1172, \"Triggers an inline suggestion in the editor.\"),\n                args: [{\n                        name: 'args',\n                        description: localize(1173, \"Options for triggering inline suggestions.\"),\n                        isOptional: true,\n                        schema: argsValidator.getJSONSchema(),\n                    }]\n            }\n        });\n    }\n    async run(accessor, editor, args) {\n        const notificationService = accessor.get(INotificationService);\n        const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n        const controller = InlineCompletionsController.get(editor);\n        const validatedArgs = argsValidator.validateOrThrow(args);\n        const provider = validatedArgs?.providerId ?\n            languageFeaturesService.inlineCompletionsProvider.all(editor.getModel())\n                .find(p => inlineCompletionProviderGetMatcher(p).some(m => m === validatedArgs.providerId))\n            : undefined;\n        await asyncTransaction(async (tx) => {\n            /** @description triggerExplicitly from command */\n            await controller?.model.get()?.trigger(tx, {\n                provider: provider,\n                explicit: validatedArgs?.explicit ?? true,\n            });\n            controller?.playAccessibilitySignal(tx);\n        });\n        if (validatedArgs?.showNoResultNotification) {\n            if (!controller?.model.get()?.state.get()) {\n                notificationService.notify({\n                    severity: Severity.Info,\n                    message: localize(1174, \"No inline suggestion is available.\")\n                });\n            }\n        }\n    }\n}\nclass AcceptNextWordOfInlineCompletion extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.inlineSuggest.acceptNextWord',\n            label: localize2(1186, \"Accept Next Word Of Inline Suggestion\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, InlineCompletionContextKeys.inlineSuggestionVisible),\n            kbOpts: {\n                weight: 100 /* KeybindingWeight.EditorContrib */ + 1,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 17 /* KeyCode.RightArrow */,\n                kbExpr: ContextKeyExpr.and(EditorContextKeys.writable, InlineCompletionContextKeys.inlineSuggestionVisible, InlineCompletionContextKeys.cursorBeforeGhostText, CONTEXT_ACCESSIBILITY_MODE_ENABLED.negate()),\n            },\n            menuOpts: [{\n                    menuId: MenuId.InlineSuggestionToolbar,\n                    title: localize(1175, 'Accept Word'),\n                    group: 'primary',\n                    order: 2,\n                }],\n        });\n    }\n    async run(accessor, editor) {\n        const controller = InlineCompletionsController.get(editor);\n        await controller?.model.get()?.acceptNextWord();\n    }\n}\nclass AcceptNextLineOfInlineCompletion extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.inlineSuggest.acceptNextLine',\n            label: localize2(1187, \"Accept Next Line Of Inline Suggestion\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, InlineCompletionContextKeys.inlineSuggestionVisible),\n            kbOpts: {\n                weight: 100 /* KeybindingWeight.EditorContrib */ + 1,\n            },\n            menuOpts: [{\n                    menuId: MenuId.InlineSuggestionToolbar,\n                    title: localize(1176, 'Accept Line'),\n                    group: 'secondary',\n                    order: 2,\n                }],\n        });\n    }\n    async run(accessor, editor) {\n        const controller = InlineCompletionsController.get(editor);\n        await controller?.model.get()?.acceptNextLine();\n    }\n}\nclass AcceptInlineCompletion extends EditorAction {\n    constructor() {\n        super({\n            id: inlineSuggestCommitId,\n            label: localize2(1188, \"Accept Inline Suggestion\"),\n            precondition: ContextKeyExpr.or(InlineCompletionContextKeys.inlineSuggestionVisible, InlineCompletionContextKeys.inlineEditVisible),\n            menuOpts: [{\n                    menuId: MenuId.InlineSuggestionToolbar,\n                    title: localize(1177, \"Accept\"),\n                    group: 'primary',\n                    order: 2,\n                }, {\n                    menuId: MenuId.InlineEditsActions,\n                    title: localize(1178, \"Accept\"),\n                    group: 'primary',\n                    order: 2,\n                }],\n            kbOpts: [\n                {\n                    primary: 2 /* KeyCode.Tab */,\n                    weight: 200,\n                    kbExpr: ContextKeyExpr.or(ContextKeyExpr.and(InlineCompletionContextKeys.inlineSuggestionVisible, EditorContextKeys.tabMovesFocus.toNegated(), Context.Visible.toNegated(), EditorContextKeys.hoverFocused.toNegated(), InlineCompletionContextKeys.hasSelection.toNegated(), InlineCompletionContextKeys.inlineSuggestionHasIndentationLessThanTabSize), ContextKeyExpr.and(InlineCompletionContextKeys.inlineEditVisible, EditorContextKeys.tabMovesFocus.toNegated(), Context.Visible.toNegated(), EditorContextKeys.hoverFocused.toNegated(), InlineCompletionContextKeys.tabShouldAcceptInlineEdit)),\n                }\n            ],\n        });\n    }\n    async run(accessor, editor) {\n        const controller = InlineCompletionsController.getInFocusedEditorOrParent(accessor);\n        if (controller) {\n            controller.model.get()?.accept(controller.editor);\n            controller.editor.focus();\n        }\n    }\n}\nKeybindingsRegistry.registerKeybindingRule({\n    id: inlineSuggestCommitId,\n    weight: 202, // greater than jump\n    primary: 2 /* KeyCode.Tab */,\n    when: ContextKeyExpr.and(InlineCompletionContextKeys.inInlineEditsPreviewEditor)\n});\nclass JumpToNextInlineEdit extends EditorAction {\n    constructor() {\n        super({\n            id: jumpToNextInlineEditId,\n            label: localize2(1189, \"Jump to next inline edit\"),\n            precondition: InlineCompletionContextKeys.inlineEditVisible,\n            menuOpts: [{\n                    menuId: MenuId.InlineEditsActions,\n                    title: localize(1179, \"Jump\"),\n                    group: 'primary',\n                    order: 1,\n                    when: InlineCompletionContextKeys.cursorAtInlineEdit.toNegated(),\n                }],\n            kbOpts: {\n                primary: 2 /* KeyCode.Tab */,\n                weight: 201,\n                kbExpr: ContextKeyExpr.and(InlineCompletionContextKeys.inlineEditVisible, EditorContextKeys.tabMovesFocus.toNegated(), Context.Visible.toNegated(), EditorContextKeys.hoverFocused.toNegated(), InlineCompletionContextKeys.tabShouldJumpToInlineEdit),\n            }\n        });\n    }\n    async run(accessor, editor) {\n        const controller = InlineCompletionsController.get(editor);\n        if (controller) {\n            controller.jump();\n        }\n    }\n}\nclass HideInlineCompletion extends EditorAction {\n    static { this.ID = hideInlineCompletionId; }\n    constructor() {\n        super({\n            id: HideInlineCompletion.ID,\n            label: localize2(1190, \"Hide Inline Suggestion\"),\n            precondition: ContextKeyExpr.or(InlineCompletionContextKeys.inlineSuggestionVisible, InlineCompletionContextKeys.inlineEditVisible),\n            kbOpts: {\n                weight: 100 /* KeybindingWeight.EditorContrib */ + 90, // same as hiding the suggest widget\n                primary: 9 /* KeyCode.Escape */,\n            },\n            menuOpts: [{\n                    menuId: MenuId.InlineEditsActions,\n                    title: localize(1180, \"Reject\"),\n                    group: 'primary',\n                    order: 3,\n                }]\n        });\n    }\n    async run(accessor, editor) {\n        const controller = InlineCompletionsController.getInFocusedEditorOrParent(accessor);\n        transaction(tx => {\n            controller?.model.get()?.stop('explicitCancel', tx);\n        });\n        controller?.editor.focus();\n    }\n}\nclass ToggleInlineCompletionShowCollapsed extends EditorAction {\n    static { this.ID = toggleShowCollapsedId; }\n    constructor() {\n        super({\n            id: ToggleInlineCompletionShowCollapsed.ID,\n            label: localize2(1191, \"Toggle Inline Suggestions Show Collapsed\"),\n            precondition: ContextKeyExpr.true(),\n        });\n    }\n    async run(accessor, editor) {\n        const configurationService = accessor.get(IConfigurationService);\n        const showCollapsed = configurationService.getValue('editor.inlineSuggest.edits.showCollapsed');\n        configurationService.updateValue('editor.inlineSuggest.edits.showCollapsed', !showCollapsed);\n    }\n}\nKeybindingsRegistry.registerKeybindingRule({\n    id: HideInlineCompletion.ID,\n    weight: -1, // very weak\n    primary: 9 /* KeyCode.Escape */,\n    secondary: [1024 /* KeyMod.Shift */ | 9 /* KeyCode.Escape */],\n    when: ContextKeyExpr.and(InlineCompletionContextKeys.inInlineEditsPreviewEditor)\n});\nclass ToggleAlwaysShowInlineSuggestionToolbar extends Action2 {\n    static { this.ID = 'editor.action.inlineSuggest.toggleAlwaysShowToolbar'; }\n    constructor() {\n        super({\n            id: ToggleAlwaysShowInlineSuggestionToolbar.ID,\n            title: localize(1181, \"Always Show Toolbar\"),\n            f1: false,\n            precondition: undefined,\n            menu: [{\n                    id: MenuId.InlineSuggestionToolbar,\n                    group: 'secondary',\n                    order: 10,\n                }],\n            toggled: ContextKeyExpr.equals('config.editor.inlineSuggest.showToolbar', 'always')\n        });\n    }\n    async run(accessor) {\n        const configService = accessor.get(IConfigurationService);\n        const currentValue = configService.getValue('editor.inlineSuggest.showToolbar');\n        const newValue = currentValue === 'always' ? 'onHover' : 'always';\n        configService.updateValue('editor.inlineSuggest.showToolbar', newValue);\n    }\n}\nclass DevExtractReproSample extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.inlineSuggest.dev.extractRepro',\n            label: localize(1182, \"Developer: Extract Inline Suggest State\"),\n            alias: 'Developer: Inline Suggest Extract Repro',\n            precondition: ContextKeyExpr.or(InlineCompletionContextKeys.inlineEditVisible, InlineCompletionContextKeys.inlineSuggestionVisible),\n        });\n    }\n    async run(accessor, editor) {\n        const clipboardService = accessor.get(IClipboardService);\n        const controller = InlineCompletionsController.get(editor);\n        const m = controller?.model.get();\n        if (!m) {\n            return;\n        }\n        const repro = m.extractReproSample();\n        const inlineCompletionLines = splitLines(JSON.stringify({ inlineCompletion: repro.inlineCompletion }, null, 4));\n        const json = inlineCompletionLines.map(l => '// ' + l).join('\\n');\n        const reproStr = `${repro.documentValue}\\n\\n// <json>\\n${json}\\n// </json>\\n`;\n        await clipboardService.writeText(reproStr);\n        return { reproCase: reproStr };\n    }\n}\n\nexport { AcceptInlineCompletion, AcceptNextLineOfInlineCompletion, AcceptNextWordOfInlineCompletion, DevExtractReproSample, HideInlineCompletion, JumpToNextInlineEdit, ShowNextInlineSuggestionAction, ShowPreviousInlineSuggestionAction, ToggleAlwaysShowInlineSuggestionToolbar, ToggleInlineCompletionShowCollapsed, TriggerInlineSuggestionAction, inlineCompletionProviderGetMatcher, providerIdSchemaUri };\n","import { $, append, reset } from '../../../../../base/browser/dom.js';\nimport { MarkdownString } from '../../../../../base/common/htmlContent.js';\nimport { DisposableStore } from '../../../../../base/common/lifecycle.js';\nimport '../../../../../base/common/observableInternal/index.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { HoverForeignElementAnchor, RenderedHoverParts } from '../../../hover/browser/hoverTypes.js';\nimport { InlineCompletionsController } from '../controller/inlineCompletionsController.js';\nimport { InlineSuggestionHintsContentWidget } from './inlineCompletionsHintsWidget.js';\nimport { IMarkdownRendererService } from '../../../../../platform/markdown/browser/markdownRenderer.js';\nimport { localize } from '../../../../../nls.js';\nimport { IAccessibilityService } from '../../../../../platform/accessibility/common/accessibility.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { ITelemetryService } from '../../../../../platform/telemetry/common/telemetry.js';\nimport { GhostTextView } from '../view/ghostText/ghostTextView.js';\nimport { autorunWithStore, autorun } from '../../../../../base/common/observableInternal/reactions/autorun.js';\nimport { constObservable } from '../../../../../base/common/observableInternal/observables/constObservable.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass InlineCompletionsHover {\n    constructor(owner, range, controller) {\n        this.owner = owner;\n        this.range = range;\n        this.controller = controller;\n    }\n    isValidForHoverAnchor(anchor) {\n        return (anchor.type === 1 /* HoverAnchorType.Range */\n            && this.range.startColumn <= anchor.range.startColumn\n            && this.range.endColumn >= anchor.range.endColumn);\n    }\n}\nlet InlineCompletionsHoverParticipant = class InlineCompletionsHoverParticipant {\n    constructor(_editor, accessibilityService, _instantiationService, _telemetryService, _markdownRendererService) {\n        this._editor = _editor;\n        this.accessibilityService = accessibilityService;\n        this._instantiationService = _instantiationService;\n        this._telemetryService = _telemetryService;\n        this._markdownRendererService = _markdownRendererService;\n        this.hoverOrdinal = 4;\n    }\n    suggestHoverAnchor(mouseEvent) {\n        const controller = InlineCompletionsController.get(this._editor);\n        if (!controller) {\n            return null;\n        }\n        const target = mouseEvent.target;\n        if (target.type === 8 /* MouseTargetType.CONTENT_VIEW_ZONE */) {\n            // handle the case where the mouse is over the view zone\n            const viewZoneData = target.detail;\n            if (controller.shouldShowHoverAtViewZone(viewZoneData.viewZoneId)) {\n                return new HoverForeignElementAnchor(1000, this, Range.fromPositions(this._editor.getModel().validatePosition(viewZoneData.positionBefore || viewZoneData.position)), mouseEvent.event.posx, mouseEvent.event.posy, false);\n            }\n        }\n        if (target.type === 7 /* MouseTargetType.CONTENT_EMPTY */) {\n            // handle the case where the mouse is over the empty portion of a line following ghost text\n            if (controller.shouldShowHoverAt(target.range)) {\n                return new HoverForeignElementAnchor(1000, this, target.range, mouseEvent.event.posx, mouseEvent.event.posy, false);\n            }\n        }\n        if (target.type === 6 /* MouseTargetType.CONTENT_TEXT */) {\n            // handle the case where the mouse is directly over ghost text\n            const mightBeForeignElement = target.detail.mightBeForeignElement;\n            if (mightBeForeignElement && controller.shouldShowHoverAt(target.range)) {\n                return new HoverForeignElementAnchor(1000, this, target.range, mouseEvent.event.posx, mouseEvent.event.posy, false);\n            }\n        }\n        if (target.type === 9 /* MouseTargetType.CONTENT_WIDGET */ && target.element) {\n            const ctx = GhostTextView.getWarningWidgetContext(target.element);\n            if (ctx && controller.shouldShowHoverAt(ctx.range)) {\n                return new HoverForeignElementAnchor(1000, this, ctx.range, mouseEvent.event.posx, mouseEvent.event.posy, false);\n            }\n        }\n        return null;\n    }\n    computeSync(anchor, lineDecorations) {\n        if (this._editor.getOption(71 /* EditorOption.inlineSuggest */).showToolbar !== 'onHover') {\n            return [];\n        }\n        const controller = InlineCompletionsController.get(this._editor);\n        if (controller && controller.shouldShowHoverAt(anchor.range)) {\n            return [new InlineCompletionsHover(this, anchor.range, controller)];\n        }\n        return [];\n    }\n    renderHoverParts(context, hoverParts) {\n        const disposables = new DisposableStore();\n        const part = hoverParts[0];\n        this._telemetryService.publicLog2('inlineCompletionHover.shown');\n        if (this.accessibilityService.isScreenReaderOptimized() && !this._editor.getOption(12 /* EditorOption.screenReaderAnnounceInlineSuggestion */)) {\n            disposables.add(this.renderScreenReaderText(context, part));\n        }\n        const model = part.controller.model.get();\n        const widgetNode = document.createElement('div');\n        context.fragment.appendChild(widgetNode);\n        disposables.add(autorunWithStore((reader, store) => {\n            const w = store.add(this._instantiationService.createInstance(InlineSuggestionHintsContentWidget.hot.read(reader), this._editor, false, constObservable(null), model.selectedInlineCompletionIndex, model.inlineCompletionsCount, model.activeCommands, model.warning, () => {\n                context.onContentsChanged();\n            }));\n            widgetNode.replaceChildren(w.getDomNode());\n        }));\n        model.triggerExplicitly();\n        const renderedHoverPart = {\n            hoverPart: part,\n            hoverElement: widgetNode,\n            dispose() { disposables.dispose(); }\n        };\n        return new RenderedHoverParts([renderedHoverPart]);\n    }\n    getAccessibleContent(hoverPart) {\n        return localize(1205, 'There are inline completions here');\n    }\n    renderScreenReaderText(context, part) {\n        const disposables = new DisposableStore();\n        const $$1 = $;\n        const markdownHoverElement = $$1('div.hover-row.markdown-hover');\n        const hoverContentsElement = append(markdownHoverElement, $$1('div.hover-contents', { ['aria-live']: 'assertive' }));\n        const render = (code) => {\n            const inlineSuggestionAvailable = localize(1206, \"Suggestion:\");\n            const renderedContents = disposables.add(this._markdownRendererService.render(new MarkdownString().appendText(inlineSuggestionAvailable).appendCodeblock('text', code), {\n                context: this._editor,\n                asyncRenderCallback: () => {\n                    hoverContentsElement.className = 'hover-contents code-hover-contents';\n                    context.onContentsChanged();\n                }\n            }));\n            hoverContentsElement.replaceChildren(renderedContents.element);\n        };\n        disposables.add(autorun(reader => {\n            /** @description update hover */\n            const ghostText = part.controller.model.read(reader)?.primaryGhostText.read(reader);\n            if (ghostText) {\n                const lineText = this._editor.getModel().getLineContent(ghostText.lineNumber);\n                render(ghostText.renderForScreenReader(lineText));\n            }\n            else {\n                reset(hoverContentsElement);\n            }\n        }));\n        context.fragment.appendChild(markdownHoverElement);\n        return disposables;\n    }\n};\nInlineCompletionsHoverParticipant = __decorate([\n    __param(1, IAccessibilityService),\n    __param(2, IInstantiationService),\n    __param(3, ITelemetryService),\n    __param(4, IMarkdownRendererService)\n], InlineCompletionsHoverParticipant);\n\nexport { InlineCompletionsHover, InlineCompletionsHoverParticipant };\n","class InlineCompletionsAccessibleView {\n}\n\nexport { InlineCompletionsAccessibleView };\n","import { AccessibleViewRegistry } from '../../../../platform/accessibility/browser/accessibleViewRegistry.js';\nimport { registerAction2 } from '../../../../platform/actions/common/actions.js';\nimport { wrapInHotClass1 } from '../../../../platform/observable/common/wrapInHotClass.js';\nimport { registerEditorContribution, registerEditorAction } from '../../../browser/editorExtensions.js';\nimport { HoverParticipantRegistry } from '../../hover/browser/hoverTypes.js';\nimport { TriggerInlineSuggestionAction, ShowNextInlineSuggestionAction, ShowPreviousInlineSuggestionAction, AcceptNextWordOfInlineCompletion, AcceptNextLineOfInlineCompletion, AcceptInlineCompletion, ToggleInlineCompletionShowCollapsed, HideInlineCompletion, JumpToNextInlineEdit, ToggleAlwaysShowInlineSuggestionToolbar, DevExtractReproSample } from './controller/commands.js';\nimport { InlineCompletionsController } from './controller/inlineCompletionsController.js';\nimport { InlineCompletionsHoverParticipant } from './hintsWidget/hoverParticipant.js';\nimport { InlineCompletionsAccessibleView } from './inlineCompletionsAccessibleView.js';\nimport { SnoozeInlineCompletion, CancelSnoozeInlineCompletion } from '../../../browser/services/inlineCompletionsService.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterEditorContribution(InlineCompletionsController.ID, wrapInHotClass1(InlineCompletionsController.hot), 3 /* EditorContributionInstantiation.Eventually */);\nregisterEditorAction(TriggerInlineSuggestionAction);\nregisterEditorAction(ShowNextInlineSuggestionAction);\nregisterEditorAction(ShowPreviousInlineSuggestionAction);\nregisterEditorAction(AcceptNextWordOfInlineCompletion);\nregisterEditorAction(AcceptNextLineOfInlineCompletion);\nregisterEditorAction(AcceptInlineCompletion);\nregisterEditorAction(ToggleInlineCompletionShowCollapsed);\nregisterEditorAction(HideInlineCompletion);\nregisterEditorAction(JumpToNextInlineEdit);\nregisterAction2(ToggleAlwaysShowInlineSuggestionToolbar);\nregisterEditorAction(DevExtractReproSample);\nregisterAction2(SnoozeInlineCompletion);\nregisterAction2(CancelSnoozeInlineCompletion);\nHoverParticipantRegistry.register(InlineCompletionsHoverParticipant);\nAccessibleViewRegistry.register(new InlineCompletionsAccessibleView());\n","import { createCancelablePromise } from '../../../../../base/common/async.js';\nimport { onUnexpectedError } from '../../../../../base/common/errors.js';\nimport { MarkdownString } from '../../../../../base/common/htmlContent.js';\nimport { DisposableStore } from '../../../../../base/common/lifecycle.js';\nimport './goToDefinitionAtPosition.css';\nimport { EditorState } from '../../../editorState/browser/editorState.js';\nimport { registerEditorContribution } from '../../../../browser/editorExtensions.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { ILanguageService } from '../../../../common/languages/language.js';\nimport { ITextModelService } from '../../../../common/services/resolverService.js';\nimport { ClickLinkGesture } from './clickLinkGesture.js';\nimport { PeekContext } from '../../../peekView/browser/peekView.js';\nimport { localize } from '../../../../../nls.js';\nimport { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { DefinitionAction } from '../goToCommands.js';\nimport { getDefinitionsAtPosition } from '../goToSymbol.js';\nimport { ILanguageFeaturesService } from '../../../../common/services/languageFeatures.js';\nimport { ModelDecorationInjectedTextOptions } from '../../../../common/model/textModel.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar GotoDefinitionAtPositionEditorContribution_1;\nlet GotoDefinitionAtPositionEditorContribution = class GotoDefinitionAtPositionEditorContribution {\n    static { GotoDefinitionAtPositionEditorContribution_1 = this; }\n    static { this.ID = 'editor.contrib.gotodefinitionatposition'; }\n    static { this.MAX_SOURCE_PREVIEW_LINES = 8; }\n    constructor(editor, textModelResolverService, languageService, languageFeaturesService) {\n        this.textModelResolverService = textModelResolverService;\n        this.languageService = languageService;\n        this.languageFeaturesService = languageFeaturesService;\n        this.toUnhook = new DisposableStore();\n        this.toUnhookForKeyboard = new DisposableStore();\n        this.currentWordAtPosition = null;\n        this.previousPromise = null;\n        this.editor = editor;\n        this.linkDecorations = this.editor.createDecorationsCollection();\n        const linkGesture = new ClickLinkGesture(editor);\n        this.toUnhook.add(linkGesture);\n        this.toUnhook.add(linkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => {\n            this.startFindDefinitionFromMouse(mouseEvent, keyboardEvent ?? undefined);\n        }));\n        this.toUnhook.add(linkGesture.onExecute((mouseEvent) => {\n            if (this.isEnabled(mouseEvent)) {\n                this.gotoDefinition(mouseEvent.target.position, mouseEvent.hasSideBySideModifier)\n                    .catch((error) => {\n                    onUnexpectedError(error);\n                })\n                    .finally(() => {\n                    this.removeLinkDecorations();\n                });\n            }\n        }));\n        this.toUnhook.add(linkGesture.onCancel(() => {\n            this.removeLinkDecorations();\n            this.currentWordAtPosition = null;\n        }));\n    }\n    static get(editor) {\n        return editor.getContribution(GotoDefinitionAtPositionEditorContribution_1.ID);\n    }\n    async startFindDefinitionFromCursor(position) {\n        // For issue: https://github.com/microsoft/vscode/issues/46257\n        // equivalent to mouse move with meta/ctrl key\n        // First find the definition and add decorations\n        // to the editor to be shown with the content hover widget\n        await this.startFindDefinition(position);\n        // Add listeners for editor cursor move and key down events\n        // Dismiss the \"extended\" editor decorations when the user hides\n        // the hover widget. There is no event for the widget itself so these\n        // serve as a best effort. After removing the link decorations, the hover\n        // widget is clean and will only show declarations per next request.\n        this.toUnhookForKeyboard.add(this.editor.onDidChangeCursorPosition(() => {\n            this.currentWordAtPosition = null;\n            this.removeLinkDecorations();\n            this.toUnhookForKeyboard.clear();\n        }));\n        this.toUnhookForKeyboard.add(this.editor.onKeyDown((e) => {\n            if (e) {\n                this.currentWordAtPosition = null;\n                this.removeLinkDecorations();\n                this.toUnhookForKeyboard.clear();\n            }\n        }));\n    }\n    startFindDefinitionFromMouse(mouseEvent, withKey) {\n        // check if we are active and on a content widget\n        if (mouseEvent.target.type === 9 /* MouseTargetType.CONTENT_WIDGET */ && this.linkDecorations.length > 0) {\n            return;\n        }\n        if (!this.editor.hasModel() || !this.isEnabled(mouseEvent, withKey)) {\n            this.currentWordAtPosition = null;\n            this.removeLinkDecorations();\n            return;\n        }\n        const position = mouseEvent.target.position;\n        this.startFindDefinition(position);\n    }\n    async startFindDefinition(position) {\n        // Dispose listeners for updating decorations when using keyboard to show definition hover\n        this.toUnhookForKeyboard.clear();\n        // Find word at mouse position\n        const word = position ? this.editor.getModel()?.getWordAtPosition(position) : null;\n        if (!word) {\n            this.currentWordAtPosition = null;\n            this.removeLinkDecorations();\n            return;\n        }\n        // Return early if word at position is still the same\n        if (this.currentWordAtPosition && this.currentWordAtPosition.startColumn === word.startColumn && this.currentWordAtPosition.endColumn === word.endColumn && this.currentWordAtPosition.word === word.word) {\n            return;\n        }\n        this.currentWordAtPosition = word;\n        // Find definition and decorate word if found\n        const state = new EditorState(this.editor, 4 /* CodeEditorStateFlag.Position */ | 1 /* CodeEditorStateFlag.Value */ | 2 /* CodeEditorStateFlag.Selection */ | 8 /* CodeEditorStateFlag.Scroll */);\n        if (this.previousPromise) {\n            this.previousPromise.cancel();\n            this.previousPromise = null;\n        }\n        this.previousPromise = createCancelablePromise(token => this.findDefinition(position, token));\n        let results;\n        try {\n            results = await this.previousPromise;\n        }\n        catch (error) {\n            onUnexpectedError(error);\n            return;\n        }\n        if (!results || !results.length || !state.validate(this.editor)) {\n            this.removeLinkDecorations();\n            return;\n        }\n        const linkRange = results[0].originSelectionRange\n            ? Range.lift(results[0].originSelectionRange)\n            : new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn);\n        // Multiple results\n        if (results.length > 1) {\n            let combinedRange = linkRange;\n            for (const { originSelectionRange } of results) {\n                if (originSelectionRange) {\n                    combinedRange = Range.plusRange(combinedRange, originSelectionRange);\n                }\n            }\n            this.addDecoration(combinedRange, new MarkdownString().appendText(localize(1077, \"Click to show {0} definitions.\", results.length)));\n        }\n        else {\n            // Single result\n            const result = results[0];\n            if (!result.uri) {\n                return;\n            }\n            return this.textModelResolverService.createModelReference(result.uri).then(ref => {\n                if (!ref.object || !ref.object.textEditorModel) {\n                    ref.dispose();\n                    return;\n                }\n                const { object: { textEditorModel } } = ref;\n                const { startLineNumber } = result.range;\n                if (startLineNumber < 1 || startLineNumber > textEditorModel.getLineCount()) {\n                    // invalid range\n                    ref.dispose();\n                    return;\n                }\n                const previewValue = this.getPreviewValue(textEditorModel, startLineNumber, result);\n                const languageId = this.languageService.guessLanguageIdByFilepathOrFirstLine(textEditorModel.uri);\n                this.addDecoration(linkRange, previewValue ? new MarkdownString().appendCodeblock(languageId ? languageId : '', previewValue) : undefined);\n                ref.dispose();\n            });\n        }\n    }\n    getPreviewValue(textEditorModel, startLineNumber, result) {\n        let rangeToUse = result.range;\n        const numberOfLinesInRange = rangeToUse.endLineNumber - rangeToUse.startLineNumber;\n        if (numberOfLinesInRange >= GotoDefinitionAtPositionEditorContribution_1.MAX_SOURCE_PREVIEW_LINES) {\n            rangeToUse = this.getPreviewRangeBasedOnIndentation(textEditorModel, startLineNumber);\n        }\n        rangeToUse = textEditorModel.validateRange(rangeToUse);\n        const previewValue = this.stripIndentationFromPreviewRange(textEditorModel, startLineNumber, rangeToUse);\n        return previewValue;\n    }\n    stripIndentationFromPreviewRange(textEditorModel, startLineNumber, previewRange) {\n        const startIndent = textEditorModel.getLineFirstNonWhitespaceColumn(startLineNumber);\n        let minIndent = startIndent;\n        for (let endLineNumber = startLineNumber + 1; endLineNumber < previewRange.endLineNumber; endLineNumber++) {\n            const endIndent = textEditorModel.getLineFirstNonWhitespaceColumn(endLineNumber);\n            minIndent = Math.min(minIndent, endIndent);\n        }\n        const previewValue = textEditorModel.getValueInRange(previewRange).replace(new RegExp(`^\\\\s{${minIndent - 1}}`, 'gm'), '').trim();\n        return previewValue;\n    }\n    getPreviewRangeBasedOnIndentation(textEditorModel, startLineNumber) {\n        const startIndent = textEditorModel.getLineFirstNonWhitespaceColumn(startLineNumber);\n        const maxLineNumber = Math.min(textEditorModel.getLineCount(), startLineNumber + GotoDefinitionAtPositionEditorContribution_1.MAX_SOURCE_PREVIEW_LINES);\n        let endLineNumber = startLineNumber + 1;\n        for (; endLineNumber < maxLineNumber; endLineNumber++) {\n            const endIndent = textEditorModel.getLineFirstNonWhitespaceColumn(endLineNumber);\n            if (startIndent === endIndent) {\n                break;\n            }\n        }\n        return new Range(startLineNumber, 1, endLineNumber + 1, 1);\n    }\n    addDecoration(range, hoverMessage) {\n        const newDecorations = {\n            range: range,\n            options: {\n                description: 'goto-definition-link',\n                inlineClassName: 'goto-definition-link',\n                hoverMessage\n            }\n        };\n        this.linkDecorations.set([newDecorations]);\n    }\n    removeLinkDecorations() {\n        this.linkDecorations.clear();\n    }\n    isEnabled(mouseEvent, withKey) {\n        return this.editor.hasModel()\n            && mouseEvent.isLeftClick\n            && mouseEvent.isNoneOrSingleMouseDown\n            && mouseEvent.target.type === 6 /* MouseTargetType.CONTENT_TEXT */\n            && !(mouseEvent.target.detail.injectedText?.options instanceof ModelDecorationInjectedTextOptions)\n            && (mouseEvent.hasTriggerModifier || (withKey ? withKey.keyCodeIsTriggerKey : false))\n            && this.languageFeaturesService.definitionProvider.has(this.editor.getModel());\n    }\n    findDefinition(position, token) {\n        const model = this.editor.getModel();\n        if (!model) {\n            return Promise.resolve(null);\n        }\n        return getDefinitionsAtPosition(this.languageFeaturesService.definitionProvider, model, position, false, token);\n    }\n    async gotoDefinition(position, openToSide) {\n        this.editor.setPosition(position);\n        return this.editor.invokeWithinContext((accessor) => {\n            const canPeek = !openToSide && this.editor.getOption(101 /* EditorOption.definitionLinkOpensInPeek */) && !this.isInPeekEditor(accessor);\n            const action = new DefinitionAction({ openToSide, openInPeek: canPeek, muteMessage: true }, { title: { value: '', original: '' }, id: '', precondition: undefined });\n            return action.run(accessor);\n        });\n    }\n    isInPeekEditor(accessor) {\n        const contextKeyService = accessor.get(IContextKeyService);\n        return PeekContext.inPeekEditor.getValue(contextKeyService);\n    }\n    dispose() {\n        this.toUnhook.dispose();\n        this.toUnhookForKeyboard.dispose();\n    }\n};\nGotoDefinitionAtPositionEditorContribution = GotoDefinitionAtPositionEditorContribution_1 = __decorate([\n    __param(1, ITextModelService),\n    __param(2, ILanguageService),\n    __param(3, ILanguageFeaturesService)\n], GotoDefinitionAtPositionEditorContribution);\nregisterEditorContribution(GotoDefinitionAtPositionEditorContribution.ID, GotoDefinitionAtPositionEditorContribution, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\n\nexport { GotoDefinitionAtPositionEditorContribution };\n","import { getActiveWindow } from '../../../../base/browser/dom.js';\nimport { VSBuffer } from '../../../../base/common/buffer.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { localize2, localize } from '../../../../nls.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IFileService } from '../../../../platform/files/common/files.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { ILogService } from '../../../../platform/log/common/log.js';\nimport { IQuickInputService } from '../../../../platform/quickinput/common/quickInput.js';\nimport { IWorkspaceContextService } from '../../../../platform/workspace/common/workspace.js';\nimport { registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { ensureNonNullable } from '../../../browser/gpu/gpuUtils.js';\nimport { GlyphRasterizer } from '../../../browser/gpu/raster/glyphRasterizer.js';\nimport { ViewGpuContext } from '../../../browser/gpu/viewGpuContext.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DebugEditorGpuRendererAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.debugEditorGpuRenderer',\n            label: localize2(1101, \"Developer: Debug Editor GPU Renderer\"),\n            // TODO: Why doesn't `ContextKeyExpr.equals('config:editor.experimentalGpuAcceleration', 'on')` work?\n            precondition: ContextKeyExpr.true(),\n        });\n    }\n    async run(accessor, editor) {\n        const instantiationService = accessor.get(IInstantiationService);\n        const quickInputService = accessor.get(IQuickInputService);\n        const choice = await quickInputService.pick([\n            {\n                label: localize(1098, \"Log Texture Atlas Stats\"),\n                id: 'logTextureAtlasStats',\n            },\n            {\n                label: localize(1099, \"Save Texture Atlas\"),\n                id: 'saveTextureAtlas',\n            },\n            {\n                label: localize(1100, \"Draw Glyph\"),\n                id: 'drawGlyph',\n            },\n        ], { canPickMany: false });\n        if (!choice) {\n            return;\n        }\n        switch (choice.id) {\n            case 'logTextureAtlasStats':\n                instantiationService.invokeFunction(accessor => {\n                    const logService = accessor.get(ILogService);\n                    const atlas = ViewGpuContext.atlas;\n                    if (!ViewGpuContext.atlas) {\n                        logService.error('No texture atlas found');\n                        return;\n                    }\n                    const stats = atlas.getStats();\n                    logService.info(['Texture atlas stats', ...stats].join('\\n\\n'));\n                });\n                break;\n            case 'saveTextureAtlas':\n                instantiationService.invokeFunction(async (accessor) => {\n                    const workspaceContextService = accessor.get(IWorkspaceContextService);\n                    const fileService = accessor.get(IFileService);\n                    const folders = workspaceContextService.getWorkspace().folders;\n                    if (folders.length > 0) {\n                        const atlas = ViewGpuContext.atlas;\n                        const promises = [];\n                        for (const [layerIndex, page] of atlas.pages.entries()) {\n                            promises.push(...[\n                                fileService.writeFile(URI.joinPath(folders[0].uri, `textureAtlasPage${layerIndex}_actual.png`), VSBuffer.wrap(new Uint8Array(await (await page.source.convertToBlob()).arrayBuffer()))),\n                                fileService.writeFile(URI.joinPath(folders[0].uri, `textureAtlasPage${layerIndex}_usage.png`), VSBuffer.wrap(new Uint8Array(await (await page.getUsagePreview()).arrayBuffer()))),\n                            ]);\n                        }\n                        await Promise.all(promises);\n                    }\n                });\n                break;\n            case 'drawGlyph':\n                instantiationService.invokeFunction(async (accessor) => {\n                    const configurationService = accessor.get(IConfigurationService);\n                    const fileService = accessor.get(IFileService);\n                    const quickInputService = accessor.get(IQuickInputService);\n                    const workspaceContextService = accessor.get(IWorkspaceContextService);\n                    const folders = workspaceContextService.getWorkspace().folders;\n                    if (folders.length === 0) {\n                        return;\n                    }\n                    const atlas = ViewGpuContext.atlas;\n                    const fontFamily = configurationService.getValue('editor.fontFamily');\n                    const fontSize = configurationService.getValue('editor.fontSize');\n                    const rasterizer = new GlyphRasterizer(fontSize, fontFamily, getActiveWindow().devicePixelRatio, ViewGpuContext.decorationStyleCache);\n                    let chars = await quickInputService.input({\n                        prompt: 'Enter a character to draw (prefix with 0x for code point))'\n                    });\n                    if (!chars) {\n                        return;\n                    }\n                    const codePoint = chars.match(/0x(?<codePoint>[0-9a-f]+)/i)?.groups?.codePoint;\n                    if (codePoint !== undefined) {\n                        chars = String.fromCodePoint(parseInt(codePoint, 16));\n                    }\n                    const tokenMetadata = 0;\n                    const charMetadata = 0;\n                    const rasterizedGlyph = atlas.getGlyph(rasterizer, chars, tokenMetadata, charMetadata, 0);\n                    if (!rasterizedGlyph) {\n                        return;\n                    }\n                    const imageData = atlas.pages[rasterizedGlyph.pageIndex].source.getContext('2d')?.getImageData(rasterizedGlyph.x, rasterizedGlyph.y, rasterizedGlyph.w, rasterizedGlyph.h);\n                    if (!imageData) {\n                        return;\n                    }\n                    const canvas = new OffscreenCanvas(imageData.width, imageData.height);\n                    const ctx = ensureNonNullable(canvas.getContext('2d'));\n                    ctx.putImageData(imageData, 0, 0);\n                    const blob = await canvas.convertToBlob({ type: 'image/png' });\n                    const resource = URI.joinPath(folders[0].uri, `glyph_${chars}_${tokenMetadata}_${fontSize}px_${fontFamily.replaceAll(/[,\\\\\\/\\.'\\s]/g, '_')}.png`);\n                    await fileService.writeFile(resource, VSBuffer.wrap(new Uint8Array(await blob.arrayBuffer())));\n                });\n                break;\n        }\n    }\n}\nregisterEditorAction(DebugEditorGpuRendererAction);\n","import { SHOW_OR_FOCUS_HOVER_ACTION_ID, SHOW_DEFINITION_PREVIEW_HOVER_ACTION_ID, HIDE_HOVER_ACTION_ID, SCROLL_UP_HOVER_ACTION_ID, SCROLL_DOWN_HOVER_ACTION_ID, SCROLL_LEFT_HOVER_ACTION_ID, SCROLL_RIGHT_HOVER_ACTION_ID, PAGE_UP_HOVER_ACTION_ID, PAGE_DOWN_HOVER_ACTION_ID, GO_TO_TOP_HOVER_ACTION_ID, GO_TO_BOTTOM_HOVER_ACTION_ID, INCREASE_HOVER_VERBOSITY_ACTION_LABEL, INCREASE_HOVER_VERBOSITY_ACTION_ID, DECREASE_HOVER_VERBOSITY_ACTION_LABEL, DECREASE_HOVER_VERBOSITY_ACTION_ID } from './hoverActionIds.js';\nimport { KeyChord } from '../../../../base/common/keyCodes.js';\nimport { EditorAction } from '../../../browser/editorExtensions.js';\nimport { Range } from '../../../common/core/range.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { GotoDefinitionAtPositionEditorContribution } from '../../gotoSymbol/browser/link/goToDefinitionAtPosition.js';\nimport { ContentHoverController } from './contentHoverController.js';\nimport { HoverVerbosityAction } from '../../../common/languages.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport './hover.css';\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 *--------------------------------------------------------------------------------------------*/\nvar HoverFocusBehavior;\n(function (HoverFocusBehavior) {\n    HoverFocusBehavior[\"NoAutoFocus\"] = \"noAutoFocus\";\n    HoverFocusBehavior[\"FocusIfVisible\"] = \"focusIfVisible\";\n    HoverFocusBehavior[\"AutoFocusImmediately\"] = \"autoFocusImmediately\";\n})(HoverFocusBehavior || (HoverFocusBehavior = {}));\nclass ShowOrFocusHoverAction extends EditorAction {\n    constructor() {\n        super({\n            id: SHOW_OR_FOCUS_HOVER_ACTION_ID,\n            label: localize2(1107, \"Show or Focus Hover\"),\n\n\n\n\n\n\n\n            metadata: {\n                description: localize2(1108, 'Show or focus the editor hover which shows documentation, references, and other content for a symbol at the current cursor position.'),\n                args: [{\n                        name: 'args',\n                        schema: {\n                            type: 'object',\n                            properties: {\n                                'focus': {\n                                    description: 'Controls if and when the hover should take focus upon being triggered by this action.',\n                                    enum: [HoverFocusBehavior.NoAutoFocus, HoverFocusBehavior.FocusIfVisible, HoverFocusBehavior.AutoFocusImmediately],\n                                    enumDescriptions: [\n                                        localize(1104, 'The hover will not automatically take focus.'),\n                                        localize(1105, 'The hover will take focus only if it is already visible.'),\n                                        localize(1106, 'The hover will automatically take focus when it appears.'),\n                                    ],\n                                    default: HoverFocusBehavior.FocusIfVisible,\n                                }\n                            },\n                        }\n                    }]\n            },\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 39 /* KeyCode.KeyI */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(accessor, editor, args) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const controller = ContentHoverController.get(editor);\n        if (!controller) {\n            return;\n        }\n        const focusArgument = args?.focus;\n        let focusOption = HoverFocusBehavior.FocusIfVisible;\n        if (Object.values(HoverFocusBehavior).includes(focusArgument)) {\n            focusOption = focusArgument;\n        }\n        else if (typeof focusArgument === 'boolean' && focusArgument) {\n            focusOption = HoverFocusBehavior.AutoFocusImmediately;\n        }\n        const showContentHover = (focus) => {\n            const position = editor.getPosition();\n            const range = new Range(position.lineNumber, position.column, position.lineNumber, position.column);\n            controller.showContentHover(range, 1 /* HoverStartMode.Immediate */, 2 /* HoverStartSource.Keyboard */, focus);\n        };\n        const accessibilitySupportEnabled = editor.getOption(2 /* EditorOption.accessibilitySupport */) === 2 /* AccessibilitySupport.Enabled */;\n        if (controller.isHoverVisible) {\n            if (focusOption !== HoverFocusBehavior.NoAutoFocus) {\n                controller.focus();\n            }\n            else {\n                showContentHover(accessibilitySupportEnabled);\n            }\n        }\n        else {\n            showContentHover(accessibilitySupportEnabled || focusOption === HoverFocusBehavior.AutoFocusImmediately);\n        }\n    }\n}\nclass ShowDefinitionPreviewHoverAction extends EditorAction {\n    constructor() {\n        super({\n            id: SHOW_DEFINITION_PREVIEW_HOVER_ACTION_ID,\n            label: localize2(1109, \"Show Definition Preview Hover\"),\n\n\n\n\n\n\n            precondition: undefined,\n            metadata: {\n                description: localize2(1110, 'Show the definition preview hover in the editor.'),\n            },\n        });\n    }\n    run(accessor, editor) {\n        const controller = ContentHoverController.get(editor);\n        if (!controller) {\n            return;\n        }\n        const position = editor.getPosition();\n        if (!position) {\n            return;\n        }\n        const range = new Range(position.lineNumber, position.column, position.lineNumber, position.column);\n        const goto = GotoDefinitionAtPositionEditorContribution.get(editor);\n        if (!goto) {\n            return;\n        }\n        const promise = goto.startFindDefinitionFromCursor(position);\n        promise.then(() => {\n            controller.showContentHover(range, 1 /* HoverStartMode.Immediate */, 2 /* HoverStartSource.Keyboard */, true);\n        });\n    }\n}\nclass HideContentHoverAction extends EditorAction {\n    constructor() {\n        super({\n            id: HIDE_HOVER_ACTION_ID,\n            label: localize2(1111, \"Hide Hover\"),\n\n\n\n            alias: 'Hide Content Hover',\n            precondition: undefined\n        });\n    }\n    run(accessor, editor) {\n        ContentHoverController.get(editor)?.hideContentHover();\n    }\n}\nclass ScrollUpHoverAction extends EditorAction {\n    constructor() {\n        super({\n            id: SCROLL_UP_HOVER_ACTION_ID,\n            label: localize2(1112, \"Scroll Up Hover\"),\n\n\n\n\n\n            precondition: EditorContextKeys.hoverFocused,\n            kbOpts: {\n                kbExpr: EditorContextKeys.hoverFocused,\n                primary: 16 /* KeyCode.UpArrow */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: {\n                description: localize2(1113, 'Scroll up the editor hover.')\n            },\n        });\n    }\n    run(accessor, editor) {\n        const controller = ContentHoverController.get(editor);\n        if (!controller) {\n            return;\n        }\n        controller.scrollUp();\n    }\n}\nclass ScrollDownHoverAction extends EditorAction {\n    constructor() {\n        super({\n            id: SCROLL_DOWN_HOVER_ACTION_ID,\n            label: localize2(1114, \"Scroll Down Hover\"),\n\n\n\n\n\n            precondition: EditorContextKeys.hoverFocused,\n            kbOpts: {\n                kbExpr: EditorContextKeys.hoverFocused,\n                primary: 18 /* KeyCode.DownArrow */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: {\n                description: localize2(1115, 'Scroll down the editor hover.'),\n            },\n        });\n    }\n    run(accessor, editor) {\n        const controller = ContentHoverController.get(editor);\n        if (!controller) {\n            return;\n        }\n        controller.scrollDown();\n    }\n}\nclass ScrollLeftHoverAction extends EditorAction {\n    constructor() {\n        super({\n            id: SCROLL_LEFT_HOVER_ACTION_ID,\n            label: localize2(1116, \"Scroll Left Hover\"),\n\n\n\n\n\n            precondition: EditorContextKeys.hoverFocused,\n            kbOpts: {\n                kbExpr: EditorContextKeys.hoverFocused,\n                primary: 15 /* KeyCode.LeftArrow */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: {\n                description: localize2(1117, 'Scroll left the editor hover.'),\n            },\n        });\n    }\n    run(accessor, editor) {\n        const controller = ContentHoverController.get(editor);\n        if (!controller) {\n            return;\n        }\n        controller.scrollLeft();\n    }\n}\nclass ScrollRightHoverAction extends EditorAction {\n    constructor() {\n        super({\n            id: SCROLL_RIGHT_HOVER_ACTION_ID,\n            label: localize2(1118, \"Scroll Right Hover\"),\n\n\n\n\n\n            precondition: EditorContextKeys.hoverFocused,\n            kbOpts: {\n                kbExpr: EditorContextKeys.hoverFocused,\n                primary: 17 /* KeyCode.RightArrow */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: {\n                description: localize2(1119, 'Scroll right the editor hover.')\n            },\n        });\n    }\n    run(accessor, editor) {\n        const controller = ContentHoverController.get(editor);\n        if (!controller) {\n            return;\n        }\n        controller.scrollRight();\n    }\n}\nclass PageUpHoverAction extends EditorAction {\n    constructor() {\n        super({\n            id: PAGE_UP_HOVER_ACTION_ID,\n            label: localize2(1120, \"Page Up Hover\"),\n\n\n\n\n\n            precondition: EditorContextKeys.hoverFocused,\n            kbOpts: {\n                kbExpr: EditorContextKeys.hoverFocused,\n                primary: 11 /* KeyCode.PageUp */,\n                secondary: [512 /* KeyMod.Alt */ | 16 /* KeyCode.UpArrow */],\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: {\n                description: localize2(1121, 'Page up the editor hover.'),\n            },\n        });\n    }\n    run(accessor, editor) {\n        const controller = ContentHoverController.get(editor);\n        if (!controller) {\n            return;\n        }\n        controller.pageUp();\n    }\n}\nclass PageDownHoverAction extends EditorAction {\n    constructor() {\n        super({\n            id: PAGE_DOWN_HOVER_ACTION_ID,\n            label: localize2(1122, \"Page Down Hover\"),\n\n\n\n\n\n            precondition: EditorContextKeys.hoverFocused,\n            kbOpts: {\n                kbExpr: EditorContextKeys.hoverFocused,\n                primary: 12 /* KeyCode.PageDown */,\n                secondary: [512 /* KeyMod.Alt */ | 18 /* KeyCode.DownArrow */],\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: {\n                description: localize2(1123, 'Page down the editor hover.'),\n            },\n        });\n    }\n    run(accessor, editor) {\n        const controller = ContentHoverController.get(editor);\n        if (!controller) {\n            return;\n        }\n        controller.pageDown();\n    }\n}\nclass GoToTopHoverAction extends EditorAction {\n    constructor() {\n        super({\n            id: GO_TO_TOP_HOVER_ACTION_ID,\n            label: localize2(1124, \"Go To Top Hover\"),\n\n\n\n\n\n            precondition: EditorContextKeys.hoverFocused,\n            kbOpts: {\n                kbExpr: EditorContextKeys.hoverFocused,\n                primary: 14 /* KeyCode.Home */,\n                secondary: [2048 /* KeyMod.CtrlCmd */ | 16 /* KeyCode.UpArrow */],\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: {\n                description: localize2(1125, 'Go to the top of the editor hover.'),\n            },\n        });\n    }\n    run(accessor, editor) {\n        const controller = ContentHoverController.get(editor);\n        if (!controller) {\n            return;\n        }\n        controller.goToTop();\n    }\n}\nclass GoToBottomHoverAction extends EditorAction {\n    constructor() {\n        super({\n            id: GO_TO_BOTTOM_HOVER_ACTION_ID,\n            label: localize2(1126, \"Go To Bottom Hover\"),\n\n\n\n\n\n            precondition: EditorContextKeys.hoverFocused,\n            kbOpts: {\n                kbExpr: EditorContextKeys.hoverFocused,\n                primary: 13 /* KeyCode.End */,\n                secondary: [2048 /* KeyMod.CtrlCmd */ | 18 /* KeyCode.DownArrow */],\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: {\n                description: localize2(1127, 'Go to the bottom of the editor hover.')\n            },\n        });\n    }\n    run(accessor, editor) {\n        const controller = ContentHoverController.get(editor);\n        if (!controller) {\n            return;\n        }\n        controller.goToBottom();\n    }\n}\nclass IncreaseHoverVerbosityLevel extends EditorAction {\n    constructor() {\n        super({\n            id: INCREASE_HOVER_VERBOSITY_ACTION_ID,\n            label: INCREASE_HOVER_VERBOSITY_ACTION_LABEL,\n            alias: 'Increase Hover Verbosity Level',\n            precondition: EditorContextKeys.hoverVisible\n        });\n    }\n    run(accessor, editor, args) {\n        const hoverController = ContentHoverController.get(editor);\n        if (!hoverController) {\n            return;\n        }\n        const index = args?.index !== undefined ? args.index : hoverController.focusedHoverPartIndex();\n        hoverController.updateHoverVerbosityLevel(HoverVerbosityAction.Increase, index, args?.focus);\n    }\n}\nclass DecreaseHoverVerbosityLevel extends EditorAction {\n    constructor() {\n        super({\n            id: DECREASE_HOVER_VERBOSITY_ACTION_ID,\n            label: DECREASE_HOVER_VERBOSITY_ACTION_LABEL,\n            alias: 'Decrease Hover Verbosity Level',\n            precondition: EditorContextKeys.hoverVisible\n        });\n    }\n    run(accessor, editor, args) {\n        const hoverController = ContentHoverController.get(editor);\n        if (!hoverController) {\n            return;\n        }\n        const index = args?.index !== undefined ? args.index : hoverController.focusedHoverPartIndex();\n        ContentHoverController.get(editor)?.updateHoverVerbosityLevel(HoverVerbosityAction.Decrease, index, args?.focus);\n    }\n}\n\nexport { DecreaseHoverVerbosityLevel, GoToBottomHoverAction, GoToTopHoverAction, HideContentHoverAction, IncreaseHoverVerbosityLevel, PageDownHoverAction, PageUpHoverAction, ScrollDownHoverAction, ScrollLeftHoverAction, ScrollRightHoverAction, ScrollUpHoverAction, ShowDefinitionPreviewHoverAction, ShowOrFocusHoverAction };\n","import { asArray } from '../../../../base/common/arrays.js';\nimport { isEmptyMarkdownString } from '../../../../base/common/htmlContent.js';\nimport { GlyphMarginLane } from '../../../common/model.js';\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 *--------------------------------------------------------------------------------------------*/\nclass GlyphHoverComputer {\n    constructor(_editor) {\n        this._editor = _editor;\n    }\n    computeSync(opts) {\n        const toHoverMessage = (contents) => {\n            return {\n                value: contents\n            };\n        };\n        const lineDecorations = this._editor.getLineDecorations(opts.lineNumber);\n        const result = [];\n        const isLineHover = opts.laneOrLine === 'lineNo';\n        if (!lineDecorations) {\n            return result;\n        }\n        for (const d of lineDecorations) {\n            const lane = d.options.glyphMargin?.position ?? GlyphMarginLane.Center;\n            if (!isLineHover && lane !== opts.laneOrLine) {\n                continue;\n            }\n            const hoverMessage = isLineHover ? d.options.lineNumberHoverMessage : d.options.glyphMarginHoverMessage;\n            if (!hoverMessage || isEmptyMarkdownString(hoverMessage)) {\n                continue;\n            }\n            result.push(...asArray(hoverMessage).map(toHoverMessage));\n        }\n        return result;\n    }\n}\n\nexport { GlyphHoverComputer };\n","import { addStandardDisposableListener, $ as $$1, append, getDomNodePagePosition } from '../../../../base/browser/dom.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { IMarkdownRendererService } from '../../../../platform/markdown/browser/markdownRenderer.js';\nimport { HoverOperation } from './hoverOperation.js';\nimport { HoverWidget } from '../../../../base/browser/ui/hover/hoverWidget.js';\nimport { GlyphHoverComputer } from './glyphHoverComputer.js';\nimport { isMousePositionWithinElement } from './hoverUtils.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar GlyphHoverWidget_1;\nconst $ = $$1;\nlet GlyphHoverWidget = class GlyphHoverWidget extends Disposable {\n    static { GlyphHoverWidget_1 = this; }\n    static { this.ID = 'editor.contrib.modesGlyphHoverWidget'; }\n    constructor(editor, _markdownRendererService) {\n        super();\n        this._markdownRendererService = _markdownRendererService;\n        this.allowEditorOverflow = true;\n        this._renderDisposeables = this._register(new DisposableStore());\n        this._editor = editor;\n        this._isVisible = false;\n        this._messages = [];\n        this._hover = this._register(new HoverWidget(true));\n        this._hover.containerDomNode.classList.toggle('hidden', !this._isVisible);\n        this._hoverOperation = this._register(new HoverOperation(this._editor, new GlyphHoverComputer(this._editor)));\n        this._register(this._hoverOperation.onResult((result) => this._withResult(result)));\n        this._register(this._editor.onDidChangeModelDecorations(() => this._onModelDecorationsChanged()));\n        this._register(this._editor.onDidChangeConfiguration((e) => {\n            if (e.hasChanged(59 /* EditorOption.fontInfo */)) {\n                this._updateFont();\n            }\n        }));\n        this._register(addStandardDisposableListener(this._hover.containerDomNode, 'mouseleave', (e) => {\n            this._onMouseLeave(e);\n        }));\n        this._editor.addOverlayWidget(this);\n    }\n    dispose() {\n        this._hoverComputerOptions = undefined;\n        this._editor.removeOverlayWidget(this);\n        super.dispose();\n    }\n    getId() {\n        return GlyphHoverWidget_1.ID;\n    }\n    getDomNode() {\n        return this._hover.containerDomNode;\n    }\n    getPosition() {\n        return null;\n    }\n    _updateFont() {\n        // eslint-disable-next-line no-restricted-syntax\n        const codeClasses = Array.prototype.slice.call(this._hover.contentsDomNode.getElementsByClassName('code'));\n        codeClasses.forEach(node => this._editor.applyFontInfo(node));\n    }\n    _onModelDecorationsChanged() {\n        if (this._isVisible && this._hoverComputerOptions) {\n            // The decorations have changed and the hover is visible,\n            // we need to recompute the displayed text\n            this._hoverOperation.cancel();\n            this._hoverOperation.start(0 /* HoverStartMode.Delayed */, this._hoverComputerOptions);\n        }\n    }\n    showsOrWillShow(mouseEvent) {\n        const target = mouseEvent.target;\n        if (target.type === 2 /* MouseTargetType.GUTTER_GLYPH_MARGIN */ && target.detail.glyphMarginLane) {\n            this._startShowingAt(target.position.lineNumber, target.detail.glyphMarginLane);\n            return true;\n        }\n        if (target.type === 3 /* MouseTargetType.GUTTER_LINE_NUMBERS */) {\n            this._startShowingAt(target.position.lineNumber, 'lineNo');\n            return true;\n        }\n        return false;\n    }\n    _startShowingAt(lineNumber, laneOrLine) {\n        if (this._hoverComputerOptions\n            && this._hoverComputerOptions.lineNumber === lineNumber\n            && this._hoverComputerOptions.laneOrLine === laneOrLine) {\n            // We have to show the widget at the exact same line number as before, so no work is needed\n            return;\n        }\n        this._hoverOperation.cancel();\n        this.hide();\n        this._hoverComputerOptions = { lineNumber, laneOrLine };\n        this._hoverOperation.start(0 /* HoverStartMode.Delayed */, this._hoverComputerOptions);\n    }\n    hide() {\n        this._hoverComputerOptions = undefined;\n        this._hoverOperation.cancel();\n        if (!this._isVisible) {\n            return;\n        }\n        this._isVisible = false;\n        this._hover.containerDomNode.classList.toggle('hidden', !this._isVisible);\n    }\n    _withResult(result) {\n        this._messages = result.value;\n        if (this._messages.length > 0) {\n            this._renderMessages(result.options.lineNumber, result.options.laneOrLine, this._messages);\n        }\n        else {\n            this.hide();\n        }\n    }\n    _renderMessages(lineNumber, laneOrLine, messages) {\n        this._renderDisposeables.clear();\n        const fragment = document.createDocumentFragment();\n        for (const msg of messages) {\n            const markdownHoverElement = $('div.hover-row.markdown-hover');\n            const hoverContentsElement = append(markdownHoverElement, $('div.hover-contents'));\n            const renderedContents = this._renderDisposeables.add(this._markdownRendererService.render(msg.value, { context: this._editor }));\n            hoverContentsElement.appendChild(renderedContents.element);\n            fragment.appendChild(markdownHoverElement);\n        }\n        this._updateContents(fragment);\n        this._showAt(lineNumber, laneOrLine);\n    }\n    _updateContents(node) {\n        this._hover.contentsDomNode.textContent = '';\n        this._hover.contentsDomNode.appendChild(node);\n        this._updateFont();\n    }\n    _showAt(lineNumber, laneOrLine) {\n        if (!this._isVisible) {\n            this._isVisible = true;\n            this._hover.containerDomNode.classList.toggle('hidden', !this._isVisible);\n        }\n        const editorLayout = this._editor.getLayoutInfo();\n        const topForLineNumber = this._editor.getTopForLineNumber(lineNumber);\n        const editorScrollTop = this._editor.getScrollTop();\n        const lineHeight = this._editor.getOption(75 /* EditorOption.lineHeight */);\n        const nodeHeight = this._hover.containerDomNode.clientHeight;\n        const top = topForLineNumber - editorScrollTop - ((nodeHeight - lineHeight) / 2);\n        const left = editorLayout.glyphMarginLeft + editorLayout.glyphMarginWidth + (laneOrLine === 'lineNo' ? editorLayout.lineNumbersWidth : 0);\n        // Constrain the hover widget to stay within the editor bounds\n        const editorHeight = editorLayout.height;\n        const maxTop = editorHeight - nodeHeight;\n        const constrainedTop = Math.max(0, Math.min(Math.round(top), maxTop));\n        const fixedOverflowWidgets = this._editor.getOption(51 /* EditorOption.fixedOverflowWidgets */);\n        if (fixedOverflowWidgets) {\n            // Use fixed positioning relative to the viewport\n            const editorDomNode = this._editor.getDomNode();\n            if (editorDomNode) {\n                const editorRect = getDomNodePagePosition(editorDomNode);\n                this._hover.containerDomNode.style.position = 'fixed';\n                this._hover.containerDomNode.style.left = `${editorRect.left + left}px`;\n                this._hover.containerDomNode.style.top = `${editorRect.top + constrainedTop}px`;\n            }\n        }\n        else {\n            // Use absolute positioning relative to the editor\n            this._hover.containerDomNode.style.position = 'absolute';\n            this._hover.containerDomNode.style.left = `${left}px`;\n            this._hover.containerDomNode.style.top = `${constrainedTop}px`;\n        }\n        this._hover.containerDomNode.style.zIndex = '11'; // 1 more than the zone widget at 10 (#233819)\n    }\n    _onMouseLeave(e) {\n        const editorDomNode = this._editor.getDomNode();\n        const isMousePositionOutsideOfEditor = !editorDomNode || !isMousePositionWithinElement(editorDomNode, e.x, e.y);\n        if (isMousePositionOutsideOfEditor) {\n            this.hide();\n        }\n    }\n};\nGlyphHoverWidget = GlyphHoverWidget_1 = __decorate([\n    __param(1, IMarkdownRendererService)\n], GlyphHoverWidget);\n\nexport { GlyphHoverWidget };\n","import { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { isMousePositionWithinElement } from './hoverUtils.js';\nimport './hover.css';\nimport { GlyphHoverWidget } from './glyphHoverWidget.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet GlyphHoverController = class GlyphHoverController extends Disposable {\n    static { this.ID = 'editor.contrib.marginHover'; }\n    constructor(_editor, _instantiationService) {\n        super();\n        this._editor = _editor;\n        this._instantiationService = _instantiationService;\n        this.shouldKeepOpenOnEditorMouseMoveOrLeave = false;\n        this._listenersStore = new DisposableStore();\n        this._hoverState = {\n            mouseDown: false\n        };\n        this._reactToEditorMouseMoveRunner = this._register(new RunOnceScheduler(() => this._reactToEditorMouseMove(this._mouseMoveEvent), 0));\n        this._hookListeners();\n        this._register(this._editor.onDidChangeConfiguration((e) => {\n            if (e.hasChanged(69 /* EditorOption.hover */)) {\n                this._unhookListeners();\n                this._hookListeners();\n            }\n        }));\n    }\n    _hookListeners() {\n        const hoverOpts = this._editor.getOption(69 /* EditorOption.hover */);\n        this._hoverSettings = {\n            enabled: hoverOpts.enabled,\n            sticky: hoverOpts.sticky,\n            hidingDelay: hoverOpts.hidingDelay\n        };\n        if (hoverOpts.enabled) {\n            this._listenersStore.add(this._editor.onMouseDown((e) => this._onEditorMouseDown(e)));\n            this._listenersStore.add(this._editor.onMouseUp(() => this._onEditorMouseUp()));\n            this._listenersStore.add(this._editor.onMouseMove((e) => this._onEditorMouseMove(e)));\n            this._listenersStore.add(this._editor.onKeyDown((e) => this._onKeyDown(e)));\n        }\n        else {\n            this._listenersStore.add(this._editor.onMouseMove((e) => this._onEditorMouseMove(e)));\n            this._listenersStore.add(this._editor.onKeyDown((e) => this._onKeyDown(e)));\n        }\n        this._listenersStore.add(this._editor.onMouseLeave((e) => this._onEditorMouseLeave(e)));\n        this._listenersStore.add(this._editor.onDidChangeModel(() => {\n            this._cancelScheduler();\n            this.hideGlyphHover();\n        }));\n        this._listenersStore.add(this._editor.onDidChangeModelContent(() => this._cancelScheduler()));\n        this._listenersStore.add(this._editor.onDidScrollChange((e) => this._onEditorScrollChanged(e)));\n    }\n    _unhookListeners() {\n        this._listenersStore.clear();\n    }\n    _cancelScheduler() {\n        this._mouseMoveEvent = undefined;\n        this._reactToEditorMouseMoveRunner.cancel();\n    }\n    _onEditorScrollChanged(e) {\n        if (e.scrollTopChanged || e.scrollLeftChanged) {\n            this.hideGlyphHover();\n        }\n    }\n    _onEditorMouseDown(mouseEvent) {\n        this._hoverState.mouseDown = true;\n        const shouldNotHideCurrentHoverWidget = this._isMouseOnGlyphHoverWidget(mouseEvent);\n        if (shouldNotHideCurrentHoverWidget) {\n            return;\n        }\n        this.hideGlyphHover();\n    }\n    _isMouseOnGlyphHoverWidget(mouseEvent) {\n        const glyphHoverWidgetNode = this._glyphWidget?.getDomNode();\n        if (glyphHoverWidgetNode) {\n            return isMousePositionWithinElement(glyphHoverWidgetNode, mouseEvent.event.posx, mouseEvent.event.posy);\n        }\n        return false;\n    }\n    _onEditorMouseUp() {\n        this._hoverState.mouseDown = false;\n    }\n    _onEditorMouseLeave(mouseEvent) {\n        if (this.shouldKeepOpenOnEditorMouseMoveOrLeave) {\n            return;\n        }\n        this._cancelScheduler();\n        const shouldNotHideCurrentHoverWidget = this._isMouseOnGlyphHoverWidget(mouseEvent);\n        if (shouldNotHideCurrentHoverWidget) {\n            return;\n        }\n        this.hideGlyphHover();\n    }\n    _shouldNotRecomputeCurrentHoverWidget(mouseEvent) {\n        const isHoverSticky = this._hoverSettings.sticky;\n        const isMouseOnGlyphHoverWidget = this._isMouseOnGlyphHoverWidget(mouseEvent);\n        return isHoverSticky && isMouseOnGlyphHoverWidget;\n    }\n    _onEditorMouseMove(mouseEvent) {\n        if (this.shouldKeepOpenOnEditorMouseMoveOrLeave) {\n            return;\n        }\n        this._mouseMoveEvent = mouseEvent;\n        const shouldNotRecomputeCurrentHoverWidget = this._shouldNotRecomputeCurrentHoverWidget(mouseEvent);\n        if (shouldNotRecomputeCurrentHoverWidget) {\n            this._reactToEditorMouseMoveRunner.cancel();\n            return;\n        }\n        this._reactToEditorMouseMove(mouseEvent);\n    }\n    _reactToEditorMouseMove(mouseEvent) {\n        if (!mouseEvent) {\n            return;\n        }\n        const glyphWidgetShowsOrWillShow = this._tryShowHoverWidget(mouseEvent);\n        if (glyphWidgetShowsOrWillShow) {\n            return;\n        }\n        this.hideGlyphHover();\n    }\n    _tryShowHoverWidget(mouseEvent) {\n        const glyphWidget = this._getOrCreateGlyphWidget();\n        return glyphWidget.showsOrWillShow(mouseEvent);\n    }\n    _onKeyDown(e) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        if (e.keyCode === 5 /* KeyCode.Ctrl */\n            || e.keyCode === 6 /* KeyCode.Alt */\n            || e.keyCode === 57 /* KeyCode.Meta */\n            || e.keyCode === 4 /* KeyCode.Shift */) {\n            // Do not hide hover when a modifier key is pressed\n            return;\n        }\n        this.hideGlyphHover();\n    }\n    hideGlyphHover() {\n        this._glyphWidget?.hide();\n    }\n    _getOrCreateGlyphWidget() {\n        if (!this._glyphWidget) {\n            this._glyphWidget = this._instantiationService.createInstance(GlyphHoverWidget, this._editor);\n        }\n        return this._glyphWidget;\n    }\n    dispose() {\n        super.dispose();\n        this._unhookListeners();\n        this._listenersStore.dispose();\n        this._glyphWidget?.dispose();\n    }\n};\nGlyphHoverController = __decorate([\n    __param(1, IInstantiationService)\n], GlyphHoverController);\n\nexport { GlyphHoverController };\n","class HoverAccessibleView {\n}\nclass HoverAccessibilityHelp {\n}\nclass ExtHoverAccessibleView {\n}\n\nexport { ExtHoverAccessibleView, HoverAccessibilityHelp, HoverAccessibleView };\n","import { ShowOrFocusHoverAction, ShowDefinitionPreviewHoverAction, HideContentHoverAction, ScrollUpHoverAction, ScrollDownHoverAction, ScrollLeftHoverAction, ScrollRightHoverAction, PageUpHoverAction, PageDownHoverAction, GoToTopHoverAction, GoToBottomHoverAction, IncreaseHoverVerbosityLevel, DecreaseHoverVerbosityLevel } from './hoverActions.js';\nimport { registerEditorContribution, registerEditorAction } from '../../../browser/editorExtensions.js';\nimport '../../../../platform/theme/common/colorUtils.js';\nimport '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorHoverBorder } from '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { registerThemingParticipant } from '../../../../platform/theme/common/themeService.js';\nimport { HoverParticipantRegistry } from './hoverTypes.js';\nimport { MarkdownHoverParticipant } from './markdownHoverParticipant.js';\nimport { MarkerHoverParticipant } from './markerHoverParticipant.js';\nimport { ContentHoverController } from './contentHoverController.js';\nimport { GlyphHoverController } from './glyphHoverController.js';\nimport './hover.css';\nimport { AccessibleViewRegistry } from '../../../../platform/accessibility/browser/accessibleViewRegistry.js';\nimport { HoverAccessibleView, HoverAccessibilityHelp, ExtHoverAccessibleView } from './hoverAccessibleViews.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterEditorContribution(ContentHoverController.ID, ContentHoverController, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\nregisterEditorContribution(GlyphHoverController.ID, GlyphHoverController, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\nregisterEditorAction(ShowOrFocusHoverAction);\nregisterEditorAction(ShowDefinitionPreviewHoverAction);\nregisterEditorAction(HideContentHoverAction);\nregisterEditorAction(ScrollUpHoverAction);\nregisterEditorAction(ScrollDownHoverAction);\nregisterEditorAction(ScrollLeftHoverAction);\nregisterEditorAction(ScrollRightHoverAction);\nregisterEditorAction(PageUpHoverAction);\nregisterEditorAction(PageDownHoverAction);\nregisterEditorAction(GoToTopHoverAction);\nregisterEditorAction(GoToBottomHoverAction);\nregisterEditorAction(IncreaseHoverVerbosityLevel);\nregisterEditorAction(DecreaseHoverVerbosityLevel);\nHoverParticipantRegistry.register(MarkdownHoverParticipant);\nHoverParticipantRegistry.register(MarkerHoverParticipant);\n// theming\nregisterThemingParticipant((theme, collector) => {\n    const hoverBorder = theme.getColor(editorHoverBorder);\n    if (hoverBorder) {\n        collector.addRule(`.monaco-editor .monaco-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`);\n        collector.addRule(`.monaco-editor .monaco-hover hr { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`);\n        collector.addRule(`.monaco-editor .monaco-hover hr { border-bottom: 0px solid ${hoverBorder.transparent(0.5)}; }`);\n    }\n});\nAccessibleViewRegistry.register(new HoverAccessibleView());\nAccessibleViewRegistry.register(new HoverAccessibilityHelp());\nAccessibleViewRegistry.register(new ExtHoverAccessibleView());\n","import { getLeadingWhitespace } from '../../../../base/common/strings.js';\nimport { ShiftCommand } from '../../../common/commands/shiftCommand.js';\nimport { EditOperation } from '../../../common/core/editOperation.js';\nimport { normalizeIndentation } from '../../../common/core/misc/indentation.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { ProcessedIndentRulesSupport } from '../../../common/languages/supports/indentationLineProcessor.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction getReindentEditOperations(model, languageConfigurationService, startLineNumber, endLineNumber) {\n    if (model.getLineCount() === 1 && model.getLineMaxColumn(1) === 1) {\n        // Model is empty\n        return [];\n    }\n    const indentationRulesSupport = languageConfigurationService.getLanguageConfiguration(model.getLanguageId()).indentRulesSupport;\n    if (!indentationRulesSupport) {\n        return [];\n    }\n    const processedIndentRulesSupport = new ProcessedIndentRulesSupport(model, indentationRulesSupport, languageConfigurationService);\n    endLineNumber = Math.min(endLineNumber, model.getLineCount());\n    // Skip `unIndentedLinePattern` lines\n    while (startLineNumber <= endLineNumber) {\n        if (!processedIndentRulesSupport.shouldIgnore(startLineNumber)) {\n            break;\n        }\n        startLineNumber++;\n    }\n    if (startLineNumber > endLineNumber - 1) {\n        return [];\n    }\n    const { tabSize, indentSize, insertSpaces } = model.getOptions();\n    const shiftIndent = (indentation, count) => {\n        count = count || 1;\n        return ShiftCommand.shiftIndent(indentation, indentation.length + count, tabSize, indentSize, insertSpaces);\n    };\n    const unshiftIndent = (indentation, count) => {\n        count = count || 1;\n        return ShiftCommand.unshiftIndent(indentation, indentation.length + count, tabSize, indentSize, insertSpaces);\n    };\n    const indentEdits = [];\n    // indentation being passed to lines below\n    // Calculate indentation for the first line\n    // If there is no passed-in indentation, we use the indentation of the first line as base.\n    const currentLineText = model.getLineContent(startLineNumber);\n    let globalIndent = getLeadingWhitespace(currentLineText);\n    // idealIndentForNextLine doesn't equal globalIndent when there is a line matching `indentNextLinePattern`.\n    let idealIndentForNextLine = globalIndent;\n    if (processedIndentRulesSupport.shouldIncrease(startLineNumber)) {\n        idealIndentForNextLine = shiftIndent(idealIndentForNextLine);\n        globalIndent = shiftIndent(globalIndent);\n    }\n    else if (processedIndentRulesSupport.shouldIndentNextLine(startLineNumber)) {\n        idealIndentForNextLine = shiftIndent(idealIndentForNextLine);\n    }\n    startLineNumber++;\n    // Calculate indentation adjustment for all following lines\n    for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n        if (doesLineStartWithString(model, lineNumber)) {\n            continue;\n        }\n        const text = model.getLineContent(lineNumber);\n        const oldIndentation = getLeadingWhitespace(text);\n        const currentIdealIndent = idealIndentForNextLine;\n        if (processedIndentRulesSupport.shouldDecrease(lineNumber, currentIdealIndent)) {\n            idealIndentForNextLine = unshiftIndent(idealIndentForNextLine);\n            globalIndent = unshiftIndent(globalIndent);\n        }\n        if (oldIndentation !== idealIndentForNextLine) {\n            indentEdits.push(EditOperation.replaceMove(new Selection(lineNumber, 1, lineNumber, oldIndentation.length + 1), normalizeIndentation(idealIndentForNextLine, indentSize, insertSpaces)));\n        }\n        // calculate idealIndentForNextLine\n        if (processedIndentRulesSupport.shouldIgnore(lineNumber)) {\n            // In reindent phase, if the line matches `unIndentedLinePattern` we inherit indentation from above lines\n            // but don't change globalIndent and idealIndentForNextLine.\n            continue;\n        }\n        else if (processedIndentRulesSupport.shouldIncrease(lineNumber, currentIdealIndent)) {\n            globalIndent = shiftIndent(globalIndent);\n            idealIndentForNextLine = globalIndent;\n        }\n        else if (processedIndentRulesSupport.shouldIndentNextLine(lineNumber, currentIdealIndent)) {\n            idealIndentForNextLine = shiftIndent(idealIndentForNextLine);\n        }\n        else {\n            idealIndentForNextLine = globalIndent;\n        }\n    }\n    return indentEdits;\n}\nfunction doesLineStartWithString(model, lineNumber) {\n    if (!model.tokenization.isCheapToTokenize(lineNumber)) {\n        return false;\n    }\n    const lineTokens = model.tokenization.getLineTokens(lineNumber);\n    return lineTokens.getStandardTokenType(0) === 2 /* StandardTokenType.String */;\n}\n\nexport { getReindentEditOperations };\n","import { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { getLeadingWhitespace } from '../../../../base/common/strings.js';\nimport { localize2, localize } from '../../../../nls.js';\nimport { IQuickInputService } from '../../../../platform/quickinput/common/quickInput.js';\nimport { EditorAction, registerEditorContribution, registerEditorAction } from '../../../browser/editorExtensions.js';\nimport { ShiftCommand } from '../../../common/commands/shiftCommand.js';\nimport { Range } from '../../../common/core/range.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { getGoodIndentForLine, getIndentMetadata } from '../../../common/languages/autoIndent.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { IModelService } from '../../../common/services/model.js';\nimport { getStandardTokenTypeAtPosition } from '../../../common/tokens/lineTokens.js';\nimport { getReindentEditOperations } from '../common/indentation.js';\nimport { getSpaceCnt, generateIndent } from '../common/indentUtils.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass IndentationToSpacesAction extends EditorAction {\n    static { this.ID = 'editor.action.indentationToSpaces'; }\n    constructor() {\n        super({\n            id: IndentationToSpacesAction.ID,\n            label: localize2(1148, \"Convert Indentation to Spaces\"),\n            precondition: EditorContextKeys.writable,\n            metadata: {\n                description: localize2(1149, \"Convert the tab indentation to spaces.\"),\n            }\n        });\n    }\n    run(accessor, editor) {\n        const model = editor.getModel();\n        if (!model) {\n            return;\n        }\n        const modelOpts = model.getOptions();\n        const selection = editor.getSelection();\n        if (!selection) {\n            return;\n        }\n        const command = new IndentationToSpacesCommand(selection, modelOpts.tabSize);\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, [command]);\n        editor.pushUndoStop();\n        model.updateOptions({\n            insertSpaces: true\n        });\n    }\n}\nclass IndentationToTabsAction extends EditorAction {\n    static { this.ID = 'editor.action.indentationToTabs'; }\n    constructor() {\n        super({\n            id: IndentationToTabsAction.ID,\n            label: localize2(1150, \"Convert Indentation to Tabs\"),\n            precondition: EditorContextKeys.writable,\n            metadata: {\n                description: localize2(1151, \"Convert the spaces indentation to tabs.\"),\n            }\n        });\n    }\n    run(accessor, editor) {\n        const model = editor.getModel();\n        if (!model) {\n            return;\n        }\n        const modelOpts = model.getOptions();\n        const selection = editor.getSelection();\n        if (!selection) {\n            return;\n        }\n        const command = new IndentationToTabsCommand(selection, modelOpts.tabSize);\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, [command]);\n        editor.pushUndoStop();\n        model.updateOptions({\n            insertSpaces: false\n        });\n    }\n}\nclass ChangeIndentationSizeAction extends EditorAction {\n    constructor(insertSpaces, displaySizeOnly, opts) {\n        super(opts);\n        this.insertSpaces = insertSpaces;\n        this.displaySizeOnly = displaySizeOnly;\n    }\n    run(accessor, editor) {\n        const quickInputService = accessor.get(IQuickInputService);\n        const modelService = accessor.get(IModelService);\n        const model = editor.getModel();\n        if (!model) {\n            return;\n        }\n        const creationOpts = modelService.getCreationOptions(model.getLanguageId(), model.uri, model.isForSimpleWidget);\n        const modelOpts = model.getOptions();\n        const picks = [1, 2, 3, 4, 5, 6, 7, 8].map(n => ({\n            id: n.toString(),\n            label: n.toString(),\n            // add description for tabSize value set in the configuration\n            description: (n === creationOpts.tabSize && n === modelOpts.tabSize\n                ? localize(1144, \"Configured Tab Size\")\n                : n === creationOpts.tabSize\n                    ? localize(1145, \"Default Tab Size\")\n                    : n === modelOpts.tabSize\n                        ? localize(1146, \"Current Tab Size\")\n                        : undefined)\n        }));\n        // auto focus the tabSize set for the current editor\n        const autoFocusIndex = Math.min(model.getOptions().tabSize - 1, 7);\n        setTimeout(() => {\n            quickInputService.pick(picks, { placeHolder: localize(1147, \"Select Tab Size for Current File\"), activeItem: picks[autoFocusIndex] }).then(pick => {\n                if (pick) {\n                    if (model && !model.isDisposed()) {\n                        const pickedVal = parseInt(pick.label, 10);\n                        if (this.displaySizeOnly) {\n                            model.updateOptions({\n                                tabSize: pickedVal\n                            });\n                        }\n                        else {\n                            model.updateOptions({\n                                tabSize: pickedVal,\n                                indentSize: pickedVal,\n                                insertSpaces: this.insertSpaces\n                            });\n                        }\n                    }\n                }\n            });\n        }, 50 /* quick input is sensitive to being opened so soon after another */);\n    }\n}\nclass IndentUsingTabs extends ChangeIndentationSizeAction {\n    static { this.ID = 'editor.action.indentUsingTabs'; }\n    constructor() {\n        super(false, false, {\n            id: IndentUsingTabs.ID,\n            label: localize2(1152, \"Indent Using Tabs\"),\n            precondition: undefined,\n            metadata: {\n                description: localize2(1153, \"Use indentation with tabs.\"),\n            }\n        });\n    }\n}\nclass IndentUsingSpaces extends ChangeIndentationSizeAction {\n    static { this.ID = 'editor.action.indentUsingSpaces'; }\n    constructor() {\n        super(true, false, {\n            id: IndentUsingSpaces.ID,\n            label: localize2(1154, \"Indent Using Spaces\"),\n            precondition: undefined,\n            metadata: {\n                description: localize2(1155, \"Use indentation with spaces.\"),\n            }\n        });\n    }\n}\nclass ChangeTabDisplaySize extends ChangeIndentationSizeAction {\n    static { this.ID = 'editor.action.changeTabDisplaySize'; }\n    constructor() {\n        super(true, true, {\n            id: ChangeTabDisplaySize.ID,\n            label: localize2(1156, \"Change Tab Display Size\"),\n            precondition: undefined,\n            metadata: {\n                description: localize2(1157, \"Change the space size equivalent of the tab.\"),\n            }\n        });\n    }\n}\nclass DetectIndentation extends EditorAction {\n    static { this.ID = 'editor.action.detectIndentation'; }\n    constructor() {\n        super({\n            id: DetectIndentation.ID,\n            label: localize2(1158, \"Detect Indentation from Content\"),\n            precondition: undefined,\n            metadata: {\n                description: localize2(1159, \"Detect the indentation from content.\"),\n            }\n        });\n    }\n    run(accessor, editor) {\n        const modelService = accessor.get(IModelService);\n        const model = editor.getModel();\n        if (!model) {\n            return;\n        }\n        const creationOpts = modelService.getCreationOptions(model.getLanguageId(), model.uri, model.isForSimpleWidget);\n        model.detectIndentation(creationOpts.insertSpaces, creationOpts.tabSize);\n    }\n}\nclass ReindentLinesAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.reindentlines',\n            label: localize2(1160, \"Reindent Lines\"),\n            precondition: EditorContextKeys.writable,\n            metadata: {\n                description: localize2(1161, \"Reindent the lines of the editor.\"),\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(accessor, editor) {\n        const languageConfigurationService = accessor.get(ILanguageConfigurationService);\n        const model = editor.getModel();\n        if (!model) {\n            return;\n        }\n        const edits = getReindentEditOperations(model, languageConfigurationService, 1, model.getLineCount());\n        if (edits.length > 0) {\n            editor.pushUndoStop();\n            editor.executeEdits(this.id, edits);\n            editor.pushUndoStop();\n        }\n    }\n}\nclass ReindentSelectedLinesAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.reindentselectedlines',\n            label: localize2(1162, \"Reindent Selected Lines\"),\n            precondition: EditorContextKeys.writable,\n            metadata: {\n                description: localize2(1163, \"Reindent the selected lines of the editor.\"),\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    run(accessor, editor) {\n        const languageConfigurationService = accessor.get(ILanguageConfigurationService);\n        const model = editor.getModel();\n        if (!model) {\n            return;\n        }\n        const selections = editor.getSelections();\n        if (selections === null) {\n            return;\n        }\n        const edits = [];\n        for (const selection of selections) {\n            let startLineNumber = selection.startLineNumber;\n            let endLineNumber = selection.endLineNumber;\n            if (startLineNumber !== endLineNumber && selection.endColumn === 1) {\n                endLineNumber--;\n            }\n            if (startLineNumber === 1) {\n                if (startLineNumber === endLineNumber) {\n                    continue;\n                }\n            }\n            else {\n                startLineNumber--;\n            }\n            const editOperations = getReindentEditOperations(model, languageConfigurationService, startLineNumber, endLineNumber);\n            edits.push(...editOperations);\n        }\n        if (edits.length > 0) {\n            editor.pushUndoStop();\n            editor.executeEdits(this.id, edits);\n            editor.pushUndoStop();\n        }\n    }\n}\nclass AutoIndentOnPasteCommand {\n    constructor(edits, initialSelection) {\n        this._initialSelection = initialSelection;\n        this._edits = [];\n        this._selectionId = null;\n        for (const edit of edits) {\n            if (edit.range && typeof edit.text === 'string') {\n                this._edits.push(edit);\n            }\n        }\n    }\n    getEditOperations(model, builder) {\n        for (const edit of this._edits) {\n            builder.addEditOperation(Range.lift(edit.range), edit.text);\n        }\n        let selectionIsSet = false;\n        if (Array.isArray(this._edits) && this._edits.length === 1 && this._initialSelection.isEmpty()) {\n            if (this._edits[0].range.startColumn === this._initialSelection.endColumn &&\n                this._edits[0].range.startLineNumber === this._initialSelection.endLineNumber) {\n                selectionIsSet = true;\n                this._selectionId = builder.trackSelection(this._initialSelection, true);\n            }\n            else if (this._edits[0].range.endColumn === this._initialSelection.startColumn &&\n                this._edits[0].range.endLineNumber === this._initialSelection.startLineNumber) {\n                selectionIsSet = true;\n                this._selectionId = builder.trackSelection(this._initialSelection, false);\n            }\n        }\n        if (!selectionIsSet) {\n            this._selectionId = builder.trackSelection(this._initialSelection);\n        }\n    }\n    computeCursorState(model, helper) {\n        return helper.getTrackedSelection(this._selectionId);\n    }\n}\nlet AutoIndentOnPaste = class AutoIndentOnPaste {\n    static { this.ID = 'editor.contrib.autoIndentOnPaste'; }\n    constructor(editor, _languageConfigurationService) {\n        this.editor = editor;\n        this._languageConfigurationService = _languageConfigurationService;\n        this.callOnDispose = new DisposableStore();\n        this.callOnModel = new DisposableStore();\n        this.callOnDispose.add(editor.onDidChangeConfiguration(() => this.update()));\n        this.callOnDispose.add(editor.onDidChangeModel(() => this.update()));\n        this.callOnDispose.add(editor.onDidChangeModelLanguage(() => this.update()));\n    }\n    update() {\n        // clean up\n        this.callOnModel.clear();\n        // we are disabled\n        if (!this.editor.getOption(17 /* EditorOption.autoIndentOnPaste */) || this.editor.getOption(16 /* EditorOption.autoIndent */) < 4 /* EditorAutoIndentStrategy.Full */) {\n            return;\n        }\n        // no model\n        if (!this.editor.hasModel()) {\n            return;\n        }\n        this.callOnModel.add(this.editor.onDidPaste(({ range }) => {\n            this.trigger(range);\n        }));\n    }\n    trigger(range) {\n        const selections = this.editor.getSelections();\n        if (selections === null || selections.length > 1) {\n            return;\n        }\n        const model = this.editor.getModel();\n        if (!model) {\n            return;\n        }\n        const containsOnlyWhitespace = this.rangeContainsOnlyWhitespaceCharacters(model, range);\n        if (containsOnlyWhitespace) {\n            return;\n        }\n        if (!this.editor.getOption(18 /* EditorOption.autoIndentOnPasteWithinString */) && isStartOrEndInString(model, range)) {\n            return;\n        }\n        if (!model.tokenization.isCheapToTokenize(range.getStartPosition().lineNumber)) {\n            return;\n        }\n        const autoIndent = this.editor.getOption(16 /* EditorOption.autoIndent */);\n        const { tabSize, indentSize, insertSpaces } = model.getOptions();\n        const textEdits = [];\n        const indentConverter = {\n            shiftIndent: (indentation) => {\n                return ShiftCommand.shiftIndent(indentation, indentation.length + 1, tabSize, indentSize, insertSpaces);\n            },\n            unshiftIndent: (indentation) => {\n                return ShiftCommand.unshiftIndent(indentation, indentation.length + 1, tabSize, indentSize, insertSpaces);\n            }\n        };\n        let startLineNumber = range.startLineNumber;\n        let firstLineText = model.getLineContent(startLineNumber);\n        if (!/\\S/.test(firstLineText.substring(0, range.startColumn - 1))) {\n            const indentOfFirstLine = getGoodIndentForLine(autoIndent, model, model.getLanguageId(), startLineNumber, indentConverter, this._languageConfigurationService);\n            if (indentOfFirstLine !== null) {\n                const oldIndentation = getLeadingWhitespace(firstLineText);\n                const newSpaceCnt = getSpaceCnt(indentOfFirstLine, tabSize);\n                const oldSpaceCnt = getSpaceCnt(oldIndentation, tabSize);\n                if (newSpaceCnt !== oldSpaceCnt) {\n                    const newIndent = generateIndent(newSpaceCnt, tabSize, insertSpaces);\n                    textEdits.push({\n                        range: new Range(startLineNumber, 1, startLineNumber, oldIndentation.length + 1),\n                        text: newIndent\n                    });\n                    firstLineText = newIndent + firstLineText.substring(oldIndentation.length);\n                }\n                else {\n                    const indentMetadata = getIndentMetadata(model, startLineNumber, this._languageConfigurationService);\n                    if (indentMetadata === 0 || indentMetadata === 8 /* IndentConsts.UNINDENT_MASK */) {\n                        // we paste content into a line where only contains whitespaces\n                        // after pasting, the indentation of the first line is already correct\n                        // the first line doesn't match any indentation rule\n                        // then no-op.\n                        return;\n                    }\n                }\n            }\n        }\n        const firstLineNumber = startLineNumber;\n        // ignore empty or ignored lines\n        while (startLineNumber < range.endLineNumber) {\n            if (!/\\S/.test(model.getLineContent(startLineNumber + 1))) {\n                startLineNumber++;\n                continue;\n            }\n            break;\n        }\n        if (startLineNumber !== range.endLineNumber) {\n            const virtualModel = {\n                tokenization: {\n                    getLineTokens: (lineNumber) => {\n                        return model.tokenization.getLineTokens(lineNumber);\n                    },\n                    getLanguageId: () => {\n                        return model.getLanguageId();\n                    },\n                    getLanguageIdAtPosition: (lineNumber, column) => {\n                        return model.getLanguageIdAtPosition(lineNumber, column);\n                    },\n                },\n                getLineContent: (lineNumber) => {\n                    if (lineNumber === firstLineNumber) {\n                        return firstLineText;\n                    }\n                    else {\n                        return model.getLineContent(lineNumber);\n                    }\n                }\n            };\n            const indentOfSecondLine = getGoodIndentForLine(autoIndent, virtualModel, model.getLanguageId(), startLineNumber + 1, indentConverter, this._languageConfigurationService);\n            if (indentOfSecondLine !== null) {\n                const newSpaceCntOfSecondLine = getSpaceCnt(indentOfSecondLine, tabSize);\n                const oldSpaceCntOfSecondLine = getSpaceCnt(getLeadingWhitespace(model.getLineContent(startLineNumber + 1)), tabSize);\n                if (newSpaceCntOfSecondLine !== oldSpaceCntOfSecondLine) {\n                    const spaceCntOffset = newSpaceCntOfSecondLine - oldSpaceCntOfSecondLine;\n                    for (let i = startLineNumber + 1; i <= range.endLineNumber; i++) {\n                        const lineContent = model.getLineContent(i);\n                        const originalIndent = getLeadingWhitespace(lineContent);\n                        const originalSpacesCnt = getSpaceCnt(originalIndent, tabSize);\n                        const newSpacesCnt = originalSpacesCnt + spaceCntOffset;\n                        const newIndent = generateIndent(newSpacesCnt, tabSize, insertSpaces);\n                        if (newIndent !== originalIndent) {\n                            textEdits.push({\n                                range: new Range(i, 1, i, originalIndent.length + 1),\n                                text: newIndent\n                            });\n                        }\n                    }\n                }\n            }\n        }\n        if (textEdits.length > 0) {\n            this.editor.pushUndoStop();\n            const cmd = new AutoIndentOnPasteCommand(textEdits, this.editor.getSelection());\n            this.editor.executeCommand('autoIndentOnPaste', cmd);\n            this.editor.pushUndoStop();\n        }\n    }\n    rangeContainsOnlyWhitespaceCharacters(model, range) {\n        const lineContainsOnlyWhitespace = (content) => {\n            return content.trim().length === 0;\n        };\n        let containsOnlyWhitespace = true;\n        if (range.startLineNumber === range.endLineNumber) {\n            const lineContent = model.getLineContent(range.startLineNumber);\n            const linePart = lineContent.substring(range.startColumn - 1, range.endColumn - 1);\n            containsOnlyWhitespace = lineContainsOnlyWhitespace(linePart);\n        }\n        else {\n            for (let i = range.startLineNumber; i <= range.endLineNumber; i++) {\n                const lineContent = model.getLineContent(i);\n                if (i === range.startLineNumber) {\n                    const linePart = lineContent.substring(range.startColumn - 1);\n                    containsOnlyWhitespace = lineContainsOnlyWhitespace(linePart);\n                }\n                else if (i === range.endLineNumber) {\n                    const linePart = lineContent.substring(0, range.endColumn - 1);\n                    containsOnlyWhitespace = lineContainsOnlyWhitespace(linePart);\n                }\n                else {\n                    containsOnlyWhitespace = model.getLineFirstNonWhitespaceColumn(i) === 0;\n                }\n                if (!containsOnlyWhitespace) {\n                    break;\n                }\n            }\n        }\n        return containsOnlyWhitespace;\n    }\n    dispose() {\n        this.callOnDispose.dispose();\n        this.callOnModel.dispose();\n    }\n};\nAutoIndentOnPaste = __decorate([\n    __param(1, ILanguageConfigurationService)\n], AutoIndentOnPaste);\nfunction isStartOrEndInString(model, range) {\n    const isPositionInString = (position) => {\n        const tokenType = getStandardTokenTypeAtPosition(model, position);\n        return tokenType === 2 /* StandardTokenType.String */;\n    };\n    return isPositionInString(range.getStartPosition()) || isPositionInString(range.getEndPosition());\n}\nfunction getIndentationEditOperations(model, builder, tabSize, tabsToSpaces) {\n    if (model.getLineCount() === 1 && model.getLineMaxColumn(1) === 1) {\n        // Model is empty\n        return;\n    }\n    let spaces = '';\n    for (let i = 0; i < tabSize; i++) {\n        spaces += ' ';\n    }\n    const spacesRegExp = new RegExp(spaces, 'gi');\n    for (let lineNumber = 1, lineCount = model.getLineCount(); lineNumber <= lineCount; lineNumber++) {\n        let lastIndentationColumn = model.getLineFirstNonWhitespaceColumn(lineNumber);\n        if (lastIndentationColumn === 0) {\n            lastIndentationColumn = model.getLineMaxColumn(lineNumber);\n        }\n        if (lastIndentationColumn === 1) {\n            continue;\n        }\n        const originalIndentationRange = new Range(lineNumber, 1, lineNumber, lastIndentationColumn);\n        const originalIndentation = model.getValueInRange(originalIndentationRange);\n        const newIndentation = (tabsToSpaces\n            ? originalIndentation.replace(/\\t/ig, spaces)\n            : originalIndentation.replace(spacesRegExp, '\\t'));\n        builder.addEditOperation(originalIndentationRange, newIndentation);\n    }\n}\nclass IndentationToSpacesCommand {\n    constructor(selection, tabSize) {\n        this.selection = selection;\n        this.tabSize = tabSize;\n        this.selectionId = null;\n    }\n    getEditOperations(model, builder) {\n        this.selectionId = builder.trackSelection(this.selection);\n        getIndentationEditOperations(model, builder, this.tabSize, true);\n    }\n    computeCursorState(model, helper) {\n        return helper.getTrackedSelection(this.selectionId);\n    }\n}\nclass IndentationToTabsCommand {\n    constructor(selection, tabSize) {\n        this.selection = selection;\n        this.tabSize = tabSize;\n        this.selectionId = null;\n    }\n    getEditOperations(model, builder) {\n        this.selectionId = builder.trackSelection(this.selection);\n        getIndentationEditOperations(model, builder, this.tabSize, false);\n    }\n    computeCursorState(model, helper) {\n        return helper.getTrackedSelection(this.selectionId);\n    }\n}\nregisterEditorContribution(AutoIndentOnPaste.ID, AutoIndentOnPaste, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\nregisterEditorAction(IndentationToSpacesAction);\nregisterEditorAction(IndentationToTabsAction);\nregisterEditorAction(IndentUsingTabs);\nregisterEditorAction(IndentUsingSpaces);\nregisterEditorAction(ChangeTabDisplaySize);\nregisterEditorAction(DetectIndentation);\nregisterEditorAction(ReindentLinesAction);\nregisterEditorAction(ReindentSelectedLinesAction);\n\nexport { AutoIndentOnPaste, AutoIndentOnPasteCommand, ChangeIndentationSizeAction, ChangeTabDisplaySize, DetectIndentation, IndentUsingSpaces, IndentUsingTabs, IndentationToSpacesAction, IndentationToSpacesCommand, IndentationToTabsAction, IndentationToTabsCommand, ReindentLinesAction, ReindentSelectedLinesAction };\n","import { registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { HoverParticipantRegistry } from '../../hover/browser/hoverTypes.js';\nimport { InlayHintsController } from './inlayHintsController.js';\nimport { InlayHintsHover } from './inlayHintsHover.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterEditorContribution(InlayHintsController.ID, InlayHintsController, 1 /* EditorContributionInstantiation.AfterFirstRender */);\nHoverParticipantRegistry.register(InlayHintsHover);\n","import { Selection } from '../../../common/core/selection.js';\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 *--------------------------------------------------------------------------------------------*/\nclass InPlaceReplaceCommand {\n    constructor(editRange, originalSelection, text) {\n        this._editRange = editRange;\n        this._originalSelection = originalSelection;\n        this._text = text;\n    }\n    getEditOperations(model, builder) {\n        builder.addTrackedEditOperation(this._editRange, this._text);\n    }\n    computeCursorState(model, helper) {\n        const inverseEditOperations = helper.getInverseEditOperations();\n        const srcRange = inverseEditOperations[0].range;\n        if (!this._originalSelection.isEmpty()) {\n            // Preserve selection and extends to typed text\n            return new Selection(srcRange.endLineNumber, srcRange.endColumn - this._text.length, srcRange.endLineNumber, srcRange.endColumn);\n        }\n        return new Selection(srcRange.endLineNumber, Math.min(this._originalSelection.positionColumn, srcRange.endColumn), srcRange.endLineNumber, Math.min(this._originalSelection.positionColumn, srcRange.endColumn));\n    }\n}\n\nexport { InPlaceReplaceCommand };\n","import { createCancelablePromise, timeout } from '../../../../base/common/async.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { EditorState } from '../../editorState/browser/editorState.js';\nimport { registerEditorContribution, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { IEditorWorkerService } from '../../../common/services/editorWorker.js';\nimport { localize2 } from '../../../../nls.js';\nimport { InPlaceReplaceCommand } from './inPlaceReplaceCommand.js';\nimport './inPlaceReplace.css';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar InPlaceReplaceController_1;\nlet InPlaceReplaceController = class InPlaceReplaceController {\n    static { InPlaceReplaceController_1 = this; }\n    static { this.ID = 'editor.contrib.inPlaceReplaceController'; }\n    static get(editor) {\n        return editor.getContribution(InPlaceReplaceController_1.ID);\n    }\n    static { this.DECORATION = ModelDecorationOptions.register({\n        description: 'in-place-replace',\n        className: 'valueSetReplacement'\n    }); }\n    constructor(editor, editorWorkerService) {\n        this.editor = editor;\n        this.editorWorkerService = editorWorkerService;\n        this.decorations = this.editor.createDecorationsCollection();\n    }\n    dispose() {\n    }\n    run(source, up) {\n        // cancel any pending request\n        this.currentRequest?.cancel();\n        const editorSelection = this.editor.getSelection();\n        const model = this.editor.getModel();\n        if (!model || !editorSelection) {\n            return undefined;\n        }\n        let selection = editorSelection;\n        if (selection.startLineNumber !== selection.endLineNumber) {\n            // Can't accept multiline selection\n            return undefined;\n        }\n        const state = new EditorState(this.editor, 1 /* CodeEditorStateFlag.Value */ | 4 /* CodeEditorStateFlag.Position */);\n        const modelURI = model.uri;\n        if (!this.editorWorkerService.canNavigateValueSet(modelURI)) {\n            return Promise.resolve(undefined);\n        }\n        this.currentRequest = createCancelablePromise(token => this.editorWorkerService.navigateValueSet(modelURI, selection, up));\n        return this.currentRequest.then(result => {\n            if (!result || !result.range || !result.value) {\n                // No proper result\n                return;\n            }\n            if (!state.validate(this.editor)) {\n                // state has changed\n                return;\n            }\n            // Selection\n            const editRange = Range.lift(result.range);\n            let highlightRange = result.range;\n            const diff = result.value.length - (selection.endColumn - selection.startColumn);\n            // highlight\n            highlightRange = {\n                startLineNumber: highlightRange.startLineNumber,\n                startColumn: highlightRange.startColumn,\n                endLineNumber: highlightRange.endLineNumber,\n                endColumn: highlightRange.startColumn + result.value.length\n            };\n            if (diff > 1) {\n                selection = new Selection(selection.startLineNumber, selection.startColumn, selection.endLineNumber, selection.endColumn + diff - 1);\n            }\n            // Insert new text\n            const command = new InPlaceReplaceCommand(editRange, selection, result.value);\n            this.editor.pushUndoStop();\n            this.editor.executeCommand(source, command);\n            this.editor.pushUndoStop();\n            // add decoration\n            this.decorations.set([{\n                    range: highlightRange,\n                    options: InPlaceReplaceController_1.DECORATION\n                }]);\n            // remove decoration after delay\n            this.decorationRemover?.cancel();\n            this.decorationRemover = timeout(350);\n            this.decorationRemover.then(() => this.decorations.clear()).catch(onUnexpectedError);\n        }).catch(onUnexpectedError);\n    }\n};\nInPlaceReplaceController = InPlaceReplaceController_1 = __decorate([\n    __param(1, IEditorWorkerService)\n], InPlaceReplaceController);\nclass InPlaceReplaceUp extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.inPlaceReplace.up',\n            label: localize2(1240, \"Replace with Previous Value\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 87 /* KeyCode.Comma */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(accessor, editor) {\n        const controller = InPlaceReplaceController.get(editor);\n        if (!controller) {\n            return Promise.resolve(undefined);\n        }\n        return controller.run(this.id, false);\n    }\n}\nclass InPlaceReplaceDown extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.inPlaceReplace.down',\n            label: localize2(1241, \"Replace with Next Value\"),\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 89 /* KeyCode.Period */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(accessor, editor) {\n        const controller = InPlaceReplaceController.get(editor);\n        if (!controller) {\n            return Promise.resolve(undefined);\n        }\n        return controller.run(this.id, true);\n    }\n}\nregisterEditorContribution(InPlaceReplaceController.ID, InPlaceReplaceController, 4 /* EditorContributionInstantiation.Lazy */);\nregisterEditorAction(InPlaceReplaceUp);\nregisterEditorAction(InPlaceReplaceDown);\n","import { lastNonWhitespaceIndex } from '../../../../base/common/strings.js';\nimport { EditOperation } from '../../../common/core/editOperation.js';\nimport { Position } from '../../../common/core/position.js';\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 *--------------------------------------------------------------------------------------------*/\nclass InsertFinalNewLineCommand {\n    constructor(selection) {\n        this._selection = selection;\n        this._selectionId = null;\n    }\n    getEditOperations(model, builder) {\n        const op = insertFinalNewLine(model);\n        if (op) {\n            builder.addEditOperation(op.range, op.text);\n        }\n        this._selectionId = builder.trackSelection(this._selection);\n    }\n    computeCursorState(model, helper) {\n        return helper.getTrackedSelection(this._selectionId);\n    }\n}\n/**\n * Generate edit operations for inserting a final new line if needed.\n * Returns undefined if no edit is needed.\n */\nfunction insertFinalNewLine(model) {\n    const lineCount = model.getLineCount();\n    const lastLine = model.getLineContent(lineCount);\n    const lastLineIsEmptyOrWhitespace = lastNonWhitespaceIndex(lastLine) === -1;\n    if (!lineCount || lastLineIsEmptyOrWhitespace) {\n        return;\n    }\n    return EditOperation.insert(new Position(lineCount, model.getLineMaxColumn(lineCount)), model.getEOL());\n}\n\nexport { InsertFinalNewLineCommand, insertFinalNewLine };\n","import { EditorAction, registerEditorAction } from '../../../browser/editorExtensions.js';\nimport { InsertFinalNewLineCommand } from './insertFinalNewLineCommand.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { localize2 } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nclass InsertFinalNewLineAction extends EditorAction {\n    static { this.ID = 'editor.action.insertFinalNewLine'; }\n    constructor() {\n        super({\n            id: InsertFinalNewLineAction.ID,\n            label: localize2(1242, \"Insert Final New Line\"),\n            precondition: EditorContextKeys.writable\n        });\n    }\n    run(_accessor, editor, args) {\n        const selection = editor.getSelection();\n        if (selection === null) {\n            return;\n        }\n        const command = new InsertFinalNewLineCommand(selection);\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, [command]);\n        editor.pushUndoStop();\n    }\n}\nregisterEditorAction(InsertFinalNewLineAction);\n\nexport { InsertFinalNewLineAction };\n","import { registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { CursorMoveCommands } from '../../../common/cursor/cursorMoveCommands.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { localize2 } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ExpandLineSelectionAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'expandLineSelection',\n            label: localize2(1243, \"Expand Line Selection\"),\n            precondition: undefined,\n            kbOpts: {\n                weight: 0 /* KeybindingWeight.EditorCore */,\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 42 /* KeyCode.KeyL */\n            },\n        });\n    }\n    run(_accessor, editor, args) {\n        args = args || {};\n        if (!editor.hasModel()) {\n            return;\n        }\n        const viewModel = editor._getViewModel();\n        viewModel.model.pushStackElement();\n        viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, CursorMoveCommands.expandLineSelection(viewModel, viewModel.getCursorStates()));\n        viewModel.revealAllCursors(args.source, true);\n    }\n}\nregisterEditorAction(ExpandLineSelectionAction);\n\nexport { ExpandLineSelectionAction };\n","import { isNonEmptyArray } from '../../../../base/common/arrays.js';\nimport { Delayer, first } from '../../../../base/common/async.js';\nimport { CancellationTokenSource, CancellationToken } from '../../../../base/common/cancellation.js';\nimport { Color } from '../../../../base/common/color.js';\nimport { isCancellationError, onUnexpectedError, onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { Event } from '../../../../base/common/event.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { commonPrefixLength, commonSuffixLength } from '../../../../base/common/strings.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { EditorCommand, registerEditorCommand, registerModelAndPositionCommand, registerEditorContribution, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { RawContextKey, IContextKeyService, ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { registerColor } from '../../../../platform/theme/common/colorUtils.js';\nimport '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport { StopWatch } from '../../../../base/common/stopwatch.js';\nimport './linkedEditing.css';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar LinkedEditingContribution_1;\nconst CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE = new RawContextKey('LinkedEditingInputVisible', false);\nconst DECORATION_CLASS_NAME = 'linked-editing-decoration';\nlet LinkedEditingContribution = class LinkedEditingContribution extends Disposable {\n    static { LinkedEditingContribution_1 = this; }\n    static { this.ID = 'editor.contrib.linkedEditing'; }\n    static { this.DECORATION = ModelDecorationOptions.register({\n        description: 'linked-editing',\n        stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,\n        className: DECORATION_CLASS_NAME\n    }); }\n    static get(editor) {\n        return editor.getContribution(LinkedEditingContribution_1.ID);\n    }\n    constructor(editor, contextKeyService, languageFeaturesService, languageConfigurationService, languageFeatureDebounceService) {\n        super();\n        this.languageConfigurationService = languageConfigurationService;\n        this._syncRangesToken = 0;\n        this._localToDispose = this._register(new DisposableStore());\n        this._editor = editor;\n        this._providers = languageFeaturesService.linkedEditingRangeProvider;\n        this._enabled = false;\n        this._visibleContextKey = CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE.bindTo(contextKeyService);\n        this._debounceInformation = languageFeatureDebounceService.for(this._providers, 'Linked Editing', { max: 200 });\n        this._currentDecorations = this._editor.createDecorationsCollection();\n        this._languageWordPattern = null;\n        this._currentWordPattern = null;\n        this._ignoreChangeEvent = false;\n        this._localToDispose = this._register(new DisposableStore());\n        this._rangeUpdateTriggerPromise = null;\n        this._rangeSyncTriggerPromise = null;\n        this._currentRequestCts = null;\n        this._currentRequestPosition = null;\n        this._currentRequestModelVersion = null;\n        this._register(this._editor.onDidChangeModel(() => this.reinitialize(true)));\n        this._register(this._editor.onDidChangeConfiguration(e => {\n            if (e.hasChanged(78 /* EditorOption.linkedEditing */) || e.hasChanged(106 /* EditorOption.renameOnType */)) {\n                this.reinitialize(false);\n            }\n        }));\n        this._register(this._providers.onDidChange(() => this.reinitialize(false)));\n        this._register(this._editor.onDidChangeModelLanguage(() => this.reinitialize(true)));\n        this.reinitialize(true);\n    }\n    reinitialize(forceRefresh) {\n        const model = this._editor.getModel();\n        const isEnabled = model !== null && (this._editor.getOption(78 /* EditorOption.linkedEditing */) || this._editor.getOption(106 /* EditorOption.renameOnType */)) && this._providers.has(model);\n        if (isEnabled === this._enabled && !forceRefresh) {\n            return;\n        }\n        this._enabled = isEnabled;\n        this.clearRanges();\n        this._localToDispose.clear();\n        if (!isEnabled || model === null) {\n            return;\n        }\n        this._localToDispose.add(Event.runAndSubscribe(model.onDidChangeLanguageConfiguration, () => {\n            this._languageWordPattern = this.languageConfigurationService.getLanguageConfiguration(model.getLanguageId()).getWordDefinition();\n        }));\n        const rangeUpdateScheduler = new Delayer(this._debounceInformation.get(model));\n        const triggerRangeUpdate = () => {\n            this._rangeUpdateTriggerPromise = rangeUpdateScheduler.trigger(() => this.updateRanges(), this._debounceDuration ?? this._debounceInformation.get(model));\n        };\n        const rangeSyncScheduler = new Delayer(0);\n        const triggerRangeSync = (token) => {\n            this._rangeSyncTriggerPromise = rangeSyncScheduler.trigger(() => this._syncRanges(token));\n        };\n        this._localToDispose.add(this._editor.onDidChangeCursorPosition(() => {\n            triggerRangeUpdate();\n        }));\n        this._localToDispose.add(this._editor.onDidChangeModelContent((e) => {\n            if (!this._ignoreChangeEvent) {\n                if (this._currentDecorations.length > 0) {\n                    const referenceRange = this._currentDecorations.getRange(0);\n                    if (referenceRange && e.changes.every(c => referenceRange.intersectRanges(c.range))) {\n                        triggerRangeSync(this._syncRangesToken);\n                        return;\n                    }\n                }\n            }\n            triggerRangeUpdate();\n        }));\n        this._localToDispose.add({\n            dispose: () => {\n                rangeUpdateScheduler.dispose();\n                rangeSyncScheduler.dispose();\n            }\n        });\n        this.updateRanges();\n    }\n    _syncRanges(token) {\n        // delayed invocation, make sure we're still on\n        if (!this._editor.hasModel() || token !== this._syncRangesToken || this._currentDecorations.length === 0) {\n            // nothing to do\n            return;\n        }\n        const model = this._editor.getModel();\n        const referenceRange = this._currentDecorations.getRange(0);\n        if (!referenceRange || referenceRange.startLineNumber !== referenceRange.endLineNumber) {\n            return this.clearRanges();\n        }\n        const referenceValue = model.getValueInRange(referenceRange);\n        if (this._currentWordPattern) {\n            const match = referenceValue.match(this._currentWordPattern);\n            const matchLength = match ? match[0].length : 0;\n            if (matchLength !== referenceValue.length) {\n                return this.clearRanges();\n            }\n        }\n        const edits = [];\n        for (let i = 1, len = this._currentDecorations.length; i < len; i++) {\n            const mirrorRange = this._currentDecorations.getRange(i);\n            if (!mirrorRange) {\n                continue;\n            }\n            if (mirrorRange.startLineNumber !== mirrorRange.endLineNumber) {\n                edits.push({\n                    range: mirrorRange,\n                    text: referenceValue\n                });\n            }\n            else {\n                let oldValue = model.getValueInRange(mirrorRange);\n                let newValue = referenceValue;\n                let rangeStartColumn = mirrorRange.startColumn;\n                let rangeEndColumn = mirrorRange.endColumn;\n                const commonPrefixLength$1 = commonPrefixLength(oldValue, newValue);\n                rangeStartColumn += commonPrefixLength$1;\n                oldValue = oldValue.substr(commonPrefixLength$1);\n                newValue = newValue.substr(commonPrefixLength$1);\n                const commonSuffixLength$1 = commonSuffixLength(oldValue, newValue);\n                rangeEndColumn -= commonSuffixLength$1;\n                oldValue = oldValue.substr(0, oldValue.length - commonSuffixLength$1);\n                newValue = newValue.substr(0, newValue.length - commonSuffixLength$1);\n                if (rangeStartColumn !== rangeEndColumn || newValue.length !== 0) {\n                    edits.push({\n                        range: new Range(mirrorRange.startLineNumber, rangeStartColumn, mirrorRange.endLineNumber, rangeEndColumn),\n                        text: newValue\n                    });\n                }\n            }\n        }\n        if (edits.length === 0) {\n            return;\n        }\n        try {\n            this._editor.popUndoStop();\n            this._ignoreChangeEvent = true;\n            const prevEditOperationType = this._editor._getViewModel().getPrevEditOperationType();\n            this._editor.executeEdits('linkedEditing', edits);\n            this._editor._getViewModel().setPrevEditOperationType(prevEditOperationType);\n        }\n        finally {\n            this._ignoreChangeEvent = false;\n        }\n    }\n    dispose() {\n        this.clearRanges();\n        super.dispose();\n    }\n    clearRanges() {\n        this._visibleContextKey.set(false);\n        this._currentDecorations.clear();\n        if (this._currentRequestCts) {\n            this._currentRequestCts.cancel();\n            this._currentRequestCts = null;\n            this._currentRequestPosition = null;\n        }\n    }\n    async updateRanges(force = false) {\n        if (!this._editor.hasModel()) {\n            this.clearRanges();\n            return;\n        }\n        const position = this._editor.getPosition();\n        if (!this._enabled && !force || this._editor.getSelections().length > 1) {\n            // disabled or multicursor\n            this.clearRanges();\n            return;\n        }\n        const model = this._editor.getModel();\n        const modelVersionId = model.getVersionId();\n        if (this._currentRequestPosition && this._currentRequestModelVersion === modelVersionId) {\n            if (position.equals(this._currentRequestPosition)) {\n                return; // same position\n            }\n            if (this._currentDecorations.length > 0) {\n                const range = this._currentDecorations.getRange(0);\n                if (range && range.containsPosition(position)) {\n                    return; // just moving inside the existing primary range\n                }\n            }\n        }\n        if (!this._currentRequestPosition?.equals(position)) {\n            // Get the current range of the first decoration (reference range)\n            const currentRange = this._currentDecorations.getRange(0);\n            // If there is no current range or the current range does not contain the new position, clear the ranges\n            if (!currentRange?.containsPosition(position)) {\n                // Clear existing decorations while we compute new ones\n                this.clearRanges();\n            }\n        }\n        this._currentRequestPosition = position;\n        this._currentRequestModelVersion = modelVersionId;\n        const currentRequestCts = this._currentRequestCts = new CancellationTokenSource();\n        try {\n            const sw = new StopWatch(false);\n            const response = await getLinkedEditingRanges(this._providers, model, position, currentRequestCts.token);\n            this._debounceInformation.update(model, sw.elapsed());\n            if (currentRequestCts !== this._currentRequestCts) {\n                return;\n            }\n            this._currentRequestCts = null;\n            if (modelVersionId !== model.getVersionId()) {\n                return;\n            }\n            let ranges = [];\n            if (response?.ranges) {\n                ranges = response.ranges;\n            }\n            this._currentWordPattern = response?.wordPattern || this._languageWordPattern;\n            let foundReferenceRange = false;\n            for (let i = 0, len = ranges.length; i < len; i++) {\n                if (Range.containsPosition(ranges[i], position)) {\n                    foundReferenceRange = true;\n                    if (i !== 0) {\n                        const referenceRange = ranges[i];\n                        ranges.splice(i, 1);\n                        ranges.unshift(referenceRange);\n                    }\n                    break;\n                }\n            }\n            if (!foundReferenceRange) {\n                // Cannot do linked editing if the ranges are not where the cursor is...\n                this.clearRanges();\n                return;\n            }\n            const decorations = ranges.map(range => ({ range: range, options: LinkedEditingContribution_1.DECORATION }));\n            this._visibleContextKey.set(true);\n            this._currentDecorations.set(decorations);\n            this._syncRangesToken++; // cancel any pending syncRanges call\n        }\n        catch (err) {\n            if (!isCancellationError(err)) {\n                onUnexpectedError(err);\n            }\n            if (this._currentRequestCts === currentRequestCts || !this._currentRequestCts) {\n                // stop if we are still the latest request\n                this.clearRanges();\n            }\n        }\n    }\n};\nLinkedEditingContribution = LinkedEditingContribution_1 = __decorate([\n    __param(1, IContextKeyService),\n    __param(2, ILanguageFeaturesService),\n    __param(3, ILanguageConfigurationService),\n    __param(4, ILanguageFeatureDebounceService)\n], LinkedEditingContribution);\nclass LinkedEditingAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.linkedEditing',\n            label: localize2(1276, \"Start Linked Editing\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, EditorContextKeys.hasRenameProvider),\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 60 /* KeyCode.F2 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    runCommand(accessor, args) {\n        const editorService = accessor.get(ICodeEditorService);\n        const [uri, pos] = Array.isArray(args) && args || [undefined, undefined];\n        if (URI.isUri(uri) && Position.isIPosition(pos)) {\n            return editorService.openCodeEditor({ resource: uri }, editorService.getActiveCodeEditor()).then(editor => {\n                if (!editor) {\n                    return;\n                }\n                editor.setPosition(pos);\n                editor.invokeWithinContext(accessor => {\n                    this.reportTelemetry(accessor, editor);\n                    return this.run(accessor, editor);\n                });\n            }, onUnexpectedError);\n        }\n        return super.runCommand(accessor, args);\n    }\n    run(_accessor, editor) {\n        const controller = LinkedEditingContribution.get(editor);\n        if (controller) {\n            return Promise.resolve(controller.updateRanges(true));\n        }\n        return Promise.resolve();\n    }\n}\nconst LinkedEditingCommand = EditorCommand.bindToContribution(LinkedEditingContribution.get);\nregisterEditorCommand(new LinkedEditingCommand({\n    id: 'cancelLinkedEditingInput',\n    precondition: CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE,\n    handler: x => x.clearRanges(),\n    kbOpts: {\n        kbExpr: EditorContextKeys.editorTextFocus,\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 99,\n        primary: 9 /* KeyCode.Escape */,\n        secondary: [1024 /* KeyMod.Shift */ | 9 /* KeyCode.Escape */]\n    }\n}));\nfunction getLinkedEditingRanges(providers, model, position, token) {\n    const orderedByScore = providers.ordered(model);\n    // in order of score ask the linked editing range provider\n    // until someone response with a good result\n    // (good = not null)\n    return first(orderedByScore.map(provider => async () => {\n        try {\n            return await provider.provideLinkedEditingRanges(model, position, token);\n        }\n        catch (e) {\n            onUnexpectedExternalError(e);\n            return undefined;\n        }\n    }), result => !!result && isNonEmptyArray(result?.ranges));\n}\nregisterColor('editor.linkedEditingBackground', { dark: Color.fromHex('#f00').transparent(0.3), light: Color.fromHex('#f00').transparent(0.3), hcDark: Color.fromHex('#f00').transparent(0.3), hcLight: Color.white }, localize(1275, 'Background color when the editor auto renames on type.'));\nregisterModelAndPositionCommand('_executeLinkedEditingProvider', (_accessor, model, position) => {\n    const { linkedEditingRangeProvider } = _accessor.get(ILanguageFeaturesService);\n    return getLinkedEditingRanges(linkedEditingRangeProvider, model, position, CancellationToken.None);\n});\nregisterEditorContribution(LinkedEditingContribution.ID, LinkedEditingContribution, 1 /* EditorContributionInstantiation.AfterFirstRender */);\nregisterEditorAction(LinkedEditingAction);\n\nexport { CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE, LinkedEditingAction, LinkedEditingContribution };\n","import { coalesce } from '../../../../base/common/arrays.js';\nimport { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { DisposableStore, isDisposable } from '../../../../base/common/lifecycle.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { Range } from '../../../common/core/range.js';\nimport { IModelService } from '../../../common/services/model.js';\nimport { CommandsRegistry } from '../../../../platform/commands/common/commands.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\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 *--------------------------------------------------------------------------------------------*/\nclass Link {\n    constructor(link, provider) {\n        this._link = link;\n        this._provider = provider;\n    }\n    toJSON() {\n        return {\n            range: this.range,\n            url: this.url,\n            tooltip: this.tooltip\n        };\n    }\n    get range() {\n        return this._link.range;\n    }\n    get url() {\n        return this._link.url;\n    }\n    get tooltip() {\n        return this._link.tooltip;\n    }\n    async resolve(token) {\n        if (this._link.url) {\n            return this._link.url;\n        }\n        if (typeof this._provider.resolveLink === 'function') {\n            return Promise.resolve(this._provider.resolveLink(this._link, token)).then(value => {\n                this._link = value || this._link;\n                if (this._link.url) {\n                    // recurse\n                    return this.resolve(token);\n                }\n                return Promise.reject(new Error('missing'));\n            });\n        }\n        return Promise.reject(new Error('missing'));\n    }\n}\nclass LinksList {\n    static { this.Empty = new LinksList([]); }\n    constructor(tuples) {\n        this._disposables = new DisposableStore();\n        let links = [];\n        for (const [list, provider] of tuples) {\n            // merge all links\n            const newLinks = list.links.map(link => new Link(link, provider));\n            links = LinksList._union(links, newLinks);\n            // register disposables\n            if (isDisposable(list)) {\n                this._disposables ??= new DisposableStore();\n                this._disposables.add(list);\n            }\n        }\n        this.links = links;\n    }\n    dispose() {\n        this._disposables?.dispose();\n        this.links.length = 0;\n    }\n    static _union(oldLinks, newLinks) {\n        // reunite oldLinks with newLinks and remove duplicates\n        const result = [];\n        let oldIndex;\n        let oldLen;\n        let newIndex;\n        let newLen;\n        for (oldIndex = 0, newIndex = 0, oldLen = oldLinks.length, newLen = newLinks.length; oldIndex < oldLen && newIndex < newLen;) {\n            const oldLink = oldLinks[oldIndex];\n            const newLink = newLinks[newIndex];\n            if (Range.areIntersectingOrTouching(oldLink.range, newLink.range)) {\n                // Remove the oldLink\n                oldIndex++;\n                continue;\n            }\n            const comparisonResult = Range.compareRangesUsingStarts(oldLink.range, newLink.range);\n            if (comparisonResult < 0) {\n                // oldLink is before\n                result.push(oldLink);\n                oldIndex++;\n            }\n            else {\n                // newLink is before\n                result.push(newLink);\n                newIndex++;\n            }\n        }\n        for (; oldIndex < oldLen; oldIndex++) {\n            result.push(oldLinks[oldIndex]);\n        }\n        for (; newIndex < newLen; newIndex++) {\n            result.push(newLinks[newIndex]);\n        }\n        return result;\n    }\n}\nasync function getLinks(providers, model, token) {\n    const lists = [];\n    // ask all providers for links in parallel\n    const promises = providers.ordered(model).reverse().map(async (provider, i) => {\n        try {\n            const result = await provider.provideLinks(model, token);\n            if (result) {\n                lists[i] = [result, provider];\n            }\n        }\n        catch (err) {\n            onUnexpectedExternalError(err);\n        }\n    });\n    await Promise.all(promises);\n    let res = new LinksList(coalesce(lists));\n    if (token.isCancellationRequested) {\n        res.dispose();\n        res = LinksList.Empty;\n    }\n    return res;\n}\nCommandsRegistry.registerCommand('_executeLinkProvider', async (accessor, ...args) => {\n    let [uri, resolveCount] = args;\n    assertType(uri instanceof URI);\n    if (typeof resolveCount !== 'number') {\n        resolveCount = 0;\n    }\n    const { linkProvider } = accessor.get(ILanguageFeaturesService);\n    const model = accessor.get(IModelService).getModel(uri);\n    if (!model) {\n        return [];\n    }\n    const list = await getLinks(linkProvider, model, CancellationToken.None);\n    if (!list) {\n        return [];\n    }\n    // resolve links\n    for (let i = 0; i < Math.min(resolveCount, list.links.length); i++) {\n        await list.links[i].resolve(CancellationToken.None);\n    }\n    const result = list.links.slice(0);\n    list.dispose();\n    return result;\n});\n\nexport { Link, LinksList, getLinks };\n","import { RunOnceScheduler, createCancelablePromise } from '../../../../base/common/async.js';\nimport { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { MarkdownString } from '../../../../base/common/htmlContent.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { Schemas } from '../../../../base/common/network.js';\nimport { isMacintosh } from '../../../../base/common/platform.js';\nimport { originalFSPath, joinPath } from '../../../../base/common/resources.js';\nimport { StopWatch } from '../../../../base/common/stopwatch.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport './links.css';\nimport { registerEditorContribution, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { ClickLinkGesture } from '../../gotoSymbol/browser/link/clickLinkGesture.js';\nimport { getLinks } from './getLinks.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { INotificationService } from '../../../../platform/notification/common/notification.js';\nimport { IOpenerService } from '../../../../platform/opener/common/opener.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar LinkDetector_1;\nlet LinkDetector = class LinkDetector extends Disposable {\n    static { LinkDetector_1 = this; }\n    static { this.ID = 'editor.linkDetector'; }\n    static get(editor) {\n        return editor.getContribution(LinkDetector_1.ID);\n    }\n    constructor(editor, openerService, notificationService, languageFeaturesService, languageFeatureDebounceService) {\n        super();\n        this.editor = editor;\n        this.openerService = openerService;\n        this.notificationService = notificationService;\n        this.languageFeaturesService = languageFeaturesService;\n        this.providers = this.languageFeaturesService.linkProvider;\n        this.debounceInformation = languageFeatureDebounceService.for(this.providers, 'Links', { min: 1000, max: 4000 });\n        this.computeLinks = this._register(new RunOnceScheduler(() => this.computeLinksNow(), 1000));\n        this.computePromise = null;\n        this.activeLinksList = null;\n        this.currentOccurrences = {};\n        this.activeLinkDecorationId = null;\n        const clickLinkGesture = this._register(new ClickLinkGesture(editor));\n        this._register(clickLinkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => {\n            this._onEditorMouseMove(mouseEvent, keyboardEvent);\n        }));\n        this._register(clickLinkGesture.onExecute((e) => {\n            this.onEditorMouseUp(e);\n        }));\n        this._register(clickLinkGesture.onCancel((e) => {\n            this.cleanUpActiveLinkDecoration();\n        }));\n        this._register(editor.onDidChangeConfiguration((e) => {\n            if (!e.hasChanged(79 /* EditorOption.links */)) {\n                return;\n            }\n            // Remove any links (for the getting disabled case)\n            this.updateDecorations([]);\n            // Stop any computation (for the getting disabled case)\n            this.stop();\n            // Start computing (for the getting enabled case)\n            this.computeLinks.schedule(0);\n        }));\n        this._register(editor.onDidChangeModelContent((e) => {\n            if (!this.editor.hasModel()) {\n                return;\n            }\n            this.computeLinks.schedule(this.debounceInformation.get(this.editor.getModel()));\n        }));\n        this._register(editor.onDidChangeModel((e) => {\n            this.currentOccurrences = {};\n            this.activeLinkDecorationId = null;\n            this.stop();\n            this.computeLinks.schedule(0);\n        }));\n        this._register(editor.onDidChangeModelLanguage((e) => {\n            this.stop();\n            this.computeLinks.schedule(0);\n        }));\n        this._register(this.providers.onDidChange((e) => {\n            this.stop();\n            this.computeLinks.schedule(0);\n        }));\n        this.computeLinks.schedule(0);\n    }\n    async computeLinksNow() {\n        if (!this.editor.hasModel() || !this.editor.getOption(79 /* EditorOption.links */)) {\n            return;\n        }\n        const model = this.editor.getModel();\n        if (model.isTooLargeForSyncing()) {\n            return;\n        }\n        if (!this.providers.has(model)) {\n            return;\n        }\n        if (this.activeLinksList) {\n            this.activeLinksList.dispose();\n            this.activeLinksList = null;\n        }\n        this.computePromise = createCancelablePromise(token => getLinks(this.providers, model, token));\n        try {\n            const sw = new StopWatch(false);\n            this.activeLinksList = await this.computePromise;\n            this.debounceInformation.update(model, sw.elapsed());\n            if (model.isDisposed()) {\n                return;\n            }\n            this.updateDecorations(this.activeLinksList.links);\n        }\n        catch (err) {\n            onUnexpectedError(err);\n        }\n        finally {\n            this.computePromise = null;\n        }\n    }\n    updateDecorations(links) {\n        const useMetaKey = (this.editor.getOption(86 /* EditorOption.multiCursorModifier */) === 'altKey');\n        const oldDecorations = [];\n        const keys = Object.keys(this.currentOccurrences);\n        for (const decorationId of keys) {\n            const occurence = this.currentOccurrences[decorationId];\n            oldDecorations.push(occurence.decorationId);\n        }\n        const newDecorations = [];\n        if (links) {\n            // Not sure why this is sometimes null\n            for (const link of links) {\n                newDecorations.push(LinkOccurrence.decoration(link, useMetaKey));\n            }\n        }\n        this.editor.changeDecorations((changeAccessor) => {\n            const decorations = changeAccessor.deltaDecorations(oldDecorations, newDecorations);\n            this.currentOccurrences = {};\n            this.activeLinkDecorationId = null;\n            for (let i = 0, len = decorations.length; i < len; i++) {\n                const occurence = new LinkOccurrence(links[i], decorations[i]);\n                this.currentOccurrences[occurence.decorationId] = occurence;\n            }\n        });\n    }\n    _onEditorMouseMove(mouseEvent, withKey) {\n        const useMetaKey = (this.editor.getOption(86 /* EditorOption.multiCursorModifier */) === 'altKey');\n        if (this.isEnabled(mouseEvent, withKey)) {\n            this.cleanUpActiveLinkDecoration(); // always remove previous link decoration as their can only be one\n            const occurrence = this.getLinkOccurrence(mouseEvent.target.position);\n            if (occurrence) {\n                this.editor.changeDecorations((changeAccessor) => {\n                    occurrence.activate(changeAccessor, useMetaKey);\n                    this.activeLinkDecorationId = occurrence.decorationId;\n                });\n            }\n        }\n        else {\n            this.cleanUpActiveLinkDecoration();\n        }\n    }\n    cleanUpActiveLinkDecoration() {\n        const useMetaKey = (this.editor.getOption(86 /* EditorOption.multiCursorModifier */) === 'altKey');\n        if (this.activeLinkDecorationId) {\n            const occurrence = this.currentOccurrences[this.activeLinkDecorationId];\n            if (occurrence) {\n                this.editor.changeDecorations((changeAccessor) => {\n                    occurrence.deactivate(changeAccessor, useMetaKey);\n                });\n            }\n            this.activeLinkDecorationId = null;\n        }\n    }\n    onEditorMouseUp(mouseEvent) {\n        if (!this.isEnabled(mouseEvent)) {\n            return;\n        }\n        const occurrence = this.getLinkOccurrence(mouseEvent.target.position);\n        if (!occurrence) {\n            return;\n        }\n        this.openLinkOccurrence(occurrence, mouseEvent.hasSideBySideModifier, true /* from user gesture */);\n    }\n    openLinkOccurrence(occurrence, openToSide, fromUserGesture = false) {\n        if (!this.openerService) {\n            return;\n        }\n        const { link } = occurrence;\n        link.resolve(CancellationToken.None).then(uri => {\n            // Support for relative file URIs of the shape file://./relativeFile.txt or file:///./relativeFile.txt\n            if (typeof uri === 'string' && this.editor.hasModel()) {\n                const modelUri = this.editor.getModel().uri;\n                if (modelUri.scheme === Schemas.file && uri.startsWith(`${Schemas.file}:`)) {\n                    const parsedUri = URI.parse(uri);\n                    if (parsedUri.scheme === Schemas.file) {\n                        const fsPath = originalFSPath(parsedUri);\n                        let relativePath = null;\n                        if (fsPath.startsWith('/./') || fsPath.startsWith('\\\\.\\\\')) {\n                            relativePath = `.${fsPath.substr(1)}`;\n                        }\n                        else if (fsPath.startsWith('//./') || fsPath.startsWith('\\\\\\\\.\\\\')) {\n                            relativePath = `.${fsPath.substr(2)}`;\n                        }\n                        if (relativePath) {\n                            uri = joinPath(modelUri, relativePath);\n                        }\n                    }\n                }\n            }\n            return this.openerService.open(uri, { openToSide, fromUserGesture, allowContributedOpeners: true, allowCommands: true, fromWorkspace: true });\n        }, err => {\n            const messageOrError = err instanceof Error ? err.message : err;\n            // different error cases\n            if (messageOrError === 'invalid') {\n                this.notificationService.warn(localize(1277, 'Failed to open this link because it is not well-formed: {0}', link.url.toString()));\n            }\n            else if (messageOrError === 'missing') {\n                this.notificationService.warn(localize(1278, 'Failed to open this link because its target is missing.'));\n            }\n            else {\n                onUnexpectedError(err);\n            }\n        });\n    }\n    getLinkOccurrence(position) {\n        if (!this.editor.hasModel() || !position) {\n            return null;\n        }\n        const decorations = this.editor.getModel().getDecorationsInRange({\n            startLineNumber: position.lineNumber,\n            startColumn: position.column,\n            endLineNumber: position.lineNumber,\n            endColumn: position.column\n        }, 0, true);\n        for (const decoration of decorations) {\n            const currentOccurrence = this.currentOccurrences[decoration.id];\n            if (currentOccurrence) {\n                return currentOccurrence;\n            }\n        }\n        return null;\n    }\n    isEnabled(mouseEvent, withKey) {\n        return Boolean((mouseEvent.target.type === 6 /* MouseTargetType.CONTENT_TEXT */)\n            && ((mouseEvent.hasTriggerModifier || (withKey && withKey.keyCodeIsTriggerKey)) || mouseEvent.isMiddleClick && mouseEvent.mouseMiddleClickAction === 'openLink'));\n    }\n    stop() {\n        this.computeLinks.cancel();\n        if (this.activeLinksList) {\n            this.activeLinksList?.dispose();\n            this.activeLinksList = null;\n        }\n        if (this.computePromise) {\n            this.computePromise.cancel();\n            this.computePromise = null;\n        }\n    }\n    dispose() {\n        super.dispose();\n        this.stop();\n    }\n};\nLinkDetector = LinkDetector_1 = __decorate([\n    __param(1, IOpenerService),\n    __param(2, INotificationService),\n    __param(3, ILanguageFeaturesService),\n    __param(4, ILanguageFeatureDebounceService)\n], LinkDetector);\nconst decoration = {\n    general: ModelDecorationOptions.register({\n        description: 'detected-link',\n        stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n        collapseOnReplaceEdit: true,\n        inlineClassName: 'detected-link'\n    }),\n    active: ModelDecorationOptions.register({\n        description: 'detected-link-active',\n        stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n        collapseOnReplaceEdit: true,\n        inlineClassName: 'detected-link-active'\n    })\n};\nclass LinkOccurrence {\n    static decoration(link, useMetaKey) {\n        return {\n            range: link.range,\n            options: LinkOccurrence._getOptions(link, useMetaKey, false)\n        };\n    }\n    static _getOptions(link, useMetaKey, isActive) {\n        const options = { ...(isActive ? decoration.active : decoration.general) };\n        options.hoverMessage = getHoverMessage(link, useMetaKey);\n        return options;\n    }\n    constructor(link, decorationId) {\n        this.link = link;\n        this.decorationId = decorationId;\n    }\n    activate(changeAccessor, useMetaKey) {\n        changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurrence._getOptions(this.link, useMetaKey, true));\n    }\n    deactivate(changeAccessor, useMetaKey) {\n        changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurrence._getOptions(this.link, useMetaKey, false));\n    }\n}\nfunction getHoverMessage(link, useMetaKey) {\n    const executeCmd = link.url && /^command:/i.test(link.url.toString());\n    const label = link.tooltip\n        ? link.tooltip\n        : executeCmd\n            ? localize(1279, 'Execute command')\n            : localize(1280, 'Follow link');\n    const kb = useMetaKey\n        ? isMacintosh\n            ? localize(1281, \"cmd + click\")\n            : localize(1282, \"ctrl + click\")\n        : isMacintosh\n            ? localize(1283, \"option + click\")\n            : localize(1284, \"alt + click\");\n    if (link.url) {\n        let nativeLabel = '';\n        if (/^command:/i.test(link.url.toString())) {\n            // Don't show complete command arguments in the native tooltip\n            const match = link.url.toString().match(/^command:([^?#]+)/);\n            if (match) {\n                const commandId = match[1];\n                nativeLabel = localize(1285, \"Execute command {0}\", commandId);\n            }\n        }\n        const hoverMessage = new MarkdownString('', true)\n            .appendLink(link.url.toString(true).replace(/ /g, '%20'), label, nativeLabel)\n            .appendMarkdown(` (${kb})`);\n        return hoverMessage;\n    }\n    else {\n        return new MarkdownString().appendText(`${label} (${kb})`);\n    }\n}\nclass OpenLinkAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.openLink',\n            label: localize2(1286, \"Open Link\"),\n            precondition: undefined\n        });\n    }\n    run(accessor, editor) {\n        const linkDetector = LinkDetector.get(editor);\n        if (!linkDetector) {\n            return;\n        }\n        if (!editor.hasModel()) {\n            return;\n        }\n        const selections = editor.getSelections();\n        for (const sel of selections) {\n            const link = linkDetector.getLinkOccurrence(sel.getEndPosition());\n            if (link) {\n                linkDetector.openLinkOccurrence(link, false);\n            }\n        }\n    }\n}\nregisterEditorContribution(LinkDetector.ID, LinkDetector, 1 /* EditorContributionInstantiation.AfterFirstRender */);\nregisterEditorAction(OpenLinkAction);\n\nexport { LinkDetector };\n","import { Disposable } from '../../../../base/common/lifecycle.js';\nimport { registerEditorContribution } from '../../../browser/editorExtensions.js';\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 *--------------------------------------------------------------------------------------------*/\nclass LongLinesHelper extends Disposable {\n    static { this.ID = 'editor.contrib.longLinesHelper'; }\n    constructor(_editor) {\n        super();\n        this._editor = _editor;\n        this._register(this._editor.onMouseDown((e) => {\n            const stopRenderingLineAfter = this._editor.getOption(133 /* EditorOption.stopRenderingLineAfter */);\n            if (stopRenderingLineAfter >= 0 && e.target.type === 6 /* MouseTargetType.CONTENT_TEXT */ && e.target.position.column >= stopRenderingLineAfter) {\n                this._editor.updateOptions({\n                    stopRenderingLineAfter: -1\n                });\n            }\n        }));\n    }\n}\nregisterEditorContribution(LongLinesHelper.ID, LongLinesHelper, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\n","import { getWindow, n, addDisposableListener } from '../../../../base/browser/dom.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { observableCodeEditor } from '../../../browser/observableCodeEditor.js';\nimport { Point } from '../../../common/core/2d/point.js';\nimport { AnimationFrameScheduler } from '../../inlineCompletions/browser/model/animation.js';\nimport { appendRemoveOnDispose } from '../../../browser/widget/diffEditor/utils.js';\nimport './middleScroll.css';\nimport { autorun } from '../../../../base/common/observableInternal/reactions/autorun.js';\nimport { disposableObservableValue, observableValue } from '../../../../base/common/observableInternal/observables/observableValue.js';\nimport { derived } from '../../../../base/common/observableInternal/observables/derived.js';\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 *--------------------------------------------------------------------------------------------*/\nclass MiddleScrollController extends Disposable {\n    static { this.ID = 'editor.contrib.middleScroll'; }\n    constructor(_editor) {\n        super();\n        this._editor = _editor;\n        const obsEditor = observableCodeEditor(this._editor);\n        const scrollOnMiddleClick = obsEditor.getOption(171 /* EditorOption.scrollOnMiddleClick */);\n        this._register(autorun(reader => {\n            if (!scrollOnMiddleClick.read(reader)) {\n                return;\n            }\n            const editorDomNode = obsEditor.domNode.read(reader);\n            if (!editorDomNode) {\n                return;\n            }\n            const scrollingSession = reader.store.add(disposableObservableValue('scrollingSession', undefined));\n            reader.store.add(this._editor.onMouseDown(e => {\n                const session = scrollingSession.read(undefined);\n                if (session) {\n                    scrollingSession.set(undefined, undefined);\n                    return;\n                }\n                if (!e.event.middleButton) {\n                    return;\n                }\n                e.event.stopPropagation();\n                e.event.preventDefault();\n                const store = new DisposableStore();\n                const initialPos = new Point(e.event.posx, e.event.posy);\n                const mousePos = observeWindowMousePos(getWindow(editorDomNode), initialPos, store);\n                const mouseDeltaAfterThreshold = mousePos.map(v => v.subtract(initialPos).withThreshold(5));\n                const editorDomNodeRect = editorDomNode.getBoundingClientRect();\n                const initialMousePosInEditor = new Point(initialPos.x - editorDomNodeRect.left, initialPos.y - editorDomNodeRect.top);\n                scrollingSession.set({\n                    mouseDeltaAfterThreshold,\n                    initialMousePosInEditor,\n                    didScroll: false,\n                    dispose: () => store.dispose(),\n                }, undefined);\n                store.add(this._editor.onMouseUp(e => {\n                    const session = scrollingSession.read(undefined);\n                    if (session && session.didScroll) {\n                        // Only cancel session on release if the user scrolled during it\n                        scrollingSession.set(undefined, undefined);\n                    }\n                }));\n                store.add(this._editor.onKeyDown(e => {\n                    scrollingSession.set(undefined, undefined);\n                }));\n            }));\n            reader.store.add(autorun(reader => {\n                const session = scrollingSession.read(reader);\n                if (!session) {\n                    return;\n                }\n                let lastTime = Date.now();\n                reader.store.add(autorun(reader => {\n                    AnimationFrameScheduler.instance.invalidateOnNextAnimationFrame(reader);\n                    const curTime = Date.now();\n                    const frameDurationMs = curTime - lastTime;\n                    lastTime = curTime;\n                    const mouseDelta = session.mouseDeltaAfterThreshold.read(undefined);\n                    // scroll by mouse delta every 32ms\n                    const factor = frameDurationMs / 32;\n                    const scrollDelta = mouseDelta.scale(factor);\n                    const scrollPos = new Point(this._editor.getScrollLeft(), this._editor.getScrollTop());\n                    this._editor.setScrollPosition(toScrollPosition(scrollPos.add(scrollDelta)));\n                    if (!scrollDelta.isZero()) {\n                        session.didScroll = true;\n                    }\n                }));\n                const directionAttr = derived(reader => {\n                    const delta = session.mouseDeltaAfterThreshold.read(reader);\n                    let direction = '';\n                    direction += (delta.y < 0 ? 'n' : (delta.y > 0 ? 's' : ''));\n                    direction += (delta.x < 0 ? 'w' : (delta.x > 0 ? 'e' : ''));\n                    return direction;\n                });\n                reader.store.add(autorun(reader => {\n                    editorDomNode.setAttribute('data-scroll-direction', directionAttr.read(reader));\n                }));\n            }));\n            const dotDomElem = reader.store.add(n.div({\n                class: ['scroll-editor-on-middle-click-dot', scrollingSession.map(session => session ? '' : 'hidden')],\n                style: {\n                    left: scrollingSession.map((session) => session ? session.initialMousePosInEditor.x : 0),\n                    top: scrollingSession.map((session) => session ? session.initialMousePosInEditor.y : 0),\n                }\n            }).toDisposableLiveElement());\n            reader.store.add(appendRemoveOnDispose(editorDomNode, dotDomElem.element));\n            reader.store.add(autorun(reader => {\n                const session = scrollingSession.read(reader);\n                editorDomNode.classList.toggle('scroll-editor-on-middle-click-editor', !!session);\n            }));\n        }));\n    }\n}\nfunction observeWindowMousePos(window, initialPos, store) {\n    const val = observableValue('pos', initialPos);\n    store.add(addDisposableListener(window, 'mousemove', (e) => {\n        val.set(new Point(e.pageX, e.pageY), undefined);\n    }));\n    return val;\n}\nfunction toScrollPosition(p) {\n    return {\n        scrollLeft: p.x,\n        scrollTop: p.y,\n    };\n}\n\nexport { MiddleScrollController };\n","import { registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { MiddleScrollController } from './middleScrollController.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterEditorContribution(MiddleScrollController.ID, MiddleScrollController, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\n","import './highlightDecorations.css';\nimport { OverviewRulerLane } from '../../../common/model.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { DocumentHighlightKind } from '../../../common/languages.js';\nimport { localize } from '../../../../nls.js';\nimport { registerColor } from '../../../../platform/theme/common/colorUtils.js';\nimport { activeContrastBorder } from '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { overviewRulerSelectionHighlightForeground, editorSelectionHighlight } from '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport { minimapSelectionOccurrenceHighlight } from '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { themeColorFromId, registerThemingParticipant } from '../../../../platform/theme/common/themeService.js';\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 *--------------------------------------------------------------------------------------------*/\nconst wordHighlightBackground = registerColor('editor.wordHighlightBackground', { dark: '#575757B8', light: '#57575740', hcDark: null, hcLight: null }, localize(1563, 'Background color of a symbol during read-access, like reading a variable. The color must not be opaque so as not to hide underlying decorations.'), true);\nregisterColor('editor.wordHighlightStrongBackground', { dark: '#004972B8', light: '#0e639c40', hcDark: null, hcLight: null }, localize(1564, 'Background color of a symbol during write-access, like writing to a variable. The color must not be opaque so as not to hide underlying decorations.'), true);\nregisterColor('editor.wordHighlightTextBackground', wordHighlightBackground, localize(1565, 'Background color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst wordHighlightBorder = registerColor('editor.wordHighlightBorder', { light: null, dark: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize(1566, 'Border color of a symbol during read-access, like reading a variable.'));\nregisterColor('editor.wordHighlightStrongBorder', { light: null, dark: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, localize(1567, 'Border color of a symbol during write-access, like writing to a variable.'));\nregisterColor('editor.wordHighlightTextBorder', wordHighlightBorder, localize(1568, \"Border color of a textual occurrence for a symbol.\"));\nconst overviewRulerWordHighlightForeground = registerColor('editorOverviewRuler.wordHighlightForeground', '#A0A0A0CC', localize(1569, 'Overview ruler marker color for symbol highlights. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst overviewRulerWordHighlightStrongForeground = registerColor('editorOverviewRuler.wordHighlightStrongForeground', '#C0A0C0CC', localize(1570, 'Overview ruler marker color for write-access symbol highlights. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst overviewRulerWordHighlightTextForeground = registerColor('editorOverviewRuler.wordHighlightTextForeground', overviewRulerSelectionHighlightForeground, localize(1571, 'Overview ruler marker color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations.'), true);\nconst _WRITE_OPTIONS = ModelDecorationOptions.register({\n    description: 'word-highlight-strong',\n    stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n    className: 'wordHighlightStrong',\n    overviewRuler: {\n        color: themeColorFromId(overviewRulerWordHighlightStrongForeground),\n        position: OverviewRulerLane.Center\n    },\n    minimap: {\n        color: themeColorFromId(minimapSelectionOccurrenceHighlight),\n        position: 1 /* MinimapPosition.Inline */\n    },\n});\nconst _TEXT_OPTIONS = ModelDecorationOptions.register({\n    description: 'word-highlight-text',\n    stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n    className: 'wordHighlightText',\n    overviewRuler: {\n        color: themeColorFromId(overviewRulerWordHighlightTextForeground),\n        position: OverviewRulerLane.Center\n    },\n    minimap: {\n        color: themeColorFromId(minimapSelectionOccurrenceHighlight),\n        position: 1 /* MinimapPosition.Inline */\n    },\n});\nconst _SELECTION_HIGHLIGHT_OPTIONS = ModelDecorationOptions.register({\n    description: 'selection-highlight-overview',\n    stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n    className: 'selectionHighlight',\n    overviewRuler: {\n        color: themeColorFromId(overviewRulerSelectionHighlightForeground),\n        position: OverviewRulerLane.Center\n    },\n    minimap: {\n        color: themeColorFromId(minimapSelectionOccurrenceHighlight),\n        position: 1 /* MinimapPosition.Inline */\n    },\n});\nconst _SELECTION_HIGHLIGHT_OPTIONS_NO_OVERVIEW = ModelDecorationOptions.register({\n    description: 'selection-highlight',\n    stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n    className: 'selectionHighlight',\n});\nconst _REGULAR_OPTIONS = ModelDecorationOptions.register({\n    description: 'word-highlight',\n    stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n    className: 'wordHighlight',\n    overviewRuler: {\n        color: themeColorFromId(overviewRulerWordHighlightForeground),\n        position: OverviewRulerLane.Center\n    },\n    minimap: {\n        color: themeColorFromId(minimapSelectionOccurrenceHighlight),\n        position: 1 /* MinimapPosition.Inline */\n    },\n});\nfunction getHighlightDecorationOptions(kind) {\n    if (kind === DocumentHighlightKind.Write) {\n        return _WRITE_OPTIONS;\n    }\n    else if (kind === DocumentHighlightKind.Text) {\n        return _TEXT_OPTIONS;\n    }\n    else {\n        return _REGULAR_OPTIONS;\n    }\n}\nfunction getSelectionHighlightDecorationOptions(hasSemanticHighlights) {\n    // Show in overviewRuler only if model has no semantic highlighting\n    return (hasSemanticHighlights ? _SELECTION_HIGHLIGHT_OPTIONS_NO_OVERVIEW : _SELECTION_HIGHLIGHT_OPTIONS);\n}\nregisterThemingParticipant((theme, collector) => {\n    const selectionHighlight = theme.getColor(editorSelectionHighlight);\n    if (selectionHighlight) {\n        collector.addRule(`.monaco-editor .selectionHighlight { background-color: ${selectionHighlight.transparent(0.5)}; }`);\n    }\n});\n\nexport { getHighlightDecorationOptions, getSelectionHighlightDecorationOptions };\n","import { status } from '../../../../base/browser/ui/aria/aria.js';\nimport { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { KeyChord } from '../../../../base/common/keyCodes.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { registerEditorContribution, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { CursorMoveCommands } from '../../../common/cursor/cursorMoveCommands.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { CommonFindController } from '../../find/browser/findController.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { getSelectionHighlightDecorationOptions } from '../../wordHighlighter/browser/highlightDecorations.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar SelectionHighlighter_1;\nfunction announceCursorChange(previousCursorState, cursorState) {\n    const cursorDiff = cursorState.filter(cs => !previousCursorState.find(pcs => pcs.equals(cs)));\n    if (cursorDiff.length >= 1) {\n        const cursorPositions = cursorDiff.map(cs => `line ${cs.viewState.position.lineNumber} column ${cs.viewState.position.column}`).join(', ');\n        const msg = cursorDiff.length === 1 ? localize(1288, \"Cursor added: {0}\", cursorPositions) : localize(1289, \"Cursors added: {0}\", cursorPositions);\n        status(msg);\n    }\n}\nclass InsertCursorAbove extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.insertCursorAbove',\n            label: localize2(1298, \"Add Cursor Above\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 16 /* KeyCode.UpArrow */,\n                linux: {\n                    primary: 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 16 /* KeyCode.UpArrow */,\n                    secondary: [2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 16 /* KeyCode.UpArrow */]\n                },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarSelectionMenu,\n                group: '3_multi',\n                title: localize(1290, \"&&Add Cursor Above\"),\n                order: 2\n            }\n        });\n    }\n    run(accessor, editor, args) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        let useLogicalLine = true;\n        if (args && args.logicalLine === false) {\n            useLogicalLine = false;\n        }\n        const viewModel = editor._getViewModel();\n        if (viewModel.cursorConfig.readOnly) {\n            return;\n        }\n        viewModel.model.pushStackElement();\n        const previousCursorState = viewModel.getCursorStates();\n        viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, CursorMoveCommands.addCursorUp(viewModel, previousCursorState, useLogicalLine));\n        viewModel.revealTopMostCursor(args.source);\n        announceCursorChange(previousCursorState, viewModel.getCursorStates());\n    }\n}\nclass InsertCursorBelow extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.insertCursorBelow',\n            label: localize2(1299, \"Add Cursor Below\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 512 /* KeyMod.Alt */ | 18 /* KeyCode.DownArrow */,\n                linux: {\n                    primary: 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 18 /* KeyCode.DownArrow */,\n                    secondary: [2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 18 /* KeyCode.DownArrow */]\n                },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarSelectionMenu,\n                group: '3_multi',\n                title: localize(1291, \"A&&dd Cursor Below\"),\n                order: 3\n            }\n        });\n    }\n    run(accessor, editor, args) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        let useLogicalLine = true;\n        if (args && args.logicalLine === false) {\n            useLogicalLine = false;\n        }\n        const viewModel = editor._getViewModel();\n        if (viewModel.cursorConfig.readOnly) {\n            return;\n        }\n        viewModel.model.pushStackElement();\n        const previousCursorState = viewModel.getCursorStates();\n        viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, CursorMoveCommands.addCursorDown(viewModel, previousCursorState, useLogicalLine));\n        viewModel.revealBottomMostCursor(args.source);\n        announceCursorChange(previousCursorState, viewModel.getCursorStates());\n    }\n}\nclass InsertCursorAtEndOfEachLineSelected extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.insertCursorAtEndOfEachLineSelected',\n            label: localize2(1300, \"Add Cursors to Line Ends\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 39 /* KeyCode.KeyI */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarSelectionMenu,\n                group: '3_multi',\n                title: localize(1292, \"Add C&&ursors to Line Ends\"),\n                order: 4\n            }\n        });\n    }\n    getCursorsForSelection(selection, model, result) {\n        if (selection.isEmpty()) {\n            return;\n        }\n        for (let i = selection.startLineNumber; i < selection.endLineNumber; i++) {\n            const currentLineMaxColumn = model.getLineMaxColumn(i);\n            result.push(new Selection(i, currentLineMaxColumn, i, currentLineMaxColumn));\n        }\n        if (selection.endColumn > 1) {\n            result.push(new Selection(selection.endLineNumber, selection.endColumn, selection.endLineNumber, selection.endColumn));\n        }\n    }\n    run(accessor, editor) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const model = editor.getModel();\n        const selections = editor.getSelections();\n        const viewModel = editor._getViewModel();\n        const previousCursorState = viewModel.getCursorStates();\n        const newSelections = [];\n        selections.forEach((sel) => this.getCursorsForSelection(sel, model, newSelections));\n        if (newSelections.length > 0) {\n            editor.setSelections(newSelections);\n        }\n        announceCursorChange(previousCursorState, viewModel.getCursorStates());\n    }\n}\nclass InsertCursorAtEndOfLineSelected extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.addCursorsToBottom',\n            label: localize2(1301, \"Add Cursors to Bottom\"),\n            precondition: undefined\n        });\n    }\n    run(accessor, editor) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const selections = editor.getSelections();\n        const lineCount = editor.getModel().getLineCount();\n        const newSelections = [];\n        for (let i = selections[0].startLineNumber; i <= lineCount; i++) {\n            newSelections.push(new Selection(i, selections[0].startColumn, i, selections[0].endColumn));\n        }\n        const viewModel = editor._getViewModel();\n        const previousCursorState = viewModel.getCursorStates();\n        if (newSelections.length > 0) {\n            editor.setSelections(newSelections);\n        }\n        announceCursorChange(previousCursorState, viewModel.getCursorStates());\n    }\n}\nclass InsertCursorAtTopOfLineSelected extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.addCursorsToTop',\n            label: localize2(1302, \"Add Cursors to Top\"),\n            precondition: undefined\n        });\n    }\n    run(accessor, editor) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const selections = editor.getSelections();\n        const newSelections = [];\n        for (let i = selections[0].startLineNumber; i >= 1; i--) {\n            newSelections.push(new Selection(i, selections[0].startColumn, i, selections[0].endColumn));\n        }\n        const viewModel = editor._getViewModel();\n        const previousCursorState = viewModel.getCursorStates();\n        if (newSelections.length > 0) {\n            editor.setSelections(newSelections);\n        }\n        announceCursorChange(previousCursorState, viewModel.getCursorStates());\n    }\n}\nclass MultiCursorSessionResult {\n    constructor(selections, revealRange, revealScrollType) {\n        this.selections = selections;\n        this.revealRange = revealRange;\n        this.revealScrollType = revealScrollType;\n    }\n}\nclass MultiCursorSession {\n    static create(editor, findController) {\n        if (!editor.hasModel()) {\n            return null;\n        }\n        const findState = findController.getState();\n        // Find widget owns entirely what we search for if:\n        //  - focus is not in the editor (i.e. it is in the find widget)\n        //  - and the search widget is visible\n        //  - and the search string is non-empty\n        if (!editor.hasTextFocus() && findState.isRevealed && findState.searchString.length > 0) {\n            // Find widget owns what is searched for\n            return new MultiCursorSession(editor, findController, false, findState.searchString, findState.wholeWord, findState.matchCase, null);\n        }\n        // Otherwise, the selection gives the search text, and the find widget gives the search settings\n        // The exception is the find state disassociation case: when beginning with a single, collapsed selection\n        let isDisconnectedFromFindController = false;\n        let wholeWord;\n        let matchCase;\n        const selections = editor.getSelections();\n        if (selections.length === 1 && selections[0].isEmpty()) {\n            isDisconnectedFromFindController = true;\n            wholeWord = true;\n            matchCase = true;\n        }\n        else {\n            wholeWord = findState.wholeWord;\n            matchCase = findState.matchCase;\n        }\n        // Selection owns what is searched for\n        const s = editor.getSelection();\n        let searchText;\n        let currentMatch = null;\n        if (s.isEmpty()) {\n            // selection is empty => expand to current word\n            const word = editor.getConfiguredWordAtPosition(s.getStartPosition());\n            if (!word) {\n                return null;\n            }\n            searchText = word.word;\n            currentMatch = new Selection(s.startLineNumber, word.startColumn, s.startLineNumber, word.endColumn);\n        }\n        else {\n            searchText = editor.getModel().getValueInRange(s).replace(/\\r\\n/g, '\\n');\n        }\n        return new MultiCursorSession(editor, findController, isDisconnectedFromFindController, searchText, wholeWord, matchCase, currentMatch);\n    }\n    constructor(_editor, findController, isDisconnectedFromFindController, searchText, wholeWord, matchCase, currentMatch) {\n        this._editor = _editor;\n        this.findController = findController;\n        this.isDisconnectedFromFindController = isDisconnectedFromFindController;\n        this.searchText = searchText;\n        this.wholeWord = wholeWord;\n        this.matchCase = matchCase;\n        this.currentMatch = currentMatch;\n    }\n    addSelectionToNextFindMatch() {\n        if (!this._editor.hasModel()) {\n            return null;\n        }\n        const nextMatch = this._getNextMatch();\n        if (!nextMatch) {\n            return null;\n        }\n        const allSelections = this._editor.getSelections();\n        return new MultiCursorSessionResult(allSelections.concat(nextMatch), nextMatch, 0 /* ScrollType.Smooth */);\n    }\n    moveSelectionToNextFindMatch() {\n        if (!this._editor.hasModel()) {\n            return null;\n        }\n        const nextMatch = this._getNextMatch();\n        if (!nextMatch) {\n            return null;\n        }\n        const allSelections = this._editor.getSelections();\n        return new MultiCursorSessionResult(allSelections.slice(0, allSelections.length - 1).concat(nextMatch), nextMatch, 0 /* ScrollType.Smooth */);\n    }\n    _getNextMatch() {\n        if (!this._editor.hasModel()) {\n            return null;\n        }\n        if (this.currentMatch) {\n            const result = this.currentMatch;\n            this.currentMatch = null;\n            return result;\n        }\n        this.findController.highlightFindOptions();\n        const allSelections = this._editor.getSelections();\n        const lastAddedSelection = allSelections[allSelections.length - 1];\n        const nextMatch = this._editor.getModel().findNextMatch(this.searchText, lastAddedSelection.getEndPosition(), false, this.matchCase, this.wholeWord ? this._editor.getOption(148 /* EditorOption.wordSeparators */) : null, false);\n        if (!nextMatch) {\n            return null;\n        }\n        return new Selection(nextMatch.range.startLineNumber, nextMatch.range.startColumn, nextMatch.range.endLineNumber, nextMatch.range.endColumn);\n    }\n    addSelectionToPreviousFindMatch() {\n        if (!this._editor.hasModel()) {\n            return null;\n        }\n        const previousMatch = this._getPreviousMatch();\n        if (!previousMatch) {\n            return null;\n        }\n        const allSelections = this._editor.getSelections();\n        return new MultiCursorSessionResult(allSelections.concat(previousMatch), previousMatch, 0 /* ScrollType.Smooth */);\n    }\n    moveSelectionToPreviousFindMatch() {\n        if (!this._editor.hasModel()) {\n            return null;\n        }\n        const previousMatch = this._getPreviousMatch();\n        if (!previousMatch) {\n            return null;\n        }\n        const allSelections = this._editor.getSelections();\n        return new MultiCursorSessionResult(allSelections.slice(0, allSelections.length - 1).concat(previousMatch), previousMatch, 0 /* ScrollType.Smooth */);\n    }\n    _getPreviousMatch() {\n        if (!this._editor.hasModel()) {\n            return null;\n        }\n        if (this.currentMatch) {\n            const result = this.currentMatch;\n            this.currentMatch = null;\n            return result;\n        }\n        this.findController.highlightFindOptions();\n        const allSelections = this._editor.getSelections();\n        const lastAddedSelection = allSelections[allSelections.length - 1];\n        const previousMatch = this._editor.getModel().findPreviousMatch(this.searchText, lastAddedSelection.getStartPosition(), false, this.matchCase, this.wholeWord ? this._editor.getOption(148 /* EditorOption.wordSeparators */) : null, false);\n        if (!previousMatch) {\n            return null;\n        }\n        return new Selection(previousMatch.range.startLineNumber, previousMatch.range.startColumn, previousMatch.range.endLineNumber, previousMatch.range.endColumn);\n    }\n    selectAll(searchScope) {\n        if (!this._editor.hasModel()) {\n            return [];\n        }\n        this.findController.highlightFindOptions();\n        const editorModel = this._editor.getModel();\n        if (searchScope) {\n            return editorModel.findMatches(this.searchText, searchScope, false, this.matchCase, this.wholeWord ? this._editor.getOption(148 /* EditorOption.wordSeparators */) : null, false, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */);\n        }\n        return editorModel.findMatches(this.searchText, true, false, this.matchCase, this.wholeWord ? this._editor.getOption(148 /* EditorOption.wordSeparators */) : null, false, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */);\n    }\n}\nclass MultiCursorSelectionController extends Disposable {\n    static { this.ID = 'editor.contrib.multiCursorController'; }\n    static get(editor) {\n        return editor.getContribution(MultiCursorSelectionController.ID);\n    }\n    constructor(editor) {\n        super();\n        this._sessionDispose = this._register(new DisposableStore());\n        this._editor = editor;\n        this._ignoreSelectionChange = false;\n        this._session = null;\n    }\n    dispose() {\n        this._endSession();\n        super.dispose();\n    }\n    _beginSessionIfNeeded(findController) {\n        if (!this._session) {\n            // Create a new session\n            const session = MultiCursorSession.create(this._editor, findController);\n            if (!session) {\n                return;\n            }\n            this._session = session;\n            const newState = { searchString: this._session.searchText };\n            if (this._session.isDisconnectedFromFindController) {\n                newState.wholeWordOverride = 1 /* FindOptionOverride.True */;\n                newState.matchCaseOverride = 1 /* FindOptionOverride.True */;\n                newState.isRegexOverride = 2 /* FindOptionOverride.False */;\n            }\n            findController.getState().change(newState, false);\n            this._sessionDispose.add(this._editor.onDidChangeCursorSelection((e) => {\n                if (this._ignoreSelectionChange) {\n                    return;\n                }\n                this._endSession();\n            }));\n            this._sessionDispose.add(this._editor.onDidBlurEditorText(() => {\n                this._endSession();\n            }));\n            this._sessionDispose.add(findController.getState().onFindReplaceStateChange((e) => {\n                if (e.matchCase || e.wholeWord) {\n                    this._endSession();\n                }\n            }));\n        }\n    }\n    _endSession() {\n        this._sessionDispose.clear();\n        if (this._session && this._session.isDisconnectedFromFindController) {\n            const newState = {\n                wholeWordOverride: 0 /* FindOptionOverride.NotSet */,\n                matchCaseOverride: 0 /* FindOptionOverride.NotSet */,\n                isRegexOverride: 0 /* FindOptionOverride.NotSet */,\n            };\n            this._session.findController.getState().change(newState, false);\n        }\n        this._session = null;\n    }\n    _setSelections(selections) {\n        this._ignoreSelectionChange = true;\n        this._editor.setSelections(selections);\n        this._ignoreSelectionChange = false;\n    }\n    _expandEmptyToWord(model, selection) {\n        if (!selection.isEmpty()) {\n            return selection;\n        }\n        const word = this._editor.getConfiguredWordAtPosition(selection.getStartPosition());\n        if (!word) {\n            return selection;\n        }\n        return new Selection(selection.startLineNumber, word.startColumn, selection.startLineNumber, word.endColumn);\n    }\n    _applySessionResult(result) {\n        if (!result) {\n            return;\n        }\n        this._setSelections(result.selections);\n        if (result.revealRange) {\n            this._editor.revealRangeInCenterIfOutsideViewport(result.revealRange, result.revealScrollType);\n        }\n    }\n    getSession(findController) {\n        return this._session;\n    }\n    addSelectionToNextFindMatch(findController) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        if (!this._session) {\n            // If there are multiple cursors, handle the case where they do not all select the same text.\n            const allSelections = this._editor.getSelections();\n            if (allSelections.length > 1) {\n                const findState = findController.getState();\n                const matchCase = findState.matchCase;\n                const selectionsContainSameText = modelRangesContainSameText(this._editor.getModel(), allSelections, matchCase);\n                if (!selectionsContainSameText) {\n                    const model = this._editor.getModel();\n                    const resultingSelections = [];\n                    for (let i = 0, len = allSelections.length; i < len; i++) {\n                        resultingSelections[i] = this._expandEmptyToWord(model, allSelections[i]);\n                    }\n                    this._editor.setSelections(resultingSelections);\n                    return;\n                }\n            }\n        }\n        this._beginSessionIfNeeded(findController);\n        if (this._session) {\n            this._applySessionResult(this._session.addSelectionToNextFindMatch());\n        }\n    }\n    addSelectionToPreviousFindMatch(findController) {\n        this._beginSessionIfNeeded(findController);\n        if (this._session) {\n            this._applySessionResult(this._session.addSelectionToPreviousFindMatch());\n        }\n    }\n    moveSelectionToNextFindMatch(findController) {\n        this._beginSessionIfNeeded(findController);\n        if (this._session) {\n            this._applySessionResult(this._session.moveSelectionToNextFindMatch());\n        }\n    }\n    moveSelectionToPreviousFindMatch(findController) {\n        this._beginSessionIfNeeded(findController);\n        if (this._session) {\n            this._applySessionResult(this._session.moveSelectionToPreviousFindMatch());\n        }\n    }\n    selectAll(findController) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        let matches = null;\n        const findState = findController.getState();\n        // Special case: find widget owns entirely what we search for if:\n        // - focus is not in the editor (i.e. it is in the find widget)\n        // - and the search widget is visible\n        // - and the search string is non-empty\n        // - and we're searching for a regex\n        if (findState.isRevealed && findState.searchString.length > 0 && findState.isRegex) {\n            const editorModel = this._editor.getModel();\n            if (findState.searchScope) {\n                matches = editorModel.findMatches(findState.searchString, findState.searchScope, findState.isRegex, findState.matchCase, findState.wholeWord ? this._editor.getOption(148 /* EditorOption.wordSeparators */) : null, false, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */);\n            }\n            else {\n                matches = editorModel.findMatches(findState.searchString, true, findState.isRegex, findState.matchCase, findState.wholeWord ? this._editor.getOption(148 /* EditorOption.wordSeparators */) : null, false, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */);\n            }\n        }\n        else {\n            this._beginSessionIfNeeded(findController);\n            if (!this._session) {\n                return;\n            }\n            matches = this._session.selectAll(findState.searchScope);\n        }\n        if (matches.length > 0) {\n            const editorSelection = this._editor.getSelection();\n            // Have the primary cursor remain the one where the action was invoked\n            for (let i = 0, len = matches.length; i < len; i++) {\n                const match = matches[i];\n                const intersection = match.range.intersectRanges(editorSelection);\n                if (intersection) {\n                    // bingo!\n                    matches[i] = matches[0];\n                    matches[0] = match;\n                    break;\n                }\n            }\n            this._setSelections(matches.map(m => new Selection(m.range.startLineNumber, m.range.startColumn, m.range.endLineNumber, m.range.endColumn)));\n        }\n    }\n}\nclass MultiCursorSelectionControllerAction extends EditorAction {\n    run(accessor, editor) {\n        const multiCursorController = MultiCursorSelectionController.get(editor);\n        if (!multiCursorController) {\n            return;\n        }\n        const viewModel = editor._getViewModel();\n        if (viewModel) {\n            const previousCursorState = viewModel.getCursorStates();\n            const findController = CommonFindController.get(editor);\n            if (findController) {\n                this._run(multiCursorController, findController);\n            }\n            else {\n                const newFindController = accessor.get(IInstantiationService).createInstance(CommonFindController, editor);\n                this._run(multiCursorController, newFindController);\n                newFindController.dispose();\n            }\n            announceCursorChange(previousCursorState, viewModel.getCursorStates());\n        }\n    }\n}\nclass AddSelectionToNextFindMatchAction extends MultiCursorSelectionControllerAction {\n    constructor() {\n        super({\n            id: 'editor.action.addSelectionToNextFindMatch',\n            label: localize2(1303, \"Add Selection to Next Find Match\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.focus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 34 /* KeyCode.KeyD */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarSelectionMenu,\n                group: '3_multi',\n                title: localize(1293, \"Add &&Next Occurrence\"),\n                order: 5\n            }\n        });\n    }\n    _run(multiCursorController, findController) {\n        multiCursorController.addSelectionToNextFindMatch(findController);\n    }\n}\nclass AddSelectionToPreviousFindMatchAction extends MultiCursorSelectionControllerAction {\n    constructor() {\n        super({\n            id: 'editor.action.addSelectionToPreviousFindMatch',\n            label: localize2(1304, \"Add Selection to Previous Find Match\"),\n            precondition: undefined,\n            menuOpts: {\n                menuId: MenuId.MenubarSelectionMenu,\n                group: '3_multi',\n                title: localize(1294, \"Add P&&revious Occurrence\"),\n                order: 6\n            }\n        });\n    }\n    _run(multiCursorController, findController) {\n        multiCursorController.addSelectionToPreviousFindMatch(findController);\n    }\n}\nclass MoveSelectionToNextFindMatchAction extends MultiCursorSelectionControllerAction {\n    constructor() {\n        super({\n            id: 'editor.action.moveSelectionToNextFindMatch',\n            label: localize2(1305, \"Move Last Selection to Next Find Match\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.focus,\n                primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 34 /* KeyCode.KeyD */),\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    _run(multiCursorController, findController) {\n        multiCursorController.moveSelectionToNextFindMatch(findController);\n    }\n}\nclass MoveSelectionToPreviousFindMatchAction extends MultiCursorSelectionControllerAction {\n    constructor() {\n        super({\n            id: 'editor.action.moveSelectionToPreviousFindMatch',\n            label: localize2(1306, \"Move Last Selection to Previous Find Match\"),\n            precondition: undefined\n        });\n    }\n    _run(multiCursorController, findController) {\n        multiCursorController.moveSelectionToPreviousFindMatch(findController);\n    }\n}\nclass SelectHighlightsAction extends MultiCursorSelectionControllerAction {\n    constructor() {\n        super({\n            id: 'editor.action.selectHighlights',\n            label: localize2(1307, \"Select All Occurrences of Find Match\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.focus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 42 /* KeyCode.KeyL */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarSelectionMenu,\n                group: '3_multi',\n                title: localize(1295, \"Select All &&Occurrences\"),\n                order: 7\n            }\n        });\n    }\n    _run(multiCursorController, findController) {\n        multiCursorController.selectAll(findController);\n    }\n}\nclass CompatChangeAll extends MultiCursorSelectionControllerAction {\n    constructor() {\n        super({\n            id: 'editor.action.changeAll',\n            label: localize2(1308, \"Change All Occurrences\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, EditorContextKeys.editorTextFocus),\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 60 /* KeyCode.F2 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            contextMenuOpts: {\n                group: '1_modification',\n                order: 1.2\n            }\n        });\n    }\n    _run(multiCursorController, findController) {\n        multiCursorController.selectAll(findController);\n    }\n}\nclass SelectionHighlighterState {\n    constructor(_model, _searchText, _matchCase, _wordSeparators, prevState) {\n        this._model = _model;\n        this._searchText = _searchText;\n        this._matchCase = _matchCase;\n        this._wordSeparators = _wordSeparators;\n        this._cachedFindMatches = null;\n        this._modelVersionId = this._model.getVersionId();\n        if (prevState\n            && this._model === prevState._model\n            && this._searchText === prevState._searchText\n            && this._matchCase === prevState._matchCase\n            && this._wordSeparators === prevState._wordSeparators\n            && this._modelVersionId === prevState._modelVersionId) {\n            this._cachedFindMatches = prevState._cachedFindMatches;\n        }\n    }\n    findMatches() {\n        if (this._cachedFindMatches === null) {\n            this._cachedFindMatches = this._model.findMatches(this._searchText, true, false, this._matchCase, this._wordSeparators, false).map(m => m.range);\n            this._cachedFindMatches.sort(Range.compareRangesUsingStarts);\n        }\n        return this._cachedFindMatches;\n    }\n}\nlet SelectionHighlighter = class SelectionHighlighter extends Disposable {\n    static { SelectionHighlighter_1 = this; }\n    static { this.ID = 'editor.contrib.selectionHighlighter'; }\n    constructor(editor, _languageFeaturesService) {\n        super();\n        this._languageFeaturesService = _languageFeaturesService;\n        this.editor = editor;\n        this._isEnabled = editor.getOption(122 /* EditorOption.selectionHighlight */);\n        this._isEnabledMultiline = editor.getOption(124 /* EditorOption.selectionHighlightMultiline */);\n        this._maxLength = editor.getOption(123 /* EditorOption.selectionHighlightMaxLength */);\n        this._decorations = editor.createDecorationsCollection();\n        this.updateSoon = this._register(new RunOnceScheduler(() => this._update(), 300));\n        this.state = null;\n        this._register(editor.onDidChangeConfiguration((e) => {\n            this._isEnabled = editor.getOption(122 /* EditorOption.selectionHighlight */);\n            this._isEnabledMultiline = editor.getOption(124 /* EditorOption.selectionHighlightMultiline */);\n            this._maxLength = editor.getOption(123 /* EditorOption.selectionHighlightMaxLength */);\n        }));\n        this._register(editor.onDidChangeCursorSelection((e) => {\n            if (!this._isEnabled) {\n                // Early exit if nothing needs to be done!\n                // Leave some form of early exit check here if you wish to continue being a cursor position change listener ;)\n                return;\n            }\n            if (e.selection.isEmpty()) {\n                if (e.reason === 3 /* CursorChangeReason.Explicit */) {\n                    if (this.state) {\n                        // no longer valid\n                        this._setState(null);\n                    }\n                    this.updateSoon.schedule();\n                }\n                else {\n                    this._setState(null);\n                }\n            }\n            else {\n                this._update();\n            }\n        }));\n        this._register(editor.onDidChangeModel((e) => {\n            this._setState(null);\n        }));\n        this._register(editor.onDidChangeModelContent((e) => {\n            if (this._isEnabled) {\n                this.updateSoon.schedule();\n            }\n        }));\n        const findController = CommonFindController.get(editor);\n        if (findController) {\n            this._register(findController.getState().onFindReplaceStateChange((e) => {\n                this._update();\n            }));\n        }\n        this.updateSoon.schedule();\n    }\n    _update() {\n        this._setState(SelectionHighlighter_1._createState(this.state, this._isEnabled, this._isEnabledMultiline, this._maxLength, this.editor));\n    }\n    static _createState(oldState, isEnabled, isEnabledMultiline, maxLength, editor) {\n        if (!isEnabled) {\n            return null;\n        }\n        if (!editor.hasModel()) {\n            return null;\n        }\n        if (!isEnabledMultiline) {\n            const s = editor.getSelection();\n            if (s.startLineNumber !== s.endLineNumber) {\n                // multiline forbidden for perf reasons\n                return null;\n            }\n        }\n        const multiCursorController = MultiCursorSelectionController.get(editor);\n        if (!multiCursorController) {\n            return null;\n        }\n        const findController = CommonFindController.get(editor);\n        if (!findController) {\n            return null;\n        }\n        let r = multiCursorController.getSession(findController);\n        if (!r) {\n            const allSelections = editor.getSelections();\n            if (allSelections.length > 1) {\n                const findState = findController.getState();\n                const matchCase = findState.matchCase;\n                const selectionsContainSameText = modelRangesContainSameText(editor.getModel(), allSelections, matchCase);\n                if (!selectionsContainSameText) {\n                    return null;\n                }\n            }\n            r = MultiCursorSession.create(editor, findController);\n        }\n        if (!r) {\n            return null;\n        }\n        if (r.currentMatch) {\n            // This is an empty selection\n            // Do not interfere with semantic word highlighting in the no selection case\n            return null;\n        }\n        if (/^[ \\t]+$/.test(r.searchText)) {\n            // whitespace only selection\n            return null;\n        }\n        if (maxLength > 0 && r.searchText.length > maxLength) {\n            // very long selection\n            return null;\n        }\n        // TODO: better handling of this case\n        const findState = findController.getState();\n        const caseSensitive = findState.matchCase;\n        // Return early if the find widget shows the exact same matches\n        if (findState.isRevealed) {\n            let findStateSearchString = findState.searchString;\n            if (!caseSensitive) {\n                findStateSearchString = findStateSearchString.toLowerCase();\n            }\n            let mySearchString = r.searchText;\n            if (!caseSensitive) {\n                mySearchString = mySearchString.toLowerCase();\n            }\n            if (findStateSearchString === mySearchString && r.matchCase === findState.matchCase && r.wholeWord === findState.wholeWord && !findState.isRegex) {\n                return null;\n            }\n        }\n        return new SelectionHighlighterState(editor.getModel(), r.searchText, r.matchCase, r.wholeWord ? editor.getOption(148 /* EditorOption.wordSeparators */) : null, oldState);\n    }\n    _setState(newState) {\n        this.state = newState;\n        if (!this.state) {\n            this._decorations.clear();\n            return;\n        }\n        if (!this.editor.hasModel()) {\n            return;\n        }\n        const model = this.editor.getModel();\n        if (model.isTooLargeForTokenization()) {\n            // the file is too large, so searching word under cursor in the whole document would be blocking the UI.\n            return;\n        }\n        const allMatches = this.state.findMatches();\n        const selections = this.editor.getSelections();\n        selections.sort(Range.compareRangesUsingStarts);\n        // do not overlap with selection (issue #64 and #512)\n        const matches = [];\n        for (let i = 0, j = 0, len = allMatches.length, lenJ = selections.length; i < len;) {\n            const match = allMatches[i];\n            if (j >= lenJ) {\n                // finished all editor selections\n                matches.push(match);\n                i++;\n            }\n            else {\n                const cmp = Range.compareRangesUsingStarts(match, selections[j]);\n                if (cmp < 0) {\n                    // match is before sel\n                    if (selections[j].isEmpty() || !Range.areIntersecting(match, selections[j])) {\n                        matches.push(match);\n                    }\n                    i++;\n                }\n                else if (cmp > 0) {\n                    // sel is before match\n                    j++;\n                }\n                else {\n                    // sel is equal to match\n                    i++;\n                    j++;\n                }\n            }\n        }\n        const occurrenceHighlighting = this.editor.getOption(90 /* EditorOption.occurrencesHighlight */) !== 'off';\n        const hasSemanticHighlights = this._languageFeaturesService.documentHighlightProvider.has(model) && occurrenceHighlighting;\n        const decorations = matches.map(r => {\n            return {\n                range: r,\n                options: getSelectionHighlightDecorationOptions(hasSemanticHighlights)\n            };\n        });\n        this._decorations.set(decorations);\n    }\n    dispose() {\n        this._setState(null);\n        super.dispose();\n    }\n};\nSelectionHighlighter = SelectionHighlighter_1 = __decorate([\n    __param(1, ILanguageFeaturesService)\n], SelectionHighlighter);\nfunction modelRangesContainSameText(model, ranges, matchCase) {\n    const selectedText = getValueInRange(model, ranges[0], !matchCase);\n    for (let i = 1, len = ranges.length; i < len; i++) {\n        const range = ranges[i];\n        if (range.isEmpty()) {\n            return false;\n        }\n        const thisSelectedText = getValueInRange(model, range, !matchCase);\n        if (selectedText !== thisSelectedText) {\n            return false;\n        }\n    }\n    return true;\n}\nfunction getValueInRange(model, range, toLowerCase) {\n    const text = model.getValueInRange(range);\n    return (toLowerCase ? text.toLowerCase() : text);\n}\nclass FocusNextCursor extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.focusNextCursor',\n            label: localize2(1309, \"Focus Next Cursor\"),\n            metadata: {\n                description: localize(1296, \"Focuses the next cursor\"),\n                args: [],\n            },\n            precondition: undefined\n        });\n    }\n    run(accessor, editor, args) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const viewModel = editor._getViewModel();\n        if (viewModel.cursorConfig.readOnly) {\n            return;\n        }\n        viewModel.model.pushStackElement();\n        const previousCursorState = Array.from(viewModel.getCursorStates());\n        const firstCursor = previousCursorState.shift();\n        if (!firstCursor) {\n            return;\n        }\n        previousCursorState.push(firstCursor);\n        viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, previousCursorState);\n        viewModel.revealPrimaryCursor(args.source, true);\n        announceCursorChange(previousCursorState, viewModel.getCursorStates());\n    }\n}\nclass FocusPreviousCursor extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.focusPreviousCursor',\n            label: localize2(1310, \"Focus Previous Cursor\"),\n            metadata: {\n                description: localize(1297, \"Focuses the previous cursor\"),\n                args: [],\n            },\n            precondition: undefined\n        });\n    }\n    run(accessor, editor, args) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const viewModel = editor._getViewModel();\n        if (viewModel.cursorConfig.readOnly) {\n            return;\n        }\n        viewModel.model.pushStackElement();\n        const previousCursorState = Array.from(viewModel.getCursorStates());\n        const firstCursor = previousCursorState.pop();\n        if (!firstCursor) {\n            return;\n        }\n        previousCursorState.unshift(firstCursor);\n        viewModel.setCursorStates(args.source, 3 /* CursorChangeReason.Explicit */, previousCursorState);\n        viewModel.revealPrimaryCursor(args.source, true);\n        announceCursorChange(previousCursorState, viewModel.getCursorStates());\n    }\n}\nregisterEditorContribution(MultiCursorSelectionController.ID, MultiCursorSelectionController, 4 /* EditorContributionInstantiation.Lazy */);\nregisterEditorContribution(SelectionHighlighter.ID, SelectionHighlighter, 1 /* EditorContributionInstantiation.AfterFirstRender */);\nregisterEditorAction(InsertCursorAbove);\nregisterEditorAction(InsertCursorBelow);\nregisterEditorAction(InsertCursorAtEndOfEachLineSelected);\nregisterEditorAction(AddSelectionToNextFindMatchAction);\nregisterEditorAction(AddSelectionToPreviousFindMatchAction);\nregisterEditorAction(MoveSelectionToNextFindMatchAction);\nregisterEditorAction(MoveSelectionToPreviousFindMatchAction);\nregisterEditorAction(SelectHighlightsAction);\nregisterEditorAction(CompatChangeAll);\nregisterEditorAction(InsertCursorAtEndOfLineSelected);\nregisterEditorAction(InsertCursorAtTopOfLineSelected);\nregisterEditorAction(FocusNextCursor);\nregisterEditorAction(FocusPreviousCursor);\n\nexport { AddSelectionToNextFindMatchAction, AddSelectionToPreviousFindMatchAction, CompatChangeAll, FocusNextCursor, FocusPreviousCursor, InsertCursorAbove, InsertCursorBelow, MoveSelectionToNextFindMatchAction, MoveSelectionToPreviousFindMatchAction, MultiCursorSelectionController, MultiCursorSelectionControllerAction, MultiCursorSession, MultiCursorSessionResult, SelectHighlightsAction, SelectionHighlighter };\n","import { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { Position } from '../../../common/core/position.js';\nimport { SignatureHelpTriggerKind } from '../../../common/languages.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { ITextModelService } from '../../../common/services/resolverService.js';\nimport { CommandsRegistry } from '../../../../platform/commands/common/commands.js';\nimport { RawContextKey } from '../../../../platform/contextkey/common/contextkey.js';\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 *--------------------------------------------------------------------------------------------*/\nconst Context = {\n    Visible: new RawContextKey('parameterHintsVisible', false),\n    MultipleSignatures: new RawContextKey('parameterHintsMultipleSignatures', false),\n};\nasync function provideSignatureHelp(registry, model, position, context, token) {\n    const supports = registry.ordered(model);\n    for (const support of supports) {\n        try {\n            const result = await support.provideSignatureHelp(model, position, token, context);\n            if (result) {\n                return result;\n            }\n        }\n        catch (err) {\n            onUnexpectedExternalError(err);\n        }\n    }\n    return undefined;\n}\nCommandsRegistry.registerCommand('_executeSignatureHelpProvider', async (accessor, ...args) => {\n    const [uri, position, triggerCharacter] = args;\n    assertType(URI.isUri(uri));\n    assertType(Position.isIPosition(position));\n    assertType(typeof triggerCharacter === 'string' || !triggerCharacter);\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const ref = await accessor.get(ITextModelService).createModelReference(uri);\n    try {\n        const result = await provideSignatureHelp(languageFeaturesService.signatureHelpProvider, ref.object.textEditorModel, Position.lift(position), {\n            triggerKind: SignatureHelpTriggerKind.Invoke,\n            isRetrigger: false,\n            triggerCharacter,\n        }, CancellationToken.None);\n        if (!result) {\n            return undefined;\n        }\n        setTimeout(() => result.dispose(), 0);\n        return result.value;\n    }\n    finally {\n        ref.dispose();\n    }\n});\n\nexport { Context, provideSignatureHelp };\n","import { Delayer, createCancelablePromise } from '../../../../base/common/async.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { Disposable, MutableDisposable } from '../../../../base/common/lifecycle.js';\nimport { CharacterSet } from '../../../common/core/characterClassifier.js';\nimport { SignatureHelpTriggerKind } from '../../../common/languages.js';\nimport { provideSignatureHelp } from './provideSignatureHelp.js';\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 *--------------------------------------------------------------------------------------------*/\nvar ParameterHintState;\n(function (ParameterHintState) {\n    ParameterHintState.Default = { type: 0 /* Type.Default */ };\n    class Pending {\n        constructor(request, previouslyActiveHints) {\n            this.request = request;\n            this.previouslyActiveHints = previouslyActiveHints;\n            this.type = 2 /* Type.Pending */;\n        }\n    }\n    ParameterHintState.Pending = Pending;\n    class Active {\n        constructor(hints) {\n            this.hints = hints;\n            this.type = 1 /* Type.Active */;\n        }\n    }\n    ParameterHintState.Active = Active;\n})(ParameterHintState || (ParameterHintState = {}));\nclass ParameterHintsModel extends Disposable {\n    static { this.DEFAULT_DELAY = 120; } // ms\n    constructor(editor, providers, delay = ParameterHintsModel.DEFAULT_DELAY) {\n        super();\n        this._onChangedHints = this._register(new Emitter());\n        this.onChangedHints = this._onChangedHints.event;\n        this.triggerOnType = false;\n        this._state = ParameterHintState.Default;\n        this._pendingTriggers = [];\n        this._lastSignatureHelpResult = this._register(new MutableDisposable());\n        this.triggerChars = new CharacterSet();\n        this.retriggerChars = new CharacterSet();\n        this.triggerId = 0;\n        this.editor = editor;\n        this.providers = providers;\n        this.throttledDelayer = new Delayer(delay);\n        this._register(this.editor.onDidBlurEditorWidget(() => this.cancel()));\n        this._register(this.editor.onDidChangeConfiguration(() => this.onEditorConfigurationChange()));\n        this._register(this.editor.onDidChangeModel(e => this.onModelChanged()));\n        this._register(this.editor.onDidChangeModelLanguage(_ => this.onModelChanged()));\n        this._register(this.editor.onDidChangeCursorSelection(e => this.onCursorChange(e)));\n        this._register(this.editor.onDidChangeModelContent(e => this.onModelContentChange()));\n        this._register(this.providers.onDidChange(this.onModelChanged, this));\n        this._register(this.editor.onDidType(text => this.onDidType(text)));\n        this.onEditorConfigurationChange();\n        this.onModelChanged();\n    }\n    get state() { return this._state; }\n    set state(value) {\n        if (this._state.type === 2 /* ParameterHintState.Type.Pending */) {\n            this._state.request.cancel();\n        }\n        this._state = value;\n    }\n    cancel(silent = false) {\n        this.state = ParameterHintState.Default;\n        this.throttledDelayer.cancel();\n        if (!silent) {\n            this._onChangedHints.fire(undefined);\n        }\n    }\n    trigger(context, delay) {\n        const model = this.editor.getModel();\n        if (!model || !this.providers.has(model)) {\n            return;\n        }\n        const triggerId = ++this.triggerId;\n        this._pendingTriggers.push(context);\n        this.throttledDelayer.trigger(() => {\n            return this.doTrigger(triggerId);\n        }, delay)\n            .catch(onUnexpectedError);\n    }\n    next() {\n        if (this.state.type !== 1 /* ParameterHintState.Type.Active */) {\n            return;\n        }\n        const length = this.state.hints.signatures.length;\n        const activeSignature = this.state.hints.activeSignature;\n        const last = (activeSignature % length) === (length - 1);\n        const cycle = this.editor.getOption(98 /* EditorOption.parameterHints */).cycle;\n        // If there is only one signature, or we're on last signature of list\n        if ((length < 2 || last) && !cycle) {\n            this.cancel();\n            return;\n        }\n        this.updateActiveSignature(last && cycle ? 0 : activeSignature + 1);\n    }\n    previous() {\n        if (this.state.type !== 1 /* ParameterHintState.Type.Active */) {\n            return;\n        }\n        const length = this.state.hints.signatures.length;\n        const activeSignature = this.state.hints.activeSignature;\n        const first = activeSignature === 0;\n        const cycle = this.editor.getOption(98 /* EditorOption.parameterHints */).cycle;\n        // If there is only one signature, or we're on first signature of list\n        if ((length < 2 || first) && !cycle) {\n            this.cancel();\n            return;\n        }\n        this.updateActiveSignature(first && cycle ? length - 1 : activeSignature - 1);\n    }\n    updateActiveSignature(activeSignature) {\n        if (this.state.type !== 1 /* ParameterHintState.Type.Active */) {\n            return;\n        }\n        this.state = new ParameterHintState.Active({ ...this.state.hints, activeSignature });\n        this._onChangedHints.fire(this.state.hints);\n    }\n    async doTrigger(triggerId) {\n        const isRetrigger = this.state.type === 1 /* ParameterHintState.Type.Active */ || this.state.type === 2 /* ParameterHintState.Type.Pending */;\n        const activeSignatureHelp = this.getLastActiveHints();\n        this.cancel(true);\n        if (this._pendingTriggers.length === 0) {\n            return false;\n        }\n        const context = this._pendingTriggers.reduce(mergeTriggerContexts);\n        this._pendingTriggers = [];\n        const triggerContext = {\n            triggerKind: context.triggerKind,\n            triggerCharacter: context.triggerCharacter,\n            isRetrigger: isRetrigger,\n            activeSignatureHelp: activeSignatureHelp\n        };\n        if (!this.editor.hasModel()) {\n            return false;\n        }\n        const model = this.editor.getModel();\n        const position = this.editor.getPosition();\n        this.state = new ParameterHintState.Pending(createCancelablePromise(token => provideSignatureHelp(this.providers, model, position, triggerContext, token)), activeSignatureHelp);\n        try {\n            const result = await this.state.request;\n            // Check that we are still resolving the correct signature help\n            if (triggerId !== this.triggerId) {\n                result?.dispose();\n                return false;\n            }\n            if (!result || !result.value.signatures || result.value.signatures.length === 0) {\n                result?.dispose();\n                this._lastSignatureHelpResult.clear();\n                this.cancel();\n                return false;\n            }\n            else {\n                this.state = new ParameterHintState.Active(result.value);\n                this._lastSignatureHelpResult.value = result;\n                this._onChangedHints.fire(this.state.hints);\n                return true;\n            }\n        }\n        catch (error) {\n            if (triggerId === this.triggerId) {\n                this.state = ParameterHintState.Default;\n            }\n            onUnexpectedError(error);\n            return false;\n        }\n    }\n    getLastActiveHints() {\n        switch (this.state.type) {\n            case 1 /* ParameterHintState.Type.Active */: return this.state.hints;\n            case 2 /* ParameterHintState.Type.Pending */: return this.state.previouslyActiveHints;\n            default: return undefined;\n        }\n    }\n    get isTriggered() {\n        return this.state.type === 1 /* ParameterHintState.Type.Active */\n            || this.state.type === 2 /* ParameterHintState.Type.Pending */\n            || this.throttledDelayer.isTriggered();\n    }\n    onModelChanged() {\n        this.cancel();\n        this.triggerChars.clear();\n        this.retriggerChars.clear();\n        const model = this.editor.getModel();\n        if (!model) {\n            return;\n        }\n        for (const support of this.providers.ordered(model)) {\n            for (const ch of support.signatureHelpTriggerCharacters || []) {\n                if (ch.length) {\n                    const charCode = ch.charCodeAt(0);\n                    this.triggerChars.add(charCode);\n                    // All trigger characters are also considered retrigger characters\n                    this.retriggerChars.add(charCode);\n                }\n            }\n            for (const ch of support.signatureHelpRetriggerCharacters || []) {\n                if (ch.length) {\n                    this.retriggerChars.add(ch.charCodeAt(0));\n                }\n            }\n        }\n    }\n    onDidType(text) {\n        if (!this.triggerOnType) {\n            return;\n        }\n        const lastCharIndex = text.length - 1;\n        const triggerCharCode = text.charCodeAt(lastCharIndex);\n        if (this.triggerChars.has(triggerCharCode) || this.isTriggered && this.retriggerChars.has(triggerCharCode)) {\n            this.trigger({\n                triggerKind: SignatureHelpTriggerKind.TriggerCharacter,\n                triggerCharacter: text.charAt(lastCharIndex),\n            });\n        }\n    }\n    onCursorChange(e) {\n        if (e.source === 'mouse') {\n            this.cancel();\n        }\n        else if (this.isTriggered) {\n            this.trigger({ triggerKind: SignatureHelpTriggerKind.ContentChange });\n        }\n    }\n    onModelContentChange() {\n        if (this.isTriggered) {\n            this.trigger({ triggerKind: SignatureHelpTriggerKind.ContentChange });\n        }\n    }\n    onEditorConfigurationChange() {\n        this.triggerOnType = this.editor.getOption(98 /* EditorOption.parameterHints */).enabled;\n        if (!this.triggerOnType) {\n            this.cancel();\n        }\n    }\n    dispose() {\n        this.cancel(true);\n        super.dispose();\n    }\n}\nfunction mergeTriggerContexts(previous, current) {\n    switch (current.triggerKind) {\n        case SignatureHelpTriggerKind.Invoke:\n            // Invoke overrides previous triggers.\n            return current;\n        case SignatureHelpTriggerKind.ContentChange:\n            // Ignore content changes triggers\n            return previous;\n        case SignatureHelpTriggerKind.TriggerCharacter:\n        default:\n            return current;\n    }\n}\n\nexport { ParameterHintsModel };\n","import { $ as $$1, append, addDisposableListener, EventHelper } from '../../../../base/browser/dom.js';\nimport { alert } from '../../../../base/browser/ui/aria/aria.js';\nimport { DomScrollableElement } from '../../../../base/browser/ui/scrollbar/scrollableElement.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { Event } from '../../../../base/common/event.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { escapeRegExpCharacters } from '../../../../base/common/strings.js';\nimport { assertReturnsDefined } from '../../../../base/common/types.js';\nimport './parameterHints.css';\nimport { EDITOR_FONT_DEFAULTS } from '../../../common/config/fontInfo.js';\nimport { IMarkdownRendererService } from '../../../../platform/markdown/browser/markdownRenderer.js';\nimport { Context } from './provideSignatureHelp.js';\nimport { localize } from '../../../../nls.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { registerColor } from '../../../../platform/theme/common/colorUtils.js';\nimport '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport { listHighlightForeground } from '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { registerIcon } from '../../../../platform/theme/common/iconRegistry.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ParameterHintsWidget_1;\nconst $ = $$1;\nconst parameterHintsNextIcon = registerIcon('parameter-hints-next', Codicon.chevronDown, localize(1312, 'Icon for show next parameter hint.'));\nconst parameterHintsPreviousIcon = registerIcon('parameter-hints-previous', Codicon.chevronUp, localize(1313, 'Icon for show previous parameter hint.'));\nlet ParameterHintsWidget = class ParameterHintsWidget extends Disposable {\n    static { ParameterHintsWidget_1 = this; }\n    static { this.ID = 'editor.widget.parameterHintsWidget'; }\n    constructor(editor, model, contextKeyService, markdownRendererService) {\n        super();\n        this.editor = editor;\n        this.model = model;\n        this.markdownRendererService = markdownRendererService;\n        this.renderDisposeables = this._register(new DisposableStore());\n        this.visible = false;\n        this.announcedLabel = null;\n        // Editor.IContentWidget.allowEditorOverflow\n        this.allowEditorOverflow = true;\n        this.keyVisible = Context.Visible.bindTo(contextKeyService);\n        this.keyMultipleSignatures = Context.MultipleSignatures.bindTo(contextKeyService);\n    }\n    createParameterHintDOMNodes() {\n        const element = $('.editor-widget.parameter-hints-widget');\n        const wrapper = append(element, $('.phwrapper'));\n        wrapper.tabIndex = -1;\n        const controls = append(wrapper, $('.controls'));\n        const previous = append(controls, $('.button' + ThemeIcon.asCSSSelector(parameterHintsPreviousIcon)));\n        const overloads = append(controls, $('.overloads'));\n        const next = append(controls, $('.button' + ThemeIcon.asCSSSelector(parameterHintsNextIcon)));\n        this._register(addDisposableListener(previous, 'click', e => {\n            EventHelper.stop(e);\n            this.previous();\n        }));\n        this._register(addDisposableListener(next, 'click', e => {\n            EventHelper.stop(e);\n            this.next();\n        }));\n        const body = $('.body');\n        const scrollbar = new DomScrollableElement(body, {\n            alwaysConsumeMouseWheel: true,\n        });\n        this._register(scrollbar);\n        wrapper.appendChild(scrollbar.getDomNode());\n        const signature = append(body, $('.signature'));\n        const docs = append(body, $('.docs'));\n        element.style.userSelect = 'text';\n        this.domNodes = {\n            element,\n            signature,\n            overloads,\n            docs,\n            scrollbar,\n        };\n        this.editor.addContentWidget(this);\n        this.hide();\n        this._register(this.editor.onDidChangeCursorSelection(e => {\n            if (this.visible) {\n                this.editor.layoutContentWidget(this);\n            }\n        }));\n        const updateFont = () => {\n            if (!this.domNodes) {\n                return;\n            }\n            const fontInfo = this.editor.getOption(59 /* EditorOption.fontInfo */);\n            const element = this.domNodes.element;\n            element.style.fontSize = `${fontInfo.fontSize}px`;\n            element.style.lineHeight = `${fontInfo.lineHeight / fontInfo.fontSize}`;\n            element.style.setProperty('--vscode-parameterHintsWidget-editorFontFamily', fontInfo.fontFamily);\n            element.style.setProperty('--vscode-parameterHintsWidget-editorFontFamilyDefault', EDITOR_FONT_DEFAULTS.fontFamily);\n        };\n        updateFont();\n        this._register(Event.chain(this.editor.onDidChangeConfiguration.bind(this.editor), $ => $.filter(e => e.hasChanged(59 /* EditorOption.fontInfo */)))(updateFont));\n        this._register(this.editor.onDidLayoutChange(e => this.updateMaxHeight()));\n        this.updateMaxHeight();\n    }\n    show() {\n        if (this.visible) {\n            return;\n        }\n        if (!this.domNodes) {\n            this.createParameterHintDOMNodes();\n        }\n        this.keyVisible.set(true);\n        this.visible = true;\n        setTimeout(() => {\n            this.domNodes?.element.classList.add('visible');\n        }, 100);\n        this.editor.layoutContentWidget(this);\n    }\n    hide() {\n        this.renderDisposeables.clear();\n        if (!this.visible) {\n            return;\n        }\n        this.keyVisible.reset();\n        this.visible = false;\n        this.announcedLabel = null;\n        this.domNodes?.element.classList.remove('visible');\n        this.editor.layoutContentWidget(this);\n    }\n    getPosition() {\n        if (this.visible) {\n            return {\n                position: this.editor.getPosition(),\n                preference: [1 /* ContentWidgetPositionPreference.ABOVE */, 2 /* ContentWidgetPositionPreference.BELOW */]\n            };\n        }\n        return null;\n    }\n    render(hints) {\n        this.renderDisposeables.clear();\n        if (!this.domNodes) {\n            return;\n        }\n        const multiple = hints.signatures.length > 1;\n        this.domNodes.element.classList.toggle('multiple', multiple);\n        this.keyMultipleSignatures.set(multiple);\n        this.domNodes.signature.innerText = '';\n        this.domNodes.docs.innerText = '';\n        const signature = hints.signatures[hints.activeSignature];\n        if (!signature) {\n            return;\n        }\n        const code = append(this.domNodes.signature, $('.code'));\n        const hasParameters = signature.parameters.length > 0;\n        const activeParameterIndex = signature.activeParameter ?? hints.activeParameter;\n        if (!hasParameters) {\n            const label = append(code, $('span'));\n            label.textContent = signature.label;\n        }\n        else {\n            this.renderParameters(code, signature, activeParameterIndex);\n        }\n        const activeParameter = signature.parameters[activeParameterIndex];\n        if (activeParameter?.documentation) {\n            const documentation = $('span.documentation');\n            if (typeof activeParameter.documentation === 'string') {\n                documentation.textContent = activeParameter.documentation;\n            }\n            else {\n                const renderedContents = this.renderMarkdownDocs(activeParameter.documentation);\n                documentation.appendChild(renderedContents.element);\n            }\n            append(this.domNodes.docs, $('p', {}, documentation));\n        }\n        if (signature.documentation === undefined) ;\n        else if (typeof signature.documentation === 'string') {\n            append(this.domNodes.docs, $('p', {}, signature.documentation));\n        }\n        else {\n            const renderedContents = this.renderMarkdownDocs(signature.documentation);\n            append(this.domNodes.docs, renderedContents.element);\n        }\n        const hasDocs = this.hasDocs(signature, activeParameter);\n        this.domNodes.signature.classList.toggle('has-docs', hasDocs);\n        this.domNodes.docs.classList.toggle('empty', !hasDocs);\n        this.domNodes.overloads.textContent =\n            String(hints.activeSignature + 1).padStart(hints.signatures.length.toString().length, '0') + '/' + hints.signatures.length;\n        if (activeParameter) {\n            let labelToAnnounce = '';\n            const param = signature.parameters[activeParameterIndex];\n            if (Array.isArray(param.label)) {\n                labelToAnnounce = signature.label.substring(param.label[0], param.label[1]);\n            }\n            else {\n                labelToAnnounce = param.label;\n            }\n            if (param.documentation) {\n                labelToAnnounce += typeof param.documentation === 'string' ? `, ${param.documentation}` : `, ${param.documentation.value}`;\n            }\n            if (signature.documentation) {\n                labelToAnnounce += typeof signature.documentation === 'string' ? `, ${signature.documentation}` : `, ${signature.documentation.value}`;\n            }\n            // Select method gets called on every user type while parameter hints are visible.\n            // We do not want to spam the user with same announcements, so we only announce if the current parameter changed.\n            if (this.announcedLabel !== labelToAnnounce) {\n                alert(localize(1314, \"{0}, hint\", labelToAnnounce));\n                this.announcedLabel = labelToAnnounce;\n            }\n        }\n        this.editor.layoutContentWidget(this);\n        this.domNodes.scrollbar.scanDomNode();\n    }\n    renderMarkdownDocs(markdown) {\n        const renderedContents = this.renderDisposeables.add(this.markdownRendererService.render(markdown, {\n            context: this.editor,\n            asyncRenderCallback: () => {\n                this.domNodes?.scrollbar.scanDomNode();\n            }\n        }));\n        renderedContents.element.classList.add('markdown-docs');\n        return renderedContents;\n    }\n    hasDocs(signature, activeParameter) {\n        if (activeParameter && typeof activeParameter.documentation === 'string' && assertReturnsDefined(activeParameter.documentation).length > 0) {\n            return true;\n        }\n        if (activeParameter && typeof activeParameter.documentation === 'object' && assertReturnsDefined(activeParameter.documentation).value.length > 0) {\n            return true;\n        }\n        if (signature.documentation && typeof signature.documentation === 'string' && assertReturnsDefined(signature.documentation).length > 0) {\n            return true;\n        }\n        if (signature.documentation && typeof signature.documentation === 'object' && assertReturnsDefined(signature.documentation.value).length > 0) {\n            return true;\n        }\n        return false;\n    }\n    renderParameters(parent, signature, activeParameterIndex) {\n        const [start, end] = this.getParameterLabelOffsets(signature, activeParameterIndex);\n        const beforeSpan = document.createElement('span');\n        beforeSpan.textContent = signature.label.substring(0, start);\n        const paramSpan = document.createElement('span');\n        paramSpan.textContent = signature.label.substring(start, end);\n        paramSpan.className = 'parameter active';\n        const afterSpan = document.createElement('span');\n        afterSpan.textContent = signature.label.substring(end);\n        append(parent, beforeSpan, paramSpan, afterSpan);\n    }\n    getParameterLabelOffsets(signature, paramIdx) {\n        const param = signature.parameters[paramIdx];\n        if (!param) {\n            return [0, 0];\n        }\n        else if (Array.isArray(param.label)) {\n            return param.label;\n        }\n        else if (!param.label.length) {\n            return [0, 0];\n        }\n        else {\n            const regex = new RegExp(`(\\\\W|^)${escapeRegExpCharacters(param.label)}(?=\\\\W|$)`, 'g');\n            regex.test(signature.label);\n            const idx = regex.lastIndex - param.label.length;\n            return idx >= 0\n                ? [idx, regex.lastIndex]\n                : [0, 0];\n        }\n    }\n    next() {\n        this.editor.focus();\n        this.model.next();\n    }\n    previous() {\n        this.editor.focus();\n        this.model.previous();\n    }\n    getDomNode() {\n        if (!this.domNodes) {\n            this.createParameterHintDOMNodes();\n        }\n        return this.domNodes.element;\n    }\n    getId() {\n        return ParameterHintsWidget_1.ID;\n    }\n    updateMaxHeight() {\n        if (!this.domNodes) {\n            return;\n        }\n        const height = Math.max(this.editor.getLayoutInfo().height / 4, 250);\n        const maxHeight = `${height}px`;\n        this.domNodes.element.style.maxHeight = maxHeight;\n        // eslint-disable-next-line no-restricted-syntax\n        const wrapper = this.domNodes.element.getElementsByClassName('phwrapper');\n        if (wrapper.length) {\n            wrapper[0].style.maxHeight = maxHeight;\n        }\n    }\n};\nParameterHintsWidget = ParameterHintsWidget_1 = __decorate([\n    __param(2, IContextKeyService),\n    __param(3, IMarkdownRendererService)\n], ParameterHintsWidget);\nregisterColor('editorHoverWidget.highlightForeground', listHighlightForeground, localize(1315, 'Foreground color of the active item in the parameter hint.'));\n\nexport { ParameterHintsWidget };\n","import { Lazy } from '../../../../base/common/lazy.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { registerEditorContribution, registerEditorAction, EditorCommand, registerEditorCommand, EditorAction } from '../../../browser/editorExtensions.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { SignatureHelpTriggerKind } from '../../../common/languages.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { ParameterHintsModel } from './parameterHintsModel.js';\nimport { Context } from './provideSignatureHelp.js';\nimport { localize2 } from '../../../../nls.js';\nimport { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { ParameterHintsWidget } from './parameterHintsWidget.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ParameterHintsController_1;\nlet ParameterHintsController = class ParameterHintsController extends Disposable {\n    static { ParameterHintsController_1 = this; }\n    static { this.ID = 'editor.controller.parameterHints'; }\n    static get(editor) {\n        return editor.getContribution(ParameterHintsController_1.ID);\n    }\n    constructor(editor, instantiationService, languageFeaturesService) {\n        super();\n        this.editor = editor;\n        this.model = this._register(new ParameterHintsModel(editor, languageFeaturesService.signatureHelpProvider));\n        this._register(this.model.onChangedHints(newParameterHints => {\n            if (newParameterHints) {\n                this.widget.value.show();\n                this.widget.value.render(newParameterHints);\n            }\n            else {\n                this.widget.rawValue?.hide();\n            }\n        }));\n        this.widget = new Lazy(() => this._register(instantiationService.createInstance(ParameterHintsWidget, this.editor, this.model)));\n    }\n    cancel() {\n        this.model.cancel();\n    }\n    previous() {\n        this.widget.rawValue?.previous();\n    }\n    next() {\n        this.widget.rawValue?.next();\n    }\n    trigger(context) {\n        this.model.trigger(context, 0);\n    }\n};\nParameterHintsController = ParameterHintsController_1 = __decorate([\n    __param(1, IInstantiationService),\n    __param(2, ILanguageFeaturesService)\n], ParameterHintsController);\nclass TriggerParameterHintsAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.triggerParameterHints',\n            label: localize2(1311, \"Trigger Parameter Hints\"),\n            precondition: EditorContextKeys.hasSignatureHelpProvider,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 10 /* KeyCode.Space */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(accessor, editor) {\n        const controller = ParameterHintsController.get(editor);\n        controller?.trigger({\n            triggerKind: SignatureHelpTriggerKind.Invoke\n        });\n    }\n}\nregisterEditorContribution(ParameterHintsController.ID, ParameterHintsController, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\nregisterEditorAction(TriggerParameterHintsAction);\nconst weight = 100 /* KeybindingWeight.EditorContrib */ + 75;\nconst ParameterHintsCommand = EditorCommand.bindToContribution(ParameterHintsController.get);\nregisterEditorCommand(new ParameterHintsCommand({\n    id: 'closeParameterHints',\n    precondition: Context.Visible,\n    handler: x => x.cancel(),\n    kbOpts: {\n        weight: weight,\n        kbExpr: EditorContextKeys.focus,\n        primary: 9 /* KeyCode.Escape */,\n        secondary: [1024 /* KeyMod.Shift */ | 9 /* KeyCode.Escape */]\n    }\n}));\nregisterEditorCommand(new ParameterHintsCommand({\n    id: 'showPrevParameterHint',\n    precondition: ContextKeyExpr.and(Context.Visible, Context.MultipleSignatures),\n    handler: x => x.previous(),\n    kbOpts: {\n        weight: weight,\n        kbExpr: EditorContextKeys.focus,\n        primary: 16 /* KeyCode.UpArrow */,\n        secondary: [512 /* KeyMod.Alt */ | 16 /* KeyCode.UpArrow */],\n        mac: { primary: 16 /* KeyCode.UpArrow */, secondary: [512 /* KeyMod.Alt */ | 16 /* KeyCode.UpArrow */, 256 /* KeyMod.WinCtrl */ | 46 /* KeyCode.KeyP */] }\n    }\n}));\nregisterEditorCommand(new ParameterHintsCommand({\n    id: 'showNextParameterHint',\n    precondition: ContextKeyExpr.and(Context.Visible, Context.MultipleSignatures),\n    handler: x => x.next(),\n    kbOpts: {\n        weight: weight,\n        kbExpr: EditorContextKeys.focus,\n        primary: 18 /* KeyCode.DownArrow */,\n        secondary: [512 /* KeyMod.Alt */ | 18 /* KeyCode.DownArrow */],\n        mac: { primary: 18 /* KeyCode.DownArrow */, secondary: [512 /* KeyMod.Alt */ | 18 /* KeyCode.DownArrow */, 256 /* KeyMod.WinCtrl */ | 44 /* KeyCode.KeyN */] }\n    }\n}));\n\nexport { ParameterHintsController, TriggerParameterHintsAction };\n","import { h } from '../../../../base/browser/dom.js';\nimport { structuralEquals } from '../../../../base/common/equals.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { observableCodeEditor } from '../../../browser/observableCodeEditor.js';\nimport { derivedOpts, derived } from '../../../../base/common/observableInternal/observables/derived.js';\nimport { autorun } from '../../../../base/common/observableInternal/reactions/autorun.js';\nimport { constObservable } from '../../../../base/common/observableInternal/observables/constObservable.js';\nimport { derivedObservableWithCache } from '../../../../base/common/observableInternal/utils/utils.js';\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/**\n * Use the editor option to set the placeholder text.\n*/\nclass PlaceholderTextContribution extends Disposable {\n    static { this.ID = 'editor.contrib.placeholderText'; }\n    constructor(_editor) {\n        super();\n        this._editor = _editor;\n        this._editorObs = observableCodeEditor(this._editor);\n        this._placeholderText = this._editorObs.getOption(100 /* EditorOption.placeholder */);\n        this._state = derivedOpts({ owner: this, equalsFn: structuralEquals }, reader => {\n            const p = this._placeholderText.read(reader);\n            if (!p) {\n                return undefined;\n            }\n            if (!this._editorObs.valueIsEmpty.read(reader)) {\n                return undefined;\n            }\n            return { placeholder: p };\n        });\n        this._shouldViewBeAlive = isOrWasTrue(this, reader => this._state.read(reader)?.placeholder !== undefined);\n        this._view = derived((reader) => {\n            if (!this._shouldViewBeAlive.read(reader)) {\n                return;\n            }\n            const element = h('div.editorPlaceholder');\n            reader.store.add(autorun(reader => {\n                const data = this._state.read(reader);\n                const shouldBeVisibile = data?.placeholder !== undefined;\n                element.root.style.display = shouldBeVisibile ? 'block' : 'none';\n                element.root.innerText = data?.placeholder ?? '';\n            }));\n            reader.store.add(autorun(reader => {\n                const info = this._editorObs.layoutInfo.read(reader);\n                element.root.style.left = `${info.contentLeft}px`;\n                element.root.style.width = (info.contentWidth - info.verticalScrollbarWidth) + 'px';\n                element.root.style.top = `${this._editor.getTopForLineNumber(0)}px`;\n            }));\n            reader.store.add(autorun(reader => {\n                element.root.style.fontFamily = this._editorObs.getOption(58 /* EditorOption.fontFamily */).read(reader);\n                element.root.style.fontSize = this._editorObs.getOption(61 /* EditorOption.fontSize */).read(reader) + 'px';\n                element.root.style.lineHeight = this._editorObs.getOption(75 /* EditorOption.lineHeight */).read(reader) + 'px';\n            }));\n            reader.store.add(this._editorObs.createOverlayWidget({\n                allowEditorOverflow: false,\n                minContentWidthInPx: constObservable(0),\n                position: constObservable(null),\n                domNode: element.root,\n            }));\n        });\n        this._view.recomputeInitiallyAndOnChange(this._store);\n    }\n}\nfunction isOrWasTrue(owner, fn) {\n    return derivedObservableWithCache(owner, (reader, lastValue) => {\n        if (lastValue === true) {\n            return true;\n        }\n        return fn(reader);\n    });\n}\n\nexport { PlaceholderTextContribution };\n","import '../../../base/common/observableInternal/index.js';\nimport { IInstantiationService } from '../../instantiation/common/instantiation.js';\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass BaseClass {\n    constructor(instantiationService) {\n        this.instantiationService = instantiationService;\n    }\n    init(...params) { }\n}\n/**\n * Wrap a class in a reloadable wrapper.\n * When the wrapper is created, the original class is created.\n * When the original class changes, the instance is re-created.\n*/\nfunction wrapInReloadableClass1(getClass) {\n    // eslint-disable-next-line local/code-no-any-casts\n    return getClass() ;\n}\nlet BaseClass1 = class BaseClass1 extends BaseClass {\n    constructor(param1, i) { super(i); this.init(param1); }\n};\nBaseClass1 = __decorate([\n    __param(1, IInstantiationService)\n], BaseClass1);\n\nexport { wrapInReloadableClass1 };\n","import './placeholderText.css';\nimport { registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { ghostTextForeground } from '../../../common/core/editorColorRegistry.js';\nimport { localize } from '../../../../nls.js';\nimport { registerColor } from '../../../../platform/theme/common/colorUtils.js';\nimport { PlaceholderTextContribution } from './placeholderTextContribution.js';\nimport { wrapInReloadableClass1 } from '../../../../platform/observable/common/wrapInReloadableClass.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterEditorContribution(PlaceholderTextContribution.ID, wrapInReloadableClass1(() => PlaceholderTextContribution), 0 /* EditorContributionInstantiation.Eager */);\nregisterColor('editor.placeholder.foreground', ghostTextForeground, localize(1334, 'Foreground color of the placeholder text in the editor.'));\n","import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\n\nconst ITextResourceConfigurationService = createDecorator('textResourceConfigurationService');\nconst ITextResourcePropertiesService = createDecorator('textResourcePropertiesService');\n\nexport { ITextResourceConfigurationService, ITextResourcePropertiesService };\n","import { getClientArea, getDomNodePagePosition, getTotalHeight, getTotalWidth, addDisposableListener, EventType, clearNode } from '../../../../base/browser/dom.js';\nimport { StandardKeyboardEvent } from '../../../../base/browser/keyboardEvent.js';\nimport { status } from '../../../../base/browser/ui/aria/aria.js';\nimport { getBaseLayerHoverDelegate } from '../../../../base/browser/ui/hover/hoverDelegate2.js';\nimport { renderIcon } from '../../../../base/browser/ui/iconLabel/iconLabels.js';\nimport { List } from '../../../../base/browser/ui/list/listWidget.js';\nimport { distinct } from '../../../../base/common/arrays.js';\nimport { DeferredPromise, raceCancellation } from '../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { DisposableStore, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { StopWatch } from '../../../../base/common/stopwatch.js';\nimport { assertType, isDefined } from '../../../../base/common/types.js';\nimport './renameWidget.css';\nimport { applyFontInfo } from '../../../browser/config/domFontInfo.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { NewSymbolNameTriggerKind, NewSymbolNameTag } from '../../../common/languages.js';\nimport { localize } from '../../../../nls.js';\nimport { RawContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { ILogService } from '../../../../platform/log/common/log.js';\nimport { getListStyles } from '../../../../platform/theme/browser/defaultStyles.js';\nimport '../../../../platform/theme/common/colorUtils.js';\nimport '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { widgetShadow, widgetBorder, editorWidgetBackground } from '../../../../platform/theme/common/colors/editorColors.js';\nimport { inputForeground, inputBorder, inputBackground } from '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport { quickInputListFocusBackground, quickInputListFocusForeground } from '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\nimport { IThemeService } from '../../../../platform/theme/common/themeService.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst CONTEXT_RENAME_INPUT_VISIBLE = new RawContextKey('renameInputVisible', false, localize(1391, \"Whether the rename input widget is visible\"));\nnew RawContextKey('renameInputFocused', false, localize(1392, \"Whether the rename input widget is focused\"));\nlet RenameWidget = class RenameWidget {\n    constructor(_editor, _acceptKeybindings, _themeService, _keybindingService, contextKeyService, _logService) {\n        this._editor = _editor;\n        this._acceptKeybindings = _acceptKeybindings;\n        this._themeService = _themeService;\n        this._keybindingService = _keybindingService;\n        this._logService = _logService;\n        // implement IContentWidget\n        this.allowEditorOverflow = true;\n        this._disposables = new DisposableStore();\n        this._visibleContextKey = CONTEXT_RENAME_INPUT_VISIBLE.bindTo(contextKeyService);\n        this._isEditingRenameCandidate = false;\n        this._nRenameSuggestionsInvocations = 0;\n        this._hadAutomaticRenameSuggestionsInvocation = false;\n        this._candidates = new Set();\n        this._beforeFirstInputFieldEditSW = new StopWatch();\n        this._inputWithButton = new InputWithButton();\n        this._disposables.add(this._inputWithButton);\n        this._editor.addContentWidget(this);\n        this._disposables.add(this._editor.onDidChangeConfiguration(e => {\n            if (e.hasChanged(59 /* EditorOption.fontInfo */)) {\n                this._updateFont();\n            }\n        }));\n        this._disposables.add(_themeService.onDidColorThemeChange(this._updateStyles, this));\n    }\n    dispose() {\n        this._disposables.dispose();\n        this._editor.removeContentWidget(this);\n    }\n    getId() {\n        return '__renameInputWidget';\n    }\n    getDomNode() {\n        if (!this._domNode) {\n            this._domNode = document.createElement('div');\n            this._domNode.className = 'monaco-editor rename-box';\n            this._domNode.appendChild(this._inputWithButton.domNode);\n            this._renameCandidateListView = this._disposables.add(new RenameCandidateListView(this._domNode, {\n                fontInfo: this._editor.getOption(59 /* EditorOption.fontInfo */),\n                onFocusChange: (newSymbolName) => {\n                    this._inputWithButton.input.value = newSymbolName;\n                    this._isEditingRenameCandidate = false; // @ulugbekna: reset\n                },\n                onSelectionChange: () => {\n                    this._isEditingRenameCandidate = false; // @ulugbekna: because user picked a rename suggestion\n                    this.acceptInput(false); // we don't allow preview with mouse click for now\n                }\n            }));\n            this._disposables.add(this._inputWithButton.onDidInputChange(() => {\n                if (this._renameCandidateListView?.focusedCandidate !== undefined) {\n                    this._isEditingRenameCandidate = true;\n                }\n                this._timeBeforeFirstInputFieldEdit ??= this._beforeFirstInputFieldEditSW.elapsed();\n                if (this._renameCandidateProvidersCts?.token.isCancellationRequested === false) {\n                    this._renameCandidateProvidersCts.cancel();\n                }\n                this._renameCandidateListView?.clearFocus();\n            }));\n            this._label = document.createElement('div');\n            this._label.className = 'rename-label';\n            this._domNode.appendChild(this._label);\n            this._updateFont();\n            this._updateStyles(this._themeService.getColorTheme());\n        }\n        return this._domNode;\n    }\n    _updateStyles(theme) {\n        if (!this._domNode) {\n            return;\n        }\n        const widgetShadowColor = theme.getColor(widgetShadow);\n        const widgetBorderColor = theme.getColor(widgetBorder);\n        this._domNode.style.backgroundColor = String(theme.getColor(editorWidgetBackground) ?? '');\n        this._domNode.style.boxShadow = widgetShadowColor ? ` 0 0 8px 2px ${widgetShadowColor}` : '';\n        this._domNode.style.border = widgetBorderColor ? `1px solid ${widgetBorderColor}` : '';\n        this._domNode.style.color = String(theme.getColor(inputForeground) ?? '');\n        const border = theme.getColor(inputBorder);\n        this._inputWithButton.domNode.style.backgroundColor = String(theme.getColor(inputBackground) ?? '');\n        this._inputWithButton.input.style.backgroundColor = String(theme.getColor(inputBackground) ?? '');\n        this._inputWithButton.domNode.style.borderWidth = border ? '1px' : '0px';\n        this._inputWithButton.domNode.style.borderStyle = border ? 'solid' : 'none';\n        this._inputWithButton.domNode.style.borderColor = border?.toString() ?? 'none';\n    }\n    _updateFont() {\n        if (this._domNode === undefined) {\n            return;\n        }\n        assertType(this._label !== undefined, 'RenameWidget#_updateFont: _label must not be undefined given _domNode is defined');\n        this._editor.applyFontInfo(this._inputWithButton.input);\n        const fontInfo = this._editor.getOption(59 /* EditorOption.fontInfo */);\n        this._label.style.fontSize = `${this._computeLabelFontSize(fontInfo.fontSize)}px`;\n    }\n    _computeLabelFontSize(editorFontSize) {\n        return editorFontSize * 0.8;\n    }\n    getPosition() {\n        if (!this._visible) {\n            return null;\n        }\n        if (!this._editor.hasModel() || // @ulugbekna: shouldn't happen\n            !this._editor.getDomNode() // @ulugbekna: can happen during tests based on suggestWidget's similar predicate check\n        ) {\n            return null;\n        }\n        const bodyBox = getClientArea(this.getDomNode().ownerDocument.body);\n        const editorBox = getDomNodePagePosition(this._editor.getDomNode());\n        const cursorBoxTop = this._getTopForPosition();\n        this._nPxAvailableAbove = cursorBoxTop + editorBox.top;\n        this._nPxAvailableBelow = bodyBox.height - this._nPxAvailableAbove;\n        const lineHeight = this._editor.getOption(75 /* EditorOption.lineHeight */);\n        const { totalHeight: candidateViewHeight } = RenameCandidateView.getLayoutInfo({ lineHeight });\n        const positionPreference = this._nPxAvailableBelow > candidateViewHeight * 6 /* approximate # of candidates to fit in (inclusive of rename input box & rename label) */\n            ? [2 /* ContentWidgetPositionPreference.BELOW */, 1 /* ContentWidgetPositionPreference.ABOVE */]\n            : [1 /* ContentWidgetPositionPreference.ABOVE */, 2 /* ContentWidgetPositionPreference.BELOW */];\n        return {\n            position: this._position,\n            preference: positionPreference,\n        };\n    }\n    beforeRender() {\n        const [accept, preview] = this._acceptKeybindings;\n        this._label.innerText = localize(1393, \"{0} to Rename, {1} to Preview\", this._keybindingService.lookupKeybinding(accept)?.getLabel(), this._keybindingService.lookupKeybinding(preview)?.getLabel());\n        this._domNode.style.minWidth = `200px`; // to prevent from widening when candidates come in\n        return null;\n    }\n    afterRender(position) {\n        // FIXME@ulugbekna: commenting trace log out until we start unmounting the widget from editor properly - https://github.com/microsoft/vscode/issues/226975\n        // this._trace('invoking afterRender, position: ', position ? 'not null' : 'null');\n        if (position === null) {\n            // cancel rename when input widget isn't rendered anymore\n            this.cancelInput(true, 'afterRender (because position is null)');\n            return;\n        }\n        if (!this._editor.hasModel() || // shouldn't happen\n            !this._editor.getDomNode() // can happen during tests based on suggestWidget's similar predicate check\n        ) {\n            return;\n        }\n        assertType(this._renameCandidateListView);\n        assertType(this._nPxAvailableAbove !== undefined);\n        assertType(this._nPxAvailableBelow !== undefined);\n        const inputBoxHeight = getTotalHeight(this._inputWithButton.domNode);\n        const labelHeight = getTotalHeight(this._label);\n        let totalHeightAvailable;\n        if (position === 2 /* ContentWidgetPositionPreference.BELOW */) {\n            totalHeightAvailable = this._nPxAvailableBelow;\n        }\n        else {\n            totalHeightAvailable = this._nPxAvailableAbove;\n        }\n        this._renameCandidateListView.layout({\n            height: totalHeightAvailable - labelHeight - inputBoxHeight,\n            width: getTotalWidth(this._inputWithButton.domNode),\n        });\n    }\n    acceptInput(wantsPreview) {\n        this._trace(`invoking acceptInput`);\n        this._currentAcceptInput?.(wantsPreview);\n    }\n    cancelInput(focusEditor, caller) {\n        // this._trace(`invoking cancelInput, caller: ${caller}, _currentCancelInput: ${this._currentAcceptInput ? 'not undefined' : 'undefined'}`);\n        this._currentCancelInput?.(focusEditor);\n    }\n    focusNextRenameSuggestion() {\n        if (!this._renameCandidateListView?.focusNext()) {\n            this._inputWithButton.input.value = this._currentName;\n        }\n    }\n    focusPreviousRenameSuggestion() {\n        if (!this._renameCandidateListView?.focusPrevious()) {\n            this._inputWithButton.input.value = this._currentName;\n        }\n    }\n    /**\n     * @param requestRenameCandidates is `undefined` when there are no rename suggestion providers\n     */\n    getInput(where, currentName, supportPreview, requestRenameCandidates, cts) {\n        const { start: selectionStart, end: selectionEnd } = this._getSelection(where, currentName);\n        this._renameCts = cts;\n        const disposeOnDone = new DisposableStore();\n        this._nRenameSuggestionsInvocations = 0;\n        this._hadAutomaticRenameSuggestionsInvocation = false;\n        if (requestRenameCandidates === undefined) {\n            this._inputWithButton.button.style.display = 'none';\n        }\n        else {\n            this._inputWithButton.button.style.display = 'flex';\n            this._requestRenameCandidatesOnce = requestRenameCandidates;\n            this._requestRenameCandidates(currentName, false);\n            disposeOnDone.add(addDisposableListener(this._inputWithButton.button, 'click', () => this._requestRenameCandidates(currentName, true)));\n            disposeOnDone.add(addDisposableListener(this._inputWithButton.button, EventType.KEY_DOWN, (e) => {\n                const keyEvent = new StandardKeyboardEvent(e);\n                if (keyEvent.equals(3 /* KeyCode.Enter */) || keyEvent.equals(10 /* KeyCode.Space */)) {\n                    keyEvent.stopPropagation();\n                    keyEvent.preventDefault();\n                    this._requestRenameCandidates(currentName, true);\n                }\n            }));\n        }\n        this._isEditingRenameCandidate = false;\n        this._domNode.classList.toggle('preview', supportPreview);\n        this._position = new Position(where.startLineNumber, where.startColumn);\n        this._currentName = currentName;\n        this._inputWithButton.input.value = currentName;\n        this._inputWithButton.input.setAttribute('selectionStart', selectionStart.toString());\n        this._inputWithButton.input.setAttribute('selectionEnd', selectionEnd.toString());\n        this._inputWithButton.input.size = Math.max((where.endColumn - where.startColumn) * 1.1, 20); // determines width\n        this._beforeFirstInputFieldEditSW.reset();\n        disposeOnDone.add(toDisposable(() => {\n            this._renameCts = undefined;\n            cts.dispose(true);\n        })); // @ulugbekna: this may result in `this.cancelInput` being called twice, but it should be safe since we set it to undefined after 1st call\n        disposeOnDone.add(toDisposable(() => {\n            if (this._renameCandidateProvidersCts !== undefined) {\n                this._renameCandidateProvidersCts.dispose(true);\n                this._renameCandidateProvidersCts = undefined;\n            }\n        }));\n        disposeOnDone.add(toDisposable(() => this._candidates.clear()));\n        const inputResult = new DeferredPromise();\n        inputResult.p.finally(() => {\n            disposeOnDone.dispose();\n            this._hide();\n        });\n        this._currentCancelInput = (focusEditor) => {\n            this._trace('invoking _currentCancelInput');\n            this._currentAcceptInput = undefined;\n            this._currentCancelInput = undefined;\n            // fixme session cleanup\n            this._renameCandidateListView?.clearCandidates();\n            inputResult.complete(focusEditor);\n            return true;\n        };\n        this._currentAcceptInput = (wantsPreview) => {\n            this._trace('invoking _currentAcceptInput');\n            assertType(this._renameCandidateListView !== undefined);\n            const nRenameSuggestions = this._renameCandidateListView.nCandidates;\n            let newName;\n            let source;\n            const focusedCandidate = this._renameCandidateListView.focusedCandidate;\n            if (focusedCandidate !== undefined) {\n                this._trace('using new name from renameSuggestion');\n                newName = focusedCandidate;\n                source = { k: 'renameSuggestion' };\n            }\n            else {\n                this._trace('using new name from inputField');\n                newName = this._inputWithButton.input.value;\n                source = this._isEditingRenameCandidate ? { k: 'userEditedRenameSuggestion' } : { k: 'inputField' };\n            }\n            if (newName === currentName || newName.trim().length === 0 /* is just whitespace */) {\n                this.cancelInput(true, '_currentAcceptInput (because newName === value || newName.trim().length === 0)');\n                return;\n            }\n            this._currentAcceptInput = undefined;\n            this._currentCancelInput = undefined;\n            this._renameCandidateListView.clearCandidates();\n            // fixme session cleanup\n            inputResult.complete({\n                newName,\n                wantsPreview: supportPreview && wantsPreview,\n                stats: {\n                    source,\n                    nRenameSuggestions,\n                    timeBeforeFirstInputFieldEdit: this._timeBeforeFirstInputFieldEdit,\n                    nRenameSuggestionsInvocations: this._nRenameSuggestionsInvocations,\n                    hadAutomaticRenameSuggestionsInvocation: this._hadAutomaticRenameSuggestionsInvocation,\n                }\n            });\n        };\n        disposeOnDone.add(cts.token.onCancellationRequested(() => this.cancelInput(true, 'cts.token.onCancellationRequested')));\n        {\n            disposeOnDone.add(this._editor.onDidBlurEditorWidget(() => this.cancelInput(!this._domNode?.ownerDocument.hasFocus(), 'editor.onDidBlurEditorWidget')));\n        }\n        this._show();\n        return inputResult.p;\n    }\n    _requestRenameCandidates(currentName, isManuallyTriggered) {\n        if (this._requestRenameCandidatesOnce === undefined) {\n            return;\n        }\n        if (this._renameCandidateProvidersCts !== undefined) {\n            this._renameCandidateProvidersCts.dispose(true);\n        }\n        assertType(this._renameCts);\n        if (this._inputWithButton.buttonState !== 'stop') {\n            this._renameCandidateProvidersCts = new CancellationTokenSource();\n            const triggerKind = isManuallyTriggered ? NewSymbolNameTriggerKind.Invoke : NewSymbolNameTriggerKind.Automatic;\n            const candidates = this._requestRenameCandidatesOnce(triggerKind, this._renameCandidateProvidersCts.token);\n            if (candidates.length === 0) {\n                this._inputWithButton.setSparkleButton();\n                return;\n            }\n            if (!isManuallyTriggered) {\n                this._hadAutomaticRenameSuggestionsInvocation = true;\n            }\n            this._nRenameSuggestionsInvocations += 1;\n            this._inputWithButton.setStopButton();\n            this._updateRenameCandidates(candidates, currentName, this._renameCts.token);\n        }\n    }\n    /**\n     * This allows selecting only part of the symbol name in the input field based on the selection in the editor\n     */\n    _getSelection(where, currentName) {\n        assertType(this._editor.hasModel());\n        const selection = this._editor.getSelection();\n        let start = 0;\n        let end = currentName.length;\n        if (!Range.isEmpty(selection) && !Range.spansMultipleLines(selection) && Range.containsRange(where, selection)) {\n            start = Math.max(0, selection.startColumn - where.startColumn);\n            end = Math.min(where.endColumn, selection.endColumn) - where.startColumn;\n        }\n        return { start, end };\n    }\n    _show() {\n        this._trace('invoking _show');\n        this._editor.revealLineInCenterIfOutsideViewport(this._position.lineNumber, 0 /* ScrollType.Smooth */);\n        this._visible = true;\n        this._visibleContextKey.set(true);\n        this._editor.layoutContentWidget(this);\n        // TODO@ulugbekna: could this be simply run in `afterRender`?\n        setTimeout(() => {\n            this._inputWithButton.input.focus();\n            this._inputWithButton.input.setSelectionRange(parseInt(this._inputWithButton.input.getAttribute('selectionStart')), parseInt(this._inputWithButton.input.getAttribute('selectionEnd')));\n        }, 100);\n    }\n    async _updateRenameCandidates(candidates, currentName, token) {\n        const trace = (...args) => this._trace('_updateRenameCandidates', ...args);\n        trace('start');\n        const namesListResults = await raceCancellation(Promise.allSettled(candidates), token);\n        this._inputWithButton.setSparkleButton();\n        if (namesListResults === undefined) {\n            trace('returning early - received updateRenameCandidates results - undefined');\n            return;\n        }\n        const newNames = namesListResults.flatMap(namesListResult => namesListResult.status === 'fulfilled' && isDefined(namesListResult.value)\n            ? namesListResult.value\n            : []);\n        trace(`received updateRenameCandidates results - total (unfiltered) ${newNames.length} candidates.`);\n        // deduplicate and filter out the current value\n        const distinctNames = distinct(newNames, v => v.newSymbolName);\n        trace(`distinct candidates - ${distinctNames.length} candidates.`);\n        const validDistinctNames = distinctNames.filter(({ newSymbolName }) => newSymbolName.trim().length > 0 && newSymbolName !== this._inputWithButton.input.value && newSymbolName !== currentName && !this._candidates.has(newSymbolName));\n        trace(`valid distinct candidates - ${newNames.length} candidates.`);\n        validDistinctNames.forEach(n => this._candidates.add(n.newSymbolName));\n        if (validDistinctNames.length < 1) {\n            trace('returning early - no valid distinct candidates');\n            return;\n        }\n        // show the candidates\n        trace('setting candidates');\n        this._renameCandidateListView.setCandidates(validDistinctNames);\n        // ask editor to re-layout given that the widget is now of a different size after rendering rename candidates\n        trace('asking editor to re-layout');\n        this._editor.layoutContentWidget(this);\n    }\n    _hide() {\n        this._trace('invoked _hide');\n        this._visible = false;\n        this._visibleContextKey.reset();\n        this._editor.layoutContentWidget(this);\n    }\n    _getTopForPosition() {\n        const visibleRanges = this._editor.getVisibleRanges();\n        let firstLineInViewport;\n        if (visibleRanges.length > 0) {\n            firstLineInViewport = visibleRanges[0].startLineNumber;\n        }\n        else {\n            this._logService.warn('RenameWidget#_getTopForPosition: this should not happen - visibleRanges is empty');\n            firstLineInViewport = Math.max(1, this._position.lineNumber - 5); // @ulugbekna: fallback to current line minus 5\n        }\n        return this._editor.getTopForLineNumber(this._position.lineNumber) - this._editor.getTopForLineNumber(firstLineInViewport);\n    }\n    _trace(...args) {\n        this._logService.trace('RenameWidget', ...args);\n    }\n};\nRenameWidget = __decorate([\n    __param(2, IThemeService),\n    __param(3, IKeybindingService),\n    __param(4, IContextKeyService),\n    __param(5, ILogService)\n], RenameWidget);\nclass RenameCandidateListView {\n    // FIXME@ulugbekna: rewrite using event emitters\n    constructor(parent, opts) {\n        this._disposables = new DisposableStore();\n        this._availableHeight = 0;\n        this._minimumWidth = 0;\n        this._lineHeight = opts.fontInfo.lineHeight;\n        this._typicalHalfwidthCharacterWidth = opts.fontInfo.typicalHalfwidthCharacterWidth;\n        this._listContainer = document.createElement('div');\n        this._listContainer.className = 'rename-box rename-candidate-list-container';\n        parent.appendChild(this._listContainer);\n        this._listWidget = RenameCandidateListView._createListWidget(this._listContainer, this._candidateViewHeight, opts.fontInfo);\n        this._disposables.add(this._listWidget.onDidChangeFocus(e => {\n            if (e.elements.length === 1) {\n                opts.onFocusChange(e.elements[0].newSymbolName);\n            }\n        }, this._disposables));\n        this._disposables.add(this._listWidget.onDidChangeSelection(e => {\n            if (e.elements.length === 1) {\n                opts.onSelectionChange();\n            }\n        }, this._disposables));\n        this._disposables.add(this._listWidget.onDidBlur(e => {\n            this._listWidget.setFocus([]);\n        }));\n        this._listWidget.style(getListStyles({\n            listInactiveFocusForeground: quickInputListFocusForeground,\n            listInactiveFocusBackground: quickInputListFocusBackground,\n        }));\n    }\n    dispose() {\n        this._listWidget.dispose();\n        this._disposables.dispose();\n    }\n    // height - max height allowed by parent element\n    layout({ height, width }) {\n        this._availableHeight = height;\n        this._minimumWidth = width;\n    }\n    setCandidates(candidates) {\n        // insert candidates into list widget\n        this._listWidget.splice(0, 0, candidates);\n        // adjust list widget layout\n        const height = this._pickListHeight(this._listWidget.length);\n        const width = this._pickListWidth(candidates);\n        this._listWidget.layout(height, width);\n        // adjust list container layout\n        this._listContainer.style.height = `${height}px`;\n        this._listContainer.style.width = `${width}px`;\n        status(localize(1394, \"Received {0} rename suggestions\", candidates.length));\n    }\n    clearCandidates() {\n        this._listContainer.style.height = '0px';\n        this._listContainer.style.width = '0px';\n        this._listWidget.splice(0, this._listWidget.length, []);\n    }\n    get nCandidates() {\n        return this._listWidget.length;\n    }\n    get focusedCandidate() {\n        if (this._listWidget.length === 0) {\n            return;\n        }\n        const selectedElement = this._listWidget.getSelectedElements()[0];\n        if (selectedElement !== undefined) {\n            return selectedElement.newSymbolName;\n        }\n        const focusedElement = this._listWidget.getFocusedElements()[0];\n        if (focusedElement !== undefined) {\n            return focusedElement.newSymbolName;\n        }\n        return;\n    }\n    focusNext() {\n        if (this._listWidget.length === 0) {\n            return false;\n        }\n        const focusedIxs = this._listWidget.getFocus();\n        if (focusedIxs.length === 0) {\n            this._listWidget.focusFirst();\n            this._listWidget.reveal(0);\n            return true;\n        }\n        else {\n            if (focusedIxs[0] === this._listWidget.length - 1) {\n                this._listWidget.setFocus([]);\n                this._listWidget.reveal(0); // @ulugbekna: without this, it seems like focused element is obstructed\n                return false;\n            }\n            else {\n                this._listWidget.focusNext();\n                const focused = this._listWidget.getFocus()[0];\n                this._listWidget.reveal(focused);\n                return true;\n            }\n        }\n    }\n    /**\n     * @returns true if focus is moved to previous element\n     */\n    focusPrevious() {\n        if (this._listWidget.length === 0) {\n            return false;\n        }\n        const focusedIxs = this._listWidget.getFocus();\n        if (focusedIxs.length === 0) {\n            this._listWidget.focusLast();\n            const focused = this._listWidget.getFocus()[0];\n            this._listWidget.reveal(focused);\n            return true;\n        }\n        else {\n            if (focusedIxs[0] === 0) {\n                this._listWidget.setFocus([]);\n                return false;\n            }\n            else {\n                this._listWidget.focusPrevious();\n                const focused = this._listWidget.getFocus()[0];\n                this._listWidget.reveal(focused);\n                return true;\n            }\n        }\n    }\n    clearFocus() {\n        this._listWidget.setFocus([]);\n    }\n    get _candidateViewHeight() {\n        const { totalHeight } = RenameCandidateView.getLayoutInfo({ lineHeight: this._lineHeight });\n        return totalHeight;\n    }\n    _pickListHeight(nCandidates) {\n        const heightToFitAllCandidates = this._candidateViewHeight * nCandidates;\n        const MAX_N_CANDIDATES = 7; // @ulugbekna: max # of candidates we want to show at once\n        const height = Math.min(heightToFitAllCandidates, this._availableHeight, this._candidateViewHeight * MAX_N_CANDIDATES);\n        return height;\n    }\n    _pickListWidth(candidates) {\n        const longestCandidateWidth = Math.ceil(Math.max(...candidates.map(c => c.newSymbolName.length)) * this._typicalHalfwidthCharacterWidth);\n        const width = Math.max(this._minimumWidth, 4 /* padding */ + 16 /* sparkle icon */ + 5 /* margin-left */ + longestCandidateWidth + 10 /* (possibly visible) scrollbar width */ // TODO@ulugbekna: approximate calc - clean this up\n        );\n        return width;\n    }\n    static _createListWidget(container, candidateViewHeight, fontInfo) {\n        const virtualDelegate = new class {\n            getTemplateId(element) {\n                return 'candidate';\n            }\n            getHeight(element) {\n                return candidateViewHeight;\n            }\n        };\n        const renderer = new class {\n            constructor() {\n                this.templateId = 'candidate';\n            }\n            renderTemplate(container) {\n                return new RenameCandidateView(container, fontInfo);\n            }\n            renderElement(candidate, index, templateData) {\n                templateData.populate(candidate);\n            }\n            disposeTemplate(templateData) {\n                templateData.dispose();\n            }\n        };\n        return new List('NewSymbolNameCandidates', container, virtualDelegate, [renderer], {\n            keyboardSupport: false, // @ulugbekna: because we handle keyboard events through proper commands & keybinding service, see `rename.ts`\n            mouseSupport: true,\n            multipleSelectionSupport: false,\n        });\n    }\n}\nclass InputWithButton {\n    constructor() {\n        this._buttonHoverContent = '';\n        this._onDidInputChange = new Emitter();\n        this.onDidInputChange = this._onDidInputChange.event;\n        this._disposables = new DisposableStore();\n    }\n    get domNode() {\n        if (!this._domNode) {\n            this._domNode = document.createElement('div');\n            this._domNode.className = 'rename-input-with-button';\n            this._domNode.style.display = 'flex';\n            this._domNode.style.flexDirection = 'row';\n            this._domNode.style.alignItems = 'center';\n            this._inputNode = document.createElement('input');\n            this._inputNode.className = 'rename-input';\n            this._inputNode.type = 'text';\n            this._inputNode.style.border = 'none';\n            this._inputNode.setAttribute('aria-label', localize(1395, \"Rename input. Type new name and press Enter to commit.\"));\n            this._domNode.appendChild(this._inputNode);\n            this._buttonNode = document.createElement('div');\n            this._buttonNode.className = 'rename-suggestions-button';\n            this._buttonNode.setAttribute('tabindex', '0');\n            this._buttonGenHoverText = localize(1396, \"Generate New Name Suggestions\");\n            this._buttonCancelHoverText = localize(1397, \"Cancel\");\n            this._buttonHoverContent = this._buttonGenHoverText;\n            this._disposables.add(getBaseLayerHoverDelegate().setupDelayedHover(this._buttonNode, () => ({\n                content: this._buttonHoverContent,\n                style: 1 /* HoverStyle.Pointer */,\n            })));\n            this._domNode.appendChild(this._buttonNode);\n            // notify if selection changes to cancel request to rename-suggestion providers\n            this._disposables.add(addDisposableListener(this.input, EventType.INPUT, () => this._onDidInputChange.fire()));\n            this._disposables.add(addDisposableListener(this.input, EventType.KEY_DOWN, (e) => {\n                const keyEvent = new StandardKeyboardEvent(e);\n                if (keyEvent.keyCode === 15 /* KeyCode.LeftArrow */ || keyEvent.keyCode === 17 /* KeyCode.RightArrow */) {\n                    this._onDidInputChange.fire();\n                }\n            }));\n            this._disposables.add(addDisposableListener(this.input, EventType.CLICK, () => this._onDidInputChange.fire()));\n            // focus \"container\" border instead of input box\n            this._disposables.add(addDisposableListener(this.input, EventType.FOCUS, () => {\n                this.domNode.style.outlineWidth = '1px';\n                this.domNode.style.outlineStyle = 'solid';\n                this.domNode.style.outlineOffset = '-1px';\n                this.domNode.style.outlineColor = 'var(--vscode-focusBorder)';\n            }));\n            this._disposables.add(addDisposableListener(this.input, EventType.BLUR, () => {\n                this.domNode.style.outline = 'none';\n            }));\n        }\n        return this._domNode;\n    }\n    get input() {\n        assertType(this._inputNode);\n        return this._inputNode;\n    }\n    get button() {\n        assertType(this._buttonNode);\n        return this._buttonNode;\n    }\n    get buttonState() {\n        return this._buttonState;\n    }\n    setSparkleButton() {\n        this._buttonState = 'sparkle';\n        this._sparkleIcon ??= renderIcon(Codicon.sparkle);\n        clearNode(this.button);\n        this.button.appendChild(this._sparkleIcon);\n        this.button.setAttribute('aria-label', 'Generating new name suggestions');\n        this._buttonHoverContent = this._buttonGenHoverText;\n        this.input.focus();\n    }\n    setStopButton() {\n        this._buttonState = 'stop';\n        this._stopIcon ??= renderIcon(Codicon.stopCircle);\n        clearNode(this.button);\n        this.button.appendChild(this._stopIcon);\n        this.button.setAttribute('aria-label', 'Cancel generating new name suggestions');\n        this._buttonHoverContent = this._buttonCancelHoverText;\n        this.input.focus();\n    }\n    dispose() {\n        this._disposables.dispose();\n    }\n}\nclass RenameCandidateView {\n    static { this._PADDING = 2; }\n    constructor(parent, fontInfo) {\n        this._domNode = document.createElement('div');\n        this._domNode.className = 'rename-box rename-candidate';\n        this._domNode.style.display = `flex`;\n        this._domNode.style.columnGap = `5px`;\n        this._domNode.style.alignItems = `center`;\n        this._domNode.style.height = `${fontInfo.lineHeight}px`;\n        this._domNode.style.padding = `${RenameCandidateView._PADDING}px`;\n        // @ulugbekna: needed to keep space when the `icon.style.display` is set to `none`\n        const iconContainer = document.createElement('div');\n        iconContainer.style.display = `flex`;\n        iconContainer.style.alignItems = `center`;\n        iconContainer.style.width = iconContainer.style.height = `${fontInfo.lineHeight * 0.8}px`;\n        this._domNode.appendChild(iconContainer);\n        this._icon = renderIcon(Codicon.sparkle);\n        this._icon.style.display = `none`;\n        iconContainer.appendChild(this._icon);\n        this._label = document.createElement('div');\n        applyFontInfo(this._label, fontInfo);\n        this._domNode.appendChild(this._label);\n        parent.appendChild(this._domNode);\n    }\n    populate(value) {\n        this._updateIcon(value);\n        this._updateLabel(value);\n    }\n    _updateIcon(value) {\n        const isAIGenerated = !!value.tags?.includes(NewSymbolNameTag.AIGenerated);\n        this._icon.style.display = isAIGenerated ? 'inherit' : 'none';\n    }\n    _updateLabel(value) {\n        this._label.innerText = value.newSymbolName;\n    }\n    static getLayoutInfo({ lineHeight }) {\n        const totalHeight = lineHeight + RenameCandidateView._PADDING * 2 /* top & bottom padding */;\n        return { totalHeight };\n    }\n    dispose() {\n    }\n}\n\nexport { CONTEXT_RENAME_INPUT_VISIBLE, RenameWidget };\n","import { alert } from '../../../../base/browser/ui/aria/aria.js';\nimport { raceCancellation } from '../../../../base/common/async.js';\nimport { CancellationTokenSource, CancellationToken } from '../../../../base/common/cancellation.js';\nimport { CancellationError, onUnexpectedError } from '../../../../base/common/errors.js';\nimport { isMarkdownString } from '../../../../base/common/htmlContent.js';\nimport { DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { registerAction2, Action2 } from '../../../../platform/actions/common/actions.js';\nimport { Extensions } from '../../../../platform/configuration/common/configurationRegistry.js';\nimport { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { ILogService } from '../../../../platform/log/common/log.js';\nimport { INotificationService } from '../../../../platform/notification/common/notification.js';\nimport { IEditorProgressService } from '../../../../platform/progress/common/progress.js';\nimport { Registry } from '../../../../platform/registry/common/platform.js';\nimport { registerEditorContribution, registerEditorAction, EditorCommand, registerEditorCommand, registerModelAndPositionCommand, EditorAction } from '../../../browser/editorExtensions.js';\nimport { IBulkEditService } from '../../../browser/services/bulkEditService.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { NewSymbolNameTriggerKind } from '../../../common/languages.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { ITextResourceConfigurationService } from '../../../common/services/textResourceConfiguration.js';\nimport { EditSources } from '../../../common/textModelEditSource.js';\nimport { EditorStateCancellationTokenSource } from '../../editorState/browser/editorState.js';\nimport { MessageController } from '../../message/browser/messageController.js';\nimport { RenameWidget, CONTEXT_RENAME_INPUT_VISIBLE } from './renameWidget.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar RenameController_1;\nclass RenameSkeleton {\n    constructor(model, position, registry) {\n        this.model = model;\n        this.position = position;\n        this._providerRenameIdx = 0;\n        this._providers = registry.ordered(model);\n    }\n    hasProvider() {\n        return this._providers.length > 0;\n    }\n    async resolveRenameLocation(token) {\n        const rejects = [];\n        for (this._providerRenameIdx = 0; this._providerRenameIdx < this._providers.length; this._providerRenameIdx++) {\n            const provider = this._providers[this._providerRenameIdx];\n            if (!provider.resolveRenameLocation) {\n                break;\n            }\n            const res = await provider.resolveRenameLocation(this.model, this.position, token);\n            if (!res) {\n                continue;\n            }\n            if (res.rejectReason) {\n                rejects.push(res.rejectReason);\n                continue;\n            }\n            return res;\n        }\n        // we are here when no provider prepared a location which means we can\n        // just rely on the word under cursor and start with the first provider\n        this._providerRenameIdx = 0;\n        const word = this.model.getWordAtPosition(this.position);\n        if (!word) {\n            return {\n                range: Range.fromPositions(this.position),\n                text: '',\n                rejectReason: rejects.length > 0 ? rejects.join('\\n') : undefined\n            };\n        }\n        return {\n            range: new Range(this.position.lineNumber, word.startColumn, this.position.lineNumber, word.endColumn),\n            text: word.word,\n            rejectReason: rejects.length > 0 ? rejects.join('\\n') : undefined\n        };\n    }\n    async provideRenameEdits(newName, token) {\n        return this._provideRenameEdits(newName, this._providerRenameIdx, [], token);\n    }\n    async _provideRenameEdits(newName, i, rejects, token) {\n        const provider = this._providers[i];\n        if (!provider) {\n            return {\n                edits: [],\n                rejectReason: rejects.join('\\n')\n            };\n        }\n        const result = await provider.provideRenameEdits(this.model, this.position, newName, token);\n        if (!result) {\n            return this._provideRenameEdits(newName, i + 1, rejects.concat(localize(1380, \"No result.\")), token);\n        }\n        else if (result.rejectReason) {\n            return this._provideRenameEdits(newName, i + 1, rejects.concat(result.rejectReason), token);\n        }\n        return result;\n    }\n}\nasync function rename(registry, model, position, newName) {\n    const skeleton = new RenameSkeleton(model, position, registry);\n    const loc = await skeleton.resolveRenameLocation(CancellationToken.None);\n    if (loc?.rejectReason) {\n        return { edits: [], rejectReason: loc.rejectReason };\n    }\n    return skeleton.provideRenameEdits(newName, CancellationToken.None);\n}\n// ---  register actions and commands\nlet RenameController = class RenameController {\n    static { RenameController_1 = this; }\n    static { this.ID = 'editor.contrib.renameController'; }\n    static get(editor) {\n        return editor.getContribution(RenameController_1.ID);\n    }\n    constructor(editor, _instaService, _notificationService, _bulkEditService, _progressService, _logService, _configService, _languageFeaturesService) {\n        this.editor = editor;\n        this._instaService = _instaService;\n        this._notificationService = _notificationService;\n        this._bulkEditService = _bulkEditService;\n        this._progressService = _progressService;\n        this._logService = _logService;\n        this._configService = _configService;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._disposableStore = new DisposableStore();\n        this._cts = new CancellationTokenSource();\n        this._renameWidget = this._disposableStore.add(this._instaService.createInstance(RenameWidget, this.editor, ['acceptRenameInput', 'acceptRenameInputWithPreview']));\n    }\n    dispose() {\n        this._disposableStore.dispose();\n        this._cts.dispose(true);\n    }\n    async run() {\n        const trace = this._logService.trace.bind(this._logService, '[rename]');\n        // set up cancellation token to prevent reentrant rename, this\n        // is the parent to the resolve- and rename-tokens\n        this._cts.dispose(true);\n        this._cts = new CancellationTokenSource();\n        if (!this.editor.hasModel()) {\n            trace('editor has no model');\n            return undefined;\n        }\n        const position = this.editor.getPosition();\n        const skeleton = new RenameSkeleton(this.editor.getModel(), position, this._languageFeaturesService.renameProvider);\n        if (!skeleton.hasProvider()) {\n            trace('skeleton has no provider');\n            return undefined;\n        }\n        // part 1 - resolve rename location\n        const cts1 = new EditorStateCancellationTokenSource(this.editor, 4 /* CodeEditorStateFlag.Position */ | 1 /* CodeEditorStateFlag.Value */, undefined, this._cts.token);\n        let loc;\n        try {\n            trace('resolving rename location');\n            const resolveLocationOperation = skeleton.resolveRenameLocation(cts1.token);\n            this._progressService.showWhile(resolveLocationOperation, 250);\n            loc = await resolveLocationOperation;\n            trace('resolved rename location');\n        }\n        catch (e) {\n            if (e instanceof CancellationError) {\n                trace('resolve rename location cancelled', JSON.stringify(e, null, '\\t'));\n            }\n            else {\n                trace('resolve rename location failed', e instanceof Error ? e : JSON.stringify(e, null, '\\t'));\n                if (typeof e === 'string' || isMarkdownString(e)) {\n                    MessageController.get(this.editor)?.showMessage(e || localize(1381, \"An unknown error occurred while resolving rename location\"), position);\n                }\n            }\n            return undefined;\n        }\n        finally {\n            cts1.dispose();\n        }\n        if (!loc) {\n            trace('returning early - no loc');\n            return undefined;\n        }\n        if (loc.rejectReason) {\n            trace(`returning early - rejected with reason: ${loc.rejectReason}`, loc.rejectReason);\n            MessageController.get(this.editor)?.showMessage(loc.rejectReason, position);\n            return undefined;\n        }\n        if (cts1.token.isCancellationRequested) {\n            trace('returning early - cts1 cancelled');\n            return undefined;\n        }\n        // part 2 - do rename at location\n        const cts2 = new EditorStateCancellationTokenSource(this.editor, 4 /* CodeEditorStateFlag.Position */ | 1 /* CodeEditorStateFlag.Value */, loc.range, this._cts.token);\n        const model = this.editor.getModel(); // @ulugbekna: assumes editor still has a model, otherwise, cts1 should've been cancelled\n        const newSymbolNamesProviders = this._languageFeaturesService.newSymbolNamesProvider.all(model);\n        const resolvedNewSymbolnamesProviders = await Promise.all(newSymbolNamesProviders.map(async (p) => [p, await p.supportsAutomaticNewSymbolNamesTriggerKind ?? false]));\n        const requestRenameSuggestions = (triggerKind, cts) => {\n            let providers = resolvedNewSymbolnamesProviders.slice();\n            if (triggerKind === NewSymbolNameTriggerKind.Automatic) {\n                providers = providers.filter(([_, supportsAutomatic]) => supportsAutomatic);\n            }\n            return providers.map(([p,]) => p.provideNewSymbolNames(model, loc.range, triggerKind, cts));\n        };\n        trace('creating rename input field and awaiting its result');\n        const supportPreview = this._bulkEditService.hasPreviewHandler() && this._configService.getValue(this.editor.getModel().uri, 'editor.rename.enablePreview');\n        const inputFieldResult = await this._renameWidget.getInput(loc.range, loc.text, supportPreview, newSymbolNamesProviders.length > 0 ? requestRenameSuggestions : undefined, cts2);\n        trace('received response from rename input field');\n        // no result, only hint to focus the editor or not\n        if (typeof inputFieldResult === 'boolean') {\n            trace(`returning early - rename input field response - ${inputFieldResult}`);\n            if (inputFieldResult) {\n                this.editor.focus();\n            }\n            cts2.dispose();\n            return undefined;\n        }\n        this.editor.focus();\n        trace('requesting rename edits');\n        const renameOperation = raceCancellation(skeleton.provideRenameEdits(inputFieldResult.newName, cts2.token), cts2.token).then(async (renameResult) => {\n            if (!renameResult) {\n                trace('returning early - no rename edits result');\n                return;\n            }\n            if (!this.editor.hasModel()) {\n                trace('returning early - no model after rename edits are provided');\n                return;\n            }\n            if (renameResult.rejectReason) {\n                trace(`returning early - rejected with reason: ${renameResult.rejectReason}`);\n                this._notificationService.info(renameResult.rejectReason);\n                return;\n            }\n            // collapse selection to active end\n            this.editor.setSelection(Range.fromPositions(this.editor.getSelection().getPosition()));\n            trace('applying edits');\n            this._bulkEditService.apply(renameResult, {\n                editor: this.editor,\n                showPreview: inputFieldResult.wantsPreview,\n                label: localize(1382, \"Renaming '{0}' to '{1}'\", loc?.text, inputFieldResult.newName),\n                code: 'undoredo.rename',\n                quotableLabel: localize(1383, \"Renaming {0} to {1}\", loc?.text, inputFieldResult.newName),\n                respectAutoSaveConfig: true,\n                reason: EditSources.rename(),\n            }).then(result => {\n                trace('edits applied');\n                if (result.ariaSummary) {\n                    alert(localize(1384, \"Successfully renamed '{0}' to '{1}'. Summary: {2}\", loc.text, inputFieldResult.newName, result.ariaSummary));\n                }\n            }).catch(err => {\n                trace(`error when applying edits ${JSON.stringify(err, null, '\\t')}`);\n                this._notificationService.error(localize(1385, \"Rename failed to apply edits\"));\n                this._logService.error(err);\n            });\n        }, err => {\n            trace('error when providing rename edits', JSON.stringify(err, null, '\\t'));\n            this._notificationService.error(localize(1386, \"Rename failed to compute edits\"));\n            this._logService.error(err);\n        }).finally(() => {\n            cts2.dispose();\n        });\n        trace('returning rename operation');\n        this._progressService.showWhile(renameOperation, 250);\n        return renameOperation;\n    }\n    acceptRenameInput(wantsPreview) {\n        this._renameWidget.acceptInput(wantsPreview);\n    }\n    cancelRenameInput() {\n        this._renameWidget.cancelInput(true, 'cancelRenameInput command');\n    }\n    focusNextRenameSuggestion() {\n        this._renameWidget.focusNextRenameSuggestion();\n    }\n    focusPreviousRenameSuggestion() {\n        this._renameWidget.focusPreviousRenameSuggestion();\n    }\n};\nRenameController = RenameController_1 = __decorate([\n    __param(1, IInstantiationService),\n    __param(2, INotificationService),\n    __param(3, IBulkEditService),\n    __param(4, IEditorProgressService),\n    __param(5, ILogService),\n    __param(6, ITextResourceConfigurationService),\n    __param(7, ILanguageFeaturesService)\n], RenameController);\n// ---- action implementation\nclass RenameAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.rename',\n            label: localize2(1388, \"Rename Symbol\"),\n            precondition: ContextKeyExpr.and(EditorContextKeys.writable, EditorContextKeys.hasRenameProvider),\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 60 /* KeyCode.F2 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            contextMenuOpts: {\n                group: '1_modification',\n                order: 1.1\n            },\n            canTriggerInlineEdits: true,\n        });\n    }\n    runCommand(accessor, args) {\n        const editorService = accessor.get(ICodeEditorService);\n        const [uri, pos] = Array.isArray(args) && args || [undefined, undefined];\n        if (URI.isUri(uri) && Position.isIPosition(pos)) {\n            return editorService.openCodeEditor({ resource: uri }, editorService.getActiveCodeEditor()).then(editor => {\n                if (!editor) {\n                    return;\n                }\n                editor.setPosition(pos);\n                editor.invokeWithinContext(accessor => {\n                    this.reportTelemetry(accessor, editor);\n                    return this.run(accessor, editor);\n                });\n            }, onUnexpectedError);\n        }\n        return super.runCommand(accessor, args);\n    }\n    run(accessor, editor) {\n        const logService = accessor.get(ILogService);\n        const controller = RenameController.get(editor);\n        if (controller) {\n            logService.trace('[RenameAction] got controller, running...');\n            return controller.run();\n        }\n        logService.trace('[RenameAction] returning early - controller missing');\n        return Promise.resolve();\n    }\n}\nregisterEditorContribution(RenameController.ID, RenameController, 4 /* EditorContributionInstantiation.Lazy */);\nregisterEditorAction(RenameAction);\nconst RenameCommand = EditorCommand.bindToContribution(RenameController.get);\nregisterEditorCommand(new RenameCommand({\n    id: 'acceptRenameInput',\n    precondition: CONTEXT_RENAME_INPUT_VISIBLE,\n    handler: x => x.acceptRenameInput(false),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 99,\n        kbExpr: ContextKeyExpr.and(EditorContextKeys.focus, ContextKeyExpr.not('isComposing')),\n        primary: 3 /* KeyCode.Enter */\n    }\n}));\nregisterEditorCommand(new RenameCommand({\n    id: 'acceptRenameInputWithPreview',\n    precondition: ContextKeyExpr.and(CONTEXT_RENAME_INPUT_VISIBLE, ContextKeyExpr.has('config.editor.rename.enablePreview')),\n    handler: x => x.acceptRenameInput(true),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 99,\n        kbExpr: ContextKeyExpr.and(EditorContextKeys.focus, ContextKeyExpr.not('isComposing')),\n        primary: 2048 /* KeyMod.CtrlCmd */ + 3 /* KeyCode.Enter */\n    }\n}));\nregisterEditorCommand(new RenameCommand({\n    id: 'cancelRenameInput',\n    precondition: CONTEXT_RENAME_INPUT_VISIBLE,\n    handler: x => x.cancelRenameInput(),\n    kbOpts: {\n        weight: 100 /* KeybindingWeight.EditorContrib */ + 99,\n        kbExpr: EditorContextKeys.focus,\n        primary: 9 /* KeyCode.Escape */,\n        secondary: [1024 /* KeyMod.Shift */ | 9 /* KeyCode.Escape */]\n    }\n}));\nregisterAction2(class FocusNextRenameSuggestion extends Action2 {\n    constructor() {\n        super({\n            id: 'focusNextRenameSuggestion',\n            title: {\n                ...localize2(1389, \"Focus Next Rename Suggestion\"),\n            },\n            precondition: CONTEXT_RENAME_INPUT_VISIBLE,\n            keybinding: [\n                {\n                    primary: 18 /* KeyCode.DownArrow */,\n                    weight: 100 /* KeybindingWeight.EditorContrib */ + 99,\n                }\n            ]\n        });\n    }\n    run(accessor) {\n        const currentEditor = accessor.get(ICodeEditorService).getFocusedCodeEditor();\n        if (!currentEditor) {\n            return;\n        }\n        const controller = RenameController.get(currentEditor);\n        if (!controller) {\n            return;\n        }\n        controller.focusNextRenameSuggestion();\n    }\n});\nregisterAction2(class FocusPreviousRenameSuggestion extends Action2 {\n    constructor() {\n        super({\n            id: 'focusPreviousRenameSuggestion',\n            title: {\n                ...localize2(1390, \"Focus Previous Rename Suggestion\"),\n            },\n            precondition: CONTEXT_RENAME_INPUT_VISIBLE,\n            keybinding: [\n                {\n                    primary: 16 /* KeyCode.UpArrow */,\n                    weight: 100 /* KeybindingWeight.EditorContrib */ + 99,\n                }\n            ]\n        });\n    }\n    run(accessor) {\n        const currentEditor = accessor.get(ICodeEditorService).getFocusedCodeEditor();\n        if (!currentEditor) {\n            return;\n        }\n        const controller = RenameController.get(currentEditor);\n        if (!controller) {\n            return;\n        }\n        controller.focusPreviousRenameSuggestion();\n    }\n});\n// ---- api bridge command\nregisterModelAndPositionCommand('_executeDocumentRenameProvider', function (accessor, model, position, ...args) {\n    const [newName] = args;\n    assertType(typeof newName === 'string');\n    const { renameProvider } = accessor.get(ILanguageFeaturesService);\n    return rename(renameProvider, model, position, newName);\n});\nregisterModelAndPositionCommand('_executePrepareRename', async function (accessor, model, position) {\n    const { renameProvider } = accessor.get(ILanguageFeaturesService);\n    const skeleton = new RenameSkeleton(model, position, renameProvider);\n    const loc = await skeleton.resolveRenameLocation(CancellationToken.None);\n    if (loc?.rejectReason) {\n        throw new Error(loc.rejectReason);\n    }\n    return loc;\n});\n//todo@jrieken use editor options world\nRegistry.as(Extensions.Configuration).registerConfiguration({\n    id: 'editor',\n    properties: {\n        'editor.rename.enablePreview': {\n            scope: 6 /* ConfigurationScope.LANGUAGE_OVERRIDABLE */,\n            description: localize(1387, \"Enable/disable the ability to preview changes before renaming\"),\n            default: true,\n            type: 'boolean'\n        }\n    }\n});\n\nexport { RenameAction, rename };\n","import { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { IEditorWorkerService } from '../../../common/services/editorWorker.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet SectionHeaderDetector = class SectionHeaderDetector extends Disposable {\n    static { this.ID = 'editor.sectionHeaderDetector'; }\n    constructor(editor, languageConfigurationService, editorWorkerService) {\n        super();\n        this.editor = editor;\n        this.languageConfigurationService = languageConfigurationService;\n        this.editorWorkerService = editorWorkerService;\n        this.decorations = this.editor.createDecorationsCollection();\n        this.options = this.createOptions(editor.getOption(81 /* EditorOption.minimap */));\n        this.computePromise = null;\n        this.currentOccurrences = {};\n        this._register(editor.onDidChangeModel((e) => {\n            this.currentOccurrences = {};\n            this.options = this.createOptions(editor.getOption(81 /* EditorOption.minimap */));\n            this.stop();\n            this.computeSectionHeaders.schedule(0);\n        }));\n        this._register(editor.onDidChangeModelLanguage((e) => {\n            this.currentOccurrences = {};\n            this.options = this.createOptions(editor.getOption(81 /* EditorOption.minimap */));\n            this.stop();\n            this.computeSectionHeaders.schedule(0);\n        }));\n        this._register(languageConfigurationService.onDidChange((e) => {\n            const editorLanguageId = this.editor.getModel()?.getLanguageId();\n            if (editorLanguageId && e.affects(editorLanguageId)) {\n                this.currentOccurrences = {};\n                this.options = this.createOptions(editor.getOption(81 /* EditorOption.minimap */));\n                this.stop();\n                this.computeSectionHeaders.schedule(0);\n            }\n        }));\n        this._register(editor.onDidChangeConfiguration(e => {\n            if (this.options && !e.hasChanged(81 /* EditorOption.minimap */)) {\n                return;\n            }\n            this.options = this.createOptions(editor.getOption(81 /* EditorOption.minimap */));\n            // Remove any links (for the getting disabled case)\n            this.updateDecorations([]);\n            // Stop any computation (for the getting disabled case)\n            this.stop();\n            // Start computing (for the getting enabled case)\n            this.computeSectionHeaders.schedule(0);\n        }));\n        this._register(this.editor.onDidChangeModelContent(e => {\n            this.computeSectionHeaders.schedule();\n        }));\n        this._register(editor.onDidChangeModelTokens((e) => {\n            if (!this.computeSectionHeaders.isScheduled()) {\n                this.computeSectionHeaders.schedule(1000);\n            }\n        }));\n        this.computeSectionHeaders = this._register(new RunOnceScheduler(() => {\n            this.findSectionHeaders();\n        }, 250));\n        this.computeSectionHeaders.schedule(0);\n    }\n    createOptions(minimap) {\n        if (!minimap || !this.editor.hasModel()) {\n            return undefined;\n        }\n        const languageId = this.editor.getModel().getLanguageId();\n        if (!languageId) {\n            return undefined;\n        }\n        const commentsConfiguration = this.languageConfigurationService.getLanguageConfiguration(languageId).comments;\n        const foldingRules = this.languageConfigurationService.getLanguageConfiguration(languageId).foldingRules;\n        if (!commentsConfiguration && !foldingRules?.markers) {\n            return undefined;\n        }\n        return {\n            foldingRules,\n            markSectionHeaderRegex: minimap.markSectionHeaderRegex,\n            findMarkSectionHeaders: minimap.showMarkSectionHeaders,\n            findRegionSectionHeaders: minimap.showRegionSectionHeaders,\n        };\n    }\n    findSectionHeaders() {\n        if (!this.editor.hasModel()\n            || (!this.options?.findMarkSectionHeaders && !this.options?.findRegionSectionHeaders)) {\n            return;\n        }\n        const model = this.editor.getModel();\n        if (model.isDisposed() || model.isTooLargeForSyncing()) {\n            return;\n        }\n        const modelVersionId = model.getVersionId();\n        this.editorWorkerService.findSectionHeaders(model.uri, this.options)\n            .then((sectionHeaders) => {\n            if (model.isDisposed() || model.getVersionId() !== modelVersionId) {\n                // model changed in the meantime\n                return;\n            }\n            this.updateDecorations(sectionHeaders);\n        });\n    }\n    updateDecorations(sectionHeaders) {\n        const model = this.editor.getModel();\n        if (model) {\n            // Remove all section headers that should be in comments and are not in comments\n            sectionHeaders = sectionHeaders.filter((sectionHeader) => {\n                if (!sectionHeader.shouldBeInComments) {\n                    return true;\n                }\n                const validRange = model.validateRange(sectionHeader.range);\n                const tokens = model.tokenization.getLineTokens(validRange.startLineNumber);\n                const idx = tokens.findTokenIndexAtOffset(validRange.startColumn - 1);\n                const tokenType = tokens.getStandardTokenType(idx);\n                const languageId = tokens.getLanguageId(idx);\n                return (languageId === model.getLanguageId() && tokenType === 1 /* StandardTokenType.Comment */);\n            });\n        }\n        const oldDecorations = Object.values(this.currentOccurrences).map(occurrence => occurrence.decorationId);\n        const newDecorations = sectionHeaders.map(sectionHeader => decoration(sectionHeader));\n        this.editor.changeDecorations((changeAccessor) => {\n            const decorations = changeAccessor.deltaDecorations(oldDecorations, newDecorations);\n            this.currentOccurrences = {};\n            for (let i = 0, len = decorations.length; i < len; i++) {\n                const occurrence = { sectionHeader: sectionHeaders[i], decorationId: decorations[i] };\n                this.currentOccurrences[occurrence.decorationId] = occurrence;\n            }\n        });\n    }\n    stop() {\n        this.computeSectionHeaders.cancel();\n        if (this.computePromise) {\n            this.computePromise.cancel();\n            this.computePromise = null;\n        }\n    }\n    dispose() {\n        super.dispose();\n        this.stop();\n        this.decorations.clear();\n    }\n};\nSectionHeaderDetector = __decorate([\n    __param(1, ILanguageConfigurationService),\n    __param(2, IEditorWorkerService)\n], SectionHeaderDetector);\nfunction decoration(sectionHeader) {\n    return {\n        range: sectionHeader.range,\n        options: ModelDecorationOptions.createDynamic({\n            description: 'section-header',\n            stickiness: 3 /* TrackedRangeStickiness.GrowsOnlyWhenTypingAfter */,\n            collapseOnReplaceEdit: true,\n            minimap: {\n                color: undefined,\n                position: 1 /* MinimapPosition.Inline */,\n                sectionHeaderStyle: sectionHeader.hasSeparatorLine ? 2 /* MinimapSectionHeaderStyle.Underlined */ : 1 /* MinimapSectionHeaderStyle.Normal */,\n                sectionHeaderText: sectionHeader.text,\n            },\n        })\n    };\n}\nregisterEditorContribution(SectionHeaderDetector.ID, SectionHeaderDetector, 1 /* EditorContributionInstantiation.AfterFirstRender */);\n\nexport { SectionHeaderDetector };\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 *--------------------------------------------------------------------------------------------*/\nclass RateLimiter {\n    constructor(timesPerSecond = 5) {\n        this.timesPerSecond = timesPerSecond;\n        this._lastRun = 0;\n        this._minimumTimeBetweenRuns = 1000 / timesPerSecond;\n    }\n    runIfNotLimited(callback) {\n        const now = Date.now();\n        if (now - this._lastRun >= this._minimumTimeBetweenRuns) {\n            this._lastRun = now;\n            callback();\n        }\n    }\n}\n\nexport { RateLimiter };\n","import { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { countEOL } from '../core/misc/eolCounter.js';\nimport { RateLimiter } from './common.js';\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/**\n * Represents sparse tokens over a contiguous range of lines.\n */\nclass SparseMultilineTokens {\n    static create(startLineNumber, tokens) {\n        return new SparseMultilineTokens(startLineNumber, new SparseMultilineTokensStorage(tokens));\n    }\n    /**\n     * (Inclusive) start line number for these tokens.\n     */\n    get startLineNumber() {\n        return this._startLineNumber;\n    }\n    /**\n     * (Inclusive) end line number for these tokens.\n     */\n    get endLineNumber() {\n        return this._endLineNumber;\n    }\n    constructor(startLineNumber, tokens) {\n        this._startLineNumber = startLineNumber;\n        this._tokens = tokens;\n        this._endLineNumber = this._startLineNumber + this._tokens.getMaxDeltaLine();\n    }\n    toString() {\n        return this._tokens.toString(this._startLineNumber);\n    }\n    _updateEndLineNumber() {\n        this._endLineNumber = this._startLineNumber + this._tokens.getMaxDeltaLine();\n    }\n    isEmpty() {\n        return this._tokens.isEmpty();\n    }\n    getLineTokens(lineNumber) {\n        if (this._startLineNumber <= lineNumber && lineNumber <= this._endLineNumber) {\n            return this._tokens.getLineTokens(lineNumber - this._startLineNumber);\n        }\n        return null;\n    }\n    getRange() {\n        const deltaRange = this._tokens.getRange();\n        if (!deltaRange) {\n            return deltaRange;\n        }\n        return new Range(this._startLineNumber + deltaRange.startLineNumber, deltaRange.startColumn, this._startLineNumber + deltaRange.endLineNumber, deltaRange.endColumn);\n    }\n    removeTokens(range) {\n        const startLineIndex = range.startLineNumber - this._startLineNumber;\n        const endLineIndex = range.endLineNumber - this._startLineNumber;\n        this._startLineNumber += this._tokens.removeTokens(startLineIndex, range.startColumn - 1, endLineIndex, range.endColumn - 1);\n        this._updateEndLineNumber();\n    }\n    split(range) {\n        // split tokens to two:\n        // a) all the tokens before `range`\n        // b) all the tokens after `range`\n        const startLineIndex = range.startLineNumber - this._startLineNumber;\n        const endLineIndex = range.endLineNumber - this._startLineNumber;\n        const [a, b, bDeltaLine] = this._tokens.split(startLineIndex, range.startColumn - 1, endLineIndex, range.endColumn - 1);\n        return [new SparseMultilineTokens(this._startLineNumber, a), new SparseMultilineTokens(this._startLineNumber + bDeltaLine, b)];\n    }\n    applyEdit(range, text) {\n        const [eolCount, firstLineLength, lastLineLength] = countEOL(text);\n        this.acceptEdit(range, eolCount, firstLineLength, lastLineLength, text.length > 0 ? text.charCodeAt(0) : 0 /* CharCode.Null */);\n    }\n    acceptEdit(range, eolCount, firstLineLength, lastLineLength, firstCharCode) {\n        this._acceptDeleteRange(range);\n        this._acceptInsertText(new Position(range.startLineNumber, range.startColumn), eolCount, firstLineLength, lastLineLength, firstCharCode);\n        this._updateEndLineNumber();\n    }\n    _acceptDeleteRange(range) {\n        if (range.startLineNumber === range.endLineNumber && range.startColumn === range.endColumn) {\n            // Nothing to delete\n            return;\n        }\n        const firstLineIndex = range.startLineNumber - this._startLineNumber;\n        const lastLineIndex = range.endLineNumber - this._startLineNumber;\n        if (lastLineIndex < 0) {\n            // this deletion occurs entirely before this block, so we only need to adjust line numbers\n            const deletedLinesCount = lastLineIndex - firstLineIndex;\n            this._startLineNumber -= deletedLinesCount;\n            return;\n        }\n        const tokenMaxDeltaLine = this._tokens.getMaxDeltaLine();\n        if (firstLineIndex >= tokenMaxDeltaLine + 1) {\n            // this deletion occurs entirely after this block, so there is nothing to do\n            return;\n        }\n        if (firstLineIndex < 0 && lastLineIndex >= tokenMaxDeltaLine + 1) {\n            // this deletion completely encompasses this block\n            this._startLineNumber = 0;\n            this._tokens.clear();\n            return;\n        }\n        if (firstLineIndex < 0) {\n            const deletedBefore = -firstLineIndex;\n            this._startLineNumber -= deletedBefore;\n            this._tokens.acceptDeleteRange(range.startColumn - 1, 0, 0, lastLineIndex, range.endColumn - 1);\n        }\n        else {\n            this._tokens.acceptDeleteRange(0, firstLineIndex, range.startColumn - 1, lastLineIndex, range.endColumn - 1);\n        }\n    }\n    _acceptInsertText(position, eolCount, firstLineLength, lastLineLength, firstCharCode) {\n        if (eolCount === 0 && firstLineLength === 0) {\n            // Nothing to insert\n            return;\n        }\n        const lineIndex = position.lineNumber - this._startLineNumber;\n        if (lineIndex < 0) {\n            // this insertion occurs before this block, so we only need to adjust line numbers\n            this._startLineNumber += eolCount;\n            return;\n        }\n        const tokenMaxDeltaLine = this._tokens.getMaxDeltaLine();\n        if (lineIndex >= tokenMaxDeltaLine + 1) {\n            // this insertion occurs after this block, so there is nothing to do\n            return;\n        }\n        this._tokens.acceptInsertText(lineIndex, position.column - 1, eolCount, firstLineLength, lastLineLength, firstCharCode);\n    }\n    reportIfInvalid(model) {\n        this._tokens.reportIfInvalid(model, this._startLineNumber);\n    }\n}\nclass SparseMultilineTokensStorage {\n    constructor(tokens) {\n        this._tokens = tokens;\n        this._tokenCount = tokens.length / 4;\n    }\n    toString(startLineNumber) {\n        const pieces = [];\n        for (let i = 0; i < this._tokenCount; i++) {\n            pieces.push(`(${this._getDeltaLine(i) + startLineNumber},${this._getStartCharacter(i)}-${this._getEndCharacter(i)})`);\n        }\n        return `[${pieces.join(',')}]`;\n    }\n    getMaxDeltaLine() {\n        const tokenCount = this._getTokenCount();\n        if (tokenCount === 0) {\n            return -1;\n        }\n        return this._getDeltaLine(tokenCount - 1);\n    }\n    getRange() {\n        const tokenCount = this._getTokenCount();\n        if (tokenCount === 0) {\n            return null;\n        }\n        const startChar = this._getStartCharacter(0);\n        const maxDeltaLine = this._getDeltaLine(tokenCount - 1);\n        const endChar = this._getEndCharacter(tokenCount - 1);\n        return new Range(0, startChar + 1, maxDeltaLine, endChar + 1);\n    }\n    _getTokenCount() {\n        return this._tokenCount;\n    }\n    _getDeltaLine(tokenIndex) {\n        return this._tokens[4 * tokenIndex];\n    }\n    _getStartCharacter(tokenIndex) {\n        return this._tokens[4 * tokenIndex + 1];\n    }\n    _getEndCharacter(tokenIndex) {\n        return this._tokens[4 * tokenIndex + 2];\n    }\n    isEmpty() {\n        return (this._getTokenCount() === 0);\n    }\n    getLineTokens(deltaLine) {\n        let low = 0;\n        let high = this._getTokenCount() - 1;\n        while (low < high) {\n            const mid = low + Math.floor((high - low) / 2);\n            const midDeltaLine = this._getDeltaLine(mid);\n            if (midDeltaLine < deltaLine) {\n                low = mid + 1;\n            }\n            else if (midDeltaLine > deltaLine) {\n                high = mid - 1;\n            }\n            else {\n                let min = mid;\n                while (min > low && this._getDeltaLine(min - 1) === deltaLine) {\n                    min--;\n                }\n                let max = mid;\n                while (max < high && this._getDeltaLine(max + 1) === deltaLine) {\n                    max++;\n                }\n                return new SparseLineTokens(this._tokens.subarray(4 * min, 4 * max + 4));\n            }\n        }\n        if (this._getDeltaLine(low) === deltaLine) {\n            return new SparseLineTokens(this._tokens.subarray(4 * low, 4 * low + 4));\n        }\n        return null;\n    }\n    clear() {\n        this._tokenCount = 0;\n    }\n    removeTokens(startDeltaLine, startChar, endDeltaLine, endChar) {\n        const tokens = this._tokens;\n        const tokenCount = this._tokenCount;\n        let newTokenCount = 0;\n        let hasDeletedTokens = false;\n        let firstDeltaLine = 0;\n        for (let i = 0; i < tokenCount; i++) {\n            const srcOffset = 4 * i;\n            const tokenDeltaLine = tokens[srcOffset];\n            const tokenStartCharacter = tokens[srcOffset + 1];\n            const tokenEndCharacter = tokens[srcOffset + 2];\n            const tokenMetadata = tokens[srcOffset + 3];\n            if ((tokenDeltaLine > startDeltaLine || (tokenDeltaLine === startDeltaLine && tokenEndCharacter >= startChar))\n                && (tokenDeltaLine < endDeltaLine || (tokenDeltaLine === endDeltaLine && tokenStartCharacter <= endChar))) {\n                hasDeletedTokens = true;\n            }\n            else {\n                if (newTokenCount === 0) {\n                    firstDeltaLine = tokenDeltaLine;\n                }\n                if (hasDeletedTokens) {\n                    // must move the token to the left\n                    const destOffset = 4 * newTokenCount;\n                    tokens[destOffset] = tokenDeltaLine - firstDeltaLine;\n                    tokens[destOffset + 1] = tokenStartCharacter;\n                    tokens[destOffset + 2] = tokenEndCharacter;\n                    tokens[destOffset + 3] = tokenMetadata;\n                }\n                else if (firstDeltaLine !== 0) {\n                    // must adjust the delta line in place\n                    tokens[srcOffset] = tokenDeltaLine - firstDeltaLine;\n                }\n                newTokenCount++;\n            }\n        }\n        this._tokenCount = newTokenCount;\n        return firstDeltaLine;\n    }\n    split(startDeltaLine, startChar, endDeltaLine, endChar) {\n        const tokens = this._tokens;\n        const tokenCount = this._tokenCount;\n        const aTokens = [];\n        const bTokens = [];\n        let destTokens = aTokens;\n        let destOffset = 0;\n        let destFirstDeltaLine = 0;\n        for (let i = 0; i < tokenCount; i++) {\n            const srcOffset = 4 * i;\n            const tokenDeltaLine = tokens[srcOffset];\n            const tokenStartCharacter = tokens[srcOffset + 1];\n            const tokenEndCharacter = tokens[srcOffset + 2];\n            const tokenMetadata = tokens[srcOffset + 3];\n            if ((tokenDeltaLine > startDeltaLine || (tokenDeltaLine === startDeltaLine && tokenEndCharacter >= startChar))) {\n                if ((tokenDeltaLine < endDeltaLine || (tokenDeltaLine === endDeltaLine && tokenStartCharacter <= endChar))) {\n                    // this token is touching the range\n                    continue;\n                }\n                else {\n                    // this token is after the range\n                    if (destTokens !== bTokens) {\n                        // this token is the first token after the range\n                        destTokens = bTokens;\n                        destOffset = 0;\n                        destFirstDeltaLine = tokenDeltaLine;\n                    }\n                }\n            }\n            destTokens[destOffset++] = tokenDeltaLine - destFirstDeltaLine;\n            destTokens[destOffset++] = tokenStartCharacter;\n            destTokens[destOffset++] = tokenEndCharacter;\n            destTokens[destOffset++] = tokenMetadata;\n        }\n        return [new SparseMultilineTokensStorage(new Uint32Array(aTokens)), new SparseMultilineTokensStorage(new Uint32Array(bTokens)), destFirstDeltaLine];\n    }\n    acceptDeleteRange(horizontalShiftForFirstLineTokens, startDeltaLine, startCharacter, endDeltaLine, endCharacter) {\n        // This is a bit complex, here are the cases I used to think about this:\n        //\n        // 1. The token starts before the deletion range\n        // 1a. The token is completely before the deletion range\n        //               -----------\n        //                          xxxxxxxxxxx\n        // 1b. The token starts before, the deletion range ends after the token\n        //               -----------\n        //                      xxxxxxxxxxx\n        // 1c. The token starts before, the deletion range ends precisely with the token\n        //               ---------------\n        //                      xxxxxxxx\n        // 1d. The token starts before, the deletion range is inside the token\n        //               ---------------\n        //                    xxxxx\n        //\n        // 2. The token starts at the same position with the deletion range\n        // 2a. The token starts at the same position, and ends inside the deletion range\n        //               -------\n        //               xxxxxxxxxxx\n        // 2b. The token starts at the same position, and ends at the same position as the deletion range\n        //               ----------\n        //               xxxxxxxxxx\n        // 2c. The token starts at the same position, and ends after the deletion range\n        //               -------------\n        //               xxxxxxx\n        //\n        // 3. The token starts inside the deletion range\n        // 3a. The token is inside the deletion range\n        //                -------\n        //             xxxxxxxxxxxxx\n        // 3b. The token starts inside the deletion range, and ends at the same position as the deletion range\n        //                ----------\n        //             xxxxxxxxxxxxx\n        // 3c. The token starts inside the deletion range, and ends after the deletion range\n        //                ------------\n        //             xxxxxxxxxxx\n        //\n        // 4. The token starts after the deletion range\n        //                  -----------\n        //          xxxxxxxx\n        //\n        const tokens = this._tokens;\n        const tokenCount = this._tokenCount;\n        const deletedLineCount = (endDeltaLine - startDeltaLine);\n        let newTokenCount = 0;\n        let hasDeletedTokens = false;\n        for (let i = 0; i < tokenCount; i++) {\n            const srcOffset = 4 * i;\n            let tokenDeltaLine = tokens[srcOffset];\n            let tokenStartCharacter = tokens[srcOffset + 1];\n            let tokenEndCharacter = tokens[srcOffset + 2];\n            const tokenMetadata = tokens[srcOffset + 3];\n            if (tokenDeltaLine < startDeltaLine || (tokenDeltaLine === startDeltaLine && tokenEndCharacter <= startCharacter)) {\n                // 1a. The token is completely before the deletion range\n                // => nothing to do\n                newTokenCount++;\n                continue;\n            }\n            else if (tokenDeltaLine === startDeltaLine && tokenStartCharacter < startCharacter) {\n                // 1b, 1c, 1d\n                // => the token survives, but it needs to shrink\n                if (tokenDeltaLine === endDeltaLine && tokenEndCharacter > endCharacter) {\n                    // 1d. The token starts before, the deletion range is inside the token\n                    // => the token shrinks by the deletion character count\n                    tokenEndCharacter -= (endCharacter - startCharacter);\n                }\n                else {\n                    // 1b. The token starts before, the deletion range ends after the token\n                    // 1c. The token starts before, the deletion range ends precisely with the token\n                    // => the token shrinks its ending to the deletion start\n                    tokenEndCharacter = startCharacter;\n                }\n            }\n            else if (tokenDeltaLine === startDeltaLine && tokenStartCharacter === startCharacter) {\n                // 2a, 2b, 2c\n                if (tokenDeltaLine === endDeltaLine && tokenEndCharacter > endCharacter) {\n                    // 2c. The token starts at the same position, and ends after the deletion range\n                    // => the token shrinks by the deletion character count\n                    tokenEndCharacter -= (endCharacter - startCharacter);\n                }\n                else {\n                    // 2a. The token starts at the same position, and ends inside the deletion range\n                    // 2b. The token starts at the same position, and ends at the same position as the deletion range\n                    // => the token is deleted\n                    hasDeletedTokens = true;\n                    continue;\n                }\n            }\n            else if (tokenDeltaLine < endDeltaLine || (tokenDeltaLine === endDeltaLine && tokenStartCharacter < endCharacter)) {\n                // 3a, 3b, 3c\n                if (tokenDeltaLine === endDeltaLine && tokenEndCharacter > endCharacter) {\n                    // 3c. The token starts inside the deletion range, and ends after the deletion range\n                    // => the token moves to continue right after the deletion\n                    tokenDeltaLine = startDeltaLine;\n                    tokenStartCharacter = startCharacter;\n                    tokenEndCharacter = tokenStartCharacter + (tokenEndCharacter - endCharacter);\n                }\n                else {\n                    // 3a. The token is inside the deletion range\n                    // 3b. The token starts inside the deletion range, and ends at the same position as the deletion range\n                    // => the token is deleted\n                    hasDeletedTokens = true;\n                    continue;\n                }\n            }\n            else if (tokenDeltaLine > endDeltaLine) {\n                // 4. (partial) The token starts after the deletion range, on a line below...\n                if (deletedLineCount === 0 && !hasDeletedTokens) {\n                    // early stop, there is no need to walk all the tokens and do nothing...\n                    newTokenCount = tokenCount;\n                    break;\n                }\n                tokenDeltaLine -= deletedLineCount;\n            }\n            else if (tokenDeltaLine === endDeltaLine && tokenStartCharacter >= endCharacter) {\n                // 4. (continued) The token starts after the deletion range, on the last line where a deletion occurs\n                if (horizontalShiftForFirstLineTokens && tokenDeltaLine === 0) {\n                    tokenStartCharacter += horizontalShiftForFirstLineTokens;\n                    tokenEndCharacter += horizontalShiftForFirstLineTokens;\n                }\n                tokenDeltaLine -= deletedLineCount;\n                tokenStartCharacter -= (endCharacter - startCharacter);\n                tokenEndCharacter -= (endCharacter - startCharacter);\n            }\n            else {\n                throw new Error(`Not possible!`);\n            }\n            const destOffset = 4 * newTokenCount;\n            tokens[destOffset] = tokenDeltaLine;\n            tokens[destOffset + 1] = tokenStartCharacter;\n            tokens[destOffset + 2] = tokenEndCharacter;\n            tokens[destOffset + 3] = tokenMetadata;\n            newTokenCount++;\n        }\n        this._tokenCount = newTokenCount;\n    }\n    acceptInsertText(deltaLine, character, eolCount, firstLineLength, lastLineLength, firstCharCode) {\n        // Here are the cases I used to think about this:\n        //\n        // 1. The token is completely before the insertion point\n        //            -----------   |\n        // 2. The token ends precisely at the insertion point\n        //            -----------|\n        // 3. The token contains the insertion point\n        //            -----|------\n        // 4. The token starts precisely at the insertion point\n        //            |-----------\n        // 5. The token is completely after the insertion point\n        //            |   -----------\n        //\n        const isInsertingPreciselyOneWordCharacter = (eolCount === 0\n            && firstLineLength === 1\n            && ((firstCharCode >= 48 /* CharCode.Digit0 */ && firstCharCode <= 57 /* CharCode.Digit9 */)\n                || (firstCharCode >= 65 /* CharCode.A */ && firstCharCode <= 90 /* CharCode.Z */)\n                || (firstCharCode >= 97 /* CharCode.a */ && firstCharCode <= 122 /* CharCode.z */)));\n        const tokens = this._tokens;\n        const tokenCount = this._tokenCount;\n        for (let i = 0; i < tokenCount; i++) {\n            const offset = 4 * i;\n            let tokenDeltaLine = tokens[offset];\n            let tokenStartCharacter = tokens[offset + 1];\n            let tokenEndCharacter = tokens[offset + 2];\n            if (tokenDeltaLine < deltaLine || (tokenDeltaLine === deltaLine && tokenEndCharacter < character)) {\n                // 1. The token is completely before the insertion point\n                // => nothing to do\n                continue;\n            }\n            else if (tokenDeltaLine === deltaLine && tokenEndCharacter === character) {\n                // 2. The token ends precisely at the insertion point\n                // => expand the end character only if inserting precisely one character that is a word character\n                if (isInsertingPreciselyOneWordCharacter) {\n                    tokenEndCharacter += 1;\n                }\n                else {\n                    continue;\n                }\n            }\n            else if (tokenDeltaLine === deltaLine && tokenStartCharacter < character && character < tokenEndCharacter) {\n                // 3. The token contains the insertion point\n                if (eolCount === 0) {\n                    // => just expand the end character\n                    tokenEndCharacter += firstLineLength;\n                }\n                else {\n                    // => cut off the token\n                    tokenEndCharacter = character;\n                }\n            }\n            else {\n                // 4. or 5.\n                if (tokenDeltaLine === deltaLine && tokenStartCharacter === character) {\n                    // 4. The token starts precisely at the insertion point\n                    // => grow the token (by keeping its start constant) only if inserting precisely one character that is a word character\n                    // => otherwise behave as in case 5.\n                    if (isInsertingPreciselyOneWordCharacter) {\n                        continue;\n                    }\n                }\n                // => the token must move and keep its size constant\n                if (tokenDeltaLine === deltaLine) {\n                    tokenDeltaLine += eolCount;\n                    // this token is on the line where the insertion is taking place\n                    if (eolCount === 0) {\n                        tokenStartCharacter += firstLineLength;\n                        tokenEndCharacter += firstLineLength;\n                    }\n                    else {\n                        const tokenLength = tokenEndCharacter - tokenStartCharacter;\n                        tokenStartCharacter = lastLineLength + (tokenStartCharacter - character);\n                        tokenEndCharacter = tokenStartCharacter + tokenLength;\n                    }\n                }\n                else {\n                    tokenDeltaLine += eolCount;\n                }\n            }\n            tokens[offset] = tokenDeltaLine;\n            tokens[offset + 1] = tokenStartCharacter;\n            tokens[offset + 2] = tokenEndCharacter;\n        }\n    }\n    static { this._rateLimiter = new RateLimiter(10 / 60); } // limit to 10 times per minute\n    reportIfInvalid(model, startLineNumber) {\n        for (let i = 0; i < this._tokenCount; i++) {\n            const lineNumber = this._getDeltaLine(i) + startLineNumber;\n            if (lineNumber < 1) {\n                SparseMultilineTokensStorage._rateLimiter.runIfNotLimited(() => {\n                    console.error('Invalid Semantic Tokens Data From Extension: lineNumber < 1');\n                });\n            }\n            else if (lineNumber > model.getLineCount()) {\n                SparseMultilineTokensStorage._rateLimiter.runIfNotLimited(() => {\n                    console.error('Invalid Semantic Tokens Data From Extension: lineNumber > model.getLineCount()');\n                });\n            }\n            else if (this._getEndCharacter(i) > model.getLineLength(lineNumber)) {\n                SparseMultilineTokensStorage._rateLimiter.runIfNotLimited(() => {\n                    console.error('Invalid Semantic Tokens Data From Extension: end character > model.getLineLength(lineNumber)');\n                });\n            }\n        }\n    }\n}\nclass SparseLineTokens {\n    constructor(tokens) {\n        this._tokens = tokens;\n    }\n    getCount() {\n        return this._tokens.length / 4;\n    }\n    getStartCharacter(tokenIndex) {\n        return this._tokens[4 * tokenIndex + 1];\n    }\n    getEndCharacter(tokenIndex) {\n        return this._tokens[4 * tokenIndex + 2];\n    }\n    getMetadata(tokenIndex) {\n        return this._tokens[4 * tokenIndex + 3];\n    }\n}\n\nexport { SparseLineTokens, SparseMultilineTokens };\n","import { IThemeService } from '../../../platform/theme/common/themeService.js';\nimport { ILogService } from '../../../platform/log/common/log.js';\nimport { SparseMultilineTokens } from '../tokens/sparseMultilineTokens.js';\nimport { ILanguageService } from '../languages/language.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet SemanticTokensProviderStyling = class SemanticTokensProviderStyling {\n    constructor(_legend, _themeService, _languageService, _logService) {\n        this._legend = _legend;\n        this._themeService = _themeService;\n        this._languageService = _languageService;\n        this._logService = _logService;\n        this._hasWarnedOverlappingTokens = false;\n        this._hasWarnedInvalidLengthTokens = false;\n        this._hasWarnedInvalidEditStart = false;\n        this._hashTable = new HashTable();\n    }\n    getMetadata(tokenTypeIndex, tokenModifierSet, languageId) {\n        const encodedLanguageId = this._languageService.languageIdCodec.encodeLanguageId(languageId);\n        const entry = this._hashTable.get(tokenTypeIndex, tokenModifierSet, encodedLanguageId);\n        let metadata;\n        if (entry) {\n            metadata = entry.metadata;\n        }\n        else {\n            let tokenType = this._legend.tokenTypes[tokenTypeIndex];\n            const tokenModifiers = [];\n            if (tokenType) {\n                let modifierSet = tokenModifierSet;\n                for (let modifierIndex = 0; modifierSet > 0 && modifierIndex < this._legend.tokenModifiers.length; modifierIndex++) {\n                    if (modifierSet & 1) {\n                        tokenModifiers.push(this._legend.tokenModifiers[modifierIndex]);\n                    }\n                    modifierSet = modifierSet >> 1;\n                }\n                const tokenStyle = this._themeService.getColorTheme().getTokenStyleMetadata(tokenType, tokenModifiers, languageId);\n                if (typeof tokenStyle === 'undefined') {\n                    metadata = 2147483647 /* SemanticTokensProviderStylingConstants.NO_STYLING */;\n                }\n                else {\n                    metadata = 0;\n                    if (typeof tokenStyle.italic !== 'undefined') {\n                        const italicBit = (tokenStyle.italic ? 1 /* FontStyle.Italic */ : 0) << 11 /* MetadataConsts.FONT_STYLE_OFFSET */;\n                        metadata |= italicBit | 1 /* MetadataConsts.SEMANTIC_USE_ITALIC */;\n                    }\n                    if (typeof tokenStyle.bold !== 'undefined') {\n                        const boldBit = (tokenStyle.bold ? 2 /* FontStyle.Bold */ : 0) << 11 /* MetadataConsts.FONT_STYLE_OFFSET */;\n                        metadata |= boldBit | 2 /* MetadataConsts.SEMANTIC_USE_BOLD */;\n                    }\n                    if (typeof tokenStyle.underline !== 'undefined') {\n                        const underlineBit = (tokenStyle.underline ? 4 /* FontStyle.Underline */ : 0) << 11 /* MetadataConsts.FONT_STYLE_OFFSET */;\n                        metadata |= underlineBit | 4 /* MetadataConsts.SEMANTIC_USE_UNDERLINE */;\n                    }\n                    if (typeof tokenStyle.strikethrough !== 'undefined') {\n                        const strikethroughBit = (tokenStyle.strikethrough ? 8 /* FontStyle.Strikethrough */ : 0) << 11 /* MetadataConsts.FONT_STYLE_OFFSET */;\n                        metadata |= strikethroughBit | 8 /* MetadataConsts.SEMANTIC_USE_STRIKETHROUGH */;\n                    }\n                    if (tokenStyle.foreground) {\n                        const foregroundBits = (tokenStyle.foreground) << 15 /* MetadataConsts.FOREGROUND_OFFSET */;\n                        metadata |= foregroundBits | 16 /* MetadataConsts.SEMANTIC_USE_FOREGROUND */;\n                    }\n                    if (metadata === 0) {\n                        // Nothing!\n                        metadata = 2147483647 /* SemanticTokensProviderStylingConstants.NO_STYLING */;\n                    }\n                }\n            }\n            else {\n                metadata = 2147483647 /* SemanticTokensProviderStylingConstants.NO_STYLING */;\n                tokenType = 'not-in-legend';\n            }\n            this._hashTable.add(tokenTypeIndex, tokenModifierSet, encodedLanguageId, metadata);\n        }\n        return metadata;\n    }\n    warnOverlappingSemanticTokens(lineNumber, startColumn) {\n        if (!this._hasWarnedOverlappingTokens) {\n            this._hasWarnedOverlappingTokens = true;\n            this._logService.warn(`Overlapping semantic tokens detected at lineNumber ${lineNumber}, column ${startColumn}`);\n        }\n    }\n    warnInvalidLengthSemanticTokens(lineNumber, startColumn) {\n        if (!this._hasWarnedInvalidLengthTokens) {\n            this._hasWarnedInvalidLengthTokens = true;\n            this._logService.warn(`Semantic token with invalid length detected at lineNumber ${lineNumber}, column ${startColumn}`);\n        }\n    }\n    warnInvalidEditStart(previousResultId, resultId, editIndex, editStart, maxExpectedStart) {\n        if (!this._hasWarnedInvalidEditStart) {\n            this._hasWarnedInvalidEditStart = true;\n            this._logService.warn(`Invalid semantic tokens edit detected (previousResultId: ${previousResultId}, resultId: ${resultId}) at edit #${editIndex}: The provided start offset ${editStart} is outside the previous data (length ${maxExpectedStart}).`);\n        }\n    }\n};\nSemanticTokensProviderStyling = __decorate([\n    __param(1, IThemeService),\n    __param(2, ILanguageService),\n    __param(3, ILogService)\n], SemanticTokensProviderStyling);\nfunction toMultilineTokens2(tokens, styling, languageId) {\n    const srcData = tokens.data;\n    const tokenCount = (tokens.data.length / 5) | 0;\n    const tokensPerArea = Math.max(Math.ceil(tokenCount / 1024 /* SemanticColoringConstants.DesiredMaxAreas */), 400 /* SemanticColoringConstants.DesiredTokensPerArea */);\n    const result = [];\n    let tokenIndex = 0;\n    let lastLineNumber = 1;\n    let lastStartCharacter = 0;\n    while (tokenIndex < tokenCount) {\n        const tokenStartIndex = tokenIndex;\n        let tokenEndIndex = Math.min(tokenStartIndex + tokensPerArea, tokenCount);\n        // Keep tokens on the same line in the same area...\n        if (tokenEndIndex < tokenCount) {\n            let smallTokenEndIndex = tokenEndIndex;\n            while (smallTokenEndIndex - 1 > tokenStartIndex && srcData[5 * smallTokenEndIndex] === 0) {\n                smallTokenEndIndex--;\n            }\n            if (smallTokenEndIndex - 1 === tokenStartIndex) {\n                // there are so many tokens on this line that our area would be empty, we must now go right\n                let bigTokenEndIndex = tokenEndIndex;\n                while (bigTokenEndIndex + 1 < tokenCount && srcData[5 * bigTokenEndIndex] === 0) {\n                    bigTokenEndIndex++;\n                }\n                tokenEndIndex = bigTokenEndIndex;\n            }\n            else {\n                tokenEndIndex = smallTokenEndIndex;\n            }\n        }\n        let destData = new Uint32Array((tokenEndIndex - tokenStartIndex) * 4);\n        let destOffset = 0;\n        let areaLine = 0;\n        let prevLineNumber = 0;\n        let prevEndCharacter = 0;\n        while (tokenIndex < tokenEndIndex) {\n            const srcOffset = 5 * tokenIndex;\n            const deltaLine = srcData[srcOffset];\n            const deltaCharacter = srcData[srcOffset + 1];\n            // Casting both `lineNumber`, `startCharacter` and `endCharacter` here to uint32 using `|0`\n            // to validate below with the actual values that will be inserted in the Uint32Array result\n            const lineNumber = (lastLineNumber + deltaLine) | 0;\n            const startCharacter = (deltaLine === 0 ? (lastStartCharacter + deltaCharacter) | 0 : deltaCharacter);\n            const length = srcData[srcOffset + 2];\n            const endCharacter = (startCharacter + length) | 0;\n            const tokenTypeIndex = srcData[srcOffset + 3];\n            const tokenModifierSet = srcData[srcOffset + 4];\n            if (endCharacter <= startCharacter) {\n                // this token is invalid (most likely a negative length casted to uint32)\n                styling.warnInvalidLengthSemanticTokens(lineNumber, startCharacter + 1);\n            }\n            else if (prevLineNumber === lineNumber && prevEndCharacter > startCharacter) {\n                // this token overlaps with the previous token\n                styling.warnOverlappingSemanticTokens(lineNumber, startCharacter + 1);\n            }\n            else {\n                const metadata = styling.getMetadata(tokenTypeIndex, tokenModifierSet, languageId);\n                if (metadata !== 2147483647 /* SemanticTokensProviderStylingConstants.NO_STYLING */) {\n                    if (areaLine === 0) {\n                        areaLine = lineNumber;\n                    }\n                    destData[destOffset] = lineNumber - areaLine;\n                    destData[destOffset + 1] = startCharacter;\n                    destData[destOffset + 2] = endCharacter;\n                    destData[destOffset + 3] = metadata;\n                    destOffset += 4;\n                    prevLineNumber = lineNumber;\n                    prevEndCharacter = endCharacter;\n                }\n            }\n            lastLineNumber = lineNumber;\n            lastStartCharacter = startCharacter;\n            tokenIndex++;\n        }\n        if (destOffset !== destData.length) {\n            destData = destData.subarray(0, destOffset);\n        }\n        const tokens = SparseMultilineTokens.create(areaLine, destData);\n        result.push(tokens);\n    }\n    return result;\n}\nclass HashTableEntry {\n    constructor(tokenTypeIndex, tokenModifierSet, languageId, metadata) {\n        this.tokenTypeIndex = tokenTypeIndex;\n        this.tokenModifierSet = tokenModifierSet;\n        this.languageId = languageId;\n        this.metadata = metadata;\n        this.next = null;\n    }\n}\nclass HashTable {\n    static { this._SIZES = [3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, 262139, 524287, 1048573, 2097143]; }\n    constructor() {\n        this._elementsCount = 0;\n        this._currentLengthIndex = 0;\n        this._currentLength = HashTable._SIZES[this._currentLengthIndex];\n        this._growCount = Math.round(this._currentLengthIndex + 1 < HashTable._SIZES.length ? 2 / 3 * this._currentLength : 0);\n        this._elements = [];\n        HashTable._nullOutEntries(this._elements, this._currentLength);\n    }\n    static _nullOutEntries(entries, length) {\n        for (let i = 0; i < length; i++) {\n            entries[i] = null;\n        }\n    }\n    _hash2(n1, n2) {\n        return (((n1 << 5) - n1) + n2) | 0; // n1 * 31 + n2, keep as int32\n    }\n    _hashFunc(tokenTypeIndex, tokenModifierSet, languageId) {\n        return this._hash2(this._hash2(tokenTypeIndex, tokenModifierSet), languageId) % this._currentLength;\n    }\n    get(tokenTypeIndex, tokenModifierSet, languageId) {\n        const hash = this._hashFunc(tokenTypeIndex, tokenModifierSet, languageId);\n        let p = this._elements[hash];\n        while (p) {\n            if (p.tokenTypeIndex === tokenTypeIndex && p.tokenModifierSet === tokenModifierSet && p.languageId === languageId) {\n                return p;\n            }\n            p = p.next;\n        }\n        return null;\n    }\n    add(tokenTypeIndex, tokenModifierSet, languageId, metadata) {\n        this._elementsCount++;\n        if (this._growCount !== 0 && this._elementsCount >= this._growCount) {\n            // expand!\n            const oldElements = this._elements;\n            this._currentLengthIndex++;\n            this._currentLength = HashTable._SIZES[this._currentLengthIndex];\n            this._growCount = Math.round(this._currentLengthIndex + 1 < HashTable._SIZES.length ? 2 / 3 * this._currentLength : 0);\n            this._elements = [];\n            HashTable._nullOutEntries(this._elements, this._currentLength);\n            for (const first of oldElements) {\n                let p = first;\n                while (p) {\n                    const oldNext = p.next;\n                    p.next = null;\n                    this._add(p);\n                    p = oldNext;\n                }\n            }\n        }\n        this._add(new HashTableEntry(tokenTypeIndex, tokenModifierSet, languageId, metadata));\n    }\n    _add(element) {\n        const hash = this._hashFunc(element.tokenTypeIndex, element.tokenModifierSet, element.languageId);\n        element.next = this._elements[hash];\n        this._elements[hash] = element;\n    }\n}\n\nexport { SemanticTokensProviderStyling, toMultilineTokens2 };\n","import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst ISemanticTokensStylingService = createDecorator('semanticTokensStylingService');\n\nexport { ISemanticTokensStylingService };\n","import { VSBuffer } from '../../../base/common/buffer.js';\nimport { isLittleEndian } from '../../../base/common/platform.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction reverseEndianness(arr) {\n    for (let i = 0, len = arr.length; i < len; i += 4) {\n        // flip bytes 0<->3 and 1<->2\n        const b0 = arr[i + 0];\n        const b1 = arr[i + 1];\n        const b2 = arr[i + 2];\n        const b3 = arr[i + 3];\n        arr[i + 0] = b3;\n        arr[i + 1] = b2;\n        arr[i + 2] = b1;\n        arr[i + 3] = b0;\n    }\n}\nfunction toLittleEndianBuffer(arr) {\n    const uint8Arr = new Uint8Array(arr.buffer, arr.byteOffset, arr.length * 4);\n    if (!isLittleEndian()) {\n        // the byte order must be changed\n        reverseEndianness(uint8Arr);\n    }\n    return VSBuffer.wrap(uint8Arr);\n}\nfunction encodeSemanticTokensDto(semanticTokens) {\n    const dest = new Uint32Array(encodeSemanticTokensDtoSize(semanticTokens));\n    let offset = 0;\n    dest[offset++] = semanticTokens.id;\n    if (semanticTokens.type === 'full') {\n        dest[offset++] = 1 /* EncodedSemanticTokensType.Full */;\n        dest[offset++] = semanticTokens.data.length;\n        dest.set(semanticTokens.data, offset);\n        offset += semanticTokens.data.length;\n    }\n    else {\n        dest[offset++] = 2 /* EncodedSemanticTokensType.Delta */;\n        dest[offset++] = semanticTokens.deltas.length;\n        for (const delta of semanticTokens.deltas) {\n            dest[offset++] = delta.start;\n            dest[offset++] = delta.deleteCount;\n            if (delta.data) {\n                dest[offset++] = delta.data.length;\n                dest.set(delta.data, offset);\n                offset += delta.data.length;\n            }\n            else {\n                dest[offset++] = 0;\n            }\n        }\n    }\n    return toLittleEndianBuffer(dest);\n}\nfunction encodeSemanticTokensDtoSize(semanticTokens) {\n    let result = 0;\n    result += (1 // id\n        + 1 // type\n    );\n    if (semanticTokens.type === 'full') {\n        result += (1 // data length\n            + semanticTokens.data.length);\n    }\n    else {\n        result += (1 // delta count\n        );\n        result += (1 // start\n            + 1 // deleteCount\n            + 1 // data length\n        ) * semanticTokens.deltas.length;\n        for (const delta of semanticTokens.deltas) {\n            if (delta.data) {\n                result += delta.data.length;\n            }\n        }\n    }\n    return result;\n}\n\nexport { encodeSemanticTokensDto };\n","import { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { IModelService } from '../../../common/services/model.js';\nimport { CommandsRegistry, ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { encodeSemanticTokensDto } from '../../../common/services/semanticTokensDto.js';\nimport { Range } from '../../../common/core/range.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction isSemanticTokens(v) {\n    return v && !!(v.data);\n}\nfunction isSemanticTokensEdits(v) {\n    return v && Array.isArray(v.edits);\n}\nclass DocumentSemanticTokensResult {\n    constructor(provider, tokens, error) {\n        this.provider = provider;\n        this.tokens = tokens;\n        this.error = error;\n    }\n}\nfunction hasDocumentSemanticTokensProvider(registry, model) {\n    return registry.has(model);\n}\nfunction getDocumentSemanticTokensProviders(registry, model) {\n    const groups = registry.orderedGroups(model);\n    return (groups.length > 0 ? groups[0] : []);\n}\nasync function getDocumentSemanticTokens(registry, model, lastProvider, lastResultId, token) {\n    const providers = getDocumentSemanticTokensProviders(registry, model);\n    // Get tokens from all providers at the same time.\n    const results = await Promise.all(providers.map(async (provider) => {\n        let result;\n        let error = null;\n        try {\n            result = await provider.provideDocumentSemanticTokens(model, (provider === lastProvider ? lastResultId : null), token);\n        }\n        catch (err) {\n            error = err;\n            result = null;\n        }\n        if (!result || (!isSemanticTokens(result) && !isSemanticTokensEdits(result))) {\n            result = null;\n        }\n        return new DocumentSemanticTokensResult(provider, result, error);\n    }));\n    // Try to return the first result with actual tokens or\n    // the first result which threw an error (!!)\n    for (const result of results) {\n        if (result.error) {\n            throw result.error;\n        }\n        if (result.tokens) {\n            return result;\n        }\n    }\n    // Return the first result, even if it doesn't have tokens\n    if (results.length > 0) {\n        return results[0];\n    }\n    return null;\n}\nfunction _getDocumentSemanticTokensProviderHighestGroup(registry, model) {\n    const result = registry.orderedGroups(model);\n    return (result.length > 0 ? result[0] : null);\n}\nclass DocumentRangeSemanticTokensResult {\n    constructor(provider, tokens) {\n        this.provider = provider;\n        this.tokens = tokens;\n    }\n}\nfunction hasDocumentRangeSemanticTokensProvider(providers, model) {\n    return providers.has(model);\n}\nfunction getDocumentRangeSemanticTokensProviders(providers, model) {\n    const groups = providers.orderedGroups(model);\n    return (groups.length > 0 ? groups[0] : []);\n}\nasync function getDocumentRangeSemanticTokens(registry, model, range, token) {\n    const providers = getDocumentRangeSemanticTokensProviders(registry, model);\n    // Get tokens from all providers at the same time.\n    const results = await Promise.all(providers.map(async (provider) => {\n        let result;\n        try {\n            result = await provider.provideDocumentRangeSemanticTokens(model, range, token);\n        }\n        catch (err) {\n            onUnexpectedExternalError(err);\n            result = null;\n        }\n        if (!result || !isSemanticTokens(result)) {\n            result = null;\n        }\n        return new DocumentRangeSemanticTokensResult(provider, result);\n    }));\n    // Try to return the first result with actual tokens\n    for (const result of results) {\n        if (result.tokens) {\n            return result;\n        }\n    }\n    // Return the first result, even if it doesn't have tokens\n    if (results.length > 0) {\n        return results[0];\n    }\n    return null;\n}\nCommandsRegistry.registerCommand('_provideDocumentSemanticTokensLegend', async (accessor, ...args) => {\n    const [uri] = args;\n    assertType(uri instanceof URI);\n    const model = accessor.get(IModelService).getModel(uri);\n    if (!model) {\n        return undefined;\n    }\n    const { documentSemanticTokensProvider } = accessor.get(ILanguageFeaturesService);\n    const providers = _getDocumentSemanticTokensProviderHighestGroup(documentSemanticTokensProvider, model);\n    if (!providers) {\n        // there is no provider => fall back to a document range semantic tokens provider\n        return accessor.get(ICommandService).executeCommand('_provideDocumentRangeSemanticTokensLegend', uri);\n    }\n    return providers[0].getLegend();\n});\nCommandsRegistry.registerCommand('_provideDocumentSemanticTokens', async (accessor, ...args) => {\n    const [uri] = args;\n    assertType(uri instanceof URI);\n    const model = accessor.get(IModelService).getModel(uri);\n    if (!model) {\n        return undefined;\n    }\n    const { documentSemanticTokensProvider } = accessor.get(ILanguageFeaturesService);\n    if (!hasDocumentSemanticTokensProvider(documentSemanticTokensProvider, model)) {\n        // there is no provider => fall back to a document range semantic tokens provider\n        return accessor.get(ICommandService).executeCommand('_provideDocumentRangeSemanticTokens', uri, model.getFullModelRange());\n    }\n    const r = await getDocumentSemanticTokens(documentSemanticTokensProvider, model, null, null, CancellationToken.None);\n    if (!r) {\n        return undefined;\n    }\n    const { provider, tokens } = r;\n    if (!tokens || !isSemanticTokens(tokens)) {\n        return undefined;\n    }\n    const buff = encodeSemanticTokensDto({\n        id: 0,\n        type: 'full',\n        data: tokens.data\n    });\n    if (tokens.resultId) {\n        provider.releaseDocumentSemanticTokens(tokens.resultId);\n    }\n    return buff;\n});\nCommandsRegistry.registerCommand('_provideDocumentRangeSemanticTokensLegend', async (accessor, ...args) => {\n    const [uri, range] = args;\n    assertType(uri instanceof URI);\n    const model = accessor.get(IModelService).getModel(uri);\n    if (!model) {\n        return undefined;\n    }\n    const { documentRangeSemanticTokensProvider } = accessor.get(ILanguageFeaturesService);\n    const providers = getDocumentRangeSemanticTokensProviders(documentRangeSemanticTokensProvider, model);\n    if (providers.length === 0) {\n        // no providers\n        return undefined;\n    }\n    if (providers.length === 1) {\n        // straight forward case, just a single provider\n        return providers[0].getLegend();\n    }\n    if (!range || !Range.isIRange(range)) {\n        // if no range is provided, we cannot support multiple providers\n        // as we cannot fall back to the one which would give results\n        // => return the first legend for backwards compatibility and print a warning\n        console.warn(`provideDocumentRangeSemanticTokensLegend might be out-of-sync with provideDocumentRangeSemanticTokens unless a range argument is passed in`);\n        return providers[0].getLegend();\n    }\n    const result = await getDocumentRangeSemanticTokens(documentRangeSemanticTokensProvider, model, Range.lift(range), CancellationToken.None);\n    if (!result) {\n        return undefined;\n    }\n    return result.provider.getLegend();\n});\nCommandsRegistry.registerCommand('_provideDocumentRangeSemanticTokens', async (accessor, ...args) => {\n    const [uri, range] = args;\n    assertType(uri instanceof URI);\n    assertType(Range.isIRange(range));\n    const model = accessor.get(IModelService).getModel(uri);\n    if (!model) {\n        return undefined;\n    }\n    const { documentRangeSemanticTokensProvider } = accessor.get(ILanguageFeaturesService);\n    const result = await getDocumentRangeSemanticTokens(documentRangeSemanticTokensProvider, model, Range.lift(range), CancellationToken.None);\n    if (!result || !result.tokens) {\n        // there is no provider or it didn't return tokens\n        return undefined;\n    }\n    return encodeSemanticTokensDto({\n        id: 0,\n        type: 'full',\n        data: result.tokens.data\n    });\n});\n\nexport { DocumentSemanticTokensResult, getDocumentRangeSemanticTokens, getDocumentSemanticTokens, hasDocumentRangeSemanticTokensProvider, hasDocumentSemanticTokensProvider, isSemanticTokens, isSemanticTokensEdits };\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 *--------------------------------------------------------------------------------------------*/\nconst SEMANTIC_HIGHLIGHTING_SETTING_ID = 'editor.semanticHighlighting';\nfunction isSemanticColoringEnabled(model, themeService, configurationService) {\n    const setting = configurationService.getValue(SEMANTIC_HIGHLIGHTING_SETTING_ID, { overrideIdentifier: model.getLanguageId(), resource: model.uri })?.enabled;\n    if (typeof setting === 'boolean') {\n        return setting;\n    }\n    return themeService.getColorTheme().semanticHighlighting;\n}\n\nexport { SEMANTIC_HIGHLIGHTING_SETTING_ID, isSemanticColoringEnabled };\n","import { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { isCancellationError, onUnexpectedError } from '../../../../base/common/errors.js';\nimport { Disposable, dispose } from '../../../../base/common/lifecycle.js';\nimport { ResourceMap } from '../../../../base/common/map.js';\nimport { StopWatch } from '../../../../base/common/stopwatch.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { IThemeService } from '../../../../platform/theme/common/themeService.js';\nimport { registerEditorFeature } from '../../../common/editorFeatures.js';\nimport { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { IModelService } from '../../../common/services/model.js';\nimport { toMultilineTokens2 } from '../../../common/services/semanticTokensProviderStyling.js';\nimport { ISemanticTokensStylingService } from '../../../common/services/semanticTokensStyling.js';\nimport { hasDocumentSemanticTokensProvider, getDocumentSemanticTokens, isSemanticTokensEdits, isSemanticTokens } from '../common/getSemanticTokens.js';\nimport { isSemanticColoringEnabled, SEMANTIC_HIGHLIGHTING_SETTING_ID } from '../common/semanticTokensConfig.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ModelSemanticColoring_1;\nlet DocumentSemanticTokensFeature = class DocumentSemanticTokensFeature extends Disposable {\n    constructor(semanticTokensStylingService, modelService, themeService, configurationService, languageFeatureDebounceService, languageFeaturesService) {\n        super();\n        this._watchers = new ResourceMap();\n        const register = (model) => {\n            this._watchers.get(model.uri)?.dispose();\n            this._watchers.set(model.uri, new ModelSemanticColoring(model, semanticTokensStylingService, themeService, languageFeatureDebounceService, languageFeaturesService));\n        };\n        const deregister = (model, modelSemanticColoring) => {\n            modelSemanticColoring.dispose();\n            this._watchers.delete(model.uri);\n        };\n        const handleSettingOrThemeChange = () => {\n            for (const model of modelService.getModels()) {\n                const curr = this._watchers.get(model.uri);\n                if (isSemanticColoringEnabled(model, themeService, configurationService)) {\n                    if (!curr) {\n                        register(model);\n                    }\n                }\n                else {\n                    if (curr) {\n                        deregister(model, curr);\n                    }\n                }\n            }\n        };\n        modelService.getModels().forEach(model => {\n            if (isSemanticColoringEnabled(model, themeService, configurationService)) {\n                register(model);\n            }\n        });\n        this._register(modelService.onModelAdded((model) => {\n            if (isSemanticColoringEnabled(model, themeService, configurationService)) {\n                register(model);\n            }\n        }));\n        this._register(modelService.onModelRemoved((model) => {\n            const curr = this._watchers.get(model.uri);\n            if (curr) {\n                deregister(model, curr);\n            }\n        }));\n        this._register(configurationService.onDidChangeConfiguration(e => {\n            if (e.affectsConfiguration(SEMANTIC_HIGHLIGHTING_SETTING_ID)) {\n                handleSettingOrThemeChange();\n            }\n        }));\n        this._register(themeService.onDidColorThemeChange(handleSettingOrThemeChange));\n    }\n    dispose() {\n        dispose(this._watchers.values());\n        this._watchers.clear();\n        super.dispose();\n    }\n};\nDocumentSemanticTokensFeature = __decorate([\n    __param(0, ISemanticTokensStylingService),\n    __param(1, IModelService),\n    __param(2, IThemeService),\n    __param(3, IConfigurationService),\n    __param(4, ILanguageFeatureDebounceService),\n    __param(5, ILanguageFeaturesService)\n], DocumentSemanticTokensFeature);\nlet ModelSemanticColoring = class ModelSemanticColoring extends Disposable {\n    static { ModelSemanticColoring_1 = this; }\n    static { this.REQUEST_MIN_DELAY = 300; }\n    static { this.REQUEST_MAX_DELAY = 2000; }\n    constructor(model, _semanticTokensStylingService, themeService, languageFeatureDebounceService, languageFeaturesService) {\n        super();\n        this._semanticTokensStylingService = _semanticTokensStylingService;\n        this._isDisposed = false;\n        this._model = model;\n        this._provider = languageFeaturesService.documentSemanticTokensProvider;\n        this._debounceInformation = languageFeatureDebounceService.for(this._provider, 'DocumentSemanticTokens', { min: ModelSemanticColoring_1.REQUEST_MIN_DELAY, max: ModelSemanticColoring_1.REQUEST_MAX_DELAY });\n        this._fetchDocumentSemanticTokens = this._register(new RunOnceScheduler(() => this._fetchDocumentSemanticTokensNow(), ModelSemanticColoring_1.REQUEST_MIN_DELAY));\n        this._currentDocumentResponse = null;\n        this._currentDocumentRequestCancellationTokenSource = null;\n        this._documentProvidersChangeListeners = [];\n        this._providersChangedDuringRequest = false;\n        this._register(this._model.onDidChangeContent(() => {\n            if (!this._fetchDocumentSemanticTokens.isScheduled()) {\n                this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model));\n            }\n        }));\n        this._register(this._model.onDidChangeAttached(() => {\n            if (!this._fetchDocumentSemanticTokens.isScheduled()) {\n                this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model));\n            }\n        }));\n        this._register(this._model.onDidChangeLanguage(() => {\n            // clear any outstanding state\n            if (this._currentDocumentResponse) {\n                this._currentDocumentResponse.dispose();\n                this._currentDocumentResponse = null;\n            }\n            if (this._currentDocumentRequestCancellationTokenSource) {\n                this._currentDocumentRequestCancellationTokenSource.cancel();\n                this._currentDocumentRequestCancellationTokenSource = null;\n            }\n            this._setDocumentSemanticTokens(null, null, null, []);\n            this._fetchDocumentSemanticTokens.schedule(0);\n        }));\n        const bindDocumentChangeListeners = () => {\n            dispose(this._documentProvidersChangeListeners);\n            this._documentProvidersChangeListeners = [];\n            for (const provider of this._provider.all(model)) {\n                if (typeof provider.onDidChange === 'function') {\n                    this._documentProvidersChangeListeners.push(provider.onDidChange(() => {\n                        if (this._currentDocumentRequestCancellationTokenSource) {\n                            // there is already a request running,\n                            this._providersChangedDuringRequest = true;\n                            return;\n                        }\n                        this._fetchDocumentSemanticTokens.schedule(0);\n                    }));\n                }\n            }\n        };\n        bindDocumentChangeListeners();\n        this._register(this._provider.onDidChange(() => {\n            bindDocumentChangeListeners();\n            this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model));\n        }));\n        this._register(themeService.onDidColorThemeChange(_ => {\n            // clear out existing tokens\n            this._setDocumentSemanticTokens(null, null, null, []);\n            this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model));\n        }));\n        this._fetchDocumentSemanticTokens.schedule(0);\n    }\n    dispose() {\n        if (this._currentDocumentResponse) {\n            this._currentDocumentResponse.dispose();\n            this._currentDocumentResponse = null;\n        }\n        if (this._currentDocumentRequestCancellationTokenSource) {\n            this._currentDocumentRequestCancellationTokenSource.cancel();\n            this._currentDocumentRequestCancellationTokenSource = null;\n        }\n        dispose(this._documentProvidersChangeListeners);\n        this._documentProvidersChangeListeners = [];\n        this._setDocumentSemanticTokens(null, null, null, []);\n        this._isDisposed = true;\n        super.dispose();\n    }\n    _fetchDocumentSemanticTokensNow() {\n        if (this._currentDocumentRequestCancellationTokenSource) {\n            // there is already a request running, let it finish...\n            return;\n        }\n        if (!hasDocumentSemanticTokensProvider(this._provider, this._model)) {\n            // there is no provider\n            if (this._currentDocumentResponse) {\n                // there are semantic tokens set\n                this._model.tokenization.setSemanticTokens(null, false);\n            }\n            return;\n        }\n        if (!this._model.isAttachedToEditor()) {\n            // this document is not visible, there is no need to fetch semantic tokens for it\n            return;\n        }\n        const cancellationTokenSource = new CancellationTokenSource();\n        const lastProvider = this._currentDocumentResponse ? this._currentDocumentResponse.provider : null;\n        const lastResultId = this._currentDocumentResponse ? this._currentDocumentResponse.resultId || null : null;\n        const request = getDocumentSemanticTokens(this._provider, this._model, lastProvider, lastResultId, cancellationTokenSource.token);\n        this._currentDocumentRequestCancellationTokenSource = cancellationTokenSource;\n        this._providersChangedDuringRequest = false;\n        const pendingChanges = [];\n        const contentChangeListener = this._model.onDidChangeContent((e) => {\n            pendingChanges.push(e);\n        });\n        const sw = new StopWatch(false);\n        request.then((res) => {\n            this._debounceInformation.update(this._model, sw.elapsed());\n            this._currentDocumentRequestCancellationTokenSource = null;\n            contentChangeListener.dispose();\n            if (!res) {\n                this._setDocumentSemanticTokens(null, null, null, pendingChanges);\n            }\n            else {\n                const { provider, tokens } = res;\n                const styling = this._semanticTokensStylingService.getStyling(provider);\n                this._setDocumentSemanticTokens(provider, tokens || null, styling, pendingChanges);\n            }\n        }, (err) => {\n            const isExpectedError = err && (isCancellationError(err) || (typeof err.message === 'string' && err.message.indexOf('busy') !== -1));\n            if (!isExpectedError) {\n                onUnexpectedError(err);\n            }\n            // Semantic tokens eats up all errors and considers errors to mean that the result is temporarily not available\n            // The API does not have a special error kind to express this...\n            this._currentDocumentRequestCancellationTokenSource = null;\n            contentChangeListener.dispose();\n            if (pendingChanges.length > 0 || this._providersChangedDuringRequest) {\n                // More changes occurred while the request was running\n                if (!this._fetchDocumentSemanticTokens.isScheduled()) {\n                    this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model));\n                }\n            }\n        });\n    }\n    static _copy(src, srcOffset, dest, destOffset, length) {\n        // protect against overflows\n        length = Math.min(length, dest.length - destOffset, src.length - srcOffset);\n        for (let i = 0; i < length; i++) {\n            dest[destOffset + i] = src[srcOffset + i];\n        }\n    }\n    _setDocumentSemanticTokens(provider, tokens, styling, pendingChanges) {\n        const currentResponse = this._currentDocumentResponse;\n        const rescheduleIfNeeded = () => {\n            if ((pendingChanges.length > 0 || this._providersChangedDuringRequest) && !this._fetchDocumentSemanticTokens.isScheduled()) {\n                this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model));\n            }\n        };\n        if (this._currentDocumentResponse) {\n            this._currentDocumentResponse.dispose();\n            this._currentDocumentResponse = null;\n        }\n        if (this._isDisposed) {\n            // disposed!\n            if (provider && tokens) {\n                provider.releaseDocumentSemanticTokens(tokens.resultId);\n            }\n            return;\n        }\n        if (!provider || !styling) {\n            this._model.tokenization.setSemanticTokens(null, false);\n            return;\n        }\n        if (!tokens) {\n            this._model.tokenization.setSemanticTokens(null, true);\n            rescheduleIfNeeded();\n            return;\n        }\n        if (isSemanticTokensEdits(tokens)) {\n            if (!currentResponse) {\n                // not possible!\n                this._model.tokenization.setSemanticTokens(null, true);\n                return;\n            }\n            if (tokens.edits.length === 0) {\n                // nothing to do!\n                tokens = {\n                    resultId: tokens.resultId,\n                    data: currentResponse.data\n                };\n            }\n            else {\n                let deltaLength = 0;\n                for (const edit of tokens.edits) {\n                    deltaLength += (edit.data ? edit.data.length : 0) - edit.deleteCount;\n                }\n                const srcData = currentResponse.data;\n                const destData = new Uint32Array(srcData.length + deltaLength);\n                let srcLastStart = srcData.length;\n                let destLastStart = destData.length;\n                for (let i = tokens.edits.length - 1; i >= 0; i--) {\n                    const edit = tokens.edits[i];\n                    if (edit.start > srcData.length) {\n                        styling.warnInvalidEditStart(currentResponse.resultId, tokens.resultId, i, edit.start, srcData.length);\n                        // The edits are invalid and there's no way to recover\n                        this._model.tokenization.setSemanticTokens(null, true);\n                        return;\n                    }\n                    const copyCount = srcLastStart - (edit.start + edit.deleteCount);\n                    if (copyCount > 0) {\n                        ModelSemanticColoring_1._copy(srcData, srcLastStart - copyCount, destData, destLastStart - copyCount, copyCount);\n                        destLastStart -= copyCount;\n                    }\n                    if (edit.data) {\n                        ModelSemanticColoring_1._copy(edit.data, 0, destData, destLastStart - edit.data.length, edit.data.length);\n                        destLastStart -= edit.data.length;\n                    }\n                    srcLastStart = edit.start;\n                }\n                if (srcLastStart > 0) {\n                    ModelSemanticColoring_1._copy(srcData, 0, destData, 0, srcLastStart);\n                }\n                tokens = {\n                    resultId: tokens.resultId,\n                    data: destData\n                };\n            }\n        }\n        if (isSemanticTokens(tokens)) {\n            this._currentDocumentResponse = new SemanticTokensResponse(provider, tokens.resultId, tokens.data);\n            const result = toMultilineTokens2(tokens, styling, this._model.getLanguageId());\n            // Adjust incoming semantic tokens\n            if (pendingChanges.length > 0) {\n                // More changes occurred while the request was running\n                // We need to:\n                // 1. Adjust incoming semantic tokens\n                // 2. Request them again\n                for (const change of pendingChanges) {\n                    for (const area of result) {\n                        for (const singleChange of change.changes) {\n                            area.applyEdit(singleChange.range, singleChange.text);\n                        }\n                    }\n                }\n            }\n            this._model.tokenization.setSemanticTokens(result, true);\n        }\n        else {\n            this._model.tokenization.setSemanticTokens(null, true);\n        }\n        rescheduleIfNeeded();\n    }\n};\nModelSemanticColoring = ModelSemanticColoring_1 = __decorate([\n    __param(1, ISemanticTokensStylingService),\n    __param(2, IThemeService),\n    __param(3, ILanguageFeatureDebounceService),\n    __param(4, ILanguageFeaturesService)\n], ModelSemanticColoring);\nclass SemanticTokensResponse {\n    constructor(provider, resultId, data) {\n        this.provider = provider;\n        this.resultId = resultId;\n        this.data = data;\n    }\n    dispose() {\n        this.provider.releaseDocumentSemanticTokens(this.resultId);\n    }\n}\nregisterEditorFeature(DocumentSemanticTokensFeature);\n\nexport { DocumentSemanticTokensFeature };\n","import { RunOnceScheduler, createCancelablePromise } from '../../../../base/common/async.js';\nimport { Disposable, dispose } from '../../../../base/common/lifecycle.js';\nimport { registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { hasDocumentRangeSemanticTokensProvider, getDocumentRangeSemanticTokens } from '../common/getSemanticTokens.js';\nimport { SEMANTIC_HIGHLIGHTING_SETTING_ID, isSemanticColoringEnabled } from '../common/semanticTokensConfig.js';\nimport { toMultilineTokens2 } from '../../../common/services/semanticTokensProviderStyling.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { IThemeService } from '../../../../platform/theme/common/themeService.js';\nimport { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport { StopWatch } from '../../../../base/common/stopwatch.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { ISemanticTokensStylingService } from '../../../common/services/semanticTokensStyling.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet ViewportSemanticTokensContribution = class ViewportSemanticTokensContribution extends Disposable {\n    static { this.ID = 'editor.contrib.viewportSemanticTokens'; }\n    constructor(editor, _semanticTokensStylingService, _themeService, _configurationService, languageFeatureDebounceService, languageFeaturesService) {\n        super();\n        this._semanticTokensStylingService = _semanticTokensStylingService;\n        this._themeService = _themeService;\n        this._configurationService = _configurationService;\n        this._editor = editor;\n        this._provider = languageFeaturesService.documentRangeSemanticTokensProvider;\n        this._debounceInformation = languageFeatureDebounceService.for(this._provider, 'DocumentRangeSemanticTokens', { min: 100, max: 500 });\n        this._tokenizeViewport = this._register(new RunOnceScheduler(() => this._tokenizeViewportNow(), 100));\n        this._outstandingRequests = [];\n        this._rangeProvidersChangeListeners = [];\n        const scheduleTokenizeViewport = () => {\n            if (this._editor.hasModel()) {\n                this._tokenizeViewport.schedule(this._debounceInformation.get(this._editor.getModel()));\n            }\n        };\n        const bindRangeProvidersChangeListeners = () => {\n            this._cleanupProviderListeners();\n            if (this._editor.hasModel()) {\n                const model = this._editor.getModel();\n                for (const provider of this._provider.all(model)) {\n                    const disposable = provider.onDidChange?.(() => {\n                        this._cancelAll();\n                        scheduleTokenizeViewport();\n                    });\n                    if (disposable) {\n                        this._rangeProvidersChangeListeners.push(disposable);\n                    }\n                }\n            }\n        };\n        this._register(this._editor.onDidScrollChange(() => {\n            scheduleTokenizeViewport();\n        }));\n        this._register(this._editor.onDidChangeModel(() => {\n            bindRangeProvidersChangeListeners();\n            this._cancelAll();\n            scheduleTokenizeViewport();\n        }));\n        this._register(this._editor.onDidChangeModelLanguage(() => {\n            // The cleanup of the model's semantic tokens happens in the DocumentSemanticTokensFeature\n            bindRangeProvidersChangeListeners();\n            this._cancelAll();\n            scheduleTokenizeViewport();\n        }));\n        this._register(this._editor.onDidChangeModelContent((e) => {\n            this._cancelAll();\n            scheduleTokenizeViewport();\n        }));\n        bindRangeProvidersChangeListeners();\n        this._register(this._provider.onDidChange(() => {\n            bindRangeProvidersChangeListeners();\n            this._cancelAll();\n            scheduleTokenizeViewport();\n        }));\n        this._register(this._configurationService.onDidChangeConfiguration(e => {\n            if (e.affectsConfiguration(SEMANTIC_HIGHLIGHTING_SETTING_ID)) {\n                this._cancelAll();\n                scheduleTokenizeViewport();\n            }\n        }));\n        this._register(this._themeService.onDidColorThemeChange(() => {\n            this._cancelAll();\n            scheduleTokenizeViewport();\n        }));\n        scheduleTokenizeViewport();\n    }\n    dispose() {\n        this._cleanupProviderListeners();\n        super.dispose();\n    }\n    _cleanupProviderListeners() {\n        dispose(this._rangeProvidersChangeListeners);\n        this._rangeProvidersChangeListeners = [];\n    }\n    _cancelAll() {\n        for (const request of this._outstandingRequests) {\n            request.cancel();\n        }\n        this._outstandingRequests = [];\n    }\n    _removeOutstandingRequest(req) {\n        for (let i = 0, len = this._outstandingRequests.length; i < len; i++) {\n            if (this._outstandingRequests[i] === req) {\n                this._outstandingRequests.splice(i, 1);\n                return;\n            }\n        }\n    }\n    _tokenizeViewportNow() {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        const model = this._editor.getModel();\n        if (model.tokenization.hasCompleteSemanticTokens()) {\n            return;\n        }\n        if (!isSemanticColoringEnabled(model, this._themeService, this._configurationService)) {\n            if (model.tokenization.hasSomeSemanticTokens()) {\n                model.tokenization.setSemanticTokens(null, false);\n            }\n            return;\n        }\n        if (!hasDocumentRangeSemanticTokensProvider(this._provider, model)) {\n            if (model.tokenization.hasSomeSemanticTokens()) {\n                model.tokenization.setSemanticTokens(null, false);\n            }\n            return;\n        }\n        const visibleRanges = this._editor.getVisibleRangesPlusViewportAboveBelow();\n        this._outstandingRequests = this._outstandingRequests.concat(visibleRanges.map(range => this._requestRange(model, range)));\n    }\n    _requestRange(model, range) {\n        const requestVersionId = model.getVersionId();\n        const request = createCancelablePromise(token => Promise.resolve(getDocumentRangeSemanticTokens(this._provider, model, range, token)));\n        const sw = new StopWatch(false);\n        request.then((r) => {\n            this._debounceInformation.update(model, sw.elapsed());\n            if (!r || !r.tokens || model.isDisposed() || model.getVersionId() !== requestVersionId) {\n                return;\n            }\n            const { provider, tokens: result } = r;\n            const styling = this._semanticTokensStylingService.getStyling(provider);\n            model.tokenization.setPartialSemanticTokens(range, toMultilineTokens2(result, styling, model.getLanguageId()));\n        }).then(() => this._removeOutstandingRequest(request), () => this._removeOutstandingRequest(request));\n        return request;\n    }\n};\nViewportSemanticTokensContribution = __decorate([\n    __param(1, ISemanticTokensStylingService),\n    __param(2, IThemeService),\n    __param(3, IConfigurationService),\n    __param(4, ILanguageFeatureDebounceService),\n    __param(5, ILanguageFeaturesService)\n], ViewportSemanticTokensContribution);\nregisterEditorContribution(ViewportSemanticTokensContribution.ID, ViewportSemanticTokensContribution, 1 /* EditorContributionInstantiation.AfterFirstRender */);\n\nexport { ViewportSemanticTokensContribution };\n","import { isLowerAsciiLetter, isUpperAsciiLetter } from '../../../../base/common/strings.js';\nimport { Range } from '../../../common/core/range.js';\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 *--------------------------------------------------------------------------------------------*/\nclass WordSelectionRangeProvider {\n    constructor(selectSubwords = true) {\n        this.selectSubwords = selectSubwords;\n    }\n    provideSelectionRanges(model, positions) {\n        const result = [];\n        for (const position of positions) {\n            const bucket = [];\n            result.push(bucket);\n            if (this.selectSubwords) {\n                this._addInWordRanges(bucket, model, position);\n            }\n            this._addWordRanges(bucket, model, position);\n            this._addWhitespaceLine(bucket, model, position);\n            bucket.push({ range: model.getFullModelRange() });\n        }\n        return result;\n    }\n    _addInWordRanges(bucket, model, pos) {\n        const obj = model.getWordAtPosition(pos);\n        if (!obj) {\n            return;\n        }\n        const { word, startColumn } = obj;\n        const offset = pos.column - startColumn;\n        let start = offset;\n        let end = offset;\n        let lastCh = 0;\n        // LEFT anchor (start)\n        for (; start >= 0; start--) {\n            const ch = word.charCodeAt(start);\n            if ((start !== offset) && (ch === 95 /* CharCode.Underline */ || ch === 45 /* CharCode.Dash */)) {\n                // foo-bar OR foo_bar\n                break;\n            }\n            else if (isLowerAsciiLetter(ch) && isUpperAsciiLetter(lastCh)) {\n                // fooBar\n                break;\n            }\n            lastCh = ch;\n        }\n        start += 1;\n        // RIGHT anchor (end)\n        for (; end < word.length; end++) {\n            const ch = word.charCodeAt(end);\n            if (isUpperAsciiLetter(ch) && isLowerAsciiLetter(lastCh)) {\n                // fooBar\n                break;\n            }\n            else if (ch === 95 /* CharCode.Underline */ || ch === 45 /* CharCode.Dash */) {\n                // foo-bar OR foo_bar\n                break;\n            }\n            lastCh = ch;\n        }\n        if (start < end) {\n            bucket.push({ range: new Range(pos.lineNumber, startColumn + start, pos.lineNumber, startColumn + end) });\n        }\n    }\n    _addWordRanges(bucket, model, pos) {\n        const word = model.getWordAtPosition(pos);\n        if (word) {\n            bucket.push({ range: new Range(pos.lineNumber, word.startColumn, pos.lineNumber, word.endColumn) });\n        }\n    }\n    _addWhitespaceLine(bucket, model, pos) {\n        if (model.getLineLength(pos.lineNumber) > 0\n            && model.getLineFirstNonWhitespaceColumn(pos.lineNumber) === 0\n            && model.getLineLastNonWhitespaceColumn(pos.lineNumber) === 0) {\n            bucket.push({ range: new Range(pos.lineNumber, 1, pos.lineNumber, model.getLineMaxColumn(pos.lineNumber)) });\n        }\n    }\n}\n\nexport { WordSelectionRangeProvider };\n","import { isNonEmptyArray, equals } from '../../../../base/common/arrays.js';\nimport { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { registerEditorContribution, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { BracketSelectionRangeProvider } from './bracketSelections.js';\nimport { WordSelectionRangeProvider } from './wordSelections.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { CommandsRegistry } from '../../../../platform/commands/common/commands.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { ITextModelService } from '../../../common/services/resolverService.js';\nimport { assertType, isArrayOf } from '../../../../base/common/types.js';\nimport { URI } from '../../../../base/common/uri.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar SmartSelectController_1;\nclass SelectionRanges {\n    constructor(index, ranges) {\n        this.index = index;\n        this.ranges = ranges;\n    }\n    mov(fwd) {\n        const index = this.index + (fwd ? 1 : -1);\n        if (index < 0 || index >= this.ranges.length) {\n            return this;\n        }\n        const res = new SelectionRanges(index, this.ranges);\n        if (res.ranges[index].equalsRange(this.ranges[this.index])) {\n            // next range equals this range, retry with next-next\n            return res.mov(fwd);\n        }\n        return res;\n    }\n}\nlet SmartSelectController = class SmartSelectController {\n    static { SmartSelectController_1 = this; }\n    static { this.ID = 'editor.contrib.smartSelectController'; }\n    static get(editor) {\n        return editor.getContribution(SmartSelectController_1.ID);\n    }\n    constructor(_editor, _languageFeaturesService) {\n        this._editor = _editor;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._ignoreSelection = false;\n    }\n    dispose() {\n        this._selectionListener?.dispose();\n    }\n    async run(forward) {\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        const selections = this._editor.getSelections();\n        const model = this._editor.getModel();\n        if (!this._state) {\n            await provideSelectionRanges(this._languageFeaturesService.selectionRangeProvider, model, selections.map(s => s.getPosition()), this._editor.getOption(129 /* EditorOption.smartSelect */), CancellationToken.None).then(ranges => {\n                if (!isNonEmptyArray(ranges) || ranges.length !== selections.length) {\n                    // invalid result\n                    return;\n                }\n                if (!this._editor.hasModel() || !equals(this._editor.getSelections(), selections, (a, b) => a.equalsSelection(b))) {\n                    // invalid editor state\n                    return;\n                }\n                for (let i = 0; i < ranges.length; i++) {\n                    ranges[i] = ranges[i].filter(range => {\n                        // filter ranges inside the selection\n                        return range.containsPosition(selections[i].getStartPosition()) && range.containsPosition(selections[i].getEndPosition());\n                    });\n                    // prepend current selection\n                    ranges[i].unshift(selections[i]);\n                }\n                this._state = ranges.map(ranges => new SelectionRanges(0, ranges));\n                // listen to caret move and forget about state\n                this._selectionListener?.dispose();\n                this._selectionListener = this._editor.onDidChangeCursorPosition(() => {\n                    if (!this._ignoreSelection) {\n                        this._selectionListener?.dispose();\n                        this._state = undefined;\n                    }\n                });\n            });\n        }\n        if (!this._state) {\n            // no state\n            return;\n        }\n        this._state = this._state.map(state => state.mov(forward));\n        const newSelections = this._state.map(state => Selection.fromPositions(state.ranges[state.index].getStartPosition(), state.ranges[state.index].getEndPosition()));\n        this._ignoreSelection = true;\n        try {\n            this._editor.setSelections(newSelections);\n        }\n        finally {\n            this._ignoreSelection = false;\n        }\n    }\n};\nSmartSelectController = SmartSelectController_1 = __decorate([\n    __param(1, ILanguageFeaturesService)\n], SmartSelectController);\nclass AbstractSmartSelect extends EditorAction {\n    constructor(forward, opts) {\n        super(opts);\n        this._forward = forward;\n    }\n    async run(_accessor, editor) {\n        const controller = SmartSelectController.get(editor);\n        if (controller) {\n            await controller.run(this._forward);\n        }\n    }\n}\nclass GrowSelectionAction extends AbstractSmartSelect {\n    constructor() {\n        super(true, {\n            id: 'editor.action.smartSelect.expand',\n            label: localize2(1400, \"Expand Selection\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 17 /* KeyCode.RightArrow */,\n                mac: {\n                    primary: 2048 /* KeyMod.CtrlCmd */ | 256 /* KeyMod.WinCtrl */ | 1024 /* KeyMod.Shift */ | 17 /* KeyCode.RightArrow */,\n                    secondary: [256 /* KeyMod.WinCtrl */ | 1024 /* KeyMod.Shift */ | 17 /* KeyCode.RightArrow */],\n                },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarSelectionMenu,\n                group: '1_basic',\n                title: localize(1398, \"&&Expand Selection\"),\n                order: 2\n            }\n        });\n    }\n}\n// renamed command id\nCommandsRegistry.registerCommandAlias('editor.action.smartSelect.grow', 'editor.action.smartSelect.expand');\nclass ShrinkSelectionAction extends AbstractSmartSelect {\n    constructor() {\n        super(false, {\n            id: 'editor.action.smartSelect.shrink',\n            label: localize2(1401, \"Shrink Selection\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 1024 /* KeyMod.Shift */ | 512 /* KeyMod.Alt */ | 15 /* KeyCode.LeftArrow */,\n                mac: {\n                    primary: 2048 /* KeyMod.CtrlCmd */ | 256 /* KeyMod.WinCtrl */ | 1024 /* KeyMod.Shift */ | 15 /* KeyCode.LeftArrow */,\n                    secondary: [256 /* KeyMod.WinCtrl */ | 1024 /* KeyMod.Shift */ | 15 /* KeyCode.LeftArrow */],\n                },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            menuOpts: {\n                menuId: MenuId.MenubarSelectionMenu,\n                group: '1_basic',\n                title: localize(1399, \"&&Shrink Selection\"),\n                order: 3\n            }\n        });\n    }\n}\nregisterEditorContribution(SmartSelectController.ID, SmartSelectController, 4 /* EditorContributionInstantiation.Lazy */);\nregisterEditorAction(GrowSelectionAction);\nregisterEditorAction(ShrinkSelectionAction);\nasync function provideSelectionRanges(registry, model, positions, options, token) {\n    const providers = registry.all(model)\n        .concat(new WordSelectionRangeProvider(options.selectSubwords)); // ALWAYS have word based selection range\n    if (providers.length === 1) {\n        // add word selection and bracket selection when no provider exists\n        providers.unshift(new BracketSelectionRangeProvider());\n    }\n    const work = [];\n    const allRawRanges = [];\n    for (const provider of providers) {\n        work.push(Promise.resolve(provider.provideSelectionRanges(model, positions, token)).then(allProviderRanges => {\n            if (isNonEmptyArray(allProviderRanges) && allProviderRanges.length === positions.length) {\n                for (let i = 0; i < positions.length; i++) {\n                    if (!allRawRanges[i]) {\n                        allRawRanges[i] = [];\n                    }\n                    for (const oneProviderRanges of allProviderRanges[i]) {\n                        if (Range.isIRange(oneProviderRanges.range) && Range.containsPosition(oneProviderRanges.range, positions[i])) {\n                            allRawRanges[i].push(Range.lift(oneProviderRanges.range));\n                        }\n                    }\n                }\n            }\n        }, onUnexpectedExternalError));\n    }\n    await Promise.all(work);\n    return allRawRanges.map(oneRawRanges => {\n        if (oneRawRanges.length === 0) {\n            return [];\n        }\n        // sort all by start/end position\n        oneRawRanges.sort((a, b) => {\n            if (Position.isBefore(a.getStartPosition(), b.getStartPosition())) {\n                return 1;\n            }\n            else if (Position.isBefore(b.getStartPosition(), a.getStartPosition())) {\n                return -1;\n            }\n            else if (Position.isBefore(a.getEndPosition(), b.getEndPosition())) {\n                return -1;\n            }\n            else if (Position.isBefore(b.getEndPosition(), a.getEndPosition())) {\n                return 1;\n            }\n            else {\n                return 0;\n            }\n        });\n        // remove ranges that don't contain the former range or that are equal to the\n        // former range\n        const oneRanges = [];\n        let last;\n        for (const range of oneRawRanges) {\n            if (!last || (Range.containsRange(range, last) && !Range.equalsRange(range, last))) {\n                oneRanges.push(range);\n                last = range;\n            }\n        }\n        if (!options.selectLeadingAndTrailingWhitespace) {\n            return oneRanges;\n        }\n        // add ranges that expand trivia at line starts and ends whenever a range\n        // wraps onto the a new line\n        const oneRangesWithTrivia = [oneRanges[0]];\n        for (let i = 1; i < oneRanges.length; i++) {\n            const prev = oneRanges[i - 1];\n            const cur = oneRanges[i];\n            if (cur.startLineNumber !== prev.startLineNumber || cur.endLineNumber !== prev.endLineNumber) {\n                // add line/block range without leading/failing whitespace\n                const rangeNoWhitespace = new Range(prev.startLineNumber, model.getLineFirstNonWhitespaceColumn(prev.startLineNumber), prev.endLineNumber, model.getLineLastNonWhitespaceColumn(prev.endLineNumber));\n                if (rangeNoWhitespace.containsRange(prev) && !rangeNoWhitespace.equalsRange(prev) && cur.containsRange(rangeNoWhitespace) && !cur.equalsRange(rangeNoWhitespace)) {\n                    oneRangesWithTrivia.push(rangeNoWhitespace);\n                }\n                // add line/block range\n                const rangeFull = new Range(prev.startLineNumber, 1, prev.endLineNumber, model.getLineMaxColumn(prev.endLineNumber));\n                if (rangeFull.containsRange(prev) && !rangeFull.equalsRange(rangeNoWhitespace) && cur.containsRange(rangeFull) && !cur.equalsRange(rangeFull)) {\n                    oneRangesWithTrivia.push(rangeFull);\n                }\n            }\n            oneRangesWithTrivia.push(cur);\n        }\n        return oneRangesWithTrivia;\n    });\n}\nCommandsRegistry.registerCommand('_executeSelectionRangeProvider', async function (accessor, ...args) {\n    const [resource, positions] = args;\n    assertType(URI.isUri(resource));\n    assertType(isArrayOf(positions, p => Position.isIPosition(p)));\n    const registry = accessor.get(ILanguageFeaturesService).selectionRangeProvider;\n    const reference = await accessor.get(ITextModelService).createModelReference(resource);\n    try {\n        return provideSelectionRanges(registry, reference.object.textEditorModel, positions.map(Position.lift), { selectLeadingAndTrailingWhitespace: true, selectSubwords: true }, CancellationToken.None);\n    }\n    finally {\n        reference.dispose();\n    }\n});\n\nexport { SmartSelectController, provideSelectionRanges };\n","import { localize2 } from '../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nconst Categories = Object.freeze({\n    View: localize2(1638, 'View'),\n    Help: localize2(1639, 'Help'),\n    Test: localize2(1640, 'Test'),\n    File: localize2(1641, 'File'),\n    Preferences: localize2(1642, 'Preferences'),\n    Developer: localize2(1643, \"Developer\"),\n});\n\nexport { Categories };\n","import { EditorAction2 } from '../../../browser/editorExtensions.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { Categories } from '../../../../platform/action/common/actionCommonCategories.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { StickyScrollController } from './stickyScrollController.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ToggleStickyScroll extends EditorAction2 {\n    constructor() {\n        super({\n            id: 'editor.action.toggleStickyScroll',\n            title: {\n                ...localize2(1448, \"Toggle Editor Sticky Scroll\"),\n                mnemonicTitle: localize(1444, \"&&Toggle Editor Sticky Scroll\"),\n            },\n            metadata: {\n                description: localize2(1449, \"Toggle/enable the editor sticky scroll which shows the nested scopes at the top of the viewport\"),\n            },\n            category: Categories.View,\n            toggled: {\n                condition: ContextKeyExpr.equals('config.editor.stickyScroll.enabled', true),\n                title: localize(1445, \"Sticky Scroll\"),\n                mnemonicTitle: localize(1446, \"&&Sticky Scroll\"),\n            },\n            menu: [\n                { id: MenuId.CommandPalette },\n                { id: MenuId.MenubarAppearanceMenu, group: '4_editor', order: 3 },\n                { id: MenuId.StickyScrollContext }\n            ]\n        });\n    }\n    async runEditorCommand(accessor, editor) {\n        const configurationService = accessor.get(IConfigurationService);\n        const newValue = !configurationService.getValue('editor.stickyScroll.enabled');\n        const isFocused = StickyScrollController.get(editor)?.isFocused();\n        configurationService.updateValue('editor.stickyScroll.enabled', newValue);\n        if (isFocused) {\n            editor.focus();\n        }\n    }\n}\nconst weight = 100 /* KeybindingWeight.EditorContrib */;\nclass FocusStickyScroll extends EditorAction2 {\n    constructor() {\n        super({\n            id: 'editor.action.focusStickyScroll',\n            title: {\n                ...localize2(1450, \"Focus Editor Sticky Scroll\"),\n                mnemonicTitle: localize(1447, \"&&Focus Editor Sticky Scroll\"),\n            },\n            precondition: ContextKeyExpr.and(ContextKeyExpr.has('config.editor.stickyScroll.enabled'), EditorContextKeys.stickyScrollVisible),\n            menu: [\n                { id: MenuId.CommandPalette },\n            ]\n        });\n    }\n    runEditorCommand(_accessor, editor) {\n        StickyScrollController.get(editor)?.focus();\n    }\n}\nclass SelectNextStickyScrollLine extends EditorAction2 {\n    constructor() {\n        super({\n            id: 'editor.action.selectNextStickyScrollLine',\n            title: localize2(1451, \"Select the next editor sticky scroll line\"),\n            precondition: EditorContextKeys.stickyScrollFocused.isEqualTo(true),\n            keybinding: {\n                weight,\n                primary: 18 /* KeyCode.DownArrow */\n            }\n        });\n    }\n    runEditorCommand(_accessor, editor) {\n        StickyScrollController.get(editor)?.focusNext();\n    }\n}\nclass SelectPreviousStickyScrollLine extends EditorAction2 {\n    constructor() {\n        super({\n            id: 'editor.action.selectPreviousStickyScrollLine',\n            title: localize2(1452, \"Select the previous sticky scroll line\"),\n            precondition: EditorContextKeys.stickyScrollFocused.isEqualTo(true),\n            keybinding: {\n                weight,\n                primary: 16 /* KeyCode.UpArrow */\n            }\n        });\n    }\n    runEditorCommand(_accessor, editor) {\n        StickyScrollController.get(editor)?.focusPrevious();\n    }\n}\nclass GoToStickyScrollLine extends EditorAction2 {\n    constructor() {\n        super({\n            id: 'editor.action.goToFocusedStickyScrollLine',\n            title: localize2(1453, \"Go to the focused sticky scroll line\"),\n            precondition: EditorContextKeys.stickyScrollFocused.isEqualTo(true),\n            keybinding: {\n                weight,\n                primary: 3 /* KeyCode.Enter */\n            }\n        });\n    }\n    runEditorCommand(_accessor, editor) {\n        StickyScrollController.get(editor)?.goToFocused();\n    }\n}\nclass SelectEditor extends EditorAction2 {\n    constructor() {\n        super({\n            id: 'editor.action.selectEditor',\n            title: localize2(1454, \"Select Editor\"),\n            precondition: EditorContextKeys.stickyScrollFocused.isEqualTo(true),\n            keybinding: {\n                weight,\n                primary: 9 /* KeyCode.Escape */\n            }\n        });\n    }\n    runEditorCommand(_accessor, editor) {\n        StickyScrollController.get(editor)?.selectEditor();\n    }\n}\n\nexport { FocusStickyScroll, GoToStickyScrollLine, SelectEditor, SelectNextStickyScrollLine, SelectPreviousStickyScrollLine, ToggleStickyScroll };\n","import { registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { ToggleStickyScroll, FocusStickyScroll, SelectPreviousStickyScrollLine, SelectNextStickyScrollLine, GoToStickyScrollLine, SelectEditor } from './stickyScrollActions.js';\nimport { StickyScrollController } from './stickyScrollController.js';\nimport { registerAction2 } from '../../../../platform/actions/common/actions.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterEditorContribution(StickyScrollController.ID, StickyScrollController, 1 /* EditorContributionInstantiation.AfterFirstRender */);\nregisterAction2(ToggleStickyScroll);\nregisterAction2(FocusStickyScroll);\nregisterAction2(SelectPreviousStickyScrollLine);\nregisterAction2(SelectNextStickyScrollLine);\nregisterAction2(GoToStickyScrollLine);\nregisterAction2(SelectEditor);\n","import { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { FuzzyScore } from '../../../../base/common/filters.js';\nimport { Iterable } from '../../../../base/common/iterator.js';\nimport { RefCountedDisposable, Disposable } from '../../../../base/common/lifecycle.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { Range } from '../../../common/core/range.js';\nimport { registerEditorFeature } from '../../../common/editorFeatures.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { LineContext, CompletionModel } from './completionModel.js';\nimport { QuickSuggestionsOptions, provideSuggestionItems, CompletionOptions } from './suggest.js';\nimport { ISuggestMemoryService } from './suggestMemory.js';\nimport { SuggestModel } from './suggestModel.js';\nimport { WordDistance } from './wordDistance.js';\nimport { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass SuggestInlineCompletion {\n    constructor(range, insertText, filterText, additionalTextEdits, command, gutterMenuLinkAction, completion) {\n        this.range = range;\n        this.insertText = insertText;\n        this.filterText = filterText;\n        this.additionalTextEdits = additionalTextEdits;\n        this.command = command;\n        this.gutterMenuLinkAction = gutterMenuLinkAction;\n        this.completion = completion;\n    }\n}\nlet InlineCompletionResults = class InlineCompletionResults extends RefCountedDisposable {\n    constructor(model, line, word, completionModel, completions, _suggestMemoryService) {\n        super(completions.disposable);\n        this.model = model;\n        this.line = line;\n        this.word = word;\n        this.completionModel = completionModel;\n        this._suggestMemoryService = _suggestMemoryService;\n    }\n    canBeReused(model, line, word) {\n        return this.model === model // same model\n            && this.line === line\n            && this.word.word.length > 0\n            && this.word.startColumn === word.startColumn && this.word.endColumn < word.endColumn // same word\n            && this.completionModel.getIncompleteProvider().size === 0; // no incomplete results\n    }\n    get items() {\n        const result = [];\n        // Split items by preselected index. This ensures the memory-selected item shows first and that better/worst\n        // ranked items are before/after\n        const { items } = this.completionModel;\n        const selectedIndex = this._suggestMemoryService.select(this.model, { lineNumber: this.line, column: this.word.endColumn + this.completionModel.lineContext.characterCountDelta }, items);\n        const first = Iterable.slice(items, selectedIndex);\n        const second = Iterable.slice(items, 0, selectedIndex);\n        let resolveCount = 5;\n        for (const item of Iterable.concat(first, second)) {\n            if (item.score === FuzzyScore.Default) {\n                // skip items that have no overlap\n                continue;\n            }\n            const range = new Range(item.editStart.lineNumber, item.editStart.column, item.editInsertEnd.lineNumber, item.editInsertEnd.column + this.completionModel.lineContext.characterCountDelta // end PLUS character delta\n            );\n            const insertText = item.completion.insertTextRules && (item.completion.insertTextRules & 4 /* CompletionItemInsertTextRule.InsertAsSnippet */)\n                ? { snippet: item.completion.insertText }\n                : item.completion.insertText;\n            result.push(new SuggestInlineCompletion(range, insertText, item.filterTextLow ?? item.labelLow, item.completion.additionalTextEdits, item.completion.command, item.completion.action, item));\n            // resolve the first N suggestions eagerly\n            if (resolveCount-- >= 0) {\n                item.resolve(CancellationToken.None);\n            }\n        }\n        return result;\n    }\n};\nInlineCompletionResults = __decorate([\n    __param(5, ISuggestMemoryService)\n], InlineCompletionResults);\nlet SuggestInlineCompletions = class SuggestInlineCompletions extends Disposable {\n    constructor(_languageFeatureService, _clipboardService, _suggestMemoryService, _editorService) {\n        super();\n        this._languageFeatureService = _languageFeatureService;\n        this._clipboardService = _clipboardService;\n        this._suggestMemoryService = _suggestMemoryService;\n        this._editorService = _editorService;\n        this._store.add(_languageFeatureService.inlineCompletionsProvider.register('*', this));\n    }\n    async provideInlineCompletions(model, position, context, token) {\n        if (context.selectedSuggestionInfo) {\n            return;\n        }\n        let editor;\n        for (const candidate of this._editorService.listCodeEditors()) {\n            if (candidate.getModel() === model) {\n                editor = candidate;\n                break;\n            }\n        }\n        if (!editor) {\n            return;\n        }\n        const config = editor.getOption(102 /* EditorOption.quickSuggestions */);\n        if (QuickSuggestionsOptions.isAllOff(config)) {\n            // quick suggest is off (for this model/language)\n            return;\n        }\n        model.tokenization.tokenizeIfCheap(position.lineNumber);\n        const lineTokens = model.tokenization.getLineTokens(position.lineNumber);\n        const tokenType = lineTokens.getStandardTokenType(lineTokens.findTokenIndexAtOffset(Math.max(position.column - 1 - 1, 0)));\n        if (QuickSuggestionsOptions.valueFor(config, tokenType) !== 'inline') {\n            // quick suggest is off (for this token)\n            return undefined;\n        }\n        // We consider non-empty leading words and trigger characters. The latter only\n        // when no word is being typed (word characters superseed trigger characters)\n        let wordInfo = model.getWordAtPosition(position);\n        let triggerCharacterInfo;\n        if (!wordInfo?.word) {\n            triggerCharacterInfo = this._getTriggerCharacterInfo(model, position);\n        }\n        if (!wordInfo?.word && !triggerCharacterInfo) {\n            // not at word, not a trigger character\n            return;\n        }\n        // ensure that we have word information and that we are at the end of a word\n        // otherwise we stop because we don't want to do quick suggestions inside words\n        if (!wordInfo) {\n            wordInfo = model.getWordUntilPosition(position);\n        }\n        if (wordInfo.endColumn !== position.column) {\n            return;\n        }\n        let result;\n        const leadingLineContents = model.getValueInRange(new Range(position.lineNumber, 1, position.lineNumber, position.column));\n        if (!triggerCharacterInfo && this._lastResult?.canBeReused(model, position.lineNumber, wordInfo)) {\n            // reuse a previous result iff possible, only a refilter is needed\n            // TODO@jrieken this can be improved further and only incomplete results can be updated\n            // console.log(`REUSE with ${wordInfo.word}`);\n            const newLineContext = new LineContext(leadingLineContents, position.column - this._lastResult.word.endColumn);\n            this._lastResult.completionModel.lineContext = newLineContext;\n            this._lastResult.acquire();\n            result = this._lastResult;\n        }\n        else {\n            // refesh model is required\n            const completions = await provideSuggestionItems(this._languageFeatureService.completionProvider, model, position, new CompletionOptions(undefined, SuggestModel.createSuggestFilter(editor).itemKind, triggerCharacterInfo?.providers), triggerCharacterInfo && { triggerKind: 1 /* CompletionTriggerKind.TriggerCharacter */, triggerCharacter: triggerCharacterInfo.ch }, token);\n            let clipboardText;\n            if (completions.needsClipboard) {\n                clipboardText = await this._clipboardService.readText();\n            }\n            const completionModel = new CompletionModel(completions.items, position.column, new LineContext(leadingLineContents, 0), WordDistance.None, editor.getOption(134 /* EditorOption.suggest */), editor.getOption(128 /* EditorOption.snippetSuggestions */), { boostFullMatch: false, firstMatchCanBeWeak: false }, clipboardText);\n            result = new InlineCompletionResults(model, position.lineNumber, wordInfo, completionModel, completions, this._suggestMemoryService);\n        }\n        this._lastResult = result;\n        return result;\n    }\n    handleItemDidShow(_completions, item) {\n        item.completion.resolve(CancellationToken.None);\n    }\n    disposeInlineCompletions(result) {\n        result.release();\n    }\n    _getTriggerCharacterInfo(model, position) {\n        const ch = model.getValueInRange(Range.fromPositions({ lineNumber: position.lineNumber, column: position.column - 1 }, position));\n        const providers = new Set();\n        for (const provider of this._languageFeatureService.completionProvider.all(model)) {\n            if (provider.triggerCharacters?.includes(ch)) {\n                providers.add(provider);\n            }\n        }\n        if (providers.size === 0) {\n            return undefined;\n        }\n        return { providers, ch };\n    }\n};\nSuggestInlineCompletions = __decorate([\n    __param(0, ILanguageFeaturesService),\n    __param(1, IClipboardService),\n    __param(2, ISuggestMemoryService),\n    __param(3, ICodeEditorService)\n], SuggestInlineCompletions);\nregisterEditorFeature(SuggestInlineCompletions);\n\nexport { SuggestInlineCompletions };\n","import { StopWatch } from '../../../../base/common/stopwatch.js';\nimport { registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { localize2 } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ForceRetokenizeAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.forceRetokenize',\n            label: localize2(1532, \"Developer: Force Retokenize\"),\n            precondition: undefined\n        });\n    }\n    run(accessor, editor) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const model = editor.getModel();\n        model.tokenization.resetTokenization();\n        const sw = new StopWatch();\n        model.tokenization.forceTokenization(model.getLineCount());\n        sw.stop();\n        console.log(`tokenization took ${sw.elapsed()}`);\n    }\n}\nregisterEditorAction(ForceRetokenizeAction);\n","import { alert } from '../../../../base/browser/ui/aria/aria.js';\nimport { TabFocus } from '../../../browser/config/tabFocus.js';\nimport { localize2, localize } from '../../../../nls.js';\nimport { Action2, registerAction2 } from '../../../../platform/actions/common/actions.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ToggleTabFocusModeAction extends Action2 {\n    static { this.ID = 'editor.action.toggleTabFocusMode'; }\n    constructor() {\n        super({\n            id: ToggleTabFocusModeAction.ID,\n            title: localize2(1530, 'Toggle Tab Key Moves Focus'),\n            precondition: undefined,\n            keybinding: {\n                primary: 2048 /* KeyMod.CtrlCmd */ | 43 /* KeyCode.KeyM */,\n                mac: { primary: 256 /* KeyMod.WinCtrl */ | 1024 /* KeyMod.Shift */ | 43 /* KeyCode.KeyM */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            metadata: {\n                description: localize2(1531, \"Determines whether the tab key moves focus around the workbench or inserts the tab character in the current editor. This is also called tab trapping, tab navigation, or tab focus mode.\"),\n            },\n            f1: true\n        });\n    }\n    run() {\n        const oldValue = TabFocus.getTabFocusMode();\n        const newValue = !oldValue;\n        TabFocus.setTabFocusMode(newValue);\n        if (newValue) {\n            alert(localize(1528, \"Pressing Tab will now move focus to the next focusable element\"));\n        }\n        else {\n            alert(localize(1529, \"Pressing Tab will now insert the tab character\"));\n        }\n    }\n}\nregisterAction2(ToggleTabFocusModeAction);\n\nexport { ToggleTabFocusModeAction };\n","import { Range } from '../core/range.js';\nimport { Searcher } from '../model/textModelSearch.js';\nimport { isHighSurrogate, AmbiguousCharacters, InvisibleCharacters, escapeRegExpCharacters, isBasicASCII } from '../../../base/common/strings.js';\nimport { assertNever } from '../../../base/common/assert.js';\nimport { getWordAtText, DEFAULT_WORD_REGEXP } from '../core/wordHelper.js';\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 *--------------------------------------------------------------------------------------------*/\nclass UnicodeTextModelHighlighter {\n    static computeUnicodeHighlights(model, options, range) {\n        const startLine = range ? range.startLineNumber : 1;\n        const endLine = range ? range.endLineNumber : model.getLineCount();\n        const codePointHighlighter = new CodePointHighlighter(options);\n        const candidates = codePointHighlighter.getCandidateCodePoints();\n        let regex;\n        if (candidates === 'allNonBasicAscii') {\n            regex = new RegExp('[^\\\\t\\\\n\\\\r\\\\x20-\\\\x7E]', 'g');\n        }\n        else {\n            regex = new RegExp(`${buildRegExpCharClassExpr(Array.from(candidates))}`, 'g');\n        }\n        const searcher = new Searcher(null, regex);\n        const ranges = [];\n        let hasMore = false;\n        let m;\n        let ambiguousCharacterCount = 0;\n        let invisibleCharacterCount = 0;\n        let nonBasicAsciiCharacterCount = 0;\n        forLoop: for (let lineNumber = startLine, lineCount = endLine; lineNumber <= lineCount; lineNumber++) {\n            const lineContent = model.getLineContent(lineNumber);\n            const lineLength = lineContent.length;\n            // Reset regex to search from the beginning\n            searcher.reset(0);\n            do {\n                m = searcher.next(lineContent);\n                if (m) {\n                    let startIndex = m.index;\n                    let endIndex = m.index + m[0].length;\n                    // Extend range to entire code point\n                    if (startIndex > 0) {\n                        const charCodeBefore = lineContent.charCodeAt(startIndex - 1);\n                        if (isHighSurrogate(charCodeBefore)) {\n                            startIndex--;\n                        }\n                    }\n                    if (endIndex + 1 < lineLength) {\n                        const charCodeBefore = lineContent.charCodeAt(endIndex - 1);\n                        if (isHighSurrogate(charCodeBefore)) {\n                            endIndex++;\n                        }\n                    }\n                    const str = lineContent.substring(startIndex, endIndex);\n                    let word = getWordAtText(startIndex + 1, DEFAULT_WORD_REGEXP, lineContent, 0);\n                    if (word && word.endColumn <= startIndex + 1) {\n                        // The word does not include the problematic character, ignore the word\n                        word = null;\n                    }\n                    const highlightReason = codePointHighlighter.shouldHighlightNonBasicASCII(str, word ? word.word : null);\n                    if (highlightReason !== 0 /* SimpleHighlightReason.None */) {\n                        if (highlightReason === 3 /* SimpleHighlightReason.Ambiguous */) {\n                            ambiguousCharacterCount++;\n                        }\n                        else if (highlightReason === 2 /* SimpleHighlightReason.Invisible */) {\n                            invisibleCharacterCount++;\n                        }\n                        else if (highlightReason === 1 /* SimpleHighlightReason.NonBasicASCII */) {\n                            nonBasicAsciiCharacterCount++;\n                        }\n                        else {\n                            assertNever();\n                        }\n                        const MAX_RESULT_LENGTH = 1000;\n                        if (ranges.length >= MAX_RESULT_LENGTH) {\n                            hasMore = true;\n                            break forLoop;\n                        }\n                        ranges.push(new Range(lineNumber, startIndex + 1, lineNumber, endIndex + 1));\n                    }\n                }\n            } while (m);\n        }\n        return {\n            ranges,\n            hasMore,\n            ambiguousCharacterCount,\n            invisibleCharacterCount,\n            nonBasicAsciiCharacterCount\n        };\n    }\n    static computeUnicodeHighlightReason(char, options) {\n        const codePointHighlighter = new CodePointHighlighter(options);\n        const reason = codePointHighlighter.shouldHighlightNonBasicASCII(char, null);\n        switch (reason) {\n            case 0 /* SimpleHighlightReason.None */:\n                return null;\n            case 2 /* SimpleHighlightReason.Invisible */:\n                return { kind: 1 /* UnicodeHighlighterReasonKind.Invisible */ };\n            case 3 /* SimpleHighlightReason.Ambiguous */: {\n                const codePoint = char.codePointAt(0);\n                const primaryConfusable = codePointHighlighter.ambiguousCharacters.getPrimaryConfusable(codePoint);\n                const notAmbiguousInLocales = AmbiguousCharacters.getLocales().filter((l) => !AmbiguousCharacters.getInstance(new Set([...options.allowedLocales, l])).isAmbiguous(codePoint));\n                return { kind: 0 /* UnicodeHighlighterReasonKind.Ambiguous */, confusableWith: String.fromCodePoint(primaryConfusable), notAmbiguousInLocales };\n            }\n            case 1 /* SimpleHighlightReason.NonBasicASCII */:\n                return { kind: 2 /* UnicodeHighlighterReasonKind.NonBasicAscii */ };\n        }\n    }\n}\nfunction buildRegExpCharClassExpr(codePoints, flags) {\n    const src = `[${escapeRegExpCharacters(codePoints.map((i) => String.fromCodePoint(i)).join(''))}]`;\n    return src;\n}\nclass CodePointHighlighter {\n    constructor(options) {\n        this.options = options;\n        this.allowedCodePoints = new Set(options.allowedCodePoints);\n        this.ambiguousCharacters = AmbiguousCharacters.getInstance(new Set(options.allowedLocales));\n    }\n    getCandidateCodePoints() {\n        if (this.options.nonBasicASCII) {\n            return 'allNonBasicAscii';\n        }\n        const set = new Set();\n        if (this.options.invisibleCharacters) {\n            for (const cp of InvisibleCharacters.codePoints) {\n                if (!isAllowedInvisibleCharacter(String.fromCodePoint(cp))) {\n                    set.add(cp);\n                }\n            }\n        }\n        if (this.options.ambiguousCharacters) {\n            for (const cp of this.ambiguousCharacters.getConfusableCodePoints()) {\n                set.add(cp);\n            }\n        }\n        for (const cp of this.allowedCodePoints) {\n            set.delete(cp);\n        }\n        return set;\n    }\n    shouldHighlightNonBasicASCII(character, wordContext) {\n        const codePoint = character.codePointAt(0);\n        if (this.allowedCodePoints.has(codePoint)) {\n            return 0 /* SimpleHighlightReason.None */;\n        }\n        if (this.options.nonBasicASCII) {\n            return 1 /* SimpleHighlightReason.NonBasicASCII */;\n        }\n        let hasBasicASCIICharacters = false;\n        let hasNonConfusableNonBasicAsciiCharacter = false;\n        if (wordContext) {\n            for (const char of wordContext) {\n                const codePoint = char.codePointAt(0);\n                const isBasicASCII$1 = isBasicASCII(char);\n                hasBasicASCIICharacters = hasBasicASCIICharacters || isBasicASCII$1;\n                if (!isBasicASCII$1 &&\n                    !this.ambiguousCharacters.isAmbiguous(codePoint) &&\n                    !InvisibleCharacters.isInvisibleCharacter(codePoint)) {\n                    hasNonConfusableNonBasicAsciiCharacter = true;\n                }\n            }\n        }\n        if (\n        /* Don't allow mixing weird looking characters with ASCII */ !hasBasicASCIICharacters &&\n            /* Is there an obviously weird looking character? */ hasNonConfusableNonBasicAsciiCharacter) {\n            return 0 /* SimpleHighlightReason.None */;\n        }\n        if (this.options.invisibleCharacters) {\n            // TODO check for emojis\n            if (!isAllowedInvisibleCharacter(character) && InvisibleCharacters.isInvisibleCharacter(codePoint)) {\n                return 2 /* SimpleHighlightReason.Invisible */;\n            }\n        }\n        if (this.options.ambiguousCharacters) {\n            if (this.ambiguousCharacters.isAmbiguous(codePoint)) {\n                return 3 /* SimpleHighlightReason.Ambiguous */;\n            }\n        }\n        return 0 /* SimpleHighlightReason.None */;\n    }\n}\nfunction isAllowedInvisibleCharacter(character) {\n    return character === ' ' || character === '\\n' || character === '\\t';\n}\n\nexport { UnicodeTextModelHighlighter };\n","import { append, $, EventHelper } from '../../../base/browser/dom.js';\nimport { DomEmitter } from '../../../base/browser/event.js';\nimport { StandardKeyboardEvent } from '../../../base/browser/keyboardEvent.js';\nimport { EventType, Gesture } from '../../../base/browser/touch.js';\nimport { Event } from '../../../base/common/event.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { IOpenerService } from '../common/opener.js';\nimport './link.css';\nimport { getDefaultHoverDelegate } from '../../../base/browser/ui/hover/hoverDelegateFactory.js';\nimport { IHoverService } from '../../hover/browser/hover.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet Link = class Link extends Disposable {\n    get enabled() {\n        return this._enabled;\n    }\n    set enabled(enabled) {\n        if (enabled) {\n            this.el.setAttribute('aria-disabled', 'false');\n            this.el.tabIndex = 0;\n            this.el.style.pointerEvents = 'auto';\n            this.el.style.opacity = '1';\n            this.el.style.cursor = 'pointer';\n            this._enabled = false;\n        }\n        else {\n            this.el.setAttribute('aria-disabled', 'true');\n            this.el.tabIndex = -1;\n            this.el.style.pointerEvents = 'none';\n            this.el.style.opacity = '0.4';\n            this.el.style.cursor = 'default';\n            this._enabled = true;\n        }\n        this._enabled = enabled;\n    }\n    constructor(container, _link, options = {}, _hoverService, openerService) {\n        super();\n        this._link = _link;\n        this._hoverService = _hoverService;\n        this._enabled = true;\n        this.el = append(container, $('a.monaco-link', {\n            tabIndex: _link.tabIndex ?? 0,\n            href: _link.href,\n        }, _link.label));\n        this.hoverDelegate = options.hoverDelegate ?? getDefaultHoverDelegate('mouse');\n        this.setTooltip(_link.title);\n        this.el.setAttribute('role', 'button');\n        const onClickEmitter = this._register(new DomEmitter(this.el, 'click'));\n        const onKeyPress = this._register(new DomEmitter(this.el, 'keypress'));\n        const onEnterPress = Event.chain(onKeyPress.event, $ => $.map(e => new StandardKeyboardEvent(e))\n            .filter(e => e.keyCode === 3 /* KeyCode.Enter */));\n        const onTap = this._register(new DomEmitter(this.el, EventType.Tap)).event;\n        this._register(Gesture.addTarget(this.el));\n        const onOpen = Event.any(onClickEmitter.event, onEnterPress, onTap);\n        this._register(onOpen(e => {\n            if (!this.enabled) {\n                return;\n            }\n            EventHelper.stop(e, true);\n            if (options?.opener) {\n                options.opener(this._link.href);\n            }\n            else {\n                openerService.open(this._link.href, { allowCommands: true });\n            }\n        }));\n        this.enabled = true;\n    }\n    setTooltip(title) {\n        if (!this.hover && title) {\n            this.hover = this._register(this._hoverService.setupManagedHover(this.hoverDelegate, this.el, title));\n        }\n        else if (this.hover) {\n            this.hover.update(title);\n        }\n    }\n};\nLink = __decorate([\n    __param(3, IHoverService),\n    __param(4, IOpenerService)\n], Link);\n\nexport { Link };\n","import './bannerController.css';\nimport { localize } from '../../../../nls.js';\nimport { $, clearNode, append } from '../../../../base/browser/dom.js';\nimport { ActionBar } from '../../../../base/browser/ui/actionbar/actionbar.js';\nimport { Action } from '../../../../base/common/actions.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { IMarkdownRendererService } from '../../../../platform/markdown/browser/markdownRenderer.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { Link } from '../../../../platform/opener/browser/link.js';\nimport { widgetClose } from '../../../../platform/theme/common/iconRegistry.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst BANNER_ELEMENT_HEIGHT = 26;\nlet BannerController = class BannerController extends Disposable {\n    constructor(_editor, instantiationService) {\n        super();\n        this._editor = _editor;\n        this.instantiationService = instantiationService;\n        this.banner = this._register(this.instantiationService.createInstance(Banner));\n    }\n    hide() {\n        this._editor.setBanner(null, 0);\n        this.banner.clear();\n    }\n    show(item) {\n        this.banner.show({\n            ...item,\n            onClose: () => {\n                this.hide();\n                item.onClose?.();\n            }\n        });\n        this._editor.setBanner(this.banner.element, BANNER_ELEMENT_HEIGHT);\n    }\n};\nBannerController = __decorate([\n    __param(1, IInstantiationService)\n], BannerController);\n// TODO@hediet: Investigate if this can be reused by the workspace banner (bannerPart.ts).\nlet Banner = class Banner extends Disposable {\n    constructor(instantiationService, markdownRendererService) {\n        super();\n        this.instantiationService = instantiationService;\n        this.markdownRendererService = markdownRendererService;\n        this.element = $('div.editor-banner');\n        this.element.tabIndex = 0;\n    }\n    getAriaLabel(item) {\n        if (item.ariaLabel) {\n            return item.ariaLabel;\n        }\n        if (typeof item.message === 'string') {\n            return item.message;\n        }\n        return undefined;\n    }\n    getBannerMessage(message) {\n        if (typeof message === 'string') {\n            const element = $('span');\n            element.innerText = message;\n            return element;\n        }\n        return this.markdownRendererService.render(message).element;\n    }\n    clear() {\n        clearNode(this.element);\n    }\n    show(item) {\n        // Clear previous item\n        clearNode(this.element);\n        // Banner aria label\n        const ariaLabel = this.getAriaLabel(item);\n        if (ariaLabel) {\n            this.element.setAttribute('aria-label', ariaLabel);\n        }\n        // Icon\n        const iconContainer = append(this.element, $('div.icon-container'));\n        iconContainer.setAttribute('aria-hidden', 'true');\n        if (item.icon) {\n            iconContainer.appendChild($(`div${ThemeIcon.asCSSSelector(item.icon)}`));\n        }\n        // Message\n        const messageContainer = append(this.element, $('div.message-container'));\n        messageContainer.setAttribute('aria-hidden', 'true');\n        messageContainer.appendChild(this.getBannerMessage(item.message));\n        // Message Actions\n        this.messageActionsContainer = append(this.element, $('div.message-actions-container'));\n        if (item.actions) {\n            for (const action of item.actions) {\n                this._register(this.instantiationService.createInstance(Link, this.messageActionsContainer, { ...action, tabIndex: -1 }, {}));\n            }\n        }\n        // Action\n        const actionBarContainer = append(this.element, $('div.action-container'));\n        this.actionBar = this._register(new ActionBar(actionBarContainer));\n        this.actionBar.push(this._register(new Action('banner.close', localize(1533, \"Close Banner\"), ThemeIcon.asClassName(widgetClose), true, () => {\n            if (typeof item.onClose === 'function') {\n                item.onClose();\n            }\n        })), { icon: true, label: false });\n        this.actionBar.setFocusable(false);\n    }\n};\nBanner = __decorate([\n    __param(0, IInstantiationService),\n    __param(1, IMarkdownRendererService)\n], Banner);\n\nexport { BannerController };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IWorkspaceTrustManagementService = createDecorator('workspaceTrustManagementService');\n\nexport { IWorkspaceTrustManagementService };\n","import { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { createCommandUri, MarkdownString } from '../../../../base/common/htmlContent.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { language } from '../../../../base/common/platform.js';\nimport { isBasicASCII, InvisibleCharacters } from '../../../../base/common/strings.js';\nimport './unicodeHighlighter.css';\nimport { registerEditorContribution, EditorAction } from '../../../browser/editorExtensions.js';\nimport { inUntrustedWorkspace, unicodeHighlightConfigKeys } from '../../../common/config/editorOptions.js';\nimport { ModelDecorationOptions } from '../../../common/model/textModel.js';\nimport { UnicodeTextModelHighlighter } from '../../../common/services/unicodeTextModelHighlighter.js';\nimport { IEditorWorkerService } from '../../../common/services/editorWorker.js';\nimport { HoverParticipantRegistry } from '../../hover/browser/hoverTypes.js';\nimport { MarkdownHover, renderMarkdownHovers } from '../../hover/browser/markdownHoverParticipant.js';\nimport { BannerController } from './bannerController.js';\nimport { localize, localize2 } from '../../../../nls.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IQuickInputService } from '../../../../platform/quickinput/common/quickInput.js';\nimport { registerIcon } from '../../../../platform/theme/common/iconRegistry.js';\nimport { IWorkspaceTrustManagementService } from '../../../../platform/workspace/common/workspaceTrust.js';\nimport { Action2, registerAction2 } from '../../../../platform/actions/common/actions.js';\nimport { safeIntl } from '../../../../base/common/date.js';\nimport { isModelDecorationVisible, isModelDecorationInString, isModelDecorationInComment } from '../../../common/viewModel/viewModelDecoration.js';\nimport { IMarkdownRendererService } from '../../../../platform/markdown/browser/markdownRenderer.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst warningIcon = registerIcon('extensions-warning-message', Codicon.warning, localize(1534, 'Icon shown with a warning message in the extensions editor.'));\nlet UnicodeHighlighter = class UnicodeHighlighter extends Disposable {\n    static { this.ID = 'editor.contrib.unicodeHighlighter'; }\n    constructor(_editor, _editorWorkerService, _workspaceTrustService, instantiationService) {\n        super();\n        this._editor = _editor;\n        this._editorWorkerService = _editorWorkerService;\n        this._workspaceTrustService = _workspaceTrustService;\n        this._highlighter = null;\n        this._bannerClosed = false;\n        this._updateState = (state) => {\n            if (state && state.hasMore) {\n                if (this._bannerClosed) {\n                    return;\n                }\n                // This document contains many non-basic ASCII characters.\n                const max = Math.max(state.ambiguousCharacterCount, state.nonBasicAsciiCharacterCount, state.invisibleCharacterCount);\n                let data;\n                if (state.nonBasicAsciiCharacterCount >= max) {\n                    data = {\n                        message: localize(1535, 'This document contains many non-basic ASCII unicode characters'),\n                        command: new DisableHighlightingOfNonBasicAsciiCharactersAction(),\n                    };\n                }\n                else if (state.ambiguousCharacterCount >= max) {\n                    data = {\n                        message: localize(1536, 'This document contains many ambiguous unicode characters'),\n                        command: new DisableHighlightingOfAmbiguousCharactersAction(),\n                    };\n                }\n                else if (state.invisibleCharacterCount >= max) {\n                    data = {\n                        message: localize(1537, 'This document contains many invisible unicode characters'),\n                        command: new DisableHighlightingOfInvisibleCharactersAction(),\n                    };\n                }\n                else {\n                    throw new Error('Unreachable');\n                }\n                this._bannerController.show({\n                    id: 'unicodeHighlightBanner',\n                    message: data.message,\n                    icon: warningIcon,\n                    actions: [\n                        {\n                            label: data.command.shortLabel,\n                            href: `command:${data.command.desc.id}`\n                        }\n                    ],\n                    onClose: () => {\n                        this._bannerClosed = true;\n                    },\n                });\n            }\n            else {\n                this._bannerController.hide();\n            }\n        };\n        this._bannerController = this._register(instantiationService.createInstance(BannerController, _editor));\n        this._register(this._editor.onDidChangeModel(() => {\n            this._bannerClosed = false;\n            this._updateHighlighter();\n        }));\n        this._options = _editor.getOption(142 /* EditorOption.unicodeHighlighting */);\n        this._register(_workspaceTrustService.onDidChangeTrust(e => {\n            this._updateHighlighter();\n        }));\n        this._register(_editor.onDidChangeConfiguration(e => {\n            if (e.hasChanged(142 /* EditorOption.unicodeHighlighting */)) {\n                this._options = _editor.getOption(142 /* EditorOption.unicodeHighlighting */);\n                this._updateHighlighter();\n            }\n        }));\n        this._updateHighlighter();\n    }\n    dispose() {\n        if (this._highlighter) {\n            this._highlighter.dispose();\n            this._highlighter = null;\n        }\n        super.dispose();\n    }\n    _updateHighlighter() {\n        this._updateState(null);\n        if (this._highlighter) {\n            this._highlighter.dispose();\n            this._highlighter = null;\n        }\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        const options = resolveOptions(this._workspaceTrustService.isWorkspaceTrusted(), this._options);\n        if ([\n            options.nonBasicASCII,\n            options.ambiguousCharacters,\n            options.invisibleCharacters,\n        ].every((option) => option === false)) {\n            // Don't do anything if the feature is fully disabled\n            return;\n        }\n        const highlightOptions = {\n            nonBasicASCII: options.nonBasicASCII,\n            ambiguousCharacters: options.ambiguousCharacters,\n            invisibleCharacters: options.invisibleCharacters,\n            includeComments: options.includeComments,\n            includeStrings: options.includeStrings,\n            allowedCodePoints: Object.keys(options.allowedCharacters).map(c => c.codePointAt(0)),\n            allowedLocales: Object.keys(options.allowedLocales).map(locale => {\n                if (locale === '_os') {\n                    const osLocale = safeIntl.NumberFormat().value.resolvedOptions().locale;\n                    return osLocale;\n                }\n                else if (locale === '_vscode') {\n                    return language;\n                }\n                return locale;\n            }),\n        };\n        if (this._editorWorkerService.canComputeUnicodeHighlights(this._editor.getModel().uri)) {\n            this._highlighter = new DocumentUnicodeHighlighter(this._editor, highlightOptions, this._updateState, this._editorWorkerService);\n        }\n        else {\n            this._highlighter = new ViewportUnicodeHighlighter(this._editor, highlightOptions, this._updateState);\n        }\n    }\n    getDecorationInfo(decoration) {\n        if (this._highlighter) {\n            return this._highlighter.getDecorationInfo(decoration);\n        }\n        return null;\n    }\n};\nUnicodeHighlighter = __decorate([\n    __param(1, IEditorWorkerService),\n    __param(2, IWorkspaceTrustManagementService),\n    __param(3, IInstantiationService)\n], UnicodeHighlighter);\nfunction resolveOptions(trusted, options) {\n    return {\n        nonBasicASCII: options.nonBasicASCII === inUntrustedWorkspace ? !trusted : options.nonBasicASCII,\n        ambiguousCharacters: options.ambiguousCharacters,\n        invisibleCharacters: options.invisibleCharacters,\n        includeComments: options.includeComments === inUntrustedWorkspace ? !trusted : options.includeComments,\n        includeStrings: options.includeStrings === inUntrustedWorkspace ? !trusted : options.includeStrings,\n        allowedCharacters: options.allowedCharacters,\n        allowedLocales: options.allowedLocales,\n    };\n}\nlet DocumentUnicodeHighlighter = class DocumentUnicodeHighlighter extends Disposable {\n    constructor(_editor, _options, _updateState, _editorWorkerService) {\n        super();\n        this._editor = _editor;\n        this._options = _options;\n        this._updateState = _updateState;\n        this._editorWorkerService = _editorWorkerService;\n        this._model = this._editor.getModel();\n        this._decorations = this._editor.createDecorationsCollection();\n        this._updateSoon = this._register(new RunOnceScheduler(() => this._update(), 250));\n        this._register(this._editor.onDidChangeModelContent(() => {\n            this._updateSoon.schedule();\n        }));\n        this._updateSoon.schedule();\n    }\n    dispose() {\n        this._decorations.clear();\n        super.dispose();\n    }\n    _update() {\n        if (this._model.isDisposed()) {\n            return;\n        }\n        if (!this._model.mightContainNonBasicASCII()) {\n            this._decorations.clear();\n            return;\n        }\n        const modelVersionId = this._model.getVersionId();\n        this._editorWorkerService\n            .computedUnicodeHighlights(this._model.uri, this._options)\n            .then((info) => {\n            if (this._model.isDisposed()) {\n                return;\n            }\n            if (this._model.getVersionId() !== modelVersionId) {\n                // model changed in the meantime\n                return;\n            }\n            this._updateState(info);\n            const decorations = [];\n            if (!info.hasMore) {\n                // Don't show decoration if there are too many.\n                // In this case, a banner is shown.\n                for (const range of info.ranges) {\n                    decorations.push({\n                        range: range,\n                        options: Decorations.instance.getDecorationFromOptions(this._options),\n                    });\n                }\n            }\n            this._decorations.set(decorations);\n        });\n    }\n    getDecorationInfo(decoration) {\n        if (!this._decorations.has(decoration)) {\n            return null;\n        }\n        const model = this._editor.getModel();\n        if (!isModelDecorationVisible(model, decoration)) {\n            return null;\n        }\n        const text = model.getValueInRange(decoration.range);\n        return {\n            reason: computeReason(text, this._options),\n            inComment: isModelDecorationInComment(model, decoration),\n            inString: isModelDecorationInString(model, decoration),\n        };\n    }\n};\nDocumentUnicodeHighlighter = __decorate([\n    __param(3, IEditorWorkerService)\n], DocumentUnicodeHighlighter);\nclass ViewportUnicodeHighlighter extends Disposable {\n    constructor(_editor, _options, _updateState) {\n        super();\n        this._editor = _editor;\n        this._options = _options;\n        this._updateState = _updateState;\n        this._model = this._editor.getModel();\n        this._decorations = this._editor.createDecorationsCollection();\n        this._updateSoon = this._register(new RunOnceScheduler(() => this._update(), 250));\n        this._register(this._editor.onDidLayoutChange(() => {\n            this._updateSoon.schedule();\n        }));\n        this._register(this._editor.onDidScrollChange(() => {\n            this._updateSoon.schedule();\n        }));\n        this._register(this._editor.onDidChangeHiddenAreas(() => {\n            this._updateSoon.schedule();\n        }));\n        this._register(this._editor.onDidChangeModelContent(() => {\n            this._updateSoon.schedule();\n        }));\n        this._updateSoon.schedule();\n    }\n    dispose() {\n        this._decorations.clear();\n        super.dispose();\n    }\n    _update() {\n        if (this._model.isDisposed()) {\n            return;\n        }\n        if (!this._model.mightContainNonBasicASCII()) {\n            this._decorations.clear();\n            return;\n        }\n        const ranges = this._editor.getVisibleRanges();\n        const decorations = [];\n        const totalResult = {\n            ranges: [],\n            ambiguousCharacterCount: 0,\n            invisibleCharacterCount: 0,\n            nonBasicAsciiCharacterCount: 0,\n            hasMore: false,\n        };\n        for (const range of ranges) {\n            const result = UnicodeTextModelHighlighter.computeUnicodeHighlights(this._model, this._options, range);\n            for (const r of result.ranges) {\n                totalResult.ranges.push(r);\n            }\n            totalResult.ambiguousCharacterCount += totalResult.ambiguousCharacterCount;\n            totalResult.invisibleCharacterCount += totalResult.invisibleCharacterCount;\n            totalResult.nonBasicAsciiCharacterCount += totalResult.nonBasicAsciiCharacterCount;\n            totalResult.hasMore = totalResult.hasMore || result.hasMore;\n        }\n        if (!totalResult.hasMore) {\n            // Don't show decorations if there are too many.\n            // A banner will be shown instead.\n            for (const range of totalResult.ranges) {\n                decorations.push({ range, options: Decorations.instance.getDecorationFromOptions(this._options) });\n            }\n        }\n        this._updateState(totalResult);\n        this._decorations.set(decorations);\n    }\n    getDecorationInfo(decoration) {\n        if (!this._decorations.has(decoration)) {\n            return null;\n        }\n        const model = this._editor.getModel();\n        const text = model.getValueInRange(decoration.range);\n        if (!isModelDecorationVisible(model, decoration)) {\n            return null;\n        }\n        return {\n            reason: computeReason(text, this._options),\n            inComment: isModelDecorationInComment(model, decoration),\n            inString: isModelDecorationInString(model, decoration),\n        };\n    }\n}\nconst configureUnicodeHighlightOptionsStr = localize(1538, 'Configure Unicode Highlight Options');\nlet UnicodeHighlighterHoverParticipant = class UnicodeHighlighterHoverParticipant {\n    constructor(_editor, _markdownRendererService) {\n        this._editor = _editor;\n        this._markdownRendererService = _markdownRendererService;\n        this.hoverOrdinal = 5;\n    }\n    computeSync(anchor, lineDecorations) {\n        if (!this._editor.hasModel() || anchor.type !== 1 /* HoverAnchorType.Range */) {\n            return [];\n        }\n        const model = this._editor.getModel();\n        const unicodeHighlighter = this._editor.getContribution(UnicodeHighlighter.ID);\n        if (!unicodeHighlighter) {\n            return [];\n        }\n        const result = [];\n        const existedReason = new Set();\n        let index = 300;\n        for (const d of lineDecorations) {\n            const highlightInfo = unicodeHighlighter.getDecorationInfo(d);\n            if (!highlightInfo) {\n                continue;\n            }\n            const char = model.getValueInRange(d.range);\n            // text refers to a single character.\n            const codePoint = char.codePointAt(0);\n            const codePointStr = formatCodePointMarkdown(codePoint);\n            let reason;\n            switch (highlightInfo.reason.kind) {\n                case 0 /* UnicodeHighlighterReasonKind.Ambiguous */: {\n                    if (isBasicASCII(highlightInfo.reason.confusableWith)) {\n                        reason = localize(1539, 'The character {0} could be confused with the ASCII character {1}, which is more common in source code.', codePointStr, formatCodePointMarkdown(highlightInfo.reason.confusableWith.codePointAt(0)));\n                    }\n                    else {\n                        reason = localize(1540, 'The character {0} could be confused with the character {1}, which is more common in source code.', codePointStr, formatCodePointMarkdown(highlightInfo.reason.confusableWith.codePointAt(0)));\n                    }\n                    break;\n                }\n                case 1 /* UnicodeHighlighterReasonKind.Invisible */:\n                    reason = localize(1541, 'The character {0} is invisible.', codePointStr);\n                    break;\n                case 2 /* UnicodeHighlighterReasonKind.NonBasicAscii */:\n                    reason = localize(1542, 'The character {0} is not a basic ASCII character.', codePointStr);\n                    break;\n            }\n            if (existedReason.has(reason)) {\n                continue;\n            }\n            existedReason.add(reason);\n            const adjustSettingsArgs = {\n                codePoint: codePoint,\n                reason: highlightInfo.reason,\n                inComment: highlightInfo.inComment,\n                inString: highlightInfo.inString,\n            };\n            const adjustSettings = localize(1543, 'Adjust settings');\n            const uri = createCommandUri(ShowExcludeOptions.ID, adjustSettingsArgs);\n            const markdown = new MarkdownString('', true)\n                .appendMarkdown(reason)\n                .appendText(' ')\n                .appendLink(uri, adjustSettings, configureUnicodeHighlightOptionsStr);\n            result.push(new MarkdownHover(this, d.range, [markdown], false, index++));\n        }\n        return result;\n    }\n    renderHoverParts(context, hoverParts) {\n        return renderMarkdownHovers(context, hoverParts, this._editor, this._markdownRendererService);\n    }\n    getAccessibleContent(hoverPart) {\n        return hoverPart.contents.map(c => c.value).join('\\n');\n    }\n};\nUnicodeHighlighterHoverParticipant = __decorate([\n    __param(1, IMarkdownRendererService)\n], UnicodeHighlighterHoverParticipant);\nfunction codePointToHex(codePoint) {\n    return `U+${codePoint.toString(16).padStart(4, '0')}`;\n}\nfunction formatCodePointMarkdown(codePoint) {\n    let value = `\\`${codePointToHex(codePoint)}\\``;\n    if (!InvisibleCharacters.isInvisibleCharacter(codePoint)) {\n        // Don't render any control characters or any invisible characters, as they cannot be seen anyways.\n        value += ` \"${`${renderCodePointAsInlineCode(codePoint)}`}\"`;\n    }\n    return value;\n}\nfunction renderCodePointAsInlineCode(codePoint) {\n    if (codePoint === 96 /* CharCode.BackTick */) {\n        return '`` ` ``';\n    }\n    return '`' + String.fromCodePoint(codePoint) + '`';\n}\nfunction computeReason(char, options) {\n    return UnicodeTextModelHighlighter.computeUnicodeHighlightReason(char, options);\n}\nclass Decorations {\n    constructor() {\n        this.map = new Map();\n    }\n    static { this.instance = new Decorations(); }\n    getDecorationFromOptions(options) {\n        return this.getDecoration(!options.includeComments, !options.includeStrings);\n    }\n    getDecoration(hideInComments, hideInStrings) {\n        const key = `${hideInComments}${hideInStrings}`;\n        let options = this.map.get(key);\n        if (!options) {\n            options = ModelDecorationOptions.createDynamic({\n                description: 'unicode-highlight',\n                stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n                className: 'unicode-highlight',\n                showIfCollapsed: true,\n                overviewRuler: null,\n                minimap: null,\n                hideInCommentTokens: hideInComments,\n                hideInStringTokens: hideInStrings,\n            });\n            this.map.set(key, options);\n        }\n        return options;\n    }\n}\nclass DisableHighlightingInCommentsAction extends EditorAction {\n    constructor() {\n        super({\n            id: DisableHighlightingOfAmbiguousCharactersAction.ID,\n            label: localize2(1552, \"Disable highlighting of characters in comments\"),\n            precondition: undefined\n        });\n        this.shortLabel = localize(1544, 'Disable Highlight In Comments');\n    }\n    async run(accessor, editor, args) {\n        const configurationService = accessor.get(IConfigurationService);\n        if (configurationService) {\n            this.runAction(configurationService);\n        }\n    }\n    async runAction(configurationService) {\n        await configurationService.updateValue(unicodeHighlightConfigKeys.includeComments, false, 2 /* ConfigurationTarget.USER */);\n    }\n}\nclass DisableHighlightingInStringsAction extends EditorAction {\n    constructor() {\n        super({\n            id: DisableHighlightingOfAmbiguousCharactersAction.ID,\n            label: localize2(1553, \"Disable highlighting of characters in strings\"),\n            precondition: undefined\n        });\n        this.shortLabel = localize(1545, 'Disable Highlight In Strings');\n    }\n    async run(accessor, editor, args) {\n        const configurationService = accessor.get(IConfigurationService);\n        if (configurationService) {\n            this.runAction(configurationService);\n        }\n    }\n    async runAction(configurationService) {\n        await configurationService.updateValue(unicodeHighlightConfigKeys.includeStrings, false, 2 /* ConfigurationTarget.USER */);\n    }\n}\nclass DisableHighlightingOfAmbiguousCharactersAction extends Action2 {\n    static { this.ID = 'editor.action.unicodeHighlight.disableHighlightingOfAmbiguousCharacters'; }\n    constructor() {\n        super({\n            id: DisableHighlightingOfAmbiguousCharactersAction.ID,\n            title: localize2(1554, \"Disable highlighting of ambiguous characters\"),\n            precondition: undefined,\n            f1: false,\n        });\n        this.shortLabel = localize(1546, 'Disable Ambiguous Highlight');\n    }\n    async run(accessor, editor, args) {\n        const configurationService = accessor.get(IConfigurationService);\n        if (configurationService) {\n            this.runAction(configurationService);\n        }\n    }\n    async runAction(configurationService) {\n        await configurationService.updateValue(unicodeHighlightConfigKeys.ambiguousCharacters, false, 2 /* ConfigurationTarget.USER */);\n    }\n}\nclass DisableHighlightingOfInvisibleCharactersAction extends Action2 {\n    static { this.ID = 'editor.action.unicodeHighlight.disableHighlightingOfInvisibleCharacters'; }\n    constructor() {\n        super({\n            id: DisableHighlightingOfInvisibleCharactersAction.ID,\n            title: localize2(1555, \"Disable highlighting of invisible characters\"),\n            precondition: undefined,\n            f1: false,\n        });\n        this.shortLabel = localize(1547, 'Disable Invisible Highlight');\n    }\n    async run(accessor, editor, args) {\n        const configurationService = accessor.get(IConfigurationService);\n        if (configurationService) {\n            this.runAction(configurationService);\n        }\n    }\n    async runAction(configurationService) {\n        await configurationService.updateValue(unicodeHighlightConfigKeys.invisibleCharacters, false, 2 /* ConfigurationTarget.USER */);\n    }\n}\nclass DisableHighlightingOfNonBasicAsciiCharactersAction extends Action2 {\n    static { this.ID = 'editor.action.unicodeHighlight.disableHighlightingOfNonBasicAsciiCharacters'; }\n    constructor() {\n        super({\n            id: DisableHighlightingOfNonBasicAsciiCharactersAction.ID,\n            title: localize2(1556, \"Disable highlighting of non basic ASCII characters\"),\n            precondition: undefined,\n            f1: false,\n        });\n        this.shortLabel = localize(1548, 'Disable Non ASCII Highlight');\n    }\n    async run(accessor, editor, args) {\n        const configurationService = accessor.get(IConfigurationService);\n        if (configurationService) {\n            this.runAction(configurationService);\n        }\n    }\n    async runAction(configurationService) {\n        await configurationService.updateValue(unicodeHighlightConfigKeys.nonBasicASCII, false, 2 /* ConfigurationTarget.USER */);\n    }\n}\nclass ShowExcludeOptions extends Action2 {\n    static { this.ID = 'editor.action.unicodeHighlight.showExcludeOptions'; }\n    constructor() {\n        super({\n            id: ShowExcludeOptions.ID,\n            title: localize2(1557, \"Show Exclude Options\"),\n            precondition: undefined,\n            f1: false,\n        });\n    }\n    async run(accessor, args) {\n        const { codePoint, reason, inString, inComment } = args;\n        const char = String.fromCodePoint(codePoint);\n        const quickPickService = accessor.get(IQuickInputService);\n        const configurationService = accessor.get(IConfigurationService);\n        function getExcludeCharFromBeingHighlightedLabel(codePoint) {\n            if (InvisibleCharacters.isInvisibleCharacter(codePoint)) {\n                return localize(1549, 'Exclude {0} (invisible character) from being highlighted', codePointToHex(codePoint));\n            }\n            return localize(1550, 'Exclude {0} from being highlighted', `${codePointToHex(codePoint)} \"${char}\"`);\n        }\n        const options = [];\n        if (reason.kind === 0 /* UnicodeHighlighterReasonKind.Ambiguous */) {\n            for (const locale of reason.notAmbiguousInLocales) {\n                options.push({\n                    label: localize(1551, \"Allow unicode characters that are more common in the language \\\"{0}\\\".\", locale),\n                    run: async () => {\n                        excludeLocaleFromBeingHighlighted(configurationService, [locale]);\n                    },\n                });\n            }\n        }\n        options.push({\n            label: getExcludeCharFromBeingHighlightedLabel(codePoint),\n            run: () => excludeCharFromBeingHighlighted(configurationService, [codePoint])\n        });\n        if (inComment) {\n            const action = new DisableHighlightingInCommentsAction();\n            options.push({ label: action.label, run: async () => action.runAction(configurationService) });\n        }\n        else if (inString) {\n            const action = new DisableHighlightingInStringsAction();\n            options.push({ label: action.label, run: async () => action.runAction(configurationService) });\n        }\n        function getTitle(options) {\n            return typeof options.desc.title === 'string' ? options.desc.title : options.desc.title.value;\n        }\n        if (reason.kind === 0 /* UnicodeHighlighterReasonKind.Ambiguous */) {\n            const action = new DisableHighlightingOfAmbiguousCharactersAction();\n            options.push({ label: getTitle(action), run: async () => action.runAction(configurationService) });\n        }\n        else if (reason.kind === 1 /* UnicodeHighlighterReasonKind.Invisible */) {\n            const action = new DisableHighlightingOfInvisibleCharactersAction();\n            options.push({ label: getTitle(action), run: async () => action.runAction(configurationService) });\n        }\n        else if (reason.kind === 2 /* UnicodeHighlighterReasonKind.NonBasicAscii */) {\n            const action = new DisableHighlightingOfNonBasicAsciiCharactersAction();\n            options.push({ label: getTitle(action), run: async () => action.runAction(configurationService) });\n        }\n        else {\n            expectNever(reason);\n        }\n        const result = await quickPickService.pick(options, { title: configureUnicodeHighlightOptionsStr });\n        if (result) {\n            await result.run();\n        }\n    }\n}\nasync function excludeCharFromBeingHighlighted(configurationService, charCodes) {\n    const existingValue = configurationService.getValue(unicodeHighlightConfigKeys.allowedCharacters);\n    let value;\n    if ((typeof existingValue === 'object') && existingValue) {\n        // eslint-disable-next-line local/code-no-any-casts\n        value = existingValue;\n    }\n    else {\n        value = {};\n    }\n    for (const charCode of charCodes) {\n        value[String.fromCodePoint(charCode)] = true;\n    }\n    await configurationService.updateValue(unicodeHighlightConfigKeys.allowedCharacters, value, 2 /* ConfigurationTarget.USER */);\n}\nasync function excludeLocaleFromBeingHighlighted(configurationService, locales) {\n    const existingValue = configurationService.inspect(unicodeHighlightConfigKeys.allowedLocales).user?.value;\n    let value;\n    if ((typeof existingValue === 'object') && existingValue) {\n        // Copy value, as the existing value is read only\n        // eslint-disable-next-line local/code-no-any-casts\n        value = Object.assign({}, existingValue);\n    }\n    else {\n        value = {};\n    }\n    for (const locale of locales) {\n        value[locale] = true;\n    }\n    await configurationService.updateValue(unicodeHighlightConfigKeys.allowedLocales, value, 2 /* ConfigurationTarget.USER */);\n}\nfunction expectNever(value) {\n    throw new Error(`Unexpected value: ${value}`);\n}\nregisterAction2(DisableHighlightingOfAmbiguousCharactersAction);\nregisterAction2(DisableHighlightingOfInvisibleCharactersAction);\nregisterAction2(DisableHighlightingOfNonBasicAsciiCharactersAction);\nregisterAction2(ShowExcludeOptions);\nregisterEditorContribution(UnicodeHighlighter.ID, UnicodeHighlighter, 1 /* EditorContributionInstantiation.AfterFirstRender */);\nHoverParticipantRegistry.register(UnicodeHighlighterHoverParticipant);\n\nexport { DisableHighlightingInCommentsAction, DisableHighlightingInStringsAction, DisableHighlightingOfAmbiguousCharactersAction, DisableHighlightingOfInvisibleCharactersAction, DisableHighlightingOfNonBasicAsciiCharactersAction, ShowExcludeOptions, UnicodeHighlighter, UnicodeHighlighterHoverParticipant, warningIcon };\n","import { createDecorator } from '../../instantiation/common/instantiation.js';\n\nconst IDialogService = createDecorator('dialogService');\n\nexport { IDialogService };\n","import { Disposable } from '../../../../base/common/lifecycle.js';\nimport { basename } from '../../../../base/common/resources.js';\nimport { registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { localize } from '../../../../nls.js';\nimport { IDialogService } from '../../../../platform/dialogs/common/dialogs.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst ignoreUnusualLineTerminators = 'ignoreUnusualLineTerminators';\nfunction writeIgnoreState(codeEditorService, model, state) {\n    codeEditorService.setModelProperty(model.uri, ignoreUnusualLineTerminators, state);\n}\nfunction readIgnoreState(codeEditorService, model) {\n    return codeEditorService.getModelProperty(model.uri, ignoreUnusualLineTerminators);\n}\nlet UnusualLineTerminatorsDetector = class UnusualLineTerminatorsDetector extends Disposable {\n    static { this.ID = 'editor.contrib.unusualLineTerminatorsDetector'; }\n    constructor(_editor, _dialogService, _codeEditorService) {\n        super();\n        this._editor = _editor;\n        this._dialogService = _dialogService;\n        this._codeEditorService = _codeEditorService;\n        this._isPresentingDialog = false;\n        this._config = this._editor.getOption(143 /* EditorOption.unusualLineTerminators */);\n        this._register(this._editor.onDidChangeConfiguration((e) => {\n            if (e.hasChanged(143 /* EditorOption.unusualLineTerminators */)) {\n                this._config = this._editor.getOption(143 /* EditorOption.unusualLineTerminators */);\n                this._checkForUnusualLineTerminators();\n            }\n        }));\n        this._register(this._editor.onDidChangeModel(() => {\n            this._checkForUnusualLineTerminators();\n        }));\n        this._register(this._editor.onDidChangeModelContent((e) => {\n            if (e.isUndoing) {\n                // skip checking in case of undoing\n                return;\n            }\n            this._checkForUnusualLineTerminators();\n        }));\n        this._checkForUnusualLineTerminators();\n    }\n    async _checkForUnusualLineTerminators() {\n        if (this._config === 'off') {\n            return;\n        }\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        const model = this._editor.getModel();\n        if (!model.mightContainUnusualLineTerminators()) {\n            return;\n        }\n        const ignoreState = readIgnoreState(this._codeEditorService, model);\n        if (ignoreState === true) {\n            // this model should be ignored\n            return;\n        }\n        if (this._editor.getOption(104 /* EditorOption.readOnly */)) {\n            // read only editor => sorry!\n            return;\n        }\n        if (this._config === 'auto') {\n            // just do it!\n            model.removeUnusualLineTerminators(this._editor.getSelections());\n            return;\n        }\n        if (this._isPresentingDialog) {\n            // we're currently showing the dialog, which is async.\n            // avoid spamming the user\n            return;\n        }\n        let result;\n        try {\n            this._isPresentingDialog = true;\n            result = await this._dialogService.confirm({\n                title: localize(1558, \"Unusual Line Terminators\"),\n                message: localize(1559, \"Detected unusual line terminators\"),\n                detail: localize(1560, \"The file '{0}' contains one or more unusual line terminator characters, like Line Separator (LS) or Paragraph Separator (PS).\\n\\nIt is recommended to remove them from the file. This can be configured via `editor.unusualLineTerminators`.\", basename(model.uri)),\n                primaryButton: localize(1561, \"&&Remove Unusual Line Terminators\"),\n                cancelButton: localize(1562, \"Ignore\")\n            });\n        }\n        finally {\n            this._isPresentingDialog = false;\n        }\n        if (!result.confirmed) {\n            // this model should be ignored\n            writeIgnoreState(this._codeEditorService, model, true);\n            return;\n        }\n        model.removeUnusualLineTerminators(this._editor.getSelections());\n    }\n};\nUnusualLineTerminatorsDetector = __decorate([\n    __param(1, IDialogService),\n    __param(2, ICodeEditorService)\n], UnusualLineTerminatorsDetector);\nregisterEditorContribution(UnusualLineTerminatorsDetector.ID, UnusualLineTerminatorsDetector, 1 /* EditorContributionInstantiation.AfterFirstRender */);\n\nexport { UnusualLineTerminatorsDetector };\n","import { isThenable } from './async.js';\nimport { isEqualOrParent } from './extpath.js';\nimport { LRUCache } from './map.js';\nimport { sep, posix, basename, extname } from './path.js';\nimport { isLinux } from './platform.js';\nimport { ltrim, escapeRegExpCharacters, endsWithIgnoreCase, equalsIgnoreCase } from './strings.js';\n\nconst GLOBSTAR = '**';\nconst GLOB_SPLIT = '/';\nconst PATH_REGEX = '[/\\\\\\\\]'; // any slash or backslash\nconst NO_PATH_REGEX = '[^/\\\\\\\\]'; // any non-slash and non-backslash\nconst ALL_FORWARD_SLASHES = /\\//g;\nfunction starsToRegExp(starCount, isLastPattern) {\n    switch (starCount) {\n        case 0:\n            return '';\n        case 1:\n            return `${NO_PATH_REGEX}*?`; // 1 star matches any number of characters except path separator (/ and \\) - non greedy (?)\n        default:\n            // Matches:  (Path Sep OR Path Val followed by Path Sep) 0-many times except when it's the last pattern\n            //           in which case also matches (Path Sep followed by Path Val)\n            // Group is non capturing because we don't need to capture at all (?:...)\n            // Overall we use non-greedy matching because it could be that we match too much\n            return `(?:${PATH_REGEX}|${NO_PATH_REGEX}+${PATH_REGEX}${isLastPattern ? `|${PATH_REGEX}${NO_PATH_REGEX}+` : ''})*?`;\n    }\n}\nfunction splitGlobAware(pattern, splitChar) {\n    if (!pattern) {\n        return [];\n    }\n    const segments = [];\n    let inBraces = false;\n    let inBrackets = false;\n    let curVal = '';\n    for (const char of pattern) {\n        switch (char) {\n            case splitChar:\n                if (!inBraces && !inBrackets) {\n                    segments.push(curVal);\n                    curVal = '';\n                    continue;\n                }\n                break;\n            case '{':\n                inBraces = true;\n                break;\n            case '}':\n                inBraces = false;\n                break;\n            case '[':\n                inBrackets = true;\n                break;\n            case ']':\n                inBrackets = false;\n                break;\n        }\n        curVal += char;\n    }\n    // Tail\n    if (curVal) {\n        segments.push(curVal);\n    }\n    return segments;\n}\nfunction parseRegExp(pattern) {\n    if (!pattern) {\n        return '';\n    }\n    let regEx = '';\n    // Split up into segments for each slash found\n    const segments = splitGlobAware(pattern, GLOB_SPLIT);\n    // Special case where we only have globstars\n    if (segments.every(segment => segment === GLOBSTAR)) {\n        regEx = '.*';\n    }\n    // Build regex over segments\n    else {\n        let previousSegmentWasGlobStar = false;\n        segments.forEach((segment, index) => {\n            // Treat globstar specially\n            if (segment === GLOBSTAR) {\n                // if we have more than one globstar after another, just ignore it\n                if (previousSegmentWasGlobStar) {\n                    return;\n                }\n                regEx += starsToRegExp(2, index === segments.length - 1);\n            }\n            // Anything else, not globstar\n            else {\n                // States\n                let inBraces = false;\n                let braceVal = '';\n                let inBrackets = false;\n                let bracketVal = '';\n                for (const char of segment) {\n                    // Support brace expansion\n                    if (char !== '}' && inBraces) {\n                        braceVal += char;\n                        continue;\n                    }\n                    // Support brackets\n                    if (inBrackets && (char !== ']' || !bracketVal) /* ] is literally only allowed as first character in brackets to match it */) {\n                        let res;\n                        // range operator\n                        if (char === '-') {\n                            res = char;\n                        }\n                        // negation operator (only valid on first index in bracket)\n                        else if ((char === '^' || char === '!') && !bracketVal) {\n                            res = '^';\n                        }\n                        // glob split matching is not allowed within character ranges\n                        // see http://man7.org/linux/man-pages/man7/glob.7.html\n                        else if (char === GLOB_SPLIT) {\n                            res = '';\n                        }\n                        // anything else gets escaped\n                        else {\n                            res = escapeRegExpCharacters(char);\n                        }\n                        bracketVal += res;\n                        continue;\n                    }\n                    switch (char) {\n                        case '{':\n                            inBraces = true;\n                            continue;\n                        case '[':\n                            inBrackets = true;\n                            continue;\n                        case '}': {\n                            const choices = splitGlobAware(braceVal, ',');\n                            // Converts {foo,bar} => [foo|bar]\n                            const braceRegExp = `(?:${choices.map(choice => parseRegExp(choice)).join('|')})`;\n                            regEx += braceRegExp;\n                            inBraces = false;\n                            braceVal = '';\n                            break;\n                        }\n                        case ']': {\n                            regEx += ('[' + bracketVal + ']');\n                            inBrackets = false;\n                            bracketVal = '';\n                            break;\n                        }\n                        case '?':\n                            regEx += NO_PATH_REGEX; // 1 ? matches any single character except path separator (/ and \\)\n                            continue;\n                        case '*':\n                            regEx += starsToRegExp(1);\n                            continue;\n                        default:\n                            regEx += escapeRegExpCharacters(char);\n                    }\n                }\n                // Tail: Add the slash we had split on if there is more to\n                // come and the remaining pattern is not a globstar\n                // For example if pattern: some/**/*.js we want the \"/\" after\n                // some to be included in the RegEx to prevent a folder called\n                // \"something\" to match as well.\n                if (index < segments.length - 1 && // more segments to come after this\n                    (segments[index + 1] !== GLOBSTAR || // next segment is not **, or...\n                        index + 2 < segments.length // ...next segment is ** but there is more segments after that\n                    )) {\n                    regEx += PATH_REGEX;\n                }\n            }\n            // update globstar state\n            previousSegmentWasGlobStar = (segment === GLOBSTAR);\n        });\n    }\n    return regEx;\n}\n// regexes to check for trivial glob patterns that just check for String#endsWith\nconst T1 = /^\\*\\*\\/\\*\\.[\\w\\.-]+$/; // **/*.something\nconst T2 = /^\\*\\*\\/([\\w\\.-]+)\\/?$/; // **/something\nconst T3 = /^{\\*\\*\\/\\*?[\\w\\.-]+\\/?(,\\*\\*\\/\\*?[\\w\\.-]+\\/?)*}$/; // {**/*.something,**/*.else} or {**/package.json,**/project.json}\nconst T3_2 = /^{\\*\\*\\/\\*?[\\w\\.-]+(\\/(\\*\\*)?)?(,\\*\\*\\/\\*?[\\w\\.-]+(\\/(\\*\\*)?)?)*}$/; // Like T3, with optional trailing /**\nconst T4 = /^\\*\\*((\\/[\\w\\.-]+)+)\\/?$/; // **/something/else\nconst T5 = /^([\\w\\.-]+(\\/[\\w\\.-]+)*)\\/?$/; // something/else\nconst CACHE = new LRUCache(10000); // bounded to 10000 elements\nconst FALSE = function () {\n    return false;\n};\nconst NULL = function () {\n    return null;\n};\nfunction parsePattern(arg1, options) {\n    if (!arg1) {\n        return NULL;\n    }\n    // Handle relative patterns\n    let pattern;\n    if (typeof arg1 !== 'string') {\n        pattern = arg1.pattern;\n    }\n    else {\n        pattern = arg1;\n    }\n    // Whitespace trimming\n    pattern = pattern.trim();\n    const ignoreCase = options.ignoreCase ?? false;\n    const internalOptions = {\n        ...options,\n        equals: ignoreCase ? equalsIgnoreCase : (a, b) => a === b,\n        endsWith: ignoreCase ? endsWithIgnoreCase : (str, candidate) => str.endsWith(candidate),\n        // TODO: the '!isLinux' part below is to keep current behavior unchanged, but it should probably be removed\n        // in favor of passing correct options from the caller.\n        isEqualOrParent: (base, candidate) => isEqualOrParent(base, candidate, !isLinux || ignoreCase)\n    };\n    // Check cache\n    const patternKey = `${ignoreCase ? pattern.toLowerCase() : pattern}_${!!options.trimForExclusions}_${ignoreCase}`;\n    let parsedPattern = CACHE.get(patternKey);\n    if (parsedPattern) {\n        return wrapRelativePattern(parsedPattern, arg1, internalOptions);\n    }\n    // Check for Trivials\n    let match;\n    if (T1.test(pattern)) {\n        parsedPattern = trivia1(pattern.substring(4), pattern, internalOptions); // common pattern: **/*.txt just need endsWith check\n    }\n    else if (match = T2.exec(trimForExclusions(pattern, internalOptions))) { // common pattern: **/some.txt just need basename check\n        parsedPattern = trivia2(match[1], pattern, internalOptions);\n    }\n    else if ((options.trimForExclusions ? T3_2 : T3).test(pattern)) { // repetition of common patterns (see above) {**/*.txt,**/*.png}\n        parsedPattern = trivia3(pattern, internalOptions);\n    }\n    else if (match = T4.exec(trimForExclusions(pattern, internalOptions))) { // common pattern: **/something/else just need endsWith check\n        parsedPattern = trivia4and5(match[1].substring(1), pattern, true, internalOptions);\n    }\n    else if (match = T5.exec(trimForExclusions(pattern, internalOptions))) { // common pattern: something/else just need equals check\n        parsedPattern = trivia4and5(match[1], pattern, false, internalOptions);\n    }\n    // Otherwise convert to pattern\n    else {\n        parsedPattern = toRegExp(pattern, internalOptions);\n    }\n    // Cache\n    CACHE.set(patternKey, parsedPattern);\n    return wrapRelativePattern(parsedPattern, arg1, internalOptions);\n}\nfunction wrapRelativePattern(parsedPattern, arg2, options) {\n    if (typeof arg2 === 'string') {\n        return parsedPattern;\n    }\n    const wrappedPattern = function (path, basename) {\n        if (!options.isEqualOrParent(path, arg2.base)) {\n            // skip glob matching if `base` is not a parent of `path`\n            return null;\n        }\n        // Given we have checked `base` being a parent of `path`,\n        // we can now remove the `base` portion of the `path`\n        // and only match on the remaining path components\n        // For that we try to extract the portion of the `path`\n        // that comes after the `base` portion. We have to account\n        // for the fact that `base` might end in a path separator\n        // (https://github.com/microsoft/vscode/issues/162498)\n        return parsedPattern(ltrim(path.substring(arg2.base.length), sep), basename);\n    };\n    // Make sure to preserve associated metadata\n    wrappedPattern.allBasenames = parsedPattern.allBasenames;\n    wrappedPattern.allPaths = parsedPattern.allPaths;\n    wrappedPattern.basenames = parsedPattern.basenames;\n    wrappedPattern.patterns = parsedPattern.patterns;\n    return wrappedPattern;\n}\nfunction trimForExclusions(pattern, options) {\n    return options.trimForExclusions && pattern.endsWith('/**') ? pattern.substring(0, pattern.length - 2) : pattern; // dropping **, tailing / is dropped later\n}\n// common pattern: **/*.txt just need endsWith check\nfunction trivia1(base, pattern, options) {\n    return function (path, basename) {\n        return typeof path === 'string' && options.endsWith(path, base) ? pattern : null;\n    };\n}\n// common pattern: **/some.txt just need basename check\nfunction trivia2(base, pattern, options) {\n    const slashBase = `/${base}`;\n    const backslashBase = `\\\\${base}`;\n    const parsedPattern = function (path, basename) {\n        if (typeof path !== 'string') {\n            return null;\n        }\n        if (basename) {\n            return options.equals(basename, base) ? pattern : null;\n        }\n        return options.equals(path, base) || options.endsWith(path, slashBase) || options.endsWith(path, backslashBase) ? pattern : null;\n    };\n    const basenames = [base];\n    parsedPattern.basenames = basenames;\n    parsedPattern.patterns = [pattern];\n    parsedPattern.allBasenames = basenames;\n    return parsedPattern;\n}\n// repetition of common patterns (see above) {**/*.txt,**/*.png}\nfunction trivia3(pattern, options) {\n    const parsedPatterns = aggregateBasenameMatches(pattern.slice(1, -1)\n        .split(',')\n        .map(pattern => parsePattern(pattern, options))\n        .filter(pattern => pattern !== NULL), pattern);\n    const patternsLength = parsedPatterns.length;\n    if (!patternsLength) {\n        return NULL;\n    }\n    if (patternsLength === 1) {\n        return parsedPatterns[0];\n    }\n    const parsedPattern = function (path, basename) {\n        for (let i = 0, n = parsedPatterns.length; i < n; i++) {\n            if (parsedPatterns[i](path, basename)) {\n                return pattern;\n            }\n        }\n        return null;\n    };\n    const withBasenames = parsedPatterns.find(pattern => !!pattern.allBasenames);\n    if (withBasenames) {\n        parsedPattern.allBasenames = withBasenames.allBasenames;\n    }\n    const allPaths = parsedPatterns.reduce((all, current) => current.allPaths ? all.concat(current.allPaths) : all, []);\n    if (allPaths.length) {\n        parsedPattern.allPaths = allPaths;\n    }\n    return parsedPattern;\n}\n// common patterns: **/something/else just need endsWith check, something/else just needs and equals check\nfunction trivia4and5(targetPath, pattern, matchPathEnds, options) {\n    const usingPosixSep = sep === posix.sep;\n    const nativePath = usingPosixSep ? targetPath : targetPath.replace(ALL_FORWARD_SLASHES, sep);\n    const nativePathEnd = sep + nativePath;\n    const targetPathEnd = posix.sep + targetPath;\n    let parsedPattern;\n    if (matchPathEnds) {\n        parsedPattern = function (path, basename) {\n            return typeof path === 'string' && ((options.equals(path, nativePath) || options.endsWith(path, nativePathEnd)) ||\n                !usingPosixSep && (options.equals(path, targetPath) || options.endsWith(path, targetPathEnd))) ? pattern : null;\n        };\n    }\n    else {\n        parsedPattern = function (path, basename) {\n            return typeof path === 'string' && (options.equals(path, nativePath) || (!usingPosixSep && options.equals(path, targetPath))) ? pattern : null;\n        };\n    }\n    parsedPattern.allPaths = [(matchPathEnds ? '*/' : './') + targetPath];\n    return parsedPattern;\n}\nfunction toRegExp(pattern, options) {\n    try {\n        const regExp = new RegExp(`^${parseRegExp(pattern)}$`, options.ignoreCase ? 'i' : undefined);\n        return function (path) {\n            regExp.lastIndex = 0; // reset RegExp to its initial state to reuse it!\n            return typeof path === 'string' && regExp.test(path) ? pattern : null;\n        };\n    }\n    catch {\n        return NULL;\n    }\n}\nfunction match(arg1, path, options) {\n    if (!arg1 || typeof path !== 'string') {\n        return false;\n    }\n    return parse(arg1, options)(path);\n}\nfunction parse(arg1, options = {}) {\n    if (!arg1) {\n        return FALSE;\n    }\n    // Glob with String\n    if (typeof arg1 === 'string' || isRelativePattern(arg1)) {\n        const parsedPattern = parsePattern(arg1, options);\n        if (parsedPattern === NULL) {\n            return FALSE;\n        }\n        const resultPattern = function (path, basename) {\n            return !!parsedPattern(path, basename);\n        };\n        if (parsedPattern.allBasenames) {\n            resultPattern.allBasenames = parsedPattern.allBasenames;\n        }\n        if (parsedPattern.allPaths) {\n            resultPattern.allPaths = parsedPattern.allPaths;\n        }\n        return resultPattern;\n    }\n    // Glob with Expression\n    return parsedExpression(arg1, options);\n}\nfunction isRelativePattern(obj) {\n    const rp = obj;\n    if (!rp) {\n        return false;\n    }\n    return typeof rp.base === 'string' && typeof rp.pattern === 'string';\n}\nfunction parsedExpression(expression, options) {\n    const parsedPatterns = aggregateBasenameMatches(Object.getOwnPropertyNames(expression)\n        .map(pattern => parseExpressionPattern(pattern, expression[pattern], options))\n        .filter(pattern => pattern !== NULL));\n    const patternsLength = parsedPatterns.length;\n    if (!patternsLength) {\n        return NULL;\n    }\n    if (!parsedPatterns.some(parsedPattern => !!parsedPattern.requiresSiblings)) {\n        if (patternsLength === 1) {\n            return parsedPatterns[0];\n        }\n        const resultExpression = function (path, basename) {\n            let resultPromises = undefined;\n            for (let i = 0, n = parsedPatterns.length; i < n; i++) {\n                const result = parsedPatterns[i](path, basename);\n                if (typeof result === 'string') {\n                    return result; // immediately return as soon as the first expression matches\n                }\n                // If the result is a promise, we have to keep it for\n                // later processing and await the result properly.\n                if (isThenable(result)) {\n                    if (!resultPromises) {\n                        resultPromises = [];\n                    }\n                    resultPromises.push(result);\n                }\n            }\n            // With result promises, we have to loop over each and\n            // await the result before we can return any result.\n            if (resultPromises) {\n                return (async () => {\n                    for (const resultPromise of resultPromises) {\n                        const result = await resultPromise;\n                        if (typeof result === 'string') {\n                            return result;\n                        }\n                    }\n                    return null;\n                })();\n            }\n            return null;\n        };\n        const withBasenames = parsedPatterns.find(pattern => !!pattern.allBasenames);\n        if (withBasenames) {\n            resultExpression.allBasenames = withBasenames.allBasenames;\n        }\n        const allPaths = parsedPatterns.reduce((all, current) => current.allPaths ? all.concat(current.allPaths) : all, []);\n        if (allPaths.length) {\n            resultExpression.allPaths = allPaths;\n        }\n        return resultExpression;\n    }\n    const resultExpression = function (path, base, hasSibling) {\n        let name = undefined;\n        let resultPromises = undefined;\n        for (let i = 0, n = parsedPatterns.length; i < n; i++) {\n            // Pattern matches path\n            const parsedPattern = parsedPatterns[i];\n            if (parsedPattern.requiresSiblings && hasSibling) {\n                if (!base) {\n                    base = basename(path);\n                }\n                if (!name) {\n                    name = base.substring(0, base.length - extname(path).length);\n                }\n            }\n            const result = parsedPattern(path, base, name, hasSibling);\n            if (typeof result === 'string') {\n                return result; // immediately return as soon as the first expression matches\n            }\n            // If the result is a promise, we have to keep it for\n            // later processing and await the result properly.\n            if (isThenable(result)) {\n                if (!resultPromises) {\n                    resultPromises = [];\n                }\n                resultPromises.push(result);\n            }\n        }\n        // With result promises, we have to loop over each and\n        // await the result before we can return any result.\n        if (resultPromises) {\n            return (async () => {\n                for (const resultPromise of resultPromises) {\n                    const result = await resultPromise;\n                    if (typeof result === 'string') {\n                        return result;\n                    }\n                }\n                return null;\n            })();\n        }\n        return null;\n    };\n    const withBasenames = parsedPatterns.find(pattern => !!pattern.allBasenames);\n    if (withBasenames) {\n        resultExpression.allBasenames = withBasenames.allBasenames;\n    }\n    const allPaths = parsedPatterns.reduce((all, current) => current.allPaths ? all.concat(current.allPaths) : all, []);\n    if (allPaths.length) {\n        resultExpression.allPaths = allPaths;\n    }\n    return resultExpression;\n}\nfunction parseExpressionPattern(pattern, value, options) {\n    if (value === false) {\n        return NULL; // pattern is disabled\n    }\n    const parsedPattern = parsePattern(pattern, options);\n    if (parsedPattern === NULL) {\n        return NULL;\n    }\n    // Expression Pattern is <boolean>\n    if (typeof value === 'boolean') {\n        return parsedPattern;\n    }\n    // Expression Pattern is <SiblingClause>\n    if (value) {\n        const when = value.when;\n        if (typeof when === 'string') {\n            const result = (path, basename, name, hasSibling) => {\n                if (!hasSibling || !parsedPattern(path, basename)) {\n                    return null;\n                }\n                const clausePattern = when.replace('$(basename)', () => name);\n                const matched = hasSibling(clausePattern);\n                return isThenable(matched) ?\n                    matched.then(match => match ? pattern : null) :\n                    matched ? pattern : null;\n            };\n            result.requiresSiblings = true;\n            return result;\n        }\n    }\n    // Expression is anything\n    return parsedPattern;\n}\nfunction aggregateBasenameMatches(parsedPatterns, result) {\n    const basenamePatterns = parsedPatterns.filter(parsedPattern => !!parsedPattern.basenames);\n    if (basenamePatterns.length < 2) {\n        return parsedPatterns;\n    }\n    const basenames = basenamePatterns.reduce((all, current) => {\n        const basenames = current.basenames;\n        return basenames ? all.concat(basenames) : all;\n    }, []);\n    let patterns;\n    if (result) {\n        patterns = [];\n        for (let i = 0, n = basenames.length; i < n; i++) {\n            patterns.push(result);\n        }\n    }\n    else {\n        patterns = basenamePatterns.reduce((all, current) => {\n            const patterns = current.patterns;\n            return patterns ? all.concat(patterns) : all;\n        }, []);\n    }\n    const aggregate = function (path, basename) {\n        if (typeof path !== 'string') {\n            return null;\n        }\n        if (!basename) {\n            let i;\n            for (i = path.length; i > 0; i--) {\n                const ch = path.charCodeAt(i - 1);\n                if (ch === 47 /* CharCode.Slash */ || ch === 92 /* CharCode.Backslash */) {\n                    break;\n                }\n            }\n            basename = path.substring(i);\n        }\n        const index = basenames.indexOf(basename);\n        return index !== -1 ? patterns[index] : null;\n    };\n    aggregate.basenames = basenames;\n    aggregate.patterns = patterns;\n    aggregate.allBasenames = basenames;\n    const aggregatedPatterns = parsedPatterns.filter(parsedPattern => !parsedPattern.basenames);\n    aggregatedPatterns.push(aggregate);\n    return aggregatedPatterns;\n}\n\nexport { GLOBSTAR, GLOB_SPLIT, isRelativePattern, match, parse, splitGlobAware };\n","import { match } from '../../base/common/glob.js';\nimport { normalize } from '../../base/common/path.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction score(selector, candidateUri, candidateLanguage, candidateIsSynchronized, candidateNotebookUri, candidateNotebookType) {\n    if (Array.isArray(selector)) {\n        // array -> take max individual value\n        let ret = 0;\n        for (const filter of selector) {\n            const value = score(filter, candidateUri, candidateLanguage, candidateIsSynchronized, candidateNotebookUri, candidateNotebookType);\n            if (value === 10) {\n                return value; // already at the highest\n            }\n            if (value > ret) {\n                ret = value;\n            }\n        }\n        return ret;\n    }\n    else if (typeof selector === 'string') {\n        if (!candidateIsSynchronized) {\n            return 0;\n        }\n        // short-hand notion, desugars to\n        // 'fooLang' -> { language: 'fooLang'}\n        // '*' -> { language: '*' }\n        if (selector === '*') {\n            return 5;\n        }\n        else if (selector === candidateLanguage) {\n            return 10;\n        }\n        else {\n            return 0;\n        }\n    }\n    else if (selector) {\n        // filter -> select accordingly, use defaults for scheme\n        const { language, pattern, scheme, hasAccessToAllModels, notebookType } = selector; // TODO: microsoft/TypeScript#42768\n        if (!candidateIsSynchronized && !hasAccessToAllModels) {\n            return 0;\n        }\n        // selector targets a notebook -> use the notebook uri instead\n        // of the \"normal\" document uri.\n        if (notebookType && candidateNotebookUri) {\n            candidateUri = candidateNotebookUri;\n        }\n        let ret = 0;\n        if (scheme) {\n            if (scheme === candidateUri.scheme) {\n                ret = 10;\n            }\n            else if (scheme === '*') {\n                ret = 5;\n            }\n            else {\n                return 0;\n            }\n        }\n        if (language) {\n            if (language === candidateLanguage) {\n                ret = 10;\n            }\n            else if (language === '*') {\n                ret = Math.max(ret, 5);\n            }\n            else {\n                return 0;\n            }\n        }\n        if (notebookType) {\n            if (notebookType === candidateNotebookType) {\n                ret = 10;\n            }\n            else if (notebookType === '*' && candidateNotebookType !== undefined) {\n                ret = Math.max(ret, 5);\n            }\n            else {\n                return 0;\n            }\n        }\n        if (pattern) {\n            let normalizedPattern;\n            if (typeof pattern === 'string') {\n                normalizedPattern = pattern;\n            }\n            else {\n                // Since this pattern has a `base` property, we need\n                // to normalize this path first before passing it on\n                // because we will compare it against `Uri.fsPath`\n                // which uses platform specific separators.\n                // Refs: https://github.com/microsoft/vscode/issues/99938\n                normalizedPattern = { ...pattern, base: normalize(pattern.base) };\n            }\n            if (normalizedPattern === candidateUri.fsPath || match(normalizedPattern, candidateUri.fsPath)) {\n                ret = 10;\n            }\n            else {\n                return 0;\n            }\n        }\n        return ret;\n    }\n    else {\n        return 0;\n    }\n}\n\nexport { score };\n","import { USUAL_WORD_SEPARATORS } from '../../../common/core/wordHelper.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { DocumentHighlightKind } from '../../../common/languages.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { ResourceMap } from '../../../../base/common/map.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass TextualDocumentHighlightProvider {\n    constructor() {\n        this.selector = { language: '*' };\n    }\n    provideDocumentHighlights(model, position, token) {\n        const result = [];\n        const word = model.getWordAtPosition({\n            lineNumber: position.lineNumber,\n            column: position.column\n        });\n        if (!word) {\n            return Promise.resolve(result);\n        }\n        if (model.isDisposed()) {\n            return;\n        }\n        const matches = model.findMatches(word.word, true, false, true, USUAL_WORD_SEPARATORS, false);\n        return matches.map(m => ({\n            range: m.range,\n            kind: DocumentHighlightKind.Text\n        }));\n    }\n    provideMultiDocumentHighlights(primaryModel, position, otherModels, token) {\n        const result = new ResourceMap();\n        const word = primaryModel.getWordAtPosition({\n            lineNumber: position.lineNumber,\n            column: position.column\n        });\n        if (!word) {\n            return Promise.resolve(result);\n        }\n        for (const model of [primaryModel, ...otherModels]) {\n            if (model.isDisposed()) {\n                continue;\n            }\n            const matches = model.findMatches(word.word, true, false, true, USUAL_WORD_SEPARATORS, false);\n            const highlights = matches.map(m => ({\n                range: m.range,\n                kind: DocumentHighlightKind.Text\n            }));\n            if (highlights) {\n                result.set(model.uri, highlights);\n            }\n        }\n        return result;\n    }\n}\nlet TextualMultiDocumentHighlightFeature = class TextualMultiDocumentHighlightFeature extends Disposable {\n    constructor(languageFeaturesService) {\n        super();\n        this._register(languageFeaturesService.documentHighlightProvider.register('*', new TextualDocumentHighlightProvider()));\n        this._register(languageFeaturesService.multiDocumentHighlightProvider.register('*', new TextualDocumentHighlightProvider()));\n    }\n};\nTextualMultiDocumentHighlightFeature = __decorate([\n    __param(0, ILanguageFeaturesService)\n], TextualMultiDocumentHighlightFeature);\n\nexport { TextualMultiDocumentHighlightFeature };\n","import { localize2 } from '../../../../nls.js';\nimport { alert } from '../../../../base/browser/ui/aria/aria.js';\nimport { Delayer, first, createCancelablePromise } from '../../../../base/common/async.js';\nimport { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedError, onUnexpectedExternalError } from '../../../../base/common/errors.js';\nimport { DisposableStore, Disposable } from '../../../../base/common/lifecycle.js';\nimport { ResourceMap } from '../../../../base/common/map.js';\nimport { matchesScheme, Schemas } from '../../../../base/common/network.js';\nimport { isEqual } from '../../../../base/common/resources.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { RawContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { ILogService } from '../../../../platform/log/common/log.js';\nimport { isDiffEditor } from '../../../browser/editorBrowser.js';\nimport { registerModelAndPositionCommand, registerEditorContribution, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { Range } from '../../../common/core/range.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { registerEditorFeature } from '../../../common/editorFeatures.js';\nimport { score } from '../../../common/languageSelector.js';\nimport { shouldSynchronizeModel } from '../../../common/model.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { ITextModelService } from '../../../common/services/resolverService.js';\nimport { getHighlightDecorationOptions } from './highlightDecorations.js';\nimport { TextualMultiDocumentHighlightFeature } from './textualHighlightProvider.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar WordHighlighter_1, WordHighlighterContribution_1;\nconst ctxHasWordHighlights = new RawContextKey('hasWordHighlights', false);\nfunction getOccurrencesAtPosition(registry, model, position, token) {\n    const orderedByScore = registry.ordered(model);\n    // in order of score ask the occurrences provider\n    // until someone response with a good result\n    // (good = non undefined and non null value)\n    // (result of size == 0 is valid, no highlights is a valid/expected result -- not a signal to fall back to other providers)\n    return first(orderedByScore.map(provider => () => {\n        return Promise.resolve(provider.provideDocumentHighlights(model, position, token))\n            .then(undefined, onUnexpectedExternalError);\n    }), (result) => result !== undefined && result !== null).then(result => {\n        if (result) {\n            const map = new ResourceMap();\n            map.set(model.uri, result);\n            return map;\n        }\n        return new ResourceMap();\n    });\n}\nfunction getOccurrencesAcrossMultipleModels(registry, model, position, token, otherModels) {\n    const orderedByScore = registry.ordered(model);\n    // in order of score ask the occurrences provider\n    // until someone response with a good result\n    // (good = non undefined and non null ResourceMap)\n    // (result of size == 0 is valid, no highlights is a valid/expected result -- not a signal to fall back to other providers)\n    return first(orderedByScore.map(provider => () => {\n        const filteredModels = otherModels.filter(otherModel => {\n            return shouldSynchronizeModel(otherModel);\n        }).filter(otherModel => {\n            return score(provider.selector, otherModel.uri, otherModel.getLanguageId(), true, undefined, undefined) > 0;\n        });\n        return Promise.resolve(provider.provideMultiDocumentHighlights(model, position, filteredModels, token))\n            .then(undefined, onUnexpectedExternalError);\n    }), (result) => result !== undefined && result !== null);\n}\nclass OccurenceAtPositionRequest {\n    constructor(_model, _selection, _wordSeparators) {\n        this._model = _model;\n        this._selection = _selection;\n        this._wordSeparators = _wordSeparators;\n        this._wordRange = this._getCurrentWordRange(_model, _selection);\n        this._result = null;\n    }\n    get result() {\n        if (!this._result) {\n            this._result = createCancelablePromise(token => this._compute(this._model, this._selection, this._wordSeparators, token));\n        }\n        return this._result;\n    }\n    _getCurrentWordRange(model, selection) {\n        const word = model.getWordAtPosition(selection.getPosition());\n        if (word) {\n            return new Range(selection.startLineNumber, word.startColumn, selection.startLineNumber, word.endColumn);\n        }\n        return null;\n    }\n    cancel() {\n        this.result.cancel();\n    }\n}\nclass SemanticOccurenceAtPositionRequest extends OccurenceAtPositionRequest {\n    constructor(model, selection, wordSeparators, providers) {\n        super(model, selection, wordSeparators);\n        this._providers = providers;\n    }\n    _compute(model, selection, wordSeparators, token) {\n        return getOccurrencesAtPosition(this._providers, model, selection.getPosition(), token).then(value => {\n            if (!value) {\n                return new ResourceMap();\n            }\n            return value;\n        });\n    }\n}\nclass MultiModelOccurenceRequest extends OccurenceAtPositionRequest {\n    constructor(model, selection, wordSeparators, providers, otherModels) {\n        super(model, selection, wordSeparators);\n        this._providers = providers;\n        this._otherModels = otherModels;\n    }\n    _compute(model, selection, wordSeparators, token) {\n        return getOccurrencesAcrossMultipleModels(this._providers, model, selection.getPosition(), token, this._otherModels).then(value => {\n            if (!value) {\n                return new ResourceMap();\n            }\n            return value;\n        });\n    }\n}\nfunction computeOccurencesAtPosition(registry, model, selection, wordSeparators) {\n    return new SemanticOccurenceAtPositionRequest(model, selection, wordSeparators, registry);\n}\nfunction computeOccurencesMultiModel(registry, model, selection, wordSeparators, otherModels) {\n    return new MultiModelOccurenceRequest(model, selection, wordSeparators, registry, otherModels);\n}\nregisterModelAndPositionCommand('_executeDocumentHighlights', async (accessor, model, position) => {\n    const languageFeaturesService = accessor.get(ILanguageFeaturesService);\n    const map = await getOccurrencesAtPosition(languageFeaturesService.documentHighlightProvider, model, position, CancellationToken.None);\n    return map?.get(model.uri);\n});\nlet WordHighlighter = class WordHighlighter {\n    static { WordHighlighter_1 = this; }\n    static { this.storedDecorationIDs = new ResourceMap(); }\n    static { this.query = null; }\n    constructor(editor, providers, multiProviders, contextKeyService, textModelService, codeEditorService, configurationService, logService) {\n        this.toUnhook = new DisposableStore();\n        this.workerRequestTokenId = 0;\n        this.workerRequestCompleted = false;\n        this.workerRequestValue = new ResourceMap();\n        this.lastCursorPositionChangeTime = 0;\n        this.renderDecorationsTimer = undefined;\n        this.runDelayer = this.toUnhook.add(new Delayer(50));\n        this.editor = editor;\n        this.providers = providers;\n        this.multiDocumentProviders = multiProviders;\n        this.codeEditorService = codeEditorService;\n        this.textModelService = textModelService;\n        this.configurationService = configurationService;\n        this.logService = logService;\n        this._hasWordHighlights = ctxHasWordHighlights.bindTo(contextKeyService);\n        this._ignorePositionChangeEvent = false;\n        this.occurrencesHighlightEnablement = this.editor.getOption(90 /* EditorOption.occurrencesHighlight */);\n        this.occurrencesHighlightDelay = this.configurationService.getValue('editor.occurrencesHighlightDelay');\n        this.model = this.editor.getModel();\n        this.toUnhook.add(editor.onDidChangeCursorPosition((e) => {\n            if (this._ignorePositionChangeEvent) {\n                // We are changing the position => ignore this event\n                return;\n            }\n            if (this.occurrencesHighlightEnablement === 'off') {\n                // Early exit if nothing needs to be done!\n                // Leave some form of early exit check here if you wish to continue being a cursor position change listener ;)\n                return;\n            }\n            this.runDelayer.trigger(() => { this._onPositionChanged(e); });\n        }));\n        this.toUnhook.add(editor.onDidFocusEditorText((e) => {\n            if (this.occurrencesHighlightEnablement === 'off') {\n                // Early exit if nothing needs to be done\n                return;\n            }\n            if (!this.workerRequest) {\n                this.runDelayer.trigger(() => { this._run(); });\n            }\n        }));\n        this.toUnhook.add(editor.onDidChangeModelContent((e) => {\n            if (!matchesScheme(this.model.uri, 'output')) {\n                this._stopAll();\n            }\n        }));\n        this.toUnhook.add(editor.onDidChangeModel((e) => {\n            if (!e.newModelUrl && e.oldModelUrl) {\n                this._stopSingular();\n            }\n            else if (WordHighlighter_1.query) {\n                this._run();\n            }\n        }));\n        this.toUnhook.add(editor.onDidChangeConfiguration((e) => {\n            const newEnablement = this.editor.getOption(90 /* EditorOption.occurrencesHighlight */);\n            if (this.occurrencesHighlightEnablement !== newEnablement) {\n                this.occurrencesHighlightEnablement = newEnablement;\n                switch (newEnablement) {\n                    case 'off':\n                        this._stopAll();\n                        break;\n                    case 'singleFile':\n                        this._stopAll(WordHighlighter_1.query?.modelInfo?.modelURI);\n                        break;\n                    case 'multiFile':\n                        if (WordHighlighter_1.query) {\n                            this._run(true);\n                        }\n                        break;\n                    default:\n                        console.warn('Unknown occurrencesHighlight setting value:', newEnablement);\n                        break;\n                }\n            }\n        }));\n        this.toUnhook.add(this.configurationService.onDidChangeConfiguration((e) => {\n            if (e.affectsConfiguration('editor.occurrencesHighlightDelay')) {\n                const newDelay = configurationService.getValue('editor.occurrencesHighlightDelay');\n                if (this.occurrencesHighlightDelay !== newDelay) {\n                    this.occurrencesHighlightDelay = newDelay;\n                }\n            }\n        }));\n        this.toUnhook.add(editor.onDidBlurEditorWidget(() => {\n            // logic is as follows\n            // - didBlur => active null => stopall\n            // - didBlur => active nb   => if this.editor is notebook, do nothing (new cell, so we don't want to stopAll)\n            //              active nb   => if this.editor is NOT nb,   stopAll\n            const activeEditor = this.codeEditorService.getFocusedCodeEditor();\n            if (!activeEditor) { // clicked into nb cell list, outline, terminal, etc\n                this._stopAll();\n            }\n            else if (activeEditor.getModel()?.uri.scheme === Schemas.vscodeNotebookCell && this.editor.getModel()?.uri.scheme !== Schemas.vscodeNotebookCell) { // switched tabs from non-nb to nb\n                this._stopAll();\n            }\n        }));\n        this.decorations = this.editor.createDecorationsCollection();\n        this.workerRequestTokenId = 0;\n        this.workerRequest = null;\n        this.workerRequestCompleted = false;\n        this.lastCursorPositionChangeTime = 0;\n        this.renderDecorationsTimer = undefined;\n        // if there is a query already, highlight off that query\n        if (WordHighlighter_1.query) {\n            this._run();\n        }\n    }\n    hasDecorations() {\n        return (this.decorations.length > 0);\n    }\n    restore(delay) {\n        if (this.occurrencesHighlightEnablement === 'off') {\n            return;\n        }\n        this.runDelayer.cancel();\n        this.runDelayer.trigger(() => { this._run(false, delay); });\n    }\n    stop() {\n        if (this.occurrencesHighlightEnablement === 'off') {\n            return;\n        }\n        this._stopAll();\n    }\n    _getSortedHighlights() {\n        return (this.decorations.getRanges()\n            .sort(Range.compareRangesUsingStarts));\n    }\n    moveNext() {\n        const highlights = this._getSortedHighlights();\n        const index = highlights.findIndex((range) => range.containsPosition(this.editor.getPosition()));\n        const newIndex = ((index + 1) % highlights.length);\n        const dest = highlights[newIndex];\n        try {\n            this._ignorePositionChangeEvent = true;\n            this.editor.setPosition(dest.getStartPosition());\n            this.editor.revealRangeInCenterIfOutsideViewport(dest);\n            const word = this._getWord();\n            if (word) {\n                const lineContent = this.editor.getModel().getLineContent(dest.startLineNumber);\n                alert(`${lineContent}, ${newIndex + 1} of ${highlights.length} for '${word.word}'`);\n            }\n        }\n        finally {\n            this._ignorePositionChangeEvent = false;\n        }\n    }\n    moveBack() {\n        const highlights = this._getSortedHighlights();\n        const index = highlights.findIndex((range) => range.containsPosition(this.editor.getPosition()));\n        const newIndex = ((index - 1 + highlights.length) % highlights.length);\n        const dest = highlights[newIndex];\n        try {\n            this._ignorePositionChangeEvent = true;\n            this.editor.setPosition(dest.getStartPosition());\n            this.editor.revealRangeInCenterIfOutsideViewport(dest);\n            const word = this._getWord();\n            if (word) {\n                const lineContent = this.editor.getModel().getLineContent(dest.startLineNumber);\n                alert(`${lineContent}, ${newIndex + 1} of ${highlights.length} for '${word.word}'`);\n            }\n        }\n        finally {\n            this._ignorePositionChangeEvent = false;\n        }\n    }\n    _removeSingleDecorations() {\n        // return if no model\n        if (!this.editor.hasModel()) {\n            return;\n        }\n        const currentDecorationIDs = WordHighlighter_1.storedDecorationIDs.get(this.editor.getModel().uri);\n        if (!currentDecorationIDs) {\n            return;\n        }\n        this.editor.removeDecorations(currentDecorationIDs);\n        WordHighlighter_1.storedDecorationIDs.delete(this.editor.getModel().uri);\n        if (this.decorations.length > 0) {\n            this.decorations.clear();\n            this._hasWordHighlights.set(false);\n        }\n    }\n    _removeAllDecorations(preservedModel) {\n        const currentEditors = this.codeEditorService.listCodeEditors();\n        const deleteURI = [];\n        // iterate over editors and store models in currentModels\n        for (const editor of currentEditors) {\n            if (!editor.hasModel() || isEqual(editor.getModel().uri, preservedModel)) {\n                continue;\n            }\n            const currentDecorationIDs = WordHighlighter_1.storedDecorationIDs.get(editor.getModel().uri);\n            if (!currentDecorationIDs) {\n                continue;\n            }\n            editor.removeDecorations(currentDecorationIDs);\n            deleteURI.push(editor.getModel().uri);\n            const editorHighlighterContrib = WordHighlighterContribution.get(editor);\n            if (!editorHighlighterContrib?.wordHighlighter) {\n                continue;\n            }\n            if (editorHighlighterContrib.wordHighlighter.decorations.length > 0) {\n                editorHighlighterContrib.wordHighlighter.decorations.clear();\n                editorHighlighterContrib.wordHighlighter.workerRequest = null;\n                editorHighlighterContrib.wordHighlighter._hasWordHighlights.set(false);\n            }\n        }\n        for (const uri of deleteURI) {\n            WordHighlighter_1.storedDecorationIDs.delete(uri);\n        }\n    }\n    _stopSingular() {\n        // Remove any existing decorations + a possible query, and re - run to update decorations\n        this._removeSingleDecorations();\n        if (this.editor.hasTextFocus()) {\n            if (this.editor.getModel()?.uri.scheme !== Schemas.vscodeNotebookCell && WordHighlighter_1.query?.modelInfo?.modelURI.scheme !== Schemas.vscodeNotebookCell) { // clear query if focused non-nb editor\n                WordHighlighter_1.query = null;\n                this._run(); // TODO: @Yoyokrazy -- investigate why we need a full rerun here. likely addressed a case/patch in the first iteration of this feature\n            }\n            else { // remove modelInfo to account for nb cell being disposed\n                if (WordHighlighter_1.query?.modelInfo) {\n                    WordHighlighter_1.query.modelInfo = null;\n                }\n            }\n        }\n        // Cancel any renderDecorationsTimer\n        if (this.renderDecorationsTimer !== undefined) {\n            clearTimeout(this.renderDecorationsTimer);\n            this.renderDecorationsTimer = undefined;\n        }\n        // Cancel any worker request\n        if (this.workerRequest !== null) {\n            this.workerRequest.cancel();\n            this.workerRequest = null;\n        }\n        // Invalidate any worker request callback\n        if (!this.workerRequestCompleted) {\n            this.workerRequestTokenId++;\n            this.workerRequestCompleted = true;\n        }\n    }\n    _stopAll(preservedModel) {\n        // Remove any existing decorations\n        // TODO: @Yoyokrazy -- this triggers as notebooks scroll, causing highlights to disappear momentarily.\n        // maybe a nb type check?\n        this._removeAllDecorations(preservedModel);\n        // Cancel any renderDecorationsTimer\n        if (this.renderDecorationsTimer !== undefined) {\n            clearTimeout(this.renderDecorationsTimer);\n            this.renderDecorationsTimer = undefined;\n        }\n        // Cancel any worker request\n        if (this.workerRequest !== null) {\n            this.workerRequest.cancel();\n            this.workerRequest = null;\n        }\n        // Invalidate any worker request callback\n        if (!this.workerRequestCompleted) {\n            this.workerRequestTokenId++;\n            this.workerRequestCompleted = true;\n        }\n    }\n    _onPositionChanged(e) {\n        // disabled\n        if (this.occurrencesHighlightEnablement === 'off') {\n            this._stopAll();\n            return;\n        }\n        // ignore typing & other\n        // need to check if the model is a notebook cell, should not stop if nb\n        if (e.source !== 'api' && e.reason !== 3 /* CursorChangeReason.Explicit */) {\n            this._stopAll();\n            return;\n        }\n        this._run();\n    }\n    _getWord() {\n        const editorSelection = this.editor.getSelection();\n        const lineNumber = editorSelection.startLineNumber;\n        const startColumn = editorSelection.startColumn;\n        if (this.model.isDisposed()) {\n            return null;\n        }\n        return this.model.getWordAtPosition({\n            lineNumber: lineNumber,\n            column: startColumn\n        });\n    }\n    getOtherModelsToHighlight(model) {\n        if (!model) {\n            return [];\n        }\n        // notebook case\n        const isNotebookEditor = model.uri.scheme === Schemas.vscodeNotebookCell;\n        if (isNotebookEditor) {\n            const currentModels = [];\n            const currentEditors = this.codeEditorService.listCodeEditors();\n            for (const editor of currentEditors) {\n                const tempModel = editor.getModel();\n                if (tempModel && tempModel !== model && tempModel.uri.scheme === Schemas.vscodeNotebookCell) {\n                    currentModels.push(tempModel);\n                }\n            }\n            return currentModels;\n        }\n        // inline case\n        // ? current works when highlighting outside of an inline diff, highlighting in.\n        // ? broken when highlighting within a diff editor. highlighting the main editor does not work\n        // ? editor group service could be useful here\n        const currentModels = [];\n        const currentEditors = this.codeEditorService.listCodeEditors();\n        for (const editor of currentEditors) {\n            if (!isDiffEditor(editor)) {\n                continue;\n            }\n            const diffModel = editor.getModel();\n            if (!diffModel) {\n                continue;\n            }\n            if (model === diffModel.modified) { // embedded inline chat diff would pass this, allowing highlights\n                //? currentModels.push(diffModel.original);\n                currentModels.push(diffModel.modified);\n            }\n        }\n        if (currentModels.length) { // no matching editors have been found\n            return currentModels;\n        }\n        // multi-doc OFF\n        if (this.occurrencesHighlightEnablement === 'singleFile') {\n            return [];\n        }\n        // multi-doc ON\n        for (const editor of currentEditors) {\n            const tempModel = editor.getModel();\n            const isValidModel = tempModel && tempModel !== model;\n            if (isValidModel) {\n                currentModels.push(tempModel);\n            }\n        }\n        return currentModels;\n    }\n    async _run(multiFileConfigChange, delay) {\n        const hasTextFocus = this.editor.hasTextFocus();\n        if (!hasTextFocus) { // new nb cell scrolled in, didChangeModel fires\n            if (!WordHighlighter_1.query) { // no previous query, nothing to highlight off of\n                this._stopAll();\n                return;\n            }\n        }\n        else { // has text focus\n            const editorSelection = this.editor.getSelection();\n            // ignore multiline selection\n            if (!editorSelection || editorSelection.startLineNumber !== editorSelection.endLineNumber) {\n                WordHighlighter_1.query = null;\n                this._stopAll();\n                return;\n            }\n            const startColumn = editorSelection.startColumn;\n            const endColumn = editorSelection.endColumn;\n            const word = this._getWord();\n            // The selection must be inside a word or surround one word at most\n            if (!word || word.startColumn > startColumn || word.endColumn < endColumn) {\n                // no previous query, nothing to highlight\n                WordHighlighter_1.query = null;\n                this._stopAll();\n                return;\n            }\n            WordHighlighter_1.query = {\n                modelInfo: {\n                    modelURI: this.model.uri,\n                    selection: editorSelection,\n                }\n            };\n        }\n        this.lastCursorPositionChangeTime = (new Date()).getTime();\n        if (isEqual(this.editor.getModel().uri, WordHighlighter_1.query.modelInfo?.modelURI)) { // only trigger new worker requests from the primary model that initiated the query\n            // case d)\n            // check if the new queried word is contained in the range of a stored decoration for this model\n            if (!multiFileConfigChange) {\n                const currentModelDecorationRanges = this.decorations.getRanges();\n                for (const storedRange of currentModelDecorationRanges) {\n                    if (storedRange.containsPosition(this.editor.getPosition())) {\n                        return;\n                    }\n                }\n            }\n            // stop all previous actions if new word is highlighted\n            // if we trigger the run off a setting change -> multifile highlighting, we do not want to remove decorations from this model\n            this._stopAll(multiFileConfigChange ? this.model.uri : undefined);\n            const myRequestId = ++this.workerRequestTokenId;\n            this.workerRequestCompleted = false;\n            const otherModelsToHighlight = this.getOtherModelsToHighlight(this.editor.getModel());\n            // when reaching here, there are two possible states.\n            // \t\t1) we have text focus, and a valid query was updated.\n            // \t\t2) we do not have text focus, and a valid query is cached.\n            // the query will ALWAYS have the correct data for the current highlight request, so it can always be passed to the workerRequest safely\n            if (!WordHighlighter_1.query || !WordHighlighter_1.query.modelInfo) {\n                return;\n            }\n            const queryModelRef = await this.textModelService.createModelReference(WordHighlighter_1.query.modelInfo.modelURI);\n            try {\n                this.workerRequest = this.computeWithModel(queryModelRef.object.textEditorModel, WordHighlighter_1.query.modelInfo.selection, otherModelsToHighlight);\n                this.workerRequest?.result.then(data => {\n                    if (myRequestId === this.workerRequestTokenId) {\n                        this.workerRequestCompleted = true;\n                        this.workerRequestValue = data || [];\n                        this._beginRenderDecorations(delay ?? this.occurrencesHighlightDelay);\n                    }\n                }, onUnexpectedError);\n            }\n            catch (e) {\n                this.logService.error('Unexpected error during occurrence request. Log: ', e);\n            }\n            finally {\n                queryModelRef.dispose();\n            }\n        }\n        else if (this.model.uri.scheme === Schemas.vscodeNotebookCell) {\n            // new wordHighlighter coming from a different model, NOT the query model, need to create a textModel ref\n            const myRequestId = ++this.workerRequestTokenId;\n            this.workerRequestCompleted = false;\n            if (!WordHighlighter_1.query || !WordHighlighter_1.query.modelInfo) {\n                return;\n            }\n            const queryModelRef = await this.textModelService.createModelReference(WordHighlighter_1.query.modelInfo.modelURI);\n            try {\n                this.workerRequest = this.computeWithModel(queryModelRef.object.textEditorModel, WordHighlighter_1.query.modelInfo.selection, [this.model]);\n                this.workerRequest?.result.then(data => {\n                    if (myRequestId === this.workerRequestTokenId) {\n                        this.workerRequestCompleted = true;\n                        this.workerRequestValue = data || [];\n                        this._beginRenderDecorations(delay ?? this.occurrencesHighlightDelay);\n                    }\n                }, onUnexpectedError);\n            }\n            catch (e) {\n                this.logService.error('Unexpected error during occurrence request. Log: ', e);\n            }\n            finally {\n                queryModelRef.dispose();\n            }\n        }\n    }\n    computeWithModel(model, selection, otherModels) {\n        if (!otherModels.length) {\n            return computeOccurencesAtPosition(this.providers, model, selection, this.editor.getOption(148 /* EditorOption.wordSeparators */));\n        }\n        else {\n            return computeOccurencesMultiModel(this.multiDocumentProviders, model, selection, this.editor.getOption(148 /* EditorOption.wordSeparators */), otherModels);\n        }\n    }\n    _beginRenderDecorations(delay) {\n        const currentTime = (new Date()).getTime();\n        const minimumRenderTime = this.lastCursorPositionChangeTime + delay;\n        if (currentTime >= minimumRenderTime) {\n            // Synchronous\n            this.renderDecorationsTimer = undefined;\n            this.renderDecorations();\n        }\n        else {\n            // Asynchronous\n            this.renderDecorationsTimer = setTimeout(() => {\n                this.renderDecorations();\n            }, (minimumRenderTime - currentTime));\n        }\n    }\n    renderDecorations() {\n        this.renderDecorationsTimer = undefined;\n        // create new loop, iterate over current editors using this.codeEditorService.listCodeEditors(),\n        // if the URI of that codeEditor is in the map, then add the decorations to the decorations array\n        // then set the decorations for the editor\n        const currentEditors = this.codeEditorService.listCodeEditors();\n        for (const editor of currentEditors) {\n            const editorHighlighterContrib = WordHighlighterContribution.get(editor);\n            if (!editorHighlighterContrib) {\n                continue;\n            }\n            const newDecorations = [];\n            const uri = editor.getModel()?.uri;\n            if (uri && this.workerRequestValue.has(uri)) {\n                const oldDecorationIDs = WordHighlighter_1.storedDecorationIDs.get(uri);\n                const newDocumentHighlights = this.workerRequestValue.get(uri);\n                if (newDocumentHighlights) {\n                    for (const highlight of newDocumentHighlights) {\n                        if (!highlight.range) {\n                            continue;\n                        }\n                        newDecorations.push({\n                            range: highlight.range,\n                            options: getHighlightDecorationOptions(highlight.kind)\n                        });\n                    }\n                }\n                let newDecorationIDs = [];\n                editor.changeDecorations((changeAccessor) => {\n                    newDecorationIDs = changeAccessor.deltaDecorations(oldDecorationIDs ?? [], newDecorations);\n                });\n                WordHighlighter_1.storedDecorationIDs = WordHighlighter_1.storedDecorationIDs.set(uri, newDecorationIDs);\n                if (newDecorations.length > 0) {\n                    editorHighlighterContrib.wordHighlighter?.decorations.set(newDecorations);\n                    editorHighlighterContrib.wordHighlighter?._hasWordHighlights.set(true);\n                }\n            }\n        }\n        // clear the worker request when decorations are completed\n        this.workerRequest = null;\n    }\n    dispose() {\n        this._stopSingular();\n        this.toUnhook.dispose();\n    }\n};\nWordHighlighter = WordHighlighter_1 = __decorate([\n    __param(4, ITextModelService),\n    __param(5, ICodeEditorService),\n    __param(6, IConfigurationService),\n    __param(7, ILogService)\n], WordHighlighter);\nlet WordHighlighterContribution = class WordHighlighterContribution extends Disposable {\n    static { WordHighlighterContribution_1 = this; }\n    static { this.ID = 'editor.contrib.wordHighlighter'; }\n    static get(editor) {\n        return editor.getContribution(WordHighlighterContribution_1.ID);\n    }\n    constructor(editor, contextKeyService, languageFeaturesService, codeEditorService, textModelService, configurationService, logService) {\n        super();\n        this._wordHighlighter = null;\n        const createWordHighlighterIfPossible = () => {\n            if (editor.hasModel() && !editor.getModel().isTooLargeForTokenization() && editor.getModel().uri.scheme !== Schemas.accessibleView) {\n                this._wordHighlighter = new WordHighlighter(editor, languageFeaturesService.documentHighlightProvider, languageFeaturesService.multiDocumentHighlightProvider, contextKeyService, textModelService, codeEditorService, configurationService, logService);\n            }\n        };\n        this._register(editor.onDidChangeModel((e) => {\n            if (this._wordHighlighter) {\n                if (!e.newModelUrl && e.oldModelUrl?.scheme !== Schemas.vscodeNotebookCell) { // happens when switching tabs to a notebook that has focus in the cell list, no new model URI (this also doesn't make it to the wordHighlighter, bc no editor.hasModel)\n                    this.wordHighlighter?.stop();\n                }\n                this._wordHighlighter.dispose();\n                this._wordHighlighter = null;\n            }\n            createWordHighlighterIfPossible();\n        }));\n        createWordHighlighterIfPossible();\n    }\n    get wordHighlighter() {\n        return this._wordHighlighter;\n    }\n    saveViewState() {\n        if (this._wordHighlighter && this._wordHighlighter.hasDecorations()) {\n            return true;\n        }\n        return false;\n    }\n    moveNext() {\n        this._wordHighlighter?.moveNext();\n    }\n    moveBack() {\n        this._wordHighlighter?.moveBack();\n    }\n    restoreViewState(state) {\n        if (this._wordHighlighter && state) {\n            this._wordHighlighter.restore(250); // 250 ms delay to restoring view state, since only exts call this\n        }\n    }\n    dispose() {\n        if (this._wordHighlighter) {\n            this._wordHighlighter.dispose();\n            this._wordHighlighter = null;\n        }\n        super.dispose();\n    }\n};\nWordHighlighterContribution = WordHighlighterContribution_1 = __decorate([\n    __param(1, IContextKeyService),\n    __param(2, ILanguageFeaturesService),\n    __param(3, ICodeEditorService),\n    __param(4, ITextModelService),\n    __param(5, IConfigurationService),\n    __param(6, ILogService)\n], WordHighlighterContribution);\nclass WordHighlightNavigationAction extends EditorAction {\n    constructor(next, opts) {\n        super(opts);\n        this._isNext = next;\n    }\n    run(accessor, editor) {\n        const controller = WordHighlighterContribution.get(editor);\n        if (!controller) {\n            return;\n        }\n        if (this._isNext) {\n            controller.moveNext();\n        }\n        else {\n            controller.moveBack();\n        }\n    }\n}\nclass NextWordHighlightAction extends WordHighlightNavigationAction {\n    constructor() {\n        super(true, {\n            id: 'editor.action.wordHighlight.next',\n            label: localize2(1572, \"Go to Next Symbol Highlight\"),\n            precondition: ctxHasWordHighlights,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 65 /* KeyCode.F7 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n}\nclass PrevWordHighlightAction extends WordHighlightNavigationAction {\n    constructor() {\n        super(false, {\n            id: 'editor.action.wordHighlight.prev',\n            label: localize2(1573, \"Go to Previous Symbol Highlight\"),\n            precondition: ctxHasWordHighlights,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 1024 /* KeyMod.Shift */ | 65 /* KeyCode.F7 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n}\nclass TriggerWordHighlightAction extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.wordHighlight.trigger',\n            label: localize2(1574, \"Trigger Symbol Highlight\"),\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.editorTextFocus,\n                primary: 0,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(accessor, editor, args) {\n        const controller = WordHighlighterContribution.get(editor);\n        if (!controller) {\n            return;\n        }\n        controller.restoreViewState(true);\n    }\n}\nregisterEditorContribution(WordHighlighterContribution.ID, WordHighlighterContribution, 0 /* EditorContributionInstantiation.Eager */); // eager because it uses `saveViewState`/`restoreViewState`\nregisterEditorAction(NextWordHighlightAction);\nregisterEditorAction(PrevWordHighlightAction);\nregisterEditorAction(TriggerWordHighlightAction);\nregisterEditorFeature(TextualMultiDocumentHighlightFeature);\n\nexport { WordHighlighterContribution, getOccurrencesAcrossMultipleModels, getOccurrencesAtPosition };\n","import { localize2 } from '../../../../nls.js';\nimport { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from '../../../../platform/accessibility/common/accessibility.js';\nimport { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IsWindowsContext } from '../../../../platform/contextkey/common/contextkeys.js';\nimport { registerEditorCommand, registerEditorAction, EditorAction, EditorCommand } from '../../../browser/editorExtensions.js';\nimport { ReplaceCommand } from '../../../common/commands/replaceCommand.js';\nimport { EditorOptions } from '../../../common/config/editorOptions.js';\nimport { Position } from '../../../common/core/position.js';\nimport { Range } from '../../../common/core/range.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { getMapForWordSeparators } from '../../../common/core/wordCharacterClassifier.js';\nimport { WordOperations } from '../../../common/cursor/cursorWordOperations.js';\nimport { CursorState } from '../../../common/cursorCommon.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\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 *--------------------------------------------------------------------------------------------*/\nclass MoveWordCommand extends EditorCommand {\n    constructor(opts) {\n        super(opts);\n        this._inSelectionMode = opts.inSelectionMode;\n        this._wordNavigationType = opts.wordNavigationType;\n    }\n    runEditorCommand(accessor, editor, args) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const wordSeparators = getMapForWordSeparators(editor.getOption(148 /* EditorOption.wordSeparators */), editor.getOption(147 /* EditorOption.wordSegmenterLocales */));\n        const model = editor.getModel();\n        const selections = editor.getSelections();\n        const hasMulticursor = selections.length > 1;\n        const result = selections.map((sel) => {\n            const inPosition = new Position(sel.positionLineNumber, sel.positionColumn);\n            const outPosition = this._move(wordSeparators, model, inPosition, this._wordNavigationType, hasMulticursor);\n            return this._moveTo(sel, outPosition, this._inSelectionMode);\n        });\n        model.pushStackElement();\n        editor._getViewModel().setCursorStates('moveWordCommand', 3 /* CursorChangeReason.Explicit */, result.map(r => CursorState.fromModelSelection(r)));\n        if (result.length === 1) {\n            const pos = new Position(result[0].positionLineNumber, result[0].positionColumn);\n            editor.revealPosition(pos, 0 /* ScrollType.Smooth */);\n        }\n    }\n    _moveTo(from, to, inSelectionMode) {\n        if (inSelectionMode) {\n            // move just position\n            return new Selection(from.selectionStartLineNumber, from.selectionStartColumn, to.lineNumber, to.column);\n        }\n        else {\n            // move everything\n            return new Selection(to.lineNumber, to.column, to.lineNumber, to.column);\n        }\n    }\n}\nclass WordLeftCommand extends MoveWordCommand {\n    _move(wordSeparators, model, position, wordNavigationType, hasMulticursor) {\n        return WordOperations.moveWordLeft(wordSeparators, model, position, wordNavigationType, hasMulticursor);\n    }\n}\nclass WordRightCommand extends MoveWordCommand {\n    _move(wordSeparators, model, position, wordNavigationType, hasMulticursor) {\n        return WordOperations.moveWordRight(wordSeparators, model, position, wordNavigationType);\n    }\n}\nclass CursorWordStartLeft extends WordLeftCommand {\n    constructor() {\n        super({\n            inSelectionMode: false,\n            wordNavigationType: 0 /* WordNavigationType.WordStart */,\n            id: 'cursorWordStartLeft',\n            precondition: undefined\n        });\n    }\n}\nclass CursorWordEndLeft extends WordLeftCommand {\n    constructor() {\n        super({\n            inSelectionMode: false,\n            wordNavigationType: 2 /* WordNavigationType.WordEnd */,\n            id: 'cursorWordEndLeft',\n            precondition: undefined\n        });\n    }\n}\nclass CursorWordLeft extends WordLeftCommand {\n    constructor() {\n        super({\n            inSelectionMode: false,\n            wordNavigationType: 1 /* WordNavigationType.WordStartFast */,\n            id: 'cursorWordLeft',\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: ContextKeyExpr.and(EditorContextKeys.textInputFocus, ContextKeyExpr.and(CONTEXT_ACCESSIBILITY_MODE_ENABLED, IsWindowsContext)?.negate()),\n                primary: 2048 /* KeyMod.CtrlCmd */ | 15 /* KeyCode.LeftArrow */,\n                mac: { primary: 512 /* KeyMod.Alt */ | 15 /* KeyCode.LeftArrow */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n}\nclass CursorWordStartLeftSelect extends WordLeftCommand {\n    constructor() {\n        super({\n            inSelectionMode: true,\n            wordNavigationType: 0 /* WordNavigationType.WordStart */,\n            id: 'cursorWordStartLeftSelect',\n            precondition: undefined\n        });\n    }\n}\nclass CursorWordEndLeftSelect extends WordLeftCommand {\n    constructor() {\n        super({\n            inSelectionMode: true,\n            wordNavigationType: 2 /* WordNavigationType.WordEnd */,\n            id: 'cursorWordEndLeftSelect',\n            precondition: undefined\n        });\n    }\n}\nclass CursorWordLeftSelect extends WordLeftCommand {\n    constructor() {\n        super({\n            inSelectionMode: true,\n            wordNavigationType: 1 /* WordNavigationType.WordStartFast */,\n            id: 'cursorWordLeftSelect',\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: ContextKeyExpr.and(EditorContextKeys.textInputFocus, ContextKeyExpr.and(CONTEXT_ACCESSIBILITY_MODE_ENABLED, IsWindowsContext)?.negate()),\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 15 /* KeyCode.LeftArrow */,\n                mac: { primary: 512 /* KeyMod.Alt */ | 1024 /* KeyMod.Shift */ | 15 /* KeyCode.LeftArrow */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n}\n// Accessibility navigation commands should only be enabled on windows since they are tuned to what NVDA expects\nclass CursorWordAccessibilityLeft extends WordLeftCommand {\n    constructor() {\n        super({\n            inSelectionMode: false,\n            wordNavigationType: 3 /* WordNavigationType.WordAccessibility */,\n            id: 'cursorWordAccessibilityLeft',\n            precondition: undefined\n        });\n    }\n    _move(wordCharacterClassifier, model, position, wordNavigationType, hasMulticursor) {\n        return super._move(getMapForWordSeparators(EditorOptions.wordSeparators.defaultValue, wordCharacterClassifier.intlSegmenterLocales), model, position, wordNavigationType, hasMulticursor);\n    }\n}\nclass CursorWordAccessibilityLeftSelect extends WordLeftCommand {\n    constructor() {\n        super({\n            inSelectionMode: true,\n            wordNavigationType: 3 /* WordNavigationType.WordAccessibility */,\n            id: 'cursorWordAccessibilityLeftSelect',\n            precondition: undefined\n        });\n    }\n    _move(wordCharacterClassifier, model, position, wordNavigationType, hasMulticursor) {\n        return super._move(getMapForWordSeparators(EditorOptions.wordSeparators.defaultValue, wordCharacterClassifier.intlSegmenterLocales), model, position, wordNavigationType, hasMulticursor);\n    }\n}\nclass CursorWordStartRight extends WordRightCommand {\n    constructor() {\n        super({\n            inSelectionMode: false,\n            wordNavigationType: 0 /* WordNavigationType.WordStart */,\n            id: 'cursorWordStartRight',\n            precondition: undefined\n        });\n    }\n}\nclass CursorWordEndRight extends WordRightCommand {\n    constructor() {\n        super({\n            inSelectionMode: false,\n            wordNavigationType: 2 /* WordNavigationType.WordEnd */,\n            id: 'cursorWordEndRight',\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: ContextKeyExpr.and(EditorContextKeys.textInputFocus, ContextKeyExpr.and(CONTEXT_ACCESSIBILITY_MODE_ENABLED, IsWindowsContext)?.negate()),\n                primary: 2048 /* KeyMod.CtrlCmd */ | 17 /* KeyCode.RightArrow */,\n                mac: { primary: 512 /* KeyMod.Alt */ | 17 /* KeyCode.RightArrow */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n}\nclass CursorWordRight extends WordRightCommand {\n    constructor() {\n        super({\n            inSelectionMode: false,\n            wordNavigationType: 2 /* WordNavigationType.WordEnd */,\n            id: 'cursorWordRight',\n            precondition: undefined\n        });\n    }\n}\nclass CursorWordStartRightSelect extends WordRightCommand {\n    constructor() {\n        super({\n            inSelectionMode: true,\n            wordNavigationType: 0 /* WordNavigationType.WordStart */,\n            id: 'cursorWordStartRightSelect',\n            precondition: undefined\n        });\n    }\n}\nclass CursorWordEndRightSelect extends WordRightCommand {\n    constructor() {\n        super({\n            inSelectionMode: true,\n            wordNavigationType: 2 /* WordNavigationType.WordEnd */,\n            id: 'cursorWordEndRightSelect',\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: ContextKeyExpr.and(EditorContextKeys.textInputFocus, ContextKeyExpr.and(CONTEXT_ACCESSIBILITY_MODE_ENABLED, IsWindowsContext)?.negate()),\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 17 /* KeyCode.RightArrow */,\n                mac: { primary: 512 /* KeyMod.Alt */ | 1024 /* KeyMod.Shift */ | 17 /* KeyCode.RightArrow */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n}\nclass CursorWordRightSelect extends WordRightCommand {\n    constructor() {\n        super({\n            inSelectionMode: true,\n            wordNavigationType: 2 /* WordNavigationType.WordEnd */,\n            id: 'cursorWordRightSelect',\n            precondition: undefined\n        });\n    }\n}\nclass CursorWordAccessibilityRight extends WordRightCommand {\n    constructor() {\n        super({\n            inSelectionMode: false,\n            wordNavigationType: 3 /* WordNavigationType.WordAccessibility */,\n            id: 'cursorWordAccessibilityRight',\n            precondition: undefined\n        });\n    }\n    _move(wordCharacterClassifier, model, position, wordNavigationType, hasMulticursor) {\n        return super._move(getMapForWordSeparators(EditorOptions.wordSeparators.defaultValue, wordCharacterClassifier.intlSegmenterLocales), model, position, wordNavigationType, hasMulticursor);\n    }\n}\nclass CursorWordAccessibilityRightSelect extends WordRightCommand {\n    constructor() {\n        super({\n            inSelectionMode: true,\n            wordNavigationType: 3 /* WordNavigationType.WordAccessibility */,\n            id: 'cursorWordAccessibilityRightSelect',\n            precondition: undefined\n        });\n    }\n    _move(wordCharacterClassifier, model, position, wordNavigationType, hasMulticursor) {\n        return super._move(getMapForWordSeparators(EditorOptions.wordSeparators.defaultValue, wordCharacterClassifier.intlSegmenterLocales), model, position, wordNavigationType, hasMulticursor);\n    }\n}\nclass DeleteWordCommand extends EditorCommand {\n    constructor(opts) {\n        super({ canTriggerInlineEdits: true, ...opts });\n        this._whitespaceHeuristics = opts.whitespaceHeuristics;\n        this._wordNavigationType = opts.wordNavigationType;\n    }\n    runEditorCommand(accessor, editor, args) {\n        const languageConfigurationService = accessor?.get(ILanguageConfigurationService);\n        if (!editor.hasModel() || !languageConfigurationService) {\n            return;\n        }\n        const wordSeparators = getMapForWordSeparators(editor.getOption(148 /* EditorOption.wordSeparators */), editor.getOption(147 /* EditorOption.wordSegmenterLocales */));\n        const model = editor.getModel();\n        const selections = editor.getSelections();\n        const autoClosingBrackets = editor.getOption(10 /* EditorOption.autoClosingBrackets */);\n        const autoClosingQuotes = editor.getOption(15 /* EditorOption.autoClosingQuotes */);\n        const autoClosingPairs = languageConfigurationService.getLanguageConfiguration(model.getLanguageId()).getAutoClosingPairs();\n        const viewModel = editor._getViewModel();\n        const commands = selections.map((sel) => {\n            const deleteRange = this._delete({\n                wordSeparators,\n                model,\n                selection: sel,\n                whitespaceHeuristics: this._whitespaceHeuristics,\n                autoClosingDelete: editor.getOption(13 /* EditorOption.autoClosingDelete */),\n                autoClosingBrackets,\n                autoClosingQuotes,\n                autoClosingPairs,\n                autoClosedCharacters: viewModel.getCursorAutoClosedCharacters(),\n            }, this._wordNavigationType);\n            return new ReplaceCommand(deleteRange, '');\n        });\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, commands);\n        editor.pushUndoStop();\n    }\n}\nclass DeleteWordLeftCommand extends DeleteWordCommand {\n    _delete(ctx, wordNavigationType) {\n        const r = WordOperations.deleteWordLeft(ctx, wordNavigationType);\n        if (r) {\n            return r;\n        }\n        return new Range(1, 1, 1, 1);\n    }\n}\nclass DeleteWordRightCommand extends DeleteWordCommand {\n    _delete(ctx, wordNavigationType) {\n        const r = WordOperations.deleteWordRight(ctx, wordNavigationType);\n        if (r) {\n            return r;\n        }\n        const lineCount = ctx.model.getLineCount();\n        const maxColumn = ctx.model.getLineMaxColumn(lineCount);\n        return new Range(lineCount, maxColumn, lineCount, maxColumn);\n    }\n}\nclass DeleteWordStartLeft extends DeleteWordLeftCommand {\n    constructor() {\n        super({\n            whitespaceHeuristics: false,\n            wordNavigationType: 0 /* WordNavigationType.WordStart */,\n            id: 'deleteWordStartLeft',\n            precondition: EditorContextKeys.writable\n        });\n    }\n}\nclass DeleteWordEndLeft extends DeleteWordLeftCommand {\n    constructor() {\n        super({\n            whitespaceHeuristics: false,\n            wordNavigationType: 2 /* WordNavigationType.WordEnd */,\n            id: 'deleteWordEndLeft',\n            precondition: EditorContextKeys.writable\n        });\n    }\n}\nclass DeleteWordLeft extends DeleteWordLeftCommand {\n    constructor() {\n        super({\n            whitespaceHeuristics: true,\n            wordNavigationType: 0 /* WordNavigationType.WordStart */,\n            id: 'deleteWordLeft',\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1 /* KeyCode.Backspace */,\n                mac: { primary: 512 /* KeyMod.Alt */ | 1 /* KeyCode.Backspace */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n}\nclass DeleteWordStartRight extends DeleteWordRightCommand {\n    constructor() {\n        super({\n            whitespaceHeuristics: false,\n            wordNavigationType: 0 /* WordNavigationType.WordStart */,\n            id: 'deleteWordStartRight',\n            precondition: EditorContextKeys.writable\n        });\n    }\n}\nclass DeleteWordEndRight extends DeleteWordRightCommand {\n    constructor() {\n        super({\n            whitespaceHeuristics: false,\n            wordNavigationType: 2 /* WordNavigationType.WordEnd */,\n            id: 'deleteWordEndRight',\n            precondition: EditorContextKeys.writable\n        });\n    }\n}\nclass DeleteWordRight extends DeleteWordRightCommand {\n    constructor() {\n        super({\n            whitespaceHeuristics: true,\n            wordNavigationType: 2 /* WordNavigationType.WordEnd */,\n            id: 'deleteWordRight',\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 20 /* KeyCode.Delete */,\n                mac: { primary: 512 /* KeyMod.Alt */ | 20 /* KeyCode.Delete */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n}\nclass DeleteInsideWord extends EditorAction {\n    constructor() {\n        super({\n            id: 'deleteInsideWord',\n            precondition: EditorContextKeys.writable,\n            label: localize2(1575, \"Delete Word\"),\n        });\n    }\n    run(accessor, editor, args) {\n        if (!editor.hasModel()) {\n            return;\n        }\n        const wordSeparators = getMapForWordSeparators(editor.getOption(148 /* EditorOption.wordSeparators */), editor.getOption(147 /* EditorOption.wordSegmenterLocales */));\n        const model = editor.getModel();\n        const selections = editor.getSelections();\n        const commands = selections.map((sel) => {\n            const deleteRange = WordOperations.deleteInsideWord(wordSeparators, model, sel);\n            return new ReplaceCommand(deleteRange, '');\n        });\n        editor.pushUndoStop();\n        editor.executeCommands(this.id, commands);\n        editor.pushUndoStop();\n    }\n}\nregisterEditorCommand(new CursorWordStartLeft());\nregisterEditorCommand(new CursorWordEndLeft());\nregisterEditorCommand(new CursorWordLeft());\nregisterEditorCommand(new CursorWordStartLeftSelect());\nregisterEditorCommand(new CursorWordEndLeftSelect());\nregisterEditorCommand(new CursorWordLeftSelect());\nregisterEditorCommand(new CursorWordStartRight());\nregisterEditorCommand(new CursorWordEndRight());\nregisterEditorCommand(new CursorWordRight());\nregisterEditorCommand(new CursorWordStartRightSelect());\nregisterEditorCommand(new CursorWordEndRightSelect());\nregisterEditorCommand(new CursorWordRightSelect());\nregisterEditorCommand(new CursorWordAccessibilityLeft());\nregisterEditorCommand(new CursorWordAccessibilityLeftSelect());\nregisterEditorCommand(new CursorWordAccessibilityRight());\nregisterEditorCommand(new CursorWordAccessibilityRightSelect());\nregisterEditorCommand(new DeleteWordStartLeft());\nregisterEditorCommand(new DeleteWordEndLeft());\nregisterEditorCommand(new DeleteWordLeft());\nregisterEditorCommand(new DeleteWordStartRight());\nregisterEditorCommand(new DeleteWordEndRight());\nregisterEditorCommand(new DeleteWordRight());\nregisterEditorAction(DeleteInsideWord);\n\nexport { CursorWordAccessibilityLeft, CursorWordAccessibilityLeftSelect, CursorWordAccessibilityRight, CursorWordAccessibilityRightSelect, CursorWordEndLeft, CursorWordEndLeftSelect, CursorWordEndRight, CursorWordEndRightSelect, CursorWordLeft, CursorWordLeftSelect, CursorWordRight, CursorWordRightSelect, CursorWordStartLeft, CursorWordStartLeftSelect, CursorWordStartRight, CursorWordStartRightSelect, DeleteInsideWord, DeleteWordCommand, DeleteWordEndLeft, DeleteWordEndRight, DeleteWordLeft, DeleteWordLeftCommand, DeleteWordRight, DeleteWordRightCommand, DeleteWordStartLeft, DeleteWordStartRight, MoveWordCommand, WordLeftCommand, WordRightCommand };\n","import { registerEditorCommand } from '../../../browser/editorExtensions.js';\nimport { WordPartOperations } from '../../../common/cursor/cursorWordOperations.js';\nimport { Range } from '../../../common/core/range.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { DeleteWordCommand, MoveWordCommand } from '../../wordOperations/browser/wordOperations.js';\nimport { CommandsRegistry } from '../../../../platform/commands/common/commands.js';\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 *--------------------------------------------------------------------------------------------*/\nclass DeleteWordPartLeft extends DeleteWordCommand {\n    constructor() {\n        super({\n            whitespaceHeuristics: true,\n            wordNavigationType: 0 /* WordNavigationType.WordStart */,\n            id: 'deleteWordPartLeft',\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 0,\n                mac: { primary: 256 /* KeyMod.WinCtrl */ | 512 /* KeyMod.Alt */ | 1 /* KeyCode.Backspace */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    _delete(ctx, wordNavigationType) {\n        const r = WordPartOperations.deleteWordPartLeft(ctx);\n        if (r) {\n            return r;\n        }\n        return new Range(1, 1, 1, 1);\n    }\n}\nclass DeleteWordPartRight extends DeleteWordCommand {\n    constructor() {\n        super({\n            whitespaceHeuristics: true,\n            wordNavigationType: 2 /* WordNavigationType.WordEnd */,\n            id: 'deleteWordPartRight',\n            precondition: EditorContextKeys.writable,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 0,\n                mac: { primary: 256 /* KeyMod.WinCtrl */ | 512 /* KeyMod.Alt */ | 20 /* KeyCode.Delete */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    _delete(ctx, wordNavigationType) {\n        const r = WordPartOperations.deleteWordPartRight(ctx);\n        if (r) {\n            return r;\n        }\n        const lineCount = ctx.model.getLineCount();\n        const maxColumn = ctx.model.getLineMaxColumn(lineCount);\n        return new Range(lineCount, maxColumn, lineCount, maxColumn);\n    }\n}\nclass WordPartLeftCommand extends MoveWordCommand {\n    _move(wordSeparators, model, position, wordNavigationType, hasMulticursor) {\n        return WordPartOperations.moveWordPartLeft(wordSeparators, model, position, hasMulticursor);\n    }\n}\nclass CursorWordPartLeft extends WordPartLeftCommand {\n    constructor() {\n        super({\n            inSelectionMode: false,\n            wordNavigationType: 0 /* WordNavigationType.WordStart */,\n            id: 'cursorWordPartLeft',\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 0,\n                mac: { primary: 256 /* KeyMod.WinCtrl */ | 512 /* KeyMod.Alt */ | 15 /* KeyCode.LeftArrow */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n}\n// Register previous id for compatibility purposes\nCommandsRegistry.registerCommandAlias('cursorWordPartStartLeft', 'cursorWordPartLeft');\nclass CursorWordPartLeftSelect extends WordPartLeftCommand {\n    constructor() {\n        super({\n            inSelectionMode: true,\n            wordNavigationType: 0 /* WordNavigationType.WordStart */,\n            id: 'cursorWordPartLeftSelect',\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 0,\n                mac: { primary: 256 /* KeyMod.WinCtrl */ | 512 /* KeyMod.Alt */ | 1024 /* KeyMod.Shift */ | 15 /* KeyCode.LeftArrow */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n}\n// Register previous id for compatibility purposes\nCommandsRegistry.registerCommandAlias('cursorWordPartStartLeftSelect', 'cursorWordPartLeftSelect');\nclass WordPartRightCommand extends MoveWordCommand {\n    _move(wordSeparators, model, position, wordNavigationType, hasMulticursor) {\n        return WordPartOperations.moveWordPartRight(wordSeparators, model, position);\n    }\n}\nclass CursorWordPartRight extends WordPartRightCommand {\n    constructor() {\n        super({\n            inSelectionMode: false,\n            wordNavigationType: 2 /* WordNavigationType.WordEnd */,\n            id: 'cursorWordPartRight',\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 0,\n                mac: { primary: 256 /* KeyMod.WinCtrl */ | 512 /* KeyMod.Alt */ | 17 /* KeyCode.RightArrow */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n}\nclass CursorWordPartRightSelect extends WordPartRightCommand {\n    constructor() {\n        super({\n            inSelectionMode: true,\n            wordNavigationType: 2 /* WordNavigationType.WordEnd */,\n            id: 'cursorWordPartRightSelect',\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.textInputFocus,\n                primary: 0,\n                mac: { primary: 256 /* KeyMod.WinCtrl */ | 512 /* KeyMod.Alt */ | 1024 /* KeyMod.Shift */ | 17 /* KeyCode.RightArrow */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n}\nregisterEditorCommand(new DeleteWordPartLeft());\nregisterEditorCommand(new DeleteWordPartRight());\nregisterEditorCommand(new CursorWordPartLeft());\nregisterEditorCommand(new CursorWordPartLeftSelect());\nregisterEditorCommand(new CursorWordPartRight());\nregisterEditorCommand(new CursorWordPartRightSelect());\n\nexport { CursorWordPartLeft, CursorWordPartLeftSelect, CursorWordPartRight, CursorWordPartRightSelect, DeleteWordPartLeft, DeleteWordPartRight, WordPartLeftCommand, WordPartRightCommand };\n","import { MarkdownString } from '../../../../base/common/htmlContent.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { MessageController } from '../../message/browser/messageController.js';\nimport { localize } from '../../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ReadOnlyMessageController extends Disposable {\n    static { this.ID = 'editor.contrib.readOnlyMessageController'; }\n    constructor(editor) {\n        super();\n        this.editor = editor;\n        this._register(this.editor.onDidAttemptReadOnlyEdit(() => this._onDidAttemptReadOnlyEdit()));\n    }\n    _onDidAttemptReadOnlyEdit() {\n        const messageController = MessageController.get(this.editor);\n        if (messageController && this.editor.hasModel()) {\n            let message = this.editor.getOptions().get(105 /* EditorOption.readOnlyMessage */);\n            if (!message) {\n                if (this.editor.isSimpleWidget) {\n                    message = new MarkdownString(localize(1378, \"Cannot edit in read-only input\"));\n                }\n                else {\n                    message = new MarkdownString(localize(1379, \"Cannot edit in read-only editor\"));\n                }\n            }\n            messageController.showMessage(message, this.editor.getPosition());\n        }\n    }\n}\nregisterEditorContribution(ReadOnlyMessageController.ID, ReadOnlyMessageController, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */);\n\nexport { ReadOnlyMessageController };\n","import { reverseOrder, compareBy, numberComparator } from '../../../../base/common/arrays.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { HideUnchangedRegionsFeature } from '../../../browser/widget/diffEditor/features/hideUnchangedRegionsFeature.js';\nimport { DisposableCancellationTokenSource } from '../../../browser/widget/diffEditor/utils.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { IOutlineModelService } from '../../documentSymbols/browser/outlineModel.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { Event } from '../../../../base/common/event.js';\nimport { observableValue } from '../../../../base/common/observableInternal/observables/observableValue.js';\nimport { observableSignalFromEvent } from '../../../../base/common/observableInternal/observables/observableSignalFromEvent.js';\nimport { autorunWithStore } from '../../../../base/common/observableInternal/reactions/autorun.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet DiffEditorBreadcrumbsSource = class DiffEditorBreadcrumbsSource extends Disposable {\n    constructor(_textModel, _languageFeaturesService, _outlineModelService) {\n        super();\n        this._textModel = _textModel;\n        this._languageFeaturesService = _languageFeaturesService;\n        this._outlineModelService = _outlineModelService;\n        this._currentModel = observableValue(this, undefined);\n        const documentSymbolProviderChanged = observableSignalFromEvent('documentSymbolProvider.onDidChange', this._languageFeaturesService.documentSymbolProvider.onDidChange);\n        const textModelChanged = observableSignalFromEvent('_textModel.onDidChangeContent', Event.debounce(e => this._textModel.onDidChangeContent(e), () => undefined, 100));\n        this._register(autorunWithStore(async (reader, store) => {\n            documentSymbolProviderChanged.read(reader);\n            textModelChanged.read(reader);\n            const src = store.add(new DisposableCancellationTokenSource());\n            const model = await this._outlineModelService.getOrCreate(this._textModel, src.token);\n            if (store.isDisposed) {\n                return;\n            }\n            this._currentModel.set(model, undefined);\n        }));\n    }\n    getBreadcrumbItems(startRange, reader) {\n        const m = this._currentModel.read(reader);\n        if (!m) {\n            return [];\n        }\n        const symbols = m.asListOfDocumentSymbols()\n            .filter(s => startRange.contains(s.range.startLineNumber) && !startRange.contains(s.range.endLineNumber));\n        symbols.sort(reverseOrder(compareBy(s => s.range.endLineNumber - s.range.startLineNumber, numberComparator)));\n        return symbols.map(s => ({ name: s.name, kind: s.kind, startLineNumber: s.range.startLineNumber }));\n    }\n};\nDiffEditorBreadcrumbsSource = __decorate([\n    __param(1, ILanguageFeaturesService),\n    __param(2, IOutlineModelService)\n], DiffEditorBreadcrumbsSource);\nHideUnchangedRegionsFeature.setBreadcrumbsSourceFactory((textModel, instantiationService) => {\n    return instantiationService.createInstance(DiffEditorBreadcrumbsSource, textModel);\n});\n","import { h } from '../../../../base/browser/dom.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { MenuEntryActionViewItem } from '../../../../platform/actions/browser/menuEntryActionViewItem.js';\nimport { MenuWorkbenchToolBar } from '../../../../platform/actions/browser/toolbar.js';\nimport { MenuId, MenuItemAction, IMenuService } from '../../../../platform/actions/common/actions.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { observableCodeEditor } from '../../../browser/observableCodeEditor.js';\nimport { observableFromEvent } from '../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { autorun } from '../../../../base/common/observableInternal/reactions/autorun.js';\nimport { constObservable } from '../../../../base/common/observableInternal/observables/constObservable.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet FloatingEditorToolbar = class FloatingEditorToolbar extends Disposable {\n    static { this.ID = 'editor.contrib.floatingToolbar'; }\n    constructor(editor, instantiationService, keybindingService, menuService) {\n        super();\n        const editorObs = this._register(observableCodeEditor(editor));\n        const menu = this._register(menuService.createMenu(MenuId.EditorContent, editor.contextKeyService));\n        const menuIsEmptyObs = observableFromEvent(this, menu.onDidChange, () => menu.getActions().length === 0);\n        this._register(autorun(reader => {\n            const menuIsEmpty = menuIsEmptyObs.read(reader);\n            if (menuIsEmpty) {\n                return;\n            }\n            const container = h('div.floating-menu-overlay-widget');\n            // Set height explicitly to ensure that the floating menu element\n            // is rendered in the lower right corner at the correct position.\n            container.root.style.height = '28px';\n            // Toolbar\n            const toolbar = instantiationService.createInstance(MenuWorkbenchToolBar, container.root, MenuId.EditorContent, {\n                actionViewItemProvider: (action, options) => {\n                    if (!(action instanceof MenuItemAction)) {\n                        return undefined;\n                    }\n                    const keybinding = keybindingService.lookupKeybinding(action.id);\n                    if (!keybinding) {\n                        return undefined;\n                    }\n                    return instantiationService.createInstance(class extends MenuEntryActionViewItem {\n                        updateLabel() {\n                            if (this.options.label && this.label) {\n                                this.label.textContent = `${this._commandAction.label} (${keybinding.getLabel()})`;\n                            }\n                        }\n                    }, action, { ...options, keybindingNotRenderedWithLabel: true });\n                },\n                hiddenItemStrategy: 0 /* HiddenItemStrategy.Ignore */,\n                menuOptions: {\n                    shouldForwardArgs: true\n                },\n                telemetrySource: 'editor.overlayToolbar',\n                toolbarOptions: {\n                    primaryGroup: () => true,\n                    useSeparatorsInPrimaryActions: true\n                },\n            });\n            reader.store.add(toolbar);\n            reader.store.add(autorun(reader => {\n                const model = editorObs.model.read(reader);\n                toolbar.context = model?.uri;\n            }));\n            // Overlay widget\n            reader.store.add(editorObs.createOverlayWidget({\n                allowEditorOverflow: false,\n                domNode: container.root,\n                minContentWidthInPx: constObservable(0),\n                position: constObservable({\n                    preference: 1 /* OverlayWidgetPositionPreference.BOTTOM_RIGHT_CORNER */\n                })\n            }));\n        }));\n    }\n};\nFloatingEditorToolbar = __decorate([\n    __param(1, IInstantiationService),\n    __param(2, IKeybindingService),\n    __param(3, IMenuService)\n], FloatingEditorToolbar);\n\nexport { FloatingEditorToolbar };\n","import './floatingMenu.css';\nimport { registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { FloatingEditorToolbar } from './floatingMenu.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterEditorContribution(FloatingEditorToolbar.ID, FloatingEditorToolbar, 1 /* EditorContributionInstantiation.AfterFirstRender */);\n","import { localize } from '../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nvar InspectTokensNLS;\n(function (InspectTokensNLS) {\n    InspectTokensNLS.inspectTokensAction = localize(786, \"Developer: Inspect Tokens\");\n})(InspectTokensNLS || (InspectTokensNLS = {}));\nvar GoToLineNLS;\n(function (GoToLineNLS) {\n    GoToLineNLS.gotoLineActionLabel = localize(787, \"Go to Line/Column...\");\n})(GoToLineNLS || (GoToLineNLS = {}));\nvar QuickHelpNLS;\n(function (QuickHelpNLS) {\n    QuickHelpNLS.helpQuickAccessActionLabel = localize(788, \"Show all Quick Access Providers\");\n})(QuickHelpNLS || (QuickHelpNLS = {}));\nvar QuickCommandNLS;\n(function (QuickCommandNLS) {\n    QuickCommandNLS.quickCommandActionLabel = localize(789, \"Command Palette\");\n    QuickCommandNLS.quickCommandHelp = localize(790, \"Show And Run Commands\");\n})(QuickCommandNLS || (QuickCommandNLS = {}));\nvar QuickOutlineNLS;\n(function (QuickOutlineNLS) {\n    QuickOutlineNLS.quickOutlineActionLabel = localize(791, \"Go to Symbol...\");\n    QuickOutlineNLS.quickOutlineByCategoryActionLabel = localize(792, \"Go to Symbol by Category...\");\n})(QuickOutlineNLS || (QuickOutlineNLS = {}));\nvar StandaloneCodeEditorNLS;\n(function (StandaloneCodeEditorNLS) {\n    StandaloneCodeEditorNLS.editorViewAccessibleLabel = localize(793, \"Editor content\");\n})(StandaloneCodeEditorNLS || (StandaloneCodeEditorNLS = {}));\nvar ToggleHighContrastNLS;\n(function (ToggleHighContrastNLS) {\n    ToggleHighContrastNLS.toggleHighContrast = localize(794, \"Toggle High Contrast Theme\");\n})(ToggleHighContrastNLS || (ToggleHighContrastNLS = {}));\nvar StandaloneServicesNLS;\n(function (StandaloneServicesNLS) {\n    StandaloneServicesNLS.bulkEditServiceSummary = localize(795, \"Made {0} edits in {1} files\");\n})(StandaloneServicesNLS || (StandaloneServicesNLS = {}));\n\nexport { GoToLineNLS, InspectTokensNLS, QuickCommandNLS, QuickHelpNLS, QuickOutlineNLS, StandaloneCodeEditorNLS, StandaloneServicesNLS, ToggleHighContrastNLS };\n","import './iPadShowKeyboard.css';\nimport { addDisposableListener } from '../../../../base/browser/dom.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { isIOS } from '../../../../base/common/platform.js';\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 *--------------------------------------------------------------------------------------------*/\nclass IPadShowKeyboard extends Disposable {\n    static { this.ID = 'editor.contrib.iPadShowKeyboard'; }\n    constructor(editor) {\n        super();\n        this.editor = editor;\n        this.widget = null;\n        if (isIOS) {\n            this._register(editor.onDidChangeConfiguration(() => this.update()));\n            this.update();\n        }\n    }\n    update() {\n        const shouldHaveWidget = (!this.editor.getOption(104 /* EditorOption.readOnly */));\n        if (!this.widget && shouldHaveWidget) {\n            this.widget = new ShowKeyboardWidget(this.editor);\n        }\n        else if (this.widget && !shouldHaveWidget) {\n            this.widget.dispose();\n            this.widget = null;\n        }\n    }\n    dispose() {\n        super.dispose();\n        if (this.widget) {\n            this.widget.dispose();\n            this.widget = null;\n        }\n    }\n}\nclass ShowKeyboardWidget extends Disposable {\n    static { this.ID = 'editor.contrib.ShowKeyboardWidget'; }\n    constructor(editor) {\n        super();\n        this.editor = editor;\n        this._domNode = document.createElement('textarea');\n        this._domNode.className = 'iPadShowKeyboard';\n        this._register(addDisposableListener(this._domNode, 'touchstart', (e) => {\n            this.editor.focus();\n        }));\n        this._register(addDisposableListener(this._domNode, 'focus', (e) => {\n            this.editor.focus();\n        }));\n        this.editor.addOverlayWidget(this);\n    }\n    dispose() {\n        this.editor.removeOverlayWidget(this);\n        super.dispose();\n    }\n    // ----- IOverlayWidget API\n    getId() {\n        return ShowKeyboardWidget.ID;\n    }\n    getDomNode() {\n        return this._domNode;\n    }\n    getPosition() {\n        return {\n            preference: 1 /* OverlayWidgetPositionPreference.BOTTOM_RIGHT_CORNER */\n        };\n    }\n}\nregisterEditorContribution(IPadShowKeyboard.ID, IPadShowKeyboard, 3 /* EditorContributionInstantiation.Eventually */);\n\nexport { IPadShowKeyboard };\n","import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';\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 *--------------------------------------------------------------------------------------------*/\nconst IStandaloneThemeService = createDecorator('themeService');\n\nexport { IStandaloneThemeService };\n","import './inspectTokens.css';\nimport { reset, $, append } from '../../../../base/browser/dom.js';\nimport { Color } from '../../../../base/common/color.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { registerEditorContribution, registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { TokenizationRegistry } from '../../../common/languages.js';\nimport { TokenMetadata } from '../../../common/encodedTokenAttributes.js';\nimport { nullTokenizeEncoded, nullTokenize, NullState } from '../../../common/languages/nullTokenize.js';\nimport { ILanguageService } from '../../../common/languages/language.js';\nimport { IStandaloneThemeService } from '../../common/standaloneTheme.js';\nimport { InspectTokensNLS } from '../../../common/standaloneStrings.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar InspectTokensController_1;\nlet InspectTokensController = class InspectTokensController extends Disposable {\n    static { InspectTokensController_1 = this; }\n    static { this.ID = 'editor.contrib.inspectTokens'; }\n    static get(editor) {\n        return editor.getContribution(InspectTokensController_1.ID);\n    }\n    constructor(editor, standaloneColorService, languageService) {\n        super();\n        this._editor = editor;\n        this._languageService = languageService;\n        this._widget = null;\n        this._register(this._editor.onDidChangeModel((e) => this.stop()));\n        this._register(this._editor.onDidChangeModelLanguage((e) => this.stop()));\n        this._register(TokenizationRegistry.onDidChange((e) => this.stop()));\n        this._register(this._editor.onKeyUp((e) => e.keyCode === 9 /* KeyCode.Escape */ && this.stop()));\n    }\n    dispose() {\n        this.stop();\n        super.dispose();\n    }\n    launch() {\n        if (this._widget) {\n            return;\n        }\n        if (!this._editor.hasModel()) {\n            return;\n        }\n        this._widget = new InspectTokensWidget(this._editor, this._languageService);\n    }\n    stop() {\n        if (this._widget) {\n            this._widget.dispose();\n            this._widget = null;\n        }\n    }\n};\nInspectTokensController = InspectTokensController_1 = __decorate([\n    __param(1, IStandaloneThemeService),\n    __param(2, ILanguageService)\n], InspectTokensController);\nclass InspectTokens extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.inspectTokens',\n            label: InspectTokensNLS.inspectTokensAction,\n            alias: 'Developer: Inspect Tokens',\n            precondition: undefined\n        });\n    }\n    run(accessor, editor) {\n        const controller = InspectTokensController.get(editor);\n        controller?.launch();\n    }\n}\nfunction renderTokenText(tokenText) {\n    let result = '';\n    for (let charIndex = 0, len = tokenText.length; charIndex < len; charIndex++) {\n        const charCode = tokenText.charCodeAt(charIndex);\n        switch (charCode) {\n            case 9 /* CharCode.Tab */:\n                result += '\\u2192'; // &rarr;\n                break;\n            case 32 /* CharCode.Space */:\n                result += '\\u00B7'; // &middot;\n                break;\n            default:\n                result += String.fromCharCode(charCode);\n        }\n    }\n    return result;\n}\nfunction getSafeTokenizationSupport(languageIdCodec, languageId) {\n    const tokenizationSupport = TokenizationRegistry.get(languageId);\n    if (tokenizationSupport) {\n        return tokenizationSupport;\n    }\n    const encodedLanguageId = languageIdCodec.encodeLanguageId(languageId);\n    return {\n        getInitialState: () => NullState,\n        tokenize: (line, hasEOL, state) => nullTokenize(languageId, state),\n        tokenizeEncoded: (line, hasEOL, state) => nullTokenizeEncoded(encodedLanguageId, state)\n    };\n}\nclass InspectTokensWidget extends Disposable {\n    static { this._ID = 'editor.contrib.inspectTokensWidget'; }\n    constructor(editor, languageService) {\n        super();\n        // Editor.IContentWidget.allowEditorOverflow\n        this.allowEditorOverflow = true;\n        this._editor = editor;\n        this._languageService = languageService;\n        this._model = this._editor.getModel();\n        this._domNode = document.createElement('div');\n        this._domNode.className = 'tokens-inspect-widget';\n        this._tokenizationSupport = getSafeTokenizationSupport(this._languageService.languageIdCodec, this._model.getLanguageId());\n        this._compute(this._editor.getPosition());\n        this._register(this._editor.onDidChangeCursorPosition((e) => this._compute(this._editor.getPosition())));\n        this._editor.addContentWidget(this);\n    }\n    dispose() {\n        this._editor.removeContentWidget(this);\n        super.dispose();\n    }\n    getId() {\n        return InspectTokensWidget._ID;\n    }\n    _compute(position) {\n        const data = this._getTokensAtLine(position.lineNumber);\n        let token1Index = 0;\n        for (let i = data.tokens1.length - 1; i >= 0; i--) {\n            const t = data.tokens1[i];\n            if (position.column - 1 >= t.offset) {\n                token1Index = i;\n                break;\n            }\n        }\n        let token2Index = 0;\n        for (let i = (data.tokens2.length >>> 1); i >= 0; i--) {\n            if (position.column - 1 >= data.tokens2[(i << 1)]) {\n                token2Index = i;\n                break;\n            }\n        }\n        const lineContent = this._model.getLineContent(position.lineNumber);\n        let tokenText = '';\n        if (token1Index < data.tokens1.length) {\n            const tokenStartIndex = data.tokens1[token1Index].offset;\n            const tokenEndIndex = token1Index + 1 < data.tokens1.length ? data.tokens1[token1Index + 1].offset : lineContent.length;\n            tokenText = lineContent.substring(tokenStartIndex, tokenEndIndex);\n        }\n        reset(this._domNode, $('h2.tm-token', undefined, renderTokenText(tokenText), $('span.tm-token-length', undefined, `${tokenText.length} ${tokenText.length === 1 ? 'char' : 'chars'}`)));\n        append(this._domNode, $('hr.tokens-inspect-separator', { 'style': 'clear:both' }));\n        const metadata = (token2Index << 1) + 1 < data.tokens2.length ? this._decodeMetadata(data.tokens2[(token2Index << 1) + 1]) : null;\n        append(this._domNode, $('table.tm-metadata-table', undefined, $('tbody', undefined, $('tr', undefined, $('td.tm-metadata-key', undefined, 'language'), $('td.tm-metadata-value', undefined, `${metadata ? metadata.languageId : '-?-'}`)), $('tr', undefined, $('td.tm-metadata-key', undefined, 'token type'), $('td.tm-metadata-value', undefined, `${metadata ? this._tokenTypeToString(metadata.tokenType) : '-?-'}`)), $('tr', undefined, $('td.tm-metadata-key', undefined, 'font style'), $('td.tm-metadata-value', undefined, `${metadata ? this._fontStyleToString(metadata.fontStyle) : '-?-'}`)), $('tr', undefined, $('td.tm-metadata-key', undefined, 'foreground'), $('td.tm-metadata-value', undefined, `${metadata ? Color.Format.CSS.formatHex(metadata.foreground) : '-?-'}`)), $('tr', undefined, $('td.tm-metadata-key', undefined, 'background'), $('td.tm-metadata-value', undefined, `${metadata ? Color.Format.CSS.formatHex(metadata.background) : '-?-'}`)))));\n        append(this._domNode, $('hr.tokens-inspect-separator'));\n        if (token1Index < data.tokens1.length) {\n            append(this._domNode, $('span.tm-token-type', undefined, data.tokens1[token1Index].type));\n        }\n        this._editor.layoutContentWidget(this);\n    }\n    _decodeMetadata(metadata) {\n        const colorMap = TokenizationRegistry.getColorMap();\n        const languageId = TokenMetadata.getLanguageId(metadata);\n        const tokenType = TokenMetadata.getTokenType(metadata);\n        const fontStyle = TokenMetadata.getFontStyle(metadata);\n        const foreground = TokenMetadata.getForeground(metadata);\n        const background = TokenMetadata.getBackground(metadata);\n        return {\n            languageId: this._languageService.languageIdCodec.decodeLanguageId(languageId),\n            tokenType: tokenType,\n            fontStyle: fontStyle,\n            foreground: colorMap[foreground],\n            background: colorMap[background]\n        };\n    }\n    _tokenTypeToString(tokenType) {\n        switch (tokenType) {\n            case 0 /* StandardTokenType.Other */: return 'Other';\n            case 1 /* StandardTokenType.Comment */: return 'Comment';\n            case 2 /* StandardTokenType.String */: return 'String';\n            case 3 /* StandardTokenType.RegEx */: return 'RegEx';\n            default: return '??';\n        }\n    }\n    _fontStyleToString(fontStyle) {\n        let r = '';\n        if (fontStyle & 1 /* FontStyle.Italic */) {\n            r += 'italic ';\n        }\n        if (fontStyle & 2 /* FontStyle.Bold */) {\n            r += 'bold ';\n        }\n        if (fontStyle & 4 /* FontStyle.Underline */) {\n            r += 'underline ';\n        }\n        if (fontStyle & 8 /* FontStyle.Strikethrough */) {\n            r += 'strikethrough ';\n        }\n        if (r.length === 0) {\n            r = '---';\n        }\n        return r;\n    }\n    _getTokensAtLine(lineNumber) {\n        const stateBeforeLine = this._getStateBeforeLine(lineNumber);\n        const tokenizationResult1 = this._tokenizationSupport.tokenize(this._model.getLineContent(lineNumber), true, stateBeforeLine);\n        const tokenizationResult2 = this._tokenizationSupport.tokenizeEncoded(this._model.getLineContent(lineNumber), true, stateBeforeLine);\n        return {\n            startState: stateBeforeLine,\n            tokens1: tokenizationResult1.tokens,\n            tokens2: tokenizationResult2.tokens,\n            endState: tokenizationResult1.endState\n        };\n    }\n    _getStateBeforeLine(lineNumber) {\n        let state = this._tokenizationSupport.getInitialState();\n        for (let i = 1; i < lineNumber; i++) {\n            const tokenizationResult = this._tokenizationSupport.tokenize(this._model.getLineContent(i), true, state);\n            state = tokenizationResult.endState;\n        }\n        return state;\n    }\n    getDomNode() {\n        return this._domNode;\n    }\n    getPosition() {\n        return {\n            position: this._editor.getPosition(),\n            preference: [2 /* ContentWidgetPositionPreference.BELOW */, 1 /* ContentWidgetPositionPreference.ABOVE */]\n        };\n    }\n}\nregisterEditorContribution(InspectTokensController.ID, InspectTokensController, 4 /* EditorContributionInstantiation.Lazy */);\nregisterEditorAction(InspectTokens);\n","import { coalesce } from '../../../base/common/arrays.js';\nimport { toDisposable } from '../../../base/common/lifecycle.js';\nimport { Registry } from '../../registry/common/platform.js';\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 *--------------------------------------------------------------------------------------------*/\nvar DefaultQuickAccessFilterValue;\n(function (DefaultQuickAccessFilterValue) {\n    /**\n     * Keep the value as it is given to quick access.\n     */\n    DefaultQuickAccessFilterValue[DefaultQuickAccessFilterValue[\"PRESERVE\"] = 0] = \"PRESERVE\";\n    /**\n     * Use the value that was used last time something was accepted from the picker.\n     */\n    DefaultQuickAccessFilterValue[DefaultQuickAccessFilterValue[\"LAST\"] = 1] = \"LAST\";\n})(DefaultQuickAccessFilterValue || (DefaultQuickAccessFilterValue = {}));\nconst Extensions = {\n    Quickaccess: 'workbench.contributions.quickaccess'\n};\nclass QuickAccessRegistry {\n    constructor() {\n        this.providers = [];\n        this.defaultProvider = undefined;\n    }\n    registerQuickAccessProvider(provider) {\n        // Extract the default provider when no prefix is present\n        if (provider.prefix.length === 0) {\n            this.defaultProvider = provider;\n        }\n        else {\n            this.providers.push(provider);\n        }\n        // sort the providers by decreasing prefix length, such that longer\n        // prefixes take priority: 'ext' vs 'ext install' - the latter should win\n        this.providers.sort((providerA, providerB) => providerB.prefix.length - providerA.prefix.length);\n        return toDisposable(() => {\n            this.providers.splice(this.providers.indexOf(provider), 1);\n            if (this.defaultProvider === provider) {\n                this.defaultProvider = undefined;\n            }\n        });\n    }\n    getQuickAccessProviders() {\n        return coalesce([this.defaultProvider, ...this.providers]);\n    }\n    getQuickAccessProvider(prefix) {\n        const result = prefix ? (this.providers.find(provider => prefix.startsWith(provider.prefix)) || undefined) : undefined;\n        return result || this.defaultProvider;\n    }\n}\nRegistry.add(Extensions.Quickaccess, new QuickAccessRegistry());\n\nexport { DefaultQuickAccessFilterValue, Extensions, QuickAccessRegistry };\n","import { localize } from '../../../nls.js';\nimport { Registry } from '../../registry/common/platform.js';\nimport { DisposableStore } from '../../../base/common/lifecycle.js';\nimport { IKeybindingService } from '../../keybinding/common/keybinding.js';\nimport { Extensions } from '../common/quickAccess.js';\nimport { IQuickInputService } from '../common/quickInput.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar HelpQuickAccessProvider_1;\nlet HelpQuickAccessProvider = class HelpQuickAccessProvider {\n    static { HelpQuickAccessProvider_1 = this; }\n    static { this.PREFIX = '?'; }\n    constructor(quickInputService, keybindingService) {\n        this.quickInputService = quickInputService;\n        this.keybindingService = keybindingService;\n        this.registry = Registry.as(Extensions.Quickaccess);\n    }\n    provide(picker) {\n        const disposables = new DisposableStore();\n        // Open a picker with the selected value if picked\n        disposables.add(picker.onDidAccept(() => {\n            const [item] = picker.selectedItems;\n            if (item) {\n                this.quickInputService.quickAccess.show(item.prefix, { preserveValue: true });\n            }\n        }));\n        // Also open a picker when we detect the user typed the exact\n        // name of a provider (e.g. `?term` for terminals)\n        disposables.add(picker.onDidChangeValue(value => {\n            const providerDescriptor = this.registry.getQuickAccessProvider(value.substr(HelpQuickAccessProvider_1.PREFIX.length));\n            if (providerDescriptor && providerDescriptor.prefix && providerDescriptor.prefix !== HelpQuickAccessProvider_1.PREFIX) {\n                this.quickInputService.quickAccess.show(providerDescriptor.prefix, { preserveValue: true });\n            }\n        }));\n        // Fill in all providers\n        picker.items = this.getQuickAccessProviders().filter(p => p.prefix !== HelpQuickAccessProvider_1.PREFIX);\n        return disposables;\n    }\n    getQuickAccessProviders() {\n        const providers = this.registry\n            .getQuickAccessProviders()\n            .sort((providerA, providerB) => providerA.prefix.localeCompare(providerB.prefix))\n            .flatMap(provider => this.createPicks(provider));\n        return providers;\n    }\n    createPicks(provider) {\n        return provider.helpEntries.map(helpEntry => {\n            const prefix = helpEntry.prefix || provider.prefix;\n            const label = prefix || '\\u2026' /* ... */;\n            return {\n                prefix,\n                label,\n                keybinding: helpEntry.commandId ? this.keybindingService.lookupKeybinding(helpEntry.commandId) : undefined,\n                ariaLabel: localize(1747, \"{0}, {1}\", label, helpEntry.description),\n                description: helpEntry.description\n            };\n        });\n    }\n};\nHelpQuickAccessProvider = HelpQuickAccessProvider_1 = __decorate([\n    __param(0, IQuickInputService),\n    __param(1, IKeybindingService)\n], HelpQuickAccessProvider);\n\nexport { HelpQuickAccessProvider };\n","import { Registry } from '../../../../platform/registry/common/platform.js';\nimport { Extensions } from '../../../../platform/quickinput/common/quickAccess.js';\nimport { QuickHelpNLS } from '../../../common/standaloneStrings.js';\nimport { HelpQuickAccessProvider } from '../../../../platform/quickinput/browser/helpQuickAccess.js';\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 *--------------------------------------------------------------------------------------------*/\nRegistry.as(Extensions.Quickaccess).registerQuickAccessProvider({\n    ctor: HelpQuickAccessProvider,\n    prefix: '',\n    helpEntries: [{ description: QuickHelpNLS.helpQuickAccessActionLabel }]\n});\n","import { createSingleCallFunction } from '../../../../base/common/functional.js';\nimport { DisposableStore, MutableDisposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { getCodeEditor, isDiffEditor } from '../../../browser/editorBrowser.js';\nimport { OverviewRulerLane } from '../../../common/model.js';\nimport { overviewRulerRangeHighlight } from '../../../common/core/editorColorRegistry.js';\nimport { themeColorFromId } from '../../../../platform/theme/common/themeService.js';\nimport { status } from '../../../../base/browser/ui/aria/aria.js';\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/**\n * A reusable quick access provider for the editor with support\n * for adding decorations for navigating in the currently active file\n * (for example \"Go to line\", \"Go to symbol\").\n */\nclass AbstractEditorNavigationQuickAccessProvider {\n    constructor(options) {\n        this.options = options;\n        //#endregion\n        //#region Decorations Utils\n        this.rangeHighlightDecorationId = undefined;\n    }\n    //#region Provider methods\n    provide(picker, token, runOptions) {\n        const disposables = new DisposableStore();\n        // Apply options if any\n        picker.canAcceptInBackground = !!this.options?.canAcceptInBackground;\n        // Disable filtering & sorting, we control the results\n        picker.matchOnLabel = picker.matchOnDescription = picker.matchOnDetail = picker.sortByLabel = false;\n        // Provide based on current active editor\n        const pickerDisposable = disposables.add(new MutableDisposable());\n        pickerDisposable.value = this.doProvide(picker, token, runOptions);\n        // Re-create whenever the active editor changes\n        disposables.add(this.onDidActiveTextEditorControlChange(() => {\n            // Clear old\n            pickerDisposable.value = undefined;\n            // Add new\n            pickerDisposable.value = this.doProvide(picker, token);\n        }));\n        return disposables;\n    }\n    doProvide(picker, token, runOptions) {\n        const disposables = new DisposableStore();\n        // With text control\n        const editor = this.activeTextEditorControl;\n        if (editor && this.canProvideWithTextEditor(editor)) {\n            const context = { editor };\n            // Restore any view state if this picker was closed\n            // without actually going to a line\n            const codeEditor = getCodeEditor(editor);\n            if (codeEditor) {\n                // Remember view state and update it when the cursor position\n                // changes even later because it could be that the user has\n                // configured quick access to remain open when focus is lost and\n                // we always want to restore the current location.\n                let lastKnownEditorViewState = editor.saveViewState() ?? undefined;\n                disposables.add(codeEditor.onDidChangeCursorPosition(() => {\n                    lastKnownEditorViewState = editor.saveViewState() ?? undefined;\n                }));\n                context.restoreViewState = () => {\n                    if (lastKnownEditorViewState && editor === this.activeTextEditorControl) {\n                        editor.restoreViewState(lastKnownEditorViewState);\n                    }\n                };\n                disposables.add(createSingleCallFunction(token.onCancellationRequested)(() => context.restoreViewState?.()));\n            }\n            // Clean up decorations on dispose\n            disposables.add(toDisposable(() => this.clearDecorations(editor)));\n            // Ask subclass for entries\n            disposables.add(this.provideWithTextEditor(context, picker, token, runOptions));\n        }\n        // Without text control\n        else {\n            disposables.add(this.provideWithoutTextEditor(picker, token));\n        }\n        return disposables;\n    }\n    /**\n     * Subclasses to implement if they can operate on the text editor.\n     */\n    canProvideWithTextEditor(editor) {\n        return true;\n    }\n    gotoLocation({ editor }, options) {\n        editor.setSelection(options.range, \"code.jump\" /* TextEditorSelectionSource.JUMP */);\n        editor.revealRangeInCenter(options.range, 0 /* ScrollType.Smooth */);\n        if (!options.preserveFocus) {\n            editor.focus();\n        }\n        const model = editor.getModel();\n        if (model && 'getLineContent' in model) {\n            status(`${model.getLineContent(options.range.startLineNumber)}`);\n        }\n    }\n    getModel(editor) {\n        return isDiffEditor(editor) ?\n            editor.getModel()?.modified :\n            editor.getModel();\n    }\n    addDecorations(editor, range) {\n        editor.changeDecorations(changeAccessor => {\n            // Reset old decorations if any\n            const deleteDecorations = [];\n            if (this.rangeHighlightDecorationId) {\n                deleteDecorations.push(this.rangeHighlightDecorationId.overviewRulerDecorationId);\n                deleteDecorations.push(this.rangeHighlightDecorationId.rangeHighlightId);\n                this.rangeHighlightDecorationId = undefined;\n            }\n            // Add new decorations for the range\n            const newDecorations = [\n                // highlight the entire line on the range\n                {\n                    range,\n                    options: {\n                        description: 'quick-access-range-highlight',\n                        className: 'rangeHighlight',\n                        isWholeLine: true\n                    }\n                },\n                // also add overview ruler highlight\n                {\n                    range,\n                    options: {\n                        description: 'quick-access-range-highlight-overview',\n                        overviewRuler: {\n                            color: themeColorFromId(overviewRulerRangeHighlight),\n                            position: OverviewRulerLane.Full\n                        }\n                    }\n                }\n            ];\n            const [rangeHighlightId, overviewRulerDecorationId] = changeAccessor.deltaDecorations(deleteDecorations, newDecorations);\n            this.rangeHighlightDecorationId = { rangeHighlightId, overviewRulerDecorationId };\n        });\n    }\n    clearDecorations(editor) {\n        const rangeHighlightDecorationId = this.rangeHighlightDecorationId;\n        if (rangeHighlightDecorationId) {\n            editor.changeDecorations(changeAccessor => {\n                changeAccessor.deltaDecorations([\n                    rangeHighlightDecorationId.overviewRulerDecorationId,\n                    rangeHighlightDecorationId.rangeHighlightId\n                ], []);\n            });\n            this.rangeHighlightDecorationId = undefined;\n        }\n    }\n}\n\nexport { AbstractEditorNavigationQuickAccessProvider };\n","import { Toggle } from '../../../../base/browser/ui/toggle/toggle.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { Disposable, DisposableStore, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { localize } from '../../../../nls.js';\nimport { inputActiveOptionBackground, inputActiveOptionForeground, inputActiveOptionBorder } from '../../../../platform/theme/common/colors/inputColors.js';\nimport { asCssVariable } from '../../../../platform/theme/common/colorUtils.js';\nimport { getCodeEditor } from '../../../browser/editorBrowser.js';\nimport { AbstractEditorNavigationQuickAccessProvider } from './editorNavigationQuickAccess.js';\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 *--------------------------------------------------------------------------------------------*/\nclass AbstractGotoLineQuickAccessProvider extends AbstractEditorNavigationQuickAccessProvider {\n    static { this.PREFIX = ':'; }\n    static { this.ZERO_BASED_OFFSET_STORAGE_KEY = 'gotoLine.useZeroBasedOffset'; }\n    constructor() {\n        super({ canAcceptInBackground: true });\n    }\n    get useZeroBasedOffset() {\n        return this.storageService.getBoolean(AbstractGotoLineQuickAccessProvider.ZERO_BASED_OFFSET_STORAGE_KEY, -1 /* StorageScope.APPLICATION */, false);\n    }\n    set useZeroBasedOffset(value) {\n        this.storageService.store(AbstractGotoLineQuickAccessProvider.ZERO_BASED_OFFSET_STORAGE_KEY, value, -1 /* StorageScope.APPLICATION */, 0 /* StorageTarget.USER */);\n    }\n    provideWithoutTextEditor(picker) {\n        const label = localize(1335, \"Open a text editor first to go to a line.\");\n        picker.items = [{ label }];\n        picker.ariaLabel = label;\n        return Disposable.None;\n    }\n    provideWithTextEditor(context, picker, token) {\n        const editor = context.editor;\n        const disposables = new DisposableStore();\n        // Goto line once picked\n        disposables.add(picker.onDidAccept(event => {\n            const [item] = picker.selectedItems;\n            if (item) {\n                if (!item.lineNumber) {\n                    return;\n                }\n                this.gotoLocation(context, { range: this.toRange(item.lineNumber, item.column), keyMods: picker.keyMods, preserveFocus: event.inBackground });\n                if (!event.inBackground) {\n                    picker.hide();\n                }\n            }\n        }));\n        // React to picker changes\n        const updatePickerAndEditor = () => {\n            const inputText = picker.value.trim().substring(AbstractGotoLineQuickAccessProvider.PREFIX.length);\n            const { inOffsetMode, lineNumber, column, label } = this.parsePosition(editor, inputText);\n            // Show toggle only when input text starts with '::'.\n            toggle.visible = !!inOffsetMode;\n            // Picker\n            picker.items = [{\n                    lineNumber,\n                    column,\n                    label,\n                }];\n            // ARIA Label\n            picker.ariaLabel = label;\n            // Clear decorations for invalid range\n            if (!lineNumber) {\n                this.clearDecorations(editor);\n                return;\n            }\n            // Reveal\n            const range = this.toRange(lineNumber, column);\n            editor.revealRangeInCenter(range, 0 /* ScrollType.Smooth */);\n            // Decorate\n            this.addDecorations(editor, range);\n        };\n        // Add a toggle to switch between 1- and 0-based offsets.\n        const toggle = new Toggle({\n            title: localize(1336, \"Use Zero-Based Offset\"),\n            icon: Codicon.indexZero,\n            isChecked: this.useZeroBasedOffset,\n            inputActiveOptionBorder: asCssVariable(inputActiveOptionBorder),\n            inputActiveOptionForeground: asCssVariable(inputActiveOptionForeground),\n            inputActiveOptionBackground: asCssVariable(inputActiveOptionBackground)\n        });\n        disposables.add(toggle.onChange(() => {\n            this.useZeroBasedOffset = !this.useZeroBasedOffset;\n            updatePickerAndEditor();\n        }));\n        picker.toggles = [toggle];\n        updatePickerAndEditor();\n        disposables.add(picker.onDidChangeValue(() => updatePickerAndEditor()));\n        // Adjust line number visibility as needed\n        const codeEditor = getCodeEditor(editor);\n        if (codeEditor) {\n            const options = codeEditor.getOptions();\n            const lineNumbers = options.get(76 /* EditorOption.lineNumbers */);\n            if (lineNumbers.renderType === 2 /* RenderLineNumbersType.Relative */) {\n                codeEditor.updateOptions({ lineNumbers: 'on' });\n                disposables.add(toDisposable(() => codeEditor.updateOptions({ lineNumbers: 'relative' })));\n            }\n        }\n        return disposables;\n    }\n    toRange(lineNumber = 1, column = 1) {\n        return {\n            startLineNumber: lineNumber,\n            startColumn: column,\n            endLineNumber: lineNumber,\n            endColumn: column\n        };\n    }\n    parsePosition(editor, value) {\n        const model = this.getModel(editor);\n        if (!model) {\n            return {\n                label: localize(1337, \"Open a text editor first to go to a line.\")\n            };\n        }\n        // Support ::<offset> notation to navigate to a specific offset in the model.\n        if (value.startsWith(':')) {\n            let offset = parseInt(value.substring(1), 10);\n            const maxOffset = model.getValueLength();\n            if (isNaN(offset)) {\n                // No valid offset specified.\n                return {\n                    inOffsetMode: true,\n                    label: this.useZeroBasedOffset ?\n                        localize(1338, \"Type a character position to go to (from 0 to {0}).\", maxOffset - 1) :\n                        localize(1339, \"Type a character position to go to (from 1 to {0}).\", maxOffset)\n                };\n            }\n            else {\n                const reverse = offset < 0;\n                if (!this.useZeroBasedOffset) {\n                    // Convert 1-based offset to model's 0-based.\n                    offset -= Math.sign(offset);\n                }\n                if (reverse) {\n                    // Offset from the end of the buffer\n                    offset += maxOffset;\n                }\n                const pos = model.getPositionAt(offset);\n                return {\n                    ...pos,\n                    inOffsetMode: true,\n                    label: localize(1340, \"Press 'Enter' to go to line {0} at column {1}.\", pos.lineNumber, pos.column)\n                };\n            }\n        }\n        else {\n            // Support line-col formats of `line,col`, `line:col`, `line#col`\n            const parts = value.split(/,|:|#/);\n            const maxLine = model.getLineCount();\n            let lineNumber = parseInt(parts[0]?.trim(), 10);\n            if (parts.length < 1 || isNaN(lineNumber)) {\n                return {\n                    label: localize(1341, \"Type a line number to go to (from 1 to {0}).\", maxLine)\n                };\n            }\n            // Handle negative line numbers and clip to valid range.\n            lineNumber = lineNumber >= 0 ? lineNumber : (maxLine + 1) + lineNumber;\n            lineNumber = Math.min(Math.max(1, lineNumber), maxLine);\n            const maxColumn = model.getLineMaxColumn(lineNumber);\n            let column = parseInt(parts[1]?.trim(), 10);\n            if (parts.length < 2 || isNaN(column)) {\n                return {\n                    lineNumber,\n                    column: 1,\n                    label: parts.length < 2 ?\n                        localize(1342, \"Press 'Enter' to go to line {0} or enter : to add a column number.\", lineNumber) :\n                        localize(1343, \"Press 'Enter' to go to line {0} or enter a column number (from 1 to {1}).\", lineNumber, maxColumn)\n                };\n            }\n            // Handle negative column numbers and clip to valid range.\n            column = column >= 0 ? column : maxColumn + column;\n            column = Math.min(Math.max(1, column), maxColumn);\n            return {\n                lineNumber,\n                column,\n                label: localize(1344, \"Press 'Enter' to go to line {0} at column {1}.\", lineNumber, column)\n            };\n        }\n    }\n}\n\nexport { AbstractGotoLineQuickAccessProvider };\n","import { AbstractGotoLineQuickAccessProvider } from '../../../contrib/quickAccess/browser/gotoLineQuickAccess.js';\nimport { Registry } from '../../../../platform/registry/common/platform.js';\nimport { Extensions } from '../../../../platform/quickinput/common/quickAccess.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { GoToLineNLS } from '../../../common/standaloneStrings.js';\nimport { Event } from '../../../../base/common/event.js';\nimport { EditorAction, registerEditorAction } from '../../../browser/editorExtensions.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { IQuickInputService } from '../../../../platform/quickinput/common/quickInput.js';\nimport { IStorageService } from '../../../../platform/storage/common/storage.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet StandaloneGotoLineQuickAccessProvider = class StandaloneGotoLineQuickAccessProvider extends AbstractGotoLineQuickAccessProvider {\n    constructor(editorService, storageService) {\n        super();\n        this.editorService = editorService;\n        this.storageService = storageService;\n        this.onDidActiveTextEditorControlChange = Event.None;\n    }\n    get activeTextEditorControl() {\n        return this.editorService.getFocusedCodeEditor() ?? undefined;\n    }\n};\nStandaloneGotoLineQuickAccessProvider = __decorate([\n    __param(0, ICodeEditorService),\n    __param(1, IStorageService)\n], StandaloneGotoLineQuickAccessProvider);\nclass GotoLineAction extends EditorAction {\n    static { this.ID = 'editor.action.gotoLine'; }\n    constructor() {\n        super({\n            id: GotoLineAction.ID,\n            label: GoToLineNLS.gotoLineActionLabel,\n            alias: 'Go to Line/Column...',\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.focus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 37 /* KeyCode.KeyG */,\n                mac: { primary: 256 /* KeyMod.WinCtrl */ | 37 /* KeyCode.KeyG */ },\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            }\n        });\n    }\n    run(accessor) {\n        accessor.get(IQuickInputService).quickAccess.show(StandaloneGotoLineQuickAccessProvider.PREFIX);\n    }\n}\nregisterEditorAction(GotoLineAction);\nRegistry.as(Extensions.Quickaccess).registerQuickAccessProvider({\n    ctor: StandaloneGotoLineQuickAccessProvider,\n    prefix: StandaloneGotoLineQuickAccessProvider.PREFIX,\n    helpEntries: [{ description: GoToLineNLS.gotoLineActionLabel, commandId: GotoLineAction.ID }]\n});\n\nexport { GotoLineAction, StandaloneGotoLineQuickAccessProvider };\n","import { fuzzyScore, createMatches } from './filters.js';\nimport { sep } from './path.js';\nimport { isWindows } from './platform.js';\n\nconst NO_SCORE2 = [undefined, []];\nfunction scoreFuzzy2(target, query, patternStart = 0, wordStart = 0) {\n    // Score: multiple inputs\n    const preparedQuery = query;\n    if (preparedQuery.values && preparedQuery.values.length > 1) {\n        return doScoreFuzzy2Multiple(target, preparedQuery.values, patternStart, wordStart);\n    }\n    // Score: single input\n    return doScoreFuzzy2Single(target, query, patternStart, wordStart);\n}\nfunction doScoreFuzzy2Multiple(target, query, patternStart, wordStart) {\n    let totalScore = 0;\n    const totalMatches = [];\n    for (const queryPiece of query) {\n        const [score, matches] = doScoreFuzzy2Single(target, queryPiece, patternStart, wordStart);\n        if (typeof score !== 'number') {\n            // if a single query value does not match, return with\n            // no score entirely, we require all queries to match\n            return NO_SCORE2;\n        }\n        totalScore += score;\n        totalMatches.push(...matches);\n    }\n    // if we have a score, ensure that the positions are\n    // sorted in ascending order and distinct\n    return [totalScore, normalizeMatches(totalMatches)];\n}\nfunction doScoreFuzzy2Single(target, query, patternStart, wordStart) {\n    const score = fuzzyScore(query.original, query.originalLowercase, patternStart, target, target.toLowerCase(), wordStart, { firstMatchCanBeWeak: true, boostFullMatch: true });\n    if (!score) {\n        return NO_SCORE2;\n    }\n    return [score[0], createMatches(score)];\n}\nfunction normalizeMatches(matches) {\n    // sort matches by start to be able to normalize\n    const sortedMatches = matches.sort((matchA, matchB) => {\n        return matchA.start - matchB.start;\n    });\n    // merge matches that overlap\n    const normalizedMatches = [];\n    let currentMatch = undefined;\n    for (const match of sortedMatches) {\n        // if we have no current match or the matches\n        // do not overlap, we take it as is and remember\n        // it for future merging\n        if (!currentMatch || !matchOverlaps(currentMatch, match)) {\n            currentMatch = match;\n            normalizedMatches.push(match);\n        }\n        // otherwise we merge the matches\n        else {\n            currentMatch.start = Math.min(currentMatch.start, match.start);\n            currentMatch.end = Math.max(currentMatch.end, match.end);\n        }\n    }\n    return normalizedMatches;\n}\nfunction matchOverlaps(matchA, matchB) {\n    if (matchA.end < matchB.start) {\n        return false; // A ends before B starts\n    }\n    if (matchB.end < matchA.start) {\n        return false; // B ends before A starts\n    }\n    return true;\n}\n/*\n * If a query is wrapped in quotes, the user does not want to\n * use fuzzy search for this query.\n */\nfunction queryExpectsExactMatch(query) {\n    return query.startsWith('\"') && query.endsWith('\"');\n}\n/**\n * Helper function to prepare a search value for scoring by removing unwanted characters\n * and allowing to score on multiple pieces separated by whitespace character.\n */\nconst MULTIPLE_QUERY_VALUES_SEPARATOR = ' ';\nfunction prepareQuery(original) {\n    if (typeof original !== 'string') {\n        original = '';\n    }\n    const originalLowercase = original.toLowerCase();\n    const { pathNormalized, normalized, normalizedLowercase } = normalizeQuery(original);\n    const containsPathSeparator = pathNormalized.indexOf(sep) >= 0;\n    const expectExactMatch = queryExpectsExactMatch(original);\n    let values = undefined;\n    const originalSplit = original.split(MULTIPLE_QUERY_VALUES_SEPARATOR);\n    if (originalSplit.length > 1) {\n        for (const originalPiece of originalSplit) {\n            const expectExactMatchPiece = queryExpectsExactMatch(originalPiece);\n            const { pathNormalized: pathNormalizedPiece, normalized: normalizedPiece, normalizedLowercase: normalizedLowercasePiece } = normalizeQuery(originalPiece);\n            if (normalizedPiece) {\n                if (!values) {\n                    values = [];\n                }\n                values.push({\n                    original: originalPiece,\n                    originalLowercase: originalPiece.toLowerCase(),\n                    pathNormalized: pathNormalizedPiece,\n                    normalized: normalizedPiece,\n                    normalizedLowercase: normalizedLowercasePiece,\n                    expectContiguousMatch: expectExactMatchPiece\n                });\n            }\n        }\n    }\n    return { original, originalLowercase, pathNormalized, normalized, normalizedLowercase, values, containsPathSeparator, expectContiguousMatch: expectExactMatch };\n}\nfunction normalizeQuery(original) {\n    let pathNormalized;\n    if (isWindows) {\n        pathNormalized = original.replace(/\\//g, sep); // Help Windows users to search for paths when using slash\n    }\n    else {\n        pathNormalized = original.replace(/\\\\/g, sep); // Help macOS/Linux users to search for paths when using backslash\n    }\n    // remove certain characters that help find better results:\n    // - quotes: are used for exact match search\n    // - wildcards: are used for fuzzy matching\n    // - whitespace: are used to separate queries\n    // - ellipsis: sometimes used to indicate any path segments\n    const normalized = pathNormalized.replace(/[\\*\\u2026\\s\"]/g, '');\n    return {\n        pathNormalized,\n        normalized,\n        normalizedLowercase: normalized.toLowerCase()\n    };\n}\nfunction pieceToQuery(arg1) {\n    if (Array.isArray(arg1)) {\n        return prepareQuery(arg1.map(piece => piece.original).join(MULTIPLE_QUERY_VALUES_SEPARATOR));\n    }\n    return prepareQuery(arg1.original);\n}\n//#endregion\n\nexport { pieceToQuery, prepareQuery, scoreFuzzy2 };\n","import { DeferredPromise } from '../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\nimport { pieceToQuery, scoreFuzzy2, prepareQuery } from '../../../../base/common/fuzzyScorer.js';\nimport { Disposable, DisposableStore, toDisposable, MutableDisposable } from '../../../../base/common/lifecycle.js';\nimport { trim, format } from '../../../../base/common/strings.js';\nimport { Range } from '../../../common/core/range.js';\nimport { SymbolKinds, getAriaLabelForSymbol } from '../../../common/languages.js';\nimport { IOutlineModelService } from '../../documentSymbols/browser/outlineModel.js';\nimport { AbstractEditorNavigationQuickAccessProvider } from './editorNavigationQuickAccess.js';\nimport { localize } from '../../../../nls.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { findLast } from '../../../../base/common/arraysFind.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar AbstractGotoSymbolQuickAccessProvider_1;\nlet AbstractGotoSymbolQuickAccessProvider = class AbstractGotoSymbolQuickAccessProvider extends AbstractEditorNavigationQuickAccessProvider {\n    static { AbstractGotoSymbolQuickAccessProvider_1 = this; }\n    static { this.PREFIX = '@'; }\n    static { this.SCOPE_PREFIX = ':'; }\n    static { this.PREFIX_BY_CATEGORY = `${this.PREFIX}${this.SCOPE_PREFIX}`; }\n    constructor(_languageFeaturesService, _outlineModelService, options = Object.create(null)) {\n        super(options);\n        this._languageFeaturesService = _languageFeaturesService;\n        this._outlineModelService = _outlineModelService;\n        this.options = options;\n        this.options.canAcceptInBackground = true;\n    }\n    provideWithoutTextEditor(picker) {\n        this.provideLabelPick(picker, localize(1345, \"To go to a symbol, first open a text editor with symbol information.\"));\n        return Disposable.None;\n    }\n    provideWithTextEditor(context, picker, token, runOptions) {\n        const editor = context.editor;\n        const model = this.getModel(editor);\n        if (!model) {\n            return Disposable.None;\n        }\n        // Provide symbols from model if available in registry\n        if (this._languageFeaturesService.documentSymbolProvider.has(model)) {\n            return this.doProvideWithEditorSymbols(context, model, picker, token, runOptions);\n        }\n        // Otherwise show an entry for a model without registry\n        // But give a chance to resolve the symbols at a later\n        // point if possible\n        return this.doProvideWithoutEditorSymbols(context, model, picker, token);\n    }\n    doProvideWithoutEditorSymbols(context, model, picker, token) {\n        const disposables = new DisposableStore();\n        // Generic pick for not having any symbol information\n        this.provideLabelPick(picker, localize(1346, \"The active text editor does not provide symbol information.\"));\n        // Wait for changes to the registry and see if eventually\n        // we do get symbols. This can happen if the picker is opened\n        // very early after the model has loaded but before the\n        // language registry is ready.\n        // https://github.com/microsoft/vscode/issues/70607\n        (async () => {\n            const result = await this.waitForLanguageSymbolRegistry(model, disposables);\n            if (!result || token.isCancellationRequested) {\n                return;\n            }\n            disposables.add(this.doProvideWithEditorSymbols(context, model, picker, token));\n        })();\n        return disposables;\n    }\n    provideLabelPick(picker, label) {\n        picker.items = [{ label, index: 0, kind: 14 /* SymbolKind.String */ }];\n        picker.ariaLabel = label;\n    }\n    async waitForLanguageSymbolRegistry(model, disposables) {\n        if (this._languageFeaturesService.documentSymbolProvider.has(model)) {\n            return true;\n        }\n        const symbolProviderRegistryPromise = new DeferredPromise();\n        // Resolve promise when registry knows model\n        const symbolProviderListener = disposables.add(this._languageFeaturesService.documentSymbolProvider.onDidChange(() => {\n            if (this._languageFeaturesService.documentSymbolProvider.has(model)) {\n                symbolProviderListener.dispose();\n                symbolProviderRegistryPromise.complete(true);\n            }\n        }));\n        // Resolve promise when we get disposed too\n        disposables.add(toDisposable(() => symbolProviderRegistryPromise.complete(false)));\n        return symbolProviderRegistryPromise.p;\n    }\n    doProvideWithEditorSymbols(context, model, picker, token, runOptions) {\n        const editor = context.editor;\n        const disposables = new DisposableStore();\n        // Goto symbol once picked\n        disposables.add(picker.onDidAccept(event => {\n            const [item] = picker.selectedItems;\n            if (item && item.range) {\n                this.gotoLocation(context, { range: item.range.selection, keyMods: picker.keyMods, preserveFocus: event.inBackground });\n                runOptions?.handleAccept?.(item, event.inBackground);\n                if (!event.inBackground) {\n                    picker.hide();\n                }\n            }\n        }));\n        // Goto symbol side by side if enabled\n        disposables.add(picker.onDidTriggerItemButton(({ item }) => {\n            if (item && item.range) {\n                this.gotoLocation(context, { range: item.range.selection, keyMods: picker.keyMods, forceSideBySide: true });\n                picker.hide();\n            }\n        }));\n        // Resolve symbols from document once and reuse this\n        // request for all filtering and typing then on\n        const symbolsPromise = this.getDocumentSymbols(model, token);\n        // Set initial picks and update on type\n        const picksCts = disposables.add(new MutableDisposable());\n        const updatePickerItems = async (positionToEnclose) => {\n            // Cancel any previous ask for picks and busy\n            picksCts?.value?.cancel();\n            picker.busy = false;\n            // Create new cancellation source for this run\n            picksCts.value = new CancellationTokenSource();\n            // Collect symbol picks\n            picker.busy = true;\n            try {\n                const query = prepareQuery(picker.value.substr(AbstractGotoSymbolQuickAccessProvider_1.PREFIX.length).trim());\n                const items = await this.doGetSymbolPicks(symbolsPromise, query, undefined, picksCts.value.token, model);\n                if (token.isCancellationRequested) {\n                    return;\n                }\n                if (items.length > 0) {\n                    picker.items = items;\n                    if (positionToEnclose && query.original.length === 0) {\n                        const candidate = findLast(items, item => Boolean(item.type !== 'separator' && item.range && Range.containsPosition(item.range.decoration, positionToEnclose)));\n                        if (candidate) {\n                            picker.activeItems = [candidate];\n                        }\n                    }\n                }\n                else {\n                    if (query.original.length > 0) {\n                        this.provideLabelPick(picker, localize(1347, \"No matching editor symbols\"));\n                    }\n                    else {\n                        this.provideLabelPick(picker, localize(1348, \"No editor symbols\"));\n                    }\n                }\n            }\n            finally {\n                if (!token.isCancellationRequested) {\n                    picker.busy = false;\n                }\n            }\n        };\n        disposables.add(picker.onDidChangeValue(() => updatePickerItems(undefined)));\n        updatePickerItems(editor.getSelection()?.getPosition());\n        // Reveal and decorate when active item changes\n        disposables.add(picker.onDidChangeActive(() => {\n            const [item] = picker.activeItems;\n            if (item && item.range) {\n                // Reveal\n                editor.revealRangeInCenter(item.range.selection, 0 /* ScrollType.Smooth */);\n                // Decorate\n                this.addDecorations(editor, item.range.decoration);\n            }\n        }));\n        return disposables;\n    }\n    async doGetSymbolPicks(symbolsPromise, query, options, token, model) {\n        const symbols = await symbolsPromise;\n        if (token.isCancellationRequested) {\n            return [];\n        }\n        const filterBySymbolKind = query.original.indexOf(AbstractGotoSymbolQuickAccessProvider_1.SCOPE_PREFIX) === 0;\n        const filterPos = filterBySymbolKind ? 1 : 0;\n        // Split between symbol and container query\n        let symbolQuery;\n        let containerQuery;\n        if (query.values && query.values.length > 1) {\n            symbolQuery = pieceToQuery(query.values[0]); // symbol: only match on first part\n            containerQuery = pieceToQuery(query.values.slice(1)); // container: match on all but first parts\n        }\n        else {\n            symbolQuery = query;\n        }\n        // Convert to symbol picks and apply filtering\n        let buttons;\n        const openSideBySideDirection = this.options?.openSideBySideDirection?.();\n        if (openSideBySideDirection) {\n            buttons = [{\n                    iconClass: openSideBySideDirection === 'right' ? ThemeIcon.asClassName(Codicon.splitHorizontal) : ThemeIcon.asClassName(Codicon.splitVertical),\n                    tooltip: openSideBySideDirection === 'right' ? localize(1349, \"Open to the Side\") : localize(1350, \"Open to the Bottom\")\n                }];\n        }\n        const filteredSymbolPicks = [];\n        for (let index = 0; index < symbols.length; index++) {\n            const symbol = symbols[index];\n            const symbolLabel = trim(symbol.name);\n            const symbolLabelWithIcon = `$(${SymbolKinds.toIcon(symbol.kind).id}) ${symbolLabel}`;\n            const symbolLabelIconOffset = symbolLabelWithIcon.length - symbolLabel.length;\n            let containerLabel = symbol.containerName;\n            if (options?.extraContainerLabel) {\n                if (containerLabel) {\n                    containerLabel = `${options.extraContainerLabel} • ${containerLabel}`;\n                }\n                else {\n                    containerLabel = options.extraContainerLabel;\n                }\n            }\n            let symbolScore = undefined;\n            let symbolMatches = undefined;\n            let containerScore = undefined;\n            let containerMatches = undefined;\n            if (query.original.length > filterPos) {\n                // First: try to score on the entire query, it is possible that\n                // the symbol matches perfectly (e.g. searching for \"change log\"\n                // can be a match on a markdown symbol \"change log\"). In that\n                // case we want to skip the container query altogether.\n                let skipContainerQuery = false;\n                if (symbolQuery !== query) {\n                    [symbolScore, symbolMatches] = scoreFuzzy2(symbolLabelWithIcon, { ...query, values: undefined /* disable multi-query support */ }, filterPos, symbolLabelIconOffset);\n                    if (typeof symbolScore === 'number') {\n                        skipContainerQuery = true; // since we consumed the query, skip any container matching\n                    }\n                }\n                // Otherwise: score on the symbol query and match on the container later\n                if (typeof symbolScore !== 'number') {\n                    [symbolScore, symbolMatches] = scoreFuzzy2(symbolLabelWithIcon, symbolQuery, filterPos, symbolLabelIconOffset);\n                    if (typeof symbolScore !== 'number') {\n                        continue;\n                    }\n                }\n                // Score by container if specified\n                if (!skipContainerQuery && containerQuery) {\n                    if (containerLabel && containerQuery.original.length > 0) {\n                        [containerScore, containerMatches] = scoreFuzzy2(containerLabel, containerQuery);\n                    }\n                    if (typeof containerScore !== 'number') {\n                        continue;\n                    }\n                    if (typeof symbolScore === 'number') {\n                        symbolScore += containerScore; // boost symbolScore by containerScore\n                    }\n                }\n            }\n            const deprecated = symbol.tags && symbol.tags.indexOf(1 /* SymbolTag.Deprecated */) >= 0;\n            filteredSymbolPicks.push({\n                index,\n                kind: symbol.kind,\n                score: symbolScore,\n                label: symbolLabelWithIcon,\n                ariaLabel: getAriaLabelForSymbol(symbol.name, symbol.kind),\n                description: containerLabel,\n                highlights: deprecated ? undefined : {\n                    label: symbolMatches,\n                    description: containerMatches\n                },\n                range: {\n                    selection: Range.collapseToStart(symbol.selectionRange),\n                    decoration: symbol.range\n                },\n                uri: model.uri,\n                symbolName: symbolLabel,\n                strikethrough: deprecated,\n                buttons\n            });\n        }\n        // Sort by score\n        const sortedFilteredSymbolPicks = filteredSymbolPicks.sort((symbolA, symbolB) => filterBySymbolKind ?\n            this.compareByKindAndScore(symbolA, symbolB) :\n            this.compareByScore(symbolA, symbolB));\n        // Add separator for types\n        // - @  only total number of symbols\n        // - @: grouped by symbol kind\n        let symbolPicks = [];\n        if (filterBySymbolKind) {\n            let lastSymbolKind = undefined;\n            let lastSeparator = undefined;\n            let lastSymbolKindCounter = 0;\n            function updateLastSeparatorLabel() {\n                if (lastSeparator && typeof lastSymbolKind === 'number' && lastSymbolKindCounter > 0) {\n                    lastSeparator.label = format(NLS_SYMBOL_KIND_CACHE[lastSymbolKind] || FALLBACK_NLS_SYMBOL_KIND, lastSymbolKindCounter);\n                }\n            }\n            for (const symbolPick of sortedFilteredSymbolPicks) {\n                // Found new kind\n                if (lastSymbolKind !== symbolPick.kind) {\n                    // Update last separator with number of symbols we found for kind\n                    updateLastSeparatorLabel();\n                    lastSymbolKind = symbolPick.kind;\n                    lastSymbolKindCounter = 1;\n                    // Add new separator for new kind\n                    lastSeparator = { type: 'separator' };\n                    symbolPicks.push(lastSeparator);\n                }\n                // Existing kind, keep counting\n                else {\n                    lastSymbolKindCounter++;\n                }\n                // Add to final result\n                symbolPicks.push(symbolPick);\n            }\n            // Update last separator with number of symbols we found for kind\n            updateLastSeparatorLabel();\n        }\n        else if (sortedFilteredSymbolPicks.length > 0) {\n            symbolPicks = [\n                { label: localize(1351, \"symbols ({0})\", filteredSymbolPicks.length), type: 'separator' },\n                ...sortedFilteredSymbolPicks\n            ];\n        }\n        return symbolPicks;\n    }\n    compareByScore(symbolA, symbolB) {\n        if (typeof symbolA.score !== 'number' && typeof symbolB.score === 'number') {\n            return 1;\n        }\n        else if (typeof symbolA.score === 'number' && typeof symbolB.score !== 'number') {\n            return -1;\n        }\n        if (typeof symbolA.score === 'number' && typeof symbolB.score === 'number') {\n            if (symbolA.score > symbolB.score) {\n                return -1;\n            }\n            else if (symbolA.score < symbolB.score) {\n                return 1;\n            }\n        }\n        if (symbolA.index < symbolB.index) {\n            return -1;\n        }\n        else if (symbolA.index > symbolB.index) {\n            return 1;\n        }\n        return 0;\n    }\n    compareByKindAndScore(symbolA, symbolB) {\n        const kindA = NLS_SYMBOL_KIND_CACHE[symbolA.kind] || FALLBACK_NLS_SYMBOL_KIND;\n        const kindB = NLS_SYMBOL_KIND_CACHE[symbolB.kind] || FALLBACK_NLS_SYMBOL_KIND;\n        // Sort by type first if scoped search\n        const result = kindA.localeCompare(kindB);\n        if (result === 0) {\n            return this.compareByScore(symbolA, symbolB);\n        }\n        return result;\n    }\n    async getDocumentSymbols(document, token) {\n        const model = await this._outlineModelService.getOrCreate(document, token);\n        return token.isCancellationRequested ? [] : model.asListOfDocumentSymbols();\n    }\n};\nAbstractGotoSymbolQuickAccessProvider = AbstractGotoSymbolQuickAccessProvider_1 = __decorate([\n    __param(0, ILanguageFeaturesService),\n    __param(1, IOutlineModelService)\n], AbstractGotoSymbolQuickAccessProvider);\n// #region NLS Helpers\nconst FALLBACK_NLS_SYMBOL_KIND = localize(1352, \"properties ({0})\");\nconst NLS_SYMBOL_KIND_CACHE = {\n    [5 /* SymbolKind.Method */]: localize(1353, \"methods ({0})\"),\n    [11 /* SymbolKind.Function */]: localize(1354, \"functions ({0})\"),\n    [8 /* SymbolKind.Constructor */]: localize(1355, \"constructors ({0})\"),\n    [12 /* SymbolKind.Variable */]: localize(1356, \"variables ({0})\"),\n    [4 /* SymbolKind.Class */]: localize(1357, \"classes ({0})\"),\n    [22 /* SymbolKind.Struct */]: localize(1358, \"structs ({0})\"),\n    [23 /* SymbolKind.Event */]: localize(1359, \"events ({0})\"),\n    [24 /* SymbolKind.Operator */]: localize(1360, \"operators ({0})\"),\n    [10 /* SymbolKind.Interface */]: localize(1361, \"interfaces ({0})\"),\n    [2 /* SymbolKind.Namespace */]: localize(1362, \"namespaces ({0})\"),\n    [3 /* SymbolKind.Package */]: localize(1363, \"packages ({0})\"),\n    [25 /* SymbolKind.TypeParameter */]: localize(1364, \"type parameters ({0})\"),\n    [1 /* SymbolKind.Module */]: localize(1365, \"modules ({0})\"),\n    [6 /* SymbolKind.Property */]: localize(1366, \"properties ({0})\"),\n    [9 /* SymbolKind.Enum */]: localize(1367, \"enumerations ({0})\"),\n    [21 /* SymbolKind.EnumMember */]: localize(1368, \"enumeration members ({0})\"),\n    [14 /* SymbolKind.String */]: localize(1369, \"strings ({0})\"),\n    [0 /* SymbolKind.File */]: localize(1370, \"files ({0})\"),\n    [17 /* SymbolKind.Array */]: localize(1371, \"arrays ({0})\"),\n    [15 /* SymbolKind.Number */]: localize(1372, \"numbers ({0})\"),\n    [16 /* SymbolKind.Boolean */]: localize(1373, \"booleans ({0})\"),\n    [18 /* SymbolKind.Object */]: localize(1374, \"objects ({0})\"),\n    [19 /* SymbolKind.Key */]: localize(1375, \"keys ({0})\"),\n    [7 /* SymbolKind.Field */]: localize(1376, \"fields ({0})\"),\n    [13 /* SymbolKind.Constant */]: localize(1377, \"constants ({0})\")\n};\n//#endregion\n\nexport { AbstractGotoSymbolQuickAccessProvider };\n","import '../../../../base/browser/ui/codicons/codicon/codicon.css';\nimport '../../../../base/browser/ui/codicons/codicon/codicon-modifiers.css';\nimport '../../../contrib/symbolIcons/browser/symbolIcons.js';\nimport { AbstractGotoSymbolQuickAccessProvider } from '../../../contrib/quickAccess/browser/gotoSymbolQuickAccess.js';\nimport { Registry } from '../../../../platform/registry/common/platform.js';\nimport { Extensions } from '../../../../platform/quickinput/common/quickAccess.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { QuickOutlineNLS } from '../../../common/standaloneStrings.js';\nimport { Event } from '../../../../base/common/event.js';\nimport { EditorAction, registerEditorAction } from '../../../browser/editorExtensions.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { IQuickInputService, ItemActivation } from '../../../../platform/quickinput/common/quickInput.js';\nimport { IOutlineModelService } from '../../../contrib/documentSymbols/browser/outlineModel.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet StandaloneGotoSymbolQuickAccessProvider = class StandaloneGotoSymbolQuickAccessProvider extends AbstractGotoSymbolQuickAccessProvider {\n    constructor(editorService, languageFeaturesService, outlineModelService) {\n        super(languageFeaturesService, outlineModelService);\n        this.editorService = editorService;\n        this.onDidActiveTextEditorControlChange = Event.None;\n    }\n    get activeTextEditorControl() {\n        return this.editorService.getFocusedCodeEditor() ?? undefined;\n    }\n};\nStandaloneGotoSymbolQuickAccessProvider = __decorate([\n    __param(0, ICodeEditorService),\n    __param(1, ILanguageFeaturesService),\n    __param(2, IOutlineModelService)\n], StandaloneGotoSymbolQuickAccessProvider);\nclass GotoSymbolAction extends EditorAction {\n    static { this.ID = 'editor.action.quickOutline'; }\n    constructor() {\n        super({\n            id: GotoSymbolAction.ID,\n            label: QuickOutlineNLS.quickOutlineActionLabel,\n            alias: 'Go to Symbol...',\n            precondition: EditorContextKeys.hasDocumentSymbolProvider,\n            kbOpts: {\n                kbExpr: EditorContextKeys.focus,\n                primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 45 /* KeyCode.KeyO */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            contextMenuOpts: {\n                group: 'navigation',\n                order: 3\n            }\n        });\n    }\n    run(accessor) {\n        accessor.get(IQuickInputService).quickAccess.show(AbstractGotoSymbolQuickAccessProvider.PREFIX, { itemActivation: ItemActivation.NONE });\n    }\n}\nregisterEditorAction(GotoSymbolAction);\nRegistry.as(Extensions.Quickaccess).registerQuickAccessProvider({\n    ctor: StandaloneGotoSymbolQuickAccessProvider,\n    prefix: AbstractGotoSymbolQuickAccessProvider.PREFIX,\n    helpEntries: [\n        { description: QuickOutlineNLS.quickOutlineActionLabel, prefix: AbstractGotoSymbolQuickAccessProvider.PREFIX, commandId: GotoSymbolAction.ID },\n        { description: QuickOutlineNLS.quickOutlineByCategoryActionLabel, prefix: AbstractGotoSymbolQuickAccessProvider.PREFIX_BY_CATEGORY }\n    ]\n});\n\nexport { GotoSymbolAction, StandaloneGotoSymbolQuickAccessProvider };\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 *--------------------------------------------------------------------------------------------*/\nfunction countMapFrom(values) {\n    const map = new Map();\n    for (const value of values) {\n        map.set(value, (map.get(value) ?? 0) + 1);\n    }\n    return map;\n}\n/**\n * Implementation of tf-idf (term frequency-inverse document frequency) for a set of\n * documents where each document contains one or more chunks of text.\n * Each document is identified by a key, and the score for each document is computed\n * by taking the max score over all the chunks in the document.\n */\nclass TfIdfCalculator {\n    constructor() {\n        /**\n         * Total number of chunks\n         */\n        this.chunkCount = 0;\n        this.chunkOccurrences = new Map();\n        this.documents = new Map();\n    }\n    calculateScores(query, token) {\n        const embedding = this.computeEmbedding(query);\n        const idfCache = new Map();\n        const scores = [];\n        // For each document, generate one score\n        for (const [key, doc] of this.documents) {\n            if (token.isCancellationRequested) {\n                return [];\n            }\n            for (const chunk of doc.chunks) {\n                const score = this.computeSimilarityScore(chunk, embedding, idfCache);\n                if (score > 0) {\n                    scores.push({ key, score });\n                }\n            }\n        }\n        return scores;\n    }\n    /**\n     * Count how many times each term (word) appears in a string.\n     */\n    static termFrequencies(input) {\n        return countMapFrom(TfIdfCalculator.splitTerms(input));\n    }\n    /**\n     * Break a string into terms (words).\n     */\n    static *splitTerms(input) {\n        const normalize = (word) => word.toLowerCase();\n        // Only match on words that are at least 3 characters long and start with a letter\n        for (const [word] of input.matchAll(/\\b\\p{Letter}[\\p{Letter}\\d]{2,}\\b/gu)) {\n            yield normalize(word);\n            const camelParts = word.replace(/([a-z])([A-Z])/g, '$1 $2').split(/\\s+/g);\n            if (camelParts.length > 1) {\n                for (const part of camelParts) {\n                    // Require at least 3 letters in the parts of a camel case word\n                    if (part.length > 2 && /\\p{Letter}{3,}/gu.test(part)) {\n                        yield normalize(part);\n                    }\n                }\n            }\n        }\n    }\n    updateDocuments(documents) {\n        for (const { key } of documents) {\n            this.deleteDocument(key);\n        }\n        for (const doc of documents) {\n            const chunks = [];\n            for (const text of doc.textChunks) {\n                // TODO: See if we can compute the tf lazily\n                // The challenge is that we need to also update the `chunkOccurrences`\n                // and all of those updates need to get flushed before the real TF-IDF of\n                // anything is computed.\n                const tf = TfIdfCalculator.termFrequencies(text);\n                // Update occurrences list\n                for (const term of tf.keys()) {\n                    this.chunkOccurrences.set(term, (this.chunkOccurrences.get(term) ?? 0) + 1);\n                }\n                chunks.push({ text, tf });\n            }\n            this.chunkCount += chunks.length;\n            this.documents.set(doc.key, { chunks });\n        }\n        return this;\n    }\n    deleteDocument(key) {\n        const doc = this.documents.get(key);\n        if (!doc) {\n            return;\n        }\n        this.documents.delete(key);\n        this.chunkCount -= doc.chunks.length;\n        // Update term occurrences for the document\n        for (const chunk of doc.chunks) {\n            for (const term of chunk.tf.keys()) {\n                const currentOccurrences = this.chunkOccurrences.get(term);\n                if (typeof currentOccurrences === 'number') {\n                    const newOccurrences = currentOccurrences - 1;\n                    if (newOccurrences <= 0) {\n                        this.chunkOccurrences.delete(term);\n                    }\n                    else {\n                        this.chunkOccurrences.set(term, newOccurrences);\n                    }\n                }\n            }\n        }\n    }\n    computeSimilarityScore(chunk, queryEmbedding, idfCache) {\n        // Compute the dot product between the chunk's embedding and the query embedding\n        // Note that the chunk embedding is computed lazily on a per-term basis.\n        // This lets us skip a large number of calculations because the majority\n        // of chunks do not share any terms with the query.\n        let sum = 0;\n        for (const [term, termTfidf] of Object.entries(queryEmbedding)) {\n            const chunkTf = chunk.tf.get(term);\n            if (!chunkTf) {\n                // Term does not appear in chunk so it has no contribution\n                continue;\n            }\n            let chunkIdf = idfCache.get(term);\n            if (typeof chunkIdf !== 'number') {\n                chunkIdf = this.computeIdf(term);\n                idfCache.set(term, chunkIdf);\n            }\n            const chunkTfidf = chunkTf * chunkIdf;\n            sum += chunkTfidf * termTfidf;\n        }\n        return sum;\n    }\n    computeEmbedding(input) {\n        const tf = TfIdfCalculator.termFrequencies(input);\n        return this.computeTfidf(tf);\n    }\n    computeIdf(term) {\n        const chunkOccurrences = this.chunkOccurrences.get(term) ?? 0;\n        return chunkOccurrences > 0\n            ? Math.log((this.chunkCount + 1) / chunkOccurrences)\n            : 0;\n    }\n    computeTfidf(termFrequencies) {\n        const embedding = Object.create(null);\n        for (const [word, occurrences] of termFrequencies) {\n            const idf = this.computeIdf(word);\n            if (idf > 0) {\n                embedding[word] = occurrences * idf;\n            }\n        }\n        return embedding;\n    }\n}\n/**\n * Normalize the scores to be between 0 and 1 and sort them decending.\n * @param scores array of scores from {@link TfIdfCalculator.calculateScores}\n * @returns normalized scores\n */\nfunction normalizeTfIdfScores(scores) {\n    // copy of scores\n    const result = scores.slice(0);\n    // sort descending\n    result.sort((a, b) => b.score - a.score);\n    // normalize\n    const max = result[0]?.score ?? 0;\n    if (max > 0) {\n        for (const score of result) {\n            score.score /= max;\n        }\n    }\n    return result;\n}\n\nexport { TfIdfCalculator, normalizeTfIdfScores };\n","import { timeout } from '../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../base/common/cancellation.js';\nimport { Disposable, DisposableStore, MutableDisposable } from '../../../base/common/lifecycle.js';\nimport { isFunction } from '../../../base/common/types.js';\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 *--------------------------------------------------------------------------------------------*/\nvar TriggerAction;\n(function (TriggerAction) {\n    /**\n     * Do nothing after the button was clicked.\n     */\n    TriggerAction[TriggerAction[\"NO_ACTION\"] = 0] = \"NO_ACTION\";\n    /**\n     * Close the picker.\n     */\n    TriggerAction[TriggerAction[\"CLOSE_PICKER\"] = 1] = \"CLOSE_PICKER\";\n    /**\n     * Update the results of the picker.\n     */\n    TriggerAction[TriggerAction[\"REFRESH_PICKER\"] = 2] = \"REFRESH_PICKER\";\n    /**\n     * Remove the item from the picker.\n     */\n    TriggerAction[TriggerAction[\"REMOVE_ITEM\"] = 3] = \"REMOVE_ITEM\";\n})(TriggerAction || (TriggerAction = {}));\nfunction isPicksWithActive(obj) {\n    const candidate = obj;\n    return Array.isArray(candidate.items);\n}\nfunction isFastAndSlowPicks(obj) {\n    const candidate = obj;\n    return !!candidate.picks && candidate.additionalPicks instanceof Promise;\n}\nclass PickerQuickAccessProvider extends Disposable {\n    constructor(prefix, options) {\n        super();\n        this.prefix = prefix;\n        this.options = options;\n    }\n    provide(picker, token, runOptions) {\n        const disposables = new DisposableStore();\n        // Apply options if any\n        picker.canAcceptInBackground = !!this.options?.canAcceptInBackground;\n        // Disable filtering & sorting, we control the results\n        picker.matchOnLabel = picker.matchOnDescription = picker.matchOnDetail = picker.sortByLabel = false;\n        // Set initial picks and update on type\n        let picksCts = undefined;\n        const picksDisposable = disposables.add(new MutableDisposable());\n        const updatePickerItems = async () => {\n            // Cancel any previous ask for picks and busy\n            picksCts?.dispose(true);\n            picker.busy = false;\n            // Setting the .value will call dispose() on the previous value, so we need to do this AFTER cancelling with dispose(true).\n            const picksDisposables = picksDisposable.value = new DisposableStore();\n            // Create new cancellation source for this run\n            picksCts = picksDisposables.add(new CancellationTokenSource(token));\n            // Collect picks and support both long running and short or combined\n            const picksToken = picksCts.token;\n            let picksFilter = picker.value.substring(this.prefix.length);\n            if (!this.options?.shouldSkipTrimPickFilter) {\n                picksFilter = picksFilter.trim();\n            }\n            const providedPicks = this._getPicks(picksFilter, picksDisposables, picksToken, runOptions);\n            const applyPicks = (picks, skipEmpty) => {\n                let items;\n                let activeItem = undefined;\n                if (isPicksWithActive(picks)) {\n                    items = picks.items;\n                    activeItem = picks.active;\n                }\n                else {\n                    items = picks;\n                }\n                if (items.length === 0) {\n                    if (skipEmpty) {\n                        return false;\n                    }\n                    // We show the no results pick if we have no input to prevent completely empty pickers #172613\n                    if ((picksFilter.length > 0 || picker.hideInput) && this.options?.noResultsPick) {\n                        if (isFunction(this.options.noResultsPick)) {\n                            items = [this.options.noResultsPick(picksFilter)];\n                        }\n                        else {\n                            items = [this.options.noResultsPick];\n                        }\n                    }\n                }\n                picker.items = items;\n                if (activeItem) {\n                    picker.activeItems = [activeItem];\n                }\n                return true;\n            };\n            const applyFastAndSlowPicks = async (fastAndSlowPicks) => {\n                let fastPicksApplied = false;\n                let slowPicksApplied = false;\n                await Promise.all([\n                    // Fast Picks: if `mergeDelay` is configured, in order to reduce\n                    // amount of flicker, we race against the slow picks over some delay\n                    // and then set the fast picks.\n                    // If the slow picks are faster, we reduce the flicker by only\n                    // setting the items once.\n                    (async () => {\n                        if (typeof fastAndSlowPicks.mergeDelay === 'number') {\n                            await timeout(fastAndSlowPicks.mergeDelay);\n                            if (picksToken.isCancellationRequested) {\n                                return;\n                            }\n                        }\n                        if (!slowPicksApplied) {\n                            fastPicksApplied = applyPicks(fastAndSlowPicks.picks, true /* skip over empty to reduce flicker */);\n                        }\n                    })(),\n                    // Slow Picks: we await the slow picks and then set them at\n                    // once together with the fast picks, but only if we actually\n                    // have additional results.\n                    (async () => {\n                        picker.busy = true;\n                        try {\n                            const awaitedAdditionalPicks = await fastAndSlowPicks.additionalPicks;\n                            if (picksToken.isCancellationRequested) {\n                                return;\n                            }\n                            let picks;\n                            let activePick = undefined;\n                            if (isPicksWithActive(fastAndSlowPicks.picks)) {\n                                picks = fastAndSlowPicks.picks.items;\n                                activePick = fastAndSlowPicks.picks.active;\n                            }\n                            else {\n                                picks = fastAndSlowPicks.picks;\n                            }\n                            let additionalPicks;\n                            let additionalActivePick = undefined;\n                            if (isPicksWithActive(awaitedAdditionalPicks)) {\n                                additionalPicks = awaitedAdditionalPicks.items;\n                                additionalActivePick = awaitedAdditionalPicks.active;\n                            }\n                            else {\n                                additionalPicks = awaitedAdditionalPicks;\n                            }\n                            if (additionalPicks.length > 0 || !fastPicksApplied) {\n                                // If we do not have any activePick or additionalActivePick\n                                // we try to preserve the currently active pick from the\n                                // fast results. This fixes an issue where the user might\n                                // have made a pick active before the additional results\n                                // kick in.\n                                // See https://github.com/microsoft/vscode/issues/102480\n                                let fallbackActivePick = undefined;\n                                if (!activePick && !additionalActivePick) {\n                                    const fallbackActivePickCandidate = picker.activeItems[0];\n                                    if (fallbackActivePickCandidate && picks.indexOf(fallbackActivePickCandidate) !== -1) {\n                                        fallbackActivePick = fallbackActivePickCandidate;\n                                    }\n                                }\n                                applyPicks({\n                                    items: [...picks, ...additionalPicks],\n                                    active: activePick || additionalActivePick || fallbackActivePick\n                                });\n                            }\n                        }\n                        finally {\n                            if (!picksToken.isCancellationRequested) {\n                                picker.busy = false;\n                            }\n                            slowPicksApplied = true;\n                        }\n                    })()\n                ]);\n            };\n            // No Picks\n            if (providedPicks === null) ;\n            // Fast and Slow Picks\n            else if (isFastAndSlowPicks(providedPicks)) {\n                await applyFastAndSlowPicks(providedPicks);\n            }\n            // Fast Picks\n            else if (!(providedPicks instanceof Promise)) {\n                applyPicks(providedPicks);\n            }\n            // Slow Picks\n            else {\n                picker.busy = true;\n                try {\n                    const awaitedPicks = await providedPicks;\n                    if (picksToken.isCancellationRequested) {\n                        return;\n                    }\n                    if (isFastAndSlowPicks(awaitedPicks)) {\n                        await applyFastAndSlowPicks(awaitedPicks);\n                    }\n                    else {\n                        applyPicks(awaitedPicks);\n                    }\n                }\n                finally {\n                    if (!picksToken.isCancellationRequested) {\n                        picker.busy = false;\n                    }\n                }\n            }\n        };\n        disposables.add(picker.onDidChangeValue(() => updatePickerItems()));\n        updatePickerItems();\n        // Accept the pick on accept and hide picker\n        disposables.add(picker.onDidAccept(event => {\n            if (runOptions?.handleAccept) {\n                if (!event.inBackground) {\n                    picker.hide(); // hide picker unless we accept in background\n                }\n                runOptions.handleAccept?.(picker.activeItems[0], event.inBackground);\n                return;\n            }\n            const [item] = picker.selectedItems;\n            if (typeof item?.accept === 'function') {\n                if (!event.inBackground) {\n                    picker.hide(); // hide picker unless we accept in background\n                }\n                item.accept(picker.keyMods, event);\n            }\n        }));\n        const buttonTrigger = async (button, item) => {\n            if (typeof item.trigger !== 'function') {\n                return;\n            }\n            const buttonIndex = item.buttons?.indexOf(button) ?? -1;\n            if (buttonIndex >= 0) {\n                const result = item.trigger(buttonIndex, picker.keyMods);\n                const action = (typeof result === 'number') ? result : await result;\n                if (token.isCancellationRequested) {\n                    return;\n                }\n                switch (action) {\n                    case TriggerAction.NO_ACTION:\n                        break;\n                    case TriggerAction.CLOSE_PICKER:\n                        picker.hide();\n                        break;\n                    case TriggerAction.REFRESH_PICKER:\n                        updatePickerItems();\n                        break;\n                    case TriggerAction.REMOVE_ITEM: {\n                        const index = picker.items.indexOf(item);\n                        if (index !== -1) {\n                            const items = picker.items.slice();\n                            const removed = items.splice(index, 1);\n                            const activeItems = picker.activeItems.filter(activeItem => activeItem !== removed[0]);\n                            const keepScrollPositionBefore = picker.keepScrollPosition;\n                            picker.keepScrollPosition = true;\n                            picker.items = items;\n                            if (activeItems) {\n                                picker.activeItems = activeItems;\n                            }\n                            picker.keepScrollPosition = keepScrollPositionBefore;\n                        }\n                        break;\n                    }\n                }\n            }\n        };\n        // Trigger the pick with button index if button triggered\n        disposables.add(picker.onDidTriggerItemButton(({ button, item }) => buttonTrigger(button, item)));\n        disposables.add(picker.onDidTriggerSeparatorButton(({ button, separator }) => buttonTrigger(button, separator)));\n        return disposables;\n    }\n}\n\nexport { PickerQuickAccessProvider, TriggerAction };\n","import { LRUCache } from './map.js';\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 *--------------------------------------------------------------------------------------------*/\nnew LRUCache(10000);\nconst nfdCache = new LRUCache(10000); // bounded to 10000 elements\nfunction normalizeNFD(str) {\n    return normalize(str, 'NFD', nfdCache);\n}\nconst nonAsciiCharactersPattern = /[^\\u0000-\\u0080]/;\nfunction normalize(str, form, normalizedCache) {\n    if (!str) {\n        return str;\n    }\n    const cached = normalizedCache.get(str);\n    if (cached) {\n        return cached;\n    }\n    let res;\n    if (nonAsciiCharactersPattern.test(str)) {\n        res = str.normalize(form);\n    }\n    else {\n        res = str;\n    }\n    // Use the cache for fast lookup\n    normalizedCache.set(str, res);\n    return res;\n}\nconst removeAccents = (function () {\n    // transform into NFD form and remove accents\n    // see: https://stackoverflow.com/questions/990904/remove-accents-diacritics-in-a-string-in-javascript/37511463#37511463\n    const regex = /[\\u0300-\\u036f]/g;\n    return function (str) {\n        return normalizeNFD(str).replace(regex, '');\n    };\n})();\n\nexport { normalizeNFD, removeAccents };\n","import { toErrorMessage } from '../../../base/common/errorMessage.js';\nimport { isCancellationError } from '../../../base/common/errors.js';\nimport { or, matchesContiguousSubString, matchesWords, matchesPrefix } from '../../../base/common/filters.js';\nimport { createSingleCallFunction } from '../../../base/common/functional.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { LRUCache } from '../../../base/common/map.js';\nimport { TfIdfCalculator, normalizeTfIdfScores } from '../../../base/common/tfIdf.js';\nimport { localize } from '../../../nls.js';\nimport { ICommandService } from '../../commands/common/commands.js';\nimport { IConfigurationService } from '../../configuration/common/configuration.js';\nimport { IDialogService } from '../../dialogs/common/dialogs.js';\nimport { IInstantiationService } from '../../instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../keybinding/common/keybinding.js';\nimport { ILogService } from '../../log/common/log.js';\nimport { PickerQuickAccessProvider } from './pickerQuickAccess.js';\nimport { WillSaveStateReason, IStorageService } from '../../storage/common/storage.js';\nimport { ITelemetryService } from '../../telemetry/common/telemetry.js';\nimport { removeAccents } from '../../../base/common/normalization.js';\nimport { Categories } from '../../action/common/actionCommonCategories.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar AbstractCommandsQuickAccessProvider_1, CommandsHistory_1;\nlet AbstractCommandsQuickAccessProvider = class AbstractCommandsQuickAccessProvider extends PickerQuickAccessProvider {\n    static { AbstractCommandsQuickAccessProvider_1 = this; }\n    static { this.PREFIX = '>'; }\n    static { this.TFIDF_THRESHOLD = 0.5; }\n    static { this.TFIDF_MAX_RESULTS = 5; }\n    static { this.WORD_FILTER = or(matchesPrefix, matchesWords, matchesContiguousSubString); }\n    constructor(options, instantiationService, keybindingService, commandService, telemetryService, dialogService) {\n        super(AbstractCommandsQuickAccessProvider_1.PREFIX, options);\n        this.keybindingService = keybindingService;\n        this.commandService = commandService;\n        this.telemetryService = telemetryService;\n        this.dialogService = dialogService;\n        this.commandsHistory = this._register(instantiationService.createInstance(CommandsHistory));\n        this.options = options;\n    }\n    async _getPicks(filter, _disposables, token, runOptions) {\n        // Ask subclass for all command picks\n        const allCommandPicks = await this.getCommandPicks(token);\n        if (token.isCancellationRequested) {\n            return [];\n        }\n        const runTfidf = createSingleCallFunction(() => {\n            const tfidf = new TfIdfCalculator();\n            tfidf.updateDocuments(allCommandPicks.map(commandPick => ({\n                key: commandPick.commandId,\n                textChunks: [this.getTfIdfChunk(commandPick)]\n            })));\n            const result = tfidf.calculateScores(filter, token);\n            return normalizeTfIdfScores(result)\n                .filter(score => score.score > AbstractCommandsQuickAccessProvider_1.TFIDF_THRESHOLD)\n                .slice(0, AbstractCommandsQuickAccessProvider_1.TFIDF_MAX_RESULTS);\n        });\n        const noAccentsFilter = this.normalizeForFiltering(filter);\n        // Filter\n        const filteredCommandPicks = [];\n        for (const commandPick of allCommandPicks) {\n            commandPick.labelNoAccents ??= this.normalizeForFiltering(commandPick.label);\n            const labelHighlights = AbstractCommandsQuickAccessProvider_1.WORD_FILTER(noAccentsFilter, commandPick.labelNoAccents) ?? undefined;\n            let aliasHighlights;\n            if (commandPick.commandAlias) {\n                commandPick.aliasNoAccents ??= this.normalizeForFiltering(commandPick.commandAlias);\n                aliasHighlights = AbstractCommandsQuickAccessProvider_1.WORD_FILTER(noAccentsFilter, commandPick.aliasNoAccents) ?? undefined;\n            }\n            // Add if matching in label or alias\n            if (labelHighlights || aliasHighlights) {\n                commandPick.highlights = {\n                    label: labelHighlights,\n                    detail: this.options.showAlias ? aliasHighlights : undefined\n                };\n                filteredCommandPicks.push(commandPick);\n            }\n            // Also add if we have a 100% command ID match\n            else if (filter === commandPick.commandId) {\n                filteredCommandPicks.push(commandPick);\n            }\n            // Handle tf-idf scoring for the rest if there's a filter\n            else if (filter.length >= 3) {\n                const tfidf = runTfidf();\n                if (token.isCancellationRequested) {\n                    return [];\n                }\n                // Add if we have a tf-idf score\n                const tfidfScore = tfidf.find(score => score.key === commandPick.commandId);\n                if (tfidfScore) {\n                    commandPick.tfIdfScore = tfidfScore.score;\n                    filteredCommandPicks.push(commandPick);\n                }\n            }\n        }\n        // Add description to commands that have duplicate labels\n        const mapLabelToCommand = new Map();\n        for (const commandPick of filteredCommandPicks) {\n            const existingCommandForLabel = mapLabelToCommand.get(commandPick.label);\n            if (existingCommandForLabel) {\n                commandPick.description = commandPick.commandId;\n                existingCommandForLabel.description = existingCommandForLabel.commandId;\n            }\n            else {\n                mapLabelToCommand.set(commandPick.label, commandPick);\n            }\n        }\n        // Sort by MRU order and fallback to name otherwise\n        filteredCommandPicks.sort((commandPickA, commandPickB) => {\n            // If a result came from tf-idf, we want to put that towards the bottom\n            if (commandPickA.tfIdfScore && commandPickB.tfIdfScore) {\n                if (commandPickA.tfIdfScore === commandPickB.tfIdfScore) {\n                    return commandPickA.label.localeCompare(commandPickB.label); // prefer lexicographically smaller command\n                }\n                return commandPickB.tfIdfScore - commandPickA.tfIdfScore; // prefer higher tf-idf score\n            }\n            else if (commandPickA.tfIdfScore) {\n                return 1; // first command has a score but other doesn't so other wins\n            }\n            else if (commandPickB.tfIdfScore) {\n                return -1; // other command has a score but first doesn't so first wins\n            }\n            const commandACounter = this.commandsHistory.peek(commandPickA.commandId);\n            const commandBCounter = this.commandsHistory.peek(commandPickB.commandId);\n            if (commandACounter && commandBCounter) {\n                return commandACounter > commandBCounter ? -1 : 1; // use more recently used command before older\n            }\n            if (commandACounter) {\n                return -1; // first command was used, so it wins over the non used one\n            }\n            if (commandBCounter) {\n                return 1; // other command was used so it wins over the command\n            }\n            if (this.options.suggestedCommandIds) {\n                const commandASuggestion = this.options.suggestedCommandIds.has(commandPickA.commandId);\n                const commandBSuggestion = this.options.suggestedCommandIds.has(commandPickB.commandId);\n                if (commandASuggestion && commandBSuggestion) {\n                    return 0; // honor the order of the array\n                }\n                if (commandASuggestion) {\n                    return -1; // first command was suggested, so it wins over the non suggested one\n                }\n                if (commandBSuggestion) {\n                    return 1; // other command was suggested so it wins over the command\n                }\n            }\n            // if one is Developer and the other isn't, put non-Developer first\n            const isDeveloperA = commandPickA.commandCategory === Categories.Developer.value;\n            const isDeveloperB = commandPickB.commandCategory === Categories.Developer.value;\n            if (isDeveloperA && !isDeveloperB) {\n                return 1;\n            }\n            if (!isDeveloperA && isDeveloperB) {\n                return -1;\n            }\n            // both commands were never used, so we sort by name\n            return commandPickA.label.localeCompare(commandPickB.label);\n        });\n        const commandPicks = [];\n        let addOtherSeparator = false;\n        let addSuggestedSeparator = true;\n        let addCommonlyUsedSeparator = !!this.options.suggestedCommandIds;\n        for (let i = 0; i < filteredCommandPicks.length; i++) {\n            const commandPick = filteredCommandPicks[i];\n            // Separator: recently used\n            if (i === 0 && this.commandsHistory.peek(commandPick.commandId)) {\n                commandPicks.push({ type: 'separator', label: localize(1740, \"recently used\") });\n                addOtherSeparator = true;\n            }\n            if (addSuggestedSeparator && commandPick.tfIdfScore !== undefined) {\n                commandPicks.push({ type: 'separator', label: localize(1741, \"similar commands\") });\n                addSuggestedSeparator = false;\n            }\n            // Separator: commonly used\n            if (addCommonlyUsedSeparator && commandPick.tfIdfScore === undefined && !this.commandsHistory.peek(commandPick.commandId) && this.options.suggestedCommandIds?.has(commandPick.commandId)) {\n                commandPicks.push({ type: 'separator', label: localize(1742, \"commonly used\") });\n                addOtherSeparator = true;\n                addCommonlyUsedSeparator = false;\n            }\n            // Separator: other commands\n            if (addOtherSeparator && commandPick.tfIdfScore === undefined && !this.commandsHistory.peek(commandPick.commandId) && !this.options.suggestedCommandIds?.has(commandPick.commandId)) {\n                commandPicks.push({ type: 'separator', label: localize(1743, \"other commands\") });\n                addOtherSeparator = false;\n            }\n            // Command\n            commandPicks.push(this.toCommandPick(commandPick, runOptions));\n        }\n        if (!this.hasAdditionalCommandPicks(filter, token)) {\n            return commandPicks;\n        }\n        return {\n            picks: commandPicks,\n            additionalPicks: (async () => {\n                const additionalCommandPicks = await this.getAdditionalCommandPicks(allCommandPicks, filteredCommandPicks, filter, token);\n                if (token.isCancellationRequested) {\n                    return [];\n                }\n                const commandPicks = additionalCommandPicks.map(commandPick => this.toCommandPick(commandPick, runOptions));\n                // Basically, if we haven't already added a separator, we add one before the additional picks so long\n                // as one hasn't been added to the start of the array.\n                if (addSuggestedSeparator && commandPicks[0]?.type !== 'separator') {\n                    commandPicks.unshift({ type: 'separator', label: localize(1744, \"similar commands\") });\n                }\n                return commandPicks;\n            })()\n        };\n    }\n    toCommandPick(commandPick, runOptions) {\n        if (commandPick.type === 'separator') {\n            return commandPick;\n        }\n        const keybinding = this.keybindingService.lookupKeybinding(commandPick.commandId);\n        const ariaLabel = keybinding ?\n            localize(1745, \"{0}, {1}\", commandPick.label, keybinding.getAriaLabel()) :\n            commandPick.label;\n        return {\n            ...commandPick,\n            ariaLabel,\n            detail: this.options.showAlias && commandPick.commandAlias !== commandPick.label ? commandPick.commandAlias : undefined,\n            keybinding,\n            accept: async () => {\n                // Add to history\n                this.commandsHistory.push(commandPick.commandId);\n                // Telementry\n                this.telemetryService.publicLog2('workbenchActionExecuted', {\n                    id: commandPick.commandId,\n                    from: runOptions?.from ?? 'quick open'\n                });\n                // Run\n                try {\n                    commandPick.args?.length\n                        ? await this.commandService.executeCommand(commandPick.commandId, ...commandPick.args)\n                        : await this.commandService.executeCommand(commandPick.commandId);\n                }\n                catch (error) {\n                    if (!isCancellationError(error)) {\n                        this.dialogService.error(localize(1746, \"Command '{0}' resulted in an error\", commandPick.label), toErrorMessage(error));\n                    }\n                }\n            }\n        };\n    }\n    // TF-IDF string to be indexed\n    getTfIdfChunk({ label, commandAlias, commandDescription }) {\n        let chunk = label;\n        if (commandAlias && commandAlias !== label) {\n            chunk += ` - ${commandAlias}`;\n        }\n        if (commandDescription && commandDescription.value !== label) {\n            // If the original is the same as the value, don't add it\n            chunk += ` - ${commandDescription.value === commandDescription.original ? commandDescription.value : `${commandDescription.value} (${commandDescription.original})`}`;\n        }\n        return chunk;\n    }\n    /**\n     * Normalizes a string for filtering by removing accents, but only if\n     * the result has the same length, otherwise returns the original string.\n     */\n    normalizeForFiltering(value) {\n        const withoutAccents = removeAccents(value);\n        if (withoutAccents.length !== value.length) {\n            this.telemetryService.publicLog2('QuickAccess:FilterLengthMismatch', {\n                originalLength: value.length,\n                normalizedLength: withoutAccents.length\n            });\n            return value;\n        }\n        else {\n            return withoutAccents;\n        }\n    }\n};\nAbstractCommandsQuickAccessProvider = AbstractCommandsQuickAccessProvider_1 = __decorate([\n    __param(1, IInstantiationService),\n    __param(2, IKeybindingService),\n    __param(3, ICommandService),\n    __param(4, ITelemetryService),\n    __param(5, IDialogService)\n], AbstractCommandsQuickAccessProvider);\nlet CommandsHistory = class CommandsHistory extends Disposable {\n    static { CommandsHistory_1 = this; }\n    static { this.DEFAULT_COMMANDS_HISTORY_LENGTH = 50; }\n    static { this.PREF_KEY_CACHE = 'commandPalette.mru.cache'; }\n    static { this.PREF_KEY_COUNTER = 'commandPalette.mru.counter'; }\n    static { this.counter = 1; }\n    static { this.hasChanges = false; }\n    constructor(storageService, configurationService, logService) {\n        super();\n        this.storageService = storageService;\n        this.configurationService = configurationService;\n        this.logService = logService;\n        this.configuredCommandsHistoryLength = 0;\n        this.updateConfiguration();\n        this.load();\n        this.registerListeners();\n    }\n    registerListeners() {\n        this._register(this.configurationService.onDidChangeConfiguration(e => this.updateConfiguration(e)));\n        this._register(this.storageService.onWillSaveState(e => {\n            if (e.reason === WillSaveStateReason.SHUTDOWN) {\n                // Commands history is very dynamic and so we limit impact\n                // on storage to only save on shutdown. This helps reduce\n                // the overhead of syncing this data across machines.\n                this.saveState();\n            }\n        }));\n    }\n    updateConfiguration(e) {\n        if (e && !e.affectsConfiguration('workbench.commandPalette.history')) {\n            return;\n        }\n        this.configuredCommandsHistoryLength = CommandsHistory_1.getConfiguredCommandHistoryLength(this.configurationService);\n        if (CommandsHistory_1.cache && CommandsHistory_1.cache.limit !== this.configuredCommandsHistoryLength) {\n            CommandsHistory_1.cache.limit = this.configuredCommandsHistoryLength;\n            CommandsHistory_1.hasChanges = true;\n        }\n    }\n    load() {\n        const raw = this.storageService.get(CommandsHistory_1.PREF_KEY_CACHE, 0 /* StorageScope.PROFILE */);\n        let serializedCache;\n        if (raw) {\n            try {\n                serializedCache = JSON.parse(raw);\n            }\n            catch (error) {\n                this.logService.error(`[CommandsHistory] invalid data: ${error}`);\n            }\n        }\n        const cache = CommandsHistory_1.cache = new LRUCache(this.configuredCommandsHistoryLength, 1);\n        if (serializedCache) {\n            let entries;\n            if (serializedCache.usesLRU) {\n                entries = serializedCache.entries;\n            }\n            else {\n                entries = serializedCache.entries.sort((a, b) => a.value - b.value);\n            }\n            entries.forEach(entry => cache.set(entry.key, entry.value));\n        }\n        CommandsHistory_1.counter = this.storageService.getNumber(CommandsHistory_1.PREF_KEY_COUNTER, 0 /* StorageScope.PROFILE */, CommandsHistory_1.counter);\n    }\n    push(commandId) {\n        if (!CommandsHistory_1.cache) {\n            return;\n        }\n        CommandsHistory_1.cache.set(commandId, CommandsHistory_1.counter++); // set counter to command\n        CommandsHistory_1.hasChanges = true;\n    }\n    peek(commandId) {\n        return CommandsHistory_1.cache?.peek(commandId);\n    }\n    saveState() {\n        if (!CommandsHistory_1.cache) {\n            return;\n        }\n        if (!CommandsHistory_1.hasChanges) {\n            return;\n        }\n        const serializedCache = { usesLRU: true, entries: [] };\n        CommandsHistory_1.cache.forEach((value, key) => serializedCache.entries.push({ key, value }));\n        this.storageService.store(CommandsHistory_1.PREF_KEY_CACHE, JSON.stringify(serializedCache), 0 /* StorageScope.PROFILE */, 0 /* StorageTarget.USER */);\n        this.storageService.store(CommandsHistory_1.PREF_KEY_COUNTER, CommandsHistory_1.counter, 0 /* StorageScope.PROFILE */, 0 /* StorageTarget.USER */);\n        CommandsHistory_1.hasChanges = false;\n    }\n    static getConfiguredCommandHistoryLength(configurationService) {\n        const config = configurationService.getValue();\n        const configuredCommandHistoryLength = config.workbench?.commandPalette?.history;\n        if (typeof configuredCommandHistoryLength === 'number') {\n            return configuredCommandHistoryLength;\n        }\n        return CommandsHistory_1.DEFAULT_COMMANDS_HISTORY_LENGTH;\n    }\n};\nCommandsHistory = CommandsHistory_1 = __decorate([\n    __param(0, IStorageService),\n    __param(1, IConfigurationService),\n    __param(2, ILogService)\n], CommandsHistory);\n\nexport { AbstractCommandsQuickAccessProvider, CommandsHistory };\n","import { stripIcons } from '../../../../base/common/iconLabels.js';\nimport { isLocalizedString } from '../../../../platform/action/common/action.js';\nimport { AbstractCommandsQuickAccessProvider } from '../../../../platform/quickinput/browser/commandsQuickAccess.js';\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 *--------------------------------------------------------------------------------------------*/\nclass AbstractEditorCommandsQuickAccessProvider extends AbstractCommandsQuickAccessProvider {\n    constructor(options, instantiationService, keybindingService, commandService, telemetryService, dialogService) {\n        super(options, instantiationService, keybindingService, commandService, telemetryService, dialogService);\n    }\n    getCodeEditorCommandPicks() {\n        const activeTextEditorControl = this.activeTextEditorControl;\n        if (!activeTextEditorControl) {\n            return [];\n        }\n        const editorCommandPicks = [];\n        for (const editorAction of activeTextEditorControl.getSupportedActions()) {\n            let commandDescription;\n            if (editorAction.metadata?.description) {\n                if (isLocalizedString(editorAction.metadata.description)) {\n                    commandDescription = editorAction.metadata.description;\n                }\n                else {\n                    commandDescription = { original: editorAction.metadata.description, value: editorAction.metadata.description };\n                }\n            }\n            editorCommandPicks.push({\n                commandId: editorAction.id,\n                commandAlias: editorAction.alias,\n                commandDescription,\n                label: stripIcons(editorAction.label) || editorAction.id,\n            });\n        }\n        return editorCommandPicks;\n    }\n}\n\nexport { AbstractEditorCommandsQuickAccessProvider };\n","import { Registry } from '../../../../platform/registry/common/platform.js';\nimport { Extensions } from '../../../../platform/quickinput/common/quickAccess.js';\nimport { QuickCommandNLS } from '../../../common/standaloneStrings.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { AbstractEditorCommandsQuickAccessProvider } from '../../../contrib/quickAccess/browser/commandsQuickAccess.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';\nimport { ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js';\nimport { IDialogService } from '../../../../platform/dialogs/common/dialogs.js';\nimport { EditorAction, registerEditorAction } from '../../../browser/editorExtensions.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { IQuickInputService } from '../../../../platform/quickinput/common/quickInput.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet StandaloneCommandsQuickAccessProvider = class StandaloneCommandsQuickAccessProvider extends AbstractEditorCommandsQuickAccessProvider {\n    get activeTextEditorControl() { return this.codeEditorService.getFocusedCodeEditor() ?? undefined; }\n    constructor(instantiationService, codeEditorService, keybindingService, commandService, telemetryService, dialogService) {\n        super({ showAlias: false }, instantiationService, keybindingService, commandService, telemetryService, dialogService);\n        this.codeEditorService = codeEditorService;\n    }\n    async getCommandPicks() {\n        return this.getCodeEditorCommandPicks();\n    }\n    hasAdditionalCommandPicks() {\n        return false;\n    }\n    async getAdditionalCommandPicks() {\n        return [];\n    }\n};\nStandaloneCommandsQuickAccessProvider = __decorate([\n    __param(0, IInstantiationService),\n    __param(1, ICodeEditorService),\n    __param(2, IKeybindingService),\n    __param(3, ICommandService),\n    __param(4, ITelemetryService),\n    __param(5, IDialogService)\n], StandaloneCommandsQuickAccessProvider);\nclass GotoLineAction extends EditorAction {\n    static { this.ID = 'editor.action.quickCommand'; }\n    constructor() {\n        super({\n            id: GotoLineAction.ID,\n            label: QuickCommandNLS.quickCommandActionLabel,\n            alias: 'Command Palette',\n            precondition: undefined,\n            kbOpts: {\n                kbExpr: EditorContextKeys.focus,\n                primary: 59 /* KeyCode.F1 */,\n                weight: 100 /* KeybindingWeight.EditorContrib */\n            },\n            contextMenuOpts: {\n                group: 'z_commands',\n                order: 1\n            }\n        });\n    }\n    run(accessor) {\n        accessor.get(IQuickInputService).quickAccess.show(StandaloneCommandsQuickAccessProvider.PREFIX);\n    }\n}\nregisterEditorAction(GotoLineAction);\nRegistry.as(Extensions.Quickaccess).registerQuickAccessProvider({\n    ctor: StandaloneCommandsQuickAccessProvider,\n    prefix: StandaloneCommandsQuickAccessProvider.PREFIX,\n    helpEntries: [{ description: QuickCommandNLS.quickCommandHelp, commandId: GotoLineAction.ID }]\n});\n\nexport { GotoLineAction, StandaloneCommandsQuickAccessProvider };\n","import { registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { ReferencesController } from '../../../contrib/gotoSymbol/browser/peek/referencesController.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { INotificationService } from '../../../../platform/notification/common/notification.js';\nimport { IStorageService } from '../../../../platform/storage/common/storage.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet StandaloneReferencesController = class StandaloneReferencesController extends ReferencesController {\n    constructor(editor, contextKeyService, editorService, notificationService, instantiationService, storageService, configurationService) {\n        super(true, editor, contextKeyService, editorService, notificationService, instantiationService, storageService, configurationService);\n    }\n};\nStandaloneReferencesController = __decorate([\n    __param(1, IContextKeyService),\n    __param(2, ICodeEditorService),\n    __param(3, INotificationService),\n    __param(4, IInstantiationService),\n    __param(5, IStorageService),\n    __param(6, IConfigurationService)\n], StandaloneReferencesController);\nregisterEditorContribution(ReferencesController.ID, StandaloneReferencesController, 4 /* EditorContributionInstantiation.Lazy */);\n\nexport { StandaloneReferencesController };\n","import { Color } from '../../../../base/common/color.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ParsedTokenThemeRule {\n    constructor(token, index, fontStyle, foreground, background) {\n        this._parsedThemeRuleBrand = undefined;\n        this.token = token;\n        this.index = index;\n        this.fontStyle = fontStyle;\n        this.foreground = foreground;\n        this.background = background;\n    }\n}\n/**\n * Parse a raw theme into rules.\n */\nfunction parseTokenTheme(source) {\n    if (!source || !Array.isArray(source)) {\n        return [];\n    }\n    const result = [];\n    let resultLen = 0;\n    for (let i = 0, len = source.length; i < len; i++) {\n        const entry = source[i];\n        let fontStyle = -1 /* FontStyle.NotSet */;\n        if (typeof entry.fontStyle === 'string') {\n            fontStyle = 0 /* FontStyle.None */;\n            const segments = entry.fontStyle.split(' ');\n            for (let j = 0, lenJ = segments.length; j < lenJ; j++) {\n                const segment = segments[j];\n                switch (segment) {\n                    case 'italic':\n                        fontStyle = fontStyle | 1 /* FontStyle.Italic */;\n                        break;\n                    case 'bold':\n                        fontStyle = fontStyle | 2 /* FontStyle.Bold */;\n                        break;\n                    case 'underline':\n                        fontStyle = fontStyle | 4 /* FontStyle.Underline */;\n                        break;\n                    case 'strikethrough':\n                        fontStyle = fontStyle | 8 /* FontStyle.Strikethrough */;\n                        break;\n                }\n            }\n        }\n        let foreground = null;\n        if (typeof entry.foreground === 'string') {\n            foreground = entry.foreground;\n        }\n        let background = null;\n        if (typeof entry.background === 'string') {\n            background = entry.background;\n        }\n        result[resultLen++] = new ParsedTokenThemeRule(entry.token || '', i, fontStyle, foreground, background);\n    }\n    return result;\n}\n/**\n * Resolve rules (i.e. inheritance).\n */\nfunction resolveParsedTokenThemeRules(parsedThemeRules, customTokenColors) {\n    // Sort rules lexicographically, and then by index if necessary\n    parsedThemeRules.sort((a, b) => {\n        const r = strcmp(a.token, b.token);\n        if (r !== 0) {\n            return r;\n        }\n        return a.index - b.index;\n    });\n    // Determine defaults\n    let defaultFontStyle = 0 /* FontStyle.None */;\n    let defaultForeground = '000000';\n    let defaultBackground = 'ffffff';\n    while (parsedThemeRules.length >= 1 && parsedThemeRules[0].token === '') {\n        const incomingDefaults = parsedThemeRules.shift();\n        if (incomingDefaults.fontStyle !== -1 /* FontStyle.NotSet */) {\n            defaultFontStyle = incomingDefaults.fontStyle;\n        }\n        if (incomingDefaults.foreground !== null) {\n            defaultForeground = incomingDefaults.foreground;\n        }\n        if (incomingDefaults.background !== null) {\n            defaultBackground = incomingDefaults.background;\n        }\n    }\n    const colorMap = new ColorMap();\n    // start with token colors from custom token themes\n    for (const color of customTokenColors) {\n        colorMap.getId(color);\n    }\n    const foregroundColorId = colorMap.getId(defaultForeground);\n    const backgroundColorId = colorMap.getId(defaultBackground);\n    const defaults = new ThemeTrieElementRule(defaultFontStyle, foregroundColorId, backgroundColorId);\n    const root = new ThemeTrieElement(defaults);\n    for (let i = 0, len = parsedThemeRules.length; i < len; i++) {\n        const rule = parsedThemeRules[i];\n        root.insert(rule.token, rule.fontStyle, colorMap.getId(rule.foreground), colorMap.getId(rule.background));\n    }\n    return new TokenTheme(colorMap, root);\n}\nconst colorRegExp = /^#?([0-9A-Fa-f]{6})([0-9A-Fa-f]{2})?$/;\nclass ColorMap {\n    constructor() {\n        this._lastColorId = 0;\n        this._id2color = [];\n        this._color2id = new Map();\n    }\n    getId(color) {\n        if (color === null) {\n            return 0;\n        }\n        const match = color.match(colorRegExp);\n        if (!match) {\n            throw new Error('Illegal value for token color: ' + color);\n        }\n        color = match[1].toUpperCase();\n        let value = this._color2id.get(color);\n        if (value) {\n            return value;\n        }\n        value = ++this._lastColorId;\n        this._color2id.set(color, value);\n        this._id2color[value] = Color.fromHex('#' + color);\n        return value;\n    }\n    getColorMap() {\n        return this._id2color.slice(0);\n    }\n}\nclass TokenTheme {\n    static createFromRawTokenTheme(source, customTokenColors) {\n        return this.createFromParsedTokenTheme(parseTokenTheme(source), customTokenColors);\n    }\n    static createFromParsedTokenTheme(source, customTokenColors) {\n        return resolveParsedTokenThemeRules(source, customTokenColors);\n    }\n    constructor(colorMap, root) {\n        this._colorMap = colorMap;\n        this._root = root;\n        this._cache = new Map();\n    }\n    getColorMap() {\n        return this._colorMap.getColorMap();\n    }\n    _match(token) {\n        return this._root.match(token);\n    }\n    match(languageId, token) {\n        // The cache contains the metadata without the language bits set.\n        let result = this._cache.get(token);\n        if (typeof result === 'undefined') {\n            const rule = this._match(token);\n            const standardToken = toStandardTokenType(token);\n            result = (rule.metadata\n                | (standardToken << 8 /* MetadataConsts.TOKEN_TYPE_OFFSET */)) >>> 0;\n            this._cache.set(token, result);\n        }\n        return (result\n            | (languageId << 0 /* MetadataConsts.LANGUAGEID_OFFSET */)) >>> 0;\n    }\n}\nconst STANDARD_TOKEN_TYPE_REGEXP = /\\b(comment|string|regex|regexp)\\b/;\nfunction toStandardTokenType(tokenType) {\n    const m = tokenType.match(STANDARD_TOKEN_TYPE_REGEXP);\n    if (!m) {\n        return 0 /* StandardTokenType.Other */;\n    }\n    switch (m[1]) {\n        case 'comment':\n            return 1 /* StandardTokenType.Comment */;\n        case 'string':\n            return 2 /* StandardTokenType.String */;\n        case 'regex':\n            return 3 /* StandardTokenType.RegEx */;\n        case 'regexp':\n            return 3 /* StandardTokenType.RegEx */;\n    }\n    throw new Error('Unexpected match for standard token type!');\n}\nfunction strcmp(a, b) {\n    if (a < b) {\n        return -1;\n    }\n    if (a > b) {\n        return 1;\n    }\n    return 0;\n}\nclass ThemeTrieElementRule {\n    constructor(fontStyle, foreground, background) {\n        this._themeTrieElementRuleBrand = undefined;\n        this._fontStyle = fontStyle;\n        this._foreground = foreground;\n        this._background = background;\n        this.metadata = ((this._fontStyle << 11 /* MetadataConsts.FONT_STYLE_OFFSET */)\n            | (this._foreground << 15 /* MetadataConsts.FOREGROUND_OFFSET */)\n            | (this._background << 24 /* MetadataConsts.BACKGROUND_OFFSET */)) >>> 0;\n    }\n    clone() {\n        return new ThemeTrieElementRule(this._fontStyle, this._foreground, this._background);\n    }\n    acceptOverwrite(fontStyle, foreground, background) {\n        if (fontStyle !== -1 /* FontStyle.NotSet */) {\n            this._fontStyle = fontStyle;\n        }\n        if (foreground !== 0 /* ColorId.None */) {\n            this._foreground = foreground;\n        }\n        if (background !== 0 /* ColorId.None */) {\n            this._background = background;\n        }\n        this.metadata = ((this._fontStyle << 11 /* MetadataConsts.FONT_STYLE_OFFSET */)\n            | (this._foreground << 15 /* MetadataConsts.FOREGROUND_OFFSET */)\n            | (this._background << 24 /* MetadataConsts.BACKGROUND_OFFSET */)) >>> 0;\n    }\n}\nclass ThemeTrieElement {\n    constructor(mainRule) {\n        this._themeTrieElementBrand = undefined;\n        this._mainRule = mainRule;\n        this._children = new Map();\n    }\n    match(token) {\n        if (token === '') {\n            return this._mainRule;\n        }\n        const dotIndex = token.indexOf('.');\n        let head;\n        let tail;\n        if (dotIndex === -1) {\n            head = token;\n            tail = '';\n        }\n        else {\n            head = token.substring(0, dotIndex);\n            tail = token.substring(dotIndex + 1);\n        }\n        const child = this._children.get(head);\n        if (typeof child !== 'undefined') {\n            return child.match(tail);\n        }\n        return this._mainRule;\n    }\n    insert(token, fontStyle, foreground, background) {\n        if (token === '') {\n            // Merge into the main rule\n            this._mainRule.acceptOverwrite(fontStyle, foreground, background);\n            return;\n        }\n        const dotIndex = token.indexOf('.');\n        let head;\n        let tail;\n        if (dotIndex === -1) {\n            head = token;\n            tail = '';\n        }\n        else {\n            head = token.substring(0, dotIndex);\n            tail = token.substring(dotIndex + 1);\n        }\n        let child = this._children.get(head);\n        if (typeof child === 'undefined') {\n            child = new ThemeTrieElement(this._mainRule.clone());\n            this._children.set(head, child);\n        }\n        child.insert(tail, fontStyle, foreground, background);\n    }\n}\nfunction generateTokensCSSForColorMap(colorMap) {\n    const rules = [];\n    for (let i = 1, len = colorMap.length; i < len; i++) {\n        const color = colorMap[i];\n        rules[i] = `.mtk${i} { color: ${color}; }`;\n    }\n    rules.push('.mtki { font-style: italic; }');\n    rules.push('.mtkb { font-weight: bold; }');\n    rules.push('.mtku { text-decoration: underline; text-underline-position: under; }');\n    rules.push('.mtks { text-decoration: line-through; }');\n    rules.push('.mtks.mtku { text-decoration: underline line-through; text-underline-position: under; }');\n    return rules.join('\\n');\n}\n\nexport { ColorMap, ParsedTokenThemeRule, ThemeTrieElement, ThemeTrieElementRule, TokenTheme, generateTokensCSSForColorMap, parseTokenTheme, strcmp, toStandardTokenType };\n","import { editorActiveIndentGuide1, editorIndentGuide1 } from '../../common/core/editorColorRegistry.js';\nimport '../../../platform/theme/common/colorUtils.js';\nimport '../../../platform/theme/common/colors/baseColors.js';\nimport '../../../platform/theme/common/colors/chartsColors.js';\nimport { editorForeground, editorBackground, editorSelectionHighlight, editorInactiveSelection } from '../../../platform/theme/common/colors/editorColors.js';\nimport '../../../platform/theme/common/colors/inputColors.js';\nimport '../../../platform/theme/common/colors/listColors.js';\nimport '../../../platform/theme/common/colors/menuColors.js';\nimport '../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../platform/theme/common/colors/miscColors.js';\nimport '../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../platform/theme/common/colors/searchColors.js';\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/* -------------------------------- Begin vs theme -------------------------------- */\nconst vs = {\n    base: 'vs',\n    inherit: false,\n    rules: [\n        { token: '', foreground: '000000', background: 'fffffe' },\n        { token: 'invalid', foreground: 'cd3131' },\n        { token: 'emphasis', fontStyle: 'italic' },\n        { token: 'strong', fontStyle: 'bold' },\n        { token: 'variable', foreground: '001188' },\n        { token: 'variable.predefined', foreground: '4864AA' },\n        { token: 'constant', foreground: 'dd0000' },\n        { token: 'comment', foreground: '008000' },\n        { token: 'number', foreground: '098658' },\n        { token: 'number.hex', foreground: '3030c0' },\n        { token: 'regexp', foreground: '800000' },\n        { token: 'annotation', foreground: '808080' },\n        { token: 'type', foreground: '008080' },\n        { token: 'delimiter', foreground: '000000' },\n        { token: 'delimiter.html', foreground: '383838' },\n        { token: 'delimiter.xml', foreground: '0000FF' },\n        { token: 'tag', foreground: '800000' },\n        { token: 'tag.id.pug', foreground: '4F76AC' },\n        { token: 'tag.class.pug', foreground: '4F76AC' },\n        { token: 'meta.scss', foreground: '800000' },\n        { token: 'metatag', foreground: 'e00000' },\n        { token: 'metatag.content.html', foreground: 'FF0000' },\n        { token: 'metatag.html', foreground: '808080' },\n        { token: 'metatag.xml', foreground: '808080' },\n        { token: 'metatag.php', fontStyle: 'bold' },\n        { token: 'key', foreground: '863B00' },\n        { token: 'string.key.json', foreground: 'A31515' },\n        { token: 'string.value.json', foreground: '0451A5' },\n        { token: 'attribute.name', foreground: 'FF0000' },\n        { token: 'attribute.value', foreground: '0451A5' },\n        { token: 'attribute.value.number', foreground: '098658' },\n        { token: 'attribute.value.unit', foreground: '098658' },\n        { token: 'attribute.value.html', foreground: '0000FF' },\n        { token: 'attribute.value.xml', foreground: '0000FF' },\n        { token: 'string', foreground: 'A31515' },\n        { token: 'string.html', foreground: '0000FF' },\n        { token: 'string.sql', foreground: 'FF0000' },\n        { token: 'string.yaml', foreground: '0451A5' },\n        { token: 'keyword', foreground: '0000FF' },\n        { token: 'keyword.json', foreground: '0451A5' },\n        { token: 'keyword.flow', foreground: 'AF00DB' },\n        { token: 'keyword.flow.scss', foreground: '0000FF' },\n        { token: 'operator.scss', foreground: '666666' },\n        { token: 'operator.sql', foreground: '778899' },\n        { token: 'operator.swift', foreground: '666666' },\n        { token: 'predefined.sql', foreground: 'C700C7' },\n    ],\n    colors: {\n        [editorBackground]: '#FFFFFE',\n        [editorForeground]: '#000000',\n        [editorInactiveSelection]: '#E5EBF1',\n        [editorIndentGuide1]: '#D3D3D3',\n        [editorActiveIndentGuide1]: '#939393',\n        [editorSelectionHighlight]: '#ADD6FF4D'\n    }\n};\n/* -------------------------------- End vs theme -------------------------------- */\n/* -------------------------------- Begin vs-dark theme -------------------------------- */\nconst vs_dark = {\n    base: 'vs-dark',\n    inherit: false,\n    rules: [\n        { token: '', foreground: 'D4D4D4', background: '1E1E1E' },\n        { token: 'invalid', foreground: 'f44747' },\n        { token: 'emphasis', fontStyle: 'italic' },\n        { token: 'strong', fontStyle: 'bold' },\n        { token: 'variable', foreground: '74B0DF' },\n        { token: 'variable.predefined', foreground: '4864AA' },\n        { token: 'variable.parameter', foreground: '9CDCFE' },\n        { token: 'constant', foreground: '569CD6' },\n        { token: 'comment', foreground: '608B4E' },\n        { token: 'number', foreground: 'B5CEA8' },\n        { token: 'number.hex', foreground: '5BB498' },\n        { token: 'regexp', foreground: 'B46695' },\n        { token: 'annotation', foreground: 'cc6666' },\n        { token: 'type', foreground: '3DC9B0' },\n        { token: 'delimiter', foreground: 'DCDCDC' },\n        { token: 'delimiter.html', foreground: '808080' },\n        { token: 'delimiter.xml', foreground: '808080' },\n        { token: 'tag', foreground: '569CD6' },\n        { token: 'tag.id.pug', foreground: '4F76AC' },\n        { token: 'tag.class.pug', foreground: '4F76AC' },\n        { token: 'meta.scss', foreground: 'A79873' },\n        { token: 'meta.tag', foreground: 'CE9178' },\n        { token: 'metatag', foreground: 'DD6A6F' },\n        { token: 'metatag.content.html', foreground: '9CDCFE' },\n        { token: 'metatag.html', foreground: '569CD6' },\n        { token: 'metatag.xml', foreground: '569CD6' },\n        { token: 'metatag.php', fontStyle: 'bold' },\n        { token: 'key', foreground: '9CDCFE' },\n        { token: 'string.key.json', foreground: '9CDCFE' },\n        { token: 'string.value.json', foreground: 'CE9178' },\n        { token: 'attribute.name', foreground: '9CDCFE' },\n        { token: 'attribute.value', foreground: 'CE9178' },\n        { token: 'attribute.value.number.css', foreground: 'B5CEA8' },\n        { token: 'attribute.value.unit.css', foreground: 'B5CEA8' },\n        { token: 'attribute.value.hex.css', foreground: 'D4D4D4' },\n        { token: 'string', foreground: 'CE9178' },\n        { token: 'string.sql', foreground: 'FF0000' },\n        { token: 'keyword', foreground: '569CD6' },\n        { token: 'keyword.flow', foreground: 'C586C0' },\n        { token: 'keyword.json', foreground: 'CE9178' },\n        { token: 'keyword.flow.scss', foreground: '569CD6' },\n        { token: 'operator.scss', foreground: '909090' },\n        { token: 'operator.sql', foreground: '778899' },\n        { token: 'operator.swift', foreground: '909090' },\n        { token: 'predefined.sql', foreground: 'FF00FF' },\n    ],\n    colors: {\n        [editorBackground]: '#1E1E1E',\n        [editorForeground]: '#D4D4D4',\n        [editorInactiveSelection]: '#3A3D41',\n        [editorIndentGuide1]: '#404040',\n        [editorActiveIndentGuide1]: '#707070',\n        [editorSelectionHighlight]: '#ADD6FF26'\n    }\n};\n/* -------------------------------- End vs-dark theme -------------------------------- */\n/* -------------------------------- Begin hc-black theme -------------------------------- */\nconst hc_black = {\n    base: 'hc-black',\n    inherit: false,\n    rules: [\n        { token: '', foreground: 'FFFFFF', background: '000000' },\n        { token: 'invalid', foreground: 'f44747' },\n        { token: 'emphasis', fontStyle: 'italic' },\n        { token: 'strong', fontStyle: 'bold' },\n        { token: 'variable', foreground: '1AEBFF' },\n        { token: 'variable.parameter', foreground: '9CDCFE' },\n        { token: 'constant', foreground: '569CD6' },\n        { token: 'comment', foreground: '608B4E' },\n        { token: 'number', foreground: 'FFFFFF' },\n        { token: 'regexp', foreground: 'C0C0C0' },\n        { token: 'annotation', foreground: '569CD6' },\n        { token: 'type', foreground: '3DC9B0' },\n        { token: 'delimiter', foreground: 'FFFF00' },\n        { token: 'delimiter.html', foreground: 'FFFF00' },\n        { token: 'tag', foreground: '569CD6' },\n        { token: 'tag.id.pug', foreground: '4F76AC' },\n        { token: 'tag.class.pug', foreground: '4F76AC' },\n        { token: 'meta', foreground: 'D4D4D4' },\n        { token: 'meta.tag', foreground: 'CE9178' },\n        { token: 'metatag', foreground: '569CD6' },\n        { token: 'metatag.content.html', foreground: '1AEBFF' },\n        { token: 'metatag.html', foreground: '569CD6' },\n        { token: 'metatag.xml', foreground: '569CD6' },\n        { token: 'metatag.php', fontStyle: 'bold' },\n        { token: 'key', foreground: '9CDCFE' },\n        { token: 'string.key', foreground: '9CDCFE' },\n        { token: 'string.value', foreground: 'CE9178' },\n        { token: 'attribute.name', foreground: '569CD6' },\n        { token: 'attribute.value', foreground: '3FF23F' },\n        { token: 'string', foreground: 'CE9178' },\n        { token: 'string.sql', foreground: 'FF0000' },\n        { token: 'keyword', foreground: '569CD6' },\n        { token: 'keyword.flow', foreground: 'C586C0' },\n        { token: 'operator.sql', foreground: '778899' },\n        { token: 'operator.swift', foreground: '909090' },\n        { token: 'predefined.sql', foreground: 'FF00FF' },\n    ],\n    colors: {\n        [editorBackground]: '#000000',\n        [editorForeground]: '#FFFFFF',\n        [editorIndentGuide1]: '#FFFFFF',\n        [editorActiveIndentGuide1]: '#FFFFFF',\n    }\n};\n/* -------------------------------- End hc-black theme -------------------------------- */\n/* -------------------------------- Begin hc-light theme -------------------------------- */\nconst hc_light = {\n    base: 'hc-light',\n    inherit: false,\n    rules: [\n        { token: '', foreground: '292929', background: 'FFFFFF' },\n        { token: 'invalid', foreground: 'B5200D' },\n        { token: 'emphasis', fontStyle: 'italic' },\n        { token: 'strong', fontStyle: 'bold' },\n        { token: 'variable', foreground: '264F70' },\n        { token: 'variable.predefined', foreground: '4864AA' },\n        { token: 'constant', foreground: 'dd0000' },\n        { token: 'comment', foreground: '008000' },\n        { token: 'number', foreground: '098658' },\n        { token: 'number.hex', foreground: '3030c0' },\n        { token: 'regexp', foreground: '800000' },\n        { token: 'annotation', foreground: '808080' },\n        { token: 'type', foreground: '008080' },\n        { token: 'delimiter', foreground: '000000' },\n        { token: 'delimiter.html', foreground: '383838' },\n        { token: 'tag', foreground: '800000' },\n        { token: 'tag.id.pug', foreground: '4F76AC' },\n        { token: 'tag.class.pug', foreground: '4F76AC' },\n        { token: 'meta.scss', foreground: '800000' },\n        { token: 'metatag', foreground: 'e00000' },\n        { token: 'metatag.content.html', foreground: 'B5200D' },\n        { token: 'metatag.html', foreground: '808080' },\n        { token: 'metatag.xml', foreground: '808080' },\n        { token: 'metatag.php', fontStyle: 'bold' },\n        { token: 'key', foreground: '863B00' },\n        { token: 'string.key.json', foreground: 'A31515' },\n        { token: 'string.value.json', foreground: '0451A5' },\n        { token: 'attribute.name', foreground: '264F78' },\n        { token: 'attribute.value', foreground: '0451A5' },\n        { token: 'string', foreground: 'A31515' },\n        { token: 'string.sql', foreground: 'B5200D' },\n        { token: 'keyword', foreground: '0000FF' },\n        { token: 'keyword.flow', foreground: 'AF00DB' },\n        { token: 'operator.sql', foreground: '778899' },\n        { token: 'operator.swift', foreground: '666666' },\n        { token: 'predefined.sql', foreground: 'C700C7' },\n    ],\n    colors: {\n        [editorBackground]: '#FFFFFF',\n        [editorForeground]: '#292929',\n        [editorIndentGuide1]: '#292929',\n        [editorActiveIndentGuide1]: '#292929',\n    }\n};\n/* -------------------------------- End hc-light theme -------------------------------- */\n\nexport { hc_black, hc_light, vs, vs_dark };\n","import { className, inline, Builder, stringValue, identValue, asCSSUrl } from '../../../base/browser/cssValue.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { DisposableStore } from '../../../base/common/lifecycle.js';\nimport { ThemeIcon } from '../../../base/common/themables.js';\nimport { getIconRegistry } from '../common/iconRegistry.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction getIconsStyleSheet(themeService) {\n    const disposable = new DisposableStore();\n    const onDidChangeEmmiter = disposable.add(new Emitter());\n    const iconRegistry = getIconRegistry();\n    disposable.add(iconRegistry.onDidChange(() => onDidChangeEmmiter.fire()));\n    if (themeService) {\n        disposable.add(themeService.onDidProductIconThemeChange(() => onDidChangeEmmiter.fire()));\n    }\n    return {\n        dispose: () => disposable.dispose(),\n        onDidChange: onDidChangeEmmiter.event,\n        getCSS() {\n            const productIconTheme = themeService ? themeService.getProductIconTheme() : new UnthemedProductIconTheme();\n            const usedFontIds = {};\n            const rules = new Builder();\n            const rootAttribs = new Builder();\n            for (const contribution of iconRegistry.getIcons()) {\n                const definition = productIconTheme.getIcon(contribution);\n                if (!definition) {\n                    continue;\n                }\n                const fontContribution = definition.font;\n                const fontFamilyVar = inline `--vscode-icon-${className(contribution.id)}-font-family`;\n                const contentVar = inline `--vscode-icon-${className(contribution.id)}-content`;\n                if (fontContribution) {\n                    usedFontIds[fontContribution.id] = fontContribution.definition;\n                    rootAttribs.push(inline `${fontFamilyVar}: ${stringValue(fontContribution.id)};`, inline `${contentVar}: ${stringValue(definition.fontCharacter)};`);\n                    rules.push(inline `.codicon-${className(contribution.id)}:before { content: ${stringValue(definition.fontCharacter)}; font-family: ${stringValue(fontContribution.id)}; }`);\n                }\n                else {\n                    rootAttribs.push(inline `${contentVar}: ${stringValue(definition.fontCharacter)}; ${fontFamilyVar}: 'codicon';`);\n                    rules.push(inline `.codicon-${className(contribution.id)}:before { content: ${stringValue(definition.fontCharacter)}; }`);\n                }\n            }\n            for (const id in usedFontIds) {\n                const definition = usedFontIds[id];\n                const fontWeight = definition.weight ? inline `font-weight: ${identValue(definition.weight)};` : inline ``;\n                const fontStyle = definition.style ? inline `font-style: ${identValue(definition.style)};` : inline ``;\n                const src = new Builder();\n                for (const l of definition.src) {\n                    src.push(inline `${asCSSUrl(l.location)} format(${stringValue(l.format)})`);\n                }\n                rules.push(inline `@font-face { src: ${src.join(', ')}; font-family: ${stringValue(id)};${fontWeight}${fontStyle} font-display: block; }`);\n            }\n            rules.push(inline `:root { ${rootAttribs.join(' ')} }`);\n            return rules.join('\\n');\n        }\n    };\n}\nclass UnthemedProductIconTheme {\n    getIcon(contribution) {\n        const iconRegistry = getIconRegistry();\n        let definition = contribution.defaults;\n        while (ThemeIcon.isThemeIcon(definition)) {\n            const c = iconRegistry.getIcon(definition.id);\n            if (!c) {\n                return undefined;\n            }\n            definition = c.defaults;\n        }\n        return definition;\n    }\n}\n\nexport { UnthemedProductIconTheme, getIconsStyleSheet };\n","import { isInShadowDOM } from '../../../base/browser/dom.js';\nimport { createStyleSheet } from '../../../base/browser/domStylesheets.js';\nimport { addMatchMediaChangeListener } from '../../../base/browser/browser.js';\nimport { Color } from '../../../base/common/color.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { TokenizationRegistry } from '../../common/languages.js';\nimport { TokenMetadata } from '../../common/encodedTokenAttributes.js';\nimport { generateTokensCSSForColorMap, TokenTheme } from '../../common/languages/supports/tokenization.js';\nimport { hc_light, hc_black, vs_dark, vs } from '../common/themes.js';\nimport { Registry } from '../../../platform/registry/common/platform.js';\nimport { Extensions, asCssVariableName } from '../../../platform/theme/common/colorUtils.js';\nimport '../../../platform/theme/common/colors/baseColors.js';\nimport '../../../platform/theme/common/colors/chartsColors.js';\nimport '../../../platform/theme/common/colors/editorColors.js';\nimport '../../../platform/theme/common/colors/inputColors.js';\nimport '../../../platform/theme/common/colors/listColors.js';\nimport '../../../platform/theme/common/colors/menuColors.js';\nimport '../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../platform/theme/common/colors/miscColors.js';\nimport '../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../platform/theme/common/colors/searchColors.js';\nimport { Extensions as Extensions$1 } from '../../../platform/theme/common/themeService.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { isHighContrast, isDark, ColorScheme } from '../../../platform/theme/common/theme.js';\nimport { UnthemedProductIconTheme, getIconsStyleSheet } from '../../../platform/theme/browser/iconsStyleSheet.js';\nimport { mainWindow } from '../../../base/browser/window.js';\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 *--------------------------------------------------------------------------------------------*/\nconst VS_LIGHT_THEME_NAME = 'vs';\nconst VS_DARK_THEME_NAME = 'vs-dark';\nconst HC_BLACK_THEME_NAME = 'hc-black';\nconst HC_LIGHT_THEME_NAME = 'hc-light';\nconst colorRegistry = Registry.as(Extensions.ColorContribution);\nconst themingRegistry = Registry.as(Extensions$1.ThemingContribution);\nclass StandaloneTheme {\n    constructor(name, standaloneThemeData) {\n        this.semanticHighlighting = false;\n        this.themeData = standaloneThemeData;\n        const base = standaloneThemeData.base;\n        if (name.length > 0) {\n            if (isBuiltinTheme(name)) {\n                this.id = name;\n            }\n            else {\n                this.id = base + ' ' + name;\n            }\n            this.themeName = name;\n        }\n        else {\n            this.id = base;\n            this.themeName = base;\n        }\n        this.colors = null;\n        this.defaultColors = Object.create(null);\n        this._tokenTheme = null;\n    }\n    get base() {\n        return this.themeData.base;\n    }\n    notifyBaseUpdated() {\n        if (this.themeData.inherit) {\n            this.colors = null;\n            this._tokenTheme = null;\n        }\n    }\n    getColors() {\n        if (!this.colors) {\n            const colors = new Map();\n            for (const id in this.themeData.colors) {\n                colors.set(id, Color.fromHex(this.themeData.colors[id]));\n            }\n            if (this.themeData.inherit) {\n                const baseData = getBuiltinRules(this.themeData.base);\n                for (const id in baseData.colors) {\n                    if (!colors.has(id)) {\n                        colors.set(id, Color.fromHex(baseData.colors[id]));\n                    }\n                }\n            }\n            this.colors = colors;\n        }\n        return this.colors;\n    }\n    getColor(colorId, useDefault) {\n        const color = this.getColors().get(colorId);\n        if (color) {\n            return color;\n        }\n        if (useDefault !== false) {\n            return this.getDefault(colorId);\n        }\n        return undefined;\n    }\n    getDefault(colorId) {\n        let color = this.defaultColors[colorId];\n        if (color) {\n            return color;\n        }\n        color = colorRegistry.resolveDefaultColor(colorId, this);\n        this.defaultColors[colorId] = color;\n        return color;\n    }\n    defines(colorId) {\n        return this.getColors().has(colorId);\n    }\n    get type() {\n        switch (this.base) {\n            case VS_LIGHT_THEME_NAME: return ColorScheme.LIGHT;\n            case HC_BLACK_THEME_NAME: return ColorScheme.HIGH_CONTRAST_DARK;\n            case HC_LIGHT_THEME_NAME: return ColorScheme.HIGH_CONTRAST_LIGHT;\n            default: return ColorScheme.DARK;\n        }\n    }\n    get tokenTheme() {\n        if (!this._tokenTheme) {\n            let rules = [];\n            let encodedTokensColors = [];\n            if (this.themeData.inherit) {\n                const baseData = getBuiltinRules(this.themeData.base);\n                rules = baseData.rules;\n                if (baseData.encodedTokensColors) {\n                    encodedTokensColors = baseData.encodedTokensColors;\n                }\n            }\n            // Pick up default colors from `editor.foreground` and `editor.background` if available\n            const editorForeground = this.themeData.colors['editor.foreground'];\n            const editorBackground = this.themeData.colors['editor.background'];\n            if (editorForeground || editorBackground) {\n                const rule = { token: '' };\n                if (editorForeground) {\n                    rule.foreground = editorForeground;\n                }\n                if (editorBackground) {\n                    rule.background = editorBackground;\n                }\n                rules.push(rule);\n            }\n            rules = rules.concat(this.themeData.rules);\n            if (this.themeData.encodedTokensColors) {\n                encodedTokensColors = this.themeData.encodedTokensColors;\n            }\n            this._tokenTheme = TokenTheme.createFromRawTokenTheme(rules, encodedTokensColors);\n        }\n        return this._tokenTheme;\n    }\n    getTokenStyleMetadata(type, modifiers, modelLanguage) {\n        // use theme rules match\n        const style = this.tokenTheme._match([type].concat(modifiers).join('.'));\n        const metadata = style.metadata;\n        const foreground = TokenMetadata.getForeground(metadata);\n        const fontStyle = TokenMetadata.getFontStyle(metadata);\n        return {\n            foreground: foreground,\n            italic: Boolean(fontStyle & 1 /* FontStyle.Italic */),\n            bold: Boolean(fontStyle & 2 /* FontStyle.Bold */),\n            underline: Boolean(fontStyle & 4 /* FontStyle.Underline */),\n            strikethrough: Boolean(fontStyle & 8 /* FontStyle.Strikethrough */)\n        };\n    }\n    get tokenColorMap() {\n        return [];\n    }\n}\nfunction isBuiltinTheme(themeName) {\n    return (themeName === VS_LIGHT_THEME_NAME\n        || themeName === VS_DARK_THEME_NAME\n        || themeName === HC_BLACK_THEME_NAME\n        || themeName === HC_LIGHT_THEME_NAME);\n}\nfunction getBuiltinRules(builtinTheme) {\n    switch (builtinTheme) {\n        case VS_LIGHT_THEME_NAME:\n            return vs;\n        case VS_DARK_THEME_NAME:\n            return vs_dark;\n        case HC_BLACK_THEME_NAME:\n            return hc_black;\n        case HC_LIGHT_THEME_NAME:\n            return hc_light;\n    }\n}\nfunction newBuiltInTheme(builtinTheme) {\n    const themeData = getBuiltinRules(builtinTheme);\n    return new StandaloneTheme(builtinTheme, themeData);\n}\nclass StandaloneThemeService extends Disposable {\n    constructor() {\n        super();\n        this._onColorThemeChange = this._register(new Emitter());\n        this.onDidColorThemeChange = this._onColorThemeChange.event;\n        this._onProductIconThemeChange = this._register(new Emitter());\n        this.onDidProductIconThemeChange = this._onProductIconThemeChange.event;\n        this._environment = Object.create(null);\n        this._builtInProductIconTheme = new UnthemedProductIconTheme();\n        this._autoDetectHighContrast = true;\n        this._knownThemes = new Map();\n        this._knownThemes.set(VS_LIGHT_THEME_NAME, newBuiltInTheme(VS_LIGHT_THEME_NAME));\n        this._knownThemes.set(VS_DARK_THEME_NAME, newBuiltInTheme(VS_DARK_THEME_NAME));\n        this._knownThemes.set(HC_BLACK_THEME_NAME, newBuiltInTheme(HC_BLACK_THEME_NAME));\n        this._knownThemes.set(HC_LIGHT_THEME_NAME, newBuiltInTheme(HC_LIGHT_THEME_NAME));\n        const iconsStyleSheet = this._register(getIconsStyleSheet(this));\n        this._codiconCSS = iconsStyleSheet.getCSS();\n        this._themeCSS = '';\n        this._allCSS = `${this._codiconCSS}\\n${this._themeCSS}`;\n        this._globalStyleElement = null;\n        this._styleElements = [];\n        this._colorMapOverride = null;\n        this.setTheme(VS_LIGHT_THEME_NAME);\n        this._onOSSchemeChanged();\n        this._register(iconsStyleSheet.onDidChange(() => {\n            this._codiconCSS = iconsStyleSheet.getCSS();\n            this._updateCSS();\n        }));\n        addMatchMediaChangeListener(mainWindow, '(forced-colors: active)', () => {\n            // Update theme selection for auto-detecting high contrast\n            this._onOSSchemeChanged();\n        });\n    }\n    registerEditorContainer(domNode) {\n        if (isInShadowDOM(domNode)) {\n            return this._registerShadowDomContainer(domNode);\n        }\n        return this._registerRegularEditorContainer();\n    }\n    _registerRegularEditorContainer() {\n        if (!this._globalStyleElement) {\n            this._globalStyleElement = createStyleSheet(undefined, style => {\n                style.className = 'monaco-colors';\n                style.textContent = this._allCSS;\n            });\n            this._styleElements.push(this._globalStyleElement);\n        }\n        return Disposable.None;\n    }\n    _registerShadowDomContainer(domNode) {\n        const styleElement = createStyleSheet(domNode, style => {\n            style.className = 'monaco-colors';\n            style.textContent = this._allCSS;\n        });\n        this._styleElements.push(styleElement);\n        return {\n            dispose: () => {\n                for (let i = 0; i < this._styleElements.length; i++) {\n                    if (this._styleElements[i] === styleElement) {\n                        this._styleElements.splice(i, 1);\n                        return;\n                    }\n                }\n            }\n        };\n    }\n    defineTheme(themeName, themeData) {\n        if (!/^[a-z0-9\\-]+$/i.test(themeName)) {\n            throw new Error('Illegal theme name!');\n        }\n        if (!isBuiltinTheme(themeData.base) && !isBuiltinTheme(themeName)) {\n            throw new Error('Illegal theme base!');\n        }\n        // set or replace theme\n        this._knownThemes.set(themeName, new StandaloneTheme(themeName, themeData));\n        if (isBuiltinTheme(themeName)) {\n            this._knownThemes.forEach(theme => {\n                if (theme.base === themeName) {\n                    theme.notifyBaseUpdated();\n                }\n            });\n        }\n        if (this._theme.themeName === themeName) {\n            this.setTheme(themeName); // refresh theme\n        }\n    }\n    getColorTheme() {\n        return this._theme;\n    }\n    setColorMapOverride(colorMapOverride) {\n        this._colorMapOverride = colorMapOverride;\n        this._updateThemeOrColorMap();\n    }\n    setTheme(themeName) {\n        let theme;\n        if (this._knownThemes.has(themeName)) {\n            theme = this._knownThemes.get(themeName);\n        }\n        else {\n            theme = this._knownThemes.get(VS_LIGHT_THEME_NAME);\n        }\n        this._updateActualTheme(theme);\n    }\n    _updateActualTheme(desiredTheme) {\n        if (!desiredTheme || this._theme === desiredTheme) {\n            // Nothing to do\n            return;\n        }\n        this._theme = desiredTheme;\n        this._updateThemeOrColorMap();\n    }\n    _onOSSchemeChanged() {\n        if (this._autoDetectHighContrast) {\n            const wantsHighContrast = mainWindow.matchMedia(`(forced-colors: active)`).matches;\n            if (wantsHighContrast !== isHighContrast(this._theme.type)) {\n                // switch to high contrast or non-high contrast but stick to dark or light\n                let newThemeName;\n                if (isDark(this._theme.type)) {\n                    newThemeName = wantsHighContrast ? HC_BLACK_THEME_NAME : VS_DARK_THEME_NAME;\n                }\n                else {\n                    newThemeName = wantsHighContrast ? HC_LIGHT_THEME_NAME : VS_LIGHT_THEME_NAME;\n                }\n                this._updateActualTheme(this._knownThemes.get(newThemeName));\n            }\n        }\n    }\n    setAutoDetectHighContrast(autoDetectHighContrast) {\n        this._autoDetectHighContrast = autoDetectHighContrast;\n        this._onOSSchemeChanged();\n    }\n    _updateThemeOrColorMap() {\n        const cssRules = [];\n        const hasRule = {};\n        const ruleCollector = {\n            addRule: (rule) => {\n                if (!hasRule[rule]) {\n                    cssRules.push(rule);\n                    hasRule[rule] = true;\n                }\n            }\n        };\n        themingRegistry.getThemingParticipants().forEach(p => p(this._theme, ruleCollector, this._environment));\n        const colorVariables = [];\n        for (const item of colorRegistry.getColors()) {\n            const color = this._theme.getColor(item.id, true);\n            if (color) {\n                colorVariables.push(`${asCssVariableName(item.id)}: ${color.toString()};`);\n            }\n        }\n        ruleCollector.addRule(`.monaco-editor, .monaco-diff-editor, .monaco-component { ${colorVariables.join('\\n')} }`);\n        const colorMap = this._colorMapOverride || this._theme.tokenTheme.getColorMap();\n        ruleCollector.addRule(generateTokensCSSForColorMap(colorMap));\n        // If the OS has forced-colors active, disable forced color adjustment for\n        // Monaco editor elements so that VS Code's built-in high contrast themes\n        // (hc-black / hc-light) are used instead of the OS forcing system colors.\n        ruleCollector.addRule(`.monaco-editor, .monaco-diff-editor, .monaco-component { forced-color-adjust: none; }`);\n        this._themeCSS = cssRules.join('\\n');\n        this._updateCSS();\n        TokenizationRegistry.setColorMap(colorMap);\n        this._onColorThemeChange.fire(this._theme);\n    }\n    _updateCSS() {\n        this._allCSS = `${this._codiconCSS}\\n${this._themeCSS}`;\n        this._styleElements.forEach(styleElement => styleElement.textContent = this._allCSS);\n    }\n    getFileIconTheme() {\n        return {\n            hasFileIcons: false,\n            hasFolderIcons: false,\n            hidesExplorerArrows: false\n        };\n    }\n    getProductIconTheme() {\n        return this._builtInProductIconTheme;\n    }\n}\n\nexport { HC_BLACK_THEME_NAME, HC_LIGHT_THEME_NAME, StandaloneThemeService, VS_DARK_THEME_NAME, VS_LIGHT_THEME_NAME };\n","import { registerEditorAction, EditorAction } from '../../../browser/editorExtensions.js';\nimport { IStandaloneThemeService } from '../../common/standaloneTheme.js';\nimport { ToggleHighContrastNLS } from '../../../common/standaloneStrings.js';\nimport { isHighContrast, isDark } from '../../../../platform/theme/common/theme.js';\nimport { VS_DARK_THEME_NAME, VS_LIGHT_THEME_NAME, HC_BLACK_THEME_NAME, HC_LIGHT_THEME_NAME } from '../standaloneThemeService.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ToggleHighContrast extends EditorAction {\n    constructor() {\n        super({\n            id: 'editor.action.toggleHighContrast',\n            label: ToggleHighContrastNLS.toggleHighContrast,\n            alias: 'Toggle High Contrast Theme',\n            precondition: undefined\n        });\n        this._originalThemeName = null;\n    }\n    run(accessor, editor) {\n        const standaloneThemeService = accessor.get(IStandaloneThemeService);\n        const currentTheme = standaloneThemeService.getColorTheme();\n        if (isHighContrast(currentTheme.type)) {\n            // We must toggle back to the integrator's theme\n            standaloneThemeService.setTheme(this._originalThemeName || (isDark(currentTheme.type) ? VS_DARK_THEME_NAME : VS_LIGHT_THEME_NAME));\n            this._originalThemeName = null;\n        }\n        else {\n            standaloneThemeService.setTheme(isDark(currentTheme.type) ? HC_BLACK_THEME_NAME : HC_LIGHT_THEME_NAME);\n            this._originalThemeName = currentTheme.themeName;\n        }\n    }\n}\nregisterEditorAction(ToggleHighContrast);\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// THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY.\nvar AccessibilitySupport;\n(function (AccessibilitySupport) {\n    /**\n     * This should be the browser case where it is not known if a screen reader is attached or no.\n     */\n    AccessibilitySupport[AccessibilitySupport[\"Unknown\"] = 0] = \"Unknown\";\n    AccessibilitySupport[AccessibilitySupport[\"Disabled\"] = 1] = \"Disabled\";\n    AccessibilitySupport[AccessibilitySupport[\"Enabled\"] = 2] = \"Enabled\";\n})(AccessibilitySupport || (AccessibilitySupport = {}));\nvar CodeActionTriggerType;\n(function (CodeActionTriggerType) {\n    CodeActionTriggerType[CodeActionTriggerType[\"Invoke\"] = 1] = \"Invoke\";\n    CodeActionTriggerType[CodeActionTriggerType[\"Auto\"] = 2] = \"Auto\";\n})(CodeActionTriggerType || (CodeActionTriggerType = {}));\nvar CompletionItemInsertTextRule;\n(function (CompletionItemInsertTextRule) {\n    CompletionItemInsertTextRule[CompletionItemInsertTextRule[\"None\"] = 0] = \"None\";\n    /**\n     * Adjust whitespace/indentation of multiline insert texts to\n     * match the current line indentation.\n     */\n    CompletionItemInsertTextRule[CompletionItemInsertTextRule[\"KeepWhitespace\"] = 1] = \"KeepWhitespace\";\n    /**\n     * `insertText` is a snippet.\n     */\n    CompletionItemInsertTextRule[CompletionItemInsertTextRule[\"InsertAsSnippet\"] = 4] = \"InsertAsSnippet\";\n})(CompletionItemInsertTextRule || (CompletionItemInsertTextRule = {}));\nvar CompletionItemKind;\n(function (CompletionItemKind) {\n    CompletionItemKind[CompletionItemKind[\"Method\"] = 0] = \"Method\";\n    CompletionItemKind[CompletionItemKind[\"Function\"] = 1] = \"Function\";\n    CompletionItemKind[CompletionItemKind[\"Constructor\"] = 2] = \"Constructor\";\n    CompletionItemKind[CompletionItemKind[\"Field\"] = 3] = \"Field\";\n    CompletionItemKind[CompletionItemKind[\"Variable\"] = 4] = \"Variable\";\n    CompletionItemKind[CompletionItemKind[\"Class\"] = 5] = \"Class\";\n    CompletionItemKind[CompletionItemKind[\"Struct\"] = 6] = \"Struct\";\n    CompletionItemKind[CompletionItemKind[\"Interface\"] = 7] = \"Interface\";\n    CompletionItemKind[CompletionItemKind[\"Module\"] = 8] = \"Module\";\n    CompletionItemKind[CompletionItemKind[\"Property\"] = 9] = \"Property\";\n    CompletionItemKind[CompletionItemKind[\"Event\"] = 10] = \"Event\";\n    CompletionItemKind[CompletionItemKind[\"Operator\"] = 11] = \"Operator\";\n    CompletionItemKind[CompletionItemKind[\"Unit\"] = 12] = \"Unit\";\n    CompletionItemKind[CompletionItemKind[\"Value\"] = 13] = \"Value\";\n    CompletionItemKind[CompletionItemKind[\"Constant\"] = 14] = \"Constant\";\n    CompletionItemKind[CompletionItemKind[\"Enum\"] = 15] = \"Enum\";\n    CompletionItemKind[CompletionItemKind[\"EnumMember\"] = 16] = \"EnumMember\";\n    CompletionItemKind[CompletionItemKind[\"Keyword\"] = 17] = \"Keyword\";\n    CompletionItemKind[CompletionItemKind[\"Text\"] = 18] = \"Text\";\n    CompletionItemKind[CompletionItemKind[\"Color\"] = 19] = \"Color\";\n    CompletionItemKind[CompletionItemKind[\"File\"] = 20] = \"File\";\n    CompletionItemKind[CompletionItemKind[\"Reference\"] = 21] = \"Reference\";\n    CompletionItemKind[CompletionItemKind[\"Customcolor\"] = 22] = \"Customcolor\";\n    CompletionItemKind[CompletionItemKind[\"Folder\"] = 23] = \"Folder\";\n    CompletionItemKind[CompletionItemKind[\"TypeParameter\"] = 24] = \"TypeParameter\";\n    CompletionItemKind[CompletionItemKind[\"User\"] = 25] = \"User\";\n    CompletionItemKind[CompletionItemKind[\"Issue\"] = 26] = \"Issue\";\n    CompletionItemKind[CompletionItemKind[\"Tool\"] = 27] = \"Tool\";\n    CompletionItemKind[CompletionItemKind[\"Snippet\"] = 28] = \"Snippet\";\n})(CompletionItemKind || (CompletionItemKind = {}));\nvar CompletionItemTag;\n(function (CompletionItemTag) {\n    CompletionItemTag[CompletionItemTag[\"Deprecated\"] = 1] = \"Deprecated\";\n})(CompletionItemTag || (CompletionItemTag = {}));\n/**\n * How a suggest provider was triggered.\n */\nvar CompletionTriggerKind;\n(function (CompletionTriggerKind) {\n    CompletionTriggerKind[CompletionTriggerKind[\"Invoke\"] = 0] = \"Invoke\";\n    CompletionTriggerKind[CompletionTriggerKind[\"TriggerCharacter\"] = 1] = \"TriggerCharacter\";\n    CompletionTriggerKind[CompletionTriggerKind[\"TriggerForIncompleteCompletions\"] = 2] = \"TriggerForIncompleteCompletions\";\n})(CompletionTriggerKind || (CompletionTriggerKind = {}));\n/**\n * A positioning preference for rendering content widgets.\n */\nvar ContentWidgetPositionPreference;\n(function (ContentWidgetPositionPreference) {\n    /**\n     * Place the content widget exactly at a position\n     */\n    ContentWidgetPositionPreference[ContentWidgetPositionPreference[\"EXACT\"] = 0] = \"EXACT\";\n    /**\n     * Place the content widget above a position\n     */\n    ContentWidgetPositionPreference[ContentWidgetPositionPreference[\"ABOVE\"] = 1] = \"ABOVE\";\n    /**\n     * Place the content widget below a position\n     */\n    ContentWidgetPositionPreference[ContentWidgetPositionPreference[\"BELOW\"] = 2] = \"BELOW\";\n})(ContentWidgetPositionPreference || (ContentWidgetPositionPreference = {}));\n/**\n * Describes the reason the cursor has changed its position.\n */\nvar CursorChangeReason;\n(function (CursorChangeReason) {\n    /**\n     * Unknown or not set.\n     */\n    CursorChangeReason[CursorChangeReason[\"NotSet\"] = 0] = \"NotSet\";\n    /**\n     * A `model.setValue()` was called.\n     */\n    CursorChangeReason[CursorChangeReason[\"ContentFlush\"] = 1] = \"ContentFlush\";\n    /**\n     * The `model` has been changed outside of this cursor and the cursor recovers its position from associated markers.\n     */\n    CursorChangeReason[CursorChangeReason[\"RecoverFromMarkers\"] = 2] = \"RecoverFromMarkers\";\n    /**\n     * There was an explicit user gesture.\n     */\n    CursorChangeReason[CursorChangeReason[\"Explicit\"] = 3] = \"Explicit\";\n    /**\n     * There was a Paste.\n     */\n    CursorChangeReason[CursorChangeReason[\"Paste\"] = 4] = \"Paste\";\n    /**\n     * There was an Undo.\n     */\n    CursorChangeReason[CursorChangeReason[\"Undo\"] = 5] = \"Undo\";\n    /**\n     * There was a Redo.\n     */\n    CursorChangeReason[CursorChangeReason[\"Redo\"] = 6] = \"Redo\";\n})(CursorChangeReason || (CursorChangeReason = {}));\n/**\n * The default end of line to use when instantiating models.\n */\nvar DefaultEndOfLine;\n(function (DefaultEndOfLine) {\n    /**\n     * Use line feed (\\n) as the end of line character.\n     */\n    DefaultEndOfLine[DefaultEndOfLine[\"LF\"] = 1] = \"LF\";\n    /**\n     * Use carriage return and line feed (\\r\\n) as the end of line character.\n     */\n    DefaultEndOfLine[DefaultEndOfLine[\"CRLF\"] = 2] = \"CRLF\";\n})(DefaultEndOfLine || (DefaultEndOfLine = {}));\n/**\n * A document highlight kind.\n */\nvar DocumentHighlightKind;\n(function (DocumentHighlightKind) {\n    /**\n     * A textual occurrence.\n     */\n    DocumentHighlightKind[DocumentHighlightKind[\"Text\"] = 0] = \"Text\";\n    /**\n     * Read-access of a symbol, like reading a variable.\n     */\n    DocumentHighlightKind[DocumentHighlightKind[\"Read\"] = 1] = \"Read\";\n    /**\n     * Write-access of a symbol, like writing to a variable.\n     */\n    DocumentHighlightKind[DocumentHighlightKind[\"Write\"] = 2] = \"Write\";\n})(DocumentHighlightKind || (DocumentHighlightKind = {}));\n/**\n * Configuration options for auto indentation in the editor\n */\nvar EditorAutoIndentStrategy;\n(function (EditorAutoIndentStrategy) {\n    EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"None\"] = 0] = \"None\";\n    EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"Keep\"] = 1] = \"Keep\";\n    EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"Brackets\"] = 2] = \"Brackets\";\n    EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"Advanced\"] = 3] = \"Advanced\";\n    EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"Full\"] = 4] = \"Full\";\n})(EditorAutoIndentStrategy || (EditorAutoIndentStrategy = {}));\nvar EditorOption;\n(function (EditorOption) {\n    EditorOption[EditorOption[\"acceptSuggestionOnCommitCharacter\"] = 0] = \"acceptSuggestionOnCommitCharacter\";\n    EditorOption[EditorOption[\"acceptSuggestionOnEnter\"] = 1] = \"acceptSuggestionOnEnter\";\n    EditorOption[EditorOption[\"accessibilitySupport\"] = 2] = \"accessibilitySupport\";\n    EditorOption[EditorOption[\"accessibilityPageSize\"] = 3] = \"accessibilityPageSize\";\n    EditorOption[EditorOption[\"allowOverflow\"] = 4] = \"allowOverflow\";\n    EditorOption[EditorOption[\"allowVariableLineHeights\"] = 5] = \"allowVariableLineHeights\";\n    EditorOption[EditorOption[\"allowVariableFonts\"] = 6] = \"allowVariableFonts\";\n    EditorOption[EditorOption[\"allowVariableFontsInAccessibilityMode\"] = 7] = \"allowVariableFontsInAccessibilityMode\";\n    EditorOption[EditorOption[\"ariaLabel\"] = 8] = \"ariaLabel\";\n    EditorOption[EditorOption[\"ariaRequired\"] = 9] = \"ariaRequired\";\n    EditorOption[EditorOption[\"autoClosingBrackets\"] = 10] = \"autoClosingBrackets\";\n    EditorOption[EditorOption[\"autoClosingComments\"] = 11] = \"autoClosingComments\";\n    EditorOption[EditorOption[\"screenReaderAnnounceInlineSuggestion\"] = 12] = \"screenReaderAnnounceInlineSuggestion\";\n    EditorOption[EditorOption[\"autoClosingDelete\"] = 13] = \"autoClosingDelete\";\n    EditorOption[EditorOption[\"autoClosingOvertype\"] = 14] = \"autoClosingOvertype\";\n    EditorOption[EditorOption[\"autoClosingQuotes\"] = 15] = \"autoClosingQuotes\";\n    EditorOption[EditorOption[\"autoIndent\"] = 16] = \"autoIndent\";\n    EditorOption[EditorOption[\"autoIndentOnPaste\"] = 17] = \"autoIndentOnPaste\";\n    EditorOption[EditorOption[\"autoIndentOnPasteWithinString\"] = 18] = \"autoIndentOnPasteWithinString\";\n    EditorOption[EditorOption[\"automaticLayout\"] = 19] = \"automaticLayout\";\n    EditorOption[EditorOption[\"autoSurround\"] = 20] = \"autoSurround\";\n    EditorOption[EditorOption[\"bracketPairColorization\"] = 21] = \"bracketPairColorization\";\n    EditorOption[EditorOption[\"guides\"] = 22] = \"guides\";\n    EditorOption[EditorOption[\"codeLens\"] = 23] = \"codeLens\";\n    EditorOption[EditorOption[\"codeLensFontFamily\"] = 24] = \"codeLensFontFamily\";\n    EditorOption[EditorOption[\"codeLensFontSize\"] = 25] = \"codeLensFontSize\";\n    EditorOption[EditorOption[\"colorDecorators\"] = 26] = \"colorDecorators\";\n    EditorOption[EditorOption[\"colorDecoratorsLimit\"] = 27] = \"colorDecoratorsLimit\";\n    EditorOption[EditorOption[\"columnSelection\"] = 28] = \"columnSelection\";\n    EditorOption[EditorOption[\"comments\"] = 29] = \"comments\";\n    EditorOption[EditorOption[\"contextmenu\"] = 30] = \"contextmenu\";\n    EditorOption[EditorOption[\"copyWithSyntaxHighlighting\"] = 31] = \"copyWithSyntaxHighlighting\";\n    EditorOption[EditorOption[\"cursorBlinking\"] = 32] = \"cursorBlinking\";\n    EditorOption[EditorOption[\"cursorSmoothCaretAnimation\"] = 33] = \"cursorSmoothCaretAnimation\";\n    EditorOption[EditorOption[\"cursorStyle\"] = 34] = \"cursorStyle\";\n    EditorOption[EditorOption[\"cursorSurroundingLines\"] = 35] = \"cursorSurroundingLines\";\n    EditorOption[EditorOption[\"cursorSurroundingLinesStyle\"] = 36] = \"cursorSurroundingLinesStyle\";\n    EditorOption[EditorOption[\"cursorWidth\"] = 37] = \"cursorWidth\";\n    EditorOption[EditorOption[\"cursorHeight\"] = 38] = \"cursorHeight\";\n    EditorOption[EditorOption[\"disableLayerHinting\"] = 39] = \"disableLayerHinting\";\n    EditorOption[EditorOption[\"disableMonospaceOptimizations\"] = 40] = \"disableMonospaceOptimizations\";\n    EditorOption[EditorOption[\"domReadOnly\"] = 41] = \"domReadOnly\";\n    EditorOption[EditorOption[\"dragAndDrop\"] = 42] = \"dragAndDrop\";\n    EditorOption[EditorOption[\"dropIntoEditor\"] = 43] = \"dropIntoEditor\";\n    EditorOption[EditorOption[\"editContext\"] = 44] = \"editContext\";\n    EditorOption[EditorOption[\"emptySelectionClipboard\"] = 45] = \"emptySelectionClipboard\";\n    EditorOption[EditorOption[\"experimentalGpuAcceleration\"] = 46] = \"experimentalGpuAcceleration\";\n    EditorOption[EditorOption[\"experimentalWhitespaceRendering\"] = 47] = \"experimentalWhitespaceRendering\";\n    EditorOption[EditorOption[\"extraEditorClassName\"] = 48] = \"extraEditorClassName\";\n    EditorOption[EditorOption[\"fastScrollSensitivity\"] = 49] = \"fastScrollSensitivity\";\n    EditorOption[EditorOption[\"find\"] = 50] = \"find\";\n    EditorOption[EditorOption[\"fixedOverflowWidgets\"] = 51] = \"fixedOverflowWidgets\";\n    EditorOption[EditorOption[\"folding\"] = 52] = \"folding\";\n    EditorOption[EditorOption[\"foldingStrategy\"] = 53] = \"foldingStrategy\";\n    EditorOption[EditorOption[\"foldingHighlight\"] = 54] = \"foldingHighlight\";\n    EditorOption[EditorOption[\"foldingImportsByDefault\"] = 55] = \"foldingImportsByDefault\";\n    EditorOption[EditorOption[\"foldingMaximumRegions\"] = 56] = \"foldingMaximumRegions\";\n    EditorOption[EditorOption[\"unfoldOnClickAfterEndOfLine\"] = 57] = \"unfoldOnClickAfterEndOfLine\";\n    EditorOption[EditorOption[\"fontFamily\"] = 58] = \"fontFamily\";\n    EditorOption[EditorOption[\"fontInfo\"] = 59] = \"fontInfo\";\n    EditorOption[EditorOption[\"fontLigatures\"] = 60] = \"fontLigatures\";\n    EditorOption[EditorOption[\"fontSize\"] = 61] = \"fontSize\";\n    EditorOption[EditorOption[\"fontWeight\"] = 62] = \"fontWeight\";\n    EditorOption[EditorOption[\"fontVariations\"] = 63] = \"fontVariations\";\n    EditorOption[EditorOption[\"formatOnPaste\"] = 64] = \"formatOnPaste\";\n    EditorOption[EditorOption[\"formatOnType\"] = 65] = \"formatOnType\";\n    EditorOption[EditorOption[\"glyphMargin\"] = 66] = \"glyphMargin\";\n    EditorOption[EditorOption[\"gotoLocation\"] = 67] = \"gotoLocation\";\n    EditorOption[EditorOption[\"hideCursorInOverviewRuler\"] = 68] = \"hideCursorInOverviewRuler\";\n    EditorOption[EditorOption[\"hover\"] = 69] = \"hover\";\n    EditorOption[EditorOption[\"inDiffEditor\"] = 70] = \"inDiffEditor\";\n    EditorOption[EditorOption[\"inlineSuggest\"] = 71] = \"inlineSuggest\";\n    EditorOption[EditorOption[\"letterSpacing\"] = 72] = \"letterSpacing\";\n    EditorOption[EditorOption[\"lightbulb\"] = 73] = \"lightbulb\";\n    EditorOption[EditorOption[\"lineDecorationsWidth\"] = 74] = \"lineDecorationsWidth\";\n    EditorOption[EditorOption[\"lineHeight\"] = 75] = \"lineHeight\";\n    EditorOption[EditorOption[\"lineNumbers\"] = 76] = \"lineNumbers\";\n    EditorOption[EditorOption[\"lineNumbersMinChars\"] = 77] = \"lineNumbersMinChars\";\n    EditorOption[EditorOption[\"linkedEditing\"] = 78] = \"linkedEditing\";\n    EditorOption[EditorOption[\"links\"] = 79] = \"links\";\n    EditorOption[EditorOption[\"matchBrackets\"] = 80] = \"matchBrackets\";\n    EditorOption[EditorOption[\"minimap\"] = 81] = \"minimap\";\n    EditorOption[EditorOption[\"mouseStyle\"] = 82] = \"mouseStyle\";\n    EditorOption[EditorOption[\"mouseWheelScrollSensitivity\"] = 83] = \"mouseWheelScrollSensitivity\";\n    EditorOption[EditorOption[\"mouseWheelZoom\"] = 84] = \"mouseWheelZoom\";\n    EditorOption[EditorOption[\"multiCursorMergeOverlapping\"] = 85] = \"multiCursorMergeOverlapping\";\n    EditorOption[EditorOption[\"multiCursorModifier\"] = 86] = \"multiCursorModifier\";\n    EditorOption[EditorOption[\"mouseMiddleClickAction\"] = 87] = \"mouseMiddleClickAction\";\n    EditorOption[EditorOption[\"multiCursorPaste\"] = 88] = \"multiCursorPaste\";\n    EditorOption[EditorOption[\"multiCursorLimit\"] = 89] = \"multiCursorLimit\";\n    EditorOption[EditorOption[\"occurrencesHighlight\"] = 90] = \"occurrencesHighlight\";\n    EditorOption[EditorOption[\"occurrencesHighlightDelay\"] = 91] = \"occurrencesHighlightDelay\";\n    EditorOption[EditorOption[\"overtypeCursorStyle\"] = 92] = \"overtypeCursorStyle\";\n    EditorOption[EditorOption[\"overtypeOnPaste\"] = 93] = \"overtypeOnPaste\";\n    EditorOption[EditorOption[\"overviewRulerBorder\"] = 94] = \"overviewRulerBorder\";\n    EditorOption[EditorOption[\"overviewRulerLanes\"] = 95] = \"overviewRulerLanes\";\n    EditorOption[EditorOption[\"padding\"] = 96] = \"padding\";\n    EditorOption[EditorOption[\"pasteAs\"] = 97] = \"pasteAs\";\n    EditorOption[EditorOption[\"parameterHints\"] = 98] = \"parameterHints\";\n    EditorOption[EditorOption[\"peekWidgetDefaultFocus\"] = 99] = \"peekWidgetDefaultFocus\";\n    EditorOption[EditorOption[\"placeholder\"] = 100] = \"placeholder\";\n    EditorOption[EditorOption[\"definitionLinkOpensInPeek\"] = 101] = \"definitionLinkOpensInPeek\";\n    EditorOption[EditorOption[\"quickSuggestions\"] = 102] = \"quickSuggestions\";\n    EditorOption[EditorOption[\"quickSuggestionsDelay\"] = 103] = \"quickSuggestionsDelay\";\n    EditorOption[EditorOption[\"readOnly\"] = 104] = \"readOnly\";\n    EditorOption[EditorOption[\"readOnlyMessage\"] = 105] = \"readOnlyMessage\";\n    EditorOption[EditorOption[\"renameOnType\"] = 106] = \"renameOnType\";\n    EditorOption[EditorOption[\"renderRichScreenReaderContent\"] = 107] = \"renderRichScreenReaderContent\";\n    EditorOption[EditorOption[\"renderControlCharacters\"] = 108] = \"renderControlCharacters\";\n    EditorOption[EditorOption[\"renderFinalNewline\"] = 109] = \"renderFinalNewline\";\n    EditorOption[EditorOption[\"renderLineHighlight\"] = 110] = \"renderLineHighlight\";\n    EditorOption[EditorOption[\"renderLineHighlightOnlyWhenFocus\"] = 111] = \"renderLineHighlightOnlyWhenFocus\";\n    EditorOption[EditorOption[\"renderValidationDecorations\"] = 112] = \"renderValidationDecorations\";\n    EditorOption[EditorOption[\"renderWhitespace\"] = 113] = \"renderWhitespace\";\n    EditorOption[EditorOption[\"revealHorizontalRightPadding\"] = 114] = \"revealHorizontalRightPadding\";\n    EditorOption[EditorOption[\"roundedSelection\"] = 115] = \"roundedSelection\";\n    EditorOption[EditorOption[\"rulers\"] = 116] = \"rulers\";\n    EditorOption[EditorOption[\"scrollbar\"] = 117] = \"scrollbar\";\n    EditorOption[EditorOption[\"scrollBeyondLastColumn\"] = 118] = \"scrollBeyondLastColumn\";\n    EditorOption[EditorOption[\"scrollBeyondLastLine\"] = 119] = \"scrollBeyondLastLine\";\n    EditorOption[EditorOption[\"scrollPredominantAxis\"] = 120] = \"scrollPredominantAxis\";\n    EditorOption[EditorOption[\"selectionClipboard\"] = 121] = \"selectionClipboard\";\n    EditorOption[EditorOption[\"selectionHighlight\"] = 122] = \"selectionHighlight\";\n    EditorOption[EditorOption[\"selectionHighlightMaxLength\"] = 123] = \"selectionHighlightMaxLength\";\n    EditorOption[EditorOption[\"selectionHighlightMultiline\"] = 124] = \"selectionHighlightMultiline\";\n    EditorOption[EditorOption[\"selectOnLineNumbers\"] = 125] = \"selectOnLineNumbers\";\n    EditorOption[EditorOption[\"showFoldingControls\"] = 126] = \"showFoldingControls\";\n    EditorOption[EditorOption[\"showUnused\"] = 127] = \"showUnused\";\n    EditorOption[EditorOption[\"snippetSuggestions\"] = 128] = \"snippetSuggestions\";\n    EditorOption[EditorOption[\"smartSelect\"] = 129] = \"smartSelect\";\n    EditorOption[EditorOption[\"smoothScrolling\"] = 130] = \"smoothScrolling\";\n    EditorOption[EditorOption[\"stickyScroll\"] = 131] = \"stickyScroll\";\n    EditorOption[EditorOption[\"stickyTabStops\"] = 132] = \"stickyTabStops\";\n    EditorOption[EditorOption[\"stopRenderingLineAfter\"] = 133] = \"stopRenderingLineAfter\";\n    EditorOption[EditorOption[\"suggest\"] = 134] = \"suggest\";\n    EditorOption[EditorOption[\"suggestFontSize\"] = 135] = \"suggestFontSize\";\n    EditorOption[EditorOption[\"suggestLineHeight\"] = 136] = \"suggestLineHeight\";\n    EditorOption[EditorOption[\"suggestOnTriggerCharacters\"] = 137] = \"suggestOnTriggerCharacters\";\n    EditorOption[EditorOption[\"suggestSelection\"] = 138] = \"suggestSelection\";\n    EditorOption[EditorOption[\"tabCompletion\"] = 139] = \"tabCompletion\";\n    EditorOption[EditorOption[\"tabIndex\"] = 140] = \"tabIndex\";\n    EditorOption[EditorOption[\"trimWhitespaceOnDelete\"] = 141] = \"trimWhitespaceOnDelete\";\n    EditorOption[EditorOption[\"unicodeHighlighting\"] = 142] = \"unicodeHighlighting\";\n    EditorOption[EditorOption[\"unusualLineTerminators\"] = 143] = \"unusualLineTerminators\";\n    EditorOption[EditorOption[\"useShadowDOM\"] = 144] = \"useShadowDOM\";\n    EditorOption[EditorOption[\"useTabStops\"] = 145] = \"useTabStops\";\n    EditorOption[EditorOption[\"wordBreak\"] = 146] = \"wordBreak\";\n    EditorOption[EditorOption[\"wordSegmenterLocales\"] = 147] = \"wordSegmenterLocales\";\n    EditorOption[EditorOption[\"wordSeparators\"] = 148] = \"wordSeparators\";\n    EditorOption[EditorOption[\"wordWrap\"] = 149] = \"wordWrap\";\n    EditorOption[EditorOption[\"wordWrapBreakAfterCharacters\"] = 150] = \"wordWrapBreakAfterCharacters\";\n    EditorOption[EditorOption[\"wordWrapBreakBeforeCharacters\"] = 151] = \"wordWrapBreakBeforeCharacters\";\n    EditorOption[EditorOption[\"wordWrapColumn\"] = 152] = \"wordWrapColumn\";\n    EditorOption[EditorOption[\"wordWrapOverride1\"] = 153] = \"wordWrapOverride1\";\n    EditorOption[EditorOption[\"wordWrapOverride2\"] = 154] = \"wordWrapOverride2\";\n    EditorOption[EditorOption[\"wrappingIndent\"] = 155] = \"wrappingIndent\";\n    EditorOption[EditorOption[\"wrappingStrategy\"] = 156] = \"wrappingStrategy\";\n    EditorOption[EditorOption[\"showDeprecated\"] = 157] = \"showDeprecated\";\n    EditorOption[EditorOption[\"inertialScroll\"] = 158] = \"inertialScroll\";\n    EditorOption[EditorOption[\"inlayHints\"] = 159] = \"inlayHints\";\n    EditorOption[EditorOption[\"wrapOnEscapedLineFeeds\"] = 160] = \"wrapOnEscapedLineFeeds\";\n    EditorOption[EditorOption[\"effectiveCursorStyle\"] = 161] = \"effectiveCursorStyle\";\n    EditorOption[EditorOption[\"editorClassName\"] = 162] = \"editorClassName\";\n    EditorOption[EditorOption[\"pixelRatio\"] = 163] = \"pixelRatio\";\n    EditorOption[EditorOption[\"tabFocusMode\"] = 164] = \"tabFocusMode\";\n    EditorOption[EditorOption[\"layoutInfo\"] = 165] = \"layoutInfo\";\n    EditorOption[EditorOption[\"wrappingInfo\"] = 166] = \"wrappingInfo\";\n    EditorOption[EditorOption[\"defaultColorDecorators\"] = 167] = \"defaultColorDecorators\";\n    EditorOption[EditorOption[\"colorDecoratorsActivatedOn\"] = 168] = \"colorDecoratorsActivatedOn\";\n    EditorOption[EditorOption[\"inlineCompletionsAccessibilityVerbose\"] = 169] = \"inlineCompletionsAccessibilityVerbose\";\n    EditorOption[EditorOption[\"effectiveEditContext\"] = 170] = \"effectiveEditContext\";\n    EditorOption[EditorOption[\"scrollOnMiddleClick\"] = 171] = \"scrollOnMiddleClick\";\n    EditorOption[EditorOption[\"effectiveAllowVariableFonts\"] = 172] = \"effectiveAllowVariableFonts\";\n})(EditorOption || (EditorOption = {}));\n/**\n * End of line character preference.\n */\nvar EndOfLinePreference;\n(function (EndOfLinePreference) {\n    /**\n     * Use the end of line character identified in the text buffer.\n     */\n    EndOfLinePreference[EndOfLinePreference[\"TextDefined\"] = 0] = \"TextDefined\";\n    /**\n     * Use line feed (\\n) as the end of line character.\n     */\n    EndOfLinePreference[EndOfLinePreference[\"LF\"] = 1] = \"LF\";\n    /**\n     * Use carriage return and line feed (\\r\\n) as the end of line character.\n     */\n    EndOfLinePreference[EndOfLinePreference[\"CRLF\"] = 2] = \"CRLF\";\n})(EndOfLinePreference || (EndOfLinePreference = {}));\n/**\n * End of line character preference.\n */\nvar EndOfLineSequence;\n(function (EndOfLineSequence) {\n    /**\n     * Use line feed (\\n) as the end of line character.\n     */\n    EndOfLineSequence[EndOfLineSequence[\"LF\"] = 0] = \"LF\";\n    /**\n     * Use carriage return and line feed (\\r\\n) as the end of line character.\n     */\n    EndOfLineSequence[EndOfLineSequence[\"CRLF\"] = 1] = \"CRLF\";\n})(EndOfLineSequence || (EndOfLineSequence = {}));\n/**\n * Vertical Lane in the glyph margin of the editor.\n */\nvar GlyphMarginLane;\n(function (GlyphMarginLane) {\n    GlyphMarginLane[GlyphMarginLane[\"Left\"] = 1] = \"Left\";\n    GlyphMarginLane[GlyphMarginLane[\"Center\"] = 2] = \"Center\";\n    GlyphMarginLane[GlyphMarginLane[\"Right\"] = 3] = \"Right\";\n})(GlyphMarginLane || (GlyphMarginLane = {}));\nvar HoverVerbosityAction;\n(function (HoverVerbosityAction) {\n    /**\n     * Increase the verbosity of the hover\n     */\n    HoverVerbosityAction[HoverVerbosityAction[\"Increase\"] = 0] = \"Increase\";\n    /**\n     * Decrease the verbosity of the hover\n     */\n    HoverVerbosityAction[HoverVerbosityAction[\"Decrease\"] = 1] = \"Decrease\";\n})(HoverVerbosityAction || (HoverVerbosityAction = {}));\n/**\n * Describes what to do with the indentation when pressing Enter.\n */\nvar IndentAction;\n(function (IndentAction) {\n    /**\n     * Insert new line and copy the previous line's indentation.\n     */\n    IndentAction[IndentAction[\"None\"] = 0] = \"None\";\n    /**\n     * Insert new line and indent once (relative to the previous line's indentation).\n     */\n    IndentAction[IndentAction[\"Indent\"] = 1] = \"Indent\";\n    /**\n     * Insert two new lines:\n     *  - the first one indented which will hold the cursor\n     *  - the second one at the same indentation level\n     */\n    IndentAction[IndentAction[\"IndentOutdent\"] = 2] = \"IndentOutdent\";\n    /**\n     * Insert new line and outdent once (relative to the previous line's indentation).\n     */\n    IndentAction[IndentAction[\"Outdent\"] = 3] = \"Outdent\";\n})(IndentAction || (IndentAction = {}));\nvar InjectedTextCursorStops;\n(function (InjectedTextCursorStops) {\n    InjectedTextCursorStops[InjectedTextCursorStops[\"Both\"] = 0] = \"Both\";\n    InjectedTextCursorStops[InjectedTextCursorStops[\"Right\"] = 1] = \"Right\";\n    InjectedTextCursorStops[InjectedTextCursorStops[\"Left\"] = 2] = \"Left\";\n    InjectedTextCursorStops[InjectedTextCursorStops[\"None\"] = 3] = \"None\";\n})(InjectedTextCursorStops || (InjectedTextCursorStops = {}));\nvar InlayHintKind;\n(function (InlayHintKind) {\n    InlayHintKind[InlayHintKind[\"Type\"] = 1] = \"Type\";\n    InlayHintKind[InlayHintKind[\"Parameter\"] = 2] = \"Parameter\";\n})(InlayHintKind || (InlayHintKind = {}));\nvar InlineCompletionEndOfLifeReasonKind;\n(function (InlineCompletionEndOfLifeReasonKind) {\n    InlineCompletionEndOfLifeReasonKind[InlineCompletionEndOfLifeReasonKind[\"Accepted\"] = 0] = \"Accepted\";\n    InlineCompletionEndOfLifeReasonKind[InlineCompletionEndOfLifeReasonKind[\"Rejected\"] = 1] = \"Rejected\";\n    InlineCompletionEndOfLifeReasonKind[InlineCompletionEndOfLifeReasonKind[\"Ignored\"] = 2] = \"Ignored\";\n})(InlineCompletionEndOfLifeReasonKind || (InlineCompletionEndOfLifeReasonKind = {}));\nvar InlineCompletionHintStyle;\n(function (InlineCompletionHintStyle) {\n    InlineCompletionHintStyle[InlineCompletionHintStyle[\"Code\"] = 1] = \"Code\";\n    InlineCompletionHintStyle[InlineCompletionHintStyle[\"Label\"] = 2] = \"Label\";\n})(InlineCompletionHintStyle || (InlineCompletionHintStyle = {}));\n/**\n * How an {@link InlineCompletionsProvider inline completion provider} was triggered.\n */\nvar InlineCompletionTriggerKind;\n(function (InlineCompletionTriggerKind) {\n    /**\n     * Completion was triggered automatically while editing.\n     * It is sufficient to return a single completion item in this case.\n     */\n    InlineCompletionTriggerKind[InlineCompletionTriggerKind[\"Automatic\"] = 0] = \"Automatic\";\n    /**\n     * Completion was triggered explicitly by a user gesture.\n     * Return multiple completion items to enable cycling through them.\n     */\n    InlineCompletionTriggerKind[InlineCompletionTriggerKind[\"Explicit\"] = 1] = \"Explicit\";\n})(InlineCompletionTriggerKind || (InlineCompletionTriggerKind = {}));\n/**\n * Virtual Key Codes, the value does not hold any inherent meaning.\n * Inspired somewhat from https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx\n * But these are \"more general\", as they should work across browsers & OS`s.\n */\nvar KeyCode;\n(function (KeyCode) {\n    KeyCode[KeyCode[\"DependsOnKbLayout\"] = -1] = \"DependsOnKbLayout\";\n    /**\n     * Placed first to cover the 0 value of the enum.\n     */\n    KeyCode[KeyCode[\"Unknown\"] = 0] = \"Unknown\";\n    KeyCode[KeyCode[\"Backspace\"] = 1] = \"Backspace\";\n    KeyCode[KeyCode[\"Tab\"] = 2] = \"Tab\";\n    KeyCode[KeyCode[\"Enter\"] = 3] = \"Enter\";\n    KeyCode[KeyCode[\"Shift\"] = 4] = \"Shift\";\n    KeyCode[KeyCode[\"Ctrl\"] = 5] = \"Ctrl\";\n    KeyCode[KeyCode[\"Alt\"] = 6] = \"Alt\";\n    KeyCode[KeyCode[\"PauseBreak\"] = 7] = \"PauseBreak\";\n    KeyCode[KeyCode[\"CapsLock\"] = 8] = \"CapsLock\";\n    KeyCode[KeyCode[\"Escape\"] = 9] = \"Escape\";\n    KeyCode[KeyCode[\"Space\"] = 10] = \"Space\";\n    KeyCode[KeyCode[\"PageUp\"] = 11] = \"PageUp\";\n    KeyCode[KeyCode[\"PageDown\"] = 12] = \"PageDown\";\n    KeyCode[KeyCode[\"End\"] = 13] = \"End\";\n    KeyCode[KeyCode[\"Home\"] = 14] = \"Home\";\n    KeyCode[KeyCode[\"LeftArrow\"] = 15] = \"LeftArrow\";\n    KeyCode[KeyCode[\"UpArrow\"] = 16] = \"UpArrow\";\n    KeyCode[KeyCode[\"RightArrow\"] = 17] = \"RightArrow\";\n    KeyCode[KeyCode[\"DownArrow\"] = 18] = \"DownArrow\";\n    KeyCode[KeyCode[\"Insert\"] = 19] = \"Insert\";\n    KeyCode[KeyCode[\"Delete\"] = 20] = \"Delete\";\n    KeyCode[KeyCode[\"Digit0\"] = 21] = \"Digit0\";\n    KeyCode[KeyCode[\"Digit1\"] = 22] = \"Digit1\";\n    KeyCode[KeyCode[\"Digit2\"] = 23] = \"Digit2\";\n    KeyCode[KeyCode[\"Digit3\"] = 24] = \"Digit3\";\n    KeyCode[KeyCode[\"Digit4\"] = 25] = \"Digit4\";\n    KeyCode[KeyCode[\"Digit5\"] = 26] = \"Digit5\";\n    KeyCode[KeyCode[\"Digit6\"] = 27] = \"Digit6\";\n    KeyCode[KeyCode[\"Digit7\"] = 28] = \"Digit7\";\n    KeyCode[KeyCode[\"Digit8\"] = 29] = \"Digit8\";\n    KeyCode[KeyCode[\"Digit9\"] = 30] = \"Digit9\";\n    KeyCode[KeyCode[\"KeyA\"] = 31] = \"KeyA\";\n    KeyCode[KeyCode[\"KeyB\"] = 32] = \"KeyB\";\n    KeyCode[KeyCode[\"KeyC\"] = 33] = \"KeyC\";\n    KeyCode[KeyCode[\"KeyD\"] = 34] = \"KeyD\";\n    KeyCode[KeyCode[\"KeyE\"] = 35] = \"KeyE\";\n    KeyCode[KeyCode[\"KeyF\"] = 36] = \"KeyF\";\n    KeyCode[KeyCode[\"KeyG\"] = 37] = \"KeyG\";\n    KeyCode[KeyCode[\"KeyH\"] = 38] = \"KeyH\";\n    KeyCode[KeyCode[\"KeyI\"] = 39] = \"KeyI\";\n    KeyCode[KeyCode[\"KeyJ\"] = 40] = \"KeyJ\";\n    KeyCode[KeyCode[\"KeyK\"] = 41] = \"KeyK\";\n    KeyCode[KeyCode[\"KeyL\"] = 42] = \"KeyL\";\n    KeyCode[KeyCode[\"KeyM\"] = 43] = \"KeyM\";\n    KeyCode[KeyCode[\"KeyN\"] = 44] = \"KeyN\";\n    KeyCode[KeyCode[\"KeyO\"] = 45] = \"KeyO\";\n    KeyCode[KeyCode[\"KeyP\"] = 46] = \"KeyP\";\n    KeyCode[KeyCode[\"KeyQ\"] = 47] = \"KeyQ\";\n    KeyCode[KeyCode[\"KeyR\"] = 48] = \"KeyR\";\n    KeyCode[KeyCode[\"KeyS\"] = 49] = \"KeyS\";\n    KeyCode[KeyCode[\"KeyT\"] = 50] = \"KeyT\";\n    KeyCode[KeyCode[\"KeyU\"] = 51] = \"KeyU\";\n    KeyCode[KeyCode[\"KeyV\"] = 52] = \"KeyV\";\n    KeyCode[KeyCode[\"KeyW\"] = 53] = \"KeyW\";\n    KeyCode[KeyCode[\"KeyX\"] = 54] = \"KeyX\";\n    KeyCode[KeyCode[\"KeyY\"] = 55] = \"KeyY\";\n    KeyCode[KeyCode[\"KeyZ\"] = 56] = \"KeyZ\";\n    KeyCode[KeyCode[\"Meta\"] = 57] = \"Meta\";\n    KeyCode[KeyCode[\"ContextMenu\"] = 58] = \"ContextMenu\";\n    KeyCode[KeyCode[\"F1\"] = 59] = \"F1\";\n    KeyCode[KeyCode[\"F2\"] = 60] = \"F2\";\n    KeyCode[KeyCode[\"F3\"] = 61] = \"F3\";\n    KeyCode[KeyCode[\"F4\"] = 62] = \"F4\";\n    KeyCode[KeyCode[\"F5\"] = 63] = \"F5\";\n    KeyCode[KeyCode[\"F6\"] = 64] = \"F6\";\n    KeyCode[KeyCode[\"F7\"] = 65] = \"F7\";\n    KeyCode[KeyCode[\"F8\"] = 66] = \"F8\";\n    KeyCode[KeyCode[\"F9\"] = 67] = \"F9\";\n    KeyCode[KeyCode[\"F10\"] = 68] = \"F10\";\n    KeyCode[KeyCode[\"F11\"] = 69] = \"F11\";\n    KeyCode[KeyCode[\"F12\"] = 70] = \"F12\";\n    KeyCode[KeyCode[\"F13\"] = 71] = \"F13\";\n    KeyCode[KeyCode[\"F14\"] = 72] = \"F14\";\n    KeyCode[KeyCode[\"F15\"] = 73] = \"F15\";\n    KeyCode[KeyCode[\"F16\"] = 74] = \"F16\";\n    KeyCode[KeyCode[\"F17\"] = 75] = \"F17\";\n    KeyCode[KeyCode[\"F18\"] = 76] = \"F18\";\n    KeyCode[KeyCode[\"F19\"] = 77] = \"F19\";\n    KeyCode[KeyCode[\"F20\"] = 78] = \"F20\";\n    KeyCode[KeyCode[\"F21\"] = 79] = \"F21\";\n    KeyCode[KeyCode[\"F22\"] = 80] = \"F22\";\n    KeyCode[KeyCode[\"F23\"] = 81] = \"F23\";\n    KeyCode[KeyCode[\"F24\"] = 82] = \"F24\";\n    KeyCode[KeyCode[\"NumLock\"] = 83] = \"NumLock\";\n    KeyCode[KeyCode[\"ScrollLock\"] = 84] = \"ScrollLock\";\n    /**\n     * Used for miscellaneous characters; it can vary by keyboard.\n     * For the US standard keyboard, the ';:' key\n     */\n    KeyCode[KeyCode[\"Semicolon\"] = 85] = \"Semicolon\";\n    /**\n     * For any country/region, the '+' key\n     * For the US standard keyboard, the '=+' key\n     */\n    KeyCode[KeyCode[\"Equal\"] = 86] = \"Equal\";\n    /**\n     * For any country/region, the ',' key\n     * For the US standard keyboard, the ',<' key\n     */\n    KeyCode[KeyCode[\"Comma\"] = 87] = \"Comma\";\n    /**\n     * For any country/region, the '-' key\n     * For the US standard keyboard, the '-_' key\n     */\n    KeyCode[KeyCode[\"Minus\"] = 88] = \"Minus\";\n    /**\n     * For any country/region, the '.' key\n     * For the US standard keyboard, the '.>' key\n     */\n    KeyCode[KeyCode[\"Period\"] = 89] = \"Period\";\n    /**\n     * Used for miscellaneous characters; it can vary by keyboard.\n     * For the US standard keyboard, the '/?' key\n     */\n    KeyCode[KeyCode[\"Slash\"] = 90] = \"Slash\";\n    /**\n     * Used for miscellaneous characters; it can vary by keyboard.\n     * For the US standard keyboard, the '`~' key\n     */\n    KeyCode[KeyCode[\"Backquote\"] = 91] = \"Backquote\";\n    /**\n     * Used for miscellaneous characters; it can vary by keyboard.\n     * For the US standard keyboard, the '[{' key\n     */\n    KeyCode[KeyCode[\"BracketLeft\"] = 92] = \"BracketLeft\";\n    /**\n     * Used for miscellaneous characters; it can vary by keyboard.\n     * For the US standard keyboard, the '\\|' key\n     */\n    KeyCode[KeyCode[\"Backslash\"] = 93] = \"Backslash\";\n    /**\n     * Used for miscellaneous characters; it can vary by keyboard.\n     * For the US standard keyboard, the ']}' key\n     */\n    KeyCode[KeyCode[\"BracketRight\"] = 94] = \"BracketRight\";\n    /**\n     * Used for miscellaneous characters; it can vary by keyboard.\n     * For the US standard keyboard, the ''\"' key\n     */\n    KeyCode[KeyCode[\"Quote\"] = 95] = \"Quote\";\n    /**\n     * Used for miscellaneous characters; it can vary by keyboard.\n     */\n    KeyCode[KeyCode[\"OEM_8\"] = 96] = \"OEM_8\";\n    /**\n     * Either the angle bracket key or the backslash key on the RT 102-key keyboard.\n     */\n    KeyCode[KeyCode[\"IntlBackslash\"] = 97] = \"IntlBackslash\";\n    KeyCode[KeyCode[\"Numpad0\"] = 98] = \"Numpad0\";\n    KeyCode[KeyCode[\"Numpad1\"] = 99] = \"Numpad1\";\n    KeyCode[KeyCode[\"Numpad2\"] = 100] = \"Numpad2\";\n    KeyCode[KeyCode[\"Numpad3\"] = 101] = \"Numpad3\";\n    KeyCode[KeyCode[\"Numpad4\"] = 102] = \"Numpad4\";\n    KeyCode[KeyCode[\"Numpad5\"] = 103] = \"Numpad5\";\n    KeyCode[KeyCode[\"Numpad6\"] = 104] = \"Numpad6\";\n    KeyCode[KeyCode[\"Numpad7\"] = 105] = \"Numpad7\";\n    KeyCode[KeyCode[\"Numpad8\"] = 106] = \"Numpad8\";\n    KeyCode[KeyCode[\"Numpad9\"] = 107] = \"Numpad9\";\n    KeyCode[KeyCode[\"NumpadMultiply\"] = 108] = \"NumpadMultiply\";\n    KeyCode[KeyCode[\"NumpadAdd\"] = 109] = \"NumpadAdd\";\n    KeyCode[KeyCode[\"NUMPAD_SEPARATOR\"] = 110] = \"NUMPAD_SEPARATOR\";\n    KeyCode[KeyCode[\"NumpadSubtract\"] = 111] = \"NumpadSubtract\";\n    KeyCode[KeyCode[\"NumpadDecimal\"] = 112] = \"NumpadDecimal\";\n    KeyCode[KeyCode[\"NumpadDivide\"] = 113] = \"NumpadDivide\";\n    /**\n     * Cover all key codes when IME is processing input.\n     */\n    KeyCode[KeyCode[\"KEY_IN_COMPOSITION\"] = 114] = \"KEY_IN_COMPOSITION\";\n    KeyCode[KeyCode[\"ABNT_C1\"] = 115] = \"ABNT_C1\";\n    KeyCode[KeyCode[\"ABNT_C2\"] = 116] = \"ABNT_C2\";\n    KeyCode[KeyCode[\"AudioVolumeMute\"] = 117] = \"AudioVolumeMute\";\n    KeyCode[KeyCode[\"AudioVolumeUp\"] = 118] = \"AudioVolumeUp\";\n    KeyCode[KeyCode[\"AudioVolumeDown\"] = 119] = \"AudioVolumeDown\";\n    KeyCode[KeyCode[\"BrowserSearch\"] = 120] = \"BrowserSearch\";\n    KeyCode[KeyCode[\"BrowserHome\"] = 121] = \"BrowserHome\";\n    KeyCode[KeyCode[\"BrowserBack\"] = 122] = \"BrowserBack\";\n    KeyCode[KeyCode[\"BrowserForward\"] = 123] = \"BrowserForward\";\n    KeyCode[KeyCode[\"MediaTrackNext\"] = 124] = \"MediaTrackNext\";\n    KeyCode[KeyCode[\"MediaTrackPrevious\"] = 125] = \"MediaTrackPrevious\";\n    KeyCode[KeyCode[\"MediaStop\"] = 126] = \"MediaStop\";\n    KeyCode[KeyCode[\"MediaPlayPause\"] = 127] = \"MediaPlayPause\";\n    KeyCode[KeyCode[\"LaunchMediaPlayer\"] = 128] = \"LaunchMediaPlayer\";\n    KeyCode[KeyCode[\"LaunchMail\"] = 129] = \"LaunchMail\";\n    KeyCode[KeyCode[\"LaunchApp2\"] = 130] = \"LaunchApp2\";\n    /**\n     * VK_CLEAR, 0x0C, CLEAR key\n     */\n    KeyCode[KeyCode[\"Clear\"] = 131] = \"Clear\";\n    /**\n     * Placed last to cover the length of the enum.\n     * Please do not depend on this value!\n     */\n    KeyCode[KeyCode[\"MAX_VALUE\"] = 132] = \"MAX_VALUE\";\n})(KeyCode || (KeyCode = {}));\nvar MarkerSeverity;\n(function (MarkerSeverity) {\n    MarkerSeverity[MarkerSeverity[\"Hint\"] = 1] = \"Hint\";\n    MarkerSeverity[MarkerSeverity[\"Info\"] = 2] = \"Info\";\n    MarkerSeverity[MarkerSeverity[\"Warning\"] = 4] = \"Warning\";\n    MarkerSeverity[MarkerSeverity[\"Error\"] = 8] = \"Error\";\n})(MarkerSeverity || (MarkerSeverity = {}));\nvar MarkerTag;\n(function (MarkerTag) {\n    MarkerTag[MarkerTag[\"Unnecessary\"] = 1] = \"Unnecessary\";\n    MarkerTag[MarkerTag[\"Deprecated\"] = 2] = \"Deprecated\";\n})(MarkerTag || (MarkerTag = {}));\n/**\n * Position in the minimap to render the decoration.\n */\nvar MinimapPosition;\n(function (MinimapPosition) {\n    MinimapPosition[MinimapPosition[\"Inline\"] = 1] = \"Inline\";\n    MinimapPosition[MinimapPosition[\"Gutter\"] = 2] = \"Gutter\";\n})(MinimapPosition || (MinimapPosition = {}));\n/**\n * Section header style.\n */\nvar MinimapSectionHeaderStyle;\n(function (MinimapSectionHeaderStyle) {\n    MinimapSectionHeaderStyle[MinimapSectionHeaderStyle[\"Normal\"] = 1] = \"Normal\";\n    MinimapSectionHeaderStyle[MinimapSectionHeaderStyle[\"Underlined\"] = 2] = \"Underlined\";\n})(MinimapSectionHeaderStyle || (MinimapSectionHeaderStyle = {}));\n/**\n * Type of hit element with the mouse in the editor.\n */\nvar MouseTargetType;\n(function (MouseTargetType) {\n    /**\n     * Mouse is on top of an unknown element.\n     */\n    MouseTargetType[MouseTargetType[\"UNKNOWN\"] = 0] = \"UNKNOWN\";\n    /**\n     * Mouse is on top of the textarea used for input.\n     */\n    MouseTargetType[MouseTargetType[\"TEXTAREA\"] = 1] = \"TEXTAREA\";\n    /**\n     * Mouse is on top of the glyph margin\n     */\n    MouseTargetType[MouseTargetType[\"GUTTER_GLYPH_MARGIN\"] = 2] = \"GUTTER_GLYPH_MARGIN\";\n    /**\n     * Mouse is on top of the line numbers\n     */\n    MouseTargetType[MouseTargetType[\"GUTTER_LINE_NUMBERS\"] = 3] = \"GUTTER_LINE_NUMBERS\";\n    /**\n     * Mouse is on top of the line decorations\n     */\n    MouseTargetType[MouseTargetType[\"GUTTER_LINE_DECORATIONS\"] = 4] = \"GUTTER_LINE_DECORATIONS\";\n    /**\n     * Mouse is on top of the whitespace left in the gutter by a view zone.\n     */\n    MouseTargetType[MouseTargetType[\"GUTTER_VIEW_ZONE\"] = 5] = \"GUTTER_VIEW_ZONE\";\n    /**\n     * Mouse is on top of text in the content.\n     */\n    MouseTargetType[MouseTargetType[\"CONTENT_TEXT\"] = 6] = \"CONTENT_TEXT\";\n    /**\n     * Mouse is on top of empty space in the content (e.g. after line text or below last line)\n     */\n    MouseTargetType[MouseTargetType[\"CONTENT_EMPTY\"] = 7] = \"CONTENT_EMPTY\";\n    /**\n     * Mouse is on top of a view zone in the content.\n     */\n    MouseTargetType[MouseTargetType[\"CONTENT_VIEW_ZONE\"] = 8] = \"CONTENT_VIEW_ZONE\";\n    /**\n     * Mouse is on top of a content widget.\n     */\n    MouseTargetType[MouseTargetType[\"CONTENT_WIDGET\"] = 9] = \"CONTENT_WIDGET\";\n    /**\n     * Mouse is on top of the decorations overview ruler.\n     */\n    MouseTargetType[MouseTargetType[\"OVERVIEW_RULER\"] = 10] = \"OVERVIEW_RULER\";\n    /**\n     * Mouse is on top of a scrollbar.\n     */\n    MouseTargetType[MouseTargetType[\"SCROLLBAR\"] = 11] = \"SCROLLBAR\";\n    /**\n     * Mouse is on top of an overlay widget.\n     */\n    MouseTargetType[MouseTargetType[\"OVERLAY_WIDGET\"] = 12] = \"OVERLAY_WIDGET\";\n    /**\n     * Mouse is outside of the editor.\n     */\n    MouseTargetType[MouseTargetType[\"OUTSIDE_EDITOR\"] = 13] = \"OUTSIDE_EDITOR\";\n})(MouseTargetType || (MouseTargetType = {}));\nvar NewSymbolNameTag;\n(function (NewSymbolNameTag) {\n    NewSymbolNameTag[NewSymbolNameTag[\"AIGenerated\"] = 1] = \"AIGenerated\";\n})(NewSymbolNameTag || (NewSymbolNameTag = {}));\nvar NewSymbolNameTriggerKind;\n(function (NewSymbolNameTriggerKind) {\n    NewSymbolNameTriggerKind[NewSymbolNameTriggerKind[\"Invoke\"] = 0] = \"Invoke\";\n    NewSymbolNameTriggerKind[NewSymbolNameTriggerKind[\"Automatic\"] = 1] = \"Automatic\";\n})(NewSymbolNameTriggerKind || (NewSymbolNameTriggerKind = {}));\n/**\n * A positioning preference for rendering overlay widgets.\n */\nvar OverlayWidgetPositionPreference;\n(function (OverlayWidgetPositionPreference) {\n    /**\n     * Position the overlay widget in the top right corner\n     */\n    OverlayWidgetPositionPreference[OverlayWidgetPositionPreference[\"TOP_RIGHT_CORNER\"] = 0] = \"TOP_RIGHT_CORNER\";\n    /**\n     * Position the overlay widget in the bottom right corner\n     */\n    OverlayWidgetPositionPreference[OverlayWidgetPositionPreference[\"BOTTOM_RIGHT_CORNER\"] = 1] = \"BOTTOM_RIGHT_CORNER\";\n    /**\n     * Position the overlay widget in the top center\n     */\n    OverlayWidgetPositionPreference[OverlayWidgetPositionPreference[\"TOP_CENTER\"] = 2] = \"TOP_CENTER\";\n})(OverlayWidgetPositionPreference || (OverlayWidgetPositionPreference = {}));\n/**\n * Vertical Lane in the overview ruler of the editor.\n */\nvar OverviewRulerLane;\n(function (OverviewRulerLane) {\n    OverviewRulerLane[OverviewRulerLane[\"Left\"] = 1] = \"Left\";\n    OverviewRulerLane[OverviewRulerLane[\"Center\"] = 2] = \"Center\";\n    OverviewRulerLane[OverviewRulerLane[\"Right\"] = 4] = \"Right\";\n    OverviewRulerLane[OverviewRulerLane[\"Full\"] = 7] = \"Full\";\n})(OverviewRulerLane || (OverviewRulerLane = {}));\n/**\n * How a partial acceptance was triggered.\n */\nvar PartialAcceptTriggerKind;\n(function (PartialAcceptTriggerKind) {\n    PartialAcceptTriggerKind[PartialAcceptTriggerKind[\"Word\"] = 0] = \"Word\";\n    PartialAcceptTriggerKind[PartialAcceptTriggerKind[\"Line\"] = 1] = \"Line\";\n    PartialAcceptTriggerKind[PartialAcceptTriggerKind[\"Suggest\"] = 2] = \"Suggest\";\n})(PartialAcceptTriggerKind || (PartialAcceptTriggerKind = {}));\nvar PositionAffinity;\n(function (PositionAffinity) {\n    /**\n     * Prefers the left most position.\n    */\n    PositionAffinity[PositionAffinity[\"Left\"] = 0] = \"Left\";\n    /**\n     * Prefers the right most position.\n    */\n    PositionAffinity[PositionAffinity[\"Right\"] = 1] = \"Right\";\n    /**\n     * No preference.\n    */\n    PositionAffinity[PositionAffinity[\"None\"] = 2] = \"None\";\n    /**\n     * If the given position is on injected text, prefers the position left of it.\n    */\n    PositionAffinity[PositionAffinity[\"LeftOfInjectedText\"] = 3] = \"LeftOfInjectedText\";\n    /**\n     * If the given position is on injected text, prefers the position right of it.\n    */\n    PositionAffinity[PositionAffinity[\"RightOfInjectedText\"] = 4] = \"RightOfInjectedText\";\n})(PositionAffinity || (PositionAffinity = {}));\nvar RenderLineNumbersType;\n(function (RenderLineNumbersType) {\n    RenderLineNumbersType[RenderLineNumbersType[\"Off\"] = 0] = \"Off\";\n    RenderLineNumbersType[RenderLineNumbersType[\"On\"] = 1] = \"On\";\n    RenderLineNumbersType[RenderLineNumbersType[\"Relative\"] = 2] = \"Relative\";\n    RenderLineNumbersType[RenderLineNumbersType[\"Interval\"] = 3] = \"Interval\";\n    RenderLineNumbersType[RenderLineNumbersType[\"Custom\"] = 4] = \"Custom\";\n})(RenderLineNumbersType || (RenderLineNumbersType = {}));\nvar RenderMinimap;\n(function (RenderMinimap) {\n    RenderMinimap[RenderMinimap[\"None\"] = 0] = \"None\";\n    RenderMinimap[RenderMinimap[\"Text\"] = 1] = \"Text\";\n    RenderMinimap[RenderMinimap[\"Blocks\"] = 2] = \"Blocks\";\n})(RenderMinimap || (RenderMinimap = {}));\nvar ScrollType;\n(function (ScrollType) {\n    ScrollType[ScrollType[\"Smooth\"] = 0] = \"Smooth\";\n    ScrollType[ScrollType[\"Immediate\"] = 1] = \"Immediate\";\n})(ScrollType || (ScrollType = {}));\nvar ScrollbarVisibility;\n(function (ScrollbarVisibility) {\n    ScrollbarVisibility[ScrollbarVisibility[\"Auto\"] = 1] = \"Auto\";\n    ScrollbarVisibility[ScrollbarVisibility[\"Hidden\"] = 2] = \"Hidden\";\n    ScrollbarVisibility[ScrollbarVisibility[\"Visible\"] = 3] = \"Visible\";\n})(ScrollbarVisibility || (ScrollbarVisibility = {}));\n/**\n * The direction of a selection.\n */\nvar SelectionDirection;\n(function (SelectionDirection) {\n    /**\n     * The selection starts above where it ends.\n     */\n    SelectionDirection[SelectionDirection[\"LTR\"] = 0] = \"LTR\";\n    /**\n     * The selection starts below where it ends.\n     */\n    SelectionDirection[SelectionDirection[\"RTL\"] = 1] = \"RTL\";\n})(SelectionDirection || (SelectionDirection = {}));\nvar ShowLightbulbIconMode;\n(function (ShowLightbulbIconMode) {\n    ShowLightbulbIconMode[\"Off\"] = \"off\";\n    ShowLightbulbIconMode[\"OnCode\"] = \"onCode\";\n    ShowLightbulbIconMode[\"On\"] = \"on\";\n})(ShowLightbulbIconMode || (ShowLightbulbIconMode = {}));\nvar SignatureHelpTriggerKind;\n(function (SignatureHelpTriggerKind) {\n    SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"Invoke\"] = 1] = \"Invoke\";\n    SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"TriggerCharacter\"] = 2] = \"TriggerCharacter\";\n    SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"ContentChange\"] = 3] = \"ContentChange\";\n})(SignatureHelpTriggerKind || (SignatureHelpTriggerKind = {}));\n/**\n * A symbol kind.\n */\nvar SymbolKind;\n(function (SymbolKind) {\n    SymbolKind[SymbolKind[\"File\"] = 0] = \"File\";\n    SymbolKind[SymbolKind[\"Module\"] = 1] = \"Module\";\n    SymbolKind[SymbolKind[\"Namespace\"] = 2] = \"Namespace\";\n    SymbolKind[SymbolKind[\"Package\"] = 3] = \"Package\";\n    SymbolKind[SymbolKind[\"Class\"] = 4] = \"Class\";\n    SymbolKind[SymbolKind[\"Method\"] = 5] = \"Method\";\n    SymbolKind[SymbolKind[\"Property\"] = 6] = \"Property\";\n    SymbolKind[SymbolKind[\"Field\"] = 7] = \"Field\";\n    SymbolKind[SymbolKind[\"Constructor\"] = 8] = \"Constructor\";\n    SymbolKind[SymbolKind[\"Enum\"] = 9] = \"Enum\";\n    SymbolKind[SymbolKind[\"Interface\"] = 10] = \"Interface\";\n    SymbolKind[SymbolKind[\"Function\"] = 11] = \"Function\";\n    SymbolKind[SymbolKind[\"Variable\"] = 12] = \"Variable\";\n    SymbolKind[SymbolKind[\"Constant\"] = 13] = \"Constant\";\n    SymbolKind[SymbolKind[\"String\"] = 14] = \"String\";\n    SymbolKind[SymbolKind[\"Number\"] = 15] = \"Number\";\n    SymbolKind[SymbolKind[\"Boolean\"] = 16] = \"Boolean\";\n    SymbolKind[SymbolKind[\"Array\"] = 17] = \"Array\";\n    SymbolKind[SymbolKind[\"Object\"] = 18] = \"Object\";\n    SymbolKind[SymbolKind[\"Key\"] = 19] = \"Key\";\n    SymbolKind[SymbolKind[\"Null\"] = 20] = \"Null\";\n    SymbolKind[SymbolKind[\"EnumMember\"] = 21] = \"EnumMember\";\n    SymbolKind[SymbolKind[\"Struct\"] = 22] = \"Struct\";\n    SymbolKind[SymbolKind[\"Event\"] = 23] = \"Event\";\n    SymbolKind[SymbolKind[\"Operator\"] = 24] = \"Operator\";\n    SymbolKind[SymbolKind[\"TypeParameter\"] = 25] = \"TypeParameter\";\n})(SymbolKind || (SymbolKind = {}));\nvar SymbolTag;\n(function (SymbolTag) {\n    SymbolTag[SymbolTag[\"Deprecated\"] = 1] = \"Deprecated\";\n})(SymbolTag || (SymbolTag = {}));\n/**\n * Text Direction for a decoration.\n */\nvar TextDirection;\n(function (TextDirection) {\n    TextDirection[TextDirection[\"LTR\"] = 0] = \"LTR\";\n    TextDirection[TextDirection[\"RTL\"] = 1] = \"RTL\";\n})(TextDirection || (TextDirection = {}));\n/**\n * The kind of animation in which the editor's cursor should be rendered.\n */\nvar TextEditorCursorBlinkingStyle;\n(function (TextEditorCursorBlinkingStyle) {\n    /**\n     * Hidden\n     */\n    TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Hidden\"] = 0] = \"Hidden\";\n    /**\n     * Blinking\n     */\n    TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Blink\"] = 1] = \"Blink\";\n    /**\n     * Blinking with smooth fading\n     */\n    TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Smooth\"] = 2] = \"Smooth\";\n    /**\n     * Blinking with prolonged filled state and smooth fading\n     */\n    TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Phase\"] = 3] = \"Phase\";\n    /**\n     * Expand collapse animation on the y axis\n     */\n    TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Expand\"] = 4] = \"Expand\";\n    /**\n     * No-Blinking\n     */\n    TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Solid\"] = 5] = \"Solid\";\n})(TextEditorCursorBlinkingStyle || (TextEditorCursorBlinkingStyle = {}));\n/**\n * The style in which the editor's cursor should be rendered.\n */\nvar TextEditorCursorStyle;\n(function (TextEditorCursorStyle) {\n    /**\n     * As a vertical line (sitting between two characters).\n     */\n    TextEditorCursorStyle[TextEditorCursorStyle[\"Line\"] = 1] = \"Line\";\n    /**\n     * As a block (sitting on top of a character).\n     */\n    TextEditorCursorStyle[TextEditorCursorStyle[\"Block\"] = 2] = \"Block\";\n    /**\n     * As a horizontal line (sitting under a character).\n     */\n    TextEditorCursorStyle[TextEditorCursorStyle[\"Underline\"] = 3] = \"Underline\";\n    /**\n     * As a thin vertical line (sitting between two characters).\n     */\n    TextEditorCursorStyle[TextEditorCursorStyle[\"LineThin\"] = 4] = \"LineThin\";\n    /**\n     * As an outlined block (sitting on top of a character).\n     */\n    TextEditorCursorStyle[TextEditorCursorStyle[\"BlockOutline\"] = 5] = \"BlockOutline\";\n    /**\n     * As a thin horizontal line (sitting under a character).\n     */\n    TextEditorCursorStyle[TextEditorCursorStyle[\"UnderlineThin\"] = 6] = \"UnderlineThin\";\n})(TextEditorCursorStyle || (TextEditorCursorStyle = {}));\n/**\n * Describes the behavior of decorations when typing/editing near their edges.\n * Note: Please do not edit the values, as they very carefully match `DecorationRangeBehavior`\n */\nvar TrackedRangeStickiness;\n(function (TrackedRangeStickiness) {\n    TrackedRangeStickiness[TrackedRangeStickiness[\"AlwaysGrowsWhenTypingAtEdges\"] = 0] = \"AlwaysGrowsWhenTypingAtEdges\";\n    TrackedRangeStickiness[TrackedRangeStickiness[\"NeverGrowsWhenTypingAtEdges\"] = 1] = \"NeverGrowsWhenTypingAtEdges\";\n    TrackedRangeStickiness[TrackedRangeStickiness[\"GrowsOnlyWhenTypingBefore\"] = 2] = \"GrowsOnlyWhenTypingBefore\";\n    TrackedRangeStickiness[TrackedRangeStickiness[\"GrowsOnlyWhenTypingAfter\"] = 3] = \"GrowsOnlyWhenTypingAfter\";\n})(TrackedRangeStickiness || (TrackedRangeStickiness = {}));\n/**\n * Describes how to indent wrapped lines.\n */\nvar WrappingIndent;\n(function (WrappingIndent) {\n    /**\n     * No indentation => wrapped lines begin at column 1.\n     */\n    WrappingIndent[WrappingIndent[\"None\"] = 0] = \"None\";\n    /**\n     * Same => wrapped lines get the same indentation as the parent.\n     */\n    WrappingIndent[WrappingIndent[\"Same\"] = 1] = \"Same\";\n    /**\n     * Indent => wrapped lines get +1 indentation toward the parent.\n     */\n    WrappingIndent[WrappingIndent[\"Indent\"] = 2] = \"Indent\";\n    /**\n     * DeepIndent => wrapped lines get +2 indentation toward the parent.\n     */\n    WrappingIndent[WrappingIndent[\"DeepIndent\"] = 3] = \"DeepIndent\";\n})(WrappingIndent || (WrappingIndent = {}));\n\nexport { AccessibilitySupport, CodeActionTriggerType, CompletionItemInsertTextRule, CompletionItemKind, CompletionItemTag, CompletionTriggerKind, ContentWidgetPositionPreference, CursorChangeReason, DefaultEndOfLine, DocumentHighlightKind, EditorAutoIndentStrategy, EditorOption, EndOfLinePreference, EndOfLineSequence, GlyphMarginLane, HoverVerbosityAction, IndentAction, InjectedTextCursorStops, InlayHintKind, InlineCompletionEndOfLifeReasonKind, InlineCompletionHintStyle, InlineCompletionTriggerKind, KeyCode, MarkerSeverity, MarkerTag, MinimapPosition, MinimapSectionHeaderStyle, MouseTargetType, NewSymbolNameTag, NewSymbolNameTriggerKind, OverlayWidgetPositionPreference, OverviewRulerLane, PartialAcceptTriggerKind, PositionAffinity, RenderLineNumbersType, RenderMinimap, ScrollType, ScrollbarVisibility, SelectionDirection, ShowLightbulbIconMode, SignatureHelpTriggerKind, SymbolKind, SymbolTag, TextDirection, TextEditorCursorBlinkingStyle, TextEditorCursorStyle, TrackedRangeStickiness, WrappingIndent };\n","import { CancellationTokenSource } from '../../../base/common/cancellation.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { KeyChord } from '../../../base/common/keyCodes.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { Selection } from '../core/selection.js';\nimport { Token } from '../languages.js';\nimport { MarkerTag, MarkerSeverity, SelectionDirection, KeyCode } from '../standalone/standaloneEnums.js';\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 *--------------------------------------------------------------------------------------------*/\nclass KeyMod {\n    static { this.CtrlCmd = 2048 /* ConstKeyMod.CtrlCmd */; }\n    static { this.Shift = 1024 /* ConstKeyMod.Shift */; }\n    static { this.Alt = 512 /* ConstKeyMod.Alt */; }\n    static { this.WinCtrl = 256 /* ConstKeyMod.WinCtrl */; }\n    static chord(firstPart, secondPart) {\n        return KeyChord(firstPart, secondPart);\n    }\n}\nfunction createMonacoBaseAPI() {\n    return {\n        editor: undefined, // undefined override expected here\n        languages: undefined, // undefined override expected here\n        CancellationTokenSource: CancellationTokenSource,\n        Emitter: Emitter,\n        KeyCode: KeyCode,\n        KeyMod: KeyMod,\n        Position: Position,\n        Range: Range,\n        Selection: Selection,\n        SelectionDirection: SelectionDirection,\n        MarkerSeverity: MarkerSeverity,\n        MarkerTag: MarkerTag,\n        Uri: URI,\n        Token: Token\n    };\n}\n\nexport { KeyMod, createMonacoBaseAPI };\n","import { onUnexpectedError, transformErrorForSerialization } from '../errors.js';\nimport { Emitter } from '../event.js';\nimport { Disposable } from '../lifecycle.js';\nimport { isWeb } from '../platform.js';\nimport { isUpperAsciiLetter } from '../strings.js';\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 *--------------------------------------------------------------------------------------------*/\nconst DEFAULT_CHANNEL = 'default';\nconst INITIALIZE = '$initialize';\nlet webWorkerWarningLogged = false;\nfunction logOnceWebWorkerWarning(err) {\n    if (!isWeb) {\n        // running tests\n        return;\n    }\n    if (!webWorkerWarningLogged) {\n        webWorkerWarningLogged = true;\n        console.warn('Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq');\n    }\n    console.warn(err.message);\n}\nclass RequestMessage {\n    constructor(vsWorker, req, channel, method, args) {\n        this.vsWorker = vsWorker;\n        this.req = req;\n        this.channel = channel;\n        this.method = method;\n        this.args = args;\n        this.type = 0 /* MessageType.Request */;\n    }\n}\nclass ReplyMessage {\n    constructor(vsWorker, seq, res, err) {\n        this.vsWorker = vsWorker;\n        this.seq = seq;\n        this.res = res;\n        this.err = err;\n        this.type = 1 /* MessageType.Reply */;\n    }\n}\nclass SubscribeEventMessage {\n    constructor(vsWorker, req, channel, eventName, arg) {\n        this.vsWorker = vsWorker;\n        this.req = req;\n        this.channel = channel;\n        this.eventName = eventName;\n        this.arg = arg;\n        this.type = 2 /* MessageType.SubscribeEvent */;\n    }\n}\nclass EventMessage {\n    constructor(vsWorker, req, event) {\n        this.vsWorker = vsWorker;\n        this.req = req;\n        this.event = event;\n        this.type = 3 /* MessageType.Event */;\n    }\n}\nclass UnsubscribeEventMessage {\n    constructor(vsWorker, req) {\n        this.vsWorker = vsWorker;\n        this.req = req;\n        this.type = 4 /* MessageType.UnsubscribeEvent */;\n    }\n}\nclass WebWorkerProtocol {\n    constructor(handler) {\n        this._workerId = -1;\n        this._handler = handler;\n        this._lastSentReq = 0;\n        this._pendingReplies = Object.create(null);\n        this._pendingEmitters = new Map();\n        this._pendingEvents = new Map();\n    }\n    setWorkerId(workerId) {\n        this._workerId = workerId;\n    }\n    async sendMessage(channel, method, args) {\n        const req = String(++this._lastSentReq);\n        return new Promise((resolve, reject) => {\n            this._pendingReplies[req] = {\n                resolve: resolve,\n                reject: reject\n            };\n            this._send(new RequestMessage(this._workerId, req, channel, method, args));\n        });\n    }\n    listen(channel, eventName, arg) {\n        let req = null;\n        const emitter = new Emitter({\n            onWillAddFirstListener: () => {\n                req = String(++this._lastSentReq);\n                this._pendingEmitters.set(req, emitter);\n                this._send(new SubscribeEventMessage(this._workerId, req, channel, eventName, arg));\n            },\n            onDidRemoveLastListener: () => {\n                this._pendingEmitters.delete(req);\n                this._send(new UnsubscribeEventMessage(this._workerId, req));\n                req = null;\n            }\n        });\n        return emitter.event;\n    }\n    handleMessage(message) {\n        if (!message || !message.vsWorker) {\n            return;\n        }\n        if (this._workerId !== -1 && message.vsWorker !== this._workerId) {\n            return;\n        }\n        this._handleMessage(message);\n    }\n    createProxyToRemoteChannel(channel, sendMessageBarrier) {\n        const handler = {\n            get: (target, name) => {\n                if (typeof name === 'string' && !target[name]) {\n                    if (propertyIsDynamicEvent(name)) { // onDynamic...\n                        target[name] = (arg) => {\n                            return this.listen(channel, name, arg);\n                        };\n                    }\n                    else if (propertyIsEvent(name)) { // on...\n                        target[name] = this.listen(channel, name, undefined);\n                    }\n                    else if (name.charCodeAt(0) === 36 /* CharCode.DollarSign */) { // $...\n                        target[name] = async (...myArgs) => {\n                            await sendMessageBarrier?.();\n                            return this.sendMessage(channel, name, myArgs);\n                        };\n                    }\n                }\n                return target[name];\n            }\n        };\n        return new Proxy(Object.create(null), handler);\n    }\n    _handleMessage(msg) {\n        switch (msg.type) {\n            case 1 /* MessageType.Reply */:\n                return this._handleReplyMessage(msg);\n            case 0 /* MessageType.Request */:\n                return this._handleRequestMessage(msg);\n            case 2 /* MessageType.SubscribeEvent */:\n                return this._handleSubscribeEventMessage(msg);\n            case 3 /* MessageType.Event */:\n                return this._handleEventMessage(msg);\n            case 4 /* MessageType.UnsubscribeEvent */:\n                return this._handleUnsubscribeEventMessage(msg);\n        }\n    }\n    _handleReplyMessage(replyMessage) {\n        if (!this._pendingReplies[replyMessage.seq]) {\n            console.warn('Got reply to unknown seq');\n            return;\n        }\n        const reply = this._pendingReplies[replyMessage.seq];\n        delete this._pendingReplies[replyMessage.seq];\n        if (replyMessage.err) {\n            let err = replyMessage.err;\n            if (replyMessage.err.$isError) {\n                const newErr = new Error();\n                newErr.name = replyMessage.err.name;\n                newErr.message = replyMessage.err.message;\n                newErr.stack = replyMessage.err.stack;\n                err = newErr;\n            }\n            reply.reject(err);\n            return;\n        }\n        reply.resolve(replyMessage.res);\n    }\n    _handleRequestMessage(requestMessage) {\n        const req = requestMessage.req;\n        const result = this._handler.handleMessage(requestMessage.channel, requestMessage.method, requestMessage.args);\n        result.then((r) => {\n            this._send(new ReplyMessage(this._workerId, req, r, undefined));\n        }, (e) => {\n            if (e.detail instanceof Error) {\n                // Loading errors have a detail property that points to the actual error\n                e.detail = transformErrorForSerialization(e.detail);\n            }\n            this._send(new ReplyMessage(this._workerId, req, undefined, transformErrorForSerialization(e)));\n        });\n    }\n    _handleSubscribeEventMessage(msg) {\n        const req = msg.req;\n        const disposable = this._handler.handleEvent(msg.channel, msg.eventName, msg.arg)((event) => {\n            this._send(new EventMessage(this._workerId, req, event));\n        });\n        this._pendingEvents.set(req, disposable);\n    }\n    _handleEventMessage(msg) {\n        if (!this._pendingEmitters.has(msg.req)) {\n            console.warn('Got event for unknown req');\n            return;\n        }\n        this._pendingEmitters.get(msg.req).fire(msg.event);\n    }\n    _handleUnsubscribeEventMessage(msg) {\n        if (!this._pendingEvents.has(msg.req)) {\n            console.warn('Got unsubscribe for unknown req');\n            return;\n        }\n        this._pendingEvents.get(msg.req).dispose();\n        this._pendingEvents.delete(msg.req);\n    }\n    _send(msg) {\n        const transfer = [];\n        if (msg.type === 0 /* MessageType.Request */) {\n            for (let i = 0; i < msg.args.length; i++) {\n                const arg = msg.args[i];\n                if (arg instanceof ArrayBuffer) {\n                    transfer.push(arg);\n                }\n            }\n        }\n        else if (msg.type === 1 /* MessageType.Reply */) {\n            if (msg.res instanceof ArrayBuffer) {\n                transfer.push(msg.res);\n            }\n        }\n        this._handler.sendMessage(msg, transfer);\n    }\n}\n/**\n * Main thread side\n */\nclass WebWorkerClient extends Disposable {\n    constructor(worker) {\n        super();\n        this._localChannels = new Map();\n        this._worker = this._register(worker);\n        this._register(this._worker.onMessage((msg) => {\n            this._protocol.handleMessage(msg);\n        }));\n        this._register(this._worker.onError((err) => {\n            logOnceWebWorkerWarning(err);\n            onUnexpectedError(err);\n        }));\n        this._protocol = new WebWorkerProtocol({\n            sendMessage: (msg, transfer) => {\n                this._worker.postMessage(msg, transfer);\n            },\n            handleMessage: (channel, method, args) => {\n                return this._handleMessage(channel, method, args);\n            },\n            handleEvent: (channel, eventName, arg) => {\n                return this._handleEvent(channel, eventName, arg);\n            }\n        });\n        this._protocol.setWorkerId(this._worker.getId());\n        // Send initialize message\n        this._onModuleLoaded = this._protocol.sendMessage(DEFAULT_CHANNEL, INITIALIZE, [\n            this._worker.getId(),\n        ]).then(() => { });\n        this.proxy = this._protocol.createProxyToRemoteChannel(DEFAULT_CHANNEL, async () => { await this._onModuleLoaded; });\n        this._onModuleLoaded.catch((e) => {\n            this._onError('Worker failed to load ', e);\n        });\n    }\n    _handleMessage(channelName, method, args) {\n        const channel = this._localChannels.get(channelName);\n        if (!channel) {\n            return Promise.reject(new Error(`Missing channel ${channelName} on main thread`));\n        }\n        const fn = channel[method];\n        if (typeof fn !== 'function') {\n            return Promise.reject(new Error(`Missing method ${method} on main thread channel ${channelName}`));\n        }\n        try {\n            return Promise.resolve(fn.apply(channel, args));\n        }\n        catch (e) {\n            return Promise.reject(e);\n        }\n    }\n    _handleEvent(channelName, eventName, arg) {\n        const channel = this._localChannels.get(channelName);\n        if (!channel) {\n            throw new Error(`Missing channel ${channelName} on main thread`);\n        }\n        if (propertyIsDynamicEvent(eventName)) {\n            const fn = channel[eventName];\n            if (typeof fn !== 'function') {\n                throw new Error(`Missing dynamic event ${eventName} on main thread channel ${channelName}.`);\n            }\n            const event = fn.call(channel, arg);\n            if (typeof event !== 'function') {\n                throw new Error(`Missing dynamic event ${eventName} on main thread channel ${channelName}.`);\n            }\n            return event;\n        }\n        if (propertyIsEvent(eventName)) {\n            const event = channel[eventName];\n            if (typeof event !== 'function') {\n                throw new Error(`Missing event ${eventName} on main thread channel ${channelName}.`);\n            }\n            return event;\n        }\n        throw new Error(`Malformed event name ${eventName}`);\n    }\n    setChannel(channel, handler) {\n        this._localChannels.set(channel, handler);\n    }\n    _onError(message, error) {\n        console.error(message);\n        console.info(error);\n    }\n}\nfunction propertyIsEvent(name) {\n    // Assume a property is an event if it has a form of \"onSomething\"\n    return name[0] === 'o' && name[1] === 'n' && isUpperAsciiLetter(name.charCodeAt(2));\n}\nfunction propertyIsDynamicEvent(name) {\n    // Assume a property is a dynamic event (a method that returns an event) if it has a form of \"onDynamicSomething\"\n    return /^onDynamic/.test(name) && isUpperAsciiLetter(name.charCodeAt(9));\n}\n/**\n * Worker side\n */\nclass WebWorkerServer {\n    constructor(postMessage, requestHandlerFactory) {\n        this._localChannels = new Map();\n        this._remoteChannels = new Map();\n        this._protocol = new WebWorkerProtocol({\n            sendMessage: (msg, transfer) => {\n                postMessage(msg, transfer);\n            },\n            handleMessage: (channel, method, args) => this._handleMessage(channel, method, args),\n            handleEvent: (channel, eventName, arg) => this._handleEvent(channel, eventName, arg)\n        });\n        this.requestHandler = requestHandlerFactory(this);\n    }\n    onmessage(msg) {\n        this._protocol.handleMessage(msg);\n    }\n    _handleMessage(channel, method, args) {\n        if (channel === DEFAULT_CHANNEL && method === INITIALIZE) {\n            return this.initialize(args[0]);\n        }\n        const requestHandler = (channel === DEFAULT_CHANNEL ? this.requestHandler : this._localChannels.get(channel));\n        if (!requestHandler) {\n            return Promise.reject(new Error(`Missing channel ${channel} on worker thread`));\n        }\n        const fn = requestHandler[method];\n        if (typeof fn !== 'function') {\n            return Promise.reject(new Error(`Missing method ${method} on worker thread channel ${channel}`));\n        }\n        try {\n            return Promise.resolve(fn.apply(requestHandler, args));\n        }\n        catch (e) {\n            return Promise.reject(e);\n        }\n    }\n    _handleEvent(channel, eventName, arg) {\n        const requestHandler = (channel === DEFAULT_CHANNEL ? this.requestHandler : this._localChannels.get(channel));\n        if (!requestHandler) {\n            throw new Error(`Missing channel ${channel} on worker thread`);\n        }\n        if (propertyIsDynamicEvent(eventName)) {\n            const fn = requestHandler[eventName];\n            if (typeof fn !== 'function') {\n                throw new Error(`Missing dynamic event ${eventName} on request handler.`);\n            }\n            const event = fn.call(requestHandler, arg);\n            if (typeof event !== 'function') {\n                throw new Error(`Missing dynamic event ${eventName} on request handler.`);\n            }\n            return event;\n        }\n        if (propertyIsEvent(eventName)) {\n            const event = requestHandler[eventName];\n            if (typeof event !== 'function') {\n                throw new Error(`Missing event ${eventName} on request handler.`);\n            }\n            return event;\n        }\n        throw new Error(`Malformed event name ${eventName}`);\n    }\n    getChannel(channel) {\n        if (!this._remoteChannels.has(channel)) {\n            const inst = this._protocol.createProxyToRemoteChannel(channel);\n            this._remoteChannels.set(channel, inst);\n        }\n        return this._remoteChannels.get(channel);\n    }\n    async initialize(workerId) {\n        this._protocol.setWorkerId(workerId);\n    }\n}\n\nexport { WebWorkerClient, WebWorkerServer, logOnceWebWorkerWarning };\n","import { createTrustedTypesPolicy } from './trustedTypes.js';\nimport { onUnexpectedError } from '../common/errors.js';\nimport { COI } from '../common/network.js';\nimport { URI } from '../common/uri.js';\nimport { WebWorkerClient } from '../common/worker/webWorker.js';\nimport { Disposable, toDisposable } from '../common/lifecycle.js';\nimport { coalesce } from '../common/arrays.js';\nimport '../../nls.js';\nimport { Emitter } from '../common/event.js';\nimport { getMonacoEnvironment } from './browser.js';\nimport { getNLSMessages, getNLSLanguage } from '../../nls.messages.js';\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// Reuse the trusted types policy defined from worker bootstrap\n// when available.\n// Refs https://github.com/microsoft/vscode/issues/222193\nlet ttPolicy;\n// eslint-disable-next-line local/code-no-any-casts\nif (typeof self === 'object' && self.constructor && self.constructor.name === 'DedicatedWorkerGlobalScope' && globalThis.workerttPolicy !== undefined) {\n    // eslint-disable-next-line local/code-no-any-casts\n    ttPolicy = globalThis.workerttPolicy;\n}\nelse {\n    ttPolicy = createTrustedTypesPolicy('defaultWorkerFactory', { createScriptURL: value => value });\n}\nfunction getWorker(descriptor, id) {\n    const label = descriptor.label || 'anonymous' + id;\n    // Option for hosts to overwrite the worker script (used in the standalone editor)\n    const monacoEnvironment = getMonacoEnvironment();\n    if (monacoEnvironment) {\n        if (typeof monacoEnvironment.getWorker === 'function') {\n            return monacoEnvironment.getWorker('workerMain.js', label);\n        }\n        if (typeof monacoEnvironment.getWorkerUrl === 'function') {\n            const workerUrl = monacoEnvironment.getWorkerUrl('workerMain.js', label);\n            return new Worker(ttPolicy ? ttPolicy.createScriptURL(workerUrl) : workerUrl, { name: label, type: 'module' });\n        }\n    }\n    const esmWorkerLocation = descriptor.esmModuleLocation;\n    if (esmWorkerLocation) {\n        const workerUrl = getWorkerBootstrapUrl(label, esmWorkerLocation.toString(true));\n        const worker = new Worker(ttPolicy ? ttPolicy.createScriptURL(workerUrl) : workerUrl, { name: label, type: 'module' });\n        return whenESMWorkerReady(worker);\n    }\n    throw new Error(`You must define a function MonacoEnvironment.getWorkerUrl or MonacoEnvironment.getWorker`);\n}\nfunction getWorkerBootstrapUrl(label, workerScriptUrl) {\n    if (/^((http:)|(https:)|(file:))/.test(workerScriptUrl) && workerScriptUrl.substring(0, globalThis.origin.length) !== globalThis.origin) ;\n    else {\n        const start = workerScriptUrl.lastIndexOf('?');\n        const end = workerScriptUrl.lastIndexOf('#', start);\n        const params = start > 0\n            ? new URLSearchParams(workerScriptUrl.substring(start + 1, ~end ? end : undefined))\n            : new URLSearchParams();\n        COI.addSearchParam(params, true, true);\n        const search = params.toString();\n        if (!search) {\n            workerScriptUrl = `${workerScriptUrl}#${label}`;\n        }\n        else {\n            workerScriptUrl = `${workerScriptUrl}?${params.toString()}#${label}`;\n        }\n    }\n    // In below blob code, we are using JSON.stringify to ensure the passed\n    // in values are not breaking our script. The values may contain string\n    // terminating characters (such as ' or \").\n    const blob = new Blob([coalesce([\n            `/*${label}*/`,\n            `globalThis._VSCODE_NLS_MESSAGES = ${JSON.stringify(getNLSMessages())};`,\n            `globalThis._VSCODE_NLS_LANGUAGE = ${JSON.stringify(getNLSLanguage())};`,\n            `globalThis._VSCODE_FILE_ROOT = ${JSON.stringify(globalThis._VSCODE_FILE_ROOT)};`,\n            `const ttPolicy = globalThis.trustedTypes?.createPolicy('defaultWorkerFactory', { createScriptURL: value => value });`,\n            `globalThis.workerttPolicy = ttPolicy;`,\n            `await import(ttPolicy?.createScriptURL(${JSON.stringify(workerScriptUrl)}) ?? ${JSON.stringify(workerScriptUrl)});`,\n            `globalThis.postMessage({ type: 'vscode-worker-ready' });`,\n            `/*${label}*/`\n        ]).join('')], { type: 'application/javascript' });\n    return URL.createObjectURL(blob);\n}\nfunction whenESMWorkerReady(worker) {\n    return new Promise((resolve, reject) => {\n        worker.onmessage = function (e) {\n            if (e.data.type === 'vscode-worker-ready') {\n                worker.onmessage = null;\n                resolve(worker);\n            }\n        };\n        worker.onerror = reject;\n    });\n}\nfunction isPromiseLike(obj) {\n    return !!obj && typeof obj.then === 'function';\n}\n/**\n * A worker that uses HTML5 web workers so that is has\n * its own global scope and its own thread.\n */\nclass WebWorker extends Disposable {\n    static { this.LAST_WORKER_ID = 0; }\n    constructor(descriptorOrWorker) {\n        super();\n        this._onMessage = this._register(new Emitter());\n        this.onMessage = this._onMessage.event;\n        this._onError = this._register(new Emitter());\n        this.onError = this._onError.event;\n        this.id = ++WebWorker.LAST_WORKER_ID;\n        const workerOrPromise = (descriptorOrWorker instanceof Worker\n            ? descriptorOrWorker :\n            'then' in descriptorOrWorker ? descriptorOrWorker\n                : getWorker(descriptorOrWorker, this.id));\n        if (isPromiseLike(workerOrPromise)) {\n            this.worker = workerOrPromise;\n        }\n        else {\n            this.worker = Promise.resolve(workerOrPromise);\n        }\n        this.postMessage('-please-ignore-', []); // TODO: Eliminate this extra message\n        const errorHandler = (ev) => {\n            this._onError.fire(ev);\n        };\n        this.worker.then((w) => {\n            w.onmessage = (ev) => {\n                this._onMessage.fire(ev.data);\n            };\n            w.onmessageerror = (ev) => {\n                this._onError.fire(ev);\n            };\n            if (typeof w.addEventListener === 'function') {\n                w.addEventListener('error', errorHandler);\n            }\n        });\n        this._register(toDisposable(() => {\n            this.worker?.then(w => {\n                w.onmessage = null;\n                w.onmessageerror = null;\n                w.removeEventListener('error', errorHandler);\n                w.terminate();\n            });\n            this.worker = null;\n        }));\n    }\n    getId() {\n        return this.id;\n    }\n    postMessage(message, transfer) {\n        this.worker?.then(w => {\n            try {\n                w.postMessage(message, transfer);\n            }\n            catch (err) {\n                onUnexpectedError(err);\n                onUnexpectedError(new Error(`FAILED to post message to worker`, { cause: err }));\n            }\n        });\n    }\n}\nclass WebWorkerDescriptor {\n    constructor(esmModuleLocation, label) {\n        this.esmModuleLocation = esmModuleLocation;\n        this.label = label;\n    }\n}\nfunction createWebWorker(arg0, arg1) {\n    const workerDescriptorOrWorker = (URI.isUri(arg0) ? new WebWorkerDescriptor(arg0, arg1) : arg0);\n    return new WebWorkerClient(new WebWorker(workerDescriptorOrWorker));\n}\n\nexport { WebWorkerDescriptor, createWebWorker };\n","import { CharacterClassifier } from '../core/characterClassifier.js';\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 *--------------------------------------------------------------------------------------------*/\nclass Uint8Matrix {\n    constructor(rows, cols, defaultValue) {\n        const data = new Uint8Array(rows * cols);\n        for (let i = 0, len = rows * cols; i < len; i++) {\n            data[i] = defaultValue;\n        }\n        this._data = data;\n        this.rows = rows;\n        this.cols = cols;\n    }\n    get(row, col) {\n        return this._data[row * this.cols + col];\n    }\n    set(row, col, value) {\n        this._data[row * this.cols + col] = value;\n    }\n}\nclass StateMachine {\n    constructor(edges) {\n        let maxCharCode = 0;\n        let maxState = 0 /* State.Invalid */;\n        for (let i = 0, len = edges.length; i < len; i++) {\n            const [from, chCode, to] = edges[i];\n            if (chCode > maxCharCode) {\n                maxCharCode = chCode;\n            }\n            if (from > maxState) {\n                maxState = from;\n            }\n            if (to > maxState) {\n                maxState = to;\n            }\n        }\n        maxCharCode++;\n        maxState++;\n        const states = new Uint8Matrix(maxState, maxCharCode, 0 /* State.Invalid */);\n        for (let i = 0, len = edges.length; i < len; i++) {\n            const [from, chCode, to] = edges[i];\n            states.set(from, chCode, to);\n        }\n        this._states = states;\n        this._maxCharCode = maxCharCode;\n    }\n    nextState(currentState, chCode) {\n        if (chCode < 0 || chCode >= this._maxCharCode) {\n            return 0 /* State.Invalid */;\n        }\n        return this._states.get(currentState, chCode);\n    }\n}\n// State machine for http:// or https:// or file://\nlet _stateMachine = null;\nfunction getStateMachine() {\n    if (_stateMachine === null) {\n        _stateMachine = new StateMachine([\n            [1 /* State.Start */, 104 /* CharCode.h */, 2 /* State.H */],\n            [1 /* State.Start */, 72 /* CharCode.H */, 2 /* State.H */],\n            [1 /* State.Start */, 102 /* CharCode.f */, 6 /* State.F */],\n            [1 /* State.Start */, 70 /* CharCode.F */, 6 /* State.F */],\n            [2 /* State.H */, 116 /* CharCode.t */, 3 /* State.HT */],\n            [2 /* State.H */, 84 /* CharCode.T */, 3 /* State.HT */],\n            [3 /* State.HT */, 116 /* CharCode.t */, 4 /* State.HTT */],\n            [3 /* State.HT */, 84 /* CharCode.T */, 4 /* State.HTT */],\n            [4 /* State.HTT */, 112 /* CharCode.p */, 5 /* State.HTTP */],\n            [4 /* State.HTT */, 80 /* CharCode.P */, 5 /* State.HTTP */],\n            [5 /* State.HTTP */, 115 /* CharCode.s */, 9 /* State.BeforeColon */],\n            [5 /* State.HTTP */, 83 /* CharCode.S */, 9 /* State.BeforeColon */],\n            [5 /* State.HTTP */, 58 /* CharCode.Colon */, 10 /* State.AfterColon */],\n            [6 /* State.F */, 105 /* CharCode.i */, 7 /* State.FI */],\n            [6 /* State.F */, 73 /* CharCode.I */, 7 /* State.FI */],\n            [7 /* State.FI */, 108 /* CharCode.l */, 8 /* State.FIL */],\n            [7 /* State.FI */, 76 /* CharCode.L */, 8 /* State.FIL */],\n            [8 /* State.FIL */, 101 /* CharCode.e */, 9 /* State.BeforeColon */],\n            [8 /* State.FIL */, 69 /* CharCode.E */, 9 /* State.BeforeColon */],\n            [9 /* State.BeforeColon */, 58 /* CharCode.Colon */, 10 /* State.AfterColon */],\n            [10 /* State.AfterColon */, 47 /* CharCode.Slash */, 11 /* State.AlmostThere */],\n            [11 /* State.AlmostThere */, 47 /* CharCode.Slash */, 12 /* State.End */],\n        ]);\n    }\n    return _stateMachine;\n}\nlet _classifier = null;\nfunction getClassifier() {\n    if (_classifier === null) {\n        _classifier = new CharacterClassifier(0 /* CharacterClass.None */);\n        // allow-any-unicode-next-line\n        const FORCE_TERMINATION_CHARACTERS = ' \\t<>\\'\\\"、。｡､，．：；‘〈「『〔（［｛｢｣｝］）〕』」〉’｀～…|';\n        for (let i = 0; i < FORCE_TERMINATION_CHARACTERS.length; i++) {\n            _classifier.set(FORCE_TERMINATION_CHARACTERS.charCodeAt(i), 1 /* CharacterClass.ForceTermination */);\n        }\n        const CANNOT_END_WITH_CHARACTERS = '.,;:';\n        for (let i = 0; i < CANNOT_END_WITH_CHARACTERS.length; i++) {\n            _classifier.set(CANNOT_END_WITH_CHARACTERS.charCodeAt(i), 2 /* CharacterClass.CannotEndIn */);\n        }\n    }\n    return _classifier;\n}\nclass LinkComputer {\n    static _createLink(classifier, line, lineNumber, linkBeginIndex, linkEndIndex) {\n        // Do not allow to end link in certain characters...\n        let lastIncludedCharIndex = linkEndIndex - 1;\n        do {\n            const chCode = line.charCodeAt(lastIncludedCharIndex);\n            const chClass = classifier.get(chCode);\n            if (chClass !== 2 /* CharacterClass.CannotEndIn */) {\n                break;\n            }\n            lastIncludedCharIndex--;\n        } while (lastIncludedCharIndex > linkBeginIndex);\n        // Handle links enclosed in parens, square brackets and curlys.\n        if (linkBeginIndex > 0) {\n            const charCodeBeforeLink = line.charCodeAt(linkBeginIndex - 1);\n            const lastCharCodeInLink = line.charCodeAt(lastIncludedCharIndex);\n            if ((charCodeBeforeLink === 40 /* CharCode.OpenParen */ && lastCharCodeInLink === 41 /* CharCode.CloseParen */)\n                || (charCodeBeforeLink === 91 /* CharCode.OpenSquareBracket */ && lastCharCodeInLink === 93 /* CharCode.CloseSquareBracket */)\n                || (charCodeBeforeLink === 123 /* CharCode.OpenCurlyBrace */ && lastCharCodeInLink === 125 /* CharCode.CloseCurlyBrace */)) {\n                // Do not end in ) if ( is before the link start\n                // Do not end in ] if [ is before the link start\n                // Do not end in } if { is before the link start\n                lastIncludedCharIndex--;\n            }\n        }\n        return {\n            range: {\n                startLineNumber: lineNumber,\n                startColumn: linkBeginIndex + 1,\n                endLineNumber: lineNumber,\n                endColumn: lastIncludedCharIndex + 2\n            },\n            url: line.substring(linkBeginIndex, lastIncludedCharIndex + 1)\n        };\n    }\n    static computeLinks(model, stateMachine = getStateMachine()) {\n        const classifier = getClassifier();\n        const result = [];\n        for (let i = 1, lineCount = model.getLineCount(); i <= lineCount; i++) {\n            const line = model.getLineContent(i);\n            const len = line.length;\n            let j = 0;\n            let linkBeginIndex = 0;\n            let linkBeginChCode = 0;\n            let state = 1 /* State.Start */;\n            let hasOpenParens = false;\n            let hasOpenSquareBracket = false;\n            let inSquareBrackets = false;\n            let hasOpenCurlyBracket = false;\n            while (j < len) {\n                let resetStateMachine = false;\n                const chCode = line.charCodeAt(j);\n                if (state === 13 /* State.Accept */) {\n                    let chClass;\n                    switch (chCode) {\n                        case 40 /* CharCode.OpenParen */:\n                            hasOpenParens = true;\n                            chClass = 0 /* CharacterClass.None */;\n                            break;\n                        case 41 /* CharCode.CloseParen */:\n                            chClass = (hasOpenParens ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */);\n                            break;\n                        case 91 /* CharCode.OpenSquareBracket */:\n                            inSquareBrackets = true;\n                            hasOpenSquareBracket = true;\n                            chClass = 0 /* CharacterClass.None */;\n                            break;\n                        case 93 /* CharCode.CloseSquareBracket */:\n                            inSquareBrackets = false;\n                            chClass = (hasOpenSquareBracket ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */);\n                            break;\n                        case 123 /* CharCode.OpenCurlyBrace */:\n                            hasOpenCurlyBracket = true;\n                            chClass = 0 /* CharacterClass.None */;\n                            break;\n                        case 125 /* CharCode.CloseCurlyBrace */:\n                            chClass = (hasOpenCurlyBracket ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */);\n                            break;\n                        // The following three rules make it that ' or \" or ` are allowed inside links\n                        // only if the link is wrapped by some other quote character\n                        case 39 /* CharCode.SingleQuote */:\n                        case 34 /* CharCode.DoubleQuote */:\n                        case 96 /* CharCode.BackTick */:\n                            if (linkBeginChCode === chCode) {\n                                chClass = 1 /* CharacterClass.ForceTermination */;\n                            }\n                            else if (linkBeginChCode === 39 /* CharCode.SingleQuote */ || linkBeginChCode === 34 /* CharCode.DoubleQuote */ || linkBeginChCode === 96 /* CharCode.BackTick */) {\n                                chClass = 0 /* CharacterClass.None */;\n                            }\n                            else {\n                                chClass = 1 /* CharacterClass.ForceTermination */;\n                            }\n                            break;\n                        case 42 /* CharCode.Asterisk */:\n                            // `*` terminates a link if the link began with `*`\n                            chClass = (linkBeginChCode === 42 /* CharCode.Asterisk */) ? 1 /* CharacterClass.ForceTermination */ : 0 /* CharacterClass.None */;\n                            break;\n                        case 32 /* CharCode.Space */:\n                            // ` ` allow space in between [ and ]\n                            chClass = (inSquareBrackets ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */);\n                            break;\n                        default:\n                            chClass = classifier.get(chCode);\n                    }\n                    // Check if character terminates link\n                    if (chClass === 1 /* CharacterClass.ForceTermination */) {\n                        result.push(LinkComputer._createLink(classifier, line, i, linkBeginIndex, j));\n                        resetStateMachine = true;\n                    }\n                }\n                else if (state === 12 /* State.End */) {\n                    let chClass;\n                    if (chCode === 91 /* CharCode.OpenSquareBracket */) {\n                        // Allow for the authority part to contain ipv6 addresses which contain [ and ]\n                        hasOpenSquareBracket = true;\n                        chClass = 0 /* CharacterClass.None */;\n                    }\n                    else {\n                        chClass = classifier.get(chCode);\n                    }\n                    // Check if character terminates link\n                    if (chClass === 1 /* CharacterClass.ForceTermination */) {\n                        resetStateMachine = true;\n                    }\n                    else {\n                        state = 13 /* State.Accept */;\n                    }\n                }\n                else {\n                    state = stateMachine.nextState(state, chCode);\n                    if (state === 0 /* State.Invalid */) {\n                        resetStateMachine = true;\n                    }\n                }\n                if (resetStateMachine) {\n                    state = 1 /* State.Start */;\n                    hasOpenParens = false;\n                    hasOpenSquareBracket = false;\n                    hasOpenCurlyBracket = false;\n                    // Record where the link started\n                    linkBeginIndex = j + 1;\n                    linkBeginChCode = chCode;\n                }\n                j++;\n            }\n            if (state === 13 /* State.Accept */) {\n                result.push(LinkComputer._createLink(classifier, line, i, linkBeginIndex, len));\n            }\n        }\n        return result;\n    }\n}\n/**\n * Returns an array of all links contains in the provided\n * document. *Note* that this operation is computational\n * expensive and should not run in the UI thread.\n */\nfunction computeLinks(model) {\n    if (!model || typeof model.getLineCount !== 'function' || typeof model.getLineContent !== 'function') {\n        // Unknown caller!\n        return [];\n    }\n    return LinkComputer.computeLinks(model);\n}\n\nexport { LinkComputer, StateMachine, computeLinks };\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 *--------------------------------------------------------------------------------------------*/\nclass BasicInplaceReplace {\n    constructor() {\n        this._defaultValueSet = [\n            ['true', 'false'],\n            ['True', 'False'],\n            ['Private', 'Public', 'Friend', 'ReadOnly', 'Partial', 'Protected', 'WriteOnly'],\n            ['public', 'protected', 'private'],\n        ];\n    }\n    static { this.INSTANCE = new BasicInplaceReplace(); }\n    navigateValueSet(range1, text1, range2, text2, up) {\n        if (range1 && text1) {\n            const result = this.doNavigateValueSet(text1, up);\n            if (result) {\n                return {\n                    range: range1,\n                    value: result\n                };\n            }\n        }\n        if (range2 && text2) {\n            const result = this.doNavigateValueSet(text2, up);\n            if (result) {\n                return {\n                    range: range2,\n                    value: result\n                };\n            }\n        }\n        return null;\n    }\n    doNavigateValueSet(text, up) {\n        const numberResult = this.numberReplace(text, up);\n        if (numberResult !== null) {\n            return numberResult;\n        }\n        return this.textReplace(text, up);\n    }\n    numberReplace(value, up) {\n        const precision = Math.pow(10, value.length - (value.lastIndexOf('.') + 1));\n        let n1 = Number(value);\n        const n2 = parseFloat(value);\n        if (!isNaN(n1) && !isNaN(n2) && n1 === n2) {\n            if (n1 === 0 && !up) {\n                return null; // don't do negative\n                //\t\t\t} else if(n1 === 9 && up) {\n                //\t\t\t\treturn null; // don't insert 10 into a number\n            }\n            else {\n                n1 = Math.floor(n1 * precision);\n                n1 += up ? precision : -precision;\n                return String(n1 / precision);\n            }\n        }\n        return null;\n    }\n    textReplace(value, up) {\n        return this.valueSetsReplace(this._defaultValueSet, value, up);\n    }\n    valueSetsReplace(valueSets, value, up) {\n        let result = null;\n        for (let i = 0, len = valueSets.length; result === null && i < len; i++) {\n            result = this.valueSetReplace(valueSets[i], value, up);\n        }\n        return result;\n    }\n    valueSetReplace(valueSet, value, up) {\n        let idx = valueSet.indexOf(value);\n        if (idx >= 0) {\n            idx += up ? 1 : -1;\n            if (idx < 0) {\n                idx = valueSet.length - 1;\n            }\n            else {\n                idx %= valueSet.length;\n            }\n            return valueSet[idx];\n        }\n        return null;\n    }\n}\n\nexport { BasicInplaceReplace };\n","import { Color, HSLA } from '../../../base/common/color.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction _parseCaptureGroups(captureGroups) {\n    const values = [];\n    for (const captureGroup of captureGroups) {\n        const parsedNumber = Number(captureGroup);\n        if (parsedNumber || parsedNumber === 0 && captureGroup.replace(/\\s/g, '') !== '') {\n            values.push(parsedNumber);\n        }\n    }\n    return values;\n}\nfunction _toIColor(r, g, b, a) {\n    return {\n        red: r / 255,\n        blue: b / 255,\n        green: g / 255,\n        alpha: a\n    };\n}\nfunction _findRange(model, match) {\n    const index = match.index;\n    const length = match[0].length;\n    if (index === undefined) {\n        return;\n    }\n    const startPosition = model.positionAt(index);\n    const range = {\n        startLineNumber: startPosition.lineNumber,\n        startColumn: startPosition.column,\n        endLineNumber: startPosition.lineNumber,\n        endColumn: startPosition.column + length\n    };\n    return range;\n}\nfunction _findHexColorInformation(range, hexValue) {\n    if (!range) {\n        return;\n    }\n    const parsedHexColor = Color.Format.CSS.parseHex(hexValue);\n    if (!parsedHexColor) {\n        return;\n    }\n    return {\n        range: range,\n        color: _toIColor(parsedHexColor.rgba.r, parsedHexColor.rgba.g, parsedHexColor.rgba.b, parsedHexColor.rgba.a)\n    };\n}\nfunction _findRGBColorInformation(range, matches, isAlpha) {\n    if (!range || matches.length !== 1) {\n        return;\n    }\n    const match = matches[0];\n    const captureGroups = match.values();\n    const parsedRegex = _parseCaptureGroups(captureGroups);\n    return {\n        range: range,\n        color: _toIColor(parsedRegex[0], parsedRegex[1], parsedRegex[2], isAlpha ? parsedRegex[3] : 1)\n    };\n}\nfunction _findHSLColorInformation(range, matches, isAlpha) {\n    if (!range || matches.length !== 1) {\n        return;\n    }\n    const match = matches[0];\n    const captureGroups = match.values();\n    const parsedRegex = _parseCaptureGroups(captureGroups);\n    const colorEquivalent = new Color(new HSLA(parsedRegex[0], parsedRegex[1] / 100, parsedRegex[2] / 100, isAlpha ? parsedRegex[3] : 1));\n    return {\n        range: range,\n        color: _toIColor(colorEquivalent.rgba.r, colorEquivalent.rgba.g, colorEquivalent.rgba.b, colorEquivalent.rgba.a)\n    };\n}\nfunction _findMatches(model, regex) {\n    if (typeof model === 'string') {\n        return [...model.matchAll(regex)];\n    }\n    else {\n        return model.findMatches(regex);\n    }\n}\nfunction computeColors(model) {\n    const result = [];\n    // Early validation for RGB and HSL\n    const initialValidationRegex = /\\b(rgb|rgba|hsl|hsla)(\\([0-9\\s,.\\%]*\\))|^(#)([A-Fa-f0-9]{3})\\b|^(#)([A-Fa-f0-9]{4})\\b|^(#)([A-Fa-f0-9]{6})\\b|^(#)([A-Fa-f0-9]{8})\\b|(?<=['\"\\s])(#)([A-Fa-f0-9]{3})\\b|(?<=['\"\\s])(#)([A-Fa-f0-9]{4})\\b|(?<=['\"\\s])(#)([A-Fa-f0-9]{6})\\b|(?<=['\"\\s])(#)([A-Fa-f0-9]{8})\\b/gm;\n    const initialValidationMatches = _findMatches(model, initialValidationRegex);\n    // Potential colors have been found, validate the parameters\n    if (initialValidationMatches.length > 0) {\n        for (const initialMatch of initialValidationMatches) {\n            const initialCaptureGroups = initialMatch.filter(captureGroup => captureGroup !== undefined);\n            const colorScheme = initialCaptureGroups[1];\n            const colorParameters = initialCaptureGroups[2];\n            if (!colorParameters) {\n                continue;\n            }\n            let colorInformation;\n            if (colorScheme === 'rgb') {\n                const regexParameters = /^\\(\\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\\s*,\\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\\s*,\\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\\s*\\)$/gm;\n                colorInformation = _findRGBColorInformation(_findRange(model, initialMatch), _findMatches(colorParameters, regexParameters), false);\n            }\n            else if (colorScheme === 'rgba') {\n                const regexParameters = /^\\(\\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\\s*,\\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\\s*,\\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\\s*,\\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\\s*\\)$/gm;\n                colorInformation = _findRGBColorInformation(_findRange(model, initialMatch), _findMatches(colorParameters, regexParameters), true);\n            }\n            else if (colorScheme === 'hsl') {\n                const regexParameters = /^\\(\\s*((?:360(?:\\.0+)?|(?:36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])(?:\\.\\d+)?))\\s*[\\s,]\\s*(100|\\d{1,2}[.]\\d*|\\d{1,2})%\\s*[\\s,]\\s*(100|\\d{1,2}[.]\\d*|\\d{1,2})%\\s*\\)$/gm;\n                colorInformation = _findHSLColorInformation(_findRange(model, initialMatch), _findMatches(colorParameters, regexParameters), false);\n            }\n            else if (colorScheme === 'hsla') {\n                const regexParameters = /^\\(\\s*((?:360(?:\\.0+)?|(?:36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])(?:\\.\\d+)?))\\s*[\\s,]\\s*(100|\\d{1,2}[.]\\d*|\\d{1,2})%\\s*[\\s,]\\s*(100|\\d{1,2}[.]\\d*|\\d{1,2})%\\s*[\\s,]\\s*(0[.][0-9]+|[.][0-9]+|[01][.]0*|[01])\\s*\\)$/gm;\n                colorInformation = _findHSLColorInformation(_findRange(model, initialMatch), _findMatches(colorParameters, regexParameters), true);\n            }\n            else if (colorScheme === '#') {\n                colorInformation = _findHexColorInformation(_findRange(model, initialMatch), colorScheme + colorParameters);\n            }\n            if (colorInformation) {\n                result.push(colorInformation);\n            }\n        }\n    }\n    return result;\n}\n/**\n * Returns an array of all default document colors in the provided document\n */\nfunction computeDefaultDocumentColors(model) {\n    if (!model || typeof model.getValue !== 'function' || typeof model.positionAt !== 'function') {\n        // Unknown caller!\n        return [];\n    }\n    return computeColors(model);\n}\n\nexport { computeDefaultDocumentColors };\n","import { isMultilineRegexSource } from '../model/textModelSearch.js';\nimport { regExpLeadsToEndlessLoop } from '../../../base/common/strings.js';\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 *--------------------------------------------------------------------------------------------*/\nconst trimDashesRegex = /^-+|-+$/g;\nconst CHUNK_SIZE = 100;\nconst MAX_SECTION_LINES = 5;\n/**\n * Find section headers in the model.\n *\n * @param model the text model to search in\n * @param options options to search with\n * @returns an array of section headers\n */\nfunction findSectionHeaders(model, options) {\n    let headers = [];\n    if (options.findRegionSectionHeaders && options.foldingRules?.markers) {\n        const regionHeaders = collectRegionHeaders(model, options);\n        headers = headers.concat(regionHeaders);\n    }\n    if (options.findMarkSectionHeaders) {\n        const markHeaders = collectMarkHeaders(model, options);\n        headers = headers.concat(markHeaders);\n    }\n    return headers;\n}\nfunction collectRegionHeaders(model, options) {\n    const regionHeaders = [];\n    const endLineNumber = model.getLineCount();\n    for (let lineNumber = 1; lineNumber <= endLineNumber; lineNumber++) {\n        const lineContent = model.getLineContent(lineNumber);\n        const match = lineContent.match(options.foldingRules.markers.start);\n        if (match) {\n            const range = { startLineNumber: lineNumber, startColumn: match[0].length + 1, endLineNumber: lineNumber, endColumn: lineContent.length + 1 };\n            if (range.endColumn > range.startColumn) {\n                const sectionHeader = {\n                    range,\n                    ...getHeaderText(lineContent.substring(match[0].length)),\n                    shouldBeInComments: false\n                };\n                if (sectionHeader.text || sectionHeader.hasSeparatorLine) {\n                    regionHeaders.push(sectionHeader);\n                }\n            }\n        }\n    }\n    return regionHeaders;\n}\nfunction collectMarkHeaders(model, options) {\n    const markHeaders = [];\n    const endLineNumber = model.getLineCount();\n    // Validate regex to prevent infinite loops\n    if (!options.markSectionHeaderRegex || options.markSectionHeaderRegex.trim() === '') {\n        return markHeaders;\n    }\n    // Create regex with flags for:\n    // - 'd' for indices to get proper match positions\n    // - 'm' for multi-line mode so ^ and $ match line starts/ends\n    // - 's' for dot-all mode so . matches newlines\n    const multiline = isMultilineRegexSource(options.markSectionHeaderRegex);\n    const regex = new RegExp(options.markSectionHeaderRegex, `gdm${multiline ? 's' : ''}`);\n    // Check if the regex would lead to an endless loop\n    if (regExpLeadsToEndlessLoop(regex)) {\n        return markHeaders;\n    }\n    // Process text in overlapping chunks for better performance\n    for (let startLine = 1; startLine <= endLineNumber; startLine += CHUNK_SIZE - MAX_SECTION_LINES) {\n        const endLine = Math.min(startLine + CHUNK_SIZE - 1, endLineNumber);\n        const lines = [];\n        // Collect lines for the current chunk\n        for (let i = startLine; i <= endLine; i++) {\n            lines.push(model.getLineContent(i));\n        }\n        const text = lines.join('\\n');\n        regex.lastIndex = 0;\n        let match;\n        while ((match = regex.exec(text)) !== null) {\n            // Calculate which line this match starts on by counting newlines before it\n            const precedingText = text.substring(0, match.index);\n            const lineOffset = (precedingText.match(/\\n/g) || []).length;\n            const lineNumber = startLine + lineOffset;\n            // Calculate match height to check overlap properly\n            const matchLines = match[0].split('\\n');\n            const matchHeight = matchLines.length;\n            const matchEndLine = lineNumber + matchHeight - 1;\n            // Calculate start column - need to find the start of the line containing the match\n            const lineStartIndex = precedingText.lastIndexOf('\\n') + 1;\n            const startColumn = match.index - lineStartIndex + 1;\n            // Calculate end column - need to handle multi-line matches\n            const lastMatchLine = matchLines[matchLines.length - 1];\n            const endColumn = matchHeight === 1 ? startColumn + match[0].length : lastMatchLine.length + 1;\n            const range = {\n                startLineNumber: lineNumber,\n                startColumn,\n                endLineNumber: matchEndLine,\n                endColumn\n            };\n            const text2 = (match.groups ?? {})['label'] ?? '';\n            const hasSeparatorLine = ((match.groups ?? {})['separator'] ?? '') !== '';\n            const sectionHeader = {\n                range,\n                text: text2,\n                hasSeparatorLine,\n                shouldBeInComments: true\n            };\n            if (sectionHeader.text || sectionHeader.hasSeparatorLine) {\n                // only push if the previous one doesn't have this same linbe\n                if (markHeaders.length === 0 || markHeaders[markHeaders.length - 1].range.endLineNumber < sectionHeader.range.startLineNumber) {\n                    markHeaders.push(sectionHeader);\n                }\n            }\n            // Move lastIndex past the current match to avoid infinite loop\n            regex.lastIndex = match.index + match[0].length;\n        }\n    }\n    return markHeaders;\n}\nfunction getHeaderText(text) {\n    text = text.trim();\n    const hasSeparatorLine = text.startsWith('-');\n    text = text.replace(trimDashesRegex, '');\n    return { text, hasSeparatorLine };\n}\n\nexport { collectMarkHeaders, findSectionHeaders };\n","import { splitLines } from '../../../base/common/strings.js';\nimport { Position } from '../core/position.js';\nimport { PrefixSumComputer } from './prefixSumComputer.js';\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 *--------------------------------------------------------------------------------------------*/\nclass MirrorTextModel {\n    constructor(uri, lines, eol, versionId) {\n        this._uri = uri;\n        this._lines = lines;\n        this._eol = eol;\n        this._versionId = versionId;\n        this._lineStarts = null;\n        this._cachedTextValue = null;\n    }\n    dispose() {\n        this._lines.length = 0;\n    }\n    get version() {\n        return this._versionId;\n    }\n    getText() {\n        if (this._cachedTextValue === null) {\n            this._cachedTextValue = this._lines.join(this._eol);\n        }\n        return this._cachedTextValue;\n    }\n    onEvents(e) {\n        if (e.eol && e.eol !== this._eol) {\n            this._eol = e.eol;\n            this._lineStarts = null;\n        }\n        // Update my lines\n        const changes = e.changes;\n        for (const change of changes) {\n            this._acceptDeleteRange(change.range);\n            this._acceptInsertText(new Position(change.range.startLineNumber, change.range.startColumn), change.text);\n        }\n        this._versionId = e.versionId;\n        this._cachedTextValue = null;\n    }\n    _ensureLineStarts() {\n        if (!this._lineStarts) {\n            const eolLength = this._eol.length;\n            const linesLength = this._lines.length;\n            const lineStartValues = new Uint32Array(linesLength);\n            for (let i = 0; i < linesLength; i++) {\n                lineStartValues[i] = this._lines[i].length + eolLength;\n            }\n            this._lineStarts = new PrefixSumComputer(lineStartValues);\n        }\n    }\n    /**\n     * All changes to a line's text go through this method\n     */\n    _setLineText(lineIndex, newValue) {\n        this._lines[lineIndex] = newValue;\n        if (this._lineStarts) {\n            // update prefix sum\n            this._lineStarts.setValue(lineIndex, this._lines[lineIndex].length + this._eol.length);\n        }\n    }\n    _acceptDeleteRange(range) {\n        if (range.startLineNumber === range.endLineNumber) {\n            if (range.startColumn === range.endColumn) {\n                // Nothing to delete\n                return;\n            }\n            // Delete text on the affected line\n            this._setLineText(range.startLineNumber - 1, this._lines[range.startLineNumber - 1].substring(0, range.startColumn - 1)\n                + this._lines[range.startLineNumber - 1].substring(range.endColumn - 1));\n            return;\n        }\n        // Take remaining text on last line and append it to remaining text on first line\n        this._setLineText(range.startLineNumber - 1, this._lines[range.startLineNumber - 1].substring(0, range.startColumn - 1)\n            + this._lines[range.endLineNumber - 1].substring(range.endColumn - 1));\n        // Delete middle lines\n        this._lines.splice(range.startLineNumber, range.endLineNumber - range.startLineNumber);\n        if (this._lineStarts) {\n            // update prefix sum\n            this._lineStarts.removeValues(range.startLineNumber, range.endLineNumber - range.startLineNumber);\n        }\n    }\n    _acceptInsertText(position, insertText) {\n        if (insertText.length === 0) {\n            // Nothing to insert\n            return;\n        }\n        const insertLines = splitLines(insertText);\n        if (insertLines.length === 1) {\n            // Inserting text on one line\n            this._setLineText(position.lineNumber - 1, this._lines[position.lineNumber - 1].substring(0, position.column - 1)\n                + insertLines[0]\n                + this._lines[position.lineNumber - 1].substring(position.column - 1));\n            return;\n        }\n        // Append overflowing text from first line to the end of text to insert\n        insertLines[insertLines.length - 1] += this._lines[position.lineNumber - 1].substring(position.column - 1);\n        // Delete overflowing text from first line and insert text on first line\n        this._setLineText(position.lineNumber - 1, this._lines[position.lineNumber - 1].substring(0, position.column - 1)\n            + insertLines[0]);\n        // Insert new lines & store lengths\n        const newLengths = new Uint32Array(insertLines.length - 1);\n        for (let i = 1; i < insertLines.length; i++) {\n            this._lines.splice(position.lineNumber + i - 1, 0, insertLines[i]);\n            newLengths[i - 1] = insertLines[i].length + this._eol.length;\n        }\n        if (this._lineStarts) {\n            // update prefix sum\n            this._lineStarts.insertValues(position.lineNumber, newLengths);\n        }\n    }\n}\n\nexport { MirrorTextModel };\n","import { IntervalTimer } from '../../../../base/common/async.js';\nimport { Disposable, dispose, DisposableStore, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { Position } from '../../core/position.js';\nimport { Range } from '../../core/range.js';\nimport { getWordAtText, ensureValidWordDefinition } from '../../core/wordHelper.js';\nimport { MirrorTextModel } from '../../model/mirrorTextModel.js';\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/**\n * Stop syncing a model to the worker if it was not needed for 1 min.\n */\nconst STOP_SYNC_MODEL_DELTA_TIME_MS = 60 * 1000;\nclass WorkerTextModelSyncClient extends Disposable {\n    constructor(proxy, modelService, keepIdleModels = false) {\n        super();\n        this._syncedModels = Object.create(null);\n        this._syncedModelsLastUsedTime = Object.create(null);\n        this._proxy = proxy;\n        this._modelService = modelService;\n        if (!keepIdleModels) {\n            const timer = new IntervalTimer();\n            timer.cancelAndSet(() => this._checkStopModelSync(), Math.round(STOP_SYNC_MODEL_DELTA_TIME_MS / 2));\n            this._register(timer);\n        }\n    }\n    dispose() {\n        for (const modelUrl in this._syncedModels) {\n            dispose(this._syncedModels[modelUrl]);\n        }\n        this._syncedModels = Object.create(null);\n        this._syncedModelsLastUsedTime = Object.create(null);\n        super.dispose();\n    }\n    ensureSyncedResources(resources, forceLargeModels = false) {\n        for (const resource of resources) {\n            const resourceStr = resource.toString();\n            if (!this._syncedModels[resourceStr]) {\n                this._beginModelSync(resource, forceLargeModels);\n            }\n            if (this._syncedModels[resourceStr]) {\n                this._syncedModelsLastUsedTime[resourceStr] = (new Date()).getTime();\n            }\n        }\n    }\n    _checkStopModelSync() {\n        const currentTime = (new Date()).getTime();\n        const toRemove = [];\n        for (const modelUrl in this._syncedModelsLastUsedTime) {\n            const elapsedTime = currentTime - this._syncedModelsLastUsedTime[modelUrl];\n            if (elapsedTime > STOP_SYNC_MODEL_DELTA_TIME_MS) {\n                toRemove.push(modelUrl);\n            }\n        }\n        for (const e of toRemove) {\n            this._stopModelSync(e);\n        }\n    }\n    _beginModelSync(resource, forceLargeModels) {\n        const model = this._modelService.getModel(resource);\n        if (!model) {\n            return;\n        }\n        if (!forceLargeModels && model.isTooLargeForSyncing()) {\n            return;\n        }\n        const modelUrl = resource.toString();\n        this._proxy.$acceptNewModel({\n            url: model.uri.toString(),\n            lines: model.getLinesContent(),\n            EOL: model.getEOL(),\n            versionId: model.getVersionId()\n        });\n        const toDispose = new DisposableStore();\n        toDispose.add(model.onDidChangeContent((e) => {\n            this._proxy.$acceptModelChanged(modelUrl.toString(), e);\n        }));\n        toDispose.add(model.onWillDispose(() => {\n            this._stopModelSync(modelUrl);\n        }));\n        toDispose.add(toDisposable(() => {\n            this._proxy.$acceptRemovedModel(modelUrl);\n        }));\n        this._syncedModels[modelUrl] = toDispose;\n    }\n    _stopModelSync(modelUrl) {\n        const toDispose = this._syncedModels[modelUrl];\n        delete this._syncedModels[modelUrl];\n        delete this._syncedModelsLastUsedTime[modelUrl];\n        dispose(toDispose);\n    }\n}\nclass WorkerTextModelSyncServer {\n    constructor() {\n        this._models = Object.create(null);\n    }\n    getModel(uri) {\n        return this._models[uri];\n    }\n    getModels() {\n        const all = [];\n        Object.keys(this._models).forEach((key) => all.push(this._models[key]));\n        return all;\n    }\n    $acceptNewModel(data) {\n        this._models[data.url] = new MirrorModel(URI.parse(data.url), data.lines, data.EOL, data.versionId);\n    }\n    $acceptModelChanged(uri, e) {\n        if (!this._models[uri]) {\n            return;\n        }\n        const model = this._models[uri];\n        model.onEvents(e);\n    }\n    $acceptRemovedModel(uri) {\n        if (!this._models[uri]) {\n            return;\n        }\n        delete this._models[uri];\n    }\n}\nclass MirrorModel extends MirrorTextModel {\n    get uri() {\n        return this._uri;\n    }\n    get eol() {\n        return this._eol;\n    }\n    getValue() {\n        return this.getText();\n    }\n    findMatches(regex) {\n        const matches = [];\n        for (let i = 0; i < this._lines.length; i++) {\n            const line = this._lines[i];\n            const offsetToAdd = this.offsetAt(new Position(i + 1, 1));\n            const iteratorOverMatches = line.matchAll(regex);\n            for (const match of iteratorOverMatches) {\n                if (match.index || match.index === 0) {\n                    match.index = match.index + offsetToAdd;\n                }\n                matches.push(match);\n            }\n        }\n        return matches;\n    }\n    getLinesContent() {\n        return this._lines.slice(0);\n    }\n    getLineCount() {\n        return this._lines.length;\n    }\n    getLineContent(lineNumber) {\n        return this._lines[lineNumber - 1];\n    }\n    getWordAtPosition(position, wordDefinition) {\n        const wordAtText = getWordAtText(position.column, ensureValidWordDefinition(wordDefinition), this._lines[position.lineNumber - 1], 0);\n        if (wordAtText) {\n            return new Range(position.lineNumber, wordAtText.startColumn, position.lineNumber, wordAtText.endColumn);\n        }\n        return null;\n    }\n    words(wordDefinition) {\n        const lines = this._lines;\n        const wordenize = this._wordenize.bind(this);\n        let lineNumber = 0;\n        let lineText = '';\n        let wordRangesIdx = 0;\n        let wordRanges = [];\n        return {\n            *[Symbol.iterator]() {\n                while (true) {\n                    if (wordRangesIdx < wordRanges.length) {\n                        const value = lineText.substring(wordRanges[wordRangesIdx].start, wordRanges[wordRangesIdx].end);\n                        wordRangesIdx += 1;\n                        yield value;\n                    }\n                    else {\n                        if (lineNumber < lines.length) {\n                            lineText = lines[lineNumber];\n                            wordRanges = wordenize(lineText, wordDefinition);\n                            wordRangesIdx = 0;\n                            lineNumber += 1;\n                        }\n                        else {\n                            break;\n                        }\n                    }\n                }\n            }\n        };\n    }\n    getLineWords(lineNumber, wordDefinition) {\n        const content = this._lines[lineNumber - 1];\n        const ranges = this._wordenize(content, wordDefinition);\n        const words = [];\n        for (const range of ranges) {\n            words.push({\n                word: content.substring(range.start, range.end),\n                startColumn: range.start + 1,\n                endColumn: range.end + 1\n            });\n        }\n        return words;\n    }\n    _wordenize(content, wordDefinition) {\n        const result = [];\n        let match;\n        wordDefinition.lastIndex = 0; // reset lastIndex just to be sure\n        while (match = wordDefinition.exec(content)) {\n            if (match[0].length === 0) {\n                // it did match the empty string\n                break;\n            }\n            result.push({ start: match.index, end: match.index + match[0].length });\n        }\n        return result;\n    }\n    getValueInRange(range) {\n        range = this._validateRange(range);\n        if (range.startLineNumber === range.endLineNumber) {\n            return this._lines[range.startLineNumber - 1].substring(range.startColumn - 1, range.endColumn - 1);\n        }\n        const lineEnding = this._eol;\n        const startLineIndex = range.startLineNumber - 1;\n        const endLineIndex = range.endLineNumber - 1;\n        const resultLines = [];\n        resultLines.push(this._lines[startLineIndex].substring(range.startColumn - 1));\n        for (let i = startLineIndex + 1; i < endLineIndex; i++) {\n            resultLines.push(this._lines[i]);\n        }\n        resultLines.push(this._lines[endLineIndex].substring(0, range.endColumn - 1));\n        return resultLines.join(lineEnding);\n    }\n    offsetAt(position) {\n        position = this._validatePosition(position);\n        this._ensureLineStarts();\n        return this._lineStarts.getPrefixSum(position.lineNumber - 2) + (position.column - 1);\n    }\n    positionAt(offset) {\n        offset = Math.floor(offset);\n        offset = Math.max(0, offset);\n        this._ensureLineStarts();\n        const out = this._lineStarts.getIndexOf(offset);\n        const lineLength = this._lines[out.index].length;\n        // Ensure we return a valid position\n        return {\n            lineNumber: 1 + out.index,\n            column: 1 + Math.min(out.remainder, lineLength)\n        };\n    }\n    _validateRange(range) {\n        const start = this._validatePosition({ lineNumber: range.startLineNumber, column: range.startColumn });\n        const end = this._validatePosition({ lineNumber: range.endLineNumber, column: range.endColumn });\n        if (start.lineNumber !== range.startLineNumber\n            || start.column !== range.startColumn\n            || end.lineNumber !== range.endLineNumber\n            || end.column !== range.endColumn) {\n            return {\n                startLineNumber: start.lineNumber,\n                startColumn: start.column,\n                endLineNumber: end.lineNumber,\n                endColumn: end.column\n            };\n        }\n        return range;\n    }\n    _validatePosition(position) {\n        if (!Position.isIPosition(position)) {\n            throw new Error('bad position');\n        }\n        let { lineNumber, column } = position;\n        let hasChanged = false;\n        if (lineNumber < 1) {\n            lineNumber = 1;\n            column = 1;\n            hasChanged = true;\n        }\n        else if (lineNumber > this._lines.length) {\n            lineNumber = this._lines.length;\n            column = this._lines[lineNumber - 1].length + 1;\n            hasChanged = true;\n        }\n        else {\n            const maxCharacter = this._lines[lineNumber - 1].length + 1;\n            if (column < 1) {\n                column = 1;\n                hasChanged = true;\n            }\n            else if (column > maxCharacter) {\n                column = maxCharacter;\n                hasChanged = true;\n            }\n        }\n        if (!hasChanged) {\n            return position;\n        }\n        else {\n            return { lineNumber, column };\n        }\n    }\n}\n\nexport { MirrorModel, STOP_SYNC_MODEL_DELTA_TIME_MS, WorkerTextModelSyncClient, WorkerTextModelSyncServer };\n","import { stringDiff } from '../../../base/common/diff/diff.js';\nimport { Range } from '../core/range.js';\nimport { computeLinks } from '../languages/linkComputer.js';\nimport { BasicInplaceReplace } from '../languages/supports/inplaceReplaceSupport.js';\nimport { createMonacoBaseAPI } from './editorBaseApi.js';\nimport { StopWatch } from '../../../base/common/stopwatch.js';\nimport { UnicodeTextModelHighlighter } from './unicodeTextModelHighlighter.js';\nimport { linesDiffComputers } from '../diff/linesDiffComputers.js';\nimport { computeDefaultDocumentColors } from '../languages/defaultDocumentColorsComputer.js';\nimport { findSectionHeaders } from './findSectionHeaders.js';\nimport { WorkerTextModelSyncServer } from './textModelSync/textModelSync.impl.js';\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/**\n * @internal\n */\nclass EditorWorker {\n    constructor(_foreignModule = null) {\n        this._foreignModule = _foreignModule;\n        this._requestHandlerBrand = undefined;\n        this._workerTextModelSyncServer = new WorkerTextModelSyncServer();\n    }\n    dispose() {\n    }\n    async $ping() {\n        return 'pong';\n    }\n    _getModel(uri) {\n        return this._workerTextModelSyncServer.getModel(uri);\n    }\n    getModels() {\n        return this._workerTextModelSyncServer.getModels();\n    }\n    $acceptNewModel(data) {\n        this._workerTextModelSyncServer.$acceptNewModel(data);\n    }\n    $acceptModelChanged(uri, e) {\n        this._workerTextModelSyncServer.$acceptModelChanged(uri, e);\n    }\n    $acceptRemovedModel(uri) {\n        this._workerTextModelSyncServer.$acceptRemovedModel(uri);\n    }\n    async $computeUnicodeHighlights(url, options, range) {\n        const model = this._getModel(url);\n        if (!model) {\n            return { ranges: [], hasMore: false, ambiguousCharacterCount: 0, invisibleCharacterCount: 0, nonBasicAsciiCharacterCount: 0 };\n        }\n        return UnicodeTextModelHighlighter.computeUnicodeHighlights(model, options, range);\n    }\n    async $findSectionHeaders(url, options) {\n        const model = this._getModel(url);\n        if (!model) {\n            return [];\n        }\n        return findSectionHeaders(model, options);\n    }\n    // ---- BEGIN diff --------------------------------------------------------------------------\n    async $computeDiff(originalUrl, modifiedUrl, options, algorithm) {\n        const original = this._getModel(originalUrl);\n        const modified = this._getModel(modifiedUrl);\n        if (!original || !modified) {\n            return null;\n        }\n        const result = EditorWorker.computeDiff(original, modified, options, algorithm);\n        return result;\n    }\n    static computeDiff(originalTextModel, modifiedTextModel, options, algorithm) {\n        const diffAlgorithm = algorithm === 'advanced' ? linesDiffComputers.getDefault() : linesDiffComputers.getLegacy();\n        const originalLines = originalTextModel.getLinesContent();\n        const modifiedLines = modifiedTextModel.getLinesContent();\n        const result = diffAlgorithm.computeDiff(originalLines, modifiedLines, options);\n        const identical = (result.changes.length > 0 ? false : this._modelsAreIdentical(originalTextModel, modifiedTextModel));\n        function getLineChanges(changes) {\n            return changes.map(m => ([m.original.startLineNumber, m.original.endLineNumberExclusive, m.modified.startLineNumber, m.modified.endLineNumberExclusive, m.innerChanges?.map(m => [\n                    m.originalRange.startLineNumber,\n                    m.originalRange.startColumn,\n                    m.originalRange.endLineNumber,\n                    m.originalRange.endColumn,\n                    m.modifiedRange.startLineNumber,\n                    m.modifiedRange.startColumn,\n                    m.modifiedRange.endLineNumber,\n                    m.modifiedRange.endColumn,\n                ])]));\n        }\n        return {\n            identical,\n            quitEarly: result.hitTimeout,\n            changes: getLineChanges(result.changes),\n            moves: result.moves.map(m => ([\n                m.lineRangeMapping.original.startLineNumber,\n                m.lineRangeMapping.original.endLineNumberExclusive,\n                m.lineRangeMapping.modified.startLineNumber,\n                m.lineRangeMapping.modified.endLineNumberExclusive,\n                getLineChanges(m.changes)\n            ])),\n        };\n    }\n    static _modelsAreIdentical(original, modified) {\n        const originalLineCount = original.getLineCount();\n        const modifiedLineCount = modified.getLineCount();\n        if (originalLineCount !== modifiedLineCount) {\n            return false;\n        }\n        for (let line = 1; line <= originalLineCount; line++) {\n            const originalLine = original.getLineContent(line);\n            const modifiedLine = modified.getLineContent(line);\n            if (originalLine !== modifiedLine) {\n                return false;\n            }\n        }\n        return true;\n    }\n    // ---- END diff --------------------------------------------------------------------------\n    // ---- BEGIN minimal edits ---------------------------------------------------------------\n    static { this._diffLimit = 100000; }\n    async $computeMoreMinimalEdits(modelUrl, edits, pretty) {\n        const model = this._getModel(modelUrl);\n        if (!model) {\n            return edits;\n        }\n        const result = [];\n        let lastEol = undefined;\n        edits = edits.slice(0).sort((a, b) => {\n            if (a.range && b.range) {\n                return Range.compareRangesUsingStarts(a.range, b.range);\n            }\n            // eol only changes should go to the end\n            const aRng = a.range ? 0 : 1;\n            const bRng = b.range ? 0 : 1;\n            return aRng - bRng;\n        });\n        // merge adjacent edits\n        let writeIndex = 0;\n        for (let readIndex = 1; readIndex < edits.length; readIndex++) {\n            if (Range.getEndPosition(edits[writeIndex].range).equals(Range.getStartPosition(edits[readIndex].range))) {\n                edits[writeIndex].range = Range.fromPositions(Range.getStartPosition(edits[writeIndex].range), Range.getEndPosition(edits[readIndex].range));\n                edits[writeIndex].text += edits[readIndex].text;\n            }\n            else {\n                writeIndex++;\n                edits[writeIndex] = edits[readIndex];\n            }\n        }\n        edits.length = writeIndex + 1;\n        for (let { range, text, eol } of edits) {\n            if (typeof eol === 'number') {\n                lastEol = eol;\n            }\n            if (Range.isEmpty(range) && !text) {\n                // empty change\n                continue;\n            }\n            const original = model.getValueInRange(range);\n            text = text.replace(/\\r\\n|\\n|\\r/g, model.eol);\n            if (original === text) {\n                // noop\n                continue;\n            }\n            // make sure diff won't take too long\n            if (Math.max(text.length, original.length) > EditorWorker._diffLimit) {\n                result.push({ range, text });\n                continue;\n            }\n            // compute diff between original and edit.text\n            const changes = stringDiff(original, text, pretty);\n            const editOffset = model.offsetAt(Range.lift(range).getStartPosition());\n            for (const change of changes) {\n                const start = model.positionAt(editOffset + change.originalStart);\n                const end = model.positionAt(editOffset + change.originalStart + change.originalLength);\n                const newEdit = {\n                    text: text.substr(change.modifiedStart, change.modifiedLength),\n                    range: { startLineNumber: start.lineNumber, startColumn: start.column, endLineNumber: end.lineNumber, endColumn: end.column }\n                };\n                if (model.getValueInRange(newEdit.range) !== newEdit.text) {\n                    result.push(newEdit);\n                }\n            }\n        }\n        if (typeof lastEol === 'number') {\n            result.push({ eol: lastEol, text: '', range: { startLineNumber: 0, startColumn: 0, endLineNumber: 0, endColumn: 0 } });\n        }\n        return result;\n    }\n    // ---- END minimal edits ---------------------------------------------------------------\n    async $computeLinks(modelUrl) {\n        const model = this._getModel(modelUrl);\n        if (!model) {\n            return null;\n        }\n        return computeLinks(model);\n    }\n    // --- BEGIN default document colors -----------------------------------------------------------\n    async $computeDefaultDocumentColors(modelUrl) {\n        const model = this._getModel(modelUrl);\n        if (!model) {\n            return null;\n        }\n        return computeDefaultDocumentColors(model);\n    }\n    // ---- BEGIN suggest --------------------------------------------------------------------------\n    static { this._suggestionsLimit = 10000; }\n    async $textualSuggest(modelUrls, leadingWord, wordDef, wordDefFlags) {\n        const sw = new StopWatch();\n        const wordDefRegExp = new RegExp(wordDef, wordDefFlags);\n        const seen = new Set();\n        outer: for (const url of modelUrls) {\n            const model = this._getModel(url);\n            if (!model) {\n                continue;\n            }\n            for (const word of model.words(wordDefRegExp)) {\n                if (word === leadingWord || !isNaN(Number(word))) {\n                    continue;\n                }\n                seen.add(word);\n                if (seen.size > EditorWorker._suggestionsLimit) {\n                    break outer;\n                }\n            }\n        }\n        return { words: Array.from(seen), duration: sw.elapsed() };\n    }\n    // ---- END suggest --------------------------------------------------------------------------\n    //#region -- word ranges --\n    async $computeWordRanges(modelUrl, range, wordDef, wordDefFlags) {\n        const model = this._getModel(modelUrl);\n        if (!model) {\n            return Object.create(null);\n        }\n        const wordDefRegExp = new RegExp(wordDef, wordDefFlags);\n        const result = Object.create(null);\n        for (let line = range.startLineNumber; line < range.endLineNumber; line++) {\n            const words = model.getLineWords(line, wordDefRegExp);\n            for (const word of words) {\n                if (!isNaN(Number(word.word))) {\n                    continue;\n                }\n                let array = result[word.word];\n                if (!array) {\n                    array = [];\n                    result[word.word] = array;\n                }\n                array.push({\n                    startLineNumber: line,\n                    startColumn: word.startColumn,\n                    endLineNumber: line,\n                    endColumn: word.endColumn\n                });\n            }\n        }\n        return result;\n    }\n    //#endregion\n    async $navigateValueSet(modelUrl, range, up, wordDef, wordDefFlags) {\n        const model = this._getModel(modelUrl);\n        if (!model) {\n            return null;\n        }\n        const wordDefRegExp = new RegExp(wordDef, wordDefFlags);\n        if (range.startColumn === range.endColumn) {\n            range = {\n                startLineNumber: range.startLineNumber,\n                startColumn: range.startColumn,\n                endLineNumber: range.endLineNumber,\n                endColumn: range.endColumn + 1\n            };\n        }\n        const selectionText = model.getValueInRange(range);\n        const wordRange = model.getWordAtPosition({ lineNumber: range.startLineNumber, column: range.startColumn }, wordDefRegExp);\n        if (!wordRange) {\n            return null;\n        }\n        const word = model.getValueInRange(wordRange);\n        const result = BasicInplaceReplace.INSTANCE.navigateValueSet(range, selectionText, wordRange, word, up);\n        return result;\n    }\n    // ---- BEGIN foreign module support --------------------------------------------------------------------------\n    // foreign method request\n    $fmr(method, args) {\n        if (!this._foreignModule || typeof this._foreignModule[method] !== 'function') {\n            return Promise.reject(new Error('Missing requestHandler or method: ' + method));\n        }\n        try {\n            return Promise.resolve(this._foreignModule[method].apply(this._foreignModule, args));\n        }\n        catch (e) {\n            return Promise.reject(e);\n        }\n    }\n}\nif (typeof importScripts === 'function') {\n    // Running in a web worker\n    globalThis.monaco = createMonacoBaseAPI();\n}\n\nexport { EditorWorker };\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 *--------------------------------------------------------------------------------------------*/\nclass EditorWorkerHost {\n    static { this.CHANNEL_NAME = 'editorWorkerHost'; }\n    static getChannel(workerServer) {\n        return workerServer.getChannel(EditorWorkerHost.CHANNEL_NAME);\n    }\n    static setChannel(workerClient, obj) {\n        workerClient.setChannel(EditorWorkerHost.CHANNEL_NAME, obj);\n    }\n}\n\nexport { EditorWorkerHost };\n","import { timeout } from '../../../base/common/async.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { logOnceWebWorkerWarning } from '../../../base/common/worker/webWorker.js';\nimport { createWebWorker } from '../../../base/browser/webWorkerFactory.js';\nimport { Range } from '../../common/core/range.js';\nimport { ILanguageConfigurationService } from '../../common/languages/languageConfigurationRegistry.js';\nimport { EditorWorker } from '../../common/services/editorWebWorker.js';\nimport { IModelService } from '../../common/services/model.js';\nimport { ITextResourceConfigurationService } from '../../common/services/textResourceConfiguration.js';\nimport { isNonEmptyArray } from '../../../base/common/arrays.js';\nimport { ILogService } from '../../../platform/log/common/log.js';\nimport { StopWatch } from '../../../base/common/stopwatch.js';\nimport { canceled } from '../../../base/common/errors.js';\nimport { ILanguageFeaturesService } from '../../common/services/languageFeatures.js';\nimport { MovedText } from '../../common/diff/linesDiffComputer.js';\nimport { LineRangeMapping, DetailedLineRangeMapping, RangeMapping } from '../../common/diff/rangeMapping.js';\nimport { LineRange } from '../../common/core/ranges/lineRange.js';\nimport { mainWindow } from '../../../base/browser/window.js';\nimport { WindowIntervalTimer } from '../../../base/browser/dom.js';\nimport { WorkerTextModelSyncClient } from '../../common/services/textModelSync/textModelSync.impl.js';\nimport { EditorWorkerHost } from '../../common/services/editorWorkerHost.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\n/**\n * Stop the worker if it was not needed for 5 min.\n */\nconst STOP_WORKER_DELTA_TIME_MS = 5 * 60 * 1000;\nfunction canSyncModel(modelService, resource) {\n    const model = modelService.getModel(resource);\n    if (!model) {\n        return false;\n    }\n    if (model.isTooLargeForSyncing()) {\n        return false;\n    }\n    return true;\n}\nlet EditorWorkerService = class EditorWorkerService extends Disposable {\n    constructor(workerDescriptor, modelService, configurationService, logService, _languageConfigurationService, languageFeaturesService) {\n        super();\n        this._languageConfigurationService = _languageConfigurationService;\n        this._modelService = modelService;\n        this._workerManager = this._register(new WorkerManager(workerDescriptor, this._modelService));\n        this._logService = logService;\n        // register default link-provider and default completions-provider\n        this._register(languageFeaturesService.linkProvider.register({ language: '*', hasAccessToAllModels: true }, {\n            provideLinks: async (model, token) => {\n                if (!canSyncModel(this._modelService, model.uri)) {\n                    return Promise.resolve({ links: [] }); // File too large\n                }\n                const worker = await this._workerWithResources([model.uri]);\n                const links = await worker.$computeLinks(model.uri.toString());\n                return links && { links };\n            }\n        }));\n        this._register(languageFeaturesService.completionProvider.register('*', new WordBasedCompletionItemProvider(this._workerManager, configurationService, this._modelService, this._languageConfigurationService, this._logService)));\n    }\n    dispose() {\n        super.dispose();\n    }\n    canComputeUnicodeHighlights(uri) {\n        return canSyncModel(this._modelService, uri);\n    }\n    async computedUnicodeHighlights(uri, options, range) {\n        const worker = await this._workerWithResources([uri]);\n        return worker.$computeUnicodeHighlights(uri.toString(), options, range);\n    }\n    async computeDiff(original, modified, options, algorithm) {\n        const worker = await this._workerWithResources([original, modified], /* forceLargeModels */ true);\n        const result = await worker.$computeDiff(original.toString(), modified.toString(), options, algorithm);\n        if (!result) {\n            return null;\n        }\n        // Convert from space efficient JSON data to rich objects.\n        const diff = {\n            identical: result.identical,\n            quitEarly: result.quitEarly,\n            changes: toLineRangeMappings(result.changes),\n            moves: result.moves.map(m => new MovedText(new LineRangeMapping(new LineRange(m[0], m[1]), new LineRange(m[2], m[3])), toLineRangeMappings(m[4])))\n        };\n        return diff;\n        function toLineRangeMappings(changes) {\n            return changes.map((c) => new DetailedLineRangeMapping(new LineRange(c[0], c[1]), new LineRange(c[2], c[3]), c[4]?.map((c) => new RangeMapping(new Range(c[0], c[1], c[2], c[3]), new Range(c[4], c[5], c[6], c[7])))));\n        }\n    }\n    async computeMoreMinimalEdits(resource, edits, pretty = false) {\n        if (isNonEmptyArray(edits)) {\n            if (!canSyncModel(this._modelService, resource)) {\n                return Promise.resolve(edits); // File too large\n            }\n            const sw = StopWatch.create();\n            const result = this._workerWithResources([resource]).then(worker => worker.$computeMoreMinimalEdits(resource.toString(), edits, pretty));\n            result.finally(() => this._logService.trace('FORMAT#computeMoreMinimalEdits', resource.toString(true), sw.elapsed()));\n            return Promise.race([result, timeout(1000).then(() => edits)]);\n        }\n        else {\n            return Promise.resolve(undefined);\n        }\n    }\n    canNavigateValueSet(resource) {\n        return (canSyncModel(this._modelService, resource));\n    }\n    async navigateValueSet(resource, range, up) {\n        const model = this._modelService.getModel(resource);\n        if (!model) {\n            return null;\n        }\n        const wordDefRegExp = this._languageConfigurationService.getLanguageConfiguration(model.getLanguageId()).getWordDefinition();\n        const wordDef = wordDefRegExp.source;\n        const wordDefFlags = wordDefRegExp.flags;\n        const worker = await this._workerWithResources([resource]);\n        return worker.$navigateValueSet(resource.toString(), range, up, wordDef, wordDefFlags);\n    }\n    canComputeWordRanges(resource) {\n        return canSyncModel(this._modelService, resource);\n    }\n    async computeWordRanges(resource, range) {\n        const model = this._modelService.getModel(resource);\n        if (!model) {\n            return Promise.resolve(null);\n        }\n        const wordDefRegExp = this._languageConfigurationService.getLanguageConfiguration(model.getLanguageId()).getWordDefinition();\n        const wordDef = wordDefRegExp.source;\n        const wordDefFlags = wordDefRegExp.flags;\n        const worker = await this._workerWithResources([resource]);\n        return worker.$computeWordRanges(resource.toString(), range, wordDef, wordDefFlags);\n    }\n    async findSectionHeaders(uri, options) {\n        const worker = await this._workerWithResources([uri]);\n        return worker.$findSectionHeaders(uri.toString(), options);\n    }\n    async computeDefaultDocumentColors(uri) {\n        const worker = await this._workerWithResources([uri]);\n        return worker.$computeDefaultDocumentColors(uri.toString());\n    }\n    async _workerWithResources(resources, forceLargeModels = false) {\n        const worker = await this._workerManager.withWorker();\n        return await worker.workerWithSyncedResources(resources, forceLargeModels);\n    }\n};\nEditorWorkerService = __decorate([\n    __param(1, IModelService),\n    __param(2, ITextResourceConfigurationService),\n    __param(3, ILogService),\n    __param(4, ILanguageConfigurationService),\n    __param(5, ILanguageFeaturesService)\n], EditorWorkerService);\nclass WordBasedCompletionItemProvider {\n    constructor(workerManager, configurationService, modelService, languageConfigurationService, logService) {\n        this.languageConfigurationService = languageConfigurationService;\n        this.logService = logService;\n        this._debugDisplayName = 'wordbasedCompletions';\n        this._workerManager = workerManager;\n        this._configurationService = configurationService;\n        this._modelService = modelService;\n    }\n    async provideCompletionItems(model, position) {\n        const config = this._configurationService.getValue(model.uri, position, 'editor');\n        if (config.wordBasedSuggestions === 'off') {\n            return undefined;\n        }\n        const models = [];\n        if (config.wordBasedSuggestions === 'currentDocument') {\n            // only current file and only if not too large\n            if (canSyncModel(this._modelService, model.uri)) {\n                models.push(model.uri);\n            }\n        }\n        else {\n            // either all files or files of same language\n            for (const candidate of this._modelService.getModels()) {\n                if (!canSyncModel(this._modelService, candidate.uri)) {\n                    continue;\n                }\n                if (candidate === model) {\n                    models.unshift(candidate.uri);\n                }\n                else if (config.wordBasedSuggestions === 'allDocuments' || candidate.getLanguageId() === model.getLanguageId()) {\n                    models.push(candidate.uri);\n                }\n            }\n        }\n        if (models.length === 0) {\n            return undefined; // File too large, no other files\n        }\n        const wordDefRegExp = this.languageConfigurationService.getLanguageConfiguration(model.getLanguageId()).getWordDefinition();\n        const word = model.getWordAtPosition(position);\n        const replace = !word ? Range.fromPositions(position) : new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn);\n        const insert = replace.setEndPosition(position.lineNumber, position.column);\n        // Trace logging about the word and replace/insert ranges\n        this.logService.trace('[WordBasedCompletionItemProvider]', `word: \"${word?.word || ''}\", wordDef: \"${wordDefRegExp}\", replace: [${replace.toString()}], insert: [${insert.toString()}]`);\n        const client = await this._workerManager.withWorker();\n        const data = await client.textualSuggest(models, word?.word, wordDefRegExp);\n        if (!data) {\n            return undefined;\n        }\n        return {\n            duration: data.duration,\n            suggestions: data.words.map((word) => {\n                return {\n                    kind: 18 /* languages.CompletionItemKind.Text */,\n                    label: word,\n                    insertText: word,\n                    range: { insert, replace }\n                };\n            }),\n        };\n    }\n}\nlet WorkerManager = class WorkerManager extends Disposable {\n    constructor(_workerDescriptor, modelService) {\n        super();\n        this._workerDescriptor = _workerDescriptor;\n        this._modelService = modelService;\n        this._editorWorkerClient = null;\n        this._lastWorkerUsedTime = (new Date()).getTime();\n        const stopWorkerInterval = this._register(new WindowIntervalTimer());\n        stopWorkerInterval.cancelAndSet(() => this._checkStopIdleWorker(), Math.round(STOP_WORKER_DELTA_TIME_MS / 2), mainWindow);\n        this._register(this._modelService.onModelRemoved(_ => this._checkStopEmptyWorker()));\n    }\n    dispose() {\n        if (this._editorWorkerClient) {\n            this._editorWorkerClient.dispose();\n            this._editorWorkerClient = null;\n        }\n        super.dispose();\n    }\n    /**\n     * Check if the model service has no more models and stop the worker if that is the case.\n     */\n    _checkStopEmptyWorker() {\n        if (!this._editorWorkerClient) {\n            return;\n        }\n        const models = this._modelService.getModels();\n        if (models.length === 0) {\n            // There are no more models => nothing possible for me to do\n            this._editorWorkerClient.dispose();\n            this._editorWorkerClient = null;\n        }\n    }\n    /**\n     * Check if the worker has been idle for a while and then stop it.\n     */\n    _checkStopIdleWorker() {\n        if (!this._editorWorkerClient) {\n            return;\n        }\n        const timeSinceLastWorkerUsedTime = (new Date()).getTime() - this._lastWorkerUsedTime;\n        if (timeSinceLastWorkerUsedTime > STOP_WORKER_DELTA_TIME_MS) {\n            this._editorWorkerClient.dispose();\n            this._editorWorkerClient = null;\n        }\n    }\n    withWorker() {\n        this._lastWorkerUsedTime = (new Date()).getTime();\n        if (!this._editorWorkerClient) {\n            this._editorWorkerClient = new EditorWorkerClient(this._workerDescriptor, false, this._modelService);\n        }\n        return Promise.resolve(this._editorWorkerClient);\n    }\n};\nWorkerManager = __decorate([\n    __param(1, IModelService)\n], WorkerManager);\nclass SynchronousWorkerClient {\n    constructor(instance) {\n        this._instance = instance;\n        this.proxy = this._instance;\n    }\n    dispose() {\n        this._instance.dispose();\n    }\n    setChannel(channel, handler) {\n        throw new Error(`Not supported`);\n    }\n}\nlet EditorWorkerClient = class EditorWorkerClient extends Disposable {\n    constructor(_workerDescriptorOrWorker, keepIdleModels, modelService) {\n        super();\n        this._workerDescriptorOrWorker = _workerDescriptorOrWorker;\n        this._disposed = false;\n        this._modelService = modelService;\n        this._keepIdleModels = keepIdleModels;\n        this._worker = null;\n        this._modelManager = null;\n    }\n    // foreign host request\n    fhr(method, args) {\n        throw new Error(`Not implemented!`);\n    }\n    _getOrCreateWorker() {\n        if (!this._worker) {\n            try {\n                this._worker = this._register(createWebWorker(this._workerDescriptorOrWorker));\n                EditorWorkerHost.setChannel(this._worker, this._createEditorWorkerHost());\n            }\n            catch (err) {\n                logOnceWebWorkerWarning(err);\n                this._worker = this._createFallbackLocalWorker();\n            }\n        }\n        return this._worker;\n    }\n    async _getProxy() {\n        try {\n            const proxy = this._getOrCreateWorker().proxy;\n            await proxy.$ping();\n            return proxy;\n        }\n        catch (err) {\n            logOnceWebWorkerWarning(err);\n            this._worker = this._createFallbackLocalWorker();\n            return this._worker.proxy;\n        }\n    }\n    _createFallbackLocalWorker() {\n        return new SynchronousWorkerClient(new EditorWorker(null));\n    }\n    _createEditorWorkerHost() {\n        return {\n            $fhr: (method, args) => this.fhr(method, args)\n        };\n    }\n    _getOrCreateModelManager(proxy) {\n        if (!this._modelManager) {\n            this._modelManager = this._register(new WorkerTextModelSyncClient(proxy, this._modelService, this._keepIdleModels));\n        }\n        return this._modelManager;\n    }\n    async workerWithSyncedResources(resources, forceLargeModels = false) {\n        if (this._disposed) {\n            return Promise.reject(canceled());\n        }\n        const proxy = await this._getProxy();\n        this._getOrCreateModelManager(proxy).ensureSyncedResources(resources, forceLargeModels);\n        return proxy;\n    }\n    async textualSuggest(resources, leadingWord, wordDefRegExp) {\n        const proxy = await this.workerWithSyncedResources(resources);\n        const wordDef = wordDefRegExp.source;\n        const wordDefFlags = wordDefRegExp.flags;\n        return proxy.$textualSuggest(resources.map(r => r.toString()), leadingWord, wordDef, wordDefFlags);\n    }\n    dispose() {\n        super.dispose();\n        this._disposed = true;\n    }\n};\nEditorWorkerClient = __decorate([\n    __param(2, IModelService)\n], EditorWorkerClient);\n\nexport { EditorWorkerClient, EditorWorkerService };\n","import { EditorWorkerClient } from '../../browser/services/editorWorkerService.js';\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/**\n * Create a new web worker that has model syncing capabilities built in.\n * Specify an AMD module to load that will `create` an object that will be proxied.\n */\nfunction createWebWorker(modelService, opts) {\n    return new MonacoWebWorkerImpl(modelService, opts);\n}\nclass MonacoWebWorkerImpl extends EditorWorkerClient {\n    constructor(modelService, opts) {\n        super(opts.worker, opts.keepIdleModels || false, modelService);\n        this._foreignModuleHost = opts.host || null;\n        this._foreignProxy = this._getProxy().then(proxy => {\n            return new Proxy({}, {\n                get(target, prop, receiver) {\n                    if (prop === 'then') {\n                        // Don't forward the call when the proxy is returned in an async function and the runtime tries to .then it.\n                        return undefined;\n                    }\n                    if (typeof prop !== 'string') {\n                        throw new Error(`Not supported`);\n                    }\n                    return (...args) => {\n                        return proxy.$fmr(prop, args);\n                    };\n                }\n            });\n        });\n    }\n    // foreign host request\n    fhr(method, args) {\n        if (!this._foreignModuleHost || typeof this._foreignModuleHost[method] !== 'function') {\n            return Promise.reject(new Error('Missing method ' + method + ' or missing main thread foreign host.'));\n        }\n        try {\n            return Promise.resolve(this._foreignModuleHost[method].apply(this._foreignModuleHost, args));\n        }\n        catch (e) {\n            return Promise.reject(e);\n        }\n    }\n    getProxy() {\n        return this._foreignProxy;\n    }\n    withSyncedResources(resources) {\n        return this.workerWithSyncedResources(resources).then(_ => this.getProxy());\n    }\n}\n\nexport { createWebWorker };\n","import { escapeRegExpCharacters } from '../../../../base/common/strings.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction isFuzzyActionArr(what) {\n    return (Array.isArray(what));\n}\nfunction isFuzzyAction(what) {\n    return !isFuzzyActionArr(what);\n}\nfunction isString(what) {\n    return (typeof what === 'string');\n}\nfunction isIAction(what) {\n    return !isString(what);\n}\n// Small helper functions\n/**\n * Is a string null, undefined, or empty?\n */\nfunction empty(s) {\n    return (s ? false : true);\n}\n/**\n * Puts a string to lower case if 'ignoreCase' is set.\n */\nfunction fixCase(lexer, str) {\n    return (lexer.ignoreCase && str ? str.toLowerCase() : str);\n}\n/**\n * Ensures there are no bad characters in a CSS token class.\n */\nfunction sanitize(s) {\n    return s.replace(/[&<>'\"_]/g, '-'); // used on all output token CSS classes\n}\n// Logging\n/**\n * Logs a message.\n */\nfunction log(lexer, msg) {\n    console.log(`${lexer.languageId}: ${msg}`);\n}\n// Throwing errors\nfunction createError(lexer, msg) {\n    return new Error(`${lexer.languageId}: ${msg}`);\n}\n// Helper functions for rule finding and substitution\n/**\n * substituteMatches is used on lexer strings and can substitutes predefined patterns:\n * \t\t$$  => $\n * \t\t$#  => id\n * \t\t$n  => matched entry n\n * \t\t@attr => contents of lexer[attr]\n *\n * See documentation for more info\n */\nfunction substituteMatches(lexer, str, id, matches, state) {\n    const re = /\\$((\\$)|(#)|(\\d\\d?)|[sS](\\d\\d?)|@(\\w+))/g;\n    let stateMatches = null;\n    return str.replace(re, function (full, sub, dollar, hash, n, s, attr, ofs, total) {\n        if (!empty(dollar)) {\n            return '$'; // $$\n        }\n        if (!empty(hash)) {\n            return fixCase(lexer, id); // default $#\n        }\n        if (!empty(n) && n < matches.length) {\n            return fixCase(lexer, matches[n]); // $n\n        }\n        if (!empty(attr) && lexer && typeof (lexer[attr]) === 'string') {\n            return lexer[attr]; //@attribute\n        }\n        if (stateMatches === null) { // split state on demand\n            stateMatches = state.split('.');\n            stateMatches.unshift(state);\n        }\n        if (!empty(s) && s < stateMatches.length) {\n            return fixCase(lexer, stateMatches[s]); //$Sn\n        }\n        return '';\n    });\n}\n/**\n * substituteMatchesRe is used on lexer regex rules and can substitutes predefined patterns:\n * \t\t$Sn => n'th part of state\n *\n */\nfunction substituteMatchesRe(lexer, str, state) {\n    const re = /\\$[sS](\\d\\d?)/g;\n    let stateMatches = null;\n    return str.replace(re, function (full, s) {\n        if (stateMatches === null) { // split state on demand\n            stateMatches = state.split('.');\n            stateMatches.unshift(state);\n        }\n        if (!empty(s) && s < stateMatches.length) {\n            return escapeRegExpCharacters(fixCase(lexer, stateMatches[s])); //$Sn\n        }\n        return '';\n    });\n}\n/**\n * Find the tokenizer rules for a specific state (i.e. next action)\n */\nfunction findRules(lexer, inState) {\n    let state = inState;\n    while (state && state.length > 0) {\n        const rules = lexer.tokenizer[state];\n        if (rules) {\n            return rules;\n        }\n        const idx = state.lastIndexOf('.');\n        if (idx < 0) {\n            state = null; // no further parent\n        }\n        else {\n            state = state.substr(0, idx);\n        }\n    }\n    return null;\n}\n/**\n * Is a certain state defined? In contrast to 'findRules' this works on a ILexerMin.\n * This is used during compilation where we may know the defined states\n * but not yet whether the corresponding rules are correct.\n */\nfunction stateExists(lexer, inState) {\n    let state = inState;\n    while (state && state.length > 0) {\n        const exist = lexer.stateNames[state];\n        if (exist) {\n            return true;\n        }\n        const idx = state.lastIndexOf('.');\n        if (idx < 0) {\n            state = null; // no further parent\n        }\n        else {\n            state = state.substr(0, idx);\n        }\n    }\n    return false;\n}\n\nexport { createError, empty, findRules, fixCase, isFuzzyAction, isFuzzyActionArr, isIAction, isString, log, sanitize, stateExists, substituteMatches, substituteMatchesRe };\n","import { Disposable } from '../../../../base/common/lifecycle.js';\nimport { TokenizationRegistry, Token, TokenizationResult, EncodedTokenizationResult } from '../../../common/languages.js';\nimport { nullTokenize, nullTokenizeEncoded, NullState } from '../../../common/languages/nullTokenize.js';\nimport { findRules, createError, isIAction, isFuzzyAction, substituteMatches, log, isString, sanitize, fixCase } from './monarchCommon.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar MonarchTokenizer_1;\nconst CACHE_STACK_DEPTH = 5;\n/**\n * Reuse the same stack elements up to a certain depth.\n */\nclass MonarchStackElementFactory {\n    static { this._INSTANCE = new MonarchStackElementFactory(CACHE_STACK_DEPTH); }\n    static create(parent, state) {\n        return this._INSTANCE.create(parent, state);\n    }\n    constructor(maxCacheDepth) {\n        this._maxCacheDepth = maxCacheDepth;\n        this._entries = Object.create(null);\n    }\n    create(parent, state) {\n        if (parent !== null && parent.depth >= this._maxCacheDepth) {\n            // no caching above a certain depth\n            return new MonarchStackElement(parent, state);\n        }\n        let stackElementId = MonarchStackElement.getStackElementId(parent);\n        if (stackElementId.length > 0) {\n            stackElementId += '|';\n        }\n        stackElementId += state;\n        let result = this._entries[stackElementId];\n        if (result) {\n            return result;\n        }\n        result = new MonarchStackElement(parent, state);\n        this._entries[stackElementId] = result;\n        return result;\n    }\n}\nclass MonarchStackElement {\n    constructor(parent, state) {\n        this.parent = parent;\n        this.state = state;\n        this.depth = (this.parent ? this.parent.depth : 0) + 1;\n    }\n    static getStackElementId(element) {\n        let result = '';\n        while (element !== null) {\n            if (result.length > 0) {\n                result += '|';\n            }\n            result += element.state;\n            element = element.parent;\n        }\n        return result;\n    }\n    static _equals(a, b) {\n        while (a !== null && b !== null) {\n            if (a === b) {\n                return true;\n            }\n            if (a.state !== b.state) {\n                return false;\n            }\n            a = a.parent;\n            b = b.parent;\n        }\n        if (a === null && b === null) {\n            return true;\n        }\n        return false;\n    }\n    equals(other) {\n        return MonarchStackElement._equals(this, other);\n    }\n    push(state) {\n        return MonarchStackElementFactory.create(this, state);\n    }\n    pop() {\n        return this.parent;\n    }\n    popall() {\n        let result = this;\n        while (result.parent) {\n            result = result.parent;\n        }\n        return result;\n    }\n    switchTo(state) {\n        return MonarchStackElementFactory.create(this.parent, state);\n    }\n}\nclass EmbeddedLanguageData {\n    constructor(languageId, state) {\n        this.languageId = languageId;\n        this.state = state;\n    }\n    equals(other) {\n        return (this.languageId === other.languageId\n            && this.state.equals(other.state));\n    }\n    clone() {\n        const stateClone = this.state.clone();\n        // save an object\n        if (stateClone === this.state) {\n            return this;\n        }\n        return new EmbeddedLanguageData(this.languageId, this.state);\n    }\n}\n/**\n * Reuse the same line states up to a certain depth.\n */\nclass MonarchLineStateFactory {\n    static { this._INSTANCE = new MonarchLineStateFactory(CACHE_STACK_DEPTH); }\n    static create(stack, embeddedLanguageData) {\n        return this._INSTANCE.create(stack, embeddedLanguageData);\n    }\n    constructor(maxCacheDepth) {\n        this._maxCacheDepth = maxCacheDepth;\n        this._entries = Object.create(null);\n    }\n    create(stack, embeddedLanguageData) {\n        if (embeddedLanguageData !== null) {\n            // no caching when embedding\n            return new MonarchLineState(stack, embeddedLanguageData);\n        }\n        if (stack !== null && stack.depth >= this._maxCacheDepth) {\n            // no caching above a certain depth\n            return new MonarchLineState(stack, embeddedLanguageData);\n        }\n        const stackElementId = MonarchStackElement.getStackElementId(stack);\n        let result = this._entries[stackElementId];\n        if (result) {\n            return result;\n        }\n        result = new MonarchLineState(stack, null);\n        this._entries[stackElementId] = result;\n        return result;\n    }\n}\nclass MonarchLineState {\n    constructor(stack, embeddedLanguageData) {\n        this.stack = stack;\n        this.embeddedLanguageData = embeddedLanguageData;\n    }\n    clone() {\n        const embeddedlanguageDataClone = this.embeddedLanguageData ? this.embeddedLanguageData.clone() : null;\n        // save an object\n        if (embeddedlanguageDataClone === this.embeddedLanguageData) {\n            return this;\n        }\n        return MonarchLineStateFactory.create(this.stack, this.embeddedLanguageData);\n    }\n    equals(other) {\n        if (!(other instanceof MonarchLineState)) {\n            return false;\n        }\n        if (!this.stack.equals(other.stack)) {\n            return false;\n        }\n        if (this.embeddedLanguageData === null && other.embeddedLanguageData === null) {\n            return true;\n        }\n        if (this.embeddedLanguageData === null || other.embeddedLanguageData === null) {\n            return false;\n        }\n        return this.embeddedLanguageData.equals(other.embeddedLanguageData);\n    }\n}\nclass MonarchClassicTokensCollector {\n    constructor() {\n        this._tokens = [];\n        this._languageId = null;\n        this._lastTokenType = null;\n        this._lastTokenLanguage = null;\n    }\n    enterLanguage(languageId) {\n        this._languageId = languageId;\n    }\n    emit(startOffset, type) {\n        if (this._lastTokenType === type && this._lastTokenLanguage === this._languageId) {\n            return;\n        }\n        this._lastTokenType = type;\n        this._lastTokenLanguage = this._languageId;\n        this._tokens.push(new Token(startOffset, type, this._languageId));\n    }\n    nestedLanguageTokenize(embeddedLanguageLine, hasEOL, embeddedLanguageData, offsetDelta) {\n        const nestedLanguageId = embeddedLanguageData.languageId;\n        const embeddedModeState = embeddedLanguageData.state;\n        const nestedLanguageTokenizationSupport = TokenizationRegistry.get(nestedLanguageId);\n        if (!nestedLanguageTokenizationSupport) {\n            this.enterLanguage(nestedLanguageId);\n            this.emit(offsetDelta, '');\n            return embeddedModeState;\n        }\n        const nestedResult = nestedLanguageTokenizationSupport.tokenize(embeddedLanguageLine, hasEOL, embeddedModeState);\n        if (offsetDelta !== 0) {\n            for (const token of nestedResult.tokens) {\n                this._tokens.push(new Token(token.offset + offsetDelta, token.type, token.language));\n            }\n        }\n        else {\n            this._tokens = this._tokens.concat(nestedResult.tokens);\n        }\n        this._lastTokenType = null;\n        this._lastTokenLanguage = null;\n        this._languageId = null;\n        return nestedResult.endState;\n    }\n    finalize(endState) {\n        return new TokenizationResult(this._tokens, endState);\n    }\n}\nclass MonarchModernTokensCollector {\n    constructor(languageService, theme) {\n        this._languageService = languageService;\n        this._theme = theme;\n        this._prependTokens = null;\n        this._tokens = [];\n        this._currentLanguageId = 0 /* LanguageId.Null */;\n        this._lastTokenMetadata = 0;\n    }\n    enterLanguage(languageId) {\n        this._currentLanguageId = this._languageService.languageIdCodec.encodeLanguageId(languageId);\n    }\n    emit(startOffset, type) {\n        const metadata = this._theme.match(this._currentLanguageId, type) | 1024 /* MetadataConsts.BALANCED_BRACKETS_MASK */;\n        if (this._lastTokenMetadata === metadata) {\n            return;\n        }\n        this._lastTokenMetadata = metadata;\n        this._tokens.push(startOffset);\n        this._tokens.push(metadata);\n    }\n    static _merge(a, b, c) {\n        const aLen = (a !== null ? a.length : 0);\n        const bLen = b.length;\n        const cLen = (c !== null ? c.length : 0);\n        if (aLen === 0 && bLen === 0 && cLen === 0) {\n            return new Uint32Array(0);\n        }\n        if (aLen === 0 && bLen === 0) {\n            return c;\n        }\n        if (bLen === 0 && cLen === 0) {\n            return a;\n        }\n        const result = new Uint32Array(aLen + bLen + cLen);\n        if (a !== null) {\n            result.set(a);\n        }\n        for (let i = 0; i < bLen; i++) {\n            result[aLen + i] = b[i];\n        }\n        if (c !== null) {\n            result.set(c, aLen + bLen);\n        }\n        return result;\n    }\n    nestedLanguageTokenize(embeddedLanguageLine, hasEOL, embeddedLanguageData, offsetDelta) {\n        const nestedLanguageId = embeddedLanguageData.languageId;\n        const embeddedModeState = embeddedLanguageData.state;\n        const nestedLanguageTokenizationSupport = TokenizationRegistry.get(nestedLanguageId);\n        if (!nestedLanguageTokenizationSupport) {\n            this.enterLanguage(nestedLanguageId);\n            this.emit(offsetDelta, '');\n            return embeddedModeState;\n        }\n        const nestedResult = nestedLanguageTokenizationSupport.tokenizeEncoded(embeddedLanguageLine, hasEOL, embeddedModeState);\n        if (offsetDelta !== 0) {\n            for (let i = 0, len = nestedResult.tokens.length; i < len; i += 2) {\n                nestedResult.tokens[i] += offsetDelta;\n            }\n        }\n        this._prependTokens = MonarchModernTokensCollector._merge(this._prependTokens, this._tokens, nestedResult.tokens);\n        this._tokens = [];\n        this._currentLanguageId = 0;\n        this._lastTokenMetadata = 0;\n        return nestedResult.endState;\n    }\n    finalize(endState) {\n        return new EncodedTokenizationResult(MonarchModernTokensCollector._merge(this._prependTokens, this._tokens, null), endState);\n    }\n}\nlet MonarchTokenizer = MonarchTokenizer_1 = class MonarchTokenizer extends Disposable {\n    constructor(languageService, standaloneThemeService, languageId, lexer, _configurationService) {\n        super();\n        this._configurationService = _configurationService;\n        this._languageService = languageService;\n        this._standaloneThemeService = standaloneThemeService;\n        this._languageId = languageId;\n        this._lexer = lexer;\n        this._embeddedLanguages = Object.create(null);\n        this.embeddedLoaded = Promise.resolve(undefined);\n        // Set up listening for embedded modes\n        let emitting = false;\n        this._register(TokenizationRegistry.onDidChange((e) => {\n            if (emitting) {\n                return;\n            }\n            let isOneOfMyEmbeddedModes = false;\n            for (let i = 0, len = e.changedLanguages.length; i < len; i++) {\n                const language = e.changedLanguages[i];\n                if (this._embeddedLanguages[language]) {\n                    isOneOfMyEmbeddedModes = true;\n                    break;\n                }\n            }\n            if (isOneOfMyEmbeddedModes) {\n                emitting = true;\n                TokenizationRegistry.handleChange([this._languageId]);\n                emitting = false;\n            }\n        }));\n        this._maxTokenizationLineLength = this._configurationService.getValue('editor.maxTokenizationLineLength', {\n            overrideIdentifier: this._languageId\n        });\n        this._register(this._configurationService.onDidChangeConfiguration(e => {\n            if (e.affectsConfiguration('editor.maxTokenizationLineLength')) {\n                this._maxTokenizationLineLength = this._configurationService.getValue('editor.maxTokenizationLineLength', {\n                    overrideIdentifier: this._languageId\n                });\n            }\n        }));\n    }\n    getLoadStatus() {\n        const promises = [];\n        for (const nestedLanguageId in this._embeddedLanguages) {\n            const tokenizationSupport = TokenizationRegistry.get(nestedLanguageId);\n            if (tokenizationSupport) {\n                // The nested language is already loaded\n                if (tokenizationSupport instanceof MonarchTokenizer_1) {\n                    const nestedModeStatus = tokenizationSupport.getLoadStatus();\n                    if (nestedModeStatus.loaded === false) {\n                        promises.push(nestedModeStatus.promise);\n                    }\n                }\n                continue;\n            }\n            if (!TokenizationRegistry.isResolved(nestedLanguageId)) {\n                // The nested language is in the process of being loaded\n                promises.push(TokenizationRegistry.getOrCreate(nestedLanguageId));\n            }\n        }\n        if (promises.length === 0) {\n            return {\n                loaded: true\n            };\n        }\n        return {\n            loaded: false,\n            promise: Promise.all(promises).then(_ => undefined)\n        };\n    }\n    getInitialState() {\n        const rootState = MonarchStackElementFactory.create(null, this._lexer.start);\n        return MonarchLineStateFactory.create(rootState, null);\n    }\n    tokenize(line, hasEOL, lineState) {\n        if (line.length >= this._maxTokenizationLineLength) {\n            return nullTokenize(this._languageId, lineState);\n        }\n        const tokensCollector = new MonarchClassicTokensCollector();\n        const endLineState = this._tokenize(line, hasEOL, lineState, tokensCollector);\n        return tokensCollector.finalize(endLineState);\n    }\n    tokenizeEncoded(line, hasEOL, lineState) {\n        if (line.length >= this._maxTokenizationLineLength) {\n            return nullTokenizeEncoded(this._languageService.languageIdCodec.encodeLanguageId(this._languageId), lineState);\n        }\n        const tokensCollector = new MonarchModernTokensCollector(this._languageService, this._standaloneThemeService.getColorTheme().tokenTheme);\n        const endLineState = this._tokenize(line, hasEOL, lineState, tokensCollector);\n        return tokensCollector.finalize(endLineState);\n    }\n    _tokenize(line, hasEOL, lineState, collector) {\n        if (lineState.embeddedLanguageData) {\n            return this._nestedTokenize(line, hasEOL, lineState, 0, collector);\n        }\n        else {\n            return this._myTokenize(line, hasEOL, lineState, 0, collector);\n        }\n    }\n    _findLeavingNestedLanguageOffset(line, state) {\n        let rules = this._lexer.tokenizer[state.stack.state];\n        if (!rules) {\n            rules = findRules(this._lexer, state.stack.state); // do parent matching\n            if (!rules) {\n                throw createError(this._lexer, 'tokenizer state is not defined: ' + state.stack.state);\n            }\n        }\n        let popOffset = -1;\n        let hasEmbeddedPopRule = false;\n        for (const rule of rules) {\n            if (!isIAction(rule.action) || !(rule.action.nextEmbedded === '@pop' || rule.action.hasEmbeddedEndInCases)) {\n                continue;\n            }\n            hasEmbeddedPopRule = true;\n            let regex = rule.resolveRegex(state.stack.state);\n            const regexSource = regex.source;\n            if (regexSource.substr(0, 4) === '^(?:' && regexSource.substr(regexSource.length - 1, 1) === ')') {\n                const flags = (regex.ignoreCase ? 'i' : '') + (regex.unicode ? 'u' : '');\n                regex = new RegExp(regexSource.substr(4, regexSource.length - 5), flags);\n            }\n            const result = line.search(regex);\n            if (result === -1 || (result !== 0 && rule.matchOnlyAtLineStart)) {\n                continue;\n            }\n            if (popOffset === -1 || result < popOffset) {\n                popOffset = result;\n            }\n        }\n        if (!hasEmbeddedPopRule) {\n            throw createError(this._lexer, 'no rule containing nextEmbedded: \"@pop\" in tokenizer embedded state: ' + state.stack.state);\n        }\n        return popOffset;\n    }\n    _nestedTokenize(line, hasEOL, lineState, offsetDelta, tokensCollector) {\n        const popOffset = this._findLeavingNestedLanguageOffset(line, lineState);\n        if (popOffset === -1) {\n            // tokenization will not leave nested language\n            const nestedEndState = tokensCollector.nestedLanguageTokenize(line, hasEOL, lineState.embeddedLanguageData, offsetDelta);\n            return MonarchLineStateFactory.create(lineState.stack, new EmbeddedLanguageData(lineState.embeddedLanguageData.languageId, nestedEndState));\n        }\n        const nestedLanguageLine = line.substring(0, popOffset);\n        if (nestedLanguageLine.length > 0) {\n            // tokenize with the nested language\n            tokensCollector.nestedLanguageTokenize(nestedLanguageLine, false, lineState.embeddedLanguageData, offsetDelta);\n        }\n        const restOfTheLine = line.substring(popOffset);\n        return this._myTokenize(restOfTheLine, hasEOL, lineState, offsetDelta + popOffset, tokensCollector);\n    }\n    _safeRuleName(rule) {\n        if (rule) {\n            return rule.name;\n        }\n        return '(unknown)';\n    }\n    _myTokenize(lineWithoutLF, hasEOL, lineState, offsetDelta, tokensCollector) {\n        tokensCollector.enterLanguage(this._languageId);\n        const lineWithoutLFLength = lineWithoutLF.length;\n        const line = (hasEOL && this._lexer.includeLF ? lineWithoutLF + '\\n' : lineWithoutLF);\n        const lineLength = line.length;\n        let embeddedLanguageData = lineState.embeddedLanguageData;\n        let stack = lineState.stack;\n        let pos = 0;\n        let groupMatching = null;\n        // See https://github.com/microsoft/monaco-editor/issues/1235\n        // Evaluate rules at least once for an empty line\n        let forceEvaluation = true;\n        while (forceEvaluation || pos < lineLength) {\n            const pos0 = pos;\n            const stackLen0 = stack.depth;\n            const groupLen0 = groupMatching ? groupMatching.groups.length : 0;\n            const state = stack.state;\n            let matches = null;\n            let matched = null;\n            let action = null;\n            let rule = null;\n            let enteringEmbeddedLanguage = null;\n            // check if we need to process group matches first\n            if (groupMatching) {\n                matches = groupMatching.matches;\n                const groupEntry = groupMatching.groups.shift();\n                matched = groupEntry.matched;\n                action = groupEntry.action;\n                rule = groupMatching.rule;\n                // cleanup if necessary\n                if (groupMatching.groups.length === 0) {\n                    groupMatching = null;\n                }\n            }\n            else {\n                // otherwise we match on the token stream\n                if (!forceEvaluation && pos >= lineLength) {\n                    // nothing to do\n                    break;\n                }\n                forceEvaluation = false;\n                // get the rules for this state\n                let rules = this._lexer.tokenizer[state];\n                if (!rules) {\n                    rules = findRules(this._lexer, state); // do parent matching\n                    if (!rules) {\n                        throw createError(this._lexer, 'tokenizer state is not defined: ' + state);\n                    }\n                }\n                // try each rule until we match\n                const restOfLine = line.substr(pos);\n                for (const rule of rules) {\n                    if (pos === 0 || !rule.matchOnlyAtLineStart) {\n                        matches = restOfLine.match(rule.resolveRegex(state));\n                        if (matches) {\n                            matched = matches[0];\n                            action = rule.action;\n                            break;\n                        }\n                    }\n                }\n            }\n            // We matched 'rule' with 'matches' and 'action'\n            if (!matches) {\n                matches = [''];\n                matched = '';\n            }\n            if (!action) {\n                // bad: we didn't match anything, and there is no action to take\n                // we need to advance the stream or we get progress trouble\n                if (pos < lineLength) {\n                    matches = [line.charAt(pos)];\n                    matched = matches[0];\n                }\n                action = this._lexer.defaultToken;\n            }\n            if (matched === null) {\n                // should never happen, needed for strict null checking\n                break;\n            }\n            // advance stream\n            pos += matched.length;\n            // maybe call action function (used for 'cases')\n            while (isFuzzyAction(action) && isIAction(action) && action.test) {\n                action = action.test(matched, matches, state, pos === lineLength);\n            }\n            let result = null;\n            // set the result: either a string or an array of actions\n            if (typeof action === 'string' || Array.isArray(action)) {\n                result = action;\n            }\n            else if (action.group) {\n                result = action.group;\n            }\n            else if (action.token !== null && action.token !== undefined) {\n                // do $n replacements?\n                if (action.tokenSubst) {\n                    result = substituteMatches(this._lexer, action.token, matched, matches, state);\n                }\n                else {\n                    result = action.token;\n                }\n                // enter embedded language?\n                if (action.nextEmbedded) {\n                    if (action.nextEmbedded === '@pop') {\n                        if (!embeddedLanguageData) {\n                            throw createError(this._lexer, 'cannot pop embedded language if not inside one');\n                        }\n                        embeddedLanguageData = null;\n                    }\n                    else if (embeddedLanguageData) {\n                        throw createError(this._lexer, 'cannot enter embedded language from within an embedded language');\n                    }\n                    else {\n                        enteringEmbeddedLanguage = substituteMatches(this._lexer, action.nextEmbedded, matched, matches, state);\n                    }\n                }\n                // state transformations\n                if (action.goBack) { // back up the stream..\n                    pos = Math.max(0, pos - action.goBack);\n                }\n                if (action.switchTo && typeof action.switchTo === 'string') {\n                    let nextState = substituteMatches(this._lexer, action.switchTo, matched, matches, state); // switch state without a push...\n                    if (nextState[0] === '@') {\n                        nextState = nextState.substr(1); // peel off starting '@'\n                    }\n                    if (!findRules(this._lexer, nextState)) {\n                        throw createError(this._lexer, 'trying to switch to a state \\'' + nextState + '\\' that is undefined in rule: ' + this._safeRuleName(rule));\n                    }\n                    else {\n                        stack = stack.switchTo(nextState);\n                    }\n                }\n                else if (action.transform && typeof action.transform === 'function') {\n                    throw createError(this._lexer, 'action.transform not supported');\n                }\n                else if (action.next) {\n                    if (action.next === '@push') {\n                        if (stack.depth >= this._lexer.maxStack) {\n                            throw createError(this._lexer, 'maximum tokenizer stack size reached: [' +\n                                stack.state + ',' + stack.parent.state + ',...]');\n                        }\n                        else {\n                            stack = stack.push(state);\n                        }\n                    }\n                    else if (action.next === '@pop') {\n                        if (stack.depth <= 1) {\n                            throw createError(this._lexer, 'trying to pop an empty stack in rule: ' + this._safeRuleName(rule));\n                        }\n                        else {\n                            stack = stack.pop();\n                        }\n                    }\n                    else if (action.next === '@popall') {\n                        stack = stack.popall();\n                    }\n                    else {\n                        let nextState = substituteMatches(this._lexer, action.next, matched, matches, state);\n                        if (nextState[0] === '@') {\n                            nextState = nextState.substr(1); // peel off starting '@'\n                        }\n                        if (!findRules(this._lexer, nextState)) {\n                            throw createError(this._lexer, 'trying to set a next state \\'' + nextState + '\\' that is undefined in rule: ' + this._safeRuleName(rule));\n                        }\n                        else {\n                            stack = stack.push(nextState);\n                        }\n                    }\n                }\n                if (action.log && typeof (action.log) === 'string') {\n                    log(this._lexer, this._lexer.languageId + ': ' + substituteMatches(this._lexer, action.log, matched, matches, state));\n                }\n            }\n            // check result\n            if (result === null) {\n                throw createError(this._lexer, 'lexer rule has no well-defined action in rule: ' + this._safeRuleName(rule));\n            }\n            const computeNewStateForEmbeddedLanguage = (enteringEmbeddedLanguage) => {\n                // support language names, mime types, and language ids\n                const languageId = (this._languageService.getLanguageIdByLanguageName(enteringEmbeddedLanguage)\n                    || this._languageService.getLanguageIdByMimeType(enteringEmbeddedLanguage)\n                    || enteringEmbeddedLanguage);\n                const embeddedLanguageData = this._getNestedEmbeddedLanguageData(languageId);\n                if (pos < lineLength) {\n                    // there is content from the embedded language on this line\n                    const restOfLine = lineWithoutLF.substr(pos);\n                    return this._nestedTokenize(restOfLine, hasEOL, MonarchLineStateFactory.create(stack, embeddedLanguageData), offsetDelta + pos, tokensCollector);\n                }\n                else {\n                    return MonarchLineStateFactory.create(stack, embeddedLanguageData);\n                }\n            };\n            // is the result a group match?\n            if (Array.isArray(result)) {\n                if (groupMatching && groupMatching.groups.length > 0) {\n                    throw createError(this._lexer, 'groups cannot be nested: ' + this._safeRuleName(rule));\n                }\n                if (matches.length !== result.length + 1) {\n                    throw createError(this._lexer, 'matched number of groups does not match the number of actions in rule: ' + this._safeRuleName(rule));\n                }\n                let totalLen = 0;\n                for (let i = 1; i < matches.length; i++) {\n                    totalLen += matches[i].length;\n                }\n                if (totalLen !== matched.length) {\n                    throw createError(this._lexer, 'with groups, all characters should be matched in consecutive groups in rule: ' + this._safeRuleName(rule));\n                }\n                groupMatching = {\n                    rule: rule,\n                    matches: matches,\n                    groups: []\n                };\n                for (let i = 0; i < result.length; i++) {\n                    groupMatching.groups[i] = {\n                        action: result[i],\n                        matched: matches[i + 1]\n                    };\n                }\n                pos -= matched.length;\n                // call recursively to initiate first result match\n                continue;\n            }\n            else {\n                // regular result\n                // check for '@rematch'\n                if (result === '@rematch') {\n                    pos -= matched.length;\n                    matched = ''; // better set the next state too..\n                    matches = null;\n                    result = '';\n                    // Even though `@rematch` was specified, if `nextEmbedded` also specified,\n                    // a state transition should occur.\n                    if (enteringEmbeddedLanguage !== null) {\n                        return computeNewStateForEmbeddedLanguage(enteringEmbeddedLanguage);\n                    }\n                }\n                // check progress\n                if (matched.length === 0) {\n                    if (lineLength === 0 || stackLen0 !== stack.depth || state !== stack.state || (!groupMatching ? 0 : groupMatching.groups.length) !== groupLen0) {\n                        continue;\n                    }\n                    else {\n                        throw createError(this._lexer, 'no progress in tokenizer in rule: ' + this._safeRuleName(rule));\n                    }\n                }\n                // return the result (and check for brace matching)\n                // todo: for efficiency we could pre-sanitize tokenPostfix and substitutions\n                let tokenType = null;\n                if (isString(result) && result.indexOf('@brackets') === 0) {\n                    const rest = result.substr('@brackets'.length);\n                    const bracket = findBracket(this._lexer, matched);\n                    if (!bracket) {\n                        throw createError(this._lexer, '@brackets token returned but no bracket defined as: ' + matched);\n                    }\n                    tokenType = sanitize(bracket.token + rest);\n                }\n                else {\n                    const token = (result === '' ? '' : result + this._lexer.tokenPostfix);\n                    tokenType = sanitize(token);\n                }\n                if (pos0 < lineWithoutLFLength) {\n                    tokensCollector.emit(pos0 + offsetDelta, tokenType);\n                }\n            }\n            if (enteringEmbeddedLanguage !== null) {\n                return computeNewStateForEmbeddedLanguage(enteringEmbeddedLanguage);\n            }\n        }\n        return MonarchLineStateFactory.create(stack, embeddedLanguageData);\n    }\n    _getNestedEmbeddedLanguageData(languageId) {\n        if (!this._languageService.isRegisteredLanguageId(languageId)) {\n            return new EmbeddedLanguageData(languageId, NullState);\n        }\n        if (languageId !== this._languageId) {\n            // Fire language loading event\n            this._languageService.requestBasicLanguageFeatures(languageId);\n            TokenizationRegistry.getOrCreate(languageId);\n            this._embeddedLanguages[languageId] = true;\n        }\n        const tokenizationSupport = TokenizationRegistry.get(languageId);\n        if (tokenizationSupport) {\n            return new EmbeddedLanguageData(languageId, tokenizationSupport.getInitialState());\n        }\n        return new EmbeddedLanguageData(languageId, NullState);\n    }\n};\nMonarchTokenizer = MonarchTokenizer_1 = __decorate([\n    __param(4, IConfigurationService)\n], MonarchTokenizer);\n/**\n * Searches for a bracket in the 'brackets' attribute that matches the input.\n */\nfunction findBracket(lexer, matched) {\n    if (!matched) {\n        return null;\n    }\n    matched = fixCase(lexer, matched);\n    const brackets = lexer.brackets;\n    for (const bracket of brackets) {\n        if (bracket.open === matched) {\n            return { token: bracket.token, bracketType: 1 /* monarchCommon.MonarchBracket.Open */ };\n        }\n        else if (bracket.close === matched) {\n            return { token: bracket.token, bracketType: -1 /* monarchCommon.MonarchBracket.Close */ };\n        }\n    }\n    return null;\n}\n\nexport { MonarchTokenizer };\n","import { createTrustedTypesPolicy } from '../../../base/browser/trustedTypes.js';\nimport { startsWithUTF8BOM, splitLines } from '../../../base/common/strings.js';\nimport { TokenizationRegistry } from '../../common/languages.js';\nimport { LineTokens } from '../../common/tokens/lineTokens.js';\nimport { renderViewLine2, RenderLineInput } from '../../common/viewLayout/viewLineRenderer.js';\nimport { ViewLineRenderingData } from '../../common/viewModel.js';\nimport { MonarchTokenizer } from '../common/monarch/monarchLexer.js';\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 *--------------------------------------------------------------------------------------------*/\nconst ttPolicy = createTrustedTypesPolicy('standaloneColorizer', { createHTML: value => value });\nclass Colorizer {\n    static colorizeElement(themeService, languageService, domNode, options) {\n        options = options || {};\n        const theme = options.theme || 'vs';\n        const mimeType = options.mimeType || domNode.getAttribute('lang') || domNode.getAttribute('data-lang');\n        if (!mimeType) {\n            console.error('Mode not detected');\n            return Promise.resolve();\n        }\n        const languageId = languageService.getLanguageIdByMimeType(mimeType) || mimeType;\n        themeService.setTheme(theme);\n        const text = domNode.firstChild ? domNode.firstChild.nodeValue : '';\n        domNode.className += ' ' + theme;\n        const render = (str) => {\n            const trustedhtml = ttPolicy?.createHTML(str) ?? str;\n            domNode.innerHTML = trustedhtml;\n        };\n        return this.colorize(languageService, text || '', languageId, options).then(render, (err) => console.error(err));\n    }\n    static async colorize(languageService, text, languageId, options) {\n        const languageIdCodec = languageService.languageIdCodec;\n        let tabSize = 4;\n        if (options && typeof options.tabSize === 'number') {\n            tabSize = options.tabSize;\n        }\n        if (startsWithUTF8BOM(text)) {\n            text = text.substr(1);\n        }\n        const lines = splitLines(text);\n        if (!languageService.isRegisteredLanguageId(languageId)) {\n            return _fakeColorize(lines, tabSize, languageIdCodec);\n        }\n        const tokenizationSupport = await TokenizationRegistry.getOrCreate(languageId);\n        if (tokenizationSupport) {\n            return _colorize(lines, tabSize, tokenizationSupport, languageIdCodec);\n        }\n        return _fakeColorize(lines, tabSize, languageIdCodec);\n    }\n    static colorizeLine(line, mightContainNonBasicASCII, mightContainRTL, tokens, tabSize = 4) {\n        const isBasicASCII = ViewLineRenderingData.isBasicASCII(line, mightContainNonBasicASCII);\n        const containsRTL = ViewLineRenderingData.containsRTL(line, isBasicASCII, mightContainRTL);\n        const renderResult = renderViewLine2(new RenderLineInput(false, true, line, false, isBasicASCII, containsRTL, 0, tokens, [], tabSize, 0, 0, 0, 0, -1, 'none', false, false, null, null, 0));\n        return renderResult.html;\n    }\n    static colorizeModelLine(model, lineNumber, tabSize = 4) {\n        const content = model.getLineContent(lineNumber);\n        model.tokenization.forceTokenization(lineNumber);\n        const tokens = model.tokenization.getLineTokens(lineNumber);\n        const inflatedTokens = tokens.inflate();\n        return this.colorizeLine(content, model.mightContainNonBasicASCII(), model.mightContainRTL(), inflatedTokens, tabSize);\n    }\n}\nfunction _colorize(lines, tabSize, tokenizationSupport, languageIdCodec) {\n    return new Promise((c, e) => {\n        const execute = () => {\n            const result = _actualColorize(lines, tabSize, tokenizationSupport, languageIdCodec);\n            if (tokenizationSupport instanceof MonarchTokenizer) {\n                const status = tokenizationSupport.getLoadStatus();\n                if (status.loaded === false) {\n                    status.promise.then(execute, e);\n                    return;\n                }\n            }\n            c(result);\n        };\n        execute();\n    });\n}\nfunction _fakeColorize(lines, tabSize, languageIdCodec) {\n    let html = [];\n    const defaultMetadata = ((0 /* FontStyle.None */ << 11 /* MetadataConsts.FONT_STYLE_OFFSET */)\n        | (1 /* ColorId.DefaultForeground */ << 15 /* MetadataConsts.FOREGROUND_OFFSET */)\n        | (2 /* ColorId.DefaultBackground */ << 24 /* MetadataConsts.BACKGROUND_OFFSET */)) >>> 0;\n    const tokens = new Uint32Array(2);\n    tokens[0] = 0;\n    tokens[1] = defaultMetadata;\n    for (let i = 0, length = lines.length; i < length; i++) {\n        const line = lines[i];\n        tokens[0] = line.length;\n        const lineTokens = new LineTokens(tokens, line, languageIdCodec);\n        const isBasicASCII = ViewLineRenderingData.isBasicASCII(line, /* check for basic ASCII */ true);\n        const containsRTL = ViewLineRenderingData.containsRTL(line, isBasicASCII, /* check for RTL */ true);\n        const renderResult = renderViewLine2(new RenderLineInput(false, true, line, false, isBasicASCII, containsRTL, 0, lineTokens, [], tabSize, 0, 0, 0, 0, -1, 'none', false, false, null, null, 0));\n        html = html.concat(renderResult.html);\n        html.push('<br/>');\n    }\n    return html.join('');\n}\nfunction _actualColorize(lines, tabSize, tokenizationSupport, languageIdCodec) {\n    let html = [];\n    let state = tokenizationSupport.getInitialState();\n    for (let i = 0, length = lines.length; i < length; i++) {\n        const line = lines[i];\n        const tokenizeResult = tokenizationSupport.tokenizeEncoded(line, true, state);\n        LineTokens.convertToEndOffset(tokenizeResult.tokens, line.length);\n        const lineTokens = new LineTokens(tokenizeResult.tokens, line, languageIdCodec);\n        const isBasicASCII = ViewLineRenderingData.isBasicASCII(line, /* check for basic ASCII */ true);\n        const containsRTL = ViewLineRenderingData.containsRTL(line, isBasicASCII, /* check for RTL */ true);\n        const renderResult = renderViewLine2(new RenderLineInput(false, true, line, false, isBasicASCII, containsRTL, 0, lineTokens.inflate(), [], tabSize, 0, 0, 0, 0, -1, 'none', false, false, null, null, 0));\n        html = html.concat(renderResult.html);\n        html.push('<br/>');\n        state = tokenizeResult.endState;\n    }\n    return html.join('');\n}\n\nexport { Colorizer };\n","import { Emitter } from '../../../base/common/event.js';\nimport { Disposable, toDisposable } from '../../../base/common/lifecycle.js';\nimport { LinkedList } from '../../../base/common/linkedList.js';\nimport { IThemeService } from '../../../platform/theme/common/themeService.js';\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet AbstractCodeEditorService = class AbstractCodeEditorService extends Disposable {\n    constructor(_themeService) {\n        super();\n        this._themeService = _themeService;\n        this._onWillCreateCodeEditor = this._register(new Emitter());\n        this._onCodeEditorAdd = this._register(new Emitter());\n        this.onCodeEditorAdd = this._onCodeEditorAdd.event;\n        this._onCodeEditorRemove = this._register(new Emitter());\n        this.onCodeEditorRemove = this._onCodeEditorRemove.event;\n        this._onWillCreateDiffEditor = this._register(new Emitter());\n        this._onDiffEditorAdd = this._register(new Emitter());\n        this.onDiffEditorAdd = this._onDiffEditorAdd.event;\n        this._onDiffEditorRemove = this._register(new Emitter());\n        this.onDiffEditorRemove = this._onDiffEditorRemove.event;\n        this._decorationOptionProviders = new Map();\n        this._codeEditorOpenHandlers = new LinkedList();\n        this._modelProperties = new Map();\n        this._codeEditors = Object.create(null);\n        this._diffEditors = Object.create(null);\n        this._globalStyleSheet = null;\n    }\n    willCreateCodeEditor() {\n        this._onWillCreateCodeEditor.fire();\n    }\n    addCodeEditor(editor) {\n        this._codeEditors[editor.getId()] = editor;\n        this._onCodeEditorAdd.fire(editor);\n    }\n    removeCodeEditor(editor) {\n        if (delete this._codeEditors[editor.getId()]) {\n            this._onCodeEditorRemove.fire(editor);\n        }\n    }\n    listCodeEditors() {\n        return Object.keys(this._codeEditors).map(id => this._codeEditors[id]);\n    }\n    willCreateDiffEditor() {\n        this._onWillCreateDiffEditor.fire();\n    }\n    addDiffEditor(editor) {\n        this._diffEditors[editor.getId()] = editor;\n        this._onDiffEditorAdd.fire(editor);\n    }\n    removeDiffEditor(editor) {\n        if (delete this._diffEditors[editor.getId()]) {\n            this._onDiffEditorRemove.fire(editor);\n        }\n    }\n    listDiffEditors() {\n        return Object.keys(this._diffEditors).map(id => this._diffEditors[id]);\n    }\n    getFocusedCodeEditor() {\n        let editorWithWidgetFocus = null;\n        const editors = this.listCodeEditors();\n        for (const editor of editors) {\n            if (editor.hasTextFocus()) {\n                // bingo!\n                return editor;\n            }\n            if (editor.hasWidgetFocus()) {\n                editorWithWidgetFocus = editor;\n            }\n        }\n        return editorWithWidgetFocus;\n    }\n    removeDecorationType(key) {\n        const provider = this._decorationOptionProviders.get(key);\n        if (provider) {\n            provider.refCount--;\n            if (provider.refCount <= 0) {\n                this._decorationOptionProviders.delete(key);\n                provider.dispose();\n                this.listCodeEditors().forEach((ed) => ed.removeDecorationsByType(key));\n            }\n        }\n    }\n    setModelProperty(resource, key, value) {\n        const key1 = resource.toString();\n        let dest;\n        if (this._modelProperties.has(key1)) {\n            dest = this._modelProperties.get(key1);\n        }\n        else {\n            dest = new Map();\n            this._modelProperties.set(key1, dest);\n        }\n        dest.set(key, value);\n    }\n    getModelProperty(resource, key) {\n        const key1 = resource.toString();\n        if (this._modelProperties.has(key1)) {\n            const innerMap = this._modelProperties.get(key1);\n            return innerMap.get(key);\n        }\n        return undefined;\n    }\n    async openCodeEditor(input, source, sideBySide) {\n        for (const handler of this._codeEditorOpenHandlers) {\n            const candidate = await handler(input, source, sideBySide);\n            if (candidate !== null) {\n                return candidate;\n            }\n        }\n        return null;\n    }\n    registerCodeEditorOpenHandler(handler) {\n        const rm = this._codeEditorOpenHandlers.unshift(handler);\n        return toDisposable(rm);\n    }\n};\nAbstractCodeEditorService = __decorate([\n    __param(0, IThemeService)\n], AbstractCodeEditorService);\n\nexport { AbstractCodeEditorService };\n","import { windowOpenNoOpener } from '../../../base/browser/dom.js';\nimport { Schemas } from '../../../base/common/network.js';\nimport { AbstractCodeEditorService } from '../../browser/services/abstractCodeEditorService.js';\nimport { ICodeEditorService } from '../../browser/services/codeEditorService.js';\nimport { IContextKeyService } from '../../../platform/contextkey/common/contextkey.js';\nimport { registerSingleton } from '../../../platform/instantiation/common/extensions.js';\nimport { IThemeService } from '../../../platform/theme/common/themeService.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet StandaloneCodeEditorService = class StandaloneCodeEditorService extends AbstractCodeEditorService {\n    constructor(contextKeyService, themeService) {\n        super(themeService);\n        this._register(this.onCodeEditorAdd(() => this._checkContextKey()));\n        this._register(this.onCodeEditorRemove(() => this._checkContextKey()));\n        this._editorIsOpen = contextKeyService.createKey('editorIsOpen', false);\n        this._activeCodeEditor = null;\n        this._register(this.registerCodeEditorOpenHandler(async (input, source, sideBySide) => {\n            if (!source) {\n                return null;\n            }\n            return this.doOpenEditor(source, input);\n        }));\n    }\n    _checkContextKey() {\n        let hasCodeEditor = false;\n        for (const editor of this.listCodeEditors()) {\n            if (!editor.isSimpleWidget) {\n                hasCodeEditor = true;\n                break;\n            }\n        }\n        this._editorIsOpen.set(hasCodeEditor);\n    }\n    setActiveCodeEditor(activeCodeEditor) {\n        this._activeCodeEditor = activeCodeEditor;\n    }\n    getActiveCodeEditor() {\n        return this._activeCodeEditor;\n    }\n    doOpenEditor(editor, input) {\n        const model = this.findModel(editor, input.resource);\n        if (!model) {\n            if (input.resource) {\n                const schema = input.resource.scheme;\n                if (schema === Schemas.http || schema === Schemas.https) {\n                    // This is a fully qualified http or https URL\n                    windowOpenNoOpener(input.resource.toString());\n                    return editor;\n                }\n            }\n            return null;\n        }\n        const selection = (input.options ? input.options.selection : null);\n        if (selection) {\n            if (typeof selection.endLineNumber === 'number' && typeof selection.endColumn === 'number') {\n                editor.setSelection(selection);\n                editor.revealRangeInCenter(selection, 1 /* ScrollType.Immediate */);\n            }\n            else {\n                const pos = {\n                    lineNumber: selection.startLineNumber,\n                    column: selection.startColumn\n                };\n                editor.setPosition(pos);\n                editor.revealPositionInCenter(pos, 1 /* ScrollType.Immediate */);\n            }\n        }\n        return editor;\n    }\n    findModel(editor, resource) {\n        const model = editor.getModel();\n        if (model && model.uri.toString() !== resource.toString()) {\n            return null;\n        }\n        return model;\n    }\n};\nStandaloneCodeEditorService = __decorate([\n    __param(0, IContextKeyService),\n    __param(1, IThemeService)\n], StandaloneCodeEditorService);\nregisterSingleton(ICodeEditorService, StandaloneCodeEditorService, 0 /* InstantiationType.Eager */);\n\nexport { StandaloneCodeEditorService };\n","import { getClientArea } from '../../../base/browser/dom.js';\nimport { mainWindow } from '../../../base/browser/window.js';\nimport { coalesce } from '../../../base/common/arrays.js';\nimport { Event } from '../../../base/common/event.js';\nimport { ICodeEditorService } from '../../browser/services/codeEditorService.js';\nimport { registerSingleton } from '../../../platform/instantiation/common/extensions.js';\nimport { ILayoutService } from '../../../platform/layout/browser/layoutService.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet StandaloneLayoutService = class StandaloneLayoutService {\n    get mainContainer() {\n        return this._codeEditorService.listCodeEditors().at(0)?.getContainerDomNode() ?? mainWindow.document.body;\n    }\n    get activeContainer() {\n        const activeCodeEditor = this._codeEditorService.getFocusedCodeEditor() ?? this._codeEditorService.getActiveCodeEditor();\n        return activeCodeEditor?.getContainerDomNode() ?? this.mainContainer;\n    }\n    get mainContainerDimension() {\n        return getClientArea(this.mainContainer);\n    }\n    get activeContainerDimension() {\n        return getClientArea(this.activeContainer);\n    }\n    get containers() {\n        return coalesce(this._codeEditorService.listCodeEditors().map(codeEditor => codeEditor.getContainerDomNode()));\n    }\n    getContainer() {\n        return this.activeContainer;\n    }\n    whenContainerStylesLoaded() { return undefined; }\n    focus() {\n        this._codeEditorService.getFocusedCodeEditor()?.focus();\n    }\n    constructor(_codeEditorService) {\n        this._codeEditorService = _codeEditorService;\n        this.onDidLayoutMainContainer = Event.None;\n        this.onDidLayoutActiveContainer = Event.None;\n        this.onDidLayoutContainer = Event.None;\n        this.onDidChangeActiveContainer = Event.None;\n        this.onDidAddContainer = Event.None;\n        this.mainContainerOffset = { top: 0, quickPickTop: 0 };\n        this.activeContainerOffset = { top: 0, quickPickTop: 0 };\n    }\n};\nStandaloneLayoutService = __decorate([\n    __param(0, ICodeEditorService)\n], StandaloneLayoutService);\nlet EditorScopedLayoutService = class EditorScopedLayoutService extends StandaloneLayoutService {\n    get mainContainer() {\n        return this._container;\n    }\n    constructor(_container, codeEditorService) {\n        super(codeEditorService);\n        this._container = _container;\n    }\n};\nEditorScopedLayoutService = __decorate([\n    __param(1, ICodeEditorService)\n], EditorScopedLayoutService);\nregisterSingleton(ILayoutService, StandaloneLayoutService, 1 /* InstantiationType.Delayed */);\n\nexport { EditorScopedLayoutService };\n","import { onUnexpectedError } from '../../../base/common/errors.js';\nimport { Disposable, isDisposable } from '../../../base/common/lifecycle.js';\nimport { Schemas } from '../../../base/common/network.js';\nimport Severity from '../../../base/common/severity.js';\nimport { localize } from '../../../nls.js';\nimport { IDialogService } from '../../dialogs/common/dialogs.js';\nimport { registerSingleton } from '../../instantiation/common/extensions.js';\nimport { INotificationService } from '../../notification/common/notification.js';\nimport { ResourceEditStackSnapshot, UndoRedoGroup, UndoRedoSource, IUndoRedoService } from './undoRedo.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nfunction getResourceLabel(resource) {\n    return resource.scheme === Schemas.file ? resource.fsPath : resource.path;\n}\nlet stackElementCounter = 0;\nclass ResourceStackElement {\n    constructor(actual, resourceLabel, strResource, groupId, groupOrder, sourceId, sourceOrder) {\n        this.id = (++stackElementCounter);\n        this.type = 0 /* UndoRedoElementType.Resource */;\n        this.actual = actual;\n        this.label = actual.label;\n        this.confirmBeforeUndo = actual.confirmBeforeUndo || false;\n        this.resourceLabel = resourceLabel;\n        this.strResource = strResource;\n        this.resourceLabels = [this.resourceLabel];\n        this.strResources = [this.strResource];\n        this.groupId = groupId;\n        this.groupOrder = groupOrder;\n        this.sourceId = sourceId;\n        this.sourceOrder = sourceOrder;\n        this.isValid = true;\n    }\n    setValid(isValid) {\n        this.isValid = isValid;\n    }\n    toString() {\n        return `[id:${this.id}] [group:${this.groupId}] [${this.isValid ? '  VALID' : 'INVALID'}] ${this.actual.constructor.name} - ${this.actual}`;\n    }\n}\nclass ResourceReasonPair {\n    constructor(resourceLabel, reason) {\n        this.resourceLabel = resourceLabel;\n        this.reason = reason;\n    }\n}\nclass RemovedResources {\n    constructor() {\n        this.elements = new Map();\n    }\n    createMessage() {\n        const externalRemoval = [];\n        const noParallelUniverses = [];\n        for (const [, element] of this.elements) {\n            const dest = (element.reason === 0 /* RemovedResourceReason.ExternalRemoval */\n                ? externalRemoval\n                : noParallelUniverses);\n            dest.push(element.resourceLabel);\n        }\n        const messages = [];\n        if (externalRemoval.length > 0) {\n            messages.push(localize(2030, \"The following files have been closed and modified on disk: {0}.\", externalRemoval.join(', ')));\n        }\n        if (noParallelUniverses.length > 0) {\n            messages.push(localize(2031, \"The following files have been modified in an incompatible way: {0}.\", noParallelUniverses.join(', ')));\n        }\n        return messages.join('\\n');\n    }\n    get size() {\n        return this.elements.size;\n    }\n    has(strResource) {\n        return this.elements.has(strResource);\n    }\n    set(strResource, value) {\n        this.elements.set(strResource, value);\n    }\n    delete(strResource) {\n        return this.elements.delete(strResource);\n    }\n}\nclass WorkspaceStackElement {\n    constructor(actual, resourceLabels, strResources, groupId, groupOrder, sourceId, sourceOrder) {\n        this.id = (++stackElementCounter);\n        this.type = 1 /* UndoRedoElementType.Workspace */;\n        this.actual = actual;\n        this.label = actual.label;\n        this.confirmBeforeUndo = actual.confirmBeforeUndo || false;\n        this.resourceLabels = resourceLabels;\n        this.strResources = strResources;\n        this.groupId = groupId;\n        this.groupOrder = groupOrder;\n        this.sourceId = sourceId;\n        this.sourceOrder = sourceOrder;\n        this.removedResources = null;\n        this.invalidatedResources = null;\n    }\n    canSplit() {\n        return (typeof this.actual.split === 'function');\n    }\n    removeResource(resourceLabel, strResource, reason) {\n        if (!this.removedResources) {\n            this.removedResources = new RemovedResources();\n        }\n        if (!this.removedResources.has(strResource)) {\n            this.removedResources.set(strResource, new ResourceReasonPair(resourceLabel, reason));\n        }\n    }\n    setValid(resourceLabel, strResource, isValid) {\n        if (isValid) {\n            if (this.invalidatedResources) {\n                this.invalidatedResources.delete(strResource);\n                if (this.invalidatedResources.size === 0) {\n                    this.invalidatedResources = null;\n                }\n            }\n        }\n        else {\n            if (!this.invalidatedResources) {\n                this.invalidatedResources = new RemovedResources();\n            }\n            if (!this.invalidatedResources.has(strResource)) {\n                this.invalidatedResources.set(strResource, new ResourceReasonPair(resourceLabel, 0 /* RemovedResourceReason.ExternalRemoval */));\n            }\n        }\n    }\n    toString() {\n        return `[id:${this.id}] [group:${this.groupId}] [${this.invalidatedResources ? 'INVALID' : '  VALID'}] ${this.actual.constructor.name} - ${this.actual}`;\n    }\n}\nclass ResourceEditStack {\n    constructor(resourceLabel, strResource) {\n        this.resourceLabel = resourceLabel;\n        this.strResource = strResource;\n        this._past = [];\n        this._future = [];\n        this.locked = false;\n        this.versionId = 1;\n    }\n    dispose() {\n        for (const element of this._past) {\n            if (element.type === 1 /* UndoRedoElementType.Workspace */) {\n                element.removeResource(this.resourceLabel, this.strResource, 0 /* RemovedResourceReason.ExternalRemoval */);\n            }\n        }\n        for (const element of this._future) {\n            if (element.type === 1 /* UndoRedoElementType.Workspace */) {\n                element.removeResource(this.resourceLabel, this.strResource, 0 /* RemovedResourceReason.ExternalRemoval */);\n            }\n        }\n        this.versionId++;\n    }\n    toString() {\n        const result = [];\n        result.push(`* ${this.strResource}:`);\n        for (let i = 0; i < this._past.length; i++) {\n            result.push(`   * [UNDO] ${this._past[i]}`);\n        }\n        for (let i = this._future.length - 1; i >= 0; i--) {\n            result.push(`   * [REDO] ${this._future[i]}`);\n        }\n        return result.join('\\n');\n    }\n    flushAllElements() {\n        this._past = [];\n        this._future = [];\n        this.versionId++;\n    }\n    _setElementValidFlag(element, isValid) {\n        if (element.type === 1 /* UndoRedoElementType.Workspace */) {\n            element.setValid(this.resourceLabel, this.strResource, isValid);\n        }\n        else {\n            element.setValid(isValid);\n        }\n    }\n    setElementsValidFlag(isValid, filter) {\n        for (const element of this._past) {\n            if (filter(element.actual)) {\n                this._setElementValidFlag(element, isValid);\n            }\n        }\n        for (const element of this._future) {\n            if (filter(element.actual)) {\n                this._setElementValidFlag(element, isValid);\n            }\n        }\n    }\n    pushElement(element) {\n        // remove the future\n        for (const futureElement of this._future) {\n            if (futureElement.type === 1 /* UndoRedoElementType.Workspace */) {\n                futureElement.removeResource(this.resourceLabel, this.strResource, 1 /* RemovedResourceReason.NoParallelUniverses */);\n            }\n        }\n        this._future = [];\n        this._past.push(element);\n        this.versionId++;\n    }\n    createSnapshot(resource) {\n        const elements = [];\n        for (let i = 0, len = this._past.length; i < len; i++) {\n            elements.push(this._past[i].id);\n        }\n        for (let i = this._future.length - 1; i >= 0; i--) {\n            elements.push(this._future[i].id);\n        }\n        return new ResourceEditStackSnapshot(resource, elements);\n    }\n    restoreSnapshot(snapshot) {\n        const snapshotLength = snapshot.elements.length;\n        let isOK = true;\n        let snapshotIndex = 0;\n        let removePastAfter = -1;\n        for (let i = 0, len = this._past.length; i < len; i++, snapshotIndex++) {\n            const element = this._past[i];\n            if (isOK && (snapshotIndex >= snapshotLength || element.id !== snapshot.elements[snapshotIndex])) {\n                isOK = false;\n                removePastAfter = 0;\n            }\n            if (!isOK && element.type === 1 /* UndoRedoElementType.Workspace */) {\n                element.removeResource(this.resourceLabel, this.strResource, 0 /* RemovedResourceReason.ExternalRemoval */);\n            }\n        }\n        let removeFutureBefore = -1;\n        for (let i = this._future.length - 1; i >= 0; i--, snapshotIndex++) {\n            const element = this._future[i];\n            if (isOK && (snapshotIndex >= snapshotLength || element.id !== snapshot.elements[snapshotIndex])) {\n                isOK = false;\n                removeFutureBefore = i;\n            }\n            if (!isOK && element.type === 1 /* UndoRedoElementType.Workspace */) {\n                element.removeResource(this.resourceLabel, this.strResource, 0 /* RemovedResourceReason.ExternalRemoval */);\n            }\n        }\n        if (removePastAfter !== -1) {\n            this._past = this._past.slice(0, removePastAfter);\n        }\n        if (removeFutureBefore !== -1) {\n            this._future = this._future.slice(removeFutureBefore + 1);\n        }\n        this.versionId++;\n    }\n    getElements() {\n        const past = [];\n        const future = [];\n        for (const element of this._past) {\n            past.push(element.actual);\n        }\n        for (const element of this._future) {\n            future.push(element.actual);\n        }\n        return { past, future };\n    }\n    getClosestPastElement() {\n        if (this._past.length === 0) {\n            return null;\n        }\n        return this._past[this._past.length - 1];\n    }\n    getSecondClosestPastElement() {\n        if (this._past.length < 2) {\n            return null;\n        }\n        return this._past[this._past.length - 2];\n    }\n    getClosestFutureElement() {\n        if (this._future.length === 0) {\n            return null;\n        }\n        return this._future[this._future.length - 1];\n    }\n    hasPastElements() {\n        return (this._past.length > 0);\n    }\n    hasFutureElements() {\n        return (this._future.length > 0);\n    }\n    splitPastWorkspaceElement(toRemove, individualMap) {\n        for (let j = this._past.length - 1; j >= 0; j--) {\n            if (this._past[j] === toRemove) {\n                if (individualMap.has(this.strResource)) {\n                    // gets replaced\n                    this._past[j] = individualMap.get(this.strResource);\n                }\n                else {\n                    // gets deleted\n                    this._past.splice(j, 1);\n                }\n                break;\n            }\n        }\n        this.versionId++;\n    }\n    splitFutureWorkspaceElement(toRemove, individualMap) {\n        for (let j = this._future.length - 1; j >= 0; j--) {\n            if (this._future[j] === toRemove) {\n                if (individualMap.has(this.strResource)) {\n                    // gets replaced\n                    this._future[j] = individualMap.get(this.strResource);\n                }\n                else {\n                    // gets deleted\n                    this._future.splice(j, 1);\n                }\n                break;\n            }\n        }\n        this.versionId++;\n    }\n    moveBackward(element) {\n        this._past.pop();\n        this._future.push(element);\n        this.versionId++;\n    }\n    moveForward(element) {\n        this._future.pop();\n        this._past.push(element);\n        this.versionId++;\n    }\n}\nclass EditStackSnapshot {\n    constructor(editStacks) {\n        this.editStacks = editStacks;\n        this._versionIds = [];\n        for (let i = 0, len = this.editStacks.length; i < len; i++) {\n            this._versionIds[i] = this.editStacks[i].versionId;\n        }\n    }\n    isValid() {\n        for (let i = 0, len = this.editStacks.length; i < len; i++) {\n            if (this._versionIds[i] !== this.editStacks[i].versionId) {\n                return false;\n            }\n        }\n        return true;\n    }\n}\nconst missingEditStack = new ResourceEditStack('', '');\nmissingEditStack.locked = true;\nlet UndoRedoService = class UndoRedoService {\n    constructor(_dialogService, _notificationService) {\n        this._dialogService = _dialogService;\n        this._notificationService = _notificationService;\n        this._editStacks = new Map();\n        this._uriComparisonKeyComputers = [];\n    }\n    getUriComparisonKey(resource) {\n        for (const uriComparisonKeyComputer of this._uriComparisonKeyComputers) {\n            if (uriComparisonKeyComputer[0] === resource.scheme) {\n                return uriComparisonKeyComputer[1].getComparisonKey(resource);\n            }\n        }\n        return resource.toString();\n    }\n    _print(label) {\n        console.log(`------------------------------------`);\n        console.log(`AFTER ${label}: `);\n        const str = [];\n        for (const element of this._editStacks) {\n            str.push(element[1].toString());\n        }\n        console.log(str.join('\\n'));\n    }\n    pushElement(element, group = UndoRedoGroup.None, source = UndoRedoSource.None) {\n        if (element.type === 0 /* UndoRedoElementType.Resource */) {\n            const resourceLabel = getResourceLabel(element.resource);\n            const strResource = this.getUriComparisonKey(element.resource);\n            this._pushElement(new ResourceStackElement(element, resourceLabel, strResource, group.id, group.nextOrder(), source.id, source.nextOrder()));\n        }\n        else {\n            const seen = new Set();\n            const resourceLabels = [];\n            const strResources = [];\n            for (const resource of element.resources) {\n                const resourceLabel = getResourceLabel(resource);\n                const strResource = this.getUriComparisonKey(resource);\n                if (seen.has(strResource)) {\n                    continue;\n                }\n                seen.add(strResource);\n                resourceLabels.push(resourceLabel);\n                strResources.push(strResource);\n            }\n            if (resourceLabels.length === 1) {\n                this._pushElement(new ResourceStackElement(element, resourceLabels[0], strResources[0], group.id, group.nextOrder(), source.id, source.nextOrder()));\n            }\n            else {\n                this._pushElement(new WorkspaceStackElement(element, resourceLabels, strResources, group.id, group.nextOrder(), source.id, source.nextOrder()));\n            }\n        }\n    }\n    _pushElement(element) {\n        for (let i = 0, len = element.strResources.length; i < len; i++) {\n            const resourceLabel = element.resourceLabels[i];\n            const strResource = element.strResources[i];\n            let editStack;\n            if (this._editStacks.has(strResource)) {\n                editStack = this._editStacks.get(strResource);\n            }\n            else {\n                editStack = new ResourceEditStack(resourceLabel, strResource);\n                this._editStacks.set(strResource, editStack);\n            }\n            editStack.pushElement(element);\n        }\n    }\n    getLastElement(resource) {\n        const strResource = this.getUriComparisonKey(resource);\n        if (this._editStacks.has(strResource)) {\n            const editStack = this._editStacks.get(strResource);\n            if (editStack.hasFutureElements()) {\n                return null;\n            }\n            const closestPastElement = editStack.getClosestPastElement();\n            return closestPastElement ? closestPastElement.actual : null;\n        }\n        return null;\n    }\n    _splitPastWorkspaceElement(toRemove, ignoreResources) {\n        const individualArr = toRemove.actual.split();\n        const individualMap = new Map();\n        for (const _element of individualArr) {\n            const resourceLabel = getResourceLabel(_element.resource);\n            const strResource = this.getUriComparisonKey(_element.resource);\n            const element = new ResourceStackElement(_element, resourceLabel, strResource, 0, 0, 0, 0);\n            individualMap.set(element.strResource, element);\n        }\n        for (const strResource of toRemove.strResources) {\n            if (ignoreResources && ignoreResources.has(strResource)) {\n                continue;\n            }\n            const editStack = this._editStacks.get(strResource);\n            editStack.splitPastWorkspaceElement(toRemove, individualMap);\n        }\n    }\n    _splitFutureWorkspaceElement(toRemove, ignoreResources) {\n        const individualArr = toRemove.actual.split();\n        const individualMap = new Map();\n        for (const _element of individualArr) {\n            const resourceLabel = getResourceLabel(_element.resource);\n            const strResource = this.getUriComparisonKey(_element.resource);\n            const element = new ResourceStackElement(_element, resourceLabel, strResource, 0, 0, 0, 0);\n            individualMap.set(element.strResource, element);\n        }\n        for (const strResource of toRemove.strResources) {\n            if (ignoreResources && ignoreResources.has(strResource)) {\n                continue;\n            }\n            const editStack = this._editStacks.get(strResource);\n            editStack.splitFutureWorkspaceElement(toRemove, individualMap);\n        }\n    }\n    removeElements(resource) {\n        const strResource = typeof resource === 'string' ? resource : this.getUriComparisonKey(resource);\n        if (this._editStacks.has(strResource)) {\n            const editStack = this._editStacks.get(strResource);\n            editStack.dispose();\n            this._editStacks.delete(strResource);\n        }\n    }\n    setElementsValidFlag(resource, isValid, filter) {\n        const strResource = this.getUriComparisonKey(resource);\n        if (this._editStacks.has(strResource)) {\n            const editStack = this._editStacks.get(strResource);\n            editStack.setElementsValidFlag(isValid, filter);\n        }\n    }\n    createSnapshot(resource) {\n        const strResource = this.getUriComparisonKey(resource);\n        if (this._editStacks.has(strResource)) {\n            const editStack = this._editStacks.get(strResource);\n            return editStack.createSnapshot(resource);\n        }\n        return new ResourceEditStackSnapshot(resource, []);\n    }\n    restoreSnapshot(snapshot) {\n        const strResource = this.getUriComparisonKey(snapshot.resource);\n        if (this._editStacks.has(strResource)) {\n            const editStack = this._editStacks.get(strResource);\n            editStack.restoreSnapshot(snapshot);\n            if (!editStack.hasPastElements() && !editStack.hasFutureElements()) {\n                // the edit stack is now empty, just remove it entirely\n                editStack.dispose();\n                this._editStacks.delete(strResource);\n            }\n        }\n    }\n    getElements(resource) {\n        const strResource = this.getUriComparisonKey(resource);\n        if (this._editStacks.has(strResource)) {\n            const editStack = this._editStacks.get(strResource);\n            return editStack.getElements();\n        }\n        return { past: [], future: [] };\n    }\n    _findClosestUndoElementWithSource(sourceId) {\n        if (!sourceId) {\n            return [null, null];\n        }\n        // find an element with the sourceId and with the highest sourceOrder ready to be undone\n        let matchedElement = null;\n        let matchedStrResource = null;\n        for (const [strResource, editStack] of this._editStacks) {\n            const candidate = editStack.getClosestPastElement();\n            if (!candidate) {\n                continue;\n            }\n            if (candidate.sourceId === sourceId) {\n                if (!matchedElement || candidate.sourceOrder > matchedElement.sourceOrder) {\n                    matchedElement = candidate;\n                    matchedStrResource = strResource;\n                }\n            }\n        }\n        return [matchedElement, matchedStrResource];\n    }\n    canUndo(resourceOrSource) {\n        if (resourceOrSource instanceof UndoRedoSource) {\n            const [, matchedStrResource] = this._findClosestUndoElementWithSource(resourceOrSource.id);\n            return matchedStrResource ? true : false;\n        }\n        const strResource = this.getUriComparisonKey(resourceOrSource);\n        if (this._editStacks.has(strResource)) {\n            const editStack = this._editStacks.get(strResource);\n            return editStack.hasPastElements();\n        }\n        return false;\n    }\n    _onError(err, element) {\n        onUnexpectedError(err);\n        // An error occurred while undoing or redoing => drop the undo/redo stack for all affected resources\n        for (const strResource of element.strResources) {\n            this.removeElements(strResource);\n        }\n        this._notificationService.error(err);\n    }\n    _acquireLocks(editStackSnapshot) {\n        // first, check if all locks can be acquired\n        for (const editStack of editStackSnapshot.editStacks) {\n            if (editStack.locked) {\n                throw new Error('Cannot acquire edit stack lock');\n            }\n        }\n        // can acquire all locks\n        for (const editStack of editStackSnapshot.editStacks) {\n            editStack.locked = true;\n        }\n        return () => {\n            // release all locks\n            for (const editStack of editStackSnapshot.editStacks) {\n                editStack.locked = false;\n            }\n        };\n    }\n    _safeInvokeWithLocks(element, invoke, editStackSnapshot, cleanup, continuation) {\n        const releaseLocks = this._acquireLocks(editStackSnapshot);\n        let result;\n        try {\n            result = invoke();\n        }\n        catch (err) {\n            releaseLocks();\n            cleanup.dispose();\n            return this._onError(err, element);\n        }\n        if (result) {\n            // result is Promise<void>\n            return result.then(() => {\n                releaseLocks();\n                cleanup.dispose();\n                return continuation();\n            }, (err) => {\n                releaseLocks();\n                cleanup.dispose();\n                return this._onError(err, element);\n            });\n        }\n        else {\n            // result is void\n            releaseLocks();\n            cleanup.dispose();\n            return continuation();\n        }\n    }\n    async _invokeWorkspacePrepare(element) {\n        if (typeof element.actual.prepareUndoRedo === 'undefined') {\n            return Disposable.None;\n        }\n        const result = element.actual.prepareUndoRedo();\n        if (typeof result === 'undefined') {\n            return Disposable.None;\n        }\n        return result;\n    }\n    _invokeResourcePrepare(element, callback) {\n        if (element.actual.type !== 1 /* UndoRedoElementType.Workspace */ || typeof element.actual.prepareUndoRedo === 'undefined') {\n            // no preparation needed\n            return callback(Disposable.None);\n        }\n        const r = element.actual.prepareUndoRedo();\n        if (!r) {\n            // nothing to clean up\n            return callback(Disposable.None);\n        }\n        if (isDisposable(r)) {\n            return callback(r);\n        }\n        return r.then((disposable) => {\n            return callback(disposable);\n        });\n    }\n    _getAffectedEditStacks(element) {\n        const affectedEditStacks = [];\n        for (const strResource of element.strResources) {\n            affectedEditStacks.push(this._editStacks.get(strResource) || missingEditStack);\n        }\n        return new EditStackSnapshot(affectedEditStacks);\n    }\n    _tryToSplitAndUndo(strResource, element, ignoreResources, message) {\n        if (element.canSplit()) {\n            this._splitPastWorkspaceElement(element, ignoreResources);\n            this._notificationService.warn(message);\n            return new WorkspaceVerificationError(this._undo(strResource, 0, true));\n        }\n        else {\n            // Cannot safely split this workspace element => flush all undo/redo stacks\n            for (const strResource of element.strResources) {\n                this.removeElements(strResource);\n            }\n            this._notificationService.warn(message);\n            return new WorkspaceVerificationError();\n        }\n    }\n    _checkWorkspaceUndo(strResource, element, editStackSnapshot, checkInvalidatedResources) {\n        if (element.removedResources) {\n            return this._tryToSplitAndUndo(strResource, element, element.removedResources, localize(2032, \"Could not undo '{0}' across all files. {1}\", element.label, element.removedResources.createMessage()));\n        }\n        if (checkInvalidatedResources && element.invalidatedResources) {\n            return this._tryToSplitAndUndo(strResource, element, element.invalidatedResources, localize(2033, \"Could not undo '{0}' across all files. {1}\", element.label, element.invalidatedResources.createMessage()));\n        }\n        // this must be the last past element in all the impacted resources!\n        const cannotUndoDueToResources = [];\n        for (const editStack of editStackSnapshot.editStacks) {\n            if (editStack.getClosestPastElement() !== element) {\n                cannotUndoDueToResources.push(editStack.resourceLabel);\n            }\n        }\n        if (cannotUndoDueToResources.length > 0) {\n            return this._tryToSplitAndUndo(strResource, element, null, localize(2034, \"Could not undo '{0}' across all files because changes were made to {1}\", element.label, cannotUndoDueToResources.join(', ')));\n        }\n        const cannotLockDueToResources = [];\n        for (const editStack of editStackSnapshot.editStacks) {\n            if (editStack.locked) {\n                cannotLockDueToResources.push(editStack.resourceLabel);\n            }\n        }\n        if (cannotLockDueToResources.length > 0) {\n            return this._tryToSplitAndUndo(strResource, element, null, localize(2035, \"Could not undo '{0}' across all files because there is already an undo or redo operation running on {1}\", element.label, cannotLockDueToResources.join(', ')));\n        }\n        // check if new stack elements were added in the meantime...\n        if (!editStackSnapshot.isValid()) {\n            return this._tryToSplitAndUndo(strResource, element, null, localize(2036, \"Could not undo '{0}' across all files because an undo or redo operation occurred in the meantime\", element.label));\n        }\n        return null;\n    }\n    _workspaceUndo(strResource, element, undoConfirmed) {\n        const affectedEditStacks = this._getAffectedEditStacks(element);\n        const verificationError = this._checkWorkspaceUndo(strResource, element, affectedEditStacks, /*invalidated resources will be checked after the prepare call*/ false);\n        if (verificationError) {\n            return verificationError.returnValue;\n        }\n        return this._confirmAndExecuteWorkspaceUndo(strResource, element, affectedEditStacks, undoConfirmed);\n    }\n    _isPartOfUndoGroup(element) {\n        if (!element.groupId) {\n            return false;\n        }\n        // check that there is at least another element with the same groupId ready to be undone\n        for (const [, editStack] of this._editStacks) {\n            const pastElement = editStack.getClosestPastElement();\n            if (!pastElement) {\n                continue;\n            }\n            if (pastElement === element) {\n                const secondPastElement = editStack.getSecondClosestPastElement();\n                if (secondPastElement && secondPastElement.groupId === element.groupId) {\n                    // there is another element with the same group id in the same stack!\n                    return true;\n                }\n            }\n            if (pastElement.groupId === element.groupId) {\n                // there is another element with the same group id in another stack!\n                return true;\n            }\n        }\n        return false;\n    }\n    async _confirmAndExecuteWorkspaceUndo(strResource, element, editStackSnapshot, undoConfirmed) {\n        if (element.canSplit() && !this._isPartOfUndoGroup(element)) {\n            // this element can be split\n            let UndoChoice;\n            (function (UndoChoice) {\n                UndoChoice[UndoChoice[\"All\"] = 0] = \"All\";\n                UndoChoice[UndoChoice[\"This\"] = 1] = \"This\";\n                UndoChoice[UndoChoice[\"Cancel\"] = 2] = \"Cancel\";\n            })(UndoChoice || (UndoChoice = {}));\n            const { result } = await this._dialogService.prompt({\n                type: Severity.Info,\n                message: localize(2037, \"Would you like to undo '{0}' across all files?\", element.label),\n                buttons: [\n                    {\n                        label: localize(2038, \"&&Undo in {0} Files\", editStackSnapshot.editStacks.length),\n                        run: () => UndoChoice.All\n                    },\n                    {\n                        label: localize(2039, \"Undo this &&File\"),\n                        run: () => UndoChoice.This\n                    }\n                ],\n                cancelButton: {\n                    run: () => UndoChoice.Cancel\n                }\n            });\n            if (result === UndoChoice.Cancel) {\n                // choice: cancel\n                return;\n            }\n            if (result === UndoChoice.This) {\n                // choice: undo this file\n                this._splitPastWorkspaceElement(element, null);\n                return this._undo(strResource, 0, true);\n            }\n            // choice: undo in all files\n            // At this point, it is possible that the element has been made invalid in the meantime (due to the confirmation await)\n            const verificationError1 = this._checkWorkspaceUndo(strResource, element, editStackSnapshot, /*invalidated resources will be checked after the prepare call*/ false);\n            if (verificationError1) {\n                return verificationError1.returnValue;\n            }\n            undoConfirmed = true;\n        }\n        // prepare\n        let cleanup;\n        try {\n            cleanup = await this._invokeWorkspacePrepare(element);\n        }\n        catch (err) {\n            return this._onError(err, element);\n        }\n        // At this point, it is possible that the element has been made invalid in the meantime (due to the prepare await)\n        const verificationError2 = this._checkWorkspaceUndo(strResource, element, editStackSnapshot, /*now also check that there are no more invalidated resources*/ true);\n        if (verificationError2) {\n            cleanup.dispose();\n            return verificationError2.returnValue;\n        }\n        for (const editStack of editStackSnapshot.editStacks) {\n            editStack.moveBackward(element);\n        }\n        return this._safeInvokeWithLocks(element, () => element.actual.undo(), editStackSnapshot, cleanup, () => this._continueUndoInGroup(element.groupId, undoConfirmed));\n    }\n    _resourceUndo(editStack, element, undoConfirmed) {\n        if (!element.isValid) {\n            // invalid element => immediately flush edit stack!\n            editStack.flushAllElements();\n            return;\n        }\n        if (editStack.locked) {\n            const message = localize(2040, \"Could not undo '{0}' because there is already an undo or redo operation running.\", element.label);\n            this._notificationService.warn(message);\n            return;\n        }\n        return this._invokeResourcePrepare(element, (cleanup) => {\n            editStack.moveBackward(element);\n            return this._safeInvokeWithLocks(element, () => element.actual.undo(), new EditStackSnapshot([editStack]), cleanup, () => this._continueUndoInGroup(element.groupId, undoConfirmed));\n        });\n    }\n    _findClosestUndoElementInGroup(groupId) {\n        if (!groupId) {\n            return [null, null];\n        }\n        // find another element with the same groupId and with the highest groupOrder ready to be undone\n        let matchedElement = null;\n        let matchedStrResource = null;\n        for (const [strResource, editStack] of this._editStacks) {\n            const candidate = editStack.getClosestPastElement();\n            if (!candidate) {\n                continue;\n            }\n            if (candidate.groupId === groupId) {\n                if (!matchedElement || candidate.groupOrder > matchedElement.groupOrder) {\n                    matchedElement = candidate;\n                    matchedStrResource = strResource;\n                }\n            }\n        }\n        return [matchedElement, matchedStrResource];\n    }\n    _continueUndoInGroup(groupId, undoConfirmed) {\n        if (!groupId) {\n            return;\n        }\n        const [, matchedStrResource] = this._findClosestUndoElementInGroup(groupId);\n        if (matchedStrResource) {\n            return this._undo(matchedStrResource, 0, undoConfirmed);\n        }\n    }\n    undo(resourceOrSource) {\n        if (resourceOrSource instanceof UndoRedoSource) {\n            const [, matchedStrResource] = this._findClosestUndoElementWithSource(resourceOrSource.id);\n            return matchedStrResource ? this._undo(matchedStrResource, resourceOrSource.id, false) : undefined;\n        }\n        if (typeof resourceOrSource === 'string') {\n            return this._undo(resourceOrSource, 0, false);\n        }\n        return this._undo(this.getUriComparisonKey(resourceOrSource), 0, false);\n    }\n    _undo(strResource, sourceId = 0, undoConfirmed) {\n        if (!this._editStacks.has(strResource)) {\n            return;\n        }\n        const editStack = this._editStacks.get(strResource);\n        const element = editStack.getClosestPastElement();\n        if (!element) {\n            return;\n        }\n        if (element.groupId) {\n            // this element is a part of a group, we need to make sure undoing in a group is in order\n            const [matchedElement, matchedStrResource] = this._findClosestUndoElementInGroup(element.groupId);\n            if (element !== matchedElement && matchedStrResource) {\n                // there is an element in the same group that should be undone before this one\n                return this._undo(matchedStrResource, sourceId, undoConfirmed);\n            }\n        }\n        const shouldPromptForConfirmation = (element.sourceId !== sourceId || element.confirmBeforeUndo);\n        if (shouldPromptForConfirmation && !undoConfirmed) {\n            // Hit a different source or the element asks for prompt before undo, prompt for confirmation\n            return this._confirmAndContinueUndo(strResource, sourceId, element);\n        }\n        try {\n            if (element.type === 1 /* UndoRedoElementType.Workspace */) {\n                return this._workspaceUndo(strResource, element, undoConfirmed);\n            }\n            else {\n                return this._resourceUndo(editStack, element, undoConfirmed);\n            }\n        }\n        finally {\n        }\n    }\n    async _confirmAndContinueUndo(strResource, sourceId, element) {\n        const result = await this._dialogService.confirm({\n            message: localize(2041, \"Would you like to undo '{0}'?\", element.label),\n            primaryButton: localize(2042, \"&&Yes\"),\n            cancelButton: localize(2043, \"No\")\n        });\n        if (!result.confirmed) {\n            return;\n        }\n        return this._undo(strResource, sourceId, true);\n    }\n    _findClosestRedoElementWithSource(sourceId) {\n        if (!sourceId) {\n            return [null, null];\n        }\n        // find an element with sourceId and with the lowest sourceOrder ready to be redone\n        let matchedElement = null;\n        let matchedStrResource = null;\n        for (const [strResource, editStack] of this._editStacks) {\n            const candidate = editStack.getClosestFutureElement();\n            if (!candidate) {\n                continue;\n            }\n            if (candidate.sourceId === sourceId) {\n                if (!matchedElement || candidate.sourceOrder < matchedElement.sourceOrder) {\n                    matchedElement = candidate;\n                    matchedStrResource = strResource;\n                }\n            }\n        }\n        return [matchedElement, matchedStrResource];\n    }\n    canRedo(resourceOrSource) {\n        if (resourceOrSource instanceof UndoRedoSource) {\n            const [, matchedStrResource] = this._findClosestRedoElementWithSource(resourceOrSource.id);\n            return matchedStrResource ? true : false;\n        }\n        const strResource = this.getUriComparisonKey(resourceOrSource);\n        if (this._editStacks.has(strResource)) {\n            const editStack = this._editStacks.get(strResource);\n            return editStack.hasFutureElements();\n        }\n        return false;\n    }\n    _tryToSplitAndRedo(strResource, element, ignoreResources, message) {\n        if (element.canSplit()) {\n            this._splitFutureWorkspaceElement(element, ignoreResources);\n            this._notificationService.warn(message);\n            return new WorkspaceVerificationError(this._redo(strResource));\n        }\n        else {\n            // Cannot safely split this workspace element => flush all undo/redo stacks\n            for (const strResource of element.strResources) {\n                this.removeElements(strResource);\n            }\n            this._notificationService.warn(message);\n            return new WorkspaceVerificationError();\n        }\n    }\n    _checkWorkspaceRedo(strResource, element, editStackSnapshot, checkInvalidatedResources) {\n        if (element.removedResources) {\n            return this._tryToSplitAndRedo(strResource, element, element.removedResources, localize(2044, \"Could not redo '{0}' across all files. {1}\", element.label, element.removedResources.createMessage()));\n        }\n        if (checkInvalidatedResources && element.invalidatedResources) {\n            return this._tryToSplitAndRedo(strResource, element, element.invalidatedResources, localize(2045, \"Could not redo '{0}' across all files. {1}\", element.label, element.invalidatedResources.createMessage()));\n        }\n        // this must be the last future element in all the impacted resources!\n        const cannotRedoDueToResources = [];\n        for (const editStack of editStackSnapshot.editStacks) {\n            if (editStack.getClosestFutureElement() !== element) {\n                cannotRedoDueToResources.push(editStack.resourceLabel);\n            }\n        }\n        if (cannotRedoDueToResources.length > 0) {\n            return this._tryToSplitAndRedo(strResource, element, null, localize(2046, \"Could not redo '{0}' across all files because changes were made to {1}\", element.label, cannotRedoDueToResources.join(', ')));\n        }\n        const cannotLockDueToResources = [];\n        for (const editStack of editStackSnapshot.editStacks) {\n            if (editStack.locked) {\n                cannotLockDueToResources.push(editStack.resourceLabel);\n            }\n        }\n        if (cannotLockDueToResources.length > 0) {\n            return this._tryToSplitAndRedo(strResource, element, null, localize(2047, \"Could not redo '{0}' across all files because there is already an undo or redo operation running on {1}\", element.label, cannotLockDueToResources.join(', ')));\n        }\n        // check if new stack elements were added in the meantime...\n        if (!editStackSnapshot.isValid()) {\n            return this._tryToSplitAndRedo(strResource, element, null, localize(2048, \"Could not redo '{0}' across all files because an undo or redo operation occurred in the meantime\", element.label));\n        }\n        return null;\n    }\n    _workspaceRedo(strResource, element) {\n        const affectedEditStacks = this._getAffectedEditStacks(element);\n        const verificationError = this._checkWorkspaceRedo(strResource, element, affectedEditStacks, /*invalidated resources will be checked after the prepare call*/ false);\n        if (verificationError) {\n            return verificationError.returnValue;\n        }\n        return this._executeWorkspaceRedo(strResource, element, affectedEditStacks);\n    }\n    async _executeWorkspaceRedo(strResource, element, editStackSnapshot) {\n        // prepare\n        let cleanup;\n        try {\n            cleanup = await this._invokeWorkspacePrepare(element);\n        }\n        catch (err) {\n            return this._onError(err, element);\n        }\n        // At this point, it is possible that the element has been made invalid in the meantime (due to the prepare await)\n        const verificationError = this._checkWorkspaceRedo(strResource, element, editStackSnapshot, /*now also check that there are no more invalidated resources*/ true);\n        if (verificationError) {\n            cleanup.dispose();\n            return verificationError.returnValue;\n        }\n        for (const editStack of editStackSnapshot.editStacks) {\n            editStack.moveForward(element);\n        }\n        return this._safeInvokeWithLocks(element, () => element.actual.redo(), editStackSnapshot, cleanup, () => this._continueRedoInGroup(element.groupId));\n    }\n    _resourceRedo(editStack, element) {\n        if (!element.isValid) {\n            // invalid element => immediately flush edit stack!\n            editStack.flushAllElements();\n            return;\n        }\n        if (editStack.locked) {\n            const message = localize(2049, \"Could not redo '{0}' because there is already an undo or redo operation running.\", element.label);\n            this._notificationService.warn(message);\n            return;\n        }\n        return this._invokeResourcePrepare(element, (cleanup) => {\n            editStack.moveForward(element);\n            return this._safeInvokeWithLocks(element, () => element.actual.redo(), new EditStackSnapshot([editStack]), cleanup, () => this._continueRedoInGroup(element.groupId));\n        });\n    }\n    _findClosestRedoElementInGroup(groupId) {\n        if (!groupId) {\n            return [null, null];\n        }\n        // find another element with the same groupId and with the lowest groupOrder ready to be redone\n        let matchedElement = null;\n        let matchedStrResource = null;\n        for (const [strResource, editStack] of this._editStacks) {\n            const candidate = editStack.getClosestFutureElement();\n            if (!candidate) {\n                continue;\n            }\n            if (candidate.groupId === groupId) {\n                if (!matchedElement || candidate.groupOrder < matchedElement.groupOrder) {\n                    matchedElement = candidate;\n                    matchedStrResource = strResource;\n                }\n            }\n        }\n        return [matchedElement, matchedStrResource];\n    }\n    _continueRedoInGroup(groupId) {\n        if (!groupId) {\n            return;\n        }\n        const [, matchedStrResource] = this._findClosestRedoElementInGroup(groupId);\n        if (matchedStrResource) {\n            return this._redo(matchedStrResource);\n        }\n    }\n    redo(resourceOrSource) {\n        if (resourceOrSource instanceof UndoRedoSource) {\n            const [, matchedStrResource] = this._findClosestRedoElementWithSource(resourceOrSource.id);\n            return matchedStrResource ? this._redo(matchedStrResource) : undefined;\n        }\n        if (typeof resourceOrSource === 'string') {\n            return this._redo(resourceOrSource);\n        }\n        return this._redo(this.getUriComparisonKey(resourceOrSource));\n    }\n    _redo(strResource) {\n        if (!this._editStacks.has(strResource)) {\n            return;\n        }\n        const editStack = this._editStacks.get(strResource);\n        const element = editStack.getClosestFutureElement();\n        if (!element) {\n            return;\n        }\n        if (element.groupId) {\n            // this element is a part of a group, we need to make sure redoing in a group is in order\n            const [matchedElement, matchedStrResource] = this._findClosestRedoElementInGroup(element.groupId);\n            if (element !== matchedElement && matchedStrResource) {\n                // there is an element in the same group that should be redone before this one\n                return this._redo(matchedStrResource);\n            }\n        }\n        try {\n            if (element.type === 1 /* UndoRedoElementType.Workspace */) {\n                return this._workspaceRedo(strResource, element);\n            }\n            else {\n                return this._resourceRedo(editStack, element);\n            }\n        }\n        finally {\n        }\n    }\n};\nUndoRedoService = __decorate([\n    __param(0, IDialogService),\n    __param(1, INotificationService)\n], UndoRedoService);\nclass WorkspaceVerificationError {\n    constructor(returnValue) {\n        this.returnValue = returnValue;\n    }\n}\nregisterSingleton(IUndoRedoService, UndoRedoService, 1 /* InstantiationType.Delayed */);\n\nexport { UndoRedoService };\n","import { Disposable } from '../../../base/common/lifecycle.js';\nimport { ILanguageService } from '../languages/language.js';\nimport { IThemeService } from '../../../platform/theme/common/themeService.js';\nimport { ILogService } from '../../../platform/log/common/log.js';\nimport { SemanticTokensProviderStyling } from './semanticTokensProviderStyling.js';\nimport { ISemanticTokensStylingService } from './semanticTokensStyling.js';\nimport { registerSingleton } from '../../../platform/instantiation/common/extensions.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet SemanticTokensStylingService = class SemanticTokensStylingService extends Disposable {\n    constructor(_themeService, _logService, _languageService) {\n        super();\n        this._themeService = _themeService;\n        this._logService = _logService;\n        this._languageService = _languageService;\n        this._caches = new WeakMap();\n        this._register(this._themeService.onDidColorThemeChange(() => {\n            this._caches = new WeakMap();\n        }));\n    }\n    getStyling(provider) {\n        if (!this._caches.has(provider)) {\n            this._caches.set(provider, new SemanticTokensProviderStyling(provider.getLegend(), this._themeService, this._languageService, this._logService));\n        }\n        return this._caches.get(provider);\n    }\n};\nSemanticTokensStylingService = __decorate([\n    __param(0, IThemeService),\n    __param(1, ILogService),\n    __param(2, ILanguageService)\n], SemanticTokensStylingService);\nregisterSingleton(ISemanticTokensStylingService, SemanticTokensStylingService, 1 /* InstantiationType.Delayed */);\n\nexport { SemanticTokensStylingService };\n","import { Emitter } from '../../base/common/event.js';\nimport { toDisposable } from '../../base/common/lifecycle.js';\nimport { shouldSynchronizeModel } from './model.js';\nimport { score } from './languageSelector.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction isExclusive(selector) {\n    if (typeof selector === 'string') {\n        return false;\n    }\n    else if (Array.isArray(selector)) {\n        return selector.every(isExclusive);\n    }\n    else {\n        return !!selector.exclusive; // TODO: microsoft/TypeScript#42768\n    }\n}\nclass MatchCandidate {\n    constructor(uri, languageId, notebookUri, notebookType, recursive) {\n        this.uri = uri;\n        this.languageId = languageId;\n        this.notebookUri = notebookUri;\n        this.notebookType = notebookType;\n        this.recursive = recursive;\n    }\n    equals(other) {\n        return this.notebookType === other.notebookType\n            && this.languageId === other.languageId\n            && this.uri.toString() === other.uri.toString()\n            && this.notebookUri?.toString() === other.notebookUri?.toString()\n            && this.recursive === other.recursive;\n    }\n}\nclass LanguageFeatureRegistry {\n    get onDidChange() { return this._onDidChange.event; }\n    constructor(_notebookInfoResolver) {\n        this._notebookInfoResolver = _notebookInfoResolver;\n        this._clock = 0;\n        this._entries = [];\n        this._onDidChange = new Emitter();\n    }\n    register(selector, provider) {\n        let entry = {\n            selector,\n            provider,\n            _score: -1,\n            _time: this._clock++\n        };\n        this._entries.push(entry);\n        this._lastCandidate = undefined;\n        this._onDidChange.fire(this._entries.length);\n        return toDisposable(() => {\n            if (entry) {\n                const idx = this._entries.indexOf(entry);\n                if (idx >= 0) {\n                    this._entries.splice(idx, 1);\n                    this._lastCandidate = undefined;\n                    this._onDidChange.fire(this._entries.length);\n                    entry = undefined;\n                }\n            }\n        });\n    }\n    has(model) {\n        return this.all(model).length > 0;\n    }\n    all(model) {\n        if (!model) {\n            return [];\n        }\n        this._updateScores(model, false);\n        const result = [];\n        // from registry\n        for (const entry of this._entries) {\n            if (entry._score > 0) {\n                result.push(entry.provider);\n            }\n        }\n        return result;\n    }\n    ordered(model, recursive = false) {\n        const result = [];\n        this._orderedForEach(model, recursive, entry => result.push(entry.provider));\n        return result;\n    }\n    orderedGroups(model) {\n        const result = [];\n        let lastBucket;\n        let lastBucketScore;\n        this._orderedForEach(model, false, entry => {\n            if (lastBucket && lastBucketScore === entry._score) {\n                lastBucket.push(entry.provider);\n            }\n            else {\n                lastBucketScore = entry._score;\n                lastBucket = [entry.provider];\n                result.push(lastBucket);\n            }\n        });\n        return result;\n    }\n    _orderedForEach(model, recursive, callback) {\n        this._updateScores(model, recursive);\n        for (const entry of this._entries) {\n            if (entry._score > 0) {\n                callback(entry);\n            }\n        }\n    }\n    _updateScores(model, recursive) {\n        const notebookInfo = this._notebookInfoResolver?.(model.uri);\n        // use the uri (scheme, pattern) of the notebook info iff we have one\n        // otherwise it's the model's/document's uri\n        const candidate = notebookInfo\n            ? new MatchCandidate(model.uri, model.getLanguageId(), notebookInfo.uri, notebookInfo.type, recursive)\n            : new MatchCandidate(model.uri, model.getLanguageId(), undefined, undefined, recursive);\n        if (this._lastCandidate?.equals(candidate)) {\n            // nothing has changed\n            return;\n        }\n        this._lastCandidate = candidate;\n        for (const entry of this._entries) {\n            entry._score = score(entry.selector, candidate.uri, candidate.languageId, shouldSynchronizeModel(model), candidate.notebookUri, candidate.notebookType);\n            if (isExclusive(entry.selector) && entry._score > 0) {\n                if (recursive) {\n                    entry._score = 0;\n                }\n                else {\n                    // support for one exclusive selector that overwrites\n                    // any other selector\n                    for (const entry of this._entries) {\n                        entry._score = 0;\n                    }\n                    entry._score = 1000;\n                    break;\n                }\n            }\n        }\n        // needs sorting\n        this._entries.sort(LanguageFeatureRegistry._compareByScoreAndTime);\n    }\n    static _compareByScoreAndTime(a, b) {\n        if (a._score < b._score) {\n            return 1;\n        }\n        else if (a._score > b._score) {\n            return -1;\n        }\n        // De-prioritize built-in providers\n        if (isBuiltinSelector(a.selector) && !isBuiltinSelector(b.selector)) {\n            return 1;\n        }\n        else if (!isBuiltinSelector(a.selector) && isBuiltinSelector(b.selector)) {\n            return -1;\n        }\n        if (a._time < b._time) {\n            return 1;\n        }\n        else if (a._time > b._time) {\n            return -1;\n        }\n        else {\n            return 0;\n        }\n    }\n}\nfunction isBuiltinSelector(selector) {\n    if (typeof selector === 'string') {\n        return false;\n    }\n    if (Array.isArray(selector)) {\n        return selector.some(isBuiltinSelector);\n    }\n    return Boolean(selector.isBuiltin);\n}\n\nexport { LanguageFeatureRegistry };\n","import { LanguageFeatureRegistry } from '../languageFeatureRegistry.js';\nimport { ILanguageFeaturesService } from './languageFeatures.js';\nimport { registerSingleton } from '../../../platform/instantiation/common/extensions.js';\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 *--------------------------------------------------------------------------------------------*/\nclass LanguageFeaturesService {\n    constructor() {\n        this.referenceProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.renameProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.newSymbolNamesProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.codeActionProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.definitionProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.typeDefinitionProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.declarationProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.implementationProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.documentSymbolProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.inlayHintsProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.colorProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.codeLensProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.documentFormattingEditProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.documentRangeFormattingEditProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.onTypeFormattingEditProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.signatureHelpProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.hoverProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.documentHighlightProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.multiDocumentHighlightProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.selectionRangeProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.foldingRangeProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.linkProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.inlineCompletionsProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.completionProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.linkedEditingRangeProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.documentRangeSemanticTokensProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.documentSemanticTokensProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.documentDropEditProvider = new LanguageFeatureRegistry(this._score.bind(this));\n        this.documentPasteEditProvider = new LanguageFeatureRegistry(this._score.bind(this));\n    }\n    _score(uri) {\n        return this._notebookTypeResolver?.(uri);\n    }\n}\nregisterSingleton(ILanguageFeaturesService, LanguageFeaturesService, 1 /* InstantiationType.Delayed */);\n\nexport { LanguageFeaturesService };\n","import './hover.css';\nimport { DisposableStore, MutableDisposable } from '../../../base/common/lifecycle.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { getWindow, $ as $$1, addDisposableListener, isHTMLElement, prepend, append, getDomNodeZoomLevel } from '../../../base/browser/dom.js';\nimport { IKeybindingService } from '../../keybinding/common/keybinding.js';\nimport { IConfigurationService } from '../../configuration/common/configuration.js';\nimport { HoverWidget as HoverWidget$1, HoverAction, getHoverAccessibleViewHint } from '../../../base/browser/ui/hover/hoverWidget.js';\nimport { Widget } from '../../../base/browser/ui/widget.js';\nimport { IMarkdownRendererService } from '../../markdown/browser/markdownRenderer.js';\nimport { isMarkdownString } from '../../../base/common/htmlContent.js';\nimport { localize } from '../../../nls.js';\nimport { isMacintosh } from '../../../base/common/platform.js';\nimport { IAccessibilityService } from '../../accessibility/common/accessibility.js';\nimport { status } from '../../../base/browser/ui/aria/aria.js';\nimport { TimeoutTimer } from '../../../base/common/async.js';\nimport { isNumber } from '../../../base/common/types.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst $ = $$1;\nlet HoverWidget = class HoverWidget extends Widget {\n    get _targetWindow() {\n        return getWindow(this._target.targetElements[0]);\n    }\n    get _targetDocumentElement() {\n        return getWindow(this._target.targetElements[0]).document.documentElement;\n    }\n    get isDisposed() { return this._isDisposed; }\n    get isMouseIn() { return this._lockMouseTracker.isMouseIn; }\n    get domNode() { return this._hover.containerDomNode; }\n    get onDispose() { return this._onDispose.event; }\n    get onRequestLayout() { return this._onRequestLayout.event; }\n    get anchor() { return this._hoverPosition === 2 /* HoverPosition.BELOW */ ? 0 /* AnchorPosition.BELOW */ : 1 /* AnchorPosition.ABOVE */; }\n    get x() { return this._x; }\n    get y() { return this._y; }\n    /**\n     * Whether the hover is \"locked\" by holding the alt/option key. When locked, the hover will not\n     * hide and can be hovered regardless of whether the `hideOnHover` hover option is set.\n     */\n    get isLocked() { return this._isLocked; }\n    set isLocked(value) {\n        if (this._isLocked === value) {\n            return;\n        }\n        this._isLocked = value;\n        this._hoverContainer.classList.toggle('locked', this._isLocked);\n    }\n    constructor(options, _keybindingService, _configurationService, _markdownRenderer, _accessibilityService) {\n        super();\n        this._keybindingService = _keybindingService;\n        this._configurationService = _configurationService;\n        this._markdownRenderer = _markdownRenderer;\n        this._accessibilityService = _accessibilityService;\n        this._messageListeners = new DisposableStore();\n        this._isDisposed = false;\n        this._forcePosition = false;\n        this._x = 0;\n        this._y = 0;\n        this._isLocked = false;\n        this._enableFocusTraps = false;\n        this._addedFocusTrap = false;\n        this._maxHeightRatioRelativeToWindow = 0.5;\n        this._onDispose = this._register(new Emitter());\n        this._onRequestLayout = this._register(new Emitter());\n        this._linkHandler = options.linkHandler;\n        this._target = 'targetElements' in options.target ? options.target : new ElementHoverTarget(options.target);\n        if (options.style) {\n            switch (options.style) {\n                case 1 /* HoverStyle.Pointer */: {\n                    options.appearance ??= {};\n                    options.appearance.compact ??= true;\n                    options.appearance.showPointer ??= true;\n                    break;\n                }\n                case 2 /* HoverStyle.Mouse */: {\n                    options.appearance ??= {};\n                    options.appearance.compact ??= true;\n                    break;\n                }\n            }\n        }\n        this._hoverPointer = options.appearance?.showPointer ? $('div.workbench-hover-pointer') : undefined;\n        this._hover = this._register(new HoverWidget$1(!options.appearance?.skipFadeInAnimation));\n        this._hover.containerDomNode.classList.add('workbench-hover');\n        if (options.appearance?.compact) {\n            this._hover.containerDomNode.classList.add('workbench-hover', 'compact');\n        }\n        if (options.additionalClasses) {\n            this._hover.containerDomNode.classList.add(...options.additionalClasses);\n        }\n        if (options.position?.forcePosition) {\n            this._forcePosition = true;\n        }\n        if (options.trapFocus) {\n            this._enableFocusTraps = true;\n        }\n        const maxHeightRatio = options.appearance?.maxHeightRatio;\n        if (maxHeightRatio !== undefined && maxHeightRatio > 0 && maxHeightRatio <= 1) {\n            this._maxHeightRatioRelativeToWindow = maxHeightRatio;\n        }\n        // Default to position above when the position is unspecified or a mouse event\n        this._hoverPosition = options.position?.hoverPosition === undefined\n            ? 3 /* HoverPosition.ABOVE */\n            : isNumber(options.position.hoverPosition)\n                ? options.position.hoverPosition\n                : 2 /* HoverPosition.BELOW */;\n        // Don't allow mousedown out of the widget, otherwise preventDefault will call and text will\n        // not be selected.\n        this.onmousedown(this._hover.containerDomNode, e => e.stopPropagation());\n        // Hide hover on escape\n        this.onkeydown(this._hover.containerDomNode, e => {\n            if (e.equals(9 /* KeyCode.Escape */)) {\n                this.dispose();\n            }\n        });\n        // Hide when the window loses focus\n        this._register(addDisposableListener(this._targetWindow, 'blur', () => this.dispose()));\n        const rowElement = $('div.hover-row.markdown-hover');\n        const contentsElement = $('div.hover-contents');\n        if (typeof options.content === 'string') {\n            contentsElement.textContent = options.content;\n            contentsElement.style.whiteSpace = 'pre-wrap';\n        }\n        else if (isHTMLElement(options.content)) {\n            contentsElement.appendChild(options.content);\n            contentsElement.classList.add('html-hover-contents');\n        }\n        else {\n            const markdown = options.content;\n            const { element } = this._register(this._markdownRenderer.render(markdown, {\n                actionHandler: this._linkHandler,\n                asyncRenderCallback: () => {\n                    contentsElement.classList.add('code-hover-contents');\n                    this.layout();\n                    // This changes the dimensions of the hover so trigger a layout\n                    this._onRequestLayout.fire();\n                }\n            }));\n            contentsElement.appendChild(element);\n        }\n        rowElement.appendChild(contentsElement);\n        this._hover.contentsDomNode.appendChild(rowElement);\n        if (options.actions && options.actions.length > 0) {\n            const statusBarElement = $('div.hover-row.status-bar');\n            const actionsElement = $('div.actions');\n            options.actions.forEach(action => {\n                const keybinding = this._keybindingService.lookupKeybinding(action.commandId);\n                const keybindingLabel = keybinding ? keybinding.getLabel() : null;\n                this._register(HoverAction.render(actionsElement, {\n                    label: action.label,\n                    commandId: action.commandId,\n                    run: e => {\n                        action.run(e);\n                        this.dispose();\n                    },\n                    iconClass: action.iconClass\n                }, keybindingLabel));\n            });\n            statusBarElement.appendChild(actionsElement);\n            this._hover.containerDomNode.appendChild(statusBarElement);\n        }\n        this._hoverContainer = $('div.workbench-hover-container');\n        if (this._hoverPointer) {\n            this._hoverContainer.appendChild(this._hoverPointer);\n        }\n        this._hoverContainer.appendChild(this._hover.containerDomNode);\n        // Determine whether to hide on hover\n        let hideOnHover;\n        if (options.actions && options.actions.length > 0) {\n            // If there are actions, require hover so they can be accessed\n            hideOnHover = false;\n        }\n        else {\n            if (options.persistence?.hideOnHover === undefined) {\n                // When unset, will default to true when it's a string or when it's markdown that\n                // appears to have a link using a naive check for '](' and '</a>'\n                hideOnHover = typeof options.content === 'string' ||\n                    isMarkdownString(options.content) && !options.content.value.includes('](') && !options.content.value.includes('</a>');\n            }\n            else {\n                // It's set explicitly\n                hideOnHover = options.persistence.hideOnHover;\n            }\n        }\n        // Show the hover hint if needed\n        if (options.appearance?.showHoverHint) {\n            const statusBarElement = $('div.hover-row.status-bar');\n            const infoElement = $('div.info');\n            infoElement.textContent = localize(1699, 'Hold {0} key to mouse over', isMacintosh ? 'Option' : 'Alt');\n            statusBarElement.appendChild(infoElement);\n            this._hover.containerDomNode.appendChild(statusBarElement);\n        }\n        const mouseTrackerTargets = [...this._target.targetElements];\n        if (!hideOnHover) {\n            mouseTrackerTargets.push(this._hoverContainer);\n        }\n        const mouseTracker = this._register(new CompositeMouseTracker(mouseTrackerTargets));\n        this._register(mouseTracker.onMouseOut(() => {\n            if (!this._isLocked) {\n                this.dispose();\n            }\n        }));\n        // Setup another mouse tracker when hideOnHover is set in order to track the hover as well\n        // when it is locked. This ensures the hover will hide on mouseout after alt has been\n        // released to unlock the element.\n        if (hideOnHover) {\n            const mouseTracker2Targets = [...this._target.targetElements, this._hoverContainer];\n            this._lockMouseTracker = this._register(new CompositeMouseTracker(mouseTracker2Targets));\n            this._register(this._lockMouseTracker.onMouseOut(() => {\n                if (!this._isLocked) {\n                    this.dispose();\n                }\n            }));\n        }\n        else {\n            this._lockMouseTracker = mouseTracker;\n        }\n    }\n    addFocusTrap() {\n        if (!this._enableFocusTraps || this._addedFocusTrap) {\n            return;\n        }\n        this._addedFocusTrap = true;\n        // Add a hover tab loop if the hover has at least one element with a valid tabIndex\n        const firstContainerFocusElement = this._hover.containerDomNode;\n        const lastContainerFocusElement = this.findLastFocusableChild(this._hover.containerDomNode);\n        if (lastContainerFocusElement) {\n            const beforeContainerFocusElement = prepend(this._hoverContainer, $('div'));\n            const afterContainerFocusElement = append(this._hoverContainer, $('div'));\n            beforeContainerFocusElement.tabIndex = 0;\n            afterContainerFocusElement.tabIndex = 0;\n            this._register(addDisposableListener(afterContainerFocusElement, 'focus', (e) => {\n                firstContainerFocusElement.focus();\n                e.preventDefault();\n            }));\n            this._register(addDisposableListener(beforeContainerFocusElement, 'focus', (e) => {\n                lastContainerFocusElement.focus();\n                e.preventDefault();\n            }));\n        }\n    }\n    findLastFocusableChild(root) {\n        if (root.hasChildNodes()) {\n            for (let i = 0; i < root.childNodes.length; i++) {\n                const node = root.childNodes.item(root.childNodes.length - i - 1);\n                if (node.nodeType === node.ELEMENT_NODE) {\n                    const parsedNode = node;\n                    if (typeof parsedNode.tabIndex === 'number' && parsedNode.tabIndex >= 0) {\n                        return parsedNode;\n                    }\n                }\n                const recursivelyFoundElement = this.findLastFocusableChild(node);\n                if (recursivelyFoundElement) {\n                    return recursivelyFoundElement;\n                }\n            }\n        }\n        return undefined;\n    }\n    render(container) {\n        container.appendChild(this._hoverContainer);\n        const hoverFocused = this._hoverContainer.contains(this._hoverContainer.ownerDocument.activeElement);\n        const accessibleViewHint = hoverFocused && getHoverAccessibleViewHint(this._configurationService.getValue('accessibility.verbosity.hover') === true && this._accessibilityService.isScreenReaderOptimized(), this._keybindingService.lookupKeybinding('editor.action.accessibleView')?.getAriaLabel());\n        if (accessibleViewHint) {\n            status(accessibleViewHint);\n        }\n        this.layout();\n        this.addFocusTrap();\n    }\n    layout() {\n        this._hover.containerDomNode.classList.remove('right-aligned');\n        this._hover.contentsDomNode.style.maxHeight = '';\n        const getZoomAccountedBoundingClientRect = (e) => {\n            const zoom = getDomNodeZoomLevel(e);\n            const boundingRect = e.getBoundingClientRect();\n            return {\n                top: boundingRect.top * zoom,\n                bottom: boundingRect.bottom * zoom,\n                right: boundingRect.right * zoom,\n                left: boundingRect.left * zoom,\n            };\n        };\n        const targetBounds = this._target.targetElements.map(e => getZoomAccountedBoundingClientRect(e));\n        const { top, right, bottom, left } = targetBounds[0];\n        const width = right - left;\n        const height = bottom - top;\n        const targetRect = {\n            top, right, bottom, left, width, height,\n            center: {\n                x: left + (width / 2),\n                y: top + (height / 2)\n            }\n        };\n        // These calls adjust the position depending on spacing.\n        this.adjustHorizontalHoverPosition(targetRect);\n        this.adjustVerticalHoverPosition(targetRect);\n        // This call limits the maximum height of the hover.\n        this.adjustHoverMaxHeight(targetRect);\n        // Offset the hover position if there is a pointer so it aligns with the target element\n        this._hoverContainer.style.padding = '';\n        this._hoverContainer.style.margin = '';\n        if (this._hoverPointer) {\n            switch (this._hoverPosition) {\n                case 1 /* HoverPosition.RIGHT */:\n                    targetRect.left += 3 /* Constants.PointerSize */;\n                    targetRect.right += 3 /* Constants.PointerSize */;\n                    this._hoverContainer.style.paddingLeft = `${3 /* Constants.PointerSize */}px`;\n                    this._hoverContainer.style.marginLeft = `${ -3 /* Constants.PointerSize */}px`;\n                    break;\n                case 0 /* HoverPosition.LEFT */:\n                    targetRect.left -= 3 /* Constants.PointerSize */;\n                    targetRect.right -= 3 /* Constants.PointerSize */;\n                    this._hoverContainer.style.paddingRight = `${3 /* Constants.PointerSize */}px`;\n                    this._hoverContainer.style.marginRight = `${ -3 /* Constants.PointerSize */}px`;\n                    break;\n                case 2 /* HoverPosition.BELOW */:\n                    targetRect.top += 3 /* Constants.PointerSize */;\n                    targetRect.bottom += 3 /* Constants.PointerSize */;\n                    this._hoverContainer.style.paddingTop = `${3 /* Constants.PointerSize */}px`;\n                    this._hoverContainer.style.marginTop = `${ -3 /* Constants.PointerSize */}px`;\n                    break;\n                case 3 /* HoverPosition.ABOVE */:\n                    targetRect.top -= 3 /* Constants.PointerSize */;\n                    targetRect.bottom -= 3 /* Constants.PointerSize */;\n                    this._hoverContainer.style.paddingBottom = `${3 /* Constants.PointerSize */}px`;\n                    this._hoverContainer.style.marginBottom = `${ -3 /* Constants.PointerSize */}px`;\n                    break;\n            }\n            targetRect.center.x = targetRect.left + (width / 2);\n            targetRect.center.y = targetRect.top + (height / 2);\n        }\n        this.computeXCordinate(targetRect);\n        this.computeYCordinate(targetRect);\n        if (this._hoverPointer) {\n            // reset\n            this._hoverPointer.classList.remove('top');\n            this._hoverPointer.classList.remove('left');\n            this._hoverPointer.classList.remove('right');\n            this._hoverPointer.classList.remove('bottom');\n            this.setHoverPointerPosition(targetRect);\n        }\n        this._hover.onContentsChanged();\n    }\n    computeXCordinate(target) {\n        const hoverWidth = this._hover.containerDomNode.clientWidth + 2 /* Constants.HoverBorderWidth */;\n        if (this._target.x !== undefined) {\n            this._x = this._target.x;\n        }\n        else if (this._hoverPosition === 1 /* HoverPosition.RIGHT */) {\n            this._x = target.right;\n        }\n        else if (this._hoverPosition === 0 /* HoverPosition.LEFT */) {\n            this._x = target.left - hoverWidth;\n        }\n        else {\n            if (this._hoverPointer) {\n                this._x = target.center.x - (this._hover.containerDomNode.clientWidth / 2);\n            }\n            else {\n                this._x = target.left;\n            }\n            // Hover is going beyond window towards right end\n            if (this._x + hoverWidth >= this._targetDocumentElement.clientWidth) {\n                this._hover.containerDomNode.classList.add('right-aligned');\n                this._x = Math.max(this._targetDocumentElement.clientWidth - hoverWidth - 2 /* Constants.HoverWindowEdgeMargin */, this._targetDocumentElement.clientLeft);\n            }\n        }\n        // Hover is going beyond window towards left end\n        if (this._x < this._targetDocumentElement.clientLeft) {\n            this._x = target.left + 2 /* Constants.HoverWindowEdgeMargin */;\n        }\n    }\n    computeYCordinate(target) {\n        if (this._target.y !== undefined) {\n            this._y = this._target.y;\n        }\n        else if (this._hoverPosition === 3 /* HoverPosition.ABOVE */) {\n            this._y = target.top;\n        }\n        else if (this._hoverPosition === 2 /* HoverPosition.BELOW */) {\n            this._y = target.bottom - 2;\n        }\n        else {\n            if (this._hoverPointer) {\n                this._y = target.center.y + (this._hover.containerDomNode.clientHeight / 2);\n            }\n            else {\n                this._y = target.bottom;\n            }\n        }\n        // Hover on bottom is going beyond window\n        if (this._y > this._targetWindow.innerHeight) {\n            this._y = target.bottom;\n        }\n    }\n    adjustHorizontalHoverPosition(target) {\n        // Do not adjust horizontal hover position if x cordiante is provided\n        if (this._target.x !== undefined) {\n            return;\n        }\n        const hoverPointerOffset = (this._hoverPointer ? 3 /* Constants.PointerSize */ : 0);\n        // When force position is enabled, restrict max width\n        if (this._forcePosition) {\n            const padding = hoverPointerOffset + 2 /* Constants.HoverBorderWidth */;\n            if (this._hoverPosition === 1 /* HoverPosition.RIGHT */) {\n                this._hover.containerDomNode.style.maxWidth = `${this._targetDocumentElement.clientWidth - target.right - padding}px`;\n            }\n            else if (this._hoverPosition === 0 /* HoverPosition.LEFT */) {\n                this._hover.containerDomNode.style.maxWidth = `${target.left - padding}px`;\n            }\n            return;\n        }\n        // Position hover on right to target\n        if (this._hoverPosition === 1 /* HoverPosition.RIGHT */) {\n            const roomOnRight = this._targetDocumentElement.clientWidth - target.right;\n            // Hover on the right is going beyond window.\n            if (roomOnRight < this._hover.containerDomNode.clientWidth + hoverPointerOffset) {\n                const roomOnLeft = target.left;\n                // There's enough room on the left, flip the hover position\n                if (roomOnLeft >= this._hover.containerDomNode.clientWidth + hoverPointerOffset) {\n                    this._hoverPosition = 0 /* HoverPosition.LEFT */;\n                }\n                // Hover on the left would go beyond window too\n                else {\n                    this._hoverPosition = 2 /* HoverPosition.BELOW */;\n                }\n            }\n        }\n        // Position hover on left to target\n        else if (this._hoverPosition === 0 /* HoverPosition.LEFT */) {\n            const roomOnLeft = target.left;\n            // Hover on the left is going beyond window.\n            if (roomOnLeft < this._hover.containerDomNode.clientWidth + hoverPointerOffset) {\n                const roomOnRight = this._targetDocumentElement.clientWidth - target.right;\n                // There's enough room on the right, flip the hover position\n                if (roomOnRight >= this._hover.containerDomNode.clientWidth + hoverPointerOffset) {\n                    this._hoverPosition = 1 /* HoverPosition.RIGHT */;\n                }\n                // Hover on the right would go beyond window too\n                else {\n                    this._hoverPosition = 2 /* HoverPosition.BELOW */;\n                }\n            }\n            // Hover on the left is going beyond window.\n            if (target.left - this._hover.containerDomNode.clientWidth - hoverPointerOffset <= this._targetDocumentElement.clientLeft) {\n                this._hoverPosition = 1 /* HoverPosition.RIGHT */;\n            }\n        }\n    }\n    adjustVerticalHoverPosition(target) {\n        // Do not adjust vertical hover position if the y coordinate is provided\n        // or the position is forced\n        if (this._target.y !== undefined || this._forcePosition) {\n            return;\n        }\n        const hoverPointerOffset = (this._hoverPointer ? 3 /* Constants.PointerSize */ : 0);\n        // Position hover on top of the target\n        if (this._hoverPosition === 3 /* HoverPosition.ABOVE */) {\n            // Hover on top is going beyond window\n            if (target.top - this._hover.containerDomNode.clientHeight - hoverPointerOffset < 0) {\n                this._hoverPosition = 2 /* HoverPosition.BELOW */;\n            }\n        }\n        // Position hover below the target\n        else if (this._hoverPosition === 2 /* HoverPosition.BELOW */) {\n            // Hover on bottom is going beyond window\n            if (target.bottom + this._hover.containerDomNode.offsetHeight + hoverPointerOffset > this._targetWindow.innerHeight) {\n                this._hoverPosition = 3 /* HoverPosition.ABOVE */;\n            }\n        }\n    }\n    adjustHoverMaxHeight(target) {\n        let maxHeight = this._targetWindow.innerHeight * this._maxHeightRatioRelativeToWindow;\n        // When force position is enabled, restrict max height\n        if (this._forcePosition) {\n            const padding = (this._hoverPointer ? 3 /* Constants.PointerSize */ : 0) + 2 /* Constants.HoverBorderWidth */;\n            if (this._hoverPosition === 3 /* HoverPosition.ABOVE */) {\n                maxHeight = Math.min(maxHeight, target.top - padding);\n            }\n            else if (this._hoverPosition === 2 /* HoverPosition.BELOW */) {\n                maxHeight = Math.min(maxHeight, this._targetWindow.innerHeight - target.bottom - padding);\n            }\n        }\n        this._hover.containerDomNode.style.maxHeight = `${maxHeight}px`;\n        if (this._hover.contentsDomNode.clientHeight < this._hover.contentsDomNode.scrollHeight) {\n            // Add padding for a vertical scrollbar\n            const extraRightPadding = `${this._hover.scrollbar.options.verticalScrollbarSize}px`;\n            if (this._hover.contentsDomNode.style.paddingRight !== extraRightPadding) {\n                this._hover.contentsDomNode.style.paddingRight = extraRightPadding;\n            }\n        }\n    }\n    setHoverPointerPosition(target) {\n        if (!this._hoverPointer) {\n            return;\n        }\n        switch (this._hoverPosition) {\n            case 0 /* HoverPosition.LEFT */:\n            case 1 /* HoverPosition.RIGHT */: {\n                this._hoverPointer.classList.add(this._hoverPosition === 0 /* HoverPosition.LEFT */ ? 'right' : 'left');\n                const hoverHeight = this._hover.containerDomNode.clientHeight;\n                // If hover is taller than target, then show the pointer at the center of target\n                if (hoverHeight > target.height) {\n                    this._hoverPointer.style.top = `${target.center.y - (this._y - hoverHeight) - 3 /* Constants.PointerSize */}px`;\n                }\n                // Otherwise show the pointer at the center of hover\n                else {\n                    this._hoverPointer.style.top = `${Math.round((hoverHeight / 2)) - 3 /* Constants.PointerSize */}px`;\n                }\n                break;\n            }\n            case 3 /* HoverPosition.ABOVE */:\n            case 2 /* HoverPosition.BELOW */: {\n                this._hoverPointer.classList.add(this._hoverPosition === 3 /* HoverPosition.ABOVE */ ? 'bottom' : 'top');\n                const hoverWidth = this._hover.containerDomNode.clientWidth;\n                // Position pointer at the center of the hover\n                let pointerLeftPosition = Math.round((hoverWidth / 2)) - 3 /* Constants.PointerSize */;\n                // If pointer goes beyond target then position it at the center of the target\n                const pointerX = this._x + pointerLeftPosition;\n                if (pointerX < target.left || pointerX > target.right) {\n                    pointerLeftPosition = target.center.x - this._x - 3 /* Constants.PointerSize */;\n                }\n                this._hoverPointer.style.left = `${pointerLeftPosition}px`;\n                break;\n            }\n        }\n    }\n    focus() {\n        this._hover.containerDomNode.focus();\n    }\n    dispose() {\n        if (!this._isDisposed) {\n            this._onDispose.fire();\n            this._target.dispose?.();\n            this._hoverContainer.remove();\n            this._messageListeners.dispose();\n            super.dispose();\n        }\n        this._isDisposed = true;\n    }\n};\nHoverWidget = __decorate([\n    __param(1, IKeybindingService),\n    __param(2, IConfigurationService),\n    __param(3, IMarkdownRendererService),\n    __param(4, IAccessibilityService)\n], HoverWidget);\nclass CompositeMouseTracker extends Widget {\n    get onMouseOut() { return this._onMouseOut.event; }\n    get isMouseIn() { return this._isMouseIn; }\n    /**\n     * @param _elements The target elements to track mouse in/out events on.\n     * @param _eventDebounceDelay The delay in ms to debounce the event firing. This is used to\n     * allow a short period for the mouse to move into the hover or a nearby target element. For\n     * example hovering a scroll bar will not hide the hover immediately.\n     */\n    constructor(_elements, _eventDebounceDelay = 200) {\n        super();\n        this._elements = _elements;\n        this._eventDebounceDelay = _eventDebounceDelay;\n        this._isMouseIn = true;\n        this._mouseTimer = this._register(new MutableDisposable());\n        this._onMouseOut = this._register(new Emitter());\n        for (const element of this._elements) {\n            this.onmouseover(element, () => this._onTargetMouseOver());\n            this.onmouseleave(element, () => this._onTargetMouseLeave());\n        }\n    }\n    _onTargetMouseOver() {\n        this._isMouseIn = true;\n        this._mouseTimer.clear();\n    }\n    _onTargetMouseLeave() {\n        this._isMouseIn = false;\n        // Evaluate whether the mouse is still outside asynchronously such that other mouse targets\n        // have the opportunity to first their mouse in event.\n        this._mouseTimer.value = new TimeoutTimer(() => this._fireIfMouseOutside(), this._eventDebounceDelay);\n    }\n    _fireIfMouseOutside() {\n        if (!this._isMouseIn) {\n            this._onMouseOut.fire();\n        }\n    }\n}\nclass ElementHoverTarget {\n    constructor(_element) {\n        this._element = _element;\n        this.targetElements = [this._element];\n    }\n    dispose() {\n    }\n}\n\nexport { HoverWidget };\n","import { BrowserFeatures } from '../../canIUse.js';\nimport { $, hide, addStandardDisposableListener, clearNode, show, isHTMLElement, getDomNodePagePosition, getDomNodeZoomLevel, getTotalWidth, getTotalHeight, getActiveWindow, getWindow, isAncestor } from '../../dom.js';\nimport { Disposable, toDisposable, DisposableStore } from '../../../common/lifecycle.js';\nimport { isIOS } from '../../../common/platform.js';\nimport { Range } from '../../../common/range.js';\nimport './contextview.css';\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 *--------------------------------------------------------------------------------------------*/\nfunction isAnchor(obj) {\n    const anchor = obj;\n    return !!anchor && typeof anchor.x === 'number' && typeof anchor.y === 'number';\n}\nvar LayoutAnchorMode;\n(function (LayoutAnchorMode) {\n    LayoutAnchorMode[LayoutAnchorMode[\"AVOID\"] = 0] = \"AVOID\";\n    LayoutAnchorMode[LayoutAnchorMode[\"ALIGN\"] = 1] = \"ALIGN\";\n})(LayoutAnchorMode || (LayoutAnchorMode = {}));\n/**\n * Lays out a one dimensional view next to an anchor in a viewport.\n *\n * @returns The view offset within the viewport.\n */\nfunction layout(viewportSize, viewSize, anchor) {\n    const layoutAfterAnchorBoundary = anchor.mode === LayoutAnchorMode.ALIGN ? anchor.offset : anchor.offset + anchor.size;\n    const layoutBeforeAnchorBoundary = anchor.mode === LayoutAnchorMode.ALIGN ? anchor.offset + anchor.size : anchor.offset;\n    if (anchor.position === 0 /* LayoutAnchorPosition.Before */) {\n        if (viewSize <= viewportSize - layoutAfterAnchorBoundary) {\n            return layoutAfterAnchorBoundary; // happy case, lay it out after the anchor\n        }\n        if (viewSize <= layoutBeforeAnchorBoundary) {\n            return layoutBeforeAnchorBoundary - viewSize; // ok case, lay it out before the anchor\n        }\n        return Math.max(viewportSize - viewSize, 0); // sad case, lay it over the anchor\n    }\n    else {\n        if (viewSize <= layoutBeforeAnchorBoundary) {\n            return layoutBeforeAnchorBoundary - viewSize; // happy case, lay it out before the anchor\n        }\n        if (viewSize <= viewportSize - layoutAfterAnchorBoundary) {\n            return layoutAfterAnchorBoundary; // ok case, lay it out after the anchor\n        }\n        return 0; // sad case, lay it over the anchor\n    }\n}\nclass ContextView extends Disposable {\n    static { this.BUBBLE_UP_EVENTS = ['click', 'keydown', 'focus', 'blur']; }\n    static { this.BUBBLE_DOWN_EVENTS = ['click']; }\n    constructor(container, domPosition) {\n        super();\n        this.container = null;\n        this.useFixedPosition = false;\n        this.useShadowDOM = false;\n        this.delegate = null;\n        this.toDisposeOnClean = Disposable.None;\n        this.toDisposeOnSetContainer = Disposable.None;\n        this.shadowRoot = null;\n        this.shadowRootHostElement = null;\n        this.view = $('.context-view');\n        hide(this.view);\n        this.setContainer(container, domPosition);\n        this._register(toDisposable(() => this.setContainer(null, 1 /* ContextViewDOMPosition.ABSOLUTE */)));\n    }\n    setContainer(container, domPosition) {\n        this.useFixedPosition = domPosition !== 1 /* ContextViewDOMPosition.ABSOLUTE */;\n        const usedShadowDOM = this.useShadowDOM;\n        this.useShadowDOM = domPosition === 3 /* ContextViewDOMPosition.FIXED_SHADOW */;\n        if (container === this.container && usedShadowDOM === this.useShadowDOM) {\n            return; // container is the same and no shadow DOM usage has changed\n        }\n        if (this.container) {\n            this.toDisposeOnSetContainer.dispose();\n            this.view.remove();\n            if (this.shadowRoot) {\n                this.shadowRoot = null;\n                this.shadowRootHostElement?.remove();\n                this.shadowRootHostElement = null;\n            }\n            this.container = null;\n        }\n        if (container) {\n            this.container = container;\n            if (this.useShadowDOM) {\n                this.shadowRootHostElement = $('.shadow-root-host');\n                this.container.appendChild(this.shadowRootHostElement);\n                this.shadowRoot = this.shadowRootHostElement.attachShadow({ mode: 'open' });\n                const style = document.createElement('style');\n                style.textContent = SHADOW_ROOT_CSS;\n                this.shadowRoot.appendChild(style);\n                this.shadowRoot.appendChild(this.view);\n                this.shadowRoot.appendChild($('slot'));\n            }\n            else {\n                this.container.appendChild(this.view);\n            }\n            const toDisposeOnSetContainer = new DisposableStore();\n            ContextView.BUBBLE_UP_EVENTS.forEach(event => {\n                toDisposeOnSetContainer.add(addStandardDisposableListener(this.container, event, e => {\n                    this.onDOMEvent(e, false);\n                }));\n            });\n            ContextView.BUBBLE_DOWN_EVENTS.forEach(event => {\n                toDisposeOnSetContainer.add(addStandardDisposableListener(this.container, event, e => {\n                    this.onDOMEvent(e, true);\n                }, true));\n            });\n            this.toDisposeOnSetContainer = toDisposeOnSetContainer;\n        }\n    }\n    show(delegate) {\n        if (this.isVisible()) {\n            this.hide();\n        }\n        // Show static box\n        clearNode(this.view);\n        this.view.className = 'context-view monaco-component';\n        this.view.style.top = '0px';\n        this.view.style.left = '0px';\n        this.view.style.zIndex = `${2575 + (delegate.layer ?? 0)}`;\n        this.view.style.position = this.useFixedPosition ? 'fixed' : 'absolute';\n        show(this.view);\n        // Render content\n        this.toDisposeOnClean = delegate.render(this.view) || Disposable.None;\n        // Set active delegate\n        this.delegate = delegate;\n        // Layout\n        this.doLayout();\n        // Focus\n        this.delegate.focus?.();\n    }\n    getViewElement() {\n        return this.view;\n    }\n    layout() {\n        if (!this.isVisible()) {\n            return;\n        }\n        if (this.delegate.canRelayout === false && !(isIOS && BrowserFeatures.pointerEvents)) {\n            this.hide();\n            return;\n        }\n        this.delegate?.layout?.();\n        this.doLayout();\n    }\n    doLayout() {\n        // Check that we still have a delegate - this.delegate.layout may have hidden\n        if (!this.isVisible()) {\n            return;\n        }\n        // Get anchor\n        const anchor = this.delegate.getAnchor();\n        // Compute around\n        let around;\n        // Get the element's position and size (to anchor the view)\n        if (isHTMLElement(anchor)) {\n            const elementPosition = getDomNodePagePosition(anchor);\n            // In areas where zoom is applied to the element or its ancestors, we need to adjust the size of the element\n            // e.g. The title bar has counter zoom behavior meaning it applies the inverse of zoom level.\n            // Window Zoom Level: 1.5, Title Bar Zoom: 1/1.5, Size Multiplier: 1.5\n            const zoom = getDomNodeZoomLevel(anchor);\n            around = {\n                top: elementPosition.top * zoom,\n                left: elementPosition.left * zoom,\n                width: elementPosition.width * zoom,\n                height: elementPosition.height * zoom\n            };\n        }\n        else if (isAnchor(anchor)) {\n            around = {\n                top: anchor.y,\n                left: anchor.x,\n                width: anchor.width || 1,\n                height: anchor.height || 2\n            };\n        }\n        else {\n            around = {\n                top: anchor.posy,\n                left: anchor.posx,\n                // We are about to position the context view where the mouse\n                // cursor is. To prevent the view being exactly under the mouse\n                // when showing and thus potentially triggering an action within,\n                // we treat the mouse location like a small sized block element.\n                width: 2,\n                height: 2\n            };\n        }\n        const viewSizeWidth = getTotalWidth(this.view);\n        const viewSizeHeight = getTotalHeight(this.view);\n        const anchorPosition = this.delegate.anchorPosition ?? 0 /* AnchorPosition.BELOW */;\n        const anchorAlignment = this.delegate.anchorAlignment ?? 0 /* AnchorAlignment.LEFT */;\n        const anchorAxisAlignment = this.delegate.anchorAxisAlignment ?? 0 /* AnchorAxisAlignment.VERTICAL */;\n        let top;\n        let left;\n        const activeWindow = getActiveWindow();\n        if (anchorAxisAlignment === 0 /* AnchorAxisAlignment.VERTICAL */) {\n            const verticalAnchor = { offset: around.top - activeWindow.pageYOffset, size: around.height, position: anchorPosition === 0 /* AnchorPosition.BELOW */ ? 0 /* LayoutAnchorPosition.Before */ : 1 /* LayoutAnchorPosition.After */ };\n            const horizontalAnchor = { offset: around.left, size: around.width, position: anchorAlignment === 0 /* AnchorAlignment.LEFT */ ? 0 /* LayoutAnchorPosition.Before */ : 1 /* LayoutAnchorPosition.After */, mode: LayoutAnchorMode.ALIGN };\n            top = layout(activeWindow.innerHeight, viewSizeHeight, verticalAnchor) + activeWindow.pageYOffset;\n            // if view intersects vertically with anchor,  we must avoid the anchor\n            if (Range.intersects({ start: top, end: top + viewSizeHeight }, { start: verticalAnchor.offset, end: verticalAnchor.offset + verticalAnchor.size })) {\n                horizontalAnchor.mode = LayoutAnchorMode.AVOID;\n            }\n            left = layout(activeWindow.innerWidth, viewSizeWidth, horizontalAnchor);\n        }\n        else {\n            const horizontalAnchor = { offset: around.left, size: around.width, position: anchorAlignment === 0 /* AnchorAlignment.LEFT */ ? 0 /* LayoutAnchorPosition.Before */ : 1 /* LayoutAnchorPosition.After */ };\n            const verticalAnchor = { offset: around.top, size: around.height, position: anchorPosition === 0 /* AnchorPosition.BELOW */ ? 0 /* LayoutAnchorPosition.Before */ : 1 /* LayoutAnchorPosition.After */, mode: LayoutAnchorMode.ALIGN };\n            left = layout(activeWindow.innerWidth, viewSizeWidth, horizontalAnchor);\n            // if view intersects horizontally with anchor, we must avoid the anchor\n            if (Range.intersects({ start: left, end: left + viewSizeWidth }, { start: horizontalAnchor.offset, end: horizontalAnchor.offset + horizontalAnchor.size })) {\n                verticalAnchor.mode = LayoutAnchorMode.AVOID;\n            }\n            top = layout(activeWindow.innerHeight, viewSizeHeight, verticalAnchor) + activeWindow.pageYOffset;\n        }\n        this.view.classList.remove('top', 'bottom', 'left', 'right');\n        this.view.classList.add(anchorPosition === 0 /* AnchorPosition.BELOW */ ? 'bottom' : 'top');\n        this.view.classList.add(anchorAlignment === 0 /* AnchorAlignment.LEFT */ ? 'left' : 'right');\n        this.view.classList.toggle('fixed', this.useFixedPosition);\n        const containerPosition = getDomNodePagePosition(this.container);\n        // Account for container scroll when positioning the context view\n        const containerScrollTop = this.container.scrollTop || 0;\n        const containerScrollLeft = this.container.scrollLeft || 0;\n        this.view.style.top = `${top - (this.useFixedPosition ? getDomNodePagePosition(this.view).top : containerPosition.top) + containerScrollTop}px`;\n        this.view.style.left = `${left - (this.useFixedPosition ? getDomNodePagePosition(this.view).left : containerPosition.left) + containerScrollLeft}px`;\n        this.view.style.width = 'initial';\n    }\n    hide(data) {\n        const delegate = this.delegate;\n        this.delegate = null;\n        if (delegate?.onHide) {\n            delegate.onHide(data);\n        }\n        this.toDisposeOnClean.dispose();\n        hide(this.view);\n    }\n    isVisible() {\n        return !!this.delegate;\n    }\n    onDOMEvent(e, onCapture) {\n        if (this.delegate) {\n            if (this.delegate.onDOMEvent) {\n                this.delegate.onDOMEvent(e, getWindow(e).document.activeElement);\n            }\n            else if (onCapture && !isAncestor(e.target, this.container)) {\n                this.hide();\n            }\n        }\n    }\n    dispose() {\n        this.hide();\n        super.dispose();\n    }\n}\nconst SHADOW_ROOT_CSS = /* css */ `\n\t:host {\n\t\tall: initial; /* 1st rule so subsequent properties are reset. */\n\t}\n\n\t.codicon[class*='codicon-'] {\n\t\tfont: normal normal normal 16px/1 codicon;\n\t\tdisplay: inline-block;\n\t\ttext-decoration: none;\n\t\ttext-rendering: auto;\n\t\ttext-align: center;\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-moz-osx-font-smoothing: grayscale;\n\t\tuser-select: none;\n\t\t-webkit-user-select: none;\n\t\t-ms-user-select: none;\n\t}\n\n\t:host {\n\t\tfont-family: -apple-system, BlinkMacSystemFont, \"Segoe WPC\", \"Segoe UI\", \"HelveticaNeue-Light\", system-ui, \"Ubuntu\", \"Droid Sans\", sans-serif;\n\t}\n\n\t:host-context(.mac) { font-family: -apple-system, BlinkMacSystemFont, sans-serif; }\n\t:host-context(.mac:lang(zh-Hans)) { font-family: -apple-system, BlinkMacSystemFont, \"PingFang SC\", \"Hiragino Sans GB\", sans-serif; }\n\t:host-context(.mac:lang(zh-Hant)) { font-family: -apple-system, BlinkMacSystemFont, \"PingFang TC\", sans-serif; }\n\t:host-context(.mac:lang(ja)) { font-family: -apple-system, BlinkMacSystemFont, \"Hiragino Kaku Gothic Pro\", sans-serif; }\n\t:host-context(.mac:lang(ko)) { font-family: -apple-system, BlinkMacSystemFont, \"Apple SD Gothic Neo\", \"Nanum Gothic\", \"AppleGothic\", sans-serif; }\n\n\t:host-context(.windows) { font-family: \"Segoe WPC\", \"Segoe UI\", sans-serif; }\n\t:host-context(.windows:lang(zh-Hans)) { font-family: \"Segoe WPC\", \"Segoe UI\", \"Microsoft YaHei\", sans-serif; }\n\t:host-context(.windows:lang(zh-Hant)) { font-family: \"Segoe WPC\", \"Segoe UI\", \"Microsoft Jhenghei\", sans-serif; }\n\t:host-context(.windows:lang(ja)) { font-family: \"Segoe WPC\", \"Segoe UI\", \"Yu Gothic UI\", \"Meiryo UI\", sans-serif; }\n\t:host-context(.windows:lang(ko)) { font-family: \"Segoe WPC\", \"Segoe UI\", \"Malgun Gothic\", \"Dotom\", sans-serif; }\n\n\t:host-context(.linux) { font-family: system-ui, \"Ubuntu\", \"Droid Sans\", sans-serif; }\n\t:host-context(.linux:lang(zh-Hans)) { font-family: system-ui, \"Ubuntu\", \"Droid Sans\", \"Source Han Sans SC\", \"Source Han Sans CN\", \"Source Han Sans\", sans-serif; }\n\t:host-context(.linux:lang(zh-Hant)) { font-family: system-ui, \"Ubuntu\", \"Droid Sans\", \"Source Han Sans TC\", \"Source Han Sans TW\", \"Source Han Sans\", sans-serif; }\n\t:host-context(.linux:lang(ja)) { font-family: system-ui, \"Ubuntu\", \"Droid Sans\", \"Source Han Sans J\", \"Source Han Sans JP\", \"Source Han Sans\", sans-serif; }\n\t:host-context(.linux:lang(ko)) { font-family: system-ui, \"Ubuntu\", \"Droid Sans\", \"Source Han Sans K\", \"Source Han Sans JR\", \"Source Han Sans\", \"UnDotum\", \"FBaekmuk Gulim\", sans-serif; }\n`;\n\nexport { ContextView, LayoutAnchorMode, isAnchor, layout };\n","import { ContextView } from '../../../base/browser/ui/contextview/contextview.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { ILayoutService } from '../../layout/browser/layoutService.js';\nimport { getWindow } from '../../../base/browser/dom.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet ContextViewHandler = class ContextViewHandler extends Disposable {\n    constructor(layoutService) {\n        super();\n        this.layoutService = layoutService;\n        this.contextView = this._register(new ContextView(this.layoutService.mainContainer, 1 /* ContextViewDOMPosition.ABSOLUTE */));\n        this.layout();\n        this._register(layoutService.onDidLayoutContainer(() => this.layout()));\n    }\n    // ContextView\n    showContextView(delegate, container, shadowRoot) {\n        let domPosition;\n        if (container) {\n            if (container === this.layoutService.getContainer(getWindow(container))) {\n                domPosition = 1 /* ContextViewDOMPosition.ABSOLUTE */;\n            }\n            else if (shadowRoot) {\n                domPosition = 3 /* ContextViewDOMPosition.FIXED_SHADOW */;\n            }\n            else {\n                domPosition = 2 /* ContextViewDOMPosition.FIXED */;\n            }\n        }\n        else {\n            domPosition = 1 /* ContextViewDOMPosition.ABSOLUTE */;\n        }\n        this.contextView.setContainer(container ?? this.layoutService.activeContainer, domPosition);\n        this.contextView.show(delegate);\n        const openContextView = {\n            close: () => {\n                if (this.openContextView === openContextView) {\n                    this.hideContextView();\n                }\n            }\n        };\n        this.openContextView = openContextView;\n        return openContextView;\n    }\n    layout() {\n        this.contextView.layout();\n    }\n    hideContextView(data) {\n        this.contextView.hide(data);\n        this.openContextView = undefined;\n    }\n};\nContextViewHandler = __decorate([\n    __param(0, ILayoutService)\n], ContextViewHandler);\nclass ContextViewService extends ContextViewHandler {\n    getContextViewElement() {\n        return this.contextView.getViewElement();\n    }\n}\n\nexport { ContextViewHandler, ContextViewService };\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 *--------------------------------------------------------------------------------------------*/\nfunction isManagedHoverTooltipMarkdownString(obj) {\n    const candidate = obj;\n    return typeof candidate === 'object' && 'markdown' in candidate && 'markdownNotSupportedFallback' in candidate;\n}\n// #endregion Managed hover\n\nexport { isManagedHoverTooltipMarkdownString };\n","import { isHTMLElement } from '../../../base/browser/dom.js';\nimport { isManagedHoverTooltipMarkdownString } from '../../../base/browser/ui/hover/hover.js';\nimport { CancellationTokenSource } from '../../../base/common/cancellation.js';\nimport { isMarkdownString } from '../../../base/common/htmlContent.js';\nimport { isString, isFunction } from '../../../base/common/types.js';\nimport { localize } from '../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ManagedHoverWidget {\n    constructor(hoverDelegate, target, fadeInAnimation) {\n        this.hoverDelegate = hoverDelegate;\n        this.target = target;\n        this.fadeInAnimation = fadeInAnimation;\n    }\n    async update(content, focus, options) {\n        if (this._cancellationTokenSource) {\n            // there's an computation ongoing, cancel it\n            this._cancellationTokenSource.dispose(true);\n            this._cancellationTokenSource = undefined;\n        }\n        if (this.isDisposed) {\n            return;\n        }\n        let resolvedContent;\n        if (isString(content) || isHTMLElement(content) || content === undefined) {\n            resolvedContent = content;\n        }\n        else {\n            // compute the content, potentially long-running\n            this._cancellationTokenSource = new CancellationTokenSource();\n            const token = this._cancellationTokenSource.token;\n            let managedContent;\n            if (isManagedHoverTooltipMarkdownString(content)) {\n                if (isFunction(content.markdown)) {\n                    managedContent = content.markdown(token).then(resolvedContent => resolvedContent ?? content.markdownNotSupportedFallback);\n                }\n                else {\n                    managedContent = content.markdown ?? content.markdownNotSupportedFallback;\n                }\n            }\n            else {\n                managedContent = content.element(token);\n            }\n            // compute the content\n            if (managedContent instanceof Promise) {\n                // show 'Loading' if no hover is up yet\n                if (!this._hoverWidget) {\n                    this.show(localize(1700, \"Loading...\"), focus, options);\n                }\n                resolvedContent = await managedContent;\n            }\n            else {\n                resolvedContent = managedContent;\n            }\n            if (this.isDisposed || token.isCancellationRequested) {\n                // either the widget has been closed in the meantime\n                // or there has been a new call to `update`\n                return;\n            }\n        }\n        this.show(resolvedContent, focus, options);\n    }\n    show(content, focus, options) {\n        const oldHoverWidget = this._hoverWidget;\n        if (this.hasContent(content)) {\n            const hoverOptions = {\n                content,\n                target: this.target,\n                actions: options?.actions,\n                linkHandler: options?.linkHandler,\n                trapFocus: options?.trapFocus,\n                appearance: {\n                    showPointer: this.hoverDelegate.placement === 'element',\n                    skipFadeInAnimation: !this.fadeInAnimation || !!oldHoverWidget, // do not fade in if the hover is already showing\n                    showHoverHint: options?.appearance?.showHoverHint,\n                },\n                position: {\n                    hoverPosition: 2 /* HoverPosition.BELOW */,\n                },\n            };\n            this._hoverWidget = this.hoverDelegate.showHover(hoverOptions, focus);\n        }\n        oldHoverWidget?.dispose();\n    }\n    hasContent(content) {\n        if (!content) {\n            return false;\n        }\n        if (isMarkdownString(content)) {\n            return !!content.value;\n        }\n        return true;\n    }\n    get isDisposed() {\n        return this._hoverWidget?.isDisposed;\n    }\n    dispose() {\n        this._hoverWidget?.dispose();\n        this._cancellationTokenSource?.dispose(true);\n        this._cancellationTokenSource = undefined;\n    }\n}\n\nexport { ManagedHoverWidget };\n","import { registerSingleton } from '../../instantiation/common/extensions.js';\nimport { registerThemingParticipant } from '../../theme/common/themeService.js';\nimport '../../theme/common/colorUtils.js';\nimport '../../theme/common/colors/baseColors.js';\nimport '../../theme/common/colors/chartsColors.js';\nimport { editorHoverBorder } from '../../theme/common/colors/editorColors.js';\nimport '../../theme/common/colors/inputColors.js';\nimport '../../theme/common/colors/listColors.js';\nimport '../../theme/common/colors/menuColors.js';\nimport '../../theme/common/colors/minimapColors.js';\nimport '../../theme/common/colors/miscColors.js';\nimport '../../theme/common/colors/quickpickColors.js';\nimport '../../theme/common/colors/searchColors.js';\nimport { IHoverService } from './hover.js';\nimport { IContextMenuService } from '../../contextview/browser/contextView.js';\nimport { IInstantiationService } from '../../instantiation/common/instantiation.js';\nimport { HoverWidget } from './hoverWidget.js';\nimport { Disposable, DisposableStore, toDisposable } from '../../../base/common/lifecycle.js';\nimport { addDisposableListener, EventType, getActiveElement, isHTMLElement, isAncestorOfActiveElement, getWindow, isAncestor, isEditableElement } from '../../../base/browser/dom.js';\nimport { IKeybindingService } from '../../keybinding/common/keybinding.js';\nimport { StandardKeyboardEvent } from '../../../base/browser/keyboardEvent.js';\nimport { IAccessibilityService } from '../../accessibility/common/accessibility.js';\nimport { ILayoutService } from '../../layout/browser/layoutService.js';\nimport { mainWindow } from '../../../base/browser/window.js';\nimport { ContextViewHandler } from '../../contextview/browser/contextViewService.js';\nimport { isManagedHoverTooltipMarkdownString } from '../../../base/browser/ui/hover/hover.js';\nimport { ManagedHoverWidget } from './updatableHoverWidget.js';\nimport { timeout, TimeoutTimer } from '../../../base/common/async.js';\nimport { IConfigurationService } from '../../configuration/common/configuration.js';\nimport { isNumber, isString } from '../../../base/common/types.js';\nimport { KeyChord } from '../../../base/common/keyCodes.js';\nimport { KeybindingsRegistry } from '../../keybinding/common/keybindingsRegistry.js';\nimport { stripIcons } from '../../../base/common/iconLabels.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet HoverService = class HoverService extends Disposable {\n    constructor(_instantiationService, _configurationService, contextMenuService, _keybindingService, _layoutService, _accessibilityService) {\n        super();\n        this._instantiationService = _instantiationService;\n        this._configurationService = _configurationService;\n        this._keybindingService = _keybindingService;\n        this._layoutService = _layoutService;\n        this._accessibilityService = _accessibilityService;\n        this._currentDelayedHoverWasShown = false;\n        this._delayedHovers = new Map();\n        this._managedHovers = new Map();\n        this._register(contextMenuService.onDidShowContextMenu(() => this.hideHover()));\n        this._contextViewHandler = this._register(new ContextViewHandler(this._layoutService));\n        this._register(KeybindingsRegistry.registerCommandAndKeybindingRule({\n            id: 'workbench.action.showHover',\n            weight: 0 /* KeybindingWeight.EditorCore */,\n            primary: KeyChord(2048 /* KeyMod.CtrlCmd */ | 41 /* KeyCode.KeyK */, 2048 /* KeyMod.CtrlCmd */ | 39 /* KeyCode.KeyI */),\n            handler: () => { this._showAndFocusHoverForActiveElement(); },\n        }));\n    }\n    showInstantHover(options, focus, skipLastFocusedUpdate, dontShow) {\n        const hover = this._createHover(options, skipLastFocusedUpdate);\n        if (!hover) {\n            return undefined;\n        }\n        this._showHover(hover, options, focus);\n        return hover;\n    }\n    showDelayedHover(options, lifecycleOptions) {\n        // Set `id` to default if it's undefined\n        if (options.id === undefined) {\n            options.id = getHoverIdFromContent(options.content);\n        }\n        if (!this._currentDelayedHover || this._currentDelayedHoverWasShown) {\n            // Current hover is locked, reject\n            if (this._currentHover?.isLocked) {\n                return undefined;\n            }\n            // Identity is the same, return current hover\n            if (getHoverOptionsIdentity(this._currentHoverOptions) === getHoverOptionsIdentity(options)) {\n                return this._currentHover;\n            }\n            // Check group identity, if it's the same skip the delay and show the hover immediately\n            if (this._currentHover && !this._currentHover.isDisposed && this._currentDelayedHoverGroupId !== undefined && this._currentDelayedHoverGroupId === lifecycleOptions?.groupId) {\n                return this.showInstantHover({\n                    ...options,\n                    appearance: {\n                        ...options.appearance,\n                        skipFadeInAnimation: true\n                    }\n                });\n            }\n        }\n        else if (this._currentDelayedHover && getHoverOptionsIdentity(this._currentHoverOptions) === getHoverOptionsIdentity(options)) {\n            // If the hover is the same but timeout is not finished yet, return the current hover\n            return this._currentDelayedHover;\n        }\n        const hover = this._createHover(options, undefined);\n        if (!hover) {\n            this._currentDelayedHover = undefined;\n            this._currentDelayedHoverWasShown = false;\n            this._currentDelayedHoverGroupId = undefined;\n            return undefined;\n        }\n        this._currentDelayedHover = hover;\n        this._currentDelayedHoverWasShown = false;\n        this._currentDelayedHoverGroupId = lifecycleOptions?.groupId;\n        timeout(this._configurationService.getValue('workbench.hover.delay')).then(() => {\n            if (hover && !hover.isDisposed) {\n                this._currentDelayedHoverWasShown = true;\n                this._showHover(hover, options);\n            }\n        });\n        return hover;\n    }\n    setupDelayedHover(target, options, lifecycleOptions) {\n        const resolveHoverOptions = () => ({\n            ...typeof options === 'function' ? options() : options,\n            target\n        });\n        return this._setupDelayedHover(target, resolveHoverOptions, lifecycleOptions);\n    }\n    setupDelayedHoverAtMouse(target, options, lifecycleOptions) {\n        const resolveHoverOptions = (e) => ({\n            ...typeof options === 'function' ? options() : options,\n            target: {\n                targetElements: [target],\n                x: e !== undefined ? e.x + 10 : undefined,\n            }\n        });\n        return this._setupDelayedHover(target, resolveHoverOptions, lifecycleOptions);\n    }\n    _setupDelayedHover(target, resolveHoverOptions, lifecycleOptions) {\n        const store = new DisposableStore();\n        store.add(addDisposableListener(target, EventType.MOUSE_OVER, e => {\n            this.showDelayedHover(resolveHoverOptions(e), {\n                groupId: lifecycleOptions?.groupId\n            });\n        }));\n        if (lifecycleOptions?.setupKeyboardEvents) {\n            store.add(addDisposableListener(target, EventType.KEY_DOWN, e => {\n                const evt = new StandardKeyboardEvent(e);\n                if (evt.equals(10 /* KeyCode.Space */) || evt.equals(3 /* KeyCode.Enter */)) {\n                    this.showInstantHover(resolveHoverOptions(), true);\n                }\n            }));\n        }\n        this._delayedHovers.set(target, { show: (focus) => { this.showInstantHover(resolveHoverOptions(), focus); } });\n        store.add(toDisposable(() => this._delayedHovers.delete(target)));\n        return store;\n    }\n    _createHover(options, skipLastFocusedUpdate) {\n        this._currentDelayedHover = undefined;\n        if (options.content === '') {\n            return undefined;\n        }\n        if (this._currentHover?.isLocked) {\n            return undefined;\n        }\n        // Set `id` to default if it's undefined\n        if (options.id === undefined) {\n            options.id = getHoverIdFromContent(options.content);\n        }\n        if (getHoverOptionsIdentity(this._currentHoverOptions) === getHoverOptionsIdentity(options)) {\n            return undefined;\n        }\n        this._currentHoverOptions = options;\n        this._lastHoverOptions = options;\n        const trapFocus = options.trapFocus || this._accessibilityService.isScreenReaderOptimized();\n        const activeElement = getActiveElement();\n        // HACK, remove this check when #189076 is fixed\n        if (!skipLastFocusedUpdate) {\n            if (trapFocus && activeElement) {\n                if (!activeElement.classList.contains('monaco-hover')) {\n                    this._lastFocusedElementBeforeOpen = activeElement;\n                }\n            }\n            else {\n                this._lastFocusedElementBeforeOpen = undefined;\n            }\n        }\n        const hoverDisposables = new DisposableStore();\n        const hover = this._instantiationService.createInstance(HoverWidget, options);\n        if (options.persistence?.sticky) {\n            hover.isLocked = true;\n        }\n        // Adjust target position when a mouse event is provided as the hover position\n        if (options.position?.hoverPosition && !isNumber(options.position.hoverPosition)) {\n            options.target = {\n                targetElements: isHTMLElement(options.target) ? [options.target] : options.target.targetElements,\n                x: options.position.hoverPosition.x + 10\n            };\n        }\n        hover.onDispose(() => {\n            const hoverWasFocused = this._currentHover?.domNode && isAncestorOfActiveElement(this._currentHover.domNode);\n            if (hoverWasFocused) {\n                // Required to handle cases such as closing the hover with the escape key\n                this._lastFocusedElementBeforeOpen?.focus();\n            }\n            // Only clear the current options if it's the current hover, the current options help\n            // reduce flickering when the same hover is shown multiple times\n            if (getHoverOptionsIdentity(this._currentHoverOptions) === getHoverOptionsIdentity(options)) {\n                this.doHideHover();\n            }\n            hoverDisposables.dispose();\n        }, undefined, hoverDisposables);\n        // Set the container explicitly to enable aux window support\n        if (!options.container) {\n            const targetElement = isHTMLElement(options.target) ? options.target : options.target.targetElements[0];\n            options.container = this._layoutService.getContainer(getWindow(targetElement));\n        }\n        hover.onRequestLayout(() => this._contextViewHandler.layout(), undefined, hoverDisposables);\n        if (options.persistence?.sticky) {\n            hoverDisposables.add(addDisposableListener(getWindow(options.container).document, EventType.MOUSE_DOWN, e => {\n                if (!isAncestor(e.target, hover.domNode)) {\n                    this.doHideHover();\n                }\n            }));\n        }\n        else {\n            if ('targetElements' in options.target) {\n                for (const element of options.target.targetElements) {\n                    hoverDisposables.add(addDisposableListener(element, EventType.CLICK, () => this.hideHover()));\n                }\n            }\n            else {\n                hoverDisposables.add(addDisposableListener(options.target, EventType.CLICK, () => this.hideHover()));\n            }\n            const focusedElement = getActiveElement();\n            if (focusedElement) {\n                const focusedElementDocument = getWindow(focusedElement).document;\n                hoverDisposables.add(addDisposableListener(focusedElement, EventType.KEY_DOWN, e => this._keyDown(e, hover, !!options.persistence?.hideOnKeyDown)));\n                hoverDisposables.add(addDisposableListener(focusedElementDocument, EventType.KEY_DOWN, e => this._keyDown(e, hover, !!options.persistence?.hideOnKeyDown)));\n                hoverDisposables.add(addDisposableListener(focusedElement, EventType.KEY_UP, e => this._keyUp(e, hover)));\n                hoverDisposables.add(addDisposableListener(focusedElementDocument, EventType.KEY_UP, e => this._keyUp(e, hover)));\n            }\n        }\n        if ('IntersectionObserver' in mainWindow) {\n            const observer = new IntersectionObserver(e => this._intersectionChange(e, hover), { threshold: 0 });\n            const firstTargetElement = 'targetElements' in options.target ? options.target.targetElements[0] : options.target;\n            observer.observe(firstTargetElement);\n            hoverDisposables.add(toDisposable(() => observer.disconnect()));\n        }\n        this._currentHover = hover;\n        return hover;\n    }\n    _showHover(hover, options, focus) {\n        this._contextViewHandler.showContextView(new HoverContextViewDelegate(hover, focus), options.container);\n    }\n    hideHover(force) {\n        if ((!force && this._currentHover?.isLocked) || !this._currentHoverOptions) {\n            return;\n        }\n        this.doHideHover();\n    }\n    doHideHover() {\n        this._currentHover = undefined;\n        this._currentHoverOptions = undefined;\n        this._contextViewHandler.hideContextView();\n    }\n    _intersectionChange(entries, hover) {\n        const entry = entries[entries.length - 1];\n        if (!entry.isIntersecting) {\n            hover.dispose();\n        }\n    }\n    showAndFocusLastHover() {\n        if (!this._lastHoverOptions) {\n            return;\n        }\n        this.showInstantHover(this._lastHoverOptions, true, true);\n    }\n    _showAndFocusHoverForActiveElement() {\n        // TODO: if hover is visible, focus it to avoid flickering\n        let activeElement = getActiveElement();\n        while (activeElement) {\n            const hover = this._delayedHovers.get(activeElement) ?? this._managedHovers.get(activeElement);\n            if (hover) {\n                hover.show(true);\n                return;\n            }\n            activeElement = activeElement.parentElement;\n        }\n    }\n    _keyDown(e, hover, hideOnKeyDown) {\n        if (e.key === 'Alt') {\n            hover.isLocked = true;\n            return;\n        }\n        const event = new StandardKeyboardEvent(e);\n        const keybinding = this._keybindingService.resolveKeyboardEvent(event);\n        if (keybinding.getSingleModifierDispatchChords().some(value => !!value) || this._keybindingService.softDispatch(event, event.target).kind !== 0 /* ResultKind.NoMatchingKb */) {\n            return;\n        }\n        if (hideOnKeyDown && (!this._currentHoverOptions?.trapFocus || e.key !== 'Tab')) {\n            this.hideHover();\n            this._lastFocusedElementBeforeOpen?.focus();\n        }\n    }\n    _keyUp(e, hover) {\n        if (e.key === 'Alt') {\n            hover.isLocked = false;\n            // Hide if alt is released while the mouse is not over hover/target\n            if (!hover.isMouseIn) {\n                this.hideHover();\n                this._lastFocusedElementBeforeOpen?.focus();\n            }\n        }\n    }\n    // TODO: Investigate performance of this function. There seems to be a lot of content created\n    //       and thrown away on start up\n    setupManagedHover(hoverDelegate, targetElement, content, options) {\n        if (hoverDelegate.showNativeHover) {\n            return setupNativeHover(targetElement, content);\n        }\n        targetElement.setAttribute('custom-hover', 'true');\n        if (targetElement.title !== '') {\n            console.warn('HTML element already has a title attribute, which will conflict with the custom hover. Please remove the title attribute.');\n            console.trace('Stack trace:', targetElement.title);\n            targetElement.title = '';\n        }\n        let hoverPreparation;\n        let hoverWidget;\n        const hideHover = (disposeWidget, disposePreparation) => {\n            const hadHover = hoverWidget !== undefined;\n            if (disposeWidget) {\n                hoverWidget?.dispose();\n                hoverWidget = undefined;\n            }\n            if (disposePreparation) {\n                hoverPreparation?.dispose();\n                hoverPreparation = undefined;\n            }\n            if (hadHover) {\n                hoverDelegate.onDidHideHover?.();\n                hoverWidget = undefined;\n            }\n        };\n        const triggerShowHover = (delay, focus, target, trapFocus) => {\n            return new TimeoutTimer(async () => {\n                if (!hoverWidget || hoverWidget.isDisposed) {\n                    hoverWidget = new ManagedHoverWidget(hoverDelegate, target || targetElement, delay > 0);\n                    await hoverWidget.update(typeof content === 'function' ? content() : content, focus, { ...options, trapFocus });\n                }\n            }, delay);\n        };\n        const store = new DisposableStore();\n        let isMouseDown = false;\n        store.add(addDisposableListener(targetElement, EventType.MOUSE_DOWN, () => {\n            isMouseDown = true;\n            hideHover(true, true);\n        }, true));\n        store.add(addDisposableListener(targetElement, EventType.MOUSE_UP, () => {\n            isMouseDown = false;\n        }, true));\n        store.add(addDisposableListener(targetElement, EventType.MOUSE_LEAVE, (e) => {\n            isMouseDown = false;\n            hideHover(false, e.fromElement === targetElement);\n        }, true));\n        store.add(addDisposableListener(targetElement, EventType.MOUSE_OVER, (e) => {\n            if (hoverPreparation) {\n                return;\n            }\n            const mouseOverStore = new DisposableStore();\n            const target = {\n                targetElements: [targetElement],\n                dispose: () => { }\n            };\n            if (hoverDelegate.placement === undefined || hoverDelegate.placement === 'mouse') {\n                // track the mouse position\n                const onMouseMove = (e) => {\n                    target.x = e.x + 10;\n                    if (!eventIsRelatedToTarget(e, targetElement)) {\n                        hideHover(true, true);\n                    }\n                };\n                mouseOverStore.add(addDisposableListener(targetElement, EventType.MOUSE_MOVE, onMouseMove, true));\n            }\n            hoverPreparation = mouseOverStore;\n            if (!eventIsRelatedToTarget(e, targetElement)) {\n                return; // Do not show hover when the mouse is over another hover target\n            }\n            mouseOverStore.add(triggerShowHover(typeof hoverDelegate.delay === 'function' ? hoverDelegate.delay(content) : hoverDelegate.delay, false, target));\n        }, true));\n        const onFocus = (e) => {\n            if (isMouseDown || hoverPreparation) {\n                return;\n            }\n            if (!eventIsRelatedToTarget(e, targetElement)) {\n                return; // Do not show hover when the focus is on another hover target\n            }\n            const target = {\n                targetElements: [targetElement],\n                dispose: () => { }\n            };\n            const toDispose = new DisposableStore();\n            const onBlur = () => hideHover(true, true);\n            toDispose.add(addDisposableListener(targetElement, EventType.BLUR, onBlur, true));\n            toDispose.add(triggerShowHover(typeof hoverDelegate.delay === 'function' ? hoverDelegate.delay(content) : hoverDelegate.delay, false, target));\n            hoverPreparation = toDispose;\n        };\n        // Do not show hover when focusing an input or textarea\n        if (!isEditableElement(targetElement)) {\n            store.add(addDisposableListener(targetElement, EventType.FOCUS, onFocus, true));\n        }\n        const hover = {\n            show: focus => {\n                hideHover(false, true); // terminate a ongoing mouse over preparation\n                triggerShowHover(0, focus, undefined, focus); // show hover immediately\n            },\n            hide: () => {\n                hideHover(true, true);\n            },\n            update: async (newContent, hoverOptions) => {\n                content = newContent;\n                await hoverWidget?.update(content, undefined, hoverOptions);\n            },\n            dispose: () => {\n                this._managedHovers.delete(targetElement);\n                store.dispose();\n                hideHover(true, true);\n            }\n        };\n        this._managedHovers.set(targetElement, hover);\n        return hover;\n    }\n    showManagedHover(target) {\n        const hover = this._managedHovers.get(target);\n        if (hover) {\n            hover.show(true);\n        }\n    }\n    dispose() {\n        this._managedHovers.forEach(hover => hover.dispose());\n        super.dispose();\n    }\n};\nHoverService = __decorate([\n    __param(0, IInstantiationService),\n    __param(1, IConfigurationService),\n    __param(2, IContextMenuService),\n    __param(3, IKeybindingService),\n    __param(4, ILayoutService),\n    __param(5, IAccessibilityService)\n], HoverService);\nfunction getHoverOptionsIdentity(options) {\n    if (options === undefined) {\n        return undefined;\n    }\n    return options?.id ?? options;\n}\nfunction getHoverIdFromContent(content) {\n    if (isHTMLElement(content)) {\n        return undefined;\n    }\n    if (typeof content === 'string') {\n        return content.toString();\n    }\n    return content.value;\n}\nfunction getStringContent(contentOrFactory) {\n    const content = typeof contentOrFactory === 'function' ? contentOrFactory() : contentOrFactory;\n    if (isString(content)) {\n        // Icons don't render in the native hover so we strip them out\n        return stripIcons(content);\n    }\n    if (isManagedHoverTooltipMarkdownString(content)) {\n        return content.markdownNotSupportedFallback;\n    }\n    return undefined;\n}\nfunction setupNativeHover(targetElement, content) {\n    function updateTitle(title) {\n        if (title) {\n            targetElement.setAttribute('title', title);\n        }\n        else {\n            targetElement.removeAttribute('title');\n        }\n    }\n    updateTitle(getStringContent(content));\n    return {\n        update: (content) => updateTitle(getStringContent(content)),\n        show: () => { },\n        hide: () => { },\n        dispose: () => updateTitle(undefined),\n    };\n}\nclass HoverContextViewDelegate {\n    get anchorPosition() {\n        return this._hover.anchor;\n    }\n    constructor(_hover, _focus = false) {\n        this._hover = _hover;\n        this._focus = _focus;\n        // Render over all other context views\n        this.layer = 1;\n    }\n    render(container) {\n        this._hover.render(container);\n        if (this._focus) {\n            this._hover.focus();\n        }\n        return this._hover;\n    }\n    getAnchor() {\n        return {\n            x: this._hover.x,\n            y: this._hover.y\n        };\n    }\n    layout() {\n        this._hover.layout();\n    }\n}\nfunction eventIsRelatedToTarget(event, target) {\n    return isHTMLElement(event.target) && getHoverTargetElement(event.target, target) === target;\n}\nfunction getHoverTargetElement(element, stopElement) {\n    stopElement = stopElement ?? getWindow(element).document.body;\n    while (!element.hasAttribute('custom-hover') && element !== stopElement) {\n        element = element.parentElement;\n    }\n    return element;\n}\nregisterSingleton(IHoverService, HoverService, 1 /* InstantiationType.Delayed */);\nregisterThemingParticipant((theme, collector) => {\n    const hoverBorder = theme.getColor(editorHoverBorder);\n    if (hoverBorder) {\n        collector.addRule(`.monaco-hover.workbench-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`);\n        collector.addRule(`.monaco-hover.workbench-hover hr { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`);\n    }\n});\n\nexport { HoverService };\n","import { equals, distinct } from '../../../base/common/arrays.js';\nimport { ResourceMap } from '../../../base/common/map.js';\nimport { deepClone, equals as equals$1, deepFreeze } from '../../../base/common/objects.js';\nimport { isObject } from '../../../base/common/types.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { getConfigurationValue, removeFromValueTree, addToValueTree, toValuesTree } from './configuration.js';\nimport { OVERRIDE_PROPERTY_REGEX, overrideIdentifiersFromKey, Extensions } from './configurationRegistry.js';\nimport { Registry } from '../../registry/common/platform.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction freeze(data) {\n    return Object.isFrozen(data) ? data : deepFreeze(data);\n}\nclass ConfigurationModel {\n    static createEmptyModel(logService) {\n        return new ConfigurationModel({}, [], [], undefined, logService);\n    }\n    constructor(_contents, _keys, _overrides, raw, logService) {\n        this._contents = _contents;\n        this._keys = _keys;\n        this._overrides = _overrides;\n        this.raw = raw;\n        this.logService = logService;\n        this.overrideConfigurations = new Map();\n    }\n    get rawConfiguration() {\n        if (!this._rawConfiguration) {\n            if (this.raw) {\n                const rawConfigurationModels = (Array.isArray(this.raw) ? this.raw : [this.raw]).map(raw => {\n                    if (raw instanceof ConfigurationModel) {\n                        return raw;\n                    }\n                    const parser = new ConfigurationModelParser('', this.logService);\n                    parser.parseRaw(raw);\n                    return parser.configurationModel;\n                });\n                this._rawConfiguration = rawConfigurationModels.reduce((previous, current) => current === previous ? current : previous.merge(current), rawConfigurationModels[0]);\n            }\n            else {\n                // raw is same as current\n                this._rawConfiguration = this;\n            }\n        }\n        return this._rawConfiguration;\n    }\n    get contents() {\n        return this._contents;\n    }\n    get overrides() {\n        return this._overrides;\n    }\n    get keys() {\n        return this._keys;\n    }\n    isEmpty() {\n        return this._keys.length === 0 && Object.keys(this._contents).length === 0 && this._overrides.length === 0;\n    }\n    getValue(section) {\n        return section ? getConfigurationValue(this.contents, section) : this.contents;\n    }\n    inspect(section, overrideIdentifier) {\n        const that = this;\n        return {\n            get value() {\n                return freeze(that.rawConfiguration.getValue(section));\n            },\n            get override() {\n                return overrideIdentifier ? freeze(that.rawConfiguration.getOverrideValue(section, overrideIdentifier)) : undefined;\n            },\n            get merged() {\n                return freeze(overrideIdentifier ? that.rawConfiguration.override(overrideIdentifier).getValue(section) : that.rawConfiguration.getValue(section));\n            },\n            get overrides() {\n                const overrides = [];\n                for (const { contents, identifiers, keys } of that.rawConfiguration.overrides) {\n                    const value = new ConfigurationModel(contents, keys, [], undefined, that.logService).getValue(section);\n                    if (value !== undefined) {\n                        overrides.push({ identifiers, value });\n                    }\n                }\n                return overrides.length ? freeze(overrides) : undefined;\n            }\n        };\n    }\n    getOverrideValue(section, overrideIdentifier) {\n        const overrideContents = this.getContentsForOverrideIdentifer(overrideIdentifier);\n        return overrideContents\n            ? section ? getConfigurationValue(overrideContents, section) : overrideContents\n            : undefined;\n    }\n    override(identifier) {\n        let overrideConfigurationModel = this.overrideConfigurations.get(identifier);\n        if (!overrideConfigurationModel) {\n            overrideConfigurationModel = this.createOverrideConfigurationModel(identifier);\n            this.overrideConfigurations.set(identifier, overrideConfigurationModel);\n        }\n        return overrideConfigurationModel;\n    }\n    merge(...others) {\n        const contents = deepClone(this.contents);\n        const overrides = deepClone(this.overrides);\n        const keys = [...this.keys];\n        const raws = this.raw ? Array.isArray(this.raw) ? [...this.raw] : [this.raw] : [this];\n        for (const other of others) {\n            raws.push(...(other.raw ? Array.isArray(other.raw) ? other.raw : [other.raw] : [other]));\n            if (other.isEmpty()) {\n                continue;\n            }\n            this.mergeContents(contents, other.contents);\n            for (const otherOverride of other.overrides) {\n                const [override] = overrides.filter(o => equals(o.identifiers, otherOverride.identifiers));\n                if (override) {\n                    this.mergeContents(override.contents, otherOverride.contents);\n                    override.keys.push(...otherOverride.keys);\n                    override.keys = distinct(override.keys);\n                }\n                else {\n                    overrides.push(deepClone(otherOverride));\n                }\n            }\n            for (const key of other.keys) {\n                if (keys.indexOf(key) === -1) {\n                    keys.push(key);\n                }\n            }\n        }\n        return new ConfigurationModel(contents, keys, overrides, !raws.length || raws.every(raw => raw instanceof ConfigurationModel) ? undefined : raws, this.logService);\n    }\n    createOverrideConfigurationModel(identifier) {\n        const overrideContents = this.getContentsForOverrideIdentifer(identifier);\n        if (!overrideContents || typeof overrideContents !== 'object' || !Object.keys(overrideContents).length) {\n            // If there are no valid overrides, return self\n            return this;\n        }\n        const contents = {};\n        for (const key of distinct([...Object.keys(this.contents), ...Object.keys(overrideContents)])) {\n            let contentsForKey = this.contents[key];\n            const overrideContentsForKey = overrideContents[key];\n            // If there are override contents for the key, clone and merge otherwise use base contents\n            if (overrideContentsForKey) {\n                // Clone and merge only if base contents and override contents are of type object otherwise just override\n                if (typeof contentsForKey === 'object' && typeof overrideContentsForKey === 'object') {\n                    contentsForKey = deepClone(contentsForKey);\n                    this.mergeContents(contentsForKey, overrideContentsForKey);\n                }\n                else {\n                    contentsForKey = overrideContentsForKey;\n                }\n            }\n            contents[key] = contentsForKey;\n        }\n        return new ConfigurationModel(contents, this.keys, this.overrides, undefined, this.logService);\n    }\n    mergeContents(source, target) {\n        for (const key of Object.keys(target)) {\n            if (key in source) {\n                if (isObject(source[key]) && isObject(target[key])) {\n                    this.mergeContents(source[key], target[key]);\n                    continue;\n                }\n            }\n            source[key] = deepClone(target[key]);\n        }\n    }\n    getContentsForOverrideIdentifer(identifier) {\n        let contentsForIdentifierOnly = null;\n        let contents = null;\n        const mergeContents = (contentsToMerge) => {\n            if (contentsToMerge) {\n                if (contents) {\n                    this.mergeContents(contents, contentsToMerge);\n                }\n                else {\n                    contents = deepClone(contentsToMerge);\n                }\n            }\n        };\n        for (const override of this.overrides) {\n            if (override.identifiers.length === 1 && override.identifiers[0] === identifier) {\n                contentsForIdentifierOnly = override.contents;\n            }\n            else if (override.identifiers.includes(identifier)) {\n                mergeContents(override.contents);\n            }\n        }\n        // Merge contents of the identifier only at the end to take precedence.\n        mergeContents(contentsForIdentifierOnly);\n        return contents;\n    }\n    toJSON() {\n        return {\n            contents: this.contents,\n            overrides: this.overrides,\n            keys: this.keys\n        };\n    }\n    setValue(key, value) {\n        this.updateValue(key, value, false);\n    }\n    removeValue(key) {\n        const index = this.keys.indexOf(key);\n        if (index === -1) {\n            return;\n        }\n        this.keys.splice(index, 1);\n        removeFromValueTree(this.contents, key);\n        if (OVERRIDE_PROPERTY_REGEX.test(key)) {\n            this.overrides.splice(this.overrides.findIndex(o => equals(o.identifiers, overrideIdentifiersFromKey(key))), 1);\n        }\n    }\n    updateValue(key, value, add) {\n        addToValueTree(this.contents, key, value, e => this.logService.error(e));\n        add = add || this.keys.indexOf(key) === -1;\n        if (add) {\n            this.keys.push(key);\n        }\n        if (OVERRIDE_PROPERTY_REGEX.test(key)) {\n            const identifiers = overrideIdentifiersFromKey(key);\n            const override = {\n                identifiers,\n                keys: Object.keys(this.contents[key]),\n                contents: toValuesTree(this.contents[key], message => this.logService.error(message)),\n            };\n            const index = this.overrides.findIndex(o => equals(o.identifiers, identifiers));\n            if (index !== -1) {\n                this.overrides[index] = override;\n            }\n            else {\n                this.overrides.push(override);\n            }\n        }\n    }\n}\nclass ConfigurationModelParser {\n    constructor(_name, logService) {\n        this._name = _name;\n        this.logService = logService;\n        this._raw = null;\n        this._configurationModel = null;\n        this._restrictedConfigurations = [];\n    }\n    get configurationModel() {\n        return this._configurationModel || ConfigurationModel.createEmptyModel(this.logService);\n    }\n    parseRaw(raw, options) {\n        this._raw = raw;\n        const { contents, keys, overrides, restricted, hasExcludedProperties } = this.doParseRaw(raw, options);\n        this._configurationModel = new ConfigurationModel(contents, keys, overrides, hasExcludedProperties ? [raw] : undefined /* raw has not changed */, this.logService);\n        this._restrictedConfigurations = restricted || [];\n    }\n    doParseRaw(raw, options) {\n        const registry = Registry.as(Extensions.Configuration);\n        const configurationProperties = registry.getConfigurationProperties();\n        const excludedConfigurationProperties = registry.getExcludedConfigurationProperties();\n        const filtered = this.filter(raw, configurationProperties, excludedConfigurationProperties, true, options);\n        raw = filtered.raw;\n        const contents = toValuesTree(raw, message => this.logService.error(`Conflict in settings file ${this._name}: ${message}`));\n        const keys = Object.keys(raw);\n        const overrides = this.toOverrides(raw, message => this.logService.error(`Conflict in settings file ${this._name}: ${message}`));\n        return { contents, keys, overrides, restricted: filtered.restricted, hasExcludedProperties: filtered.hasExcludedProperties };\n    }\n    filter(properties, configurationProperties, excludedConfigurationProperties, filterOverriddenProperties, options) {\n        let hasExcludedProperties = false;\n        if (!options?.scopes && !options?.skipRestricted && !options?.skipUnregistered && !options?.exclude?.length) {\n            return { raw: properties, restricted: [], hasExcludedProperties };\n        }\n        const raw = {};\n        const restricted = [];\n        for (const key in properties) {\n            if (OVERRIDE_PROPERTY_REGEX.test(key) && filterOverriddenProperties) {\n                const result = this.filter(properties[key], configurationProperties, excludedConfigurationProperties, false, options);\n                raw[key] = result.raw;\n                hasExcludedProperties = hasExcludedProperties || result.hasExcludedProperties;\n                restricted.push(...result.restricted);\n            }\n            else {\n                const propertySchema = configurationProperties[key];\n                if (propertySchema?.restricted) {\n                    restricted.push(key);\n                }\n                if (this.shouldInclude(key, propertySchema, excludedConfigurationProperties, options)) {\n                    raw[key] = properties[key];\n                }\n                else {\n                    hasExcludedProperties = true;\n                }\n            }\n        }\n        return { raw, restricted, hasExcludedProperties };\n    }\n    shouldInclude(key, propertySchema, excludedConfigurationProperties, options) {\n        if (options.exclude?.includes(key)) {\n            return false;\n        }\n        if (options.include?.includes(key)) {\n            return true;\n        }\n        if (options.skipRestricted && propertySchema?.restricted) {\n            return false;\n        }\n        if (options.skipUnregistered && !propertySchema) {\n            return false;\n        }\n        const schema = propertySchema ?? excludedConfigurationProperties[key];\n        const scope = schema ? typeof schema.scope !== 'undefined' ? schema.scope : 4 /* ConfigurationScope.WINDOW */ : undefined;\n        if (scope === undefined || options.scopes === undefined) {\n            return true;\n        }\n        return options.scopes.includes(scope);\n    }\n    toOverrides(raw, conflictReporter) {\n        const overrides = [];\n        for (const key of Object.keys(raw)) {\n            if (OVERRIDE_PROPERTY_REGEX.test(key)) {\n                const overrideRaw = {};\n                for (const keyInOverrideRaw in raw[key]) {\n                    overrideRaw[keyInOverrideRaw] = raw[key][keyInOverrideRaw];\n                }\n                overrides.push({\n                    identifiers: overrideIdentifiersFromKey(key),\n                    keys: Object.keys(overrideRaw),\n                    contents: toValuesTree(overrideRaw, conflictReporter)\n                });\n            }\n        }\n        return overrides;\n    }\n}\nclass ConfigurationInspectValue {\n    constructor(key, overrides, _value, overrideIdentifiers, defaultConfiguration, policyConfiguration, applicationConfiguration, userConfiguration, localUserConfiguration, remoteUserConfiguration, workspaceConfiguration, folderConfigurationModel, memoryConfigurationModel) {\n        this.key = key;\n        this.overrides = overrides;\n        this._value = _value;\n        this.overrideIdentifiers = overrideIdentifiers;\n        this.defaultConfiguration = defaultConfiguration;\n        this.policyConfiguration = policyConfiguration;\n        this.applicationConfiguration = applicationConfiguration;\n        this.userConfiguration = userConfiguration;\n        this.localUserConfiguration = localUserConfiguration;\n        this.remoteUserConfiguration = remoteUserConfiguration;\n        this.workspaceConfiguration = workspaceConfiguration;\n        this.folderConfigurationModel = folderConfigurationModel;\n        this.memoryConfigurationModel = memoryConfigurationModel;\n    }\n    toInspectValue(inspectValue) {\n        return inspectValue?.value !== undefined || inspectValue?.override !== undefined || inspectValue?.overrides !== undefined ? inspectValue : undefined;\n    }\n    get userInspectValue() {\n        if (!this._userInspectValue) {\n            this._userInspectValue = this.userConfiguration.inspect(this.key, this.overrides.overrideIdentifier);\n        }\n        return this._userInspectValue;\n    }\n    get user() {\n        return this.toInspectValue(this.userInspectValue);\n    }\n}\nclass Configuration {\n    constructor(_defaultConfiguration, _policyConfiguration, _applicationConfiguration, _localUserConfiguration, _remoteUserConfiguration, _workspaceConfiguration, _folderConfigurations, _memoryConfiguration, _memoryConfigurationByResource, logService) {\n        this._defaultConfiguration = _defaultConfiguration;\n        this._policyConfiguration = _policyConfiguration;\n        this._applicationConfiguration = _applicationConfiguration;\n        this._localUserConfiguration = _localUserConfiguration;\n        this._remoteUserConfiguration = _remoteUserConfiguration;\n        this._workspaceConfiguration = _workspaceConfiguration;\n        this._folderConfigurations = _folderConfigurations;\n        this._memoryConfiguration = _memoryConfiguration;\n        this._memoryConfigurationByResource = _memoryConfigurationByResource;\n        this.logService = logService;\n        this._workspaceConsolidatedConfiguration = null;\n        this._foldersConsolidatedConfigurations = new ResourceMap();\n        this._userConfiguration = null;\n    }\n    getValue(section, overrides, workspace) {\n        const consolidateConfigurationModel = this.getConsolidatedConfigurationModel(section, overrides, workspace);\n        return consolidateConfigurationModel.getValue(section);\n    }\n    updateValue(key, value, overrides = {}) {\n        let memoryConfiguration;\n        if (overrides.resource) {\n            memoryConfiguration = this._memoryConfigurationByResource.get(overrides.resource);\n            if (!memoryConfiguration) {\n                memoryConfiguration = ConfigurationModel.createEmptyModel(this.logService);\n                this._memoryConfigurationByResource.set(overrides.resource, memoryConfiguration);\n            }\n        }\n        else {\n            memoryConfiguration = this._memoryConfiguration;\n        }\n        if (value === undefined) {\n            memoryConfiguration.removeValue(key);\n        }\n        else {\n            memoryConfiguration.setValue(key, value);\n        }\n        if (!overrides.resource) {\n            this._workspaceConsolidatedConfiguration = null;\n        }\n    }\n    inspect(key, overrides, workspace) {\n        const consolidateConfigurationModel = this.getConsolidatedConfigurationModel(key, overrides, workspace);\n        const folderConfigurationModel = this.getFolderConfigurationModelForResource(overrides.resource, workspace);\n        const memoryConfigurationModel = overrides.resource ? this._memoryConfigurationByResource.get(overrides.resource) || this._memoryConfiguration : this._memoryConfiguration;\n        const overrideIdentifiers = new Set();\n        for (const override of consolidateConfigurationModel.overrides) {\n            for (const overrideIdentifier of override.identifiers) {\n                if (consolidateConfigurationModel.getOverrideValue(key, overrideIdentifier) !== undefined) {\n                    overrideIdentifiers.add(overrideIdentifier);\n                }\n            }\n        }\n        return new ConfigurationInspectValue(key, overrides, consolidateConfigurationModel.getValue(key), overrideIdentifiers.size ? [...overrideIdentifiers] : undefined, this._defaultConfiguration, this._policyConfiguration.isEmpty() ? undefined : this._policyConfiguration, this.applicationConfiguration.isEmpty() ? undefined : this.applicationConfiguration, this.userConfiguration, this.localUserConfiguration, this.remoteUserConfiguration, workspace ? this._workspaceConfiguration : undefined, folderConfigurationModel ? folderConfigurationModel : undefined, memoryConfigurationModel);\n    }\n    get applicationConfiguration() {\n        return this._applicationConfiguration;\n    }\n    get userConfiguration() {\n        if (!this._userConfiguration) {\n            if (this._remoteUserConfiguration.isEmpty()) {\n                this._userConfiguration = this._localUserConfiguration;\n            }\n            else {\n                const merged = this._localUserConfiguration.merge(this._remoteUserConfiguration);\n                this._userConfiguration = new ConfigurationModel(merged.contents, merged.keys, merged.overrides, undefined, this.logService);\n            }\n        }\n        return this._userConfiguration;\n    }\n    get localUserConfiguration() {\n        return this._localUserConfiguration;\n    }\n    get remoteUserConfiguration() {\n        return this._remoteUserConfiguration;\n    }\n    getConsolidatedConfigurationModel(section, overrides, workspace) {\n        let configurationModel = this.getConsolidatedConfigurationModelForResource(overrides, workspace);\n        if (overrides.overrideIdentifier) {\n            configurationModel = configurationModel.override(overrides.overrideIdentifier);\n        }\n        if (!this._policyConfiguration.isEmpty() && this._policyConfiguration.getValue(section) !== undefined) {\n            // clone by merging\n            configurationModel = configurationModel.merge();\n            for (const key of this._policyConfiguration.keys) {\n                configurationModel.setValue(key, this._policyConfiguration.getValue(key));\n            }\n        }\n        return configurationModel;\n    }\n    getConsolidatedConfigurationModelForResource({ resource }, workspace) {\n        let consolidateConfiguration = this.getWorkspaceConsolidatedConfiguration();\n        if (workspace && resource) {\n            const root = workspace.getFolder(resource);\n            if (root) {\n                consolidateConfiguration = this.getFolderConsolidatedConfiguration(root.uri) || consolidateConfiguration;\n            }\n            const memoryConfigurationForResource = this._memoryConfigurationByResource.get(resource);\n            if (memoryConfigurationForResource) {\n                consolidateConfiguration = consolidateConfiguration.merge(memoryConfigurationForResource);\n            }\n        }\n        return consolidateConfiguration;\n    }\n    getWorkspaceConsolidatedConfiguration() {\n        if (!this._workspaceConsolidatedConfiguration) {\n            this._workspaceConsolidatedConfiguration = this._defaultConfiguration.merge(this.applicationConfiguration, this.userConfiguration, this._workspaceConfiguration, this._memoryConfiguration);\n        }\n        return this._workspaceConsolidatedConfiguration;\n    }\n    getFolderConsolidatedConfiguration(folder) {\n        let folderConsolidatedConfiguration = this._foldersConsolidatedConfigurations.get(folder);\n        if (!folderConsolidatedConfiguration) {\n            const workspaceConsolidateConfiguration = this.getWorkspaceConsolidatedConfiguration();\n            const folderConfiguration = this._folderConfigurations.get(folder);\n            if (folderConfiguration) {\n                folderConsolidatedConfiguration = workspaceConsolidateConfiguration.merge(folderConfiguration);\n                this._foldersConsolidatedConfigurations.set(folder, folderConsolidatedConfiguration);\n            }\n            else {\n                folderConsolidatedConfiguration = workspaceConsolidateConfiguration;\n            }\n        }\n        return folderConsolidatedConfiguration;\n    }\n    getFolderConfigurationModelForResource(resource, workspace) {\n        if (workspace && resource) {\n            const root = workspace.getFolder(resource);\n            if (root) {\n                return this._folderConfigurations.get(root.uri);\n            }\n        }\n        return undefined;\n    }\n    toData() {\n        return {\n            defaults: {\n                contents: this._defaultConfiguration.contents,\n                overrides: this._defaultConfiguration.overrides,\n                keys: this._defaultConfiguration.keys,\n            },\n            policy: {\n                contents: this._policyConfiguration.contents,\n                overrides: this._policyConfiguration.overrides,\n                keys: this._policyConfiguration.keys\n            },\n            application: {\n                contents: this.applicationConfiguration.contents,\n                overrides: this.applicationConfiguration.overrides,\n                keys: this.applicationConfiguration.keys,\n                raw: Array.isArray(this.applicationConfiguration.raw) ? undefined : this.applicationConfiguration.raw\n            },\n            userLocal: {\n                contents: this.localUserConfiguration.contents,\n                overrides: this.localUserConfiguration.overrides,\n                keys: this.localUserConfiguration.keys,\n                raw: Array.isArray(this.localUserConfiguration.raw) ? undefined : this.localUserConfiguration.raw\n            },\n            userRemote: {\n                contents: this.remoteUserConfiguration.contents,\n                overrides: this.remoteUserConfiguration.overrides,\n                keys: this.remoteUserConfiguration.keys,\n                raw: Array.isArray(this.remoteUserConfiguration.raw) ? undefined : this.remoteUserConfiguration.raw\n            },\n            workspace: {\n                contents: this._workspaceConfiguration.contents,\n                overrides: this._workspaceConfiguration.overrides,\n                keys: this._workspaceConfiguration.keys\n            },\n            folders: [...this._folderConfigurations.keys()].reduce((result, folder) => {\n                const { contents, overrides, keys } = this._folderConfigurations.get(folder);\n                result.push([folder, { contents, overrides, keys }]);\n                return result;\n            }, [])\n        };\n    }\n    static parse(data, logService) {\n        const defaultConfiguration = this.parseConfigurationModel(data.defaults, logService);\n        const policyConfiguration = this.parseConfigurationModel(data.policy, logService);\n        const applicationConfiguration = this.parseConfigurationModel(data.application, logService);\n        const userLocalConfiguration = this.parseConfigurationModel(data.userLocal, logService);\n        const userRemoteConfiguration = this.parseConfigurationModel(data.userRemote, logService);\n        const workspaceConfiguration = this.parseConfigurationModel(data.workspace, logService);\n        const folders = data.folders.reduce((result, value) => {\n            result.set(URI.revive(value[0]), this.parseConfigurationModel(value[1], logService));\n            return result;\n        }, new ResourceMap());\n        return new Configuration(defaultConfiguration, policyConfiguration, applicationConfiguration, userLocalConfiguration, userRemoteConfiguration, workspaceConfiguration, folders, ConfigurationModel.createEmptyModel(logService), new ResourceMap(), logService);\n    }\n    static parseConfigurationModel(model, logService) {\n        return new ConfigurationModel(model.contents, model.keys, model.overrides, model.raw, logService);\n    }\n}\nclass ConfigurationChangeEvent {\n    constructor(change, previous, currentConfiguraiton, currentWorkspace, logService) {\n        this.change = change;\n        this.previous = previous;\n        this.currentConfiguraiton = currentConfiguraiton;\n        this.currentWorkspace = currentWorkspace;\n        this.logService = logService;\n        this._marker = '\\n';\n        this._markerCode1 = this._marker.charCodeAt(0);\n        this._markerCode2 = '.'.charCodeAt(0);\n        this.affectedKeys = new Set();\n        this._previousConfiguration = undefined;\n        for (const key of change.keys) {\n            this.affectedKeys.add(key);\n        }\n        for (const [, keys] of change.overrides) {\n            for (const key of keys) {\n                this.affectedKeys.add(key);\n            }\n        }\n        // Example: '\\nfoo.bar\\nabc.def\\n'\n        this._affectsConfigStr = this._marker;\n        for (const key of this.affectedKeys) {\n            this._affectsConfigStr += key + this._marker;\n        }\n    }\n    get previousConfiguration() {\n        if (!this._previousConfiguration && this.previous) {\n            this._previousConfiguration = Configuration.parse(this.previous.data, this.logService);\n        }\n        return this._previousConfiguration;\n    }\n    affectsConfiguration(section, overrides) {\n        // we have one large string with all keys that have changed. we pad (marker) the section\n        // and check that either find it padded or before a segment character\n        const needle = this._marker + section;\n        const idx = this._affectsConfigStr.indexOf(needle);\n        if (idx < 0) {\n            // NOT: (marker + section)\n            return false;\n        }\n        const pos = idx + needle.length;\n        if (pos >= this._affectsConfigStr.length) {\n            return false;\n        }\n        const code = this._affectsConfigStr.charCodeAt(pos);\n        if (code !== this._markerCode1 && code !== this._markerCode2) {\n            // NOT: section + (marker | segment)\n            return false;\n        }\n        if (overrides) {\n            const value1 = this.previousConfiguration ? this.previousConfiguration.getValue(section, overrides, this.previous?.workspace) : undefined;\n            const value2 = this.currentConfiguraiton.getValue(section, overrides, this.currentWorkspace);\n            return !equals$1(value1, value2);\n        }\n        return true;\n    }\n}\n\nexport { Configuration, ConfigurationChangeEvent, ConfigurationModel, ConfigurationModelParser };\n","import { expressionsAreEqualWithConstantSubstitution, implies } from '../../contextkey/common/contextkey.js';\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// util definitions to make working with the above types easier within this module:\nconst NoMatchingKb = { kind: 0 /* ResultKind.NoMatchingKb */ };\nconst MoreChordsNeeded = { kind: 1 /* ResultKind.MoreChordsNeeded */ };\nfunction KbFound(commandId, commandArgs, isBubble) {\n    return { kind: 2 /* ResultKind.KbFound */, commandId, commandArgs, isBubble };\n}\n//#endregion\n/**\n * Stores mappings from keybindings to commands and from commands to keybindings.\n * Given a sequence of chords, `resolve`s which keybinding it matches\n */\nclass KeybindingResolver {\n    constructor(\n    /** built-in and extension-provided keybindings */\n    defaultKeybindings, \n    /** user's keybindings */\n    overrides, log) {\n        this._log = log;\n        this._defaultKeybindings = defaultKeybindings;\n        this._defaultBoundCommands = new Map();\n        for (const defaultKeybinding of defaultKeybindings) {\n            const command = defaultKeybinding.command;\n            if (command && command.charAt(0) !== '-') {\n                this._defaultBoundCommands.set(command, true);\n            }\n        }\n        this._map = new Map();\n        this._lookupMap = new Map();\n        this._keybindings = KeybindingResolver.handleRemovals([].concat(defaultKeybindings).concat(overrides));\n        for (let i = 0, len = this._keybindings.length; i < len; i++) {\n            const k = this._keybindings[i];\n            if (k.chords.length === 0) {\n                // unbound\n                continue;\n            }\n            // substitute with constants that are registered after startup - https://github.com/microsoft/vscode/issues/174218#issuecomment-1437972127\n            const when = k.when?.substituteConstants();\n            if (when && when.type === 0 /* ContextKeyExprType.False */) {\n                // when condition is false\n                continue;\n            }\n            this._addKeyPress(k.chords[0], k);\n        }\n    }\n    static _isTargetedForRemoval(defaultKb, keypress, when) {\n        if (keypress) {\n            for (let i = 0; i < keypress.length; i++) {\n                if (keypress[i] !== defaultKb.chords[i]) {\n                    return false;\n                }\n            }\n        }\n        // `true` means always, as does `undefined`\n        // so we will treat `true` === `undefined`\n        if (when && when.type !== 1 /* ContextKeyExprType.True */) {\n            if (!defaultKb.when) {\n                return false;\n            }\n            if (!expressionsAreEqualWithConstantSubstitution(when, defaultKb.when)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    /**\n     * Looks for rules containing \"-commandId\" and removes them.\n     */\n    static handleRemovals(rules) {\n        // Do a first pass and construct a hash-map for removals\n        const removals = new Map();\n        for (let i = 0, len = rules.length; i < len; i++) {\n            const rule = rules[i];\n            if (rule.command && rule.command.charAt(0) === '-') {\n                const command = rule.command.substring(1);\n                if (!removals.has(command)) {\n                    removals.set(command, [rule]);\n                }\n                else {\n                    removals.get(command).push(rule);\n                }\n            }\n        }\n        if (removals.size === 0) {\n            // There are no removals\n            return rules;\n        }\n        // Do a second pass and keep only non-removed keybindings\n        const result = [];\n        for (let i = 0, len = rules.length; i < len; i++) {\n            const rule = rules[i];\n            if (!rule.command || rule.command.length === 0) {\n                result.push(rule);\n                continue;\n            }\n            if (rule.command.charAt(0) === '-') {\n                continue;\n            }\n            const commandRemovals = removals.get(rule.command);\n            if (!commandRemovals || !rule.isDefault) {\n                result.push(rule);\n                continue;\n            }\n            let isRemoved = false;\n            for (const commandRemoval of commandRemovals) {\n                const when = commandRemoval.when;\n                if (this._isTargetedForRemoval(rule, commandRemoval.chords, when)) {\n                    isRemoved = true;\n                    break;\n                }\n            }\n            if (!isRemoved) {\n                result.push(rule);\n                continue;\n            }\n        }\n        return result;\n    }\n    _addKeyPress(keypress, item) {\n        const conflicts = this._map.get(keypress);\n        if (typeof conflicts === 'undefined') {\n            // There is no conflict so far\n            this._map.set(keypress, [item]);\n            this._addToLookupMap(item);\n            return;\n        }\n        for (let i = conflicts.length - 1; i >= 0; i--) {\n            const conflict = conflicts[i];\n            if (conflict.command === item.command) {\n                continue;\n            }\n            // Test if the shorter keybinding is a prefix of the longer one.\n            // If the shorter keybinding is a prefix, it effectively will shadow the longer one and is considered a conflict.\n            let isShorterKbPrefix = true;\n            for (let i = 1; i < conflict.chords.length && i < item.chords.length; i++) {\n                if (conflict.chords[i] !== item.chords[i]) {\n                    // The ith step does not conflict\n                    isShorterKbPrefix = false;\n                    break;\n                }\n            }\n            if (!isShorterKbPrefix) {\n                continue;\n            }\n            if (KeybindingResolver.whenIsEntirelyIncluded(conflict.when, item.when)) {\n                // `item` completely overwrites `conflict`\n                // Remove conflict from the lookupMap\n                this._removeFromLookupMap(conflict);\n            }\n        }\n        conflicts.push(item);\n        this._addToLookupMap(item);\n    }\n    _addToLookupMap(item) {\n        if (!item.command) {\n            return;\n        }\n        let arr = this._lookupMap.get(item.command);\n        if (typeof arr === 'undefined') {\n            arr = [item];\n            this._lookupMap.set(item.command, arr);\n        }\n        else {\n            arr.push(item);\n        }\n    }\n    _removeFromLookupMap(item) {\n        if (!item.command) {\n            return;\n        }\n        const arr = this._lookupMap.get(item.command);\n        if (typeof arr === 'undefined') {\n            return;\n        }\n        for (let i = 0, len = arr.length; i < len; i++) {\n            if (arr[i] === item) {\n                arr.splice(i, 1);\n                return;\n            }\n        }\n    }\n    /**\n     * Returns true if it is provable `a` implies `b`.\n     */\n    static whenIsEntirelyIncluded(a, b) {\n        if (!b || b.type === 1 /* ContextKeyExprType.True */) {\n            return true;\n        }\n        if (!a || a.type === 1 /* ContextKeyExprType.True */) {\n            return false;\n        }\n        return implies(a, b);\n    }\n    getKeybindings() {\n        return this._keybindings;\n    }\n    lookupPrimaryKeybinding(commandId, context, enforceContextCheck = false) {\n        const items = this._lookupMap.get(commandId);\n        if (typeof items === 'undefined' || items.length === 0) {\n            return null;\n        }\n        if (items.length === 1 && !enforceContextCheck) {\n            return items[0];\n        }\n        for (let i = items.length - 1; i >= 0; i--) {\n            const item = items[i];\n            if (context.contextMatchesRules(item.when)) {\n                return item;\n            }\n        }\n        if (enforceContextCheck) {\n            return null;\n        }\n        return items[items.length - 1];\n    }\n    /**\n     * Looks up a keybinding trigged as a result of pressing a sequence of chords - `[...currentChords, keypress]`\n     *\n     * Example: resolving 3 chords pressed sequentially - `cmd+k cmd+p cmd+i`:\n     * \t`currentChords = [ 'cmd+k' , 'cmd+p' ]` and `keypress = `cmd+i` - last pressed chord\n     */\n    resolve(context, currentChords, keypress) {\n        const pressedChords = [...currentChords, keypress];\n        this._log(`| Resolving ${pressedChords}`);\n        const kbCandidates = this._map.get(pressedChords[0]);\n        if (kbCandidates === undefined) {\n            // No bindings with such 0-th chord\n            this._log(`\\\\ No keybinding entries.`);\n            return NoMatchingKb;\n        }\n        let lookupMap = null;\n        if (pressedChords.length < 2) {\n            lookupMap = kbCandidates;\n        }\n        else {\n            // Fetch all chord bindings for `currentChords`\n            lookupMap = [];\n            for (let i = 0, len = kbCandidates.length; i < len; i++) {\n                const candidate = kbCandidates[i];\n                if (pressedChords.length > candidate.chords.length) { // # of pressed chords can't be less than # of chords in a keybinding to invoke\n                    continue;\n                }\n                let prefixMatches = true;\n                for (let i = 1; i < pressedChords.length; i++) {\n                    if (candidate.chords[i] !== pressedChords[i]) {\n                        prefixMatches = false;\n                        break;\n                    }\n                }\n                if (prefixMatches) {\n                    lookupMap.push(candidate);\n                }\n            }\n        }\n        // check there's a keybinding with a matching when clause\n        const result = this._findCommand(context, lookupMap);\n        if (!result) {\n            this._log(`\\\\ From ${lookupMap.length} keybinding entries, no when clauses matched the context.`);\n            return NoMatchingKb;\n        }\n        // check we got all chords necessary to be sure a particular keybinding needs to be invoked\n        if (pressedChords.length < result.chords.length) {\n            // The chord sequence is not complete\n            this._log(`\\\\ From ${lookupMap.length} keybinding entries, awaiting ${result.chords.length - pressedChords.length} more chord(s), when: ${printWhenExplanation(result.when)}, source: ${printSourceExplanation(result)}.`);\n            return MoreChordsNeeded;\n        }\n        this._log(`\\\\ From ${lookupMap.length} keybinding entries, matched ${result.command}, when: ${printWhenExplanation(result.when)}, source: ${printSourceExplanation(result)}.`);\n        return KbFound(result.command, result.commandArgs, result.bubble);\n    }\n    _findCommand(context, matches) {\n        for (let i = matches.length - 1; i >= 0; i--) {\n            const k = matches[i];\n            if (!KeybindingResolver._contextMatchesRules(context, k.when)) {\n                continue;\n            }\n            return k;\n        }\n        return null;\n    }\n    static _contextMatchesRules(context, rules) {\n        if (!rules) {\n            return true;\n        }\n        return rules.evaluate(context);\n    }\n}\nfunction printWhenExplanation(when) {\n    if (!when) {\n        return `no when condition`;\n    }\n    return `${when.serialize()}`;\n}\nfunction printSourceExplanation(kb) {\n    return (kb.extensionId\n        ? (kb.isBuiltinExtension ? `built-in extension ${kb.extensionId}` : `user extension ${kb.extensionId}`)\n        : (kb.isDefault ? `built-in` : `user`));\n}\n\nexport { KeybindingResolver, NoMatchingKb };\n","import { IntervalTimer, TimeoutTimer } from '../../../base/common/async.js';\nimport { illegalState } from '../../../base/common/errors.js';\nimport { Event, Emitter } from '../../../base/common/event.js';\nimport { IME } from '../../../base/common/ime.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { localize } from '../../../nls.js';\nimport { NoMatchingKb } from './keybindingResolver.js';\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 *--------------------------------------------------------------------------------------------*/\nconst HIGH_FREQ_COMMANDS = /^(cursor|delete|undo|redo|tab|editor\\.action\\.clipboard)/;\nclass AbstractKeybindingService extends Disposable {\n    get onDidUpdateKeybindings() {\n        return this._onDidUpdateKeybindings ? this._onDidUpdateKeybindings.event : Event.None; // Sinon stubbing walks properties on prototype\n    }\n    get inChordMode() {\n        return this._currentChords.length > 0;\n    }\n    constructor(_contextKeyService, _commandService, _telemetryService, _notificationService, _logService) {\n        super();\n        this._contextKeyService = _contextKeyService;\n        this._commandService = _commandService;\n        this._telemetryService = _telemetryService;\n        this._notificationService = _notificationService;\n        this._logService = _logService;\n        this._onDidUpdateKeybindings = this._register(new Emitter());\n        this._currentChords = [];\n        this._currentChordChecker = new IntervalTimer();\n        this._currentChordStatusMessage = null;\n        this._ignoreSingleModifiers = KeybindingModifierSet.EMPTY;\n        this._currentSingleModifier = null;\n        this._currentSingleModifierClearTimeout = new TimeoutTimer();\n        this._currentlyDispatchingCommandId = null;\n        this._logging = false;\n    }\n    dispose() {\n        super.dispose();\n    }\n    _log(str) {\n        if (this._logging) {\n            this._logService.info(`[KeybindingService]: ${str}`);\n        }\n    }\n    getKeybindings() {\n        return this._getResolver().getKeybindings();\n    }\n    lookupKeybinding(commandId, context, enforceContextCheck = false) {\n        const result = this._getResolver().lookupPrimaryKeybinding(commandId, context || this._contextKeyService, enforceContextCheck);\n        if (!result) {\n            return undefined;\n        }\n        return result.resolvedKeybinding;\n    }\n    dispatchEvent(e, target) {\n        return this._dispatch(e, target);\n    }\n    // TODO@ulugbekna: update namings to align with `_doDispatch`\n    // TODO@ulugbekna: this fn doesn't seem to take into account single-modifier keybindings, eg `shift shift`\n    softDispatch(e, target) {\n        this._log(`/ Soft dispatching keyboard event`);\n        const keybinding = this.resolveKeyboardEvent(e);\n        if (keybinding.hasMultipleChords()) {\n            console.warn('keyboard event should not be mapped to multiple chords');\n            return NoMatchingKb;\n        }\n        const [firstChord,] = keybinding.getDispatchChords();\n        if (firstChord === null) {\n            // cannot be dispatched, probably only modifier keys\n            this._log(`\\\\ Keyboard event cannot be dispatched`);\n            return NoMatchingKb;\n        }\n        const contextValue = this._contextKeyService.getContext(target);\n        const currentChords = this._currentChords.map((({ keypress }) => keypress));\n        return this._getResolver().resolve(contextValue, currentChords, firstChord);\n    }\n    _scheduleLeaveChordMode() {\n        const chordLastInteractedTime = Date.now();\n        this._currentChordChecker.cancelAndSet(() => {\n            if (!this._documentHasFocus()) {\n                // Focus has been lost => leave chord mode\n                this._leaveChordMode();\n                return;\n            }\n            if (Date.now() - chordLastInteractedTime > 5000) {\n                // 5 seconds elapsed => leave chord mode\n                this._leaveChordMode();\n            }\n        }, 500);\n    }\n    _expectAnotherChord(firstChord, keypressLabel) {\n        this._currentChords.push({ keypress: firstChord, label: keypressLabel });\n        switch (this._currentChords.length) {\n            case 0:\n                throw illegalState('impossible');\n            case 1:\n                // TODO@ulugbekna: revise this message and the one below (at least, fix terminology)\n                this._currentChordStatusMessage = this._notificationService.status(localize(1701, \"({0}) was pressed. Waiting for second key of chord...\", keypressLabel));\n                break;\n            default: {\n                const fullKeypressLabel = this._currentChords.map(({ label }) => label).join(', ');\n                this._currentChordStatusMessage = this._notificationService.status(localize(1702, \"({0}) was pressed. Waiting for next key of chord...\", fullKeypressLabel));\n            }\n        }\n        this._scheduleLeaveChordMode();\n        if (IME.enabled) {\n            IME.disable();\n        }\n    }\n    _leaveChordMode() {\n        if (this._currentChordStatusMessage) {\n            this._currentChordStatusMessage.close();\n            this._currentChordStatusMessage = null;\n        }\n        this._currentChordChecker.cancel();\n        this._currentChords = [];\n        IME.enable();\n    }\n    _dispatch(e, target) {\n        return this._doDispatch(this.resolveKeyboardEvent(e), target, /*isSingleModiferChord*/ false);\n    }\n    _singleModifierDispatch(e, target) {\n        const keybinding = this.resolveKeyboardEvent(e);\n        const [singleModifier,] = keybinding.getSingleModifierDispatchChords();\n        if (singleModifier) {\n            if (this._ignoreSingleModifiers.has(singleModifier)) {\n                this._log(`+ Ignoring single modifier ${singleModifier} due to it being pressed together with other keys.`);\n                this._ignoreSingleModifiers = KeybindingModifierSet.EMPTY;\n                this._currentSingleModifierClearTimeout.cancel();\n                this._currentSingleModifier = null;\n                return false;\n            }\n            this._ignoreSingleModifiers = KeybindingModifierSet.EMPTY;\n            if (this._currentSingleModifier === null) {\n                // we have a valid `singleModifier`, store it for the next keyup, but clear it in 300ms\n                this._log(`+ Storing single modifier for possible chord ${singleModifier}.`);\n                this._currentSingleModifier = singleModifier;\n                this._currentSingleModifierClearTimeout.cancelAndSet(() => {\n                    this._log(`+ Clearing single modifier due to 300ms elapsed.`);\n                    this._currentSingleModifier = null;\n                }, 300);\n                return false;\n            }\n            if (singleModifier === this._currentSingleModifier) {\n                // bingo!\n                this._log(`/ Dispatching single modifier chord ${singleModifier} ${singleModifier}`);\n                this._currentSingleModifierClearTimeout.cancel();\n                this._currentSingleModifier = null;\n                return this._doDispatch(keybinding, target, /*isSingleModiferChord*/ true);\n            }\n            this._log(`+ Clearing single modifier due to modifier mismatch: ${this._currentSingleModifier} ${singleModifier}`);\n            this._currentSingleModifierClearTimeout.cancel();\n            this._currentSingleModifier = null;\n            return false;\n        }\n        // When pressing a modifier and holding it pressed with any other modifier or key combination,\n        // the pressed modifiers should no longer be considered for single modifier dispatch.\n        const [firstChord,] = keybinding.getChords();\n        this._ignoreSingleModifiers = new KeybindingModifierSet(firstChord);\n        if (this._currentSingleModifier !== null) {\n            this._log(`+ Clearing single modifier due to other key up.`);\n        }\n        this._currentSingleModifierClearTimeout.cancel();\n        this._currentSingleModifier = null;\n        return false;\n    }\n    _doDispatch(userKeypress, target, isSingleModiferChord = false) {\n        let shouldPreventDefault = false;\n        if (userKeypress.hasMultipleChords()) { // warn - because user can press a single chord at a time\n            console.warn('Unexpected keyboard event mapped to multiple chords');\n            return false;\n        }\n        let userPressedChord = null;\n        let currentChords = null;\n        if (isSingleModiferChord) {\n            // The keybinding is the second keypress of a single modifier chord, e.g. \"shift shift\".\n            // A single modifier can only occur when the same modifier is pressed in short sequence,\n            // hence we disregard `_currentChord` and use the same modifier instead.\n            const [dispatchKeyname,] = userKeypress.getSingleModifierDispatchChords();\n            userPressedChord = dispatchKeyname;\n            currentChords = dispatchKeyname ? [dispatchKeyname] : []; // TODO@ulugbekna: in the `else` case we assign an empty array - make sure `resolve` can handle an empty array well\n        }\n        else {\n            [userPressedChord,] = userKeypress.getDispatchChords();\n            currentChords = this._currentChords.map(({ keypress }) => keypress);\n        }\n        if (userPressedChord === null) {\n            this._log(`\\\\ Keyboard event cannot be dispatched in keydown phase.`);\n            // cannot be dispatched, probably only modifier keys\n            return shouldPreventDefault;\n        }\n        const contextValue = this._contextKeyService.getContext(target);\n        const keypressLabel = userKeypress.getLabel();\n        const resolveResult = this._getResolver().resolve(contextValue, currentChords, userPressedChord);\n        switch (resolveResult.kind) {\n            case 0 /* ResultKind.NoMatchingKb */: {\n                this._logService.trace('KeybindingService#dispatch', keypressLabel, `[ No matching keybinding ]`);\n                if (this.inChordMode) {\n                    const currentChordsLabel = this._currentChords.map(({ label }) => label).join(', ');\n                    this._log(`+ Leaving multi-chord mode: Nothing bound to \"${currentChordsLabel}, ${keypressLabel}\".`);\n                    this._notificationService.status(localize(1703, \"The key combination ({0}, {1}) is not a command.\", currentChordsLabel, keypressLabel), { hideAfter: 10 * 1000 /* 10s */ });\n                    this._leaveChordMode();\n                    shouldPreventDefault = true;\n                }\n                return shouldPreventDefault;\n            }\n            case 1 /* ResultKind.MoreChordsNeeded */: {\n                this._logService.trace('KeybindingService#dispatch', keypressLabel, `[ Several keybindings match - more chords needed ]`);\n                shouldPreventDefault = true;\n                this._expectAnotherChord(userPressedChord, keypressLabel);\n                this._log(this._currentChords.length === 1 ? `+ Entering multi-chord mode...` : `+ Continuing multi-chord mode...`);\n                return shouldPreventDefault;\n            }\n            case 2 /* ResultKind.KbFound */: {\n                this._logService.trace('KeybindingService#dispatch', keypressLabel, `[ Will dispatch command ${resolveResult.commandId} ]`);\n                if (resolveResult.commandId === null || resolveResult.commandId === '') {\n                    if (this.inChordMode) {\n                        const currentChordsLabel = this._currentChords.map(({ label }) => label).join(', ');\n                        this._log(`+ Leaving chord mode: Nothing bound to \"${currentChordsLabel}, ${keypressLabel}\".`);\n                        this._notificationService.status(localize(1704, \"The key combination ({0}, {1}) is not a command.\", currentChordsLabel, keypressLabel), { hideAfter: 10 * 1000 /* 10s */ });\n                        this._leaveChordMode();\n                        shouldPreventDefault = true;\n                    }\n                }\n                else {\n                    if (this.inChordMode) {\n                        this._leaveChordMode();\n                    }\n                    if (!resolveResult.isBubble) {\n                        shouldPreventDefault = true;\n                    }\n                    this._log(`+ Invoking command ${resolveResult.commandId}.`);\n                    this._currentlyDispatchingCommandId = resolveResult.commandId;\n                    try {\n                        if (typeof resolveResult.commandArgs === 'undefined') {\n                            this._commandService.executeCommand(resolveResult.commandId).then(undefined, err => this._notificationService.warn(err));\n                        }\n                        else {\n                            this._commandService.executeCommand(resolveResult.commandId, resolveResult.commandArgs).then(undefined, err => this._notificationService.warn(err));\n                        }\n                    }\n                    finally {\n                        this._currentlyDispatchingCommandId = null;\n                    }\n                    if (!HIGH_FREQ_COMMANDS.test(resolveResult.commandId)) {\n                        this._telemetryService.publicLog2('workbenchActionExecuted', { id: resolveResult.commandId, from: 'keybinding', detail: userKeypress.getUserSettingsLabel() ?? undefined });\n                    }\n                }\n                return shouldPreventDefault;\n            }\n        }\n    }\n    mightProducePrintableCharacter(event) {\n        if (event.ctrlKey || event.metaKey) {\n            // ignore ctrl/cmd-combination but not shift/alt-combinatios\n            return false;\n        }\n        // weak check for certain ranges. this is properly implemented in a subclass\n        // with access to the KeyboardMapperFactory.\n        if ((event.keyCode >= 31 /* KeyCode.KeyA */ && event.keyCode <= 56 /* KeyCode.KeyZ */)\n            || (event.keyCode >= 21 /* KeyCode.Digit0 */ && event.keyCode <= 30 /* KeyCode.Digit9 */)) {\n            return true;\n        }\n        return false;\n    }\n}\nclass KeybindingModifierSet {\n    static { this.EMPTY = new KeybindingModifierSet(null); }\n    constructor(source) {\n        this._ctrlKey = source ? source.ctrlKey : false;\n        this._shiftKey = source ? source.shiftKey : false;\n        this._altKey = source ? source.altKey : false;\n        this._metaKey = source ? source.metaKey : false;\n    }\n    has(modifier) {\n        switch (modifier) {\n            case 'ctrl': return this._ctrlKey;\n            case 'shift': return this._shiftKey;\n            case 'alt': return this._altKey;\n            case 'meta': return this._metaKey;\n        }\n    }\n}\n\nexport { AbstractKeybindingService };\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 *--------------------------------------------------------------------------------------------*/\nclass ResolvedKeybindingItem {\n    constructor(resolvedKeybinding, command, commandArgs, when, isDefault, extensionId, isBuiltinExtension) {\n        this._resolvedKeybindingItemBrand = undefined;\n        this.resolvedKeybinding = resolvedKeybinding;\n        this.chords = resolvedKeybinding ? toEmptyArrayIfContainsNull(resolvedKeybinding.getDispatchChords()) : [];\n        if (resolvedKeybinding && this.chords.length === 0) {\n            // handle possible single modifier chord keybindings\n            this.chords = toEmptyArrayIfContainsNull(resolvedKeybinding.getSingleModifierDispatchChords());\n        }\n        this.bubble = (command ? command.charCodeAt(0) === 94 /* CharCode.Caret */ : false);\n        this.command = this.bubble ? command.substr(1) : command;\n        this.commandArgs = commandArgs;\n        this.when = when;\n        this.isDefault = isDefault;\n        this.extensionId = extensionId;\n        this.isBuiltinExtension = isBuiltinExtension;\n    }\n}\nfunction toEmptyArrayIfContainsNull(arr) {\n    const result = [];\n    for (let i = 0, len = arr.length; i < len; i++) {\n        const element = arr[i];\n        if (!element) {\n            return [];\n        }\n        result.push(element);\n    }\n    return result;\n}\n\nexport { ResolvedKeybindingItem, toEmptyArrayIfContainsNull };\n","import { illegalArgument } from '../../../base/common/errors.js';\nimport { UILabelProvider, AriaLabelProvider, ElectronAcceleratorLabelProvider, UserSettingsLabelProvider } from '../../../base/common/keybindingLabels.js';\nimport { ResolvedKeybinding, ResolvedChord } from '../../../base/common/keybindings.js';\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 *--------------------------------------------------------------------------------------------*/\nclass BaseResolvedKeybinding extends ResolvedKeybinding {\n    constructor(os, chords) {\n        super();\n        if (chords.length === 0) {\n            throw illegalArgument(`chords`);\n        }\n        this._os = os;\n        this._chords = chords;\n    }\n    getLabel() {\n        return UILabelProvider.toLabel(this._os, this._chords, (keybinding) => this._getLabel(keybinding));\n    }\n    getAriaLabel() {\n        return AriaLabelProvider.toLabel(this._os, this._chords, (keybinding) => this._getAriaLabel(keybinding));\n    }\n    getElectronAccelerator() {\n        if (this._chords.length > 1) {\n            // [Electron Accelerators] Electron cannot handle chords\n            return null;\n        }\n        if (this._chords[0].isDuplicateModifierCase()) {\n            // [Electron Accelerators] Electron cannot handle modifier only keybindings\n            // e.g. \"shift shift\"\n            return null;\n        }\n        return ElectronAcceleratorLabelProvider.toLabel(this._os, this._chords, (keybinding) => this._getElectronAccelerator(keybinding));\n    }\n    getUserSettingsLabel() {\n        return UserSettingsLabelProvider.toLabel(this._os, this._chords, (keybinding) => this._getUserSettingsLabel(keybinding));\n    }\n    hasMultipleChords() {\n        return (this._chords.length > 1);\n    }\n    getChords() {\n        return this._chords.map((keybinding) => this._getChord(keybinding));\n    }\n    _getChord(keybinding) {\n        return new ResolvedChord(keybinding.ctrlKey, keybinding.shiftKey, keybinding.altKey, keybinding.metaKey, this._getLabel(keybinding), this._getAriaLabel(keybinding));\n    }\n    getDispatchChords() {\n        return this._chords.map((keybinding) => this._getChordDispatch(keybinding));\n    }\n    getSingleModifierDispatchChords() {\n        return this._chords.map((keybinding) => this._getSingleModifierChordDispatch(keybinding));\n    }\n}\n\nexport { BaseResolvedKeybinding };\n","import { KeyCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE } from '../../../base/common/keyCodes.js';\nimport { KeyCodeChord } from '../../../base/common/keybindings.js';\nimport { BaseResolvedKeybinding } from './baseResolvedKeybinding.js';\nimport { toEmptyArrayIfContainsNull } from './resolvedKeybindingItem.js';\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/**\n * Do not instantiate. Use KeybindingService to get a ResolvedKeybinding seeded with information about the current kb layout.\n */\nclass USLayoutResolvedKeybinding extends BaseResolvedKeybinding {\n    constructor(chords, os) {\n        super(os, chords);\n    }\n    _keyCodeToUILabel(keyCode) {\n        if (this._os === 2 /* OperatingSystem.Macintosh */) {\n            switch (keyCode) {\n                case 15 /* KeyCode.LeftArrow */:\n                    return '←';\n                case 16 /* KeyCode.UpArrow */:\n                    return '↑';\n                case 17 /* KeyCode.RightArrow */:\n                    return '→';\n                case 18 /* KeyCode.DownArrow */:\n                    return '↓';\n            }\n        }\n        return KeyCodeUtils.toString(keyCode);\n    }\n    _getLabel(chord) {\n        if (chord.isDuplicateModifierCase()) {\n            return '';\n        }\n        return this._keyCodeToUILabel(chord.keyCode);\n    }\n    _getAriaLabel(chord) {\n        if (chord.isDuplicateModifierCase()) {\n            return '';\n        }\n        return KeyCodeUtils.toString(chord.keyCode);\n    }\n    _getElectronAccelerator(chord) {\n        return KeyCodeUtils.toElectronAccelerator(chord.keyCode);\n    }\n    _getUserSettingsLabel(chord) {\n        if (chord.isDuplicateModifierCase()) {\n            return '';\n        }\n        const result = KeyCodeUtils.toUserSettingsUS(chord.keyCode);\n        return (result ? result.toLowerCase() : result);\n    }\n    _getChordDispatch(chord) {\n        return USLayoutResolvedKeybinding.getDispatchStr(chord);\n    }\n    static getDispatchStr(chord) {\n        if (chord.isModifierKey()) {\n            return null;\n        }\n        let result = '';\n        if (chord.ctrlKey) {\n            result += 'ctrl+';\n        }\n        if (chord.shiftKey) {\n            result += 'shift+';\n        }\n        if (chord.altKey) {\n            result += 'alt+';\n        }\n        if (chord.metaKey) {\n            result += 'meta+';\n        }\n        result += KeyCodeUtils.toString(chord.keyCode);\n        return result;\n    }\n    _getSingleModifierChordDispatch(keybinding) {\n        if (keybinding.keyCode === 5 /* KeyCode.Ctrl */ && !keybinding.shiftKey && !keybinding.altKey && !keybinding.metaKey) {\n            return 'ctrl';\n        }\n        if (keybinding.keyCode === 4 /* KeyCode.Shift */ && !keybinding.ctrlKey && !keybinding.altKey && !keybinding.metaKey) {\n            return 'shift';\n        }\n        if (keybinding.keyCode === 6 /* KeyCode.Alt */ && !keybinding.ctrlKey && !keybinding.shiftKey && !keybinding.metaKey) {\n            return 'alt';\n        }\n        if (keybinding.keyCode === 57 /* KeyCode.Meta */ && !keybinding.ctrlKey && !keybinding.shiftKey && !keybinding.altKey) {\n            return 'meta';\n        }\n        return null;\n    }\n    /**\n     * *NOTE*: Check return value for `KeyCode.Unknown`.\n     */\n    static _scanCodeToKeyCode(scanCode) {\n        const immutableKeyCode = IMMUTABLE_CODE_TO_KEY_CODE[scanCode];\n        if (immutableKeyCode !== -1 /* KeyCode.DependsOnKbLayout */) {\n            return immutableKeyCode;\n        }\n        switch (scanCode) {\n            case 10 /* ScanCode.KeyA */: return 31 /* KeyCode.KeyA */;\n            case 11 /* ScanCode.KeyB */: return 32 /* KeyCode.KeyB */;\n            case 12 /* ScanCode.KeyC */: return 33 /* KeyCode.KeyC */;\n            case 13 /* ScanCode.KeyD */: return 34 /* KeyCode.KeyD */;\n            case 14 /* ScanCode.KeyE */: return 35 /* KeyCode.KeyE */;\n            case 15 /* ScanCode.KeyF */: return 36 /* KeyCode.KeyF */;\n            case 16 /* ScanCode.KeyG */: return 37 /* KeyCode.KeyG */;\n            case 17 /* ScanCode.KeyH */: return 38 /* KeyCode.KeyH */;\n            case 18 /* ScanCode.KeyI */: return 39 /* KeyCode.KeyI */;\n            case 19 /* ScanCode.KeyJ */: return 40 /* KeyCode.KeyJ */;\n            case 20 /* ScanCode.KeyK */: return 41 /* KeyCode.KeyK */;\n            case 21 /* ScanCode.KeyL */: return 42 /* KeyCode.KeyL */;\n            case 22 /* ScanCode.KeyM */: return 43 /* KeyCode.KeyM */;\n            case 23 /* ScanCode.KeyN */: return 44 /* KeyCode.KeyN */;\n            case 24 /* ScanCode.KeyO */: return 45 /* KeyCode.KeyO */;\n            case 25 /* ScanCode.KeyP */: return 46 /* KeyCode.KeyP */;\n            case 26 /* ScanCode.KeyQ */: return 47 /* KeyCode.KeyQ */;\n            case 27 /* ScanCode.KeyR */: return 48 /* KeyCode.KeyR */;\n            case 28 /* ScanCode.KeyS */: return 49 /* KeyCode.KeyS */;\n            case 29 /* ScanCode.KeyT */: return 50 /* KeyCode.KeyT */;\n            case 30 /* ScanCode.KeyU */: return 51 /* KeyCode.KeyU */;\n            case 31 /* ScanCode.KeyV */: return 52 /* KeyCode.KeyV */;\n            case 32 /* ScanCode.KeyW */: return 53 /* KeyCode.KeyW */;\n            case 33 /* ScanCode.KeyX */: return 54 /* KeyCode.KeyX */;\n            case 34 /* ScanCode.KeyY */: return 55 /* KeyCode.KeyY */;\n            case 35 /* ScanCode.KeyZ */: return 56 /* KeyCode.KeyZ */;\n            case 36 /* ScanCode.Digit1 */: return 22 /* KeyCode.Digit1 */;\n            case 37 /* ScanCode.Digit2 */: return 23 /* KeyCode.Digit2 */;\n            case 38 /* ScanCode.Digit3 */: return 24 /* KeyCode.Digit3 */;\n            case 39 /* ScanCode.Digit4 */: return 25 /* KeyCode.Digit4 */;\n            case 40 /* ScanCode.Digit5 */: return 26 /* KeyCode.Digit5 */;\n            case 41 /* ScanCode.Digit6 */: return 27 /* KeyCode.Digit6 */;\n            case 42 /* ScanCode.Digit7 */: return 28 /* KeyCode.Digit7 */;\n            case 43 /* ScanCode.Digit8 */: return 29 /* KeyCode.Digit8 */;\n            case 44 /* ScanCode.Digit9 */: return 30 /* KeyCode.Digit9 */;\n            case 45 /* ScanCode.Digit0 */: return 21 /* KeyCode.Digit0 */;\n            case 51 /* ScanCode.Minus */: return 88 /* KeyCode.Minus */;\n            case 52 /* ScanCode.Equal */: return 86 /* KeyCode.Equal */;\n            case 53 /* ScanCode.BracketLeft */: return 92 /* KeyCode.BracketLeft */;\n            case 54 /* ScanCode.BracketRight */: return 94 /* KeyCode.BracketRight */;\n            case 55 /* ScanCode.Backslash */: return 93 /* KeyCode.Backslash */;\n            case 56 /* ScanCode.IntlHash */: return 0 /* KeyCode.Unknown */; // missing\n            case 57 /* ScanCode.Semicolon */: return 85 /* KeyCode.Semicolon */;\n            case 58 /* ScanCode.Quote */: return 95 /* KeyCode.Quote */;\n            case 59 /* ScanCode.Backquote */: return 91 /* KeyCode.Backquote */;\n            case 60 /* ScanCode.Comma */: return 87 /* KeyCode.Comma */;\n            case 61 /* ScanCode.Period */: return 89 /* KeyCode.Period */;\n            case 62 /* ScanCode.Slash */: return 90 /* KeyCode.Slash */;\n            case 106 /* ScanCode.IntlBackslash */: return 97 /* KeyCode.IntlBackslash */;\n        }\n        return 0 /* KeyCode.Unknown */;\n    }\n    static _toKeyCodeChord(chord) {\n        if (!chord) {\n            return null;\n        }\n        if (chord instanceof KeyCodeChord) {\n            return chord;\n        }\n        const keyCode = this._scanCodeToKeyCode(chord.scanCode);\n        if (keyCode === 0 /* KeyCode.Unknown */) {\n            return null;\n        }\n        return new KeyCodeChord(chord.ctrlKey, chord.shiftKey, chord.altKey, chord.metaKey, keyCode);\n    }\n    static resolveKeybinding(keybinding, os) {\n        const chords = toEmptyArrayIfContainsNull(keybinding.chords.map(chord => this._toKeyCodeChord(chord)));\n        if (chords.length > 0) {\n            return [new USLayoutResolvedKeybinding(chords, os)];\n        }\n        return [];\n    }\n}\n\nexport { USLayoutResolvedKeybinding };\n","import { parse } from '../../../base/common/glob.js';\nimport { Mimes } from '../../../base/common/mime.js';\nimport { Schemas } from '../../../base/common/network.js';\nimport { basename, posix } from '../../../base/common/path.js';\nimport { DataUri } from '../../../base/common/resources.js';\nimport { startsWithUTF8BOM } from '../../../base/common/strings.js';\nimport { PLAINTEXT_LANGUAGE_ID } from '../languages/modesRegistry.js';\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 *--------------------------------------------------------------------------------------------*/\nlet registeredAssociations = [];\nlet nonUserRegisteredAssociations = [];\nlet userRegisteredAssociations = [];\n/**\n * Associate a language to the registry (platform).\n * * **NOTE**: This association will lose over associations registered using `registerConfiguredLanguageAssociation`.\n * * **NOTE**: Use `clearPlatformLanguageAssociations` to remove all associations registered using this function.\n */\nfunction registerPlatformLanguageAssociation(association, warnOnOverwrite = false) {\n    _registerLanguageAssociation(association, false, warnOnOverwrite);\n}\nfunction _registerLanguageAssociation(association, userConfigured, warnOnOverwrite) {\n    // Register\n    const associationItem = toLanguageAssociationItem(association, userConfigured);\n    registeredAssociations.push(associationItem);\n    if (!associationItem.userConfigured) {\n        nonUserRegisteredAssociations.push(associationItem);\n    }\n    else {\n        userRegisteredAssociations.push(associationItem);\n    }\n    // Check for conflicts unless this is a user configured association\n    if (warnOnOverwrite && !associationItem.userConfigured) {\n        registeredAssociations.forEach(a => {\n            if (a.mime === associationItem.mime || a.userConfigured) {\n                return; // same mime or userConfigured is ok\n            }\n            if (associationItem.extension && a.extension === associationItem.extension) {\n                console.warn(`Overwriting extension <<${associationItem.extension}>> to now point to mime <<${associationItem.mime}>>`);\n            }\n            if (associationItem.filename && a.filename === associationItem.filename) {\n                console.warn(`Overwriting filename <<${associationItem.filename}>> to now point to mime <<${associationItem.mime}>>`);\n            }\n            if (associationItem.filepattern && a.filepattern === associationItem.filepattern) {\n                console.warn(`Overwriting filepattern <<${associationItem.filepattern}>> to now point to mime <<${associationItem.mime}>>`);\n            }\n            if (associationItem.firstline && a.firstline === associationItem.firstline) {\n                console.warn(`Overwriting firstline <<${associationItem.firstline}>> to now point to mime <<${associationItem.mime}>>`);\n            }\n        });\n    }\n}\nfunction toLanguageAssociationItem(association, userConfigured) {\n    return {\n        id: association.id,\n        mime: association.mime,\n        filename: association.filename,\n        extension: association.extension,\n        filepattern: association.filepattern,\n        firstline: association.firstline,\n        userConfigured: userConfigured,\n        filenameLowercase: association.filename ? association.filename.toLowerCase() : undefined,\n        extensionLowercase: association.extension ? association.extension.toLowerCase() : undefined,\n        filepatternLowercase: association.filepattern ? parse(association.filepattern.toLowerCase()) : undefined,\n        filepatternOnPath: association.filepattern ? association.filepattern.indexOf(posix.sep) >= 0 : false\n    };\n}\n/**\n * Clear language associations from the registry (platform).\n */\nfunction clearPlatformLanguageAssociations() {\n    registeredAssociations = registeredAssociations.filter(a => a.userConfigured);\n    nonUserRegisteredAssociations = [];\n}\n/**\n * @see `getMimeTypes`\n */\nfunction getLanguageIds(resource, firstLine) {\n    return getAssociations(resource, firstLine).map(item => item.id);\n}\nfunction getAssociations(resource, firstLine) {\n    let path;\n    if (resource) {\n        switch (resource.scheme) {\n            case Schemas.file:\n                path = resource.fsPath;\n                break;\n            case Schemas.data: {\n                const metadata = DataUri.parseMetaData(resource);\n                path = metadata.get(DataUri.META_DATA_LABEL);\n                break;\n            }\n            case Schemas.vscodeNotebookCell:\n                // File path not relevant for language detection of cell\n                path = undefined;\n                break;\n            default:\n                path = resource.path;\n        }\n    }\n    if (!path) {\n        return [{ id: 'unknown', mime: Mimes.unknown }];\n    }\n    path = path.toLowerCase();\n    const filename = basename(path);\n    // 1.) User configured mappings have highest priority\n    const configuredLanguage = getAssociationByPath(path, filename, userRegisteredAssociations);\n    if (configuredLanguage) {\n        return [configuredLanguage, { id: PLAINTEXT_LANGUAGE_ID, mime: Mimes.text }];\n    }\n    // 2.) Registered mappings have middle priority\n    const registeredLanguage = getAssociationByPath(path, filename, nonUserRegisteredAssociations);\n    if (registeredLanguage) {\n        return [registeredLanguage, { id: PLAINTEXT_LANGUAGE_ID, mime: Mimes.text }];\n    }\n    // 3.) Firstline has lowest priority\n    if (firstLine) {\n        const firstlineLanguage = getAssociationByFirstline(firstLine);\n        if (firstlineLanguage) {\n            return [firstlineLanguage, { id: PLAINTEXT_LANGUAGE_ID, mime: Mimes.text }];\n        }\n    }\n    return [{ id: 'unknown', mime: Mimes.unknown }];\n}\nfunction getAssociationByPath(path, filename, associations) {\n    let filenameMatch = undefined;\n    let patternMatch = undefined;\n    let extensionMatch = undefined;\n    // We want to prioritize associations based on the order they are registered so that the last registered\n    // association wins over all other. This is for https://github.com/microsoft/vscode/issues/20074\n    for (let i = associations.length - 1; i >= 0; i--) {\n        const association = associations[i];\n        // First exact name match\n        if (filename === association.filenameLowercase) {\n            filenameMatch = association;\n            break; // take it!\n        }\n        // Longest pattern match\n        if (association.filepattern) {\n            if (!patternMatch || association.filepattern.length > patternMatch.filepattern.length) {\n                const target = association.filepatternOnPath ? path : filename; // match on full path if pattern contains path separator\n                if (association.filepatternLowercase?.(target)) {\n                    patternMatch = association;\n                }\n            }\n        }\n        // Longest extension match\n        if (association.extension) {\n            if (!extensionMatch || association.extension.length > extensionMatch.extension.length) {\n                if (filename.endsWith(association.extensionLowercase)) {\n                    extensionMatch = association;\n                }\n            }\n        }\n    }\n    // 1.) Exact name match has second highest priority\n    if (filenameMatch) {\n        return filenameMatch;\n    }\n    // 2.) Match on pattern\n    if (patternMatch) {\n        return patternMatch;\n    }\n    // 3.) Match on extension comes next\n    if (extensionMatch) {\n        return extensionMatch;\n    }\n    return undefined;\n}\nfunction getAssociationByFirstline(firstLine) {\n    if (startsWithUTF8BOM(firstLine)) {\n        firstLine = firstLine.substr(1);\n    }\n    if (firstLine.length > 0) {\n        // We want to prioritize associations based on the order they are registered so that the last registered\n        // association wins over all other. This is for https://github.com/microsoft/vscode/issues/20074\n        for (let i = registeredAssociations.length - 1; i >= 0; i--) {\n            const association = registeredAssociations[i];\n            if (!association.firstline) {\n                continue;\n            }\n            const matches = firstLine.match(association.firstline);\n            if (matches && matches.length > 0) {\n                return association;\n            }\n        }\n    }\n    return undefined;\n}\n\nexport { clearPlatformLanguageAssociations, getLanguageIds, registerPlatformLanguageAssociation };\n","import { Emitter } from '../../../base/common/event.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { regExpLeadsToEndlessLoop } from '../../../base/common/strings.js';\nimport { clearPlatformLanguageAssociations, registerPlatformLanguageAssociation, getLanguageIds } from './languagesAssociations.js';\nimport { ModesRegistry, PLAINTEXT_LANGUAGE_ID } from '../languages/modesRegistry.js';\nimport { Extensions } from '../../../platform/configuration/common/configurationRegistry.js';\nimport { Registry } from '../../../platform/registry/common/platform.js';\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 *--------------------------------------------------------------------------------------------*/\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst NULL_LANGUAGE_ID = 'vs.editor.nullLanguage';\nclass LanguageIdCodec {\n    constructor() {\n        this._languageIdToLanguage = [];\n        this._languageToLanguageId = new Map();\n        this._register(NULL_LANGUAGE_ID, 0 /* LanguageId.Null */);\n        this._register(PLAINTEXT_LANGUAGE_ID, 1 /* LanguageId.PlainText */);\n        this._nextLanguageId = 2;\n    }\n    _register(language, languageId) {\n        this._languageIdToLanguage[languageId] = language;\n        this._languageToLanguageId.set(language, languageId);\n    }\n    register(language) {\n        if (this._languageToLanguageId.has(language)) {\n            return;\n        }\n        const languageId = this._nextLanguageId++;\n        this._register(language, languageId);\n    }\n    encodeLanguageId(languageId) {\n        return this._languageToLanguageId.get(languageId) || 0 /* LanguageId.Null */;\n    }\n    decodeLanguageId(languageId) {\n        return this._languageIdToLanguage[languageId] || NULL_LANGUAGE_ID;\n    }\n}\nclass LanguagesRegistry extends Disposable {\n    static { this.instanceCount = 0; }\n    constructor(useModesRegistry = true, warnOnOverwrite = false) {\n        super();\n        this._onDidChange = this._register(new Emitter());\n        this.onDidChange = this._onDidChange.event;\n        LanguagesRegistry.instanceCount++;\n        this._warnOnOverwrite = warnOnOverwrite;\n        this.languageIdCodec = new LanguageIdCodec();\n        this._dynamicLanguages = [];\n        this._languages = {};\n        this._mimeTypesMap = {};\n        this._nameMap = {};\n        this._lowercaseNameMap = {};\n        if (useModesRegistry) {\n            this._initializeFromRegistry();\n            this._register(ModesRegistry.onDidChangeLanguages((m) => {\n                this._initializeFromRegistry();\n            }));\n        }\n    }\n    dispose() {\n        LanguagesRegistry.instanceCount--;\n        super.dispose();\n    }\n    _initializeFromRegistry() {\n        this._languages = {};\n        this._mimeTypesMap = {};\n        this._nameMap = {};\n        this._lowercaseNameMap = {};\n        clearPlatformLanguageAssociations();\n        const desc = [].concat(ModesRegistry.getLanguages()).concat(this._dynamicLanguages);\n        this._registerLanguages(desc);\n    }\n    _registerLanguages(desc) {\n        for (const d of desc) {\n            this._registerLanguage(d);\n        }\n        // Rebuild fast path maps\n        this._mimeTypesMap = {};\n        this._nameMap = {};\n        this._lowercaseNameMap = {};\n        Object.keys(this._languages).forEach((langId) => {\n            const language = this._languages[langId];\n            if (language.name) {\n                this._nameMap[language.name] = language.identifier;\n            }\n            language.aliases.forEach((alias) => {\n                this._lowercaseNameMap[alias.toLowerCase()] = language.identifier;\n            });\n            language.mimetypes.forEach((mimetype) => {\n                this._mimeTypesMap[mimetype] = language.identifier;\n            });\n        });\n        Registry.as(Extensions.Configuration).registerOverrideIdentifiers(this.getRegisteredLanguageIds());\n        this._onDidChange.fire();\n    }\n    _registerLanguage(lang) {\n        const langId = lang.id;\n        let resolvedLanguage;\n        if (hasOwnProperty.call(this._languages, langId)) {\n            resolvedLanguage = this._languages[langId];\n        }\n        else {\n            this.languageIdCodec.register(langId);\n            resolvedLanguage = {\n                identifier: langId,\n                name: null,\n                mimetypes: [],\n                aliases: [],\n                extensions: [],\n                filenames: [],\n                configurationFiles: [],\n                icons: []\n            };\n            this._languages[langId] = resolvedLanguage;\n        }\n        this._mergeLanguage(resolvedLanguage, lang);\n    }\n    _mergeLanguage(resolvedLanguage, lang) {\n        const langId = lang.id;\n        let primaryMime = null;\n        if (Array.isArray(lang.mimetypes) && lang.mimetypes.length > 0) {\n            resolvedLanguage.mimetypes.push(...lang.mimetypes);\n            primaryMime = lang.mimetypes[0];\n        }\n        if (!primaryMime) {\n            primaryMime = `text/x-${langId}`;\n            resolvedLanguage.mimetypes.push(primaryMime);\n        }\n        if (Array.isArray(lang.extensions)) {\n            if (lang.configuration) {\n                // insert first as this appears to be the 'primary' language definition\n                resolvedLanguage.extensions = lang.extensions.concat(resolvedLanguage.extensions);\n            }\n            else {\n                resolvedLanguage.extensions = resolvedLanguage.extensions.concat(lang.extensions);\n            }\n            for (const extension of lang.extensions) {\n                registerPlatformLanguageAssociation({ id: langId, mime: primaryMime, extension: extension }, this._warnOnOverwrite);\n            }\n        }\n        if (Array.isArray(lang.filenames)) {\n            for (const filename of lang.filenames) {\n                registerPlatformLanguageAssociation({ id: langId, mime: primaryMime, filename: filename }, this._warnOnOverwrite);\n                resolvedLanguage.filenames.push(filename);\n            }\n        }\n        if (Array.isArray(lang.filenamePatterns)) {\n            for (const filenamePattern of lang.filenamePatterns) {\n                registerPlatformLanguageAssociation({ id: langId, mime: primaryMime, filepattern: filenamePattern }, this._warnOnOverwrite);\n            }\n        }\n        if (typeof lang.firstLine === 'string' && lang.firstLine.length > 0) {\n            let firstLineRegexStr = lang.firstLine;\n            if (firstLineRegexStr.charAt(0) !== '^') {\n                firstLineRegexStr = '^' + firstLineRegexStr;\n            }\n            try {\n                const firstLineRegex = new RegExp(firstLineRegexStr);\n                if (!regExpLeadsToEndlessLoop(firstLineRegex)) {\n                    registerPlatformLanguageAssociation({ id: langId, mime: primaryMime, firstline: firstLineRegex }, this._warnOnOverwrite);\n                }\n            }\n            catch (err) {\n                // Most likely, the regex was bad\n                console.warn(`[${lang.id}]: Invalid regular expression \\`${firstLineRegexStr}\\`: `, err);\n            }\n        }\n        resolvedLanguage.aliases.push(langId);\n        let langAliases = null;\n        if (typeof lang.aliases !== 'undefined' && Array.isArray(lang.aliases)) {\n            if (lang.aliases.length === 0) {\n                // signal that this language should not get a name\n                langAliases = [null];\n            }\n            else {\n                langAliases = lang.aliases;\n            }\n        }\n        if (langAliases !== null) {\n            for (const langAlias of langAliases) {\n                if (!langAlias || langAlias.length === 0) {\n                    continue;\n                }\n                resolvedLanguage.aliases.push(langAlias);\n            }\n        }\n        const containsAliases = (langAliases !== null && langAliases.length > 0);\n        if (containsAliases && langAliases[0] === null) ;\n        else {\n            const bestName = (containsAliases ? langAliases[0] : null) || langId;\n            if (containsAliases || !resolvedLanguage.name) {\n                resolvedLanguage.name = bestName;\n            }\n        }\n        if (lang.configuration) {\n            resolvedLanguage.configurationFiles.push(lang.configuration);\n        }\n        if (lang.icon) {\n            resolvedLanguage.icons.push(lang.icon);\n        }\n    }\n    isRegisteredLanguageId(languageId) {\n        if (!languageId) {\n            return false;\n        }\n        return hasOwnProperty.call(this._languages, languageId);\n    }\n    getRegisteredLanguageIds() {\n        return Object.keys(this._languages);\n    }\n    getLanguageIdByLanguageName(languageName) {\n        const languageNameLower = languageName.toLowerCase();\n        if (!hasOwnProperty.call(this._lowercaseNameMap, languageNameLower)) {\n            return null;\n        }\n        return this._lowercaseNameMap[languageNameLower];\n    }\n    getLanguageIdByMimeType(mimeType) {\n        if (!mimeType) {\n            return null;\n        }\n        if (hasOwnProperty.call(this._mimeTypesMap, mimeType)) {\n            return this._mimeTypesMap[mimeType];\n        }\n        return null;\n    }\n    guessLanguageIdByFilepathOrFirstLine(resource, firstLine) {\n        if (!resource && !firstLine) {\n            return [];\n        }\n        return getLanguageIds(resource, firstLine);\n    }\n}\n\nexport { LanguageIdCodec, LanguagesRegistry };\n","import { Emitter, Event } from '../../../base/common/event.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { LanguagesRegistry } from './languagesRegistry.js';\nimport { TokenizationRegistry } from '../languages.js';\nimport { PLAINTEXT_LANGUAGE_ID } from '../languages/modesRegistry.js';\nimport '../../../base/common/observableInternal/index.js';\nimport { observableFromEvent } from '../../../base/common/observableInternal/observables/observableFromEvent.js';\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 *--------------------------------------------------------------------------------------------*/\nclass LanguageService extends Disposable {\n    static { this.instanceCount = 0; }\n    constructor(warnOnOverwrite = false) {\n        super();\n        this._onDidRequestBasicLanguageFeatures = this._register(new Emitter());\n        this.onDidRequestBasicLanguageFeatures = this._onDidRequestBasicLanguageFeatures.event;\n        this._onDidRequestRichLanguageFeatures = this._register(new Emitter());\n        this.onDidRequestRichLanguageFeatures = this._onDidRequestRichLanguageFeatures.event;\n        this._onDidChange = this._register(new Emitter({ leakWarningThreshold: 200 /* https://github.com/microsoft/vscode/issues/119968 */ }));\n        this.onDidChange = this._onDidChange.event;\n        this._requestedBasicLanguages = new Set();\n        this._requestedRichLanguages = new Set();\n        LanguageService.instanceCount++;\n        this._registry = this._register(new LanguagesRegistry(true, warnOnOverwrite));\n        this.languageIdCodec = this._registry.languageIdCodec;\n        this._register(this._registry.onDidChange(() => this._onDidChange.fire()));\n    }\n    dispose() {\n        LanguageService.instanceCount--;\n        super.dispose();\n    }\n    isRegisteredLanguageId(languageId) {\n        return this._registry.isRegisteredLanguageId(languageId);\n    }\n    getLanguageIdByLanguageName(languageName) {\n        return this._registry.getLanguageIdByLanguageName(languageName);\n    }\n    getLanguageIdByMimeType(mimeType) {\n        return this._registry.getLanguageIdByMimeType(mimeType);\n    }\n    guessLanguageIdByFilepathOrFirstLine(resource, firstLine) {\n        const languageIds = this._registry.guessLanguageIdByFilepathOrFirstLine(resource, firstLine);\n        return languageIds.at(0) ?? null;\n    }\n    createById(languageId) {\n        return new LanguageSelection(this.onDidChange, () => {\n            return this._createAndGetLanguageIdentifier(languageId);\n        });\n    }\n    createByFilepathOrFirstLine(resource, firstLine) {\n        return new LanguageSelection(this.onDidChange, () => {\n            const languageId = this.guessLanguageIdByFilepathOrFirstLine(resource, firstLine);\n            return this._createAndGetLanguageIdentifier(languageId);\n        });\n    }\n    _createAndGetLanguageIdentifier(languageId) {\n        if (!languageId || !this.isRegisteredLanguageId(languageId)) {\n            // Fall back to plain text if language is unknown\n            languageId = PLAINTEXT_LANGUAGE_ID;\n        }\n        return languageId;\n    }\n    requestBasicLanguageFeatures(languageId) {\n        if (!this._requestedBasicLanguages.has(languageId)) {\n            this._requestedBasicLanguages.add(languageId);\n            this._onDidRequestBasicLanguageFeatures.fire(languageId);\n        }\n    }\n    requestRichLanguageFeatures(languageId) {\n        if (!this._requestedRichLanguages.has(languageId)) {\n            this._requestedRichLanguages.add(languageId);\n            // Ensure basic features are requested\n            this.requestBasicLanguageFeatures(languageId);\n            // Ensure tokenizers are created\n            TokenizationRegistry.getOrCreate(languageId);\n            this._onDidRequestRichLanguageFeatures.fire(languageId);\n        }\n    }\n}\nclass LanguageSelection {\n    constructor(onDidChangeLanguages, selector) {\n        this._value = observableFromEvent(this, onDidChangeLanguages, () => selector());\n        this.onDidChange = Event.fromObservable(this._value);\n    }\n    get languageId() {\n        return this._value.get();\n    }\n}\n\nexport { LanguageService };\n","import { isFirefox } from '../../browser.js';\nimport { Gesture, EventType as EventType$1 } from '../../touch.js';\nimport { addDisposableListener, EventType, EventHelper, isAncestor, getWindow, isInShadowDOM, getActiveElement, append, $, Dimension, clearNode } from '../../dom.js';\nimport { createStyleSheet } from '../../domStylesheets.js';\nimport { StandardKeyboardEvent } from '../../keyboardEvent.js';\nimport { StandardMouseEvent } from '../../mouseEvent.js';\nimport { ActionBar } from '../actionbar/actionbar.js';\nimport { ActionViewItem, BaseActionViewItem } from '../actionbar/actionViewItems.js';\nimport { layout } from '../contextview/contextview.js';\nimport { DomScrollableElement } from '../scrollbar/scrollableElement.js';\nimport { Separator, SubmenuAction, EmptySubmenuAction } from '../../../common/actions.js';\nimport { RunOnceScheduler } from '../../../common/async.js';\nimport { Codicon } from '../../../common/codicons.js';\nimport { getCodiconFontCharacters } from '../../../common/codiconsUtil.js';\nimport { ThemeIcon } from '../../../common/themables.js';\nimport { stripIcons } from '../../../common/iconLabels.js';\nimport { DisposableStore } from '../../../common/lifecycle.js';\nimport { isMacintosh, isLinux } from '../../../common/platform.js';\nimport { escape, ltrim, rtrim } from '../../../common/strings.js';\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 *--------------------------------------------------------------------------------------------*/\nconst MENU_MNEMONIC_REGEX = /\\(&([^\\s&])\\)|(^|[^&])&([^\\s&])/;\nconst MENU_ESCAPED_MNEMONIC_REGEX = /(&amp;)?(&amp;)([^\\s&])/g;\nvar HorizontalDirection;\n(function (HorizontalDirection) {\n    HorizontalDirection[HorizontalDirection[\"Right\"] = 0] = \"Right\";\n    HorizontalDirection[HorizontalDirection[\"Left\"] = 1] = \"Left\";\n})(HorizontalDirection || (HorizontalDirection = {}));\nvar VerticalDirection;\n(function (VerticalDirection) {\n    VerticalDirection[VerticalDirection[\"Above\"] = 0] = \"Above\";\n    VerticalDirection[VerticalDirection[\"Below\"] = 1] = \"Below\";\n})(VerticalDirection || (VerticalDirection = {}));\nclass Menu extends ActionBar {\n    constructor(container, actions, options, menuStyles) {\n        container.classList.add('monaco-menu-container');\n        container.setAttribute('role', 'presentation');\n        const menuElement = document.createElement('div');\n        menuElement.classList.add('monaco-menu');\n        menuElement.setAttribute('role', 'presentation');\n        super(menuElement, {\n            orientation: 1 /* ActionsOrientation.VERTICAL */,\n            actionViewItemProvider: action => this.doGetActionViewItem(action, options, parentData),\n            context: options.context,\n            actionRunner: options.actionRunner,\n            ariaLabel: options.ariaLabel,\n            ariaRole: 'menu',\n            focusOnlyEnabledItems: true,\n            triggerKeys: { keys: [3 /* KeyCode.Enter */, ...(isMacintosh || isLinux ? [10 /* KeyCode.Space */] : [])], keyDown: true }\n        });\n        this.menuStyles = menuStyles;\n        this.menuElement = menuElement;\n        this.actionsList.tabIndex = 0;\n        this.initializeOrUpdateStyleSheet(container, menuStyles);\n        this._register(Gesture.addTarget(menuElement));\n        this._register(addDisposableListener(menuElement, EventType.KEY_DOWN, (e) => {\n            const event = new StandardKeyboardEvent(e);\n            // Stop tab navigation of menus\n            if (event.equals(2 /* KeyCode.Tab */)) {\n                e.preventDefault();\n            }\n        }));\n        if (options.enableMnemonics) {\n            this._register(addDisposableListener(menuElement, EventType.KEY_DOWN, (e) => {\n                const key = e.key.toLocaleLowerCase();\n                if (this.mnemonics.has(key)) {\n                    EventHelper.stop(e, true);\n                    const actions = this.mnemonics.get(key);\n                    if (actions.length === 1) {\n                        if (actions[0] instanceof SubmenuMenuActionViewItem && actions[0].container) {\n                            this.focusItemByElement(actions[0].container);\n                        }\n                        actions[0].onClick(e);\n                    }\n                    if (actions.length > 1) {\n                        const action = actions.shift();\n                        if (action && action.container) {\n                            this.focusItemByElement(action.container);\n                            actions.push(action);\n                        }\n                        this.mnemonics.set(key, actions);\n                    }\n                }\n            }));\n        }\n        if (isLinux) {\n            this._register(addDisposableListener(menuElement, EventType.KEY_DOWN, e => {\n                const event = new StandardKeyboardEvent(e);\n                if (event.equals(14 /* KeyCode.Home */) || event.equals(11 /* KeyCode.PageUp */)) {\n                    this.focusedItem = this.viewItems.length - 1;\n                    this.focusNext();\n                    EventHelper.stop(e, true);\n                }\n                else if (event.equals(13 /* KeyCode.End */) || event.equals(12 /* KeyCode.PageDown */)) {\n                    this.focusedItem = 0;\n                    this.focusPrevious();\n                    EventHelper.stop(e, true);\n                }\n            }));\n        }\n        this._register(addDisposableListener(this.domNode, EventType.MOUSE_OUT, e => {\n            const relatedTarget = e.relatedTarget;\n            if (!isAncestor(relatedTarget, this.domNode)) {\n                this.focusedItem = undefined;\n                this.updateFocus();\n                e.stopPropagation();\n            }\n        }));\n        this._register(addDisposableListener(this.actionsList, EventType.MOUSE_OVER, e => {\n            let target = e.target;\n            if (!target || !isAncestor(target, this.actionsList) || target === this.actionsList) {\n                return;\n            }\n            while (target.parentElement !== this.actionsList && target.parentElement !== null) {\n                target = target.parentElement;\n            }\n            if (target.classList.contains('action-item')) {\n                const lastFocusedItem = this.focusedItem;\n                this.setFocusedItem(target);\n                if (lastFocusedItem !== this.focusedItem) {\n                    this.updateFocus();\n                }\n            }\n        }));\n        // Support touch on actions list to focus items (needed for submenus)\n        this._register(Gesture.addTarget(this.actionsList));\n        this._register(addDisposableListener(this.actionsList, EventType$1.Tap, e => {\n            let target = e.initialTarget;\n            if (!target || !isAncestor(target, this.actionsList) || target === this.actionsList) {\n                return;\n            }\n            while (target.parentElement !== this.actionsList && target.parentElement !== null) {\n                target = target.parentElement;\n            }\n            if (target.classList.contains('action-item')) {\n                const lastFocusedItem = this.focusedItem;\n                this.setFocusedItem(target);\n                if (lastFocusedItem !== this.focusedItem) {\n                    this.updateFocus();\n                }\n            }\n        }));\n        const parentData = {\n            parent: this\n        };\n        this.mnemonics = new Map();\n        // Scroll Logic\n        this.scrollableElement = this._register(new DomScrollableElement(menuElement, {\n            alwaysConsumeMouseWheel: true,\n            horizontal: 2 /* ScrollbarVisibility.Hidden */,\n            vertical: 3 /* ScrollbarVisibility.Visible */,\n            verticalScrollbarSize: 7,\n            handleMouseWheel: true,\n            useShadows: true\n        }));\n        const scrollElement = this.scrollableElement.getDomNode();\n        scrollElement.style.position = '';\n        this.styleScrollElement(scrollElement, menuStyles);\n        // Support scroll on menu drag\n        this._register(addDisposableListener(menuElement, EventType$1.Change, e => {\n            EventHelper.stop(e, true);\n            const scrollTop = this.scrollableElement.getScrollPosition().scrollTop;\n            this.scrollableElement.setScrollPosition({ scrollTop: scrollTop - e.translationY });\n        }));\n        this._register(addDisposableListener(scrollElement, EventType.MOUSE_UP, e => {\n            // Absorb clicks in menu dead space https://github.com/microsoft/vscode/issues/63575\n            // We do this on the scroll element so the scroll bar doesn't dismiss the menu either\n            e.preventDefault();\n        }));\n        const window = getWindow(container);\n        menuElement.style.maxHeight = `${Math.max(10, window.innerHeight - container.getBoundingClientRect().top - 35)}px`;\n        actions = actions.filter((a, idx) => {\n            if (options.submenuIds?.has(a.id)) {\n                console.warn(`Found submenu cycle: ${a.id}`);\n                return false;\n            }\n            // Filter out consecutive or useless separators\n            if (a instanceof Separator) {\n                if (idx === actions.length - 1 || idx === 0) {\n                    return false;\n                }\n                const prevAction = actions[idx - 1];\n                if (prevAction instanceof Separator) {\n                    return false;\n                }\n            }\n            return true;\n        });\n        this.push(actions, { icon: true, label: true, isMenu: true });\n        container.appendChild(this.scrollableElement.getDomNode());\n        this.scrollableElement.scanDomNode();\n        this.viewItems.filter(item => !(item instanceof MenuSeparatorActionViewItem)).forEach((item, index, array) => {\n            item.updatePositionInSet(index + 1, array.length);\n        });\n    }\n    initializeOrUpdateStyleSheet(container, style) {\n        if (!this.styleSheet) {\n            if (isInShadowDOM(container)) {\n                this.styleSheet = createStyleSheet(container);\n            }\n            else {\n                if (!Menu.globalStyleSheet) {\n                    Menu.globalStyleSheet = createStyleSheet();\n                }\n                this.styleSheet = Menu.globalStyleSheet;\n            }\n        }\n        this.styleSheet.textContent = getMenuWidgetCSS(style, isInShadowDOM(container));\n    }\n    styleScrollElement(scrollElement, style) {\n        const fgColor = style.foregroundColor ?? '';\n        const bgColor = style.backgroundColor ?? '';\n        const border = style.borderColor ? `1px solid ${style.borderColor}` : '';\n        const borderRadius = '5px';\n        const shadow = style.shadowColor ? `0 2px 8px ${style.shadowColor}` : '';\n        scrollElement.style.outline = border;\n        scrollElement.style.borderRadius = borderRadius;\n        scrollElement.style.color = fgColor;\n        scrollElement.style.backgroundColor = bgColor;\n        scrollElement.style.boxShadow = shadow;\n    }\n    getContainer() {\n        return this.scrollableElement.getDomNode();\n    }\n    get onScroll() {\n        return this.scrollableElement.onScroll;\n    }\n    focusItemByElement(element) {\n        const lastFocusedItem = this.focusedItem;\n        this.setFocusedItem(element);\n        if (lastFocusedItem !== this.focusedItem) {\n            this.updateFocus();\n        }\n    }\n    setFocusedItem(element) {\n        for (let i = 0; i < this.actionsList.children.length; i++) {\n            const elem = this.actionsList.children[i];\n            if (element === elem) {\n                this.focusedItem = i;\n                break;\n            }\n        }\n    }\n    updateFocus(fromRight) {\n        super.updateFocus(fromRight, true, true);\n        if (typeof this.focusedItem !== 'undefined') {\n            // Workaround for #80047 caused by an issue in chromium\n            // https://bugs.chromium.org/p/chromium/issues/detail?id=414283\n            // When that's fixed, just call this.scrollableElement.scanDomNode()\n            this.scrollableElement.setScrollPosition({\n                scrollTop: Math.round(this.menuElement.scrollTop)\n            });\n        }\n    }\n    doGetActionViewItem(action, options, parentData) {\n        if (action instanceof Separator) {\n            return new MenuSeparatorActionViewItem(options.context, action, { icon: true }, this.menuStyles);\n        }\n        else if (action instanceof SubmenuAction) {\n            const menuActionViewItem = new SubmenuMenuActionViewItem(action, action.actions, parentData, { ...options, submenuIds: new Set([...(options.submenuIds || []), action.id]) }, this.menuStyles);\n            if (options.enableMnemonics) {\n                const mnemonic = menuActionViewItem.getMnemonic();\n                if (mnemonic && menuActionViewItem.isEnabled()) {\n                    let actionViewItems = [];\n                    if (this.mnemonics.has(mnemonic)) {\n                        actionViewItems = this.mnemonics.get(mnemonic);\n                    }\n                    actionViewItems.push(menuActionViewItem);\n                    this.mnemonics.set(mnemonic, actionViewItems);\n                }\n            }\n            return menuActionViewItem;\n        }\n        else {\n            const keybindingLabel = options.getKeyBinding?.(action)?.getLabel();\n            const menuItemOptions = {\n                enableMnemonics: options.enableMnemonics,\n                useEventAsContext: options.useEventAsContext,\n                keybinding: keybindingLabel,\n            };\n            const menuActionViewItem = new BaseMenuActionViewItem(options.context, action, menuItemOptions, this.menuStyles);\n            if (options.enableMnemonics) {\n                const mnemonic = menuActionViewItem.getMnemonic();\n                if (mnemonic && menuActionViewItem.isEnabled()) {\n                    let actionViewItems = [];\n                    if (this.mnemonics.has(mnemonic)) {\n                        actionViewItems = this.mnemonics.get(mnemonic);\n                    }\n                    actionViewItems.push(menuActionViewItem);\n                    this.mnemonics.set(mnemonic, actionViewItems);\n                }\n            }\n            return menuActionViewItem;\n        }\n    }\n}\nclass BaseMenuActionViewItem extends BaseActionViewItem {\n    constructor(ctx, action, options, menuStyle) {\n        options = {\n            ...options,\n            isMenu: true,\n            icon: options.icon !== undefined ? options.icon : false,\n            label: options.label !== undefined ? options.label : true,\n        };\n        super(action, action, options);\n        this.menuStyle = menuStyle;\n        this.options = options;\n        this.cssClass = '';\n        // Set mnemonic\n        if (this.options.label && options.enableMnemonics) {\n            const label = this.action.label;\n            if (label) {\n                const matches = MENU_MNEMONIC_REGEX.exec(label);\n                if (matches) {\n                    this.mnemonic = (!!matches[1] ? matches[1] : matches[3]).toLocaleLowerCase();\n                }\n            }\n        }\n        // Add mouse up listener later to avoid accidental clicks\n        this.runOnceToEnableMouseUp = new RunOnceScheduler(() => {\n            if (!this.element) {\n                return;\n            }\n            this._register(addDisposableListener(this.element, EventType.MOUSE_UP, e => {\n                // removed default prevention as it conflicts\n                // with BaseActionViewItem #101537\n                // add back if issues arise and link new issue\n                EventHelper.stop(e, true);\n                // See https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Interact_with_the_clipboard\n                // > Writing to the clipboard\n                // > You can use the \"cut\" and \"copy\" commands without any special\n                // permission if you are using them in a short-lived event handler\n                // for a user action (for example, a click handler).\n                // => to get the Copy and Paste context menu actions working on Firefox,\n                // there should be no timeout here\n                if (isFirefox) {\n                    const mouseEvent = new StandardMouseEvent(getWindow(this.element), e);\n                    // Allowing right click to trigger the event causes the issue described below,\n                    // but since the solution below does not work in FF, we must disable right click\n                    if (mouseEvent.rightButton) {\n                        return;\n                    }\n                    this.onClick(e);\n                }\n                // In all other cases, set timeout to allow context menu cancellation to trigger\n                // otherwise the action will destroy the menu and a second context menu\n                // will still trigger for right click.\n                else {\n                    setTimeout(() => {\n                        this.onClick(e);\n                    }, 0);\n                }\n            }));\n            this._register(addDisposableListener(this.element, EventType.CONTEXT_MENU, e => {\n                EventHelper.stop(e, true);\n            }));\n        }, 100);\n        this._register(this.runOnceToEnableMouseUp);\n    }\n    render(container) {\n        super.render(container);\n        if (!this.element) {\n            return;\n        }\n        this.container = container;\n        this.item = append(this.element, $('a.action-menu-item'));\n        if (this._action.id === Separator.ID) {\n            // A separator is a presentation item\n            this.item.setAttribute('role', 'presentation');\n        }\n        else {\n            this.item.setAttribute('role', 'menuitem');\n            if (this.mnemonic) {\n                this.item.setAttribute('aria-keyshortcuts', `${this.mnemonic}`);\n            }\n        }\n        this.check = append(this.item, $('span.menu-item-check' + ThemeIcon.asCSSSelector(Codicon.menuSelection)));\n        this.check.setAttribute('role', 'none');\n        this.label = append(this.item, $('span.action-label'));\n        if (this.options.label && this.options.keybinding) {\n            append(this.item, $('span.keybinding')).textContent = this.options.keybinding;\n        }\n        // Adds mouse up listener to actually run the action\n        this.runOnceToEnableMouseUp.schedule();\n        this.updateClass();\n        this.updateLabel();\n        this.updateTooltip();\n        this.updateEnabled();\n        this.updateChecked();\n        this.applyStyle();\n    }\n    blur() {\n        super.blur();\n        this.applyStyle();\n    }\n    focus() {\n        super.focus();\n        this.item?.focus();\n        this.applyStyle();\n    }\n    updatePositionInSet(pos, setSize) {\n        if (this.item) {\n            this.item.setAttribute('aria-posinset', `${pos}`);\n            this.item.setAttribute('aria-setsize', `${setSize}`);\n        }\n    }\n    updateLabel() {\n        if (!this.label) {\n            return;\n        }\n        if (this.options.label) {\n            clearNode(this.label);\n            let label = stripIcons(this.action.label);\n            if (label) {\n                const cleanLabel = cleanMnemonic(label);\n                if (!this.options.enableMnemonics) {\n                    label = cleanLabel;\n                }\n                this.label.setAttribute('aria-label', cleanLabel.replace(/&&/g, '&'));\n                const matches = MENU_MNEMONIC_REGEX.exec(label);\n                if (matches) {\n                    label = escape(label);\n                    // This is global, reset it\n                    MENU_ESCAPED_MNEMONIC_REGEX.lastIndex = 0;\n                    let escMatch = MENU_ESCAPED_MNEMONIC_REGEX.exec(label);\n                    // We can't use negative lookbehind so if we match our negative and skip\n                    while (escMatch && escMatch[1]) {\n                        escMatch = MENU_ESCAPED_MNEMONIC_REGEX.exec(label);\n                    }\n                    const replaceDoubleEscapes = (str) => str.replace(/&amp;&amp;/g, '&amp;');\n                    if (escMatch) {\n                        this.label.append(ltrim(replaceDoubleEscapes(label.substr(0, escMatch.index)), ' '), $('u', { 'aria-hidden': 'true' }, escMatch[3]), rtrim(replaceDoubleEscapes(label.substr(escMatch.index + escMatch[0].length)), ' '));\n                    }\n                    else {\n                        this.label.textContent = replaceDoubleEscapes(label).trim();\n                    }\n                    this.item?.setAttribute('aria-keyshortcuts', (!!matches[1] ? matches[1] : matches[3]).toLocaleLowerCase());\n                }\n                else {\n                    this.label.textContent = label.replace(/&&/g, '&').trim();\n                }\n            }\n        }\n    }\n    updateTooltip() {\n        // menus should function like native menus and they do not have tooltips\n    }\n    updateClass() {\n        if (this.cssClass && this.item) {\n            this.item.classList.remove(...this.cssClass.split(' '));\n        }\n        if (this.options.icon && this.label) {\n            this.cssClass = this.action.class || '';\n            this.label.classList.add('icon');\n            if (this.cssClass) {\n                this.label.classList.add(...this.cssClass.split(' '));\n            }\n            this.updateEnabled();\n        }\n        else if (this.label) {\n            this.label.classList.remove('icon');\n        }\n    }\n    updateEnabled() {\n        if (this.action.enabled) {\n            if (this.element) {\n                this.element.classList.remove('disabled');\n                this.element.removeAttribute('aria-disabled');\n            }\n            if (this.item) {\n                this.item.classList.remove('disabled');\n                this.item.removeAttribute('aria-disabled');\n                this.item.tabIndex = 0;\n            }\n        }\n        else {\n            if (this.element) {\n                this.element.classList.add('disabled');\n                this.element.setAttribute('aria-disabled', 'true');\n            }\n            if (this.item) {\n                this.item.classList.add('disabled');\n                this.item.setAttribute('aria-disabled', 'true');\n            }\n        }\n    }\n    updateChecked() {\n        if (!this.item) {\n            return;\n        }\n        const checked = this.action.checked;\n        this.item.classList.toggle('checked', !!checked);\n        if (checked !== undefined) {\n            this.item.setAttribute('role', 'menuitemcheckbox');\n            this.item.setAttribute('aria-checked', checked ? 'true' : 'false');\n        }\n        else {\n            this.item.setAttribute('role', 'menuitem');\n            this.item.setAttribute('aria-checked', '');\n        }\n    }\n    getMnemonic() {\n        return this.mnemonic;\n    }\n    applyStyle() {\n        const isSelected = this.element && this.element.classList.contains('focused');\n        const fgColor = isSelected && this.menuStyle.selectionForegroundColor ? this.menuStyle.selectionForegroundColor : this.menuStyle.foregroundColor;\n        const bgColor = isSelected && this.menuStyle.selectionBackgroundColor ? this.menuStyle.selectionBackgroundColor : undefined;\n        const outline = isSelected && this.menuStyle.selectionBorderColor ? `1px solid ${this.menuStyle.selectionBorderColor}` : '';\n        const outlineOffset = isSelected && this.menuStyle.selectionBorderColor ? `-1px` : '';\n        if (this.item) {\n            this.item.style.color = fgColor ?? '';\n            this.item.style.backgroundColor = bgColor ?? '';\n            this.item.style.outline = outline;\n            this.item.style.outlineOffset = outlineOffset;\n        }\n        if (this.check) {\n            this.check.style.color = fgColor ?? '';\n        }\n    }\n}\nclass SubmenuMenuActionViewItem extends BaseMenuActionViewItem {\n    constructor(action, submenuActions, parentData, submenuOptions, menuStyles) {\n        super(action, action, submenuOptions, menuStyles);\n        this.submenuActions = submenuActions;\n        this.parentData = parentData;\n        this.submenuOptions = submenuOptions;\n        this.mysubmenu = null;\n        this.submenuDisposables = this._register(new DisposableStore());\n        this.mouseOver = false;\n        this.expandDirection = submenuOptions && submenuOptions.expandDirection !== undefined ? submenuOptions.expandDirection : { horizontal: HorizontalDirection.Right, vertical: VerticalDirection.Below };\n        this.showScheduler = new RunOnceScheduler(() => {\n            if (this.mouseOver) {\n                this.cleanupExistingSubmenu(false);\n                this.createSubmenu(false);\n            }\n        }, 250);\n        this.hideScheduler = new RunOnceScheduler(() => {\n            if (this.element && (!isAncestor(getActiveElement(), this.element) && this.parentData.submenu === this.mysubmenu)) {\n                this.parentData.parent.focus(false);\n                this.cleanupExistingSubmenu(true);\n            }\n        }, 750);\n    }\n    render(container) {\n        super.render(container);\n        if (!this.element) {\n            return;\n        }\n        if (this.item) {\n            this.item.classList.add('monaco-submenu-item');\n            this.item.tabIndex = 0;\n            this.item.setAttribute('aria-haspopup', 'true');\n            this.updateAriaExpanded('false');\n            this.submenuIndicator = append(this.item, $('span.submenu-indicator' + ThemeIcon.asCSSSelector(Codicon.menuSubmenu)));\n            this.submenuIndicator.setAttribute('aria-hidden', 'true');\n        }\n        this._register(addDisposableListener(this.element, EventType.KEY_UP, e => {\n            const event = new StandardKeyboardEvent(e);\n            if (event.equals(17 /* KeyCode.RightArrow */) || event.equals(3 /* KeyCode.Enter */)) {\n                EventHelper.stop(e, true);\n                this.createSubmenu(true);\n            }\n        }));\n        this._register(addDisposableListener(this.element, EventType.KEY_DOWN, e => {\n            const event = new StandardKeyboardEvent(e);\n            if (getActiveElement() === this.item) {\n                if (event.equals(17 /* KeyCode.RightArrow */) || event.equals(3 /* KeyCode.Enter */)) {\n                    EventHelper.stop(e, true);\n                }\n            }\n        }));\n        this._register(addDisposableListener(this.element, EventType.MOUSE_OVER, e => {\n            if (!this.mouseOver) {\n                this.mouseOver = true;\n                this.showScheduler.schedule();\n            }\n        }));\n        this._register(addDisposableListener(this.element, EventType.MOUSE_LEAVE, e => {\n            this.mouseOver = false;\n        }));\n        this._register(addDisposableListener(this.element, EventType.FOCUS_OUT, e => {\n            if (this.element && !isAncestor(getActiveElement(), this.element)) {\n                this.hideScheduler.schedule();\n            }\n        }));\n        this._register(this.parentData.parent.onScroll(() => {\n            if (this.parentData.submenu === this.mysubmenu) {\n                this.parentData.parent.focus(false);\n                this.cleanupExistingSubmenu(true);\n            }\n        }));\n    }\n    updateEnabled() {\n        // override on submenu entry\n        // native menus do not observe enablement on sumbenus\n        // we mimic that behavior\n    }\n    onClick(e) {\n        // stop clicking from trying to run an action\n        EventHelper.stop(e, true);\n        this.cleanupExistingSubmenu(false);\n        this.createSubmenu(true);\n    }\n    cleanupExistingSubmenu(force) {\n        if (this.parentData.submenu && (force || (this.parentData.submenu !== this.mysubmenu))) {\n            // disposal may throw if the submenu has already been removed\n            try {\n                this.parentData.submenu.dispose();\n            }\n            catch { }\n            this.parentData.submenu = undefined;\n            this.updateAriaExpanded('false');\n            if (this.submenuContainer) {\n                this.submenuDisposables.clear();\n                this.submenuContainer = undefined;\n            }\n        }\n    }\n    calculateSubmenuMenuLayout(windowDimensions, submenu, entry, expandDirection) {\n        const ret = { top: 0, left: 0 };\n        // Start with horizontal\n        ret.left = layout(windowDimensions.width, submenu.width, { position: expandDirection.horizontal === HorizontalDirection.Right ? 0 /* LayoutAnchorPosition.Before */ : 1 /* LayoutAnchorPosition.After */, offset: entry.left, size: entry.width });\n        // We don't have enough room to layout the menu fully, so we are overlapping the menu\n        if (ret.left >= entry.left && ret.left < entry.left + entry.width) {\n            if (entry.left + 10 + submenu.width <= windowDimensions.width) {\n                ret.left = entry.left + 10;\n            }\n            entry.top += 10;\n            entry.height = 0;\n        }\n        // Now that we have a horizontal position, try layout vertically\n        ret.top = layout(windowDimensions.height, submenu.height, { position: 0 /* LayoutAnchorPosition.Before */, offset: entry.top, size: 0 });\n        // We didn't have enough room below, but we did above, so we shift down to align the menu\n        if (ret.top + submenu.height === entry.top && ret.top + entry.height + submenu.height <= windowDimensions.height) {\n            ret.top += entry.height;\n        }\n        return ret;\n    }\n    createSubmenu(selectFirstItem = true) {\n        if (!this.element) {\n            return;\n        }\n        if (!this.parentData.submenu) {\n            this.updateAriaExpanded('true');\n            this.submenuContainer = append(this.element, $('div.monaco-submenu'));\n            this.submenuContainer.classList.add('menubar-menu-items-holder', 'context-view');\n            // Set the top value of the menu container before construction\n            // This allows the menu constructor to calculate the proper max height\n            const computedStyles = getWindow(this.parentData.parent.domNode).getComputedStyle(this.parentData.parent.domNode);\n            const paddingTop = parseFloat(computedStyles.paddingTop || '0') || 0;\n            this.submenuContainer.style.position = 'fixed';\n            this.submenuContainer.style.top = '0';\n            this.submenuContainer.style.left = '0';\n            // Fix to #263546, for submenu of treeView view/item/context z-index issue - ensure submenu appears above other elements\n            this.submenuContainer.style.zIndex = '1';\n            this.parentData.submenu = new Menu(this.submenuContainer, this.submenuActions.length ? this.submenuActions : [new EmptySubmenuAction()], this.submenuOptions, this.menuStyle);\n            // layout submenu\n            const entryBox = this.element.getBoundingClientRect();\n            const entryBoxUpdated = {\n                top: entryBox.top - paddingTop,\n                left: entryBox.left,\n                height: entryBox.height + 2 * paddingTop,\n                width: entryBox.width\n            };\n            const viewBox = this.submenuContainer.getBoundingClientRect();\n            const window = getWindow(this.element);\n            const { top, left } = this.calculateSubmenuMenuLayout(new Dimension(window.innerWidth, window.innerHeight), Dimension.lift(viewBox), entryBoxUpdated, this.expandDirection);\n            // subtract offsets caused by transform parent\n            this.submenuContainer.style.left = `${left - viewBox.left}px`;\n            this.submenuContainer.style.top = `${top - viewBox.top}px`;\n            this.submenuDisposables.add(addDisposableListener(this.submenuContainer, EventType.KEY_UP, e => {\n                const event = new StandardKeyboardEvent(e);\n                if (event.equals(15 /* KeyCode.LeftArrow */)) {\n                    EventHelper.stop(e, true);\n                    this.parentData.parent.focus();\n                    this.cleanupExistingSubmenu(true);\n                }\n            }));\n            this.submenuDisposables.add(addDisposableListener(this.submenuContainer, EventType.KEY_DOWN, e => {\n                const event = new StandardKeyboardEvent(e);\n                if (event.equals(15 /* KeyCode.LeftArrow */)) {\n                    EventHelper.stop(e, true);\n                }\n            }));\n            this.submenuDisposables.add(this.parentData.submenu.onDidCancel(() => {\n                this.parentData.parent.focus();\n                this.cleanupExistingSubmenu(true);\n            }));\n            this.parentData.submenu.focus(selectFirstItem);\n            this.mysubmenu = this.parentData.submenu;\n        }\n        else {\n            this.parentData.submenu.focus(false);\n        }\n    }\n    updateAriaExpanded(value) {\n        if (this.item) {\n            this.item?.setAttribute('aria-expanded', value);\n        }\n    }\n    applyStyle() {\n        super.applyStyle();\n        const isSelected = this.element && this.element.classList.contains('focused');\n        const fgColor = isSelected && this.menuStyle.selectionForegroundColor ? this.menuStyle.selectionForegroundColor : this.menuStyle.foregroundColor;\n        if (this.submenuIndicator) {\n            this.submenuIndicator.style.color = fgColor ?? '';\n        }\n    }\n    dispose() {\n        super.dispose();\n        this.hideScheduler.dispose();\n        if (this.mysubmenu) {\n            this.mysubmenu.dispose();\n            this.mysubmenu = null;\n        }\n        if (this.submenuContainer) {\n            this.submenuContainer = undefined;\n        }\n    }\n}\nclass MenuSeparatorActionViewItem extends ActionViewItem {\n    constructor(context, action, options, menuStyles) {\n        super(context, action, options);\n        this.menuStyles = menuStyles;\n    }\n    render(container) {\n        super.render(container);\n        if (this.label) {\n            this.label.style.borderBottomColor = this.menuStyles.separatorColor ? `${this.menuStyles.separatorColor}` : '';\n        }\n    }\n}\nfunction cleanMnemonic(label) {\n    const regex = MENU_MNEMONIC_REGEX;\n    const matches = regex.exec(label);\n    if (!matches) {\n        return label;\n    }\n    const mnemonicInText = !matches[1];\n    return label.replace(regex, mnemonicInText ? '$2$3' : '').trim();\n}\nfunction formatRule(c) {\n    const fontCharacter = getCodiconFontCharacters()[c.id];\n    return `.codicon-${c.id}:before { content: '\\\\${fontCharacter.toString(16)}'; }`;\n}\nfunction getMenuWidgetCSS(style, isForShadowDom) {\n    let result = /* css */ `\n.monaco-menu {\n\tfont-size: 13px;\n\tborder-radius: 5px;\n\tmin-width: 160px;\n}\n\n${formatRule(Codicon.menuSelection)}\n${formatRule(Codicon.menuSubmenu)}\n\n.monaco-menu .monaco-action-bar {\n\ttext-align: right;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n\n.monaco-menu .monaco-action-bar .actions-container {\n\tdisplay: flex;\n\tmargin: 0 auto;\n\tpadding: 0;\n\twidth: 100%;\n\tjustify-content: flex-end;\n}\n\n.monaco-menu .monaco-action-bar.vertical .actions-container {\n\tdisplay: inline-block;\n}\n\n.monaco-menu .monaco-action-bar.reverse .actions-container {\n\tflex-direction: row-reverse;\n}\n\n.monaco-menu .monaco-action-bar .action-item {\n\tcursor: pointer;\n\tdisplay: inline-block;\n\ttransition: transform 50ms ease;\n\tposition: relative;  /* DO NOT REMOVE - this is the key to preventing the ghosting icon bug in Chrome 42 */\n}\n\n.monaco-menu .monaco-action-bar .action-item.disabled {\n\tcursor: default;\n}\n\n.monaco-menu .monaco-action-bar .action-item .icon,\n.monaco-menu .monaco-action-bar .action-item .codicon {\n\tdisplay: inline-block;\n}\n\n.monaco-menu .monaco-action-bar .action-item .codicon {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.monaco-menu .monaco-action-bar .action-label {\n\tfont-size: 11px;\n\tmargin-right: 4px;\n}\n\n.monaco-menu .monaco-action-bar .action-item.disabled .action-label,\n.monaco-menu .monaco-action-bar .action-item.disabled .action-label:hover {\n\tcolor: var(--vscode-disabledForeground);\n}\n\n/* Vertical actions */\n\n.monaco-menu .monaco-action-bar.vertical {\n\ttext-align: left;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-item {\n\tdisplay: block;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label.separator {\n\tdisplay: block;\n\tborder-bottom: 1px solid var(--vscode-menu-separatorBackground);\n\tpadding-top: 1px;\n\tpadding: 30px;\n}\n\n.monaco-menu .secondary-actions .monaco-action-bar .action-label {\n\tmargin-left: 6px;\n}\n\n/* Action Items */\n.monaco-menu .monaco-action-bar .action-item.select-container {\n\toverflow: hidden; /* somehow the dropdown overflows its container, we prevent it here to not push */\n\tflex: 1;\n\tmax-width: 170px;\n\tmin-width: 60px;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tmargin-right: 10px;\n}\n\n.monaco-menu .monaco-action-bar.vertical {\n\tmargin-left: 0;\n\toverflow: visible;\n}\n\n.monaco-menu .monaco-action-bar.vertical .actions-container {\n\tdisplay: block;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-item {\n\tpadding: 0;\n\ttransform: none;\n\tdisplay: flex;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-item.active {\n\ttransform: none;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-menu-item {\n\tflex: 1 1 auto;\n\tdisplay: flex;\n\theight: 2em;\n\talign-items: center;\n\tposition: relative;\n\tmargin: 0 4px;\n\tborder-radius: 4px;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-menu-item:hover .keybinding,\n.monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .keybinding {\n\topacity: unset;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label {\n\tflex: 1 1 auto;\n\ttext-decoration: none;\n\tpadding: 0 1em;\n\tbackground: none;\n\tfont-size: 12px;\n\tline-height: 1;\n}\n\n.monaco-menu .monaco-action-bar.vertical .keybinding,\n.monaco-menu .monaco-action-bar.vertical .submenu-indicator {\n\tdisplay: inline-block;\n\tflex: 2 1 auto;\n\tpadding: 0 1em;\n\ttext-align: right;\n\tfont-size: 12px;\n\tline-height: 1;\n\topacity: 0.7;\n}\n\n.monaco-menu .monaco-action-bar.vertical .submenu-indicator {\n\theight: 100%;\n}\n\n.monaco-menu .monaco-action-bar.vertical .submenu-indicator.codicon {\n\tfont-size: 16px !important;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.monaco-menu .monaco-action-bar.vertical .submenu-indicator.codicon::before {\n\tmargin-left: auto;\n\tmargin-right: -20px;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-item.disabled .keybinding,\n.monaco-menu .monaco-action-bar.vertical .action-item.disabled .submenu-indicator {\n\topacity: 0.4;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label:not(.separator) {\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\tmargin: 0;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-item {\n\tposition: static;\n\toverflow: visible;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-item .monaco-submenu {\n\tposition: absolute;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label.separator {\n\twidth: 100%;\n\theight: 0px !important;\n\topacity: 1;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label.separator.text {\n\tpadding: 0.7em 1em 0.1em 1em;\n\tfont-weight: bold;\n\topacity: 1;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label:hover {\n\tcolor: inherit;\n}\n\n.monaco-menu .monaco-action-bar.vertical .menu-item-check {\n\tposition: absolute;\n\tvisibility: hidden;\n\twidth: 1em;\n\theight: 100%;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-menu-item.checked .menu-item-check {\n\tvisibility: visible;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n/* Context Menu */\n\n.context-view.monaco-menu-container {\n\toutline: 0;\n\tborder: none;\n\tanimation: fadeIn 0.083s linear;\n\t-webkit-app-region: no-drag;\n}\n\n.context-view.monaco-menu-container :focus,\n.context-view.monaco-menu-container .monaco-action-bar.vertical:focus,\n.context-view.monaco-menu-container .monaco-action-bar.vertical :focus {\n\toutline: 0;\n}\n\n.hc-black .context-view.monaco-menu-container,\n.hc-light .context-view.monaco-menu-container,\n:host-context(.hc-black) .context-view.monaco-menu-container,\n:host-context(.hc-light) .context-view.monaco-menu-container {\n\tbox-shadow: none;\n}\n\n.hc-black .monaco-menu .monaco-action-bar.vertical .action-item.focused,\n.hc-light .monaco-menu .monaco-action-bar.vertical .action-item.focused,\n:host-context(.hc-black) .monaco-menu .monaco-action-bar.vertical .action-item.focused,\n:host-context(.hc-light) .monaco-menu .monaco-action-bar.vertical .action-item.focused {\n\tbackground: none;\n}\n\n/* Vertical Action Bar Styles */\n\n.monaco-menu .monaco-action-bar.vertical {\n\tpadding: 4px 0;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-menu-item {\n\theight: 2em;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label:not(.separator),\n.monaco-menu .monaco-action-bar.vertical .keybinding {\n\tfont-size: inherit;\n\tpadding: 0 2em;\n\tmax-height: 100%;\n}\n\n.monaco-menu .monaco-action-bar.vertical .menu-item-check {\n\tfont-size: inherit;\n\twidth: 2em;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label.separator {\n\tfont-size: inherit;\n\tmargin: 5px 0 !important;\n\tpadding: 0;\n\tborder-radius: 0;\n}\n\n.linux .monaco-menu .monaco-action-bar.vertical .action-label.separator,\n:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .action-label.separator {\n\tmargin-left: 0;\n\tmargin-right: 0;\n}\n\n.monaco-menu .monaco-action-bar.vertical .submenu-indicator {\n\tfont-size: 60%;\n\tpadding: 0 1.8em;\n}\n\n.linux .monaco-menu .monaco-action-bar.vertical .submenu-indicator,\n:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .submenu-indicator {\n\theight: 100%;\n\tmask-size: 10px 10px;\n\t-webkit-mask-size: 10px 10px;\n}\n\n.monaco-menu .action-item {\n\tcursor: default;\n}`;\n    if (isForShadowDom) {\n        // Only define scrollbar styles when used inside shadow dom,\n        // otherwise leave their styling to the global workbench styling.\n        result += `\n\t\t\t/* Arrows */\n\t\t\t.monaco-scrollable-element > .scrollbar > .scra {\n\t\t\t\tcursor: pointer;\n\t\t\t\tfont-size: 11px !important;\n\t\t\t}\n\n\t\t\t.monaco-scrollable-element > .visible {\n\t\t\t\topacity: 1;\n\n\t\t\t\t/* Background rule added for IE9 - to allow clicks on dom node */\n\t\t\t\tbackground:rgba(0,0,0,0);\n\n\t\t\t\ttransition: opacity 100ms linear;\n\t\t\t}\n\t\t\t.monaco-scrollable-element > .invisible {\n\t\t\t\topacity: 0;\n\t\t\t\tpointer-events: none;\n\t\t\t}\n\t\t\t.monaco-scrollable-element > .invisible.fade {\n\t\t\t\ttransition: opacity 800ms linear;\n\t\t\t}\n\n\t\t\t/* Scrollable Content Inset Shadow */\n\t\t\t.monaco-scrollable-element > .shadow {\n\t\t\t\tposition: absolute;\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t\t.monaco-scrollable-element > .shadow.top {\n\t\t\t\tdisplay: block;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 3px;\n\t\t\t\theight: 3px;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t\t.monaco-scrollable-element > .shadow.left {\n\t\t\t\tdisplay: block;\n\t\t\t\ttop: 3px;\n\t\t\t\tleft: 0;\n\t\t\t\theight: 100%;\n\t\t\t\twidth: 3px;\n\t\t\t}\n\t\t\t.monaco-scrollable-element > .shadow.top-left-corner {\n\t\t\t\tdisplay: block;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\theight: 3px;\n\t\t\t\twidth: 3px;\n\t\t\t}\n\t\t\t/* Fix for https://github.com/microsoft/vscode/issues/103170 */\n\t\t\t.monaco-menu .action-item .monaco-submenu {\n\t\t\t\tz-index: 1;\n\t\t\t}\n\t\t`;\n        // Scrollbars\n        const scrollbarShadowColor = style.scrollbarShadow;\n        if (scrollbarShadowColor) {\n            result += `\n\t\t\t\t.monaco-scrollable-element > .shadow.top {\n\t\t\t\t\tbox-shadow: ${scrollbarShadowColor} 0 6px 6px -6px inset;\n\t\t\t\t}\n\n\t\t\t\t.monaco-scrollable-element > .shadow.left {\n\t\t\t\t\tbox-shadow: ${scrollbarShadowColor} 6px 0 6px -6px inset;\n\t\t\t\t}\n\n\t\t\t\t.monaco-scrollable-element > .shadow.top.left {\n\t\t\t\t\tbox-shadow: ${scrollbarShadowColor} 6px 6px 6px -6px inset;\n\t\t\t\t}\n\t\t\t`;\n        }\n        const scrollbarSliderBackgroundColor = style.scrollbarSliderBackground;\n        if (scrollbarSliderBackgroundColor) {\n            result += `\n\t\t\t\t.monaco-scrollable-element > .scrollbar > .slider {\n\t\t\t\t\tbackground: ${scrollbarSliderBackgroundColor};\n\t\t\t\t}\n\t\t\t`;\n        }\n        const scrollbarSliderHoverBackgroundColor = style.scrollbarSliderHoverBackground;\n        if (scrollbarSliderHoverBackgroundColor) {\n            result += `\n\t\t\t\t.monaco-scrollable-element > .scrollbar > .slider:hover {\n\t\t\t\t\tbackground: ${scrollbarSliderHoverBackgroundColor};\n\t\t\t\t}\n\t\t\t`;\n        }\n        const scrollbarSliderActiveBackgroundColor = style.scrollbarSliderActiveBackground;\n        if (scrollbarSliderActiveBackgroundColor) {\n            result += `\n\t\t\t\t.monaco-scrollable-element > .scrollbar > .slider.active {\n\t\t\t\t\tbackground: ${scrollbarSliderActiveBackgroundColor};\n\t\t\t\t}\n\t\t\t`;\n        }\n    }\n    return result;\n}\n\nexport { HorizontalDirection, MENU_ESCAPED_MNEMONIC_REGEX, MENU_MNEMONIC_REGEX, Menu, VerticalDirection, cleanMnemonic, formatRule, getMenuWidgetCSS };\n","import { getActiveElement, isHTMLElement, isAncestor, $, addDisposableListener, EventType, getWindow } from '../../../base/browser/dom.js';\nimport { StandardMouseEvent } from '../../../base/browser/mouseEvent.js';\nimport { Menu } from '../../../base/browser/ui/menu/menu.js';\nimport { ActionRunner } from '../../../base/common/actions.js';\nimport { isCancellationError } from '../../../base/common/errors.js';\nimport { DisposableStore, combinedDisposable } from '../../../base/common/lifecycle.js';\nimport { defaultMenuStyles } from '../../theme/browser/defaultStyles.js';\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 *--------------------------------------------------------------------------------------------*/\nclass ContextMenuHandler {\n    constructor(contextViewService, telemetryService, notificationService, keybindingService) {\n        this.contextViewService = contextViewService;\n        this.telemetryService = telemetryService;\n        this.notificationService = notificationService;\n        this.keybindingService = keybindingService;\n        this.focusToReturn = null;\n        this.lastContainer = null;\n        this.block = null;\n        this.blockDisposable = null;\n        this.options = { blockMouse: true };\n    }\n    configure(options) {\n        this.options = options;\n    }\n    showContextMenu(delegate) {\n        const actions = delegate.getActions();\n        if (!actions.length) {\n            return; // Don't render an empty context menu\n        }\n        this.focusToReturn = getActiveElement();\n        let menu;\n        const shadowRootElement = isHTMLElement(delegate.domForShadowRoot) ? delegate.domForShadowRoot : undefined;\n        this.contextViewService.showContextView({\n            getAnchor: () => delegate.getAnchor(),\n            canRelayout: false,\n            anchorAlignment: delegate.anchorAlignment,\n            anchorAxisAlignment: delegate.anchorAxisAlignment,\n            layer: delegate.layer,\n            render: (container) => {\n                this.lastContainer = container;\n                const className = delegate.getMenuClassName ? delegate.getMenuClassName() : '';\n                if (className) {\n                    container.className += ' ' + className;\n                }\n                // Render invisible div to block mouse interaction in the rest of the UI\n                if (this.options.blockMouse) {\n                    this.block = container.appendChild($('.context-view-block'));\n                    this.block.style.position = 'fixed';\n                    this.block.style.cursor = 'initial';\n                    this.block.style.left = '0';\n                    this.block.style.top = '0';\n                    this.block.style.width = '100%';\n                    this.block.style.height = '100%';\n                    this.block.style.zIndex = '-1';\n                    this.blockDisposable?.dispose();\n                    this.blockDisposable = addDisposableListener(this.block, EventType.MOUSE_DOWN, e => e.stopPropagation());\n                }\n                const menuDisposables = new DisposableStore();\n                const actionRunner = delegate.actionRunner || menuDisposables.add(new ActionRunner());\n                actionRunner.onWillRun(evt => this.onActionRun(evt, !delegate.skipTelemetry), this, menuDisposables);\n                actionRunner.onDidRun(this.onDidActionRun, this, menuDisposables);\n                menu = new Menu(container, actions, {\n                    actionViewItemProvider: delegate.getActionViewItem,\n                    context: delegate.getActionsContext ? delegate.getActionsContext() : null,\n                    actionRunner,\n                    getKeyBinding: delegate.getKeyBinding ? delegate.getKeyBinding : action => this.keybindingService.lookupKeybinding(action.id)\n                }, defaultMenuStyles);\n                menu.onDidCancel(() => this.contextViewService.hideContextView(true), null, menuDisposables);\n                menu.onDidBlur(() => this.contextViewService.hideContextView(true), null, menuDisposables);\n                const targetWindow = getWindow(container);\n                menuDisposables.add(addDisposableListener(targetWindow, EventType.BLUR, () => this.contextViewService.hideContextView(true)));\n                menuDisposables.add(addDisposableListener(targetWindow, EventType.MOUSE_DOWN, (e) => {\n                    if (e.defaultPrevented) {\n                        return;\n                    }\n                    const event = new StandardMouseEvent(targetWindow, e);\n                    let element = event.target;\n                    // Don't do anything as we are likely creating a context menu\n                    if (event.rightButton) {\n                        return;\n                    }\n                    while (element) {\n                        if (element === container) {\n                            return;\n                        }\n                        element = element.parentElement;\n                    }\n                    this.contextViewService.hideContextView(true);\n                }));\n                return combinedDisposable(menuDisposables, menu);\n            },\n            focus: () => {\n                menu?.focus(!!delegate.autoSelectFirstItem);\n            },\n            onHide: (didCancel) => {\n                delegate.onHide?.(!!didCancel);\n                if (this.block) {\n                    this.block.remove();\n                    this.block = null;\n                }\n                this.blockDisposable?.dispose();\n                this.blockDisposable = null;\n                if (!!this.lastContainer && (getActiveElement() === this.lastContainer || isAncestor(getActiveElement(), this.lastContainer))) {\n                    this.focusToReturn?.focus();\n                }\n                this.lastContainer = null;\n            }\n        }, shadowRootElement, !!shadowRootElement);\n    }\n    onActionRun(e, logTelemetry) {\n        if (logTelemetry) {\n            this.telemetryService.publicLog2('workbenchActionExecuted', { id: e.action.id, from: 'contextMenu' });\n        }\n        this.contextViewService.hideContextView(false);\n    }\n    onDidActionRun(e) {\n        if (e.error && !isCancellationError(e.error)) {\n            this.notificationService.error(e.error);\n        }\n    }\n}\n\nexport { ContextMenuHandler };\n","import { ModifierKeyEmitter } from '../../../base/browser/dom.js';\nimport { Separator } from '../../../base/common/actions.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { getFlatContextMenuActions } from '../../actions/browser/menuEntryActionViewItem.js';\nimport { IMenuService, MenuId } from '../../actions/common/actions.js';\nimport { IContextKeyService } from '../../contextkey/common/contextkey.js';\nimport { IKeybindingService } from '../../keybinding/common/keybinding.js';\nimport { INotificationService } from '../../notification/common/notification.js';\nimport { ITelemetryService } from '../../telemetry/common/telemetry.js';\nimport { ContextMenuHandler } from './contextMenuHandler.js';\nimport { IContextViewService } from './contextView.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet ContextMenuService = class ContextMenuService extends Disposable {\n    get contextMenuHandler() {\n        if (!this._contextMenuHandler) {\n            this._contextMenuHandler = new ContextMenuHandler(this.contextViewService, this.telemetryService, this.notificationService, this.keybindingService);\n        }\n        return this._contextMenuHandler;\n    }\n    constructor(telemetryService, notificationService, contextViewService, keybindingService, menuService, contextKeyService) {\n        super();\n        this.telemetryService = telemetryService;\n        this.notificationService = notificationService;\n        this.contextViewService = contextViewService;\n        this.keybindingService = keybindingService;\n        this.menuService = menuService;\n        this.contextKeyService = contextKeyService;\n        this._contextMenuHandler = undefined;\n        this._onDidShowContextMenu = this._store.add(new Emitter());\n        this.onDidShowContextMenu = this._onDidShowContextMenu.event;\n        this._onDidHideContextMenu = this._store.add(new Emitter());\n        this.onDidHideContextMenu = this._onDidHideContextMenu.event;\n    }\n    configure(options) {\n        this.contextMenuHandler.configure(options);\n    }\n    // ContextMenu\n    showContextMenu(delegate) {\n        delegate = ContextMenuMenuDelegate.transform(delegate, this.menuService, this.contextKeyService);\n        this.contextMenuHandler.showContextMenu({\n            ...delegate,\n            onHide: (didCancel) => {\n                delegate.onHide?.(didCancel);\n                this._onDidHideContextMenu.fire();\n            }\n        });\n        ModifierKeyEmitter.getInstance().resetKeyStatus();\n        this._onDidShowContextMenu.fire();\n    }\n};\nContextMenuService = __decorate([\n    __param(0, ITelemetryService),\n    __param(1, INotificationService),\n    __param(2, IContextViewService),\n    __param(3, IKeybindingService),\n    __param(4, IMenuService),\n    __param(5, IContextKeyService)\n], ContextMenuService);\nvar ContextMenuMenuDelegate;\n(function (ContextMenuMenuDelegate) {\n    function is(thing) {\n        return thing && thing.menuId instanceof MenuId;\n    }\n    function transform(delegate, menuService, globalContextKeyService) {\n        if (!is(delegate)) {\n            return delegate;\n        }\n        const { menuId, menuActionOptions, contextKeyService } = delegate;\n        return {\n            ...delegate,\n            getActions: () => {\n                let target = [];\n                if (menuId) {\n                    const menu = menuService.getMenuActions(menuId, contextKeyService ?? globalContextKeyService, menuActionOptions);\n                    target = getFlatContextMenuActions(menu);\n                }\n                if (!delegate.getActions) {\n                    return target;\n                }\n                else {\n                    return Separator.join(delegate.getActions(), target);\n                }\n            }\n        };\n    }\n    ContextMenuMenuDelegate.transform = transform;\n})(ContextMenuMenuDelegate || (ContextMenuMenuDelegate = {}));\n\nexport { ContextMenuMenuDelegate, ContextMenuService };\n","var EditorOpenSource;\n(function (EditorOpenSource) {\n    /**\n     * Default: the editor is opening via a programmatic call\n     * to the editor service API.\n     */\n    EditorOpenSource[EditorOpenSource[\"API\"] = 0] = \"API\";\n    /**\n     * Indicates that a user action triggered the opening, e.g.\n     * via mouse or keyboard use.\n     */\n    EditorOpenSource[EditorOpenSource[\"USER\"] = 1] = \"USER\";\n})(EditorOpenSource || (EditorOpenSource = {}));\n\nexport { EditorOpenSource };\n","import { windowOpenNoOpener } from '../../../base/browser/dom.js';\nimport { mainWindow } from '../../../base/browser/window.js';\nimport { CancellationToken } from '../../../base/common/cancellation.js';\nimport { LinkedList } from '../../../base/common/linkedList.js';\nimport { ResourceMap } from '../../../base/common/map.js';\nimport { parse } from '../../../base/common/marshalling.js';\nimport { matchesScheme, Schemas, matchesSomeScheme } from '../../../base/common/network.js';\nimport { normalizePath } from '../../../base/common/resources.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { ICodeEditorService } from './codeEditorService.js';\nimport { ICommandService } from '../../../platform/commands/common/commands.js';\nimport { EditorOpenSource } from '../../../platform/editor/common/editor.js';\nimport { extractSelection } from '../../../platform/opener/common/opener.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet CommandOpener = class CommandOpener {\n    constructor(_commandService) {\n        this._commandService = _commandService;\n    }\n    async open(target, options) {\n        if (!matchesScheme(target, Schemas.command)) {\n            return false;\n        }\n        if (!options?.allowCommands) {\n            // silently ignore commands when command-links are disabled, also\n            // suppress other openers by returning TRUE\n            return true;\n        }\n        if (typeof target === 'string') {\n            target = URI.parse(target);\n        }\n        if (Array.isArray(options.allowCommands)) {\n            // Only allow specific commands\n            if (!options.allowCommands.includes(target.path)) {\n                // Suppress other openers by returning TRUE\n                return true;\n            }\n        }\n        // execute as command\n        let args = [];\n        try {\n            args = parse(decodeURIComponent(target.query));\n        }\n        catch {\n            // ignore and retry\n            try {\n                args = parse(target.query);\n            }\n            catch {\n                // ignore error\n            }\n        }\n        if (!Array.isArray(args)) {\n            args = [args];\n        }\n        await this._commandService.executeCommand(target.path, ...args);\n        return true;\n    }\n};\nCommandOpener = __decorate([\n    __param(0, ICommandService)\n], CommandOpener);\nlet EditorOpener = class EditorOpener {\n    constructor(_editorService) {\n        this._editorService = _editorService;\n    }\n    async open(target, options) {\n        if (typeof target === 'string') {\n            target = URI.parse(target);\n        }\n        const { selection, uri } = extractSelection(target);\n        target = uri;\n        if (target.scheme === Schemas.file) {\n            target = normalizePath(target); // workaround for non-normalized paths (https://github.com/microsoft/vscode/issues/12954)\n        }\n        await this._editorService.openCodeEditor({\n            resource: target,\n            options: {\n                selection,\n                source: options?.fromUserGesture ? EditorOpenSource.USER : EditorOpenSource.API,\n                ...options?.editorOptions\n            }\n        }, this._editorService.getFocusedCodeEditor(), options?.openToSide);\n        return true;\n    }\n};\nEditorOpener = __decorate([\n    __param(0, ICodeEditorService)\n], EditorOpener);\nlet OpenerService = class OpenerService {\n    constructor(editorService, commandService) {\n        this._openers = new LinkedList();\n        this._validators = new LinkedList();\n        this._resolvers = new LinkedList();\n        this._resolvedUriTargets = new ResourceMap(uri => uri.with({ path: null, fragment: null, query: null }).toString());\n        this._externalOpeners = new LinkedList();\n        // Default external opener is going through window.open()\n        this._defaultExternalOpener = {\n            openExternal: async (href) => {\n                // ensure to open HTTP/HTTPS links into new windows\n                // to not trigger a navigation. Any other link is\n                // safe to be set as HREF to prevent a blank window\n                // from opening.\n                if (matchesSomeScheme(href, Schemas.http, Schemas.https)) {\n                    windowOpenNoOpener(href);\n                }\n                else {\n                    mainWindow.location.href = href;\n                }\n                return true;\n            }\n        };\n        // Default opener: any external, maito, http(s), command, and catch-all-editors\n        this._openers.push({\n            open: async (target, options) => {\n                if (options?.openExternal || matchesSomeScheme(target, Schemas.mailto, Schemas.http, Schemas.https, Schemas.vsls)) {\n                    // open externally\n                    await this._doOpenExternal(target, options);\n                    return true;\n                }\n                return false;\n            }\n        });\n        this._openers.push(new CommandOpener(commandService));\n        this._openers.push(new EditorOpener(editorService));\n    }\n    registerOpener(opener) {\n        const remove = this._openers.unshift(opener);\n        return { dispose: remove };\n    }\n    async open(target, options) {\n        // check with contributed validators\n        if (!options?.skipValidation) {\n            const targetURI = typeof target === 'string' ? URI.parse(target) : target;\n            const validationTarget = this._resolvedUriTargets.get(targetURI) ?? target; // validate against the original URI that this URI resolves to, if one exists\n            for (const validator of this._validators) {\n                if (!(await validator.shouldOpen(validationTarget, options))) {\n                    return false;\n                }\n            }\n        }\n        // check with contributed openers\n        for (const opener of this._openers) {\n            const handled = await opener.open(target, options);\n            if (handled) {\n                return true;\n            }\n        }\n        return false;\n    }\n    async resolveExternalUri(resource, options) {\n        for (const resolver of this._resolvers) {\n            try {\n                const result = await resolver.resolveExternalUri(resource, options);\n                if (result) {\n                    if (!this._resolvedUriTargets.has(result.resolved)) {\n                        this._resolvedUriTargets.set(result.resolved, resource);\n                    }\n                    return result;\n                }\n            }\n            catch {\n                // noop\n            }\n        }\n        throw new Error('Could not resolve external URI: ' + resource.toString());\n    }\n    async _doOpenExternal(resource, options) {\n        //todo@jrieken IExternalUriResolver should support `uri: URI | string`\n        const uri = typeof resource === 'string' ? URI.parse(resource) : resource;\n        let externalUri;\n        try {\n            externalUri = (await this.resolveExternalUri(uri, options)).resolved;\n        }\n        catch {\n            externalUri = uri;\n        }\n        let href;\n        if (typeof resource === 'string' && uri.toString() === externalUri.toString()) {\n            // open the url-string AS IS\n            href = resource;\n        }\n        else {\n            // open URI using the toString(noEncode)+encodeURI-trick\n            href = encodeURI(externalUri.toString(true));\n        }\n        if (options?.allowContributedOpeners) {\n            const preferredOpenerId = typeof options?.allowContributedOpeners === 'string' ? options?.allowContributedOpeners : undefined;\n            for (const opener of this._externalOpeners) {\n                const didOpen = await opener.openExternal(href, {\n                    sourceUri: uri,\n                    preferredOpenerId,\n                }, CancellationToken.None);\n                if (didOpen) {\n                    return true;\n                }\n            }\n        }\n        return this._defaultExternalOpener.openExternal(href, { sourceUri: uri }, CancellationToken.None);\n    }\n    dispose() {\n        this._validators.clear();\n    }\n};\nOpenerService = __decorate([\n    __param(0, ICodeEditorService),\n    __param(1, ICommandService)\n], OpenerService);\n\nexport { OpenerService };\n","import { IMarkerService, MarkerSeverity } from '../../../platform/markers/common/markers.js';\nimport { Disposable, toDisposable } from '../../../base/common/lifecycle.js';\nimport { OverviewRulerLane } from '../model.js';\nimport { themeColorFromId } from '../../../platform/theme/common/themeService.js';\nimport { overviewRulerError, overviewRulerWarning, overviewRulerInfo } from '../core/editorColorRegistry.js';\nimport { IModelService } from './model.js';\nimport { Range } from '../core/range.js';\nimport { Schemas } from '../../../base/common/network.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport '../../../platform/theme/common/colorUtils.js';\nimport '../../../platform/theme/common/colors/baseColors.js';\nimport '../../../platform/theme/common/colors/chartsColors.js';\nimport '../../../platform/theme/common/colors/editorColors.js';\nimport '../../../platform/theme/common/colors/inputColors.js';\nimport '../../../platform/theme/common/colors/listColors.js';\nimport '../../../platform/theme/common/colors/menuColors.js';\nimport { minimapError, minimapWarning, minimapInfo } from '../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../platform/theme/common/colors/miscColors.js';\nimport '../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../platform/theme/common/colors/searchColors.js';\nimport { ResourceMap, BidirectionalMap } from '../../../base/common/map.js';\nimport { diffSets } from '../../../base/common/collections.js';\nimport { Iterable } from '../../../base/common/iterator.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet MarkerDecorationsService = class MarkerDecorationsService extends Disposable {\n    constructor(modelService, _markerService) {\n        super();\n        this._markerService = _markerService;\n        this._onDidChangeMarker = this._register(new Emitter());\n        this._suppressedRanges = new ResourceMap();\n        this._markerDecorations = new ResourceMap();\n        modelService.getModels().forEach(model => this._onModelAdded(model));\n        this._register(modelService.onModelAdded(this._onModelAdded, this));\n        this._register(modelService.onModelRemoved(this._onModelRemoved, this));\n        this._register(this._markerService.onMarkerChanged(this._handleMarkerChange, this));\n    }\n    dispose() {\n        super.dispose();\n        this._markerDecorations.forEach(value => value.dispose());\n        this._markerDecorations.clear();\n    }\n    getMarker(uri, decoration) {\n        const markerDecorations = this._markerDecorations.get(uri);\n        return markerDecorations ? (markerDecorations.getMarker(decoration) || null) : null;\n    }\n    _handleMarkerChange(changedResources) {\n        changedResources.forEach((resource) => {\n            const markerDecorations = this._markerDecorations.get(resource);\n            if (markerDecorations) {\n                this._updateDecorations(markerDecorations);\n            }\n        });\n    }\n    _onModelAdded(model) {\n        const markerDecorations = new MarkerDecorations(model);\n        this._markerDecorations.set(model.uri, markerDecorations);\n        this._updateDecorations(markerDecorations);\n    }\n    _onModelRemoved(model) {\n        const markerDecorations = this._markerDecorations.get(model.uri);\n        if (markerDecorations) {\n            markerDecorations.dispose();\n            this._markerDecorations.delete(model.uri);\n        }\n        // clean up markers for internal, transient models\n        if (model.uri.scheme === Schemas.inMemory\n            || model.uri.scheme === Schemas.internal\n            || model.uri.scheme === Schemas.vscode) {\n            this._markerService?.read({ resource: model.uri }).map(marker => marker.owner).forEach(owner => this._markerService.remove(owner, [model.uri]));\n        }\n    }\n    _updateDecorations(markerDecorations) {\n        // Limit to the first 500 errors/warnings\n        let markers = this._markerService.read({ resource: markerDecorations.model.uri, take: 500 });\n        // filter markers from suppressed ranges\n        const suppressedRanges = this._suppressedRanges.get(markerDecorations.model.uri);\n        if (suppressedRanges) {\n            markers = markers.filter(marker => {\n                return !Iterable.some(suppressedRanges, candidate => Range.areIntersectingOrTouching(candidate, marker));\n            });\n        }\n        if (markerDecorations.update(markers)) {\n            this._onDidChangeMarker.fire(markerDecorations.model);\n        }\n    }\n};\nMarkerDecorationsService = __decorate([\n    __param(0, IModelService),\n    __param(1, IMarkerService)\n], MarkerDecorationsService);\nclass MarkerDecorations extends Disposable {\n    constructor(model) {\n        super();\n        this.model = model;\n        this._map = new BidirectionalMap();\n        this._register(toDisposable(() => {\n            this.model.deltaDecorations([...this._map.values()], []);\n            this._map.clear();\n        }));\n    }\n    update(markers) {\n        // We use the fact that marker instances are not recreated when different owners\n        // update. So we can compare references to find out what changed since the last update.\n        const { added, removed } = diffSets(new Set(this._map.keys()), new Set(markers));\n        if (added.length === 0 && removed.length === 0) {\n            return false;\n        }\n        const oldIds = removed.map(marker => this._map.get(marker));\n        const newDecorations = added.map(marker => {\n            return {\n                range: this._createDecorationRange(this.model, marker),\n                options: this._createDecorationOption(marker)\n            };\n        });\n        const ids = this.model.deltaDecorations(oldIds, newDecorations);\n        for (const removedMarker of removed) {\n            this._map.delete(removedMarker);\n        }\n        for (let index = 0; index < ids.length; index++) {\n            this._map.set(added[index], ids[index]);\n        }\n        return true;\n    }\n    getMarker(decoration) {\n        return this._map.getKey(decoration.id);\n    }\n    _createDecorationRange(model, rawMarker) {\n        let ret = Range.lift(rawMarker);\n        if (rawMarker.severity === MarkerSeverity.Hint && !this._hasMarkerTag(rawMarker, 1 /* MarkerTag.Unnecessary */) && !this._hasMarkerTag(rawMarker, 2 /* MarkerTag.Deprecated */)) {\n            // * never render hints on multiple lines\n            // * make enough space for three dots\n            ret = ret.setEndPosition(ret.startLineNumber, ret.startColumn + 2);\n        }\n        ret = model.validateRange(ret);\n        if (ret.isEmpty()) {\n            const maxColumn = model.getLineLastNonWhitespaceColumn(ret.startLineNumber) ||\n                model.getLineMaxColumn(ret.startLineNumber);\n            if (maxColumn === 1 || ret.endColumn >= maxColumn) {\n                // empty line or behind eol\n                // keep the range as is, it will be rendered 1ch wide\n                return ret;\n            }\n            const word = model.getWordAtPosition(ret.getStartPosition());\n            if (word) {\n                ret = new Range(ret.startLineNumber, word.startColumn, ret.endLineNumber, word.endColumn);\n            }\n        }\n        else if (rawMarker.endColumn === Number.MAX_VALUE && rawMarker.startColumn === 1 && ret.startLineNumber === ret.endLineNumber) {\n            const minColumn = model.getLineFirstNonWhitespaceColumn(rawMarker.startLineNumber);\n            if (minColumn < ret.endColumn) {\n                ret = new Range(ret.startLineNumber, minColumn, ret.endLineNumber, ret.endColumn);\n                rawMarker.startColumn = minColumn;\n            }\n        }\n        return ret;\n    }\n    _createDecorationOption(marker) {\n        let className;\n        let color = undefined;\n        let zIndex;\n        let inlineClassName = undefined;\n        let minimap;\n        switch (marker.severity) {\n            case MarkerSeverity.Hint:\n                if (this._hasMarkerTag(marker, 2 /* MarkerTag.Deprecated */)) {\n                    className = undefined;\n                }\n                else if (this._hasMarkerTag(marker, 1 /* MarkerTag.Unnecessary */)) {\n                    className = \"squiggly-unnecessary\" /* ClassName.EditorUnnecessaryDecoration */;\n                }\n                else {\n                    className = \"squiggly-hint\" /* ClassName.EditorHintDecoration */;\n                }\n                zIndex = 0;\n                break;\n            case MarkerSeverity.Info:\n                className = \"squiggly-info\" /* ClassName.EditorInfoDecoration */;\n                color = themeColorFromId(overviewRulerInfo);\n                zIndex = 10;\n                minimap = {\n                    color: themeColorFromId(minimapInfo),\n                    position: 1 /* MinimapPosition.Inline */\n                };\n                break;\n            case MarkerSeverity.Warning:\n                className = \"squiggly-warning\" /* ClassName.EditorWarningDecoration */;\n                color = themeColorFromId(overviewRulerWarning);\n                zIndex = 20;\n                minimap = {\n                    color: themeColorFromId(minimapWarning),\n                    position: 1 /* MinimapPosition.Inline */\n                };\n                break;\n            case MarkerSeverity.Error:\n            default:\n                className = \"squiggly-error\" /* ClassName.EditorErrorDecoration */;\n                color = themeColorFromId(overviewRulerError);\n                zIndex = 30;\n                minimap = {\n                    color: themeColorFromId(minimapError),\n                    position: 1 /* MinimapPosition.Inline */\n                };\n                break;\n        }\n        if (marker.tags) {\n            if (marker.tags.indexOf(1 /* MarkerTag.Unnecessary */) !== -1) {\n                inlineClassName = \"squiggly-inline-unnecessary\" /* ClassName.EditorUnnecessaryInlineDecoration */;\n            }\n            if (marker.tags.indexOf(2 /* MarkerTag.Deprecated */) !== -1) {\n                inlineClassName = \"squiggly-inline-deprecated\" /* ClassName.EditorDeprecatedInlineDecoration */;\n            }\n        }\n        return {\n            description: 'marker-decoration',\n            stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,\n            className,\n            showIfCollapsed: true,\n            overviewRuler: {\n                color,\n                position: OverviewRulerLane.Right\n            },\n            minimap,\n            zIndex,\n            inlineClassName,\n        };\n    }\n    _hasMarkerTag(marker, tag) {\n        if (marker.tags) {\n            return marker.tags.indexOf(tag) >= 0;\n        }\n        return false;\n    }\n}\n\nexport { MarkerDecorationsService };\n","import { Emitter } from '../../../base/common/event.js';\nimport { StringSHA1 } from '../../../base/common/hash.js';\nimport { Disposable, DisposableStore } from '../../../base/common/lifecycle.js';\nimport { Schemas } from '../../../base/common/network.js';\nimport { equals } from '../../../base/common/objects.js';\nimport { OS, isLinux, isMacintosh } from '../../../base/common/platform.js';\nimport { IConfigurationService } from '../../../platform/configuration/common/configuration.js';\nimport { IInstantiationService } from '../../../platform/instantiation/common/instantiation.js';\nimport { IUndoRedoService } from '../../../platform/undoRedo/common/undoRedo.js';\nimport { clampedInt } from '../config/editorOptions.js';\nimport { EDITOR_MODEL_DEFAULTS } from '../core/misc/textModelDefaults.js';\nimport { PLAINTEXT_LANGUAGE_ID } from '../languages/modesRegistry.js';\nimport { isEditStackElement } from '../model/editStack.js';\nimport { TextModel } from '../model/textModel.js';\nimport { ITextResourcePropertiesService } from './textResourceConfiguration.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ModelService_1;\nfunction MODEL_ID(resource) {\n    return resource.toString();\n}\nclass ModelData {\n    constructor(model, onWillDispose, onDidChangeLanguage) {\n        this.model = model;\n        this._modelEventListeners = new DisposableStore();\n        this.model = model;\n        this._modelEventListeners.add(model.onWillDispose(() => onWillDispose(model)));\n        this._modelEventListeners.add(model.onDidChangeLanguage((e) => onDidChangeLanguage(model, e)));\n    }\n    dispose() {\n        this._modelEventListeners.dispose();\n    }\n}\nconst DEFAULT_EOL = (isLinux || isMacintosh) ? 1 /* DefaultEndOfLine.LF */ : 2 /* DefaultEndOfLine.CRLF */;\nclass DisposedModelInfo {\n    constructor(uri, initialUndoRedoSnapshot, time, sharesUndoRedoStack, heapSize, sha1, versionId, alternativeVersionId) {\n        this.uri = uri;\n        this.initialUndoRedoSnapshot = initialUndoRedoSnapshot;\n        this.time = time;\n        this.sharesUndoRedoStack = sharesUndoRedoStack;\n        this.heapSize = heapSize;\n        this.sha1 = sha1;\n        this.versionId = versionId;\n        this.alternativeVersionId = alternativeVersionId;\n    }\n}\nlet ModelService = class ModelService extends Disposable {\n    static { ModelService_1 = this; }\n    static { this.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK = 20 * 1024 * 1024; }\n    constructor(_configurationService, _resourcePropertiesService, _undoRedoService, _instantiationService) {\n        super();\n        this._configurationService = _configurationService;\n        this._resourcePropertiesService = _resourcePropertiesService;\n        this._undoRedoService = _undoRedoService;\n        this._instantiationService = _instantiationService;\n        this._onModelAdded = this._register(new Emitter());\n        this.onModelAdded = this._onModelAdded.event;\n        this._onModelRemoved = this._register(new Emitter());\n        this.onModelRemoved = this._onModelRemoved.event;\n        this._onModelModeChanged = this._register(new Emitter());\n        this.onModelLanguageChanged = this._onModelModeChanged.event;\n        this._modelCreationOptionsByLanguageAndResource = Object.create(null);\n        this._models = {};\n        this._disposedModels = new Map();\n        this._disposedModelsHeapSize = 0;\n        this._register(this._configurationService.onDidChangeConfiguration(e => this._updateModelOptions(e)));\n        this._updateModelOptions(undefined);\n    }\n    static _readModelOptions(config, isForSimpleWidget) {\n        let tabSize = EDITOR_MODEL_DEFAULTS.tabSize;\n        if (config.editor && typeof config.editor.tabSize !== 'undefined') {\n            tabSize = clampedInt(config.editor.tabSize, EDITOR_MODEL_DEFAULTS.tabSize, 1, 100);\n        }\n        let indentSize = 'tabSize';\n        if (config.editor && typeof config.editor.indentSize !== 'undefined' && config.editor.indentSize !== 'tabSize') {\n            indentSize = clampedInt(config.editor.indentSize, 'tabSize', 1, 100);\n        }\n        let insertSpaces = EDITOR_MODEL_DEFAULTS.insertSpaces;\n        if (config.editor && typeof config.editor.insertSpaces !== 'undefined') {\n            insertSpaces = (config.editor.insertSpaces === 'false' ? false : Boolean(config.editor.insertSpaces));\n        }\n        let newDefaultEOL = DEFAULT_EOL;\n        const eol = config.eol;\n        if (eol === '\\r\\n') {\n            newDefaultEOL = 2 /* DefaultEndOfLine.CRLF */;\n        }\n        else if (eol === '\\n') {\n            newDefaultEOL = 1 /* DefaultEndOfLine.LF */;\n        }\n        let trimAutoWhitespace = EDITOR_MODEL_DEFAULTS.trimAutoWhitespace;\n        if (config.editor && typeof config.editor.trimAutoWhitespace !== 'undefined') {\n            trimAutoWhitespace = (config.editor.trimAutoWhitespace === 'false' ? false : Boolean(config.editor.trimAutoWhitespace));\n        }\n        let detectIndentation = EDITOR_MODEL_DEFAULTS.detectIndentation;\n        if (config.editor && typeof config.editor.detectIndentation !== 'undefined') {\n            detectIndentation = (config.editor.detectIndentation === 'false' ? false : Boolean(config.editor.detectIndentation));\n        }\n        let largeFileOptimizations = EDITOR_MODEL_DEFAULTS.largeFileOptimizations;\n        if (config.editor && typeof config.editor.largeFileOptimizations !== 'undefined') {\n            largeFileOptimizations = (config.editor.largeFileOptimizations === 'false' ? false : Boolean(config.editor.largeFileOptimizations));\n        }\n        let bracketPairColorizationOptions = EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions;\n        if (config.editor?.bracketPairColorization && typeof config.editor.bracketPairColorization === 'object') {\n            const bpConfig = config.editor.bracketPairColorization;\n            bracketPairColorizationOptions = {\n                enabled: !!bpConfig.enabled,\n                independentColorPoolPerBracketType: !!bpConfig.independentColorPoolPerBracketType\n            };\n        }\n        return {\n            isForSimpleWidget: isForSimpleWidget,\n            tabSize: tabSize,\n            indentSize: indentSize,\n            insertSpaces: insertSpaces,\n            detectIndentation: detectIndentation,\n            defaultEOL: newDefaultEOL,\n            trimAutoWhitespace: trimAutoWhitespace,\n            largeFileOptimizations: largeFileOptimizations,\n            bracketPairColorizationOptions\n        };\n    }\n    _getEOL(resource, language) {\n        if (resource) {\n            return this._resourcePropertiesService.getEOL(resource, language);\n        }\n        const eol = this._configurationService.getValue('files.eol', { overrideIdentifier: language });\n        if (eol && typeof eol === 'string' && eol !== 'auto') {\n            return eol;\n        }\n        return OS === 3 /* platform.OperatingSystem.Linux */ || OS === 2 /* platform.OperatingSystem.Macintosh */ ? '\\n' : '\\r\\n';\n    }\n    _shouldRestoreUndoStack() {\n        const result = this._configurationService.getValue('files.restoreUndoStack');\n        if (typeof result === 'boolean') {\n            return result;\n        }\n        return true;\n    }\n    getCreationOptions(languageIdOrSelection, resource, isForSimpleWidget) {\n        const language = (typeof languageIdOrSelection === 'string' ? languageIdOrSelection : languageIdOrSelection.languageId);\n        let creationOptions = this._modelCreationOptionsByLanguageAndResource[language + resource];\n        if (!creationOptions) {\n            const editor = this._configurationService.getValue('editor', { overrideIdentifier: language, resource });\n            const eol = this._getEOL(resource, language);\n            creationOptions = ModelService_1._readModelOptions({ editor, eol }, isForSimpleWidget);\n            this._modelCreationOptionsByLanguageAndResource[language + resource] = creationOptions;\n        }\n        return creationOptions;\n    }\n    _updateModelOptions(e) {\n        const oldOptionsByLanguageAndResource = this._modelCreationOptionsByLanguageAndResource;\n        this._modelCreationOptionsByLanguageAndResource = Object.create(null);\n        // Update options on all models\n        const keys = Object.keys(this._models);\n        for (let i = 0, len = keys.length; i < len; i++) {\n            const modelId = keys[i];\n            const modelData = this._models[modelId];\n            const language = modelData.model.getLanguageId();\n            const uri = modelData.model.uri;\n            if (e && !e.affectsConfiguration('editor', { overrideIdentifier: language, resource: uri }) && !e.affectsConfiguration('files.eol', { overrideIdentifier: language, resource: uri })) {\n                continue; // perf: skip if this model is not affected by configuration change\n            }\n            const oldOptions = oldOptionsByLanguageAndResource[language + uri];\n            const newOptions = this.getCreationOptions(language, uri, modelData.model.isForSimpleWidget);\n            ModelService_1._setModelOptionsForModel(modelData.model, newOptions, oldOptions);\n        }\n    }\n    static _setModelOptionsForModel(model, newOptions, currentOptions) {\n        if (currentOptions && currentOptions.defaultEOL !== newOptions.defaultEOL && model.getLineCount() === 1) {\n            model.setEOL(newOptions.defaultEOL === 1 /* DefaultEndOfLine.LF */ ? 0 /* EndOfLineSequence.LF */ : 1 /* EndOfLineSequence.CRLF */);\n        }\n        if (currentOptions\n            && (currentOptions.detectIndentation === newOptions.detectIndentation)\n            && (currentOptions.insertSpaces === newOptions.insertSpaces)\n            && (currentOptions.tabSize === newOptions.tabSize)\n            && (currentOptions.indentSize === newOptions.indentSize)\n            && (currentOptions.trimAutoWhitespace === newOptions.trimAutoWhitespace)\n            && equals(currentOptions.bracketPairColorizationOptions, newOptions.bracketPairColorizationOptions)) {\n            // Same indent opts, no need to touch the model\n            return;\n        }\n        if (newOptions.detectIndentation) {\n            model.detectIndentation(newOptions.insertSpaces, newOptions.tabSize);\n            model.updateOptions({\n                trimAutoWhitespace: newOptions.trimAutoWhitespace,\n                bracketColorizationOptions: newOptions.bracketPairColorizationOptions\n            });\n        }\n        else {\n            model.updateOptions({\n                insertSpaces: newOptions.insertSpaces,\n                tabSize: newOptions.tabSize,\n                indentSize: newOptions.indentSize,\n                trimAutoWhitespace: newOptions.trimAutoWhitespace,\n                bracketColorizationOptions: newOptions.bracketPairColorizationOptions\n            });\n        }\n    }\n    // --- begin IModelService\n    _insertDisposedModel(disposedModelData) {\n        this._disposedModels.set(MODEL_ID(disposedModelData.uri), disposedModelData);\n        this._disposedModelsHeapSize += disposedModelData.heapSize;\n    }\n    _removeDisposedModel(resource) {\n        const disposedModelData = this._disposedModels.get(MODEL_ID(resource));\n        if (disposedModelData) {\n            this._disposedModelsHeapSize -= disposedModelData.heapSize;\n        }\n        this._disposedModels.delete(MODEL_ID(resource));\n        return disposedModelData;\n    }\n    _ensureDisposedModelsHeapSize(maxModelsHeapSize) {\n        if (this._disposedModelsHeapSize > maxModelsHeapSize) {\n            // we must remove some old undo stack elements to free up some memory\n            const disposedModels = [];\n            this._disposedModels.forEach(entry => {\n                if (!entry.sharesUndoRedoStack) {\n                    disposedModels.push(entry);\n                }\n            });\n            disposedModels.sort((a, b) => a.time - b.time);\n            while (disposedModels.length > 0 && this._disposedModelsHeapSize > maxModelsHeapSize) {\n                const disposedModel = disposedModels.shift();\n                this._removeDisposedModel(disposedModel.uri);\n                if (disposedModel.initialUndoRedoSnapshot !== null) {\n                    this._undoRedoService.restoreSnapshot(disposedModel.initialUndoRedoSnapshot);\n                }\n            }\n        }\n    }\n    _createModelData(value, languageIdOrSelection, resource, isForSimpleWidget) {\n        // create & save the model\n        const options = this.getCreationOptions(languageIdOrSelection, resource, isForSimpleWidget);\n        const model = this._instantiationService.createInstance(TextModel, value, languageIdOrSelection, options, resource);\n        if (resource && this._disposedModels.has(MODEL_ID(resource))) {\n            const disposedModelData = this._removeDisposedModel(resource);\n            const elements = this._undoRedoService.getElements(resource);\n            const sha1Computer = this._getSHA1Computer();\n            const sha1IsEqual = (sha1Computer.canComputeSHA1(model)\n                ? sha1Computer.computeSHA1(model) === disposedModelData.sha1\n                : false);\n            if (sha1IsEqual || disposedModelData.sharesUndoRedoStack) {\n                for (const element of elements.past) {\n                    if (isEditStackElement(element) && element.matchesResource(resource)) {\n                        element.setModel(model);\n                    }\n                }\n                for (const element of elements.future) {\n                    if (isEditStackElement(element) && element.matchesResource(resource)) {\n                        element.setModel(model);\n                    }\n                }\n                this._undoRedoService.setElementsValidFlag(resource, true, (element) => (isEditStackElement(element) && element.matchesResource(resource)));\n                if (sha1IsEqual) {\n                    model._overwriteVersionId(disposedModelData.versionId);\n                    model._overwriteAlternativeVersionId(disposedModelData.alternativeVersionId);\n                    model._overwriteInitialUndoRedoSnapshot(disposedModelData.initialUndoRedoSnapshot);\n                }\n            }\n            else {\n                if (disposedModelData.initialUndoRedoSnapshot !== null) {\n                    this._undoRedoService.restoreSnapshot(disposedModelData.initialUndoRedoSnapshot);\n                }\n            }\n        }\n        const modelId = MODEL_ID(model.uri);\n        if (this._models[modelId]) {\n            // There already exists a model with this id => this is a programmer error\n            throw new Error('ModelService: Cannot add model because it already exists!');\n        }\n        const modelData = new ModelData(model, (model) => this._onWillDispose(model), (model, e) => this._onDidChangeLanguage(model, e));\n        this._models[modelId] = modelData;\n        return modelData;\n    }\n    createModel(value, languageSelection, resource, isForSimpleWidget = false) {\n        let modelData;\n        if (languageSelection) {\n            modelData = this._createModelData(value, languageSelection, resource, isForSimpleWidget);\n        }\n        else {\n            modelData = this._createModelData(value, PLAINTEXT_LANGUAGE_ID, resource, isForSimpleWidget);\n        }\n        this._onModelAdded.fire(modelData.model);\n        return modelData.model;\n    }\n    getModels() {\n        const ret = [];\n        const keys = Object.keys(this._models);\n        for (let i = 0, len = keys.length; i < len; i++) {\n            const modelId = keys[i];\n            ret.push(this._models[modelId].model);\n        }\n        return ret;\n    }\n    getModel(resource) {\n        const modelId = MODEL_ID(resource);\n        const modelData = this._models[modelId];\n        if (!modelData) {\n            return null;\n        }\n        return modelData.model;\n    }\n    // --- end IModelService\n    _schemaShouldMaintainUndoRedoElements(resource) {\n        return (resource.scheme === Schemas.file\n            || resource.scheme === Schemas.vscodeRemote\n            || resource.scheme === Schemas.vscodeUserData\n            || resource.scheme === Schemas.vscodeNotebookCell\n            || resource.scheme === 'fake-fs' // for tests\n        );\n    }\n    _onWillDispose(model) {\n        const modelId = MODEL_ID(model.uri);\n        const modelData = this._models[modelId];\n        const sharesUndoRedoStack = (this._undoRedoService.getUriComparisonKey(model.uri) !== model.uri.toString());\n        let maintainUndoRedoStack = false;\n        let heapSize = 0;\n        if (sharesUndoRedoStack || (this._shouldRestoreUndoStack() && this._schemaShouldMaintainUndoRedoElements(model.uri))) {\n            const elements = this._undoRedoService.getElements(model.uri);\n            if (elements.past.length > 0 || elements.future.length > 0) {\n                for (const element of elements.past) {\n                    if (isEditStackElement(element) && element.matchesResource(model.uri)) {\n                        maintainUndoRedoStack = true;\n                        heapSize += element.heapSize(model.uri);\n                        element.setModel(model.uri); // remove reference from text buffer instance\n                    }\n                }\n                for (const element of elements.future) {\n                    if (isEditStackElement(element) && element.matchesResource(model.uri)) {\n                        maintainUndoRedoStack = true;\n                        heapSize += element.heapSize(model.uri);\n                        element.setModel(model.uri); // remove reference from text buffer instance\n                    }\n                }\n            }\n        }\n        const maxMemory = ModelService_1.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK;\n        const sha1Computer = this._getSHA1Computer();\n        if (!maintainUndoRedoStack) {\n            if (!sharesUndoRedoStack) {\n                const initialUndoRedoSnapshot = modelData.model.getInitialUndoRedoSnapshot();\n                if (initialUndoRedoSnapshot !== null) {\n                    this._undoRedoService.restoreSnapshot(initialUndoRedoSnapshot);\n                }\n            }\n        }\n        else if (!sharesUndoRedoStack && (heapSize > maxMemory || !sha1Computer.canComputeSHA1(model))) {\n            // the undo stack for this file would never fit in the configured memory or the file is very large, so don't bother with it.\n            const initialUndoRedoSnapshot = modelData.model.getInitialUndoRedoSnapshot();\n            if (initialUndoRedoSnapshot !== null) {\n                this._undoRedoService.restoreSnapshot(initialUndoRedoSnapshot);\n            }\n        }\n        else {\n            this._ensureDisposedModelsHeapSize(maxMemory - heapSize);\n            // We only invalidate the elements, but they remain in the undo-redo service.\n            this._undoRedoService.setElementsValidFlag(model.uri, false, (element) => (isEditStackElement(element) && element.matchesResource(model.uri)));\n            this._insertDisposedModel(new DisposedModelInfo(model.uri, modelData.model.getInitialUndoRedoSnapshot(), Date.now(), sharesUndoRedoStack, heapSize, sha1Computer.computeSHA1(model), model.getVersionId(), model.getAlternativeVersionId()));\n        }\n        delete this._models[modelId];\n        modelData.dispose();\n        // clean up cache\n        delete this._modelCreationOptionsByLanguageAndResource[model.getLanguageId() + model.uri];\n        this._onModelRemoved.fire(model);\n    }\n    _onDidChangeLanguage(model, e) {\n        const oldLanguageId = e.oldLanguage;\n        const newLanguageId = model.getLanguageId();\n        const oldOptions = this.getCreationOptions(oldLanguageId, model.uri, model.isForSimpleWidget);\n        const newOptions = this.getCreationOptions(newLanguageId, model.uri, model.isForSimpleWidget);\n        ModelService_1._setModelOptionsForModel(model, newOptions, oldOptions);\n        this._onModelModeChanged.fire({ model, oldLanguageId: oldLanguageId });\n    }\n    _getSHA1Computer() {\n        return new DefaultModelSHA1Computer();\n    }\n};\nModelService = ModelService_1 = __decorate([\n    __param(0, IConfigurationService),\n    __param(1, ITextResourcePropertiesService),\n    __param(2, IUndoRedoService),\n    __param(3, IInstantiationService)\n], ModelService);\nclass DefaultModelSHA1Computer {\n    static { this.MAX_MODEL_SIZE = 10 * 1024 * 1024; } // takes 200ms to compute a sha1 on a 10MB model on a new machine\n    canComputeSHA1(model) {\n        return (model.getValueLength() <= DefaultModelSHA1Computer.MAX_MODEL_SIZE);\n    }\n    computeSHA1(model) {\n        // compute the sha1\n        const shaComputer = new StringSHA1();\n        const snapshot = model.createSnapshot();\n        let text;\n        while ((text = snapshot.read())) {\n            shaComputer.update(text);\n        }\n        return shaComputer.digest();\n    }\n}\n\nexport { DefaultModelSHA1Computer, ModelService };\n","import { DeferredPromise } from '../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../base/common/cancellation.js';\nimport { Event } from '../../../base/common/event.js';\nimport { Disposable, toDisposable, isDisposable, DisposableStore } from '../../../base/common/lifecycle.js';\nimport { IInstantiationService } from '../../instantiation/common/instantiation.js';\nimport { Extensions, DefaultQuickAccessFilterValue } from '../common/quickAccess.js';\nimport { IQuickInputService, ItemActivation } from '../common/quickInput.js';\nimport { Registry } from '../../registry/common/platform.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet QuickAccessController = class QuickAccessController extends Disposable {\n    constructor(quickInputService, instantiationService) {\n        super();\n        this.quickInputService = quickInputService;\n        this.instantiationService = instantiationService;\n        this.registry = Registry.as(Extensions.Quickaccess);\n        this.mapProviderToDescriptor = new Map();\n        this.lastAcceptedPickerValues = new Map();\n        this.visibleQuickAccess = undefined;\n        this._register(toDisposable(() => {\n            for (const provider of this.mapProviderToDescriptor.values()) {\n                if (isDisposable(provider)) {\n                    provider.dispose();\n                }\n            }\n            this.visibleQuickAccess?.picker.dispose();\n        }));\n    }\n    show(value = '', options) {\n        this.doShowOrPick(value, false, options);\n    }\n    doShowOrPick(value, pick, options) {\n        // Find provider for the value to show\n        const [provider, descriptor] = this.getOrInstantiateProvider(value, options?.enabledProviderPrefixes);\n        // Return early if quick access is already showing on that same prefix\n        const visibleQuickAccess = this.visibleQuickAccess;\n        const visibleDescriptor = visibleQuickAccess?.descriptor;\n        if (visibleQuickAccess && descriptor && visibleDescriptor === descriptor) {\n            // Apply value only if it is more specific than the prefix\n            // from the provider and we are not instructed to preserve\n            if (value !== descriptor.prefix && !options?.preserveValue) {\n                visibleQuickAccess.picker.value = value;\n            }\n            // Always adjust selection\n            this.adjustValueSelection(visibleQuickAccess.picker, descriptor, options);\n            return;\n        }\n        // Rewrite the filter value based on certain rules unless disabled\n        if (descriptor && !options?.preserveValue) {\n            let newValue = undefined;\n            // If we have a visible provider with a value, take it's filter value but\n            // rewrite to new provider prefix in case they differ\n            if (visibleQuickAccess && visibleDescriptor && visibleDescriptor !== descriptor) {\n                const newValueCandidateWithoutPrefix = visibleQuickAccess.value.substr(visibleDescriptor.prefix.length);\n                if (newValueCandidateWithoutPrefix) {\n                    newValue = `${descriptor.prefix}${newValueCandidateWithoutPrefix}`;\n                }\n            }\n            // Otherwise, take a default value as instructed\n            if (!newValue) {\n                const defaultFilterValue = provider?.defaultFilterValue;\n                if (defaultFilterValue === DefaultQuickAccessFilterValue.LAST) {\n                    newValue = this.lastAcceptedPickerValues.get(descriptor);\n                }\n                else if (typeof defaultFilterValue === 'string') {\n                    newValue = `${descriptor.prefix}${defaultFilterValue}`;\n                }\n            }\n            if (typeof newValue === 'string') {\n                value = newValue;\n            }\n        }\n        // Store the existing selection if there was one.\n        const visibleSelection = visibleQuickAccess?.picker?.valueSelection;\n        const visibleValue = visibleQuickAccess?.picker?.value;\n        // Create a picker for the provider to use with the initial value\n        // and adjust the filtering to exclude the prefix from filtering\n        const disposables = new DisposableStore();\n        const picker = disposables.add(this.quickInputService.createQuickPick({ useSeparators: true }));\n        picker.value = value;\n        this.adjustValueSelection(picker, descriptor, options);\n        picker.placeholder = options?.placeholder ?? descriptor?.placeholder;\n        picker.quickNavigate = options?.quickNavigateConfiguration;\n        picker.hideInput = !!picker.quickNavigate && !visibleQuickAccess; // only hide input if there was no picker opened already\n        if (typeof options?.itemActivation === 'number' || options?.quickNavigateConfiguration) {\n            picker.itemActivation = options?.itemActivation ?? ItemActivation.SECOND /* quick nav is always second */;\n        }\n        picker.contextKey = descriptor?.contextKey;\n        picker.filterValue = (value) => value.substring(descriptor ? descriptor.prefix.length : 0);\n        // Pick mode: setup a promise that can be resolved\n        // with the selected items and prevent execution\n        let pickPromise = undefined;\n        if (pick) {\n            pickPromise = new DeferredPromise();\n            disposables.add(Event.once(picker.onWillAccept)(e => {\n                e.veto();\n                picker.hide();\n            }));\n        }\n        // Register listeners\n        disposables.add(this.registerPickerListeners(picker, provider, descriptor, value, options));\n        // Ask provider to fill the picker as needed if we have one\n        // and pass over a cancellation token that will indicate when\n        // the picker is hiding without a pick being made.\n        const cts = disposables.add(new CancellationTokenSource());\n        if (provider) {\n            disposables.add(provider.provide(picker, cts.token, options?.providerOptions));\n        }\n        // Finally, trigger disposal and cancellation when the picker\n        // hides depending on items selected or not.\n        Event.once(picker.onDidHide)(() => {\n            if (picker.selectedItems.length === 0) {\n                cts.cancel();\n            }\n            // Start to dispose once picker hides\n            disposables.dispose();\n            // Resolve pick promise with selected items\n            pickPromise?.complete(picker.selectedItems.slice(0));\n        });\n        // Finally, show the picker. This is important because a provider\n        // may not call this and then our disposables would leak that rely\n        // on the onDidHide event.\n        picker.show();\n        // If the previous picker had a selection and the value is unchanged, we should set that in the new picker.\n        if (visibleSelection && visibleValue === value) {\n            picker.valueSelection = visibleSelection;\n        }\n        // Pick mode: return with promise\n        if (pick) {\n            return pickPromise?.p;\n        }\n    }\n    adjustValueSelection(picker, descriptor, options) {\n        let valueSelection;\n        // Preserve: just always put the cursor at the end\n        if (options?.preserveValue) {\n            valueSelection = [picker.value.length, picker.value.length];\n        }\n        // Otherwise: select the value up until the prefix\n        else {\n            valueSelection = [descriptor?.prefix.length ?? 0, picker.value.length];\n        }\n        picker.valueSelection = valueSelection;\n    }\n    registerPickerListeners(picker, provider, descriptor, value, options) {\n        const disposables = new DisposableStore();\n        // Remember as last visible picker and clean up once picker get's disposed\n        const visibleQuickAccess = this.visibleQuickAccess = { picker, descriptor, value };\n        disposables.add(toDisposable(() => {\n            if (visibleQuickAccess === this.visibleQuickAccess) {\n                this.visibleQuickAccess = undefined;\n            }\n        }));\n        // Whenever the value changes, check if the provider has\n        // changed and if so - re-create the picker from the beginning\n        disposables.add(picker.onDidChangeValue(value => {\n            const [providerForValue] = this.getOrInstantiateProvider(value, options?.enabledProviderPrefixes);\n            if (providerForValue !== provider) {\n                this.show(value, {\n                    enabledProviderPrefixes: options?.enabledProviderPrefixes,\n                    // do not rewrite value from user typing!\n                    preserveValue: true,\n                    // persist the value of the providerOptions from the original showing\n                    providerOptions: options?.providerOptions\n                });\n            }\n            else {\n                visibleQuickAccess.value = value; // remember the value in our visible one\n            }\n        }));\n        // Remember picker input for future use when accepting\n        if (descriptor) {\n            disposables.add(picker.onDidAccept(() => {\n                this.lastAcceptedPickerValues.set(descriptor, picker.value);\n            }));\n        }\n        return disposables;\n    }\n    getOrInstantiateProvider(value, enabledProviderPrefixes) {\n        const providerDescriptor = this.registry.getQuickAccessProvider(value);\n        if (!providerDescriptor || enabledProviderPrefixes && !enabledProviderPrefixes?.includes(providerDescriptor.prefix)) {\n            return [undefined, undefined];\n        }\n        let provider = this.mapProviderToDescriptor.get(providerDescriptor);\n        if (!provider) {\n            provider = this.instantiationService.createInstance(providerDescriptor.ctor);\n            this.mapProviderToDescriptor.set(providerDescriptor, provider);\n        }\n        return [provider, providerDescriptor];\n    }\n};\nQuickAccessController = __decorate([\n    __param(0, IQuickInputService),\n    __param(1, IInstantiationService)\n], QuickAccessController);\n\nexport { QuickAccessController };\n","import { memoize } from './decorators.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nclass LinkedText {\n    constructor(nodes) {\n        this.nodes = nodes;\n    }\n    toString() {\n        return this.nodes.map(node => typeof node === 'string' ? node : node.label).join('');\n    }\n}\n__decorate([\n    memoize\n], LinkedText.prototype, \"toString\", null);\nconst LINK_REGEX = /\\[([^\\]]+)\\]\\(((?:https?:\\/\\/|command:|file:)[^\\)\\s]+)(?: ([\"'])(.+?)(\\3))?\\)/gi;\nfunction parseLinkedText(text) {\n    const result = [];\n    let index = 0;\n    let match;\n    while (match = LINK_REGEX.exec(text)) {\n        if (match.index - index > 0) {\n            result.push(text.substring(index, match.index));\n        }\n        const [, label, href, , title] = match;\n        if (title) {\n            result.push({ label, href, title });\n        }\n        else {\n            result.push({ label, href });\n        }\n        index = match.index + match[0].length;\n    }\n    if (index < text.length) {\n        result.push(text.substring(index));\n    }\n    return new LinkedText(result);\n}\n\nexport { LinkedText, parseLinkedText };\n","import { reset, $, EventType, isEventLike, EventHelper } from '../../../base/browser/dom.js';\nimport { createCSSRule } from '../../../base/browser/domStylesheets.js';\nimport { asCSSUrl } from '../../../base/browser/cssValue.js';\nimport { DomEmitter } from '../../../base/browser/event.js';\nimport { Event } from '../../../base/common/event.js';\nimport { StandardKeyboardEvent } from '../../../base/browser/keyboardEvent.js';\nimport { Gesture, EventType as EventType$1 } from '../../../base/browser/touch.js';\nimport { renderLabelWithIcons } from '../../../base/browser/ui/iconLabel/iconLabels.js';\nimport { IdGenerator } from '../../../base/common/idGenerator.js';\nimport { parseLinkedText } from '../../../base/common/linkedText.js';\nimport './media/quickInput.css';\nimport { localize } from '../../../nls.js';\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 *--------------------------------------------------------------------------------------------*/\nconst iconPathToClass = {};\nconst iconClassGenerator = new IdGenerator('quick-input-button-icon-');\nfunction getIconClass(iconPath) {\n    if (!iconPath) {\n        return undefined;\n    }\n    let iconClass;\n    const key = iconPath.dark.toString();\n    if (iconPathToClass[key]) {\n        iconClass = iconPathToClass[key];\n    }\n    else {\n        iconClass = iconClassGenerator.nextId();\n        createCSSRule(`.${iconClass}, .hc-light .${iconClass}`, `background-image: ${asCSSUrl(iconPath.light || iconPath.dark)}`);\n        createCSSRule(`.vs-dark .${iconClass}, .hc-black .${iconClass}`, `background-image: ${asCSSUrl(iconPath.dark)}`);\n        iconPathToClass[key] = iconClass;\n    }\n    return iconClass;\n}\nfunction quickInputButtonToAction(button, id, run) {\n    let cssClasses = button.iconClass || getIconClass(button.iconPath);\n    if (button.alwaysVisible) {\n        cssClasses = cssClasses ? `${cssClasses} always-visible` : 'always-visible';\n    }\n    return {\n        id,\n        label: '',\n        tooltip: button.tooltip || '',\n        class: cssClasses,\n        enabled: true,\n        run\n    };\n}\nfunction renderQuickInputDescription(description, container, actionHandler) {\n    reset(container);\n    const parsed = parseLinkedText(description);\n    let tabIndex = 0;\n    for (const node of parsed.nodes) {\n        if (typeof node === 'string') {\n            container.append(...renderLabelWithIcons(node));\n        }\n        else {\n            let title = node.title;\n            if (!title && node.href.startsWith('command:')) {\n                title = localize(1771, \"Click to execute command '{0}'\", node.href.substring('command:'.length));\n            }\n            else if (!title) {\n                title = node.href;\n            }\n            const anchor = $('a', { href: node.href, title, tabIndex: tabIndex++ }, node.label);\n            anchor.style.textDecoration = 'underline';\n            const handleOpen = (e) => {\n                if (isEventLike(e)) {\n                    EventHelper.stop(e, true);\n                }\n                actionHandler.callback(node.href);\n            };\n            const onClick = actionHandler.disposables.add(new DomEmitter(anchor, EventType.CLICK)).event;\n            const onKeydown = actionHandler.disposables.add(new DomEmitter(anchor, EventType.KEY_DOWN)).event;\n            const onSpaceOrEnter = Event.chain(onKeydown, $ => $.filter(e => {\n                const event = new StandardKeyboardEvent(e);\n                return event.equals(10 /* KeyCode.Space */) || event.equals(3 /* KeyCode.Enter */);\n            }));\n            actionHandler.disposables.add(Gesture.addTarget(anchor));\n            const onTap = actionHandler.disposables.add(new DomEmitter(anchor, EventType$1.Tap)).event;\n            Event.any(onClick, onTap, onSpaceOrEnter)(handleOpen, null, actionHandler.disposables);\n            container.appendChild(anchor);\n        }\n    }\n}\n\nexport { quickInputButtonToAction, renderQuickInputDescription };\n","import { reset, isMouseEvent, addDisposableListener, EventType, isHTMLElement } from '../../../base/browser/dom.js';\nimport { StandardKeyboardEvent } from '../../../base/browser/keyboardEvent.js';\nimport { Toggle } from '../../../base/browser/ui/toggle/toggle.js';\nimport { equals } from '../../../base/common/arrays.js';\nimport { TimeoutTimer } from '../../../base/common/async.js';\nimport { Codicon } from '../../../base/common/codicons.js';\nimport { Emitter, EventBufferer } from '../../../base/common/event.js';\nimport { Disposable, DisposableStore } from '../../../base/common/lifecycle.js';\nimport { isIOS } from '../../../base/common/platform.js';\nimport Severity from '../../../base/common/severity.js';\nimport { ThemeIcon } from '../../../base/common/themables.js';\nimport './media/quickInput.css';\nimport { localize } from '../../../nls.js';\nimport { QuickInputButtonLocation, QuickInputHideReason, ItemActivation, NO_KEY_MODS, QuickPickFocus } from '../common/quickInput.js';\nimport { quickInputButtonToAction, renderQuickInputDescription } from './quickInputUtils.js';\nimport { IConfigurationService } from '../../configuration/common/configuration.js';\nimport { IHoverService, WorkbenchHoverDelegate } from '../../hover/browser/hover.js';\nimport { RawContextKey, ContextKeyExpr } from '../../contextkey/common/contextkey.js';\nimport '../../../base/common/observableInternal/index.js';\nimport { observableValue } from '../../../base/common/observableInternal/observables/observableValue.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst inQuickInputContextKeyValue = 'inQuickInput';\nconst InQuickInputContextKey = new RawContextKey(inQuickInputContextKeyValue, false, localize(1748, \"Whether keyboard focus is inside the quick input control\"));\nconst inQuickInputContext = ContextKeyExpr.has(inQuickInputContextKeyValue);\nconst quickInputAlignmentContextKeyValue = 'quickInputAlignment';\nconst QuickInputAlignmentContextKey = new RawContextKey(quickInputAlignmentContextKeyValue, 'top', localize(1749, \"The alignment of the quick input\"));\nconst quickInputTypeContextKeyValue = 'quickInputType';\nconst QuickInputTypeContextKey = new RawContextKey(quickInputTypeContextKeyValue, undefined, localize(1750, \"The type of the currently visible quick input\"));\nconst endOfQuickInputBoxContextKeyValue = 'cursorAtEndOfQuickInputBox';\nconst EndOfQuickInputBoxContextKey = new RawContextKey(endOfQuickInputBoxContextKeyValue, false, localize(1751, \"Whether the cursor in the quick input is at the end of the input box\"));\nconst endOfQuickInputBoxContext = ContextKeyExpr.has(endOfQuickInputBoxContextKeyValue);\nconst backButton = {\n    iconClass: ThemeIcon.asClassName(Codicon.quickInputBack),\n    tooltip: localize(1752, \"Back\")};\nclass QuickInput extends Disposable {\n    static { this.noPromptMessage = localize(1753, \"Press 'Enter' to confirm your input or 'Escape' to cancel\"); }\n    constructor(ui) {\n        super();\n        this.ui = ui;\n        this._visible = observableValue('visible', false);\n        this._widgetUpdated = false;\n        this._enabled = true;\n        this._busy = false;\n        this._ignoreFocusOut = false;\n        this._leftButtons = [];\n        this._rightButtons = [];\n        this._inlineButtons = [];\n        this.buttonsUpdated = false;\n        this._toggles = [];\n        this.togglesUpdated = false;\n        this.noValidationMessage = QuickInput.noPromptMessage;\n        this._severity = Severity.Ignore;\n        this.onDidTriggerButtonEmitter = this._register(new Emitter());\n        this.onDidHideEmitter = this._register(new Emitter());\n        this.onWillHideEmitter = this._register(new Emitter());\n        this.onDisposeEmitter = this._register(new Emitter());\n        this.visibleDisposables = this._register(new DisposableStore());\n        this.onDidHide = this.onDidHideEmitter.event;\n    }\n    get visible() {\n        return this._visible.get();\n    }\n    get title() {\n        return this._title;\n    }\n    set title(title) {\n        this._title = title;\n        this.update();\n    }\n    get description() {\n        return this._description;\n    }\n    set description(description) {\n        this._description = description;\n        this.update();\n    }\n    get step() {\n        return this._steps;\n    }\n    set step(step) {\n        this._steps = step;\n        this.update();\n    }\n    get totalSteps() {\n        return this._totalSteps;\n    }\n    set totalSteps(totalSteps) {\n        this._totalSteps = totalSteps;\n        this.update();\n    }\n    get enabled() {\n        return this._enabled;\n    }\n    set enabled(enabled) {\n        this._enabled = enabled;\n        this.update();\n    }\n    get contextKey() {\n        return this._contextKey;\n    }\n    set contextKey(contextKey) {\n        this._contextKey = contextKey;\n        this.update();\n    }\n    get busy() {\n        return this._busy;\n    }\n    set busy(busy) {\n        this._busy = busy;\n        this.update();\n    }\n    get ignoreFocusOut() {\n        return this._ignoreFocusOut;\n    }\n    set ignoreFocusOut(ignoreFocusOut) {\n        const shouldUpdate = this._ignoreFocusOut !== ignoreFocusOut && !isIOS;\n        this._ignoreFocusOut = ignoreFocusOut && !isIOS;\n        if (shouldUpdate) {\n            this.update();\n        }\n    }\n    get titleButtons() {\n        return this._leftButtons.length\n            ? [...this._leftButtons, this._rightButtons]\n            : this._rightButtons;\n    }\n    get buttons() {\n        return [\n            ...this._leftButtons,\n            ...this._rightButtons,\n            ...this._inlineButtons\n        ];\n    }\n    set buttons(buttons) {\n        this._leftButtons = buttons.filter(b => b === backButton);\n        this._rightButtons = buttons.filter(b => b !== backButton && b.location !== QuickInputButtonLocation.Inline);\n        this._inlineButtons = buttons.filter(b => b.location === QuickInputButtonLocation.Inline);\n        this.buttonsUpdated = true;\n        this.update();\n    }\n    get toggles() {\n        return this._toggles;\n    }\n    set toggles(toggles) {\n        this._toggles = toggles ?? [];\n        this.togglesUpdated = true;\n        this.update();\n    }\n    get validationMessage() {\n        return this._validationMessage;\n    }\n    set validationMessage(validationMessage) {\n        this._validationMessage = validationMessage;\n        this.update();\n    }\n    get severity() {\n        return this._severity;\n    }\n    set severity(severity) {\n        this._severity = severity;\n        this.update();\n    }\n    show() {\n        if (this.visible) {\n            return;\n        }\n        this.visibleDisposables.add(this.ui.onDidTriggerButton(button => {\n            if (this.buttons.indexOf(button) !== -1) {\n                this.onDidTriggerButtonEmitter.fire(button);\n            }\n        }));\n        this.ui.show(this);\n        // update properties in the controller that get reset in the ui.show() call\n        this._visible.set(true, undefined);\n        // This ensures the message/prompt gets rendered\n        this._lastValidationMessage = undefined;\n        // This ensures the input box has the right severity applied\n        this._lastSeverity = undefined;\n        if (this.buttons.length) {\n            // if there are buttons, the ui.show() clears them out of the UI so we should\n            // rerender them.\n            this.buttonsUpdated = true;\n        }\n        if (this.toggles.length) {\n            // if there are toggles, the ui.show() clears them out of the UI so we should\n            // rerender them.\n            this.togglesUpdated = true;\n        }\n        this.update();\n    }\n    hide() {\n        if (!this.visible) {\n            return;\n        }\n        this.ui.hide();\n    }\n    didHide(reason = QuickInputHideReason.Other) {\n        this._visible.set(false, undefined);\n        this.visibleDisposables.clear();\n        this.onDidHideEmitter.fire({ reason });\n    }\n    willHide(reason = QuickInputHideReason.Other) {\n        this.onWillHideEmitter.fire({ reason });\n    }\n    update() {\n        if (!this.visible) {\n            return;\n        }\n        const title = this.getTitle();\n        if (title && this.ui.title.textContent !== title) {\n            this.ui.title.textContent = title;\n        }\n        else if (!title && this.ui.title.innerHTML !== '&nbsp;') {\n            this.ui.title.innerText = '\\u00a0';\n        }\n        const description = this.getDescription();\n        if (this.ui.description1.textContent !== description) {\n            this.ui.description1.textContent = description;\n        }\n        if (this.ui.description2.textContent !== description) {\n            this.ui.description2.textContent = description;\n        }\n        if (this._widgetUpdated) {\n            this._widgetUpdated = false;\n            if (this._widget) {\n                reset(this.ui.widget, this._widget);\n            }\n            else {\n                reset(this.ui.widget);\n            }\n        }\n        if (this.busy && !this.busyDelay) {\n            this.busyDelay = new TimeoutTimer();\n            this.busyDelay.setIfNotSet(() => {\n                if (this.visible) {\n                    this.ui.progressBar.infinite();\n                    this.ui.progressBar.getContainer().removeAttribute('aria-hidden');\n                }\n            }, 800);\n        }\n        if (!this.busy && this.busyDelay) {\n            this.ui.progressBar.stop();\n            this.ui.progressBar.getContainer().setAttribute('aria-hidden', 'true');\n            this.busyDelay.cancel();\n            this.busyDelay = undefined;\n        }\n        if (this.buttonsUpdated) {\n            this.buttonsUpdated = false;\n            this.ui.leftActionBar.clear();\n            const leftButtons = this._leftButtons\n                .map((button, index) => quickInputButtonToAction(button, `id-${index}`, async () => this.onDidTriggerButtonEmitter.fire(button)));\n            this.ui.leftActionBar.push(leftButtons, { icon: true, label: false });\n            this.ui.rightActionBar.clear();\n            const rightButtons = this._rightButtons\n                .map((button, index) => quickInputButtonToAction(button, `id-${index}`, async () => this.onDidTriggerButtonEmitter.fire(button)));\n            this.ui.rightActionBar.push(rightButtons, { icon: true, label: false });\n            this.ui.inlineActionBar.clear();\n            const inlineButtons = this._inlineButtons\n                .map((button, index) => quickInputButtonToAction(button, `id-${index}`, async () => this.onDidTriggerButtonEmitter.fire(button)));\n            this.ui.inlineActionBar.push(inlineButtons, { icon: true, label: false });\n        }\n        if (this.togglesUpdated) {\n            this.togglesUpdated = false;\n            // HACK: Filter out toggles here that are not concrete Toggle objects. This is to workaround\n            // a layering issue as quick input's interface is in common but Toggle is in browser and\n            // it requires a HTMLElement on its interface\n            const concreteToggles = this.toggles?.filter(opts => opts instanceof Toggle) ?? [];\n            this.ui.inputBox.toggles = concreteToggles;\n            // Adjust count badge position based on number of toggles (each toggle is ~22px wide)\n            const toggleOffset = concreteToggles.length * 22;\n            this.ui.countContainer.style.right = toggleOffset > 0 ? `${4 + toggleOffset}px` : '4px';\n            this.ui.visibleCountContainer.style.right = toggleOffset > 0 ? `${4 + toggleOffset}px` : '4px';\n        }\n        this.ui.ignoreFocusOut = this.ignoreFocusOut;\n        this.ui.setEnabled(this.enabled);\n        this.ui.setContextKey(this.contextKey);\n        const validationMessage = this.validationMessage || this.noValidationMessage;\n        if (this._lastValidationMessage !== validationMessage) {\n            this._lastValidationMessage = validationMessage;\n            reset(this.ui.message);\n            if (validationMessage) {\n                renderQuickInputDescription(validationMessage, this.ui.message, {\n                    callback: (content) => {\n                        this.ui.linkOpenerDelegate(content);\n                    },\n                    disposables: this.visibleDisposables,\n                });\n            }\n        }\n        if (this._lastSeverity !== this.severity) {\n            this._lastSeverity = this.severity;\n            this.showMessageDecoration(this.severity);\n        }\n    }\n    getTitle() {\n        if (this.title && this.step) {\n            return `${this.title} (${this.getSteps()})`;\n        }\n        if (this.title) {\n            return this.title;\n        }\n        if (this.step) {\n            return this.getSteps();\n        }\n        return '';\n    }\n    getDescription() {\n        return this.description || '';\n    }\n    getSteps() {\n        if (this.step && this.totalSteps) {\n            return localize(1754, \"{0}/{1}\", this.step, this.totalSteps);\n        }\n        if (this.step) {\n            return String(this.step);\n        }\n        return '';\n    }\n    showMessageDecoration(severity) {\n        this.ui.inputBox.showDecoration(severity);\n        if (severity !== Severity.Ignore) {\n            const styles = this.ui.inputBox.stylesForType(severity);\n            this.ui.message.style.color = styles.foreground ? `${styles.foreground}` : '';\n            this.ui.message.style.backgroundColor = styles.background ? `${styles.background}` : '';\n            this.ui.message.style.border = styles.border ? `1px solid ${styles.border}` : '';\n            this.ui.message.style.marginBottom = '-2px';\n        }\n        else {\n            this.ui.message.style.color = '';\n            this.ui.message.style.backgroundColor = '';\n            this.ui.message.style.border = '';\n            this.ui.message.style.marginBottom = '';\n        }\n    }\n    dispose() {\n        this.hide();\n        this.onDisposeEmitter.fire();\n        super.dispose();\n    }\n}\nclass QuickPick extends QuickInput {\n    static { this.DEFAULT_ARIA_LABEL = localize(1755, \"Type to narrow down results.\"); }\n    constructor(ui) {\n        super(ui);\n        this._value = '';\n        this.onDidChangeValueEmitter = this._register(new Emitter());\n        this.onWillAcceptEmitter = this._register(new Emitter());\n        this.onDidAcceptEmitter = this._register(new Emitter());\n        this.onDidCustomEmitter = this._register(new Emitter());\n        this._items = [];\n        this.itemsUpdated = false;\n        this._canSelectMany = false;\n        this._canAcceptInBackground = false;\n        this._matchOnDescription = false;\n        this._matchOnDetail = false;\n        this._matchOnLabel = true;\n        this._matchOnLabelMode = 'fuzzy';\n        this._sortByLabel = true;\n        this._keepScrollPosition = false;\n        this._itemActivation = ItemActivation.FIRST;\n        this._activeItems = [];\n        this.activeItemsUpdated = false;\n        this.activeItemsToConfirm = [];\n        this.onDidChangeActiveEmitter = this._register(new Emitter());\n        this._selectedItems = [];\n        this.selectedItemsUpdated = false;\n        this.selectedItemsToConfirm = [];\n        this.onDidChangeSelectionEmitter = this._register(new Emitter());\n        this.onDidTriggerItemButtonEmitter = this._register(new Emitter());\n        this.onDidTriggerSeparatorButtonEmitter = this._register(new Emitter());\n        this.valueSelectionUpdated = true;\n        this._ok = 'default';\n        this._customButton = false;\n        this._focusEventBufferer = new EventBufferer();\n        this.type = \"quickPick\" /* QuickInputType.QuickPick */;\n        this.filterValue = (value) => value;\n        this.onDidChangeValue = this.onDidChangeValueEmitter.event;\n        this.onWillAccept = this.onWillAcceptEmitter.event;\n        this.onDidAccept = this.onDidAcceptEmitter.event;\n        this.onDidChangeActive = this.onDidChangeActiveEmitter.event;\n        this.onDidChangeSelection = this.onDidChangeSelectionEmitter.event;\n        this.onDidTriggerItemButton = this.onDidTriggerItemButtonEmitter.event;\n        this.onDidTriggerSeparatorButton = this.onDidTriggerSeparatorButtonEmitter.event;\n        this.noValidationMessage = undefined;\n    }\n    get quickNavigate() {\n        return this._quickNavigate;\n    }\n    set quickNavigate(quickNavigate) {\n        this._quickNavigate = quickNavigate;\n        this.update();\n    }\n    get value() {\n        return this._value;\n    }\n    set value(value) {\n        this.doSetValue(value);\n    }\n    doSetValue(value, skipUpdate) {\n        if (this._value !== value) {\n            this._value = value;\n            if (!skipUpdate) {\n                this.update();\n            }\n            if (this.visible) {\n                const didFilter = this.ui.list.filter(this.filterValue(this._value));\n                if (didFilter) {\n                    this.trySelectFirst();\n                }\n            }\n            this.onDidChangeValueEmitter.fire(this._value);\n        }\n    }\n    set ariaLabel(ariaLabel) {\n        this._ariaLabel = ariaLabel;\n        this.update();\n    }\n    get ariaLabel() {\n        return this._ariaLabel;\n    }\n    get placeholder() {\n        return this._placeholder;\n    }\n    set placeholder(placeholder) {\n        this._placeholder = placeholder;\n        this.update();\n    }\n    get prompt() {\n        return this.noValidationMessage;\n    }\n    set prompt(prompt) {\n        this.noValidationMessage = prompt;\n        this.update();\n    }\n    get items() {\n        return this._items;\n    }\n    get scrollTop() {\n        return this.ui.list.scrollTop;\n    }\n    set scrollTop(scrollTop) {\n        this.ui.list.scrollTop = scrollTop;\n    }\n    set items(items) {\n        this._items = items;\n        this.itemsUpdated = true;\n        this.update();\n    }\n    get canSelectMany() {\n        return this._canSelectMany;\n    }\n    set canSelectMany(canSelectMany) {\n        this._canSelectMany = canSelectMany;\n        this.update();\n    }\n    get canAcceptInBackground() {\n        return this._canAcceptInBackground;\n    }\n    set canAcceptInBackground(canAcceptInBackground) {\n        this._canAcceptInBackground = canAcceptInBackground;\n    }\n    get matchOnDescription() {\n        return this._matchOnDescription;\n    }\n    set matchOnDescription(matchOnDescription) {\n        this._matchOnDescription = matchOnDescription;\n        this.update();\n    }\n    get matchOnDetail() {\n        return this._matchOnDetail;\n    }\n    set matchOnDetail(matchOnDetail) {\n        this._matchOnDetail = matchOnDetail;\n        this.update();\n    }\n    get matchOnLabel() {\n        return this._matchOnLabel;\n    }\n    set matchOnLabel(matchOnLabel) {\n        this._matchOnLabel = matchOnLabel;\n        this.update();\n    }\n    get matchOnLabelMode() {\n        return this._matchOnLabelMode;\n    }\n    set matchOnLabelMode(matchOnLabelMode) {\n        this._matchOnLabelMode = matchOnLabelMode;\n        this.update();\n    }\n    get sortByLabel() {\n        return this._sortByLabel;\n    }\n    set sortByLabel(sortByLabel) {\n        this._sortByLabel = sortByLabel;\n        this.update();\n    }\n    get keepScrollPosition() {\n        return this._keepScrollPosition;\n    }\n    set keepScrollPosition(keepScrollPosition) {\n        this._keepScrollPosition = keepScrollPosition;\n    }\n    get itemActivation() {\n        return this._itemActivation;\n    }\n    set itemActivation(itemActivation) {\n        this._itemActivation = itemActivation;\n    }\n    get activeItems() {\n        return this._activeItems;\n    }\n    set activeItems(activeItems) {\n        this._activeItems = activeItems;\n        this.activeItemsUpdated = true;\n        this.update();\n    }\n    get selectedItems() {\n        return this._selectedItems;\n    }\n    set selectedItems(selectedItems) {\n        this._selectedItems = selectedItems;\n        this.selectedItemsUpdated = true;\n        this.update();\n    }\n    get keyMods() {\n        if (this._quickNavigate) {\n            // Disable keyMods when quick navigate is enabled\n            // because in this model the interaction is purely\n            // keyboard driven and Ctrl/Alt are typically\n            // pressed and hold during this interaction.\n            return NO_KEY_MODS;\n        }\n        return this.ui.keyMods;\n    }\n    get valueSelection() {\n        const selection = this.ui.inputBox.getSelection();\n        if (!selection) {\n            return undefined;\n        }\n        return [selection.start, selection.end];\n    }\n    set valueSelection(valueSelection) {\n        this._valueSelection = valueSelection;\n        this.valueSelectionUpdated = true;\n        this.update();\n    }\n    get customButton() {\n        return this._customButton;\n    }\n    set customButton(showCustomButton) {\n        this._customButton = showCustomButton;\n        this.update();\n    }\n    get customLabel() {\n        return this._customButtonLabel;\n    }\n    set customLabel(label) {\n        this._customButtonLabel = label;\n        this.update();\n    }\n    get customHover() {\n        return this._customButtonHover;\n    }\n    set customHover(hover) {\n        this._customButtonHover = hover;\n        this.update();\n    }\n    get ok() {\n        return this._ok;\n    }\n    set ok(showOkButton) {\n        this._ok = showOkButton;\n        this.update();\n    }\n    get okLabel() {\n        return this._okLabel ?? localize(1756, \"OK\");\n    }\n    set okLabel(okLabel) {\n        this._okLabel = okLabel;\n        this.update();\n    }\n    get hideInput() {\n        return !!this._hideInput;\n    }\n    set hideInput(hideInput) {\n        this._hideInput = hideInput;\n        this.update();\n    }\n    trySelectFirst() {\n        if (!this.canSelectMany) {\n            this.ui.list.focus(QuickPickFocus.First);\n        }\n    }\n    show() {\n        if (!this.visible) {\n            this.visibleDisposables.add(this.ui.inputBox.onDidChange(value => {\n                this.doSetValue(value, true /* skip update since this originates from the UI */);\n            }));\n            this.visibleDisposables.add(this.ui.onDidAccept(() => {\n                if (this.canSelectMany) {\n                    // if there are no checked elements, it means that an onDidChangeSelection never fired to overwrite\n                    // `_selectedItems`. In that case, we should emit one with an empty array to ensure that\n                    // `.selectedItems` is up to date.\n                    if (!this.ui.list.getCheckedElements().length) {\n                        this._selectedItems = [];\n                        this.onDidChangeSelectionEmitter.fire(this.selectedItems);\n                    }\n                }\n                else if (this.activeItems[0]) {\n                    // For single-select, we set `selectedItems` to the item that was accepted.\n                    this._selectedItems = [this.activeItems[0]];\n                    this.onDidChangeSelectionEmitter.fire(this.selectedItems);\n                }\n                this.handleAccept(false);\n            }));\n            this.visibleDisposables.add(this.ui.onDidCustom(() => {\n                this.onDidCustomEmitter.fire();\n            }));\n            this.visibleDisposables.add(this._focusEventBufferer.wrapEvent(this.ui.list.onDidChangeFocus, \n            // Only fire the last event\n            (_, e) => e)(focusedItems => {\n                if (this.activeItemsUpdated) {\n                    return; // Expect another event.\n                }\n                if (this.activeItemsToConfirm !== this._activeItems && equals(focusedItems, this._activeItems, (a, b) => a === b)) {\n                    return;\n                }\n                this._activeItems = focusedItems;\n                this.onDidChangeActiveEmitter.fire(focusedItems);\n            }));\n            this.visibleDisposables.add(this.ui.list.onDidChangeSelection(({ items: selectedItems, event }) => {\n                if (this.canSelectMany && !selectedItems.some(i => i.pickable === false)) {\n                    if (selectedItems.length) {\n                        this.ui.list.setSelectedElements([]);\n                    }\n                    return;\n                }\n                if (this.selectedItemsToConfirm !== this._selectedItems && equals(selectedItems, this._selectedItems, (a, b) => a === b)) {\n                    return;\n                }\n                this._selectedItems = selectedItems;\n                this.onDidChangeSelectionEmitter.fire(selectedItems);\n                if (selectedItems.length) {\n                    this.handleAccept(isMouseEvent(event) && event.button === 1 /* mouse middle click */);\n                }\n            }));\n            this.visibleDisposables.add(this.ui.list.onChangedCheckedElements(checkedItems => {\n                if (!this.canSelectMany || !this.visible) {\n                    return;\n                }\n                if (this.selectedItemsToConfirm !== this._selectedItems && equals(checkedItems, this._selectedItems, (a, b) => a === b)) {\n                    return;\n                }\n                this._selectedItems = checkedItems;\n                this.onDidChangeSelectionEmitter.fire(checkedItems);\n            }));\n            this.visibleDisposables.add(this.ui.list.onButtonTriggered(event => this.onDidTriggerItemButtonEmitter.fire(event)));\n            this.visibleDisposables.add(this.ui.list.onSeparatorButtonTriggered(event => this.onDidTriggerSeparatorButtonEmitter.fire(event)));\n            this.visibleDisposables.add(this.registerQuickNavigation());\n            this.valueSelectionUpdated = true;\n        }\n        super.show(); // TODO: Why have show() bubble up while update() trickles down?\n    }\n    handleAccept(inBackground) {\n        // Figure out veto via `onWillAccept` event\n        let veto = false;\n        this.onWillAcceptEmitter.fire({ veto: () => veto = true });\n        // Continue with `onDidAccept` if no veto\n        if (!veto) {\n            this.onDidAcceptEmitter.fire({ inBackground });\n        }\n    }\n    registerQuickNavigation() {\n        return addDisposableListener(this.ui.container, EventType.KEY_UP, e => {\n            if (this.canSelectMany || !this._quickNavigate) {\n                return;\n            }\n            const keyboardEvent = new StandardKeyboardEvent(e);\n            const keyCode = keyboardEvent.keyCode;\n            // Select element when keys are pressed that signal it\n            const quickNavKeys = this._quickNavigate.keybindings;\n            const wasTriggerKeyPressed = quickNavKeys.some(k => {\n                const chords = k.getChords();\n                if (chords.length > 1) {\n                    return false;\n                }\n                if (chords[0].shiftKey && keyCode === 4 /* KeyCode.Shift */) {\n                    if (keyboardEvent.ctrlKey || keyboardEvent.altKey || keyboardEvent.metaKey) {\n                        return false; // this is an optimistic check for the shift key being used to navigate back in quick input\n                    }\n                    return true;\n                }\n                if (chords[0].altKey && keyCode === 6 /* KeyCode.Alt */) {\n                    return true;\n                }\n                if (chords[0].ctrlKey && keyCode === 5 /* KeyCode.Ctrl */) {\n                    return true;\n                }\n                if (chords[0].metaKey && keyCode === 57 /* KeyCode.Meta */) {\n                    return true;\n                }\n                return false;\n            });\n            if (wasTriggerKeyPressed) {\n                if (this.activeItems[0]) {\n                    this._selectedItems = [this.activeItems[0]];\n                    this.onDidChangeSelectionEmitter.fire(this.selectedItems);\n                    this.handleAccept(false);\n                }\n                // Unset quick navigate after press. It is only valid once\n                // and should not result in any behaviour change afterwards\n                // if the picker remains open because there was no active item\n                this._quickNavigate = undefined;\n            }\n        });\n    }\n    update() {\n        if (!this.visible) {\n            return;\n        }\n        // store the scrollTop before it is reset\n        const scrollTopBefore = this.keepScrollPosition ? this.scrollTop : 0;\n        const hasDescription = !!this.description;\n        const visibilities = {\n            title: !!this.title || !!this.step || !!this.titleButtons.length,\n            description: hasDescription,\n            checkAll: this.canSelectMany && !this._hideCheckAll,\n            checkBox: this.canSelectMany,\n            inputBox: !this._hideInput,\n            progressBar: !this._hideInput || hasDescription,\n            visibleCount: true,\n            count: this.canSelectMany && !this._hideCountBadge,\n            ok: this.ok === 'default' ? this.canSelectMany : this.ok,\n            list: true,\n            message: !!this.validationMessage || !!this.prompt,\n            customButton: this.customButton\n        };\n        this.ui.setVisibilities(visibilities);\n        super.update();\n        if (this.ui.inputBox.value !== this.value) {\n            this.ui.inputBox.value = this.value;\n        }\n        if (this.valueSelectionUpdated) {\n            this.valueSelectionUpdated = false;\n            this.ui.inputBox.select(this._valueSelection && { start: this._valueSelection[0], end: this._valueSelection[1] });\n        }\n        if (this.ui.inputBox.placeholder !== (this.placeholder || '')) {\n            this.ui.inputBox.placeholder = (this.placeholder || '');\n        }\n        let ariaLabel = this.ariaLabel;\n        // Only set aria label to the input box placeholder if we actually have an input box.\n        if (!ariaLabel && visibilities.inputBox) {\n            ariaLabel = this.placeholder;\n            // If we have a title, include it in the aria label.\n            if (this.title) {\n                ariaLabel = ariaLabel\n                    ? `${ariaLabel} - ${this.title}`\n                    : this.title;\n            }\n            if (!ariaLabel) {\n                ariaLabel = QuickPick.DEFAULT_ARIA_LABEL;\n            }\n        }\n        if (this.ui.list.ariaLabel !== ariaLabel) {\n            this.ui.list.ariaLabel = ariaLabel ?? null;\n        }\n        if (this.ui.inputBox.ariaLabel !== ariaLabel) {\n            this.ui.inputBox.ariaLabel = ariaLabel ?? 'input';\n        }\n        this.ui.list.matchOnDescription = this.matchOnDescription;\n        this.ui.list.matchOnDetail = this.matchOnDetail;\n        this.ui.list.matchOnLabel = this.matchOnLabel;\n        this.ui.list.matchOnLabelMode = this.matchOnLabelMode;\n        this.ui.list.sortByLabel = this.sortByLabel;\n        if (this.itemsUpdated) {\n            this.itemsUpdated = false;\n            this._focusEventBufferer.bufferEvents(() => {\n                this.ui.list.setElements(this.items);\n                // We want focus to exist in the list if there are items so that space can be used to toggle\n                this.ui.list.shouldLoop = !this.canSelectMany;\n                this.ui.list.filter(this.filterValue(this.ui.inputBox.value));\n                switch (this._itemActivation) {\n                    case ItemActivation.NONE:\n                        this._itemActivation = ItemActivation.FIRST; // only valid once, then unset\n                        break;\n                    case ItemActivation.SECOND:\n                        this.ui.list.focus(QuickPickFocus.Second);\n                        this._itemActivation = ItemActivation.FIRST; // only valid once, then unset\n                        break;\n                    case ItemActivation.LAST:\n                        this.ui.list.focus(QuickPickFocus.Last);\n                        this._itemActivation = ItemActivation.FIRST; // only valid once, then unset\n                        break;\n                    default:\n                        this.trySelectFirst();\n                        break;\n                }\n            });\n        }\n        if (this.ui.container.classList.contains('show-checkboxes') !== !!this.canSelectMany) {\n            if (this.canSelectMany) {\n                this.ui.list.clearFocus();\n            }\n            else {\n                this.trySelectFirst();\n            }\n        }\n        if (this.activeItemsUpdated) {\n            this.activeItemsUpdated = false;\n            this.activeItemsToConfirm = this._activeItems;\n            this.ui.list.setFocusedElements(this.activeItems);\n            if (this.activeItemsToConfirm === this._activeItems) {\n                this.activeItemsToConfirm = null;\n            }\n        }\n        if (this.selectedItemsUpdated) {\n            this.selectedItemsUpdated = false;\n            this.selectedItemsToConfirm = this._selectedItems;\n            if (this.canSelectMany) {\n                this.ui.list.setCheckedElements(this.selectedItems);\n            }\n            else {\n                this.ui.list.setSelectedElements(this.selectedItems);\n            }\n            if (this.selectedItemsToConfirm === this._selectedItems) {\n                this.selectedItemsToConfirm = null;\n            }\n        }\n        this.ui.ok.label = this.okLabel || '';\n        this.ui.customButton.label = this.customLabel || '';\n        this.ui.customButton.element.title = this.customHover || '';\n        if (!visibilities.inputBox) {\n            // we need to move focus into the tree to detect keybindings\n            // properly when the input box is not visible (quick nav)\n            this.ui.list.domFocus();\n            // Focus the first element in the list if multiselect is enabled\n            if (this.canSelectMany) {\n                this.ui.list.focus(QuickPickFocus.First);\n            }\n        }\n        // Set the scroll position to what it was before updating the items\n        if (this.keepScrollPosition) {\n            this.scrollTop = scrollTopBefore;\n        }\n    }\n    focus(focus) {\n        this.ui.list.focus(focus);\n        // To allow things like space to check/uncheck items\n        if (this.canSelectMany) {\n            this.ui.list.domFocus();\n        }\n    }\n    accept(inBackground) {\n        if (inBackground && !this._canAcceptInBackground) {\n            return; // needs to be enabled\n        }\n        if (this.activeItems[0] && !this._canSelectMany) {\n            this._selectedItems = [this.activeItems[0]];\n            this.onDidChangeSelectionEmitter.fire(this.selectedItems);\n        }\n        this.handleAccept(inBackground ?? false);\n    }\n}\nclass InputBox extends QuickInput {\n    constructor() {\n        super(...arguments);\n        this._value = '';\n        this.valueSelectionUpdated = true;\n        this._password = false;\n        this.onDidValueChangeEmitter = this._register(new Emitter());\n        this.onDidAcceptEmitter = this._register(new Emitter());\n        this.type = \"inputBox\" /* QuickInputType.InputBox */;\n        this.onDidChangeValue = this.onDidValueChangeEmitter.event;\n        this.onDidAccept = this.onDidAcceptEmitter.event;\n    }\n    get value() {\n        return this._value;\n    }\n    set value(value) {\n        this._value = value || '';\n        this.update();\n    }\n    get valueSelection() {\n        const selection = this.ui.inputBox.getSelection();\n        if (!selection) {\n            return undefined;\n        }\n        return [selection.start, selection.end];\n    }\n    set valueSelection(valueSelection) {\n        this._valueSelection = valueSelection;\n        this.valueSelectionUpdated = true;\n        this.update();\n    }\n    get placeholder() {\n        return this._placeholder;\n    }\n    set placeholder(placeholder) {\n        this._placeholder = placeholder;\n        this.update();\n    }\n    get ariaLabel() {\n        return this._ariaLabel;\n    }\n    set ariaLabel(ariaLabel) {\n        this._ariaLabel = ariaLabel;\n        this.update();\n    }\n    get password() {\n        return this._password;\n    }\n    set password(password) {\n        this._password = password;\n        this.update();\n    }\n    get prompt() {\n        return this._prompt;\n    }\n    set prompt(prompt) {\n        this._prompt = prompt;\n        this.noValidationMessage = prompt\n            ? localize(1757, \"{0} (Press 'Enter' to confirm or 'Escape' to cancel)\", prompt)\n            : QuickInput.noPromptMessage;\n        this.update();\n    }\n    show() {\n        if (!this.visible) {\n            this.visibleDisposables.add(this.ui.inputBox.onDidChange(value => {\n                if (value === this.value) {\n                    return;\n                }\n                this._value = value;\n                this.onDidValueChangeEmitter.fire(value);\n            }));\n            this.visibleDisposables.add(this.ui.onDidAccept(() => this.onDidAcceptEmitter.fire()));\n            this.valueSelectionUpdated = true;\n        }\n        super.show();\n    }\n    accept() {\n        this.onDidAcceptEmitter.fire();\n    }\n    update() {\n        if (!this.visible) {\n            return;\n        }\n        this.ui.container.classList.remove('hidden-input');\n        const visibilities = {\n            title: !!this.title || !!this.step || !!this.titleButtons.length,\n            description: !!this.description || !!this.step,\n            inputBox: true,\n            message: true,\n            progressBar: true\n        };\n        this.ui.setVisibilities(visibilities);\n        super.update();\n        if (this.ui.inputBox.value !== this.value) {\n            this.ui.inputBox.value = this.value;\n        }\n        if (this.valueSelectionUpdated) {\n            this.valueSelectionUpdated = false;\n            this.ui.inputBox.select(this._valueSelection && { start: this._valueSelection[0], end: this._valueSelection[1] });\n        }\n        if (this.ui.inputBox.placeholder !== (this.placeholder || '')) {\n            this.ui.inputBox.placeholder = (this.placeholder || '');\n        }\n        if (this.ui.inputBox.password !== this.password) {\n            this.ui.inputBox.password = this.password;\n        }\n        let ariaLabel = this.ariaLabel;\n        // Only set aria label to the input box placeholder if we actually have an input box.\n        if (!ariaLabel && visibilities.inputBox) {\n            ariaLabel = this.placeholder\n                ? this.title\n                    ? `${this.placeholder} - ${this.title}`\n                    : this.placeholder\n                : this.title\n                    ? this.title\n                    : 'input';\n        }\n        if (this.ui.inputBox.ariaLabel !== ariaLabel) {\n            this.ui.inputBox.ariaLabel = ariaLabel || 'input';\n        }\n    }\n}\nlet QuickInputHoverDelegate = class QuickInputHoverDelegate extends WorkbenchHoverDelegate {\n    constructor(configurationService, hoverService) {\n        super('mouse', undefined, (options) => this.getOverrideOptions(options), configurationService, hoverService);\n    }\n    getOverrideOptions(options) {\n        // Only show the hover hint if the content is of a decent size\n        const showHoverHint = (isHTMLElement(options.content)\n            ? options.content.textContent ?? ''\n            : typeof options.content === 'string'\n                ? options.content\n                : options.content.value).includes('\\n');\n        return {\n            persistence: {\n                hideOnKeyDown: false,\n            },\n            appearance: {\n                showHoverHint,\n                skipFadeInAnimation: true,\n            },\n        };\n    }\n};\nQuickInputHoverDelegate = __decorate([\n    __param(0, IConfigurationService),\n    __param(1, IHoverService)\n], QuickInputHoverDelegate);\n\nexport { EndOfQuickInputBoxContextKey, InQuickInputContextKey, InputBox, QuickInput, QuickInputAlignmentContextKey, QuickInputHoverDelegate, QuickInputTypeContextKey, QuickPick, backButton, endOfQuickInputBoxContext, endOfQuickInputBoxContextKeyValue, inQuickInputContext, inQuickInputContextKeyValue, quickInputAlignmentContextKeyValue, quickInputTypeContextKeyValue };\n","import { show } from '../../dom.js';\nimport { RunOnceScheduler } from '../../../common/async.js';\nimport { Disposable, MutableDisposable } from '../../../common/lifecycle.js';\nimport './progressbar.css';\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 *--------------------------------------------------------------------------------------------*/\nconst CSS_DONE = 'done';\nconst CSS_ACTIVE = 'active';\nconst CSS_INFINITE = 'infinite';\nconst CSS_INFINITE_LONG_RUNNING = 'infinite-long-running';\nconst CSS_DISCRETE = 'discrete';\n/**\n * A progress bar with support for infinite or discrete progress.\n */\nclass ProgressBar extends Disposable {\n    /**\n     * After a certain time of showing the progress bar, switch\n     * to long-running mode and throttle animations to reduce\n     * the pressure on the GPU process.\n     *\n     * https://github.com/microsoft/vscode/issues/97900\n     * https://github.com/microsoft/vscode/issues/138396\n     */\n    static { this.LONG_RUNNING_INFINITE_THRESHOLD = 10000; }\n    constructor(container, options) {\n        super();\n        this.progressSignal = this._register(new MutableDisposable());\n        this.workedVal = 0;\n        this.showDelayedScheduler = this._register(new RunOnceScheduler(() => show(this.element), 0));\n        this.longRunningScheduler = this._register(new RunOnceScheduler(() => this.infiniteLongRunning(), ProgressBar.LONG_RUNNING_INFINITE_THRESHOLD));\n        this.create(container, options);\n    }\n    create(container, options) {\n        this.element = document.createElement('div');\n        this.element.classList.add('monaco-progress-container');\n        this.element.setAttribute('role', 'progressbar');\n        this.element.setAttribute('aria-valuemin', '0');\n        container.appendChild(this.element);\n        this.bit = document.createElement('div');\n        this.bit.classList.add('progress-bit');\n        this.bit.style.backgroundColor = options?.progressBarBackground || '#0E70C0';\n        this.element.appendChild(this.bit);\n    }\n    off() {\n        this.bit.style.width = 'inherit';\n        this.bit.style.opacity = '1';\n        this.element.classList.remove(CSS_ACTIVE, CSS_INFINITE, CSS_INFINITE_LONG_RUNNING, CSS_DISCRETE);\n        this.workedVal = 0;\n        this.totalWork = undefined;\n        this.longRunningScheduler.cancel();\n        this.progressSignal.clear();\n    }\n    /**\n     * Stops the progressbar from showing any progress instantly without fading out.\n     */\n    stop() {\n        return this.doDone(false);\n    }\n    doDone(delayed) {\n        this.element.classList.add(CSS_DONE);\n        // discrete: let it grow to 100% width and hide afterwards\n        if (!this.element.classList.contains(CSS_INFINITE)) {\n            this.bit.style.width = 'inherit';\n            if (delayed) {\n                setTimeout(() => this.off(), 200);\n            }\n            else {\n                this.off();\n            }\n        }\n        // infinite: let it fade out and hide afterwards\n        else {\n            this.bit.style.opacity = '0';\n            if (delayed) {\n                setTimeout(() => this.off(), 200);\n            }\n            else {\n                this.off();\n            }\n        }\n        return this;\n    }\n    /**\n     * Use this mode to indicate progress that has no total number of work units.\n     */\n    infinite() {\n        this.bit.style.width = '2%';\n        this.bit.style.opacity = '1';\n        this.element.classList.remove(CSS_DISCRETE, CSS_DONE, CSS_INFINITE_LONG_RUNNING);\n        this.element.classList.add(CSS_ACTIVE, CSS_INFINITE);\n        this.longRunningScheduler.schedule();\n        return this;\n    }\n    infiniteLongRunning() {\n        this.element.classList.add(CSS_INFINITE_LONG_RUNNING);\n    }\n    getContainer() {\n        return this.element;\n    }\n}\n\nexport { ProgressBar };\n","import { append, $ as $$1 } from '../../../base/browser/dom.js';\nimport { FindInput } from '../../../base/browser/ui/findinput/findInput.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport Severity from '../../../base/common/severity.js';\nimport './media/quickInput.css';\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 *--------------------------------------------------------------------------------------------*/\nconst $ = $$1;\nclass QuickInputBox extends Disposable {\n    constructor(parent, inputBoxStyles, toggleStyles) {\n        super();\n        this.parent = parent;\n        this.onDidChange = (handler) => {\n            return this.findInput.onDidChange(handler);\n        };\n        this.container = append(this.parent, $('.quick-input-box'));\n        this.findInput = this._register(new FindInput(this.container, undefined, { label: '', inputBoxStyles, toggleStyles }));\n        const input = this.findInput.inputBox.inputElement;\n        input.role = 'textbox';\n        input.ariaHasPopup = 'menu';\n        input.ariaAutoComplete = 'list';\n    }\n    get onKeyDown() {\n        return this.findInput.onKeyDown;\n    }\n    get value() {\n        return this.findInput.getValue();\n    }\n    set value(value) {\n        this.findInput.setValue(value);\n    }\n    select(range = null) {\n        this.findInput.inputBox.select(range);\n    }\n    getSelection() {\n        return this.findInput.inputBox.getSelection();\n    }\n    isSelectionAtEnd() {\n        return this.findInput.inputBox.isSelectionAtEnd();\n    }\n    get placeholder() {\n        return this.findInput.inputBox.inputElement.getAttribute('placeholder') || '';\n    }\n    set placeholder(placeholder) {\n        this.findInput.inputBox.setPlaceHolder(placeholder);\n    }\n    get password() {\n        return this.findInput.inputBox.inputElement.type === 'password';\n    }\n    set password(password) {\n        this.findInput.inputBox.inputElement.type = password ? 'password' : 'text';\n    }\n    set enabled(enabled) {\n        // We can't disable the input box because it is still used for\n        // navigating the list. Instead, we disable the list and the OK\n        // so that nothing can be selected.\n        // TODO: should this be what we do for all find inputs? Or maybe some _other_ API\n        // on findInput to change it to readonly?\n        this.findInput.inputBox.inputElement.toggleAttribute('readonly', !enabled);\n        // TODO: styles of the quick pick need to be moved to the CSS instead of being in line\n        // so things like this can be done in CSS\n        // this.findInput.inputBox.inputElement.classList.toggle('disabled', !enabled);\n    }\n    set toggles(toggles) {\n        this.findInput.setAdditionalToggles(toggles);\n    }\n    get ariaLabel() {\n        return this.findInput.inputBox.inputElement.getAttribute('aria-label') || '';\n    }\n    set ariaLabel(ariaLabel) {\n        this.findInput.inputBox.inputElement.setAttribute('aria-label', ariaLabel);\n    }\n    hasFocus() {\n        return this.findInput.inputBox.hasFocus();\n    }\n    setAttribute(name, value) {\n        this.findInput.inputBox.inputElement.setAttribute(name, value);\n    }\n    removeAttribute(name) {\n        this.findInput.inputBox.inputElement.removeAttribute(name);\n    }\n    showDecoration(decoration) {\n        if (decoration === Severity.Ignore) {\n            this.findInput.clearMessage();\n        }\n        else {\n            this.findInput.showMessage({ type: decoration === Severity.Info ? 1 /* MessageType.INFO */ : decoration === Severity.Warning ? 2 /* MessageType.WARNING */ : 3 /* MessageType.ERROR */, content: '' });\n        }\n    }\n    stylesForType(decoration) {\n        return this.findInput.inputBox.stylesForType(decoration === Severity.Info ? 1 /* MessageType.INFO */ : decoration === Severity.Warning ? 2 /* MessageType.WARNING */ : 3 /* MessageType.ERROR */);\n    }\n    setFocus() {\n        this.findInput.focus();\n    }\n    layout() {\n        this.findInput.inputBox.layout();\n    }\n}\n\nexport { QuickInputBox };\n","import { safeIntl } from './date.js';\nimport { Lazy } from './lazy.js';\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// When comparing large numbers of strings it's better for performance to create an\n// Intl.Collator object and use the function provided by its compare property\n// than it is to use String.prototype.localeCompare()\n// A collator with numeric sorting enabled, and no sensitivity to case, accents or diacritics.\nconst intlFileNameCollatorBaseNumeric = new Lazy(() => {\n    const collator = safeIntl.Collator(undefined, { numeric: true, sensitivity: 'base' }).value;\n    return {\n        collator,\n        collatorIsNumeric: collator.resolvedOptions().numeric\n    };\n});\n// A collator with numeric sorting enabled.\nnew Lazy(() => {\n    const collator = safeIntl.Collator(undefined, { numeric: true }).value;\n    return {\n        collator\n    };\n});\n// A collator with numeric sorting enabled, and sensitivity to accents and diacritics but not case.\nnew Lazy(() => {\n    const collator = safeIntl.Collator(undefined, { numeric: true, sensitivity: 'accent' }).value;\n    return {\n        collator\n    };\n});\n/** Compares filenames without distinguishing the name from the extension. Disambiguates by unicode comparison. */\nfunction compareFileNames(one, other, caseSensitive = false) {\n    const a = one || '';\n    const b = other || '';\n    const result = intlFileNameCollatorBaseNumeric.value.collator.compare(a, b);\n    // Using the numeric option will make compare(`foo1`, `foo01`) === 0. Disambiguate.\n    if (intlFileNameCollatorBaseNumeric.value.collatorIsNumeric && result === 0 && a !== b) {\n        return a < b ? -1 : 1;\n    }\n    return result;\n}\nfunction compareAnything(one, other, lookFor) {\n    const elementAName = one.toLowerCase();\n    const elementBName = other.toLowerCase();\n    // Sort prefix matches over non prefix matches\n    const prefixCompare = compareByPrefix(one, other, lookFor);\n    if (prefixCompare) {\n        return prefixCompare;\n    }\n    // Sort suffix matches over non suffix matches\n    const elementASuffixMatch = elementAName.endsWith(lookFor);\n    const elementBSuffixMatch = elementBName.endsWith(lookFor);\n    if (elementASuffixMatch !== elementBSuffixMatch) {\n        return elementASuffixMatch ? -1 : 1;\n    }\n    // Understand file names\n    const r = compareFileNames(elementAName, elementBName);\n    if (r !== 0) {\n        return r;\n    }\n    // Compare by name\n    return elementAName.localeCompare(elementBName);\n}\nfunction compareByPrefix(one, other, lookFor) {\n    const elementAName = one.toLowerCase();\n    const elementBName = other.toLowerCase();\n    // Sort prefix matches over non prefix matches\n    const elementAPrefixMatch = elementAName.startsWith(lookFor);\n    const elementBPrefixMatch = elementBName.startsWith(lookFor);\n    if (elementAPrefixMatch !== elementBPrefixMatch) {\n        return elementAPrefixMatch ? -1 : 1;\n    }\n    // Same prefix: Sort shorter matches to the top to have those on top that match more precisely\n    else if (elementAPrefixMatch && elementBPrefixMatch) {\n        if (elementAName.length < elementBName.length) {\n            return -1;\n        }\n        if (elementAName.length > elementBName.length) {\n            return 1;\n        }\n    }\n    return 0;\n}\n\nexport { compareAnything, compareByPrefix, compareFileNames };\n","import { asCSSUrl } from '../../../base/browser/cssValue.js';\nimport { append, $ as $$1, addStandardDisposableListener, EventType, prepend, addDisposableListener, isHTMLAnchorElement, isAncestor } from '../../../base/browser/dom.js';\nimport { StandardKeyboardEvent } from '../../../base/browser/keyboardEvent.js';\nimport { ActionBar } from '../../../base/browser/ui/actionbar/actionbar.js';\nimport { IconLabel } from '../../../base/browser/ui/iconLabel/iconLabel.js';\nimport { KeybindingLabel } from '../../../base/browser/ui/keybindingLabel/keybindingLabel.js';\nimport { Checkbox } from '../../../base/browser/ui/toggle/toggle.js';\nimport { RenderIndentGuides } from '../../../base/browser/ui/tree/abstractTree.js';\nimport { equals } from '../../../base/common/arrays.js';\nimport { ThrottledDelayer } from '../../../base/common/async.js';\nimport { compareAnything } from '../../../base/common/comparers.js';\nimport { memoize } from '../../../base/common/decorators.js';\nimport { isCancellationError } from '../../../base/common/errors.js';\nimport { Emitter, Event, EventBufferer } from '../../../base/common/event.js';\nimport { matchesFuzzyIconAware, parseLabelWithIcons, getCodiconAriaLabel } from '../../../base/common/iconLabels.js';\nimport { Lazy } from '../../../base/common/lazy.js';\nimport { DisposableStore, MutableDisposable, Disposable } from '../../../base/common/lifecycle.js';\nimport '../../../base/common/observableInternal/index.js';\nimport { OS } from '../../../base/common/platform.js';\nimport { escape, ltrim } from '../../../base/common/strings.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { localize } from '../../../nls.js';\nimport { IAccessibilityService } from '../../accessibility/common/accessibility.js';\nimport { IInstantiationService } from '../../instantiation/common/instantiation.js';\nimport { WorkbenchObjectTree } from '../../list/browser/listService.js';\nimport { defaultCheckboxStyles } from '../../theme/browser/defaultStyles.js';\nimport { isDark } from '../../theme/common/theme.js';\nimport { IThemeService } from '../../theme/common/themeService.js';\nimport { QuickPickFocus } from '../common/quickInput.js';\nimport { quickInputButtonToAction } from './quickInputUtils.js';\nimport { observableValue } from '../../../base/common/observableInternal/observables/observableValue.js';\nimport { observableValueOpts } from '../../../base/common/observableInternal/observables/observableValueOpts.js';\nimport { transaction } from '../../../base/common/observableInternal/transaction.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar QuickPickItemElementRenderer_1;\nconst $ = $$1;\nclass BaseQuickPickItemElement {\n    constructor(index, hasCheckbox, mainItem) {\n        this.index = index;\n        this.hasCheckbox = hasCheckbox;\n        this._hidden = false;\n        this._init = new Lazy(() => {\n            const saneLabel = mainItem.label ?? '';\n            const saneSortLabel = parseLabelWithIcons(saneLabel).text.trim();\n            const saneAriaLabel = mainItem.ariaLabel || [saneLabel, this.saneDescription, this.saneDetail]\n                .map(s => getCodiconAriaLabel(s))\n                .filter(s => !!s)\n                .join(', ');\n            return {\n                saneLabel,\n                saneSortLabel,\n                saneAriaLabel\n            };\n        });\n        this._saneDescription = mainItem.description;\n        this._saneTooltip = mainItem.tooltip;\n    }\n    // #region Lazy Getters\n    get saneLabel() {\n        return this._init.value.saneLabel;\n    }\n    get saneSortLabel() {\n        return this._init.value.saneSortLabel;\n    }\n    get saneAriaLabel() {\n        return this._init.value.saneAriaLabel;\n    }\n    get element() {\n        return this._element;\n    }\n    set element(value) {\n        this._element = value;\n    }\n    get hidden() {\n        return this._hidden;\n    }\n    set hidden(value) {\n        this._hidden = value;\n    }\n    get saneDescription() {\n        return this._saneDescription;\n    }\n    set saneDescription(value) {\n        this._saneDescription = value;\n    }\n    get saneDetail() {\n        return this._saneDetail;\n    }\n    set saneDetail(value) {\n        this._saneDetail = value;\n    }\n    get saneTooltip() {\n        return this._saneTooltip;\n    }\n    set saneTooltip(value) {\n        this._saneTooltip = value;\n    }\n    get labelHighlights() {\n        return this._labelHighlights;\n    }\n    set labelHighlights(value) {\n        this._labelHighlights = value;\n    }\n    get descriptionHighlights() {\n        return this._descriptionHighlights;\n    }\n    set descriptionHighlights(value) {\n        this._descriptionHighlights = value;\n    }\n    get detailHighlights() {\n        return this._detailHighlights;\n    }\n    set detailHighlights(value) {\n        this._detailHighlights = value;\n    }\n}\nclass QuickPickItemElement extends BaseQuickPickItemElement {\n    constructor(index, childIndex, hasCheckbox, fireButtonTriggered, _onChecked, item, _separator) {\n        super(index, hasCheckbox, item);\n        this.childIndex = childIndex;\n        this.fireButtonTriggered = fireButtonTriggered;\n        this._onChecked = _onChecked;\n        this.item = item;\n        this._separator = _separator;\n        this._checked = false;\n        this.onChecked = hasCheckbox\n            ? Event.map(Event.filter(this._onChecked.event, e => e.element === this), e => e.checked)\n            : Event.None;\n        this._saneDetail = item.detail;\n        this._labelHighlights = item.highlights?.label;\n        this._descriptionHighlights = item.highlights?.description;\n        this._detailHighlights = item.highlights?.detail;\n    }\n    get separator() {\n        return this._separator;\n    }\n    set separator(value) {\n        this._separator = value;\n    }\n    get checked() {\n        return this._checked;\n    }\n    set checked(value) {\n        if (value !== this._checked) {\n            this._checked = value;\n            this._onChecked.fire({ element: this, checked: value });\n        }\n    }\n    get checkboxDisabled() {\n        return !!this.item.disabled;\n    }\n}\nvar QuickPickSeparatorFocusReason;\n(function (QuickPickSeparatorFocusReason) {\n    /**\n     * No item is hovered or active\n     */\n    QuickPickSeparatorFocusReason[QuickPickSeparatorFocusReason[\"NONE\"] = 0] = \"NONE\";\n    /**\n     * Some item within this section is hovered\n     */\n    QuickPickSeparatorFocusReason[QuickPickSeparatorFocusReason[\"MOUSE_HOVER\"] = 1] = \"MOUSE_HOVER\";\n    /**\n     * Some item within this section is active\n     */\n    QuickPickSeparatorFocusReason[QuickPickSeparatorFocusReason[\"ACTIVE_ITEM\"] = 2] = \"ACTIVE_ITEM\";\n})(QuickPickSeparatorFocusReason || (QuickPickSeparatorFocusReason = {}));\nclass QuickPickSeparatorElement extends BaseQuickPickItemElement {\n    constructor(index, fireSeparatorButtonTriggered, separator) {\n        super(index, false, separator);\n        this.fireSeparatorButtonTriggered = fireSeparatorButtonTriggered;\n        this.separator = separator;\n        this.children = new Array();\n        /**\n         * If this item is >0, it means that there is some item in the list that is either:\n         * * hovered over\n         * * active\n         */\n        this.focusInsideSeparator = QuickPickSeparatorFocusReason.NONE;\n    }\n}\nclass QuickInputItemDelegate {\n    getHeight(element) {\n        if (element instanceof QuickPickSeparatorElement) {\n            return 30;\n        }\n        return element.saneDetail ? 44 : 22;\n    }\n    getTemplateId(element) {\n        if (element instanceof QuickPickItemElement) {\n            return QuickPickItemElementRenderer.ID;\n        }\n        else {\n            return QuickPickSeparatorElementRenderer.ID;\n        }\n    }\n}\nclass QuickInputAccessibilityProvider {\n    getWidgetAriaLabel() {\n        return localize(1770, \"Quick Input\");\n    }\n    getAriaLabel(element) {\n        return element.separator?.label\n            ? `${element.saneAriaLabel}, ${element.separator.label}`\n            : element.saneAriaLabel;\n    }\n    getWidgetRole() {\n        return 'listbox';\n    }\n    getRole(element) {\n        return element.hasCheckbox ? 'checkbox' : 'option';\n    }\n    isChecked(element) {\n        if (!element.hasCheckbox || !(element instanceof QuickPickItemElement)) {\n            return undefined;\n        }\n        return {\n            get value() { return element.checked; },\n            onDidChange: e => element.onChecked(() => e()),\n        };\n    }\n}\nclass BaseQuickInputListRenderer {\n    constructor(hoverDelegate) {\n        this.hoverDelegate = hoverDelegate;\n    }\n    // TODO: only do the common stuff here and have a subclass handle their specific stuff\n    renderTemplate(container) {\n        const data = Object.create(null);\n        data.toDisposeElement = new DisposableStore();\n        data.toDisposeTemplate = new DisposableStore();\n        data.entry = append(container, $('.quick-input-list-entry'));\n        // Checkbox\n        const label = append(data.entry, $('label.quick-input-list-label'));\n        data.outerLabel = label;\n        data.checkbox = data.toDisposeTemplate.add(new MutableDisposable());\n        data.toDisposeTemplate.add(addStandardDisposableListener(label, EventType.CLICK, e => {\n            // `label` elements with role=checkboxes don't automatically toggle them like normal <checkbox> elements\n            if (data.checkbox.value && !e.defaultPrevented && data.checkbox.value.enabled) {\n                const checked = !data.checkbox.value.checked;\n                data.checkbox.value.checked = checked;\n                data.element.checked = checked;\n            }\n        }));\n        // Rows\n        const rows = append(label, $('.quick-input-list-rows'));\n        const row1 = append(rows, $('.quick-input-list-row'));\n        const row2 = append(rows, $('.quick-input-list-row'));\n        // Label\n        data.label = new IconLabel(row1, { supportHighlights: true, supportDescriptionHighlights: true, supportIcons: true, hoverDelegate: this.hoverDelegate });\n        data.toDisposeTemplate.add(data.label);\n        data.icon = prepend(data.label.element, $('.quick-input-list-icon'));\n        // Keybinding\n        const keybindingContainer = append(row1, $('.quick-input-list-entry-keybinding'));\n        data.keybinding = new KeybindingLabel(keybindingContainer, OS);\n        data.toDisposeTemplate.add(data.keybinding);\n        // Detail\n        const detailContainer = append(row2, $('.quick-input-list-label-meta'));\n        data.detail = new IconLabel(detailContainer, { supportHighlights: true, supportIcons: true, hoverDelegate: this.hoverDelegate });\n        data.toDisposeTemplate.add(data.detail);\n        // Separator\n        data.separator = append(data.entry, $('.quick-input-list-separator'));\n        // Actions\n        data.actionBar = new ActionBar(data.entry, this.hoverDelegate ? { hoverDelegate: this.hoverDelegate } : undefined);\n        data.actionBar.domNode.classList.add('quick-input-list-entry-action-bar');\n        data.toDisposeTemplate.add(data.actionBar);\n        return data;\n    }\n    disposeTemplate(data) {\n        data.toDisposeElement.dispose();\n        data.toDisposeTemplate.dispose();\n    }\n    disposeElement(_element, _index, data) {\n        data.toDisposeElement.clear();\n        data.actionBar.clear();\n    }\n}\nlet QuickPickItemElementRenderer = class QuickPickItemElementRenderer extends BaseQuickInputListRenderer {\n    static { QuickPickItemElementRenderer_1 = this; }\n    static { this.ID = 'quickpickitem'; }\n    constructor(hoverDelegate, themeService) {\n        super(hoverDelegate);\n        this.themeService = themeService;\n        // Follow what we do in the separator renderer\n        this._itemsWithSeparatorsFrequency = new Map();\n    }\n    get templateId() {\n        return QuickPickItemElementRenderer_1.ID;\n    }\n    ensureCheckbox(element, data) {\n        if (!element.hasCheckbox) {\n            data.checkbox.value?.domNode.remove();\n            data.checkbox.clear();\n            return;\n        }\n        let checkbox = data.checkbox.value;\n        if (!checkbox) {\n            checkbox = new Checkbox(element.saneLabel, element.checked, { ...defaultCheckboxStyles, size: 15 });\n            data.checkbox.value = checkbox;\n            data.outerLabel.prepend(checkbox.domNode);\n        }\n        else {\n            checkbox.setTitle(element.saneLabel);\n        }\n        if (element.checkboxDisabled) {\n            checkbox.disable();\n        }\n        else {\n            checkbox.enable();\n        }\n        checkbox.checked = element.checked;\n        data.toDisposeElement.add(element.onChecked(checked => checkbox.checked = checked));\n        data.toDisposeElement.add(checkbox.onChange(() => element.checked = checkbox.checked));\n    }\n    renderElement(node, index, data) {\n        const element = node.element;\n        data.element = element;\n        element.element = data.entry ?? undefined;\n        const mainItem = element.item;\n        element.element.classList.toggle('not-pickable', element.item.pickable === false);\n        this.ensureCheckbox(element, data);\n        const { labelHighlights, descriptionHighlights, detailHighlights } = element;\n        // Icon\n        if (mainItem.iconPath) {\n            const icon = isDark(this.themeService.getColorTheme().type) ? mainItem.iconPath.dark : (mainItem.iconPath.light ?? mainItem.iconPath.dark);\n            const iconUrl = URI.revive(icon);\n            data.icon.className = 'quick-input-list-icon';\n            data.icon.style.backgroundImage = asCSSUrl(iconUrl);\n        }\n        else {\n            data.icon.style.backgroundImage = '';\n            data.icon.className = mainItem.iconClass ? `quick-input-list-icon ${mainItem.iconClass}` : '';\n        }\n        // Label\n        let descriptionTitle;\n        // if we have a tooltip, that will be the hover,\n        // with the saneDescription as fallback if it\n        // is defined\n        if (!element.saneTooltip && element.saneDescription) {\n            descriptionTitle = {\n                markdown: {\n                    value: escape(element.saneDescription),\n                    supportThemeIcons: true\n                },\n                markdownNotSupportedFallback: element.saneDescription\n            };\n        }\n        const options = {\n            matches: labelHighlights || [],\n            // If we have a tooltip, we want that to be shown and not any other hover\n            descriptionTitle,\n            descriptionMatches: descriptionHighlights || [],\n            labelEscapeNewLines: true\n        };\n        options.extraClasses = mainItem.iconClasses;\n        options.italic = mainItem.italic;\n        options.strikethrough = mainItem.strikethrough;\n        data.entry.classList.remove('quick-input-list-separator-as-item');\n        data.label.setLabel(element.saneLabel, element.saneDescription, options);\n        // Keybinding\n        data.keybinding.set(mainItem.keybinding);\n        // Detail\n        if (element.saneDetail) {\n            let title;\n            // If we have a tooltip, we want that to be shown and not any other hover\n            if (!element.saneTooltip) {\n                title = {\n                    markdown: {\n                        value: escape(element.saneDetail),\n                        supportThemeIcons: true\n                    },\n                    markdownNotSupportedFallback: element.saneDetail\n                };\n            }\n            data.detail.element.style.display = '';\n            data.detail.setLabel(element.saneDetail, undefined, {\n                matches: detailHighlights,\n                title,\n                labelEscapeNewLines: true\n            });\n        }\n        else {\n            data.detail.element.style.display = 'none';\n        }\n        // Separator\n        if (element.separator?.label) {\n            data.separator.textContent = element.separator.label;\n            data.separator.style.display = '';\n            this.addItemWithSeparator(element);\n        }\n        else {\n            data.separator.style.display = 'none';\n        }\n        data.entry.classList.toggle('quick-input-list-separator-border', !!element.separator && element.childIndex !== 0);\n        // Actions\n        const buttons = mainItem.buttons;\n        if (buttons && buttons.length) {\n            data.actionBar.push(buttons.map((button, index) => quickInputButtonToAction(button, `id-${index}`, () => element.fireButtonTriggered({ button, item: element.item }))), { icon: true, label: false });\n            data.entry.classList.add('has-actions');\n        }\n        else {\n            data.entry.classList.remove('has-actions');\n        }\n    }\n    disposeElement(element, _index, data) {\n        this.removeItemWithSeparator(element.element);\n        super.disposeElement(element, _index, data);\n    }\n    isItemWithSeparatorVisible(item) {\n        return this._itemsWithSeparatorsFrequency.has(item);\n    }\n    addItemWithSeparator(item) {\n        this._itemsWithSeparatorsFrequency.set(item, (this._itemsWithSeparatorsFrequency.get(item) || 0) + 1);\n    }\n    removeItemWithSeparator(item) {\n        const frequency = this._itemsWithSeparatorsFrequency.get(item) || 0;\n        if (frequency > 1) {\n            this._itemsWithSeparatorsFrequency.set(item, frequency - 1);\n        }\n        else {\n            this._itemsWithSeparatorsFrequency.delete(item);\n        }\n    }\n};\nQuickPickItemElementRenderer = QuickPickItemElementRenderer_1 = __decorate([\n    __param(1, IThemeService)\n], QuickPickItemElementRenderer);\nclass QuickPickSeparatorElementRenderer extends BaseQuickInputListRenderer {\n    constructor() {\n        super(...arguments);\n        // This is a frequency map because sticky scroll re-uses the same renderer to render a second\n        // instance of the same separator.\n        this._visibleSeparatorsFrequency = new Map();\n    }\n    static { this.ID = 'quickpickseparator'; }\n    get templateId() {\n        return QuickPickSeparatorElementRenderer.ID;\n    }\n    get visibleSeparators() {\n        return [...this._visibleSeparatorsFrequency.keys()];\n    }\n    isSeparatorVisible(separator) {\n        return this._visibleSeparatorsFrequency.has(separator);\n    }\n    renderElement(node, index, data) {\n        const element = node.element;\n        data.element = element;\n        element.element = data.entry ?? undefined;\n        element.element.classList.toggle('focus-inside', !!element.focusInsideSeparator);\n        const mainItem = element.separator;\n        const { labelHighlights, descriptionHighlights } = element;\n        // Icon\n        data.icon.style.backgroundImage = '';\n        data.icon.className = '';\n        // Label\n        let descriptionTitle;\n        // if we have a tooltip, that will be the hover,\n        // with the saneDescription as fallback if it\n        // is defined\n        if (!element.saneTooltip && element.saneDescription) {\n            descriptionTitle = {\n                markdown: {\n                    value: escape(element.saneDescription),\n                    supportThemeIcons: true\n                },\n                markdownNotSupportedFallback: element.saneDescription\n            };\n        }\n        const options = {\n            matches: labelHighlights || [],\n            // If we have a tooltip, we want that to be shown and not any other hover\n            descriptionTitle,\n            descriptionMatches: descriptionHighlights || [],\n            labelEscapeNewLines: true\n        };\n        data.entry.classList.add('quick-input-list-separator-as-item');\n        data.label.setLabel(element.saneLabel, element.saneDescription, options);\n        // Separator\n        data.separator.style.display = 'none';\n        data.entry.classList.add('quick-input-list-separator-border');\n        // Actions\n        const buttons = mainItem.buttons;\n        if (buttons && buttons.length) {\n            data.actionBar.push(buttons.map((button, index) => quickInputButtonToAction(button, `id-${index}`, () => element.fireSeparatorButtonTriggered({ button, separator: element.separator }))), { icon: true, label: false });\n            data.entry.classList.add('has-actions');\n        }\n        else {\n            data.entry.classList.remove('has-actions');\n        }\n        this.addSeparator(element);\n    }\n    disposeElement(element, _index, data) {\n        this.removeSeparator(element.element);\n        if (!this.isSeparatorVisible(element.element)) {\n            element.element.element?.classList.remove('focus-inside');\n        }\n        super.disposeElement(element, _index, data);\n    }\n    addSeparator(separator) {\n        this._visibleSeparatorsFrequency.set(separator, (this._visibleSeparatorsFrequency.get(separator) || 0) + 1);\n    }\n    removeSeparator(separator) {\n        const frequency = this._visibleSeparatorsFrequency.get(separator) || 0;\n        if (frequency > 1) {\n            this._visibleSeparatorsFrequency.set(separator, frequency - 1);\n        }\n        else {\n            this._visibleSeparatorsFrequency.delete(separator);\n        }\n    }\n}\nlet QuickInputList = class QuickInputList extends Disposable {\n    constructor(parent, hoverDelegate, linkOpenerDelegate, id, instantiationService, accessibilityService) {\n        super();\n        this.parent = parent;\n        this.hoverDelegate = hoverDelegate;\n        this.linkOpenerDelegate = linkOpenerDelegate;\n        this.accessibilityService = accessibilityService;\n        //#region QuickInputList Events\n        this._onKeyDown = new Emitter();\n        this._onLeave = new Emitter();\n        /**\n         * Event that is fired when the tree would no longer have focus.\n        */\n        this.onLeave = this._onLeave.event;\n        this._visibleCountObservable = observableValue('VisibleCount', 0);\n        this.onChangedVisibleCount = Event.fromObservable(this._visibleCountObservable, this._store);\n        this._allVisibleCheckedObservable = observableValue('AllVisibleChecked', false);\n        this.onChangedAllVisibleChecked = Event.fromObservable(this._allVisibleCheckedObservable, this._store);\n        this._checkedCountObservable = observableValue('CheckedCount', 0);\n        this.onChangedCheckedCount = Event.fromObservable(this._checkedCountObservable, this._store);\n        this._checkedElementsObservable = observableValueOpts({ equalsFn: equals }, new Array());\n        this.onChangedCheckedElements = Event.fromObservable(this._checkedElementsObservable, this._store);\n        this._onButtonTriggered = new Emitter();\n        this.onButtonTriggered = this._onButtonTriggered.event;\n        this._onSeparatorButtonTriggered = new Emitter();\n        this.onSeparatorButtonTriggered = this._onSeparatorButtonTriggered.event;\n        this._elementChecked = new Emitter();\n        this._elementCheckedEventBufferer = new EventBufferer();\n        //#endregion\n        this._hasCheckboxes = false;\n        this._inputElements = new Array();\n        this._elementTree = new Array();\n        this._itemElements = new Array();\n        // Elements that apply to the current set of elements\n        this._elementDisposable = this._register(new DisposableStore());\n        this._matchOnDescription = false;\n        this._matchOnDetail = false;\n        this._matchOnLabel = true;\n        this._matchOnLabelMode = 'fuzzy';\n        this._sortByLabel = true;\n        this._shouldLoop = true;\n        this._container = append(this.parent, $('.quick-input-list'));\n        this._separatorRenderer = new QuickPickSeparatorElementRenderer(hoverDelegate);\n        this._itemRenderer = instantiationService.createInstance(QuickPickItemElementRenderer, hoverDelegate);\n        this._tree = this._register(instantiationService.createInstance((WorkbenchObjectTree), 'QuickInput', this._container, new QuickInputItemDelegate(), [this._itemRenderer, this._separatorRenderer], {\n            filter: {\n                filter(element) {\n                    return element.hidden\n                        ? 0 /* TreeVisibility.Hidden */\n                        : element instanceof QuickPickSeparatorElement\n                            ? 2 /* TreeVisibility.Recurse */\n                            : 1 /* TreeVisibility.Visible */;\n                },\n            },\n            sorter: {\n                compare: (element, otherElement) => {\n                    if (!this.sortByLabel || !this._lastQueryString) {\n                        return 0;\n                    }\n                    const normalizedSearchValue = this._lastQueryString.toLowerCase();\n                    return compareEntries(element, otherElement, normalizedSearchValue);\n                },\n            },\n            accessibilityProvider: new QuickInputAccessibilityProvider(),\n            setRowLineHeight: false,\n            multipleSelectionSupport: false,\n            hideTwistiesOfChildlessElements: true,\n            renderIndentGuides: RenderIndentGuides.None,\n            findWidgetEnabled: false,\n            indent: 0,\n            horizontalScrolling: false,\n            allowNonCollapsibleParents: true,\n            alwaysConsumeMouseWheel: true\n        }));\n        this._tree.getHTMLElement().id = id;\n        this._registerListeners();\n    }\n    //#region public getters/setters\n    get onDidChangeFocus() {\n        return Event.map(this._tree.onDidChangeFocus, e => e.elements.filter((e) => e instanceof QuickPickItemElement).map(e => e.item), this._store);\n    }\n    get onDidChangeSelection() {\n        return Event.map(this._tree.onDidChangeSelection, e => ({\n            items: e.elements.filter((e) => e instanceof QuickPickItemElement).map(e => e.item),\n            event: e.browserEvent\n        }), this._store);\n    }\n    get displayed() {\n        return this._container.style.display !== 'none';\n    }\n    set displayed(value) {\n        this._container.style.display = value ? '' : 'none';\n    }\n    get scrollTop() {\n        return this._tree.scrollTop;\n    }\n    set scrollTop(scrollTop) {\n        this._tree.scrollTop = scrollTop;\n    }\n    get ariaLabel() {\n        return this._tree.ariaLabel;\n    }\n    set ariaLabel(label) {\n        this._tree.ariaLabel = label ?? '';\n    }\n    set enabled(value) {\n        this._tree.getHTMLElement().style.pointerEvents = value ? '' : 'none';\n    }\n    get matchOnDescription() {\n        return this._matchOnDescription;\n    }\n    set matchOnDescription(value) {\n        this._matchOnDescription = value;\n    }\n    get matchOnDetail() {\n        return this._matchOnDetail;\n    }\n    set matchOnDetail(value) {\n        this._matchOnDetail = value;\n    }\n    get matchOnLabel() {\n        return this._matchOnLabel;\n    }\n    set matchOnLabel(value) {\n        this._matchOnLabel = value;\n    }\n    get matchOnLabelMode() {\n        return this._matchOnLabelMode;\n    }\n    set matchOnLabelMode(value) {\n        this._matchOnLabelMode = value;\n    }\n    get sortByLabel() {\n        return this._sortByLabel;\n    }\n    set sortByLabel(value) {\n        this._sortByLabel = value;\n    }\n    get shouldLoop() {\n        return this._shouldLoop;\n    }\n    set shouldLoop(value) {\n        this._shouldLoop = value;\n    }\n    //#endregion\n    //#region register listeners\n    _registerListeners() {\n        this._registerOnKeyDown();\n        this._registerOnContainerClick();\n        this._registerOnMouseMiddleClick();\n        this._registerOnTreeModelChanged();\n        this._registerOnElementChecked();\n        this._registerOnContextMenu();\n        this._registerHoverListeners();\n        this._registerSelectionChangeListener();\n        this._registerSeparatorActionShowingListeners();\n    }\n    _registerOnKeyDown() {\n        // TODO: Should this be added at a higher level?\n        this._register(this._tree.onKeyDown(e => {\n            const event = new StandardKeyboardEvent(e);\n            switch (event.keyCode) {\n                case 10 /* KeyCode.Space */:\n                    this.toggleCheckbox();\n                    break;\n            }\n            this._onKeyDown.fire(event);\n        }));\n    }\n    _registerOnContainerClick() {\n        this._register(addDisposableListener(this._container, EventType.CLICK, e => {\n            if (e.x || e.y) { // Avoid 'click' triggered by 'space' on checkbox.\n                this._onLeave.fire();\n            }\n        }));\n    }\n    _registerOnMouseMiddleClick() {\n        this._register(addDisposableListener(this._container, EventType.AUXCLICK, e => {\n            if (e.button === 1) {\n                this._onLeave.fire();\n            }\n        }));\n    }\n    _registerOnTreeModelChanged() {\n        this._register(this._tree.onDidChangeModel(() => {\n            const visibleCount = this._itemElements.filter(e => !e.hidden).length;\n            this._visibleCountObservable.set(visibleCount, undefined);\n            if (this._hasCheckboxes) {\n                this._updateCheckedObservables();\n            }\n        }));\n    }\n    _registerOnElementChecked() {\n        // Only fire the last event when buffered\n        this._register(this._elementCheckedEventBufferer.wrapEvent(this._elementChecked.event, (_, e) => e)(_ => this._updateCheckedObservables()));\n    }\n    _registerOnContextMenu() {\n        this._register(this._tree.onContextMenu(e => {\n            if (e.element) {\n                e.browserEvent.preventDefault();\n                // we want to treat a context menu event as\n                // a gesture to open the item at the index\n                // since we do not have any context menu\n                // this enables for example macOS to Ctrl-\n                // click on an item to open it.\n                this._tree.setSelection([e.element]);\n            }\n        }));\n    }\n    _registerHoverListeners() {\n        const delayer = this._register(new ThrottledDelayer(typeof this.hoverDelegate.delay === 'function' ? this.hoverDelegate.delay() : this.hoverDelegate.delay));\n        this._register(this._tree.onMouseOver(async (e) => {\n            // If we hover over an anchor element, we don't want to show the hover because\n            // the anchor may have a tooltip that we want to show instead.\n            if (isHTMLAnchorElement(e.browserEvent.target)) {\n                delayer.cancel();\n                return;\n            }\n            if (\n            // anchors are an exception as called out above so we skip them here\n            !(isHTMLAnchorElement(e.browserEvent.relatedTarget)) &&\n                // check if the mouse is still over the same element\n                isAncestor(e.browserEvent.relatedTarget, e.element?.element)) {\n                return;\n            }\n            try {\n                await delayer.trigger(async () => {\n                    if (e.element instanceof QuickPickItemElement) {\n                        this.showHover(e.element);\n                    }\n                });\n            }\n            catch (e) {\n                // Ignore cancellation errors due to mouse out\n                if (!isCancellationError(e)) {\n                    throw e;\n                }\n            }\n        }));\n        this._register(this._tree.onMouseOut(e => {\n            // onMouseOut triggers every time a new element has been moused over\n            // even if it's on the same list item. We only want one event, so we\n            // check if the mouse is still over the same element.\n            if (isAncestor(e.browserEvent.relatedTarget, e.element?.element)) {\n                return;\n            }\n            delayer.cancel();\n        }));\n    }\n    /**\n     * Register's focus change and mouse events so that we can track when items inside of a\n     * separator's section are focused or hovered so that we can display the separator's actions\n     */\n    _registerSeparatorActionShowingListeners() {\n        this._register(this._tree.onDidChangeFocus(e => {\n            const parent = e.elements[0]\n                ? this._tree.getParentElement(e.elements[0])\n                // treat null as focus lost and when we have no separators\n                : null;\n            for (const separator of this._separatorRenderer.visibleSeparators) {\n                const value = separator === parent;\n                // get bitness of ACTIVE_ITEM and check if it changed\n                const currentActive = !!(separator.focusInsideSeparator & QuickPickSeparatorFocusReason.ACTIVE_ITEM);\n                if (currentActive !== value) {\n                    if (value) {\n                        separator.focusInsideSeparator |= QuickPickSeparatorFocusReason.ACTIVE_ITEM;\n                    }\n                    else {\n                        separator.focusInsideSeparator &= ~QuickPickSeparatorFocusReason.ACTIVE_ITEM;\n                    }\n                    this._tree.rerender(separator);\n                }\n            }\n        }));\n        this._register(this._tree.onMouseOver(e => {\n            const parent = e.element\n                ? this._tree.getParentElement(e.element)\n                : null;\n            for (const separator of this._separatorRenderer.visibleSeparators) {\n                if (separator !== parent) {\n                    continue;\n                }\n                const currentMouse = !!(separator.focusInsideSeparator & QuickPickSeparatorFocusReason.MOUSE_HOVER);\n                if (!currentMouse) {\n                    separator.focusInsideSeparator |= QuickPickSeparatorFocusReason.MOUSE_HOVER;\n                    this._tree.rerender(separator);\n                }\n            }\n        }));\n        this._register(this._tree.onMouseOut(e => {\n            const parent = e.element\n                ? this._tree.getParentElement(e.element)\n                : null;\n            for (const separator of this._separatorRenderer.visibleSeparators) {\n                if (separator !== parent) {\n                    continue;\n                }\n                const currentMouse = !!(separator.focusInsideSeparator & QuickPickSeparatorFocusReason.MOUSE_HOVER);\n                if (currentMouse) {\n                    separator.focusInsideSeparator &= ~QuickPickSeparatorFocusReason.MOUSE_HOVER;\n                    this._tree.rerender(separator);\n                }\n            }\n        }));\n    }\n    _registerSelectionChangeListener() {\n        // When the user selects a separator, the separator will move to the top and focus will be\n        // set to the first element after the separator.\n        this._register(this._tree.onDidChangeSelection(e => {\n            const elementsWithoutSeparators = e.elements.filter((e) => e instanceof QuickPickItemElement);\n            if (elementsWithoutSeparators.length !== e.elements.length) {\n                if (e.elements.length === 1 && e.elements[0] instanceof QuickPickSeparatorElement) {\n                    this._tree.setFocus([e.elements[0].children[0]]);\n                    this._tree.reveal(e.elements[0], 0);\n                }\n                this._tree.setSelection(elementsWithoutSeparators);\n            }\n        }));\n    }\n    //#endregion\n    //#region public methods\n    setAllVisibleChecked(checked) {\n        this._elementCheckedEventBufferer.bufferEvents(() => {\n            this._itemElements.forEach(element => {\n                if (!element.hidden && !element.checkboxDisabled && element.item.pickable !== false) {\n                    // Would fire an event if we didn't beffer the events\n                    element.checked = checked;\n                }\n            });\n        });\n    }\n    setElements(inputElements) {\n        this._elementDisposable.clear();\n        this._lastQueryString = undefined;\n        this._inputElements = inputElements;\n        this._hasCheckboxes = this.parent.classList.contains('show-checkboxes');\n        let currentSeparatorElement;\n        this._itemElements = new Array();\n        this._elementTree = inputElements.reduce((result, item, index) => {\n            let element;\n            if (item.type === 'separator') {\n                if (!item.buttons) {\n                    // This separator will be rendered as a part of the list item\n                    return result;\n                }\n                currentSeparatorElement = new QuickPickSeparatorElement(index, e => this._onSeparatorButtonTriggered.fire(e), item);\n                element = currentSeparatorElement;\n            }\n            else {\n                const previous = index > 0 ? inputElements[index - 1] : undefined;\n                let separator;\n                if (previous && previous.type === 'separator' && !previous.buttons) {\n                    separator = previous;\n                }\n                const qpi = new QuickPickItemElement(index, currentSeparatorElement?.children\n                    ? currentSeparatorElement.children.length\n                    : index, this._hasCheckboxes && item.pickable !== false, e => this._onButtonTriggered.fire(e), this._elementChecked, item, separator);\n                this._itemElements.push(qpi);\n                if (currentSeparatorElement) {\n                    currentSeparatorElement.children.push(qpi);\n                    return result;\n                }\n                element = qpi;\n            }\n            result.push(element);\n            return result;\n        }, new Array());\n        this._setElementsToTree(this._elementTree);\n        // Accessibility hack, unfortunately on next tick\n        // https://github.com/microsoft/vscode/issues/211976\n        if (this.accessibilityService.isScreenReaderOptimized()) {\n            setTimeout(() => {\n                // eslint-disable-next-line no-restricted-syntax\n                const focusedElement = this._tree.getHTMLElement().querySelector(`.monaco-list-row.focused`);\n                const parent = focusedElement?.parentNode;\n                if (focusedElement && parent) {\n                    const nextSibling = focusedElement.nextSibling;\n                    focusedElement.remove();\n                    parent.insertBefore(focusedElement, nextSibling);\n                }\n            }, 0);\n        }\n    }\n    setFocusedElements(items) {\n        const elements = items.map(item => this._itemElements.find(e => e.item === item))\n            .filter((e) => !!e)\n            .filter(e => !e.hidden);\n        this._tree.setFocus(elements);\n        if (items.length > 0) {\n            const focused = this._tree.getFocus()[0];\n            if (focused) {\n                this._tree.reveal(focused);\n            }\n        }\n    }\n    getActiveDescendant() {\n        return this._tree.getHTMLElement().getAttribute('aria-activedescendant');\n    }\n    setSelectedElements(items) {\n        const elements = items.map(item => this._itemElements.find(e => e.item === item))\n            .filter((e) => !!e);\n        this._tree.setSelection(elements);\n    }\n    getCheckedElements() {\n        return this._itemElements.filter(e => e.checked)\n            .map(e => e.item);\n    }\n    setCheckedElements(items) {\n        this._elementCheckedEventBufferer.bufferEvents(() => {\n            const checked = new Set();\n            for (const item of items) {\n                checked.add(item);\n            }\n            for (const element of this._itemElements) {\n                // Would fire an event if we didn't beffer the events\n                element.checked = checked.has(element.item);\n            }\n        });\n    }\n    focus(what) {\n        if (!this._itemElements.length) {\n            return;\n        }\n        if (what === QuickPickFocus.Second && this._itemElements.length < 2) {\n            what = QuickPickFocus.First;\n        }\n        switch (what) {\n            case QuickPickFocus.First:\n                this._tree.scrollTop = 0;\n                this._tree.focusFirst(undefined, (e) => e.element instanceof QuickPickItemElement);\n                break;\n            case QuickPickFocus.Second: {\n                this._tree.scrollTop = 0;\n                let isSecondItem = false;\n                this._tree.focusFirst(undefined, (e) => {\n                    if (!(e.element instanceof QuickPickItemElement)) {\n                        return false;\n                    }\n                    if (isSecondItem) {\n                        return true;\n                    }\n                    isSecondItem = !isSecondItem;\n                    return false;\n                });\n                break;\n            }\n            case QuickPickFocus.Last:\n                this._tree.scrollTop = this._tree.scrollHeight;\n                this._tree.focusLast(undefined, (e) => e.element instanceof QuickPickItemElement);\n                break;\n            case QuickPickFocus.Next: {\n                const prevFocus = this._tree.getFocus();\n                this._tree.focusNext(undefined, this._shouldLoop, undefined, (e) => {\n                    if (!(e.element instanceof QuickPickItemElement)) {\n                        return false;\n                    }\n                    this._tree.reveal(e.element);\n                    return true;\n                });\n                const currentFocus = this._tree.getFocus();\n                if (prevFocus.length && prevFocus[0] === currentFocus[0]) {\n                    this._onLeave.fire();\n                }\n                break;\n            }\n            case QuickPickFocus.Previous: {\n                const prevFocus = this._tree.getFocus();\n                this._tree.focusPrevious(undefined, this._shouldLoop, undefined, (e) => {\n                    if (!(e.element instanceof QuickPickItemElement)) {\n                        return false;\n                    }\n                    const parent = this._tree.getParentElement(e.element);\n                    if (parent === null || parent.children[0] !== e.element) {\n                        this._tree.reveal(e.element);\n                    }\n                    else {\n                        // Only if we are the first child of a separator do we reveal the separator\n                        this._tree.reveal(parent);\n                    }\n                    return true;\n                });\n                const currentFocus = this._tree.getFocus();\n                if (prevFocus.length && prevFocus[0] === currentFocus[0]) {\n                    this._onLeave.fire();\n                }\n                break;\n            }\n            case QuickPickFocus.NextPage:\n                this._tree.focusNextPage(undefined, (e) => {\n                    if (!(e.element instanceof QuickPickItemElement)) {\n                        return false;\n                    }\n                    this._tree.reveal(e.element);\n                    return true;\n                });\n                break;\n            case QuickPickFocus.PreviousPage:\n                this._tree.focusPreviousPage(undefined, (e) => {\n                    if (!(e.element instanceof QuickPickItemElement)) {\n                        return false;\n                    }\n                    const parent = this._tree.getParentElement(e.element);\n                    if (parent === null || parent.children[0] !== e.element) {\n                        this._tree.reveal(e.element);\n                    }\n                    else {\n                        this._tree.reveal(parent);\n                    }\n                    return true;\n                });\n                break;\n            case QuickPickFocus.NextSeparator: {\n                let foundSeparatorAsItem = false;\n                const before = this._tree.getFocus()[0];\n                this._tree.focusNext(undefined, true, undefined, (e) => {\n                    if (foundSeparatorAsItem) {\n                        // This should be the index right after the separator so it\n                        // is the item we want to focus.\n                        return true;\n                    }\n                    if (e.element instanceof QuickPickSeparatorElement) {\n                        foundSeparatorAsItem = true;\n                        // If the separator is visible, then we should just reveal its first child so it's not as jarring.\n                        if (this._separatorRenderer.isSeparatorVisible(e.element)) {\n                            this._tree.reveal(e.element.children[0]);\n                        }\n                        else {\n                            // If the separator is not visible, then we should\n                            // push it up to the top of the list.\n                            this._tree.reveal(e.element, 0);\n                        }\n                    }\n                    else if (e.element instanceof QuickPickItemElement) {\n                        if (e.element.separator) {\n                            if (this._itemRenderer.isItemWithSeparatorVisible(e.element)) {\n                                this._tree.reveal(e.element);\n                            }\n                            else {\n                                this._tree.reveal(e.element, 0);\n                            }\n                            return true;\n                        }\n                        else if (e.element === this._elementTree[0]) {\n                            // We should stop at the first item in the list if it's a regular item.\n                            this._tree.reveal(e.element, 0);\n                            return true;\n                        }\n                    }\n                    return false;\n                });\n                const after = this._tree.getFocus()[0];\n                if (before === after) {\n                    // If we didn't move, then we should just move to the end\n                    // of the list.\n                    this._tree.scrollTop = this._tree.scrollHeight;\n                    this._tree.focusLast(undefined, (e) => e.element instanceof QuickPickItemElement);\n                }\n                break;\n            }\n            case QuickPickFocus.PreviousSeparator: {\n                let focusElement;\n                // If we are already sitting on an inline separator, then we\n                // have already found the _current_ separator and need to\n                // move to the previous one.\n                let foundSeparator = !!this._tree.getFocus()[0]?.separator;\n                this._tree.focusPrevious(undefined, true, undefined, (e) => {\n                    if (e.element instanceof QuickPickSeparatorElement) {\n                        if (foundSeparator) {\n                            if (!focusElement) {\n                                if (this._separatorRenderer.isSeparatorVisible(e.element)) {\n                                    this._tree.reveal(e.element);\n                                }\n                                else {\n                                    this._tree.reveal(e.element, 0);\n                                }\n                                focusElement = e.element.children[0];\n                            }\n                        }\n                        else {\n                            foundSeparator = true;\n                        }\n                    }\n                    else if (e.element instanceof QuickPickItemElement) {\n                        if (!focusElement) {\n                            if (e.element.separator) {\n                                if (this._itemRenderer.isItemWithSeparatorVisible(e.element)) {\n                                    this._tree.reveal(e.element);\n                                }\n                                else {\n                                    this._tree.reveal(e.element, 0);\n                                }\n                                focusElement = e.element;\n                            }\n                            else if (e.element === this._elementTree[0]) {\n                                // We should stop at the first item in the list if it's a regular item.\n                                this._tree.reveal(e.element, 0);\n                                return true;\n                            }\n                        }\n                    }\n                    return false;\n                });\n                if (focusElement) {\n                    this._tree.setFocus([focusElement]);\n                }\n                break;\n            }\n        }\n    }\n    clearFocus() {\n        this._tree.setFocus([]);\n    }\n    domFocus() {\n        this._tree.domFocus();\n    }\n    layout(maxHeight) {\n        this._tree.getHTMLElement().style.maxHeight = maxHeight ? `${\n        // Make sure height aligns with list item heights\n        Math.floor(maxHeight / 44) * 44\n            // Add some extra height so that it's clear there's more to scroll\n            + 6}px` : '';\n        this._tree.layout();\n    }\n    filter(query) {\n        this._lastQueryString = query;\n        if (!(this._sortByLabel || this._matchOnLabel || this._matchOnDescription || this._matchOnDetail)) {\n            this._tree.layout();\n            return false;\n        }\n        const queryWithWhitespace = query;\n        query = query.trim();\n        // Reset filtering\n        if (!query || !(this.matchOnLabel || this.matchOnDescription || this.matchOnDetail)) {\n            this._itemElements.forEach(element => {\n                element.labelHighlights = undefined;\n                element.descriptionHighlights = undefined;\n                element.detailHighlights = undefined;\n                element.hidden = false;\n                const previous = element.index && this._inputElements[element.index - 1];\n                if (element.item) {\n                    element.separator = previous && previous.type === 'separator' && !previous.buttons ? previous : undefined;\n                }\n            });\n        }\n        // Filter by value (since we support icons in labels, use $(..) aware fuzzy matching)\n        else {\n            let currentSeparator;\n            this._itemElements.forEach(element => {\n                let labelHighlights;\n                if (this.matchOnLabelMode === 'fuzzy') {\n                    labelHighlights = this.matchOnLabel ? matchesFuzzyIconAware(query, parseLabelWithIcons(element.saneLabel)) ?? undefined : undefined;\n                }\n                else {\n                    labelHighlights = this.matchOnLabel ? matchesContiguousIconAware(queryWithWhitespace, parseLabelWithIcons(element.saneLabel)) ?? undefined : undefined;\n                }\n                const descriptionHighlights = this.matchOnDescription ? matchesFuzzyIconAware(query, parseLabelWithIcons(element.saneDescription || '')) ?? undefined : undefined;\n                const detailHighlights = this.matchOnDetail ? matchesFuzzyIconAware(query, parseLabelWithIcons(element.saneDetail || '')) ?? undefined : undefined;\n                if (labelHighlights || descriptionHighlights || detailHighlights) {\n                    element.labelHighlights = labelHighlights;\n                    element.descriptionHighlights = descriptionHighlights;\n                    element.detailHighlights = detailHighlights;\n                    element.hidden = false;\n                }\n                else {\n                    element.labelHighlights = undefined;\n                    element.descriptionHighlights = undefined;\n                    element.detailHighlights = undefined;\n                    element.hidden = element.item ? !element.item.alwaysShow : true;\n                }\n                // Ensure separators are filtered out first before deciding if we need to bring them back\n                if (element.item) {\n                    element.separator = undefined;\n                }\n                else if (element.separator) {\n                    element.hidden = true;\n                }\n                // we can show the separator unless the list gets sorted by match\n                if (!this.sortByLabel) {\n                    const previous = element.index && this._inputElements[element.index - 1] || undefined;\n                    if (previous?.type === 'separator' && !previous.buttons) {\n                        currentSeparator = previous;\n                    }\n                    if (currentSeparator && !element.hidden) {\n                        element.separator = currentSeparator;\n                        currentSeparator = undefined;\n                    }\n                }\n            });\n        }\n        this._setElementsToTree(this._sortByLabel && query\n            // We don't render any separators if we're sorting so just render the elements\n            ? this._itemElements\n            // Render the full tree\n            : this._elementTree);\n        this._tree.layout();\n        return true;\n    }\n    toggleCheckbox() {\n        this._elementCheckedEventBufferer.bufferEvents(() => {\n            const elements = this._tree.getFocus().filter((e) => e instanceof QuickPickItemElement);\n            const allChecked = this._allVisibleChecked(elements);\n            for (const element of elements) {\n                if (!element.checkboxDisabled) {\n                    // Would fire an event if we didn't have the flag set\n                    element.checked = !allChecked;\n                }\n            }\n        });\n    }\n    style(styles) {\n        this._tree.style(styles);\n    }\n    toggleHover() {\n        const focused = this._tree.getFocus()[0];\n        if (!focused?.saneTooltip || !(focused instanceof QuickPickItemElement)) {\n            return;\n        }\n        // if there's a hover already, hide it (toggle off)\n        if (this._lastHover && !this._lastHover.isDisposed) {\n            this._lastHover.dispose();\n            return;\n        }\n        // If there is no hover, show it (toggle on)\n        this.showHover(focused);\n        const store = new DisposableStore();\n        store.add(this._tree.onDidChangeFocus(e => {\n            if (e.elements[0] instanceof QuickPickItemElement) {\n                this.showHover(e.elements[0]);\n            }\n        }));\n        if (this._lastHover) {\n            store.add(this._lastHover);\n        }\n        this._elementDisposable.add(store);\n    }\n    //#endregion\n    //#region private methods\n    _setElementsToTree(elements) {\n        const treeElements = new Array();\n        for (const element of elements) {\n            if (element instanceof QuickPickSeparatorElement) {\n                treeElements.push({\n                    element,\n                    collapsible: false,\n                    collapsed: false,\n                    children: element.children.map(e => ({\n                        element: e,\n                        collapsible: false,\n                        collapsed: false,\n                    })),\n                });\n            }\n            else {\n                treeElements.push({\n                    element,\n                    collapsible: false,\n                    collapsed: false,\n                });\n            }\n        }\n        this._tree.setChildren(null, treeElements);\n    }\n    _allVisibleChecked(elements, whenNoneVisible = true) {\n        for (let i = 0, n = elements.length; i < n; i++) {\n            const element = elements[i];\n            if (!element.hidden && element.item.pickable !== false) {\n                if (!element.checked) {\n                    return false;\n                }\n                else {\n                    whenNoneVisible = true;\n                }\n            }\n        }\n        return whenNoneVisible;\n    }\n    _updateCheckedObservables() {\n        transaction((tx) => {\n            this._allVisibleCheckedObservable.set(this._allVisibleChecked(this._itemElements, false), tx);\n            const checkedCount = this._itemElements.filter(element => element.checked).length;\n            this._checkedCountObservable.set(checkedCount, tx);\n            this._checkedElementsObservable.set(this.getCheckedElements(), tx);\n        });\n    }\n    /**\n     * Disposes of the hover and shows a new one for the given index if it has a tooltip.\n     * @param element The element to show the hover for\n     */\n    showHover(element) {\n        if (this._lastHover && !this._lastHover.isDisposed) {\n            this.hoverDelegate.onDidHideHover?.();\n            this._lastHover?.dispose();\n        }\n        if (!element.element || !element.saneTooltip) {\n            return;\n        }\n        this._lastHover = this.hoverDelegate.showHover({\n            content: element.saneTooltip,\n            target: element.element,\n            linkHandler: (url) => {\n                this.linkOpenerDelegate(url);\n            },\n            appearance: {\n                showPointer: true,\n            },\n            container: this._container,\n            position: {\n                hoverPosition: 1 /* HoverPosition.RIGHT */\n            }\n        }, false);\n    }\n};\n__decorate([\n    memoize\n], QuickInputList.prototype, \"onDidChangeFocus\", null);\n__decorate([\n    memoize\n], QuickInputList.prototype, \"onDidChangeSelection\", null);\nQuickInputList = __decorate([\n    __param(4, IInstantiationService),\n    __param(5, IAccessibilityService)\n], QuickInputList);\nfunction matchesContiguousIconAware(query, target) {\n    const { text, iconOffsets } = target;\n    // Return early if there are no icon markers in the word to match against\n    if (!iconOffsets || iconOffsets.length === 0) {\n        return matchesContiguous(query, text);\n    }\n    // Trim the word to match against because it could have leading\n    // whitespace now if the word started with an icon\n    const wordToMatchAgainstWithoutIconsTrimmed = ltrim(text, ' ');\n    const leadingWhitespaceOffset = text.length - wordToMatchAgainstWithoutIconsTrimmed.length;\n    // match on value without icon\n    const matches = matchesContiguous(query, wordToMatchAgainstWithoutIconsTrimmed);\n    // Map matches back to offsets with icon and trimming\n    if (matches) {\n        for (const match of matches) {\n            const iconOffset = iconOffsets[match.start + leadingWhitespaceOffset] /* icon offsets at index */ + leadingWhitespaceOffset /* overall leading whitespace offset */;\n            match.start += iconOffset;\n            match.end += iconOffset;\n        }\n    }\n    return matches;\n}\nfunction matchesContiguous(word, wordToMatchAgainst) {\n    const matchIndex = wordToMatchAgainst.toLowerCase().indexOf(word.toLowerCase());\n    if (matchIndex !== -1) {\n        return [{ start: matchIndex, end: matchIndex + word.length }];\n    }\n    return null;\n}\nfunction compareEntries(elementA, elementB, lookFor) {\n    const labelHighlightsA = elementA.labelHighlights || [];\n    const labelHighlightsB = elementB.labelHighlights || [];\n    if (labelHighlightsA.length && !labelHighlightsB.length) {\n        return -1;\n    }\n    if (!labelHighlightsA.length && labelHighlightsB.length) {\n        return 1;\n    }\n    if (labelHighlightsA.length === 0 && labelHighlightsB.length === 0) {\n        return 0;\n    }\n    return compareAnything(elementA.saneSortLabel, elementB.saneSortLabel, lookFor);\n}\n\nexport { QuickInputList };\n","import { isMacintosh } from '../../../base/common/platform.js';\nimport { localize } from '../../../nls.js';\nimport { ContextKeyExpr } from '../../contextkey/common/contextkey.js';\nimport { InputFocusedContext } from '../../contextkey/common/contextkeys.js';\nimport { KeybindingsRegistry } from '../../keybinding/common/keybindingsRegistry.js';\nimport { quickInputTypeContextKeyValue, inQuickInputContext, endOfQuickInputBoxContext } from './quickInput.js';\nimport { QuickPickFocus, IQuickInputService } from '../common/quickInput.js';\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 *--------------------------------------------------------------------------------------------*/\nfunction registerQuickInputCommandAndKeybindingRule(rule, options = {}) {\n    KeybindingsRegistry.registerCommandAndKeybindingRule({\n        weight: 200 /* KeybindingWeight.WorkbenchContrib */,\n        when: inQuickInputContext,\n        metadata: { description: localize(1758, \"Used while in the context of any kind of quick input. If you change one keybinding for this command, you should change all of the other keybindings (modifier variants) of this command as well.\") },\n        ...rule,\n        secondary: getSecondary(rule.primary, rule.secondary ?? [], options)\n    });\n}\nfunction registerQuickPickCommandAndKeybindingRule(rule, options = {}) {\n    KeybindingsRegistry.registerCommandAndKeybindingRule({\n        weight: 200 /* KeybindingWeight.WorkbenchContrib */,\n        when: ContextKeyExpr.and(ContextKeyExpr.or(\n        // Only things that use Tree widgets\n        ContextKeyExpr.equals(quickInputTypeContextKeyValue, \"quickPick\" /* QuickInputType.QuickPick */), ContextKeyExpr.equals(quickInputTypeContextKeyValue, \"quickTree\" /* QuickInputType.QuickTree */)), inQuickInputContext),\n        metadata: { description: localize(1759, \"Used while in the context of the quick pick. If you change one keybinding for this command, you should change all of the other keybindings (modifier variants) of this command as well.\") },\n        ...rule,\n        secondary: getSecondary(rule.primary, rule.secondary ?? [], options)\n    });\n}\nconst ctrlKeyMod = isMacintosh ? 256 /* KeyMod.WinCtrl */ : 2048 /* KeyMod.CtrlCmd */;\n// This function will generate all the combinations of keybindings for the given primary keybinding\nfunction getSecondary(primary, secondary, options = {}) {\n    if (options.withAltMod) {\n        secondary.push(512 /* KeyMod.Alt */ + primary);\n    }\n    if (options.withCtrlMod) {\n        secondary.push(ctrlKeyMod + primary);\n        if (options.withAltMod) {\n            secondary.push(512 /* KeyMod.Alt */ + ctrlKeyMod + primary);\n        }\n    }\n    if (options.withCmdMod && isMacintosh) {\n        secondary.push(2048 /* KeyMod.CtrlCmd */ + primary);\n        if (options.withCtrlMod) {\n            secondary.push(2048 /* KeyMod.CtrlCmd */ + 256 /* KeyMod.WinCtrl */ + primary);\n        }\n        if (options.withAltMod) {\n            secondary.push(2048 /* KeyMod.CtrlCmd */ + 512 /* KeyMod.Alt */ + primary);\n            if (options.withCtrlMod) {\n                secondary.push(2048 /* KeyMod.CtrlCmd */ + 512 /* KeyMod.Alt */ + 256 /* KeyMod.WinCtrl */ + primary);\n            }\n        }\n    }\n    return secondary;\n}\n//#region Navigation\nfunction focusHandler(focus, focusOnQuickNatigate) {\n    return accessor => {\n        // Assuming this is a quick pick due to above when clause\n        const currentQuickPick = accessor.get(IQuickInputService).currentQuickInput;\n        if (!currentQuickPick) {\n            return;\n        }\n        if (focusOnQuickNatigate && currentQuickPick.quickNavigate) {\n            return currentQuickPick.focus(focusOnQuickNatigate);\n        }\n        return currentQuickPick.focus(focus);\n    };\n}\nregisterQuickPickCommandAndKeybindingRule({ id: 'quickInput.pageNext', primary: 12 /* KeyCode.PageDown */, handler: focusHandler(QuickPickFocus.NextPage) }, { withAltMod: true, withCtrlMod: true, withCmdMod: true });\nregisterQuickPickCommandAndKeybindingRule({ id: 'quickInput.pagePrevious', primary: 11 /* KeyCode.PageUp */, handler: focusHandler(QuickPickFocus.PreviousPage) }, { withAltMod: true, withCtrlMod: true, withCmdMod: true });\nregisterQuickPickCommandAndKeybindingRule({ id: 'quickInput.first', primary: ctrlKeyMod + 14 /* KeyCode.Home */, handler: focusHandler(QuickPickFocus.First) }, { withAltMod: true, withCmdMod: true });\nregisterQuickPickCommandAndKeybindingRule({ id: 'quickInput.last', primary: ctrlKeyMod + 13 /* KeyCode.End */, handler: focusHandler(QuickPickFocus.Last) }, { withAltMod: true, withCmdMod: true });\nregisterQuickPickCommandAndKeybindingRule({ id: 'quickInput.next', primary: 18 /* KeyCode.DownArrow */, handler: focusHandler(QuickPickFocus.Next) }, { withCtrlMod: true });\nregisterQuickPickCommandAndKeybindingRule({ id: 'quickInput.previous', primary: 16 /* KeyCode.UpArrow */, handler: focusHandler(QuickPickFocus.Previous) }, { withCtrlMod: true });\n// The next & previous separator commands are interesting because if we are in quick access mode, we are already holding a modifier key down.\n// In this case, we want that modifier key+up/down to navigate to the next/previous item, not the next/previous separator.\n// To handle this, we have a separate command for navigating to the next/previous separator when we are not in quick access mode.\n// If, however, we are in quick access mode, and you hold down an additional modifier key, we will navigate to the next/previous separator.\nconst nextSeparatorFallbackDesc = localize(1760, \"If we're in quick access mode, this will navigate to the next item. If we are not in quick access mode, this will navigate to the next separator.\");\nconst prevSeparatorFallbackDesc = localize(1761, \"If we're in quick access mode, this will navigate to the previous item. If we are not in quick access mode, this will navigate to the previous separator.\");\nif (isMacintosh) {\n    registerQuickPickCommandAndKeybindingRule({\n        id: 'quickInput.nextSeparatorWithQuickAccessFallback',\n        primary: 2048 /* KeyMod.CtrlCmd */ + 18 /* KeyCode.DownArrow */,\n        handler: focusHandler(QuickPickFocus.NextSeparator, QuickPickFocus.Next),\n        metadata: { description: nextSeparatorFallbackDesc }\n    });\n    registerQuickPickCommandAndKeybindingRule({\n        id: 'quickInput.nextSeparator',\n        primary: 2048 /* KeyMod.CtrlCmd */ + 512 /* KeyMod.Alt */ + 18 /* KeyCode.DownArrow */,\n        // Since macOS has the cmd key as the primary modifier, we need to add this additional\n        // keybinding to capture cmd+ctrl+upArrow\n        secondary: [2048 /* KeyMod.CtrlCmd */ + 256 /* KeyMod.WinCtrl */ + 18 /* KeyCode.DownArrow */],\n        handler: focusHandler(QuickPickFocus.NextSeparator)\n    }, { withCtrlMod: true });\n    registerQuickPickCommandAndKeybindingRule({\n        id: 'quickInput.previousSeparatorWithQuickAccessFallback',\n        primary: 2048 /* KeyMod.CtrlCmd */ + 16 /* KeyCode.UpArrow */,\n        handler: focusHandler(QuickPickFocus.PreviousSeparator, QuickPickFocus.Previous),\n        metadata: { description: prevSeparatorFallbackDesc }\n    });\n    registerQuickPickCommandAndKeybindingRule({\n        id: 'quickInput.previousSeparator',\n        primary: 2048 /* KeyMod.CtrlCmd */ + 512 /* KeyMod.Alt */ + 16 /* KeyCode.UpArrow */,\n        // Since macOS has the cmd key as the primary modifier, we need to add this additional\n        // keybinding to capture cmd+ctrl+upArrow\n        secondary: [2048 /* KeyMod.CtrlCmd */ + 256 /* KeyMod.WinCtrl */ + 16 /* KeyCode.UpArrow */],\n        handler: focusHandler(QuickPickFocus.PreviousSeparator)\n    }, { withCtrlMod: true });\n}\nelse {\n    registerQuickPickCommandAndKeybindingRule({\n        id: 'quickInput.nextSeparatorWithQuickAccessFallback',\n        primary: 512 /* KeyMod.Alt */ + 18 /* KeyCode.DownArrow */,\n        handler: focusHandler(QuickPickFocus.NextSeparator, QuickPickFocus.Next),\n        metadata: { description: nextSeparatorFallbackDesc }\n    });\n    registerQuickPickCommandAndKeybindingRule({\n        id: 'quickInput.nextSeparator',\n        primary: 2048 /* KeyMod.CtrlCmd */ + 512 /* KeyMod.Alt */ + 18 /* KeyCode.DownArrow */,\n        handler: focusHandler(QuickPickFocus.NextSeparator)\n    });\n    registerQuickPickCommandAndKeybindingRule({\n        id: 'quickInput.previousSeparatorWithQuickAccessFallback',\n        primary: 512 /* KeyMod.Alt */ + 16 /* KeyCode.UpArrow */,\n        handler: focusHandler(QuickPickFocus.PreviousSeparator, QuickPickFocus.Previous),\n        metadata: { description: prevSeparatorFallbackDesc }\n    });\n    registerQuickPickCommandAndKeybindingRule({\n        id: 'quickInput.previousSeparator',\n        primary: 2048 /* KeyMod.CtrlCmd */ + 512 /* KeyMod.Alt */ + 16 /* KeyCode.UpArrow */,\n        handler: focusHandler(QuickPickFocus.PreviousSeparator)\n    });\n}\n//#endregion\n//#region Accept\nKeybindingsRegistry.registerCommandAndKeybindingRule({\n    id: 'quickInput.accept',\n    primary: 3 /* KeyCode.Enter */,\n    weight: 200 /* KeybindingWeight.WorkbenchContrib */,\n    when: ContextKeyExpr.and(\n    // All other kinds of Quick things handle Accept, except Widget. In other words, Accepting is a detail on the things\n    // that extend IQuickInput\n    ContextKeyExpr.notEquals(quickInputTypeContextKeyValue, \"quickWidget\" /* QuickInputType.QuickWidget */), inQuickInputContext, ContextKeyExpr.not('isComposing')),\n    metadata: { description: localize(1762, \"Used while in the context of some quick input. If you change one keybinding for this command, you should change all of the other keybindings (modifier variants) of this command as well.\") },\n    handler: (accessor) => {\n        const currentQuickPick = accessor.get(IQuickInputService).currentQuickInput;\n        currentQuickPick?.accept();\n    },\n    secondary: getSecondary(3 /* KeyCode.Enter */, [], { withAltMod: true, withCtrlMod: true, withCmdMod: true })\n});\nregisterQuickPickCommandAndKeybindingRule({\n    id: 'quickInput.acceptInBackground',\n    // If we are in the quick pick but the input box is not focused or our cursor is at the end of the input box\n    when: ContextKeyExpr.and(inQuickInputContext, ContextKeyExpr.equals(quickInputTypeContextKeyValue, \"quickPick\" /* QuickInputType.QuickPick */), ContextKeyExpr.or(InputFocusedContext.negate(), endOfQuickInputBoxContext)),\n    primary: 17 /* KeyCode.RightArrow */,\n    // Need a little extra weight to ensure this keybinding is preferred over the default cmd+alt+right arrow keybinding\n    // https://github.com/microsoft/vscode/blob/1451e4fbbbf074a4355cc537c35b547b80ce1c52/src/vs/workbench/browser/parts/editor/editorActions.ts#L1178-L1195\n    weight: 200 /* KeybindingWeight.WorkbenchContrib */ + 50,\n    handler: (accessor) => {\n        const currentQuickPick = accessor.get(IQuickInputService).currentQuickInput;\n        currentQuickPick?.accept(true);\n    },\n}, { withAltMod: true, withCtrlMod: true, withCmdMod: true });\n//#endregion\n//#region Hide\nregisterQuickInputCommandAndKeybindingRule({\n    id: 'quickInput.hide',\n    primary: 9 /* KeyCode.Escape */,\n    handler: (accessor) => {\n        const currentQuickPick = accessor.get(IQuickInputService).currentQuickInput;\n        currentQuickPick?.hide();\n    }\n}, { withAltMod: true, withCtrlMod: true, withCmdMod: true });\n//#endregion\n//#region Toggle Hover\nregisterQuickPickCommandAndKeybindingRule({\n    id: 'quickInput.toggleHover',\n    primary: ctrlKeyMod | 10 /* KeyCode.Space */,\n    handler: accessor => {\n        const quickInputService = accessor.get(IQuickInputService);\n        quickInputService.toggleHover();\n    }\n});\n//#endregion\n","import { asCSSUrl } from '../../../../base/browser/cssValue.js';\nimport { append, $ as $$1, prepend } from '../../../../base/browser/dom.js';\nimport { ActionBar } from '../../../../base/browser/ui/actionbar/actionbar.js';\nimport { IconLabel } from '../../../../base/browser/ui/iconLabel/iconLabel.js';\nimport { TriStateCheckbox } from '../../../../base/browser/ui/toggle/toggle.js';\nimport { Event } from '../../../../base/common/event.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { defaultCheckboxStyles } from '../../../theme/browser/defaultStyles.js';\nimport { isDark } from '../../../theme/common/theme.js';\nimport { escape } from '../../../../base/common/strings.js';\nimport { IThemeService } from '../../../theme/common/themeService.js';\nimport { quickInputButtonToAction } from '../quickInputUtils.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar QuickInputTreeRenderer_1;\nconst $ = $$1;\nlet QuickInputTreeRenderer = class QuickInputTreeRenderer extends Disposable {\n    static { QuickInputTreeRenderer_1 = this; }\n    static { this.ID = 'quickInputTreeElement'; }\n    constructor(_hoverDelegate, _buttonTriggeredEmitter, onCheckedEvent, _themeService) {\n        super();\n        this._hoverDelegate = _hoverDelegate;\n        this._buttonTriggeredEmitter = _buttonTriggeredEmitter;\n        this.onCheckedEvent = onCheckedEvent;\n        this._themeService = _themeService;\n        this.templateId = QuickInputTreeRenderer_1.ID;\n    }\n    renderTemplate(container) {\n        const store = new DisposableStore();\n        // Main entry container\n        const entry = append(container, $('.quick-input-tree-entry'));\n        const checkbox = store.add(new TriStateCheckbox('', false, { ...defaultCheckboxStyles, size: 15 }));\n        entry.appendChild(checkbox.domNode);\n        const checkboxLabel = append(entry, $('label.quick-input-tree-label'));\n        const rows = append(checkboxLabel, $('.quick-input-tree-rows'));\n        const row1 = append(rows, $('.quick-input-tree-row'));\n        const icon = prepend(row1, $('.quick-input-tree-icon'));\n        const label = store.add(new IconLabel(row1, {\n            supportHighlights: true,\n            supportDescriptionHighlights: true,\n            supportIcons: true,\n            hoverDelegate: this._hoverDelegate\n        }));\n        const actionBar = store.add(new ActionBar(entry, this._hoverDelegate ? { hoverDelegate: this._hoverDelegate } : undefined));\n        actionBar.domNode.classList.add('quick-input-tree-entry-action-bar');\n        return {\n            toDisposeTemplate: store,\n            entry,\n            checkbox,\n            icon,\n            label,\n            actionBar,\n            toDisposeElement: new DisposableStore(),\n        };\n    }\n    renderElement(node, index, templateData, _details) {\n        const store = templateData.toDisposeElement;\n        const quickTreeItem = node.element;\n        // Checkbox\n        if (quickTreeItem.pickable === false) {\n            // Hide checkbox for non-pickable items\n            templateData.checkbox.domNode.style.display = 'none';\n        }\n        else {\n            templateData.checkbox.domNode.style.display = '';\n            templateData.checkbox.checked = quickTreeItem.checked ?? false;\n            store.add(Event.filter(this.onCheckedEvent, e => e.item === quickTreeItem)(e => templateData.checkbox.checked = e.checked));\n            if (quickTreeItem.disabled) {\n                templateData.checkbox.disable();\n            }\n        }\n        // Icon\n        if (quickTreeItem.iconPath) {\n            const icon = isDark(this._themeService.getColorTheme().type) ? quickTreeItem.iconPath.dark : (quickTreeItem.iconPath.light ?? quickTreeItem.iconPath.dark);\n            const iconUrl = URI.revive(icon);\n            templateData.icon.className = 'quick-input-tree-icon';\n            templateData.icon.style.backgroundImage = asCSSUrl(iconUrl);\n        }\n        else {\n            templateData.icon.style.backgroundImage = '';\n            templateData.icon.className = quickTreeItem.iconClass ? `quick-input-tree-icon ${quickTreeItem.iconClass}` : '';\n        }\n        const { labelHighlights: matches, descriptionHighlights: descriptionMatches } = node.filterData || {};\n        // Label and Description\n        let descriptionTitle;\n        // NOTE: If we bring back quick tool tips, we need to check that here like we do in the QuickInputListRenderer\n        if (quickTreeItem.description) {\n            descriptionTitle = {\n                markdown: {\n                    value: escape(quickTreeItem.description),\n                    supportThemeIcons: true\n                },\n                markdownNotSupportedFallback: quickTreeItem.description\n            };\n        }\n        templateData.label.setLabel(quickTreeItem.label, quickTreeItem.description, {\n            matches,\n            descriptionMatches,\n            extraClasses: quickTreeItem.iconClasses,\n            italic: quickTreeItem.italic,\n            strikethrough: quickTreeItem.strikethrough,\n            labelEscapeNewLines: true,\n            descriptionTitle\n        });\n        // Action Bar\n        const buttons = quickTreeItem.buttons;\n        if (buttons && buttons.length) {\n            templateData.actionBar.push(buttons.map((button, index) => quickInputButtonToAction(button, `tree-${index}`, () => this._buttonTriggeredEmitter.fire({ item: quickTreeItem, button }))), { icon: true, label: false });\n            templateData.entry.classList.add('has-actions');\n        }\n        else {\n            templateData.entry.classList.remove('has-actions');\n        }\n    }\n    disposeElement(_element, _index, templateData, _details) {\n        templateData.toDisposeElement.clear();\n        templateData.actionBar.clear();\n    }\n    disposeTemplate(templateData) {\n        templateData.toDisposeElement.dispose();\n        templateData.toDisposeTemplate.dispose();\n    }\n};\nQuickInputTreeRenderer = QuickInputTreeRenderer_1 = __decorate([\n    __param(3, IThemeService)\n], QuickInputTreeRenderer);\n\nexport { QuickInputTreeRenderer };\n","import { QuickInputTreeRenderer } from './quickInputTreeRenderer.js';\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/**\n * Delegate for QuickInputTree that provides height and template information.\n */\nclass QuickInputTreeDelegate {\n    getHeight(_element) {\n        return 22;\n    }\n    getTemplateId(_element) {\n        return QuickInputTreeRenderer.ID;\n    }\n}\n\nexport { QuickInputTreeDelegate };\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 *--------------------------------------------------------------------------------------------*/\nfunction getParentNodeState(parentChildren) {\n    let containsChecks = false;\n    let containsUnchecks = false;\n    let containsMixed = false;\n    for (const element of parentChildren) {\n        switch (element.element?.checked) {\n            case 'mixed':\n                containsMixed = true;\n                break;\n            case true:\n                containsChecks = true;\n                break;\n            default:\n                containsUnchecks = true;\n                break;\n        }\n        if (containsChecks && containsUnchecks && containsMixed) {\n            break;\n        }\n    }\n    const newState = containsUnchecks\n        ? containsMixed\n            ? 'mixed'\n            : containsChecks\n                ? 'mixed'\n                : false\n        : containsMixed\n            ? 'mixed'\n            : containsChecks;\n    return newState;\n}\n\nexport { getParentNodeState };\n","import { Event } from '../../../../base/common/event.js';\nimport { getCodiconAriaLabel } from '../../../../base/common/iconLabels.js';\nimport { localize } from '../../../../nls.js';\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/**\n * Accessibility provider for QuickTree.\n */\nclass QuickTreeAccessibilityProvider {\n    constructor(onCheckedEvent) {\n        this.onCheckedEvent = onCheckedEvent;\n    }\n    getWidgetAriaLabel() {\n        return localize(1772, \"Quick Tree\");\n    }\n    getAriaLabel(element) {\n        return element.ariaLabel || [element.label, element.description]\n            .map(s => getCodiconAriaLabel(s))\n            .filter(s => !!s)\n            .join(', ');\n    }\n    getWidgetRole() {\n        return 'tree';\n    }\n    getRole(_element) {\n        return 'checkbox';\n    }\n    isChecked(element) {\n        return {\n            get value() { return element.checked === 'mixed' ? 'mixed' : !!element.checked; },\n            onDidChange: e => Event.filter(this.onCheckedEvent, e => e.item === element)(_ => e()),\n        };\n    }\n}\n\nexport { QuickTreeAccessibilityProvider };\n","import { matchesFuzzyIconAware, parseLabelWithIcons } from '../../../../base/common/iconLabels.js';\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 *--------------------------------------------------------------------------------------------*/\nclass QuickInputTreeFilter {\n    constructor() {\n        this.filterValue = '';\n        this.matchOnLabel = true;\n        this.matchOnDescription = false;\n    }\n    filter(element, parentVisibility) {\n        if (!this.filterValue || !(this.matchOnLabel || this.matchOnDescription)) {\n            return element.children\n                ? { visibility: 2 /* TreeVisibility.Recurse */, data: {} }\n                : { visibility: 1 /* TreeVisibility.Visible */, data: {} };\n        }\n        const labelHighlights = this.matchOnLabel ? matchesFuzzyIconAware(this.filterValue, parseLabelWithIcons(element.label)) ?? undefined : undefined;\n        const descriptionHighlights = this.matchOnDescription ? matchesFuzzyIconAware(this.filterValue, parseLabelWithIcons(element.description || '')) ?? undefined : undefined;\n        const visibility = parentVisibility === 1 /* TreeVisibility.Visible */\n            // Parent is visible because it had matches, so we show all children\n            ? 1 /* TreeVisibility.Visible */\n            // This would only happen on Parent is recurse so...\n            : (labelHighlights || descriptionHighlights)\n                // If we have any highlights, we are visible\n                ? 1 /* TreeVisibility.Visible */\n                // Otherwise, we defer to the children or if no children, we are hidden\n                : element.children\n                    ? 2 /* TreeVisibility.Recurse */\n                    : 0 /* TreeVisibility.Hidden */;\n        return {\n            visibility,\n            data: {\n                labelHighlights,\n                descriptionHighlights\n            }\n        };\n    }\n}\n\nexport { QuickInputTreeFilter };\n","import { Disposable } from '../../../../base/common/lifecycle.js';\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 *--------------------------------------------------------------------------------------------*/\nclass QuickInputTreeSorter extends Disposable {\n    constructor() {\n        super(...arguments);\n        this._sortByLabel = true;\n    }\n    get sortByLabel() {\n        return this._sortByLabel;\n    }\n    set sortByLabel(value) {\n        this._sortByLabel = value;\n    }\n    compare(a, b) {\n        // No-op\n        if (!this._sortByLabel) {\n            return 0;\n        }\n        if (a.label < b.label) {\n            return -1;\n        }\n        else if (a.label > b.label) {\n            return 1;\n        }\n        // use description to break ties\n        if (a.description && b.description) {\n            if (a.description < b.description) {\n                return -1;\n            }\n            else if (a.description > b.description) {\n                return 1;\n            }\n        }\n        else if (a.description) {\n            return -1;\n        }\n        else if (b.description) {\n            return 1;\n        }\n        return 0;\n    }\n}\n\nexport { QuickInputTreeSorter };\n","import { append, $ as $$1 } from '../../../../base/browser/dom.js';\nimport { RenderIndentGuides } from '../../../../base/browser/ui/tree/abstractTree.js';\nimport { Emitter } from '../../../../base/common/event.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport { IInstantiationService } from '../../../instantiation/common/instantiation.js';\nimport { WorkbenchObjectTree } from '../../../list/browser/listService.js';\nimport { QuickInputTreeDelegate } from './quickInputDelegate.js';\nimport { getParentNodeState } from './quickInputTree.js';\nimport { QuickTreeAccessibilityProvider } from './quickInputTreeAccessibilityProvider.js';\nimport { QuickInputTreeFilter } from './quickInputTreeFilter.js';\nimport { QuickInputTreeRenderer } from './quickInputTreeRenderer.js';\nimport { QuickInputTreeSorter } from './quickInputTreeSorter.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst $ = $$1;\nlet QuickInputTreeController = class QuickInputTreeController extends Disposable {\n    constructor(container, hoverDelegate, instantiationService) {\n        super();\n        this.instantiationService = instantiationService;\n        this._onDidTriggerButton = this._register(new Emitter());\n        this._onDidChangeCheckboxState = this._register(new Emitter());\n        this.onDidChangeCheckboxState = this._onDidChangeCheckboxState.event;\n        this._onDidCheckedLeafItemsChange = this._register(new Emitter);\n        this._onLeave = new Emitter();\n        /**\n         * Event that is fired when the tree would no longer have focus.\n        */\n        this.onLeave = this._onLeave.event;\n        this._onDidAccept = this._register(new Emitter());\n        /**\n         * Event that is fired when a non-pickable item is clicked, indicating acceptance.\n         */\n        this.onDidAccept = this._onDidAccept.event;\n        this._container = append(container, $('.quick-input-tree'));\n        this._renderer = this._register(this.instantiationService.createInstance(QuickInputTreeRenderer, hoverDelegate, this._onDidTriggerButton, this.onDidChangeCheckboxState));\n        this._filter = this.instantiationService.createInstance(QuickInputTreeFilter);\n        this._sorter = this._register(new QuickInputTreeSorter());\n        this._tree = this._register(this.instantiationService.createInstance((WorkbenchObjectTree), 'QuickInputTree', this._container, new QuickInputTreeDelegate(), [this._renderer], {\n            accessibilityProvider: new QuickTreeAccessibilityProvider(this.onDidChangeCheckboxState),\n            horizontalScrolling: false,\n            multipleSelectionSupport: false,\n            findWidgetEnabled: false,\n            alwaysConsumeMouseWheel: true,\n            hideTwistiesOfChildlessElements: true,\n            renderIndentGuides: RenderIndentGuides.None,\n            expandOnDoubleClick: true,\n            expandOnlyOnTwistieClick: true,\n            disableExpandOnSpacebar: true,\n            sorter: this._sorter,\n            filter: this._filter\n        }));\n        this.registerOnOpenListener();\n    }\n    get tree() {\n        return this._tree;\n    }\n    get displayed() {\n        return this._container.style.display !== 'none';\n    }\n    set displayed(value) {\n        this._container.style.display = value ? '' : 'none';\n    }\n    get sortByLabel() {\n        return this._sorter.sortByLabel;\n    }\n    set sortByLabel(value) {\n        this._sorter.sortByLabel = value;\n        this._tree.resort(null, true);\n    }\n    getActiveDescendant() {\n        return this._tree.getHTMLElement().getAttribute('aria-activedescendant');\n    }\n    updateFilterOptions(options) {\n        if (options.matchOnLabel !== undefined) {\n            this._filter.matchOnLabel = options.matchOnLabel;\n        }\n        if (options.matchOnDescription !== undefined) {\n            this._filter.matchOnDescription = options.matchOnDescription;\n        }\n        this._tree.refilter();\n    }\n    layout(maxHeight) {\n        this._tree.getHTMLElement().style.maxHeight = maxHeight ? `${\n        // Make sure height aligns with list item heights\n        Math.floor(maxHeight / 44) * 44\n            // Add some extra height so that it's clear there's more to scroll\n            + 6}px` : '';\n        this._tree.layout();\n    }\n    registerOnOpenListener() {\n        this._register(this._tree.onDidOpen(e => {\n            const item = e.element;\n            if (!item) {\n                return;\n            }\n            if (item.disabled) {\n                return;\n            }\n            // Check if the item is pickable (defaults to true if not specified)\n            if (item.pickable === false) {\n                // For non-pickable items, set it as the active item and fire the accept event\n                this._tree.setFocus([item]);\n                this._onDidAccept.fire();\n                return;\n            }\n            const newState = item.checked !== true;\n            if ((item.checked ?? false) === newState) {\n                return; // No change\n            }\n            // Handle checked item\n            item.checked = newState;\n            this._tree.rerender(item);\n            // Handle children of the checked item\n            const updateSet = new Set();\n            const toUpdate = [...this._tree.getNode(item).children];\n            while (toUpdate.length) {\n                const pop = toUpdate.shift();\n                if (pop?.element && !updateSet.has(pop.element)) {\n                    updateSet.add(pop.element);\n                    if ((pop.element.checked ?? false) !== item.checked) {\n                        pop.element.checked = item.checked;\n                        this._tree.rerender(pop.element);\n                    }\n                    toUpdate.push(...pop.children);\n                }\n            }\n            // Handle parents of the checked item\n            let parent = this._tree.getParentElement(item);\n            while (parent) {\n                const parentChildren = [...this._tree.getNode(parent).children];\n                const newState = getParentNodeState(parentChildren);\n                if ((parent.checked ?? false) !== newState) {\n                    parent.checked = newState;\n                    this._tree.rerender(parent);\n                }\n                parent = this._tree.getParentElement(parent);\n            }\n            this._onDidChangeCheckboxState.fire({\n                item,\n                checked: item.checked ?? false\n            });\n            this._onDidCheckedLeafItemsChange.fire(this.getCheckedLeafItems());\n        }));\n    }\n    getCheckedLeafItems() {\n        const lookedAt = new Set();\n        const toLookAt = [...this._tree.getNode().children];\n        const checkedItems = new Array();\n        while (toLookAt.length) {\n            const lookAt = toLookAt.shift();\n            if (!lookAt?.element || lookedAt.has(lookAt.element)) {\n                continue;\n            }\n            if (lookAt.element.checked) {\n                lookedAt.add(lookAt.element);\n                toLookAt.push(...lookAt.children);\n                if (!lookAt.element.children) {\n                    checkedItems.push(lookAt.element);\n                }\n            }\n        }\n        return checkedItems;\n    }\n};\nQuickInputTreeController = __decorate([\n    __param(2, IInstantiationService)\n], QuickInputTreeController);\n\nexport { QuickInputTreeController };\n","import { onDidRegisterWindow, onWillUnregisterWindow, getWindow, EventType, addDisposableListener, append, $ as $$1, trackFocus, isAncestor, isHTMLElement, reset, isAncestorOfActiveElement, addDisposableGenericMouseUpListener, addDisposableGenericMouseDownListener, addDisposableGenericMouseMoveListener, getActiveWindow } from '../../../base/browser/dom.js';\nimport { createStyleSheet } from '../../../base/browser/domStylesheets.js';\nimport { ActionBar } from '../../../base/browser/ui/actionbar/actionbar.js';\nimport { Button } from '../../../base/browser/ui/button/button.js';\nimport { CountBadge } from '../../../base/browser/ui/countBadge/countBadge.js';\nimport { ProgressBar } from '../../../base/browser/ui/progressbar/progressbar.js';\nimport { CancellationToken } from '../../../base/common/cancellation.js';\nimport { Emitter, Event } from '../../../base/common/event.js';\nimport { Disposable, dispose } from '../../../base/common/lifecycle.js';\nimport Severity from '../../../base/common/severity.js';\nimport { isString } from '../../../base/common/types.js';\nimport { localize } from '../../../nls.js';\nimport { QuickInputHideReason } from '../common/quickInput.js';\nimport { QuickInputBox } from './quickInputBox.js';\nimport { InQuickInputContextKey, QuickInputTypeContextKey, EndOfQuickInputBoxContextKey, QuickPick, InputBox, backButton, QuickInputAlignmentContextKey } from './quickInput.js';\nimport { ILayoutService } from '../../layout/browser/layoutService.js';\nimport { mainWindow } from '../../../base/browser/window.js';\nimport { IInstantiationService } from '../../instantiation/common/instantiation.js';\nimport { QuickInputList } from './quickInputList.js';\nimport { IContextKeyService } from '../../contextkey/common/contextkey.js';\nimport './quickInputActions.js';\nimport '../../../base/common/observableInternal/index.js';\nimport { StandardMouseEvent } from '../../../base/browser/mouseEvent.js';\nimport { IStorageService } from '../../storage/common/storage.js';\nimport { IConfigurationService } from '../../configuration/common/configuration.js';\nimport { setTimeout0, platform } from '../../../base/common/platform.js';\nimport { getWindowControlsStyle } from '../../window/common/window.js';\nimport { getZoomFactor } from '../../../base/browser/browser.js';\nimport { TriStateCheckbox } from '../../../base/browser/ui/toggle/toggle.js';\nimport { defaultCheckboxStyles } from '../../theme/browser/defaultStyles.js';\nimport { QuickInputTreeController } from './tree/quickInputTreeController.js';\nimport { autorun } from '../../../base/common/observableInternal/reactions/autorun.js';\nimport { observableValue } from '../../../base/common/observableInternal/observables/observableValue.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar QuickInputController_1;\nconst $ = $$1;\nconst VIEWSTATE_STORAGE_KEY = 'workbench.quickInput.viewState';\nlet QuickInputController = class QuickInputController extends Disposable {\n    static { QuickInputController_1 = this; }\n    static { this.MAX_WIDTH = 600; } // Max total width of quick input widget\n    get currentQuickInput() { return this.controller ?? undefined; }\n    get container() { return this._container; }\n    constructor(options, layoutService, instantiationService, contextKeyService, storageService) {\n        super();\n        this.options = options;\n        this.layoutService = layoutService;\n        this.instantiationService = instantiationService;\n        this.storageService = storageService;\n        this.enabled = true;\n        this.onDidAcceptEmitter = this._register(new Emitter());\n        this.onDidCustomEmitter = this._register(new Emitter());\n        this.onDidTriggerButtonEmitter = this._register(new Emitter());\n        this.keyMods = { ctrlCmd: false, alt: false };\n        this.controller = null;\n        this.onShowEmitter = this._register(new Emitter());\n        this.onShow = this.onShowEmitter.event;\n        this.onHideEmitter = this._register(new Emitter());\n        this.onHide = this.onHideEmitter.event;\n        this.inQuickInputContext = InQuickInputContextKey.bindTo(contextKeyService);\n        this.quickInputTypeContext = QuickInputTypeContextKey.bindTo(contextKeyService);\n        this.endOfQuickInputBoxContext = EndOfQuickInputBoxContextKey.bindTo(contextKeyService);\n        this.idPrefix = options.idPrefix;\n        this._container = options.container;\n        this.styles = options.styles;\n        this._register(Event.runAndSubscribe(onDidRegisterWindow, ({ window, disposables }) => this.registerKeyModsListeners(window, disposables), { window: mainWindow, disposables: this._store }));\n        this._register(onWillUnregisterWindow(window => {\n            if (this.ui && getWindow(this.ui.container) === window) {\n                // The window this quick input is contained in is about to\n                // close, so we have to make sure to reparent it back to an\n                // existing parent to not loose functionality.\n                // (https://github.com/microsoft/vscode/issues/195870)\n                this.reparentUI(this.layoutService.mainContainer);\n                this.layout(this.layoutService.mainContainerDimension, this.layoutService.mainContainerOffset.quickPickTop);\n            }\n        }));\n        this.viewState = this.loadViewState();\n    }\n    registerKeyModsListeners(window, disposables) {\n        const listener = (e) => {\n            this.keyMods.ctrlCmd = e.ctrlKey || e.metaKey;\n            this.keyMods.alt = e.altKey;\n        };\n        for (const event of [EventType.KEY_DOWN, EventType.KEY_UP, EventType.MOUSE_DOWN]) {\n            disposables.add(addDisposableListener(window, event, listener, true));\n        }\n    }\n    getUI(showInActiveContainer) {\n        if (this.ui) {\n            // In order to support aux windows, re-parent the controller\n            // if the original event is from a different document\n            if (showInActiveContainer) {\n                if (getWindow(this._container) !== getWindow(this.layoutService.activeContainer)) {\n                    this.reparentUI(this.layoutService.activeContainer);\n                    this.layout(this.layoutService.activeContainerDimension, this.layoutService.activeContainerOffset.quickPickTop);\n                }\n            }\n            return this.ui;\n        }\n        const container = append(this._container, $('.quick-input-widget.show-file-icons'));\n        container.tabIndex = -1;\n        container.style.display = 'none';\n        const styleSheet = createStyleSheet(container);\n        const titleBar = append(container, $('.quick-input-titlebar'));\n        const leftActionBar = this._register(new ActionBar(titleBar, { hoverDelegate: this.options.hoverDelegate }));\n        leftActionBar.domNode.classList.add('quick-input-left-action-bar');\n        const title = append(titleBar, $('.quick-input-title'));\n        const rightActionBar = this._register(new ActionBar(titleBar, { hoverDelegate: this.options.hoverDelegate }));\n        rightActionBar.domNode.classList.add('quick-input-right-action-bar');\n        const headerContainer = append(container, $('.quick-input-header'));\n        const checkAll = this._register(new TriStateCheckbox(localize(1763, \"Toggle all checkboxes\"), false, { ...defaultCheckboxStyles, size: 15 }));\n        append(headerContainer, checkAll.domNode);\n        this._register(checkAll.onChange(() => {\n            const checked = checkAll.checked;\n            list.setAllVisibleChecked(checked === true);\n        }));\n        this._register(addDisposableListener(checkAll.domNode, EventType.CLICK, e => {\n            if (e.x || e.y) { // Avoid 'click' triggered by 'space'...\n                inputBox.setFocus();\n            }\n        }));\n        const description2 = append(headerContainer, $('.quick-input-description'));\n        const inputContainer = append(headerContainer, $('.quick-input-and-message'));\n        const filterContainer = append(inputContainer, $('.quick-input-filter'));\n        const inputBox = this._register(new QuickInputBox(filterContainer, this.styles.inputBox, this.styles.toggle));\n        inputBox.setAttribute('aria-describedby', `${this.idPrefix}message`);\n        const visibleCountContainer = append(filterContainer, $('.quick-input-visible-count'));\n        visibleCountContainer.setAttribute('aria-live', 'polite');\n        visibleCountContainer.setAttribute('aria-atomic', 'true');\n        const visibleCount = this._register(new CountBadge(visibleCountContainer, { countFormat: localize(1764, \"{0} Results\") }, this.styles.countBadge));\n        const countContainer = append(filterContainer, $('.quick-input-count'));\n        countContainer.setAttribute('aria-live', 'polite');\n        const count = this._register(new CountBadge(countContainer, { countFormat: localize(1765, \"{0} Selected\") }, this.styles.countBadge));\n        const inlineActionBar = this._register(new ActionBar(headerContainer, { hoverDelegate: this.options.hoverDelegate }));\n        inlineActionBar.domNode.classList.add('quick-input-inline-action-bar');\n        const okContainer = append(headerContainer, $('.quick-input-action'));\n        const ok = this._register(new Button(okContainer, this.styles.button));\n        ok.label = localize(1766, \"OK\");\n        this._register(ok.onDidClick(e => {\n            this.onDidAcceptEmitter.fire();\n        }));\n        const customButtonContainer = append(headerContainer, $('.quick-input-action'));\n        const customButton = this._register(new Button(customButtonContainer, { ...this.styles.button, supportIcons: true }));\n        customButton.label = localize(1767, \"Custom\");\n        this._register(customButton.onDidClick(e => {\n            this.onDidCustomEmitter.fire();\n        }));\n        const message = append(inputContainer, $(`#${this.idPrefix}message.quick-input-message`));\n        const progressBar = this._register(new ProgressBar(container, this.styles.progressBar));\n        progressBar.getContainer().classList.add('quick-input-progress');\n        const widget = append(container, $('.quick-input-html-widget'));\n        widget.tabIndex = -1;\n        const description1 = append(container, $('.quick-input-description'));\n        // List\n        const listId = this.idPrefix + 'list';\n        const list = this._register(this.instantiationService.createInstance(QuickInputList, container, this.options.hoverDelegate, this.options.linkOpenerDelegate, listId));\n        inputBox.setAttribute('aria-controls', listId);\n        this._register(list.onDidChangeFocus(() => {\n            if (inputBox.hasFocus()) {\n                inputBox.setAttribute('aria-activedescendant', list.getActiveDescendant() ?? '');\n            }\n        }));\n        this._register(list.onChangedAllVisibleChecked(checked => {\n            // TODO: Support tri-state checkbox when we remove the .indent property that is faking tree structure.\n            checkAll.checked = checked;\n        }));\n        this._register(list.onChangedVisibleCount(c => {\n            visibleCount.setCount(c);\n        }));\n        this._register(list.onChangedCheckedCount(c => {\n            // TODO@TylerLeonhardt: Without this setTimeout, the screen reader will not read out\n            // the final count of checked items correctly. Investigate a better way\n            // to do this. ref https://github.com/microsoft/vscode/issues/258617\n            setTimeout0(() => count.setCount(c));\n        }));\n        this._register(list.onLeave(() => {\n            // Defer to avoid the input field reacting to the triggering key.\n            // TODO@TylerLeonhardt https://github.com/microsoft/vscode/issues/203675\n            setTimeout(() => {\n                if (!this.controller) {\n                    return;\n                }\n                inputBox.setFocus();\n                if (this.controller instanceof QuickPick && this.controller.canSelectMany) {\n                    list.clearFocus();\n                }\n            }, 0);\n        }));\n        // Tree\n        const tree = this._register(this.instantiationService.createInstance(QuickInputTreeController, container, this.options.hoverDelegate));\n        this._register(tree.tree.onDidChangeFocus(() => {\n            if (inputBox.hasFocus()) {\n                inputBox.setAttribute('aria-activedescendant', tree.getActiveDescendant() ?? '');\n            }\n        }));\n        this._register(tree.onLeave(() => {\n            // Defer to avoid the input field reacting to the triggering key.\n            // TODO@TylerLeonhardt https://github.com/microsoft/vscode/issues/203675\n            setTimeout(() => {\n                if (!this.controller) {\n                    return;\n                }\n                inputBox.setFocus();\n                tree.tree.setFocus([]);\n            }, 0);\n        }));\n        // Wire up tree's accept event to the UI's accept emitter for non-pickable items\n        this._register(tree.onDidAccept(() => {\n            this.onDidAcceptEmitter.fire();\n        }));\n        this._register(tree.tree.onDidChangeContentHeight(() => this.updateLayout()));\n        const focusTracker = trackFocus(container);\n        this._register(focusTracker);\n        this._register(addDisposableListener(container, EventType.FOCUS, e => {\n            const ui = this.getUI();\n            if (isAncestor(e.relatedTarget, ui.inputContainer)) {\n                const value = ui.inputBox.isSelectionAtEnd();\n                if (this.endOfQuickInputBoxContext.get() !== value) {\n                    this.endOfQuickInputBoxContext.set(value);\n                }\n            }\n            // Ignore focus events within container\n            if (isAncestor(e.relatedTarget, ui.container)) {\n                return;\n            }\n            this.inQuickInputContext.set(true);\n            this.previousFocusElement = isHTMLElement(e.relatedTarget) ? e.relatedTarget : undefined;\n        }, true));\n        this._register(focusTracker.onDidBlur(() => {\n            if (!this.getUI().ignoreFocusOut && !this.options.ignoreFocusOut()) {\n                this.hide(QuickInputHideReason.Blur);\n            }\n            this.inQuickInputContext.set(false);\n            this.endOfQuickInputBoxContext.set(false);\n            this.previousFocusElement = undefined;\n        }));\n        this._register(inputBox.onKeyDown(_ => {\n            const value = this.getUI().inputBox.isSelectionAtEnd();\n            if (this.endOfQuickInputBoxContext.get() !== value) {\n                this.endOfQuickInputBoxContext.set(value);\n            }\n            // Allow screenreaders to read what's in the input\n            // Note: this works for arrow keys and selection changes,\n            // but not for deletions since that often triggers a\n            // change in the list.\n            inputBox.removeAttribute('aria-activedescendant');\n        }));\n        this._register(addDisposableListener(container, EventType.FOCUS, (e) => {\n            inputBox.setFocus();\n        }));\n        // Drag and Drop support\n        this.dndController = this._register(this.instantiationService.createInstance(QuickInputDragAndDropController, this._container, container, [\n            {\n                node: titleBar,\n                includeChildren: true\n            },\n            {\n                node: headerContainer,\n                includeChildren: false\n            }\n        ], this.viewState));\n        // DnD update layout\n        this._register(autorun(reader => {\n            const dndViewState = this.dndController?.dndViewState.read(reader);\n            if (!dndViewState) {\n                return;\n            }\n            if (dndViewState.top !== undefined && dndViewState.left !== undefined) {\n                this.viewState = {\n                    ...this.viewState,\n                    top: dndViewState.top,\n                    left: dndViewState.left\n                };\n            }\n            else {\n                // Reset position/size\n                this.viewState = undefined;\n            }\n            this.updateLayout();\n            // Save position\n            if (dndViewState.done) {\n                this.saveViewState(this.viewState);\n            }\n        }));\n        this.ui = {\n            container,\n            styleSheet,\n            leftActionBar,\n            titleBar,\n            title,\n            description1,\n            description2,\n            widget,\n            rightActionBar,\n            inlineActionBar,\n            checkAll,\n            inputContainer,\n            filterContainer,\n            inputBox,\n            visibleCountContainer,\n            visibleCount,\n            countContainer,\n            count,\n            okContainer,\n            ok,\n            message,\n            customButtonContainer,\n            customButton,\n            list,\n            tree,\n            progressBar,\n            onDidAccept: this.onDidAcceptEmitter.event,\n            onDidCustom: this.onDidCustomEmitter.event,\n            onDidTriggerButton: this.onDidTriggerButtonEmitter.event,\n            ignoreFocusOut: false,\n            keyMods: this.keyMods,\n            show: controller => this.show(controller),\n            hide: () => this.hide(),\n            setVisibilities: visibilities => this.setVisibilities(visibilities),\n            setEnabled: enabled => this.setEnabled(enabled),\n            setContextKey: contextKey => this.options.setContextKey(contextKey),\n            linkOpenerDelegate: content => this.options.linkOpenerDelegate(content)\n        };\n        this.updateStyles();\n        return this.ui;\n    }\n    reparentUI(container) {\n        if (this.ui) {\n            this._container = container;\n            append(this._container, this.ui.container);\n            this.dndController?.reparentUI(this._container);\n        }\n    }\n    pick(picks, options = {}, token = CancellationToken.None) {\n        return new Promise((doResolve, reject) => {\n            let resolve = (result) => {\n                resolve = doResolve;\n                options.onKeyMods?.(input.keyMods);\n                doResolve(result);\n            };\n            if (token.isCancellationRequested) {\n                resolve(undefined);\n                return;\n            }\n            const input = this.createQuickPick({ useSeparators: true });\n            let activeItem;\n            const disposables = [\n                input,\n                input.onDidAccept(() => {\n                    if (input.canSelectMany) {\n                        resolve(input.selectedItems.slice());\n                        input.hide();\n                    }\n                    else {\n                        const result = input.activeItems[0];\n                        if (result) {\n                            resolve(result);\n                            input.hide();\n                        }\n                    }\n                }),\n                input.onDidChangeActive(items => {\n                    const focused = items[0];\n                    if (focused && options.onDidFocus) {\n                        options.onDidFocus(focused);\n                    }\n                }),\n                input.onDidChangeSelection(items => {\n                    if (!input.canSelectMany) {\n                        const result = items[0];\n                        if (result) {\n                            resolve(result);\n                            input.hide();\n                        }\n                    }\n                }),\n                input.onDidTriggerItemButton(event => options.onDidTriggerItemButton && options.onDidTriggerItemButton({\n                    ...event,\n                    removeItem: () => {\n                        const index = input.items.indexOf(event.item);\n                        if (index !== -1) {\n                            const items = input.items.slice();\n                            const removed = items.splice(index, 1);\n                            const activeItems = input.activeItems.filter(activeItem => activeItem !== removed[0]);\n                            const keepScrollPositionBefore = input.keepScrollPosition;\n                            input.keepScrollPosition = true;\n                            input.items = items;\n                            if (activeItems) {\n                                input.activeItems = activeItems;\n                            }\n                            input.keepScrollPosition = keepScrollPositionBefore;\n                        }\n                    }\n                })),\n                input.onDidTriggerSeparatorButton(event => options.onDidTriggerSeparatorButton?.(event)),\n                input.onDidChangeValue(value => {\n                    if (activeItem && !value && (input.activeItems.length !== 1 || input.activeItems[0] !== activeItem)) {\n                        input.activeItems = [activeItem];\n                    }\n                }),\n                token.onCancellationRequested(() => {\n                    input.hide();\n                }),\n                input.onDidHide(() => {\n                    dispose(disposables);\n                    resolve(undefined);\n                }),\n            ];\n            input.title = options.title;\n            if (options.value) {\n                input.value = options.value;\n            }\n            input.canSelectMany = !!options.canPickMany;\n            input.placeholder = options.placeHolder;\n            input.prompt = options.prompt;\n            input.ignoreFocusOut = !!options.ignoreFocusLost;\n            input.matchOnDescription = !!options.matchOnDescription;\n            input.matchOnDetail = !!options.matchOnDetail;\n            if (options.sortByLabel !== undefined) {\n                input.sortByLabel = options.sortByLabel;\n            }\n            input.matchOnLabel = (options.matchOnLabel === undefined) || options.matchOnLabel; // default to true\n            input.quickNavigate = options.quickNavigate;\n            input.hideInput = !!options.hideInput;\n            input.contextKey = options.contextKey;\n            input.busy = true;\n            Promise.all([picks, options.activeItem])\n                .then(([items, _activeItem]) => {\n                activeItem = _activeItem;\n                input.busy = false;\n                input.items = items;\n                if (input.canSelectMany) {\n                    input.selectedItems = items.filter(item => item.type !== 'separator' && item.picked);\n                }\n                if (activeItem) {\n                    input.activeItems = [activeItem];\n                }\n            });\n            input.show();\n            Promise.resolve(picks).then(undefined, err => {\n                reject(err);\n                input.hide();\n            });\n        });\n    }\n    setValidationOnInput(input, validationResult) {\n        if (validationResult && isString(validationResult)) {\n            input.severity = Severity.Error;\n            input.validationMessage = validationResult;\n        }\n        else if (validationResult && !isString(validationResult)) {\n            input.severity = validationResult.severity;\n            input.validationMessage = validationResult.content;\n        }\n        else {\n            input.severity = Severity.Ignore;\n            input.validationMessage = undefined;\n        }\n    }\n    input(options = {}, token = CancellationToken.None) {\n        return new Promise((resolve) => {\n            if (token.isCancellationRequested) {\n                resolve(undefined);\n                return;\n            }\n            const input = this.createInputBox();\n            const validateInput = options.validateInput || (() => Promise.resolve(undefined));\n            const onDidValueChange = Event.debounce(input.onDidChangeValue, (last, cur) => cur, 100);\n            let validationValue = options.value || '';\n            let validation = Promise.resolve(validateInput(validationValue));\n            const disposables = [\n                input,\n                onDidValueChange(value => {\n                    if (value !== validationValue) {\n                        validation = Promise.resolve(validateInput(value));\n                        validationValue = value;\n                    }\n                    validation.then(result => {\n                        if (value === validationValue) {\n                            this.setValidationOnInput(input, result);\n                        }\n                    });\n                }),\n                input.onDidAccept(() => {\n                    const value = input.value;\n                    if (value !== validationValue) {\n                        validation = Promise.resolve(validateInput(value));\n                        validationValue = value;\n                    }\n                    validation.then(result => {\n                        if (!result || (!isString(result) && result.severity !== Severity.Error)) {\n                            resolve(value);\n                            input.hide();\n                        }\n                        else if (value === validationValue) {\n                            this.setValidationOnInput(input, result);\n                        }\n                    });\n                }),\n                token.onCancellationRequested(() => {\n                    input.hide();\n                }),\n                input.onDidHide(() => {\n                    dispose(disposables);\n                    resolve(undefined);\n                }),\n            ];\n            input.title = options.title;\n            input.value = options.value || '';\n            input.valueSelection = options.valueSelection;\n            input.prompt = options.prompt;\n            input.placeholder = options.placeHolder;\n            input.password = !!options.password;\n            input.ignoreFocusOut = !!options.ignoreFocusLost;\n            input.show();\n        });\n    }\n    createQuickPick(options = { useSeparators: false }) {\n        const ui = this.getUI(true);\n        return new QuickPick(ui);\n    }\n    createInputBox() {\n        const ui = this.getUI(true);\n        return new InputBox(ui);\n    }\n    show(controller) {\n        const ui = this.getUI(true);\n        this.onShowEmitter.fire();\n        const oldController = this.controller;\n        this.controller = controller;\n        oldController?.didHide();\n        this.setEnabled(true);\n        ui.leftActionBar.clear();\n        ui.title.textContent = '';\n        ui.description1.textContent = '';\n        ui.description2.textContent = '';\n        reset(ui.widget);\n        ui.rightActionBar.clear();\n        ui.inlineActionBar.clear();\n        ui.checkAll.checked = false;\n        // ui.inputBox.value = ''; Avoid triggering an event.\n        ui.inputBox.placeholder = '';\n        ui.inputBox.password = false;\n        ui.inputBox.showDecoration(Severity.Ignore);\n        ui.visibleCount.setCount(0);\n        ui.count.setCount(0);\n        reset(ui.message);\n        ui.progressBar.stop();\n        ui.progressBar.getContainer().setAttribute('aria-hidden', 'true');\n        ui.list.setElements([]);\n        ui.list.matchOnDescription = false;\n        ui.list.matchOnDetail = false;\n        ui.list.matchOnLabel = true;\n        ui.list.sortByLabel = true;\n        ui.tree.updateFilterOptions({\n            matchOnDescription: false,\n            matchOnLabel: true\n        });\n        ui.tree.sortByLabel = true;\n        ui.ignoreFocusOut = false;\n        ui.inputBox.toggles = undefined;\n        const backKeybindingLabel = this.options.backKeybindingLabel();\n        backButton.tooltip = backKeybindingLabel ? localize(1768, \"Back ({0})\", backKeybindingLabel) : localize(1769, \"Back\");\n        ui.container.style.display = '';\n        this.updateLayout();\n        this.dndController?.layoutContainer();\n        ui.inputBox.setFocus();\n        this.quickInputTypeContext.set(controller.type);\n    }\n    isVisible() {\n        return !!this.ui && this.ui.container.style.display !== 'none';\n    }\n    setVisibilities(visibilities) {\n        const ui = this.getUI();\n        ui.title.style.display = visibilities.title ? '' : 'none';\n        ui.description1.style.display = visibilities.description && (visibilities.inputBox || visibilities.checkAll) ? '' : 'none';\n        ui.description2.style.display = visibilities.description && !(visibilities.inputBox || visibilities.checkAll) ? '' : 'none';\n        ui.checkAll.domNode.style.display = visibilities.checkAll ? '' : 'none';\n        ui.inputContainer.style.display = visibilities.inputBox ? '' : 'none';\n        ui.filterContainer.style.display = visibilities.inputBox ? '' : 'none';\n        ui.visibleCountContainer.style.display = visibilities.visibleCount ? '' : 'none';\n        ui.countContainer.style.display = visibilities.count ? '' : 'none';\n        ui.okContainer.style.display = visibilities.ok ? '' : 'none';\n        ui.customButtonContainer.style.display = visibilities.customButton ? '' : 'none';\n        ui.message.style.display = visibilities.message ? '' : 'none';\n        ui.progressBar.getContainer().style.display = visibilities.progressBar ? '' : 'none';\n        ui.list.displayed = !!visibilities.list;\n        ui.tree.displayed = !!visibilities.tree;\n        ui.container.classList.toggle('show-checkboxes', !!visibilities.checkBox);\n        ui.container.classList.toggle('hidden-input', !visibilities.inputBox && !visibilities.description);\n        this.updateLayout(); // TODO\n    }\n    setEnabled(enabled) {\n        if (enabled !== this.enabled) {\n            this.enabled = enabled;\n            const ui = this.getUI();\n            for (const item of ui.leftActionBar.viewItems) {\n                item.action.enabled = enabled;\n            }\n            for (const item of ui.rightActionBar.viewItems) {\n                item.action.enabled = enabled;\n            }\n            if (enabled) {\n                ui.checkAll.enable();\n            }\n            else {\n                ui.checkAll.disable();\n            }\n            ui.inputBox.enabled = enabled;\n            ui.ok.enabled = enabled;\n            ui.list.enabled = enabled;\n        }\n    }\n    hide(reason) {\n        const controller = this.controller;\n        if (!controller) {\n            return;\n        }\n        controller.willHide(reason);\n        const container = this.ui?.container;\n        const focusChanged = container && !isAncestorOfActiveElement(container);\n        this.controller = null;\n        this.onHideEmitter.fire();\n        if (container) {\n            container.style.display = 'none';\n        }\n        if (!focusChanged) {\n            let currentElement = this.previousFocusElement;\n            while (currentElement && !currentElement.offsetParent) {\n                currentElement = currentElement.parentElement ?? undefined;\n            }\n            if (currentElement?.offsetParent) {\n                currentElement.focus();\n                this.previousFocusElement = undefined;\n            }\n            else {\n                this.options.returnFocus();\n            }\n        }\n        controller.didHide(reason);\n    }\n    toggleHover() {\n        if (this.isVisible() && this.controller instanceof QuickPick) {\n            this.getUI().list.toggleHover();\n        }\n    }\n    layout(dimension, titleBarOffset) {\n        this.dimension = dimension;\n        this.titleBarOffset = titleBarOffset;\n        this.updateLayout();\n    }\n    updateLayout() {\n        if (this.ui && this.isVisible()) {\n            const style = this.ui.container.style;\n            const width = Math.min(this.dimension.width * 0.62 /* golden cut */, QuickInputController_1.MAX_WIDTH);\n            style.width = width + 'px';\n            // Position\n            style.top = `${this.viewState?.top ? Math.round(this.dimension.height * this.viewState.top) : this.titleBarOffset}px`;\n            style.left = `${Math.round((this.dimension.width * (this.viewState?.left ?? 0.5 /* center */)) - (width / 2))}px`;\n            this.ui.inputBox.layout();\n            this.ui.list.layout(this.dimension && this.dimension.height * 0.4);\n            this.ui.tree.layout(this.dimension && this.dimension.height * 0.4);\n        }\n    }\n    applyStyles(styles) {\n        this.styles = styles;\n        this.updateStyles();\n    }\n    updateStyles() {\n        if (this.ui) {\n            const { quickInputTitleBackground, quickInputBackground, quickInputForeground, widgetBorder, widgetShadow, } = this.styles.widget;\n            this.ui.titleBar.style.backgroundColor = quickInputTitleBackground ?? '';\n            this.ui.container.style.backgroundColor = quickInputBackground ?? '';\n            this.ui.container.style.color = quickInputForeground ?? '';\n            this.ui.container.style.border = widgetBorder ? `1px solid ${widgetBorder}` : '';\n            this.ui.container.style.boxShadow = widgetShadow ? `0 0 8px 2px ${widgetShadow}` : '';\n            this.ui.list.style(this.styles.list);\n            this.ui.tree.tree.style(this.styles.list);\n            const content = [];\n            if (this.styles.pickerGroup.pickerGroupBorder) {\n                content.push(`.quick-input-list .quick-input-list-entry { border-top-color:  ${this.styles.pickerGroup.pickerGroupBorder}; }`);\n            }\n            if (this.styles.pickerGroup.pickerGroupForeground) {\n                content.push(`.quick-input-list .quick-input-list-separator { color:  ${this.styles.pickerGroup.pickerGroupForeground}; }`);\n            }\n            if (this.styles.pickerGroup.pickerGroupForeground) {\n                content.push(`.quick-input-list .quick-input-list-separator-as-item { color: var(--vscode-descriptionForeground); }`);\n            }\n            if (this.styles.keybindingLabel.keybindingLabelBackground ||\n                this.styles.keybindingLabel.keybindingLabelBorder ||\n                this.styles.keybindingLabel.keybindingLabelBottomBorder ||\n                this.styles.keybindingLabel.keybindingLabelShadow ||\n                this.styles.keybindingLabel.keybindingLabelForeground) {\n                content.push('.quick-input-list .monaco-keybinding > .monaco-keybinding-key {');\n                if (this.styles.keybindingLabel.keybindingLabelBackground) {\n                    content.push(`background-color: ${this.styles.keybindingLabel.keybindingLabelBackground};`);\n                }\n                if (this.styles.keybindingLabel.keybindingLabelBorder) {\n                    // Order matters here. `border-color` must come before `border-bottom-color`.\n                    content.push(`border-color: ${this.styles.keybindingLabel.keybindingLabelBorder};`);\n                }\n                if (this.styles.keybindingLabel.keybindingLabelBottomBorder) {\n                    content.push(`border-bottom-color: ${this.styles.keybindingLabel.keybindingLabelBottomBorder};`);\n                }\n                if (this.styles.keybindingLabel.keybindingLabelShadow) {\n                    content.push(`box-shadow: inset 0 -1px 0 ${this.styles.keybindingLabel.keybindingLabelShadow};`);\n                }\n                if (this.styles.keybindingLabel.keybindingLabelForeground) {\n                    content.push(`color: ${this.styles.keybindingLabel.keybindingLabelForeground};`);\n                }\n                content.push('}');\n            }\n            const newStyles = content.join('\\n');\n            if (newStyles !== this.ui.styleSheet.textContent) {\n                this.ui.styleSheet.textContent = newStyles;\n            }\n        }\n    }\n    loadViewState() {\n        try {\n            const data = JSON.parse(this.storageService.get(VIEWSTATE_STORAGE_KEY, -1 /* StorageScope.APPLICATION */, '{}'));\n            if (data.top !== undefined || data.left !== undefined) {\n                return data;\n            }\n        }\n        catch { }\n        return undefined;\n    }\n    saveViewState(viewState) {\n        const isMainWindow = this.layoutService.activeContainer === this.layoutService.mainContainer;\n        if (!isMainWindow) {\n            return;\n        }\n        if (viewState !== undefined) {\n            this.storageService.store(VIEWSTATE_STORAGE_KEY, JSON.stringify(viewState), -1 /* StorageScope.APPLICATION */, 1 /* StorageTarget.MACHINE */);\n        }\n        else {\n            this.storageService.remove(VIEWSTATE_STORAGE_KEY, -1 /* StorageScope.APPLICATION */);\n        }\n    }\n};\nQuickInputController = QuickInputController_1 = __decorate([\n    __param(1, ILayoutService),\n    __param(2, IInstantiationService),\n    __param(3, IContextKeyService),\n    __param(4, IStorageService)\n], QuickInputController);\nlet QuickInputDragAndDropController = class QuickInputDragAndDropController extends Disposable {\n    constructor(_container, _quickInputContainer, _quickInputDragAreas, initialViewState, _layoutService, contextKeyService, configurationService) {\n        super();\n        this._container = _container;\n        this._quickInputContainer = _quickInputContainer;\n        this._quickInputDragAreas = _quickInputDragAreas;\n        this._layoutService = _layoutService;\n        this.configurationService = configurationService;\n        this.dndViewState = observableValue(this, undefined);\n        this._snapThreshold = 20;\n        this._snapLineHorizontalRatio = 0.25;\n        this._quickInputAlignmentContext = QuickInputAlignmentContextKey.bindTo(contextKeyService);\n        const customWindowControls = getWindowControlsStyle(this.configurationService) === \"custom\" /* WindowControlsStyle.CUSTOM */;\n        // Do not allow the widget to overflow or underflow window controls.\n        // Use CSS calculations to avoid having to force layout with `.clientWidth`\n        this._controlsOnLeft = customWindowControls && platform === 1 /* Platform.Mac */;\n        this._controlsOnRight = customWindowControls && (platform === 3 /* Platform.Windows */ || platform === 2 /* Platform.Linux */);\n        this._registerLayoutListener();\n        this.registerMouseListeners();\n        this.dndViewState.set({ ...initialViewState, done: true }, undefined);\n    }\n    reparentUI(container) {\n        this._container = container;\n    }\n    layoutContainer(dimension = this._layoutService.activeContainerDimension) {\n        const state = this.dndViewState.get();\n        const dragAreaRect = this._quickInputContainer.getBoundingClientRect();\n        if (state?.top && state?.left) {\n            const a = Math.round(state.left * 1e2) / 1e2;\n            const b = dimension.width;\n            const c = dragAreaRect.width;\n            const d = a * b - c / 2;\n            this._layout(state.top * dimension.height, d);\n        }\n    }\n    _registerLayoutListener() {\n        this._register(Event.filter(this._layoutService.onDidLayoutContainer, e => e.container === this._container)((e) => this.layoutContainer(e.dimension)));\n    }\n    registerMouseListeners() {\n        const dragArea = this._quickInputContainer;\n        // Double click\n        this._register(addDisposableGenericMouseUpListener(dragArea, (event) => {\n            const originEvent = new StandardMouseEvent(getWindow(dragArea), event);\n            if (originEvent.detail !== 2) {\n                return;\n            }\n            // Ignore event if the target is not the drag area\n            if (!this._quickInputDragAreas.some(({ node, includeChildren }) => includeChildren ? isAncestor(originEvent.target, node) : originEvent.target === node)) {\n                return;\n            }\n            this.dndViewState.set({ top: undefined, left: undefined, done: true }, undefined);\n        }));\n        // Mouse down\n        this._register(addDisposableGenericMouseDownListener(dragArea, (e) => {\n            const activeWindow = getWindow(this._layoutService.activeContainer);\n            const originEvent = new StandardMouseEvent(activeWindow, e);\n            // Ignore event if the target is not the drag area\n            if (!this._quickInputDragAreas.some(({ node, includeChildren }) => includeChildren ? isAncestor(originEvent.target, node) : originEvent.target === node)) {\n                return;\n            }\n            // Mouse position offset relative to dragArea\n            const dragAreaRect = this._quickInputContainer.getBoundingClientRect();\n            const dragOffsetX = originEvent.browserEvent.clientX - dragAreaRect.left;\n            const dragOffsetY = originEvent.browserEvent.clientY - dragAreaRect.top;\n            let isMovingQuickInput = false;\n            const mouseMoveListener = addDisposableGenericMouseMoveListener(activeWindow, (e) => {\n                const mouseMoveEvent = new StandardMouseEvent(activeWindow, e);\n                mouseMoveEvent.preventDefault();\n                if (!isMovingQuickInput) {\n                    isMovingQuickInput = true;\n                }\n                this._layout(e.clientY - dragOffsetY, e.clientX - dragOffsetX);\n            });\n            const mouseUpListener = addDisposableGenericMouseUpListener(activeWindow, (e) => {\n                if (isMovingQuickInput) {\n                    // Save position\n                    const state = this.dndViewState.get();\n                    this.dndViewState.set({ top: state?.top, left: state?.left, done: true }, undefined);\n                }\n                // Dispose listeners\n                mouseMoveListener.dispose();\n                mouseUpListener.dispose();\n            });\n        }));\n    }\n    _layout(topCoordinate, leftCoordinate) {\n        const snapCoordinateYTop = this._getTopSnapValue();\n        const snapCoordinateY = this._getCenterYSnapValue();\n        const snapCoordinateX = this._getCenterXSnapValue();\n        // Make sure the quick input is not moved outside the container\n        topCoordinate = Math.max(0, Math.min(topCoordinate, this._container.clientHeight - this._quickInputContainer.clientHeight));\n        if (topCoordinate < this._layoutService.activeContainerOffset.top) {\n            if (this._controlsOnLeft) {\n                leftCoordinate = Math.max(leftCoordinate, 80 / getZoomFactor(getActiveWindow()));\n            }\n            else if (this._controlsOnRight) {\n                leftCoordinate = Math.min(leftCoordinate, this._container.clientWidth - this._quickInputContainer.clientWidth - (140 / getZoomFactor(getActiveWindow())));\n            }\n        }\n        const snappingToTop = Math.abs(topCoordinate - snapCoordinateYTop) < this._snapThreshold;\n        topCoordinate = snappingToTop ? snapCoordinateYTop : topCoordinate;\n        const snappingToCenter = Math.abs(topCoordinate - snapCoordinateY) < this._snapThreshold;\n        topCoordinate = snappingToCenter ? snapCoordinateY : topCoordinate;\n        const top = topCoordinate / this._container.clientHeight;\n        // Make sure the quick input is not moved outside the container\n        leftCoordinate = Math.max(0, Math.min(leftCoordinate, this._container.clientWidth - this._quickInputContainer.clientWidth));\n        const snappingToCenterX = Math.abs(leftCoordinate - snapCoordinateX) < this._snapThreshold;\n        leftCoordinate = snappingToCenterX ? snapCoordinateX : leftCoordinate;\n        const b = this._container.clientWidth;\n        const c = this._quickInputContainer.clientWidth;\n        const d = leftCoordinate;\n        const left = (d + c / 2) / b;\n        this.dndViewState.set({ top, left, done: false }, undefined);\n        if (snappingToCenterX) {\n            if (snappingToTop) {\n                this._quickInputAlignmentContext.set('top');\n                return;\n            }\n            else if (snappingToCenter) {\n                this._quickInputAlignmentContext.set('center');\n                return;\n            }\n        }\n        this._quickInputAlignmentContext.set(undefined);\n    }\n    _getTopSnapValue() {\n        return this._layoutService.activeContainerOffset.quickPickTop;\n    }\n    _getCenterYSnapValue() {\n        return Math.round(this._container.clientHeight * this._snapLineHorizontalRatio);\n    }\n    _getCenterXSnapValue() {\n        return Math.round(this._container.clientWidth / 2) - Math.round(this._quickInputContainer.clientWidth / 2);\n    }\n};\nQuickInputDragAndDropController = __decorate([\n    __param(4, ILayoutService),\n    __param(5, IContextKeyService),\n    __param(6, IConfigurationService)\n], QuickInputDragAndDropController);\n\nexport { QuickInputController };\n","import { CancellationToken } from '../../../base/common/cancellation.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { IContextKeyService, RawContextKey } from '../../contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../instantiation/common/instantiation.js';\nimport { ILayoutService } from '../../layout/browser/layoutService.js';\nimport { IOpenerService } from '../../opener/common/opener.js';\nimport { QuickAccessController } from './quickAccess.js';\nimport { getListStyles, defaultKeybindingLabelStyles, defaultProgressBarStyles, defaultButtonStyles, defaultCountBadgeStyles, defaultToggleStyles, defaultInputBoxStyles } from '../../theme/browser/defaultStyles.js';\nimport { asCssVariable } from '../../theme/common/colorUtils.js';\nimport { activeContrastBorder } from '../../theme/common/colors/baseColors.js';\nimport '../../theme/common/colors/chartsColors.js';\nimport { widgetShadow, widgetBorder } from '../../theme/common/colors/editorColors.js';\nimport '../../theme/common/colors/inputColors.js';\nimport '../../theme/common/colors/listColors.js';\nimport '../../theme/common/colors/menuColors.js';\nimport '../../theme/common/colors/minimapColors.js';\nimport '../../theme/common/colors/miscColors.js';\nimport { pickerGroupForeground, pickerGroupBorder, quickInputBackground, quickInputListFocusBackground, quickInputListFocusIconForeground, quickInputListFocusForeground, quickInputTitleBackground, quickInputForeground } from '../../theme/common/colors/quickpickColors.js';\nimport '../../theme/common/colors/searchColors.js';\nimport { IThemeService, Themable } from '../../theme/common/themeService.js';\nimport { QuickInputHoverDelegate } from './quickInput.js';\nimport { QuickInputController } from './quickInputController.js';\nimport { IConfigurationService } from '../../configuration/common/configuration.js';\nimport { getWindow } from '../../../base/browser/dom.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet QuickInputService = class QuickInputService extends Themable {\n    get controller() {\n        if (!this._controller) {\n            this._controller = this._register(this.createController());\n        }\n        return this._controller;\n    }\n    get hasController() { return !!this._controller; }\n    get currentQuickInput() { return this.controller.currentQuickInput; }\n    get quickAccess() {\n        if (!this._quickAccess) {\n            this._quickAccess = this._register(this.instantiationService.createInstance(QuickAccessController));\n        }\n        return this._quickAccess;\n    }\n    constructor(instantiationService, contextKeyService, themeService, layoutService, configurationService) {\n        super(themeService);\n        this.instantiationService = instantiationService;\n        this.contextKeyService = contextKeyService;\n        this.layoutService = layoutService;\n        this.configurationService = configurationService;\n        this._onShow = this._register(new Emitter());\n        this._onHide = this._register(new Emitter());\n        this.contexts = new Map();\n    }\n    createController(host = this.layoutService, options) {\n        const defaultOptions = {\n            idPrefix: 'quickInput_',\n            container: host.activeContainer,\n            ignoreFocusOut: () => false,\n            backKeybindingLabel: () => undefined,\n            setContextKey: (id) => this.setContextKey(id),\n            linkOpenerDelegate: (content) => {\n                // HACK: https://github.com/microsoft/vscode/issues/173691\n                this.instantiationService.invokeFunction(accessor => {\n                    const openerService = accessor.get(IOpenerService);\n                    openerService.open(content, { allowCommands: true, fromUserGesture: true });\n                });\n            },\n            returnFocus: () => host.focus(),\n            styles: this.computeStyles(),\n            hoverDelegate: this._register(this.instantiationService.createInstance(QuickInputHoverDelegate))\n        };\n        const controller = this._register(this.instantiationService.createInstance(QuickInputController, {\n            ...defaultOptions,\n            ...options\n        }));\n        controller.layout(host.activeContainerDimension, host.activeContainerOffset.quickPickTop);\n        // Layout changes\n        this._register(host.onDidLayoutActiveContainer(dimension => {\n            if (getWindow(host.activeContainer) === getWindow(controller.container)) {\n                controller.layout(dimension, host.activeContainerOffset.quickPickTop);\n            }\n        }));\n        this._register(host.onDidChangeActiveContainer(() => {\n            if (controller.isVisible()) {\n                return;\n            }\n            controller.layout(host.activeContainerDimension, host.activeContainerOffset.quickPickTop);\n        }));\n        // Context keys\n        this._register(controller.onShow(() => {\n            this.resetContextKeys();\n            this._onShow.fire();\n        }));\n        this._register(controller.onHide(() => {\n            this.resetContextKeys();\n            this._onHide.fire();\n        }));\n        return controller;\n    }\n    setContextKey(id) {\n        let key;\n        if (id) {\n            key = this.contexts.get(id);\n            if (!key) {\n                key = new RawContextKey(id, false)\n                    .bindTo(this.contextKeyService);\n                this.contexts.set(id, key);\n            }\n        }\n        if (key && key.get()) {\n            return; // already active context\n        }\n        this.resetContextKeys();\n        key?.set(true);\n    }\n    resetContextKeys() {\n        this.contexts.forEach(context => {\n            if (context.get()) {\n                context.reset();\n            }\n        });\n    }\n    pick(picks, options, token = CancellationToken.None) {\n        return this.controller.pick(picks, options, token);\n    }\n    input(options = {}, token = CancellationToken.None) {\n        return this.controller.input(options, token);\n    }\n    createQuickPick(options = { useSeparators: false }) {\n        return this.controller.createQuickPick(options);\n    }\n    createInputBox() {\n        return this.controller.createInputBox();\n    }\n    toggleHover() {\n        if (this.hasController) {\n            this.controller.toggleHover();\n        }\n    }\n    updateStyles() {\n        if (this.hasController) {\n            this.controller.applyStyles(this.computeStyles());\n        }\n    }\n    computeStyles() {\n        return {\n            widget: {\n                quickInputBackground: asCssVariable(quickInputBackground),\n                quickInputForeground: asCssVariable(quickInputForeground),\n                quickInputTitleBackground: asCssVariable(quickInputTitleBackground),\n                widgetBorder: asCssVariable(widgetBorder),\n                widgetShadow: asCssVariable(widgetShadow),\n            },\n            inputBox: defaultInputBoxStyles,\n            toggle: defaultToggleStyles,\n            countBadge: defaultCountBadgeStyles,\n            button: defaultButtonStyles,\n            progressBar: defaultProgressBarStyles,\n            keybindingLabel: defaultKeybindingLabelStyles,\n            list: getListStyles({\n                listBackground: quickInputBackground,\n                listFocusBackground: quickInputListFocusBackground,\n                listFocusForeground: quickInputListFocusForeground,\n                // Look like focused when inactive.\n                listInactiveFocusForeground: quickInputListFocusForeground,\n                listInactiveSelectionIconForeground: quickInputListFocusIconForeground,\n                listInactiveFocusBackground: quickInputListFocusBackground,\n                listFocusOutline: activeContrastBorder,\n                listInactiveFocusOutline: activeContrastBorder,\n                treeStickyScrollBackground: quickInputBackground,\n            }),\n            pickerGroup: {\n                pickerGroupBorder: asCssVariable(pickerGroupBorder),\n                pickerGroupForeground: asCssVariable(pickerGroupForeground),\n            }\n        };\n    }\n};\nQuickInputService = __decorate([\n    __param(0, IInstantiationService),\n    __param(1, IContextKeyService),\n    __param(2, IThemeService),\n    __param(3, ILayoutService),\n    __param(4, IConfigurationService)\n], QuickInputService);\n\nexport { QuickInputService };\n","import './standaloneQuickInput.css';\nimport { Event } from '../../../../base/common/event.js';\nimport { registerEditorContribution } from '../../../browser/editorExtensions.js';\nimport { IThemeService } from '../../../../platform/theme/common/themeService.js';\nimport { CancellationToken } from '../../../../base/common/cancellation.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { EditorScopedLayoutService } from '../standaloneLayoutService.js';\nimport { ICodeEditorService } from '../../../browser/services/codeEditorService.js';\nimport { QuickInputService } from '../../../../platform/quickinput/browser/quickInputService.js';\nimport { createSingleCallFunction } from '../../../../base/common/functional.js';\nimport { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet EditorScopedQuickInputService = class EditorScopedQuickInputService extends QuickInputService {\n    constructor(editor, instantiationService, contextKeyService, themeService, codeEditorService, configurationService) {\n        super(instantiationService, contextKeyService, themeService, new EditorScopedLayoutService(editor.getContainerDomNode(), codeEditorService), configurationService);\n        this.host = undefined;\n        // Use the passed in code editor as host for the quick input widget\n        const contribution = QuickInputEditorContribution.get(editor);\n        if (contribution) {\n            const widget = contribution.widget;\n            this.host = {\n                _serviceBrand: undefined,\n                get mainContainer() { return widget.getDomNode(); },\n                getContainer() { return widget.getDomNode(); },\n                whenContainerStylesLoaded() { return undefined; },\n                get containers() { return [widget.getDomNode()]; },\n                get activeContainer() { return widget.getDomNode(); },\n                get mainContainerDimension() { return editor.getLayoutInfo(); },\n                get activeContainerDimension() { return editor.getLayoutInfo(); },\n                get onDidLayoutMainContainer() { return editor.onDidLayoutChange; },\n                get onDidLayoutActiveContainer() { return editor.onDidLayoutChange; },\n                get onDidLayoutContainer() { return Event.map(editor.onDidLayoutChange, dimension => ({ container: widget.getDomNode(), dimension })); },\n                get onDidChangeActiveContainer() { return Event.None; },\n                get onDidAddContainer() { return Event.None; },\n                get mainContainerOffset() { return { top: 0, quickPickTop: 0 }; },\n                get activeContainerOffset() { return { top: 0, quickPickTop: 0 }; },\n                focus: () => editor.focus()\n            };\n        }\n        else {\n            this.host = undefined;\n        }\n    }\n    createController() {\n        return super.createController(this.host);\n    }\n};\nEditorScopedQuickInputService = __decorate([\n    __param(1, IInstantiationService),\n    __param(2, IContextKeyService),\n    __param(3, IThemeService),\n    __param(4, ICodeEditorService),\n    __param(5, IConfigurationService)\n], EditorScopedQuickInputService);\nlet StandaloneQuickInputService = class StandaloneQuickInputService {\n    get activeService() {\n        const editor = this.codeEditorService.getFocusedCodeEditor();\n        if (!editor) {\n            throw new Error('Quick input service needs a focused editor to work.');\n        }\n        // Find the quick input implementation for the focused\n        // editor or create it lazily if not yet created\n        let quickInputService = this.mapEditorToService.get(editor);\n        if (!quickInputService) {\n            const newQuickInputService = quickInputService = this.instantiationService.createInstance(EditorScopedQuickInputService, editor);\n            this.mapEditorToService.set(editor, quickInputService);\n            createSingleCallFunction(editor.onDidDispose)(() => {\n                newQuickInputService.dispose();\n                this.mapEditorToService.delete(editor);\n            });\n        }\n        return quickInputService;\n    }\n    get currentQuickInput() { return this.activeService.currentQuickInput; }\n    get quickAccess() { return this.activeService.quickAccess; }\n    constructor(instantiationService, codeEditorService) {\n        this.instantiationService = instantiationService;\n        this.codeEditorService = codeEditorService;\n        this.mapEditorToService = new Map();\n    }\n    pick(picks, options, token = CancellationToken.None) {\n        return this.activeService /* TS fail */.pick(picks, options, token);\n    }\n    input(options, token) {\n        return this.activeService.input(options, token);\n    }\n    createQuickPick(options = { useSeparators: false }) {\n        return this.activeService.createQuickPick(options);\n    }\n    createInputBox() {\n        return this.activeService.createInputBox();\n    }\n    toggleHover() {\n        return this.activeService.toggleHover();\n    }\n};\nStandaloneQuickInputService = __decorate([\n    __param(0, IInstantiationService),\n    __param(1, ICodeEditorService)\n], StandaloneQuickInputService);\nclass QuickInputEditorContribution {\n    static { this.ID = 'editor.controller.quickInput'; }\n    static get(editor) {\n        return editor.getContribution(QuickInputEditorContribution.ID);\n    }\n    constructor(editor) {\n        this.editor = editor;\n        this.widget = new QuickInputEditorWidget(this.editor);\n    }\n    dispose() {\n        this.widget.dispose();\n    }\n}\nclass QuickInputEditorWidget {\n    static { this.ID = 'editor.contrib.quickInputWidget'; }\n    constructor(codeEditor) {\n        this.codeEditor = codeEditor;\n        this.domNode = document.createElement('div');\n        this.codeEditor.addOverlayWidget(this);\n    }\n    getId() {\n        return QuickInputEditorWidget.ID;\n    }\n    getDomNode() {\n        return this.domNode;\n    }\n    getPosition() {\n        return { preference: { top: 0, left: 0 } };\n    }\n    dispose() {\n        this.codeEditor.removeOverlayWidget(this);\n    }\n}\nregisterEditorContribution(QuickInputEditorContribution.ID, QuickInputEditorContribution, 4 /* EditorContributionInstantiation.Lazy */);\n\nexport { QuickInputEditorContribution, QuickInputEditorWidget, StandaloneQuickInputService };\n","import { addDisposableListener } from '../../../base/browser/dom.js';\nimport { mainWindow } from '../../../base/browser/window.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from '../common/accessibility.js';\nimport { IConfigurationService } from '../../configuration/common/configuration.js';\nimport { IContextKeyService } from '../../contextkey/common/contextkey.js';\nimport { ILayoutService } from '../../layout/browser/layoutService.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet AccessibilityService = class AccessibilityService extends Disposable {\n    constructor(_contextKeyService, _layoutService, _configurationService) {\n        super();\n        this._contextKeyService = _contextKeyService;\n        this._layoutService = _layoutService;\n        this._configurationService = _configurationService;\n        this._accessibilitySupport = 0 /* AccessibilitySupport.Unknown */;\n        this._onDidChangeScreenReaderOptimized = new Emitter();\n        this._onDidChangeReducedMotion = new Emitter();\n        this._onDidChangeLinkUnderline = new Emitter();\n        this._accessibilityModeEnabledContext = CONTEXT_ACCESSIBILITY_MODE_ENABLED.bindTo(this._contextKeyService);\n        const updateContextKey = () => this._accessibilityModeEnabledContext.set(this.isScreenReaderOptimized());\n        this._register(this._configurationService.onDidChangeConfiguration(e => {\n            if (e.affectsConfiguration('editor.accessibilitySupport')) {\n                updateContextKey();\n                this._onDidChangeScreenReaderOptimized.fire();\n            }\n            if (e.affectsConfiguration('workbench.reduceMotion')) {\n                this._configMotionReduced = this._configurationService.getValue('workbench.reduceMotion');\n                this._onDidChangeReducedMotion.fire();\n            }\n        }));\n        updateContextKey();\n        this._register(this.onDidChangeScreenReaderOptimized(() => updateContextKey()));\n        const reduceMotionMatcher = mainWindow.matchMedia(`(prefers-reduced-motion: reduce)`);\n        this._systemMotionReduced = reduceMotionMatcher.matches;\n        this._configMotionReduced = this._configurationService.getValue('workbench.reduceMotion');\n        this._linkUnderlinesEnabled = this._configurationService.getValue('accessibility.underlineLinks');\n        this.initReducedMotionListeners(reduceMotionMatcher);\n        this.initLinkUnderlineListeners();\n    }\n    initReducedMotionListeners(reduceMotionMatcher) {\n        this._register(addDisposableListener(reduceMotionMatcher, 'change', () => {\n            this._systemMotionReduced = reduceMotionMatcher.matches;\n            if (this._configMotionReduced === 'auto') {\n                this._onDidChangeReducedMotion.fire();\n            }\n        }));\n        const updateRootClasses = () => {\n            const reduce = this.isMotionReduced();\n            this._layoutService.mainContainer.classList.toggle('monaco-reduce-motion', reduce);\n            this._layoutService.mainContainer.classList.toggle('monaco-enable-motion', !reduce);\n        };\n        updateRootClasses();\n        this._register(this.onDidChangeReducedMotion(() => updateRootClasses()));\n    }\n    initLinkUnderlineListeners() {\n        this._register(this._configurationService.onDidChangeConfiguration(e => {\n            if (e.affectsConfiguration('accessibility.underlineLinks')) {\n                const linkUnderlinesEnabled = this._configurationService.getValue('accessibility.underlineLinks');\n                this._linkUnderlinesEnabled = linkUnderlinesEnabled;\n                this._onDidChangeLinkUnderline.fire();\n            }\n        }));\n        const updateLinkUnderlineClasses = () => {\n            const underlineLinks = this._linkUnderlinesEnabled;\n            this._layoutService.mainContainer.classList.toggle('underline-links', underlineLinks);\n        };\n        updateLinkUnderlineClasses();\n        this._register(this.onDidChangeLinkUnderlines(() => updateLinkUnderlineClasses()));\n    }\n    onDidChangeLinkUnderlines(listener) {\n        return this._onDidChangeLinkUnderline.event(listener);\n    }\n    get onDidChangeScreenReaderOptimized() {\n        return this._onDidChangeScreenReaderOptimized.event;\n    }\n    isScreenReaderOptimized() {\n        const config = this._configurationService.getValue('editor.accessibilitySupport');\n        return config === 'on' || (config === 'auto' && this._accessibilitySupport === 2 /* AccessibilitySupport.Enabled */);\n    }\n    get onDidChangeReducedMotion() {\n        return this._onDidChangeReducedMotion.event;\n    }\n    isMotionReduced() {\n        const config = this._configMotionReduced;\n        return config === 'on' || (config === 'auto' && this._systemMotionReduced);\n    }\n    getAccessibilitySupport() {\n        return this._accessibilitySupport;\n    }\n};\nAccessibilityService = __decorate([\n    __param(0, IContextKeyService),\n    __param(1, ILayoutService),\n    __param(2, IConfigurationService)\n], AccessibilityService);\n\nexport { AccessibilityService };\n","import { isSafari, isWebkitWebView } from '../../../base/browser/browser.js';\nimport { onDidRegisterWindow, addDisposableListener, getActiveWindow, getActiveDocument, $, isHTMLElement } from '../../../base/browser/dom.js';\nimport { mainWindow } from '../../../base/browser/window.js';\nimport { DeferredPromise } from '../../../base/common/async.js';\nimport { Event } from '../../../base/common/event.js';\nimport { hash } from '../../../base/common/hash.js';\nimport { Disposable } from '../../../base/common/lifecycle.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { ILayoutService } from '../../layout/browser/layoutService.js';\nimport { ILogService } from '../../log/common/log.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar BrowserClipboardService_1;\n/**\n * Custom mime type used for storing a list of uris in the clipboard.\n *\n * Requires support for custom web clipboards https://github.com/w3c/clipboard-apis/pull/175\n */\nconst vscodeResourcesMime = 'application/vnd.code.resources';\nlet BrowserClipboardService = class BrowserClipboardService extends Disposable {\n    static { BrowserClipboardService_1 = this; }\n    constructor(layoutService, logService) {\n        super();\n        this.layoutService = layoutService;\n        this.logService = logService;\n        this.mapTextToType = new Map(); // unsupported in web (only in-memory)\n        this.findText = ''; // unsupported in web (only in-memory)\n        this.resources = []; // unsupported in web (only in-memory)\n        this.resourcesStateHash = undefined;\n        if (isSafari || isWebkitWebView) {\n            this.installWebKitWriteTextWorkaround();\n        }\n        // Keep track of copy operations to reset our set of\n        // copied resources: since we keep resources in memory\n        // and not in the clipboard, we have to invalidate\n        // that state when the user copies other data.\n        this._register(Event.runAndSubscribe(onDidRegisterWindow, ({ window, disposables }) => {\n            disposables.add(addDisposableListener(window.document, 'copy', () => this.clearResourcesState()));\n        }, { window: mainWindow, disposables: this._store }));\n    }\n    triggerPaste() {\n        this.logService.trace('BrowserClipboardService#triggerPaste');\n        return undefined;\n    }\n    // In Safari, it has the following note:\n    //\n    // \"The request to write to the clipboard must be triggered during a user gesture.\n    // A call to clipboard.write or clipboard.writeText outside the scope of a user\n    // gesture(such as \"click\" or \"touch\" event handlers) will result in the immediate\n    // rejection of the promise returned by the API call.\"\n    // From: https://webkit.org/blog/10855/async-clipboard-api/\n    //\n    // Since extensions run in a web worker, and handle gestures in an asynchronous way,\n    // they are not classified by Safari as \"in response to a user gesture\" and will reject.\n    //\n    // This function sets up some handlers to work around that behavior.\n    installWebKitWriteTextWorkaround() {\n        const handler = () => {\n            const currentWritePromise = new DeferredPromise();\n            // Cancel the previous promise since we just created a new one in response to this new event\n            if (this.webKitPendingClipboardWritePromise && !this.webKitPendingClipboardWritePromise.isSettled) {\n                this.webKitPendingClipboardWritePromise.cancel();\n            }\n            this.webKitPendingClipboardWritePromise = currentWritePromise;\n            // The ctor of ClipboardItem allows you to pass in a promise that will resolve to a string.\n            // This allows us to pass in a Promise that will either be cancelled by another event or\n            // resolved with the contents of the first call to this.writeText.\n            // see https://developer.mozilla.org/en-US/docs/Web/API/ClipboardItem/ClipboardItem#parameters\n            getActiveWindow().navigator.clipboard.write([new ClipboardItem({\n                    'text/plain': currentWritePromise.p,\n                })]).catch(async (err) => {\n                if (!(err instanceof Error) || err.name !== 'NotAllowedError' || !currentWritePromise.isRejected) {\n                    this.logService.error(err);\n                }\n            });\n        };\n        this._register(Event.runAndSubscribe(this.layoutService.onDidAddContainer, ({ container, disposables }) => {\n            disposables.add(addDisposableListener(container, 'click', handler));\n            disposables.add(addDisposableListener(container, 'keydown', handler));\n        }, { container: this.layoutService.mainContainer, disposables: this._store }));\n    }\n    async writeText(text, type) {\n        this.logService.trace('BrowserClipboardService#writeText called with type:', type, ' text.length:', text.length);\n        // Clear resources given we are writing text\n        this.clearResourcesState();\n        // With type: only in-memory is supported\n        if (type) {\n            this.mapTextToType.set(type, text);\n            this.logService.trace('BrowserClipboardService#writeText');\n            return;\n        }\n        if (this.webKitPendingClipboardWritePromise) {\n            // For Safari, we complete this Promise which allows the call to `navigator.clipboard.write()`\n            // above to resolve and successfully copy to the clipboard. If we let this continue, Safari\n            // would throw an error because this call stack doesn't appear to originate from a user gesture.\n            return this.webKitPendingClipboardWritePromise.complete(text);\n        }\n        // Guard access to navigator.clipboard with try/catch\n        // as we have seen DOMExceptions in certain browsers\n        // due to security policies.\n        try {\n            this.logService.trace('before navigator.clipboard.writeText');\n            return await getActiveWindow().navigator.clipboard.writeText(text);\n        }\n        catch (error) {\n            console.error(error);\n        }\n        // Fallback to textarea and execCommand solution\n        this.fallbackWriteText(text);\n    }\n    fallbackWriteText(text) {\n        this.logService.trace('BrowserClipboardService#fallbackWriteText');\n        const activeDocument = getActiveDocument();\n        const activeElement = activeDocument.activeElement;\n        const textArea = activeDocument.body.appendChild($('textarea', { 'aria-hidden': true }));\n        textArea.style.height = '1px';\n        textArea.style.width = '1px';\n        textArea.style.position = 'absolute';\n        textArea.value = text;\n        textArea.focus();\n        textArea.select();\n        activeDocument.execCommand('copy');\n        if (isHTMLElement(activeElement)) {\n            activeElement.focus();\n        }\n        textArea.remove();\n    }\n    async readText(type) {\n        this.logService.trace('BrowserClipboardService#readText called with type:', type);\n        // With type: only in-memory is supported\n        if (type) {\n            const readText = this.mapTextToType.get(type) || '';\n            this.logService.trace('BrowserClipboardService#readText text.length:', readText.length);\n            return readText;\n        }\n        // Guard access to navigator.clipboard with try/catch\n        // as we have seen DOMExceptions in certain browsers\n        // due to security policies.\n        try {\n            const readText = await getActiveWindow().navigator.clipboard.readText();\n            this.logService.trace('BrowserClipboardService#readText text.length:', readText.length);\n            return readText;\n        }\n        catch (error) {\n            console.error(error);\n        }\n        return '';\n    }\n    async readFindText() {\n        return this.findText;\n    }\n    async writeFindText(text) {\n        this.findText = text;\n    }\n    static { this.MAX_RESOURCE_STATE_SOURCE_LENGTH = 1000; }\n    async readResources() {\n        // Guard access to navigator.clipboard with try/catch\n        // as we have seen DOMExceptions in certain browsers\n        // due to security policies.\n        try {\n            const items = await getActiveWindow().navigator.clipboard.read();\n            for (const item of items) {\n                if (item.types.includes(`web ${vscodeResourcesMime}`)) {\n                    const blob = await item.getType(`web ${vscodeResourcesMime}`);\n                    const resources = JSON.parse(await blob.text()).map(x => URI.from(x));\n                    return resources;\n                }\n            }\n        }\n        catch (error) {\n            // Noop\n        }\n        const resourcesStateHash = await this.computeResourcesStateHash();\n        if (this.resourcesStateHash !== resourcesStateHash) {\n            this.clearResourcesState(); // state mismatch, resources no longer valid\n        }\n        return this.resources;\n    }\n    async computeResourcesStateHash() {\n        if (this.resources.length === 0) {\n            return undefined; // no resources, no hash needed\n        }\n        // Resources clipboard is managed in-memory only and thus\n        // fails to invalidate when clipboard data is changing.\n        // As such, we compute the hash of the current clipboard\n        // and use that to later validate the resources clipboard.\n        const clipboardText = await this.readText();\n        return hash(clipboardText.substring(0, BrowserClipboardService_1.MAX_RESOURCE_STATE_SOURCE_LENGTH));\n    }\n    clearInternalState() {\n        this.clearResourcesState();\n    }\n    clearResourcesState() {\n        this.resources = [];\n        this.resourcesStateHash = undefined;\n    }\n};\nBrowserClipboardService = BrowserClipboardService_1 = __decorate([\n    __param(0, ILayoutService),\n    __param(1, ILogService)\n], BrowserClipboardService);\n\nexport { BrowserClipboardService };\n","import { Event, PauseableEmitter } from '../../../base/common/event.js';\nimport { Iterable } from '../../../base/common/iterator.js';\nimport { MutableDisposable, DisposableStore, Disposable } from '../../../base/common/lifecycle.js';\nimport { cloneAndChange } from '../../../base/common/objects.js';\nimport { TernarySearchTree } from '../../../base/common/ternarySearchTree.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { localize } from '../../../nls.js';\nimport { CommandsRegistry } from '../../commands/common/commands.js';\nimport { IConfigurationService } from '../../configuration/common/configuration.js';\nimport { RawContextKey, IContextKeyService } from '../common/contextkey.js';\nimport { InputFocusedContext } from '../common/contextkeys.js';\nimport { mainWindow } from '../../../base/browser/window.js';\nimport { onDidRegisterWindow, addDisposableListener, EventType, trackFocus, getActiveWindow, isEditableElement } from '../../../base/browser/dom.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nconst KEYBINDING_CONTEXT_ATTR = 'data-keybinding-context';\nclass Context {\n    constructor(id, parent) {\n        this._id = id;\n        this._parent = parent;\n        this._value = Object.create(null);\n        this._value['_contextId'] = id;\n    }\n    get value() {\n        return { ...this._value };\n    }\n    setValue(key, value) {\n        // console.log('SET ' + key + ' = ' + value + ' ON ' + this._id);\n        if (this._value[key] !== value) {\n            this._value[key] = value;\n            return true;\n        }\n        return false;\n    }\n    removeValue(key) {\n        // console.log('REMOVE ' + key + ' FROM ' + this._id);\n        if (key in this._value) {\n            delete this._value[key];\n            return true;\n        }\n        return false;\n    }\n    getValue(key) {\n        const ret = this._value[key];\n        if (typeof ret === 'undefined' && this._parent) {\n            return this._parent.getValue(key);\n        }\n        return ret;\n    }\n}\nclass NullContext extends Context {\n    static { this.INSTANCE = new NullContext(); }\n    constructor() {\n        super(-1, null);\n    }\n    setValue(key, value) {\n        return false;\n    }\n    removeValue(key) {\n        return false;\n    }\n    getValue(key) {\n        return undefined;\n    }\n}\nclass ConfigAwareContextValuesContainer extends Context {\n    static { this._keyPrefix = 'config.'; }\n    constructor(id, _configurationService, emitter) {\n        super(id, null);\n        this._configurationService = _configurationService;\n        this._values = TernarySearchTree.forConfigKeys();\n        this._listener = this._configurationService.onDidChangeConfiguration(event => {\n            if (event.source === 7 /* ConfigurationTarget.DEFAULT */) {\n                // new setting, reset everything\n                const allKeys = Array.from(this._values, ([k]) => k);\n                this._values.clear();\n                emitter.fire(new ArrayContextKeyChangeEvent(allKeys));\n            }\n            else {\n                const changedKeys = [];\n                for (const configKey of event.affectedKeys) {\n                    const contextKey = `config.${configKey}`;\n                    const cachedItems = this._values.findSuperstr(contextKey);\n                    if (cachedItems !== undefined) {\n                        changedKeys.push(...Iterable.map(cachedItems, ([key]) => key));\n                        this._values.deleteSuperstr(contextKey);\n                    }\n                    if (this._values.has(contextKey)) {\n                        changedKeys.push(contextKey);\n                        this._values.delete(contextKey);\n                    }\n                }\n                emitter.fire(new ArrayContextKeyChangeEvent(changedKeys));\n            }\n        });\n    }\n    dispose() {\n        this._listener.dispose();\n    }\n    getValue(key) {\n        if (key.indexOf(ConfigAwareContextValuesContainer._keyPrefix) !== 0) {\n            return super.getValue(key);\n        }\n        if (this._values.has(key)) {\n            return this._values.get(key);\n        }\n        const configKey = key.substr(ConfigAwareContextValuesContainer._keyPrefix.length);\n        const configValue = this._configurationService.getValue(configKey);\n        let value = undefined;\n        switch (typeof configValue) {\n            case 'number':\n            case 'boolean':\n            case 'string':\n                value = configValue;\n                break;\n            default:\n                if (Array.isArray(configValue)) {\n                    value = JSON.stringify(configValue);\n                }\n                else {\n                    value = configValue;\n                }\n        }\n        this._values.set(key, value);\n        return value;\n    }\n    setValue(key, value) {\n        return super.setValue(key, value);\n    }\n    removeValue(key) {\n        return super.removeValue(key);\n    }\n}\nclass ContextKey {\n    constructor(service, key, defaultValue) {\n        this._service = service;\n        this._key = key;\n        this._defaultValue = defaultValue;\n        this.reset();\n    }\n    set(value) {\n        this._service.setContext(this._key, value);\n    }\n    reset() {\n        if (typeof this._defaultValue === 'undefined') {\n            this._service.removeContext(this._key);\n        }\n        else {\n            this._service.setContext(this._key, this._defaultValue);\n        }\n    }\n    get() {\n        return this._service.getContextKeyValue(this._key);\n    }\n}\nclass SimpleContextKeyChangeEvent {\n    constructor(key) {\n        this.key = key;\n    }\n    affectsSome(keys) {\n        return keys.has(this.key);\n    }\n    allKeysContainedIn(keys) {\n        return this.affectsSome(keys);\n    }\n}\nclass ArrayContextKeyChangeEvent {\n    constructor(keys) {\n        this.keys = keys;\n    }\n    affectsSome(keys) {\n        for (const key of this.keys) {\n            if (keys.has(key)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    allKeysContainedIn(keys) {\n        return this.keys.every(key => keys.has(key));\n    }\n}\nclass CompositeContextKeyChangeEvent {\n    constructor(events) {\n        this.events = events;\n    }\n    affectsSome(keys) {\n        for (const e of this.events) {\n            if (e.affectsSome(keys)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    allKeysContainedIn(keys) {\n        return this.events.every(evt => evt.allKeysContainedIn(keys));\n    }\n}\nfunction allEventKeysInContext(event, context) {\n    return event.allKeysContainedIn(new Set(Object.keys(context)));\n}\nclass AbstractContextKeyService extends Disposable {\n    get onDidChangeContext() { return this._onDidChangeContext.event; }\n    constructor(myContextId) {\n        super();\n        this._onDidChangeContext = this._register(new PauseableEmitter({ merge: input => new CompositeContextKeyChangeEvent(input) }));\n        this._isDisposed = false;\n        this._myContextId = myContextId;\n    }\n    createKey(key, defaultValue) {\n        if (this._isDisposed) {\n            throw new Error(`AbstractContextKeyService has been disposed`);\n        }\n        return new ContextKey(this, key, defaultValue);\n    }\n    bufferChangeEvents(callback) {\n        this._onDidChangeContext.pause();\n        try {\n            callback();\n        }\n        finally {\n            this._onDidChangeContext.resume();\n        }\n    }\n    createScoped(domNode) {\n        if (this._isDisposed) {\n            throw new Error(`AbstractContextKeyService has been disposed`);\n        }\n        return new ScopedContextKeyService(this, domNode);\n    }\n    contextMatchesRules(rules) {\n        if (this._isDisposed) {\n            throw new Error(`AbstractContextKeyService has been disposed`);\n        }\n        const context = this.getContextValuesContainer(this._myContextId);\n        const result = (rules ? rules.evaluate(context) : true);\n        // console.group(rules.serialize() + ' -> ' + result);\n        // rules.keys().forEach(key => { console.log(key, ctx[key]); });\n        // console.groupEnd();\n        return result;\n    }\n    getContextKeyValue(key) {\n        if (this._isDisposed) {\n            return undefined;\n        }\n        return this.getContextValuesContainer(this._myContextId).getValue(key);\n    }\n    setContext(key, value) {\n        if (this._isDisposed) {\n            return;\n        }\n        const myContext = this.getContextValuesContainer(this._myContextId);\n        if (!myContext) {\n            return;\n        }\n        if (myContext.setValue(key, value)) {\n            this._onDidChangeContext.fire(new SimpleContextKeyChangeEvent(key));\n        }\n    }\n    removeContext(key) {\n        if (this._isDisposed) {\n            return;\n        }\n        if (this.getContextValuesContainer(this._myContextId).removeValue(key)) {\n            this._onDidChangeContext.fire(new SimpleContextKeyChangeEvent(key));\n        }\n    }\n    getContext(target) {\n        if (this._isDisposed) {\n            return NullContext.INSTANCE;\n        }\n        return this.getContextValuesContainer(findContextAttr(target));\n    }\n    dispose() {\n        super.dispose();\n        this._isDisposed = true;\n    }\n}\nlet ContextKeyService = class ContextKeyService extends AbstractContextKeyService {\n    constructor(configurationService) {\n        super(0);\n        this._contexts = new Map();\n        this._lastContextId = 0;\n        this.inputFocusedContext = InputFocusedContext.bindTo(this);\n        const myContext = this._register(new ConfigAwareContextValuesContainer(this._myContextId, configurationService, this._onDidChangeContext));\n        this._contexts.set(this._myContextId, myContext);\n        // Uncomment this to see the contexts continuously logged\n        // let lastLoggedValue: string | null = null;\n        // setInterval(() => {\n        // \tlet values = Object.keys(this._contexts).map((key) => this._contexts[key]);\n        // \tlet logValue = values.map(v => JSON.stringify(v._value, null, '\\t')).join('\\n');\n        // \tif (lastLoggedValue !== logValue) {\n        // \t\tlastLoggedValue = logValue;\n        // \t\tconsole.log(lastLoggedValue);\n        // \t}\n        // }, 2000);\n        this._register(Event.runAndSubscribe(onDidRegisterWindow, ({ window, disposables }) => {\n            const onFocusDisposables = disposables.add(new MutableDisposable());\n            disposables.add(addDisposableListener(window, EventType.FOCUS_IN, () => {\n                onFocusDisposables.value = new DisposableStore();\n                this.updateInputContextKeys(window.document, onFocusDisposables.value);\n            }, true));\n        }, { window: mainWindow, disposables: this._store }));\n    }\n    updateInputContextKeys(ownerDocument, disposables) {\n        function activeElementIsInput() {\n            return !!ownerDocument.activeElement && isEditableElement(ownerDocument.activeElement);\n        }\n        const isInputFocused = activeElementIsInput();\n        this.inputFocusedContext.set(isInputFocused);\n        if (isInputFocused) {\n            const tracker = disposables.add(trackFocus(ownerDocument.activeElement));\n            Event.once(tracker.onDidBlur)(() => {\n                // Ensure we are only updating the context key if we are\n                // still in the same document that we are tracking. This\n                // fixes a race condition in multi-window setups where\n                // the blur event arrives in the inactive window overwriting\n                // the context key of the active window. This is because\n                // blur events from the focus tracker are emitted with a\n                // timeout of 0.\n                if (getActiveWindow().document === ownerDocument) {\n                    this.inputFocusedContext.set(activeElementIsInput());\n                }\n                tracker.dispose();\n            }, undefined, disposables);\n        }\n    }\n    getContextValuesContainer(contextId) {\n        if (this._isDisposed) {\n            return NullContext.INSTANCE;\n        }\n        return this._contexts.get(contextId) || NullContext.INSTANCE;\n    }\n    createChildContext(parentContextId = this._myContextId) {\n        if (this._isDisposed) {\n            throw new Error(`ContextKeyService has been disposed`);\n        }\n        const id = (++this._lastContextId);\n        this._contexts.set(id, new Context(id, this.getContextValuesContainer(parentContextId)));\n        return id;\n    }\n    disposeContext(contextId) {\n        if (!this._isDisposed) {\n            this._contexts.delete(contextId);\n        }\n    }\n};\nContextKeyService = __decorate([\n    __param(0, IConfigurationService)\n], ContextKeyService);\nclass ScopedContextKeyService extends AbstractContextKeyService {\n    constructor(parent, domNode) {\n        super(parent.createChildContext());\n        this._parentChangeListener = this._register(new MutableDisposable());\n        this._parent = parent;\n        this._updateParentChangeListener();\n        this._domNode = domNode;\n        if (this._domNode.hasAttribute(KEYBINDING_CONTEXT_ATTR)) {\n            let extraInfo = '';\n            if (this._domNode.classList) {\n                extraInfo = Array.from(this._domNode.classList.values()).join(', ');\n            }\n            console.error(`Element already has context attribute${extraInfo ? ': ' + extraInfo : ''}`);\n        }\n        this._domNode.setAttribute(KEYBINDING_CONTEXT_ATTR, String(this._myContextId));\n    }\n    _updateParentChangeListener() {\n        // Forward parent events to this listener. Parent will change.\n        this._parentChangeListener.value = this._parent.onDidChangeContext(e => {\n            const thisContainer = this._parent.getContextValuesContainer(this._myContextId);\n            const thisContextValues = thisContainer.value;\n            if (!allEventKeysInContext(e, thisContextValues)) {\n                this._onDidChangeContext.fire(e);\n            }\n        });\n    }\n    dispose() {\n        if (this._isDisposed) {\n            return;\n        }\n        this._parent.disposeContext(this._myContextId);\n        this._domNode.removeAttribute(KEYBINDING_CONTEXT_ATTR);\n        super.dispose();\n    }\n    getContextValuesContainer(contextId) {\n        if (this._isDisposed) {\n            return NullContext.INSTANCE;\n        }\n        return this._parent.getContextValuesContainer(contextId);\n    }\n    createChildContext(parentContextId = this._myContextId) {\n        if (this._isDisposed) {\n            throw new Error(`ScopedContextKeyService has been disposed`);\n        }\n        return this._parent.createChildContext(parentContextId);\n    }\n    disposeContext(contextId) {\n        if (this._isDisposed) {\n            return;\n        }\n        this._parent.disposeContext(contextId);\n    }\n}\nfunction findContextAttr(domNode) {\n    while (domNode) {\n        if (domNode.hasAttribute(KEYBINDING_CONTEXT_ATTR)) {\n            const attr = domNode.getAttribute(KEYBINDING_CONTEXT_ATTR);\n            if (attr) {\n                return parseInt(attr, 10);\n            }\n            return NaN;\n        }\n        domNode = domNode.parentElement;\n    }\n    return 0;\n}\nfunction setContext(accessor, contextKey, contextValue) {\n    const contextKeyService = accessor.get(IContextKeyService);\n    contextKeyService.createKey(String(contextKey), stringifyURIs(contextValue));\n}\nfunction stringifyURIs(contextValue) {\n    return cloneAndChange(contextValue, (obj) => {\n        if (typeof obj === 'object' && obj.$mid === 1 /* MarshalledId.Uri */) {\n            return URI.revive(obj).toString();\n        }\n        if (obj instanceof URI) {\n            return obj.toString();\n        }\n        return undefined;\n    });\n}\nCommandsRegistry.registerCommand('_setContext', setContext);\nCommandsRegistry.registerCommand({\n    id: 'getContextKeyInfo',\n    handler() {\n        return [...RawContextKey.all()].sort((a, b) => a.key.localeCompare(b.key));\n    },\n    metadata: {\n        description: localize(1674, \"A command that returns information about context keys\"),\n        args: []\n    }\n});\nCommandsRegistry.registerCommand('_generateContextKeyInfo', function () {\n    const result = [];\n    const seen = new Set();\n    for (const info of RawContextKey.all()) {\n        if (!seen.has(info.key)) {\n            seen.add(info.key);\n            result.push(info);\n        }\n    }\n    result.sort((a, b) => a.key.localeCompare(b.key));\n    console.log(JSON.stringify(result, undefined, 2));\n});\n\nexport { AbstractContextKeyService, Context, ContextKeyService, setContext };\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 *--------------------------------------------------------------------------------------------*/\nclass Node {\n    constructor(key, data) {\n        this.key = key;\n        this.data = data;\n        this.incoming = new Map();\n        this.outgoing = new Map();\n    }\n}\nclass Graph {\n    constructor(_hashFn) {\n        this._hashFn = _hashFn;\n        this._nodes = new Map();\n        // empty\n    }\n    roots() {\n        const ret = [];\n        for (const node of this._nodes.values()) {\n            if (node.outgoing.size === 0) {\n                ret.push(node);\n            }\n        }\n        return ret;\n    }\n    insertEdge(from, to) {\n        const fromNode = this.lookupOrInsertNode(from);\n        const toNode = this.lookupOrInsertNode(to);\n        fromNode.outgoing.set(toNode.key, toNode);\n        toNode.incoming.set(fromNode.key, fromNode);\n    }\n    removeNode(data) {\n        const key = this._hashFn(data);\n        this._nodes.delete(key);\n        for (const node of this._nodes.values()) {\n            node.outgoing.delete(key);\n            node.incoming.delete(key);\n        }\n    }\n    lookupOrInsertNode(data) {\n        const key = this._hashFn(data);\n        let node = this._nodes.get(key);\n        if (!node) {\n            node = new Node(key, data);\n            this._nodes.set(key, node);\n        }\n        return node;\n    }\n    isEmpty() {\n        return this._nodes.size === 0;\n    }\n    toString() {\n        const data = [];\n        for (const [key, value] of this._nodes) {\n            data.push(`${key}\\n\\t(-> incoming)[${[...value.incoming.keys()].join(', ')}]\\n\\t(outgoing ->)[${[...value.outgoing.keys()].join(',')}]\\n`);\n        }\n        return data.join('\\n');\n    }\n    /**\n     * This is brute force and slow and **only** be used\n     * to trouble shoot.\n     */\n    findCycleSlow() {\n        for (const [id, node] of this._nodes) {\n            const seen = new Set([id]);\n            const res = this._findCycle(node, seen);\n            if (res) {\n                return res;\n            }\n        }\n        return undefined;\n    }\n    _findCycle(node, seen) {\n        for (const [id, outgoing] of node.outgoing) {\n            if (seen.has(id)) {\n                return [...seen, id].join(' -> ');\n            }\n            seen.add(id);\n            const value = this._findCycle(outgoing, seen);\n            if (value) {\n                return value;\n            }\n            seen.delete(id);\n        }\n        return undefined;\n    }\n}\n\nexport { Graph, Node };\n","import { GlobalIdleValue } from '../../../base/common/async.js';\nimport { illegalState } from '../../../base/common/errors.js';\nimport { dispose, isDisposable, toDisposable } from '../../../base/common/lifecycle.js';\nimport { SyncDescriptor } from './descriptors.js';\nimport { Graph } from './graph.js';\nimport { IInstantiationService, _util } from './instantiation.js';\nimport { ServiceCollection } from './serviceCollection.js';\nimport { LinkedList } from '../../../base/common/linkedList.js';\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// TRACING\nconst _enableAllTracing = false;\nclass CyclicDependencyError extends Error {\n    constructor(graph) {\n        super('cyclic dependency between services');\n        this.message = graph.findCycleSlow() ?? `UNABLE to detect cycle, dumping graph: \\n${graph.toString()}`;\n    }\n}\nclass InstantiationService {\n    constructor(_services = new ServiceCollection(), _strict = false, _parent, _enableTracing = _enableAllTracing) {\n        this._services = _services;\n        this._strict = _strict;\n        this._parent = _parent;\n        this._enableTracing = _enableTracing;\n        this._isDisposed = false;\n        this._servicesToMaybeDispose = new Set();\n        this._children = new Set();\n        this._activeInstantiations = new Set();\n        this._services.set(IInstantiationService, this);\n        this._globalGraph = _enableTracing ? _parent?._globalGraph ?? new Graph(e => e) : undefined;\n    }\n    dispose() {\n        if (!this._isDisposed) {\n            this._isDisposed = true;\n            // dispose all child services\n            dispose(this._children);\n            this._children.clear();\n            // dispose all services created by this service\n            for (const candidate of this._servicesToMaybeDispose) {\n                if (isDisposable(candidate)) {\n                    candidate.dispose();\n                }\n            }\n            this._servicesToMaybeDispose.clear();\n        }\n    }\n    _throwIfDisposed() {\n        if (this._isDisposed) {\n            throw new Error('InstantiationService has been disposed');\n        }\n    }\n    createChild(services, store) {\n        this._throwIfDisposed();\n        const that = this;\n        const result = new class extends InstantiationService {\n            dispose() {\n                that._children.delete(result);\n                super.dispose();\n            }\n        }(services, this._strict, this, this._enableTracing);\n        this._children.add(result);\n        store?.add(result);\n        return result;\n    }\n    invokeFunction(fn, ...args) {\n        this._throwIfDisposed();\n        const _trace = Trace.traceInvocation(this._enableTracing, fn);\n        let _done = false;\n        try {\n            const accessor = {\n                get: (id) => {\n                    if (_done) {\n                        throw illegalState('service accessor is only valid during the invocation of its target method');\n                    }\n                    const result = this._getOrCreateServiceInstance(id, _trace);\n                    if (!result) {\n                        throw new Error(`[invokeFunction] unknown service '${id}'`);\n                    }\n                    return result;\n                },\n                getIfExists: (id) => {\n                    if (_done) {\n                        throw illegalState('service accessor is only valid during the invocation of its target method');\n                    }\n                    const result = this._getOrCreateServiceInstance(id, _trace);\n                    return result;\n                }\n            };\n            return fn(accessor, ...args);\n        }\n        finally {\n            _done = true;\n            _trace.stop();\n        }\n    }\n    createInstance(ctorOrDescriptor, ...rest) {\n        this._throwIfDisposed();\n        let _trace;\n        let result;\n        if (ctorOrDescriptor instanceof SyncDescriptor) {\n            _trace = Trace.traceCreation(this._enableTracing, ctorOrDescriptor.ctor);\n            result = this._createInstance(ctorOrDescriptor.ctor, ctorOrDescriptor.staticArguments.concat(rest), _trace);\n        }\n        else {\n            _trace = Trace.traceCreation(this._enableTracing, ctorOrDescriptor);\n            result = this._createInstance(ctorOrDescriptor, rest, _trace);\n        }\n        _trace.stop();\n        return result;\n    }\n    _createInstance(ctor, args = [], _trace) {\n        // arguments defined by service decorators\n        const serviceDependencies = _util.getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n        const serviceArgs = [];\n        for (const dependency of serviceDependencies) {\n            const service = this._getOrCreateServiceInstance(dependency.id, _trace);\n            if (!service) {\n                this._throwIfStrict(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id}.`, false);\n            }\n            serviceArgs.push(service);\n        }\n        const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n        // check for argument mismatches, adjust static args if needed\n        if (args.length !== firstServiceArgPos) {\n            console.trace(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n            const delta = firstServiceArgPos - args.length;\n            if (delta > 0) {\n                args = args.concat(new Array(delta));\n            }\n            else {\n                args = args.slice(0, firstServiceArgPos);\n            }\n        }\n        // now create the instance\n        return Reflect.construct(ctor, args.concat(serviceArgs));\n    }\n    _setCreatedServiceInstance(id, instance) {\n        if (this._services.get(id) instanceof SyncDescriptor) {\n            this._services.set(id, instance);\n        }\n        else if (this._parent) {\n            this._parent._setCreatedServiceInstance(id, instance);\n        }\n        else {\n            throw new Error('illegalState - setting UNKNOWN service instance');\n        }\n    }\n    _getServiceInstanceOrDescriptor(id) {\n        const instanceOrDesc = this._services.get(id);\n        if (!instanceOrDesc && this._parent) {\n            return this._parent._getServiceInstanceOrDescriptor(id);\n        }\n        else {\n            return instanceOrDesc;\n        }\n    }\n    _getOrCreateServiceInstance(id, _trace) {\n        if (this._globalGraph && this._globalGraphImplicitDependency) {\n            this._globalGraph.insertEdge(this._globalGraphImplicitDependency, String(id));\n        }\n        const thing = this._getServiceInstanceOrDescriptor(id);\n        if (thing instanceof SyncDescriptor) {\n            return this._safeCreateAndCacheServiceInstance(id, thing, _trace.branch(id, true));\n        }\n        else {\n            _trace.branch(id, false);\n            return thing;\n        }\n    }\n    _safeCreateAndCacheServiceInstance(id, desc, _trace) {\n        if (this._activeInstantiations.has(id)) {\n            throw new Error(`illegal state - RECURSIVELY instantiating service '${id}'`);\n        }\n        this._activeInstantiations.add(id);\n        try {\n            return this._createAndCacheServiceInstance(id, desc, _trace);\n        }\n        finally {\n            this._activeInstantiations.delete(id);\n        }\n    }\n    _createAndCacheServiceInstance(id, desc, _trace) {\n        const graph = new Graph(data => data.id.toString());\n        let cycleCount = 0;\n        const stack = [{ id, desc, _trace }];\n        const seen = new Set();\n        while (stack.length) {\n            const item = stack.pop();\n            if (seen.has(String(item.id))) {\n                continue;\n            }\n            seen.add(String(item.id));\n            graph.lookupOrInsertNode(item);\n            // a weak but working heuristic for cycle checks\n            if (cycleCount++ > 1000) {\n                throw new CyclicDependencyError(graph);\n            }\n            // check all dependencies for existence and if they need to be created first\n            for (const dependency of _util.getServiceDependencies(item.desc.ctor)) {\n                const instanceOrDesc = this._getServiceInstanceOrDescriptor(dependency.id);\n                if (!instanceOrDesc) {\n                    this._throwIfStrict(`[createInstance] ${id} depends on ${dependency.id} which is NOT registered.`, true);\n                }\n                // take note of all service dependencies\n                this._globalGraph?.insertEdge(String(item.id), String(dependency.id));\n                if (instanceOrDesc instanceof SyncDescriptor) {\n                    const d = { id: dependency.id, desc: instanceOrDesc, _trace: item._trace.branch(dependency.id, true) };\n                    graph.insertEdge(item, d);\n                    stack.push(d);\n                }\n            }\n        }\n        while (true) {\n            const roots = graph.roots();\n            // if there is no more roots but still\n            // nodes in the graph we have a cycle\n            if (roots.length === 0) {\n                if (!graph.isEmpty()) {\n                    throw new CyclicDependencyError(graph);\n                }\n                break;\n            }\n            for (const { data } of roots) {\n                // Repeat the check for this still being a service sync descriptor. That's because\n                // instantiating a dependency might have side-effect and recursively trigger instantiation\n                // so that some dependencies are now fullfilled already.\n                const instanceOrDesc = this._getServiceInstanceOrDescriptor(data.id);\n                if (instanceOrDesc instanceof SyncDescriptor) {\n                    // create instance and overwrite the service collections\n                    const instance = this._createServiceInstanceWithOwner(data.id, data.desc.ctor, data.desc.staticArguments, data.desc.supportsDelayedInstantiation, data._trace);\n                    this._setCreatedServiceInstance(data.id, instance);\n                }\n                graph.removeNode(data);\n            }\n        }\n        return this._getServiceInstanceOrDescriptor(id);\n    }\n    _createServiceInstanceWithOwner(id, ctor, args = [], supportsDelayedInstantiation, _trace) {\n        if (this._services.get(id) instanceof SyncDescriptor) {\n            return this._createServiceInstance(id, ctor, args, supportsDelayedInstantiation, _trace, this._servicesToMaybeDispose);\n        }\n        else if (this._parent) {\n            return this._parent._createServiceInstanceWithOwner(id, ctor, args, supportsDelayedInstantiation, _trace);\n        }\n        else {\n            throw new Error(`illegalState - creating UNKNOWN service instance ${ctor.name}`);\n        }\n    }\n    _createServiceInstance(id, ctor, args = [], supportsDelayedInstantiation, _trace, disposeBucket) {\n        if (!supportsDelayedInstantiation) {\n            // eager instantiation\n            const result = this._createInstance(ctor, args, _trace);\n            disposeBucket.add(result);\n            return result;\n        }\n        else {\n            const child = new InstantiationService(undefined, this._strict, this, this._enableTracing);\n            child._globalGraphImplicitDependency = String(id);\n            // Return a proxy object that's backed by an idle value. That\n            // strategy is to instantiate services in our idle time or when actually\n            // needed but not when injected into a consumer\n            // return \"empty events\" when the service isn't instantiated yet\n            const earlyListeners = new Map();\n            const idle = new GlobalIdleValue(() => {\n                const result = child._createInstance(ctor, args, _trace);\n                // early listeners that we kept are now being subscribed to\n                // the real service\n                for (const [key, values] of earlyListeners) {\n                    // eslint-disable-next-line local/code-no-any-casts\n                    const candidate = result[key];\n                    if (typeof candidate === 'function') {\n                        for (const value of values) {\n                            value.disposable = candidate.apply(result, value.listener);\n                        }\n                    }\n                }\n                earlyListeners.clear();\n                disposeBucket.add(result);\n                return result;\n            });\n            return new Proxy(Object.create(null), {\n                get(target, key) {\n                    if (!idle.isInitialized) {\n                        // looks like an event\n                        if (typeof key === 'string' && (key.startsWith('onDid') || key.startsWith('onWill'))) {\n                            let list = earlyListeners.get(key);\n                            if (!list) {\n                                list = new LinkedList();\n                                earlyListeners.set(key, list);\n                            }\n                            const event = (callback, thisArg, disposables) => {\n                                if (idle.isInitialized) {\n                                    return idle.value[key](callback, thisArg, disposables);\n                                }\n                                else {\n                                    const entry = { listener: [callback, thisArg, disposables], disposable: undefined };\n                                    const rm = list.push(entry);\n                                    const result = toDisposable(() => {\n                                        rm();\n                                        entry.disposable?.dispose();\n                                    });\n                                    return result;\n                                }\n                            };\n                            return event;\n                        }\n                    }\n                    // value already exists\n                    if (key in target) {\n                        return target[key];\n                    }\n                    // create value\n                    const obj = idle.value;\n                    let prop = obj[key];\n                    if (typeof prop !== 'function') {\n                        return prop;\n                    }\n                    prop = prop.bind(obj);\n                    target[key] = prop;\n                    return prop;\n                },\n                set(_target, p, value) {\n                    idle.value[p] = value;\n                    return true;\n                },\n                getPrototypeOf(_target) {\n                    return ctor.prototype;\n                }\n            });\n        }\n    }\n    _throwIfStrict(msg, printWarning) {\n        if (printWarning) {\n            console.warn(msg);\n        }\n        if (this._strict) {\n            throw new Error(msg);\n        }\n    }\n}\nclass Trace {\n    static { this.all = new Set(); }\n    static { this._None = new class extends Trace {\n        constructor() { super(0 /* TraceType.None */, null); }\n        stop() { }\n        branch() { return this; }\n    }; }\n    static traceInvocation(_enableTracing, ctor) {\n        return !_enableTracing ? Trace._None : new Trace(2 /* TraceType.Invocation */, ctor.name || new Error().stack.split('\\n').slice(3, 4).join('\\n'));\n    }\n    static traceCreation(_enableTracing, ctor) {\n        return !_enableTracing ? Trace._None : new Trace(1 /* TraceType.Creation */, ctor.name);\n    }\n    static { this._totals = 0; }\n    constructor(type, name) {\n        this.type = type;\n        this.name = name;\n        this._start = Date.now();\n        this._dep = [];\n    }\n    branch(id, first) {\n        const child = new Trace(3 /* TraceType.Branch */, id.toString());\n        this._dep.push([id, first, child]);\n        return child;\n    }\n    stop() {\n        const dur = Date.now() - this._start;\n        Trace._totals += dur;\n        let causedCreation = false;\n        function printChild(n, trace) {\n            const res = [];\n            const prefix = new Array(n + 1).join('\\t');\n            for (const [id, first, child] of trace._dep) {\n                if (first && child) {\n                    causedCreation = true;\n                    res.push(`${prefix}CREATES -> ${id}`);\n                    const nested = printChild(n + 1, child);\n                    if (nested) {\n                        res.push(nested);\n                    }\n                }\n                else {\n                    res.push(`${prefix}uses -> ${id}`);\n                }\n            }\n            return res.join('\\n');\n        }\n        const lines = [\n            `${this.type === 1 /* TraceType.Creation */ ? 'CREATE' : 'CALL'} ${this.name}`,\n            `${printChild(1, this)}`,\n            `DONE, took ${dur.toFixed(2)}ms (grand total ${Trace._totals.toFixed(2)}ms)`\n        ];\n        if (dur > 2 || causedCreation) {\n            Trace.all.add(lines.join('\\n'));\n        }\n    }\n}\n//#endregion\n\nexport { InstantiationService, Trace };\n","import { isFalsyOrEmpty, isNonEmptyArray } from '../../../base/common/arrays.js';\nimport { DebounceEmitter } from '../../../base/common/event.js';\nimport { Iterable } from '../../../base/common/iterator.js';\nimport { ResourceMap, ResourceSet } from '../../../base/common/map.js';\nimport { Schemas } from '../../../base/common/network.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { localize } from '../../../nls.js';\nimport { MarkerSeverity } from './markers.js';\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 *--------------------------------------------------------------------------------------------*/\nconst unsupportedSchemas = new Set([\n    Schemas.inMemory,\n    Schemas.vscodeSourceControl,\n    Schemas.walkThrough,\n    Schemas.walkThroughSnippet,\n    Schemas.vscodeChatCodeBlock,\n    Schemas.vscodeTerminal\n]);\nclass DoubleResourceMap {\n    constructor() {\n        this._byResource = new ResourceMap();\n        this._byOwner = new Map();\n    }\n    set(resource, owner, value) {\n        let ownerMap = this._byResource.get(resource);\n        if (!ownerMap) {\n            ownerMap = new Map();\n            this._byResource.set(resource, ownerMap);\n        }\n        ownerMap.set(owner, value);\n        let resourceMap = this._byOwner.get(owner);\n        if (!resourceMap) {\n            resourceMap = new ResourceMap();\n            this._byOwner.set(owner, resourceMap);\n        }\n        resourceMap.set(resource, value);\n    }\n    get(resource, owner) {\n        const ownerMap = this._byResource.get(resource);\n        return ownerMap?.get(owner);\n    }\n    delete(resource, owner) {\n        let removedA = false;\n        let removedB = false;\n        const ownerMap = this._byResource.get(resource);\n        if (ownerMap) {\n            removedA = ownerMap.delete(owner);\n        }\n        const resourceMap = this._byOwner.get(owner);\n        if (resourceMap) {\n            removedB = resourceMap.delete(resource);\n        }\n        if (removedA !== removedB) {\n            throw new Error('illegal state');\n        }\n        return removedA && removedB;\n    }\n    values(key) {\n        if (typeof key === 'string') {\n            return this._byOwner.get(key)?.values() ?? Iterable.empty();\n        }\n        if (URI.isUri(key)) {\n            return this._byResource.get(key)?.values() ?? Iterable.empty();\n        }\n        return Iterable.map(Iterable.concat(...this._byOwner.values()), map => map[1]);\n    }\n}\nclass MarkerStats {\n    constructor(service) {\n        this.errors = 0;\n        this.infos = 0;\n        this.warnings = 0;\n        this.unknowns = 0;\n        this._data = new ResourceMap();\n        this._service = service;\n        this._subscription = service.onMarkerChanged(this._update, this);\n    }\n    dispose() {\n        this._subscription.dispose();\n    }\n    _update(resources) {\n        for (const resource of resources) {\n            const oldStats = this._data.get(resource);\n            if (oldStats) {\n                this._substract(oldStats);\n            }\n            const newStats = this._resourceStats(resource);\n            this._add(newStats);\n            this._data.set(resource, newStats);\n        }\n    }\n    _resourceStats(resource) {\n        const result = { errors: 0, warnings: 0, infos: 0, unknowns: 0 };\n        // TODO this is a hack\n        if (unsupportedSchemas.has(resource.scheme)) {\n            return result;\n        }\n        for (const { severity } of this._service.read({ resource })) {\n            if (severity === MarkerSeverity.Error) {\n                result.errors += 1;\n            }\n            else if (severity === MarkerSeverity.Warning) {\n                result.warnings += 1;\n            }\n            else if (severity === MarkerSeverity.Info) {\n                result.infos += 1;\n            }\n            else {\n                result.unknowns += 1;\n            }\n        }\n        return result;\n    }\n    _substract(op) {\n        this.errors -= op.errors;\n        this.warnings -= op.warnings;\n        this.infos -= op.infos;\n        this.unknowns -= op.unknowns;\n    }\n    _add(op) {\n        this.errors += op.errors;\n        this.warnings += op.warnings;\n        this.infos += op.infos;\n        this.unknowns += op.unknowns;\n    }\n}\nclass MarkerService {\n    constructor() {\n        this._onMarkerChanged = new DebounceEmitter({\n            delay: 0,\n            merge: MarkerService._merge\n        });\n        this.onMarkerChanged = this._onMarkerChanged.event;\n        this._data = new DoubleResourceMap();\n        this._stats = new MarkerStats(this);\n        this._filteredResources = new ResourceMap();\n    }\n    dispose() {\n        this._stats.dispose();\n        this._onMarkerChanged.dispose();\n    }\n    remove(owner, resources) {\n        for (const resource of resources || []) {\n            this.changeOne(owner, resource, []);\n        }\n    }\n    changeOne(owner, resource, markerData) {\n        if (isFalsyOrEmpty(markerData)) {\n            // remove marker for this (owner,resource)-tuple\n            const removed = this._data.delete(resource, owner);\n            if (removed) {\n                this._onMarkerChanged.fire([resource]);\n            }\n        }\n        else {\n            // insert marker for this (owner,resource)-tuple\n            const markers = [];\n            for (const data of markerData) {\n                const marker = MarkerService._toMarker(owner, resource, data);\n                if (marker) {\n                    markers.push(marker);\n                }\n            }\n            this._data.set(resource, owner, markers);\n            this._onMarkerChanged.fire([resource]);\n        }\n    }\n    static _toMarker(owner, resource, data) {\n        let { code, severity, message, source, startLineNumber, startColumn, endLineNumber, endColumn, relatedInformation, tags, origin } = data;\n        if (!message) {\n            return undefined;\n        }\n        // santize data\n        startLineNumber = startLineNumber > 0 ? startLineNumber : 1;\n        startColumn = startColumn > 0 ? startColumn : 1;\n        endLineNumber = endLineNumber >= startLineNumber ? endLineNumber : startLineNumber;\n        endColumn = endColumn > 0 ? endColumn : startColumn;\n        return {\n            resource,\n            owner,\n            code,\n            severity,\n            message,\n            source,\n            startLineNumber,\n            startColumn,\n            endLineNumber,\n            endColumn,\n            relatedInformation,\n            tags,\n            origin\n        };\n    }\n    changeAll(owner, data) {\n        const changes = [];\n        // remove old marker\n        const existing = this._data.values(owner);\n        if (existing) {\n            for (const data of existing) {\n                const first = Iterable.first(data);\n                if (first) {\n                    changes.push(first.resource);\n                    this._data.delete(first.resource, owner);\n                }\n            }\n        }\n        // add new markers\n        if (isNonEmptyArray(data)) {\n            // group by resource\n            const groups = new ResourceMap();\n            for (const { resource, marker: markerData } of data) {\n                const marker = MarkerService._toMarker(owner, resource, markerData);\n                if (!marker) {\n                    // filter bad markers\n                    continue;\n                }\n                const array = groups.get(resource);\n                if (!array) {\n                    groups.set(resource, [marker]);\n                    changes.push(resource);\n                }\n                else {\n                    array.push(marker);\n                }\n            }\n            // insert all\n            for (const [resource, value] of groups) {\n                this._data.set(resource, owner, value);\n            }\n        }\n        if (changes.length > 0) {\n            this._onMarkerChanged.fire(changes);\n        }\n    }\n    /**\n     * Creates an information marker for filtered resources\n     */\n    _createFilteredMarker(resource, reasons) {\n        const message = reasons.length === 1\n            ? localize(1738, \"Problems are paused because: \\\"{0}\\\"\", reasons[0])\n            : localize(1739, \"Problems are paused because: \\\"{0}\\\" and {1} more\", reasons[0], reasons.length - 1);\n        return {\n            owner: 'markersFilter',\n            resource,\n            severity: MarkerSeverity.Info,\n            message,\n            startLineNumber: 1,\n            startColumn: 1,\n            endLineNumber: 1,\n            endColumn: 1,\n        };\n    }\n    read(filter = Object.create(null)) {\n        let { owner, resource, severities, take } = filter;\n        if (!take || take < 0) {\n            take = -1;\n        }\n        if (owner && resource) {\n            // exactly one owner AND resource\n            const reasons = !filter.ignoreResourceFilters ? this._filteredResources.get(resource) : undefined;\n            if (reasons?.length) {\n                const infoMarker = this._createFilteredMarker(resource, reasons);\n                return [infoMarker];\n            }\n            const data = this._data.get(resource, owner);\n            if (!data) {\n                return [];\n            }\n            const result = [];\n            for (const marker of data) {\n                if (take > 0 && result.length === take) {\n                    break;\n                }\n                const reasons = !filter.ignoreResourceFilters ? this._filteredResources.get(resource) : undefined;\n                if (reasons?.length) {\n                    result.push(this._createFilteredMarker(resource, reasons));\n                }\n                else if (MarkerService._accept(marker, severities)) {\n                    result.push(marker);\n                }\n            }\n            return result;\n        }\n        else {\n            // of one resource OR owner\n            const iterable = !owner && !resource\n                ? this._data.values()\n                : this._data.values(resource ?? owner);\n            const result = [];\n            const filtered = new ResourceSet();\n            for (const markers of iterable) {\n                for (const data of markers) {\n                    if (filtered.has(data.resource)) {\n                        continue;\n                    }\n                    if (take > 0 && result.length === take) {\n                        break;\n                    }\n                    const reasons = !filter.ignoreResourceFilters ? this._filteredResources.get(data.resource) : undefined;\n                    if (reasons?.length) {\n                        result.push(this._createFilteredMarker(data.resource, reasons));\n                        filtered.add(data.resource);\n                    }\n                    else if (MarkerService._accept(data, severities)) {\n                        result.push(data);\n                    }\n                }\n            }\n            return result;\n        }\n    }\n    static _accept(marker, severities) {\n        return severities === undefined || (severities & marker.severity) === marker.severity;\n    }\n    // --- event debounce logic\n    static _merge(all) {\n        const set = new ResourceMap();\n        for (const array of all) {\n            for (const item of array) {\n                set.set(item, true);\n            }\n        }\n        return Array.from(set.keys());\n    }\n}\n\nexport { MarkerService, unsupportedSchemas };\n","import { Disposable } from '../../../base/common/lifecycle.js';\nimport { deepClone } from '../../../base/common/objects.js';\nimport { ConfigurationModel } from './configurationModels.js';\nimport { Extensions } from './configurationRegistry.js';\nimport { Registry } from '../../registry/common/platform.js';\n\nclass DefaultConfiguration extends Disposable {\n    get configurationModel() {\n        return this._configurationModel;\n    }\n    constructor(logService) {\n        super();\n        this.logService = logService;\n        this._configurationModel = ConfigurationModel.createEmptyModel(logService);\n    }\n    reload() {\n        this.resetConfigurationModel();\n        return this.configurationModel;\n    }\n    getConfigurationDefaultOverrides() {\n        return {};\n    }\n    resetConfigurationModel() {\n        this._configurationModel = ConfigurationModel.createEmptyModel(this.logService);\n        const properties = Registry.as(Extensions.Configuration).getConfigurationProperties();\n        this.updateConfigurationModel(Object.keys(properties), properties);\n    }\n    updateConfigurationModel(properties, configurationProperties) {\n        const configurationDefaultsOverrides = this.getConfigurationDefaultOverrides();\n        for (const key of properties) {\n            const defaultOverrideValue = configurationDefaultsOverrides[key];\n            const propertySchema = configurationProperties[key];\n            if (defaultOverrideValue !== undefined) {\n                this._configurationModel.setValue(key, defaultOverrideValue);\n            }\n            else if (propertySchema) {\n                this._configurationModel.setValue(key, deepClone(propertySchema.default));\n            }\n            else {\n                this._configurationModel.removeValue(key);\n            }\n        }\n    }\n}\n\nexport { DefaultConfiguration };\n","import { Disposable } from '../../../base/common/lifecycle.js';\nimport { MultiplexLogger } from './log.js';\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 *--------------------------------------------------------------------------------------------*/\nclass LogService extends Disposable {\n    constructor(primaryLogger, otherLoggers = []) {\n        super();\n        this.logger = new MultiplexLogger([primaryLogger, ...otherLoggers]);\n        this._register(primaryLogger.onDidChangeLogLevel(level => this.setLevel(level)));\n    }\n    get onDidChangeLogLevel() {\n        return this.logger.onDidChangeLogLevel;\n    }\n    setLevel(level) {\n        this.logger.setLevel(level);\n    }\n    getLevel() {\n        return this.logger.getLevel();\n    }\n    trace(message, ...args) {\n        this.logger.trace(message, ...args);\n    }\n    debug(message, ...args) {\n        this.logger.debug(message, ...args);\n    }\n    info(message, ...args) {\n        this.logger.info(message, ...args);\n    }\n    warn(message, ...args) {\n        this.logger.warn(message, ...args);\n    }\n    error(message, ...args) {\n        this.logger.error(message, ...args);\n    }\n}\n\nexport { LogService };\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 *--------------------------------------------------------------------------------------------*/\nclass StandaloneTreeSitterLibraryService {\n    getParserClass() {\n        throw new Error('not implemented in StandaloneTreeSitterLibraryService');\n    }\n    supportsLanguage(languageId, reader) {\n        return false;\n    }\n    getLanguage(languageId, ignoreSupportsCheck, reader) {\n        return undefined;\n    }\n    getInjectionQueries(languageId, reader) {\n        return null;\n    }\n    getHighlightingQueries(languageId, reader) {\n        return null;\n    }\n}\n\nexport { StandaloneTreeSitterLibraryService };\n","import './standaloneCodeEditorService.js';\nimport './standaloneLayoutService.js';\nimport '../../../platform/undoRedo/common/undoRedoService.js';\nimport '../../common/services/languageFeatureDebounce.js';\nimport '../../common/services/semanticTokensStylingService.js';\nimport '../../common/services/languageFeaturesService.js';\nimport '../../../platform/hover/browser/hoverService.js';\nimport '../../browser/services/inlineCompletionsService.js';\nimport { format } from '../../../base/common/strings.js';\nimport { addDisposableListener, EventType } from '../../../base/browser/dom.js';\nimport { StandardKeyboardEvent } from '../../../base/browser/keyboardEvent.js';\nimport { Emitter } from '../../../base/common/event.js';\nimport { decodeKeybinding, KeyCodeChord } from '../../../base/common/keybindings.js';\nimport { ImmortalReference, combinedDisposable, toDisposable, DisposableStore, Disposable } from '../../../base/common/lifecycle.js';\nimport { OS, isLinux, isMacintosh } from '../../../base/common/platform.js';\nimport Severity from '../../../base/common/severity.js';\nimport { URI } from '../../../base/common/uri.js';\nimport { ResourceEdit, ResourceTextEdit, IBulkEditService } from '../../browser/services/bulkEditService.js';\nimport { isEditorConfigurationKey, isDiffEditorConfigurationKey } from '../../common/config/editorConfigurationSchema.js';\nimport { EditOperation } from '../../common/core/editOperation.js';\nimport { Position } from '../../common/core/position.js';\nimport { Range } from '../../common/core/range.js';\nimport { IModelService } from '../../common/services/model.js';\nimport { ITextModelService } from '../../common/services/resolverService.js';\nimport { ITextResourceConfigurationService, ITextResourcePropertiesService } from '../../common/services/textResourceConfiguration.js';\nimport { ICommandService, CommandsRegistry } from '../../../platform/commands/common/commands.js';\nimport { IConfigurationService } from '../../../platform/configuration/common/configuration.js';\nimport { Configuration, ConfigurationModel, ConfigurationChangeEvent } from '../../../platform/configuration/common/configurationModels.js';\nimport { IContextKeyService } from '../../../platform/contextkey/common/contextkey.js';\nimport { IDialogService } from '../../../platform/dialogs/common/dialogs.js';\nimport { IInstantiationService, createDecorator } from '../../../platform/instantiation/common/instantiation.js';\nimport { AbstractKeybindingService } from '../../../platform/keybinding/common/abstractKeybindingService.js';\nimport { IKeybindingService } from '../../../platform/keybinding/common/keybinding.js';\nimport { KeybindingResolver } from '../../../platform/keybinding/common/keybindingResolver.js';\nimport { KeybindingsRegistry } from '../../../platform/keybinding/common/keybindingsRegistry.js';\nimport { ResolvedKeybindingItem } from '../../../platform/keybinding/common/resolvedKeybindingItem.js';\nimport { USLayoutResolvedKeybinding } from '../../../platform/keybinding/common/usLayoutResolvedKeybinding.js';\nimport { ILabelService } from '../../../platform/label/common/label.js';\nimport { INotificationService, NoOpNotification } from '../../../platform/notification/common/notification.js';\nimport { IProgressService, IEditorProgressService } from '../../../platform/progress/common/progress.js';\nimport { ITelemetryService } from '../../../platform/telemetry/common/telemetry.js';\nimport { WorkspaceFolder, STANDALONE_EDITOR_WORKSPACE_ID, IWorkspaceContextService } from '../../../platform/workspace/common/workspace.js';\nimport { ILayoutService } from '../../../platform/layout/browser/layoutService.js';\nimport { StandaloneServicesNLS } from '../../common/standaloneStrings.js';\nimport { basename } from '../../../base/common/resources.js';\nimport { ICodeEditorService } from '../../browser/services/codeEditorService.js';\nimport { ILogService, NullLoggerService, ILoggerService, ConsoleLogger } from '../../../platform/log/common/log.js';\nimport { IWorkspaceTrustManagementService } from '../../../platform/workspace/common/workspaceTrust.js';\nimport { IContextViewService, IContextMenuService } from '../../../platform/contextview/browser/contextView.js';\nimport { ContextViewService } from '../../../platform/contextview/browser/contextViewService.js';\nimport { LanguageService } from '../../common/services/languageService.js';\nimport { ContextMenuService } from '../../../platform/contextview/browser/contextMenuService.js';\nimport { getSingletonServiceDescriptors, registerSingleton } from '../../../platform/instantiation/common/extensions.js';\nimport { OpenerService } from '../../browser/services/openerService.js';\nimport { IEditorWorkerService } from '../../common/services/editorWorker.js';\nimport { EditorWorkerService } from '../../browser/services/editorWorkerService.js';\nimport { ILanguageService } from '../../common/languages/language.js';\nimport { MarkerDecorationsService } from '../../common/services/markerDecorationsService.js';\nimport { IMarkerDecorationsService } from '../../common/services/markerDecorations.js';\nimport { ModelService } from '../../common/services/modelService.js';\nimport { StandaloneQuickInputService } from './quickInput/standaloneQuickInputService.js';\nimport { StandaloneThemeService } from './standaloneThemeService.js';\nimport { IStandaloneThemeService } from '../common/standaloneTheme.js';\nimport { AccessibilityService } from '../../../platform/accessibility/browser/accessibilityService.js';\nimport { IAccessibilityService } from '../../../platform/accessibility/common/accessibility.js';\nimport { IMenuService } from '../../../platform/actions/common/actions.js';\nimport { MenuService } from '../../../platform/actions/common/menuService.js';\nimport { BrowserClipboardService } from '../../../platform/clipboard/browser/clipboardService.js';\nimport { IClipboardService } from '../../../platform/clipboard/common/clipboardService.js';\nimport { ContextKeyService } from '../../../platform/contextkey/browser/contextKeyService.js';\nimport { SyncDescriptor } from '../../../platform/instantiation/common/descriptors.js';\nimport { InstantiationService } from '../../../platform/instantiation/common/instantiationService.js';\nimport { ServiceCollection } from '../../../platform/instantiation/common/serviceCollection.js';\nimport { ListService, IListService } from '../../../platform/list/browser/listService.js';\nimport { IMarkerService } from '../../../platform/markers/common/markers.js';\nimport { MarkerService } from '../../../platform/markers/common/markerService.js';\nimport { IOpenerService } from '../../../platform/opener/common/opener.js';\nimport { IQuickInputService } from '../../../platform/quickinput/common/quickInput.js';\nimport { InMemoryStorageService, IStorageService } from '../../../platform/storage/common/storage.js';\nimport { DefaultConfiguration } from '../../../platform/configuration/common/configurations.js';\nimport { IAccessibilitySignalService } from '../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';\nimport { ILanguageFeaturesService } from '../../common/services/languageFeatures.js';\nimport { ILanguageConfigurationService } from '../../common/languages/languageConfigurationRegistry.js';\nimport { LogService } from '../../../platform/log/common/logService.js';\nimport { getEditorFeatures } from '../../common/editorFeatures.js';\nimport { onUnexpectedError } from '../../../base/common/errors.js';\nimport { IEnvironmentService } from '../../../platform/environment/common/environment.js';\nimport { mainWindow } from '../../../base/browser/window.js';\nimport { ResourceMap } from '../../../base/common/map.js';\nimport { ITreeSitterLibraryService } from '../../common/services/treeSitter/treeSitterLibraryService.js';\nimport { StandaloneTreeSitterLibraryService } from './standaloneTreeSitterLibraryService.js';\nimport { NullDataChannelService, IDataChannelService } from '../../../platform/dataChannel/common/dataChannel.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass SimpleModel {\n    constructor(model) {\n        this.disposed = false;\n        this.model = model;\n        this._onWillDispose = new Emitter();\n    }\n    get textEditorModel() {\n        return this.model;\n    }\n    dispose() {\n        this.disposed = true;\n        this._onWillDispose.fire();\n    }\n}\nlet StandaloneTextModelService = class StandaloneTextModelService {\n    constructor(modelService) {\n        this.modelService = modelService;\n    }\n    createModelReference(resource) {\n        const model = this.modelService.getModel(resource);\n        if (!model) {\n            return Promise.reject(new Error(`Model not found`));\n        }\n        return Promise.resolve(new ImmortalReference(new SimpleModel(model)));\n    }\n};\nStandaloneTextModelService = __decorate([\n    __param(0, IModelService)\n], StandaloneTextModelService);\nclass StandaloneEditorProgressService {\n    static { this.NULL_PROGRESS_RUNNER = {\n        done: () => { },\n        total: () => { },\n        worked: () => { }\n    }; }\n    show() {\n        return StandaloneEditorProgressService.NULL_PROGRESS_RUNNER;\n    }\n    async showWhile(promise, delay) {\n        await promise;\n    }\n}\nclass StandaloneProgressService {\n    withProgress(_options, task, onDidCancel) {\n        return task({\n            report: () => { },\n        });\n    }\n}\nclass StandaloneEnvironmentService {\n    constructor() {\n        this.isExtensionDevelopment = false;\n        this.isBuilt = false;\n    }\n}\nclass StandaloneDialogService {\n    async confirm(confirmation) {\n        const confirmed = this.doConfirm(confirmation.message, confirmation.detail);\n        return {\n            confirmed,\n            checkboxChecked: false // unsupported\n        };\n    }\n    doConfirm(message, detail) {\n        let messageText = message;\n        if (detail) {\n            messageText = messageText + '\\n\\n' + detail;\n        }\n        return mainWindow.confirm(messageText);\n    }\n    async prompt(prompt) {\n        let result = undefined;\n        const confirmed = this.doConfirm(prompt.message, prompt.detail);\n        if (confirmed) {\n            const promptButtons = [...(prompt.buttons ?? [])];\n            if (prompt.cancelButton && typeof prompt.cancelButton !== 'string' && typeof prompt.cancelButton !== 'boolean') {\n                promptButtons.push(prompt.cancelButton);\n            }\n            result = await promptButtons[0]?.run({ checkboxChecked: false });\n        }\n        return { result };\n    }\n    async error(message, detail) {\n        await this.prompt({ type: Severity.Error, message, detail });\n    }\n}\nclass StandaloneNotificationService {\n    static { this.NO_OP = new NoOpNotification(); }\n    info(message) {\n        return this.notify({ severity: Severity.Info, message });\n    }\n    warn(message) {\n        return this.notify({ severity: Severity.Warning, message });\n    }\n    error(error) {\n        return this.notify({ severity: Severity.Error, message: error });\n    }\n    notify(notification) {\n        switch (notification.severity) {\n            case Severity.Error:\n                console.error(notification.message);\n                break;\n            case Severity.Warning:\n                console.warn(notification.message);\n                break;\n            default:\n                console.log(notification.message);\n                break;\n        }\n        return StandaloneNotificationService.NO_OP;\n    }\n    prompt(severity, message, choices, options) {\n        return StandaloneNotificationService.NO_OP;\n    }\n    status(message, options) {\n        return { close: () => { } };\n    }\n}\nlet StandaloneCommandService = class StandaloneCommandService {\n    constructor(instantiationService) {\n        this._onWillExecuteCommand = new Emitter();\n        this._onDidExecuteCommand = new Emitter();\n        this.onDidExecuteCommand = this._onDidExecuteCommand.event;\n        this._instantiationService = instantiationService;\n    }\n    executeCommand(id, ...args) {\n        const command = CommandsRegistry.getCommand(id);\n        if (!command) {\n            return Promise.reject(new Error(`command '${id}' not found`));\n        }\n        try {\n            this._onWillExecuteCommand.fire({ commandId: id, args });\n            const result = this._instantiationService.invokeFunction.apply(this._instantiationService, [command.handler, ...args]);\n            this._onDidExecuteCommand.fire({ commandId: id, args });\n            return Promise.resolve(result);\n        }\n        catch (err) {\n            return Promise.reject(err);\n        }\n    }\n};\nStandaloneCommandService = __decorate([\n    __param(0, IInstantiationService)\n], StandaloneCommandService);\nlet StandaloneKeybindingService = class StandaloneKeybindingService extends AbstractKeybindingService {\n    constructor(contextKeyService, commandService, telemetryService, notificationService, logService, codeEditorService) {\n        super(contextKeyService, commandService, telemetryService, notificationService, logService);\n        this._cachedResolver = null;\n        this._dynamicKeybindings = [];\n        this._domNodeListeners = [];\n        const addContainer = (domNode) => {\n            const disposables = new DisposableStore();\n            // for standard keybindings\n            disposables.add(addDisposableListener(domNode, EventType.KEY_DOWN, (e) => {\n                const keyEvent = new StandardKeyboardEvent(e);\n                const shouldPreventDefault = this._dispatch(keyEvent, keyEvent.target);\n                if (shouldPreventDefault) {\n                    keyEvent.preventDefault();\n                    keyEvent.stopPropagation();\n                }\n            }));\n            // for single modifier chord keybindings (e.g. shift shift)\n            disposables.add(addDisposableListener(domNode, EventType.KEY_UP, (e) => {\n                const keyEvent = new StandardKeyboardEvent(e);\n                const shouldPreventDefault = this._singleModifierDispatch(keyEvent, keyEvent.target);\n                if (shouldPreventDefault) {\n                    keyEvent.preventDefault();\n                }\n            }));\n            this._domNodeListeners.push(new DomNodeListeners(domNode, disposables));\n        };\n        const removeContainer = (domNode) => {\n            for (let i = 0; i < this._domNodeListeners.length; i++) {\n                const domNodeListeners = this._domNodeListeners[i];\n                if (domNodeListeners.domNode === domNode) {\n                    this._domNodeListeners.splice(i, 1);\n                    domNodeListeners.dispose();\n                }\n            }\n        };\n        const addCodeEditor = (codeEditor) => {\n            if (codeEditor.getOption(70 /* EditorOption.inDiffEditor */)) {\n                return;\n            }\n            addContainer(codeEditor.getContainerDomNode());\n        };\n        const removeCodeEditor = (codeEditor) => {\n            if (codeEditor.getOption(70 /* EditorOption.inDiffEditor */)) {\n                return;\n            }\n            removeContainer(codeEditor.getContainerDomNode());\n        };\n        this._register(codeEditorService.onCodeEditorAdd(addCodeEditor));\n        this._register(codeEditorService.onCodeEditorRemove(removeCodeEditor));\n        codeEditorService.listCodeEditors().forEach(addCodeEditor);\n        const addDiffEditor = (diffEditor) => {\n            addContainer(diffEditor.getContainerDomNode());\n        };\n        const removeDiffEditor = (diffEditor) => {\n            removeContainer(diffEditor.getContainerDomNode());\n        };\n        this._register(codeEditorService.onDiffEditorAdd(addDiffEditor));\n        this._register(codeEditorService.onDiffEditorRemove(removeDiffEditor));\n        codeEditorService.listDiffEditors().forEach(addDiffEditor);\n    }\n    addDynamicKeybinding(command, keybinding, handler, when) {\n        return combinedDisposable(CommandsRegistry.registerCommand(command, handler), this.addDynamicKeybindings([{\n                keybinding,\n                command,\n                when\n            }]));\n    }\n    addDynamicKeybindings(rules) {\n        const entries = rules.map((rule) => {\n            const keybinding = decodeKeybinding(rule.keybinding, OS);\n            return {\n                keybinding,\n                command: rule.command ?? null,\n                commandArgs: rule.commandArgs,\n                when: rule.when,\n                weight1: 1000,\n                weight2: 0,\n                extensionId: null,\n                isBuiltinExtension: false\n            };\n        });\n        this._dynamicKeybindings = this._dynamicKeybindings.concat(entries);\n        this.updateResolver();\n        return toDisposable(() => {\n            // Search the first entry and remove them all since they will be contiguous\n            for (let i = 0; i < this._dynamicKeybindings.length; i++) {\n                if (this._dynamicKeybindings[i] === entries[0]) {\n                    this._dynamicKeybindings.splice(i, entries.length);\n                    this.updateResolver();\n                    return;\n                }\n            }\n        });\n    }\n    updateResolver() {\n        this._cachedResolver = null;\n        this._onDidUpdateKeybindings.fire();\n    }\n    _getResolver() {\n        if (!this._cachedResolver) {\n            const defaults = this._toNormalizedKeybindingItems(KeybindingsRegistry.getDefaultKeybindings(), true);\n            const overrides = this._toNormalizedKeybindingItems(this._dynamicKeybindings, false);\n            this._cachedResolver = new KeybindingResolver(defaults, overrides, (str) => this._log(str));\n        }\n        return this._cachedResolver;\n    }\n    _documentHasFocus() {\n        return mainWindow.document.hasFocus();\n    }\n    _toNormalizedKeybindingItems(items, isDefault) {\n        const result = [];\n        let resultLen = 0;\n        for (const item of items) {\n            const when = item.when || undefined;\n            const keybinding = item.keybinding;\n            if (!keybinding) {\n                // This might be a removal keybinding item in user settings => accept it\n                result[resultLen++] = new ResolvedKeybindingItem(undefined, item.command, item.commandArgs, when, isDefault, null, false);\n            }\n            else {\n                const resolvedKeybindings = USLayoutResolvedKeybinding.resolveKeybinding(keybinding, OS);\n                for (const resolvedKeybinding of resolvedKeybindings) {\n                    result[resultLen++] = new ResolvedKeybindingItem(resolvedKeybinding, item.command, item.commandArgs, when, isDefault, null, false);\n                }\n            }\n        }\n        return result;\n    }\n    resolveKeyboardEvent(keyboardEvent) {\n        const chord = new KeyCodeChord(keyboardEvent.ctrlKey, keyboardEvent.shiftKey, keyboardEvent.altKey, keyboardEvent.metaKey, keyboardEvent.keyCode);\n        return new USLayoutResolvedKeybinding([chord], OS);\n    }\n};\nStandaloneKeybindingService = __decorate([\n    __param(0, IContextKeyService),\n    __param(1, ICommandService),\n    __param(2, ITelemetryService),\n    __param(3, INotificationService),\n    __param(4, ILogService),\n    __param(5, ICodeEditorService)\n], StandaloneKeybindingService);\nclass DomNodeListeners extends Disposable {\n    constructor(domNode, disposables) {\n        super();\n        this.domNode = domNode;\n        this._register(disposables);\n    }\n}\nfunction isConfigurationOverrides(thing) {\n    return !!thing\n        && typeof thing === 'object'\n        && (!thing.overrideIdentifier || typeof thing.overrideIdentifier === 'string')\n        && (!thing.resource || thing.resource instanceof URI);\n}\nlet StandaloneConfigurationService = class StandaloneConfigurationService {\n    constructor(logService) {\n        this.logService = logService;\n        this._onDidChangeConfiguration = new Emitter();\n        this.onDidChangeConfiguration = this._onDidChangeConfiguration.event;\n        const defaultConfiguration = new DefaultConfiguration(logService);\n        this._configuration = new Configuration(defaultConfiguration.reload(), ConfigurationModel.createEmptyModel(logService), ConfigurationModel.createEmptyModel(logService), ConfigurationModel.createEmptyModel(logService), ConfigurationModel.createEmptyModel(logService), ConfigurationModel.createEmptyModel(logService), new ResourceMap(), ConfigurationModel.createEmptyModel(logService), new ResourceMap(), logService);\n        defaultConfiguration.dispose();\n    }\n    getValue(arg1, arg2) {\n        const section = typeof arg1 === 'string' ? arg1 : undefined;\n        const overrides = isConfigurationOverrides(arg1) ? arg1 : isConfigurationOverrides(arg2) ? arg2 : {};\n        return this._configuration.getValue(section, overrides, undefined);\n    }\n    updateValues(values) {\n        const previous = { data: this._configuration.toData() };\n        const changedKeys = [];\n        for (const entry of values) {\n            const [key, value] = entry;\n            if (this.getValue(key) === value) {\n                continue;\n            }\n            this._configuration.updateValue(key, value);\n            changedKeys.push(key);\n        }\n        if (changedKeys.length > 0) {\n            const configurationChangeEvent = new ConfigurationChangeEvent({ keys: changedKeys, overrides: [] }, previous, this._configuration, undefined, this.logService);\n            configurationChangeEvent.source = 8 /* ConfigurationTarget.MEMORY */;\n            this._onDidChangeConfiguration.fire(configurationChangeEvent);\n        }\n        return Promise.resolve();\n    }\n    updateValue(key, value, arg3, arg4) {\n        return this.updateValues([[key, value]]);\n    }\n    inspect(key, options = {}) {\n        return this._configuration.inspect(key, options, undefined);\n    }\n};\nStandaloneConfigurationService = __decorate([\n    __param(0, ILogService)\n], StandaloneConfigurationService);\nlet StandaloneResourceConfigurationService = class StandaloneResourceConfigurationService {\n    constructor(configurationService, modelService, languageService) {\n        this.configurationService = configurationService;\n        this.modelService = modelService;\n        this.languageService = languageService;\n        this._onDidChangeConfiguration = new Emitter();\n        this.configurationService.onDidChangeConfiguration((e) => {\n            this._onDidChangeConfiguration.fire({ affectedKeys: e.affectedKeys, affectsConfiguration: (resource, configuration) => e.affectsConfiguration(configuration) });\n        });\n    }\n    getValue(resource, arg2, arg3) {\n        const position = Position.isIPosition(arg2) ? arg2 : null;\n        const section = position ? (typeof arg3 === 'string' ? arg3 : undefined) : (typeof arg2 === 'string' ? arg2 : undefined);\n        const language = resource ? this.getLanguage(resource, position) : undefined;\n        if (typeof section === 'undefined') {\n            return this.configurationService.getValue({\n                resource,\n                overrideIdentifier: language\n            });\n        }\n        return this.configurationService.getValue(section, {\n            resource,\n            overrideIdentifier: language\n        });\n    }\n    getLanguage(resource, position) {\n        const model = this.modelService.getModel(resource);\n        if (model) {\n            return position ? model.getLanguageIdAtPosition(position.lineNumber, position.column) : model.getLanguageId();\n        }\n        return this.languageService.guessLanguageIdByFilepathOrFirstLine(resource);\n    }\n};\nStandaloneResourceConfigurationService = __decorate([\n    __param(0, IConfigurationService),\n    __param(1, IModelService),\n    __param(2, ILanguageService)\n], StandaloneResourceConfigurationService);\nlet StandaloneResourcePropertiesService = class StandaloneResourcePropertiesService {\n    constructor(configurationService) {\n        this.configurationService = configurationService;\n    }\n    getEOL(resource, language) {\n        const eol = this.configurationService.getValue('files.eol', { overrideIdentifier: language, resource });\n        if (eol && typeof eol === 'string' && eol !== 'auto') {\n            return eol;\n        }\n        return (isLinux || isMacintosh) ? '\\n' : '\\r\\n';\n    }\n};\nStandaloneResourcePropertiesService = __decorate([\n    __param(0, IConfigurationService)\n], StandaloneResourcePropertiesService);\nclass StandaloneTelemetryService {\n    publicLog2() { }\n}\nclass StandaloneWorkspaceContextService {\n    static { this.SCHEME = 'inmemory'; }\n    constructor() {\n        const resource = URI.from({ scheme: StandaloneWorkspaceContextService.SCHEME, authority: 'model', path: '/' });\n        this.workspace = { id: STANDALONE_EDITOR_WORKSPACE_ID, folders: [new WorkspaceFolder({ uri: resource, name: '', index: 0 })] };\n    }\n    getWorkspace() {\n        return this.workspace;\n    }\n    getWorkspaceFolder(resource) {\n        return resource && resource.scheme === StandaloneWorkspaceContextService.SCHEME ? this.workspace.folders[0] : null;\n    }\n}\nfunction updateConfigurationService(configurationService, source, isDiffEditor) {\n    if (!source) {\n        return;\n    }\n    if (!(configurationService instanceof StandaloneConfigurationService)) {\n        return;\n    }\n    const toUpdate = [];\n    Object.keys(source).forEach((key) => {\n        if (isEditorConfigurationKey(key)) {\n            toUpdate.push([`editor.${key}`, source[key]]);\n        }\n        if (isDiffEditor && isDiffEditorConfigurationKey(key)) {\n            toUpdate.push([`diffEditor.${key}`, source[key]]);\n        }\n    });\n    if (toUpdate.length > 0) {\n        configurationService.updateValues(toUpdate);\n    }\n}\nlet StandaloneBulkEditService = class StandaloneBulkEditService {\n    constructor(_modelService) {\n        this._modelService = _modelService;\n        //\n    }\n    hasPreviewHandler() {\n        return false;\n    }\n    async apply(editsIn, _options) {\n        const edits = Array.isArray(editsIn) ? editsIn : ResourceEdit.convert(editsIn);\n        const textEdits = new Map();\n        for (const edit of edits) {\n            if (!(edit instanceof ResourceTextEdit)) {\n                throw new Error('bad edit - only text edits are supported');\n            }\n            const model = this._modelService.getModel(edit.resource);\n            if (!model) {\n                throw new Error('bad edit - model not found');\n            }\n            if (typeof edit.versionId === 'number' && model.getVersionId() !== edit.versionId) {\n                throw new Error('bad state - model changed in the meantime');\n            }\n            let array = textEdits.get(model);\n            if (!array) {\n                array = [];\n                textEdits.set(model, array);\n            }\n            array.push(EditOperation.replaceMove(Range.lift(edit.textEdit.range), edit.textEdit.text));\n        }\n        let totalEdits = 0;\n        let totalFiles = 0;\n        for (const [model, edits] of textEdits) {\n            model.pushStackElement();\n            model.pushEditOperations([], edits, () => []);\n            model.pushStackElement();\n            totalFiles += 1;\n            totalEdits += edits.length;\n        }\n        return {\n            ariaSummary: format(StandaloneServicesNLS.bulkEditServiceSummary, totalEdits, totalFiles),\n            isApplied: totalEdits > 0\n        };\n    }\n};\nStandaloneBulkEditService = __decorate([\n    __param(0, IModelService)\n], StandaloneBulkEditService);\nclass StandaloneUriLabelService {\n    getUriLabel(resource, options) {\n        if (resource.scheme === 'file') {\n            return resource.fsPath;\n        }\n        return resource.path;\n    }\n    getUriBasenameLabel(resource) {\n        return basename(resource);\n    }\n}\nlet StandaloneContextViewService = class StandaloneContextViewService extends ContextViewService {\n    constructor(layoutService, _codeEditorService) {\n        super(layoutService);\n        this._codeEditorService = _codeEditorService;\n    }\n    showContextView(delegate, container, shadowRoot) {\n        if (!container) {\n            const codeEditor = this._codeEditorService.getFocusedCodeEditor() || this._codeEditorService.getActiveCodeEditor();\n            if (codeEditor) {\n                container = codeEditor.getContainerDomNode();\n            }\n        }\n        return super.showContextView(delegate, container, shadowRoot);\n    }\n};\nStandaloneContextViewService = __decorate([\n    __param(0, ILayoutService),\n    __param(1, ICodeEditorService)\n], StandaloneContextViewService);\nclass StandaloneWorkspaceTrustManagementService {\n    constructor() {\n        this._neverEmitter = new Emitter();\n        this.onDidChangeTrust = this._neverEmitter.event;\n    }\n    isWorkspaceTrusted() {\n        return true;\n    }\n}\nclass StandaloneLanguageService extends LanguageService {\n    constructor() {\n        super();\n    }\n}\nclass StandaloneLogService extends LogService {\n    constructor() {\n        super(new ConsoleLogger());\n    }\n}\nlet StandaloneContextMenuService = class StandaloneContextMenuService extends ContextMenuService {\n    constructor(telemetryService, notificationService, contextViewService, keybindingService, menuService, contextKeyService) {\n        super(telemetryService, notificationService, contextViewService, keybindingService, menuService, contextKeyService);\n        this.configure({ blockMouse: false }); // we do not want that in the standalone editor\n    }\n};\nStandaloneContextMenuService = __decorate([\n    __param(0, ITelemetryService),\n    __param(1, INotificationService),\n    __param(2, IContextViewService),\n    __param(3, IKeybindingService),\n    __param(4, IMenuService),\n    __param(5, IContextKeyService)\n], StandaloneContextMenuService);\nconst standaloneEditorWorkerDescriptor = {\n    esmModuleLocation: undefined,\n    label: 'editorWorkerService'\n};\nlet StandaloneEditorWorkerService = class StandaloneEditorWorkerService extends EditorWorkerService {\n    constructor(modelService, configurationService, logService, languageConfigurationService, languageFeaturesService) {\n        super(standaloneEditorWorkerDescriptor, modelService, configurationService, logService, languageConfigurationService, languageFeaturesService);\n    }\n};\nStandaloneEditorWorkerService = __decorate([\n    __param(0, IModelService),\n    __param(1, ITextResourceConfigurationService),\n    __param(2, ILogService),\n    __param(3, ILanguageConfigurationService),\n    __param(4, ILanguageFeaturesService)\n], StandaloneEditorWorkerService);\nclass StandaloneAccessbilitySignalService {\n    async playSignal(cue, options) {\n    }\n}\nregisterSingleton(ILogService, StandaloneLogService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IConfigurationService, StandaloneConfigurationService, 0 /* InstantiationType.Eager */);\nregisterSingleton(ITextResourceConfigurationService, StandaloneResourceConfigurationService, 0 /* InstantiationType.Eager */);\nregisterSingleton(ITextResourcePropertiesService, StandaloneResourcePropertiesService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IWorkspaceContextService, StandaloneWorkspaceContextService, 0 /* InstantiationType.Eager */);\nregisterSingleton(ILabelService, StandaloneUriLabelService, 0 /* InstantiationType.Eager */);\nregisterSingleton(ITelemetryService, StandaloneTelemetryService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IDialogService, StandaloneDialogService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IEnvironmentService, StandaloneEnvironmentService, 0 /* InstantiationType.Eager */);\nregisterSingleton(INotificationService, StandaloneNotificationService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IMarkerService, MarkerService, 0 /* InstantiationType.Eager */);\nregisterSingleton(ILanguageService, StandaloneLanguageService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IStandaloneThemeService, StandaloneThemeService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IModelService, ModelService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IMarkerDecorationsService, MarkerDecorationsService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IContextKeyService, ContextKeyService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IProgressService, StandaloneProgressService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IEditorProgressService, StandaloneEditorProgressService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IStorageService, InMemoryStorageService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IEditorWorkerService, StandaloneEditorWorkerService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IBulkEditService, StandaloneBulkEditService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IWorkspaceTrustManagementService, StandaloneWorkspaceTrustManagementService, 0 /* InstantiationType.Eager */);\nregisterSingleton(ITextModelService, StandaloneTextModelService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IAccessibilityService, AccessibilityService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IListService, ListService, 0 /* InstantiationType.Eager */);\nregisterSingleton(ICommandService, StandaloneCommandService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IKeybindingService, StandaloneKeybindingService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IQuickInputService, StandaloneQuickInputService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IContextViewService, StandaloneContextViewService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IOpenerService, OpenerService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IClipboardService, BrowserClipboardService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IContextMenuService, StandaloneContextMenuService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IMenuService, MenuService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IAccessibilitySignalService, StandaloneAccessbilitySignalService, 0 /* InstantiationType.Eager */);\nregisterSingleton(ITreeSitterLibraryService, StandaloneTreeSitterLibraryService, 0 /* InstantiationType.Eager */);\nregisterSingleton(ILoggerService, NullLoggerService, 0 /* InstantiationType.Eager */);\nregisterSingleton(IDataChannelService, NullDataChannelService, 0 /* InstantiationType.Eager */);\n/**\n * We don't want to eagerly instantiate services because embedders get a one time chance\n * to override services when they create the first editor.\n */\nvar StandaloneServices;\n(function (StandaloneServices) {\n    const serviceCollection = new ServiceCollection();\n    for (const [id, descriptor] of getSingletonServiceDescriptors()) {\n        serviceCollection.set(id, descriptor);\n    }\n    const instantiationService = new InstantiationService(serviceCollection, true);\n    serviceCollection.set(IInstantiationService, instantiationService);\n    function get(serviceId) {\n        if (!initialized) {\n            initialize({});\n        }\n        const r = serviceCollection.get(serviceId);\n        if (!r) {\n            throw new Error('Missing service ' + serviceId);\n        }\n        if (r instanceof SyncDescriptor) {\n            return instantiationService.invokeFunction((accessor) => accessor.get(serviceId));\n        }\n        else {\n            return r;\n        }\n    }\n    StandaloneServices.get = get;\n    let initialized = false;\n    const onDidInitialize = new Emitter();\n    function initialize(overrides) {\n        if (initialized) {\n            return instantiationService;\n        }\n        initialized = true;\n        // Add singletons that were registered after this module loaded\n        for (const [id, descriptor] of getSingletonServiceDescriptors()) {\n            if (!serviceCollection.get(id)) {\n                serviceCollection.set(id, descriptor);\n            }\n        }\n        // Initialize the service collection with the overrides, but only if the\n        // service was not instantiated in the meantime.\n        for (const serviceId in overrides) {\n            if (overrides.hasOwnProperty(serviceId)) {\n                const serviceIdentifier = createDecorator(serviceId);\n                const r = serviceCollection.get(serviceIdentifier);\n                if (r instanceof SyncDescriptor) {\n                    serviceCollection.set(serviceIdentifier, overrides[serviceId]);\n                }\n            }\n        }\n        // Instantiate all editor features\n        const editorFeatures = getEditorFeatures();\n        for (const feature of editorFeatures) {\n            try {\n                instantiationService.createInstance(feature);\n            }\n            catch (err) {\n                onUnexpectedError(err);\n            }\n        }\n        onDidInitialize.fire();\n        return instantiationService;\n    }\n    StandaloneServices.initialize = initialize;\n    /**\n     * Executes callback once services are initialized.\n     */\n    function withServices(callback) {\n        if (initialized) {\n            return callback();\n        }\n        const disposable = new DisposableStore();\n        const listener = disposable.add(onDidInitialize.event(() => {\n            listener.dispose();\n            disposable.add(callback());\n        }));\n        return disposable;\n    }\n    StandaloneServices.withServices = withServices;\n})(StandaloneServices || (StandaloneServices = {}));\n\nexport { StandaloneCommandService, StandaloneConfigurationService, StandaloneKeybindingService, StandaloneNotificationService, StandaloneServices, updateConfigurationService };\n","import { isHTMLElement } from '../../../../../base/browser/dom.js';\nimport { createTrustedTypesPolicy } from '../../../../../base/browser/trustedTypes.js';\nimport { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';\nimport { createBareFontInfoFromRawSettings } from '../../../../common/config/fontInfoFromSettings.js';\nimport { ILanguageService } from '../../../../common/languages/language.js';\nimport { PLAINTEXT_LANGUAGE_ID } from '../../../../common/languages/modesRegistry.js';\nimport { tokenizeToString } from '../../../../common/languages/textToHtmlTokenizer.js';\nimport { applyFontInfo } from '../../../config/domFontInfo.js';\nimport { isCodeEditor } from '../../../editorBrowser.js';\nimport './renderedMarkdown.css';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar EditorMarkdownCodeBlockRenderer_1;\n/**\n * Renders markdown code blocks using the editor's tokenization and font settings.\n */\nlet EditorMarkdownCodeBlockRenderer = class EditorMarkdownCodeBlockRenderer {\n    static { EditorMarkdownCodeBlockRenderer_1 = this; }\n    static { this._ttpTokenizer = createTrustedTypesPolicy('tokenizeToString', {\n        createHTML(html) {\n            return html;\n        }\n    }); }\n    constructor(_configurationService, _languageService) {\n        this._configurationService = _configurationService;\n        this._languageService = _languageService;\n    }\n    async renderCodeBlock(languageAlias, value, options) {\n        const editor = isCodeEditor(options.context) ? options.context : undefined;\n        // In markdown, it is possible that we stumble upon language aliases (e.g.js instead of javascript).\n        // it is possible no alias is given in which case we fall back to the current editor lang\n        let languageId;\n        if (languageAlias) {\n            languageId = this._languageService.getLanguageIdByLanguageName(languageAlias);\n        }\n        else if (editor) {\n            languageId = editor.getModel()?.getLanguageId();\n        }\n        if (!languageId) {\n            languageId = PLAINTEXT_LANGUAGE_ID;\n        }\n        const html = await tokenizeToString(this._languageService, value, languageId);\n        const content = EditorMarkdownCodeBlockRenderer_1._ttpTokenizer ? EditorMarkdownCodeBlockRenderer_1._ttpTokenizer.createHTML(html) ?? html : html;\n        const root = document.createElement('span');\n        root.innerHTML = content;\n        // eslint-disable-next-line no-restricted-syntax\n        const codeElement = root.querySelector('.monaco-tokenized-source');\n        if (!isHTMLElement(codeElement)) {\n            return document.createElement('span');\n        }\n        applyFontInfo(codeElement, this.getFontInfo(editor));\n        return root;\n    }\n    getFontInfo(editor) {\n        // Use editor's font if we have one\n        if (editor) {\n            return editor.getOption(59 /* EditorOption.fontInfo */);\n        }\n        else {\n            // Otherwise use the global font settings.\n            // Pass in fake pixel ratio of 1 since we only need the font info to apply font family\n            return createBareFontInfoFromRawSettings({\n                fontFamily: this._configurationService.getValue('editor').fontFamily\n            }, 1);\n        }\n    }\n};\nEditorMarkdownCodeBlockRenderer = EditorMarkdownCodeBlockRenderer_1 = __decorate([\n    __param(0, IConfigurationService),\n    __param(1, ILanguageService)\n], EditorMarkdownCodeBlockRenderer);\n\nexport { EditorMarkdownCodeBlockRenderer };\n","import { setARIAContainer } from '../../../base/browser/ui/aria/aria.js';\nimport { Disposable, DisposableStore, toDisposable } from '../../../base/common/lifecycle.js';\nimport { ICodeEditorService } from '../../browser/services/codeEditorService.js';\nimport { CodeEditorWidget } from '../../browser/widget/codeEditor/codeEditorWidget.js';\nimport { InternalEditorAction } from '../../common/editorAction.js';\nimport { StandaloneKeybindingService, updateConfigurationService } from './standaloneServices.js';\nimport { IStandaloneThemeService } from '../common/standaloneTheme.js';\nimport { MenuRegistry, MenuId } from '../../../platform/actions/common/actions.js';\nimport { ICommandService, CommandsRegistry } from '../../../platform/commands/common/commands.js';\nimport { IConfigurationService } from '../../../platform/configuration/common/configuration.js';\nimport { IContextKeyService, ContextKeyExpr } from '../../../platform/contextkey/common/contextkey.js';\nimport { IContextMenuService } from '../../../platform/contextview/browser/contextView.js';\nimport { IInstantiationService } from '../../../platform/instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../../platform/keybinding/common/keybinding.js';\nimport { INotificationService } from '../../../platform/notification/common/notification.js';\nimport { IThemeService } from '../../../platform/theme/common/themeService.js';\nimport { IAccessibilityService } from '../../../platform/accessibility/common/accessibility.js';\nimport { StandaloneCodeEditorNLS } from '../../common/standaloneStrings.js';\nimport { IClipboardService } from '../../../platform/clipboard/common/clipboardService.js';\nimport { IEditorProgressService } from '../../../platform/progress/common/progress.js';\nimport { IModelService } from '../../common/services/model.js';\nimport { ILanguageService } from '../../common/languages/language.js';\nimport { StandaloneCodeEditorService } from './standaloneCodeEditorService.js';\nimport { PLAINTEXT_LANGUAGE_ID } from '../../common/languages/modesRegistry.js';\nimport { ILanguageConfigurationService } from '../../common/languages/languageConfigurationRegistry.js';\nimport { ILanguageFeaturesService } from '../../common/services/languageFeatures.js';\nimport { DiffEditorWidget } from '../../browser/widget/diffEditor/diffEditorWidget.js';\nimport { IAccessibilitySignalService } from '../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';\nimport { mainWindow } from '../../../base/browser/window.js';\nimport { setHoverDelegateFactory } from '../../../base/browser/ui/hover/hoverDelegateFactory.js';\nimport { IHoverService, WorkbenchHoverDelegate } from '../../../platform/hover/browser/hover.js';\nimport { setBaseLayerHoverDelegate } from '../../../base/browser/ui/hover/hoverDelegate2.js';\nimport { IMarkdownRendererService } from '../../../platform/markdown/browser/markdownRenderer.js';\nimport { EditorMarkdownCodeBlockRenderer } from '../../browser/widget/markdownRenderer/browser/editorMarkdownCodeBlockRenderer.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet LAST_GENERATED_COMMAND_ID = 0;\nlet ariaDomNodeCreated = false;\n/**\n * Create ARIA dom node inside parent,\n * or only for the first editor instantiation inside document.body.\n * @param parent container element for ARIA dom node\n */\nfunction createAriaDomNode(parent) {\n    if (!parent) {\n        if (ariaDomNodeCreated) {\n            return;\n        }\n        ariaDomNodeCreated = true;\n    }\n    setARIAContainer(parent || mainWindow.document.body);\n}\n/**\n * A code editor to be used both by the standalone editor and the standalone diff editor.\n */\nlet StandaloneCodeEditor = class StandaloneCodeEditor extends CodeEditorWidget {\n    constructor(domElement, _options, instantiationService, codeEditorService, commandService, contextKeyService, hoverService, keybindingService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService, markdownRendererService) {\n        const options = { ..._options };\n        options.ariaLabel = options.ariaLabel || StandaloneCodeEditorNLS.editorViewAccessibleLabel;\n        super(domElement, options, {}, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService);\n        if (keybindingService instanceof StandaloneKeybindingService) {\n            this._standaloneKeybindingService = keybindingService;\n        }\n        else {\n            this._standaloneKeybindingService = null;\n        }\n        createAriaDomNode(options.ariaContainerElement);\n        setHoverDelegateFactory((placement, enableInstantHover) => instantiationService.createInstance(WorkbenchHoverDelegate, placement, { instantHover: enableInstantHover }, {}));\n        setBaseLayerHoverDelegate(hoverService);\n        markdownRendererService.setDefaultCodeBlockRenderer(instantiationService.createInstance(EditorMarkdownCodeBlockRenderer));\n    }\n    addCommand(keybinding, handler, context) {\n        if (!this._standaloneKeybindingService) {\n            console.warn('Cannot add command because the editor is configured with an unrecognized KeybindingService');\n            return null;\n        }\n        const commandId = 'DYNAMIC_' + (++LAST_GENERATED_COMMAND_ID);\n        const whenExpression = ContextKeyExpr.deserialize(context);\n        this._standaloneKeybindingService.addDynamicKeybinding(commandId, keybinding, handler, whenExpression);\n        return commandId;\n    }\n    createContextKey(key, defaultValue) {\n        return this._contextKeyService.createKey(key, defaultValue);\n    }\n    addAction(_descriptor) {\n        if ((typeof _descriptor.id !== 'string') || (typeof _descriptor.label !== 'string') || (typeof _descriptor.run !== 'function')) {\n            throw new Error('Invalid action descriptor, `id`, `label` and `run` are required properties!');\n        }\n        if (!this._standaloneKeybindingService) {\n            console.warn('Cannot add keybinding because the editor is configured with an unrecognized KeybindingService');\n            return Disposable.None;\n        }\n        // Read descriptor options\n        const id = _descriptor.id;\n        const label = _descriptor.label;\n        const precondition = ContextKeyExpr.and(ContextKeyExpr.equals('editorId', this.getId()), ContextKeyExpr.deserialize(_descriptor.precondition));\n        const keybindings = _descriptor.keybindings;\n        const keybindingsWhen = ContextKeyExpr.and(precondition, ContextKeyExpr.deserialize(_descriptor.keybindingContext));\n        const contextMenuGroupId = _descriptor.contextMenuGroupId || null;\n        const contextMenuOrder = _descriptor.contextMenuOrder || 0;\n        const run = (_accessor, ...args) => {\n            return Promise.resolve(_descriptor.run(this, ...args));\n        };\n        const toDispose = new DisposableStore();\n        // Generate a unique id to allow the same descriptor.id across multiple editor instances\n        const uniqueId = this.getId() + ':' + id;\n        // Register the command\n        toDispose.add(CommandsRegistry.registerCommand(uniqueId, run));\n        // Register the context menu item\n        if (contextMenuGroupId) {\n            const menuItem = {\n                command: {\n                    id: uniqueId,\n                    title: label\n                },\n                when: precondition,\n                group: contextMenuGroupId,\n                order: contextMenuOrder\n            };\n            toDispose.add(MenuRegistry.appendMenuItem(MenuId.EditorContext, menuItem));\n        }\n        // Register the keybindings\n        if (Array.isArray(keybindings)) {\n            for (const kb of keybindings) {\n                toDispose.add(this._standaloneKeybindingService.addDynamicKeybinding(uniqueId, kb, run, keybindingsWhen));\n            }\n        }\n        // Finally, register an internal editor action\n        const internalAction = new InternalEditorAction(uniqueId, label, label, undefined, precondition, (...args) => Promise.resolve(_descriptor.run(this, ...args)), this._contextKeyService);\n        // Store it under the original id, such that trigger with the original id will work\n        this._actions.set(id, internalAction);\n        toDispose.add(toDisposable(() => {\n            this._actions.delete(id);\n        }));\n        return toDispose;\n    }\n    _triggerCommand(handlerId, payload) {\n        if (this._codeEditorService instanceof StandaloneCodeEditorService) {\n            // Help commands find this editor as the active editor\n            try {\n                this._codeEditorService.setActiveCodeEditor(this);\n                super._triggerCommand(handlerId, payload);\n            }\n            finally {\n                this._codeEditorService.setActiveCodeEditor(null);\n            }\n        }\n        else {\n            super._triggerCommand(handlerId, payload);\n        }\n    }\n};\nStandaloneCodeEditor = __decorate([\n    __param(2, IInstantiationService),\n    __param(3, ICodeEditorService),\n    __param(4, ICommandService),\n    __param(5, IContextKeyService),\n    __param(6, IHoverService),\n    __param(7, IKeybindingService),\n    __param(8, IThemeService),\n    __param(9, INotificationService),\n    __param(10, IAccessibilityService),\n    __param(11, ILanguageConfigurationService),\n    __param(12, ILanguageFeaturesService),\n    __param(13, IMarkdownRendererService)\n], StandaloneCodeEditor);\nlet StandaloneEditor = class StandaloneEditor extends StandaloneCodeEditor {\n    constructor(domElement, _options, instantiationService, codeEditorService, commandService, contextKeyService, hoverService, keybindingService, themeService, notificationService, configurationService, accessibilityService, modelService, languageService, languageConfigurationService, languageFeaturesService, markdownRendererService) {\n        const options = { ..._options };\n        updateConfigurationService(configurationService, options, false);\n        const themeDomRegistration = themeService.registerEditorContainer(domElement);\n        if (typeof options.theme === 'string') {\n            themeService.setTheme(options.theme);\n        }\n        if (typeof options.autoDetectHighContrast !== 'undefined') {\n            themeService.setAutoDetectHighContrast(Boolean(options.autoDetectHighContrast));\n        }\n        const _model = options.model;\n        delete options.model;\n        super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, hoverService, keybindingService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService, markdownRendererService);\n        this._configurationService = configurationService;\n        this._standaloneThemeService = themeService;\n        this._register(themeDomRegistration);\n        let model;\n        if (typeof _model === 'undefined') {\n            const languageId = languageService.getLanguageIdByMimeType(options.language) || options.language || PLAINTEXT_LANGUAGE_ID;\n            model = createTextModel(modelService, languageService, options.value || '', languageId, undefined);\n            this._ownsModel = true;\n        }\n        else {\n            model = _model;\n            this._ownsModel = false;\n        }\n        this._attachModel(model);\n        if (model) {\n            const e = {\n                oldModelUrl: null,\n                newModelUrl: model.uri\n            };\n            this._onDidChangeModel.fire(e);\n        }\n    }\n    dispose() {\n        super.dispose();\n    }\n    updateOptions(newOptions) {\n        updateConfigurationService(this._configurationService, newOptions, false);\n        if (typeof newOptions.theme === 'string') {\n            this._standaloneThemeService.setTheme(newOptions.theme);\n        }\n        if (typeof newOptions.autoDetectHighContrast !== 'undefined') {\n            this._standaloneThemeService.setAutoDetectHighContrast(Boolean(newOptions.autoDetectHighContrast));\n        }\n        super.updateOptions(newOptions);\n    }\n    _postDetachModelCleanup(detachedModel) {\n        super._postDetachModelCleanup(detachedModel);\n        if (detachedModel && this._ownsModel) {\n            detachedModel.dispose();\n            this._ownsModel = false;\n        }\n    }\n};\nStandaloneEditor = __decorate([\n    __param(2, IInstantiationService),\n    __param(3, ICodeEditorService),\n    __param(4, ICommandService),\n    __param(5, IContextKeyService),\n    __param(6, IHoverService),\n    __param(7, IKeybindingService),\n    __param(8, IStandaloneThemeService),\n    __param(9, INotificationService),\n    __param(10, IConfigurationService),\n    __param(11, IAccessibilityService),\n    __param(12, IModelService),\n    __param(13, ILanguageService),\n    __param(14, ILanguageConfigurationService),\n    __param(15, ILanguageFeaturesService),\n    __param(16, IMarkdownRendererService)\n], StandaloneEditor);\nlet StandaloneDiffEditor2 = class StandaloneDiffEditor2 extends DiffEditorWidget {\n    constructor(domElement, _options, instantiationService, contextKeyService, codeEditorService, themeService, notificationService, configurationService, contextMenuService, editorProgressService, clipboardService, accessibilitySignalService) {\n        const options = { ..._options };\n        updateConfigurationService(configurationService, options, true);\n        const themeDomRegistration = themeService.registerEditorContainer(domElement);\n        if (typeof options.theme === 'string') {\n            themeService.setTheme(options.theme);\n        }\n        if (typeof options.autoDetectHighContrast !== 'undefined') {\n            themeService.setAutoDetectHighContrast(Boolean(options.autoDetectHighContrast));\n        }\n        super(domElement, options, {}, contextKeyService, instantiationService, codeEditorService, accessibilitySignalService, editorProgressService);\n        this._configurationService = configurationService;\n        this._standaloneThemeService = themeService;\n        this._register(themeDomRegistration);\n    }\n    dispose() {\n        super.dispose();\n    }\n    updateOptions(newOptions) {\n        updateConfigurationService(this._configurationService, newOptions, true);\n        if (typeof newOptions.theme === 'string') {\n            this._standaloneThemeService.setTheme(newOptions.theme);\n        }\n        if (typeof newOptions.autoDetectHighContrast !== 'undefined') {\n            this._standaloneThemeService.setAutoDetectHighContrast(Boolean(newOptions.autoDetectHighContrast));\n        }\n        super.updateOptions(newOptions);\n    }\n    _createInnerEditor(instantiationService, container, options) {\n        return instantiationService.createInstance(StandaloneCodeEditor, container, options);\n    }\n    getOriginalEditor() {\n        return super.getOriginalEditor();\n    }\n    getModifiedEditor() {\n        return super.getModifiedEditor();\n    }\n    addCommand(keybinding, handler, context) {\n        return this.getModifiedEditor().addCommand(keybinding, handler, context);\n    }\n    createContextKey(key, defaultValue) {\n        return this.getModifiedEditor().createContextKey(key, defaultValue);\n    }\n    addAction(descriptor) {\n        return this.getModifiedEditor().addAction(descriptor);\n    }\n};\nStandaloneDiffEditor2 = __decorate([\n    __param(2, IInstantiationService),\n    __param(3, IContextKeyService),\n    __param(4, ICodeEditorService),\n    __param(5, IStandaloneThemeService),\n    __param(6, INotificationService),\n    __param(7, IConfigurationService),\n    __param(8, IContextMenuService),\n    __param(9, IEditorProgressService),\n    __param(10, IClipboardService),\n    __param(11, IAccessibilitySignalService)\n], StandaloneDiffEditor2);\n/**\n * @internal\n */\nfunction createTextModel(modelService, languageService, value, languageId, uri) {\n    value = value || '';\n    if (!languageId) {\n        const firstLF = value.indexOf('\\n');\n        let firstLine = value;\n        if (firstLF !== -1) {\n            firstLine = value.substring(0, firstLF);\n        }\n        return doCreateModel(modelService, value, languageService.createByFilepathOrFirstLine(uri || null, firstLine), uri);\n    }\n    return doCreateModel(modelService, value, languageService.createById(languageId), uri);\n}\n/**\n * @internal\n */\nfunction doCreateModel(modelService, value, languageSelection, uri) {\n    return modelService.createModel(value, languageSelection, uri);\n}\n\nexport { StandaloneCodeEditor, StandaloneDiffEditor2, StandaloneEditor, createTextModel };\n","import { localize } from '../../../../nls.js';\nimport { registerColor } from '../../../../platform/theme/common/colorUtils.js';\nimport '../../../../platform/theme/common/colors/baseColors.js';\nimport '../../../../platform/theme/common/colors/chartsColors.js';\nimport { editorBackground } from '../../../../platform/theme/common/colors/editorColors.js';\nimport '../../../../platform/theme/common/colors/inputColors.js';\nimport '../../../../platform/theme/common/colors/listColors.js';\nimport '../../../../platform/theme/common/colors/menuColors.js';\nimport '../../../../platform/theme/common/colors/minimapColors.js';\nimport '../../../../platform/theme/common/colors/miscColors.js';\nimport '../../../../platform/theme/common/colors/quickpickColors.js';\nimport '../../../../platform/theme/common/colors/searchColors.js';\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 *--------------------------------------------------------------------------------------------*/\nregisterColor('multiDiffEditor.headerBackground', { dark: '#262626', light: 'tab.inactiveBackground', hcDark: 'tab.inactiveBackground', hcLight: 'tab.inactiveBackground', }, localize(142, 'The background color of the diff editor\\'s header'));\nregisterColor('multiDiffEditor.background', editorBackground, localize(143, 'The background color of the multi file diff editor'));\nregisterColor('multiDiffEditor.border', { dark: 'sideBarSectionHeader.border', light: '#cccccc', hcDark: 'sideBarSectionHeader.border', hcLight: '#cccccc', }, localize(144, 'The border color of the multi file diff editor'));\n","import { h } from '../../../../base/browser/dom.js';\nimport { Button } from '../../../../base/browser/ui/button/button.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { createActionViewItem } from '../../../../platform/actions/browser/menuEntryActionViewItem.js';\nimport { MenuWorkbenchToolBar } from '../../../../platform/actions/browser/toolbar.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { ServiceCollection } from '../../../../platform/instantiation/common/serviceCollection.js';\nimport { observableCodeEditor } from '../../observableCodeEditor.js';\nimport { DiffEditorWidget } from '../diffEditor/diffEditorWidget.js';\nimport { ActionRunnerWithContext } from './utils.js';\nimport { globalTransaction } from '../../../../base/common/observableInternal/transaction.js';\nimport { observableValue } from '../../../../base/common/observableInternal/observables/observableValue.js';\nimport { derived } from '../../../../base/common/observableInternal/observables/derived.js';\nimport { autorun } from '../../../../base/common/observableInternal/reactions/autorun.js';\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nclass TemplateData {\n    constructor(viewModel, deltaScrollVertical) {\n        this.viewModel = viewModel;\n        this.deltaScrollVertical = deltaScrollVertical;\n    }\n    getId() {\n        return this.viewModel;\n    }\n}\nlet DiffEditorItemTemplate = class DiffEditorItemTemplate extends Disposable {\n    constructor(_container, _overflowWidgetsDomNode, _workbenchUIElementFactory, _instantiationService, _parentContextKeyService) {\n        super();\n        this._container = _container;\n        this._overflowWidgetsDomNode = _overflowWidgetsDomNode;\n        this._workbenchUIElementFactory = _workbenchUIElementFactory;\n        this._instantiationService = _instantiationService;\n        this._viewModel = observableValue(this, undefined);\n        this._collapsed = derived(this, reader => this._viewModel.read(reader)?.collapsed.read(reader));\n        this._editorContentHeight = observableValue(this, 500);\n        this.contentHeight = derived(this, reader => {\n            const h = this._collapsed.read(reader) ? 0 : this._editorContentHeight.read(reader);\n            return h + this._outerEditorHeight;\n        });\n        this._modifiedContentWidth = observableValue(this, 0);\n        this._modifiedWidth = observableValue(this, 0);\n        this._originalContentWidth = observableValue(this, 0);\n        this._originalWidth = observableValue(this, 0);\n        this.maxScroll = derived(this, reader => {\n            const scroll1 = this._modifiedContentWidth.read(reader) - this._modifiedWidth.read(reader);\n            const scroll2 = this._originalContentWidth.read(reader) - this._originalWidth.read(reader);\n            if (scroll1 > scroll2) {\n                return { maxScroll: scroll1, width: this._modifiedWidth.read(reader) };\n            }\n            else {\n                return { maxScroll: scroll2, width: this._originalWidth.read(reader) };\n            }\n        });\n        this._elements = h('div.multiDiffEntry', [\n            h('div.header@header', [\n                h('div.header-content', [\n                    h('div.collapse-button@collapseButton'),\n                    h('div.file-path', [\n                        // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n                        h('div.title.modified.show-file-icons@primaryPath', []),\n                        h('div.status.deleted@status', ['R']),\n                        // eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n                        h('div.title.original.show-file-icons@secondaryPath', []),\n                    ]),\n                    h('div.actions@actions'),\n                ]),\n            ]),\n            h('div.editorParent', [\n                h('div.editorContainer@editor'),\n            ])\n        ]);\n        this.editor = this._register(this._instantiationService.createInstance(DiffEditorWidget, this._elements.editor, {\n            overflowWidgetsDomNode: this._overflowWidgetsDomNode,\n            fixedOverflowWidgets: true\n        }, {}));\n        this.isModifedFocused = observableCodeEditor(this.editor.getModifiedEditor()).isFocused;\n        this.isOriginalFocused = observableCodeEditor(this.editor.getOriginalEditor()).isFocused;\n        this.isFocused = derived(this, reader => this.isModifedFocused.read(reader) || this.isOriginalFocused.read(reader));\n        this._resourceLabel = this._workbenchUIElementFactory.createResourceLabel\n            ? this._register(this._workbenchUIElementFactory.createResourceLabel(this._elements.primaryPath))\n            : undefined;\n        this._resourceLabel2 = this._workbenchUIElementFactory.createResourceLabel\n            ? this._register(this._workbenchUIElementFactory.createResourceLabel(this._elements.secondaryPath))\n            : undefined;\n        this._dataStore = this._register(new DisposableStore());\n        this._headerHeight = 40;\n        this._lastScrollTop = -1;\n        this._isSettingScrollTop = false;\n        const btn = new Button(this._elements.collapseButton, {});\n        this._register(autorun(reader => {\n            btn.element.className = '';\n            btn.icon = this._collapsed.read(reader) ? Codicon.chevronRight : Codicon.chevronDown;\n        }));\n        this._register(btn.onDidClick(() => {\n            this._viewModel.get()?.collapsed.set(!this._collapsed.get(), undefined);\n        }));\n        this._register(autorun(reader => {\n            this._elements.editor.style.display = this._collapsed.read(reader) ? 'none' : 'block';\n        }));\n        this._register(this.editor.getModifiedEditor().onDidLayoutChange(e => {\n            const width = this.editor.getModifiedEditor().getLayoutInfo().contentWidth;\n            this._modifiedWidth.set(width, undefined);\n        }));\n        this._register(this.editor.getOriginalEditor().onDidLayoutChange(e => {\n            const width = this.editor.getOriginalEditor().getLayoutInfo().contentWidth;\n            this._originalWidth.set(width, undefined);\n        }));\n        this._register(this.editor.onDidContentSizeChange(e => {\n            globalTransaction(tx => {\n                this._editorContentHeight.set(e.contentHeight, tx);\n                this._modifiedContentWidth.set(this.editor.getModifiedEditor().getContentWidth(), tx);\n                this._originalContentWidth.set(this.editor.getOriginalEditor().getContentWidth(), tx);\n            });\n        }));\n        this._register(this.editor.getOriginalEditor().onDidScrollChange(e => {\n            if (this._isSettingScrollTop) {\n                return;\n            }\n            if (!e.scrollTopChanged || !this._data) {\n                return;\n            }\n            const delta = e.scrollTop - this._lastScrollTop;\n            this._data.deltaScrollVertical(delta);\n        }));\n        this._register(autorun(reader => {\n            const isActive = this._viewModel.read(reader)?.isActive.read(reader);\n            this._elements.root.classList.toggle('active', isActive);\n        }));\n        this._container.appendChild(this._elements.root);\n        this._outerEditorHeight = this._headerHeight;\n        this._contextKeyService = this._register(_parentContextKeyService.createScoped(this._elements.actions));\n        const instantiationService = this._register(this._instantiationService.createChild(new ServiceCollection([IContextKeyService, this._contextKeyService])));\n        this._register(instantiationService.createInstance(MenuWorkbenchToolBar, this._elements.actions, MenuId.MultiDiffEditorFileToolbar, {\n            actionRunner: this._register(new ActionRunnerWithContext(() => (this._viewModel.get()?.modifiedUri ?? this._viewModel.get()?.originalUri))),\n            menuOptions: {\n                shouldForwardArgs: true,\n            },\n            toolbarOptions: { primaryGroup: g => g.startsWith('navigation') },\n            actionViewItemProvider: (action, options) => createActionViewItem(instantiationService, action, options),\n        }));\n    }\n    setScrollLeft(left) {\n        if (this._modifiedContentWidth.get() - this._modifiedWidth.get() > this._originalContentWidth.get() - this._originalWidth.get()) {\n            this.editor.getModifiedEditor().setScrollLeft(left);\n        }\n        else {\n            this.editor.getOriginalEditor().setScrollLeft(left);\n        }\n    }\n    setData(data) {\n        this._data = data;\n        function updateOptions(options) {\n            return {\n                ...options,\n                scrollBeyondLastLine: false,\n                hideUnchangedRegions: {\n                    enabled: true,\n                },\n                scrollbar: {\n                    vertical: 'hidden',\n                    horizontal: 'hidden',\n                    handleMouseWheel: false,\n                    useShadows: false,\n                },\n                renderOverviewRuler: false,\n                fixedOverflowWidgets: true,\n                overviewRulerBorder: false,\n            };\n        }\n        if (!data) {\n            globalTransaction(tx => {\n                this._viewModel.set(undefined, tx);\n                this.editor.setDiffModel(null, tx);\n                this._dataStore.clear();\n            });\n            return;\n        }\n        const value = data.viewModel.documentDiffItem;\n        globalTransaction(tx => {\n            this._resourceLabel?.setUri(data.viewModel.modifiedUri ?? data.viewModel.originalUri, { strikethrough: data.viewModel.modifiedUri === undefined });\n            let isRenamed = false;\n            let isDeleted = false;\n            let isAdded = false;\n            let flag = '';\n            if (data.viewModel.modifiedUri && data.viewModel.originalUri && data.viewModel.modifiedUri.path !== data.viewModel.originalUri.path) {\n                flag = 'R';\n                isRenamed = true;\n            }\n            else if (!data.viewModel.modifiedUri) {\n                flag = 'D';\n                isDeleted = true;\n            }\n            else if (!data.viewModel.originalUri) {\n                flag = 'A';\n                isAdded = true;\n            }\n            this._elements.status.classList.toggle('renamed', isRenamed);\n            this._elements.status.classList.toggle('deleted', isDeleted);\n            this._elements.status.classList.toggle('added', isAdded);\n            this._elements.status.innerText = flag;\n            this._resourceLabel2?.setUri(isRenamed ? data.viewModel.originalUri : undefined, { strikethrough: true });\n            this._dataStore.clear();\n            this._viewModel.set(data.viewModel, tx);\n            this.editor.setDiffModel(data.viewModel.diffEditorViewModelRef, tx);\n            this.editor.updateOptions(updateOptions(value.options ?? {}));\n        });\n        if (value.onOptionsDidChange) {\n            this._dataStore.add(value.onOptionsDidChange(() => {\n                this.editor.updateOptions(updateOptions(value.options ?? {}));\n            }));\n        }\n        data.viewModel.isAlive.recomputeInitiallyAndOnChange(this._dataStore, value => {\n            if (!value) {\n                this.setData(undefined);\n            }\n        });\n        if (data.viewModel.documentDiffItem.contextKeys) {\n            for (const [key, value] of Object.entries(data.viewModel.documentDiffItem.contextKeys)) {\n                this._contextKeyService.createKey(key, value);\n            }\n        }\n    }\n    render(verticalRange, width, editorScroll, viewPort) {\n        this._elements.root.style.visibility = 'visible';\n        this._elements.root.style.top = `${verticalRange.start}px`;\n        this._elements.root.style.height = `${verticalRange.length}px`;\n        this._elements.root.style.width = `${width}px`;\n        this._elements.root.style.position = 'absolute';\n        // For sticky scroll\n        const maxDelta = verticalRange.length - this._headerHeight;\n        const delta = Math.max(0, Math.min(viewPort.start - verticalRange.start, maxDelta));\n        this._elements.header.style.transform = `translateY(${delta}px)`;\n        globalTransaction(tx => {\n            this.editor.layout({\n                width: width - 2 * 8 - 2 * 1,\n                height: verticalRange.length - this._outerEditorHeight,\n            });\n        });\n        try {\n            this._isSettingScrollTop = true;\n            this._lastScrollTop = editorScroll;\n            this.editor.getOriginalEditor().setScrollTop(editorScroll);\n        }\n        finally {\n            this._isSettingScrollTop = false;\n        }\n        this._elements.header.classList.toggle('shadow', delta > 0 || editorScroll > 0);\n        this._elements.header.classList.toggle('collapsed', delta === maxDelta);\n    }\n    hide() {\n        this._elements.root.style.top = `-100000px`;\n        this._elements.root.style.visibility = 'hidden'; // Some editor parts are still visible\n    }\n};\nDiffEditorItemTemplate = __decorate([\n    __param(3, IInstantiationService),\n    __param(4, IContextKeyService)\n], DiffEditorItemTemplate);\n\nexport { DiffEditorItemTemplate, TemplateData };\n","class ObjectPool {\n    constructor(_create) {\n        this._create = _create;\n        this._unused = new Set();\n        this._used = new Set();\n        this._itemData = new Map();\n    }\n    getUnusedObj(data) {\n        let obj;\n        if (this._unused.size === 0) {\n            obj = this._create(data);\n            this._itemData.set(obj, data);\n        }\n        else {\n            const values = [...this._unused.values()];\n            obj = values.find(obj => this._itemData.get(obj).getId() === data.getId()) ?? values[0];\n            this._unused.delete(obj);\n            this._itemData.set(obj, data);\n            obj.setData(data);\n        }\n        this._used.add(obj);\n        return {\n            object: obj,\n            dispose: () => {\n                this._used.delete(obj);\n                if (this._unused.size > 5) {\n                    obj.dispose();\n                }\n                else {\n                    this._unused.add(obj);\n                }\n            }\n        };\n    }\n    dispose() {\n        for (const obj of this._used) {\n            obj.dispose();\n        }\n        for (const obj of this._unused) {\n            obj.dispose();\n        }\n        this._used.clear();\n        this._unused.clear();\n    }\n}\n\nexport { ObjectPool };\n","import { h, scheduleAtNextAnimationFrame, getWindow } from '../../../../base/browser/dom.js';\nimport { SmoothScrollableElement } from '../../../../base/browser/ui/scrollbar/scrollableElement.js';\nimport { compareBy, numberComparator } from '../../../../base/common/arrays.js';\nimport { findFirstMax } from '../../../../base/common/arraysFind.js';\nimport { BugIndicatingError } from '../../../../base/common/errors.js';\nimport { Disposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { Scrollable } from '../../../../base/common/scrollable.js';\nimport { localize } from '../../../../nls.js';\nimport { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { ServiceCollection } from '../../../../platform/instantiation/common/serviceCollection.js';\nimport { OffsetRange } from '../../../common/core/ranges/offsetRange.js';\nimport { Selection } from '../../../common/core/selection.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { ObservableElementSizeObserver } from '../diffEditor/utils.js';\nimport { DiffEditorItemTemplate, TemplateData } from './diffEditorItemTemplate.js';\nimport { ObjectPool } from './objectPool.js';\nimport './style.css';\nimport { observableFromEvent } from '../../../../base/common/observableInternal/observables/observableFromEvent.js';\nimport { derived } from '../../../../base/common/observableInternal/observables/derived.js';\nimport { transaction, globalTransaction } from '../../../../base/common/observableInternal/transaction.js';\nimport { autorunWithStore, autorun } from '../../../../base/common/observableInternal/reactions/autorun.js';\nimport { disposableObservableValue, observableValue } from '../../../../base/common/observableInternal/observables/observableValue.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet MultiDiffEditorWidgetImpl = class MultiDiffEditorWidgetImpl extends Disposable {\n    constructor(_element, _dimension, _viewModel, _workbenchUIElementFactory, _parentContextKeyService, _parentInstantiationService) {\n        super();\n        this._element = _element;\n        this._dimension = _dimension;\n        this._viewModel = _viewModel;\n        this._workbenchUIElementFactory = _workbenchUIElementFactory;\n        this._parentContextKeyService = _parentContextKeyService;\n        this._parentInstantiationService = _parentInstantiationService;\n        this._scrollableElements = h('div.scrollContent', [\n            h('div@content', {\n                style: {\n                    overflow: 'hidden',\n                }\n            }),\n            h('div.monaco-editor@overflowWidgetsDomNode', {}),\n        ]);\n        this._scrollable = this._register(new Scrollable({\n            forceIntegerValues: false,\n            scheduleAtNextAnimationFrame: (cb) => scheduleAtNextAnimationFrame(getWindow(this._element), cb),\n            smoothScrollDuration: 100,\n        }));\n        this._scrollableElement = this._register(new SmoothScrollableElement(this._scrollableElements.root, {\n            vertical: 1 /* ScrollbarVisibility.Auto */,\n            horizontal: 1 /* ScrollbarVisibility.Auto */,\n            useShadows: false,\n        }, this._scrollable));\n        this._elements = h('div.monaco-component.multiDiffEditor', {}, [\n            h('div', {}, [this._scrollableElement.getDomNode()]),\n            h('div.placeholder@placeholder', {}, [h('div')]),\n        ]);\n        this._sizeObserver = this._register(new ObservableElementSizeObserver(this._element, undefined));\n        this._objectPool = this._register(new ObjectPool((data) => {\n            const template = this._instantiationService.createInstance(DiffEditorItemTemplate, this._scrollableElements.content, this._scrollableElements.overflowWidgetsDomNode, this._workbenchUIElementFactory);\n            template.setData(data);\n            return template;\n        }));\n        this.scrollTop = observableFromEvent(this, this._scrollableElement.onScroll, () => /** @description scrollTop */ this._scrollableElement.getScrollPosition().scrollTop);\n        this.scrollLeft = observableFromEvent(this, this._scrollableElement.onScroll, () => /** @description scrollLeft */ this._scrollableElement.getScrollPosition().scrollLeft);\n        this._viewItemsInfo = derived(this, (reader) => {\n            const vm = this._viewModel.read(reader);\n            if (!vm) {\n                return { items: [], getItem: _d => { throw new BugIndicatingError(); } };\n            }\n            const viewModels = vm.items.read(reader);\n            const map = new Map();\n            const items = viewModels.map(d => {\n                const item = reader.store.add(new VirtualizedViewItem(d, this._objectPool, this.scrollLeft, delta => {\n                    this._scrollableElement.setScrollPosition({ scrollTop: this._scrollableElement.getScrollPosition().scrollTop + delta });\n                }));\n                const data = this._lastDocStates?.[item.getKey()];\n                if (data) {\n                    transaction(tx => {\n                        item.setViewState(data, tx);\n                    });\n                }\n                map.set(d, item);\n                return item;\n            });\n            return { items, getItem: d => map.get(d) };\n        });\n        this._viewItems = this._viewItemsInfo.map(this, items => items.items);\n        this._spaceBetweenPx = 0;\n        this._totalHeight = this._viewItems.map(this, (items, reader) => items.reduce((r, i) => r + i.contentHeight.read(reader) + this._spaceBetweenPx, 0));\n        this.activeControl = derived(this, reader => {\n            const activeDiffItem = this._viewModel.read(reader)?.activeDiffItem.read(reader);\n            if (!activeDiffItem) {\n                return undefined;\n            }\n            const viewItem = this._viewItemsInfo.read(reader).getItem(activeDiffItem);\n            return viewItem.template.read(reader)?.editor;\n        });\n        this._contextKeyService = this._register(this._parentContextKeyService.createScoped(this._element));\n        this._instantiationService = this._register(this._parentInstantiationService.createChild(new ServiceCollection([IContextKeyService, this._contextKeyService])));\n        this._contextKeyService.createKey(EditorContextKeys.inMultiDiffEditor.key, true);\n        this._lastDocStates = {};\n        this._register(autorunWithStore((reader, store) => {\n            const viewModel = this._viewModel.read(reader);\n            if (viewModel && viewModel.contextKeys) {\n                for (const [key, value] of Object.entries(viewModel.contextKeys)) {\n                    const contextKey = this._contextKeyService.createKey(key, undefined);\n                    contextKey.set(value);\n                    store.add(toDisposable(() => contextKey.reset()));\n                }\n            }\n        }));\n        const ctxAllCollapsed = this._parentContextKeyService.createKey(EditorContextKeys.multiDiffEditorAllCollapsed.key, false);\n        this._register(autorun((reader) => {\n            const viewModel = this._viewModel.read(reader);\n            if (viewModel) {\n                const allCollapsed = viewModel.items.read(reader).every(item => item.collapsed.read(reader));\n                ctxAllCollapsed.set(allCollapsed);\n            }\n        }));\n        this._register(autorun((reader) => {\n            /** @description Update widget dimension */\n            const dimension = this._dimension.read(reader);\n            this._sizeObserver.observe(dimension);\n        }));\n        const placeholderMessage = derived(reader => {\n            const items = this._viewItems.read(reader);\n            if (items.length > 0) {\n                return undefined;\n            }\n            const vm = this._viewModel.read(reader);\n            return (!vm || vm.isLoading.read(reader))\n                ? localize(145, 'Loading...')\n                : localize(146, 'No Changed Files');\n        });\n        this._register(autorun((reader) => {\n            const message = placeholderMessage.read(reader);\n            this._elements.placeholder.innerText = message ?? '';\n            this._elements.placeholder.classList.toggle('visible', !!message);\n        }));\n        this._scrollableElements.content.style.position = 'relative';\n        this._register(autorun((reader) => {\n            /** @description Update scroll dimensions */\n            const height = this._sizeObserver.height.read(reader);\n            this._scrollableElements.root.style.height = `${height}px`;\n            const totalHeight = this._totalHeight.read(reader);\n            this._scrollableElements.content.style.height = `${totalHeight}px`;\n            const width = this._sizeObserver.width.read(reader);\n            let scrollWidth = width;\n            const viewItems = this._viewItems.read(reader);\n            const max = findFirstMax(viewItems, compareBy(i => i.maxScroll.read(reader).maxScroll, numberComparator));\n            if (max) {\n                const maxScroll = max.maxScroll.read(reader);\n                scrollWidth = width + maxScroll.maxScroll;\n            }\n            this._scrollableElement.setScrollDimensions({\n                width: width,\n                height: height,\n                scrollHeight: totalHeight,\n                scrollWidth,\n            });\n        }));\n        _element.replaceChildren(this._elements.root);\n        this._register(toDisposable(() => {\n            _element.replaceChildren();\n        }));\n        // Automatically select the first change in the first file when items are loaded\n        this._register(autorun(reader => {\n            /** @description Initialize first change */\n            const viewModel = this._viewModel.read(reader);\n            if (!viewModel) {\n                return;\n            }\n            // Only initialize when loading is complete\n            if (!viewModel.isLoading.read(reader)) {\n                const items = viewModel.items.read(reader);\n                if (items.length === 0) {\n                    return;\n                }\n                // Only initialize if there's no active item yet\n                const activeDiffItem = viewModel.activeDiffItem.read(reader);\n                if (activeDiffItem) {\n                    return;\n                }\n                // Navigate to the first change using the existing navigation logic\n                this.goToNextChange();\n            }\n        }));\n        this._register(this._register(autorun(reader => {\n            /** @description Render all */\n            globalTransaction(tx => {\n                this.render(reader);\n            });\n        })));\n    }\n    reveal(resource, options) {\n        const viewItems = this._viewItems.get();\n        const index = viewItems.findIndex((item) => item.viewModel.originalUri?.toString() === resource.original?.toString()\n            && item.viewModel.modifiedUri?.toString() === resource.modified?.toString());\n        if (index === -1) {\n            throw new BugIndicatingError('Resource not found in diff editor');\n        }\n        const viewItem = viewItems[index];\n        this._viewModel.get().activeDiffItem.setCache(viewItem.viewModel, undefined);\n        let scrollTop = 0;\n        for (let i = 0; i < index; i++) {\n            scrollTop += viewItems[i].contentHeight.get() + this._spaceBetweenPx;\n        }\n        this._scrollableElement.setScrollPosition({ scrollTop });\n        const diffEditor = viewItem.template.get()?.editor;\n        const editor = 'original' in resource ? diffEditor?.getOriginalEditor() : diffEditor?.getModifiedEditor();\n        if (editor && options?.range) {\n            editor.revealRangeInCenter(options.range);\n            highlightRange(editor, options.range);\n        }\n    }\n    goToNextChange() {\n        this._navigateToChange('next');\n    }\n    _navigateToChange(direction) {\n        const viewItems = this._viewItems.get();\n        if (viewItems.length === 0) {\n            return;\n        }\n        const activeViewModel = this._viewModel.get()?.activeDiffItem.get();\n        const currentIndex = activeViewModel ? viewItems.findIndex(v => v.viewModel === activeViewModel) : -1;\n        // Start with first file if no active item\n        if (currentIndex === -1) {\n            this._goToFile(0, 'first');\n            return;\n        }\n        // Try current file first - expand if collapsed\n        const currentItem = viewItems[currentIndex];\n        if (currentItem.viewModel.collapsed.get()) {\n            currentItem.viewModel.collapsed.set(false, undefined);\n        }\n        const editor = currentItem.template.get()?.editor;\n        if (editor?.getDiffComputationResult()?.changes2?.length) {\n            const pos = editor.getModifiedEditor().getPosition()?.lineNumber || 1;\n            const changes = editor.getDiffComputationResult().changes2;\n            const hasNext = direction === 'next' ? changes.some(c => c.modified.startLineNumber > pos) : changes.some(c => c.modified.endLineNumberExclusive <= pos);\n            if (hasNext) {\n                editor.goToDiff(direction);\n                return;\n            }\n        }\n        // Move to next/previous file\n        const nextIndex = (currentIndex + (direction === 'next' ? 1 : -1) + viewItems.length) % viewItems.length;\n        this._goToFile(nextIndex, direction === 'next' ? 'first' : 'last');\n    }\n    _goToFile(index, position) {\n        const item = this._viewItems.get()[index];\n        if (item.viewModel.collapsed.get()) {\n            item.viewModel.collapsed.set(false, undefined);\n        }\n        this.reveal({ original: item.viewModel.originalUri, modified: item.viewModel.modifiedUri });\n        const editor = item.template.get()?.editor;\n        if (editor?.getDiffComputationResult()?.changes2?.length) {\n            if (position === 'first') {\n                editor.revealFirstDiff();\n            }\n            else {\n                const lastChange = editor.getDiffComputationResult().changes2.at(-1);\n                const modifiedEditor = editor.getModifiedEditor();\n                modifiedEditor.setPosition({ lineNumber: lastChange.modified.startLineNumber, column: 1 });\n                modifiedEditor.revealLineInCenter(lastChange.modified.startLineNumber);\n            }\n        }\n        editor?.focus();\n    }\n    render(reader) {\n        const scrollTop = this.scrollTop.read(reader);\n        let contentScrollOffsetToScrollOffset = 0;\n        let itemHeightSumBefore = 0;\n        let itemContentHeightSumBefore = 0;\n        const viewPortHeight = this._sizeObserver.height.read(reader);\n        const contentViewPort = OffsetRange.ofStartAndLength(scrollTop, viewPortHeight);\n        const width = this._sizeObserver.width.read(reader);\n        for (const v of this._viewItems.read(reader)) {\n            const itemContentHeight = v.contentHeight.read(reader);\n            const itemHeight = Math.min(itemContentHeight, viewPortHeight);\n            const itemRange = OffsetRange.ofStartAndLength(itemHeightSumBefore, itemHeight);\n            const itemContentRange = OffsetRange.ofStartAndLength(itemContentHeightSumBefore, itemContentHeight);\n            if (itemContentRange.isBefore(contentViewPort)) {\n                contentScrollOffsetToScrollOffset -= itemContentHeight - itemHeight;\n                v.hide();\n            }\n            else if (itemContentRange.isAfter(contentViewPort)) {\n                v.hide();\n            }\n            else {\n                const scroll = Math.max(0, Math.min(contentViewPort.start - itemContentRange.start, itemContentHeight - itemHeight));\n                contentScrollOffsetToScrollOffset -= scroll;\n                const viewPort = OffsetRange.ofStartAndLength(scrollTop + contentScrollOffsetToScrollOffset, viewPortHeight);\n                v.render(itemRange, scroll, width, viewPort);\n            }\n            itemHeightSumBefore += itemHeight + this._spaceBetweenPx;\n            itemContentHeightSumBefore += itemContentHeight + this._spaceBetweenPx;\n        }\n        this._scrollableElements.content.style.transform = `translateY(${-(scrollTop + contentScrollOffsetToScrollOffset)}px)`;\n    }\n};\nMultiDiffEditorWidgetImpl = __decorate([\n    __param(4, IContextKeyService),\n    __param(5, IInstantiationService)\n], MultiDiffEditorWidgetImpl);\nfunction highlightRange(targetEditor, range) {\n    const modelNow = targetEditor.getModel();\n    const decorations = targetEditor.createDecorationsCollection([{ range, options: { description: 'symbol-navigate-action-highlight', className: 'symbolHighlight' } }]);\n    setTimeout(() => {\n        if (targetEditor.getModel() === modelNow) {\n            decorations.clear();\n        }\n    }, 350);\n}\nclass VirtualizedViewItem extends Disposable {\n    constructor(viewModel, _objectPool, _scrollLeft, _deltaScrollVertical) {\n        super();\n        this.viewModel = viewModel;\n        this._objectPool = _objectPool;\n        this._scrollLeft = _scrollLeft;\n        this._deltaScrollVertical = _deltaScrollVertical;\n        this._templateRef = this._register(disposableObservableValue(this, undefined));\n        this.contentHeight = derived(this, reader => this._templateRef.read(reader)?.object.contentHeight?.read(reader) ?? this.viewModel.lastTemplateData.read(reader).contentHeight);\n        this.maxScroll = derived(this, reader => this._templateRef.read(reader)?.object.maxScroll.read(reader) ?? { maxScroll: 0, scrollWidth: 0 });\n        this.template = derived(this, reader => this._templateRef.read(reader)?.object);\n        this._isHidden = observableValue(this, false);\n        this._isFocused = derived(this, reader => this.template.read(reader)?.isFocused.read(reader) ?? false);\n        this.viewModel.setIsFocused(this._isFocused, undefined);\n        this._register(autorun((reader) => {\n            const scrollLeft = this._scrollLeft.read(reader);\n            this._templateRef.read(reader)?.object.setScrollLeft(scrollLeft);\n        }));\n        this._register(autorun(reader => {\n            const ref = this._templateRef.read(reader);\n            if (!ref) {\n                return;\n            }\n            const isHidden = this._isHidden.read(reader);\n            if (!isHidden) {\n                return;\n            }\n            const isFocused = ref.object.isFocused.read(reader);\n            if (isFocused) {\n                return;\n            }\n            this._clear();\n        }));\n    }\n    dispose() {\n        this._clear();\n        super.dispose();\n    }\n    toString() {\n        return `VirtualViewItem(${this.viewModel.documentDiffItem.modified?.uri.toString()})`;\n    }\n    getKey() {\n        return this.viewModel.getKey();\n    }\n    setViewState(viewState, tx) {\n        this.viewModel.collapsed.set(viewState.collapsed, tx);\n        this._updateTemplateData(tx);\n        const data = this.viewModel.lastTemplateData.get();\n        const selections = viewState.selections?.map(Selection.liftSelection);\n        this.viewModel.lastTemplateData.set({\n            ...data,\n            selections,\n        }, tx);\n        const ref = this._templateRef.get();\n        if (ref) {\n            if (selections) {\n                ref.object.editor.setSelections(selections);\n            }\n        }\n    }\n    _updateTemplateData(tx) {\n        const ref = this._templateRef.get();\n        if (!ref) {\n            return;\n        }\n        this.viewModel.lastTemplateData.set({\n            contentHeight: ref.object.contentHeight.get(),\n            selections: ref.object.editor.getSelections() ?? undefined,\n        }, tx);\n    }\n    _clear() {\n        const ref = this._templateRef.get();\n        if (!ref) {\n            return;\n        }\n        transaction(tx => {\n            this._updateTemplateData(tx);\n            ref.object.hide();\n            this._templateRef.set(undefined, tx);\n        });\n    }\n    hide() {\n        this._isHidden.set(true, undefined);\n    }\n    render(verticalSpace, offset, width, viewPort) {\n        this._isHidden.set(false, undefined);\n        let ref = this._templateRef.get();\n        if (!ref) {\n            ref = this._objectPool.getUnusedObj(new TemplateData(this.viewModel, this._deltaScrollVertical));\n            this._templateRef.set(ref, undefined);\n            const selections = this.viewModel.lastTemplateData.get().selections;\n            if (selections) {\n                ref.object.editor.setSelections(selections);\n            }\n        }\n        ref.object.render(verticalSpace, width, offset, viewPort);\n    }\n}\n\nexport { MultiDiffEditorWidgetImpl };\n","import { readHotReloadableExport } from '../../../../base/common/hotReloadHelpers.js';\nimport { Disposable } from '../../../../base/common/lifecycle.js';\nimport '../../../../base/common/observableInternal/index.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport './colors.js';\nimport './diffEditorItemTemplate.js';\nimport { MultiDiffEditorWidgetImpl } from './multiDiffEditorWidgetImpl.js';\nimport { observableValue } from '../../../../base/common/observableInternal/observables/observableValue.js';\nimport { derived } from '../../../../base/common/observableInternal/observables/derived.js';\nimport { recomputeInitiallyAndOnChange } from '../../../../base/common/observableInternal/utils/utils.js';\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 *--------------------------------------------------------------------------------------------*/\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};\nlet MultiDiffEditorWidget = class MultiDiffEditorWidget extends Disposable {\n    constructor(_element, _workbenchUIElementFactory, _instantiationService) {\n        super();\n        this._element = _element;\n        this._workbenchUIElementFactory = _workbenchUIElementFactory;\n        this._instantiationService = _instantiationService;\n        this._dimension = observableValue(this, undefined);\n        this._viewModel = observableValue(this, undefined);\n        this._widgetImpl = derived(this, (reader) => {\n            return reader.store.add(this._instantiationService.createInstance((readHotReloadableExport(MultiDiffEditorWidgetImpl)), this._element, this._dimension, this._viewModel, this._workbenchUIElementFactory));\n        });\n        this._register(recomputeInitiallyAndOnChange(this._widgetImpl));\n    }\n};\nMultiDiffEditorWidget = __decorate([\n    __param(2, IInstantiationService)\n], MultiDiffEditorWidget);\n\nexport { MultiDiffEditorWidget };\n","import { mainWindow } from '../../../base/browser/window.js';\nimport { Disposable, DisposableStore } from '../../../base/common/lifecycle.js';\nimport { splitLines } from '../../../base/common/strings.js';\nimport { URI } from '../../../base/common/uri.js';\nimport './standalone-tokens.css';\nimport { FontMeasurements } from '../../browser/config/fontMeasurements.js';\nimport { EditorCommand } from '../../browser/editorExtensions.js';\nimport { ICodeEditorService } from '../../browser/services/codeEditorService.js';\nimport { createWebWorker as createWebWorker$1 } from './standaloneWebWorker.js';\nimport { EditorOptions, ApplyUpdateResult, ConfigurationChangedEvent } from '../../common/config/editorOptions.js';\nimport { EditorZoom } from '../../common/config/editorZoom.js';\nimport { FontInfo, BareFontInfo } from '../../common/config/fontInfo.js';\nimport { EditorType } from '../../common/editorCommon.js';\nimport { TokenizationRegistry } from '../../common/languages.js';\nimport { ILanguageService } from '../../common/languages/language.js';\nimport { PLAINTEXT_LANGUAGE_ID } from '../../common/languages/modesRegistry.js';\nimport { nullTokenize, NullState } from '../../common/languages/nullTokenize.js';\nimport { FindMatch, TextModelResolvedOptions } from '../../common/model.js';\nimport { IModelService } from '../../common/services/model.js';\nimport { TextDirection, ShowLightbulbIconMode, PositionAffinity, InjectedTextCursorStops, WrappingIndent, TrackedRangeStickiness, TextEditorCursorStyle, TextEditorCursorBlinkingStyle, ScrollType, ScrollbarVisibility, RenderMinimap, RenderLineNumbersType, GlyphMarginLane, OverviewRulerLane, OverlayWidgetPositionPreference, MouseTargetType, MinimapSectionHeaderStyle, MinimapPosition, EndOfLineSequence, EndOfLinePreference, EditorOption, EditorAutoIndentStrategy, DefaultEndOfLine, CursorChangeReason, ContentWidgetPositionPreference, AccessibilitySupport } from '../../common/standalone/standaloneEnums.js';\nimport { Colorizer } from './colorizer.js';\nimport { createTextModel, StandaloneDiffEditor2, StandaloneEditor } from './standaloneCodeEditor.js';\nimport { StandaloneServices, StandaloneKeybindingService } from './standaloneServices.js';\nimport { IStandaloneThemeService } from '../common/standaloneTheme.js';\nimport { MenuRegistry, MenuId } from '../../../platform/actions/common/actions.js';\nimport { CommandsRegistry } from '../../../platform/commands/common/commands.js';\nimport { ContextKeyExpr } from '../../../platform/contextkey/common/contextkey.js';\nimport { IKeybindingService } from '../../../platform/keybinding/common/keybinding.js';\nimport { IMarkerService } from '../../../platform/markers/common/markers.js';\nimport { IOpenerService } from '../../../platform/opener/common/opener.js';\nimport { MultiDiffEditorWidget } from '../../browser/widget/multiDiffEditor/multiDiffEditorWidget.js';\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/**\n * Create a new editor under `domElement`.\n * `domElement` should be empty (not contain other dom nodes).\n * The editor will read the size of `domElement`.\n */\nfunction create(domElement, options, override) {\n    const instantiationService = StandaloneServices.initialize(override || {});\n    return instantiationService.createInstance(StandaloneEditor, domElement, options);\n}\n/**\n * Emitted when an editor is created.\n * Creating a diff editor might cause this listener to be invoked with the two editors.\n * @event\n */\nfunction onDidCreateEditor(listener) {\n    const codeEditorService = StandaloneServices.get(ICodeEditorService);\n    return codeEditorService.onCodeEditorAdd((editor) => {\n        listener(editor);\n    });\n}\n/**\n * Emitted when an diff editor is created.\n * @event\n */\nfunction onDidCreateDiffEditor(listener) {\n    const codeEditorService = StandaloneServices.get(ICodeEditorService);\n    return codeEditorService.onDiffEditorAdd((editor) => {\n        listener(editor);\n    });\n}\n/**\n * Get all the created editors.\n */\nfunction getEditors() {\n    const codeEditorService = StandaloneServices.get(ICodeEditorService);\n    return codeEditorService.listCodeEditors();\n}\n/**\n * Get all the created diff editors.\n */\nfunction getDiffEditors() {\n    const codeEditorService = StandaloneServices.get(ICodeEditorService);\n    return codeEditorService.listDiffEditors();\n}\n/**\n * Create a new diff editor under `domElement`.\n * `domElement` should be empty (not contain other dom nodes).\n * The editor will read the size of `domElement`.\n */\nfunction createDiffEditor(domElement, options, override) {\n    const instantiationService = StandaloneServices.initialize(override || {});\n    return instantiationService.createInstance(StandaloneDiffEditor2, domElement, options);\n}\nfunction createMultiFileDiffEditor(domElement, override) {\n    const instantiationService = StandaloneServices.initialize(override || {});\n    return new MultiDiffEditorWidget(domElement, {}, instantiationService);\n}\n/**\n * Add a command.\n */\nfunction addCommand(descriptor) {\n    if ((typeof descriptor.id !== 'string') || (typeof descriptor.run !== 'function')) {\n        throw new Error('Invalid command descriptor, `id` and `run` are required properties!');\n    }\n    return CommandsRegistry.registerCommand(descriptor.id, descriptor.run);\n}\n/**\n * Add an action to all editors.\n */\nfunction addEditorAction(descriptor) {\n    if ((typeof descriptor.id !== 'string') || (typeof descriptor.label !== 'string') || (typeof descriptor.run !== 'function')) {\n        throw new Error('Invalid action descriptor, `id`, `label` and `run` are required properties!');\n    }\n    const precondition = ContextKeyExpr.deserialize(descriptor.precondition);\n    const run = (accessor, ...args) => {\n        return EditorCommand.runEditorCommand(accessor, args, precondition, (accessor, editor, args) => Promise.resolve(descriptor.run(editor, ...args)));\n    };\n    const toDispose = new DisposableStore();\n    // Register the command\n    toDispose.add(CommandsRegistry.registerCommand(descriptor.id, run));\n    // Register the context menu item\n    if (descriptor.contextMenuGroupId) {\n        const menuItem = {\n            command: {\n                id: descriptor.id,\n                title: descriptor.label\n            },\n            when: precondition,\n            group: descriptor.contextMenuGroupId,\n            order: descriptor.contextMenuOrder || 0\n        };\n        toDispose.add(MenuRegistry.appendMenuItem(MenuId.EditorContext, menuItem));\n    }\n    // Register the keybindings\n    if (Array.isArray(descriptor.keybindings)) {\n        const keybindingService = StandaloneServices.get(IKeybindingService);\n        if (!(keybindingService instanceof StandaloneKeybindingService)) {\n            console.warn('Cannot add keybinding because the editor is configured with an unrecognized KeybindingService');\n        }\n        else {\n            const keybindingsWhen = ContextKeyExpr.and(precondition, ContextKeyExpr.deserialize(descriptor.keybindingContext));\n            toDispose.add(keybindingService.addDynamicKeybindings(descriptor.keybindings.map((keybinding) => {\n                return {\n                    keybinding,\n                    command: descriptor.id,\n                    when: keybindingsWhen\n                };\n            })));\n        }\n    }\n    return toDispose;\n}\n/**\n * Add a keybinding rule.\n */\nfunction addKeybindingRule(rule) {\n    return addKeybindingRules([rule]);\n}\n/**\n * Add keybinding rules.\n */\nfunction addKeybindingRules(rules) {\n    const keybindingService = StandaloneServices.get(IKeybindingService);\n    if (!(keybindingService instanceof StandaloneKeybindingService)) {\n        console.warn('Cannot add keybinding because the editor is configured with an unrecognized KeybindingService');\n        return Disposable.None;\n    }\n    return keybindingService.addDynamicKeybindings(rules.map((rule) => {\n        return {\n            keybinding: rule.keybinding,\n            command: rule.command,\n            commandArgs: rule.commandArgs,\n            when: ContextKeyExpr.deserialize(rule.when),\n        };\n    }));\n}\n/**\n * Create a new editor model.\n * You can specify the language that should be set for this model or let the language be inferred from the `uri`.\n */\nfunction createModel(value, language, uri) {\n    const languageService = StandaloneServices.get(ILanguageService);\n    const languageId = languageService.getLanguageIdByMimeType(language) || language;\n    return createTextModel(StandaloneServices.get(IModelService), languageService, value, languageId, uri);\n}\n/**\n * Change the language for a model.\n */\nfunction setModelLanguage(model, mimeTypeOrLanguageId) {\n    const languageService = StandaloneServices.get(ILanguageService);\n    const languageId = languageService.getLanguageIdByMimeType(mimeTypeOrLanguageId) || mimeTypeOrLanguageId || PLAINTEXT_LANGUAGE_ID;\n    model.setLanguage(languageService.createById(languageId));\n}\n/**\n * Set the markers for a model.\n */\nfunction setModelMarkers(model, owner, markers) {\n    if (model) {\n        const markerService = StandaloneServices.get(IMarkerService);\n        markerService.changeOne(owner, model.uri, markers);\n    }\n}\n/**\n * Remove all markers of an owner.\n */\nfunction removeAllMarkers(owner) {\n    const markerService = StandaloneServices.get(IMarkerService);\n    markerService.changeAll(owner, []);\n}\n/**\n * Get markers for owner and/or resource\n *\n * @returns list of markers\n */\nfunction getModelMarkers(filter) {\n    const markerService = StandaloneServices.get(IMarkerService);\n    return markerService.read(filter);\n}\n/**\n * Emitted when markers change for a model.\n * @event\n */\nfunction onDidChangeMarkers(listener) {\n    const markerService = StandaloneServices.get(IMarkerService);\n    return markerService.onMarkerChanged(listener);\n}\n/**\n * Get the model that has `uri` if it exists.\n */\nfunction getModel(uri) {\n    const modelService = StandaloneServices.get(IModelService);\n    return modelService.getModel(uri);\n}\n/**\n * Get all the created models.\n */\nfunction getModels() {\n    const modelService = StandaloneServices.get(IModelService);\n    return modelService.getModels();\n}\n/**\n * Emitted when a model is created.\n * @event\n */\nfunction onDidCreateModel(listener) {\n    const modelService = StandaloneServices.get(IModelService);\n    return modelService.onModelAdded(listener);\n}\n/**\n * Emitted right before a model is disposed.\n * @event\n */\nfunction onWillDisposeModel(listener) {\n    const modelService = StandaloneServices.get(IModelService);\n    return modelService.onModelRemoved(listener);\n}\n/**\n * Emitted when a different language is set to a model.\n * @event\n */\nfunction onDidChangeModelLanguage(listener) {\n    const modelService = StandaloneServices.get(IModelService);\n    return modelService.onModelLanguageChanged((e) => {\n        listener({\n            model: e.model,\n            oldLanguage: e.oldLanguageId\n        });\n    });\n}\n/**\n * Create a new web worker that has model syncing capabilities built in.\n * Specify an AMD module to load that will `create` an object that will be proxied.\n */\nfunction createWebWorker(opts) {\n    return createWebWorker$1(StandaloneServices.get(IModelService), opts);\n}\n/**\n * Colorize the contents of `domNode` using attribute `data-lang`.\n */\nfunction colorizeElement(domNode, options) {\n    const languageService = StandaloneServices.get(ILanguageService);\n    const themeService = StandaloneServices.get(IStandaloneThemeService);\n    return Colorizer.colorizeElement(themeService, languageService, domNode, options).then(() => {\n        themeService.registerEditorContainer(domNode);\n    });\n}\n/**\n * Colorize `text` using language `languageId`.\n */\nfunction colorize(text, languageId, options) {\n    const languageService = StandaloneServices.get(ILanguageService);\n    const themeService = StandaloneServices.get(IStandaloneThemeService);\n    themeService.registerEditorContainer(mainWindow.document.body);\n    return Colorizer.colorize(languageService, text, languageId, options);\n}\n/**\n * Colorize a line in a model.\n */\nfunction colorizeModelLine(model, lineNumber, tabSize = 4) {\n    const themeService = StandaloneServices.get(IStandaloneThemeService);\n    themeService.registerEditorContainer(mainWindow.document.body);\n    return Colorizer.colorizeModelLine(model, lineNumber, tabSize);\n}\n/**\n * @internal\n */\nfunction getSafeTokenizationSupport(language) {\n    const tokenizationSupport = TokenizationRegistry.get(language);\n    if (tokenizationSupport) {\n        return tokenizationSupport;\n    }\n    return {\n        getInitialState: () => NullState,\n        tokenize: (line, hasEOL, state) => nullTokenize(language, state)\n    };\n}\n/**\n * Tokenize `text` using language `languageId`\n */\nfunction tokenize(text, languageId) {\n    // Needed in order to get the mode registered for subsequent look-ups\n    TokenizationRegistry.getOrCreate(languageId);\n    const tokenizationSupport = getSafeTokenizationSupport(languageId);\n    const lines = splitLines(text);\n    const result = [];\n    let state = tokenizationSupport.getInitialState();\n    for (let i = 0, len = lines.length; i < len; i++) {\n        const line = lines[i];\n        const tokenizationResult = tokenizationSupport.tokenize(line, true, state);\n        result[i] = tokenizationResult.tokens;\n        state = tokenizationResult.endState;\n    }\n    return result;\n}\n/**\n * Define a new theme or update an existing theme.\n */\nfunction defineTheme(themeName, themeData) {\n    const standaloneThemeService = StandaloneServices.get(IStandaloneThemeService);\n    standaloneThemeService.defineTheme(themeName, themeData);\n}\n/**\n * Switches to a theme.\n */\nfunction setTheme(themeName) {\n    const standaloneThemeService = StandaloneServices.get(IStandaloneThemeService);\n    standaloneThemeService.setTheme(themeName);\n}\n/**\n * Clears all cached font measurements and triggers re-measurement.\n */\nfunction remeasureFonts() {\n    FontMeasurements.clearAllFontInfos();\n}\n/**\n * Register a command.\n */\nfunction registerCommand(id, handler) {\n    return CommandsRegistry.registerCommand({ id, handler });\n}\n/**\n * Registers a handler that is called when a link is opened in any editor. The handler callback should return `true` if the link was handled and `false` otherwise.\n * The handler that was registered last will be called first when a link is opened.\n *\n * Returns a disposable that can unregister the opener again.\n */\nfunction registerLinkOpener(opener) {\n    const openerService = StandaloneServices.get(IOpenerService);\n    return openerService.registerOpener({\n        async open(resource) {\n            if (typeof resource === 'string') {\n                resource = URI.parse(resource);\n            }\n            return opener.open(resource);\n        }\n    });\n}\n/**\n * Registers a handler that is called when a resource other than the current model should be opened in the editor (e.g. \"go to definition\").\n * The handler callback should return `true` if the request was handled and `false` otherwise.\n *\n * Returns a disposable that can unregister the opener again.\n *\n * If no handler is registered the default behavior is to do nothing for models other than the currently attached one.\n */\nfunction registerEditorOpener(opener) {\n    const codeEditorService = StandaloneServices.get(ICodeEditorService);\n    return codeEditorService.registerCodeEditorOpenHandler(async (input, source, sideBySide) => {\n        if (!source) {\n            return null;\n        }\n        const selection = input.options?.selection;\n        let selectionOrPosition;\n        if (selection && typeof selection.endLineNumber === 'number' && typeof selection.endColumn === 'number') {\n            selectionOrPosition = selection;\n        }\n        else if (selection) {\n            selectionOrPosition = { lineNumber: selection.startLineNumber, column: selection.startColumn };\n        }\n        if (await opener.openCodeEditor(source, input.resource, selectionOrPosition)) {\n            return source; // return source editor to indicate that this handler has successfully handled the opening\n        }\n        return null; // fallback to other registered handlers\n    });\n}\n/**\n * @internal\n */\nfunction createMonacoEditorAPI() {\n    return {\n        // methods\n        // eslint-disable-next-line local/code-no-any-casts\n        create: create,\n        // eslint-disable-next-line local/code-no-any-casts\n        getEditors: getEditors,\n        // eslint-disable-next-line local/code-no-any-casts\n        getDiffEditors: getDiffEditors,\n        // eslint-disable-next-line local/code-no-any-casts\n        onDidCreateEditor: onDidCreateEditor,\n        // eslint-disable-next-line local/code-no-any-casts\n        onDidCreateDiffEditor: onDidCreateDiffEditor,\n        // eslint-disable-next-line local/code-no-any-casts\n        createDiffEditor: createDiffEditor,\n        // eslint-disable-next-line local/code-no-any-casts\n        addCommand: addCommand,\n        // eslint-disable-next-line local/code-no-any-casts\n        addEditorAction: addEditorAction,\n        // eslint-disable-next-line local/code-no-any-casts\n        addKeybindingRule: addKeybindingRule,\n        // eslint-disable-next-line local/code-no-any-casts\n        addKeybindingRules: addKeybindingRules,\n        // eslint-disable-next-line local/code-no-any-casts\n        createModel: createModel,\n        // eslint-disable-next-line local/code-no-any-casts\n        setModelLanguage: setModelLanguage,\n        // eslint-disable-next-line local/code-no-any-casts\n        setModelMarkers: setModelMarkers,\n        // eslint-disable-next-line local/code-no-any-casts\n        getModelMarkers: getModelMarkers,\n        removeAllMarkers: removeAllMarkers,\n        // eslint-disable-next-line local/code-no-any-casts\n        onDidChangeMarkers: onDidChangeMarkers,\n        // eslint-disable-next-line local/code-no-any-casts\n        getModels: getModels,\n        // eslint-disable-next-line local/code-no-any-casts\n        getModel: getModel,\n        // eslint-disable-next-line local/code-no-any-casts\n        onDidCreateModel: onDidCreateModel,\n        // eslint-disable-next-line local/code-no-any-casts\n        onWillDisposeModel: onWillDisposeModel,\n        // eslint-disable-next-line local/code-no-any-casts\n        onDidChangeModelLanguage: onDidChangeModelLanguage,\n        // eslint-disable-next-line local/code-no-any-casts\n        createWebWorker: createWebWorker,\n        // eslint-disable-next-line local/code-no-any-casts\n        colorizeElement: colorizeElement,\n        // eslint-disable-next-line local/code-no-any-casts\n        colorize: colorize,\n        // eslint-disable-next-line local/code-no-any-casts\n        colorizeModelLine: colorizeModelLine,\n        // eslint-disable-next-line local/code-no-any-casts\n        tokenize: tokenize,\n        // eslint-disable-next-line local/code-no-any-casts\n        defineTheme: defineTheme,\n        // eslint-disable-next-line local/code-no-any-casts\n        setTheme: setTheme,\n        remeasureFonts: remeasureFonts,\n        registerCommand: registerCommand,\n        registerLinkOpener: registerLinkOpener,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerEditorOpener: registerEditorOpener,\n        // enums\n        AccessibilitySupport: AccessibilitySupport,\n        ContentWidgetPositionPreference: ContentWidgetPositionPreference,\n        CursorChangeReason: CursorChangeReason,\n        DefaultEndOfLine: DefaultEndOfLine,\n        EditorAutoIndentStrategy: EditorAutoIndentStrategy,\n        EditorOption: EditorOption,\n        EndOfLinePreference: EndOfLinePreference,\n        EndOfLineSequence: EndOfLineSequence,\n        MinimapPosition: MinimapPosition,\n        MinimapSectionHeaderStyle: MinimapSectionHeaderStyle,\n        MouseTargetType: MouseTargetType,\n        OverlayWidgetPositionPreference: OverlayWidgetPositionPreference,\n        OverviewRulerLane: OverviewRulerLane,\n        GlyphMarginLane: GlyphMarginLane,\n        RenderLineNumbersType: RenderLineNumbersType,\n        RenderMinimap: RenderMinimap,\n        ScrollbarVisibility: ScrollbarVisibility,\n        ScrollType: ScrollType,\n        TextEditorCursorBlinkingStyle: TextEditorCursorBlinkingStyle,\n        TextEditorCursorStyle: TextEditorCursorStyle,\n        TrackedRangeStickiness: TrackedRangeStickiness,\n        WrappingIndent: WrappingIndent,\n        InjectedTextCursorStops: InjectedTextCursorStops,\n        PositionAffinity: PositionAffinity,\n        ShowLightbulbIconMode: ShowLightbulbIconMode,\n        TextDirection: TextDirection,\n        // classes\n        // eslint-disable-next-line local/code-no-any-casts\n        ConfigurationChangedEvent: ConfigurationChangedEvent,\n        // eslint-disable-next-line local/code-no-any-casts\n        BareFontInfo: BareFontInfo,\n        // eslint-disable-next-line local/code-no-any-casts\n        FontInfo: FontInfo,\n        // eslint-disable-next-line local/code-no-any-casts\n        TextModelResolvedOptions: TextModelResolvedOptions,\n        // eslint-disable-next-line local/code-no-any-casts\n        FindMatch: FindMatch,\n        // eslint-disable-next-line local/code-no-any-casts\n        ApplyUpdateResult: ApplyUpdateResult,\n        // eslint-disable-next-line local/code-no-any-casts\n        EditorZoom: EditorZoom,\n        // eslint-disable-next-line local/code-no-any-casts\n        createMultiFileDiffEditor: createMultiFileDiffEditor,\n        // vars\n        EditorType: EditorType,\n        // eslint-disable-next-line local/code-no-any-casts\n        EditorOptions: EditorOptions\n    };\n}\n\nexport { addCommand, addEditorAction, addKeybindingRule, addKeybindingRules, colorize, colorizeElement, colorizeModelLine, create, createDiffEditor, createModel, createMonacoEditorAPI, createMultiFileDiffEditor, createWebWorker, defineTheme, getDiffEditors, getEditors, getModel, getModelMarkers, getModels, onDidChangeMarkers, onDidChangeModelLanguage, onDidCreateDiffEditor, onDidCreateEditor, onDidCreateModel, onWillDisposeModel, registerCommand, registerEditorOpener, registerLinkOpener, remeasureFonts, removeAllMarkers, setModelLanguage, setModelMarkers, setTheme, tokenize };\n","import { isString } from '../../../../base/common/types.js';\nimport { createError, fixCase, empty, substituteMatchesRe, stateExists, substituteMatches } from './monarchCommon.js';\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/*\n * This module only exports 'compile' which compiles a JSON language definition\n * into a typed and checked ILexer definition.\n */\n/*\n * Type helpers\n *\n * Note: this is just for sanity checks on the JSON description which is\n * helpful for the programmer. No checks are done anymore once the lexer is\n * already 'compiled and checked'.\n *\n */\nfunction isArrayOf(elemType, obj) {\n    if (!obj) {\n        return false;\n    }\n    if (!(Array.isArray(obj))) {\n        return false;\n    }\n    for (const el of obj) {\n        if (!(elemType(el))) {\n            return false;\n        }\n    }\n    return true;\n}\nfunction bool(prop, defValue) {\n    if (typeof prop === 'boolean') {\n        return prop;\n    }\n    return defValue;\n}\nfunction string(prop, defValue) {\n    if (typeof (prop) === 'string') {\n        return prop;\n    }\n    return defValue;\n}\nfunction arrayToHash(array) {\n    const result = {};\n    for (const e of array) {\n        result[e] = true;\n    }\n    return result;\n}\nfunction createKeywordMatcher(arr, caseInsensitive = false) {\n    if (caseInsensitive) {\n        arr = arr.map(function (x) { return x.toLowerCase(); });\n    }\n    const hash = arrayToHash(arr);\n    if (caseInsensitive) {\n        return function (word) {\n            return hash[word.toLowerCase()] !== undefined && hash.hasOwnProperty(word.toLowerCase());\n        };\n    }\n    else {\n        return function (word) {\n            return hash[word] !== undefined && hash.hasOwnProperty(word);\n        };\n    }\n}\nfunction compileRegExp(lexer, str, handleSn) {\n    // @@ must be interpreted as a literal @, so we replace all occurences of @@ with a placeholder character\n    str = str.replace(/@@/g, `\\x01`);\n    let n = 0;\n    let hadExpansion;\n    do {\n        hadExpansion = false;\n        str = str.replace(/@(\\w+)/g, function (s, attr) {\n            hadExpansion = true;\n            let sub = '';\n            if (typeof (lexer[attr]) === 'string') {\n                sub = lexer[attr];\n            }\n            else if (lexer[attr] && lexer[attr] instanceof RegExp) {\n                sub = lexer[attr].source;\n            }\n            else {\n                if (lexer[attr] === undefined) {\n                    throw createError(lexer, 'language definition does not contain attribute \\'' + attr + '\\', used at: ' + str);\n                }\n                else {\n                    throw createError(lexer, 'attribute reference \\'' + attr + '\\' must be a string, used at: ' + str);\n                }\n            }\n            return (empty(sub) ? '' : '(?:' + sub + ')');\n        });\n        n++;\n    } while (hadExpansion && n < 5);\n    // handle escaped @@\n    str = str.replace(/\\x01/g, '@');\n    const flags = (lexer.ignoreCase ? 'i' : '') + (lexer.unicode ? 'u' : '');\n    // handle $Sn\n    if (handleSn) {\n        const match = str.match(/\\$[sS](\\d\\d?)/g);\n        if (match) {\n            let lastState = null;\n            let lastRegEx = null;\n            return (state) => {\n                if (lastRegEx && lastState === state) {\n                    return lastRegEx;\n                }\n                lastState = state;\n                lastRegEx = new RegExp(substituteMatchesRe(lexer, str, state), flags);\n                return lastRegEx;\n            };\n        }\n    }\n    return new RegExp(str, flags);\n}\n/**\n * Compiles guard functions for case matches.\n * This compiles 'cases' attributes into efficient match functions.\n *\n */\nfunction selectScrutinee(id, matches, state, num) {\n    if (num < 0) {\n        return id;\n    }\n    if (num < matches.length) {\n        return matches[num];\n    }\n    if (num >= 100) {\n        num = num - 100;\n        const parts = state.split('.');\n        parts.unshift(state);\n        if (num < parts.length) {\n            return parts[num];\n        }\n    }\n    return null;\n}\nfunction createGuard(lexer, ruleName, tkey, val) {\n    // get the scrutinee and pattern\n    let scrut = -1; // -1: $!, 0-99: $n, 100+n: $Sn\n    let oppat = tkey;\n    let matches = tkey.match(/^\\$(([sS]?)(\\d\\d?)|#)(.*)$/);\n    if (matches) {\n        if (matches[3]) { // if digits\n            scrut = parseInt(matches[3]);\n            if (matches[2]) {\n                scrut = scrut + 100; // if [sS] present\n            }\n        }\n        oppat = matches[4];\n    }\n    // get operator\n    let op = '~';\n    let pat = oppat;\n    if (!oppat || oppat.length === 0) {\n        op = '!=';\n        pat = '';\n    }\n    else if (/^\\w*$/.test(pat)) { // just a word\n        op = '==';\n    }\n    else {\n        matches = oppat.match(/^(@|!@|~|!~|==|!=)(.*)$/);\n        if (matches) {\n            op = matches[1];\n            pat = matches[2];\n        }\n    }\n    // set the tester function\n    let tester;\n    // special case a regexp that matches just words\n    if ((op === '~' || op === '!~') && /^(\\w|\\|)*$/.test(pat)) {\n        const inWords = createKeywordMatcher(pat.split('|'), lexer.ignoreCase);\n        tester = function (s) { return (op === '~' ? inWords(s) : !inWords(s)); };\n    }\n    else if (op === '@' || op === '!@') {\n        const words = lexer[pat];\n        if (!words) {\n            throw createError(lexer, 'the @ match target \\'' + pat + '\\' is not defined, in rule: ' + ruleName);\n        }\n        if (!(isArrayOf(function (elem) { return (typeof (elem) === 'string'); }, words))) {\n            throw createError(lexer, 'the @ match target \\'' + pat + '\\' must be an array of strings, in rule: ' + ruleName);\n        }\n        const inWords = createKeywordMatcher(words, lexer.ignoreCase);\n        tester = function (s) { return (op === '@' ? inWords(s) : !inWords(s)); };\n    }\n    else if (op === '~' || op === '!~') {\n        if (pat.indexOf('$') < 0) {\n            // precompile regular expression\n            const re = compileRegExp(lexer, '^' + pat + '$', false);\n            tester = function (s) { return (op === '~' ? re.test(s) : !re.test(s)); };\n        }\n        else {\n            tester = function (s, id, matches, state) {\n                const re = compileRegExp(lexer, '^' + substituteMatches(lexer, pat, id, matches, state) + '$', false);\n                return re.test(s);\n            };\n        }\n    }\n    else { // if (op==='==' || op==='!=') {\n        if (pat.indexOf('$') < 0) {\n            const patx = fixCase(lexer, pat);\n            tester = function (s) { return (op === '==' ? s === patx : s !== patx); };\n        }\n        else {\n            const patx = fixCase(lexer, pat);\n            tester = function (s, id, matches, state, eos) {\n                const patexp = substituteMatches(lexer, patx, id, matches, state);\n                return (op === '==' ? s === patexp : s !== patexp);\n            };\n        }\n    }\n    // return the branch object\n    if (scrut === -1) {\n        return {\n            name: tkey, value: val, test: function (id, matches, state, eos) {\n                return tester(id, id, matches, state, eos);\n            }\n        };\n    }\n    else {\n        return {\n            name: tkey, value: val, test: function (id, matches, state, eos) {\n                const scrutinee = selectScrutinee(id, matches, state, scrut);\n                return tester(!scrutinee ? '' : scrutinee, id, matches, state, eos);\n            }\n        };\n    }\n}\n/**\n * Compiles an action: i.e. optimize regular expressions and case matches\n * and do many sanity checks.\n *\n * This is called only during compilation but if the lexer definition\n * contains user functions as actions (which is usually not allowed), then this\n * may be called during lexing. It is important therefore to compile common cases efficiently\n */\nfunction compileAction(lexer, ruleName, action) {\n    if (!action) {\n        return { token: '' };\n    }\n    else if (typeof (action) === 'string') {\n        return action; // { token: action };\n    }\n    else if (action.token || action.token === '') {\n        if (typeof (action.token) !== 'string') {\n            throw createError(lexer, 'a \\'token\\' attribute must be of type string, in rule: ' + ruleName);\n        }\n        else {\n            // only copy specific typed fields (only happens once during compile Lexer)\n            const newAction = { token: action.token };\n            if (action.token.indexOf('$') >= 0) {\n                newAction.tokenSubst = true;\n            }\n            if (typeof (action.bracket) === 'string') {\n                if (action.bracket === '@open') {\n                    newAction.bracket = 1 /* monarchCommon.MonarchBracket.Open */;\n                }\n                else if (action.bracket === '@close') {\n                    newAction.bracket = -1 /* monarchCommon.MonarchBracket.Close */;\n                }\n                else {\n                    throw createError(lexer, 'a \\'bracket\\' attribute must be either \\'@open\\' or \\'@close\\', in rule: ' + ruleName);\n                }\n            }\n            if (action.next) {\n                if (typeof (action.next) !== 'string') {\n                    throw createError(lexer, 'the next state must be a string value in rule: ' + ruleName);\n                }\n                else {\n                    let next = action.next;\n                    if (!/^(@pop|@push|@popall)$/.test(next)) {\n                        if (next[0] === '@') {\n                            next = next.substr(1); // peel off starting @ sign\n                        }\n                        if (next.indexOf('$') < 0) { // no dollar substitution, we can check if the state exists\n                            if (!stateExists(lexer, substituteMatches(lexer, next, '', [], ''))) {\n                                throw createError(lexer, 'the next state \\'' + action.next + '\\' is not defined in rule: ' + ruleName);\n                            }\n                        }\n                    }\n                    newAction.next = next;\n                }\n            }\n            if (typeof (action.goBack) === 'number') {\n                newAction.goBack = action.goBack;\n            }\n            if (typeof (action.switchTo) === 'string') {\n                newAction.switchTo = action.switchTo;\n            }\n            if (typeof (action.log) === 'string') {\n                newAction.log = action.log;\n            }\n            if (typeof (action.nextEmbedded) === 'string') {\n                newAction.nextEmbedded = action.nextEmbedded;\n                lexer.usesEmbedded = true;\n            }\n            return newAction;\n        }\n    }\n    else if (Array.isArray(action)) {\n        const results = [];\n        for (let i = 0, len = action.length; i < len; i++) {\n            results[i] = compileAction(lexer, ruleName, action[i]);\n        }\n        return { group: results };\n    }\n    else if (action.cases) {\n        // build an array of test cases\n        const cases = [];\n        let hasEmbeddedEndInCases = false;\n        // for each case, push a test function and result value\n        for (const tkey in action.cases) {\n            if (action.cases.hasOwnProperty(tkey)) {\n                const val = compileAction(lexer, ruleName, action.cases[tkey]);\n                // what kind of case\n                if (tkey === '@default' || tkey === '@' || tkey === '') {\n                    cases.push({ test: undefined, value: val, name: tkey });\n                }\n                else if (tkey === '@eos') {\n                    cases.push({ test: function (id, matches, state, eos) { return eos; }, value: val, name: tkey });\n                }\n                else {\n                    cases.push(createGuard(lexer, ruleName, tkey, val)); // call separate function to avoid local variable capture\n                }\n                if (!hasEmbeddedEndInCases) {\n                    hasEmbeddedEndInCases = !isString(val) && (val.hasEmbeddedEndInCases || ['@pop', '@popall'].includes(val.nextEmbedded || ''));\n                }\n            }\n        }\n        // create a matching function\n        const def = lexer.defaultToken;\n        return {\n            hasEmbeddedEndInCases,\n            test: function (id, matches, state, eos) {\n                for (const _case of cases) {\n                    const didmatch = (!_case.test || _case.test(id, matches, state, eos));\n                    if (didmatch) {\n                        return _case.value;\n                    }\n                }\n                return def;\n            }\n        };\n    }\n    else {\n        throw createError(lexer, 'an action must be a string, an object with a \\'token\\' or \\'cases\\' attribute, or an array of actions; in rule: ' + ruleName);\n    }\n}\n/**\n * Helper class for creating matching rules\n */\nclass Rule {\n    constructor(name) {\n        this.regex = new RegExp('');\n        this.action = { token: '' };\n        this.matchOnlyAtLineStart = false;\n        this.name = '';\n        this.name = name;\n    }\n    setRegex(lexer, re) {\n        let sregex;\n        if (typeof (re) === 'string') {\n            sregex = re;\n        }\n        else if (re instanceof RegExp) {\n            sregex = re.source;\n        }\n        else {\n            throw createError(lexer, 'rules must start with a match string or regular expression: ' + this.name);\n        }\n        this.matchOnlyAtLineStart = (sregex.length > 0 && sregex[0] === '^');\n        this.name = this.name + ': ' + sregex;\n        this.regex = compileRegExp(lexer, '^(?:' + (this.matchOnlyAtLineStart ? sregex.substr(1) : sregex) + ')', true);\n    }\n    setAction(lexer, act) {\n        this.action = compileAction(lexer, this.name, act);\n    }\n    resolveRegex(state) {\n        if (this.regex instanceof RegExp) {\n            return this.regex;\n        }\n        else {\n            return this.regex(state);\n        }\n    }\n}\n/**\n * Compiles a json description function into json where all regular expressions,\n * case matches etc, are compiled and all include rules are expanded.\n * We also compile the bracket definitions, supply defaults, and do many sanity checks.\n * If the 'jsonStrict' parameter is 'false', we allow at certain locations\n * regular expression objects and functions that get called during lexing.\n * (Currently we have no samples that need this so perhaps we should always have\n * jsonStrict to true).\n */\nfunction compile(languageId, json) {\n    if (!json || typeof (json) !== 'object') {\n        throw new Error('Monarch: expecting a language definition object');\n    }\n    // Create our lexer\n    const lexer = {\n        languageId: languageId,\n        includeLF: bool(json.includeLF, false),\n        noThrow: false, // raise exceptions during compilation\n        maxStack: 100,\n        start: (typeof json.start === 'string' ? json.start : null),\n        ignoreCase: bool(json.ignoreCase, false),\n        unicode: bool(json.unicode, false),\n        tokenPostfix: string(json.tokenPostfix, '.' + languageId),\n        defaultToken: string(json.defaultToken, 'source'),\n        usesEmbedded: false, // becomes true if we find a nextEmbedded action\n        stateNames: {},\n        tokenizer: {},\n        brackets: []\n    };\n    // For calling compileAction later on\n    // eslint-disable-next-line local/code-no-any-casts\n    const lexerMin = json;\n    lexerMin.languageId = languageId;\n    lexerMin.includeLF = lexer.includeLF;\n    lexerMin.ignoreCase = lexer.ignoreCase;\n    lexerMin.unicode = lexer.unicode;\n    lexerMin.noThrow = lexer.noThrow;\n    lexerMin.usesEmbedded = lexer.usesEmbedded;\n    lexerMin.stateNames = json.tokenizer;\n    lexerMin.defaultToken = lexer.defaultToken;\n    // Compile an array of rules into newrules where RegExp objects are created.\n    function addRules(state, newrules, rules) {\n        for (const rule of rules) {\n            let include = rule.include;\n            if (include) {\n                if (typeof (include) !== 'string') {\n                    throw createError(lexer, 'an \\'include\\' attribute must be a string at: ' + state);\n                }\n                if (include[0] === '@') {\n                    include = include.substr(1); // peel off starting @\n                }\n                if (!json.tokenizer[include]) {\n                    throw createError(lexer, 'include target \\'' + include + '\\' is not defined at: ' + state);\n                }\n                addRules(state + '.' + include, newrules, json.tokenizer[include]);\n            }\n            else {\n                const newrule = new Rule(state);\n                // Set up new rule attributes\n                if (Array.isArray(rule) && rule.length >= 1 && rule.length <= 3) {\n                    newrule.setRegex(lexerMin, rule[0]);\n                    if (rule.length >= 3) {\n                        if (typeof (rule[1]) === 'string') {\n                            newrule.setAction(lexerMin, { token: rule[1], next: rule[2] });\n                        }\n                        else if (typeof (rule[1]) === 'object') {\n                            const rule1 = rule[1];\n                            rule1.next = rule[2];\n                            newrule.setAction(lexerMin, rule1);\n                        }\n                        else {\n                            throw createError(lexer, 'a next state as the last element of a rule can only be given if the action is either an object or a string, at: ' + state);\n                        }\n                    }\n                    else {\n                        newrule.setAction(lexerMin, rule[1]);\n                    }\n                }\n                else {\n                    if (!rule.regex) {\n                        throw createError(lexer, 'a rule must either be an array, or an object with a \\'regex\\' or \\'include\\' field at: ' + state);\n                    }\n                    if (rule.name) {\n                        if (typeof rule.name === 'string') {\n                            newrule.name = rule.name;\n                        }\n                    }\n                    if (rule.matchOnlyAtStart) {\n                        newrule.matchOnlyAtLineStart = bool(rule.matchOnlyAtLineStart, false);\n                    }\n                    newrule.setRegex(lexerMin, rule.regex);\n                    newrule.setAction(lexerMin, rule.action);\n                }\n                newrules.push(newrule);\n            }\n        }\n    }\n    // compile the tokenizer rules\n    if (!json.tokenizer || typeof (json.tokenizer) !== 'object') {\n        throw createError(lexer, 'a language definition must define the \\'tokenizer\\' attribute as an object');\n    }\n    // eslint-disable-next-line local/code-no-any-casts\n    lexer.tokenizer = [];\n    for (const key in json.tokenizer) {\n        if (json.tokenizer.hasOwnProperty(key)) {\n            if (!lexer.start) {\n                lexer.start = key;\n            }\n            const rules = json.tokenizer[key];\n            lexer.tokenizer[key] = new Array();\n            addRules('tokenizer.' + key, lexer.tokenizer[key], rules);\n        }\n    }\n    lexer.usesEmbedded = lexerMin.usesEmbedded; // can be set during compileAction\n    // Set simple brackets\n    if (json.brackets) {\n        // eslint-disable-next-line local/code-no-any-casts\n        if (!(Array.isArray(json.brackets))) {\n            throw createError(lexer, 'the \\'brackets\\' attribute must be defined as an array');\n        }\n    }\n    else {\n        json.brackets = [\n            { open: '{', close: '}', token: 'delimiter.curly' },\n            { open: '[', close: ']', token: 'delimiter.square' },\n            { open: '(', close: ')', token: 'delimiter.parenthesis' },\n            { open: '<', close: '>', token: 'delimiter.angle' }\n        ];\n    }\n    const brackets = [];\n    for (const el of json.brackets) {\n        let desc = el;\n        if (desc && Array.isArray(desc) && desc.length === 3) {\n            desc = { token: desc[2], open: desc[0], close: desc[1] };\n        }\n        if (desc.open === desc.close) {\n            throw createError(lexer, 'open and close brackets in a \\'brackets\\' attribute must be different: ' + desc.open +\n                '\\n hint: use the \\'bracket\\' attribute if matching on equal brackets is required.');\n        }\n        if (typeof desc.open === 'string' && typeof desc.token === 'string' && typeof desc.close === 'string') {\n            brackets.push({\n                token: desc.token + lexer.tokenPostfix,\n                open: fixCase(lexer, desc.open),\n                close: fixCase(lexer, desc.close)\n            });\n        }\n        else {\n            throw createError(lexer, 'every element in the \\'brackets\\' array must be a \\'{open,close,token}\\' object or array');\n        }\n    }\n    lexer.brackets = brackets;\n    // Disable throw so the syntax highlighter goes, no matter what\n    lexer.noThrow = true;\n    return lexer;\n}\n\nexport { compile };\n","import { Color } from '../../../base/common/color.js';\nimport { Range } from '../../common/core/range.js';\nimport { SelectedSuggestionInfo, FoldingRangeKind, TokenizationRegistry, LazyTokenizationSupport, EncodedTokenizationResult, Token, TokenizationResult } from '../../common/languages.js';\nimport { ILanguageService } from '../../common/languages/language.js';\nimport { ILanguageConfigurationService } from '../../common/languages/languageConfigurationRegistry.js';\nimport { ModesRegistry } from '../../common/languages/modesRegistry.js';\nimport { ILanguageFeaturesService } from '../../common/services/languageFeatures.js';\nimport { InlineCompletionHintStyle, InlineCompletionEndOfLifeReasonKind, HoverVerbosityAction, PartialAcceptTriggerKind, NewSymbolNameTriggerKind, NewSymbolNameTag, CodeActionTriggerType, InlineCompletionTriggerKind, InlayHintKind, SignatureHelpTriggerKind, CompletionTriggerKind, IndentAction, SymbolTag, SymbolKind, CompletionItemInsertTextRule, CompletionItemTag, CompletionItemKind, DocumentHighlightKind } from '../../common/standalone/standaloneEnums.js';\nimport { StandaloneServices } from './standaloneServices.js';\nimport { compile } from '../common/monarch/monarchCompile.js';\nimport { MonarchTokenizer } from '../common/monarch/monarchLexer.js';\nimport { IStandaloneThemeService } from '../common/standaloneTheme.js';\nimport { IConfigurationService } from '../../../platform/configuration/common/configuration.js';\nimport { IMarkerService } from '../../../platform/markers/common/markers.js';\nimport { EditDeltaInfo } from '../../common/textModelEditSource.js';\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/**\n * Register information about a new language.\n */\nfunction register(language) {\n    // Intentionally using the `ModesRegistry` here to avoid\n    // instantiating services too quickly in the standalone editor.\n    ModesRegistry.registerLanguage(language);\n}\n/**\n * Get the information of all the registered languages.\n */\nfunction getLanguages() {\n    let result = [];\n    result = result.concat(ModesRegistry.getLanguages());\n    return result;\n}\nfunction getEncodedLanguageId(languageId) {\n    const languageService = StandaloneServices.get(ILanguageService);\n    return languageService.languageIdCodec.encodeLanguageId(languageId);\n}\n/**\n * An event emitted when a language is associated for the first time with a text model.\n * @event\n */\nfunction onLanguage(languageId, callback) {\n    return StandaloneServices.withServices(() => {\n        const languageService = StandaloneServices.get(ILanguageService);\n        const disposable = languageService.onDidRequestRichLanguageFeatures((encounteredLanguageId) => {\n            if (encounteredLanguageId === languageId) {\n                // stop listening\n                disposable.dispose();\n                // invoke actual listener\n                callback();\n            }\n        });\n        return disposable;\n    });\n}\n/**\n * An event emitted when a language is associated for the first time with a text model or\n * when a language is encountered during the tokenization of another language.\n * @event\n */\nfunction onLanguageEncountered(languageId, callback) {\n    return StandaloneServices.withServices(() => {\n        const languageService = StandaloneServices.get(ILanguageService);\n        const disposable = languageService.onDidRequestBasicLanguageFeatures((encounteredLanguageId) => {\n            if (encounteredLanguageId === languageId) {\n                // stop listening\n                disposable.dispose();\n                // invoke actual listener\n                callback();\n            }\n        });\n        return disposable;\n    });\n}\n/**\n * Set the editing configuration for a language.\n */\nfunction setLanguageConfiguration(languageId, configuration) {\n    const languageService = StandaloneServices.get(ILanguageService);\n    if (!languageService.isRegisteredLanguageId(languageId)) {\n        throw new Error(`Cannot set configuration for unknown language ${languageId}`);\n    }\n    const languageConfigurationService = StandaloneServices.get(ILanguageConfigurationService);\n    return languageConfigurationService.register(languageId, configuration, 100);\n}\n/**\n * @internal\n */\nclass EncodedTokenizationSupportAdapter {\n    constructor(languageId, actual) {\n        this._languageId = languageId;\n        this._actual = actual;\n    }\n    dispose() {\n        // NOOP\n    }\n    getInitialState() {\n        return this._actual.getInitialState();\n    }\n    tokenize(line, hasEOL, state) {\n        if (typeof this._actual.tokenize === 'function') {\n            return TokenizationSupportAdapter.adaptTokenize(this._languageId, this._actual, line, state);\n        }\n        throw new Error('Not supported!');\n    }\n    tokenizeEncoded(line, hasEOL, state) {\n        const result = this._actual.tokenizeEncoded(line, state);\n        return new EncodedTokenizationResult(result.tokens, result.endState);\n    }\n}\n/**\n * @internal\n */\nclass TokenizationSupportAdapter {\n    constructor(_languageId, _actual, _languageService, _standaloneThemeService) {\n        this._languageId = _languageId;\n        this._actual = _actual;\n        this._languageService = _languageService;\n        this._standaloneThemeService = _standaloneThemeService;\n    }\n    dispose() {\n        // NOOP\n    }\n    getInitialState() {\n        return this._actual.getInitialState();\n    }\n    static _toClassicTokens(tokens, language) {\n        const result = [];\n        let previousStartIndex = 0;\n        for (let i = 0, len = tokens.length; i < len; i++) {\n            const t = tokens[i];\n            let startIndex = t.startIndex;\n            // Prevent issues stemming from a buggy external tokenizer.\n            if (i === 0) {\n                // Force first token to start at first index!\n                startIndex = 0;\n            }\n            else if (startIndex < previousStartIndex) {\n                // Force tokens to be after one another!\n                startIndex = previousStartIndex;\n            }\n            result[i] = new Token(startIndex, t.scopes, language);\n            previousStartIndex = startIndex;\n        }\n        return result;\n    }\n    static adaptTokenize(language, actual, line, state) {\n        const actualResult = actual.tokenize(line, state);\n        const tokens = TokenizationSupportAdapter._toClassicTokens(actualResult.tokens, language);\n        let endState;\n        // try to save an object if possible\n        if (actualResult.endState.equals(state)) {\n            endState = state;\n        }\n        else {\n            endState = actualResult.endState;\n        }\n        return new TokenizationResult(tokens, endState);\n    }\n    tokenize(line, hasEOL, state) {\n        return TokenizationSupportAdapter.adaptTokenize(this._languageId, this._actual, line, state);\n    }\n    _toBinaryTokens(languageIdCodec, tokens) {\n        const languageId = languageIdCodec.encodeLanguageId(this._languageId);\n        const tokenTheme = this._standaloneThemeService.getColorTheme().tokenTheme;\n        const result = [];\n        let resultLen = 0;\n        let previousStartIndex = 0;\n        for (let i = 0, len = tokens.length; i < len; i++) {\n            const t = tokens[i];\n            const metadata = tokenTheme.match(languageId, t.scopes) | 1024 /* MetadataConsts.BALANCED_BRACKETS_MASK */;\n            if (resultLen > 0 && result[resultLen - 1] === metadata) {\n                // same metadata\n                continue;\n            }\n            let startIndex = t.startIndex;\n            // Prevent issues stemming from a buggy external tokenizer.\n            if (i === 0) {\n                // Force first token to start at first index!\n                startIndex = 0;\n            }\n            else if (startIndex < previousStartIndex) {\n                // Force tokens to be after one another!\n                startIndex = previousStartIndex;\n            }\n            result[resultLen++] = startIndex;\n            result[resultLen++] = metadata;\n            previousStartIndex = startIndex;\n        }\n        const actualResult = new Uint32Array(resultLen);\n        for (let i = 0; i < resultLen; i++) {\n            actualResult[i] = result[i];\n        }\n        return actualResult;\n    }\n    tokenizeEncoded(line, hasEOL, state) {\n        const actualResult = this._actual.tokenize(line, state);\n        const tokens = this._toBinaryTokens(this._languageService.languageIdCodec, actualResult.tokens);\n        let endState;\n        // try to save an object if possible\n        if (actualResult.endState.equals(state)) {\n            endState = state;\n        }\n        else {\n            endState = actualResult.endState;\n        }\n        return new EncodedTokenizationResult(tokens, endState);\n    }\n}\nfunction isATokensProvider(provider) {\n    return (typeof provider.getInitialState === 'function');\n}\nfunction isEncodedTokensProvider(provider) {\n    return 'tokenizeEncoded' in provider;\n}\nfunction isThenable(obj) {\n    return obj && typeof obj.then === 'function';\n}\n/**\n * Change the color map that is used for token colors.\n * Supported formats (hex): #RRGGBB, $RRGGBBAA, #RGB, #RGBA\n */\nfunction setColorMap(colorMap) {\n    const standaloneThemeService = StandaloneServices.get(IStandaloneThemeService);\n    if (colorMap) {\n        const result = [null];\n        for (let i = 1, len = colorMap.length; i < len; i++) {\n            result[i] = Color.fromHex(colorMap[i]);\n        }\n        standaloneThemeService.setColorMapOverride(result);\n    }\n    else {\n        standaloneThemeService.setColorMapOverride(null);\n    }\n}\n/**\n * @internal\n */\nfunction createTokenizationSupportAdapter(languageId, provider) {\n    if (isEncodedTokensProvider(provider)) {\n        return new EncodedTokenizationSupportAdapter(languageId, provider);\n    }\n    else {\n        return new TokenizationSupportAdapter(languageId, provider, StandaloneServices.get(ILanguageService), StandaloneServices.get(IStandaloneThemeService));\n    }\n}\n/**\n * Register a tokens provider factory for a language. This tokenizer will be exclusive with a tokenizer\n * set using `setTokensProvider` or one created using `setMonarchTokensProvider`, but will work together\n * with a tokens provider set using `registerDocumentSemanticTokensProvider` or `registerDocumentRangeSemanticTokensProvider`.\n */\nfunction registerTokensProviderFactory(languageId, factory) {\n    const adaptedFactory = new LazyTokenizationSupport(async () => {\n        const result = await Promise.resolve(factory.create());\n        if (!result) {\n            return null;\n        }\n        if (isATokensProvider(result)) {\n            return createTokenizationSupportAdapter(languageId, result);\n        }\n        return new MonarchTokenizer(StandaloneServices.get(ILanguageService), StandaloneServices.get(IStandaloneThemeService), languageId, compile(languageId, result), StandaloneServices.get(IConfigurationService));\n    });\n    return TokenizationRegistry.registerFactory(languageId, adaptedFactory);\n}\n/**\n * Set the tokens provider for a language (manual implementation). This tokenizer will be exclusive\n * with a tokenizer created using `setMonarchTokensProvider`, or with `registerTokensProviderFactory`,\n * but will work together with a tokens provider set using `registerDocumentSemanticTokensProvider`\n * or `registerDocumentRangeSemanticTokensProvider`.\n */\nfunction setTokensProvider(languageId, provider) {\n    const languageService = StandaloneServices.get(ILanguageService);\n    if (!languageService.isRegisteredLanguageId(languageId)) {\n        throw new Error(`Cannot set tokens provider for unknown language ${languageId}`);\n    }\n    if (isThenable(provider)) {\n        return registerTokensProviderFactory(languageId, { create: () => provider });\n    }\n    return TokenizationRegistry.register(languageId, createTokenizationSupportAdapter(languageId, provider));\n}\n/**\n * Set the tokens provider for a language (monarch implementation). This tokenizer will be exclusive\n * with a tokenizer set using `setTokensProvider`, or with `registerTokensProviderFactory`, but will\n * work together with a tokens provider set using `registerDocumentSemanticTokensProvider` or\n * `registerDocumentRangeSemanticTokensProvider`.\n */\nfunction setMonarchTokensProvider(languageId, languageDef) {\n    const create = (languageDef) => {\n        return new MonarchTokenizer(StandaloneServices.get(ILanguageService), StandaloneServices.get(IStandaloneThemeService), languageId, compile(languageId, languageDef), StandaloneServices.get(IConfigurationService));\n    };\n    if (isThenable(languageDef)) {\n        return registerTokensProviderFactory(languageId, { create: () => languageDef });\n    }\n    return TokenizationRegistry.register(languageId, create(languageDef));\n}\n/**\n * Register a reference provider (used by e.g. reference search).\n */\nfunction registerReferenceProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.referenceProvider.register(languageSelector, provider);\n}\n/**\n * Register a rename provider (used by e.g. rename symbol).\n */\nfunction registerRenameProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.renameProvider.register(languageSelector, provider);\n}\n/**\n * Register a new symbol-name provider (e.g., when a symbol is being renamed, show new possible symbol-names)\n */\nfunction registerNewSymbolNameProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.newSymbolNamesProvider.register(languageSelector, provider);\n}\n/**\n * Register a signature help provider (used by e.g. parameter hints).\n */\nfunction registerSignatureHelpProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.signatureHelpProvider.register(languageSelector, provider);\n}\n/**\n * Register a hover provider (used by e.g. editor hover).\n */\nfunction registerHoverProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.hoverProvider.register(languageSelector, {\n        provideHover: async (model, position, token, context) => {\n            const word = model.getWordAtPosition(position);\n            return Promise.resolve(provider.provideHover(model, position, token, context)).then((value) => {\n                if (!value) {\n                    return undefined;\n                }\n                if (!value.range && word) {\n                    value.range = new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn);\n                }\n                if (!value.range) {\n                    value.range = new Range(position.lineNumber, position.column, position.lineNumber, position.column);\n                }\n                return value;\n            });\n        }\n    });\n}\n/**\n * Register a document symbol provider (used by e.g. outline).\n */\nfunction registerDocumentSymbolProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.documentSymbolProvider.register(languageSelector, provider);\n}\n/**\n * Register a document highlight provider (used by e.g. highlight occurrences).\n */\nfunction registerDocumentHighlightProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.documentHighlightProvider.register(languageSelector, provider);\n}\n/**\n * Register an linked editing range provider.\n */\nfunction registerLinkedEditingRangeProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.linkedEditingRangeProvider.register(languageSelector, provider);\n}\n/**\n * Register a definition provider (used by e.g. go to definition).\n */\nfunction registerDefinitionProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.definitionProvider.register(languageSelector, provider);\n}\n/**\n * Register a implementation provider (used by e.g. go to implementation).\n */\nfunction registerImplementationProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.implementationProvider.register(languageSelector, provider);\n}\n/**\n * Register a type definition provider (used by e.g. go to type definition).\n */\nfunction registerTypeDefinitionProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.typeDefinitionProvider.register(languageSelector, provider);\n}\n/**\n * Register a code lens provider (used by e.g. inline code lenses).\n */\nfunction registerCodeLensProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.codeLensProvider.register(languageSelector, provider);\n}\n/**\n * Register a code action provider (used by e.g. quick fix).\n */\nfunction registerCodeActionProvider(languageSelector, provider, metadata) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.codeActionProvider.register(languageSelector, {\n        providedCodeActionKinds: metadata?.providedCodeActionKinds,\n        documentation: metadata?.documentation,\n        provideCodeActions: (model, range, context, token) => {\n            const markerService = StandaloneServices.get(IMarkerService);\n            const markers = markerService.read({ resource: model.uri }).filter(m => {\n                return Range.areIntersectingOrTouching(m, range);\n            });\n            return provider.provideCodeActions(model, range, { markers, only: context.only, trigger: context.trigger }, token);\n        },\n        resolveCodeAction: provider.resolveCodeAction\n    });\n}\n/**\n * Register a formatter that can handle only entire models.\n */\nfunction registerDocumentFormattingEditProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.documentFormattingEditProvider.register(languageSelector, provider);\n}\n/**\n * Register a formatter that can handle a range inside a model.\n */\nfunction registerDocumentRangeFormattingEditProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.documentRangeFormattingEditProvider.register(languageSelector, provider);\n}\n/**\n * Register a formatter than can do formatting as the user types.\n */\nfunction registerOnTypeFormattingEditProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.onTypeFormattingEditProvider.register(languageSelector, provider);\n}\n/**\n * Register a link provider that can find links in text.\n */\nfunction registerLinkProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.linkProvider.register(languageSelector, provider);\n}\n/**\n * Register a completion item provider (use by e.g. suggestions).\n */\nfunction registerCompletionItemProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.completionProvider.register(languageSelector, provider);\n}\n/**\n * Register a document color provider (used by Color Picker, Color Decorator).\n */\nfunction registerColorProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.colorProvider.register(languageSelector, provider);\n}\n/**\n * Register a folding range provider\n */\nfunction registerFoldingRangeProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.foldingRangeProvider.register(languageSelector, provider);\n}\n/**\n * Register a declaration provider\n */\nfunction registerDeclarationProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.declarationProvider.register(languageSelector, provider);\n}\n/**\n * Register a selection range provider\n */\nfunction registerSelectionRangeProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.selectionRangeProvider.register(languageSelector, provider);\n}\n/**\n * Register a document semantic tokens provider. A semantic tokens provider will complement and enhance a\n * simple top-down tokenizer. Simple top-down tokenizers can be set either via `setMonarchTokensProvider`\n * or `setTokensProvider`.\n *\n * For the best user experience, register both a semantic tokens provider and a top-down tokenizer.\n */\nfunction registerDocumentSemanticTokensProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.documentSemanticTokensProvider.register(languageSelector, provider);\n}\n/**\n * Register a document range semantic tokens provider. A semantic tokens provider will complement and enhance a\n * simple top-down tokenizer. Simple top-down tokenizers can be set either via `setMonarchTokensProvider`\n * or `setTokensProvider`.\n *\n * For the best user experience, register both a semantic tokens provider and a top-down tokenizer.\n */\nfunction registerDocumentRangeSemanticTokensProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.documentRangeSemanticTokensProvider.register(languageSelector, provider);\n}\n/**\n * Register an inline completions provider.\n */\nfunction registerInlineCompletionsProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.inlineCompletionsProvider.register(languageSelector, provider);\n}\n/**\n * Register an inlay hints provider.\n */\nfunction registerInlayHintsProvider(languageSelector, provider) {\n    const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);\n    return languageFeaturesService.inlayHintsProvider.register(languageSelector, provider);\n}\n/**\n * @internal\n */\nfunction createMonacoLanguagesAPI() {\n    return {\n        // eslint-disable-next-line local/code-no-any-casts\n        register: register,\n        // eslint-disable-next-line local/code-no-any-casts\n        getLanguages: getLanguages,\n        // eslint-disable-next-line local/code-no-any-casts\n        onLanguage: onLanguage,\n        // eslint-disable-next-line local/code-no-any-casts\n        onLanguageEncountered: onLanguageEncountered,\n        // eslint-disable-next-line local/code-no-any-casts\n        getEncodedLanguageId: getEncodedLanguageId,\n        // provider methods\n        // eslint-disable-next-line local/code-no-any-casts\n        setLanguageConfiguration: setLanguageConfiguration,\n        setColorMap: setColorMap,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerTokensProviderFactory: registerTokensProviderFactory,\n        // eslint-disable-next-line local/code-no-any-casts\n        setTokensProvider: setTokensProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        setMonarchTokensProvider: setMonarchTokensProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerReferenceProvider: registerReferenceProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerRenameProvider: registerRenameProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerNewSymbolNameProvider: registerNewSymbolNameProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerCompletionItemProvider: registerCompletionItemProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerSignatureHelpProvider: registerSignatureHelpProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerHoverProvider: registerHoverProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerDocumentSymbolProvider: registerDocumentSymbolProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerDocumentHighlightProvider: registerDocumentHighlightProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerLinkedEditingRangeProvider: registerLinkedEditingRangeProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerDefinitionProvider: registerDefinitionProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerImplementationProvider: registerImplementationProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerTypeDefinitionProvider: registerTypeDefinitionProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerCodeLensProvider: registerCodeLensProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerCodeActionProvider: registerCodeActionProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerDocumentFormattingEditProvider: registerDocumentFormattingEditProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerDocumentRangeFormattingEditProvider: registerDocumentRangeFormattingEditProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerOnTypeFormattingEditProvider: registerOnTypeFormattingEditProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerLinkProvider: registerLinkProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerColorProvider: registerColorProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerFoldingRangeProvider: registerFoldingRangeProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerDeclarationProvider: registerDeclarationProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerSelectionRangeProvider: registerSelectionRangeProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerDocumentSemanticTokensProvider: registerDocumentSemanticTokensProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerDocumentRangeSemanticTokensProvider: registerDocumentRangeSemanticTokensProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerInlineCompletionsProvider: registerInlineCompletionsProvider,\n        // eslint-disable-next-line local/code-no-any-casts\n        registerInlayHintsProvider: registerInlayHintsProvider,\n        // enums\n        DocumentHighlightKind: DocumentHighlightKind,\n        CompletionItemKind: CompletionItemKind,\n        CompletionItemTag: CompletionItemTag,\n        CompletionItemInsertTextRule: CompletionItemInsertTextRule,\n        SymbolKind: SymbolKind,\n        SymbolTag: SymbolTag,\n        IndentAction: IndentAction,\n        CompletionTriggerKind: CompletionTriggerKind,\n        SignatureHelpTriggerKind: SignatureHelpTriggerKind,\n        InlayHintKind: InlayHintKind,\n        InlineCompletionTriggerKind: InlineCompletionTriggerKind,\n        CodeActionTriggerType: CodeActionTriggerType,\n        NewSymbolNameTag: NewSymbolNameTag,\n        NewSymbolNameTriggerKind: NewSymbolNameTriggerKind,\n        PartialAcceptTriggerKind: PartialAcceptTriggerKind,\n        HoverVerbosityAction: HoverVerbosityAction,\n        InlineCompletionEndOfLifeReasonKind: InlineCompletionEndOfLifeReasonKind,\n        InlineCompletionHintStyle: InlineCompletionHintStyle,\n        // classes\n        FoldingRangeKind: FoldingRangeKind,\n        // eslint-disable-next-line local/code-no-any-casts\n        SelectedSuggestionInfo: SelectedSuggestionInfo,\n        // eslint-disable-next-line local/code-no-any-casts\n        EditDeltaInfo: EditDeltaInfo,\n    };\n}\n\nexport { EncodedTokenizationSupportAdapter, TokenizationSupportAdapter, createMonacoLanguagesAPI, getEncodedLanguageId, getLanguages, onLanguage, onLanguageEncountered, register, registerCodeActionProvider, registerCodeLensProvider, registerColorProvider, registerCompletionItemProvider, registerDeclarationProvider, registerDefinitionProvider, registerDocumentFormattingEditProvider, registerDocumentHighlightProvider, registerDocumentRangeFormattingEditProvider, registerDocumentRangeSemanticTokensProvider, registerDocumentSemanticTokensProvider, registerDocumentSymbolProvider, registerFoldingRangeProvider, registerHoverProvider, registerImplementationProvider, registerInlayHintsProvider, registerInlineCompletionsProvider, registerLinkProvider, registerLinkedEditingRangeProvider, registerNewSymbolNameProvider, registerOnTypeFormattingEditProvider, registerReferenceProvider, registerRenameProvider, registerSelectionRangeProvider, registerSignatureHelpProvider, registerTokensProviderFactory, registerTypeDefinitionProvider, setColorMap, setLanguageConfiguration, setMonarchTokensProvider, setTokensProvider };\n","import { EditorOptions } from './common/config/editorOptions.js';\nimport { createMonacoBaseAPI } from './common/services/editorBaseApi.js';\nimport { createMonacoEditorAPI } from './standalone/browser/standaloneEditor.js';\nimport { createMonacoLanguagesAPI } from './standalone/browser/standaloneLanguages.js';\nimport { FormattingConflicts } from './contrib/format/browser/format.js';\nimport { getMonacoEnvironment } from '../base/browser/browser.js';\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// Set defaults for standalone editor\nEditorOptions.wrappingIndent.defaultValue = 0 /* WrappingIndent.None */;\nEditorOptions.glyphMargin.defaultValue = false;\nEditorOptions.autoIndent.defaultValue = 3 /* EditorAutoIndentStrategy.Advanced */;\nEditorOptions.overviewRulerLanes.defaultValue = 2;\n// We need to register a formatter selector which simply picks the first available formatter.\n// See https://github.com/microsoft/monaco-editor/issues/2327\nFormattingConflicts.setFormatterSelector((formatter, document, mode) => Promise.resolve(formatter[0]));\nconst api = createMonacoBaseAPI();\napi.editor = createMonacoEditorAPI();\napi.languages = createMonacoLanguagesAPI();\nconst CancellationTokenSource = api.CancellationTokenSource;\nconst Emitter = api.Emitter;\nconst KeyCode = api.KeyCode;\nconst KeyMod = api.KeyMod;\nconst Position = api.Position;\nconst Range = api.Range;\nconst Selection = api.Selection;\nconst SelectionDirection = api.SelectionDirection;\nconst MarkerSeverity = api.MarkerSeverity;\nconst MarkerTag = api.MarkerTag;\nconst Uri = api.Uri;\nconst Token = api.Token;\nconst editor = api.editor;\nconst languages = api.languages;\nconst monacoEnvironment = getMonacoEnvironment();\nconst globalWithAMD = globalThis;\nif (monacoEnvironment?.globalAPI || (typeof globalWithAMD.define === 'function' && globalWithAMD.define.amd)) {\n    globalWithAMD.monaco = api;\n}\nif (typeof globalWithAMD.require !== 'undefined' && typeof globalWithAMD.require.config === 'function') {\n    globalWithAMD.require.config({\n        ignoreDuplicateModules: [\n            'vscode-languageserver-types',\n            'vscode-languageserver-types/main',\n            'vscode-languageserver-textdocument',\n            'vscode-languageserver-textdocument/main',\n            'vscode-nls',\n            'vscode-nls/vscode-nls',\n            'jsonc-parser',\n            'jsonc-parser/main',\n            'vscode-uri',\n            'vscode-uri/index',\n            'vs/basic-languages/typescript/typescript'\n        ]\n    });\n}\n\nexport { CancellationTokenSource, Emitter, KeyCode, KeyMod, MarkerSeverity, MarkerTag, Position, Range, Selection, SelectionDirection, Token, Uri, editor, languages };\n","import '../../editor/browser/coreCommands.js';\nimport '../../editor/browser/widget/codeEditor/codeEditorWidget.js';\nimport '../../editor/browser/widget/diffEditor/diffEditor.contribution.js';\nimport '../../editor/contrib/anchorSelect/browser/anchorSelect.js';\nimport '../../editor/contrib/bracketMatching/browser/bracketMatching.js';\nimport '../../editor/contrib/caretOperations/browser/caretOperations.js';\nimport '../../editor/contrib/caretOperations/browser/transpose.js';\nimport '../../editor/contrib/clipboard/browser/clipboard.js';\nimport '../../editor/contrib/codeAction/browser/codeActionContributions.js';\nimport '../../editor/contrib/codelens/browser/codelensController.js';\nimport '../../editor/contrib/colorPicker/browser/colorPickerContribution.js';\nimport '../../editor/contrib/comment/browser/comment.js';\nimport '../../editor/contrib/contextmenu/browser/contextmenu.js';\nimport '../../editor/contrib/cursorUndo/browser/cursorUndo.js';\nimport '../../editor/contrib/dnd/browser/dnd.js';\nimport '../../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';\nimport '../../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';\nimport '../../editor/contrib/find/browser/findController.js';\nimport '../../editor/contrib/folding/browser/folding.js';\nimport '../../editor/contrib/fontZoom/browser/fontZoom.js';\nimport '../../editor/contrib/format/browser/formatActions.js';\nimport '../../editor/contrib/documentSymbols/browser/documentSymbols.js';\nimport '../../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';\nimport '../../editor/contrib/inlineProgress/browser/inlineProgress.js';\nimport '../../editor/contrib/gotoSymbol/browser/goToCommands.js';\nimport '../../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';\nimport '../../editor/contrib/gotoError/browser/gotoError.js';\nimport '../../editor/contrib/gpu/browser/gpuActions.js';\nimport '../../editor/contrib/hover/browser/hoverContribution.js';\nimport '../../editor/contrib/indentation/browser/indentation.js';\nimport '../../editor/contrib/inlayHints/browser/inlayHintsContribution.js';\nimport '../../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';\nimport '../../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';\nimport '../../editor/contrib/lineSelection/browser/lineSelection.js';\nimport '../../editor/contrib/linesOperations/browser/linesOperations.js';\nimport '../../editor/contrib/linkedEditing/browser/linkedEditing.js';\nimport '../../editor/contrib/links/browser/links.js';\nimport '../../editor/contrib/longLinesHelper/browser/longLinesHelper.js';\nimport '../../editor/contrib/middleScroll/browser/middleScroll.contribution.js';\nimport '../../editor/contrib/multicursor/browser/multicursor.js';\nimport '../../editor/contrib/parameterHints/browser/parameterHints.js';\nimport '../../editor/contrib/placeholderText/browser/placeholderText.contribution.js';\nimport '../../editor/contrib/rename/browser/rename.js';\nimport '../../editor/contrib/sectionHeaders/browser/sectionHeaders.js';\nimport '../../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';\nimport '../../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';\nimport '../../editor/contrib/smartSelect/browser/smartSelect.js';\nimport '../../editor/contrib/snippet/browser/snippetController2.js';\nimport '../../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';\nimport '../../editor/contrib/suggest/browser/suggestController.js';\nimport '../../editor/contrib/suggest/browser/suggestInlineCompletions.js';\nimport '../../editor/contrib/tokenization/browser/tokenization.js';\nimport '../../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';\nimport '../../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';\nimport '../../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';\nimport '../../editor/contrib/wordHighlighter/browser/wordHighlighter.js';\nimport '../../editor/contrib/wordOperations/browser/wordOperations.js';\nimport '../../editor/contrib/wordPartOperations/browser/wordPartOperations.js';\nimport '../../editor/contrib/readOnlyMessage/browser/contribution.js';\nimport '../../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';\nimport '../../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';\nimport '../../editor/common/standaloneStrings.js';\nimport '../../base/browser/ui/codicons/codicon/codicon.css';\nimport '../../base/browser/ui/codicons/codicon/codicon-modifiers.css';\nimport '../../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';\nimport '../../editor/standalone/browser/inspectTokens/inspectTokens.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';\nimport '../../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';\nimport '../../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';\nimport { languages, Emitter } from '../../editor/editor.api2.js';\n\nclass LanguageServiceDefaultsImpl {\n  constructor(languageId, options, modeConfiguration) {\n    this._onDidChange = new Emitter();\n    this._languageId = languageId;\n    this.setOptions(options);\n    this.setModeConfiguration(modeConfiguration);\n  }\n  get onDidChange() {\n    return this._onDidChange.event;\n  }\n  get languageId() {\n    return this._languageId;\n  }\n  get modeConfiguration() {\n    return this._modeConfiguration;\n  }\n  get diagnosticsOptions() {\n    return this.options;\n  }\n  get options() {\n    return this._options;\n  }\n  setOptions(options) {\n    this._options = options || /* @__PURE__ */ Object.create(null);\n    this._onDidChange.fire(this);\n  }\n  setDiagnosticsOptions(options) {\n    this.setOptions(options);\n  }\n  setModeConfiguration(modeConfiguration) {\n    this._modeConfiguration = modeConfiguration || /* @__PURE__ */ Object.create(null);\n    this._onDidChange.fire(this);\n  }\n}\nconst optionsDefault = {\n  validate: true,\n  lint: {\n    compatibleVendorPrefixes: \"ignore\",\n    vendorPrefix: \"warning\",\n    duplicateProperties: \"warning\",\n    emptyRules: \"warning\",\n    importStatement: \"ignore\",\n    boxModel: \"ignore\",\n    universalSelector: \"ignore\",\n    zeroUnits: \"ignore\",\n    fontFaceProperties: \"warning\",\n    hexColorLength: \"error\",\n    argumentsInColorFunction: \"error\",\n    unknownProperties: \"warning\",\n    ieHack: \"ignore\",\n    unknownVendorSpecificProperties: \"ignore\",\n    propertyIgnoredDueToDisplay: \"warning\",\n    important: \"ignore\",\n    float: \"ignore\",\n    idSelector: \"ignore\"\n  },\n  data: { useDefaultDataProvider: true },\n  format: {\n    newlineBetweenSelectors: true,\n    newlineBetweenRules: true,\n    spaceAroundSelectorSeparator: false,\n    braceStyle: \"collapse\",\n    maxPreserveNewLines: void 0,\n    preserveNewLines: true\n  }\n};\nconst modeConfigurationDefault = {\n  completionItems: true,\n  hovers: true,\n  documentSymbols: true,\n  definitions: true,\n  references: true,\n  documentHighlights: true,\n  rename: true,\n  colors: true,\n  foldingRanges: true,\n  diagnostics: true,\n  selectionRanges: true,\n  documentFormattingEdits: true,\n  documentRangeFormattingEdits: true\n};\nconst cssDefaults = new LanguageServiceDefaultsImpl(\n  \"css\",\n  optionsDefault,\n  modeConfigurationDefault\n);\nconst scssDefaults = new LanguageServiceDefaultsImpl(\n  \"scss\",\n  optionsDefault,\n  modeConfigurationDefault\n);\nconst lessDefaults = new LanguageServiceDefaultsImpl(\n  \"less\",\n  optionsDefault,\n  modeConfigurationDefault\n);\nfunction getMode() {\n  return import('./cssMode.js');\n}\nlanguages.onLanguage(\"less\", () => {\n  getMode().then((mode2) => mode2.setupMode(lessDefaults));\n});\nlanguages.onLanguage(\"scss\", () => {\n  getMode().then((mode2) => mode2.setupMode(scssDefaults));\n});\nlanguages.onLanguage(\"css\", () => {\n  getMode().then((mode2) => mode2.setupMode(cssDefaults));\n});\n\nexport { cssDefaults, lessDefaults, scssDefaults };\n","import '../../editor/browser/coreCommands.js';\nimport '../../editor/browser/widget/codeEditor/codeEditorWidget.js';\nimport '../../editor/browser/widget/diffEditor/diffEditor.contribution.js';\nimport '../../editor/contrib/anchorSelect/browser/anchorSelect.js';\nimport '../../editor/contrib/bracketMatching/browser/bracketMatching.js';\nimport '../../editor/contrib/caretOperations/browser/caretOperations.js';\nimport '../../editor/contrib/caretOperations/browser/transpose.js';\nimport '../../editor/contrib/clipboard/browser/clipboard.js';\nimport '../../editor/contrib/codeAction/browser/codeActionContributions.js';\nimport '../../editor/contrib/codelens/browser/codelensController.js';\nimport '../../editor/contrib/colorPicker/browser/colorPickerContribution.js';\nimport '../../editor/contrib/comment/browser/comment.js';\nimport '../../editor/contrib/contextmenu/browser/contextmenu.js';\nimport '../../editor/contrib/cursorUndo/browser/cursorUndo.js';\nimport '../../editor/contrib/dnd/browser/dnd.js';\nimport '../../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';\nimport '../../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';\nimport '../../editor/contrib/find/browser/findController.js';\nimport '../../editor/contrib/folding/browser/folding.js';\nimport '../../editor/contrib/fontZoom/browser/fontZoom.js';\nimport '../../editor/contrib/format/browser/formatActions.js';\nimport '../../editor/contrib/documentSymbols/browser/documentSymbols.js';\nimport '../../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';\nimport '../../editor/contrib/inlineProgress/browser/inlineProgress.js';\nimport '../../editor/contrib/gotoSymbol/browser/goToCommands.js';\nimport '../../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';\nimport '../../editor/contrib/gotoError/browser/gotoError.js';\nimport '../../editor/contrib/gpu/browser/gpuActions.js';\nimport '../../editor/contrib/hover/browser/hoverContribution.js';\nimport '../../editor/contrib/indentation/browser/indentation.js';\nimport '../../editor/contrib/inlayHints/browser/inlayHintsContribution.js';\nimport '../../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';\nimport '../../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';\nimport '../../editor/contrib/lineSelection/browser/lineSelection.js';\nimport '../../editor/contrib/linesOperations/browser/linesOperations.js';\nimport '../../editor/contrib/linkedEditing/browser/linkedEditing.js';\nimport '../../editor/contrib/links/browser/links.js';\nimport '../../editor/contrib/longLinesHelper/browser/longLinesHelper.js';\nimport '../../editor/contrib/middleScroll/browser/middleScroll.contribution.js';\nimport '../../editor/contrib/multicursor/browser/multicursor.js';\nimport '../../editor/contrib/parameterHints/browser/parameterHints.js';\nimport '../../editor/contrib/placeholderText/browser/placeholderText.contribution.js';\nimport '../../editor/contrib/rename/browser/rename.js';\nimport '../../editor/contrib/sectionHeaders/browser/sectionHeaders.js';\nimport '../../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';\nimport '../../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';\nimport '../../editor/contrib/smartSelect/browser/smartSelect.js';\nimport '../../editor/contrib/snippet/browser/snippetController2.js';\nimport '../../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';\nimport '../../editor/contrib/suggest/browser/suggestController.js';\nimport '../../editor/contrib/suggest/browser/suggestInlineCompletions.js';\nimport '../../editor/contrib/tokenization/browser/tokenization.js';\nimport '../../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';\nimport '../../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';\nimport '../../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';\nimport '../../editor/contrib/wordHighlighter/browser/wordHighlighter.js';\nimport '../../editor/contrib/wordOperations/browser/wordOperations.js';\nimport '../../editor/contrib/wordPartOperations/browser/wordPartOperations.js';\nimport '../../editor/contrib/readOnlyMessage/browser/contribution.js';\nimport '../../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';\nimport '../../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';\nimport '../../editor/common/standaloneStrings.js';\nimport '../../base/browser/ui/codicons/codicon/codicon.css';\nimport '../../base/browser/ui/codicons/codicon/codicon-modifiers.css';\nimport '../../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';\nimport '../../editor/standalone/browser/inspectTokens/inspectTokens.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';\nimport '../../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';\nimport '../../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';\nimport { languages, Emitter } from '../../editor/editor.api2.js';\n\nclass LanguageServiceDefaultsImpl {\n  constructor(languageId, options, modeConfiguration) {\n    this._onDidChange = new Emitter();\n    this._languageId = languageId;\n    this.setOptions(options);\n    this.setModeConfiguration(modeConfiguration);\n  }\n  get onDidChange() {\n    return this._onDidChange.event;\n  }\n  get languageId() {\n    return this._languageId;\n  }\n  get options() {\n    return this._options;\n  }\n  get modeConfiguration() {\n    return this._modeConfiguration;\n  }\n  setOptions(options) {\n    this._options = options || /* @__PURE__ */ Object.create(null);\n    this._onDidChange.fire(this);\n  }\n  setModeConfiguration(modeConfiguration) {\n    this._modeConfiguration = modeConfiguration || /* @__PURE__ */ Object.create(null);\n    this._onDidChange.fire(this);\n  }\n}\nconst formatDefaults = {\n  tabSize: 4,\n  insertSpaces: false,\n  wrapLineLength: 120,\n  unformatted: 'default\": \"a, abbr, acronym, b, bdo, big, br, button, cite, code, dfn, em, i, img, input, kbd, label, map, object, q, samp, select, small, span, strong, sub, sup, textarea, tt, var',\n  contentUnformatted: \"pre\",\n  indentInnerHtml: false,\n  preserveNewLines: true,\n  maxPreserveNewLines: void 0,\n  indentHandlebars: false,\n  endWithNewline: false,\n  extraLiners: \"head, body, /html\",\n  wrapAttributes: \"auto\"\n};\nconst optionsDefault = {\n  format: formatDefaults,\n  suggest: {},\n  data: { useDefaultDataProvider: true }\n};\nfunction getConfigurationDefault(languageId) {\n  return {\n    completionItems: true,\n    hovers: true,\n    documentSymbols: true,\n    links: true,\n    documentHighlights: true,\n    rename: true,\n    colors: true,\n    foldingRanges: true,\n    selectionRanges: true,\n    diagnostics: languageId === htmlLanguageId,\n    // turned off for Razor and Handlebar\n    documentFormattingEdits: languageId === htmlLanguageId,\n    // turned off for Razor and Handlebar\n    documentRangeFormattingEdits: languageId === htmlLanguageId\n    // turned off for Razor and Handlebar\n  };\n}\nconst htmlLanguageId = \"html\";\nconst handlebarsLanguageId = \"handlebars\";\nconst razorLanguageId = \"razor\";\nconst htmlLanguageService = registerHTMLLanguageService(\n  htmlLanguageId,\n  optionsDefault,\n  getConfigurationDefault(htmlLanguageId)\n);\nconst htmlDefaults = htmlLanguageService.defaults;\nconst handlebarLanguageService = registerHTMLLanguageService(\n  handlebarsLanguageId,\n  optionsDefault,\n  getConfigurationDefault(handlebarsLanguageId)\n);\nconst handlebarDefaults = handlebarLanguageService.defaults;\nconst razorLanguageService = registerHTMLLanguageService(\n  razorLanguageId,\n  optionsDefault,\n  getConfigurationDefault(razorLanguageId)\n);\nconst razorDefaults = razorLanguageService.defaults;\nfunction getMode() {\n  return import('./htmlMode.js');\n}\nfunction registerHTMLLanguageService(languageId, options = optionsDefault, modeConfiguration = getConfigurationDefault(languageId)) {\n  const defaults = new LanguageServiceDefaultsImpl(languageId, options, modeConfiguration);\n  let mode2;\n  const onLanguageListener = languages.onLanguage(languageId, async () => {\n    mode2 = (await getMode()).setupMode(defaults);\n  });\n  return {\n    defaults,\n    dispose() {\n      onLanguageListener.dispose();\n      mode2?.dispose();\n      mode2 = void 0;\n    }\n  };\n}\n\nexport { handlebarDefaults, handlebarLanguageService, htmlDefaults, htmlLanguageService, razorDefaults, razorLanguageService, registerHTMLLanguageService };\n","import '../../editor/browser/coreCommands.js';\nimport '../../editor/browser/widget/codeEditor/codeEditorWidget.js';\nimport '../../editor/browser/widget/diffEditor/diffEditor.contribution.js';\nimport '../../editor/contrib/anchorSelect/browser/anchorSelect.js';\nimport '../../editor/contrib/bracketMatching/browser/bracketMatching.js';\nimport '../../editor/contrib/caretOperations/browser/caretOperations.js';\nimport '../../editor/contrib/caretOperations/browser/transpose.js';\nimport '../../editor/contrib/clipboard/browser/clipboard.js';\nimport '../../editor/contrib/codeAction/browser/codeActionContributions.js';\nimport '../../editor/contrib/codelens/browser/codelensController.js';\nimport '../../editor/contrib/colorPicker/browser/colorPickerContribution.js';\nimport '../../editor/contrib/comment/browser/comment.js';\nimport '../../editor/contrib/contextmenu/browser/contextmenu.js';\nimport '../../editor/contrib/cursorUndo/browser/cursorUndo.js';\nimport '../../editor/contrib/dnd/browser/dnd.js';\nimport '../../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';\nimport '../../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';\nimport '../../editor/contrib/find/browser/findController.js';\nimport '../../editor/contrib/folding/browser/folding.js';\nimport '../../editor/contrib/fontZoom/browser/fontZoom.js';\nimport '../../editor/contrib/format/browser/formatActions.js';\nimport '../../editor/contrib/documentSymbols/browser/documentSymbols.js';\nimport '../../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';\nimport '../../editor/contrib/inlineProgress/browser/inlineProgress.js';\nimport '../../editor/contrib/gotoSymbol/browser/goToCommands.js';\nimport '../../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';\nimport '../../editor/contrib/gotoError/browser/gotoError.js';\nimport '../../editor/contrib/gpu/browser/gpuActions.js';\nimport '../../editor/contrib/hover/browser/hoverContribution.js';\nimport '../../editor/contrib/indentation/browser/indentation.js';\nimport '../../editor/contrib/inlayHints/browser/inlayHintsContribution.js';\nimport '../../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';\nimport '../../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';\nimport '../../editor/contrib/lineSelection/browser/lineSelection.js';\nimport '../../editor/contrib/linesOperations/browser/linesOperations.js';\nimport '../../editor/contrib/linkedEditing/browser/linkedEditing.js';\nimport '../../editor/contrib/links/browser/links.js';\nimport '../../editor/contrib/longLinesHelper/browser/longLinesHelper.js';\nimport '../../editor/contrib/middleScroll/browser/middleScroll.contribution.js';\nimport '../../editor/contrib/multicursor/browser/multicursor.js';\nimport '../../editor/contrib/parameterHints/browser/parameterHints.js';\nimport '../../editor/contrib/placeholderText/browser/placeholderText.contribution.js';\nimport '../../editor/contrib/rename/browser/rename.js';\nimport '../../editor/contrib/sectionHeaders/browser/sectionHeaders.js';\nimport '../../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';\nimport '../../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';\nimport '../../editor/contrib/smartSelect/browser/smartSelect.js';\nimport '../../editor/contrib/snippet/browser/snippetController2.js';\nimport '../../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';\nimport '../../editor/contrib/suggest/browser/suggestController.js';\nimport '../../editor/contrib/suggest/browser/suggestInlineCompletions.js';\nimport '../../editor/contrib/tokenization/browser/tokenization.js';\nimport '../../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';\nimport '../../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';\nimport '../../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';\nimport '../../editor/contrib/wordHighlighter/browser/wordHighlighter.js';\nimport '../../editor/contrib/wordOperations/browser/wordOperations.js';\nimport '../../editor/contrib/wordPartOperations/browser/wordPartOperations.js';\nimport '../../editor/contrib/readOnlyMessage/browser/contribution.js';\nimport '../../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';\nimport '../../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';\nimport '../../editor/common/standaloneStrings.js';\nimport '../../base/browser/ui/codicons/codicon/codicon.css';\nimport '../../base/browser/ui/codicons/codicon/codicon-modifiers.css';\nimport '../../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';\nimport '../../editor/standalone/browser/inspectTokens/inspectTokens.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';\nimport '../../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';\nimport '../../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';\nimport { languages, Emitter } from '../../editor/editor.api2.js';\n\nclass LanguageServiceDefaultsImpl {\n  constructor(languageId, diagnosticsOptions, modeConfiguration) {\n    this._onDidChange = new Emitter();\n    this._languageId = languageId;\n    this.setDiagnosticsOptions(diagnosticsOptions);\n    this.setModeConfiguration(modeConfiguration);\n  }\n  get onDidChange() {\n    return this._onDidChange.event;\n  }\n  get languageId() {\n    return this._languageId;\n  }\n  get modeConfiguration() {\n    return this._modeConfiguration;\n  }\n  get diagnosticsOptions() {\n    return this._diagnosticsOptions;\n  }\n  setDiagnosticsOptions(options) {\n    this._diagnosticsOptions = options || /* @__PURE__ */ Object.create(null);\n    this._onDidChange.fire(this);\n  }\n  setModeConfiguration(modeConfiguration) {\n    this._modeConfiguration = modeConfiguration || /* @__PURE__ */ Object.create(null);\n    this._onDidChange.fire(this);\n  }\n}\nconst diagnosticDefault = {\n  validate: true,\n  allowComments: true,\n  schemas: [],\n  enableSchemaRequest: false,\n  schemaRequest: \"warning\",\n  schemaValidation: \"warning\",\n  comments: \"error\",\n  trailingCommas: \"error\"\n};\nconst modeConfigurationDefault = {\n  documentFormattingEdits: true,\n  documentRangeFormattingEdits: true,\n  completionItems: true,\n  hovers: true,\n  documentSymbols: true,\n  tokens: true,\n  colors: true,\n  foldingRanges: true,\n  diagnostics: true,\n  selectionRanges: true\n};\nconst jsonDefaults = new LanguageServiceDefaultsImpl(\n  \"json\",\n  diagnosticDefault,\n  modeConfigurationDefault\n);\nconst getWorker = () => getMode().then((mode2) => mode2.getWorker());\nfunction getMode() {\n  return import('./jsonMode.js');\n}\nlanguages.register({\n  id: \"json\",\n  extensions: [\".json\", \".bowerrc\", \".jshintrc\", \".jscsrc\", \".eslintrc\", \".babelrc\", \".har\"],\n  aliases: [\"JSON\", \"json\"],\n  mimetypes: [\"application/json\"]\n});\nlanguages.onLanguage(\"json\", () => {\n  getMode().then((mode2) => mode2.setupMode(jsonDefaults));\n});\n\nexport { getWorker, jsonDefaults };\n","const typescriptVersion = \"5.9.3\";\n\nexport { typescriptVersion };\n","import { typescriptVersion as typescriptVersion$1 } from './lib/typescriptServicesMetadata.js';\nimport '../../editor/browser/coreCommands.js';\nimport '../../editor/browser/widget/codeEditor/codeEditorWidget.js';\nimport '../../editor/browser/widget/diffEditor/diffEditor.contribution.js';\nimport '../../editor/contrib/anchorSelect/browser/anchorSelect.js';\nimport '../../editor/contrib/bracketMatching/browser/bracketMatching.js';\nimport '../../editor/contrib/caretOperations/browser/caretOperations.js';\nimport '../../editor/contrib/caretOperations/browser/transpose.js';\nimport '../../editor/contrib/clipboard/browser/clipboard.js';\nimport '../../editor/contrib/codeAction/browser/codeActionContributions.js';\nimport '../../editor/contrib/codelens/browser/codelensController.js';\nimport '../../editor/contrib/colorPicker/browser/colorPickerContribution.js';\nimport '../../editor/contrib/comment/browser/comment.js';\nimport '../../editor/contrib/contextmenu/browser/contextmenu.js';\nimport '../../editor/contrib/cursorUndo/browser/cursorUndo.js';\nimport '../../editor/contrib/dnd/browser/dnd.js';\nimport '../../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';\nimport '../../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';\nimport '../../editor/contrib/find/browser/findController.js';\nimport '../../editor/contrib/folding/browser/folding.js';\nimport '../../editor/contrib/fontZoom/browser/fontZoom.js';\nimport '../../editor/contrib/format/browser/formatActions.js';\nimport '../../editor/contrib/documentSymbols/browser/documentSymbols.js';\nimport '../../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';\nimport '../../editor/contrib/inlineProgress/browser/inlineProgress.js';\nimport '../../editor/contrib/gotoSymbol/browser/goToCommands.js';\nimport '../../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';\nimport '../../editor/contrib/gotoError/browser/gotoError.js';\nimport '../../editor/contrib/gpu/browser/gpuActions.js';\nimport '../../editor/contrib/hover/browser/hoverContribution.js';\nimport '../../editor/contrib/indentation/browser/indentation.js';\nimport '../../editor/contrib/inlayHints/browser/inlayHintsContribution.js';\nimport '../../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';\nimport '../../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';\nimport '../../editor/contrib/lineSelection/browser/lineSelection.js';\nimport '../../editor/contrib/linesOperations/browser/linesOperations.js';\nimport '../../editor/contrib/linkedEditing/browser/linkedEditing.js';\nimport '../../editor/contrib/links/browser/links.js';\nimport '../../editor/contrib/longLinesHelper/browser/longLinesHelper.js';\nimport '../../editor/contrib/middleScroll/browser/middleScroll.contribution.js';\nimport '../../editor/contrib/multicursor/browser/multicursor.js';\nimport '../../editor/contrib/parameterHints/browser/parameterHints.js';\nimport '../../editor/contrib/placeholderText/browser/placeholderText.contribution.js';\nimport '../../editor/contrib/rename/browser/rename.js';\nimport '../../editor/contrib/sectionHeaders/browser/sectionHeaders.js';\nimport '../../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';\nimport '../../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';\nimport '../../editor/contrib/smartSelect/browser/smartSelect.js';\nimport '../../editor/contrib/snippet/browser/snippetController2.js';\nimport '../../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';\nimport '../../editor/contrib/suggest/browser/suggestController.js';\nimport '../../editor/contrib/suggest/browser/suggestInlineCompletions.js';\nimport '../../editor/contrib/tokenization/browser/tokenization.js';\nimport '../../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';\nimport '../../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';\nimport '../../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';\nimport '../../editor/contrib/wordHighlighter/browser/wordHighlighter.js';\nimport '../../editor/contrib/wordOperations/browser/wordOperations.js';\nimport '../../editor/contrib/wordPartOperations/browser/wordPartOperations.js';\nimport '../../editor/contrib/readOnlyMessage/browser/contribution.js';\nimport '../../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';\nimport '../../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';\nimport '../../editor/common/standaloneStrings.js';\nimport '../../base/browser/ui/codicons/codicon/codicon.css';\nimport '../../base/browser/ui/codicons/codicon/codicon-modifiers.css';\nimport '../../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';\nimport '../../editor/standalone/browser/inspectTokens/inspectTokens.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';\nimport '../../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';\nimport '../../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';\nimport '../../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';\nimport { languages, Emitter } from '../../editor/editor.api2.js';\n\nvar ModuleKind = /* @__PURE__ */ ((ModuleKind2) => {\n  ModuleKind2[ModuleKind2[\"None\"] = 0] = \"None\";\n  ModuleKind2[ModuleKind2[\"CommonJS\"] = 1] = \"CommonJS\";\n  ModuleKind2[ModuleKind2[\"AMD\"] = 2] = \"AMD\";\n  ModuleKind2[ModuleKind2[\"UMD\"] = 3] = \"UMD\";\n  ModuleKind2[ModuleKind2[\"System\"] = 4] = \"System\";\n  ModuleKind2[ModuleKind2[\"ES2015\"] = 5] = \"ES2015\";\n  ModuleKind2[ModuleKind2[\"ESNext\"] = 99] = \"ESNext\";\n  return ModuleKind2;\n})(ModuleKind || {});\nvar JsxEmit = /* @__PURE__ */ ((JsxEmit2) => {\n  JsxEmit2[JsxEmit2[\"None\"] = 0] = \"None\";\n  JsxEmit2[JsxEmit2[\"Preserve\"] = 1] = \"Preserve\";\n  JsxEmit2[JsxEmit2[\"React\"] = 2] = \"React\";\n  JsxEmit2[JsxEmit2[\"ReactNative\"] = 3] = \"ReactNative\";\n  JsxEmit2[JsxEmit2[\"ReactJSX\"] = 4] = \"ReactJSX\";\n  JsxEmit2[JsxEmit2[\"ReactJSXDev\"] = 5] = \"ReactJSXDev\";\n  return JsxEmit2;\n})(JsxEmit || {});\nvar NewLineKind = /* @__PURE__ */ ((NewLineKind2) => {\n  NewLineKind2[NewLineKind2[\"CarriageReturnLineFeed\"] = 0] = \"CarriageReturnLineFeed\";\n  NewLineKind2[NewLineKind2[\"LineFeed\"] = 1] = \"LineFeed\";\n  return NewLineKind2;\n})(NewLineKind || {});\nvar ScriptTarget = /* @__PURE__ */ ((ScriptTarget2) => {\n  ScriptTarget2[ScriptTarget2[\"ES3\"] = 0] = \"ES3\";\n  ScriptTarget2[ScriptTarget2[\"ES5\"] = 1] = \"ES5\";\n  ScriptTarget2[ScriptTarget2[\"ES2015\"] = 2] = \"ES2015\";\n  ScriptTarget2[ScriptTarget2[\"ES2016\"] = 3] = \"ES2016\";\n  ScriptTarget2[ScriptTarget2[\"ES2017\"] = 4] = \"ES2017\";\n  ScriptTarget2[ScriptTarget2[\"ES2018\"] = 5] = \"ES2018\";\n  ScriptTarget2[ScriptTarget2[\"ES2019\"] = 6] = \"ES2019\";\n  ScriptTarget2[ScriptTarget2[\"ES2020\"] = 7] = \"ES2020\";\n  ScriptTarget2[ScriptTarget2[\"ESNext\"] = 99] = \"ESNext\";\n  ScriptTarget2[ScriptTarget2[\"JSON\"] = 100] = \"JSON\";\n  ScriptTarget2[ScriptTarget2[\"Latest\"] = 99 /* ESNext */] = \"Latest\";\n  return ScriptTarget2;\n})(ScriptTarget || {});\nvar ModuleResolutionKind = /* @__PURE__ */ ((ModuleResolutionKind2) => {\n  ModuleResolutionKind2[ModuleResolutionKind2[\"Classic\"] = 1] = \"Classic\";\n  ModuleResolutionKind2[ModuleResolutionKind2[\"NodeJs\"] = 2] = \"NodeJs\";\n  return ModuleResolutionKind2;\n})(ModuleResolutionKind || {});\nclass LanguageServiceDefaultsImpl {\n  constructor(compilerOptions, diagnosticsOptions, workerOptions, inlayHintsOptions, modeConfiguration) {\n    this._onDidChange = new Emitter();\n    this._onDidExtraLibsChange = new Emitter();\n    this._extraLibs = /* @__PURE__ */ Object.create(null);\n    this._removedExtraLibs = /* @__PURE__ */ Object.create(null);\n    this._eagerModelSync = false;\n    this.setCompilerOptions(compilerOptions);\n    this.setDiagnosticsOptions(diagnosticsOptions);\n    this.setWorkerOptions(workerOptions);\n    this.setInlayHintsOptions(inlayHintsOptions);\n    this.setModeConfiguration(modeConfiguration);\n    this._onDidExtraLibsChangeTimeout = -1;\n  }\n  get onDidChange() {\n    return this._onDidChange.event;\n  }\n  get onDidExtraLibsChange() {\n    return this._onDidExtraLibsChange.event;\n  }\n  get modeConfiguration() {\n    return this._modeConfiguration;\n  }\n  get workerOptions() {\n    return this._workerOptions;\n  }\n  get inlayHintsOptions() {\n    return this._inlayHintsOptions;\n  }\n  getExtraLibs() {\n    return this._extraLibs;\n  }\n  addExtraLib(content, _filePath) {\n    let filePath;\n    if (typeof _filePath === \"undefined\") {\n      filePath = `ts:extralib-${Math.random().toString(36).substring(2, 15)}`;\n    } else {\n      filePath = _filePath;\n    }\n    if (this._extraLibs[filePath] && this._extraLibs[filePath].content === content) {\n      return {\n        dispose: () => {\n        }\n      };\n    }\n    let myVersion = 1;\n    if (this._removedExtraLibs[filePath]) {\n      myVersion = this._removedExtraLibs[filePath] + 1;\n    }\n    if (this._extraLibs[filePath]) {\n      myVersion = this._extraLibs[filePath].version + 1;\n    }\n    this._extraLibs[filePath] = {\n      content,\n      version: myVersion\n    };\n    this._fireOnDidExtraLibsChangeSoon();\n    return {\n      dispose: () => {\n        let extraLib = this._extraLibs[filePath];\n        if (!extraLib) {\n          return;\n        }\n        if (extraLib.version !== myVersion) {\n          return;\n        }\n        delete this._extraLibs[filePath];\n        this._removedExtraLibs[filePath] = myVersion;\n        this._fireOnDidExtraLibsChangeSoon();\n      }\n    };\n  }\n  setExtraLibs(libs) {\n    for (const filePath in this._extraLibs) {\n      this._removedExtraLibs[filePath] = this._extraLibs[filePath].version;\n    }\n    this._extraLibs = /* @__PURE__ */ Object.create(null);\n    if (libs && libs.length > 0) {\n      for (const lib of libs) {\n        const filePath = lib.filePath || `ts:extralib-${Math.random().toString(36).substring(2, 15)}`;\n        const content = lib.content;\n        let myVersion = 1;\n        if (this._removedExtraLibs[filePath]) {\n          myVersion = this._removedExtraLibs[filePath] + 1;\n        }\n        this._extraLibs[filePath] = {\n          content,\n          version: myVersion\n        };\n      }\n    }\n    this._fireOnDidExtraLibsChangeSoon();\n  }\n  _fireOnDidExtraLibsChangeSoon() {\n    if (this._onDidExtraLibsChangeTimeout !== -1) {\n      return;\n    }\n    this._onDidExtraLibsChangeTimeout = window.setTimeout(() => {\n      this._onDidExtraLibsChangeTimeout = -1;\n      this._onDidExtraLibsChange.fire(void 0);\n    }, 0);\n  }\n  getCompilerOptions() {\n    return this._compilerOptions;\n  }\n  setCompilerOptions(options) {\n    this._compilerOptions = options || /* @__PURE__ */ Object.create(null);\n    this._onDidChange.fire(void 0);\n  }\n  getDiagnosticsOptions() {\n    return this._diagnosticsOptions;\n  }\n  setDiagnosticsOptions(options) {\n    this._diagnosticsOptions = options || /* @__PURE__ */ Object.create(null);\n    this._onDidChange.fire(void 0);\n  }\n  setWorkerOptions(options) {\n    this._workerOptions = options || /* @__PURE__ */ Object.create(null);\n    this._onDidChange.fire(void 0);\n  }\n  setInlayHintsOptions(options) {\n    this._inlayHintsOptions = options || /* @__PURE__ */ Object.create(null);\n    this._onDidChange.fire(void 0);\n  }\n  setMaximumWorkerIdleTime(value) {\n  }\n  setEagerModelSync(value) {\n    this._eagerModelSync = value;\n  }\n  getEagerModelSync() {\n    return this._eagerModelSync;\n  }\n  setModeConfiguration(modeConfiguration) {\n    this._modeConfiguration = modeConfiguration || /* @__PURE__ */ Object.create(null);\n    this._onDidChange.fire(void 0);\n  }\n}\nconst typescriptVersion = typescriptVersion$1;\nconst modeConfigurationDefault = {\n  completionItems: true,\n  hovers: true,\n  documentSymbols: true,\n  definitions: true,\n  references: true,\n  documentHighlights: true,\n  rename: true,\n  diagnostics: true,\n  documentRangeFormattingEdits: true,\n  signatureHelp: true,\n  onTypeFormattingEdits: true,\n  codeActions: true,\n  inlayHints: true\n};\nconst typescriptDefaults = new LanguageServiceDefaultsImpl(\n  { allowNonTsExtensions: true, target: 99 /* Latest */ },\n  { noSemanticValidation: false, noSyntaxValidation: false, onlyVisible: false },\n  {},\n  {},\n  modeConfigurationDefault\n);\nconst javascriptDefaults = new LanguageServiceDefaultsImpl(\n  { allowNonTsExtensions: true, allowJs: true, target: 99 /* Latest */ },\n  { noSemanticValidation: true, noSyntaxValidation: false, onlyVisible: false },\n  {},\n  {},\n  modeConfigurationDefault\n);\nconst getTypeScriptWorker = () => {\n  return getMode().then((mode) => mode.getTypeScriptWorker());\n};\nconst getJavaScriptWorker = () => {\n  return getMode().then((mode) => mode.getJavaScriptWorker());\n};\nfunction getMode() {\n  return import('./tsMode.js');\n}\nlanguages.onLanguage(\"typescript\", () => {\n  return getMode().then((mode) => mode.setupTypeScript(typescriptDefaults));\n});\nlanguages.onLanguage(\"javascript\", () => {\n  return getMode().then((mode) => mode.setupJavaScript(javascriptDefaults));\n});\n\nexport { JsxEmit, ModuleKind, ModuleResolutionKind, NewLineKind, ScriptTarget, getJavaScriptWorker, getTypeScriptWorker, javascriptDefaults, typescriptDefaults, typescriptVersion };\n","import '../editor/browser/coreCommands.js';\nimport '../editor/browser/widget/codeEditor/codeEditorWidget.js';\nimport '../editor/browser/widget/diffEditor/diffEditor.contribution.js';\nimport '../editor/contrib/anchorSelect/browser/anchorSelect.js';\nimport '../editor/contrib/bracketMatching/browser/bracketMatching.js';\nimport '../editor/contrib/caretOperations/browser/caretOperations.js';\nimport '../editor/contrib/caretOperations/browser/transpose.js';\nimport '../editor/contrib/clipboard/browser/clipboard.js';\nimport '../editor/contrib/codeAction/browser/codeActionContributions.js';\nimport '../editor/contrib/codelens/browser/codelensController.js';\nimport '../editor/contrib/colorPicker/browser/colorPickerContribution.js';\nimport '../editor/contrib/comment/browser/comment.js';\nimport '../editor/contrib/contextmenu/browser/contextmenu.js';\nimport '../editor/contrib/cursorUndo/browser/cursorUndo.js';\nimport '../editor/contrib/dnd/browser/dnd.js';\nimport '../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';\nimport '../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';\nimport '../editor/contrib/find/browser/findController.js';\nimport '../editor/contrib/folding/browser/folding.js';\nimport '../editor/contrib/fontZoom/browser/fontZoom.js';\nimport '../editor/contrib/format/browser/formatActions.js';\nimport '../editor/contrib/documentSymbols/browser/documentSymbols.js';\nimport '../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';\nimport '../editor/contrib/inlineProgress/browser/inlineProgress.js';\nimport '../editor/contrib/gotoSymbol/browser/goToCommands.js';\nimport '../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';\nimport '../editor/contrib/gotoError/browser/gotoError.js';\nimport '../editor/contrib/gpu/browser/gpuActions.js';\nimport '../editor/contrib/hover/browser/hoverContribution.js';\nimport '../editor/contrib/indentation/browser/indentation.js';\nimport '../editor/contrib/inlayHints/browser/inlayHintsContribution.js';\nimport '../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';\nimport '../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';\nimport '../editor/contrib/lineSelection/browser/lineSelection.js';\nimport '../editor/contrib/linesOperations/browser/linesOperations.js';\nimport '../editor/contrib/linkedEditing/browser/linkedEditing.js';\nimport '../editor/contrib/links/browser/links.js';\nimport '../editor/contrib/longLinesHelper/browser/longLinesHelper.js';\nimport '../editor/contrib/middleScroll/browser/middleScroll.contribution.js';\nimport '../editor/contrib/multicursor/browser/multicursor.js';\nimport '../editor/contrib/parameterHints/browser/parameterHints.js';\nimport '../editor/contrib/placeholderText/browser/placeholderText.contribution.js';\nimport '../editor/contrib/rename/browser/rename.js';\nimport '../editor/contrib/sectionHeaders/browser/sectionHeaders.js';\nimport '../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';\nimport '../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';\nimport '../editor/contrib/smartSelect/browser/smartSelect.js';\nimport '../editor/contrib/snippet/browser/snippetController2.js';\nimport '../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';\nimport '../editor/contrib/suggest/browser/suggestController.js';\nimport '../editor/contrib/suggest/browser/suggestInlineCompletions.js';\nimport '../editor/contrib/tokenization/browser/tokenization.js';\nimport '../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';\nimport '../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';\nimport '../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';\nimport '../editor/contrib/wordHighlighter/browser/wordHighlighter.js';\nimport '../editor/contrib/wordOperations/browser/wordOperations.js';\nimport '../editor/contrib/wordPartOperations/browser/wordPartOperations.js';\nimport '../editor/contrib/readOnlyMessage/browser/contribution.js';\nimport '../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';\nimport '../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';\nimport '../editor/common/standaloneStrings.js';\nimport '../base/browser/ui/codicons/codicon/codicon.css';\nimport '../base/browser/ui/codicons/codicon/codicon-modifiers.css';\nimport '../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';\nimport '../editor/standalone/browser/inspectTokens/inspectTokens.js';\nimport '../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';\nimport '../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';\nimport '../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';\nimport '../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';\nimport '../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';\nimport '../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';\nimport { languages } from '../editor/editor.api2.js';\n\nconst languageDefinitions = {};\nconst lazyLanguageLoaders = {};\nclass LazyLanguageLoader {\n  static getOrCreate(languageId) {\n    if (!lazyLanguageLoaders[languageId]) {\n      lazyLanguageLoaders[languageId] = new LazyLanguageLoader(languageId);\n    }\n    return lazyLanguageLoaders[languageId];\n  }\n  constructor(languageId) {\n    this._languageId = languageId;\n    this._loadingTriggered = false;\n    this._lazyLoadPromise = new Promise((resolve, reject) => {\n      this._lazyLoadPromiseResolve = resolve;\n      this._lazyLoadPromiseReject = reject;\n    });\n  }\n  load() {\n    if (!this._loadingTriggered) {\n      this._loadingTriggered = true;\n      languageDefinitions[this._languageId].loader().then(\n        (mod) => this._lazyLoadPromiseResolve(mod),\n        (err) => this._lazyLoadPromiseReject(err)\n      );\n    }\n    return this._lazyLoadPromise;\n  }\n}\nfunction registerLanguage(def) {\n  const languageId = def.id;\n  languageDefinitions[languageId] = def;\n  languages.register(def);\n  const lazyLanguageLoader = LazyLanguageLoader.getOrCreate(languageId);\n  languages.registerTokensProviderFactory(languageId, {\n    create: async () => {\n      const mod = await lazyLanguageLoader.load();\n      return mod.language;\n    }\n  });\n  languages.onLanguageEncountered(languageId, async () => {\n    const mod = await lazyLanguageLoader.load();\n    languages.setLanguageConfiguration(languageId, mod.conf);\n  });\n}\n\nexport { registerLanguage };\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"abap\",\n  extensions: [\".abap\"],\n  aliases: [\"abap\", \"ABAP\"],\n  loader: () => import('./abap.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"apex\",\n  extensions: [\".cls\"],\n  aliases: [\"Apex\", \"apex\"],\n  mimetypes: [\"text/x-apex-source\", \"text/x-apex\"],\n  loader: () => import('./apex.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"azcli\",\n  extensions: [\".azcli\"],\n  aliases: [\"Azure CLI\", \"azcli\"],\n  loader: () => import('./azcli.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"bat\",\n  extensions: [\".bat\", \".cmd\"],\n  aliases: [\"Batch\", \"bat\"],\n  loader: () => import('./bat.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"bicep\",\n  extensions: [\".bicep\"],\n  aliases: [\"Bicep\"],\n  loader: () => import('./bicep.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"cameligo\",\n  extensions: [\".mligo\"],\n  aliases: [\"Cameligo\"],\n  loader: () => import('./cameligo.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"clojure\",\n  extensions: [\".clj\", \".cljs\", \".cljc\", \".edn\"],\n  aliases: [\"clojure\", \"Clojure\"],\n  loader: () => import('./clojure.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"coffeescript\",\n  extensions: [\".coffee\"],\n  aliases: [\"CoffeeScript\", \"coffeescript\", \"coffee\"],\n  mimetypes: [\"text/x-coffeescript\", \"text/coffeescript\"],\n  loader: () => import('./coffee.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"c\",\n  extensions: [\".c\", \".h\"],\n  aliases: [\"C\", \"c\"],\n  loader: () => import('./cpp.js')\n});\nregisterLanguage({\n  id: \"cpp\",\n  extensions: [\".cpp\", \".cc\", \".cxx\", \".hpp\", \".hh\", \".hxx\"],\n  aliases: [\"C++\", \"Cpp\", \"cpp\"],\n  loader: () => import('./cpp.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"csharp\",\n  extensions: [\".cs\", \".csx\", \".cake\"],\n  aliases: [\"C#\", \"csharp\"],\n  loader: () => import('./csharp.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"csp\",\n  extensions: [\".csp\"],\n  aliases: [\"CSP\", \"csp\"],\n  loader: () => import('./csp.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"css\",\n  extensions: [\".css\"],\n  aliases: [\"CSS\", \"css\"],\n  mimetypes: [\"text/css\"],\n  loader: () => import('./css.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"cypher\",\n  extensions: [\".cypher\", \".cyp\"],\n  aliases: [\"Cypher\", \"OpenCypher\"],\n  loader: () => import('./cypher.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"dart\",\n  extensions: [\".dart\"],\n  aliases: [\"Dart\", \"dart\"],\n  mimetypes: [\"text/x-dart-source\", \"text/x-dart\"],\n  loader: () => import('./dart.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"dockerfile\",\n  extensions: [\".dockerfile\"],\n  filenames: [\"Dockerfile\"],\n  aliases: [\"Dockerfile\"],\n  loader: () => import('./dockerfile.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"ecl\",\n  extensions: [\".ecl\"],\n  aliases: [\"ECL\", \"Ecl\", \"ecl\"],\n  loader: () => import('./ecl.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"elixir\",\n  extensions: [\".ex\", \".exs\"],\n  aliases: [\"Elixir\", \"elixir\", \"ex\"],\n  loader: () => import('./elixir.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"flow9\",\n  extensions: [\".flow\"],\n  aliases: [\"Flow9\", \"Flow\", \"flow9\", \"flow\"],\n  loader: () => import('./flow9.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"fsharp\",\n  extensions: [\".fs\", \".fsi\", \".ml\", \".mli\", \".fsx\", \".fsscript\"],\n  aliases: [\"F#\", \"FSharp\", \"fsharp\"],\n  loader: () => import('./fsharp.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"freemarker2\",\n  extensions: [\".ftl\", \".ftlh\", \".ftlx\"],\n  aliases: [\"FreeMarker2\", \"Apache FreeMarker2\"],\n  loader: () => {\n    return import('./freemarker2.js').then((m) => m.TagAutoInterpolationDollar);\n  }\n});\nregisterLanguage({\n  id: \"freemarker2.tag-angle.interpolation-dollar\",\n  aliases: [\"FreeMarker2 (Angle/Dollar)\", \"Apache FreeMarker2 (Angle/Dollar)\"],\n  loader: () => {\n    return import('./freemarker2.js').then((m) => m.TagAngleInterpolationDollar);\n  }\n});\nregisterLanguage({\n  id: \"freemarker2.tag-bracket.interpolation-dollar\",\n  aliases: [\"FreeMarker2 (Bracket/Dollar)\", \"Apache FreeMarker2 (Bracket/Dollar)\"],\n  loader: () => {\n    return import('./freemarker2.js').then((m) => m.TagBracketInterpolationDollar);\n  }\n});\nregisterLanguage({\n  id: \"freemarker2.tag-angle.interpolation-bracket\",\n  aliases: [\"FreeMarker2 (Angle/Bracket)\", \"Apache FreeMarker2 (Angle/Bracket)\"],\n  loader: () => {\n    return import('./freemarker2.js').then((m) => m.TagAngleInterpolationBracket);\n  }\n});\nregisterLanguage({\n  id: \"freemarker2.tag-bracket.interpolation-bracket\",\n  aliases: [\"FreeMarker2 (Bracket/Bracket)\", \"Apache FreeMarker2 (Bracket/Bracket)\"],\n  loader: () => {\n    return import('./freemarker2.js').then((m) => m.TagBracketInterpolationBracket);\n  }\n});\nregisterLanguage({\n  id: \"freemarker2.tag-auto.interpolation-dollar\",\n  aliases: [\"FreeMarker2 (Auto/Dollar)\", \"Apache FreeMarker2 (Auto/Dollar)\"],\n  loader: () => {\n    return import('./freemarker2.js').then((m) => m.TagAutoInterpolationDollar);\n  }\n});\nregisterLanguage({\n  id: \"freemarker2.tag-auto.interpolation-bracket\",\n  aliases: [\"FreeMarker2 (Auto/Bracket)\", \"Apache FreeMarker2 (Auto/Bracket)\"],\n  loader: () => {\n    return import('./freemarker2.js').then((m) => m.TagAutoInterpolationBracket);\n  }\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"go\",\n  extensions: [\".go\"],\n  aliases: [\"Go\"],\n  loader: () => import('./go.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"graphql\",\n  extensions: [\".graphql\", \".gql\"],\n  aliases: [\"GraphQL\", \"graphql\", \"gql\"],\n  mimetypes: [\"application/graphql\"],\n  loader: () => import('./graphql.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"handlebars\",\n  extensions: [\".handlebars\", \".hbs\"],\n  aliases: [\"Handlebars\", \"handlebars\", \"hbs\"],\n  mimetypes: [\"text/x-handlebars-template\"],\n  loader: () => import('./handlebars.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"hcl\",\n  extensions: [\".tf\", \".tfvars\", \".hcl\"],\n  aliases: [\"Terraform\", \"tf\", \"HCL\", \"hcl\"],\n  loader: () => import('./hcl.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"html\",\n  extensions: [\".html\", \".htm\", \".shtml\", \".xhtml\", \".mdoc\", \".jsp\", \".asp\", \".aspx\", \".jshtm\"],\n  aliases: [\"HTML\", \"htm\", \"html\", \"xhtml\"],\n  mimetypes: [\"text/html\", \"text/x-jshtm\", \"text/template\", \"text/ng-template\"],\n  loader: () => import('./html.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"ini\",\n  extensions: [\".ini\", \".properties\", \".gitconfig\"],\n  filenames: [\"config\", \".gitattributes\", \".gitconfig\", \".editorconfig\"],\n  aliases: [\"Ini\", \"ini\"],\n  loader: () => import('./ini.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"java\",\n  extensions: [\".java\", \".jav\"],\n  aliases: [\"Java\", \"java\"],\n  mimetypes: [\"text/x-java-source\", \"text/x-java\"],\n  loader: () => import('./java.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"javascript\",\n  extensions: [\".js\", \".es6\", \".jsx\", \".mjs\", \".cjs\"],\n  firstLine: \"^#!.*\\\\bnode\",\n  filenames: [\"jakefile\"],\n  aliases: [\"JavaScript\", \"javascript\", \"js\"],\n  mimetypes: [\"text/javascript\"],\n  loader: () => import('./javascript.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"julia\",\n  extensions: [\".jl\"],\n  aliases: [\"julia\", \"Julia\"],\n  loader: () => import('./julia.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"kotlin\",\n  extensions: [\".kt\", \".kts\"],\n  aliases: [\"Kotlin\", \"kotlin\"],\n  mimetypes: [\"text/x-kotlin-source\", \"text/x-kotlin\"],\n  loader: () => import('./kotlin.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"less\",\n  extensions: [\".less\"],\n  aliases: [\"Less\", \"less\"],\n  mimetypes: [\"text/x-less\", \"text/less\"],\n  loader: () => import('./less.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"lexon\",\n  extensions: [\".lex\"],\n  aliases: [\"Lexon\"],\n  loader: () => import('./lexon.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"lua\",\n  extensions: [\".lua\"],\n  aliases: [\"Lua\", \"lua\"],\n  loader: () => import('./lua.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"liquid\",\n  extensions: [\".liquid\", \".html.liquid\"],\n  aliases: [\"Liquid\", \"liquid\"],\n  mimetypes: [\"application/liquid\"],\n  loader: () => import('./liquid.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"m3\",\n  extensions: [\".m3\", \".i3\", \".mg\", \".ig\"],\n  aliases: [\"Modula-3\", \"Modula3\", \"modula3\", \"m3\"],\n  loader: () => import('./m3.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"markdown\",\n  extensions: [\".md\", \".markdown\", \".mdown\", \".mkdn\", \".mkd\", \".mdwn\", \".mdtxt\", \".mdtext\"],\n  aliases: [\"Markdown\", \"markdown\"],\n  loader: () => import('./markdown.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"mdx\",\n  extensions: [\".mdx\"],\n  aliases: [\"MDX\", \"mdx\"],\n  loader: () => import('./mdx.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"mips\",\n  extensions: [\".s\"],\n  aliases: [\"MIPS\", \"MIPS-V\"],\n  mimetypes: [\"text/x-mips\", \"text/mips\", \"text/plaintext\"],\n  loader: () => import('./mips.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"msdax\",\n  extensions: [\".dax\", \".msdax\"],\n  aliases: [\"DAX\", \"MSDAX\"],\n  loader: () => import('./msdax.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"mysql\",\n  extensions: [],\n  aliases: [\"MySQL\", \"mysql\"],\n  loader: () => import('./mysql.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"objective-c\",\n  extensions: [\".m\"],\n  aliases: [\"Objective-C\"],\n  loader: () => import('./objective-c.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"pascal\",\n  extensions: [\".pas\", \".p\", \".pp\"],\n  aliases: [\"Pascal\", \"pas\"],\n  mimetypes: [\"text/x-pascal-source\", \"text/x-pascal\"],\n  loader: () => import('./pascal.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"pascaligo\",\n  extensions: [\".ligo\"],\n  aliases: [\"Pascaligo\", \"ligo\"],\n  loader: () => import('./pascaligo.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"perl\",\n  extensions: [\".pl\", \".pm\"],\n  aliases: [\"Perl\", \"pl\"],\n  loader: () => import('./perl.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"pgsql\",\n  extensions: [],\n  aliases: [\"PostgreSQL\", \"postgres\", \"pg\", \"postgre\"],\n  loader: () => import('./pgsql.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"php\",\n  extensions: [\".php\", \".php4\", \".php5\", \".phtml\", \".ctp\"],\n  aliases: [\"PHP\", \"php\"],\n  mimetypes: [\"application/x-php\"],\n  loader: () => import('./php.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"pla\",\n  extensions: [\".pla\"],\n  loader: () => import('./pla.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"postiats\",\n  extensions: [\".dats\", \".sats\", \".hats\"],\n  aliases: [\"ATS\", \"ATS/Postiats\"],\n  loader: () => import('./postiats.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"powerquery\",\n  extensions: [\".pq\", \".pqm\"],\n  aliases: [\"PQ\", \"M\", \"Power Query\", \"Power Query M\"],\n  loader: () => import('./powerquery.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"powershell\",\n  extensions: [\".ps1\", \".psm1\", \".psd1\"],\n  aliases: [\"PowerShell\", \"powershell\", \"ps\", \"ps1\"],\n  loader: () => import('./powershell.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"proto\",\n  extensions: [\".proto\"],\n  aliases: [\"protobuf\", \"Protocol Buffers\"],\n  loader: () => import('./protobuf.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"pug\",\n  extensions: [\".jade\", \".pug\"],\n  aliases: [\"Pug\", \"Jade\", \"jade\"],\n  loader: () => import('./pug.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"python\",\n  extensions: [\".py\", \".rpy\", \".pyw\", \".cpy\", \".gyp\", \".gypi\"],\n  aliases: [\"Python\", \"py\"],\n  firstLine: \"^#!/.*\\\\bpython[0-9.-]*\\\\b\",\n  loader: () => import('./python.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"qsharp\",\n  extensions: [\".qs\"],\n  aliases: [\"Q#\", \"qsharp\"],\n  loader: () => import('./qsharp.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"r\",\n  extensions: [\".r\", \".rhistory\", \".rmd\", \".rprofile\", \".rt\"],\n  aliases: [\"R\", \"r\"],\n  loader: () => import('./r.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"razor\",\n  extensions: [\".cshtml\"],\n  aliases: [\"Razor\", \"razor\"],\n  mimetypes: [\"text/x-cshtml\"],\n  loader: () => import('./razor.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"redis\",\n  extensions: [\".redis\"],\n  aliases: [\"redis\"],\n  loader: () => import('./redis.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"redshift\",\n  extensions: [],\n  aliases: [\"Redshift\", \"redshift\"],\n  loader: () => import('./redshift.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"restructuredtext\",\n  extensions: [\".rst\"],\n  aliases: [\"reStructuredText\", \"restructuredtext\"],\n  loader: () => import('./restructuredtext.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"ruby\",\n  extensions: [\".rb\", \".rbx\", \".rjs\", \".gemspec\", \".pp\"],\n  filenames: [\"rakefile\", \"Gemfile\"],\n  aliases: [\"Ruby\", \"rb\"],\n  loader: () => import('./ruby.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"rust\",\n  extensions: [\".rs\", \".rlib\"],\n  aliases: [\"Rust\", \"rust\"],\n  loader: () => import('./rust.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"sb\",\n  extensions: [\".sb\"],\n  aliases: [\"Small Basic\", \"sb\"],\n  loader: () => import('./sb.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"scala\",\n  extensions: [\".scala\", \".sc\", \".sbt\"],\n  aliases: [\"Scala\", \"scala\", \"SBT\", \"Sbt\", \"sbt\", \"Dotty\", \"dotty\"],\n  mimetypes: [\"text/x-scala-source\", \"text/x-scala\", \"text/x-sbt\", \"text/x-dotty\"],\n  loader: () => import('./scala.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"scheme\",\n  extensions: [\".scm\", \".ss\", \".sch\", \".rkt\"],\n  aliases: [\"scheme\", \"Scheme\"],\n  loader: () => import('./scheme.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"scss\",\n  extensions: [\".scss\"],\n  aliases: [\"Sass\", \"sass\", \"scss\"],\n  mimetypes: [\"text/x-scss\", \"text/scss\"],\n  loader: () => import('./scss.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"shell\",\n  extensions: [\".sh\", \".bash\"],\n  aliases: [\"Shell\", \"sh\"],\n  loader: () => import('./shell.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"sol\",\n  extensions: [\".sol\"],\n  aliases: [\"sol\", \"solidity\", \"Solidity\"],\n  loader: () => import('./solidity.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"aes\",\n  extensions: [\".aes\"],\n  aliases: [\"aes\", \"sophia\", \"Sophia\"],\n  loader: () => import('./sophia.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"sparql\",\n  extensions: [\".rq\"],\n  aliases: [\"sparql\", \"SPARQL\"],\n  loader: () => import('./sparql.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"sql\",\n  extensions: [\".sql\"],\n  aliases: [\"SQL\"],\n  loader: () => import('./sql.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"st\",\n  extensions: [\".st\", \".iecst\", \".iecplc\", \".lc3lib\", \".TcPOU\", \".TcDUT\", \".TcGVL\", \".TcIO\"],\n  aliases: [\"StructuredText\", \"scl\", \"stl\"],\n  loader: () => import('./st.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"swift\",\n  aliases: [\"Swift\", \"swift\"],\n  extensions: [\".swift\"],\n  mimetypes: [\"text/swift\"],\n  loader: () => import('./swift.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"systemverilog\",\n  extensions: [\".sv\", \".svh\"],\n  aliases: [\"SV\", \"sv\", \"SystemVerilog\", \"systemverilog\"],\n  loader: () => import('./systemverilog.js')\n});\nregisterLanguage({\n  id: \"verilog\",\n  extensions: [\".v\", \".vh\"],\n  aliases: [\"V\", \"v\", \"Verilog\", \"verilog\"],\n  loader: () => import('./systemverilog.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"tcl\",\n  extensions: [\".tcl\"],\n  aliases: [\"tcl\", \"Tcl\", \"tcltk\", \"TclTk\", \"tcl/tk\", \"Tcl/Tk\"],\n  loader: () => import('./tcl.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"twig\",\n  extensions: [\".twig\"],\n  aliases: [\"Twig\", \"twig\"],\n  mimetypes: [\"text/x-twig\"],\n  loader: () => import('./twig.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"typescript\",\n  extensions: [\".ts\", \".tsx\", \".cts\", \".mts\"],\n  aliases: [\"TypeScript\", \"ts\", \"typescript\"],\n  mimetypes: [\"text/typescript\"],\n  loader: () => {\n    return import('./typescript.js');\n  }\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"typespec\",\n  extensions: [\".tsp\"],\n  aliases: [\"TypeSpec\"],\n  loader: () => import('./typespec.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"vb\",\n  extensions: [\".vb\"],\n  aliases: [\"Visual Basic\", \"vb\"],\n  loader: () => import('./vb.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"wgsl\",\n  extensions: [\".wgsl\"],\n  aliases: [\"WebGPU Shading Language\", \"WGSL\", \"wgsl\"],\n  loader: () => import('./wgsl.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"xml\",\n  extensions: [\n    \".xml\",\n    \".xsd\",\n    \".dtd\",\n    \".ascx\",\n    \".csproj\",\n    \".config\",\n    \".props\",\n    \".targets\",\n    \".wxi\",\n    \".wxl\",\n    \".wxs\",\n    \".xaml\",\n    \".svg\",\n    \".svgz\",\n    \".opf\",\n    \".xslt\",\n    \".xsl\"\n  ],\n  firstLine: \"(\\\\<\\\\?xml.*)|(\\\\<svg)|(\\\\<\\\\!doctype\\\\s+svg)\",\n  aliases: [\"XML\", \"xml\"],\n  mimetypes: [\"text/xml\", \"application/xml\", \"application/xaml+xml\", \"application/xml-dtd\"],\n  loader: () => import('./xml.js')\n});\n","import { registerLanguage } from '../_.contribution.js';\n\nregisterLanguage({\n  id: \"yaml\",\n  extensions: [\".yaml\", \".yml\"],\n  aliases: [\"YAML\", \"yaml\", \"YML\", \"yml\"],\n  mimetypes: [\"application/x-yaml\", \"text/x-yaml\"],\n  loader: () => import('./yaml.js')\n});\n","import '../../../vs/editor/browser/coreCommands.js';\nimport '../../../vs/editor/browser/widget/codeEditor/codeEditorWidget.js';\nimport '../../../vs/editor/browser/widget/diffEditor/diffEditor.contribution.js';\nimport '../../../vs/editor/contrib/anchorSelect/browser/anchorSelect.js';\nimport '../../../vs/editor/contrib/bracketMatching/browser/bracketMatching.js';\nimport '../../../vs/editor/contrib/caretOperations/browser/caretOperations.js';\nimport '../../../vs/editor/contrib/caretOperations/browser/transpose.js';\nimport '../../../vs/editor/contrib/clipboard/browser/clipboard.js';\nimport '../../../vs/editor/contrib/codeAction/browser/codeActionContributions.js';\nimport '../../../vs/editor/contrib/codelens/browser/codelensController.js';\nimport '../../../vs/editor/contrib/colorPicker/browser/colorPickerContribution.js';\nimport '../../../vs/editor/contrib/comment/browser/comment.js';\nimport '../../../vs/editor/contrib/contextmenu/browser/contextmenu.js';\nimport '../../../vs/editor/contrib/cursorUndo/browser/cursorUndo.js';\nimport '../../../vs/editor/contrib/dnd/browser/dnd.js';\nimport '../../../vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';\nimport '../../../vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';\nimport '../../../vs/editor/contrib/find/browser/findController.js';\nimport '../../../vs/editor/contrib/folding/browser/folding.js';\nimport '../../../vs/editor/contrib/fontZoom/browser/fontZoom.js';\nimport '../../../vs/editor/contrib/format/browser/formatActions.js';\nimport '../../../vs/editor/contrib/documentSymbols/browser/documentSymbols.js';\nimport '../../../vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';\nimport '../../../vs/editor/contrib/inlineProgress/browser/inlineProgress.js';\nimport '../../../vs/editor/contrib/gotoSymbol/browser/goToCommands.js';\nimport '../../../vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';\nimport '../../../vs/editor/contrib/gotoError/browser/gotoError.js';\nimport '../../../vs/editor/contrib/gpu/browser/gpuActions.js';\nimport '../../../vs/editor/contrib/hover/browser/hoverContribution.js';\nimport '../../../vs/editor/contrib/indentation/browser/indentation.js';\nimport '../../../vs/editor/contrib/inlayHints/browser/inlayHintsContribution.js';\nimport '../../../vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';\nimport '../../../vs/editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';\nimport '../../../vs/editor/contrib/lineSelection/browser/lineSelection.js';\nimport '../../../vs/editor/contrib/linesOperations/browser/linesOperations.js';\nimport '../../../vs/editor/contrib/linkedEditing/browser/linkedEditing.js';\nimport '../../../vs/editor/contrib/links/browser/links.js';\nimport '../../../vs/editor/contrib/longLinesHelper/browser/longLinesHelper.js';\nimport '../../../vs/editor/contrib/middleScroll/browser/middleScroll.contribution.js';\nimport '../../../vs/editor/contrib/multicursor/browser/multicursor.js';\nimport '../../../vs/editor/contrib/parameterHints/browser/parameterHints.js';\nimport '../../../vs/editor/contrib/placeholderText/browser/placeholderText.contribution.js';\nimport '../../../vs/editor/contrib/rename/browser/rename.js';\nimport '../../../vs/editor/contrib/sectionHeaders/browser/sectionHeaders.js';\nimport '../../../vs/editor/contrib/semanticTokens/browser/documentSemanticTokens.js';\nimport '../../../vs/editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';\nimport '../../../vs/editor/contrib/smartSelect/browser/smartSelect.js';\nimport '../../../vs/editor/contrib/snippet/browser/snippetController2.js';\nimport '../../../vs/editor/contrib/stickyScroll/browser/stickyScrollContribution.js';\nimport '../../../vs/editor/contrib/suggest/browser/suggestController.js';\nimport '../../../vs/editor/contrib/suggest/browser/suggestInlineCompletions.js';\nimport '../../../vs/editor/contrib/tokenization/browser/tokenization.js';\nimport '../../../vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';\nimport '../../../vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';\nimport '../../../vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';\nimport '../../../vs/editor/contrib/wordHighlighter/browser/wordHighlighter.js';\nimport '../../../vs/editor/contrib/wordOperations/browser/wordOperations.js';\nimport '../../../vs/editor/contrib/wordPartOperations/browser/wordPartOperations.js';\nimport '../../../vs/editor/contrib/readOnlyMessage/browser/contribution.js';\nimport '../../../vs/editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';\nimport '../../../vs/editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';\nimport '../../../vs/editor/common/standaloneStrings.js';\nimport '../../../vs/base/browser/ui/codicons/codicon/codicon.css';\nimport '../../../vs/base/browser/ui/codicons/codicon/codicon-modifiers.css';\nimport '../../../vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';\nimport '../../../vs/editor/standalone/browser/inspectTokens/inspectTokens.js';\nimport '../../../vs/editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';\nimport '../../../vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';\nimport '../../../vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';\nimport '../../../vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';\nimport '../../../vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';\nimport '../../../vs/editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';\nimport { languages, MarkerSeverity, MarkerTag, editor, Position, Range, Emitter, Uri } from '../../../vs/editor/editor.api2.js';\n\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nvar _a, _b, _c, _d, _e;\nfunction isRequestOrNotification(msg) {\n  return msg.method !== void 0;\n}\nvar ErrorObject;\n(function(ErrorObject$1) {\n  function create(obj) {\n    return obj;\n  }\n  ErrorObject$1.create = create;\n})(ErrorObject || (ErrorObject = {}));\nvar ErrorCode;\n(function(ErrorCode$1) {\n  ErrorCode$1.parseError = -32700;\n  ErrorCode$1.invalidRequest = -32600;\n  ErrorCode$1.methodNotFound = -32601;\n  ErrorCode$1.invalidParams = -32602;\n  ErrorCode$1.internalError = -32603;\n  function isServerError(code) {\n    return -32099 <= code && code <= -32e3;\n  }\n  ErrorCode$1.isServerError = isServerError;\n  function serverError(code) {\n    if (!isServerError(code)) throw new Error(\"Invalid range for a server error.\");\n    return code;\n  }\n  ErrorCode$1.serverError = serverError;\n  ErrorCode$1.unexpectedServerError = -32e3;\n  function isApplicationError(code) {\n    return true;\n  }\n  ErrorCode$1.isApplicationError = isApplicationError;\n  function applicationError(code) {\n    return code;\n  }\n  ErrorCode$1.applicationError = applicationError;\n  ErrorCode$1.genericApplicationError = -320100;\n})(ErrorCode || (ErrorCode = {}));\nvar EventEmitter = class {\n  constructor() {\n    __publicField(this, \"listeners\", /* @__PURE__ */ new Set());\n    __publicField(this, \"event\", (listener) => {\n      this.listeners.add(listener);\n      return { dispose: () => {\n        this.listeners.delete(listener);\n      } };\n    });\n  }\n  fire(args) {\n    this.listeners.forEach((listener) => listener(args));\n  }\n};\nvar ValueWithChangeEvent = class {\n  constructor(initialValue) {\n    __publicField(this, \"_value\");\n    __publicField(this, \"eventEmitter\");\n    this._value = initialValue;\n    this.eventEmitter = new EventEmitter();\n  }\n  get value() {\n    return this._value;\n  }\n  set value(newValue) {\n    if (this._value !== newValue) {\n      this._value = newValue;\n      this.eventEmitter.fire(newValue);\n    }\n  }\n  get onChange() {\n    return this.eventEmitter.event;\n  }\n};\nfunction createTimeout(delay, callback) {\n  const handle = setTimeout(callback, delay);\n  return { dispose: () => clearTimeout(handle) };\n}\nfunction setAndDeleteOnDispose(set, keyOrItem, item) {\n  if (set instanceof Set) {\n    set.add(keyOrItem);\n    return { dispose: () => set.delete(keyOrItem) };\n  } else {\n    set.set(keyOrItem, item);\n    return { dispose: () => set.delete(keyOrItem) };\n  }\n}\nvar Deferred = class {\n  constructor() {\n    __publicField(this, \"_state\", \"none\");\n    __publicField(this, \"promise\");\n    __publicField(this, \"resolve\", () => {\n    });\n    __publicField(this, \"reject\", () => {\n    });\n    this.promise = new Promise((resolve, reject) => {\n      this.resolve = resolve;\n      this.reject = reject;\n    });\n  }\n  get state() {\n    return this._state;\n  }\n};\nvar BaseMessageTransport = (_a = class {\n  constructor() {\n    __publicField(this, \"_unprocessedMessages\", []);\n    __publicField(this, \"_messageListener\");\n    __publicField(this, \"id\", _a.id++);\n    __publicField(this, \"_state\", new ValueWithChangeEvent({ state: \"open\" }));\n    __publicField(this, \"state\", this._state);\n  }\n  /**\n  * Sets a callback for incoming messages.\n  */\n  setListener(listener) {\n    this._messageListener = listener;\n    if (!listener) return;\n    while (this._unprocessedMessages.length > 0 && this._messageListener !== void 0) {\n      const msg = this._unprocessedMessages.shift();\n      this._messageListener(msg);\n    }\n  }\n  /**\n  * Writes a message to the stream.\n  */\n  send(message) {\n    return this._sendImpl(message);\n  }\n  /**\n  * Call this in derived classes to signal a new message.\n  */\n  _dispatchReceivedMessage(message) {\n    if (this._unprocessedMessages.length === 0 && this._messageListener) this._messageListener(message);\n    else this._unprocessedMessages.push(message);\n  }\n  /**\n  * Call this in derived classes to signal that the connection closed.\n  */\n  _onConnectionClosed() {\n    this._state.value = {\n      state: \"closed\",\n      error: void 0\n    };\n  }\n  log(logger) {\n    return new StreamLogger(this, logger ?? new ConsoleMessageLogger());\n  }\n}, __publicField(_a, \"id\", 0), _a);\nvar StreamLogger = class {\n  constructor(baseStream, logger) {\n    __publicField(this, \"baseStream\");\n    __publicField(this, \"logger\");\n    this.baseStream = baseStream;\n    this.logger = logger;\n  }\n  get state() {\n    return this.baseStream.state;\n  }\n  setListener(listener) {\n    if (listener === void 0) {\n      this.baseStream.setListener(void 0);\n      return;\n    }\n    this.baseStream.setListener((readMessage) => {\n      this.logger.log(this.baseStream, \"incoming\", readMessage);\n      listener(readMessage);\n    });\n  }\n  send(message) {\n    this.logger.log(this.baseStream, \"outgoing\", message);\n    return this.baseStream.send(message);\n  }\n  toString() {\n    return `StreamLogger/${this.baseStream.toString()}`;\n  }\n};\nvar ConsoleMessageLogger = class {\n  log(stream, type, message) {\n    const char = type === \"incoming\" ? \"<-\" : \"->\";\n    console.log(`${char} [${stream.toString()}] ${JSON.stringify(message)}`);\n  }\n};\nvar Channel = class Channel2 {\n  constructor(connect) {\n    __publicField(this, \"connect\");\n    this.connect = connect;\n  }\n  mapContext(map) {\n    return new Channel2((listener) => this.connect(listener ? mapRequestHandlerContext(listener, map) : void 0));\n  }\n};\nfunction mapRequestHandlerContext(messageHandler, map) {\n  return {\n    handleNotification: (request, context) => messageHandler.handleNotification(request, map(context)),\n    handleRequest: (request, requestId, context) => messageHandler.handleRequest(request, requestId, map(context))\n  };\n}\nvar StreamBasedChannel = class StreamBasedChannel2 {\n  constructor(_stream, _listener, _logger) {\n    __publicField(this, \"_stream\");\n    __publicField(this, \"_listener\");\n    __publicField(this, \"_logger\");\n    __publicField(this, \"_unprocessedResponses\", /* @__PURE__ */ new Map());\n    __publicField(this, \"_lastUsedRequestId\", 0);\n    this._stream = _stream;\n    this._listener = _listener;\n    this._logger = _logger;\n    this._stream.setListener((message) => {\n      if (isRequestOrNotification(message)) if (message.id === void 0) this._processNotification(message);\n      else this._processRequest(message);\n      else this._processResponse(message);\n    });\n  }\n  /**\n  * Creates a channel factory from a given stream and logger.\n  * This allows to delay specifying a `RequestHandler`.\n  * Once the channel is created, it processes incoming messages.\n  */\n  static createChannel(stream, logger) {\n    let constructed = false;\n    return new Channel((listener) => {\n      if (constructed) throw new Error(`A channel to the stream ${stream} was already constructed!`);\n      else constructed = true;\n      return new StreamBasedChannel2(stream, listener, logger);\n    });\n  }\n  get state() {\n    return this._stream.state;\n  }\n  async _processNotification(message) {\n    if (message.id !== void 0) throw new Error();\n    if (!this._listener) {\n      if (this._logger) this._logger.debug({\n        text: \"Notification ignored\",\n        message\n      });\n      return;\n    }\n    try {\n      await this._listener.handleNotification({\n        method: message.method,\n        params: message.params || null\n      });\n    } catch (exception) {\n      if (this._logger) this._logger.warn({\n        text: `Exception was thrown while handling notification: ${exception}`,\n        exception,\n        message\n      });\n    }\n  }\n  async _processRequest(message) {\n    if (message.id === void 0) throw new Error();\n    let result;\n    if (this._listener) try {\n      result = await this._listener.handleRequest({\n        method: message.method,\n        params: message.params || null\n      }, message.id);\n    } catch (exception) {\n      if (this._logger) this._logger.warn({\n        text: `Exception was thrown while handling request: ${exception}`,\n        message,\n        exception\n      });\n      result = { error: {\n        code: ErrorCode.internalError,\n        message: \"An unexpected exception was thrown.\",\n        data: void 0\n      } };\n    }\n    else {\n      if (this._logger) this._logger.debug({\n        text: \"Received request even though not listening for requests\",\n        message\n      });\n      result = { error: {\n        code: ErrorCode.methodNotFound,\n        message: \"This endpoint does not listen for requests or notifications.\",\n        data: void 0\n      } };\n    }\n    let responseMsg;\n    if (\"result\" in result) responseMsg = {\n      jsonrpc: \"2.0\",\n      id: message.id,\n      result: result.result\n    };\n    else responseMsg = {\n      jsonrpc: \"2.0\",\n      id: message.id,\n      error: result.error\n    };\n    await this._stream.send(responseMsg);\n  }\n  _processResponse(message) {\n    const strId = \"\" + message.id;\n    const callback = this._unprocessedResponses.get(strId);\n    if (!callback) {\n      if (this._logger) this._logger.debug({\n        text: \"Got an unexpected response message\",\n        message\n      });\n      return;\n    }\n    this._unprocessedResponses.delete(strId);\n    callback(message);\n  }\n  _newRequestId() {\n    return this._lastUsedRequestId++;\n  }\n  sendRequest(request, _context, messageIdCallback) {\n    const message = {\n      jsonrpc: \"2.0\",\n      id: this._newRequestId(),\n      method: request.method,\n      params: request.params || void 0\n    };\n    if (messageIdCallback) messageIdCallback(message.id);\n    return new Promise((resolve, reject) => {\n      const strId = \"\" + message.id;\n      this._unprocessedResponses.set(strId, (response) => {\n        if (\"result\" in response) resolve({ result: response.result });\n        else {\n          if (!response.error) reject(/* @__PURE__ */ new Error(\"Response had neither 'result' nor 'error' field set.\"));\n          resolve({ error: response.error });\n        }\n      });\n      this._stream.send(message).then(void 0, (reason) => {\n        this._unprocessedResponses.delete(strId);\n        reject(reason);\n      });\n    });\n  }\n  sendNotification(notification, context) {\n    const msg = {\n      jsonrpc: \"2.0\",\n      id: void 0,\n      method: notification.method,\n      params: notification.params || void 0\n    };\n    return this._stream.send(msg);\n  }\n  toString() {\n    return \"StreamChannel/\" + this._stream.toString();\n  }\n};\nvar Serializers;\n(function(Serializers$1) {\n  function sAny() {\n    return {\n      deserializeFromJson: (input) => ({\n        hasErrors: false,\n        value: input\n      }),\n      serializeToJson: (input) => input\n    };\n  }\n  Serializers$1.sAny = sAny;\n  function sEmptyObject() {\n    return {\n      deserializeFromJson: (input) => ({\n        hasErrors: false,\n        value: {}\n      }),\n      serializeToJson: (input) => ({})\n    };\n  }\n  Serializers$1.sEmptyObject = sEmptyObject;\n  function sVoidFromNull() {\n    return {\n      deserializeFromJson: (input) => ({\n        hasErrors: false,\n        value: void 0\n      }),\n      serializeToJson: (input) => null\n    };\n  }\n  Serializers$1.sVoidFromNull = sVoidFromNull;\n})(Serializers || (Serializers = {}));\nconst OptionalMethodNotFound = Symbol(\"OptionalMethodNotFound\");\nvar TypedChannelBase = class {\n  contextualize(args) {\n    return new ContextualizedTypedChannel(this, args);\n  }\n};\nvar ContextualizedTypedChannel = class extends TypedChannelBase {\n  constructor(underylingTypedChannel, converters) {\n    super();\n    __publicField(this, \"underylingTypedChannel\");\n    __publicField(this, \"converters\");\n    this.underylingTypedChannel = underylingTypedChannel;\n    this.converters = converters;\n  }\n  async request(requestType, args, newContext) {\n    const context = await this.converters.getSendContext(newContext);\n    return this.underylingTypedChannel.request(requestType, args, context);\n  }\n  async notify(notificationType, params, newContext) {\n    const context = await this.converters.getSendContext(newContext);\n    return this.underylingTypedChannel.notify(notificationType, params, context);\n  }\n  registerNotificationHandler(type, handler) {\n    return this.underylingTypedChannel.registerNotificationHandler(type, async (arg, context) => {\n      return await handler(arg, await this.converters.getNewContext(context));\n    });\n  }\n  registerRequestHandler(requestType, handler) {\n    return this.underylingTypedChannel.registerRequestHandler(requestType, async (arg, requestId, context) => {\n      return await handler(arg, requestId, await this.converters.getNewContext(context));\n    });\n  }\n};\nvar TypedChannel = class TypedChannel2 extends TypedChannelBase {\n  constructor(channelCtor, options = {}) {\n    super();\n    __publicField(this, \"channelCtor\");\n    __publicField(this, \"_requestSender\");\n    __publicField(this, \"_handler\", /* @__PURE__ */ new Map());\n    __publicField(this, \"_unknownNotificationHandler\", /* @__PURE__ */ new Set());\n    __publicField(this, \"_timeout\");\n    __publicField(this, \"sendExceptionDetails\", false);\n    __publicField(this, \"_logger\");\n    __publicField(this, \"listeningDeferred\", new Deferred());\n    __publicField(this, \"onListening\", this.listeningDeferred.promise);\n    __publicField(this, \"_requestDidErrorEventEmitter\", new EventEmitter());\n    __publicField(this, \"onRequestDidError\", this._requestDidErrorEventEmitter.event);\n    this.channelCtor = channelCtor;\n    this._logger = options.logger;\n    this.sendExceptionDetails = !!options.sendExceptionDetails;\n    this._timeout = createTimeout(1e3, () => {\n      if (!this._requestSender) console.warn(`\"${this.startListen.name}\" has not been called within 1 second after construction of this channel. Did you forget to call it?`, this);\n    });\n  }\n  static fromTransport(stream, options = {}) {\n    return new TypedChannel2(StreamBasedChannel.createChannel(stream, options.logger), options);\n  }\n  /**\n  * This method must be called to forward messages from the stream to this channel.\n  * This is not done automatically on construction so that this instance\n  * can be setup properly before handling messages.\n  */\n  startListen() {\n    if (this._requestSender) throw new Error(`\"${this.startListen.name}\" can be called only once, but it already has been called.`);\n    if (this._timeout) {\n      this._timeout.dispose();\n      this._timeout = void 0;\n    }\n    this._requestSender = this.channelCtor.connect({\n      handleRequest: (req, id, context) => this.handleRequest(req, id, context),\n      handleNotification: (req, context) => this.handleNotification(req, context)\n    });\n    this.listeningDeferred.resolve();\n  }\n  checkChannel(channel) {\n    if (!channel) throw new Error(`\"${this.startListen.name}\" must be called before any messages can be sent or received.`);\n    return true;\n  }\n  async handleRequest(request, requestId, context) {\n    const handler = this._handler.get(request.method);\n    if (!handler) {\n      if (this._logger) this._logger.debug({\n        text: `No request handler for \"${request.method}\".`,\n        data: { requestObject: request }\n      });\n      return { error: {\n        code: ErrorCode.methodNotFound,\n        message: `No request handler for \"${request.method}\".`,\n        data: { method: request.method }\n      } };\n    }\n    if (handler.kind != \"request\") {\n      const message = `\"${request.method}\" is registered as notification, but was sent as request.`;\n      if (this._logger) this._logger.debug({\n        text: message,\n        data: { requestObject: request }\n      });\n      return { error: {\n        code: ErrorCode.invalidRequest,\n        message,\n        data: { method: request.method }\n      } };\n    }\n    const decodeResult = handler.requestType.paramsSerializer.deserializeFromJson(request.params);\n    if (decodeResult.hasErrors) {\n      const message = `Got invalid params: ${decodeResult.errorMessage}`;\n      if (this._logger) this._logger.debug({\n        text: message,\n        data: {\n          requestObject: request,\n          errorMessage: decodeResult.errorMessage\n        }\n      });\n      return { error: {\n        code: ErrorCode.invalidParams,\n        message,\n        data: { errors: decodeResult.errorMessage }\n      } };\n    } else {\n      const args = decodeResult.value;\n      let response;\n      try {\n        const result = await handler.handler(args, requestId, context);\n        if (\"error\" in result || \"errorMessage\" in result) {\n          const errorData = result.error ? handler.requestType.errorSerializer.serializeToJson(result.error) : void 0;\n          response = { error: {\n            code: result.errorCode || ErrorCode.genericApplicationError,\n            message: result.errorMessage || \"An error was returned\",\n            data: errorData\n          } };\n        } else response = { result: handler.requestType.resultSerializer.serializeToJson(result.ok) };\n      } catch (exception) {\n        if (exception instanceof RequestHandlingError) response = { error: {\n          code: exception.code,\n          message: exception.message\n        } };\n        else {\n          if (this._logger) this._logger.warn({\n            text: `An exception was thrown while handling a request: ${exception}.`,\n            exception,\n            data: { requestObject: request }\n          });\n          response = { error: {\n            code: ErrorCode.unexpectedServerError,\n            message: this.sendExceptionDetails ? `An exception was thrown while handling a request: ${exception}.` : \"Server has thrown an unexpected exception\"\n          } };\n        }\n      }\n      return response;\n    }\n  }\n  async handleNotification(request, context) {\n    const handler = this._handler.get(request.method);\n    if (!handler) {\n      for (const h of this._unknownNotificationHandler) h(request);\n      if (this._unknownNotificationHandler.size === 0) {\n        if (this._logger) this._logger.debug({\n          text: `Unhandled notification \"${request.method}\"`,\n          data: { requestObject: request }\n        });\n      }\n      return;\n    }\n    if (handler.kind != \"notification\") {\n      if (this._logger) this._logger.debug({\n        text: `\"${request.method}\" is registered as request, but was sent as notification.`,\n        data: { requestObject: request }\n      });\n      return;\n    }\n    const decodeResult = handler.notificationType.paramsSerializer.deserializeFromJson(request.params);\n    if (decodeResult.hasErrors) {\n      if (this._logger) this._logger.debug({\n        text: `Got invalid params: ${decodeResult}`,\n        data: {\n          requestObject: request,\n          errorMessage: decodeResult.errorMessage\n        }\n      });\n      return;\n    }\n    const val = decodeResult.value;\n    for (const handlerFunc of handler.handlers) try {\n      handlerFunc(val, context);\n    } catch (exception) {\n      if (this._logger) this._logger.warn({\n        text: `An exception was thrown while handling a notification: ${exception}.`,\n        exception,\n        data: { requestObject: request }\n      });\n    }\n  }\n  registerUnknownNotificationHandler(handler) {\n    return setAndDeleteOnDispose(this._unknownNotificationHandler, handler);\n  }\n  registerRequestHandler(requestType, handler) {\n    if (this._handler.get(requestType.method)) throw new Error(`Handler with method \"${requestType.method}\" already registered.`);\n    return setAndDeleteOnDispose(this._handler, requestType.method, {\n      kind: \"request\",\n      requestType,\n      handler\n    });\n  }\n  registerNotificationHandler(type, handler) {\n    let registeredHandler = this._handler.get(type.method);\n    if (!registeredHandler) {\n      registeredHandler = {\n        kind: \"notification\",\n        notificationType: type,\n        handlers: /* @__PURE__ */ new Set()\n      };\n      this._handler.set(type.method, registeredHandler);\n    } else {\n      if (registeredHandler.kind !== \"notification\") throw new Error(`Method \"${type.method}\" was already registered as request handler.`);\n      if (registeredHandler.notificationType !== type) throw new Error(`Method \"${type.method}\" was registered for a different type.`);\n    }\n    return setAndDeleteOnDispose(registeredHandler.handlers, handler);\n  }\n  getRegisteredTypes() {\n    const result = [];\n    for (const h of this._handler.values()) if (h.kind === \"notification\") result.push(h.notificationType);\n    else if (h.kind === \"request\") result.push(h.requestType);\n    return result;\n  }\n  async request(requestType, args, context) {\n    if (!this.checkChannel(this._requestSender)) throw new Error(\"Impossible\");\n    const params = requestType.paramsSerializer.serializeToJson(args);\n    assertObjectArrayOrNull(params);\n    const response = await this._requestSender.sendRequest({\n      method: requestType.method,\n      params\n    }, context);\n    if (\"error\" in response) {\n      if (requestType.isOptional && response.error.code === ErrorCode.methodNotFound) return OptionalMethodNotFound;\n      let errorData;\n      if (response.error.data !== void 0) {\n        const deserializationResult = requestType.errorSerializer.deserializeFromJson(response.error.data);\n        if (deserializationResult.hasErrors) throw new Error(deserializationResult.errorMessage);\n        errorData = deserializationResult.value;\n      } else errorData = void 0;\n      const error = new RequestHandlingError(response.error.message, errorData, response.error.code);\n      this._requestDidErrorEventEmitter.fire({ error });\n      throw error;\n    } else {\n      const result = requestType.resultSerializer.deserializeFromJson(response.result);\n      if (result.hasErrors) throw new Error(\"Could not deserialize response: \" + result.errorMessage + `\n\n${JSON.stringify(response, null, 2)}`);\n      else return result.value;\n    }\n  }\n  async notify(notificationType, params, context) {\n    if (!this.checkChannel(this._requestSender)) throw new Error();\n    const encodedParams = notificationType.paramsSerializer.serializeToJson(params);\n    assertObjectArrayOrNull(encodedParams);\n    this._requestSender.sendNotification({\n      method: notificationType.method,\n      params: encodedParams\n    }, context);\n  }\n};\nfunction assertObjectArrayOrNull(val) {\n  if (val !== null && Array.isArray(val) && typeof val !== \"object\") throw new Error(\"Invalid value! Only null, array and object is allowed.\");\n}\nvar RequestHandlingError = class RequestHandlingError2 extends Error {\n  constructor(message, data, code = ErrorCode.genericApplicationError) {\n    super(message);\n    __publicField(this, \"data\");\n    __publicField(this, \"code\");\n    this.data = data;\n    this.code = code;\n    Object.setPrototypeOf(this, RequestHandlingError2.prototype);\n  }\n};\nvar RequestType = class RequestType2 {\n  constructor(method, paramsSerializer, resultSerializer, errorSerializer, isOptional = false) {\n    __publicField(this, \"method\");\n    __publicField(this, \"paramsSerializer\");\n    __publicField(this, \"resultSerializer\");\n    __publicField(this, \"errorSerializer\");\n    __publicField(this, \"isOptional\");\n    __publicField(this, \"kind\", \"request\");\n    this.method = method;\n    this.paramsSerializer = paramsSerializer;\n    this.resultSerializer = resultSerializer;\n    this.errorSerializer = errorSerializer;\n    this.isOptional = isOptional;\n  }\n  withMethod(method) {\n    return new RequestType2(method, this.paramsSerializer, this.resultSerializer, this.errorSerializer);\n  }\n  optional() {\n    return new RequestType2(this.method, this.paramsSerializer, this.resultSerializer, this.errorSerializer, true);\n  }\n};\nvar NotificationType = class NotificationType2 {\n  constructor(method, paramsSerializer) {\n    __publicField(this, \"method\");\n    __publicField(this, \"paramsSerializer\");\n    __publicField(this, \"kind\", \"notification\");\n    this.method = method;\n    this.paramsSerializer = paramsSerializer;\n  }\n  withMethod(method) {\n    return new NotificationType2(method, this.paramsSerializer);\n  }\n};\nfunction unverifiedRequest(request) {\n  return new RequestType((request || {}).method, Serializers.sAny(), Serializers.sAny(), Serializers.sAny());\n}\nfunction unverifiedNotification(request) {\n  return new NotificationType((request || {}).method, Serializers.sAny());\n}\nconst IsErrorWrapper = Symbol();\nvar ErrorWrapper = (_b = IsErrorWrapper, _c = class {\n  constructor(error) {\n    __publicField(this, \"error\");\n    __publicField(this, _b);\n    this.error = error;\n  }\n}, __publicField(_c, \"factory\", (error) => {\n  return new _c(error);\n}), _c);\nfunction contract(contractObj) {\n  const server = transform(contractObj[\"server\"]);\n  const client = transform(contractObj[\"client\"]);\n  return new Contract(contractObj.tags || [], server, client);\n}\nfunction transform(requestMap) {\n  const result = {};\n  for (const [key, req] of Object.entries(requestMap)) {\n    const method = req.method ? req.method : key;\n    result[key] = req.withMethod(method);\n  }\n  return result;\n}\nvar Contract = class Contract2 {\n  constructor(tags = [], server, client) {\n    __publicField(this, \"tags\");\n    __publicField(this, \"server\");\n    __publicField(this, \"client\");\n    this.tags = tags;\n    this.server = server;\n    this.client = client;\n  }\n  _onlyDesignTime() {\n    return /* @__PURE__ */ new Error(\"This property is not meant to be accessed at runtime\");\n  }\n  get TContractObject() {\n    throw this._onlyDesignTime();\n  }\n  get TClientInterface() {\n    throw this._onlyDesignTime();\n  }\n  get TServerInterface() {\n    throw this._onlyDesignTime();\n  }\n  get TClientHandler() {\n    throw this._onlyDesignTime();\n  }\n  get TServerHandler() {\n    throw this._onlyDesignTime();\n  }\n  get TTags() {\n    throw this._onlyDesignTime();\n  }\n  getInterface(typedChannel, myContract, otherContract, myInterface) {\n    const counterpart = this.buildCounterpart(typedChannel, otherContract);\n    const disposable = this.registerHandlers(typedChannel, myContract, myInterface, counterpart);\n    return {\n      counterpart,\n      dispose: () => disposable.dispose()\n    };\n  }\n  buildCounterpart(typedChannel, otherContract) {\n    const counterpart = {};\n    for (const [key, req] of Object.entries(otherContract)) {\n      let method;\n      if (req.kind === \"request\") if (req.isOptional) method = async (args, context) => {\n        if (args === void 0) args = {};\n        try {\n          return await typedChannel.request(req, args, context);\n        } catch (error) {\n          if (error && error.code === ErrorCode.methodNotFound) return OptionalMethodNotFound;\n          throw error;\n        }\n      };\n      else method = (args, context) => {\n        if (args === void 0) args = {};\n        return typedChannel.request(req, args, context);\n      };\n      else method = (args, context) => {\n        if (args === void 0) args = {};\n        return typedChannel.notify(req, args, context);\n      };\n      counterpart[key] = method;\n    }\n    return counterpart;\n  }\n  registerHandlers(typedChannel, myContract, myInterface, counterpart) {\n    const disposables = [];\n    for (const [key, req] of Object.entries(myContract)) if (req.kind === \"request\") {\n      let method = myInterface[key];\n      if (!method) continue;\n      const handler = this.createRequestHandler(counterpart, method);\n      disposables.push(typedChannel.registerRequestHandler(req, handler));\n    } else {\n      const method = myInterface[key];\n      if (method) disposables.push(typedChannel.registerNotificationHandler(req, (args, context) => {\n        method(args, {\n          context,\n          counterpart\n        });\n      }));\n    }\n    return { dispose: () => disposables.forEach((d) => d.dispose()) };\n  }\n  createRequestHandler(counterpart, method) {\n    return async (args, requestId, listenerContext) => {\n      const result = await method(args, {\n        context: listenerContext,\n        counterpart,\n        newErr: ErrorWrapper.factory,\n        requestId\n      });\n      if (result instanceof ErrorWrapper) return result.error;\n      return { ok: result };\n    };\n  }\n  /**\n  * Gets a server object directly from a stream by constructing a new `TypedChannel`.\n  * It also registers the client implementation to the stream.\n  * The channel starts listening immediately.\n  */\n  static getServerFromStream(contract$1, stream, options, clientImplementation) {\n    const channel = TypedChannel.fromTransport(stream, options);\n    const { server } = contract$1.getServer(channel, clientImplementation);\n    channel.startListen();\n    return {\n      channel,\n      server\n    };\n  }\n  /**\n  * Gets a client object directly from a stream by constructing a new `TypedChannel`.\n  * It also registers the server implementation to the stream.\n  * The channel starts listening immediately.\n  */\n  static registerServerToStream(contract$1, stream, options, serverImplementation) {\n    const channel = TypedChannel.fromTransport(stream, options);\n    const { client } = contract$1.registerServer(channel, serverImplementation);\n    channel.startListen();\n    return {\n      channel,\n      client\n    };\n  }\n  getServer(typedChannel, clientImplementation) {\n    const { counterpart, dispose } = this.getInterface(typedChannel, this.client, this.server, clientImplementation);\n    return {\n      server: counterpart,\n      dispose\n    };\n  }\n  registerServer(typedChannel, serverImplementation) {\n    const { counterpart, dispose } = this.getInterface(typedChannel, this.server, this.client, serverImplementation);\n    return {\n      client: counterpart,\n      dispose\n    };\n  }\n  withContext() {\n    return new Contract2(this.tags, this.server, this.client);\n  }\n};\nlet FoldingRangeKind = /* @__PURE__ */ (function(FoldingRangeKind$1) {\n  FoldingRangeKind$1[\"Comment\"] = \"comment\";\n  FoldingRangeKind$1[\"Imports\"] = \"imports\";\n  FoldingRangeKind$1[\"Region\"] = \"region\";\n  return FoldingRangeKind$1;\n})({});\nlet SymbolKind = /* @__PURE__ */ (function(SymbolKind$1) {\n  SymbolKind$1[SymbolKind$1[\"File\"] = 1] = \"File\";\n  SymbolKind$1[SymbolKind$1[\"Module\"] = 2] = \"Module\";\n  SymbolKind$1[SymbolKind$1[\"Namespace\"] = 3] = \"Namespace\";\n  SymbolKind$1[SymbolKind$1[\"Package\"] = 4] = \"Package\";\n  SymbolKind$1[SymbolKind$1[\"Class\"] = 5] = \"Class\";\n  SymbolKind$1[SymbolKind$1[\"Method\"] = 6] = \"Method\";\n  SymbolKind$1[SymbolKind$1[\"Property\"] = 7] = \"Property\";\n  SymbolKind$1[SymbolKind$1[\"Field\"] = 8] = \"Field\";\n  SymbolKind$1[SymbolKind$1[\"Constructor\"] = 9] = \"Constructor\";\n  SymbolKind$1[SymbolKind$1[\"Enum\"] = 10] = \"Enum\";\n  SymbolKind$1[SymbolKind$1[\"Interface\"] = 11] = \"Interface\";\n  SymbolKind$1[SymbolKind$1[\"Function\"] = 12] = \"Function\";\n  SymbolKind$1[SymbolKind$1[\"Variable\"] = 13] = \"Variable\";\n  SymbolKind$1[SymbolKind$1[\"Constant\"] = 14] = \"Constant\";\n  SymbolKind$1[SymbolKind$1[\"String\"] = 15] = \"String\";\n  SymbolKind$1[SymbolKind$1[\"Number\"] = 16] = \"Number\";\n  SymbolKind$1[SymbolKind$1[\"Boolean\"] = 17] = \"Boolean\";\n  SymbolKind$1[SymbolKind$1[\"Array\"] = 18] = \"Array\";\n  SymbolKind$1[SymbolKind$1[\"Object\"] = 19] = \"Object\";\n  SymbolKind$1[SymbolKind$1[\"Key\"] = 20] = \"Key\";\n  SymbolKind$1[SymbolKind$1[\"Null\"] = 21] = \"Null\";\n  SymbolKind$1[SymbolKind$1[\"EnumMember\"] = 22] = \"EnumMember\";\n  SymbolKind$1[SymbolKind$1[\"Struct\"] = 23] = \"Struct\";\n  SymbolKind$1[SymbolKind$1[\"Event\"] = 24] = \"Event\";\n  SymbolKind$1[SymbolKind$1[\"Operator\"] = 25] = \"Operator\";\n  SymbolKind$1[SymbolKind$1[\"TypeParameter\"] = 26] = \"TypeParameter\";\n  return SymbolKind$1;\n})({});\nlet SymbolTag = /* @__PURE__ */ (function(SymbolTag$1) {\n  SymbolTag$1[SymbolTag$1[\"Deprecated\"] = 1] = \"Deprecated\";\n  return SymbolTag$1;\n})({});\nlet InlayHintKind = /* @__PURE__ */ (function(InlayHintKind$1) {\n  InlayHintKind$1[InlayHintKind$1[\"Type\"] = 1] = \"Type\";\n  InlayHintKind$1[InlayHintKind$1[\"Parameter\"] = 2] = \"Parameter\";\n  return InlayHintKind$1;\n})({});\nlet TextDocumentSyncKind = /* @__PURE__ */ (function(TextDocumentSyncKind$1) {\n  TextDocumentSyncKind$1[TextDocumentSyncKind$1[\"None\"] = 0] = \"None\";\n  TextDocumentSyncKind$1[TextDocumentSyncKind$1[\"Full\"] = 1] = \"Full\";\n  TextDocumentSyncKind$1[TextDocumentSyncKind$1[\"Incremental\"] = 2] = \"Incremental\";\n  return TextDocumentSyncKind$1;\n})({});\nlet CompletionItemKind = /* @__PURE__ */ (function(CompletionItemKind$1) {\n  CompletionItemKind$1[CompletionItemKind$1[\"Text\"] = 1] = \"Text\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Method\"] = 2] = \"Method\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Function\"] = 3] = \"Function\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Constructor\"] = 4] = \"Constructor\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Field\"] = 5] = \"Field\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Variable\"] = 6] = \"Variable\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Class\"] = 7] = \"Class\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Interface\"] = 8] = \"Interface\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Module\"] = 9] = \"Module\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Property\"] = 10] = \"Property\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Unit\"] = 11] = \"Unit\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Value\"] = 12] = \"Value\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Enum\"] = 13] = \"Enum\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Keyword\"] = 14] = \"Keyword\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Snippet\"] = 15] = \"Snippet\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Color\"] = 16] = \"Color\";\n  CompletionItemKind$1[CompletionItemKind$1[\"File\"] = 17] = \"File\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Reference\"] = 18] = \"Reference\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Folder\"] = 19] = \"Folder\";\n  CompletionItemKind$1[CompletionItemKind$1[\"EnumMember\"] = 20] = \"EnumMember\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Constant\"] = 21] = \"Constant\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Struct\"] = 22] = \"Struct\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Event\"] = 23] = \"Event\";\n  CompletionItemKind$1[CompletionItemKind$1[\"Operator\"] = 24] = \"Operator\";\n  CompletionItemKind$1[CompletionItemKind$1[\"TypeParameter\"] = 25] = \"TypeParameter\";\n  return CompletionItemKind$1;\n})({});\nlet CompletionItemTag = /* @__PURE__ */ (function(CompletionItemTag$1) {\n  CompletionItemTag$1[CompletionItemTag$1[\"Deprecated\"] = 1] = \"Deprecated\";\n  return CompletionItemTag$1;\n})({});\nlet InsertTextFormat = /* @__PURE__ */ (function(InsertTextFormat$1) {\n  InsertTextFormat$1[InsertTextFormat$1[\"PlainText\"] = 1] = \"PlainText\";\n  InsertTextFormat$1[InsertTextFormat$1[\"Snippet\"] = 2] = \"Snippet\";\n  return InsertTextFormat$1;\n})({});\nlet DocumentHighlightKind = /* @__PURE__ */ (function(DocumentHighlightKind$1) {\n  DocumentHighlightKind$1[DocumentHighlightKind$1[\"Text\"] = 1] = \"Text\";\n  DocumentHighlightKind$1[DocumentHighlightKind$1[\"Read\"] = 2] = \"Read\";\n  DocumentHighlightKind$1[DocumentHighlightKind$1[\"Write\"] = 3] = \"Write\";\n  return DocumentHighlightKind$1;\n})({});\nlet CodeActionKind = /* @__PURE__ */ (function(CodeActionKind$1) {\n  CodeActionKind$1[\"Empty\"] = \"\";\n  CodeActionKind$1[\"QuickFix\"] = \"quickfix\";\n  CodeActionKind$1[\"Refactor\"] = \"refactor\";\n  CodeActionKind$1[\"RefactorExtract\"] = \"refactor.extract\";\n  CodeActionKind$1[\"RefactorInline\"] = \"refactor.inline\";\n  CodeActionKind$1[\"RefactorRewrite\"] = \"refactor.rewrite\";\n  CodeActionKind$1[\"Source\"] = \"source\";\n  CodeActionKind$1[\"SourceOrganizeImports\"] = \"source.organizeImports\";\n  CodeActionKind$1[\"SourceFixAll\"] = \"source.fixAll\";\n  return CodeActionKind$1;\n})({});\nlet MarkupKind = /* @__PURE__ */ (function(MarkupKind$1) {\n  MarkupKind$1[\"PlainText\"] = \"plaintext\";\n  MarkupKind$1[\"Markdown\"] = \"markdown\";\n  return MarkupKind$1;\n})({});\nlet DiagnosticSeverity = /* @__PURE__ */ (function(DiagnosticSeverity$1) {\n  DiagnosticSeverity$1[DiagnosticSeverity$1[\"Error\"] = 1] = \"Error\";\n  DiagnosticSeverity$1[DiagnosticSeverity$1[\"Warning\"] = 2] = \"Warning\";\n  DiagnosticSeverity$1[DiagnosticSeverity$1[\"Information\"] = 3] = \"Information\";\n  DiagnosticSeverity$1[DiagnosticSeverity$1[\"Hint\"] = 4] = \"Hint\";\n  return DiagnosticSeverity$1;\n})({});\nlet DiagnosticTag = /* @__PURE__ */ (function(DiagnosticTag$1) {\n  DiagnosticTag$1[DiagnosticTag$1[\"Unnecessary\"] = 1] = \"Unnecessary\";\n  DiagnosticTag$1[DiagnosticTag$1[\"Deprecated\"] = 2] = \"Deprecated\";\n  return DiagnosticTag$1;\n})({});\nlet CompletionTriggerKind = /* @__PURE__ */ (function(CompletionTriggerKind$1) {\n  CompletionTriggerKind$1[CompletionTriggerKind$1[\"Invoked\"] = 1] = \"Invoked\";\n  CompletionTriggerKind$1[CompletionTriggerKind$1[\"TriggerCharacter\"] = 2] = \"TriggerCharacter\";\n  CompletionTriggerKind$1[CompletionTriggerKind$1[\"TriggerForIncompleteCompletions\"] = 3] = \"TriggerForIncompleteCompletions\";\n  return CompletionTriggerKind$1;\n})({});\nlet SignatureHelpTriggerKind = /* @__PURE__ */ (function(SignatureHelpTriggerKind$1) {\n  SignatureHelpTriggerKind$1[SignatureHelpTriggerKind$1[\"Invoked\"] = 1] = \"Invoked\";\n  SignatureHelpTriggerKind$1[SignatureHelpTriggerKind$1[\"TriggerCharacter\"] = 2] = \"TriggerCharacter\";\n  SignatureHelpTriggerKind$1[SignatureHelpTriggerKind$1[\"ContentChange\"] = 3] = \"ContentChange\";\n  return SignatureHelpTriggerKind$1;\n})({});\nlet CodeActionTriggerKind = /* @__PURE__ */ (function(CodeActionTriggerKind$1) {\n  CodeActionTriggerKind$1[CodeActionTriggerKind$1[\"Invoked\"] = 1] = \"Invoked\";\n  CodeActionTriggerKind$1[CodeActionTriggerKind$1[\"Automatic\"] = 2] = \"Automatic\";\n  return CodeActionTriggerKind$1;\n})({});\nlet TokenFormat = /* @__PURE__ */ (function(TokenFormat$1) {\n  TokenFormat$1[\"Relative\"] = \"relative\";\n  return TokenFormat$1;\n})({});\nvar Capability = class {\n  constructor(method) {\n    this.method = method;\n  }\n};\nconst capabilities = {\n  textDocumentImplementation: new Capability(\"textDocument/implementation\"),\n  textDocumentTypeDefinition: new Capability(\"textDocument/typeDefinition\"),\n  textDocumentDocumentColor: new Capability(\"textDocument/documentColor\"),\n  textDocumentColorPresentation: new Capability(\"textDocument/colorPresentation\"),\n  textDocumentFoldingRange: new Capability(\"textDocument/foldingRange\"),\n  textDocumentDeclaration: new Capability(\"textDocument/declaration\"),\n  textDocumentSelectionRange: new Capability(\"textDocument/selectionRange\"),\n  textDocumentPrepareCallHierarchy: new Capability(\"textDocument/prepareCallHierarchy\"),\n  textDocumentSemanticTokensFull: new Capability(\"textDocument/semanticTokens/full\"),\n  textDocumentSemanticTokensFullDelta: new Capability(\"textDocument/semanticTokens/full/delta\"),\n  textDocumentLinkedEditingRange: new Capability(\"textDocument/linkedEditingRange\"),\n  workspaceWillCreateFiles: new Capability(\"workspace/willCreateFiles\"),\n  workspaceWillRenameFiles: new Capability(\"workspace/willRenameFiles\"),\n  workspaceWillDeleteFiles: new Capability(\"workspace/willDeleteFiles\"),\n  textDocumentMoniker: new Capability(\"textDocument/moniker\"),\n  textDocumentPrepareTypeHierarchy: new Capability(\"textDocument/prepareTypeHierarchy\"),\n  textDocumentInlineValue: new Capability(\"textDocument/inlineValue\"),\n  textDocumentInlayHint: new Capability(\"textDocument/inlayHint\"),\n  textDocumentDiagnostic: new Capability(\"textDocument/diagnostic\"),\n  textDocumentInlineCompletion: new Capability(\"textDocument/inlineCompletion\"),\n  textDocumentWillSaveWaitUntil: new Capability(\"textDocument/willSaveWaitUntil\"),\n  textDocumentCompletion: new Capability(\"textDocument/completion\"),\n  textDocumentHover: new Capability(\"textDocument/hover\"),\n  textDocumentSignatureHelp: new Capability(\"textDocument/signatureHelp\"),\n  textDocumentDefinition: new Capability(\"textDocument/definition\"),\n  textDocumentReferences: new Capability(\"textDocument/references\"),\n  textDocumentDocumentHighlight: new Capability(\"textDocument/documentHighlight\"),\n  textDocumentDocumentSymbol: new Capability(\"textDocument/documentSymbol\"),\n  textDocumentCodeAction: new Capability(\"textDocument/codeAction\"),\n  workspaceSymbol: new Capability(\"workspace/symbol\"),\n  textDocumentCodeLens: new Capability(\"textDocument/codeLens\"),\n  textDocumentDocumentLink: new Capability(\"textDocument/documentLink\"),\n  textDocumentFormatting: new Capability(\"textDocument/formatting\"),\n  textDocumentRangeFormatting: new Capability(\"textDocument/rangeFormatting\"),\n  textDocumentRangesFormatting: new Capability(\"textDocument/rangesFormatting\"),\n  textDocumentOnTypeFormatting: new Capability(\"textDocument/onTypeFormatting\"),\n  textDocumentRename: new Capability(\"textDocument/rename\"),\n  workspaceExecuteCommand: new Capability(\"workspace/executeCommand\"),\n  workspaceDidCreateFiles: new Capability(\"workspace/didCreateFiles\"),\n  workspaceDidRenameFiles: new Capability(\"workspace/didRenameFiles\"),\n  workspaceDidDeleteFiles: new Capability(\"workspace/didDeleteFiles\"),\n  workspaceDidChangeConfiguration: new Capability(\"workspace/didChangeConfiguration\"),\n  textDocumentDidOpen: new Capability(\"textDocument/didOpen\"),\n  textDocumentDidChange: new Capability(\"textDocument/didChange\"),\n  textDocumentDidClose: new Capability(\"textDocument/didClose\"),\n  textDocumentDidSave: new Capability(\"textDocument/didSave\"),\n  textDocumentWillSave: new Capability(\"textDocument/willSave\"),\n  workspaceDidChangeWatchedFiles: new Capability(\"workspace/didChangeWatchedFiles\")\n};\nconst api = contract({\n  server: {\n    textDocumentImplementation: unverifiedRequest({ method: \"textDocument/implementation\" }),\n    textDocumentTypeDefinition: unverifiedRequest({ method: \"textDocument/typeDefinition\" }),\n    textDocumentDocumentColor: unverifiedRequest({ method: \"textDocument/documentColor\" }),\n    textDocumentColorPresentation: unverifiedRequest({ method: \"textDocument/colorPresentation\" }),\n    textDocumentFoldingRange: unverifiedRequest({ method: \"textDocument/foldingRange\" }),\n    textDocumentDeclaration: unverifiedRequest({ method: \"textDocument/declaration\" }),\n    textDocumentSelectionRange: unverifiedRequest({ method: \"textDocument/selectionRange\" }),\n    textDocumentPrepareCallHierarchy: unverifiedRequest({ method: \"textDocument/prepareCallHierarchy\" }),\n    callHierarchyIncomingCalls: unverifiedRequest({ method: \"callHierarchy/incomingCalls\" }),\n    callHierarchyOutgoingCalls: unverifiedRequest({ method: \"callHierarchy/outgoingCalls\" }),\n    textDocumentSemanticTokensFull: unverifiedRequest({ method: \"textDocument/semanticTokens/full\" }),\n    textDocumentSemanticTokensFullDelta: unverifiedRequest({ method: \"textDocument/semanticTokens/full/delta\" }),\n    textDocumentSemanticTokensRange: unverifiedRequest({ method: \"textDocument/semanticTokens/range\" }),\n    textDocumentLinkedEditingRange: unverifiedRequest({ method: \"textDocument/linkedEditingRange\" }),\n    workspaceWillCreateFiles: unverifiedRequest({ method: \"workspace/willCreateFiles\" }),\n    workspaceWillRenameFiles: unverifiedRequest({ method: \"workspace/willRenameFiles\" }),\n    workspaceWillDeleteFiles: unverifiedRequest({ method: \"workspace/willDeleteFiles\" }),\n    textDocumentMoniker: unverifiedRequest({ method: \"textDocument/moniker\" }),\n    textDocumentPrepareTypeHierarchy: unverifiedRequest({ method: \"textDocument/prepareTypeHierarchy\" }),\n    typeHierarchySupertypes: unverifiedRequest({ method: \"typeHierarchy/supertypes\" }),\n    typeHierarchySubtypes: unverifiedRequest({ method: \"typeHierarchy/subtypes\" }),\n    textDocumentInlineValue: unverifiedRequest({ method: \"textDocument/inlineValue\" }),\n    textDocumentInlayHint: unverifiedRequest({ method: \"textDocument/inlayHint\" }),\n    inlayHintResolve: unverifiedRequest({ method: \"inlayHint/resolve\" }),\n    textDocumentDiagnostic: unverifiedRequest({ method: \"textDocument/diagnostic\" }),\n    workspaceDiagnostic: unverifiedRequest({ method: \"workspace/diagnostic\" }),\n    textDocumentInlineCompletion: unverifiedRequest({ method: \"textDocument/inlineCompletion\" }),\n    initialize: unverifiedRequest({ method: \"initialize\" }),\n    shutdown: unverifiedRequest({ method: \"shutdown\" }),\n    textDocumentWillSaveWaitUntil: unverifiedRequest({ method: \"textDocument/willSaveWaitUntil\" }),\n    textDocumentCompletion: unverifiedRequest({ method: \"textDocument/completion\" }),\n    completionItemResolve: unverifiedRequest({ method: \"completionItem/resolve\" }),\n    textDocumentHover: unverifiedRequest({ method: \"textDocument/hover\" }),\n    textDocumentSignatureHelp: unverifiedRequest({ method: \"textDocument/signatureHelp\" }),\n    textDocumentDefinition: unverifiedRequest({ method: \"textDocument/definition\" }),\n    textDocumentReferences: unverifiedRequest({ method: \"textDocument/references\" }),\n    textDocumentDocumentHighlight: unverifiedRequest({ method: \"textDocument/documentHighlight\" }),\n    textDocumentDocumentSymbol: unverifiedRequest({ method: \"textDocument/documentSymbol\" }),\n    textDocumentCodeAction: unverifiedRequest({ method: \"textDocument/codeAction\" }),\n    codeActionResolve: unverifiedRequest({ method: \"codeAction/resolve\" }),\n    workspaceSymbol: unverifiedRequest({ method: \"workspace/symbol\" }),\n    workspaceSymbolResolve: unverifiedRequest({ method: \"workspaceSymbol/resolve\" }),\n    textDocumentCodeLens: unverifiedRequest({ method: \"textDocument/codeLens\" }),\n    codeLensResolve: unverifiedRequest({ method: \"codeLens/resolve\" }),\n    textDocumentDocumentLink: unverifiedRequest({ method: \"textDocument/documentLink\" }),\n    documentLinkResolve: unverifiedRequest({ method: \"documentLink/resolve\" }),\n    textDocumentFormatting: unverifiedRequest({ method: \"textDocument/formatting\" }),\n    textDocumentRangeFormatting: unverifiedRequest({ method: \"textDocument/rangeFormatting\" }),\n    textDocumentRangesFormatting: unverifiedRequest({ method: \"textDocument/rangesFormatting\" }),\n    textDocumentOnTypeFormatting: unverifiedRequest({ method: \"textDocument/onTypeFormatting\" }),\n    textDocumentRename: unverifiedRequest({ method: \"textDocument/rename\" }),\n    textDocumentPrepareRename: unverifiedRequest({ method: \"textDocument/prepareRename\" }),\n    workspaceExecuteCommand: unverifiedRequest({ method: \"workspace/executeCommand\" }),\n    workspaceDidChangeWorkspaceFolders: unverifiedNotification({ method: \"workspace/didChangeWorkspaceFolders\" }),\n    windowWorkDoneProgressCancel: unverifiedNotification({ method: \"window/workDoneProgress/cancel\" }),\n    workspaceDidCreateFiles: unverifiedNotification({ method: \"workspace/didCreateFiles\" }),\n    workspaceDidRenameFiles: unverifiedNotification({ method: \"workspace/didRenameFiles\" }),\n    workspaceDidDeleteFiles: unverifiedNotification({ method: \"workspace/didDeleteFiles\" }),\n    notebookDocumentDidOpen: unverifiedNotification({ method: \"notebookDocument/didOpen\" }),\n    notebookDocumentDidChange: unverifiedNotification({ method: \"notebookDocument/didChange\" }),\n    notebookDocumentDidSave: unverifiedNotification({ method: \"notebookDocument/didSave\" }),\n    notebookDocumentDidClose: unverifiedNotification({ method: \"notebookDocument/didClose\" }),\n    initialized: unverifiedNotification({ method: \"initialized\" }),\n    exit: unverifiedNotification({ method: \"exit\" }),\n    workspaceDidChangeConfiguration: unverifiedNotification({ method: \"workspace/didChangeConfiguration\" }),\n    textDocumentDidOpen: unverifiedNotification({ method: \"textDocument/didOpen\" }),\n    textDocumentDidChange: unverifiedNotification({ method: \"textDocument/didChange\" }),\n    textDocumentDidClose: unverifiedNotification({ method: \"textDocument/didClose\" }),\n    textDocumentDidSave: unverifiedNotification({ method: \"textDocument/didSave\" }),\n    textDocumentWillSave: unverifiedNotification({ method: \"textDocument/willSave\" }),\n    workspaceDidChangeWatchedFiles: unverifiedNotification({ method: \"workspace/didChangeWatchedFiles\" }),\n    setTrace: unverifiedNotification({ method: \"$/setTrace\" }),\n    cancelRequest: unverifiedNotification({ method: \"$/cancelRequest\" }),\n    progress: unverifiedNotification({ method: \"$/progress\" })\n  },\n  client: {\n    workspaceWorkspaceFolders: unverifiedRequest({ method: \"workspace/workspaceFolders\" }).optional(),\n    workspaceConfiguration: unverifiedRequest({ method: \"workspace/configuration\" }).optional(),\n    workspaceFoldingRangeRefresh: unverifiedRequest({ method: \"workspace/foldingRange/refresh\" }).optional(),\n    windowWorkDoneProgressCreate: unverifiedRequest({ method: \"window/workDoneProgress/create\" }).optional(),\n    workspaceSemanticTokensRefresh: unverifiedRequest({ method: \"workspace/semanticTokens/refresh\" }).optional(),\n    windowShowDocument: unverifiedRequest({ method: \"window/showDocument\" }).optional(),\n    workspaceInlineValueRefresh: unverifiedRequest({ method: \"workspace/inlineValue/refresh\" }).optional(),\n    workspaceInlayHintRefresh: unverifiedRequest({ method: \"workspace/inlayHint/refresh\" }).optional(),\n    workspaceDiagnosticRefresh: unverifiedRequest({ method: \"workspace/diagnostic/refresh\" }).optional(),\n    clientRegisterCapability: unverifiedRequest({ method: \"client/registerCapability\" }).optional(),\n    clientUnregisterCapability: unverifiedRequest({ method: \"client/unregisterCapability\" }).optional(),\n    windowShowMessageRequest: unverifiedRequest({ method: \"window/showMessageRequest\" }).optional(),\n    workspaceCodeLensRefresh: unverifiedRequest({ method: \"workspace/codeLens/refresh\" }).optional(),\n    workspaceApplyEdit: unverifiedRequest({ method: \"workspace/applyEdit\" }).optional(),\n    windowShowMessage: unverifiedNotification({ method: \"window/showMessage\" }),\n    windowLogMessage: unverifiedNotification({ method: \"window/logMessage\" }),\n    telemetryEvent: unverifiedNotification({ method: \"telemetry/event\" }),\n    textDocumentPublishDiagnostics: unverifiedNotification({ method: \"textDocument/publishDiagnostics\" }),\n    logTrace: unverifiedNotification({ method: \"$/logTrace\" }),\n    cancelRequest: unverifiedNotification({ method: \"$/cancelRequest\" }),\n    progress: unverifiedNotification({ method: \"$/progress\" })\n  }\n});\nfunction assertTargetTextModel(input, expectedTextModel) {\n  if (input.textModel !== expectedTextModel) throw new Error(`Expected text model to be ${expectedTextModel}, but got ${input.textModel}`);\n  return input;\n}\nvar Disposable = (_d = class {\n  constructor() {\n    __publicField(this, \"_store\", new DisposableStore());\n  }\n  dispose() {\n    this._store.dispose();\n  }\n  _register(t) {\n    if (t === this) throw new Error(\"Cannot register a disposable on itself!\");\n    return this._store.add(t);\n  }\n}, __publicField(_d, \"None\", Object.freeze({ dispose() {\n} })), _d);\nvar DisposableStore = (_e = class {\n  constructor() {\n    __publicField(this, \"_toDispose\", /* @__PURE__ */ new Set());\n    __publicField(this, \"_isDisposed\", false);\n  }\n  dispose() {\n    if (this._isDisposed) return;\n    this._isDisposed = true;\n    this.clear();\n  }\n  clear() {\n    if (this._toDispose.size === 0) return;\n    try {\n      for (const item of this._toDispose) item.dispose();\n    } finally {\n      this._toDispose.clear();\n    }\n  }\n  add(t) {\n    if (!t) return t;\n    if (t === this) throw new Error(\"Cannot register a disposable on itself!\");\n    if (this._isDisposed) {\n      if (!_e.DISABLE_DISPOSED_WARNING) console.warn((/* @__PURE__ */ new Error(\"Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!\")).stack);\n    } else this._toDispose.add(t);\n    return t;\n  }\n}, __publicField(_e, \"DISABLE_DISPOSED_WARNING\", false), _e);\nconst lspCodeActionKindToMonacoCodeActionKind = /* @__PURE__ */ new Map([\n  [CodeActionKind.Empty, \"\"],\n  [CodeActionKind.QuickFix, \"quickfix\"],\n  [CodeActionKind.Refactor, \"refactor\"],\n  [CodeActionKind.RefactorExtract, \"refactor.extract\"],\n  [CodeActionKind.RefactorInline, \"refactor.inline\"],\n  [CodeActionKind.RefactorRewrite, \"refactor.rewrite\"],\n  [CodeActionKind.Source, \"source\"],\n  [CodeActionKind.SourceOrganizeImports, \"source.organizeImports\"],\n  [CodeActionKind.SourceFixAll, \"source.fixAll\"]\n]);\nfunction toMonacoCodeActionKind(kind) {\n  if (!kind) return;\n  return lspCodeActionKindToMonacoCodeActionKind.get(kind) ?? kind;\n}\nconst monacoCodeActionTriggerTypeToLspCodeActionTriggerKind = /* @__PURE__ */ new Map([[languages.CodeActionTriggerType.Invoke, CodeActionTriggerKind.Invoked], [languages.CodeActionTriggerType.Auto, CodeActionTriggerKind.Automatic]]);\nfunction toLspCodeActionTriggerKind(monacoTrigger) {\n  return monacoCodeActionTriggerTypeToLspCodeActionTriggerKind.get(monacoTrigger) ?? CodeActionTriggerKind.Invoked;\n}\nconst lspCompletionItemKindToMonacoCompletionItemKind = /* @__PURE__ */ new Map([\n  [CompletionItemKind.Text, languages.CompletionItemKind.Text],\n  [CompletionItemKind.Method, languages.CompletionItemKind.Method],\n  [CompletionItemKind.Function, languages.CompletionItemKind.Function],\n  [CompletionItemKind.Constructor, languages.CompletionItemKind.Constructor],\n  [CompletionItemKind.Field, languages.CompletionItemKind.Field],\n  [CompletionItemKind.Variable, languages.CompletionItemKind.Variable],\n  [CompletionItemKind.Class, languages.CompletionItemKind.Class],\n  [CompletionItemKind.Interface, languages.CompletionItemKind.Interface],\n  [CompletionItemKind.Module, languages.CompletionItemKind.Module],\n  [CompletionItemKind.Property, languages.CompletionItemKind.Property],\n  [CompletionItemKind.Unit, languages.CompletionItemKind.Unit],\n  [CompletionItemKind.Value, languages.CompletionItemKind.Value],\n  [CompletionItemKind.Enum, languages.CompletionItemKind.Enum],\n  [CompletionItemKind.Keyword, languages.CompletionItemKind.Keyword],\n  [CompletionItemKind.Snippet, languages.CompletionItemKind.Snippet],\n  [CompletionItemKind.Color, languages.CompletionItemKind.Color],\n  [CompletionItemKind.File, languages.CompletionItemKind.File],\n  [CompletionItemKind.Reference, languages.CompletionItemKind.Reference],\n  [CompletionItemKind.Folder, languages.CompletionItemKind.Folder],\n  [CompletionItemKind.EnumMember, languages.CompletionItemKind.EnumMember],\n  [CompletionItemKind.Constant, languages.CompletionItemKind.Constant],\n  [CompletionItemKind.Struct, languages.CompletionItemKind.Struct],\n  [CompletionItemKind.Event, languages.CompletionItemKind.Event],\n  [CompletionItemKind.Operator, languages.CompletionItemKind.Operator],\n  [CompletionItemKind.TypeParameter, languages.CompletionItemKind.TypeParameter]\n]);\nfunction toMonacoCompletionItemKind(kind) {\n  if (!kind) return languages.CompletionItemKind.Text;\n  return lspCompletionItemKindToMonacoCompletionItemKind.get(kind) ?? languages.CompletionItemKind.Text;\n}\nconst lspCompletionItemTagToMonacoCompletionItemTag = /* @__PURE__ */ new Map([[CompletionItemTag.Deprecated, languages.CompletionItemTag.Deprecated]]);\nfunction toMonacoCompletionItemTag(tag) {\n  return lspCompletionItemTagToMonacoCompletionItemTag.get(tag);\n}\nconst monacoCompletionTriggerKindToLspCompletionTriggerKind = /* @__PURE__ */ new Map([\n  [languages.CompletionTriggerKind.Invoke, CompletionTriggerKind.Invoked],\n  [languages.CompletionTriggerKind.TriggerCharacter, CompletionTriggerKind.TriggerCharacter],\n  [languages.CompletionTriggerKind.TriggerForIncompleteCompletions, CompletionTriggerKind.TriggerForIncompleteCompletions]\n]);\nfunction toLspCompletionTriggerKind(monacoKind) {\n  return monacoCompletionTriggerKindToLspCompletionTriggerKind.get(monacoKind) ?? CompletionTriggerKind.Invoked;\n}\nconst lspInsertTextFormatToMonacoInsertTextRules = /* @__PURE__ */ new Map([[InsertTextFormat.Snippet, languages.CompletionItemInsertTextRule.InsertAsSnippet]]);\nfunction toMonacoInsertTextRules(format) {\n  if (!format) return;\n  return lspInsertTextFormatToMonacoInsertTextRules.get(format);\n}\nconst lspSymbolKindToMonacoSymbolKind = /* @__PURE__ */ new Map([\n  [SymbolKind.File, languages.SymbolKind.File],\n  [SymbolKind.Module, languages.SymbolKind.Module],\n  [SymbolKind.Namespace, languages.SymbolKind.Namespace],\n  [SymbolKind.Package, languages.SymbolKind.Package],\n  [SymbolKind.Class, languages.SymbolKind.Class],\n  [SymbolKind.Method, languages.SymbolKind.Method],\n  [SymbolKind.Property, languages.SymbolKind.Property],\n  [SymbolKind.Field, languages.SymbolKind.Field],\n  [SymbolKind.Constructor, languages.SymbolKind.Constructor],\n  [SymbolKind.Enum, languages.SymbolKind.Enum],\n  [SymbolKind.Interface, languages.SymbolKind.Interface],\n  [SymbolKind.Function, languages.SymbolKind.Function],\n  [SymbolKind.Variable, languages.SymbolKind.Variable],\n  [SymbolKind.Constant, languages.SymbolKind.Constant],\n  [SymbolKind.String, languages.SymbolKind.String],\n  [SymbolKind.Number, languages.SymbolKind.Number],\n  [SymbolKind.Boolean, languages.SymbolKind.Boolean],\n  [SymbolKind.Array, languages.SymbolKind.Array],\n  [SymbolKind.Object, languages.SymbolKind.Object],\n  [SymbolKind.Key, languages.SymbolKind.Key],\n  [SymbolKind.Null, languages.SymbolKind.Null],\n  [SymbolKind.EnumMember, languages.SymbolKind.EnumMember],\n  [SymbolKind.Struct, languages.SymbolKind.Struct],\n  [SymbolKind.Event, languages.SymbolKind.Event],\n  [SymbolKind.Operator, languages.SymbolKind.Operator],\n  [SymbolKind.TypeParameter, languages.SymbolKind.TypeParameter]\n]);\nfunction toMonacoSymbolKind(kind) {\n  return lspSymbolKindToMonacoSymbolKind.get(kind) ?? languages.SymbolKind.File;\n}\nconst lspSymbolTagToMonacoSymbolTag = /* @__PURE__ */ new Map([[SymbolTag.Deprecated, languages.SymbolTag.Deprecated]]);\nfunction toMonacoSymbolTag(tag) {\n  return lspSymbolTagToMonacoSymbolTag.get(tag);\n}\nconst lspDocumentHighlightKindToMonacoDocumentHighlightKind = /* @__PURE__ */ new Map([\n  [DocumentHighlightKind.Text, languages.DocumentHighlightKind.Text],\n  [DocumentHighlightKind.Read, languages.DocumentHighlightKind.Read],\n  [DocumentHighlightKind.Write, languages.DocumentHighlightKind.Write]\n]);\nfunction toMonacoDocumentHighlightKind(kind) {\n  if (!kind) return languages.DocumentHighlightKind.Text;\n  return lspDocumentHighlightKindToMonacoDocumentHighlightKind.get(kind) ?? languages.DocumentHighlightKind.Text;\n}\nconst lspFoldingRangeKindToMonacoFoldingRangeKind = /* @__PURE__ */ new Map([\n  [FoldingRangeKind.Comment, languages.FoldingRangeKind.Comment],\n  [FoldingRangeKind.Imports, languages.FoldingRangeKind.Imports],\n  [FoldingRangeKind.Region, languages.FoldingRangeKind.Region]\n]);\nfunction toMonacoFoldingRangeKind(kind) {\n  if (!kind) return;\n  return lspFoldingRangeKindToMonacoFoldingRangeKind.get(kind);\n}\nconst monacoMarkerSeverityToLspDiagnosticSeverity = /* @__PURE__ */ new Map([\n  [MarkerSeverity.Error, DiagnosticSeverity.Error],\n  [MarkerSeverity.Warning, DiagnosticSeverity.Warning],\n  [MarkerSeverity.Info, DiagnosticSeverity.Information],\n  [MarkerSeverity.Hint, DiagnosticSeverity.Hint]\n]);\nfunction toLspDiagnosticSeverity(severity) {\n  return monacoMarkerSeverityToLspDiagnosticSeverity.get(severity) ?? DiagnosticSeverity.Error;\n}\nconst lspDiagnosticSeverityToMonacoMarkerSeverity = /* @__PURE__ */ new Map([\n  [DiagnosticSeverity.Error, MarkerSeverity.Error],\n  [DiagnosticSeverity.Warning, MarkerSeverity.Warning],\n  [DiagnosticSeverity.Information, MarkerSeverity.Info],\n  [DiagnosticSeverity.Hint, MarkerSeverity.Hint]\n]);\nfunction toMonacoDiagnosticSeverity(severity) {\n  if (!severity) return MarkerSeverity.Error;\n  return lspDiagnosticSeverityToMonacoMarkerSeverity.get(severity) ?? MarkerSeverity.Error;\n}\nconst lspDiagnosticTagToMonacoMarkerTag = /* @__PURE__ */ new Map([[DiagnosticTag.Unnecessary, MarkerTag.Unnecessary], [DiagnosticTag.Deprecated, MarkerTag.Deprecated]]);\nfunction toMonacoDiagnosticTag(tag) {\n  return lspDiagnosticTagToMonacoMarkerTag.get(tag);\n}\nconst monacoSignatureHelpTriggerKindToLspSignatureHelpTriggerKind = /* @__PURE__ */ new Map([\n  [languages.SignatureHelpTriggerKind.Invoke, SignatureHelpTriggerKind.Invoked],\n  [languages.SignatureHelpTriggerKind.TriggerCharacter, SignatureHelpTriggerKind.TriggerCharacter],\n  [languages.SignatureHelpTriggerKind.ContentChange, SignatureHelpTriggerKind.ContentChange]\n]);\nfunction toLspSignatureHelpTriggerKind(monacoKind) {\n  return monacoSignatureHelpTriggerKindToLspSignatureHelpTriggerKind.get(monacoKind) ?? SignatureHelpTriggerKind.Invoked;\n}\nfunction toMonacoCommand(command) {\n  if (!command) return;\n  return {\n    id: command.command,\n    title: command.title,\n    arguments: command.arguments\n  };\n}\nconst lspInlayHintKindToMonacoInlayHintKind = /* @__PURE__ */ new Map([[InlayHintKind.Type, languages.InlayHintKind.Type], [InlayHintKind.Parameter, languages.InlayHintKind.Parameter]]);\nfunction toMonacoInlayHintKind(kind) {\n  if (!kind) return languages.InlayHintKind.Type;\n  return lspInlayHintKindToMonacoInlayHintKind.get(kind) ?? languages.InlayHintKind.Type;\n}\nfunction toMonacoLocation(location, client) {\n  if (\"targetUri\" in location) {\n    const translatedRange = client.bridge.translateBackRange({ uri: location.targetUri }, location.targetRange);\n    return {\n      uri: translatedRange.textModel.uri,\n      range: translatedRange.range,\n      originSelectionRange: location.originSelectionRange ? client.bridge.translateBackRange({ uri: location.targetUri }, location.originSelectionRange).range : void 0,\n      targetSelectionRange: location.targetSelectionRange ? client.bridge.translateBackRange({ uri: location.targetUri }, location.targetSelectionRange).range : void 0\n    };\n  } else {\n    const translatedRange = client.bridge.translateBackRange({ uri: location.uri }, location.range);\n    return {\n      uri: translatedRange.textModel.uri,\n      range: translatedRange.range\n    };\n  }\n}\nfunction toMonacoLanguageSelector(s) {\n  if (!s || s.length === 0) return { language: \"*\" };\n  return s.map((s$1) => {\n    if (\"notebook\" in s$1) if (typeof s$1.notebook === \"string\") return {\n      notebookType: s$1.notebook,\n      language: s$1.language\n    };\n    else return {\n      notebookType: s$1.notebook.notebookType,\n      language: s$1.language,\n      pattern: s$1.notebook.pattern,\n      scheme: s$1.notebook.scheme\n    };\n    else return {\n      language: s$1.language,\n      pattern: s$1.pattern,\n      scheme: s$1.scheme\n    };\n  });\n}\nfunction matchesDocumentSelector(model, selector) {\n  if (!selector) return true;\n  const languageId = model.getLanguageId();\n  model.uri.toString(true);\n  if (!selector || selector.length === 0) return true;\n  for (const filter of selector) {\n    if (filter.language && filter.language !== \"*\" && filter.language !== languageId) continue;\n    return true;\n  }\n  return false;\n}\nfunction toDiagnosticMarker(diagnostic) {\n  const marker = {\n    severity: toMonacoDiagnosticSeverity(diagnostic.severity),\n    startLineNumber: diagnostic.range.start.line + 1,\n    startColumn: diagnostic.range.start.character + 1,\n    endLineNumber: diagnostic.range.end.line + 1,\n    endColumn: diagnostic.range.end.character + 1,\n    message: diagnostic.message,\n    source: diagnostic.source,\n    code: typeof diagnostic.code === \"string\" ? diagnostic.code : diagnostic.code?.toString()\n  };\n  if (diagnostic.tags) marker.tags = diagnostic.tags.map((tag) => toMonacoDiagnosticTag(tag)).filter((tag) => tag !== void 0);\n  if (diagnostic.relatedInformation) marker.relatedInformation = diagnostic.relatedInformation.map((info) => ({\n    resource: Uri.parse(info.location.uri),\n    startLineNumber: info.location.range.start.line + 1,\n    startColumn: info.location.range.start.character + 1,\n    endLineNumber: info.location.range.end.line + 1,\n    endColumn: info.location.range.end.character + 1,\n    message: info.message\n  }));\n  return marker;\n}\nvar LspCompletionFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { completion: {\n      dynamicRegistration: true,\n      contextSupport: true,\n      completionItemKind: { valueSet: Array.from(lspCompletionItemKindToMonacoCompletionItemKind.keys()) },\n      completionItem: {\n        tagSupport: { valueSet: Array.from(lspCompletionItemTagToMonacoCompletionItemTag.keys()) },\n        commitCharactersSupport: true,\n        deprecatedSupport: true,\n        preselectSupport: true\n      }\n    } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentCompletion, true, (capability) => {\n      return languages.registerCompletionItemProvider(toMonacoLanguageSelector(capability.documentSelector), new LspCompletionProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspCompletionProvider = class {\n  constructor(_client, _capabilities) {\n    __publicField(this, \"resolveCompletionItem\");\n    this._client = _client;\n    this._capabilities = _capabilities;\n    if (_capabilities.resolveProvider) this.resolveCompletionItem = async (item, token) => {\n      applyLspCompletionItemProperties(item, await this._client.server.completionItemResolve(item._lspItem), this._client.bridge, item._translated, item._model);\n      return item;\n    };\n  }\n  get triggerCharacters() {\n    return this._capabilities.triggerCharacters;\n  }\n  async provideCompletionItems(model, position, context, token) {\n    const translated = this._client.bridge.translate(model, position);\n    const result = await this._client.server.textDocumentCompletion({\n      textDocument: translated.textDocument,\n      position: translated.position,\n      context: context.triggerCharacter ? {\n        triggerKind: toLspCompletionTriggerKind(context.triggerKind),\n        triggerCharacter: context.triggerCharacter\n      } : void 0\n    });\n    if (!result) return { suggestions: [] };\n    return { suggestions: (Array.isArray(result) ? result : result.items).map((i) => {\n      return {\n        ...convertLspToMonacoCompletionItem(i, this._client.bridge, translated, model, position),\n        _lspItem: i,\n        _translated: translated,\n        _model: model\n      };\n    }) };\n  }\n};\nfunction convertLspToMonacoCompletionItem(lspItem, bridge, translated, model, position) {\n  let insertText = lspItem.insertText || lspItem.label;\n  let range = void 0;\n  if (lspItem.textEdit) if (\"range\" in lspItem.textEdit) {\n    insertText = lspItem.textEdit.newText;\n    range = assertTargetTextModel(bridge.translateBackRange(translated.textDocument, lspItem.textEdit.range), model).range;\n  } else {\n    insertText = lspItem.textEdit.newText;\n    range = {\n      insert: assertTargetTextModel(bridge.translateBackRange(translated.textDocument, lspItem.textEdit.insert), model).range,\n      replace: assertTargetTextModel(bridge.translateBackRange(translated.textDocument, lspItem.textEdit.replace), model).range\n    };\n  }\n  if (!range) range = Range.fromPositions(position, position);\n  const item = {\n    label: lspItem.label,\n    kind: toMonacoCompletionItemKind(lspItem.kind),\n    insertText,\n    sortText: lspItem.sortText,\n    filterText: lspItem.filterText,\n    preselect: lspItem.preselect,\n    commitCharacters: lspItem.commitCharacters,\n    range\n  };\n  applyLspCompletionItemProperties(item, lspItem, bridge, translated, model);\n  return item;\n}\nfunction applyLspCompletionItemProperties(monacoItem, lspItem, bridge, translated, targetModel) {\n  if (lspItem.detail !== void 0) monacoItem.detail = lspItem.detail;\n  if (lspItem.documentation !== void 0) monacoItem.documentation = toMonacoDocumentation$1(lspItem.documentation);\n  if (lspItem.insertTextFormat !== void 0) monacoItem.insertTextRules = toMonacoInsertTextRules(lspItem.insertTextFormat);\n  if (lspItem.tags && lspItem.tags.length > 0) monacoItem.tags = lspItem.tags.map(toMonacoCompletionItemTag).filter((tag) => tag !== void 0);\n  if (lspItem.additionalTextEdits && lspItem.additionalTextEdits.length > 0) monacoItem.additionalTextEdits = lspItem.additionalTextEdits.map((edit) => ({\n    range: assertTargetTextModel(bridge.translateBackRange(translated.textDocument, edit.range), targetModel).range,\n    text: edit.newText\n  }));\n  if (lspItem.command) monacoItem.command = toMonacoCommand(lspItem.command);\n}\nfunction toMonacoDocumentation$1(doc) {\n  if (!doc) return void 0;\n  if (typeof doc === \"string\") return doc;\n  return {\n    value: doc.value,\n    isTrusted: true\n  };\n}\nvar LspHoverFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { hover: {\n      dynamicRegistration: true,\n      contentFormat: [MarkupKind.Markdown, MarkupKind.PlainText]\n    } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentHover, true, (capability) => {\n      return languages.registerHoverProvider(toMonacoLanguageSelector(capability.documentSelector), new LspHoverProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspHoverProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideHover(model, position, token) {\n    const translated = this._client.bridge.translate(model, position);\n    const result = await this._client.server.textDocumentHover({\n      textDocument: translated.textDocument,\n      position: translated.position\n    });\n    if (!result || !result.contents) return null;\n    return {\n      contents: toMonacoMarkdownString(result.contents),\n      range: result.range ? this._client.bridge.translateBackRange(translated.textDocument, result.range).range : void 0\n    };\n  }\n};\nfunction toMonacoMarkdownString(contents) {\n  if (Array.isArray(contents)) return contents.map((c) => toSingleMarkdownString(c));\n  return [toSingleMarkdownString(contents)];\n}\nfunction toSingleMarkdownString(content) {\n  if (typeof content === \"string\") return {\n    value: content,\n    isTrusted: true\n  };\n  if (\"kind\" in content) return {\n    value: content.value,\n    isTrusted: true\n  };\n  return {\n    value: `\\`\\`\\`${content.language}\n${content.value}\n\\`\\`\\``,\n    isTrusted: true\n  };\n}\nvar LspSignatureHelpFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { signatureHelp: {\n      dynamicRegistration: true,\n      contextSupport: true,\n      signatureInformation: {\n        documentationFormat: [MarkupKind.Markdown, MarkupKind.PlainText],\n        parameterInformation: { labelOffsetSupport: true },\n        activeParameterSupport: true\n      }\n    } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentSignatureHelp, true, (capability) => {\n      return languages.registerSignatureHelpProvider(toMonacoLanguageSelector(capability.documentSelector), new LspSignatureHelpProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspSignatureHelpProvider = class {\n  constructor(_client, _capabilities) {\n    __publicField(this, \"signatureHelpTriggerCharacters\");\n    __publicField(this, \"signatureHelpRetriggerCharacters\");\n    this._client = _client;\n    this._capabilities = _capabilities;\n    this.signatureHelpTriggerCharacters = _capabilities.triggerCharacters;\n    this.signatureHelpRetriggerCharacters = _capabilities.retriggerCharacters;\n  }\n  async provideSignatureHelp(model, position, token, context) {\n    const translated = this._client.bridge.translate(model, position);\n    const result = await this._client.server.textDocumentSignatureHelp({\n      textDocument: translated.textDocument,\n      position: translated.position,\n      context: {\n        triggerKind: toLspSignatureHelpTriggerKind(context.triggerKind),\n        triggerCharacter: context.triggerCharacter,\n        isRetrigger: context.isRetrigger\n      }\n    });\n    if (!result) return null;\n    return {\n      value: {\n        signatures: result.signatures.map((sig) => ({\n          label: sig.label,\n          documentation: toMonacoDocumentation(sig.documentation),\n          parameters: sig.parameters?.map((param) => ({\n            label: param.label,\n            documentation: toMonacoDocumentation(param.documentation)\n          })) || [],\n          activeParameter: sig.activeParameter\n        })),\n        activeSignature: result.activeSignature || 0,\n        activeParameter: result.activeParameter || 0\n      },\n      dispose: () => {\n      }\n    };\n  }\n};\nfunction toMonacoDocumentation(doc) {\n  if (!doc) return void 0;\n  if (typeof doc === \"string\") return doc;\n  return {\n    value: doc.value,\n    isTrusted: true\n  };\n}\nvar LspDefinitionFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { definition: {\n      dynamicRegistration: true,\n      linkSupport: true\n    } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentDefinition, true, (capability) => {\n      return languages.registerDefinitionProvider(toMonacoLanguageSelector(capability.documentSelector), new LspDefinitionProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspDefinitionProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideDefinition(model, position, token) {\n    const translated = this._client.bridge.translate(model, position);\n    const result = await this._client.server.textDocumentDefinition({\n      textDocument: translated.textDocument,\n      position: translated.position\n    });\n    if (!result) return null;\n    if (Array.isArray(result)) return result.map((loc) => toMonacoLocation(loc, this._client));\n    return toMonacoLocation(result, this._client);\n  }\n};\nvar LspDeclarationFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { declaration: {\n      dynamicRegistration: true,\n      linkSupport: true\n    } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentDeclaration, true, (capability) => {\n      return languages.registerDeclarationProvider(toMonacoLanguageSelector(capability.documentSelector), new LspDeclarationProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspDeclarationProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideDeclaration(model, position, token) {\n    const translated = this._client.bridge.translate(model, position);\n    const result = await this._client.server.textDocumentDeclaration({\n      textDocument: translated.textDocument,\n      position: translated.position\n    });\n    if (!result) return null;\n    if (Array.isArray(result)) return result.map((loc) => toMonacoLocation(loc, this._client));\n    return toMonacoLocation(result, this._client);\n  }\n};\nvar LspTypeDefinitionFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { typeDefinition: {\n      dynamicRegistration: true,\n      linkSupport: true\n    } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentTypeDefinition, true, (capability) => {\n      return languages.registerTypeDefinitionProvider(toMonacoLanguageSelector(capability.documentSelector), new LspTypeDefinitionProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspTypeDefinitionProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideTypeDefinition(model, position, token) {\n    const translated = this._client.bridge.translate(model, position);\n    const result = await this._client.server.textDocumentTypeDefinition({\n      textDocument: translated.textDocument,\n      position: translated.position\n    });\n    if (!result) return null;\n    if (Array.isArray(result)) return result.map((loc) => toMonacoLocation(loc, this._client));\n    return toMonacoLocation(result, this._client);\n  }\n};\nvar LspImplementationFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { implementation: {\n      dynamicRegistration: true,\n      linkSupport: true\n    } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentImplementation, true, (capability) => {\n      return languages.registerImplementationProvider(toMonacoLanguageSelector(capability.documentSelector), new LspImplementationProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspImplementationProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideImplementation(model, position, token) {\n    const translated = this._client.bridge.translate(model, position);\n    const result = await this._client.server.textDocumentImplementation({\n      textDocument: translated.textDocument,\n      position: translated.position\n    });\n    if (!result) return null;\n    if (Array.isArray(result)) return result.map((loc) => toMonacoLocation(loc, this._client));\n    return toMonacoLocation(result, this._client);\n  }\n};\nvar LspReferencesFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { references: { dynamicRegistration: true } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentReferences, true, (capability) => {\n      return languages.registerReferenceProvider(toMonacoLanguageSelector(capability.documentSelector), new LspReferenceProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspReferenceProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideReferences(model, position, context, token) {\n    const translated = this._client.bridge.translate(model, position);\n    const result = await this._client.server.textDocumentReferences({\n      textDocument: translated.textDocument,\n      position: translated.position,\n      context: { includeDeclaration: context.includeDeclaration }\n    });\n    if (!result) return null;\n    return result.map((loc) => {\n      const translated$1 = this._client.bridge.translateBackRange({ uri: loc.uri }, loc.range);\n      return {\n        uri: translated$1.textModel.uri,\n        range: translated$1.range\n      };\n    });\n  }\n};\nvar LspDocumentHighlightFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { documentHighlight: { dynamicRegistration: true } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentDocumentHighlight, true, (capability) => {\n      return languages.registerDocumentHighlightProvider(toMonacoLanguageSelector(capability.documentSelector), new LspDocumentHighlightProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspDocumentHighlightProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideDocumentHighlights(model, position, token) {\n    const translated = this._client.bridge.translate(model, position);\n    const result = await this._client.server.textDocumentDocumentHighlight({\n      textDocument: translated.textDocument,\n      position: translated.position\n    });\n    if (!result) return null;\n    return result.map((highlight) => ({\n      range: this._client.bridge.translateBackRange(translated.textDocument, highlight.range).range,\n      kind: toMonacoDocumentHighlightKind(highlight.kind)\n    }));\n  }\n};\nvar LspDocumentSymbolFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { documentSymbol: {\n      dynamicRegistration: true,\n      hierarchicalDocumentSymbolSupport: true,\n      symbolKind: { valueSet: Array.from(lspSymbolKindToMonacoSymbolKind.keys()) },\n      tagSupport: { valueSet: [SymbolTag.Deprecated] }\n    } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentDocumentSymbol, true, (capability) => {\n      return languages.registerDocumentSymbolProvider(toMonacoLanguageSelector(capability.documentSelector), new LspDocumentSymbolProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspDocumentSymbolProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideDocumentSymbols(model, token) {\n    const translated = this._client.bridge.translate(model, new Position(1, 1));\n    const result = await this._client.server.textDocumentDocumentSymbol({ textDocument: translated.textDocument });\n    if (!result) return null;\n    if (Array.isArray(result) && result.length > 0) if (\"location\" in result[0]) return result.map((symbol) => toMonacoSymbolInformation(symbol, this._client));\n    else return result.map((symbol) => toMonacoDocumentSymbol(symbol, this._client, translated.textDocument));\n    return [];\n  }\n};\nfunction toMonacoDocumentSymbol(symbol, client, textDocument) {\n  return {\n    name: symbol.name,\n    detail: symbol.detail || \"\",\n    kind: toMonacoSymbolKind(symbol.kind),\n    tags: symbol.tags?.map((tag) => toMonacoSymbolTag(tag)).filter((t) => t !== void 0) || [],\n    range: client.bridge.translateBackRange(textDocument, symbol.range).range,\n    selectionRange: client.bridge.translateBackRange(textDocument, symbol.selectionRange).range,\n    children: symbol.children?.map((child) => toMonacoDocumentSymbol(child, client, textDocument)) || []\n  };\n}\nfunction toMonacoSymbolInformation(symbol, client) {\n  return {\n    name: symbol.name,\n    detail: \"\",\n    kind: toMonacoSymbolKind(symbol.kind),\n    tags: symbol.tags?.map((tag) => toMonacoSymbolTag(tag)).filter((t) => t !== void 0) || [],\n    range: client.bridge.translateBackRange({ uri: symbol.location.uri }, symbol.location.range).range,\n    selectionRange: client.bridge.translateBackRange({ uri: symbol.location.uri }, symbol.location.range).range,\n    children: []\n  };\n}\nvar LspRenameFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { rename: {\n      dynamicRegistration: true,\n      prepareSupport: true\n    } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentRename, true, (capability) => {\n      return languages.registerRenameProvider(toMonacoLanguageSelector(capability.documentSelector), new LspRenameProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspRenameProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideRenameEdits(model, position, newName, token) {\n    const translated = this._client.bridge.translate(model, position);\n    const result = await this._client.server.textDocumentRename({\n      textDocument: translated.textDocument,\n      position: translated.position,\n      newName\n    });\n    if (!result) return null;\n    return toMonacoWorkspaceEdit$1(result, this._client);\n  }\n  async resolveRenameLocation(model, position, token) {\n    if (!this._capabilities.prepareProvider) return null;\n    const translated = this._client.bridge.translate(model, position);\n    const result = await this._client.server.textDocumentPrepareRename({\n      textDocument: translated.textDocument,\n      position: translated.position\n    });\n    if (!result) return null;\n    if (\"range\" in result && \"placeholder\" in result) return {\n      range: this._client.bridge.translateBackRange(translated.textDocument, result.range).range,\n      text: result.placeholder\n    };\n    else if (\"defaultBehavior\" in result) return null;\n    else if (\"start\" in result && \"end\" in result) {\n      const range = this._client.bridge.translateBackRange(translated.textDocument, result).range;\n      return {\n        range,\n        text: model.getValueInRange(range)\n      };\n    }\n    return null;\n  }\n};\nfunction toMonacoWorkspaceEdit$1(edit, client) {\n  const edits = [];\n  if (edit.changes) for (const uri in edit.changes) {\n    const textEdits = edit.changes[uri];\n    for (const textEdit of textEdits) {\n      const translated = client.bridge.translateBackRange({ uri }, textEdit.range);\n      edits.push({\n        resource: translated.textModel.uri,\n        versionId: void 0,\n        textEdit: {\n          range: translated.range,\n          text: textEdit.newText\n        }\n      });\n    }\n  }\n  if (edit.documentChanges) {\n    for (const change of edit.documentChanges) if (\"textDocument\" in change) {\n      const uri = change.textDocument.uri;\n      for (const textEdit of change.edits) {\n        const translated = client.bridge.translateBackRange({ uri }, textEdit.range);\n        edits.push({\n          resource: translated.textModel.uri,\n          versionId: change.textDocument.version,\n          textEdit: {\n            range: translated.range,\n            text: textEdit.newText\n          }\n        });\n      }\n    }\n  }\n  return { edits };\n}\nvar LspCodeActionFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { codeAction: {\n      dynamicRegistration: true,\n      codeActionLiteralSupport: { codeActionKind: { valueSet: Array.from(lspCodeActionKindToMonacoCodeActionKind.keys()) } },\n      isPreferredSupport: true,\n      disabledSupport: true,\n      dataSupport: true,\n      resolveSupport: { properties: [\"edit\"] }\n    } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentCodeAction, true, (capability) => {\n      return languages.registerCodeActionProvider(toMonacoLanguageSelector(capability.documentSelector), new LspCodeActionProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspCodeActionProvider = class {\n  constructor(_client, _capabilities) {\n    __publicField(this, \"resolveCodeAction\");\n    this._client = _client;\n    this._capabilities = _capabilities;\n    if (_capabilities.resolveProvider) this.resolveCodeAction = async (codeAction, token) => {\n      if (codeAction._lspAction) {\n        const resolved = await this._client.server.codeActionResolve(codeAction._lspAction);\n        if (resolved.edit) codeAction.edit = toMonacoWorkspaceEdit(resolved.edit, this._client);\n        if (resolved.command) codeAction.command = toMonacoCommand(resolved.command);\n      }\n      return codeAction;\n    };\n  }\n  async provideCodeActions(model, range, context, token) {\n    const translated = this._client.bridge.translate(model, range.getStartPosition());\n    const result = await this._client.server.textDocumentCodeAction({\n      textDocument: translated.textDocument,\n      range: this._client.bridge.translateRange(model, range),\n      context: {\n        diagnostics: context.markers.map((marker) => ({\n          range: this._client.bridge.translateRange(model, Range.lift(marker)),\n          message: marker.message,\n          severity: toLspDiagnosticSeverity(marker.severity)\n        })),\n        triggerKind: toLspCodeActionTriggerKind(context.trigger)\n      }\n    });\n    if (!result) return null;\n    return {\n      actions: (Array.isArray(result) ? result : [result]).map((action) => {\n        if (\"title\" in action && !(\"kind\" in action)) {\n          const cmd = action;\n          return {\n            title: cmd.title,\n            command: toMonacoCommand(cmd)\n          };\n        } else {\n          const codeAction = action;\n          return {\n            title: codeAction.title,\n            kind: toMonacoCodeActionKind(codeAction.kind),\n            isPreferred: codeAction.isPreferred,\n            disabled: codeAction.disabled?.reason,\n            edit: codeAction.edit ? toMonacoWorkspaceEdit(codeAction.edit, this._client) : void 0,\n            command: toMonacoCommand(codeAction.command),\n            _lspAction: codeAction\n          };\n        }\n      }),\n      dispose: () => {\n      }\n    };\n  }\n};\nfunction toMonacoWorkspaceEdit(edit, client) {\n  const edits = [];\n  if (edit.changes) for (const uri in edit.changes) {\n    const textEdits = edit.changes[uri];\n    for (const textEdit of textEdits) {\n      const translated = client.bridge.translateBackRange({ uri }, textEdit.range);\n      edits.push({\n        resource: translated.textModel.uri,\n        versionId: void 0,\n        textEdit: {\n          range: translated.range,\n          text: textEdit.newText\n        }\n      });\n    }\n  }\n  if (edit.documentChanges) {\n    for (const change of edit.documentChanges) if (\"textDocument\" in change) {\n      const uri = change.textDocument.uri;\n      for (const textEdit of change.edits) {\n        const translated = client.bridge.translateBackRange({ uri }, textEdit.range);\n        edits.push({\n          resource: translated.textModel.uri,\n          versionId: change.textDocument.version ?? void 0,\n          textEdit: {\n            range: translated.range,\n            text: textEdit.newText\n          }\n        });\n      }\n    }\n  }\n  return { edits };\n}\nvar LspCodeLensFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { codeLens: { dynamicRegistration: true } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentCodeLens, true, (capability) => {\n      return languages.registerCodeLensProvider(toMonacoLanguageSelector(capability.documentSelector), new LspCodeLensProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspCodeLensProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideCodeLenses(model, token) {\n    const translated = this._client.bridge.translate(model, new Position(1, 1));\n    const result = await this._client.server.textDocumentCodeLens({ textDocument: translated.textDocument });\n    if (!result) return null;\n    return {\n      lenses: result.map((lens) => {\n        return {\n          range: assertTargetTextModel(this._client.bridge.translateBackRange(translated.textDocument, lens.range), model).range,\n          command: toMonacoCommand(lens.command),\n          _lspCodeLens: lens\n        };\n      }),\n      dispose: () => {\n      }\n    };\n  }\n  async resolveCodeLens(model, codeLens, token) {\n    if (!this._capabilities.resolveProvider || !codeLens._lspCodeLens) return codeLens;\n    const resolved = await this._client.server.codeLensResolve(codeLens._lspCodeLens);\n    if (resolved.command) codeLens.command = {\n      id: resolved.command.command,\n      title: resolved.command.title,\n      arguments: resolved.command.arguments\n    };\n    return codeLens;\n  }\n};\nvar LspDocumentLinkFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { documentLink: {\n      dynamicRegistration: true,\n      tooltipSupport: true\n    } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentDocumentLink, true, (capability) => {\n      return languages.registerLinkProvider(toMonacoLanguageSelector(capability.documentSelector), new LspDocumentLinkProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspDocumentLinkProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideLinks(model, token) {\n    const translated = this._client.bridge.translate(model, new Position(1, 1));\n    const result = await this._client.server.textDocumentDocumentLink({ textDocument: translated.textDocument });\n    if (!result) return null;\n    return { links: result.map((link) => ({\n      range: this._client.bridge.translateBackRange(translated.textDocument, link.range).range,\n      url: link.target,\n      tooltip: link.tooltip\n    })) };\n  }\n  async resolveLink(link, token) {\n    if (!this._capabilities.resolveProvider) return link;\n    return link;\n  }\n};\nvar LspFormattingFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { formatting: { dynamicRegistration: true } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentFormatting, true, (capability) => {\n      return languages.registerDocumentFormattingEditProvider(toMonacoLanguageSelector(capability.documentSelector), new LspDocumentFormattingProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspDocumentFormattingProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideDocumentFormattingEdits(model, options, token) {\n    const translated = this._client.bridge.translate(model, new Position(1, 1));\n    const result = await this._client.server.textDocumentFormatting({\n      textDocument: translated.textDocument,\n      options: {\n        tabSize: options.tabSize,\n        insertSpaces: options.insertSpaces\n      }\n    });\n    if (!result) return null;\n    return result.map((edit) => ({\n      range: this._client.bridge.translateBackRange(translated.textDocument, edit.range).range,\n      text: edit.newText\n    }));\n  }\n};\nvar LspRangeFormattingFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { rangeFormatting: { dynamicRegistration: true } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentRangeFormatting, true, (capability) => {\n      return languages.registerDocumentRangeFormattingEditProvider(toMonacoLanguageSelector(capability.documentSelector), new LspDocumentRangeFormattingProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspDocumentRangeFormattingProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideDocumentRangeFormattingEdits(model, range, options, token) {\n    const translated = this._client.bridge.translate(model, range.getStartPosition());\n    const result = await this._client.server.textDocumentRangeFormatting({\n      textDocument: translated.textDocument,\n      range: this._client.bridge.translateRange(model, range),\n      options: {\n        tabSize: options.tabSize,\n        insertSpaces: options.insertSpaces\n      }\n    });\n    if (!result) return null;\n    return result.map((edit) => ({\n      range: this._client.bridge.translateBackRange(translated.textDocument, edit.range).range,\n      text: edit.newText\n    }));\n  }\n};\nvar LspOnTypeFormattingFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { onTypeFormatting: { dynamicRegistration: true } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentOnTypeFormatting, true, (capability) => {\n      return languages.registerOnTypeFormattingEditProvider(toMonacoLanguageSelector(capability.documentSelector), new LspOnTypeFormattingProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspOnTypeFormattingProvider = class {\n  constructor(_client, _capabilities) {\n    __publicField(this, \"autoFormatTriggerCharacters\");\n    this._client = _client;\n    this._capabilities = _capabilities;\n    this.autoFormatTriggerCharacters = [_capabilities.firstTriggerCharacter, ..._capabilities.moreTriggerCharacter || []];\n  }\n  async provideOnTypeFormattingEdits(model, position, ch, options, token) {\n    const translated = this._client.bridge.translate(model, position);\n    const result = await this._client.server.textDocumentOnTypeFormatting({\n      textDocument: translated.textDocument,\n      position: translated.position,\n      ch,\n      options: {\n        tabSize: options.tabSize,\n        insertSpaces: options.insertSpaces\n      }\n    });\n    if (!result) return null;\n    return result.map((edit) => ({\n      range: this._client.bridge.translateBackRange(translated.textDocument, edit.range).range,\n      text: edit.newText\n    }));\n  }\n};\nvar LspFoldingRangeFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { foldingRange: {\n      dynamicRegistration: true,\n      rangeLimit: 5e3,\n      lineFoldingOnly: false,\n      foldingRangeKind: { valueSet: [\n        FoldingRangeKind.Comment,\n        FoldingRangeKind.Imports,\n        FoldingRangeKind.Region\n      ] }\n    } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentFoldingRange, true, (capability) => {\n      return languages.registerFoldingRangeProvider(toMonacoLanguageSelector(capability.documentSelector), new LspFoldingRangeProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspFoldingRangeProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideFoldingRanges(model, context, token) {\n    const translated = this._client.bridge.translate(model, new Position(1, 1));\n    const result = await this._client.server.textDocumentFoldingRange({ textDocument: translated.textDocument });\n    if (!result) return null;\n    return result.map((range) => ({\n      start: range.startLine + 1,\n      end: range.endLine + 1,\n      kind: toMonacoFoldingRangeKind(range.kind)\n    }));\n  }\n};\nvar LspSelectionRangeFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { selectionRange: { dynamicRegistration: true } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentSelectionRange, true, (capability) => {\n      return languages.registerSelectionRangeProvider(toMonacoLanguageSelector(capability.documentSelector), new LspSelectionRangeProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspSelectionRangeProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  async provideSelectionRanges(model, positions, token) {\n    const translated = this._client.bridge.translate(model, positions[0]);\n    const result = await this._client.server.textDocumentSelectionRange({\n      textDocument: translated.textDocument,\n      positions: positions.map((pos) => this._client.bridge.translate(model, pos).position)\n    });\n    if (!result) return null;\n    return result.map((selRange) => this.convertSelectionRange(selRange, translated.textDocument));\n  }\n  convertSelectionRange(range, textDocument) {\n    const result = [];\n    let current = range;\n    while (current) {\n      result.push({ range: this._client.bridge.translateBackRange(textDocument, current.range).range });\n      current = current.parent;\n    }\n    return result;\n  }\n};\nvar LspInlayHintsFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    __publicField(this, \"_providers\", /* @__PURE__ */ new Set());\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({\n      textDocument: { inlayHint: {\n        dynamicRegistration: true,\n        resolveSupport: { properties: [\n          \"tooltip\",\n          \"textEdits\",\n          \"label.tooltip\",\n          \"label.location\",\n          \"label.command\"\n        ] }\n      } },\n      workspace: { inlayHint: { refreshSupport: true } }\n    }));\n    this._register(this._connection.connection.registerRequestHandler(api.client.workspaceInlayHintRefresh, async () => {\n      for (const provider of this._providers) provider.refresh();\n      return { ok: null };\n    }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentInlayHint, true, (capability) => {\n      const provider = new LspInlayHintsProvider(this._connection, capability);\n      this._providers.add(provider);\n      const disposable = languages.registerInlayHintsProvider(toMonacoLanguageSelector(capability.documentSelector), provider);\n      return { dispose: () => {\n        this._providers.delete(provider);\n        disposable.dispose();\n      } };\n    }));\n  }\n};\nvar LspInlayHintsProvider = class {\n  constructor(_client, _capabilities) {\n    __publicField(this, \"_onDidChangeInlayHints\", new Emitter());\n    __publicField(this, \"onDidChangeInlayHints\", this._onDidChangeInlayHints.event);\n    __publicField(this, \"resolveInlayHint\");\n    this._client = _client;\n    this._capabilities = _capabilities;\n    if (_capabilities.resolveProvider) this.resolveInlayHint = async (hint, token) => {\n      const resolved = await this._client.server.inlayHintResolve(hint._lspInlayHint);\n      if (resolved.tooltip) hint.tooltip = toMonacoTooltip(resolved.tooltip);\n      if (resolved.label !== hint._lspInlayHint.label) hint.label = toLspInlayHintLabel(resolved.label);\n      if (resolved.textEdits) hint.textEdits = resolved.textEdits.map((edit) => {\n        return {\n          range: this._client.bridge.translateBackRange({ uri: hint._targetUri }, edit.range).range,\n          text: edit.newText\n        };\n      });\n      return hint;\n    };\n  }\n  refresh() {\n    this._onDidChangeInlayHints.fire();\n  }\n  async provideInlayHints(model, range, token) {\n    const translated = this._client.bridge.translate(model, range.getStartPosition());\n    const result = await retryOnContentModified(async () => await this._client.server.textDocumentInlayHint({\n      textDocument: translated.textDocument,\n      range: this._client.bridge.translateRange(model, range)\n    }));\n    if (!result) return null;\n    return {\n      hints: result.map((hint) => {\n        return {\n          label: toLspInlayHintLabel(hint.label),\n          position: assertTargetTextModel(this._client.bridge.translateBack(translated.textDocument, hint.position), model).position,\n          kind: toMonacoInlayHintKind(hint.kind),\n          tooltip: toMonacoTooltip(hint.tooltip),\n          paddingLeft: hint.paddingLeft,\n          paddingRight: hint.paddingRight,\n          textEdits: hint.textEdits?.map((edit) => ({\n            range: assertTargetTextModel(this._client.bridge.translateBackRange(translated.textDocument, edit.range), model).range,\n            text: edit.newText\n          })),\n          _lspInlayHint: hint,\n          _targetUri: translated.textDocument.uri\n        };\n      }),\n      dispose: () => {\n      }\n    };\n  }\n};\nasync function retryOnContentModified(cb) {\n  for (let triesLeft = 3; ; triesLeft--) try {\n    return await cb();\n  } catch (e) {\n    if (e.message === \"content modified\" && triesLeft > 0) continue;\n    throw e;\n  }\n}\nfunction toLspInlayHintLabel(label) {\n  if (typeof label === \"string\") return label;\n  return label.map((part) => {\n    const monacoLabelPart = {\n      label: part.value,\n      tooltip: toMonacoTooltip(part.tooltip),\n      command: toMonacoCommand(part.command)\n    };\n    if (part.location) monacoLabelPart.location = {\n      uri: Uri.parse(part.location.uri),\n      range: new Range(part.location.range.start.line + 1, part.location.range.start.character + 1, part.location.range.end.line + 1, part.location.range.end.character + 1)\n    };\n    return monacoLabelPart;\n  });\n}\nfunction toMonacoTooltip(tooltip) {\n  if (!tooltip) return;\n  if (typeof tooltip === \"string\") return tooltip;\n  return {\n    value: tooltip.value,\n    isTrusted: true\n  };\n}\nvar LspSemanticTokensFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: { semanticTokens: {\n      dynamicRegistration: true,\n      requests: {\n        range: true,\n        full: { delta: true }\n      },\n      tokenTypes: [\n        \"namespace\",\n        \"type\",\n        \"class\",\n        \"enum\",\n        \"interface\",\n        \"struct\",\n        \"typeParameter\",\n        \"parameter\",\n        \"variable\",\n        \"property\",\n        \"enumMember\",\n        \"event\",\n        \"function\",\n        \"method\",\n        \"macro\",\n        \"keyword\",\n        \"modifier\",\n        \"comment\",\n        \"string\",\n        \"number\",\n        \"regexp\",\n        \"operator\",\n        \"decorator\"\n      ],\n      tokenModifiers: [\n        \"declaration\",\n        \"definition\",\n        \"readonly\",\n        \"static\",\n        \"deprecated\",\n        \"abstract\",\n        \"async\",\n        \"modification\",\n        \"documentation\",\n        \"defaultLibrary\"\n      ],\n      formats: [TokenFormat.Relative],\n      overlappingTokenSupport: false,\n      multilineTokenSupport: true\n    } } }));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentSemanticTokensFull, true, (capability) => {\n      return languages.registerDocumentSemanticTokensProvider(toMonacoLanguageSelector(capability.documentSelector), new LspSemanticTokensProvider(this._connection, capability));\n    }));\n  }\n};\nvar LspSemanticTokensProvider = class {\n  constructor(_client, _capabilities) {\n    this._client = _client;\n    this._capabilities = _capabilities;\n  }\n  getLegend() {\n    return {\n      tokenTypes: this._capabilities.legend.tokenTypes,\n      tokenModifiers: this._capabilities.legend.tokenModifiers\n    };\n  }\n  releaseDocumentSemanticTokens(resultId) {\n  }\n  async provideDocumentSemanticTokens(model, lastResultId, token) {\n    const translated = this._client.bridge.translate(model, model.getPositionAt(0));\n    const full = this._capabilities.full;\n    if (lastResultId && full && typeof full === \"object\" && full.delta) {\n      const deltaResult = await this._client.server.textDocumentSemanticTokensFullDelta({\n        textDocument: translated.textDocument,\n        previousResultId: lastResultId\n      });\n      if (!deltaResult) return null;\n      if (\"edits\" in deltaResult) return {\n        resultId: deltaResult.resultId,\n        edits: deltaResult.edits.map((edit) => ({\n          start: edit.start,\n          deleteCount: edit.deleteCount,\n          data: edit.data ? new Uint32Array(edit.data) : void 0\n        }))\n      };\n      else return {\n        resultId: deltaResult.resultId,\n        data: new Uint32Array(deltaResult.data)\n      };\n    }\n    const result = await this._client.server.textDocumentSemanticTokensFull({ textDocument: translated.textDocument });\n    if (!result) return null;\n    return {\n      resultId: result.resultId,\n      data: new Uint32Array(result.data)\n    };\n  }\n  async provideDocumentSemanticTokensEdits(model, previousResultId, token) {\n    return this.provideDocumentSemanticTokens(model, previousResultId, token);\n  }\n};\nvar LspDiagnosticsFeature = class extends Disposable {\n  constructor(_connection) {\n    super();\n    __publicField(this, \"_diagnosticsMarkerOwner\", \"lsp\");\n    __publicField(this, \"_pullDiagnosticProviders\", /* @__PURE__ */ new Map());\n    this._connection = _connection;\n    this._register(this._connection.capabilities.addStaticClientCapabilities({ textDocument: {\n      publishDiagnostics: {\n        relatedInformation: true,\n        tagSupport: { valueSet: [...lspDiagnosticTagToMonacoMarkerTag.keys()] },\n        versionSupport: true,\n        codeDescriptionSupport: true,\n        dataSupport: true\n      },\n      diagnostic: {\n        dynamicRegistration: true,\n        relatedDocumentSupport: true\n      }\n    } }));\n    debugger;\n    this._register(this._connection.connection.registerNotificationHandler(api.client.textDocumentPublishDiagnostics, (params) => this._handlePublishDiagnostics(params)));\n    this._register(this._connection.capabilities.registerCapabilityHandler(capabilities.textDocumentDiagnostic, true, (capability) => {\n      const disposables = new DisposableStore();\n      for (const model of editor.getModels()) this._addPullDiagnosticProvider(model, capability, disposables);\n      disposables.add(editor.onDidCreateModel((model) => {\n        this._addPullDiagnosticProvider(model, capability, disposables);\n      }));\n      return disposables;\n    }));\n  }\n  _addPullDiagnosticProvider(model, capability, disposables) {\n    model.getLanguageId();\n    if (!matchesDocumentSelector(model, capability.documentSelector)) return;\n    const provider = new ModelDiagnosticProvider(model, this._connection, this._diagnosticsMarkerOwner, capability);\n    this._pullDiagnosticProviders.set(model, provider);\n    disposables.add(provider);\n    disposables.add(model.onWillDispose(() => {\n      this._pullDiagnosticProviders.delete(model);\n    }));\n  }\n  _handlePublishDiagnostics(params) {\n    const uri = params.uri;\n    try {\n      const model = this._connection.bridge.translateBack({ uri }, {\n        line: 0,\n        character: 0\n      }).textModel;\n      if (!model || model.isDisposed()) return;\n      const markers = params.diagnostics.map((diagnostic) => toDiagnosticMarker(diagnostic));\n      editor.setModelMarkers(model, this._diagnosticsMarkerOwner, markers);\n    } catch (error) {\n      console.debug(`Could not set diagnostics for ${uri}:`, error);\n    }\n  }\n};\nvar ModelDiagnosticProvider = class extends Disposable {\n  constructor(_model, _connection, _markerOwner, _capability) {\n    super();\n    __publicField(this, \"_updateHandle\");\n    __publicField(this, \"_previousResultId\");\n    this._model = _model;\n    this._connection = _connection;\n    this._markerOwner = _markerOwner;\n    this._capability = _capability;\n    this._register(this._model.onDidChangeContent(() => {\n      this._scheduleDiagnosticUpdate();\n    }));\n    this._scheduleDiagnosticUpdate();\n  }\n  _scheduleDiagnosticUpdate() {\n    if (this._updateHandle !== void 0) clearTimeout(this._updateHandle);\n    this._updateHandle = window.setTimeout(() => {\n      this._updateHandle = void 0;\n      this._requestDiagnostics();\n    }, 500);\n  }\n  async _requestDiagnostics() {\n    if (this._model.isDisposed()) return;\n    try {\n      const translated = this._connection.bridge.translate(this._model, new Position(1, 1));\n      const result = await this._connection.server.textDocumentDiagnostic({\n        textDocument: translated.textDocument,\n        identifier: this._capability.identifier,\n        previousResultId: this._previousResultId\n      });\n      if (this._model.isDisposed()) return;\n      this._handleDiagnosticReport(result);\n    } catch (error) {\n      console.error(\"Error requesting diagnostics:\", error);\n    }\n  }\n  _handleDiagnosticReport(report) {\n    if (report.kind === \"full\") {\n      this._previousResultId = report.resultId;\n      const markers = report.items.map((diagnostic) => toDiagnosticMarker(diagnostic));\n      editor.setModelMarkers(this._model, this._markerOwner, markers);\n      if (\"relatedDocuments\" in report && report.relatedDocuments) this._handleRelatedDocuments(report.relatedDocuments);\n    } else if (report.kind === \"unchanged\") this._previousResultId = report.resultId;\n  }\n  _handleRelatedDocuments(relatedDocuments) {\n    for (const [uri, report] of Object.entries(relatedDocuments)) try {\n      const model = this._connection.bridge.translateBack({ uri }, {\n        line: 0,\n        character: 0\n      }).textModel;\n      if (!model || model.isDisposed()) continue;\n      if (report.kind === \"full\") {\n        const markers = report.items.map((diagnostic) => toDiagnosticMarker(diagnostic));\n        editor.setModelMarkers(model, this._markerOwner, markers);\n      }\n    } catch (error) {\n      console.debug(`Could not set related diagnostics for ${uri}:`, error);\n    }\n  }\n  dispose() {\n    if (this._updateHandle !== void 0) {\n      clearTimeout(this._updateHandle);\n      this._updateHandle = void 0;\n    }\n    super.dispose();\n  }\n};\nvar LspConnection = class {\n  constructor(server, bridge, capabilities$1, connection) {\n    this.server = server;\n    this.bridge = bridge;\n    this.capabilities = capabilities$1;\n    this.connection = connection;\n  }\n};\nvar LspCapabilitiesRegistry = class extends Disposable {\n  constructor(_connection) {\n    super();\n    __publicField(this, \"_staticCapabilities\", /* @__PURE__ */ new Set());\n    __publicField(this, \"_dynamicFromStatic\", DynamicFromStaticOptions.create());\n    __publicField(this, \"_registrations\", /* @__PURE__ */ new Map());\n    __publicField(this, \"_serverCapabilities\");\n    this._connection = _connection;\n    this._register(this._connection.registerRequestHandler(api.client.clientRegisterCapability, async (params) => {\n      for (const registration of params.registrations) {\n        const capability = getCapabilityByMethod(registration.method);\n        const r = new CapabilityRegistration(registration.id, capability, registration.registerOptions, false);\n        this._registerCapabilityOptions(r);\n      }\n      return { ok: null };\n    }));\n    this._register(this._connection.registerRequestHandler(api.client.clientUnregisterCapability, async (params) => {\n      for (const unregistration of params.unregisterations) {\n        const capability = getCapabilityByMethod(unregistration.method);\n        const info = this._registrations.get(capability);\n        const handlerInfo = info?.registrations.get(unregistration.id);\n        if (!handlerInfo) throw new Error(`No registration for method ${unregistration.method} with id ${unregistration.id}`);\n        handlerInfo?.handlerDisposables.forEach((d) => d.dispose());\n        info?.registrations.delete(unregistration.id);\n      }\n      return { ok: null };\n    }));\n  }\n  _registerCapabilityOptions(registration) {\n    let registrationForMethod = this._registrations.get(registration.capability);\n    if (!registrationForMethod) {\n      registrationForMethod = new CapabilityInfo();\n      this._registrations.set(registration.capability, registrationForMethod);\n    }\n    if (registrationForMethod.registrations.has(registration.id)) throw new Error(`Handler for method ${registration.capability.method} with id ${registration.id} already registered`);\n    registrationForMethod.registrations.set(registration.id, registration);\n    for (const h of registrationForMethod.handlers) {\n      if (!h.handleStaticCapability && registration.isFromStatic) continue;\n      registration.handlerDisposables.set(h, h.handler(registration.options));\n    }\n  }\n  setServerCapabilities(serverCapabilities) {\n    if (this._serverCapabilities) throw new Error(\"Server capabilities already set\");\n    this._serverCapabilities = serverCapabilities;\n    for (const cap of Object.values(capabilities)) {\n      const options = this._dynamicFromStatic.getOptions(cap, serverCapabilities);\n      if (options) this._registerCapabilityOptions(new CapabilityRegistration(cap.method, cap, options, true));\n    }\n  }\n  getClientCapabilities() {\n    const result = {};\n    for (const c of this._staticCapabilities) deepAssign(result, c.cap);\n    return result;\n  }\n  addStaticClientCapabilities(capability) {\n    const obj = { cap: capability };\n    this._staticCapabilities.add(obj);\n    return { dispose: () => {\n      this._staticCapabilities.delete(obj);\n    } };\n  }\n  registerCapabilityHandler(capability, handleStaticCapability, handler) {\n    let info = this._registrations.get(capability);\n    if (!info) {\n      info = new CapabilityInfo();\n      this._registrations.set(capability, info);\n    }\n    const handlerInfo = new CapabilityHandler(capability, handleStaticCapability, handler);\n    info.handlers.add(handlerInfo);\n    for (const registration of info.registrations.values()) {\n      if (!handlerInfo.handleStaticCapability && registration.isFromStatic) continue;\n      registration.handlerDisposables.set(handlerInfo, handler(registration.options));\n    }\n    return { dispose: () => {\n      info.handlers.delete(handlerInfo);\n      for (const registration of info.registrations.values()) {\n        const disposable = registration.handlerDisposables.get(handlerInfo);\n        if (disposable) {\n          disposable.dispose();\n          registration.handlerDisposables.delete(handlerInfo);\n        }\n      }\n    } };\n  }\n};\nvar CapabilityHandler = class {\n  constructor(capability, handleStaticCapability, handler) {\n    this.capability = capability;\n    this.handleStaticCapability = handleStaticCapability;\n    this.handler = handler;\n  }\n};\nvar CapabilityRegistration = class {\n  constructor(id, capability, options, isFromStatic) {\n    __publicField(this, \"handlerDisposables\", /* @__PURE__ */ new Map());\n    this.id = id;\n    this.capability = capability;\n    this.options = options;\n    this.isFromStatic = isFromStatic;\n  }\n};\nconst capabilitiesByMethod = new Map([...Object.values(capabilities)].map((c) => [c.method, c]));\nfunction getCapabilityByMethod(method) {\n  const c = capabilitiesByMethod.get(method);\n  if (!c) throw new Error(`No capability found for method ${method}`);\n  return c;\n}\nvar CapabilityInfo = class {\n  constructor() {\n    __publicField(this, \"handlers\", /* @__PURE__ */ new Set());\n    __publicField(this, \"registrations\", /* @__PURE__ */ new Map());\n  }\n};\nvar DynamicFromStaticOptions = class DynamicFromStaticOptions2 {\n  constructor() {\n    __publicField(this, \"_mappings\", /* @__PURE__ */ new Map());\n  }\n  static create() {\n    const o = new DynamicFromStaticOptions2();\n    o.set(capabilities.textDocumentDidChange, (s) => {\n      if (s.textDocumentSync === void 0) return;\n      if (typeof s.textDocumentSync === \"object\") return {\n        syncKind: s.textDocumentSync.change ?? TextDocumentSyncKind.None,\n        documentSelector: null\n      };\n      else return {\n        syncKind: s.textDocumentSync,\n        documentSelector: null\n      };\n    });\n    o.set(capabilities.textDocumentCompletion, (s) => s.completionProvider);\n    o.set(capabilities.textDocumentHover, (s) => s.hoverProvider);\n    o.set(capabilities.textDocumentSignatureHelp, (s) => s.signatureHelpProvider);\n    o.set(capabilities.textDocumentDefinition, (s) => s.definitionProvider);\n    o.set(capabilities.textDocumentReferences, (s) => s.referencesProvider);\n    o.set(capabilities.textDocumentDocumentHighlight, (s) => s.documentHighlightProvider);\n    o.set(capabilities.textDocumentDocumentSymbol, (s) => s.documentSymbolProvider);\n    o.set(capabilities.textDocumentCodeAction, (s) => s.codeActionProvider);\n    o.set(capabilities.textDocumentCodeLens, (s) => s.codeLensProvider);\n    o.set(capabilities.textDocumentDocumentLink, (s) => s.documentLinkProvider);\n    o.set(capabilities.textDocumentFormatting, (s) => s.documentFormattingProvider);\n    o.set(capabilities.textDocumentRangeFormatting, (s) => s.documentRangeFormattingProvider);\n    o.set(capabilities.textDocumentOnTypeFormatting, (s) => s.documentOnTypeFormattingProvider);\n    o.set(capabilities.textDocumentRename, (s) => s.renameProvider);\n    o.set(capabilities.textDocumentFoldingRange, (s) => s.foldingRangeProvider);\n    o.set(capabilities.textDocumentDeclaration, (s) => s.declarationProvider);\n    o.set(capabilities.textDocumentTypeDefinition, (s) => s.typeDefinitionProvider);\n    o.set(capabilities.textDocumentImplementation, (s) => s.implementationProvider);\n    o.set(capabilities.textDocumentDocumentColor, (s) => s.colorProvider);\n    o.set(capabilities.textDocumentSelectionRange, (s) => s.selectionRangeProvider);\n    o.set(capabilities.textDocumentLinkedEditingRange, (s) => s.linkedEditingRangeProvider);\n    o.set(capabilities.textDocumentPrepareCallHierarchy, (s) => s.callHierarchyProvider);\n    o.set(capabilities.textDocumentSemanticTokensFull, (s) => s.semanticTokensProvider);\n    o.set(capabilities.textDocumentInlayHint, (s) => s.inlayHintProvider);\n    o.set(capabilities.textDocumentInlineValue, (s) => s.inlineValueProvider);\n    o.set(capabilities.textDocumentDiagnostic, (s) => s.diagnosticProvider);\n    o.set(capabilities.textDocumentMoniker, (s) => s.monikerProvider);\n    o.set(capabilities.textDocumentPrepareTypeHierarchy, (s) => s.typeHierarchyProvider);\n    o.set(capabilities.workspaceSymbol, (s) => s.workspaceSymbolProvider);\n    o.set(capabilities.workspaceExecuteCommand, (s) => s.executeCommandProvider);\n    return o;\n  }\n  set(capability, getOptionsFromStatic) {\n    if (this._mappings.has(capability.method)) throw new Error(`Capability for method ${capability.method} already registered`);\n    this._mappings.set(capability.method, getOptionsFromStatic);\n  }\n  getOptions(capability, serverCapabilities) {\n    const getter = this._mappings.get(capability.method);\n    if (!getter) return;\n    return getter(serverCapabilities);\n  }\n};\nfunction deepAssign(target, source) {\n  for (const key of Object.keys(source)) {\n    const srcValue = source[key];\n    if (srcValue === void 0) continue;\n    const tgtValue = target[key];\n    if (tgtValue === void 0) {\n      target[key] = srcValue;\n      continue;\n    }\n    if (typeof srcValue !== \"object\" || srcValue === null) {\n      target[key] = srcValue;\n      continue;\n    }\n    if (typeof tgtValue !== \"object\" || tgtValue === null) {\n      target[key] = srcValue;\n      continue;\n    }\n    deepAssign(tgtValue, srcValue);\n  }\n}\nvar TextDocumentSynchronizer = class extends Disposable {\n  constructor(_server, _capabilities) {\n    super();\n    __publicField(this, \"_managedModels\", /* @__PURE__ */ new Map());\n    __publicField(this, \"_managedModelsReverse\", /* @__PURE__ */ new Map());\n    __publicField(this, \"_started\", false);\n    this._server = _server;\n    this._capabilities = _capabilities;\n    this._register(this._capabilities.addStaticClientCapabilities({ textDocument: { synchronization: {\n      dynamicRegistration: true,\n      willSave: false,\n      willSaveWaitUntil: false,\n      didSave: false\n    } } }));\n    this._register(_capabilities.registerCapabilityHandler(capabilities.textDocumentDidChange, true, (e) => {\n      if (this._started) return { dispose: () => {\n      } };\n      this._started = true;\n      this._register(editor.onDidCreateModel((m) => {\n        this._getOrCreateManagedModel(m);\n      }));\n      for (const m of editor.getModels()) this._getOrCreateManagedModel(m);\n      return { dispose: () => {\n      } };\n    }));\n  }\n  _getOrCreateManagedModel(m) {\n    if (!this._started) throw new Error(\"Not started\");\n    const uriStr = m.uri.toString(true).toLowerCase();\n    let mm = this._managedModels.get(m);\n    if (!mm) {\n      mm = new ManagedModel(m, this._server);\n      this._managedModels.set(m, mm);\n      this._managedModelsReverse.set(uriStr, m);\n    }\n    m.onWillDispose(() => {\n      mm.dispose();\n      this._managedModels.delete(m);\n      this._managedModelsReverse.delete(uriStr);\n    });\n    return mm;\n  }\n  translateBack(textDocument, position) {\n    const uri = textDocument.uri.toLowerCase();\n    const textModel = this._managedModelsReverse.get(uri);\n    if (!textModel) throw new Error(`No text model for uri ${uri}`);\n    return {\n      textModel,\n      position: new Position(position.line + 1, position.character + 1)\n    };\n  }\n  translateBackRange(textDocument, range) {\n    const uri = textDocument.uri.toLowerCase();\n    const textModel = this._managedModelsReverse.get(uri);\n    if (!textModel) throw new Error(`No text model for uri ${uri}`);\n    return {\n      textModel,\n      range: new Range(range.start.line + 1, range.start.character + 1, range.end.line + 1, range.end.character + 1)\n    };\n  }\n  translate(textModel, monacoPos) {\n    return {\n      textDocument: { uri: textModel.uri.toString(true) },\n      position: {\n        line: monacoPos.lineNumber - 1,\n        character: monacoPos.column - 1\n      }\n    };\n  }\n  translateRange(textModel, monacoRange) {\n    return {\n      start: {\n        line: monacoRange.startLineNumber - 1,\n        character: monacoRange.startColumn - 1\n      },\n      end: {\n        line: monacoRange.endLineNumber - 1,\n        character: monacoRange.endColumn - 1\n      }\n    };\n  }\n};\nvar ManagedModel = class extends Disposable {\n  constructor(_textModel, _api) {\n    super();\n    this._textModel = _textModel;\n    this._api = _api;\n    const uri = _textModel.uri.toString(true).toLowerCase();\n    this._api.textDocumentDidOpen({ textDocument: {\n      languageId: _textModel.getLanguageId(),\n      uri,\n      version: _textModel.getVersionId(),\n      text: _textModel.getValue()\n    } });\n    this._register(_textModel.onDidChangeContent((e) => {\n      const contentChanges = e.changes.map((c) => toLspTextDocumentContentChangeEvent(c));\n      this._api.textDocumentDidChange({\n        textDocument: {\n          uri,\n          version: _textModel.getVersionId()\n        },\n        contentChanges\n      });\n    }));\n    this._register({ dispose: () => {\n      this._api.textDocumentDidClose({ textDocument: { uri } });\n    } });\n  }\n};\nfunction toLspTextDocumentContentChangeEvent(change) {\n  return {\n    range: toLspRange(change.range),\n    rangeLength: change.rangeLength,\n    text: change.text\n  };\n}\nfunction toLspRange(range) {\n  return {\n    start: {\n      line: range.startLineNumber - 1,\n      character: range.startColumn - 1\n    },\n    end: {\n      line: range.endLineNumber - 1,\n      character: range.endColumn - 1\n    }\n  };\n}\nvar MonacoLspClient = class {\n  constructor(transport) {\n    __publicField(this, \"_connection\");\n    __publicField(this, \"_capabilitiesRegistry\");\n    __publicField(this, \"_bridge\");\n    __publicField(this, \"_initPromise\");\n    const c = TypedChannel.fromTransport(transport);\n    const s = api.getServer(c, {});\n    c.startListen();\n    this._capabilitiesRegistry = new LspCapabilitiesRegistry(c);\n    this._bridge = new TextDocumentSynchronizer(s.server, this._capabilitiesRegistry);\n    this._connection = new LspConnection(s.server, this._bridge, this._capabilitiesRegistry, c);\n    this.createFeatures();\n    this._initPromise = this._init();\n  }\n  async _init() {\n    const result = await this._connection.server.initialize({\n      processId: null,\n      capabilities: this._capabilitiesRegistry.getClientCapabilities(),\n      rootUri: null\n    });\n    this._connection.server.initialized({});\n    this._capabilitiesRegistry.setServerCapabilities(result.capabilities);\n  }\n  createFeatures() {\n    const store = new DisposableStore();\n    store.add(new LspCompletionFeature(this._connection));\n    store.add(new LspHoverFeature(this._connection));\n    store.add(new LspSignatureHelpFeature(this._connection));\n    store.add(new LspDefinitionFeature(this._connection));\n    store.add(new LspDeclarationFeature(this._connection));\n    store.add(new LspTypeDefinitionFeature(this._connection));\n    store.add(new LspImplementationFeature(this._connection));\n    store.add(new LspReferencesFeature(this._connection));\n    store.add(new LspDocumentHighlightFeature(this._connection));\n    store.add(new LspDocumentSymbolFeature(this._connection));\n    store.add(new LspRenameFeature(this._connection));\n    store.add(new LspCodeActionFeature(this._connection));\n    store.add(new LspCodeLensFeature(this._connection));\n    store.add(new LspDocumentLinkFeature(this._connection));\n    store.add(new LspFormattingFeature(this._connection));\n    store.add(new LspRangeFormattingFeature(this._connection));\n    store.add(new LspOnTypeFormattingFeature(this._connection));\n    store.add(new LspFoldingRangeFeature(this._connection));\n    store.add(new LspSelectionRangeFeature(this._connection));\n    store.add(new LspInlayHintsFeature(this._connection));\n    store.add(new LspSemanticTokensFeature(this._connection));\n    store.add(new LspDiagnosticsFeature(this._connection));\n    return store;\n  }\n};\nvar ws = null;\nif (typeof WebSocket !== \"undefined\") ws = WebSocket;\nelse if (typeof MozWebSocket !== \"undefined\") ws = MozWebSocket;\nelse if (typeof global !== \"undefined\") ws = global.WebSocket || global.MozWebSocket;\nelse if (typeof window !== \"undefined\") ws = window.WebSocket || window.MozWebSocket;\nelse if (typeof self !== \"undefined\") ws = self.WebSocket || self.MozWebSocket;\nvar browser_default = ws;\nfunction normalizeWebSocketOptions(options) {\n  if (\"host\" in options) return { address: `${options.forceTls ? \"wss\" : \"ws\"}://${options.host}:${options.port}` };\n  else return options;\n}\nvar WebSocketTransport = class WebSocketTransport2 extends BaseMessageTransport {\n  constructor(socket) {\n    super();\n    __publicField(this, \"socket\");\n    __publicField(this, \"errorEmitter\", new EventEmitter());\n    __publicField(this, \"onError\", this.errorEmitter);\n    this.socket = socket;\n    socket.onmessage = (msg) => {\n      try {\n        const data = msg.data;\n        if (typeof data === \"string\") {\n          const json = JSON.parse(data);\n          this._dispatchReceivedMessage(json);\n        } else throw new Error(\"Not supported\");\n      } catch (error) {\n        this.errorEmitter.fire({ error });\n      }\n    };\n    socket.onclose = (_event) => {\n      this._onConnectionClosed();\n    };\n  }\n  static connectTo(options) {\n    const ws$1 = new browser_default(normalizeWebSocketOptions(options).address);\n    return new Promise((res, rej) => {\n      ws$1.onerror = (err) => {\n        rej(err);\n      };\n      ws$1.onopen = () => {\n        res(new WebSocketTransport2(ws$1));\n      };\n    });\n  }\n  static fromWebSocket(socket) {\n    return new WebSocketTransport2(socket);\n  }\n  /**\n  * Closes the underlying socket.\n  */\n  close() {\n    this.socket.close();\n  }\n  /**\n  * Same as `close`.\n  */\n  dispose() {\n    this.close();\n  }\n  _sendImpl(message) {\n    const str = JSON.stringify(message);\n    return new Promise((res, rej) => {\n      this.socket.send(str, (err) => {\n        if (err) rej(err);\n        else res();\n      });\n    });\n  }\n  toString() {\n    return `${this.id}@${this.socket.url}`;\n  }\n};\nvar WindowLikeTransport = class extends BaseMessageTransport {\n  constructor(_windowLike, _source = void 0, _loadingState = void 0) {\n    super();\n    __publicField(this, \"_windowLike\");\n    __publicField(this, \"_source\");\n    __publicField(this, \"_loadingState\");\n    __publicField(this, \"_disposed\", false);\n    __publicField(this, \"_messageHandler\", ({ data, source }) => {\n      if (this._source && source !== this._source) return;\n      if (typeof data === \"object\" && data) this._dispatchReceivedMessage(data);\n    });\n    this._windowLike = _windowLike;\n    this._source = _source;\n    this._loadingState = _loadingState;\n    this._windowLike.addEventListener(\"message\", this._messageHandler);\n  }\n  async _sendImpl(message) {\n    if (this._disposed) throw new Error(\"Transport is disposed\");\n    if (this._loadingState && !this._loadingState.loaded) await this._loadingState.onLoaded;\n    this._windowLike.postMessage(message);\n  }\n  toString() {\n    return `${this.id}@${this._windowLike}`;\n  }\n  dispose() {\n    if (this._disposed) return;\n    this._disposed = true;\n    this._windowLike.removeEventListener(\"message\", this._messageHandler);\n  }\n};\nfunction createTransportToWorker(worker) {\n  if (typeof window === \"undefined\") throw new Error(`call this function from the main browser thread`);\n  return new WindowLikeTransport(worker);\n}\nfunction createTransportToIFrame(iframe) {\n  if (typeof window === \"undefined\") throw new Error(`call this function from the main browser thread`);\n  return new WindowLikeTransport(iframe.contentWindow, iframe.contentWindow, {\n    loaded: window.document.readyState === \"complete\",\n    onLoaded: new Promise((res) => {\n      window.addEventListener(\"load\", () => res());\n    })\n  });\n}\n\nexport { MonacoLspClient, WebSocketTransport, createTransportToIFrame, createTransportToWorker };\n","import '../editor/browser/coreCommands.js';\nimport '../editor/browser/widget/codeEditor/codeEditorWidget.js';\nimport '../editor/browser/widget/diffEditor/diffEditor.contribution.js';\nimport '../editor/contrib/anchorSelect/browser/anchorSelect.js';\nimport '../editor/contrib/bracketMatching/browser/bracketMatching.js';\nimport '../editor/contrib/caretOperations/browser/caretOperations.js';\nimport '../editor/contrib/caretOperations/browser/transpose.js';\nimport '../editor/contrib/clipboard/browser/clipboard.js';\nimport '../editor/contrib/codeAction/browser/codeActionContributions.js';\nimport '../editor/contrib/codelens/browser/codelensController.js';\nimport '../editor/contrib/colorPicker/browser/colorPickerContribution.js';\nimport '../editor/contrib/comment/browser/comment.js';\nimport '../editor/contrib/contextmenu/browser/contextmenu.js';\nimport '../editor/contrib/cursorUndo/browser/cursorUndo.js';\nimport '../editor/contrib/dnd/browser/dnd.js';\nimport '../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';\nimport '../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';\nimport '../editor/contrib/find/browser/findController.js';\nimport '../editor/contrib/folding/browser/folding.js';\nimport '../editor/contrib/fontZoom/browser/fontZoom.js';\nimport '../editor/contrib/format/browser/formatActions.js';\nimport '../editor/contrib/documentSymbols/browser/documentSymbols.js';\nimport '../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';\nimport '../editor/contrib/inlineProgress/browser/inlineProgress.js';\nimport '../editor/contrib/gotoSymbol/browser/goToCommands.js';\nimport '../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';\nimport '../editor/contrib/gotoError/browser/gotoError.js';\nimport '../editor/contrib/gpu/browser/gpuActions.js';\nimport '../editor/contrib/hover/browser/hoverContribution.js';\nimport '../editor/contrib/indentation/browser/indentation.js';\nimport '../editor/contrib/inlayHints/browser/inlayHintsContribution.js';\nimport '../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';\nimport '../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';\nimport '../editor/contrib/lineSelection/browser/lineSelection.js';\nimport '../editor/contrib/linesOperations/browser/linesOperations.js';\nimport '../editor/contrib/linkedEditing/browser/linkedEditing.js';\nimport '../editor/contrib/links/browser/links.js';\nimport '../editor/contrib/longLinesHelper/browser/longLinesHelper.js';\nimport '../editor/contrib/middleScroll/browser/middleScroll.contribution.js';\nimport '../editor/contrib/multicursor/browser/multicursor.js';\nimport '../editor/contrib/parameterHints/browser/parameterHints.js';\nimport '../editor/contrib/placeholderText/browser/placeholderText.contribution.js';\nimport '../editor/contrib/rename/browser/rename.js';\nimport '../editor/contrib/sectionHeaders/browser/sectionHeaders.js';\nimport '../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';\nimport '../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';\nimport '../editor/contrib/smartSelect/browser/smartSelect.js';\nimport '../editor/contrib/snippet/browser/snippetController2.js';\nimport '../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';\nimport '../editor/contrib/suggest/browser/suggestController.js';\nimport '../editor/contrib/suggest/browser/suggestInlineCompletions.js';\nimport '../editor/contrib/tokenization/browser/tokenization.js';\nimport '../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';\nimport '../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';\nimport '../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';\nimport '../editor/contrib/wordHighlighter/browser/wordHighlighter.js';\nimport '../editor/contrib/wordOperations/browser/wordOperations.js';\nimport '../editor/contrib/wordPartOperations/browser/wordPartOperations.js';\nimport '../editor/contrib/readOnlyMessage/browser/contribution.js';\nimport '../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';\nimport '../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';\nimport '../editor/common/standaloneStrings.js';\nimport '../base/browser/ui/codicons/codicon/codicon.css';\nimport '../base/browser/ui/codicons/codicon/codicon-modifiers.css';\nimport '../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';\nimport '../editor/standalone/browser/inspectTokens/inspectTokens.js';\nimport '../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';\nimport '../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';\nimport '../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';\nimport '../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';\nimport '../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';\nimport '../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';\nimport { editor } from '../editor/editor.api2.js';\n\nfunction createTrustedTypesPolicy(policyName, policyOptions) {\n  const monacoEnvironment = globalThis.MonacoEnvironment;\n  if (monacoEnvironment?.createTrustedTypesPolicy) {\n    try {\n      return monacoEnvironment.createTrustedTypesPolicy(policyName, policyOptions);\n    } catch (err) {\n      console.error(err);\n      return void 0;\n    }\n  }\n  try {\n    return globalThis.trustedTypes?.createPolicy(policyName, policyOptions);\n  } catch (err) {\n    console.error(err);\n    return void 0;\n  }\n}\nlet ttPolicy;\nif (typeof self === \"object\" && self.constructor && self.constructor.name === \"DedicatedWorkerGlobalScope\" && globalThis.workerttPolicy !== void 0) {\n  ttPolicy = globalThis.workerttPolicy;\n} else {\n  ttPolicy = createTrustedTypesPolicy(\"defaultWorkerFactory\", {\n    createScriptURL: (value) => value\n  });\n}\nfunction getWorker(descriptor) {\n  const label = descriptor.label;\n  const monacoEnvironment = globalThis.MonacoEnvironment;\n  if (monacoEnvironment) {\n    if (typeof monacoEnvironment.getWorker === \"function\") {\n      return monacoEnvironment.getWorker(\"workerMain.js\", label);\n    }\n    if (typeof monacoEnvironment.getWorkerUrl === \"function\") {\n      const workerUrl = monacoEnvironment.getWorkerUrl(\"workerMain.js\", label);\n      return new Worker(\n        ttPolicy ? ttPolicy.createScriptURL(workerUrl) : workerUrl,\n        { name: label, type: \"module\" }\n      );\n    }\n  }\n  if (descriptor.createWorker) {\n    return descriptor.createWorker();\n  }\n  throw new Error(\n    `You must define a function MonacoEnvironment.getWorkerUrl or MonacoEnvironment.getWorker`\n  );\n}\nfunction createWebWorker(opts) {\n  const worker = Promise.resolve(\n    getWorker({\n      label: opts.label ?? \"monaco-editor-worker\",\n      moduleId: opts.moduleId,\n      createWorker: opts.createWorker\n    })\n  ).then((w) => {\n    w.postMessage(\"ignore\");\n    w.postMessage(opts.createData);\n    return w;\n  });\n  return editor.createWebWorker({\n    worker,\n    host: opts.host,\n    keepIdleModels: opts.keepIdleModels\n  });\n}\n\nexport { createWebWorker };\n","import * as editor_api from '../editor.api2.js';\n\nfunction getGlobalMonaco() {\n  return editor_api;\n}\nconst monacoEnvironment = globalThis.MonacoEnvironment;\nif (monacoEnvironment?.globalAPI) {\n  globalThis.monaco = getGlobalMonaco();\n}\n\nexport { getGlobalMonaco };\n","import * as monaco_contribution from '../language/css/monaco.contribution.js';\nimport * as monaco_contribution$1 from '../language/html/monaco.contribution.js';\nimport * as monaco_contribution$2 from '../language/json/monaco.contribution.js';\nimport * as monaco_contribution$3 from '../language/typescript/monaco.contribution.js';\nimport '../basic-languages/abap/abap.contribution.js';\nimport '../basic-languages/apex/apex.contribution.js';\nimport '../basic-languages/azcli/azcli.contribution.js';\nimport '../basic-languages/bat/bat.contribution.js';\nimport '../basic-languages/bicep/bicep.contribution.js';\nimport '../basic-languages/cameligo/cameligo.contribution.js';\nimport '../basic-languages/clojure/clojure.contribution.js';\nimport '../basic-languages/coffee/coffee.contribution.js';\nimport '../basic-languages/cpp/cpp.contribution.js';\nimport '../basic-languages/csharp/csharp.contribution.js';\nimport '../basic-languages/csp/csp.contribution.js';\nimport '../basic-languages/css/css.contribution.js';\nimport '../basic-languages/cypher/cypher.contribution.js';\nimport '../basic-languages/dart/dart.contribution.js';\nimport '../basic-languages/dockerfile/dockerfile.contribution.js';\nimport '../basic-languages/ecl/ecl.contribution.js';\nimport '../basic-languages/elixir/elixir.contribution.js';\nimport '../basic-languages/flow9/flow9.contribution.js';\nimport '../basic-languages/fsharp/fsharp.contribution.js';\nimport '../basic-languages/freemarker2/freemarker2.contribution.js';\nimport '../basic-languages/go/go.contribution.js';\nimport '../basic-languages/graphql/graphql.contribution.js';\nimport '../basic-languages/handlebars/handlebars.contribution.js';\nimport '../basic-languages/hcl/hcl.contribution.js';\nimport '../basic-languages/html/html.contribution.js';\nimport '../basic-languages/ini/ini.contribution.js';\nimport '../basic-languages/java/java.contribution.js';\nimport '../basic-languages/javascript/javascript.contribution.js';\nimport '../basic-languages/julia/julia.contribution.js';\nimport '../basic-languages/kotlin/kotlin.contribution.js';\nimport '../basic-languages/less/less.contribution.js';\nimport '../basic-languages/lexon/lexon.contribution.js';\nimport '../basic-languages/lua/lua.contribution.js';\nimport '../basic-languages/liquid/liquid.contribution.js';\nimport '../basic-languages/m3/m3.contribution.js';\nimport '../basic-languages/markdown/markdown.contribution.js';\nimport '../basic-languages/mdx/mdx.contribution.js';\nimport '../basic-languages/mips/mips.contribution.js';\nimport '../basic-languages/msdax/msdax.contribution.js';\nimport '../basic-languages/mysql/mysql.contribution.js';\nimport '../basic-languages/objective-c/objective-c.contribution.js';\nimport '../basic-languages/pascal/pascal.contribution.js';\nimport '../basic-languages/pascaligo/pascaligo.contribution.js';\nimport '../basic-languages/perl/perl.contribution.js';\nimport '../basic-languages/pgsql/pgsql.contribution.js';\nimport '../basic-languages/php/php.contribution.js';\nimport '../basic-languages/pla/pla.contribution.js';\nimport '../basic-languages/postiats/postiats.contribution.js';\nimport '../basic-languages/powerquery/powerquery.contribution.js';\nimport '../basic-languages/powershell/powershell.contribution.js';\nimport '../basic-languages/protobuf/protobuf.contribution.js';\nimport '../basic-languages/pug/pug.contribution.js';\nimport '../basic-languages/python/python.contribution.js';\nimport '../basic-languages/qsharp/qsharp.contribution.js';\nimport '../basic-languages/r/r.contribution.js';\nimport '../basic-languages/razor/razor.contribution.js';\nimport '../basic-languages/redis/redis.contribution.js';\nimport '../basic-languages/redshift/redshift.contribution.js';\nimport '../basic-languages/restructuredtext/restructuredtext.contribution.js';\nimport '../basic-languages/ruby/ruby.contribution.js';\nimport '../basic-languages/rust/rust.contribution.js';\nimport '../basic-languages/sb/sb.contribution.js';\nimport '../basic-languages/scala/scala.contribution.js';\nimport '../basic-languages/scheme/scheme.contribution.js';\nimport '../basic-languages/scss/scss.contribution.js';\nimport '../basic-languages/shell/shell.contribution.js';\nimport '../basic-languages/solidity/solidity.contribution.js';\nimport '../basic-languages/sophia/sophia.contribution.js';\nimport '../basic-languages/sparql/sparql.contribution.js';\nimport '../basic-languages/sql/sql.contribution.js';\nimport '../basic-languages/st/st.contribution.js';\nimport '../basic-languages/swift/swift.contribution.js';\nimport '../basic-languages/systemverilog/systemverilog.contribution.js';\nimport '../basic-languages/tcl/tcl.contribution.js';\nimport '../basic-languages/twig/twig.contribution.js';\nimport '../basic-languages/typescript/typescript.contribution.js';\nimport '../basic-languages/typespec/typespec.contribution.js';\nimport '../basic-languages/vb/vb.contribution.js';\nimport '../basic-languages/wgsl/wgsl.contribution.js';\nimport '../basic-languages/xml/xml.contribution.js';\nimport '../basic-languages/yaml/yaml.contribution.js';\nimport * as index from '../../external/monaco-lsp-client/out/index.js';\nexport { index as lsp };\nimport './browser/coreCommands.js';\nimport './browser/widget/codeEditor/codeEditorWidget.js';\nimport './browser/widget/diffEditor/diffEditor.contribution.js';\nimport './contrib/anchorSelect/browser/anchorSelect.js';\nimport './contrib/bracketMatching/browser/bracketMatching.js';\nimport './contrib/caretOperations/browser/caretOperations.js';\nimport './contrib/caretOperations/browser/transpose.js';\nimport './contrib/clipboard/browser/clipboard.js';\nimport './contrib/codeAction/browser/codeActionContributions.js';\nimport './contrib/codelens/browser/codelensController.js';\nimport './contrib/colorPicker/browser/colorPickerContribution.js';\nimport './contrib/comment/browser/comment.js';\nimport './contrib/contextmenu/browser/contextmenu.js';\nimport './contrib/cursorUndo/browser/cursorUndo.js';\nimport './contrib/dnd/browser/dnd.js';\nimport './contrib/dropOrPasteInto/browser/copyPasteContribution.js';\nimport './contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';\nimport './contrib/find/browser/findController.js';\nimport './contrib/folding/browser/folding.js';\nimport './contrib/fontZoom/browser/fontZoom.js';\nimport './contrib/format/browser/formatActions.js';\nimport './contrib/documentSymbols/browser/documentSymbols.js';\nimport './contrib/inlineCompletions/browser/inlineCompletions.contribution.js';\nimport './contrib/inlineProgress/browser/inlineProgress.js';\nimport './contrib/gotoSymbol/browser/goToCommands.js';\nimport './contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';\nimport './contrib/gotoError/browser/gotoError.js';\nimport './contrib/gpu/browser/gpuActions.js';\nimport './contrib/hover/browser/hoverContribution.js';\nimport './contrib/indentation/browser/indentation.js';\nimport './contrib/inlayHints/browser/inlayHintsContribution.js';\nimport './contrib/inPlaceReplace/browser/inPlaceReplace.js';\nimport './contrib/insertFinalNewLine/browser/insertFinalNewLine.js';\nimport './contrib/lineSelection/browser/lineSelection.js';\nimport './contrib/linesOperations/browser/linesOperations.js';\nimport './contrib/linkedEditing/browser/linkedEditing.js';\nimport './contrib/links/browser/links.js';\nimport './contrib/longLinesHelper/browser/longLinesHelper.js';\nimport './contrib/middleScroll/browser/middleScroll.contribution.js';\nimport './contrib/multicursor/browser/multicursor.js';\nimport './contrib/parameterHints/browser/parameterHints.js';\nimport './contrib/placeholderText/browser/placeholderText.contribution.js';\nimport './contrib/rename/browser/rename.js';\nimport './contrib/sectionHeaders/browser/sectionHeaders.js';\nimport './contrib/semanticTokens/browser/documentSemanticTokens.js';\nimport './contrib/semanticTokens/browser/viewportSemanticTokens.js';\nimport './contrib/smartSelect/browser/smartSelect.js';\nimport './contrib/snippet/browser/snippetController2.js';\nimport './contrib/stickyScroll/browser/stickyScrollContribution.js';\nimport './contrib/suggest/browser/suggestController.js';\nimport './contrib/suggest/browser/suggestInlineCompletions.js';\nimport './contrib/tokenization/browser/tokenization.js';\nimport './contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';\nimport './contrib/unicodeHighlighter/browser/unicodeHighlighter.js';\nimport './contrib/unusualLineTerminators/browser/unusualLineTerminators.js';\nimport './contrib/wordHighlighter/browser/wordHighlighter.js';\nimport './contrib/wordOperations/browser/wordOperations.js';\nimport './contrib/wordPartOperations/browser/wordPartOperations.js';\nimport './contrib/readOnlyMessage/browser/contribution.js';\nimport './contrib/diffEditorBreadcrumbs/browser/contribution.js';\nimport './contrib/floatingMenu/browser/floatingMenu.contribution.js';\nimport './common/standaloneStrings.js';\nimport '../base/browser/ui/codicons/codicon/codicon.css';\nimport '../base/browser/ui/codicons/codicon/codicon-modifiers.css';\nimport './standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';\nimport './standalone/browser/inspectTokens/inspectTokens.js';\nimport './standalone/browser/quickAccess/standaloneHelpQuickAccess.js';\nimport './standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';\nimport './standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';\nimport './standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';\nimport './standalone/browser/referenceSearch/standaloneReferenceSearch.js';\nimport './standalone/browser/toggleHighContrast/toggleHighContrast.js';\nexport { CancellationTokenSource, Emitter, KeyCode, KeyMod, MarkerSeverity, MarkerTag, Position, Range, Selection, SelectionDirection, Token, Uri, editor, languages } from './editor.api2.js';\nexport { createWebWorker } from '../common/workers.js';\nimport { getGlobalMonaco } from './internal/initialize.js';\n\nconst monacoApi = getGlobalMonaco();\nmonacoApi.languages.css = monaco_contribution;\nmonacoApi.languages.html = monaco_contribution$1;\nmonacoApi.languages.typescript = monaco_contribution$3;\nmonacoApi.languages.json = monaco_contribution$2;\n\nexport { monaco_contribution as css, monaco_contribution$1 as html, monaco_contribution$2 as json, monaco_contribution$3 as typescript };\n"]}